1 1.1 joerg <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" 2 1.1 joerg "http://www.w3.org/TR/html4/strict.dtd"> 3 1.1 joerg <html> 4 1.1 joerg <head> 5 1.1 joerg <title>AST Matcher Reference</title> 6 1.1 joerg <link type="text/css" rel="stylesheet" href="../menu.css" /> 7 1.1 joerg <link type="text/css" rel="stylesheet" href="../content.css" /> 8 1.1 joerg <style type="text/css"> 9 1.1 joerg td { 10 1.1 joerg padding: .33em; 11 1.1 joerg } 12 1.1 joerg td.doc { 13 1.1 joerg display: none; 14 1.1 joerg border-bottom: 1px solid black; 15 1.1 joerg } 16 1.1 joerg td.name:hover { 17 1.1 joerg color: blue; 18 1.1 joerg cursor: pointer; 19 1.1 joerg } 20 1.1.1.2 joerg span.mono { font-family: monospace; } 21 1.1.1.2 joerg 22 1.1.1.2 joerg .traverse_compare, .traverse_compare td, .traverse_compare th { 23 1.1.1.2 joerg border: 1px solid black; 24 1.1.1.2 joerg border-collapse: collapse; 25 1.1.1.2 joerg } 26 1.1 joerg </style> 27 1.1 joerg <script type="text/javascript"> 28 1.1 joerg function toggle(id) { 29 1.1 joerg if (!id) return; 30 1.1 joerg row = document.getElementById(id); 31 1.1 joerg if (row.style.display != 'table-cell') 32 1.1 joerg row.style.display = 'table-cell'; 33 1.1 joerg else 34 1.1 joerg row.style.display = 'none'; 35 1.1 joerg } 36 1.1 joerg </script> 37 1.1 joerg </head> 38 1.1 joerg <body onLoad="toggle(location.hash.substring(1, location.hash.length - 6))"> 39 1.1 joerg 40 1.1 joerg <!--#include virtual="../menu.html.incl"--> 41 1.1 joerg 42 1.1 joerg <div id="content"> 43 1.1 joerg 44 1.1 joerg <h1>AST Matcher Reference</h1> 45 1.1 joerg 46 1.1 joerg <p>This document shows all currently implemented matchers. The matchers are grouped 47 1.1 joerg by category and node type they match. You can click on matcher names to show the 48 1.1 joerg matcher's source documentation.</p> 49 1.1 joerg 50 1.1 joerg <p>There are three different basic categories of matchers: 51 1.1 joerg <ul> 52 1.1 joerg <li><a href="#decl-matchers">Node Matchers:</a> Matchers that match a specific type of AST node.</li> 53 1.1 joerg <li><a href="#narrowing-matchers">Narrowing Matchers:</a> Matchers that match attributes on AST nodes.</li> 54 1.1 joerg <li><a href="#traversal-matchers">Traversal Matchers:</a> Matchers that allow traversal between AST nodes.</li> 55 1.1 joerg </ul> 56 1.1 joerg </p> 57 1.1 joerg 58 1.1 joerg <p>Within each category the matchers are ordered by node type they match on. 59 1.1.1.2 joerg Note that if a matcher can match multiple node types, it will appear 60 1.1 joerg multiple times. This means that by searching for Matcher<Stmt> you can 61 1.1 joerg find all matchers that can be used to match on Stmt nodes.</p> 62 1.1 joerg 63 1.1 joerg <p>The exception to that rule are matchers that can match on any node. Those 64 1.1 joerg are marked with a * and are listed in the beginning of each category.</p> 65 1.1 joerg 66 1.1 joerg <p>Note that the categorization of matchers is a great help when you combine 67 1.1 joerg them into matcher expressions. You will usually want to form matcher expressions 68 1.1 joerg that read like english sentences by alternating between node matchers and 69 1.1 joerg narrowing or traversal matchers, like this: 70 1.1 joerg <pre> 71 1.1 joerg recordDecl(hasDescendant( 72 1.1 joerg ifStmt(hasTrueExpression( 73 1.1 joerg expr(hasDescendant( 74 1.1 joerg ifStmt())))))) 75 1.1 joerg </pre> 76 1.1 joerg </p> 77 1.1 joerg 78 1.1 joerg <!-- ======================================================================= --> 79 1.1.1.2 joerg <h2 id="traverse-mode">Traverse Mode</h2> 80 1.1.1.2 joerg <!-- ======================================================================= --> 81 1.1.1.2 joerg 82 1.1.1.2 joerg <p>The default mode of operation of AST Matchers visits all nodes in the AST, 83 1.1.1.2 joerg even if they are not spelled in the source. This is 84 1.1.1.2 joerg <span class="mono">AsIs</span> mode. This mode requires writing AST matchers 85 1.1.1.2 joerg that explicitly traverse or ignore implicit nodes, such as parentheses 86 1.1.1.2 joerg surrounding an expression or expressions with cleanups. These implicit 87 1.1.1.2 joerg nodes are not always obvious from the syntax of the source code, and so this 88 1.1.1.2 joerg mode requires careful consideration and testing to get the desired behavior 89 1.1.1.2 joerg from an AST matcher. 90 1.1.1.2 joerg </p> 91 1.1.1.2 joerg 92 1.1.1.2 joerg <p>In addition, because template instantiations are matched in the default mode, 93 1.1.1.2 joerg transformations can be accidentally made to template declarations. Finally, 94 1.1.1.2 joerg because implicit nodes are matched by default, transformations can be made on 95 1.1.1.2 joerg entirely incorrect places in the code.</p> 96 1.1.1.2 joerg 97 1.1.1.2 joerg <p>For these reasons, it is possible to ignore AST nodes which are not spelled 98 1.1.1.2 joerg in the source using the <span class="mono">IgnoreUnlessSpelledInSource</span> 99 1.1.1.2 joerg mode. This is likely to be far less error-prone for users who are not already 100 1.1.1.2 joerg very familiar with where implicit nodes appear in the AST. It is also likely 101 1.1.1.2 joerg to be less error-prone for experienced AST users, as difficult cases do not 102 1.1.1.2 joerg need to be encountered and matcher expressions adjusted for these cases.</p> 103 1.1.1.2 joerg 104 1.1.1.2 joerg <p>In clang-query, the mode can be changed with 105 1.1.1.2 joerg <pre> 106 1.1.1.2 joerg set traversal IgnoreUnlessSpelledInSource 107 1.1.1.2 joerg </pre> 108 1.1.1.2 joerg </p> 109 1.1.1.2 joerg This affects both matchers and AST dump output in results. 110 1.1.1.2 joerg 111 1.1.1.2 joerg <p>When using the C++ API such as in clang-tidy checks, the 112 1.1.1.2 joerg <span class="mono">traverse()</span> matcher is used to set the mode: 113 1.1.1.2 joerg <pre> 114 1.1.1.2 joerg Finder->addMatcher(traverse(TK_IgnoreUnlessSpelledInSource, 115 1.1.1.2 joerg returnStmt(hasReturnArgument(integerLiteral(equals(0)))) 116 1.1.1.2 joerg ), this); 117 1.1.1.2 joerg </pre> 118 1.1.1.2 joerg </p> 119 1.1.1.2 joerg <p>The following table compares the <span class="mono">AsIs</span> mode with 120 1.1.1.2 joerg the <span class="mono">IgnoreUnlessSpelledInSource</span> mode:</p> 121 1.1.1.2 joerg 122 1.1.1.2 joerg <table class="traverse_compare"> 123 1.1.1.2 joerg <tr> 124 1.1.1.2 joerg <th></th> 125 1.1.1.2 joerg <th><span class="mono">AsIs</span></th> 126 1.1.1.2 joerg <th><span class="mono">IgnoreUnlessSpelledInSource</span></th> 127 1.1.1.2 joerg </tr> 128 1.1.1.2 joerg <tr> 129 1.1.1.2 joerg <td>AST dump of <span class="mono">func1</span>: 130 1.1.1.2 joerg <pre> 131 1.1.1.2 joerg struct B { 132 1.1.1.2 joerg B(int); 133 1.1.1.2 joerg }; 134 1.1.1.2 joerg 135 1.1.1.2 joerg B func1() { return 42; } 136 1.1.1.2 joerg </pre> 137 1.1.1.2 joerg 138 1.1.1.2 joerg </td> 139 1.1.1.2 joerg <td> 140 1.1.1.2 joerg C++98 dialect: 141 1.1.1.2 joerg <pre> 142 1.1.1.2 joerg FunctionDecl 143 1.1.1.2 joerg `-CompoundStmt 144 1.1.1.2 joerg `-ReturnStmt 145 1.1.1.2 joerg `-ExprWithCleanups 146 1.1.1.2 joerg `-CXXConstructExpr 147 1.1.1.2 joerg `-MaterializeTemporaryExpr 148 1.1.1.2 joerg `-ImplicitCastExpr 149 1.1.1.2 joerg `-ImplicitCastExpr 150 1.1.1.2 joerg `-CXXConstructExpr 151 1.1.1.2 joerg `-IntegerLiteral 'int' 42 152 1.1.1.2 joerg </pre> 153 1.1.1.2 joerg C++11, C++14 dialect: 154 1.1.1.2 joerg <pre> 155 1.1.1.2 joerg FunctionDecl 156 1.1.1.2 joerg `-CompoundStmt 157 1.1.1.2 joerg `-ReturnStmt 158 1.1.1.2 joerg `-ExprWithCleanups 159 1.1.1.2 joerg `-CXXConstructExpr 160 1.1.1.2 joerg `-MaterializeTemporaryExpr 161 1.1.1.2 joerg `-ImplicitCastExpr 162 1.1.1.2 joerg `-CXXConstructExpr 163 1.1.1.2 joerg `-IntegerLiteral 'int' 42 164 1.1.1.2 joerg </pre> 165 1.1.1.2 joerg C++17, C++20 dialect: 166 1.1.1.2 joerg <pre> 167 1.1.1.2 joerg FunctionDecl 168 1.1.1.2 joerg `-CompoundStmt 169 1.1.1.2 joerg `-ReturnStmt 170 1.1.1.2 joerg `-ImplicitCastExpr 171 1.1.1.2 joerg `-CXXConstructExpr 172 1.1.1.2 joerg `-IntegerLiteral 'int' 42 173 1.1.1.2 joerg </pre> 174 1.1.1.2 joerg </td> 175 1.1.1.2 joerg <td> 176 1.1.1.2 joerg All dialects: 177 1.1.1.2 joerg <pre> 178 1.1.1.2 joerg FunctionDecl 179 1.1.1.2 joerg `-CompoundStmt 180 1.1.1.2 joerg `-ReturnStmt 181 1.1.1.2 joerg `-IntegerLiteral 'int' 42 182 1.1.1.2 joerg </pre></td> 183 1.1.1.2 joerg </tr> 184 1.1.1.2 joerg 185 1.1.1.2 joerg <tr> 186 1.1.1.2 joerg <td>Matcher for returned <span class="mono">42</span>: 187 1.1.1.2 joerg <pre> 188 1.1.1.2 joerg struct B { 189 1.1.1.2 joerg B(int); 190 1.1.1.2 joerg }; 191 1.1.1.2 joerg 192 1.1.1.2 joerg B func1() { return 42; } 193 1.1.1.2 joerg </pre> 194 1.1.1.2 joerg 195 1.1.1.2 joerg </td> 196 1.1.1.2 joerg <td> 197 1.1.1.2 joerg All dialects: 198 1.1.1.2 joerg <pre> 199 1.1.1.2 joerg returnStmt(hasReturnValue( 200 1.1.1.2 joerg ignoringImplicit( 201 1.1.1.2 joerg ignoringElidableConstructorCall( 202 1.1.1.2 joerg ignoringImplicit( 203 1.1.1.2 joerg cxxConstructExpr(hasArgument(0, 204 1.1.1.2 joerg ignoringImplicit( 205 1.1.1.2 joerg integerLiteral().bind("returnVal") 206 1.1.1.2 joerg ) 207 1.1.1.2 joerg )) 208 1.1.1.2 joerg ) 209 1.1.1.2 joerg ) 210 1.1.1.2 joerg ) 211 1.1.1.2 joerg )) 212 1.1.1.2 joerg </pre></td> 213 1.1.1.2 joerg <td> 214 1.1.1.2 joerg All dialects: 215 1.1.1.2 joerg <pre> 216 1.1.1.2 joerg returnStmt(hasReturnValue( 217 1.1.1.2 joerg integerLiteral().bind("returnVal") 218 1.1.1.2 joerg )) 219 1.1.1.2 joerg </pre></td> 220 1.1.1.2 joerg </tr> 221 1.1.1.2 joerg <tr> 222 1.1.1.2 joerg <td>Match result for 223 1.1.1.2 joerg <pre>implicitCastExpr()</pre> 224 1.1.1.2 joerg given: 225 1.1.1.2 joerg <pre> 226 1.1.1.2 joerg struct B { 227 1.1.1.2 joerg B(int); 228 1.1.1.2 joerg }; 229 1.1.1.2 joerg 230 1.1.1.2 joerg B func1() { return 42; } 231 1.1.1.2 joerg </pre> 232 1.1.1.2 joerg 233 1.1.1.2 joerg </td> 234 1.1.1.2 joerg <td> 235 1.1.1.2 joerg Match found.</td> 236 1.1.1.2 joerg <td> 237 1.1.1.2 joerg No match.</td> 238 1.1.1.2 joerg </tr> 239 1.1.1.2 joerg <tr> 240 1.1.1.2 joerg <td>Match result for: 241 1.1.1.2 joerg <pre> 242 1.1.1.2 joerg cxxConstructorDecl( 243 1.1.1.2 joerg isCopyConstructor() 244 1.1.1.2 joerg ).bind("prepend_explicit") 245 1.1.1.2 joerg </pre> 246 1.1.1.2 joerg given: 247 1.1.1.2 joerg <pre> 248 1.1.1.2 joerg struct Other {}; 249 1.1.1.2 joerg struct Copyable { 250 1.1.1.2 joerg Other m_o; 251 1.1.1.2 joerg Copyable(); 252 1.1.1.2 joerg }; 253 1.1.1.2 joerg </pre> 254 1.1.1.2 joerg </td> 255 1.1.1.2 joerg <td> 256 1.1.1.2 joerg Match found. Insertion produces incorrect output: 257 1.1.1.2 joerg <pre> 258 1.1.1.2 joerg struct Other {}; 259 1.1.1.2 joerg struct explicit Copyable { 260 1.1.1.2 joerg Other m_o; 261 1.1.1.2 joerg Copyable(); 262 1.1.1.2 joerg }; 263 1.1.1.2 joerg </pre> 264 1.1.1.2 joerg </td> 265 1.1.1.2 joerg <td> 266 1.1.1.2 joerg No match found. Incorrect replacement not possible. 267 1.1.1.2 joerg </td> 268 1.1.1.2 joerg </tr> 269 1.1.1.2 joerg <tr> 270 1.1.1.2 joerg <td>Replacement of <span class="mono">begin()</span> 271 1.1.1.2 joerg with <span class="mono">cbegin()</span>: 272 1.1.1.2 joerg <pre> 273 1.1.1.2 joerg cxxMemberCallExpr( 274 1.1.1.2 joerg on(ConstContainerExpr), 275 1.1.1.2 joerg callee(cxxMethodDecl(hasName("begin"))) 276 1.1.1.2 joerg ).bind("replace_with_cbegin") 277 1.1.1.2 joerg </pre> 278 1.1.1.2 joerg given: 279 1.1.1.2 joerg <pre> 280 1.1.1.2 joerg void foo() { 281 1.1.1.2 joerg const Container c; 282 1.1.1.2 joerg c.begin(); 283 1.1.1.2 joerg 284 1.1.1.2 joerg for (auto i : c) { 285 1.1.1.2 joerg } 286 1.1.1.2 joerg } 287 1.1.1.2 joerg </pre> 288 1.1.1.2 joerg </td> 289 1.1.1.2 joerg <td> 290 1.1.1.2 joerg 2 matches found. Replacement produces incorrect output: 291 1.1.1.2 joerg <pre> 292 1.1.1.2 joerg void foo() { 293 1.1.1.2 joerg const Container c; 294 1.1.1.2 joerg c.cbegin(); 295 1.1.1.2 joerg 296 1.1.1.2 joerg for (auto i :.cbegin() c) { 297 1.1.1.2 joerg } 298 1.1.1.2 joerg } 299 1.1.1.2 joerg </pre> 300 1.1.1.2 joerg </td> 301 1.1.1.2 joerg <td> 302 1.1.1.2 joerg 1 match found. Replacement produces correct output: 303 1.1.1.2 joerg <pre> 304 1.1.1.2 joerg void foo() { 305 1.1.1.2 joerg const Container c; 306 1.1.1.2 joerg c.cbegin(); 307 1.1.1.2 joerg 308 1.1.1.2 joerg for (auto i : c) { 309 1.1.1.2 joerg } 310 1.1.1.2 joerg } 311 1.1.1.2 joerg </pre> 312 1.1.1.2 joerg </td> 313 1.1.1.2 joerg </tr> 314 1.1.1.2 joerg <tr> 315 1.1.1.2 joerg <td>Replacement of <span class="mono">int</span> member 316 1.1.1.2 joerg with <span class="mono">safe_int</span>: 317 1.1.1.2 joerg <pre> 318 1.1.1.2 joerg fieldDecl( 319 1.1.1.2 joerg hasType(asString("int")) 320 1.1.1.2 joerg ).bind("use_safe_int") 321 1.1.1.2 joerg </pre> 322 1.1.1.2 joerg given: 323 1.1.1.2 joerg <pre> 324 1.1.1.2 joerg struct S { 325 1.1.1.2 joerg int m_i; 326 1.1.1.2 joerg }; 327 1.1.1.2 joerg 328 1.1.1.2 joerg template <typename T> struct TemplStruct { 329 1.1.1.2 joerg TemplStruct() {} 330 1.1.1.2 joerg ~TemplStruct() {} 331 1.1.1.2 joerg 332 1.1.1.2 joerg private: 333 1.1.1.2 joerg T m_t; 334 1.1.1.2 joerg }; 335 1.1.1.2 joerg 336 1.1.1.2 joerg void instantiate() { TemplStruct<int> ti; } 337 1.1.1.2 joerg </pre> 338 1.1.1.2 joerg </td> 339 1.1.1.2 joerg <td> 340 1.1.1.2 joerg 2 matches found. Replacement produces incorrect output: 341 1.1.1.2 joerg <pre> 342 1.1.1.2 joerg struct S { 343 1.1.1.2 joerg safe_int m_i; 344 1.1.1.2 joerg }; 345 1.1.1.2 joerg 346 1.1.1.2 joerg template <typename T> struct TemplStruct { 347 1.1.1.2 joerg TemplStruct() {} 348 1.1.1.2 joerg ~TemplStruct() {} 349 1.1.1.2 joerg 350 1.1.1.2 joerg private: 351 1.1.1.2 joerg safe_int m_t; 352 1.1.1.2 joerg }; 353 1.1.1.2 joerg 354 1.1.1.2 joerg void instantiate() { TemplStruct<int> ti; } 355 1.1.1.2 joerg </pre> 356 1.1.1.2 joerg </td> 357 1.1.1.2 joerg <td> 358 1.1.1.2 joerg 1 match found. Replacement produces correct output: 359 1.1.1.2 joerg <pre> 360 1.1.1.2 joerg struct S { 361 1.1.1.2 joerg safe_int m_i; 362 1.1.1.2 joerg }; 363 1.1.1.2 joerg 364 1.1.1.2 joerg template <typename T> struct TemplStruct { 365 1.1.1.2 joerg TemplStruct() {} 366 1.1.1.2 joerg ~TemplStruct() {} 367 1.1.1.2 joerg 368 1.1.1.2 joerg private: 369 1.1.1.2 joerg T m_t; 370 1.1.1.2 joerg }; 371 1.1.1.2 joerg 372 1.1.1.2 joerg void instantiate() { TemplStruct<int> ti; } 373 1.1.1.2 joerg </pre> 374 1.1.1.2 joerg </td> 375 1.1.1.2 joerg </tr> 376 1.1.1.2 joerg <tr> 377 1.1.1.2 joerg <td>Add prefix to member initializer 378 1.1.1.2 joerg <pre> 379 1.1.1.2 joerg cxxCtorInitializer( 380 1.1.1.2 joerg forField(fieldDecl()) 381 1.1.1.2 joerg ).bind("add_prefix") 382 1.1.1.2 joerg </pre> 383 1.1.1.2 joerg given: 384 1.1.1.2 joerg <pre> 385 1.1.1.2 joerg struct Simple {}; 386 1.1.1.2 joerg 387 1.1.1.2 joerg struct Record { 388 1.1.1.2 joerg Record() : i(42) {} 389 1.1.1.2 joerg private: 390 1.1.1.2 joerg int i; 391 1.1.1.2 joerg Simple s; 392 1.1.1.2 joerg }; 393 1.1.1.2 joerg </pre> 394 1.1.1.2 joerg </td> 395 1.1.1.2 joerg <td> 396 1.1.1.2 joerg 2 matches found. Replacement produces incorrect output: 397 1.1.1.2 joerg <pre> 398 1.1.1.2 joerg struct Simple {}; 399 1.1.1.2 joerg 400 1.1.1.2 joerg struct Record { 401 1.1.1.2 joerg m_Record() : m_i(42) {} 402 1.1.1.2 joerg private: 403 1.1.1.2 joerg int i; 404 1.1.1.2 joerg Simple s; 405 1.1.1.2 joerg }; 406 1.1.1.2 joerg </pre> 407 1.1.1.2 joerg </td> 408 1.1.1.2 joerg <td> 409 1.1.1.2 joerg 1 match found. Replacement produces correct output: 410 1.1.1.2 joerg <pre> 411 1.1.1.2 joerg struct Simple {}; 412 1.1.1.2 joerg 413 1.1.1.2 joerg struct Record { 414 1.1.1.2 joerg Record() : m_i(42) {} 415 1.1.1.2 joerg private: 416 1.1.1.2 joerg int i; 417 1.1.1.2 joerg Simple s; 418 1.1.1.2 joerg }; 419 1.1.1.2 joerg </pre> 420 1.1.1.2 joerg </td> 421 1.1.1.2 joerg </tr> 422 1.1.1.2 joerg <tr> 423 1.1.1.2 joerg <td>Ignored default arguments 424 1.1.1.2 joerg <pre> 425 1.1.1.2 joerg callExpr( 426 1.1.1.2 joerg callee(functionDecl( 427 1.1.1.2 joerg hasName("hasDefaultArg") 428 1.1.1.2 joerg )), 429 1.1.1.2 joerg argumentCountIs(1) 430 1.1.1.2 joerg ).bind("add_prefix") 431 1.1.1.2 joerg </pre> 432 1.1.1.2 joerg given: 433 1.1.1.2 joerg <pre> 434 1.1.1.2 joerg void hasDefaultArg(int i, int j = 0) {} 435 1.1.1.2 joerg void callDefaultArg() { hasDefaultArg(42); } 436 1.1.1.2 joerg </pre> 437 1.1.1.2 joerg </td> 438 1.1.1.2 joerg <td> 439 1.1.1.2 joerg No match. 440 1.1.1.2 joerg </td> 441 1.1.1.2 joerg <td> 442 1.1.1.2 joerg 1 match found. 443 1.1.1.2 joerg </td> 444 1.1.1.2 joerg </tr> 445 1.1.1.2 joerg <tr> 446 1.1.1.2 joerg <td>Lambda fields 447 1.1.1.2 joerg <pre> 448 1.1.1.2 joerg fieldDecl( 449 1.1.1.2 joerg hasType(asString("int")) 450 1.1.1.2 joerg ).bind("make_safe") 451 1.1.1.2 joerg </pre> 452 1.1.1.2 joerg given: 453 1.1.1.2 joerg <pre> 454 1.1.1.2 joerg struct S { 455 1.1.1.2 joerg int m_i; 456 1.1.1.2 joerg }; 457 1.1.1.2 joerg 458 1.1.1.2 joerg void func() { 459 1.1.1.2 joerg int a = 0; 460 1.1.1.2 joerg int c = 0; 461 1.1.1.2 joerg 462 1.1.1.2 joerg auto l = [a, b = c](int d) { int e = d; }; 463 1.1.1.2 joerg l(43); 464 1.1.1.2 joerg } 465 1.1.1.2 joerg </pre> 466 1.1.1.2 joerg </td> 467 1.1.1.2 joerg <td> 468 1.1.1.2 joerg 2 matches found. Replacement produces incorrect output: 469 1.1.1.2 joerg <pre> 470 1.1.1.2 joerg struct S { 471 1.1.1.2 joerg safe_int m_i; 472 1.1.1.2 joerg }; 473 1.1.1.2 joerg 474 1.1.1.2 joerg void func() { 475 1.1.1.2 joerg int a = 0; 476 1.1.1.2 joerg int c = 0; 477 1.1.1.2 joerg 478 1.1.1.2 joerg auto l = [safe_a, safe_b = c](int d) { int e = d; }; 479 1.1.1.2 joerg l(43); 480 1.1.1.2 joerg } 481 1.1.1.2 joerg </pre> 482 1.1.1.2 joerg </td> 483 1.1.1.2 joerg <td> 484 1.1.1.2 joerg 1 match found. Replacement produces correct output: 485 1.1.1.2 joerg <pre> 486 1.1.1.2 joerg struct S { 487 1.1.1.2 joerg safe_int m_i; 488 1.1.1.2 joerg }; 489 1.1.1.2 joerg 490 1.1.1.2 joerg void func() { 491 1.1.1.2 joerg int a = 0; 492 1.1.1.2 joerg int c = 0; 493 1.1.1.2 joerg 494 1.1.1.2 joerg auto l = [a, b = c](int d) { int e = d; }; 495 1.1.1.2 joerg l(43); 496 1.1.1.2 joerg } 497 1.1.1.2 joerg </pre> 498 1.1.1.2 joerg </td> 499 1.1.1.2 joerg 500 1.1.1.2 joerg </tr> 501 1.1.1.2 joerg 502 1.1.1.2 joerg 503 1.1.1.2 joerg 504 1.1.1.2 joerg 505 1.1.1.2 joerg 506 1.1.1.2 joerg <tr> 507 1.1.1.2 joerg <td>Rewritten binary operators 508 1.1.1.2 joerg <pre> 509 1.1.1.2 joerg binaryOperator( 510 1.1.1.2 joerg hasOperatorName("<"), 511 1.1.1.2 joerg hasRHS(hasDescendant(integerLiteral(equals(0)))) 512 1.1.1.2 joerg ) 513 1.1.1.2 joerg </pre> 514 1.1.1.2 joerg given: 515 1.1.1.2 joerg <pre> 516 1.1.1.2 joerg #include <compare> 517 1.1.1.2 joerg 518 1.1.1.2 joerg class HasSpaceship { 519 1.1.1.2 joerg public: 520 1.1.1.2 joerg int x; 521 1.1.1.2 joerg bool operator==(const HasSpaceship&) const = default; 522 1.1.1.2 joerg std::strong_ordering operator<=>(const HasSpaceship&) const = default; 523 1.1.1.2 joerg }; 524 1.1.1.2 joerg 525 1.1.1.2 joerg bool isLess(const HasSpaceship& a, const HasSpaceship& b) { 526 1.1.1.2 joerg return a < b; 527 1.1.1.2 joerg } 528 1.1.1.2 joerg </pre> 529 1.1.1.2 joerg </td> 530 1.1.1.2 joerg <td> 531 1.1.1.2 joerg 1 match found. 532 1.1.1.2 joerg 533 1.1.1.2 joerg <pre> 534 1.1.1.2 joerg return a < b; 535 1.1.1.2 joerg ^~~~~ 536 1.1.1.2 joerg </pre> 537 1.1.1.2 joerg 538 1.1.1.2 joerg </td> 539 1.1.1.2 joerg <td> 540 1.1.1.2 joerg No match found. 541 1.1.1.2 joerg </td> 542 1.1.1.2 joerg </tr> 543 1.1.1.2 joerg </table> 544 1.1.1.2 joerg 545 1.1.1.2 joerg <!-- ======================================================================= --> 546 1.1 joerg <h2 id="decl-matchers">Node Matchers</h2> 547 1.1 joerg <!-- ======================================================================= --> 548 1.1 joerg 549 1.1 joerg <p>Node matchers are at the core of matcher expressions - they specify the type 550 1.1 joerg of node that is expected. Every match expression starts with a node matcher, 551 1.1 joerg which can then be further refined with a narrowing or traversal matcher. All 552 1.1 joerg traversal matchers take node matchers as their arguments.</p> 553 1.1 joerg 554 1.1 joerg <p>For convenience, all node matchers take an arbitrary number of arguments 555 1.1 joerg and implicitly act as allOf matchers.</p> 556 1.1 joerg 557 1.1 joerg <p>Node matchers are the only matchers that support the bind("id") call to 558 1.1 joerg bind the matched node to the given string, to be later retrieved from the 559 1.1 joerg match callback.</p> 560 1.1 joerg 561 1.1 joerg <p>It is important to remember that the arguments to node matchers are 562 1.1 joerg predicates on the same node, just with additional information about the type. 563 1.1 joerg This is often useful to make matcher expression more readable by inlining bind 564 1.1 joerg calls into redundant node matchers inside another node matcher: 565 1.1 joerg <pre> 566 1.1 joerg // This binds the CXXRecordDecl to "id", as the decl() matcher will stay on 567 1.1 joerg // the same node. 568 1.1 joerg recordDecl(decl().bind("id"), hasName("::MyClass")) 569 1.1 joerg </pre> 570 1.1 joerg </p> 571 1.1 joerg 572 1.1 joerg <table> 573 1.1 joerg <tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr> 574 1.1 joerg <!-- START_DECL_MATCHERS --> 575 1.1 joerg 576 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>></td><td class="name" onclick="toggle('cxxBaseSpecifier0')"><a name="cxxBaseSpecifier0Anchor">cxxBaseSpecifier</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>>...</td></tr> 577 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="cxxBaseSpecifier0"><pre>Matches class bases. 578 1.1.1.2 joerg 579 1.1.1.2 joerg Examples matches public virtual B. 580 1.1.1.2 joerg class B {}; 581 1.1.1.2 joerg class C : public virtual B {}; 582 1.1.1.2 joerg </pre></td></tr> 583 1.1.1.2 joerg 584 1.1.1.2 joerg 585 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>></td><td class="name" onclick="toggle('cxxCtorInitializer0')"><a name="cxxCtorInitializer0Anchor">cxxCtorInitializer</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>>...</td></tr> 586 1.1 joerg <tr><td colspan="4" class="doc" id="cxxCtorInitializer0"><pre>Matches constructor initializers. 587 1.1 joerg 588 1.1 joerg Examples matches i(42). 589 1.1 joerg class C { 590 1.1 joerg C() : i(42) {} 591 1.1 joerg int i; 592 1.1 joerg }; 593 1.1 joerg </pre></td></tr> 594 1.1 joerg 595 1.1 joerg 596 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('accessSpecDecl0')"><a name="accessSpecDecl0Anchor">accessSpecDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AccessSpecDecl.html">AccessSpecDecl</a>>...</td></tr> 597 1.1 joerg <tr><td colspan="4" class="doc" id="accessSpecDecl0"><pre>Matches C++ access specifier declarations. 598 1.1 joerg 599 1.1 joerg Given 600 1.1 joerg class C { 601 1.1 joerg public: 602 1.1 joerg int a; 603 1.1 joerg }; 604 1.1 joerg accessSpecDecl() 605 1.1 joerg matches 'public:' 606 1.1 joerg </pre></td></tr> 607 1.1 joerg 608 1.1 joerg 609 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('bindingDecl0')"><a name="bindingDecl0Anchor">bindingDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BindingDecl.html">BindingDecl</a>>...</td></tr> 610 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="bindingDecl0"><pre>Matches binding declarations 611 1.1.1.2 joerg Example matches foo and bar 612 1.1.1.2 joerg (matcher = bindingDecl() 613 1.1.1.2 joerg 614 1.1.1.2 joerg auto [foo, bar] = std::make_pair{42, 42}; 615 1.1.1.2 joerg </pre></td></tr> 616 1.1.1.2 joerg 617 1.1.1.2 joerg 618 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('blockDecl0')"><a name="blockDecl0Anchor">blockDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>>...</td></tr> 619 1.1 joerg <tr><td colspan="4" class="doc" id="blockDecl0"><pre>Matches block declarations. 620 1.1 joerg 621 1.1 joerg Example matches the declaration of the nameless block printing an input 622 1.1 joerg integer. 623 1.1 joerg 624 1.1 joerg myFunc(^(int p) { 625 1.1 joerg printf("%d", p); 626 1.1 joerg }) 627 1.1 joerg </pre></td></tr> 628 1.1 joerg 629 1.1 joerg 630 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('classTemplateDecl0')"><a name="classTemplateDecl0Anchor">classTemplateDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateDecl.html">ClassTemplateDecl</a>>...</td></tr> 631 1.1 joerg <tr><td colspan="4" class="doc" id="classTemplateDecl0"><pre>Matches C++ class template declarations. 632 1.1 joerg 633 1.1 joerg Example matches Z 634 1.1 joerg template<class T> class Z {}; 635 1.1 joerg </pre></td></tr> 636 1.1 joerg 637 1.1 joerg 638 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('classTemplatePartialSpecializationDecl0')"><a name="classTemplatePartialSpecializationDecl0Anchor">classTemplatePartialSpecializationDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplatePartialSpecializationDecl.html">ClassTemplatePartialSpecializationDecl</a>>...</td></tr> 639 1.1 joerg <tr><td colspan="4" class="doc" id="classTemplatePartialSpecializationDecl0"><pre>Matches C++ class template partial specializations. 640 1.1 joerg 641 1.1 joerg Given 642 1.1 joerg template<class T1, class T2, int I> 643 1.1 joerg class A {}; 644 1.1 joerg 645 1.1 joerg template<class T, int I> 646 1.1 joerg class A<T, T*, I> {}; 647 1.1 joerg 648 1.1 joerg template<> 649 1.1 joerg class A<int, int, 1> {}; 650 1.1 joerg classTemplatePartialSpecializationDecl() 651 1.1 joerg matches the specialization A<T,T*,I> but not A<int,int,1> 652 1.1 joerg </pre></td></tr> 653 1.1 joerg 654 1.1 joerg 655 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('classTemplateSpecializationDecl0')"><a name="classTemplateSpecializationDecl0Anchor">classTemplateSpecializationDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>>...</td></tr> 656 1.1 joerg <tr><td colspan="4" class="doc" id="classTemplateSpecializationDecl0"><pre>Matches C++ class template specializations. 657 1.1 joerg 658 1.1 joerg Given 659 1.1 joerg template<typename T> class A {}; 660 1.1 joerg template<> class A<double> {}; 661 1.1 joerg A<int> a; 662 1.1 joerg classTemplateSpecializationDecl() 663 1.1 joerg matches the specializations A<int> and A<double> 664 1.1 joerg </pre></td></tr> 665 1.1 joerg 666 1.1 joerg 667 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('cxxConstructorDecl0')"><a name="cxxConstructorDecl0Anchor">cxxConstructorDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>>...</td></tr> 668 1.1 joerg <tr><td colspan="4" class="doc" id="cxxConstructorDecl0"><pre>Matches C++ constructor declarations. 669 1.1 joerg 670 1.1 joerg Example matches Foo::Foo() and Foo::Foo(int) 671 1.1 joerg class Foo { 672 1.1 joerg public: 673 1.1 joerg Foo(); 674 1.1 joerg Foo(int); 675 1.1 joerg int DoSomething(); 676 1.1 joerg }; 677 1.1 joerg </pre></td></tr> 678 1.1 joerg 679 1.1 joerg 680 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('cxxConversionDecl0')"><a name="cxxConversionDecl0Anchor">cxxConversionDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConversionDecl.html">CXXConversionDecl</a>>...</td></tr> 681 1.1 joerg <tr><td colspan="4" class="doc" id="cxxConversionDecl0"><pre>Matches conversion operator declarations. 682 1.1 joerg 683 1.1 joerg Example matches the operator. 684 1.1 joerg class X { operator int() const; }; 685 1.1 joerg </pre></td></tr> 686 1.1 joerg 687 1.1 joerg 688 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('cxxDeductionGuideDecl0')"><a name="cxxDeductionGuideDecl0Anchor">cxxDeductionGuideDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDeductionGuideDecl.html">CXXDeductionGuideDecl</a>>...</td></tr> 689 1.1 joerg <tr><td colspan="4" class="doc" id="cxxDeductionGuideDecl0"><pre>Matches user-defined and implicitly generated deduction guide. 690 1.1 joerg 691 1.1 joerg Example matches the deduction guide. 692 1.1 joerg template<typename T> 693 1.1 joerg class X { X(int) }; 694 1.1 joerg X(int) -> X<int>; 695 1.1 joerg </pre></td></tr> 696 1.1 joerg 697 1.1 joerg 698 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('cxxDestructorDecl0')"><a name="cxxDestructorDecl0Anchor">cxxDestructorDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDestructorDecl.html">CXXDestructorDecl</a>>...</td></tr> 699 1.1 joerg <tr><td colspan="4" class="doc" id="cxxDestructorDecl0"><pre>Matches explicit C++ destructor declarations. 700 1.1 joerg 701 1.1 joerg Example matches Foo::~Foo() 702 1.1 joerg class Foo { 703 1.1 joerg public: 704 1.1 joerg virtual ~Foo(); 705 1.1 joerg }; 706 1.1 joerg </pre></td></tr> 707 1.1 joerg 708 1.1 joerg 709 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('cxxMethodDecl0')"><a name="cxxMethodDecl0Anchor">cxxMethodDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>>...</td></tr> 710 1.1 joerg <tr><td colspan="4" class="doc" id="cxxMethodDecl0"><pre>Matches method declarations. 711 1.1 joerg 712 1.1 joerg Example matches y 713 1.1 joerg class X { void y(); }; 714 1.1 joerg </pre></td></tr> 715 1.1 joerg 716 1.1 joerg 717 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('cxxRecordDecl0')"><a name="cxxRecordDecl0Anchor">cxxRecordDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>>...</td></tr> 718 1.1 joerg <tr><td colspan="4" class="doc" id="cxxRecordDecl0"><pre>Matches C++ class declarations. 719 1.1 joerg 720 1.1 joerg Example matches X, Z 721 1.1 joerg class X; 722 1.1 joerg template<class T> class Z {}; 723 1.1 joerg </pre></td></tr> 724 1.1 joerg 725 1.1 joerg 726 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('decl0')"><a name="decl0Anchor">decl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>...</td></tr> 727 1.1 joerg <tr><td colspan="4" class="doc" id="decl0"><pre>Matches declarations. 728 1.1 joerg 729 1.1 joerg Examples matches X, C, and the friend declaration inside C; 730 1.1 joerg void X(); 731 1.1 joerg class C { 732 1.1 joerg friend X; 733 1.1 joerg }; 734 1.1 joerg </pre></td></tr> 735 1.1 joerg 736 1.1 joerg 737 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('declaratorDecl0')"><a name="declaratorDecl0Anchor">declaratorDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>>...</td></tr> 738 1.1 joerg <tr><td colspan="4" class="doc" id="declaratorDecl0"><pre>Matches declarator declarations (field, variable, function 739 1.1 joerg and non-type template parameter declarations). 740 1.1 joerg 741 1.1 joerg Given 742 1.1 joerg class X { int y; }; 743 1.1 joerg declaratorDecl() 744 1.1 joerg matches int y. 745 1.1 joerg </pre></td></tr> 746 1.1 joerg 747 1.1 joerg 748 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('decompositionDecl0')"><a name="decompositionDecl0Anchor">decompositionDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DecompositionDecl.html">DecompositionDecl</a>>...</td></tr> 749 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="decompositionDecl0"><pre>Matches decomposition-declarations. 750 1.1.1.2 joerg 751 1.1.1.2 joerg Examples matches the declaration node with foo and bar, but not 752 1.1.1.2 joerg number. 753 1.1.1.2 joerg (matcher = declStmt(has(decompositionDecl()))) 754 1.1.1.2 joerg 755 1.1.1.2 joerg int number = 42; 756 1.1.1.2 joerg auto [foo, bar] = std::make_pair{42, 42}; 757 1.1.1.2 joerg </pre></td></tr> 758 1.1.1.2 joerg 759 1.1.1.2 joerg 760 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('enumConstantDecl0')"><a name="enumConstantDecl0Anchor">enumConstantDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumConstantDecl.html">EnumConstantDecl</a>>...</td></tr> 761 1.1 joerg <tr><td colspan="4" class="doc" id="enumConstantDecl0"><pre>Matches enum constants. 762 1.1 joerg 763 1.1 joerg Example matches A, B, C 764 1.1 joerg enum X { 765 1.1 joerg A, B, C 766 1.1 joerg }; 767 1.1 joerg </pre></td></tr> 768 1.1 joerg 769 1.1 joerg 770 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('enumDecl0')"><a name="enumDecl0Anchor">enumDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumDecl.html">EnumDecl</a>>...</td></tr> 771 1.1 joerg <tr><td colspan="4" class="doc" id="enumDecl0"><pre>Matches enum declarations. 772 1.1 joerg 773 1.1 joerg Example matches X 774 1.1 joerg enum X { 775 1.1 joerg A, B, C 776 1.1 joerg }; 777 1.1 joerg </pre></td></tr> 778 1.1 joerg 779 1.1 joerg 780 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('fieldDecl0')"><a name="fieldDecl0Anchor">fieldDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>>...</td></tr> 781 1.1 joerg <tr><td colspan="4" class="doc" id="fieldDecl0"><pre>Matches field declarations. 782 1.1 joerg 783 1.1 joerg Given 784 1.1 joerg class X { int m; }; 785 1.1 joerg fieldDecl() 786 1.1 joerg matches 'm'. 787 1.1 joerg </pre></td></tr> 788 1.1 joerg 789 1.1 joerg 790 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('friendDecl0')"><a name="friendDecl0Anchor">friendDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FriendDecl.html">FriendDecl</a>>...</td></tr> 791 1.1 joerg <tr><td colspan="4" class="doc" id="friendDecl0"><pre>Matches friend declarations. 792 1.1 joerg 793 1.1 joerg Given 794 1.1 joerg class X { friend void foo(); }; 795 1.1 joerg friendDecl() 796 1.1 joerg matches 'friend void foo()'. 797 1.1 joerg </pre></td></tr> 798 1.1 joerg 799 1.1 joerg 800 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('functionDecl0')"><a name="functionDecl0Anchor">functionDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>>...</td></tr> 801 1.1 joerg <tr><td colspan="4" class="doc" id="functionDecl0"><pre>Matches function declarations. 802 1.1 joerg 803 1.1 joerg Example matches f 804 1.1 joerg void f(); 805 1.1 joerg </pre></td></tr> 806 1.1 joerg 807 1.1 joerg 808 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('functionTemplateDecl0')"><a name="functionTemplateDecl0Anchor">functionTemplateDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionTemplateDecl.html">FunctionTemplateDecl</a>>...</td></tr> 809 1.1 joerg <tr><td colspan="4" class="doc" id="functionTemplateDecl0"><pre>Matches C++ function template declarations. 810 1.1 joerg 811 1.1 joerg Example matches f 812 1.1 joerg template<class T> void f(T t) {} 813 1.1 joerg </pre></td></tr> 814 1.1 joerg 815 1.1 joerg 816 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('indirectFieldDecl0')"><a name="indirectFieldDecl0Anchor">indirectFieldDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IndirectFieldDecl.html">IndirectFieldDecl</a>>...</td></tr> 817 1.1 joerg <tr><td colspan="4" class="doc" id="indirectFieldDecl0"><pre>Matches indirect field declarations. 818 1.1 joerg 819 1.1 joerg Given 820 1.1 joerg struct X { struct { int a; }; }; 821 1.1 joerg indirectFieldDecl() 822 1.1 joerg matches 'a'. 823 1.1 joerg </pre></td></tr> 824 1.1 joerg 825 1.1 joerg 826 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('labelDecl0')"><a name="labelDecl0Anchor">labelDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelDecl.html">LabelDecl</a>>...</td></tr> 827 1.1 joerg <tr><td colspan="4" class="doc" id="labelDecl0"><pre>Matches a declaration of label. 828 1.1 joerg 829 1.1 joerg Given 830 1.1 joerg goto FOO; 831 1.1 joerg FOO: bar(); 832 1.1 joerg labelDecl() 833 1.1 joerg matches 'FOO:' 834 1.1 joerg </pre></td></tr> 835 1.1 joerg 836 1.1 joerg 837 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('linkageSpecDecl0')"><a name="linkageSpecDecl0Anchor">linkageSpecDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LinkageSpecDecl.html">LinkageSpecDecl</a>>...</td></tr> 838 1.1 joerg <tr><td colspan="4" class="doc" id="linkageSpecDecl0"><pre>Matches a declaration of a linkage specification. 839 1.1 joerg 840 1.1 joerg Given 841 1.1 joerg extern "C" {} 842 1.1 joerg linkageSpecDecl() 843 1.1 joerg matches "extern "C" {}" 844 1.1 joerg </pre></td></tr> 845 1.1 joerg 846 1.1 joerg 847 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('namedDecl0')"><a name="namedDecl0Anchor">namedDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>>...</td></tr> 848 1.1 joerg <tr><td colspan="4" class="doc" id="namedDecl0"><pre>Matches a declaration of anything that could have a name. 849 1.1 joerg 850 1.1 joerg Example matches X, S, the anonymous union type, i, and U; 851 1.1 joerg typedef int X; 852 1.1 joerg struct S { 853 1.1 joerg union { 854 1.1 joerg int i; 855 1.1 joerg } U; 856 1.1 joerg }; 857 1.1 joerg </pre></td></tr> 858 1.1 joerg 859 1.1 joerg 860 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('namespaceAliasDecl0')"><a name="namespaceAliasDecl0Anchor">namespaceAliasDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamespaceAliasDecl.html">NamespaceAliasDecl</a>>...</td></tr> 861 1.1 joerg <tr><td colspan="4" class="doc" id="namespaceAliasDecl0"><pre>Matches a declaration of a namespace alias. 862 1.1 joerg 863 1.1 joerg Given 864 1.1 joerg namespace test {} 865 1.1 joerg namespace alias = ::test; 866 1.1 joerg namespaceAliasDecl() 867 1.1 joerg matches "namespace alias" but not "namespace test" 868 1.1 joerg </pre></td></tr> 869 1.1 joerg 870 1.1 joerg 871 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('namespaceDecl0')"><a name="namespaceDecl0Anchor">namespaceDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamespaceDecl.html">NamespaceDecl</a>>...</td></tr> 872 1.1 joerg <tr><td colspan="4" class="doc" id="namespaceDecl0"><pre>Matches a declaration of a namespace. 873 1.1 joerg 874 1.1 joerg Given 875 1.1 joerg namespace {} 876 1.1 joerg namespace test {} 877 1.1 joerg namespaceDecl() 878 1.1 joerg matches "namespace {}" and "namespace test {}" 879 1.1 joerg </pre></td></tr> 880 1.1 joerg 881 1.1 joerg 882 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('nonTypeTemplateParmDecl0')"><a name="nonTypeTemplateParmDecl0Anchor">nonTypeTemplateParmDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NonTypeTemplateParmDecl.html">NonTypeTemplateParmDecl</a>>...</td></tr> 883 1.1 joerg <tr><td colspan="4" class="doc" id="nonTypeTemplateParmDecl0"><pre>Matches non-type template parameter declarations. 884 1.1 joerg 885 1.1 joerg Given 886 1.1 joerg template <typename T, int N> struct C {}; 887 1.1 joerg nonTypeTemplateParmDecl() 888 1.1 joerg matches 'N', but not 'T'. 889 1.1 joerg </pre></td></tr> 890 1.1 joerg 891 1.1 joerg 892 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('objcCategoryDecl0')"><a name="objcCategoryDecl0Anchor">objcCategoryDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCCategoryDecl.html">ObjCCategoryDecl</a>>...</td></tr> 893 1.1 joerg <tr><td colspan="4" class="doc" id="objcCategoryDecl0"><pre>Matches Objective-C category declarations. 894 1.1 joerg 895 1.1 joerg Example matches Foo (Additions) 896 1.1 joerg @interface Foo (Additions) 897 1.1 joerg @end 898 1.1 joerg </pre></td></tr> 899 1.1 joerg 900 1.1 joerg 901 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('objcCategoryImplDecl0')"><a name="objcCategoryImplDecl0Anchor">objcCategoryImplDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCCategoryImplDecl.html">ObjCCategoryImplDecl</a>>...</td></tr> 902 1.1 joerg <tr><td colspan="4" class="doc" id="objcCategoryImplDecl0"><pre>Matches Objective-C category definitions. 903 1.1 joerg 904 1.1 joerg Example matches Foo (Additions) 905 1.1 joerg @implementation Foo (Additions) 906 1.1 joerg @end 907 1.1 joerg </pre></td></tr> 908 1.1 joerg 909 1.1 joerg 910 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('objcImplementationDecl0')"><a name="objcImplementationDecl0Anchor">objcImplementationDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCImplementationDecl.html">ObjCImplementationDecl</a>>...</td></tr> 911 1.1 joerg <tr><td colspan="4" class="doc" id="objcImplementationDecl0"><pre>Matches Objective-C implementation declarations. 912 1.1 joerg 913 1.1 joerg Example matches Foo 914 1.1 joerg @implementation Foo 915 1.1 joerg @end 916 1.1 joerg </pre></td></tr> 917 1.1 joerg 918 1.1 joerg 919 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('objcInterfaceDecl0')"><a name="objcInterfaceDecl0Anchor">objcInterfaceDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>>...</td></tr> 920 1.1 joerg <tr><td colspan="4" class="doc" id="objcInterfaceDecl0"><pre>Matches Objective-C interface declarations. 921 1.1 joerg 922 1.1 joerg Example matches Foo 923 1.1 joerg @interface Foo 924 1.1 joerg @end 925 1.1 joerg </pre></td></tr> 926 1.1 joerg 927 1.1 joerg 928 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('objcIvarDecl0')"><a name="objcIvarDecl0Anchor">objcIvarDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCIvarDecl.html">ObjCIvarDecl</a>>...</td></tr> 929 1.1 joerg <tr><td colspan="4" class="doc" id="objcIvarDecl0"><pre>Matches Objective-C instance variable declarations. 930 1.1 joerg 931 1.1 joerg Example matches _enabled 932 1.1 joerg @implementation Foo { 933 1.1 joerg BOOL _enabled; 934 1.1 joerg } 935 1.1 joerg @end 936 1.1 joerg </pre></td></tr> 937 1.1 joerg 938 1.1 joerg 939 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('objcMethodDecl0')"><a name="objcMethodDecl0Anchor">objcMethodDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>>...</td></tr> 940 1.1 joerg <tr><td colspan="4" class="doc" id="objcMethodDecl0"><pre>Matches Objective-C method declarations. 941 1.1 joerg 942 1.1 joerg Example matches both declaration and definition of -[Foo method] 943 1.1 joerg @interface Foo 944 1.1 joerg - (void)method; 945 1.1 joerg @end 946 1.1 joerg 947 1.1 joerg @implementation Foo 948 1.1 joerg - (void)method {} 949 1.1 joerg @end 950 1.1 joerg </pre></td></tr> 951 1.1 joerg 952 1.1 joerg 953 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('objcPropertyDecl0')"><a name="objcPropertyDecl0Anchor">objcPropertyDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>>...</td></tr> 954 1.1 joerg <tr><td colspan="4" class="doc" id="objcPropertyDecl0"><pre>Matches Objective-C property declarations. 955 1.1 joerg 956 1.1 joerg Example matches enabled 957 1.1 joerg @interface Foo 958 1.1 joerg @property BOOL enabled; 959 1.1 joerg @end 960 1.1 joerg </pre></td></tr> 961 1.1 joerg 962 1.1 joerg 963 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('objcProtocolDecl0')"><a name="objcProtocolDecl0Anchor">objcProtocolDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCProtocolDecl.html">ObjCProtocolDecl</a>>...</td></tr> 964 1.1 joerg <tr><td colspan="4" class="doc" id="objcProtocolDecl0"><pre>Matches Objective-C protocol declarations. 965 1.1 joerg 966 1.1 joerg Example matches FooDelegate 967 1.1 joerg @protocol FooDelegate 968 1.1 joerg @end 969 1.1 joerg </pre></td></tr> 970 1.1 joerg 971 1.1 joerg 972 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('parmVarDecl0')"><a name="parmVarDecl0Anchor">parmVarDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>>...</td></tr> 973 1.1 joerg <tr><td colspan="4" class="doc" id="parmVarDecl0"><pre>Matches parameter variable declarations. 974 1.1 joerg 975 1.1 joerg Given 976 1.1 joerg void f(int x); 977 1.1 joerg parmVarDecl() 978 1.1 joerg matches int x. 979 1.1 joerg </pre></td></tr> 980 1.1 joerg 981 1.1 joerg 982 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('recordDecl0')"><a name="recordDecl0Anchor">recordDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordDecl.html">RecordDecl</a>>...</td></tr> 983 1.1 joerg <tr><td colspan="4" class="doc" id="recordDecl0"><pre>Matches class, struct, and union declarations. 984 1.1 joerg 985 1.1 joerg Example matches X, Z, U, and S 986 1.1 joerg class X; 987 1.1 joerg template<class T> class Z {}; 988 1.1 joerg struct S {}; 989 1.1 joerg union U {}; 990 1.1 joerg </pre></td></tr> 991 1.1 joerg 992 1.1 joerg 993 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('staticAssertDecl0')"><a name="staticAssertDecl0Anchor">staticAssertDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1StaticAssertDecl.html">StaticAssertDecl</a>>...</td></tr> 994 1.1 joerg <tr><td colspan="4" class="doc" id="staticAssertDecl0"><pre>Matches a C++ static_assert declaration. 995 1.1 joerg 996 1.1 joerg Example: 997 1.1 joerg staticAssertExpr() 998 1.1 joerg matches 999 1.1 joerg static_assert(sizeof(S) == sizeof(int)) 1000 1.1 joerg in 1001 1.1 joerg struct S { 1002 1.1 joerg int x; 1003 1.1 joerg }; 1004 1.1 joerg static_assert(sizeof(S) == sizeof(int)); 1005 1.1 joerg </pre></td></tr> 1006 1.1 joerg 1007 1.1 joerg 1008 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('tagDecl0')"><a name="tagDecl0Anchor">tagDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>>...</td></tr> 1009 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="tagDecl0"><pre>Matches tag declarations. 1010 1.1.1.2 joerg 1011 1.1.1.2 joerg Example matches X, Z, U, S, E 1012 1.1.1.2 joerg class X; 1013 1.1.1.2 joerg template<class T> class Z {}; 1014 1.1.1.2 joerg struct S {}; 1015 1.1.1.2 joerg union U {}; 1016 1.1.1.2 joerg enum E { 1017 1.1.1.2 joerg A, B, C 1018 1.1.1.2 joerg }; 1019 1.1.1.2 joerg </pre></td></tr> 1020 1.1.1.2 joerg 1021 1.1.1.2 joerg 1022 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('templateTemplateParmDecl0')"><a name="templateTemplateParmDecl0Anchor">templateTemplateParmDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTemplateParmDecl.html">TemplateTemplateParmDecl</a>>...</td></tr> 1023 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="templateTemplateParmDecl0"><pre>Matches template template parameter declarations. 1024 1.1.1.2 joerg 1025 1.1.1.2 joerg Given 1026 1.1.1.2 joerg template <template <typename> class Z, int N> struct C {}; 1027 1.1.1.2 joerg templateTypeParmDecl() 1028 1.1.1.2 joerg matches 'Z', but not 'N'. 1029 1.1.1.2 joerg </pre></td></tr> 1030 1.1.1.2 joerg 1031 1.1.1.2 joerg 1032 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('templateTypeParmDecl0')"><a name="templateTypeParmDecl0Anchor">templateTypeParmDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmDecl.html">TemplateTypeParmDecl</a>>...</td></tr> 1033 1.1 joerg <tr><td colspan="4" class="doc" id="templateTypeParmDecl0"><pre>Matches template type parameter declarations. 1034 1.1 joerg 1035 1.1 joerg Given 1036 1.1 joerg template <typename T, int N> struct C {}; 1037 1.1 joerg templateTypeParmDecl() 1038 1.1 joerg matches 'T', but not 'N'. 1039 1.1 joerg </pre></td></tr> 1040 1.1 joerg 1041 1.1 joerg 1042 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('translationUnitDecl0')"><a name="translationUnitDecl0Anchor">translationUnitDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TranslationUnitDecl.html">TranslationUnitDecl</a>>...</td></tr> 1043 1.1 joerg <tr><td colspan="4" class="doc" id="translationUnitDecl0"><pre>Matches the top declaration context. 1044 1.1 joerg 1045 1.1 joerg Given 1046 1.1 joerg int X; 1047 1.1 joerg namespace NS { 1048 1.1 joerg int Y; 1049 1.1 joerg } // namespace NS 1050 1.1 joerg decl(hasDeclContext(translationUnitDecl())) 1051 1.1 joerg matches "int X", but not "int Y". 1052 1.1 joerg </pre></td></tr> 1053 1.1 joerg 1054 1.1 joerg 1055 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('typeAliasDecl0')"><a name="typeAliasDecl0Anchor">typeAliasDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeAliasDecl.html">TypeAliasDecl</a>>...</td></tr> 1056 1.1 joerg <tr><td colspan="4" class="doc" id="typeAliasDecl0"><pre>Matches type alias declarations. 1057 1.1 joerg 1058 1.1 joerg Given 1059 1.1 joerg typedef int X; 1060 1.1 joerg using Y = int; 1061 1.1 joerg typeAliasDecl() 1062 1.1 joerg matches "using Y = int", but not "typedef int X" 1063 1.1 joerg </pre></td></tr> 1064 1.1 joerg 1065 1.1 joerg 1066 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('typeAliasTemplateDecl0')"><a name="typeAliasTemplateDecl0Anchor">typeAliasTemplateDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeAliasTemplateDecl.html">TypeAliasTemplateDecl</a>>...</td></tr> 1067 1.1 joerg <tr><td colspan="4" class="doc" id="typeAliasTemplateDecl0"><pre>Matches type alias template declarations. 1068 1.1 joerg 1069 1.1 joerg typeAliasTemplateDecl() matches 1070 1.1 joerg template <typename T> 1071 1.1 joerg using Y = X<T>; 1072 1.1 joerg </pre></td></tr> 1073 1.1 joerg 1074 1.1 joerg 1075 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('typedefDecl0')"><a name="typedefDecl0Anchor">typedefDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefDecl.html">TypedefDecl</a>>...</td></tr> 1076 1.1 joerg <tr><td colspan="4" class="doc" id="typedefDecl0"><pre>Matches typedef declarations. 1077 1.1 joerg 1078 1.1 joerg Given 1079 1.1 joerg typedef int X; 1080 1.1 joerg using Y = int; 1081 1.1 joerg typedefDecl() 1082 1.1 joerg matches "typedef int X", but not "using Y = int" 1083 1.1 joerg </pre></td></tr> 1084 1.1 joerg 1085 1.1 joerg 1086 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('typedefNameDecl0')"><a name="typedefNameDecl0Anchor">typedefNameDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>>...</td></tr> 1087 1.1 joerg <tr><td colspan="4" class="doc" id="typedefNameDecl0"><pre>Matches typedef name declarations. 1088 1.1 joerg 1089 1.1 joerg Given 1090 1.1 joerg typedef int X; 1091 1.1 joerg using Y = int; 1092 1.1 joerg typedefNameDecl() 1093 1.1 joerg matches "typedef int X" and "using Y = int" 1094 1.1 joerg </pre></td></tr> 1095 1.1 joerg 1096 1.1 joerg 1097 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('unresolvedUsingTypenameDecl0')"><a name="unresolvedUsingTypenameDecl0Anchor">unresolvedUsingTypenameDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingTypenameDecl.html">UnresolvedUsingTypenameDecl</a>>...</td></tr> 1098 1.1 joerg <tr><td colspan="4" class="doc" id="unresolvedUsingTypenameDecl0"><pre>Matches unresolved using value declarations that involve the 1099 1.1 joerg typename. 1100 1.1 joerg 1101 1.1 joerg Given 1102 1.1 joerg template <typename T> 1103 1.1 joerg struct Base { typedef T Foo; }; 1104 1.1 joerg 1105 1.1 joerg template<typename T> 1106 1.1 joerg struct S : private Base<T> { 1107 1.1 joerg using typename Base<T>::Foo; 1108 1.1 joerg }; 1109 1.1 joerg unresolvedUsingTypenameDecl() 1110 1.1 joerg matches using Base<T>::Foo </pre></td></tr> 1111 1.1 joerg 1112 1.1 joerg 1113 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('unresolvedUsingValueDecl0')"><a name="unresolvedUsingValueDecl0Anchor">unresolvedUsingValueDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingValueDecl.html">UnresolvedUsingValueDecl</a>>...</td></tr> 1114 1.1 joerg <tr><td colspan="4" class="doc" id="unresolvedUsingValueDecl0"><pre>Matches unresolved using value declarations. 1115 1.1 joerg 1116 1.1 joerg Given 1117 1.1 joerg template<typename X> 1118 1.1 joerg class C : private X { 1119 1.1 joerg using X::x; 1120 1.1 joerg }; 1121 1.1 joerg unresolvedUsingValueDecl() 1122 1.1 joerg matches using X::x </pre></td></tr> 1123 1.1 joerg 1124 1.1 joerg 1125 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('usingDecl0')"><a name="usingDecl0Anchor">usingDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingDecl.html">UsingDecl</a>>...</td></tr> 1126 1.1 joerg <tr><td colspan="4" class="doc" id="usingDecl0"><pre>Matches using declarations. 1127 1.1 joerg 1128 1.1 joerg Given 1129 1.1 joerg namespace X { int x; } 1130 1.1 joerg using X::x; 1131 1.1 joerg usingDecl() 1132 1.1 joerg matches using X::x </pre></td></tr> 1133 1.1 joerg 1134 1.1 joerg 1135 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('usingDirectiveDecl0')"><a name="usingDirectiveDecl0Anchor">usingDirectiveDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingDirectiveDecl.html">UsingDirectiveDecl</a>>...</td></tr> 1136 1.1 joerg <tr><td colspan="4" class="doc" id="usingDirectiveDecl0"><pre>Matches using namespace declarations. 1137 1.1 joerg 1138 1.1 joerg Given 1139 1.1 joerg namespace X { int x; } 1140 1.1 joerg using namespace X; 1141 1.1 joerg usingDirectiveDecl() 1142 1.1 joerg matches using namespace X </pre></td></tr> 1143 1.1 joerg 1144 1.1 joerg 1145 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('valueDecl0')"><a name="valueDecl0Anchor">valueDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>>...</td></tr> 1146 1.1 joerg <tr><td colspan="4" class="doc" id="valueDecl0"><pre>Matches any value declaration. 1147 1.1 joerg 1148 1.1 joerg Example matches A, B, C and F 1149 1.1 joerg enum X { A, B, C }; 1150 1.1 joerg void F(); 1151 1.1 joerg </pre></td></tr> 1152 1.1 joerg 1153 1.1 joerg 1154 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('varDecl0')"><a name="varDecl0Anchor">varDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>...</td></tr> 1155 1.1 joerg <tr><td colspan="4" class="doc" id="varDecl0"><pre>Matches variable declarations. 1156 1.1 joerg 1157 1.1 joerg Note: this does not match declarations of member variables, which are 1158 1.1 joerg "field" declarations in Clang parlance. 1159 1.1 joerg 1160 1.1 joerg Example matches a 1161 1.1 joerg int a; 1162 1.1 joerg </pre></td></tr> 1163 1.1 joerg 1164 1.1 joerg 1165 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html">NestedNameSpecifierLoc</a>></td><td class="name" onclick="toggle('nestedNameSpecifierLoc0')"><a name="nestedNameSpecifierLoc0Anchor">nestedNameSpecifierLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html">NestedNameSpecifierLoc</a>>...</td></tr> 1166 1.1 joerg <tr><td colspan="4" class="doc" id="nestedNameSpecifierLoc0"><pre>Same as nestedNameSpecifier but matches NestedNameSpecifierLoc. 1167 1.1 joerg </pre></td></tr> 1168 1.1 joerg 1169 1.1 joerg 1170 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>></td><td class="name" onclick="toggle('nestedNameSpecifier0')"><a name="nestedNameSpecifier0Anchor">nestedNameSpecifier</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>>...</td></tr> 1171 1.1 joerg <tr><td colspan="4" class="doc" id="nestedNameSpecifier0"><pre>Matches nested name specifiers. 1172 1.1 joerg 1173 1.1 joerg Given 1174 1.1 joerg namespace ns { 1175 1.1 joerg struct A { static void f(); }; 1176 1.1 joerg void A::f() {} 1177 1.1 joerg void g() { A::f(); } 1178 1.1 joerg } 1179 1.1 joerg ns::A a; 1180 1.1 joerg nestedNameSpecifier() 1181 1.1 joerg matches "ns::" and both "A::" 1182 1.1 joerg </pre></td></tr> 1183 1.1 joerg 1184 1.1 joerg 1185 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPClause.html">OMPClause</a>></td><td class="name" onclick="toggle('ompDefaultClause0')"><a name="ompDefaultClause0Anchor">ompDefaultClause</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPDefaultClause.html">OMPDefaultClause</a>>...</td></tr> 1186 1.1 joerg <tr><td colspan="4" class="doc" id="ompDefaultClause0"><pre>Matches OpenMP ``default`` clause. 1187 1.1 joerg 1188 1.1 joerg Given 1189 1.1 joerg 1190 1.1 joerg #pragma omp parallel default(none) 1191 1.1 joerg #pragma omp parallel default(shared) 1192 1.1.1.2 joerg #pragma omp parallel default(firstprivate) 1193 1.1 joerg #pragma omp parallel 1194 1.1 joerg 1195 1.1.1.2 joerg ``ompDefaultClause()`` matches ``default(none)``, ``default(shared)``, and 1196 1.1.1.2 joerg ``default(firstprivate)`` 1197 1.1 joerg </pre></td></tr> 1198 1.1 joerg 1199 1.1 joerg 1200 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('qualType0')"><a name="qualType0Anchor">qualType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>...</td></tr> 1201 1.1 joerg <tr><td colspan="4" class="doc" id="qualType0"><pre>Matches QualTypes in the clang AST. 1202 1.1 joerg </pre></td></tr> 1203 1.1 joerg 1204 1.1 joerg 1205 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('addrLabelExpr0')"><a name="addrLabelExpr0Anchor">addrLabelExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>...</td></tr> 1206 1.1 joerg <tr><td colspan="4" class="doc" id="addrLabelExpr0"><pre>Matches address of label statements (GNU extension). 1207 1.1 joerg 1208 1.1 joerg Given 1209 1.1 joerg FOO: bar(); 1210 1.1 joerg void *ptr = &&FOO; 1211 1.1 joerg goto *bar; 1212 1.1 joerg addrLabelExpr() 1213 1.1 joerg matches '&&FOO' 1214 1.1 joerg </pre></td></tr> 1215 1.1 joerg 1216 1.1 joerg 1217 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('arraySubscriptExpr0')"><a name="arraySubscriptExpr0Anchor">arraySubscriptExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html">ArraySubscriptExpr</a>>...</td></tr> 1218 1.1 joerg <tr><td colspan="4" class="doc" id="arraySubscriptExpr0"><pre>Matches array subscript expressions. 1219 1.1 joerg 1220 1.1 joerg Given 1221 1.1 joerg int i = a[1]; 1222 1.1 joerg arraySubscriptExpr() 1223 1.1 joerg matches "a[1]" 1224 1.1 joerg </pre></td></tr> 1225 1.1 joerg 1226 1.1 joerg 1227 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('asmStmt0')"><a name="asmStmt0Anchor">asmStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AsmStmt.html">AsmStmt</a>>...</td></tr> 1228 1.1 joerg <tr><td colspan="4" class="doc" id="asmStmt0"><pre>Matches asm statements. 1229 1.1 joerg 1230 1.1 joerg int i = 100; 1231 1.1 joerg __asm("mov al, 2"); 1232 1.1 joerg asmStmt() 1233 1.1 joerg matches '__asm("mov al, 2")' 1234 1.1 joerg </pre></td></tr> 1235 1.1 joerg 1236 1.1 joerg 1237 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('atomicExpr0')"><a name="atomicExpr0Anchor">atomicExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AtomicExpr.html">AtomicExpr</a>>...</td></tr> 1238 1.1 joerg <tr><td colspan="4" class="doc" id="atomicExpr0"><pre>Matches atomic builtins. 1239 1.1 joerg Example matches __atomic_load_n(ptr, 1) 1240 1.1 joerg void foo() { int *ptr; __atomic_load_n(ptr, 1); } 1241 1.1 joerg </pre></td></tr> 1242 1.1 joerg 1243 1.1 joerg 1244 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('autoreleasePoolStmt0')"><a name="autoreleasePoolStmt0Anchor">autoreleasePoolStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCAutoreleasePoolStmt.html">ObjCAutoreleasePoolStmt</a>>...</td></tr> 1245 1.1 joerg <tr><td colspan="4" class="doc" id="autoreleasePoolStmt0"><pre>Matches an Objective-C autorelease pool statement. 1246 1.1 joerg 1247 1.1 joerg Given 1248 1.1 joerg @autoreleasepool { 1249 1.1 joerg int x = 0; 1250 1.1 joerg } 1251 1.1 joerg autoreleasePoolStmt(stmt()) matches the declaration of "x" 1252 1.1 joerg inside the autorelease pool. 1253 1.1 joerg </pre></td></tr> 1254 1.1 joerg 1255 1.1 joerg 1256 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('binaryConditionalOperator0')"><a name="binaryConditionalOperator0Anchor">binaryConditionalOperator</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryConditionalOperator.html">BinaryConditionalOperator</a>>...</td></tr> 1257 1.1 joerg <tr><td colspan="4" class="doc" id="binaryConditionalOperator0"><pre>Matches binary conditional operator expressions (GNU extension). 1258 1.1 joerg 1259 1.1 joerg Example matches a ?: b 1260 1.1 joerg (a ?: b) + 42; 1261 1.1 joerg </pre></td></tr> 1262 1.1 joerg 1263 1.1 joerg 1264 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('binaryOperator0')"><a name="binaryOperator0Anchor">binaryOperator</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>>...</td></tr> 1265 1.1 joerg <tr><td colspan="4" class="doc" id="binaryOperator0"><pre>Matches binary operator expressions. 1266 1.1 joerg 1267 1.1 joerg Example matches a || b 1268 1.1 joerg !(a || b) 1269 1.1.1.2 joerg See also the binaryOperation() matcher for more-general matching. 1270 1.1 joerg </pre></td></tr> 1271 1.1 joerg 1272 1.1 joerg 1273 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('blockExpr0')"><a name="blockExpr0Anchor">blockExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockExpr.html">BlockExpr</a>>...</td></tr> 1274 1.1 joerg <tr><td colspan="4" class="doc" id="blockExpr0"><pre>Matches a reference to a block. 1275 1.1 joerg 1276 1.1 joerg Example: matches "^{}": 1277 1.1 joerg void f() { ^{}(); } 1278 1.1 joerg </pre></td></tr> 1279 1.1 joerg 1280 1.1 joerg 1281 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('breakStmt0')"><a name="breakStmt0Anchor">breakStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BreakStmt.html">BreakStmt</a>>...</td></tr> 1282 1.1 joerg <tr><td colspan="4" class="doc" id="breakStmt0"><pre>Matches break statements. 1283 1.1 joerg 1284 1.1 joerg Given 1285 1.1 joerg while (true) { break; } 1286 1.1 joerg breakStmt() 1287 1.1 joerg matches 'break' 1288 1.1 joerg </pre></td></tr> 1289 1.1 joerg 1290 1.1 joerg 1291 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cStyleCastExpr0')"><a name="cStyleCastExpr0Anchor">cStyleCastExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CStyleCastExpr.html">CStyleCastExpr</a>>...</td></tr> 1292 1.1 joerg <tr><td colspan="4" class="doc" id="cStyleCastExpr0"><pre>Matches a C-style cast expression. 1293 1.1 joerg 1294 1.1 joerg Example: Matches (int) 2.2f in 1295 1.1 joerg int i = (int) 2.2f; 1296 1.1 joerg </pre></td></tr> 1297 1.1 joerg 1298 1.1 joerg 1299 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('callExpr0')"><a name="callExpr0Anchor">callExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>...</td></tr> 1300 1.1 joerg <tr><td colspan="4" class="doc" id="callExpr0"><pre>Matches call expressions. 1301 1.1 joerg 1302 1.1 joerg Example matches x.y() and y() 1303 1.1 joerg X x; 1304 1.1 joerg x.y(); 1305 1.1 joerg y(); 1306 1.1 joerg </pre></td></tr> 1307 1.1 joerg 1308 1.1 joerg 1309 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('caseStmt0')"><a name="caseStmt0Anchor">caseStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CaseStmt.html">CaseStmt</a>>...</td></tr> 1310 1.1 joerg <tr><td colspan="4" class="doc" id="caseStmt0"><pre>Matches case statements inside switch statements. 1311 1.1 joerg 1312 1.1 joerg Given 1313 1.1 joerg switch(a) { case 42: break; default: break; } 1314 1.1 joerg caseStmt() 1315 1.1 joerg matches 'case 42:'. 1316 1.1 joerg </pre></td></tr> 1317 1.1 joerg 1318 1.1 joerg 1319 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('castExpr0')"><a name="castExpr0Anchor">castExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CastExpr.html">CastExpr</a>>...</td></tr> 1320 1.1 joerg <tr><td colspan="4" class="doc" id="castExpr0"><pre>Matches any cast nodes of Clang's AST. 1321 1.1 joerg 1322 1.1 joerg Example: castExpr() matches each of the following: 1323 1.1 joerg (int) 3; 1324 1.1 joerg const_cast<Expr *>(SubExpr); 1325 1.1 joerg char c = 0; 1326 1.1 joerg but does not match 1327 1.1 joerg int i = (0); 1328 1.1 joerg int k = 0; 1329 1.1 joerg </pre></td></tr> 1330 1.1 joerg 1331 1.1 joerg 1332 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('characterLiteral0')"><a name="characterLiteral0Anchor">characterLiteral</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>>...</td></tr> 1333 1.1 joerg <tr><td colspan="4" class="doc" id="characterLiteral0"><pre>Matches character literals (also matches wchar_t). 1334 1.1 joerg 1335 1.1 joerg Not matching Hex-encoded chars (e.g. 0x1234, which is a IntegerLiteral), 1336 1.1 joerg though. 1337 1.1 joerg 1338 1.1 joerg Example matches 'a', L'a' 1339 1.1 joerg char ch = 'a'; 1340 1.1 joerg wchar_t chw = L'a'; 1341 1.1 joerg </pre></td></tr> 1342 1.1 joerg 1343 1.1 joerg 1344 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('chooseExpr0')"><a name="chooseExpr0Anchor">chooseExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ChooseExpr.html">ChooseExpr</a>>...</td></tr> 1345 1.1 joerg <tr><td colspan="4" class="doc" id="chooseExpr0"><pre>Matches GNU __builtin_choose_expr. 1346 1.1 joerg </pre></td></tr> 1347 1.1 joerg 1348 1.1 joerg 1349 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('coawaitExpr0')"><a name="coawaitExpr0Anchor">coawaitExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CoawaitExpr.html">CoawaitExpr</a>>...</td></tr> 1350 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="coawaitExpr0"><pre>Matches co_await expressions. 1351 1.1.1.2 joerg 1352 1.1.1.2 joerg Given 1353 1.1.1.2 joerg co_await 1; 1354 1.1.1.2 joerg coawaitExpr() 1355 1.1.1.2 joerg matches 'co_await 1' 1356 1.1.1.2 joerg </pre></td></tr> 1357 1.1.1.2 joerg 1358 1.1.1.2 joerg 1359 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('compoundLiteralExpr0')"><a name="compoundLiteralExpr0Anchor">compoundLiteralExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>>...</td></tr> 1360 1.1 joerg <tr><td colspan="4" class="doc" id="compoundLiteralExpr0"><pre>Matches compound (i.e. non-scalar) literals 1361 1.1 joerg 1362 1.1 joerg Example match: {1}, (1, 2) 1363 1.1 joerg int array[4] = {1}; 1364 1.1 joerg vector int myvec = (vector int)(1, 2); 1365 1.1 joerg </pre></td></tr> 1366 1.1 joerg 1367 1.1 joerg 1368 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('compoundStmt0')"><a name="compoundStmt0Anchor">compoundStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundStmt.html">CompoundStmt</a>>...</td></tr> 1369 1.1 joerg <tr><td colspan="4" class="doc" id="compoundStmt0"><pre>Matches compound statements. 1370 1.1 joerg 1371 1.1 joerg Example matches '{}' and '{{}}' in 'for (;;) {{}}' 1372 1.1 joerg for (;;) {{}} 1373 1.1 joerg </pre></td></tr> 1374 1.1 joerg 1375 1.1 joerg 1376 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('conditionalOperator0')"><a name="conditionalOperator0Anchor">conditionalOperator</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ConditionalOperator.html">ConditionalOperator</a>>...</td></tr> 1377 1.1 joerg <tr><td colspan="4" class="doc" id="conditionalOperator0"><pre>Matches conditional operator expressions. 1378 1.1 joerg 1379 1.1 joerg Example matches a ? b : c 1380 1.1 joerg (a ? b : c) + 42 1381 1.1 joerg </pre></td></tr> 1382 1.1 joerg 1383 1.1 joerg 1384 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('constantExpr0')"><a name="constantExpr0Anchor">constantExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ConstantExpr.html">ConstantExpr</a>>...</td></tr> 1385 1.1 joerg <tr><td colspan="4" class="doc" id="constantExpr0"><pre>Matches a constant expression wrapper. 1386 1.1 joerg 1387 1.1 joerg Example matches the constant in the case statement: 1388 1.1 joerg (matcher = constantExpr()) 1389 1.1 joerg switch (a) { 1390 1.1 joerg case 37: break; 1391 1.1 joerg } 1392 1.1 joerg </pre></td></tr> 1393 1.1 joerg 1394 1.1 joerg 1395 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('continueStmt0')"><a name="continueStmt0Anchor">continueStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ContinueStmt.html">ContinueStmt</a>>...</td></tr> 1396 1.1 joerg <tr><td colspan="4" class="doc" id="continueStmt0"><pre>Matches continue statements. 1397 1.1 joerg 1398 1.1 joerg Given 1399 1.1 joerg while (true) { continue; } 1400 1.1 joerg continueStmt() 1401 1.1 joerg matches 'continue' 1402 1.1 joerg </pre></td></tr> 1403 1.1 joerg 1404 1.1 joerg 1405 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('coreturnStmt0')"><a name="coreturnStmt0Anchor">coreturnStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CoreturnStmt.html">CoreturnStmt</a>>...</td></tr> 1406 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="coreturnStmt0"><pre>Matches co_return statements. 1407 1.1.1.2 joerg 1408 1.1.1.2 joerg Given 1409 1.1.1.2 joerg while (true) { co_return; } 1410 1.1.1.2 joerg coreturnStmt() 1411 1.1.1.2 joerg matches 'co_return' 1412 1.1.1.2 joerg </pre></td></tr> 1413 1.1.1.2 joerg 1414 1.1.1.2 joerg 1415 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('coyieldExpr0')"><a name="coyieldExpr0Anchor">coyieldExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CoyieldExpr.html">CoyieldExpr</a>>...</td></tr> 1416 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="coyieldExpr0"><pre>Matches co_yield expressions. 1417 1.1.1.2 joerg 1418 1.1.1.2 joerg Given 1419 1.1.1.2 joerg co_yield 1; 1420 1.1.1.2 joerg coyieldExpr() 1421 1.1.1.2 joerg matches 'co_yield 1' 1422 1.1.1.2 joerg </pre></td></tr> 1423 1.1.1.2 joerg 1424 1.1.1.2 joerg 1425 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cudaKernelCallExpr0')"><a name="cudaKernelCallExpr0Anchor">cudaKernelCallExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CUDAKernelCallExpr.html">CUDAKernelCallExpr</a>>...</td></tr> 1426 1.1 joerg <tr><td colspan="4" class="doc" id="cudaKernelCallExpr0"><pre>Matches CUDA kernel call expression. 1427 1.1 joerg 1428 1.1 joerg Example matches, 1429 1.1 joerg kernel<<<i,j>>>(); 1430 1.1 joerg </pre></td></tr> 1431 1.1 joerg 1432 1.1 joerg 1433 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxBindTemporaryExpr0')"><a name="cxxBindTemporaryExpr0Anchor">cxxBindTemporaryExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBindTemporaryExpr.html">CXXBindTemporaryExpr</a>>...</td></tr> 1434 1.1 joerg <tr><td colspan="4" class="doc" id="cxxBindTemporaryExpr0"><pre>Matches nodes where temporaries are created. 1435 1.1 joerg 1436 1.1 joerg Example matches FunctionTakesString(GetStringByValue()) 1437 1.1 joerg (matcher = cxxBindTemporaryExpr()) 1438 1.1 joerg FunctionTakesString(GetStringByValue()); 1439 1.1 joerg FunctionTakesStringByPointer(GetStringPointer()); 1440 1.1 joerg </pre></td></tr> 1441 1.1 joerg 1442 1.1 joerg 1443 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxBoolLiteral0')"><a name="cxxBoolLiteral0Anchor">cxxBoolLiteral</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>>...</td></tr> 1444 1.1 joerg <tr><td colspan="4" class="doc" id="cxxBoolLiteral0"><pre>Matches bool literals. 1445 1.1 joerg 1446 1.1 joerg Example matches true 1447 1.1 joerg true 1448 1.1 joerg </pre></td></tr> 1449 1.1 joerg 1450 1.1 joerg 1451 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxCatchStmt0')"><a name="cxxCatchStmt0Anchor">cxxCatchStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCatchStmt.html">CXXCatchStmt</a>>...</td></tr> 1452 1.1 joerg <tr><td colspan="4" class="doc" id="cxxCatchStmt0"><pre>Matches catch statements. 1453 1.1 joerg 1454 1.1 joerg try {} catch(int i) {} 1455 1.1 joerg cxxCatchStmt() 1456 1.1 joerg matches 'catch(int i)' 1457 1.1 joerg </pre></td></tr> 1458 1.1 joerg 1459 1.1 joerg 1460 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxConstCastExpr0')"><a name="cxxConstCastExpr0Anchor">cxxConstCastExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstCastExpr.html">CXXConstCastExpr</a>>...</td></tr> 1461 1.1 joerg <tr><td colspan="4" class="doc" id="cxxConstCastExpr0"><pre>Matches a const_cast expression. 1462 1.1 joerg 1463 1.1 joerg Example: Matches const_cast<int*>(&r) in 1464 1.1 joerg int n = 42; 1465 1.1 joerg const int &r(n); 1466 1.1 joerg int* p = const_cast<int*>(&r); 1467 1.1 joerg </pre></td></tr> 1468 1.1 joerg 1469 1.1 joerg 1470 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxConstructExpr0')"><a name="cxxConstructExpr0Anchor">cxxConstructExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>...</td></tr> 1471 1.1 joerg <tr><td colspan="4" class="doc" id="cxxConstructExpr0"><pre>Matches constructor call expressions (including implicit ones). 1472 1.1 joerg 1473 1.1 joerg Example matches string(ptr, n) and ptr within arguments of f 1474 1.1 joerg (matcher = cxxConstructExpr()) 1475 1.1 joerg void f(const string &a, const string &b); 1476 1.1 joerg char *ptr; 1477 1.1 joerg int n; 1478 1.1 joerg f(string(ptr, n), ptr); 1479 1.1 joerg </pre></td></tr> 1480 1.1 joerg 1481 1.1 joerg 1482 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxDefaultArgExpr0')"><a name="cxxDefaultArgExpr0Anchor">cxxDefaultArgExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDefaultArgExpr.html">CXXDefaultArgExpr</a>>...</td></tr> 1483 1.1 joerg <tr><td colspan="4" class="doc" id="cxxDefaultArgExpr0"><pre>Matches the value of a default argument at the call site. 1484 1.1 joerg 1485 1.1 joerg Example matches the CXXDefaultArgExpr placeholder inserted for the 1486 1.1 joerg default value of the second parameter in the call expression f(42) 1487 1.1 joerg (matcher = cxxDefaultArgExpr()) 1488 1.1 joerg void f(int x, int y = 0); 1489 1.1 joerg f(42); 1490 1.1 joerg </pre></td></tr> 1491 1.1 joerg 1492 1.1 joerg 1493 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxDeleteExpr0')"><a name="cxxDeleteExpr0Anchor">cxxDeleteExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDeleteExpr.html">CXXDeleteExpr</a>>...</td></tr> 1494 1.1 joerg <tr><td colspan="4" class="doc" id="cxxDeleteExpr0"><pre>Matches delete expressions. 1495 1.1 joerg 1496 1.1 joerg Given 1497 1.1 joerg delete X; 1498 1.1 joerg cxxDeleteExpr() 1499 1.1 joerg matches 'delete X'. 1500 1.1 joerg </pre></td></tr> 1501 1.1 joerg 1502 1.1 joerg 1503 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxDependentScopeMemberExpr0')"><a name="cxxDependentScopeMemberExpr0Anchor">cxxDependentScopeMemberExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDependentScopeMemberExpr.html">CXXDependentScopeMemberExpr</a>>...</td></tr> 1504 1.1 joerg <tr><td colspan="4" class="doc" id="cxxDependentScopeMemberExpr0"><pre>Matches member expressions where the actual member referenced could not be 1505 1.1 joerg resolved because the base expression or the member name was dependent. 1506 1.1 joerg 1507 1.1 joerg Given 1508 1.1 joerg template <class T> void f() { T t; t.g(); } 1509 1.1 joerg cxxDependentScopeMemberExpr() 1510 1.1 joerg matches t.g 1511 1.1 joerg </pre></td></tr> 1512 1.1 joerg 1513 1.1 joerg 1514 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxDynamicCastExpr0')"><a name="cxxDynamicCastExpr0Anchor">cxxDynamicCastExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDynamicCastExpr.html">CXXDynamicCastExpr</a>>...</td></tr> 1515 1.1 joerg <tr><td colspan="4" class="doc" id="cxxDynamicCastExpr0"><pre>Matches a dynamic_cast expression. 1516 1.1 joerg 1517 1.1 joerg Example: 1518 1.1 joerg cxxDynamicCastExpr() 1519 1.1 joerg matches 1520 1.1 joerg dynamic_cast<D*>(&b); 1521 1.1 joerg in 1522 1.1 joerg struct B { virtual ~B() {} }; struct D : B {}; 1523 1.1 joerg B b; 1524 1.1 joerg D* p = dynamic_cast<D*>(&b); 1525 1.1 joerg </pre></td></tr> 1526 1.1 joerg 1527 1.1 joerg 1528 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxForRangeStmt0')"><a name="cxxForRangeStmt0Anchor">cxxForRangeStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXForRangeStmt.html">CXXForRangeStmt</a>>...</td></tr> 1529 1.1 joerg <tr><td colspan="4" class="doc" id="cxxForRangeStmt0"><pre>Matches range-based for statements. 1530 1.1 joerg 1531 1.1 joerg cxxForRangeStmt() matches 'for (auto a : i)' 1532 1.1 joerg int i[] = {1, 2, 3}; for (auto a : i); 1533 1.1 joerg for(int j = 0; j < 5; ++j); 1534 1.1 joerg </pre></td></tr> 1535 1.1 joerg 1536 1.1 joerg 1537 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxFunctionalCastExpr0')"><a name="cxxFunctionalCastExpr0Anchor">cxxFunctionalCastExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>>...</td></tr> 1538 1.1 joerg <tr><td colspan="4" class="doc" id="cxxFunctionalCastExpr0"><pre>Matches functional cast expressions 1539 1.1 joerg 1540 1.1 joerg Example: Matches Foo(bar); 1541 1.1 joerg Foo f = bar; 1542 1.1 joerg Foo g = (Foo) bar; 1543 1.1 joerg Foo h = Foo(bar); 1544 1.1 joerg </pre></td></tr> 1545 1.1 joerg 1546 1.1 joerg 1547 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxMemberCallExpr0')"><a name="cxxMemberCallExpr0Anchor">cxxMemberCallExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMemberCallExpr.html">CXXMemberCallExpr</a>>...</td></tr> 1548 1.1 joerg <tr><td colspan="4" class="doc" id="cxxMemberCallExpr0"><pre>Matches member call expressions. 1549 1.1 joerg 1550 1.1 joerg Example matches x.y() 1551 1.1 joerg X x; 1552 1.1 joerg x.y(); 1553 1.1 joerg </pre></td></tr> 1554 1.1 joerg 1555 1.1 joerg 1556 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxNewExpr0')"><a name="cxxNewExpr0Anchor">cxxNewExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>...</td></tr> 1557 1.1 joerg <tr><td colspan="4" class="doc" id="cxxNewExpr0"><pre>Matches new expressions. 1558 1.1 joerg 1559 1.1 joerg Given 1560 1.1 joerg new X; 1561 1.1 joerg cxxNewExpr() 1562 1.1 joerg matches 'new X'. 1563 1.1 joerg </pre></td></tr> 1564 1.1 joerg 1565 1.1 joerg 1566 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxNoexceptExpr0')"><a name="cxxNoexceptExpr0Anchor">cxxNoexceptExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNoexceptExpr.html">CXXNoexceptExpr</a>>...</td></tr> 1567 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="cxxNoexceptExpr0"><pre>Matches noexcept expressions. 1568 1.1.1.2 joerg 1569 1.1.1.2 joerg Given 1570 1.1.1.2 joerg bool a() noexcept; 1571 1.1.1.2 joerg bool b() noexcept(true); 1572 1.1.1.2 joerg bool c() noexcept(false); 1573 1.1.1.2 joerg bool d() noexcept(noexcept(a())); 1574 1.1.1.2 joerg bool e = noexcept(b()) || noexcept(c()); 1575 1.1.1.2 joerg cxxNoexceptExpr() 1576 1.1.1.2 joerg matches `noexcept(a())`, `noexcept(b())` and `noexcept(c())`. 1577 1.1.1.2 joerg doesn't match the noexcept specifier in the declarations a, b, c or d. 1578 1.1.1.2 joerg </pre></td></tr> 1579 1.1.1.2 joerg 1580 1.1.1.2 joerg 1581 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxNullPtrLiteralExpr0')"><a name="cxxNullPtrLiteralExpr0Anchor">cxxNullPtrLiteralExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNullPtrLiteralExpr.html">CXXNullPtrLiteralExpr</a>>...</td></tr> 1582 1.1 joerg <tr><td colspan="4" class="doc" id="cxxNullPtrLiteralExpr0"><pre>Matches nullptr literal. 1583 1.1 joerg </pre></td></tr> 1584 1.1 joerg 1585 1.1 joerg 1586 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxOperatorCallExpr0')"><a name="cxxOperatorCallExpr0Anchor">cxxOperatorCallExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>>...</td></tr> 1587 1.1 joerg <tr><td colspan="4" class="doc" id="cxxOperatorCallExpr0"><pre>Matches overloaded operator calls. 1588 1.1 joerg 1589 1.1 joerg Note that if an operator isn't overloaded, it won't match. Instead, use 1590 1.1 joerg binaryOperator matcher. 1591 1.1 joerg Currently it does not match operators such as new delete. 1592 1.1 joerg FIXME: figure out why these do not match? 1593 1.1 joerg 1594 1.1 joerg Example matches both operator<<((o << b), c) and operator<<(o, b) 1595 1.1 joerg (matcher = cxxOperatorCallExpr()) 1596 1.1 joerg ostream &operator<< (ostream &out, int i) { }; 1597 1.1 joerg ostream &o; int b = 1, c = 1; 1598 1.1 joerg o << b << c; 1599 1.1.1.2 joerg See also the binaryOperation() matcher for more-general matching of binary 1600 1.1.1.2 joerg uses of this AST node. 1601 1.1 joerg </pre></td></tr> 1602 1.1 joerg 1603 1.1 joerg 1604 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxReinterpretCastExpr0')"><a name="cxxReinterpretCastExpr0Anchor">cxxReinterpretCastExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXReinterpretCastExpr.html">CXXReinterpretCastExpr</a>>...</td></tr> 1605 1.1 joerg <tr><td colspan="4" class="doc" id="cxxReinterpretCastExpr0"><pre>Matches a reinterpret_cast expression. 1606 1.1 joerg 1607 1.1 joerg Either the source expression or the destination type can be matched 1608 1.1 joerg using has(), but hasDestinationType() is more specific and can be 1609 1.1 joerg more readable. 1610 1.1 joerg 1611 1.1 joerg Example matches reinterpret_cast<char*>(&p) in 1612 1.1 joerg void* p = reinterpret_cast<char*>(&p); 1613 1.1 joerg </pre></td></tr> 1614 1.1 joerg 1615 1.1 joerg 1616 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxRewrittenBinaryOperator0')"><a name="cxxRewrittenBinaryOperator0Anchor">cxxRewrittenBinaryOperator</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRewrittenBinaryOperator.html">CXXRewrittenBinaryOperator</a>>...</td></tr> 1617 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="cxxRewrittenBinaryOperator0"><pre>Matches rewritten binary operators 1618 1.1.1.2 joerg 1619 1.1.1.2 joerg Example matches use of "<": 1620 1.1.1.2 joerg #include <compare> 1621 1.1.1.2 joerg struct HasSpaceshipMem { 1622 1.1.1.2 joerg int a; 1623 1.1.1.2 joerg constexpr auto operator<=>(const HasSpaceshipMem&) const = default; 1624 1.1.1.2 joerg }; 1625 1.1.1.2 joerg void compare() { 1626 1.1.1.2 joerg HasSpaceshipMem hs1, hs2; 1627 1.1.1.2 joerg if (hs1 < hs2) 1628 1.1.1.2 joerg return; 1629 1.1.1.2 joerg } 1630 1.1.1.2 joerg See also the binaryOperation() matcher for more-general matching 1631 1.1.1.2 joerg of this AST node. 1632 1.1.1.2 joerg </pre></td></tr> 1633 1.1.1.2 joerg 1634 1.1.1.2 joerg 1635 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxStaticCastExpr0')"><a name="cxxStaticCastExpr0Anchor">cxxStaticCastExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXStaticCastExpr.html">CXXStaticCastExpr</a>>...</td></tr> 1636 1.1 joerg <tr><td colspan="4" class="doc" id="cxxStaticCastExpr0"><pre>Matches a C++ static_cast expression. 1637 1.1 joerg 1638 1.1 joerg See also: hasDestinationType 1639 1.1 joerg See also: reinterpretCast 1640 1.1 joerg 1641 1.1 joerg Example: 1642 1.1 joerg cxxStaticCastExpr() 1643 1.1 joerg matches 1644 1.1 joerg static_cast<long>(8) 1645 1.1 joerg in 1646 1.1 joerg long eight(static_cast<long>(8)); 1647 1.1 joerg </pre></td></tr> 1648 1.1 joerg 1649 1.1 joerg 1650 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxStdInitializerListExpr0')"><a name="cxxStdInitializerListExpr0Anchor">cxxStdInitializerListExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXStdInitializerListExpr.html">CXXStdInitializerListExpr</a>>...</td></tr> 1651 1.1 joerg <tr><td colspan="4" class="doc" id="cxxStdInitializerListExpr0"><pre>Matches C++ initializer list expressions. 1652 1.1 joerg 1653 1.1 joerg Given 1654 1.1 joerg std::vector<int> a({ 1, 2, 3 }); 1655 1.1 joerg std::vector<int> b = { 4, 5 }; 1656 1.1 joerg int c[] = { 6, 7 }; 1657 1.1 joerg std::pair<int, int> d = { 8, 9 }; 1658 1.1 joerg cxxStdInitializerListExpr() 1659 1.1 joerg matches "{ 1, 2, 3 }" and "{ 4, 5 }" 1660 1.1 joerg </pre></td></tr> 1661 1.1 joerg 1662 1.1 joerg 1663 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxTemporaryObjectExpr0')"><a name="cxxTemporaryObjectExpr0Anchor">cxxTemporaryObjectExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>>...</td></tr> 1664 1.1 joerg <tr><td colspan="4" class="doc" id="cxxTemporaryObjectExpr0"><pre>Matches functional cast expressions having N != 1 arguments 1665 1.1 joerg 1666 1.1 joerg Example: Matches Foo(bar, bar) 1667 1.1 joerg Foo h = Foo(bar, bar); 1668 1.1 joerg </pre></td></tr> 1669 1.1 joerg 1670 1.1 joerg 1671 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxThisExpr0')"><a name="cxxThisExpr0Anchor">cxxThisExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXThisExpr.html">CXXThisExpr</a>>...</td></tr> 1672 1.1 joerg <tr><td colspan="4" class="doc" id="cxxThisExpr0"><pre>Matches implicit and explicit this expressions. 1673 1.1 joerg 1674 1.1 joerg Example matches the implicit this expression in "return i". 1675 1.1 joerg (matcher = cxxThisExpr()) 1676 1.1 joerg struct foo { 1677 1.1 joerg int i; 1678 1.1 joerg int f() { return i; } 1679 1.1 joerg }; 1680 1.1 joerg </pre></td></tr> 1681 1.1 joerg 1682 1.1 joerg 1683 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxThrowExpr0')"><a name="cxxThrowExpr0Anchor">cxxThrowExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXThrowExpr.html">CXXThrowExpr</a>>...</td></tr> 1684 1.1 joerg <tr><td colspan="4" class="doc" id="cxxThrowExpr0"><pre>Matches throw expressions. 1685 1.1 joerg 1686 1.1 joerg try { throw 5; } catch(int i) {} 1687 1.1 joerg cxxThrowExpr() 1688 1.1 joerg matches 'throw 5' 1689 1.1 joerg </pre></td></tr> 1690 1.1 joerg 1691 1.1 joerg 1692 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxTryStmt0')"><a name="cxxTryStmt0Anchor">cxxTryStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTryStmt.html">CXXTryStmt</a>>...</td></tr> 1693 1.1 joerg <tr><td colspan="4" class="doc" id="cxxTryStmt0"><pre>Matches try statements. 1694 1.1 joerg 1695 1.1 joerg try {} catch(int i) {} 1696 1.1 joerg cxxTryStmt() 1697 1.1 joerg matches 'try {}' 1698 1.1 joerg </pre></td></tr> 1699 1.1 joerg 1700 1.1 joerg 1701 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('cxxUnresolvedConstructExpr0')"><a name="cxxUnresolvedConstructExpr0Anchor">cxxUnresolvedConstructExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>...</td></tr> 1702 1.1 joerg <tr><td colspan="4" class="doc" id="cxxUnresolvedConstructExpr0"><pre>Matches unresolved constructor call expressions. 1703 1.1 joerg 1704 1.1 joerg Example matches T(t) in return statement of f 1705 1.1 joerg (matcher = cxxUnresolvedConstructExpr()) 1706 1.1 joerg template <typename T> 1707 1.1 joerg void f(const T& t) { return T(t); } 1708 1.1 joerg </pre></td></tr> 1709 1.1 joerg 1710 1.1 joerg 1711 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('declRefExpr0')"><a name="declRefExpr0Anchor">declRefExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>...</td></tr> 1712 1.1 joerg <tr><td colspan="4" class="doc" id="declRefExpr0"><pre>Matches expressions that refer to declarations. 1713 1.1 joerg 1714 1.1 joerg Example matches x in if (x) 1715 1.1 joerg bool x; 1716 1.1 joerg if (x) {} 1717 1.1 joerg </pre></td></tr> 1718 1.1 joerg 1719 1.1 joerg 1720 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('declStmt0')"><a name="declStmt0Anchor">declStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclStmt.html">DeclStmt</a>>...</td></tr> 1721 1.1 joerg <tr><td colspan="4" class="doc" id="declStmt0"><pre>Matches declaration statements. 1722 1.1 joerg 1723 1.1 joerg Given 1724 1.1 joerg int a; 1725 1.1 joerg declStmt() 1726 1.1 joerg matches 'int a'. 1727 1.1 joerg </pre></td></tr> 1728 1.1 joerg 1729 1.1 joerg 1730 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('defaultStmt0')"><a name="defaultStmt0Anchor">defaultStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DefaultStmt.html">DefaultStmt</a>>...</td></tr> 1731 1.1 joerg <tr><td colspan="4" class="doc" id="defaultStmt0"><pre>Matches default statements inside switch statements. 1732 1.1 joerg 1733 1.1 joerg Given 1734 1.1 joerg switch(a) { case 42: break; default: break; } 1735 1.1 joerg defaultStmt() 1736 1.1 joerg matches 'default:'. 1737 1.1 joerg </pre></td></tr> 1738 1.1 joerg 1739 1.1 joerg 1740 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('dependentCoawaitExpr0')"><a name="dependentCoawaitExpr0Anchor">dependentCoawaitExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DependentCoawaitExpr.html">DependentCoawaitExpr</a>>...</td></tr> 1741 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="dependentCoawaitExpr0"><pre>Matches co_await expressions where the type of the promise is dependent 1742 1.1.1.2 joerg </pre></td></tr> 1743 1.1.1.2 joerg 1744 1.1.1.2 joerg 1745 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('designatedInitExpr0')"><a name="designatedInitExpr0Anchor">designatedInitExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DesignatedInitExpr.html">DesignatedInitExpr</a>>...</td></tr> 1746 1.1 joerg <tr><td colspan="4" class="doc" id="designatedInitExpr0"><pre>Matches C99 designated initializer expressions [C99 6.7.8]. 1747 1.1 joerg 1748 1.1 joerg Example: Matches { [2].y = 1.0, [0].x = 1.0 } 1749 1.1 joerg point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 }; 1750 1.1 joerg </pre></td></tr> 1751 1.1 joerg 1752 1.1 joerg 1753 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('doStmt0')"><a name="doStmt0Anchor">doStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DoStmt.html">DoStmt</a>>...</td></tr> 1754 1.1 joerg <tr><td colspan="4" class="doc" id="doStmt0"><pre>Matches do statements. 1755 1.1 joerg 1756 1.1 joerg Given 1757 1.1 joerg do {} while (true); 1758 1.1 joerg doStmt() 1759 1.1 joerg matches 'do {} while(true)' 1760 1.1 joerg </pre></td></tr> 1761 1.1 joerg 1762 1.1 joerg 1763 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('explicitCastExpr0')"><a name="explicitCastExpr0Anchor">explicitCastExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>>...</td></tr> 1764 1.1 joerg <tr><td colspan="4" class="doc" id="explicitCastExpr0"><pre>Matches explicit cast expressions. 1765 1.1 joerg 1766 1.1 joerg Matches any cast expression written in user code, whether it be a 1767 1.1 joerg C-style cast, a functional-style cast, or a keyword cast. 1768 1.1 joerg 1769 1.1 joerg Does not match implicit conversions. 1770 1.1 joerg 1771 1.1 joerg Note: the name "explicitCast" is chosen to match Clang's terminology, as 1772 1.1 joerg Clang uses the term "cast" to apply to implicit conversions as well as to 1773 1.1 joerg actual cast expressions. 1774 1.1 joerg 1775 1.1 joerg See also: hasDestinationType. 1776 1.1 joerg 1777 1.1 joerg Example: matches all five of the casts in 1778 1.1 joerg int((int)(reinterpret_cast<int>(static_cast<int>(const_cast<int>(42))))) 1779 1.1 joerg but does not match the implicit conversion in 1780 1.1 joerg long ell = 42; 1781 1.1 joerg </pre></td></tr> 1782 1.1 joerg 1783 1.1 joerg 1784 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('expr0')"><a name="expr0Anchor">expr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>>...</td></tr> 1785 1.1 joerg <tr><td colspan="4" class="doc" id="expr0"><pre>Matches expressions. 1786 1.1 joerg 1787 1.1 joerg Example matches x() 1788 1.1 joerg void f() { x(); } 1789 1.1 joerg </pre></td></tr> 1790 1.1 joerg 1791 1.1 joerg 1792 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('exprWithCleanups0')"><a name="exprWithCleanups0Anchor">exprWithCleanups</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExprWithCleanups.html">ExprWithCleanups</a>>...</td></tr> 1793 1.1 joerg <tr><td colspan="4" class="doc" id="exprWithCleanups0"><pre>Matches expressions that introduce cleanups to be run at the end 1794 1.1 joerg of the sub-expression's evaluation. 1795 1.1 joerg 1796 1.1 joerg Example matches std::string() 1797 1.1 joerg const std::string str = std::string(); 1798 1.1 joerg </pre></td></tr> 1799 1.1 joerg 1800 1.1 joerg 1801 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('fixedPointLiteral0')"><a name="fixedPointLiteral0Anchor">fixedPointLiteral</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FixedPointLiteral.html">FixedPointLiteral</a>>...</td></tr> 1802 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="fixedPointLiteral0"><pre>Matches fixed point literals 1803 1.1.1.2 joerg </pre></td></tr> 1804 1.1.1.2 joerg 1805 1.1.1.2 joerg 1806 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('floatLiteral0')"><a name="floatLiteral0Anchor">floatLiteral</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>>...</td></tr> 1807 1.1 joerg <tr><td colspan="4" class="doc" id="floatLiteral0"><pre>Matches float literals of all sizes / encodings, e.g. 1808 1.1 joerg 1.0, 1.0f, 1.0L and 1e10. 1809 1.1 joerg 1810 1.1 joerg Does not match implicit conversions such as 1811 1.1 joerg float a = 10; 1812 1.1 joerg </pre></td></tr> 1813 1.1 joerg 1814 1.1 joerg 1815 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('forStmt0')"><a name="forStmt0Anchor">forStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ForStmt.html">ForStmt</a>>...</td></tr> 1816 1.1 joerg <tr><td colspan="4" class="doc" id="forStmt0"><pre>Matches for statements. 1817 1.1 joerg 1818 1.1 joerg Example matches 'for (;;) {}' 1819 1.1 joerg for (;;) {} 1820 1.1 joerg int i[] = {1, 2, 3}; for (auto a : i); 1821 1.1 joerg </pre></td></tr> 1822 1.1 joerg 1823 1.1 joerg 1824 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('genericSelectionExpr0')"><a name="genericSelectionExpr0Anchor">genericSelectionExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1GenericSelectionExpr.html">GenericSelectionExpr</a>>...</td></tr> 1825 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="genericSelectionExpr0"><pre>Matches C11 _Generic expression. 1826 1.1.1.2 joerg </pre></td></tr> 1827 1.1.1.2 joerg 1828 1.1.1.2 joerg 1829 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('gnuNullExpr0')"><a name="gnuNullExpr0Anchor">gnuNullExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1GNUNullExpr.html">GNUNullExpr</a>>...</td></tr> 1830 1.1 joerg <tr><td colspan="4" class="doc" id="gnuNullExpr0"><pre>Matches GNU __null expression. 1831 1.1 joerg </pre></td></tr> 1832 1.1 joerg 1833 1.1 joerg 1834 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('gotoStmt0')"><a name="gotoStmt0Anchor">gotoStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1GotoStmt.html">GotoStmt</a>>...</td></tr> 1835 1.1 joerg <tr><td colspan="4" class="doc" id="gotoStmt0"><pre>Matches goto statements. 1836 1.1 joerg 1837 1.1 joerg Given 1838 1.1 joerg goto FOO; 1839 1.1 joerg FOO: bar(); 1840 1.1 joerg gotoStmt() 1841 1.1 joerg matches 'goto FOO' 1842 1.1 joerg </pre></td></tr> 1843 1.1 joerg 1844 1.1 joerg 1845 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('ifStmt0')"><a name="ifStmt0Anchor">ifStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt</a>>...</td></tr> 1846 1.1 joerg <tr><td colspan="4" class="doc" id="ifStmt0"><pre>Matches if statements. 1847 1.1 joerg 1848 1.1 joerg Example matches 'if (x) {}' 1849 1.1 joerg if (x) {} 1850 1.1 joerg </pre></td></tr> 1851 1.1 joerg 1852 1.1 joerg 1853 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('imaginaryLiteral0')"><a name="imaginaryLiteral0Anchor">imaginaryLiteral</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ImaginaryLiteral.html">ImaginaryLiteral</a>>...</td></tr> 1854 1.1 joerg <tr><td colspan="4" class="doc" id="imaginaryLiteral0"><pre>Matches imaginary literals, which are based on integer and floating 1855 1.1 joerg point literals e.g.: 1i, 1.0i 1856 1.1 joerg </pre></td></tr> 1857 1.1 joerg 1858 1.1 joerg 1859 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('implicitCastExpr0')"><a name="implicitCastExpr0Anchor">implicitCastExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ImplicitCastExpr.html">ImplicitCastExpr</a>>...</td></tr> 1860 1.1 joerg <tr><td colspan="4" class="doc" id="implicitCastExpr0"><pre>Matches the implicit cast nodes of Clang's AST. 1861 1.1 joerg 1862 1.1 joerg This matches many different places, including function call return value 1863 1.1 joerg eliding, as well as any type conversions. 1864 1.1 joerg </pre></td></tr> 1865 1.1 joerg 1866 1.1 joerg 1867 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('implicitValueInitExpr0')"><a name="implicitValueInitExpr0Anchor">implicitValueInitExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ImplicitValueInitExpr.html">ImplicitValueInitExpr</a>>...</td></tr> 1868 1.1 joerg <tr><td colspan="4" class="doc" id="implicitValueInitExpr0"><pre>Matches implicit initializers of init list expressions. 1869 1.1 joerg 1870 1.1 joerg Given 1871 1.1 joerg point ptarray[10] = { [2].y = 1.0, [2].x = 2.0, [0].x = 1.0 }; 1872 1.1 joerg implicitValueInitExpr() 1873 1.1 joerg matches "[0].y" (implicitly) 1874 1.1 joerg </pre></td></tr> 1875 1.1 joerg 1876 1.1 joerg 1877 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('initListExpr0')"><a name="initListExpr0Anchor">initListExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InitListExpr.html">InitListExpr</a>>...</td></tr> 1878 1.1 joerg <tr><td colspan="4" class="doc" id="initListExpr0"><pre>Matches init list expressions. 1879 1.1 joerg 1880 1.1 joerg Given 1881 1.1 joerg int a[] = { 1, 2 }; 1882 1.1 joerg struct B { int x, y; }; 1883 1.1 joerg B b = { 5, 6 }; 1884 1.1 joerg initListExpr() 1885 1.1 joerg matches "{ 1, 2 }" and "{ 5, 6 }" 1886 1.1 joerg </pre></td></tr> 1887 1.1 joerg 1888 1.1 joerg 1889 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('integerLiteral0')"><a name="integerLiteral0Anchor">integerLiteral</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>>...</td></tr> 1890 1.1 joerg <tr><td colspan="4" class="doc" id="integerLiteral0"><pre>Matches integer literals of all sizes / encodings, e.g. 1891 1.1 joerg 1, 1L, 0x1 and 1U. 1892 1.1 joerg 1893 1.1 joerg Does not match character-encoded integers such as L'a'. 1894 1.1 joerg </pre></td></tr> 1895 1.1 joerg 1896 1.1 joerg 1897 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('labelStmt0')"><a name="labelStmt0Anchor">labelStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>...</td></tr> 1898 1.1 joerg <tr><td colspan="4" class="doc" id="labelStmt0"><pre>Matches label statements. 1899 1.1 joerg 1900 1.1 joerg Given 1901 1.1 joerg goto FOO; 1902 1.1 joerg FOO: bar(); 1903 1.1 joerg labelStmt() 1904 1.1 joerg matches 'FOO:' 1905 1.1 joerg </pre></td></tr> 1906 1.1 joerg 1907 1.1 joerg 1908 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('lambdaExpr0')"><a name="lambdaExpr0Anchor">lambdaExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LambdaExpr.html">LambdaExpr</a>>...</td></tr> 1909 1.1 joerg <tr><td colspan="4" class="doc" id="lambdaExpr0"><pre>Matches lambda expressions. 1910 1.1 joerg 1911 1.1 joerg Example matches [&](){return 5;} 1912 1.1 joerg [&](){return 5;} 1913 1.1 joerg </pre></td></tr> 1914 1.1 joerg 1915 1.1 joerg 1916 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('materializeTemporaryExpr0')"><a name="materializeTemporaryExpr0Anchor">materializeTemporaryExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MaterializeTemporaryExpr.html">MaterializeTemporaryExpr</a>>...</td></tr> 1917 1.1 joerg <tr><td colspan="4" class="doc" id="materializeTemporaryExpr0"><pre>Matches nodes where temporaries are materialized. 1918 1.1 joerg 1919 1.1 joerg Example: Given 1920 1.1 joerg struct T {void func();}; 1921 1.1 joerg T f(); 1922 1.1 joerg void g(T); 1923 1.1 joerg materializeTemporaryExpr() matches 'f()' in these statements 1924 1.1 joerg T u(f()); 1925 1.1 joerg g(f()); 1926 1.1 joerg f().func(); 1927 1.1 joerg but does not match 1928 1.1 joerg f(); 1929 1.1 joerg </pre></td></tr> 1930 1.1 joerg 1931 1.1 joerg 1932 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('memberExpr0')"><a name="memberExpr0Anchor">memberExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>...</td></tr> 1933 1.1 joerg <tr><td colspan="4" class="doc" id="memberExpr0"><pre>Matches member expressions. 1934 1.1 joerg 1935 1.1 joerg Given 1936 1.1 joerg class Y { 1937 1.1 joerg void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; } 1938 1.1 joerg int a; static int b; 1939 1.1 joerg }; 1940 1.1 joerg memberExpr() 1941 1.1 joerg matches this->x, x, y.x, a, this->b 1942 1.1 joerg </pre></td></tr> 1943 1.1 joerg 1944 1.1 joerg 1945 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('nullStmt0')"><a name="nullStmt0Anchor">nullStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NullStmt.html">NullStmt</a>>...</td></tr> 1946 1.1 joerg <tr><td colspan="4" class="doc" id="nullStmt0"><pre>Matches null statements. 1947 1.1 joerg 1948 1.1 joerg foo();; 1949 1.1 joerg nullStmt() 1950 1.1 joerg matches the second ';' 1951 1.1 joerg </pre></td></tr> 1952 1.1 joerg 1953 1.1 joerg 1954 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('objcCatchStmt0')"><a name="objcCatchStmt0Anchor">objcCatchStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCAtCatchStmt.html">ObjCAtCatchStmt</a>>...</td></tr> 1955 1.1 joerg <tr><td colspan="4" class="doc" id="objcCatchStmt0"><pre>Matches Objective-C @catch statements. 1956 1.1 joerg 1957 1.1 joerg Example matches @catch 1958 1.1 joerg @try {} 1959 1.1 joerg @catch (...) {} 1960 1.1 joerg </pre></td></tr> 1961 1.1 joerg 1962 1.1 joerg 1963 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('objcFinallyStmt0')"><a name="objcFinallyStmt0Anchor">objcFinallyStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCAtFinallyStmt.html">ObjCAtFinallyStmt</a>>...</td></tr> 1964 1.1 joerg <tr><td colspan="4" class="doc" id="objcFinallyStmt0"><pre>Matches Objective-C @finally statements. 1965 1.1 joerg 1966 1.1 joerg Example matches @finally 1967 1.1 joerg @try {} 1968 1.1 joerg @finally {} 1969 1.1 joerg </pre></td></tr> 1970 1.1 joerg 1971 1.1 joerg 1972 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('objcIvarRefExpr0')"><a name="objcIvarRefExpr0Anchor">objcIvarRefExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCIvarRefExpr.html">ObjCIvarRefExpr</a>>...</td></tr> 1973 1.1 joerg <tr><td colspan="4" class="doc" id="objcIvarRefExpr0"><pre>Matches a reference to an ObjCIvar. 1974 1.1 joerg 1975 1.1 joerg Example: matches "a" in "init" method: 1976 1.1 joerg @implementation A { 1977 1.1 joerg NSString *a; 1978 1.1 joerg } 1979 1.1 joerg - (void) init { 1980 1.1 joerg a = @"hello"; 1981 1.1 joerg } 1982 1.1 joerg </pre></td></tr> 1983 1.1 joerg 1984 1.1 joerg 1985 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('objcMessageExpr0')"><a name="objcMessageExpr0Anchor">objcMessageExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>>...</td></tr> 1986 1.1 joerg <tr><td colspan="4" class="doc" id="objcMessageExpr0"><pre>Matches ObjectiveC Message invocation expressions. 1987 1.1 joerg 1988 1.1 joerg The innermost message send invokes the "alloc" class method on the 1989 1.1 joerg NSString class, while the outermost message send invokes the 1990 1.1 joerg "initWithString" instance method on the object returned from 1991 1.1 joerg NSString's "alloc". This matcher should match both message sends. 1992 1.1 joerg [[NSString alloc] initWithString:@"Hello"] 1993 1.1 joerg </pre></td></tr> 1994 1.1 joerg 1995 1.1 joerg 1996 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('objcThrowStmt0')"><a name="objcThrowStmt0Anchor">objcThrowStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCAtThrowStmt.html">ObjCAtThrowStmt</a>>...</td></tr> 1997 1.1 joerg <tr><td colspan="4" class="doc" id="objcThrowStmt0"><pre>Matches Objective-C statements. 1998 1.1 joerg 1999 1.1 joerg Example matches @throw obj; 2000 1.1 joerg </pre></td></tr> 2001 1.1 joerg 2002 1.1 joerg 2003 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('objcTryStmt0')"><a name="objcTryStmt0Anchor">objcTryStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCAtTryStmt.html">ObjCAtTryStmt</a>>...</td></tr> 2004 1.1 joerg <tr><td colspan="4" class="doc" id="objcTryStmt0"><pre>Matches Objective-C @try statements. 2005 1.1 joerg 2006 1.1 joerg Example matches @try 2007 1.1 joerg @try {} 2008 1.1 joerg @catch (...) {} 2009 1.1 joerg </pre></td></tr> 2010 1.1 joerg 2011 1.1 joerg 2012 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('ompExecutableDirective0')"><a name="ompExecutableDirective0Anchor">ompExecutableDirective</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPExecutableDirective.html">OMPExecutableDirective</a>>...</td></tr> 2013 1.1 joerg <tr><td colspan="4" class="doc" id="ompExecutableDirective0"><pre>Matches any ``#pragma omp`` executable directive. 2014 1.1 joerg 2015 1.1 joerg Given 2016 1.1 joerg 2017 1.1 joerg #pragma omp parallel 2018 1.1 joerg #pragma omp parallel default(none) 2019 1.1 joerg #pragma omp taskyield 2020 1.1 joerg 2021 1.1 joerg ``ompExecutableDirective()`` matches ``omp parallel``, 2022 1.1 joerg ``omp parallel default(none)`` and ``omp taskyield``. 2023 1.1 joerg </pre></td></tr> 2024 1.1 joerg 2025 1.1 joerg 2026 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('opaqueValueExpr0')"><a name="opaqueValueExpr0Anchor">opaqueValueExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1OpaqueValueExpr.html">OpaqueValueExpr</a>>...</td></tr> 2027 1.1 joerg <tr><td colspan="4" class="doc" id="opaqueValueExpr0"><pre>Matches opaque value expressions. They are used as helpers 2028 1.1 joerg to reference another expressions and can be met 2029 1.1 joerg in BinaryConditionalOperators, for example. 2030 1.1 joerg 2031 1.1 joerg Example matches 'a' 2032 1.1 joerg (a ?: c) + 42; 2033 1.1 joerg </pre></td></tr> 2034 1.1 joerg 2035 1.1 joerg 2036 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('parenExpr0')"><a name="parenExpr0Anchor">parenExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenExpr.html">ParenExpr</a>>...</td></tr> 2037 1.1 joerg <tr><td colspan="4" class="doc" id="parenExpr0"><pre>Matches parentheses used in expressions. 2038 1.1 joerg 2039 1.1 joerg Example matches (foo() + 1) 2040 1.1 joerg int foo() { return 1; } 2041 1.1 joerg int a = (foo() + 1); 2042 1.1 joerg </pre></td></tr> 2043 1.1 joerg 2044 1.1 joerg 2045 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('parenListExpr0')"><a name="parenListExpr0Anchor">parenListExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenListExpr.html">ParenListExpr</a>>...</td></tr> 2046 1.1 joerg <tr><td colspan="4" class="doc" id="parenListExpr0"><pre>Matches paren list expressions. 2047 1.1 joerg ParenListExprs don't have a predefined type and are used for late parsing. 2048 1.1 joerg In the final AST, they can be met in template declarations. 2049 1.1 joerg 2050 1.1 joerg Given 2051 1.1 joerg template<typename T> class X { 2052 1.1 joerg void f() { 2053 1.1 joerg X x(*this); 2054 1.1 joerg int a = 0, b = 1; int i = (a, b); 2055 1.1 joerg } 2056 1.1 joerg }; 2057 1.1 joerg parenListExpr() matches "*this" but NOT matches (a, b) because (a, b) 2058 1.1 joerg has a predefined type and is a ParenExpr, not a ParenListExpr. 2059 1.1 joerg </pre></td></tr> 2060 1.1 joerg 2061 1.1 joerg 2062 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('predefinedExpr0')"><a name="predefinedExpr0Anchor">predefinedExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1PredefinedExpr.html">PredefinedExpr</a>>...</td></tr> 2063 1.1 joerg <tr><td colspan="4" class="doc" id="predefinedExpr0"><pre>Matches predefined identifier expressions [C99 6.4.2.2]. 2064 1.1 joerg 2065 1.1 joerg Example: Matches __func__ 2066 1.1 joerg printf("%s", __func__); 2067 1.1 joerg </pre></td></tr> 2068 1.1 joerg 2069 1.1 joerg 2070 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('returnStmt0')"><a name="returnStmt0Anchor">returnStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ReturnStmt.html">ReturnStmt</a>>...</td></tr> 2071 1.1 joerg <tr><td colspan="4" class="doc" id="returnStmt0"><pre>Matches return statements. 2072 1.1 joerg 2073 1.1 joerg Given 2074 1.1 joerg return 1; 2075 1.1 joerg returnStmt() 2076 1.1 joerg matches 'return 1' 2077 1.1 joerg </pre></td></tr> 2078 1.1 joerg 2079 1.1 joerg 2080 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('stmt0')"><a name="stmt0Anchor">stmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>...</td></tr> 2081 1.1 joerg <tr><td colspan="4" class="doc" id="stmt0"><pre>Matches statements. 2082 1.1 joerg 2083 1.1 joerg Given 2084 1.1 joerg { ++a; } 2085 1.1 joerg stmt() 2086 1.1 joerg matches both the compound statement '{ ++a; }' and '++a'. 2087 1.1 joerg </pre></td></tr> 2088 1.1 joerg 2089 1.1 joerg 2090 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('stmtExpr0')"><a name="stmtExpr0Anchor">stmtExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1StmtExpr.html">StmtExpr</a>>...</td></tr> 2091 1.1 joerg <tr><td colspan="4" class="doc" id="stmtExpr0"><pre>Matches statement expression (GNU extension). 2092 1.1 joerg 2093 1.1 joerg Example match: ({ int X = 4; X; }) 2094 1.1 joerg int C = ({ int X = 4; X; }); 2095 1.1 joerg </pre></td></tr> 2096 1.1 joerg 2097 1.1 joerg 2098 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('stringLiteral0')"><a name="stringLiteral0Anchor">stringLiteral</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1StringLiteral.html">StringLiteral</a>>...</td></tr> 2099 1.1 joerg <tr><td colspan="4" class="doc" id="stringLiteral0"><pre>Matches string literals (also matches wide string literals). 2100 1.1 joerg 2101 1.1 joerg Example matches "abcd", L"abcd" 2102 1.1 joerg char *s = "abcd"; 2103 1.1 joerg wchar_t *ws = L"abcd"; 2104 1.1 joerg </pre></td></tr> 2105 1.1 joerg 2106 1.1 joerg 2107 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('substNonTypeTemplateParmExpr0')"><a name="substNonTypeTemplateParmExpr0Anchor">substNonTypeTemplateParmExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1SubstNonTypeTemplateParmExpr.html">SubstNonTypeTemplateParmExpr</a>>...</td></tr> 2108 1.1 joerg <tr><td colspan="4" class="doc" id="substNonTypeTemplateParmExpr0"><pre>Matches substitutions of non-type template parameters. 2109 1.1 joerg 2110 1.1 joerg Given 2111 1.1 joerg template <int N> 2112 1.1 joerg struct A { static const int n = N; }; 2113 1.1 joerg struct B : public A<42> {}; 2114 1.1 joerg substNonTypeTemplateParmExpr() 2115 1.1 joerg matches "N" in the right-hand side of "static const int n = N;" 2116 1.1 joerg </pre></td></tr> 2117 1.1 joerg 2118 1.1 joerg 2119 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('switchCase0')"><a name="switchCase0Anchor">switchCase</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1SwitchCase.html">SwitchCase</a>>...</td></tr> 2120 1.1 joerg <tr><td colspan="4" class="doc" id="switchCase0"><pre>Matches case and default statements inside switch statements. 2121 1.1 joerg 2122 1.1 joerg Given 2123 1.1 joerg switch(a) { case 42: break; default: break; } 2124 1.1 joerg switchCase() 2125 1.1 joerg matches 'case 42:' and 'default:'. 2126 1.1 joerg </pre></td></tr> 2127 1.1 joerg 2128 1.1 joerg 2129 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('switchStmt0')"><a name="switchStmt0Anchor">switchStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1SwitchStmt.html">SwitchStmt</a>>...</td></tr> 2130 1.1 joerg <tr><td colspan="4" class="doc" id="switchStmt0"><pre>Matches switch statements. 2131 1.1 joerg 2132 1.1 joerg Given 2133 1.1 joerg switch(a) { case 42: break; default: break; } 2134 1.1 joerg switchStmt() 2135 1.1 joerg matches 'switch(a)'. 2136 1.1 joerg </pre></td></tr> 2137 1.1 joerg 2138 1.1 joerg 2139 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('unaryExprOrTypeTraitExpr0')"><a name="unaryExprOrTypeTraitExpr0Anchor">unaryExprOrTypeTraitExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html">UnaryExprOrTypeTraitExpr</a>>...</td></tr> 2140 1.1 joerg <tr><td colspan="4" class="doc" id="unaryExprOrTypeTraitExpr0"><pre>Matches sizeof (C99), alignof (C++11) and vec_step (OpenCL) 2141 1.1 joerg 2142 1.1 joerg Given 2143 1.1 joerg Foo x = bar; 2144 1.1 joerg int y = sizeof(x) + alignof(x); 2145 1.1 joerg unaryExprOrTypeTraitExpr() 2146 1.1 joerg matches sizeof(x) and alignof(x) 2147 1.1 joerg </pre></td></tr> 2148 1.1 joerg 2149 1.1 joerg 2150 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('unaryOperator0')"><a name="unaryOperator0Anchor">unaryOperator</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryOperator.html">UnaryOperator</a>>...</td></tr> 2151 1.1 joerg <tr><td colspan="4" class="doc" id="unaryOperator0"><pre>Matches unary operator expressions. 2152 1.1 joerg 2153 1.1 joerg Example matches !a 2154 1.1 joerg !a || b 2155 1.1 joerg </pre></td></tr> 2156 1.1 joerg 2157 1.1 joerg 2158 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('unresolvedLookupExpr0')"><a name="unresolvedLookupExpr0Anchor">unresolvedLookupExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedLookupExpr.html">UnresolvedLookupExpr</a>>...</td></tr> 2159 1.1 joerg <tr><td colspan="4" class="doc" id="unresolvedLookupExpr0"><pre>Matches reference to a name that can be looked up during parsing 2160 1.1 joerg but could not be resolved to a specific declaration. 2161 1.1 joerg 2162 1.1 joerg Given 2163 1.1 joerg template<typename T> 2164 1.1 joerg T foo() { T a; return a; } 2165 1.1 joerg template<typename T> 2166 1.1 joerg void bar() { 2167 1.1 joerg foo<T>(); 2168 1.1 joerg } 2169 1.1 joerg unresolvedLookupExpr() 2170 1.1 joerg matches foo<T>() </pre></td></tr> 2171 1.1 joerg 2172 1.1 joerg 2173 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('unresolvedMemberExpr0')"><a name="unresolvedMemberExpr0Anchor">unresolvedMemberExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedMemberExpr.html">UnresolvedMemberExpr</a>>...</td></tr> 2174 1.1 joerg <tr><td colspan="4" class="doc" id="unresolvedMemberExpr0"><pre>Matches unresolved member expressions. 2175 1.1 joerg 2176 1.1 joerg Given 2177 1.1 joerg struct X { 2178 1.1 joerg template <class T> void f(); 2179 1.1 joerg void g(); 2180 1.1 joerg }; 2181 1.1 joerg template <class T> void h() { X x; x.f<T>(); x.g(); } 2182 1.1 joerg unresolvedMemberExpr() 2183 1.1 joerg matches x.f<T> 2184 1.1 joerg </pre></td></tr> 2185 1.1 joerg 2186 1.1 joerg 2187 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('userDefinedLiteral0')"><a name="userDefinedLiteral0Anchor">userDefinedLiteral</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UserDefinedLiteral.html">UserDefinedLiteral</a>>...</td></tr> 2188 1.1 joerg <tr><td colspan="4" class="doc" id="userDefinedLiteral0"><pre>Matches user defined literal operator call. 2189 1.1 joerg 2190 1.1 joerg Example match: "foo"_suffix 2191 1.1 joerg </pre></td></tr> 2192 1.1 joerg 2193 1.1 joerg 2194 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('whileStmt0')"><a name="whileStmt0Anchor">whileStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1WhileStmt.html">WhileStmt</a>>...</td></tr> 2195 1.1 joerg <tr><td colspan="4" class="doc" id="whileStmt0"><pre>Matches while statements. 2196 1.1 joerg 2197 1.1 joerg Given 2198 1.1 joerg while (true) {} 2199 1.1 joerg whileStmt() 2200 1.1 joerg matches 'while (true) {}'. 2201 1.1 joerg </pre></td></tr> 2202 1.1 joerg 2203 1.1 joerg 2204 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>></td><td class="name" onclick="toggle('templateArgumentLoc0')"><a name="templateArgumentLoc0Anchor">templateArgumentLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>>...</td></tr> 2205 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="templateArgumentLoc0"><pre>Matches template arguments (with location info). 2206 1.1.1.2 joerg 2207 1.1.1.2 joerg Given 2208 1.1.1.2 joerg template <typename T> struct C {}; 2209 1.1.1.2 joerg C<int> c; 2210 1.1.1.2 joerg templateArgumentLoc() 2211 1.1.1.2 joerg matches 'int' in C<int>. 2212 1.1.1.2 joerg </pre></td></tr> 2213 1.1.1.2 joerg 2214 1.1.1.2 joerg 2215 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>></td><td class="name" onclick="toggle('templateArgument0')"><a name="templateArgument0Anchor">templateArgument</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>>...</td></tr> 2216 1.1 joerg <tr><td colspan="4" class="doc" id="templateArgument0"><pre>Matches template arguments. 2217 1.1 joerg 2218 1.1 joerg Given 2219 1.1 joerg template <typename T> struct C {}; 2220 1.1 joerg C<int> c; 2221 1.1 joerg templateArgument() 2222 1.1 joerg matches 'int' in C<int>. 2223 1.1 joerg </pre></td></tr> 2224 1.1 joerg 2225 1.1 joerg 2226 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateName.html">TemplateName</a>></td><td class="name" onclick="toggle('templateName0')"><a name="templateName0Anchor">templateName</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateName.html">TemplateName</a>>...</td></tr> 2227 1.1 joerg <tr><td colspan="4" class="doc" id="templateName0"><pre>Matches template name. 2228 1.1 joerg 2229 1.1 joerg Given 2230 1.1 joerg template <typename T> class X { }; 2231 1.1 joerg X<int> xi; 2232 1.1 joerg templateName() 2233 1.1 joerg matches 'X' in X<int>. 2234 1.1 joerg </pre></td></tr> 2235 1.1 joerg 2236 1.1 joerg 2237 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>></td><td class="name" onclick="toggle('typeLoc0')"><a name="typeLoc0Anchor">typeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>>...</td></tr> 2238 1.1 joerg <tr><td colspan="4" class="doc" id="typeLoc0"><pre>Matches TypeLocs in the clang AST. 2239 1.1 joerg </pre></td></tr> 2240 1.1 joerg 2241 1.1 joerg 2242 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('arrayType0')"><a name="arrayType0Anchor">arrayType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ArrayType.html">ArrayType</a>>...</td></tr> 2243 1.1 joerg <tr><td colspan="4" class="doc" id="arrayType0"><pre>Matches all kinds of arrays. 2244 1.1 joerg 2245 1.1 joerg Given 2246 1.1 joerg int a[] = { 2, 3 }; 2247 1.1 joerg int b[4]; 2248 1.1 joerg void f() { int c[a[0]]; } 2249 1.1 joerg arrayType() 2250 1.1 joerg matches "int a[]", "int b[4]" and "int c[a[0]]"; 2251 1.1 joerg </pre></td></tr> 2252 1.1 joerg 2253 1.1 joerg 2254 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('atomicType0')"><a name="atomicType0Anchor">atomicType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>>...</td></tr> 2255 1.1 joerg <tr><td colspan="4" class="doc" id="atomicType0"><pre>Matches atomic types. 2256 1.1 joerg 2257 1.1 joerg Given 2258 1.1 joerg _Atomic(int) i; 2259 1.1 joerg atomicType() 2260 1.1 joerg matches "_Atomic(int) i" 2261 1.1 joerg </pre></td></tr> 2262 1.1 joerg 2263 1.1 joerg 2264 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('autoType0')"><a name="autoType0Anchor">autoType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>>...</td></tr> 2265 1.1 joerg <tr><td colspan="4" class="doc" id="autoType0"><pre>Matches types nodes representing C++11 auto types. 2266 1.1 joerg 2267 1.1 joerg Given: 2268 1.1 joerg auto n = 4; 2269 1.1 joerg int v[] = { 2, 3 } 2270 1.1 joerg for (auto i : v) { } 2271 1.1 joerg autoType() 2272 1.1 joerg matches "auto n" and "auto i" 2273 1.1 joerg </pre></td></tr> 2274 1.1 joerg 2275 1.1 joerg 2276 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('blockPointerType0')"><a name="blockPointerType0Anchor">blockPointerType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>>...</td></tr> 2277 1.1 joerg <tr><td colspan="4" class="doc" id="blockPointerType0"><pre>Matches block pointer types, i.e. types syntactically represented as 2278 1.1 joerg "void (^)(int)". 2279 1.1 joerg 2280 1.1 joerg The pointee is always required to be a FunctionType. 2281 1.1 joerg </pre></td></tr> 2282 1.1 joerg 2283 1.1 joerg 2284 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('builtinType0')"><a name="builtinType0Anchor">builtinType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BuiltinType.html">BuiltinType</a>>...</td></tr> 2285 1.1 joerg <tr><td colspan="4" class="doc" id="builtinType0"><pre>Matches builtin Types. 2286 1.1 joerg 2287 1.1 joerg Given 2288 1.1 joerg struct A {}; 2289 1.1 joerg A a; 2290 1.1 joerg int b; 2291 1.1 joerg float c; 2292 1.1 joerg bool d; 2293 1.1 joerg builtinType() 2294 1.1 joerg matches "int b", "float c" and "bool d" 2295 1.1 joerg </pre></td></tr> 2296 1.1 joerg 2297 1.1 joerg 2298 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('complexType0')"><a name="complexType0Anchor">complexType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ComplexType.html">ComplexType</a>>...</td></tr> 2299 1.1 joerg <tr><td colspan="4" class="doc" id="complexType0"><pre>Matches C99 complex types. 2300 1.1 joerg 2301 1.1 joerg Given 2302 1.1 joerg _Complex float f; 2303 1.1 joerg complexType() 2304 1.1 joerg matches "_Complex float f" 2305 1.1 joerg </pre></td></tr> 2306 1.1 joerg 2307 1.1 joerg 2308 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('constantArrayType0')"><a name="constantArrayType0Anchor">constantArrayType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ConstantArrayType.html">ConstantArrayType</a>>...</td></tr> 2309 1.1 joerg <tr><td colspan="4" class="doc" id="constantArrayType0"><pre>Matches C arrays with a specified constant size. 2310 1.1 joerg 2311 1.1 joerg Given 2312 1.1 joerg void() { 2313 1.1 joerg int a[2]; 2314 1.1 joerg int b[] = { 2, 3 }; 2315 1.1 joerg int c[b[0]]; 2316 1.1 joerg } 2317 1.1 joerg constantArrayType() 2318 1.1 joerg matches "int a[2]" 2319 1.1 joerg </pre></td></tr> 2320 1.1 joerg 2321 1.1 joerg 2322 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('decayedType0')"><a name="decayedType0Anchor">decayedType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DecayedType.html">DecayedType</a>>...</td></tr> 2323 1.1 joerg <tr><td colspan="4" class="doc" id="decayedType0"><pre>Matches decayed type 2324 1.1 joerg Example matches i[] in declaration of f. 2325 1.1 joerg (matcher = valueDecl(hasType(decayedType(hasDecayedType(pointerType()))))) 2326 1.1 joerg Example matches i[1]. 2327 1.1 joerg (matcher = expr(hasType(decayedType(hasDecayedType(pointerType()))))) 2328 1.1 joerg void f(int i[]) { 2329 1.1 joerg i[1] = 0; 2330 1.1 joerg } 2331 1.1 joerg </pre></td></tr> 2332 1.1 joerg 2333 1.1 joerg 2334 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('decltypeType0')"><a name="decltypeType0Anchor">decltypeType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DecltypeType.html">DecltypeType</a>>...</td></tr> 2335 1.1 joerg <tr><td colspan="4" class="doc" id="decltypeType0"><pre>Matches types nodes representing C++11 decltype(<expr>) types. 2336 1.1 joerg 2337 1.1 joerg Given: 2338 1.1 joerg short i = 1; 2339 1.1 joerg int j = 42; 2340 1.1 joerg decltype(i + j) result = i + j; 2341 1.1 joerg decltypeType() 2342 1.1 joerg matches "decltype(i + j)" 2343 1.1 joerg </pre></td></tr> 2344 1.1 joerg 2345 1.1 joerg 2346 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('deducedTemplateSpecializationType0')"><a name="deducedTemplateSpecializationType0Anchor">deducedTemplateSpecializationType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeducedTemplateSpecializationType.html">DeducedTemplateSpecializationType</a>>...</td></tr> 2347 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="deducedTemplateSpecializationType0"><pre>Matches C++17 deduced template specialization types, e.g. deduced class 2348 1.1.1.2 joerg template types. 2349 1.1.1.2 joerg 2350 1.1.1.2 joerg Given 2351 1.1.1.2 joerg template <typename T> 2352 1.1.1.2 joerg class C { public: C(T); }; 2353 1.1.1.2 joerg 2354 1.1.1.2 joerg C c(123); 2355 1.1.1.2 joerg deducedTemplateSpecializationType() matches the type in the declaration 2356 1.1.1.2 joerg of the variable c. 2357 1.1.1.2 joerg </pre></td></tr> 2358 1.1.1.2 joerg 2359 1.1.1.2 joerg 2360 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('dependentSizedArrayType0')"><a name="dependentSizedArrayType0Anchor">dependentSizedArrayType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DependentSizedArrayType.html">DependentSizedArrayType</a>>...</td></tr> 2361 1.1 joerg <tr><td colspan="4" class="doc" id="dependentSizedArrayType0"><pre>Matches C++ arrays whose size is a value-dependent expression. 2362 1.1 joerg 2363 1.1 joerg Given 2364 1.1 joerg template<typename T, int Size> 2365 1.1 joerg class array { 2366 1.1 joerg T data[Size]; 2367 1.1 joerg }; 2368 1.1 joerg dependentSizedArrayType 2369 1.1 joerg matches "T data[Size]" 2370 1.1 joerg </pre></td></tr> 2371 1.1 joerg 2372 1.1 joerg 2373 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('elaboratedType0')"><a name="elaboratedType0Anchor">elaboratedType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ElaboratedType.html">ElaboratedType</a>>...</td></tr> 2374 1.1 joerg <tr><td colspan="4" class="doc" id="elaboratedType0"><pre>Matches types specified with an elaborated type keyword or with a 2375 1.1 joerg qualified name. 2376 1.1 joerg 2377 1.1 joerg Given 2378 1.1 joerg namespace N { 2379 1.1 joerg namespace M { 2380 1.1 joerg class D {}; 2381 1.1 joerg } 2382 1.1 joerg } 2383 1.1 joerg class C {}; 2384 1.1 joerg 2385 1.1 joerg class C c; 2386 1.1 joerg N::M::D d; 2387 1.1 joerg 2388 1.1 joerg elaboratedType() matches the type of the variable declarations of both 2389 1.1 joerg c and d. 2390 1.1 joerg </pre></td></tr> 2391 1.1 joerg 2392 1.1 joerg 2393 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('enumType0')"><a name="enumType0Anchor">enumType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>...</td></tr> 2394 1.1 joerg <tr><td colspan="4" class="doc" id="enumType0"><pre>Matches enum types. 2395 1.1 joerg 2396 1.1 joerg Given 2397 1.1 joerg enum C { Green }; 2398 1.1 joerg enum class S { Red }; 2399 1.1 joerg 2400 1.1 joerg C c; 2401 1.1 joerg S s; 2402 1.1 joerg 2403 1.1 joerg enumType() matches the type of the variable declarations of both c and 2404 1.1 joerg s. 2405 1.1 joerg </pre></td></tr> 2406 1.1 joerg 2407 1.1 joerg 2408 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('functionProtoType0')"><a name="functionProtoType0Anchor">functionProtoType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionProtoType.html">FunctionProtoType</a>>...</td></tr> 2409 1.1 joerg <tr><td colspan="4" class="doc" id="functionProtoType0"><pre>Matches FunctionProtoType nodes. 2410 1.1 joerg 2411 1.1 joerg Given 2412 1.1 joerg int (*f)(int); 2413 1.1 joerg void g(); 2414 1.1 joerg functionProtoType() 2415 1.1 joerg matches "int (*f)(int)" and the type of "g" in C++ mode. 2416 1.1 joerg In C mode, "g" is not matched because it does not contain a prototype. 2417 1.1 joerg </pre></td></tr> 2418 1.1 joerg 2419 1.1 joerg 2420 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('functionType0')"><a name="functionType0Anchor">functionType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionType.html">FunctionType</a>>...</td></tr> 2421 1.1 joerg <tr><td colspan="4" class="doc" id="functionType0"><pre>Matches FunctionType nodes. 2422 1.1 joerg 2423 1.1 joerg Given 2424 1.1 joerg int (*f)(int); 2425 1.1 joerg void g(); 2426 1.1 joerg functionType() 2427 1.1 joerg matches "int (*f)(int)" and the type of "g". 2428 1.1 joerg </pre></td></tr> 2429 1.1 joerg 2430 1.1 joerg 2431 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('incompleteArrayType0')"><a name="incompleteArrayType0Anchor">incompleteArrayType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IncompleteArrayType.html">IncompleteArrayType</a>>...</td></tr> 2432 1.1 joerg <tr><td colspan="4" class="doc" id="incompleteArrayType0"><pre>Matches C arrays with unspecified size. 2433 1.1 joerg 2434 1.1 joerg Given 2435 1.1 joerg int a[] = { 2, 3 }; 2436 1.1 joerg int b[42]; 2437 1.1 joerg void f(int c[]) { int d[a[0]]; }; 2438 1.1 joerg incompleteArrayType() 2439 1.1 joerg matches "int a[]" and "int c[]" 2440 1.1 joerg </pre></td></tr> 2441 1.1 joerg 2442 1.1 joerg 2443 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('injectedClassNameType0')"><a name="injectedClassNameType0Anchor">injectedClassNameType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>...</td></tr> 2444 1.1 joerg <tr><td colspan="4" class="doc" id="injectedClassNameType0"><pre>Matches injected class name types. 2445 1.1 joerg 2446 1.1 joerg Example matches S s, but not S<T> s. 2447 1.1 joerg (matcher = parmVarDecl(hasType(injectedClassNameType()))) 2448 1.1 joerg template <typename T> struct S { 2449 1.1 joerg void f(S s); 2450 1.1 joerg void g(S<T> s); 2451 1.1 joerg }; 2452 1.1 joerg </pre></td></tr> 2453 1.1 joerg 2454 1.1 joerg 2455 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('lValueReferenceType0')"><a name="lValueReferenceType0Anchor">lValueReferenceType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LValueReferenceType.html">LValueReferenceType</a>>...</td></tr> 2456 1.1 joerg <tr><td colspan="4" class="doc" id="lValueReferenceType0"><pre>Matches lvalue reference types. 2457 1.1 joerg 2458 1.1 joerg Given: 2459 1.1 joerg int *a; 2460 1.1 joerg int &b = *a; 2461 1.1 joerg int &&c = 1; 2462 1.1 joerg auto &d = b; 2463 1.1 joerg auto &&e = c; 2464 1.1 joerg auto &&f = 2; 2465 1.1 joerg int g = 5; 2466 1.1 joerg 2467 1.1 joerg lValueReferenceType() matches the types of b, d, and e. e is 2468 1.1 joerg matched since the type is deduced as int& by reference collapsing rules. 2469 1.1 joerg </pre></td></tr> 2470 1.1 joerg 2471 1.1 joerg 2472 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('memberPointerType0')"><a name="memberPointerType0Anchor">memberPointerType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>>...</td></tr> 2473 1.1 joerg <tr><td colspan="4" class="doc" id="memberPointerType0"><pre>Matches member pointer types. 2474 1.1 joerg Given 2475 1.1 joerg struct A { int i; } 2476 1.1 joerg A::* ptr = A::i; 2477 1.1 joerg memberPointerType() 2478 1.1 joerg matches "A::* ptr" 2479 1.1 joerg </pre></td></tr> 2480 1.1 joerg 2481 1.1 joerg 2482 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('objcObjectPointerType0')"><a name="objcObjectPointerType0Anchor">objcObjectPointerType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCObjectPointerType.html">ObjCObjectPointerType</a>>...</td></tr> 2483 1.1 joerg <tr><td colspan="4" class="doc" id="objcObjectPointerType0"><pre>Matches an Objective-C object pointer type, which is different from 2484 1.1 joerg a pointer type, despite being syntactically similar. 2485 1.1 joerg 2486 1.1 joerg Given 2487 1.1 joerg int *a; 2488 1.1 joerg 2489 1.1 joerg @interface Foo 2490 1.1 joerg @end 2491 1.1 joerg Foo *f; 2492 1.1 joerg pointerType() 2493 1.1 joerg matches "Foo *f", but does not match "int *a". 2494 1.1 joerg </pre></td></tr> 2495 1.1 joerg 2496 1.1 joerg 2497 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('parenType0')"><a name="parenType0Anchor">parenType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>>...</td></tr> 2498 1.1 joerg <tr><td colspan="4" class="doc" id="parenType0"><pre>Matches ParenType nodes. 2499 1.1 joerg 2500 1.1 joerg Given 2501 1.1 joerg int (*ptr_to_array)[4]; 2502 1.1 joerg int *array_of_ptrs[4]; 2503 1.1 joerg 2504 1.1 joerg varDecl(hasType(pointsTo(parenType()))) matches ptr_to_array but not 2505 1.1 joerg array_of_ptrs. 2506 1.1 joerg </pre></td></tr> 2507 1.1 joerg 2508 1.1 joerg 2509 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('pointerType0')"><a name="pointerType0Anchor">pointerType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>>...</td></tr> 2510 1.1 joerg <tr><td colspan="4" class="doc" id="pointerType0"><pre>Matches pointer types, but does not match Objective-C object pointer 2511 1.1 joerg types. 2512 1.1 joerg 2513 1.1 joerg Given 2514 1.1 joerg int *a; 2515 1.1 joerg int &b = *a; 2516 1.1 joerg int c = 5; 2517 1.1 joerg 2518 1.1 joerg @interface Foo 2519 1.1 joerg @end 2520 1.1 joerg Foo *f; 2521 1.1 joerg pointerType() 2522 1.1 joerg matches "int *a", but does not match "Foo *f". 2523 1.1 joerg </pre></td></tr> 2524 1.1 joerg 2525 1.1 joerg 2526 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('rValueReferenceType0')"><a name="rValueReferenceType0Anchor">rValueReferenceType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RValueReferenceType.html">RValueReferenceType</a>>...</td></tr> 2527 1.1 joerg <tr><td colspan="4" class="doc" id="rValueReferenceType0"><pre>Matches rvalue reference types. 2528 1.1 joerg 2529 1.1 joerg Given: 2530 1.1 joerg int *a; 2531 1.1 joerg int &b = *a; 2532 1.1 joerg int &&c = 1; 2533 1.1 joerg auto &d = b; 2534 1.1 joerg auto &&e = c; 2535 1.1 joerg auto &&f = 2; 2536 1.1 joerg int g = 5; 2537 1.1 joerg 2538 1.1 joerg rValueReferenceType() matches the types of c and f. e is not 2539 1.1 joerg matched as it is deduced to int& by reference collapsing rules. 2540 1.1 joerg </pre></td></tr> 2541 1.1 joerg 2542 1.1 joerg 2543 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('recordType0')"><a name="recordType0Anchor">recordType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>...</td></tr> 2544 1.1 joerg <tr><td colspan="4" class="doc" id="recordType0"><pre>Matches record types (e.g. structs, classes). 2545 1.1 joerg 2546 1.1 joerg Given 2547 1.1 joerg class C {}; 2548 1.1 joerg struct S {}; 2549 1.1 joerg 2550 1.1 joerg C c; 2551 1.1 joerg S s; 2552 1.1 joerg 2553 1.1 joerg recordType() matches the type of the variable declarations of both c 2554 1.1 joerg and s. 2555 1.1 joerg </pre></td></tr> 2556 1.1 joerg 2557 1.1 joerg 2558 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('referenceType0')"><a name="referenceType0Anchor">referenceType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>>...</td></tr> 2559 1.1 joerg <tr><td colspan="4" class="doc" id="referenceType0"><pre>Matches both lvalue and rvalue reference types. 2560 1.1 joerg 2561 1.1 joerg Given 2562 1.1 joerg int *a; 2563 1.1 joerg int &b = *a; 2564 1.1 joerg int &&c = 1; 2565 1.1 joerg auto &d = b; 2566 1.1 joerg auto &&e = c; 2567 1.1 joerg auto &&f = 2; 2568 1.1 joerg int g = 5; 2569 1.1 joerg 2570 1.1 joerg referenceType() matches the types of b, c, d, e, and f. 2571 1.1 joerg </pre></td></tr> 2572 1.1 joerg 2573 1.1 joerg 2574 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('substTemplateTypeParmType0')"><a name="substTemplateTypeParmType0Anchor">substTemplateTypeParmType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1SubstTemplateTypeParmType.html">SubstTemplateTypeParmType</a>>...</td></tr> 2575 1.1 joerg <tr><td colspan="4" class="doc" id="substTemplateTypeParmType0"><pre>Matches types that represent the result of substituting a type for a 2576 1.1 joerg template type parameter. 2577 1.1 joerg 2578 1.1 joerg Given 2579 1.1 joerg template <typename T> 2580 1.1 joerg void F(T t) { 2581 1.1 joerg int i = 1 + t; 2582 1.1 joerg } 2583 1.1 joerg 2584 1.1 joerg substTemplateTypeParmType() matches the type of 't' but not '1' 2585 1.1 joerg </pre></td></tr> 2586 1.1 joerg 2587 1.1 joerg 2588 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('tagType0')"><a name="tagType0Anchor">tagType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>...</td></tr> 2589 1.1 joerg <tr><td colspan="4" class="doc" id="tagType0"><pre>Matches tag types (record and enum types). 2590 1.1 joerg 2591 1.1 joerg Given 2592 1.1 joerg enum E {}; 2593 1.1 joerg class C {}; 2594 1.1 joerg 2595 1.1 joerg E e; 2596 1.1 joerg C c; 2597 1.1 joerg 2598 1.1 joerg tagType() matches the type of the variable declarations of both e 2599 1.1 joerg and c. 2600 1.1 joerg </pre></td></tr> 2601 1.1 joerg 2602 1.1 joerg 2603 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('templateSpecializationType0')"><a name="templateSpecializationType0Anchor">templateSpecializationType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>...</td></tr> 2604 1.1 joerg <tr><td colspan="4" class="doc" id="templateSpecializationType0"><pre>Matches template specialization types. 2605 1.1 joerg 2606 1.1 joerg Given 2607 1.1 joerg template <typename T> 2608 1.1 joerg class C { }; 2609 1.1 joerg 2610 1.1 joerg template class C<int>; // A 2611 1.1 joerg C<char> var; // B 2612 1.1 joerg 2613 1.1 joerg templateSpecializationType() matches the type of the explicit 2614 1.1 joerg instantiation in A and the type of the variable declaration in B. 2615 1.1 joerg </pre></td></tr> 2616 1.1 joerg 2617 1.1 joerg 2618 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('templateTypeParmType0')"><a name="templateTypeParmType0Anchor">templateTypeParmType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>...</td></tr> 2619 1.1 joerg <tr><td colspan="4" class="doc" id="templateTypeParmType0"><pre>Matches template type parameter types. 2620 1.1 joerg 2621 1.1 joerg Example matches T, but not int. 2622 1.1 joerg (matcher = templateTypeParmType()) 2623 1.1 joerg template <typename T> void f(int i); 2624 1.1 joerg </pre></td></tr> 2625 1.1 joerg 2626 1.1 joerg 2627 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('type0')"><a name="type0Anchor">type</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>>...</td></tr> 2628 1.1 joerg <tr><td colspan="4" class="doc" id="type0"><pre>Matches Types in the clang AST. 2629 1.1 joerg </pre></td></tr> 2630 1.1 joerg 2631 1.1 joerg 2632 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('typedefType0')"><a name="typedefType0Anchor">typedefType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>...</td></tr> 2633 1.1 joerg <tr><td colspan="4" class="doc" id="typedefType0"><pre>Matches typedef types. 2634 1.1 joerg 2635 1.1 joerg Given 2636 1.1 joerg typedef int X; 2637 1.1 joerg typedefType() 2638 1.1 joerg matches "typedef int X" 2639 1.1 joerg </pre></td></tr> 2640 1.1 joerg 2641 1.1 joerg 2642 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('unaryTransformType0')"><a name="unaryTransformType0Anchor">unaryTransformType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryTransformType.html">UnaryTransformType</a>>...</td></tr> 2643 1.1 joerg <tr><td colspan="4" class="doc" id="unaryTransformType0"><pre>Matches types nodes representing unary type transformations. 2644 1.1 joerg 2645 1.1 joerg Given: 2646 1.1 joerg typedef __underlying_type(T) type; 2647 1.1 joerg unaryTransformType() 2648 1.1 joerg matches "__underlying_type(T)" 2649 1.1 joerg </pre></td></tr> 2650 1.1 joerg 2651 1.1 joerg 2652 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('variableArrayType0')"><a name="variableArrayType0Anchor">variableArrayType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VariableArrayType.html">VariableArrayType</a>>...</td></tr> 2653 1.1 joerg <tr><td colspan="4" class="doc" id="variableArrayType0"><pre>Matches C arrays with a specified size that is not an 2654 1.1 joerg integer-constant-expression. 2655 1.1 joerg 2656 1.1 joerg Given 2657 1.1 joerg void f() { 2658 1.1 joerg int a[] = { 2, 3 } 2659 1.1 joerg int b[42]; 2660 1.1 joerg int c[a[0]]; 2661 1.1 joerg } 2662 1.1 joerg variableArrayType() 2663 1.1 joerg matches "int c[a[0]]" 2664 1.1 joerg </pre></td></tr> 2665 1.1 joerg 2666 1.1 joerg <!--END_DECL_MATCHERS --> 2667 1.1 joerg </table> 2668 1.1 joerg 2669 1.1 joerg <!-- ======================================================================= --> 2670 1.1 joerg <h2 id="narrowing-matchers">Narrowing Matchers</h2> 2671 1.1 joerg <!-- ======================================================================= --> 2672 1.1 joerg 2673 1.1 joerg <p>Narrowing matchers match certain attributes on the current node, thus 2674 1.1 joerg narrowing down the set of nodes of the current type to match on.</p> 2675 1.1 joerg 2676 1.1 joerg <p>There are special logical narrowing matchers (allOf, anyOf, anything and unless) 2677 1.1 joerg which allow users to create more powerful match expressions.</p> 2678 1.1 joerg 2679 1.1 joerg <table> 2680 1.1 joerg <tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr> 2681 1.1 joerg <!-- START_NARROWING_MATCHERS --> 2682 1.1 joerg 2683 1.1 joerg <tr><td>Matcher<*></td><td class="name" onclick="toggle('allOf0')"><a name="allOf0Anchor">allOf</a></td><td>Matcher<*>, ..., Matcher<*></td></tr> 2684 1.1 joerg <tr><td colspan="4" class="doc" id="allOf0"><pre>Matches if all given matchers match. 2685 1.1 joerg 2686 1.1 joerg Usable as: Any Matcher 2687 1.1 joerg </pre></td></tr> 2688 1.1 joerg 2689 1.1 joerg 2690 1.1 joerg <tr><td>Matcher<*></td><td class="name" onclick="toggle('anyOf0')"><a name="anyOf0Anchor">anyOf</a></td><td>Matcher<*>, ..., Matcher<*></td></tr> 2691 1.1 joerg <tr><td colspan="4" class="doc" id="anyOf0"><pre>Matches if any of the given matchers matches. 2692 1.1 joerg 2693 1.1 joerg Usable as: Any Matcher 2694 1.1 joerg </pre></td></tr> 2695 1.1 joerg 2696 1.1 joerg 2697 1.1 joerg <tr><td>Matcher<*></td><td class="name" onclick="toggle('anything0')"><a name="anything0Anchor">anything</a></td><td></td></tr> 2698 1.1 joerg <tr><td colspan="4" class="doc" id="anything0"><pre>Matches any node. 2699 1.1 joerg 2700 1.1 joerg Useful when another matcher requires a child matcher, but there's no 2701 1.1 joerg additional constraint. This will often be used with an explicit conversion 2702 1.1 joerg to an internal::Matcher<> type such as TypeMatcher. 2703 1.1 joerg 2704 1.1 joerg Example: DeclarationMatcher(anything()) matches all declarations, e.g., 2705 1.1 joerg "int* p" and "void f()" in 2706 1.1 joerg int* p; 2707 1.1 joerg void f(); 2708 1.1 joerg 2709 1.1 joerg Usable as: Any Matcher 2710 1.1 joerg </pre></td></tr> 2711 1.1 joerg 2712 1.1 joerg 2713 1.1.1.2 joerg <tr><td><em>unspecified</em></td><td class="name" onclick="toggle('mapAnyOf0')"><a name="mapAnyOf0Anchor">mapAnyOf</a></td><td>nodeMatcherFunction...</td></tr> 2714 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="mapAnyOf0"><pre>Matches any of the NodeMatchers with InnerMatchers nested within 2715 1.1.1.2 joerg 2716 1.1.1.2 joerg Given 2717 1.1.1.2 joerg if (true); 2718 1.1.1.2 joerg for (; true; ); 2719 1.1.1.2 joerg with the matcher 2720 1.1.1.2 joerg mapAnyOf(ifStmt, forStmt).with( 2721 1.1.1.2 joerg hasCondition(cxxBoolLiteralExpr(equals(true))) 2722 1.1.1.2 joerg ).bind("trueCond") 2723 1.1.1.2 joerg matches the if and the for. It is equivalent to: 2724 1.1.1.2 joerg auto trueCond = hasCondition(cxxBoolLiteralExpr(equals(true))); 2725 1.1.1.2 joerg anyOf( 2726 1.1.1.2 joerg ifStmt(trueCond).bind("trueCond"), 2727 1.1.1.2 joerg forStmt(trueCond).bind("trueCond") 2728 1.1.1.2 joerg ); 2729 1.1.1.2 joerg 2730 1.1.1.2 joerg The with() chain-call accepts zero or more matchers which are combined 2731 1.1.1.2 joerg as-if with allOf() in each of the node matchers. 2732 1.1.1.2 joerg Usable as: Any Matcher 2733 1.1.1.2 joerg </pre></td></tr> 2734 1.1.1.2 joerg 2735 1.1.1.2 joerg 2736 1.1 joerg <tr><td>Matcher<*></td><td class="name" onclick="toggle('unless0')"><a name="unless0Anchor">unless</a></td><td>Matcher<*></td></tr> 2737 1.1 joerg <tr><td colspan="4" class="doc" id="unless0"><pre>Matches if the provided matcher does not match. 2738 1.1 joerg 2739 1.1 joerg Example matches Y (matcher = cxxRecordDecl(unless(hasName("X")))) 2740 1.1 joerg class X {}; 2741 1.1 joerg class Y {}; 2742 1.1 joerg 2743 1.1 joerg Usable as: Any Matcher 2744 1.1 joerg </pre></td></tr> 2745 1.1 joerg 2746 1.1 joerg 2747 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>></td><td class="name" onclick="toggle('hasAnyOperatorName0')"><a name="hasAnyOperatorName0Anchor">hasAnyOperatorName</a></td><td>StringRef, ..., StringRef</td></tr> 2748 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasAnyOperatorName0"><pre>Matches operator expressions (binary or unary) that have any of the 2749 1.1.1.2 joerg specified names. 2750 1.1.1.2 joerg 2751 1.1.1.2 joerg hasAnyOperatorName("+", "-") 2752 1.1.1.2 joerg Is equivalent to 2753 1.1.1.2 joerg anyOf(hasOperatorName("+"), hasOperatorName("-")) 2754 1.1.1.2 joerg </pre></td></tr> 2755 1.1.1.2 joerg 2756 1.1.1.2 joerg 2757 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>></td><td class="name" onclick="toggle('hasOperatorName0')"><a name="hasOperatorName0Anchor">hasOperatorName</a></td><td>std::string Name</td></tr> 2758 1.1 joerg <tr><td colspan="4" class="doc" id="hasOperatorName0"><pre>Matches the operator Name of operator expressions (binary or 2759 1.1 joerg unary). 2760 1.1 joerg 2761 1.1 joerg Example matches a || b (matcher = binaryOperator(hasOperatorName("||"))) 2762 1.1 joerg !(a || b) 2763 1.1 joerg </pre></td></tr> 2764 1.1 joerg 2765 1.1 joerg 2766 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>></td><td class="name" onclick="toggle('isAssignmentOperator0')"><a name="isAssignmentOperator0Anchor">isAssignmentOperator</a></td><td></td></tr> 2767 1.1 joerg <tr><td colspan="4" class="doc" id="isAssignmentOperator0"><pre>Matches all kinds of assignment operators. 2768 1.1 joerg 2769 1.1 joerg Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator())) 2770 1.1 joerg if (a == b) 2771 1.1 joerg a += b; 2772 1.1 joerg 2773 1.1 joerg Example 2: matches s1 = s2 2774 1.1 joerg (matcher = cxxOperatorCallExpr(isAssignmentOperator())) 2775 1.1 joerg struct S { S& operator=(const S&); }; 2776 1.1.1.2 joerg void x() { S s1, s2; s1 = s2; } 2777 1.1 joerg </pre></td></tr> 2778 1.1 joerg 2779 1.1 joerg 2780 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>></td><td class="name" onclick="toggle('isComparisonOperator0')"><a name="isComparisonOperator0Anchor">isComparisonOperator</a></td><td></td></tr> 2781 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="isComparisonOperator0"><pre>Matches comparison operators. 2782 1.1 joerg 2783 1.1.1.2 joerg Example 1: matches a == b (matcher = binaryOperator(isComparisonOperator())) 2784 1.1.1.2 joerg if (a == b) 2785 1.1.1.2 joerg a += b; 2786 1.1 joerg 2787 1.1.1.2 joerg Example 2: matches s1 < s2 2788 1.1.1.2 joerg (matcher = cxxOperatorCallExpr(isComparisonOperator())) 2789 1.1.1.2 joerg struct S { bool operator<(const S& other); }; 2790 1.1.1.2 joerg void x(S s1, S s2) { bool b1 = s1 < s2; } 2791 1.1.1.2 joerg </pre></td></tr> 2792 1.1 joerg 2793 1.1.1.2 joerg 2794 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>></td><td class="name" onclick="toggle('isPrivate1')"><a name="isPrivate1Anchor">isPrivate</a></td><td></td></tr> 2795 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="isPrivate1"><pre>Matches private C++ declarations and C++ base specifers that specify private 2796 1.1.1.2 joerg inheritance. 2797 1.1.1.2 joerg 2798 1.1.1.2 joerg Examples: 2799 1.1.1.2 joerg class C { 2800 1.1.1.2 joerg public: int a; 2801 1.1.1.2 joerg protected: int b; 2802 1.1.1.2 joerg private: int c; // fieldDecl(isPrivate()) matches 'c' 2803 1.1.1.2 joerg }; 2804 1.1.1.2 joerg 2805 1.1.1.2 joerg struct Base {}; 2806 1.1.1.2 joerg struct Derived1 : private Base {}; // matches 'Base' 2807 1.1.1.2 joerg class Derived2 : Base {}; // matches 'Base' 2808 1.1.1.2 joerg </pre></td></tr> 2809 1.1.1.2 joerg 2810 1.1.1.2 joerg 2811 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>></td><td class="name" onclick="toggle('isProtected1')"><a name="isProtected1Anchor">isProtected</a></td><td></td></tr> 2812 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="isProtected1"><pre>Matches protected C++ declarations and C++ base specifers that specify 2813 1.1.1.2 joerg protected inheritance. 2814 1.1.1.2 joerg 2815 1.1.1.2 joerg Examples: 2816 1.1.1.2 joerg class C { 2817 1.1.1.2 joerg public: int a; 2818 1.1.1.2 joerg protected: int b; // fieldDecl(isProtected()) matches 'b' 2819 1.1.1.2 joerg private: int c; 2820 1.1.1.2 joerg }; 2821 1.1.1.2 joerg 2822 1.1.1.2 joerg class Base {}; 2823 1.1.1.2 joerg class Derived : protected Base {}; // matches 'Base' 2824 1.1.1.2 joerg </pre></td></tr> 2825 1.1.1.2 joerg 2826 1.1.1.2 joerg 2827 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>></td><td class="name" onclick="toggle('isPublic1')"><a name="isPublic1Anchor">isPublic</a></td><td></td></tr> 2828 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="isPublic1"><pre>Matches public C++ declarations and C++ base specifers that specify public 2829 1.1.1.2 joerg inheritance. 2830 1.1.1.2 joerg 2831 1.1.1.2 joerg Examples: 2832 1.1.1.2 joerg class C { 2833 1.1.1.2 joerg public: int a; // fieldDecl(isPublic()) matches 'a' 2834 1.1.1.2 joerg protected: int b; 2835 1.1.1.2 joerg private: int c; 2836 1.1.1.2 joerg }; 2837 1.1.1.2 joerg 2838 1.1.1.2 joerg class Base {}; 2839 1.1.1.2 joerg class Derived1 : public Base {}; // matches 'Base' 2840 1.1.1.2 joerg struct Derived2 : Base {}; // matches 'Base' 2841 1.1.1.2 joerg </pre></td></tr> 2842 1.1.1.2 joerg 2843 1.1.1.2 joerg 2844 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>></td><td class="name" onclick="toggle('isVirtual1')"><a name="isVirtual1Anchor">isVirtual</a></td><td></td></tr> 2845 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="isVirtual1"><pre>Matches declarations of virtual methods and C++ base specifers that specify 2846 1.1.1.2 joerg virtual inheritance. 2847 1.1.1.2 joerg 2848 1.1.1.2 joerg Example: 2849 1.1.1.2 joerg class A { 2850 1.1.1.2 joerg public: 2851 1.1.1.2 joerg virtual void x(); // matches x 2852 1.1.1.2 joerg }; 2853 1.1.1.2 joerg 2854 1.1.1.2 joerg Example: 2855 1.1.1.2 joerg class Base {}; 2856 1.1.1.2 joerg class DirectlyDerived : virtual Base {}; // matches Base 2857 1.1.1.2 joerg class IndirectlyDerived : DirectlyDerived, Base {}; // matches Base 2858 1.1.1.2 joerg 2859 1.1.1.2 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>> 2860 1.1.1.2 joerg </pre></td></tr> 2861 1.1.1.2 joerg 2862 1.1.1.2 joerg 2863 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>></td><td class="name" onclick="toggle('equals5')"><a name="equals5Anchor">equals</a></td><td>bool Value</td></tr> 2864 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="equals5"><pre></pre></td></tr> 2865 1.1.1.2 joerg 2866 1.1.1.2 joerg 2867 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>></td><td class="name" onclick="toggle('equals2')"><a name="equals2Anchor">equals</a></td><td>const ValueT Value</td></tr> 2868 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="equals2"><pre>Matches literals that are equal to the given value of type ValueT. 2869 1.1.1.2 joerg 2870 1.1.1.2 joerg Given 2871 1.1.1.2 joerg f('false, 3.14, 42); 2872 1.1 joerg characterLiteral(equals(0)) 2873 1.1 joerg matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0)) 2874 1.1 joerg match false 2875 1.1 joerg floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2)) 2876 1.1 joerg match 3.14 2877 1.1 joerg integerLiteral(equals(42)) 2878 1.1 joerg matches 42 2879 1.1 joerg 2880 1.1 joerg Note that you cannot directly match a negative numeric literal because the 2881 1.1 joerg minus sign is not part of the literal: It is a unary operator whose operand 2882 1.1 joerg is the positive numeric literal. Instead, you must use a unaryOperator() 2883 1.1 joerg matcher to match the minus sign: 2884 1.1 joerg 2885 1.1 joerg unaryOperator(hasOperatorName("-"), 2886 1.1 joerg hasUnaryOperand(integerLiteral(equals(13)))) 2887 1.1 joerg 2888 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>>, 2889 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>> 2890 1.1 joerg </pre></td></tr> 2891 1.1 joerg 2892 1.1 joerg 2893 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>></td><td class="name" onclick="toggle('equals11')"><a name="equals11Anchor">equals</a></td><td>double Value</td></tr> 2894 1.1 joerg <tr><td colspan="4" class="doc" id="equals11"><pre></pre></td></tr> 2895 1.1 joerg 2896 1.1 joerg 2897 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>></td><td class="name" onclick="toggle('equals8')"><a name="equals8Anchor">equals</a></td><td>unsigned Value</td></tr> 2898 1.1 joerg <tr><td colspan="4" class="doc" id="equals8"><pre></pre></td></tr> 2899 1.1 joerg 2900 1.1 joerg 2901 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCatchStmt.html">CXXCatchStmt</a>></td><td class="name" onclick="toggle('isCatchAll0')"><a name="isCatchAll0Anchor">isCatchAll</a></td><td></td></tr> 2902 1.1 joerg <tr><td colspan="4" class="doc" id="isCatchAll0"><pre>Matches a C++ catch statement that has a catch-all handler. 2903 1.1 joerg 2904 1.1 joerg Given 2905 1.1 joerg try { 2906 1.1 joerg // ... 2907 1.1 joerg } catch (int) { 2908 1.1 joerg // ... 2909 1.1 joerg } catch (...) { 2910 1.1 joerg // ... 2911 1.1 joerg } 2912 1.1 joerg cxxCatchStmt(isCatchAll()) matches catch(...) but not catch(int). 2913 1.1 joerg </pre></td></tr> 2914 1.1 joerg 2915 1.1 joerg 2916 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>></td><td class="name" onclick="toggle('argumentCountIs1')"><a name="argumentCountIs1Anchor">argumentCountIs</a></td><td>unsigned N</td></tr> 2917 1.1 joerg <tr><td colspan="4" class="doc" id="argumentCountIs1"><pre>Checks that a call expression or a constructor call expression has 2918 1.1 joerg a specific number of arguments (including absent default arguments). 2919 1.1 joerg 2920 1.1 joerg Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2))) 2921 1.1 joerg void f(int x, int y); 2922 1.1 joerg f(0, 0); 2923 1.1 joerg </pre></td></tr> 2924 1.1 joerg 2925 1.1 joerg 2926 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>></td><td class="name" onclick="toggle('isListInitialization0')"><a name="isListInitialization0Anchor">isListInitialization</a></td><td></td></tr> 2927 1.1 joerg <tr><td colspan="4" class="doc" id="isListInitialization0"><pre>Matches a constructor call expression which uses list initialization. 2928 1.1 joerg </pre></td></tr> 2929 1.1 joerg 2930 1.1 joerg 2931 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>></td><td class="name" onclick="toggle('requiresZeroInitialization0')"><a name="requiresZeroInitialization0Anchor">requiresZeroInitialization</a></td><td></td></tr> 2932 1.1 joerg <tr><td colspan="4" class="doc" id="requiresZeroInitialization0"><pre>Matches a constructor call expression which requires 2933 1.1 joerg zero initialization. 2934 1.1 joerg 2935 1.1 joerg Given 2936 1.1 joerg void foo() { 2937 1.1 joerg struct point { double x; double y; }; 2938 1.1 joerg point pt[2] = { { 1.0, 2.0 } }; 2939 1.1 joerg } 2940 1.1 joerg initListExpr(has(cxxConstructExpr(requiresZeroInitialization())) 2941 1.1 joerg will match the implicit array filler for pt[1]. 2942 1.1 joerg </pre></td></tr> 2943 1.1 joerg 2944 1.1 joerg 2945 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>></td><td class="name" onclick="toggle('isCopyConstructor0')"><a name="isCopyConstructor0Anchor">isCopyConstructor</a></td><td></td></tr> 2946 1.1 joerg <tr><td colspan="4" class="doc" id="isCopyConstructor0"><pre>Matches constructor declarations that are copy constructors. 2947 1.1 joerg 2948 1.1 joerg Given 2949 1.1 joerg struct S { 2950 1.1 joerg S(); // #1 2951 1.1 joerg S(const S &); // #2 2952 1.1 joerg S(S &&); // #3 2953 1.1 joerg }; 2954 1.1 joerg cxxConstructorDecl(isCopyConstructor()) will match #2, but not #1 or #3. 2955 1.1 joerg </pre></td></tr> 2956 1.1 joerg 2957 1.1 joerg 2958 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>></td><td class="name" onclick="toggle('isDefaultConstructor0')"><a name="isDefaultConstructor0Anchor">isDefaultConstructor</a></td><td></td></tr> 2959 1.1 joerg <tr><td colspan="4" class="doc" id="isDefaultConstructor0"><pre>Matches constructor declarations that are default constructors. 2960 1.1 joerg 2961 1.1 joerg Given 2962 1.1 joerg struct S { 2963 1.1 joerg S(); // #1 2964 1.1 joerg S(const S &); // #2 2965 1.1 joerg S(S &&); // #3 2966 1.1 joerg }; 2967 1.1 joerg cxxConstructorDecl(isDefaultConstructor()) will match #1, but not #2 or #3. 2968 1.1 joerg </pre></td></tr> 2969 1.1 joerg 2970 1.1 joerg 2971 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>></td><td class="name" onclick="toggle('isDelegatingConstructor0')"><a name="isDelegatingConstructor0Anchor">isDelegatingConstructor</a></td><td></td></tr> 2972 1.1 joerg <tr><td colspan="4" class="doc" id="isDelegatingConstructor0"><pre>Matches constructors that delegate to another constructor. 2973 1.1 joerg 2974 1.1 joerg Given 2975 1.1 joerg struct S { 2976 1.1 joerg S(); // #1 2977 1.1 joerg S(int) {} // #2 2978 1.1 joerg S(S &&) : S() {} // #3 2979 1.1 joerg }; 2980 1.1 joerg S::S() : S(0) {} // #4 2981 1.1 joerg cxxConstructorDecl(isDelegatingConstructor()) will match #3 and #4, but not 2982 1.1 joerg #1 or #2. 2983 1.1 joerg </pre></td></tr> 2984 1.1 joerg 2985 1.1 joerg 2986 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>></td><td class="name" onclick="toggle('isExplicit0')"><a name="isExplicit0Anchor">isExplicit</a></td><td></td></tr> 2987 1.1 joerg <tr><td colspan="4" class="doc" id="isExplicit0"><pre>Matches constructor, conversion function, and deduction guide declarations 2988 1.1 joerg that have an explicit specifier if this explicit specifier is resolved to 2989 1.1 joerg true. 2990 1.1 joerg 2991 1.1 joerg Given 2992 1.1 joerg template<bool b> 2993 1.1 joerg struct S { 2994 1.1 joerg S(int); // #1 2995 1.1 joerg explicit S(double); // #2 2996 1.1 joerg operator int(); // #3 2997 1.1 joerg explicit operator bool(); // #4 2998 1.1 joerg explicit(false) S(bool) // # 7 2999 1.1 joerg explicit(true) S(char) // # 8 3000 1.1 joerg explicit(b) S(S) // # 9 3001 1.1 joerg }; 3002 1.1 joerg S(int) -> S<true> // #5 3003 1.1 joerg explicit S(double) -> S<false> // #6 3004 1.1 joerg cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9. 3005 1.1 joerg cxxConversionDecl(isExplicit()) will match #4, but not #3. 3006 1.1 joerg cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5. 3007 1.1 joerg </pre></td></tr> 3008 1.1 joerg 3009 1.1 joerg 3010 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>></td><td class="name" onclick="toggle('isMoveConstructor0')"><a name="isMoveConstructor0Anchor">isMoveConstructor</a></td><td></td></tr> 3011 1.1 joerg <tr><td colspan="4" class="doc" id="isMoveConstructor0"><pre>Matches constructor declarations that are move constructors. 3012 1.1 joerg 3013 1.1 joerg Given 3014 1.1 joerg struct S { 3015 1.1 joerg S(); // #1 3016 1.1 joerg S(const S &); // #2 3017 1.1 joerg S(S &&); // #3 3018 1.1 joerg }; 3019 1.1 joerg cxxConstructorDecl(isMoveConstructor()) will match #3, but not #1 or #2. 3020 1.1 joerg </pre></td></tr> 3021 1.1 joerg 3022 1.1 joerg 3023 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConversionDecl.html">CXXConversionDecl</a>></td><td class="name" onclick="toggle('isExplicit1')"><a name="isExplicit1Anchor">isExplicit</a></td><td></td></tr> 3024 1.1 joerg <tr><td colspan="4" class="doc" id="isExplicit1"><pre>Matches constructor, conversion function, and deduction guide declarations 3025 1.1 joerg that have an explicit specifier if this explicit specifier is resolved to 3026 1.1 joerg true. 3027 1.1 joerg 3028 1.1 joerg Given 3029 1.1 joerg template<bool b> 3030 1.1 joerg struct S { 3031 1.1 joerg S(int); // #1 3032 1.1 joerg explicit S(double); // #2 3033 1.1 joerg operator int(); // #3 3034 1.1 joerg explicit operator bool(); // #4 3035 1.1 joerg explicit(false) S(bool) // # 7 3036 1.1 joerg explicit(true) S(char) // # 8 3037 1.1 joerg explicit(b) S(S) // # 9 3038 1.1 joerg }; 3039 1.1 joerg S(int) -> S<true> // #5 3040 1.1 joerg explicit S(double) -> S<false> // #6 3041 1.1 joerg cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9. 3042 1.1 joerg cxxConversionDecl(isExplicit()) will match #4, but not #3. 3043 1.1 joerg cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5. 3044 1.1 joerg </pre></td></tr> 3045 1.1 joerg 3046 1.1 joerg 3047 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>></td><td class="name" onclick="toggle('isBaseInitializer0')"><a name="isBaseInitializer0Anchor">isBaseInitializer</a></td><td></td></tr> 3048 1.1 joerg <tr><td colspan="4" class="doc" id="isBaseInitializer0"><pre>Matches a constructor initializer if it is initializing a base, as 3049 1.1 joerg opposed to a member. 3050 1.1 joerg 3051 1.1 joerg Given 3052 1.1 joerg struct B {}; 3053 1.1 joerg struct D : B { 3054 1.1 joerg int I; 3055 1.1 joerg D(int i) : I(i) {} 3056 1.1 joerg }; 3057 1.1 joerg struct E : B { 3058 1.1 joerg E() : B() {} 3059 1.1 joerg }; 3060 1.1 joerg cxxConstructorDecl(hasAnyConstructorInitializer(isBaseInitializer())) 3061 1.1 joerg will match E(), but not match D(int). 3062 1.1 joerg </pre></td></tr> 3063 1.1 joerg 3064 1.1 joerg 3065 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>></td><td class="name" onclick="toggle('isMemberInitializer0')"><a name="isMemberInitializer0Anchor">isMemberInitializer</a></td><td></td></tr> 3066 1.1 joerg <tr><td colspan="4" class="doc" id="isMemberInitializer0"><pre>Matches a constructor initializer if it is initializing a member, as 3067 1.1 joerg opposed to a base. 3068 1.1 joerg 3069 1.1 joerg Given 3070 1.1 joerg struct B {}; 3071 1.1 joerg struct D : B { 3072 1.1 joerg int I; 3073 1.1 joerg D(int i) : I(i) {} 3074 1.1 joerg }; 3075 1.1 joerg struct E : B { 3076 1.1 joerg E() : B() {} 3077 1.1 joerg }; 3078 1.1 joerg cxxConstructorDecl(hasAnyConstructorInitializer(isMemberInitializer())) 3079 1.1 joerg will match D(int), but not match E(). 3080 1.1 joerg </pre></td></tr> 3081 1.1 joerg 3082 1.1 joerg 3083 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>></td><td class="name" onclick="toggle('isWritten0')"><a name="isWritten0Anchor">isWritten</a></td><td></td></tr> 3084 1.1 joerg <tr><td colspan="4" class="doc" id="isWritten0"><pre>Matches a constructor initializer if it is explicitly written in 3085 1.1 joerg code (as opposed to implicitly added by the compiler). 3086 1.1 joerg 3087 1.1 joerg Given 3088 1.1 joerg struct Foo { 3089 1.1 joerg Foo() { } 3090 1.1 joerg Foo(int) : foo_("A") { } 3091 1.1 joerg string foo_; 3092 1.1 joerg }; 3093 1.1 joerg cxxConstructorDecl(hasAnyConstructorInitializer(isWritten())) 3094 1.1 joerg will match Foo(int), but not Foo() 3095 1.1 joerg </pre></td></tr> 3096 1.1 joerg 3097 1.1 joerg 3098 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDeductionGuideDecl.html">CXXDeductionGuideDecl</a>></td><td class="name" onclick="toggle('isExplicit2')"><a name="isExplicit2Anchor">isExplicit</a></td><td></td></tr> 3099 1.1 joerg <tr><td colspan="4" class="doc" id="isExplicit2"><pre>Matches constructor, conversion function, and deduction guide declarations 3100 1.1 joerg that have an explicit specifier if this explicit specifier is resolved to 3101 1.1 joerg true. 3102 1.1 joerg 3103 1.1 joerg Given 3104 1.1 joerg template<bool b> 3105 1.1 joerg struct S { 3106 1.1 joerg S(int); // #1 3107 1.1 joerg explicit S(double); // #2 3108 1.1 joerg operator int(); // #3 3109 1.1 joerg explicit operator bool(); // #4 3110 1.1 joerg explicit(false) S(bool) // # 7 3111 1.1 joerg explicit(true) S(char) // # 8 3112 1.1 joerg explicit(b) S(S) // # 9 3113 1.1 joerg }; 3114 1.1 joerg S(int) -> S<true> // #5 3115 1.1 joerg explicit S(double) -> S<false> // #6 3116 1.1 joerg cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9. 3117 1.1 joerg cxxConversionDecl(isExplicit()) will match #4, but not #3. 3118 1.1 joerg cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5. 3119 1.1 joerg </pre></td></tr> 3120 1.1 joerg 3121 1.1 joerg 3122 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDependentScopeMemberExpr.html">CXXDependentScopeMemberExpr</a>></td><td class="name" onclick="toggle('hasMemberName0')"><a name="hasMemberName0Anchor">hasMemberName</a></td><td>std::string N</td></tr> 3123 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasMemberName0"><pre>Matches template-dependent, but known, member names. 3124 1.1.1.2 joerg 3125 1.1.1.2 joerg In template declarations, dependent members are not resolved and so can 3126 1.1.1.2 joerg not be matched to particular named declarations. 3127 1.1.1.2 joerg 3128 1.1.1.2 joerg This matcher allows to match on the known name of members. 3129 1.1.1.2 joerg 3130 1.1.1.2 joerg Given 3131 1.1.1.2 joerg template <typename T> 3132 1.1.1.2 joerg struct S { 3133 1.1.1.2 joerg void mem(); 3134 1.1.1.2 joerg }; 3135 1.1.1.2 joerg template <typename T> 3136 1.1.1.2 joerg void x() { 3137 1.1.1.2 joerg S<T> s; 3138 1.1.1.2 joerg s.mem(); 3139 1.1.1.2 joerg } 3140 1.1.1.2 joerg cxxDependentScopeMemberExpr(hasMemberName("mem")) matches `s.mem()` 3141 1.1.1.2 joerg </pre></td></tr> 3142 1.1.1.2 joerg 3143 1.1.1.2 joerg 3144 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDependentScopeMemberExpr.html">CXXDependentScopeMemberExpr</a>></td><td class="name" onclick="toggle('isArrow2')"><a name="isArrow2Anchor">isArrow</a></td><td></td></tr> 3145 1.1 joerg <tr><td colspan="4" class="doc" id="isArrow2"><pre>Matches member expressions that are called with '->' as opposed 3146 1.1 joerg to '.'. 3147 1.1 joerg 3148 1.1 joerg Member calls on the implicit this pointer match as called with '->'. 3149 1.1 joerg 3150 1.1 joerg Given 3151 1.1 joerg class Y { 3152 1.1 joerg void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; } 3153 1.1 joerg template <class T> void f() { this->f<T>(); f<T>(); } 3154 1.1 joerg int a; 3155 1.1 joerg static int b; 3156 1.1 joerg }; 3157 1.1 joerg template <class T> 3158 1.1 joerg class Z { 3159 1.1 joerg void x() { this->m; } 3160 1.1 joerg }; 3161 1.1 joerg memberExpr(isArrow()) 3162 1.1 joerg matches this->x, x, y.x, a, this->b 3163 1.1 joerg cxxDependentScopeMemberExpr(isArrow()) 3164 1.1 joerg matches this->m 3165 1.1 joerg unresolvedMemberExpr(isArrow()) 3166 1.1 joerg matches this->f<T>, f<T> 3167 1.1 joerg </pre></td></tr> 3168 1.1 joerg 3169 1.1 joerg 3170 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDependentScopeMemberExpr.html">CXXDependentScopeMemberExpr</a>></td><td class="name" onclick="toggle('memberHasSameNameAsBoundNode0')"><a name="memberHasSameNameAsBoundNode0Anchor">memberHasSameNameAsBoundNode</a></td><td>std::string BindingID</td></tr> 3171 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="memberHasSameNameAsBoundNode0"><pre>Matches template-dependent, but known, member names against an already-bound 3172 1.1.1.2 joerg node 3173 1.1.1.2 joerg 3174 1.1.1.2 joerg In template declarations, dependent members are not resolved and so can 3175 1.1.1.2 joerg not be matched to particular named declarations. 3176 1.1.1.2 joerg 3177 1.1.1.2 joerg This matcher allows to match on the name of already-bound VarDecl, FieldDecl 3178 1.1.1.2 joerg and CXXMethodDecl nodes. 3179 1.1.1.2 joerg 3180 1.1.1.2 joerg Given 3181 1.1.1.2 joerg template <typename T> 3182 1.1.1.2 joerg struct S { 3183 1.1.1.2 joerg void mem(); 3184 1.1.1.2 joerg }; 3185 1.1.1.2 joerg template <typename T> 3186 1.1.1.2 joerg void x() { 3187 1.1.1.2 joerg S<T> s; 3188 1.1.1.2 joerg s.mem(); 3189 1.1.1.2 joerg } 3190 1.1.1.2 joerg The matcher 3191 1.1.1.2 joerg @code 3192 1.1.1.2 joerg cxxDependentScopeMemberExpr( 3193 1.1.1.2 joerg hasObjectExpression(declRefExpr(hasType(templateSpecializationType( 3194 1.1.1.2 joerg hasDeclaration(classTemplateDecl(has(cxxRecordDecl(has( 3195 1.1.1.2 joerg cxxMethodDecl(hasName("mem")).bind("templMem") 3196 1.1.1.2 joerg ))))) 3197 1.1.1.2 joerg )))), 3198 1.1.1.2 joerg memberHasSameNameAsBoundNode("templMem") 3199 1.1.1.2 joerg ) 3200 1.1.1.2 joerg @endcode 3201 1.1.1.2 joerg first matches and binds the @c mem member of the @c S template, then 3202 1.1.1.2 joerg compares its name to the usage in @c s.mem() in the @c x function template 3203 1.1.1.2 joerg </pre></td></tr> 3204 1.1.1.2 joerg 3205 1.1.1.2 joerg 3206 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>></td><td class="name" onclick="toggle('isConst0')"><a name="isConst0Anchor">isConst</a></td><td></td></tr> 3207 1.1 joerg <tr><td colspan="4" class="doc" id="isConst0"><pre>Matches if the given method declaration is const. 3208 1.1 joerg 3209 1.1 joerg Given 3210 1.1 joerg struct A { 3211 1.1 joerg void foo() const; 3212 1.1 joerg void bar(); 3213 1.1 joerg }; 3214 1.1 joerg 3215 1.1 joerg cxxMethodDecl(isConst()) matches A::foo() but not A::bar() 3216 1.1 joerg </pre></td></tr> 3217 1.1 joerg 3218 1.1 joerg 3219 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>></td><td class="name" onclick="toggle('isCopyAssignmentOperator0')"><a name="isCopyAssignmentOperator0Anchor">isCopyAssignmentOperator</a></td><td></td></tr> 3220 1.1 joerg <tr><td colspan="4" class="doc" id="isCopyAssignmentOperator0"><pre>Matches if the given method declaration declares a copy assignment 3221 1.1 joerg operator. 3222 1.1 joerg 3223 1.1 joerg Given 3224 1.1 joerg struct A { 3225 1.1 joerg A &operator=(const A &); 3226 1.1 joerg A &operator=(A &&); 3227 1.1 joerg }; 3228 1.1 joerg 3229 1.1 joerg cxxMethodDecl(isCopyAssignmentOperator()) matches the first method but not 3230 1.1 joerg the second one. 3231 1.1 joerg </pre></td></tr> 3232 1.1 joerg 3233 1.1 joerg 3234 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>></td><td class="name" onclick="toggle('isFinal1')"><a name="isFinal1Anchor">isFinal</a></td><td></td></tr> 3235 1.1 joerg <tr><td colspan="4" class="doc" id="isFinal1"><pre>Matches if the given method or class declaration is final. 3236 1.1 joerg 3237 1.1 joerg Given: 3238 1.1 joerg class A final {}; 3239 1.1 joerg 3240 1.1 joerg struct B { 3241 1.1 joerg virtual void f(); 3242 1.1 joerg }; 3243 1.1 joerg 3244 1.1 joerg struct C : B { 3245 1.1 joerg void f() final; 3246 1.1 joerg }; 3247 1.1 joerg matches A and C::f, but not B, C, or B::f 3248 1.1 joerg </pre></td></tr> 3249 1.1 joerg 3250 1.1 joerg 3251 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>></td><td class="name" onclick="toggle('isMoveAssignmentOperator0')"><a name="isMoveAssignmentOperator0Anchor">isMoveAssignmentOperator</a></td><td></td></tr> 3252 1.1 joerg <tr><td colspan="4" class="doc" id="isMoveAssignmentOperator0"><pre>Matches if the given method declaration declares a move assignment 3253 1.1 joerg operator. 3254 1.1 joerg 3255 1.1 joerg Given 3256 1.1 joerg struct A { 3257 1.1 joerg A &operator=(const A &); 3258 1.1 joerg A &operator=(A &&); 3259 1.1 joerg }; 3260 1.1 joerg 3261 1.1 joerg cxxMethodDecl(isMoveAssignmentOperator()) matches the second method but not 3262 1.1 joerg the first one. 3263 1.1 joerg </pre></td></tr> 3264 1.1 joerg 3265 1.1 joerg 3266 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>></td><td class="name" onclick="toggle('isOverride0')"><a name="isOverride0Anchor">isOverride</a></td><td></td></tr> 3267 1.1 joerg <tr><td colspan="4" class="doc" id="isOverride0"><pre>Matches if the given method declaration overrides another method. 3268 1.1 joerg 3269 1.1 joerg Given 3270 1.1 joerg class A { 3271 1.1 joerg public: 3272 1.1 joerg virtual void x(); 3273 1.1 joerg }; 3274 1.1 joerg class B : public A { 3275 1.1 joerg public: 3276 1.1 joerg virtual void x(); 3277 1.1 joerg }; 3278 1.1 joerg matches B::x 3279 1.1 joerg </pre></td></tr> 3280 1.1 joerg 3281 1.1 joerg 3282 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>></td><td class="name" onclick="toggle('isPure0')"><a name="isPure0Anchor">isPure</a></td><td></td></tr> 3283 1.1 joerg <tr><td colspan="4" class="doc" id="isPure0"><pre>Matches if the given method declaration is pure. 3284 1.1 joerg 3285 1.1 joerg Given 3286 1.1 joerg class A { 3287 1.1 joerg public: 3288 1.1 joerg virtual void x() = 0; 3289 1.1 joerg }; 3290 1.1 joerg matches A::x 3291 1.1 joerg </pre></td></tr> 3292 1.1 joerg 3293 1.1 joerg 3294 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>></td><td class="name" onclick="toggle('isUserProvided0')"><a name="isUserProvided0Anchor">isUserProvided</a></td><td></td></tr> 3295 1.1 joerg <tr><td colspan="4" class="doc" id="isUserProvided0"><pre>Matches method declarations that are user-provided. 3296 1.1 joerg 3297 1.1 joerg Given 3298 1.1 joerg struct S { 3299 1.1 joerg S(); // #1 3300 1.1 joerg S(const S &) = default; // #2 3301 1.1 joerg S(S &&) = delete; // #3 3302 1.1 joerg }; 3303 1.1 joerg cxxConstructorDecl(isUserProvided()) will match #1, but not #2 or #3. 3304 1.1 joerg </pre></td></tr> 3305 1.1 joerg 3306 1.1 joerg 3307 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>></td><td class="name" onclick="toggle('isVirtual0')"><a name="isVirtual0Anchor">isVirtual</a></td><td></td></tr> 3308 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="isVirtual0"><pre>Matches declarations of virtual methods and C++ base specifers that specify 3309 1.1.1.2 joerg virtual inheritance. 3310 1.1 joerg 3311 1.1.1.2 joerg Example: 3312 1.1 joerg class A { 3313 1.1 joerg public: 3314 1.1.1.2 joerg virtual void x(); // matches x 3315 1.1 joerg }; 3316 1.1.1.2 joerg 3317 1.1.1.2 joerg Example: 3318 1.1.1.2 joerg class Base {}; 3319 1.1.1.2 joerg class DirectlyDerived : virtual Base {}; // matches Base 3320 1.1.1.2 joerg class IndirectlyDerived : DirectlyDerived, Base {}; // matches Base 3321 1.1.1.2 joerg 3322 1.1.1.2 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>> 3323 1.1 joerg </pre></td></tr> 3324 1.1 joerg 3325 1.1 joerg 3326 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>></td><td class="name" onclick="toggle('isVirtualAsWritten0')"><a name="isVirtualAsWritten0Anchor">isVirtualAsWritten</a></td><td></td></tr> 3327 1.1 joerg <tr><td colspan="4" class="doc" id="isVirtualAsWritten0"><pre>Matches if the given method declaration has an explicit "virtual". 3328 1.1 joerg 3329 1.1 joerg Given 3330 1.1 joerg class A { 3331 1.1 joerg public: 3332 1.1 joerg virtual void x(); 3333 1.1 joerg }; 3334 1.1 joerg class B : public A { 3335 1.1 joerg public: 3336 1.1 joerg void x(); 3337 1.1 joerg }; 3338 1.1 joerg matches A::x but not B::x 3339 1.1 joerg </pre></td></tr> 3340 1.1 joerg 3341 1.1 joerg 3342 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>></td><td class="name" onclick="toggle('isArray0')"><a name="isArray0Anchor">isArray</a></td><td></td></tr> 3343 1.1 joerg <tr><td colspan="4" class="doc" id="isArray0"><pre>Matches array new expressions. 3344 1.1 joerg 3345 1.1 joerg Given: 3346 1.1 joerg MyClass *p1 = new MyClass[10]; 3347 1.1 joerg cxxNewExpr(isArray()) 3348 1.1 joerg matches the expression 'new MyClass[10]'. 3349 1.1 joerg </pre></td></tr> 3350 1.1 joerg 3351 1.1 joerg 3352 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>></td><td class="name" onclick="toggle('hasAnyOperatorName1')"><a name="hasAnyOperatorName1Anchor">hasAnyOperatorName</a></td><td>StringRef, ..., StringRef</td></tr> 3353 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasAnyOperatorName1"><pre>Matches operator expressions (binary or unary) that have any of the 3354 1.1.1.2 joerg specified names. 3355 1.1.1.2 joerg 3356 1.1.1.2 joerg hasAnyOperatorName("+", "-") 3357 1.1.1.2 joerg Is equivalent to 3358 1.1.1.2 joerg anyOf(hasOperatorName("+"), hasOperatorName("-")) 3359 1.1.1.2 joerg </pre></td></tr> 3360 1.1.1.2 joerg 3361 1.1.1.2 joerg 3362 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>></td><td class="name" onclick="toggle('hasAnyOverloadedOperatorName0')"><a name="hasAnyOverloadedOperatorName0Anchor">hasAnyOverloadedOperatorName</a></td><td>StringRef, ..., StringRef</td></tr> 3363 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasAnyOverloadedOperatorName0"><pre>Matches overloaded operator names. 3364 1.1.1.2 joerg 3365 1.1.1.2 joerg Matches overloaded operator names specified in strings without the 3366 1.1.1.2 joerg "operator" prefix: e.g. "<<". 3367 1.1.1.2 joerg 3368 1.1.1.2 joerg hasAnyOverloadedOperatorName("+", "-") 3369 1.1.1.2 joerg Is equivalent to 3370 1.1.1.2 joerg anyOf(hasOverloadedOperatorName("+"), hasOverloadedOperatorName("-")) 3371 1.1.1.2 joerg </pre></td></tr> 3372 1.1.1.2 joerg 3373 1.1.1.2 joerg 3374 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>></td><td class="name" onclick="toggle('hasOperatorName1')"><a name="hasOperatorName1Anchor">hasOperatorName</a></td><td>std::string Name</td></tr> 3375 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasOperatorName1"><pre>Matches the operator Name of operator expressions (binary or 3376 1.1.1.2 joerg unary). 3377 1.1.1.2 joerg 3378 1.1.1.2 joerg Example matches a || b (matcher = binaryOperator(hasOperatorName("||"))) 3379 1.1.1.2 joerg !(a || b) 3380 1.1.1.2 joerg </pre></td></tr> 3381 1.1.1.2 joerg 3382 1.1.1.2 joerg 3383 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>></td><td class="name" onclick="toggle('hasOverloadedOperatorName1')"><a name="hasOverloadedOperatorName1Anchor">hasOverloadedOperatorName</a></td><td>StringRef Name</td></tr> 3384 1.1 joerg <tr><td colspan="4" class="doc" id="hasOverloadedOperatorName1"><pre>Matches overloaded operator names. 3385 1.1 joerg 3386 1.1 joerg Matches overloaded operator names specified in strings without the 3387 1.1 joerg "operator" prefix: e.g. "<<". 3388 1.1 joerg 3389 1.1 joerg Given: 3390 1.1 joerg class A { int operator*(); }; 3391 1.1 joerg const A &operator<<(const A &a, const A &b); 3392 1.1 joerg A a; 3393 1.1 joerg a << a; // <-- This matches 3394 1.1 joerg 3395 1.1 joerg cxxOperatorCallExpr(hasOverloadedOperatorName("<<"))) matches the 3396 1.1 joerg specified line and 3397 1.1 joerg cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*"))) 3398 1.1 joerg matches the declaration of A. 3399 1.1 joerg 3400 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>> 3401 1.1 joerg </pre></td></tr> 3402 1.1 joerg 3403 1.1 joerg 3404 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>></td><td class="name" onclick="toggle('isAssignmentOperator1')"><a name="isAssignmentOperator1Anchor">isAssignmentOperator</a></td><td></td></tr> 3405 1.1 joerg <tr><td colspan="4" class="doc" id="isAssignmentOperator1"><pre>Matches all kinds of assignment operators. 3406 1.1 joerg 3407 1.1 joerg Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator())) 3408 1.1 joerg if (a == b) 3409 1.1 joerg a += b; 3410 1.1 joerg 3411 1.1 joerg Example 2: matches s1 = s2 3412 1.1 joerg (matcher = cxxOperatorCallExpr(isAssignmentOperator())) 3413 1.1 joerg struct S { S& operator=(const S&); }; 3414 1.1.1.2 joerg void x() { S s1, s2; s1 = s2; } 3415 1.1.1.2 joerg </pre></td></tr> 3416 1.1.1.2 joerg 3417 1.1.1.2 joerg 3418 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>></td><td class="name" onclick="toggle('isComparisonOperator1')"><a name="isComparisonOperator1Anchor">isComparisonOperator</a></td><td></td></tr> 3419 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="isComparisonOperator1"><pre>Matches comparison operators. 3420 1.1.1.2 joerg 3421 1.1.1.2 joerg Example 1: matches a == b (matcher = binaryOperator(isComparisonOperator())) 3422 1.1.1.2 joerg if (a == b) 3423 1.1.1.2 joerg a += b; 3424 1.1.1.2 joerg 3425 1.1.1.2 joerg Example 2: matches s1 < s2 3426 1.1.1.2 joerg (matcher = cxxOperatorCallExpr(isComparisonOperator())) 3427 1.1.1.2 joerg struct S { bool operator<(const S& other); }; 3428 1.1.1.2 joerg void x(S s1, S s2) { bool b1 = s1 < s2; } 3429 1.1 joerg </pre></td></tr> 3430 1.1 joerg 3431 1.1 joerg 3432 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('hasDefinition0')"><a name="hasDefinition0Anchor">hasDefinition</a></td><td></td></tr> 3433 1.1 joerg <tr><td colspan="4" class="doc" id="hasDefinition0"><pre>Matches a class declaration that is defined. 3434 1.1 joerg 3435 1.1 joerg Example matches x (matcher = cxxRecordDecl(hasDefinition())) 3436 1.1 joerg class x {}; 3437 1.1 joerg class y; 3438 1.1 joerg </pre></td></tr> 3439 1.1 joerg 3440 1.1 joerg 3441 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('isDerivedFrom2')"><a name="isDerivedFrom2Anchor">isDerivedFrom</a></td><td>std::string BaseName</td></tr> 3442 1.1 joerg <tr><td colspan="4" class="doc" id="isDerivedFrom2"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)). 3443 1.1 joerg </pre></td></tr> 3444 1.1 joerg 3445 1.1 joerg 3446 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('isDirectlyDerivedFrom2')"><a name="isDirectlyDerivedFrom2Anchor">isDirectlyDerivedFrom</a></td><td>std::string BaseName</td></tr> 3447 1.1 joerg <tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom2"><pre>Overloaded method as shortcut for isDirectlyDerivedFrom(hasName(...)). 3448 1.1 joerg </pre></td></tr> 3449 1.1 joerg 3450 1.1 joerg 3451 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('isExplicitTemplateSpecialization2')"><a name="isExplicitTemplateSpecialization2Anchor">isExplicitTemplateSpecialization</a></td><td></td></tr> 3452 1.1 joerg <tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization2"><pre>Matches explicit template specializations of function, class, or 3453 1.1 joerg static member variable template instantiations. 3454 1.1 joerg 3455 1.1 joerg Given 3456 1.1 joerg template<typename T> void A(T t) { } 3457 1.1 joerg template<> void A(int N) { } 3458 1.1 joerg functionDecl(isExplicitTemplateSpecialization()) 3459 1.1 joerg matches the specialization A<int>(). 3460 1.1 joerg 3461 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>> 3462 1.1 joerg </pre></td></tr> 3463 1.1 joerg 3464 1.1 joerg 3465 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('isFinal0')"><a name="isFinal0Anchor">isFinal</a></td><td></td></tr> 3466 1.1 joerg <tr><td colspan="4" class="doc" id="isFinal0"><pre>Matches if the given method or class declaration is final. 3467 1.1 joerg 3468 1.1 joerg Given: 3469 1.1 joerg class A final {}; 3470 1.1 joerg 3471 1.1 joerg struct B { 3472 1.1 joerg virtual void f(); 3473 1.1 joerg }; 3474 1.1 joerg 3475 1.1 joerg struct C : B { 3476 1.1 joerg void f() final; 3477 1.1 joerg }; 3478 1.1 joerg matches A and C::f, but not B, C, or B::f 3479 1.1 joerg </pre></td></tr> 3480 1.1 joerg 3481 1.1 joerg 3482 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('isLambda0')"><a name="isLambda0Anchor">isLambda</a></td><td></td></tr> 3483 1.1 joerg <tr><td colspan="4" class="doc" id="isLambda0"><pre>Matches the generated class of lambda expressions. 3484 1.1 joerg 3485 1.1 joerg Given: 3486 1.1 joerg auto x = []{}; 3487 1.1 joerg 3488 1.1 joerg cxxRecordDecl(isLambda()) matches the implicit class declaration of 3489 1.1 joerg decltype(x) 3490 1.1 joerg </pre></td></tr> 3491 1.1 joerg 3492 1.1 joerg 3493 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('isSameOrDerivedFrom2')"><a name="isSameOrDerivedFrom2Anchor">isSameOrDerivedFrom</a></td><td>std::string BaseName</td></tr> 3494 1.1 joerg <tr><td colspan="4" class="doc" id="isSameOrDerivedFrom2"><pre>Overloaded method as shortcut for 3495 1.1 joerg isSameOrDerivedFrom(hasName(...)). 3496 1.1 joerg </pre></td></tr> 3497 1.1 joerg 3498 1.1 joerg 3499 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('isTemplateInstantiation2')"><a name="isTemplateInstantiation2Anchor">isTemplateInstantiation</a></td><td></td></tr> 3500 1.1 joerg <tr><td colspan="4" class="doc" id="isTemplateInstantiation2"><pre>Matches template instantiations of function, class, or static 3501 1.1 joerg member variable template instantiations. 3502 1.1 joerg 3503 1.1 joerg Given 3504 1.1 joerg template <typename T> class X {}; class A {}; X<A> x; 3505 1.1 joerg or 3506 1.1 joerg template <typename T> class X {}; class A {}; template class X<A>; 3507 1.1 joerg or 3508 1.1 joerg template <typename T> class X {}; class A {}; extern template class X<A>; 3509 1.1 joerg cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 3510 1.1 joerg matches the template instantiation of X<A>. 3511 1.1 joerg 3512 1.1 joerg But given 3513 1.1 joerg template <typename T> class X {}; class A {}; 3514 1.1 joerg template <> class X<A> {}; X<A> x; 3515 1.1 joerg cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 3516 1.1 joerg does not match, as X<A> is an explicit template specialization. 3517 1.1 joerg 3518 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>> 3519 1.1 joerg </pre></td></tr> 3520 1.1 joerg 3521 1.1 joerg 3522 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRewrittenBinaryOperator.html">CXXRewrittenBinaryOperator</a>></td><td class="name" onclick="toggle('hasAnyOperatorName2')"><a name="hasAnyOperatorName2Anchor">hasAnyOperatorName</a></td><td>StringRef, ..., StringRef</td></tr> 3523 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasAnyOperatorName2"><pre>Matches operator expressions (binary or unary) that have any of the 3524 1.1.1.2 joerg specified names. 3525 1.1.1.2 joerg 3526 1.1.1.2 joerg hasAnyOperatorName("+", "-") 3527 1.1.1.2 joerg Is equivalent to 3528 1.1.1.2 joerg anyOf(hasOperatorName("+"), hasOperatorName("-")) 3529 1.1.1.2 joerg </pre></td></tr> 3530 1.1.1.2 joerg 3531 1.1.1.2 joerg 3532 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRewrittenBinaryOperator.html">CXXRewrittenBinaryOperator</a>></td><td class="name" onclick="toggle('hasOperatorName2')"><a name="hasOperatorName2Anchor">hasOperatorName</a></td><td>std::string Name</td></tr> 3533 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasOperatorName2"><pre>Matches the operator Name of operator expressions (binary or 3534 1.1.1.2 joerg unary). 3535 1.1.1.2 joerg 3536 1.1.1.2 joerg Example matches a || b (matcher = binaryOperator(hasOperatorName("||"))) 3537 1.1.1.2 joerg !(a || b) 3538 1.1.1.2 joerg </pre></td></tr> 3539 1.1.1.2 joerg 3540 1.1.1.2 joerg 3541 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRewrittenBinaryOperator.html">CXXRewrittenBinaryOperator</a>></td><td class="name" onclick="toggle('isAssignmentOperator2')"><a name="isAssignmentOperator2Anchor">isAssignmentOperator</a></td><td></td></tr> 3542 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="isAssignmentOperator2"><pre>Matches all kinds of assignment operators. 3543 1.1.1.2 joerg 3544 1.1.1.2 joerg Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator())) 3545 1.1.1.2 joerg if (a == b) 3546 1.1.1.2 joerg a += b; 3547 1.1.1.2 joerg 3548 1.1.1.2 joerg Example 2: matches s1 = s2 3549 1.1.1.2 joerg (matcher = cxxOperatorCallExpr(isAssignmentOperator())) 3550 1.1.1.2 joerg struct S { S& operator=(const S&); }; 3551 1.1.1.2 joerg void x() { S s1, s2; s1 = s2; } 3552 1.1.1.2 joerg </pre></td></tr> 3553 1.1.1.2 joerg 3554 1.1.1.2 joerg 3555 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRewrittenBinaryOperator.html">CXXRewrittenBinaryOperator</a>></td><td class="name" onclick="toggle('isComparisonOperator2')"><a name="isComparisonOperator2Anchor">isComparisonOperator</a></td><td></td></tr> 3556 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="isComparisonOperator2"><pre>Matches comparison operators. 3557 1.1.1.2 joerg 3558 1.1.1.2 joerg Example 1: matches a == b (matcher = binaryOperator(isComparisonOperator())) 3559 1.1.1.2 joerg if (a == b) 3560 1.1.1.2 joerg a += b; 3561 1.1.1.2 joerg 3562 1.1.1.2 joerg Example 2: matches s1 < s2 3563 1.1.1.2 joerg (matcher = cxxOperatorCallExpr(isComparisonOperator())) 3564 1.1.1.2 joerg struct S { bool operator<(const S& other); }; 3565 1.1.1.2 joerg void x(S s1, S s2) { bool b1 = s1 < s2; } 3566 1.1.1.2 joerg </pre></td></tr> 3567 1.1.1.2 joerg 3568 1.1.1.2 joerg 3569 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>></td><td class="name" onclick="toggle('argumentCountIs2')"><a name="argumentCountIs2Anchor">argumentCountIs</a></td><td>unsigned N</td></tr> 3570 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="argumentCountIs2"><pre>Checks that a call expression or a constructor call expression has 3571 1.1.1.2 joerg a specific number of arguments (including absent default arguments). 3572 1.1.1.2 joerg 3573 1.1.1.2 joerg Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2))) 3574 1.1.1.2 joerg void f(int x, int y); 3575 1.1.1.2 joerg f(0, 0); 3576 1.1.1.2 joerg </pre></td></tr> 3577 1.1.1.2 joerg 3578 1.1.1.2 joerg 3579 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>></td><td class="name" onclick="toggle('argumentCountIs0')"><a name="argumentCountIs0Anchor">argumentCountIs</a></td><td>unsigned N</td></tr> 3580 1.1 joerg <tr><td colspan="4" class="doc" id="argumentCountIs0"><pre>Checks that a call expression or a constructor call expression has 3581 1.1 joerg a specific number of arguments (including absent default arguments). 3582 1.1 joerg 3583 1.1 joerg Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2))) 3584 1.1 joerg void f(int x, int y); 3585 1.1 joerg f(0, 0); 3586 1.1 joerg </pre></td></tr> 3587 1.1 joerg 3588 1.1 joerg 3589 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>></td><td class="name" onclick="toggle('usesADL0')"><a name="usesADL0Anchor">usesADL</a></td><td></td></tr> 3590 1.1 joerg <tr><td colspan="4" class="doc" id="usesADL0"><pre>Matches call expressions which were resolved using ADL. 3591 1.1 joerg 3592 1.1 joerg Example matches y(x) but not y(42) or NS::y(x). 3593 1.1 joerg namespace NS { 3594 1.1 joerg struct X {}; 3595 1.1 joerg void y(X); 3596 1.1 joerg } 3597 1.1 joerg 3598 1.1 joerg void y(...); 3599 1.1 joerg 3600 1.1 joerg void test() { 3601 1.1 joerg NS::X x; 3602 1.1 joerg y(x); // Matches 3603 1.1 joerg NS::y(x); // Doesn't match 3604 1.1 joerg y(42); // Doesn't match 3605 1.1 joerg using NS::y; 3606 1.1 joerg y(x); // Found by both unqualified lookup and ADL, doesn't match 3607 1.1 joerg } 3608 1.1 joerg </pre></td></tr> 3609 1.1 joerg 3610 1.1 joerg 3611 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CastExpr.html">CastExpr</a>></td><td class="name" onclick="toggle('hasCastKind0')"><a name="hasCastKind0Anchor">hasCastKind</a></td><td>CastKind Kind</td></tr> 3612 1.1 joerg <tr><td colspan="4" class="doc" id="hasCastKind0"><pre>Matches casts that has a given cast kind. 3613 1.1 joerg 3614 1.1 joerg Example: matches the implicit cast around 0 3615 1.1 joerg (matcher = castExpr(hasCastKind(CK_NullToPointer))) 3616 1.1 joerg int *p = 0; 3617 1.1 joerg 3618 1.1 joerg If the matcher is use from clang-query, CastKind parameter 3619 1.1.1.2 joerg should be passed as a quoted string. e.g., hasCastKind("CK_NullToPointer"). 3620 1.1 joerg </pre></td></tr> 3621 1.1 joerg 3622 1.1 joerg 3623 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>></td><td class="name" onclick="toggle('equals4')"><a name="equals4Anchor">equals</a></td><td>bool Value</td></tr> 3624 1.1 joerg <tr><td colspan="4" class="doc" id="equals4"><pre></pre></td></tr> 3625 1.1 joerg 3626 1.1 joerg 3627 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>></td><td class="name" onclick="toggle('equals3')"><a name="equals3Anchor">equals</a></td><td>const ValueT Value</td></tr> 3628 1.1 joerg <tr><td colspan="4" class="doc" id="equals3"><pre>Matches literals that are equal to the given value of type ValueT. 3629 1.1 joerg 3630 1.1 joerg Given 3631 1.1 joerg f('false, 3.14, 42); 3632 1.1 joerg characterLiteral(equals(0)) 3633 1.1 joerg matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0)) 3634 1.1 joerg match false 3635 1.1 joerg floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2)) 3636 1.1 joerg match 3.14 3637 1.1 joerg integerLiteral(equals(42)) 3638 1.1 joerg matches 42 3639 1.1 joerg 3640 1.1 joerg Note that you cannot directly match a negative numeric literal because the 3641 1.1 joerg minus sign is not part of the literal: It is a unary operator whose operand 3642 1.1 joerg is the positive numeric literal. Instead, you must use a unaryOperator() 3643 1.1 joerg matcher to match the minus sign: 3644 1.1 joerg 3645 1.1 joerg unaryOperator(hasOperatorName("-"), 3646 1.1 joerg hasUnaryOperand(integerLiteral(equals(13)))) 3647 1.1 joerg 3648 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>>, 3649 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>> 3650 1.1 joerg </pre></td></tr> 3651 1.1 joerg 3652 1.1 joerg 3653 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>></td><td class="name" onclick="toggle('equals10')"><a name="equals10Anchor">equals</a></td><td>double Value</td></tr> 3654 1.1 joerg <tr><td colspan="4" class="doc" id="equals10"><pre></pre></td></tr> 3655 1.1 joerg 3656 1.1 joerg 3657 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>></td><td class="name" onclick="toggle('equals7')"><a name="equals7Anchor">equals</a></td><td>unsigned Value</td></tr> 3658 1.1 joerg <tr><td colspan="4" class="doc" id="equals7"><pre></pre></td></tr> 3659 1.1 joerg 3660 1.1 joerg 3661 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>></td><td class="name" onclick="toggle('templateArgumentCountIs0')"><a name="templateArgumentCountIs0Anchor">templateArgumentCountIs</a></td><td>unsigned N</td></tr> 3662 1.1 joerg <tr><td colspan="4" class="doc" id="templateArgumentCountIs0"><pre>Matches if the number of template arguments equals N. 3663 1.1 joerg 3664 1.1 joerg Given 3665 1.1 joerg template<typename T> struct C {}; 3666 1.1 joerg C<int> c; 3667 1.1 joerg classTemplateSpecializationDecl(templateArgumentCountIs(1)) 3668 1.1 joerg matches C<int>. 3669 1.1 joerg </pre></td></tr> 3670 1.1 joerg 3671 1.1 joerg 3672 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundStmt.html">CompoundStmt</a>></td><td class="name" onclick="toggle('statementCountIs0')"><a name="statementCountIs0Anchor">statementCountIs</a></td><td>unsigned N</td></tr> 3673 1.1 joerg <tr><td colspan="4" class="doc" id="statementCountIs0"><pre>Checks that a compound statement contains a specific number of 3674 1.1 joerg child statements. 3675 1.1 joerg 3676 1.1 joerg Example: Given 3677 1.1 joerg { for (;;) {} } 3678 1.1 joerg compoundStmt(statementCountIs(0))) 3679 1.1 joerg matches '{}' 3680 1.1 joerg but does not match the outer compound statement. 3681 1.1 joerg </pre></td></tr> 3682 1.1 joerg 3683 1.1 joerg 3684 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ConstantArrayType.html">ConstantArrayType</a>></td><td class="name" onclick="toggle('hasSize0')"><a name="hasSize0Anchor">hasSize</a></td><td>unsigned N</td></tr> 3685 1.1 joerg <tr><td colspan="4" class="doc" id="hasSize0"><pre>Matches nodes that have the specified size. 3686 1.1 joerg 3687 1.1 joerg Given 3688 1.1 joerg int a[42]; 3689 1.1 joerg int b[2 * 21]; 3690 1.1 joerg int c[41], d[43]; 3691 1.1 joerg char *s = "abcd"; 3692 1.1 joerg wchar_t *ws = L"abcd"; 3693 1.1 joerg char *w = "a"; 3694 1.1 joerg constantArrayType(hasSize(42)) 3695 1.1 joerg matches "int a[42]" and "int b[2 * 21]" 3696 1.1 joerg stringLiteral(hasSize(4)) 3697 1.1 joerg matches "abcd", L"abcd" 3698 1.1 joerg </pre></td></tr> 3699 1.1 joerg 3700 1.1 joerg 3701 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclStmt.html">DeclStmt</a>></td><td class="name" onclick="toggle('declCountIs0')"><a name="declCountIs0Anchor">declCountIs</a></td><td>unsigned N</td></tr> 3702 1.1 joerg <tr><td colspan="4" class="doc" id="declCountIs0"><pre>Matches declaration statements that contain a specific number of 3703 1.1 joerg declarations. 3704 1.1 joerg 3705 1.1 joerg Example: Given 3706 1.1 joerg int a, b; 3707 1.1 joerg int c; 3708 1.1 joerg int d = 2, e; 3709 1.1 joerg declCountIs(2) 3710 1.1 joerg matches 'int a, b;' and 'int d = 2, e;', but not 'int c;'. 3711 1.1 joerg </pre></td></tr> 3712 1.1 joerg 3713 1.1 joerg 3714 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('equalsBoundNode1')"><a name="equalsBoundNode1Anchor">equalsBoundNode</a></td><td>std::string ID</td></tr> 3715 1.1 joerg <tr><td colspan="4" class="doc" id="equalsBoundNode1"><pre>Matches if a node equals a previously bound node. 3716 1.1 joerg 3717 1.1 joerg Matches a node if it equals the node previously bound to ID. 3718 1.1 joerg 3719 1.1 joerg Given 3720 1.1 joerg class X { int a; int b; }; 3721 1.1 joerg cxxRecordDecl( 3722 1.1 joerg has(fieldDecl(hasName("a"), hasType(type().bind("t")))), 3723 1.1 joerg has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t")))))) 3724 1.1 joerg matches the class X, as a and b have the same type. 3725 1.1 joerg 3726 1.1 joerg Note that when multiple matches are involved via forEach* matchers, 3727 1.1 joerg equalsBoundNodes acts as a filter. 3728 1.1 joerg For example: 3729 1.1 joerg compoundStmt( 3730 1.1 joerg forEachDescendant(varDecl().bind("d")), 3731 1.1 joerg forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d")))))) 3732 1.1 joerg will trigger a match for each combination of variable declaration 3733 1.1 joerg and reference to that variable declaration within a compound statement. 3734 1.1 joerg </pre></td></tr> 3735 1.1 joerg 3736 1.1 joerg 3737 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('equalsNode0')"><a name="equalsNode0Anchor">equalsNode</a></td><td>const Decl* Other</td></tr> 3738 1.1 joerg <tr><td colspan="4" class="doc" id="equalsNode0"><pre>Matches if a node equals another node. 3739 1.1 joerg 3740 1.1 joerg Decl has pointer identity in the AST. 3741 1.1 joerg </pre></td></tr> 3742 1.1 joerg 3743 1.1 joerg 3744 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('hasAttr0')"><a name="hasAttr0Anchor">hasAttr</a></td><td>attr::Kind AttrKind</td></tr> 3745 1.1 joerg <tr><td colspan="4" class="doc" id="hasAttr0"><pre>Matches declaration that has a given attribute. 3746 1.1 joerg 3747 1.1 joerg Given 3748 1.1 joerg __attribute__((device)) void f() { ... } 3749 1.1 joerg decl(hasAttr(clang::attr::CUDADevice)) matches the function declaration of 3750 1.1 joerg f. If the matcher is used from clang-query, attr::Kind parameter should be 3751 1.1 joerg passed as a quoted string. e.g., hasAttr("attr::CUDADevice"). 3752 1.1 joerg </pre></td></tr> 3753 1.1 joerg 3754 1.1 joerg 3755 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('isExpandedFromMacro0')"><a name="isExpandedFromMacro0Anchor">isExpandedFromMacro</a></td><td>std::string MacroName</td></tr> 3756 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="isExpandedFromMacro0"><pre>Matches statements that are (transitively) expanded from the named macro. 3757 1.1.1.2 joerg Does not match if only part of the statement is expanded from that macro or 3758 1.1.1.2 joerg if different parts of the the statement are expanded from different 3759 1.1.1.2 joerg appearances of the macro. 3760 1.1.1.2 joerg </pre></td></tr> 3761 1.1.1.2 joerg 3762 1.1.1.2 joerg 3763 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('isExpansionInFileMatching0')"><a name="isExpansionInFileMatching0Anchor">isExpansionInFileMatching</a></td><td>StringRef RegExp, Regex::RegexFlags Flags = NoFlags</td></tr> 3764 1.1 joerg <tr><td colspan="4" class="doc" id="isExpansionInFileMatching0"><pre>Matches AST nodes that were expanded within files whose name is 3765 1.1 joerg partially matching a given regex. 3766 1.1 joerg 3767 1.1 joerg Example matches Y but not X 3768 1.1 joerg (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*")) 3769 1.1 joerg #include "ASTMatcher.h" 3770 1.1 joerg class X {}; 3771 1.1 joerg ASTMatcher.h: 3772 1.1 joerg class Y {}; 3773 1.1 joerg 3774 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> 3775 1.1.1.2 joerg 3776 1.1.1.2 joerg If the matcher is used in clang-query, RegexFlags parameter 3777 1.1.1.2 joerg should be passed as a quoted string. e.g: "NoFlags". 3778 1.1.1.2 joerg Flags can be combined with '|' example "IgnoreCase | BasicRegex" 3779 1.1 joerg </pre></td></tr> 3780 1.1 joerg 3781 1.1 joerg 3782 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('isExpansionInMainFile0')"><a name="isExpansionInMainFile0Anchor">isExpansionInMainFile</a></td><td></td></tr> 3783 1.1 joerg <tr><td colspan="4" class="doc" id="isExpansionInMainFile0"><pre>Matches AST nodes that were expanded within the main-file. 3784 1.1 joerg 3785 1.1 joerg Example matches X but not Y 3786 1.1 joerg (matcher = cxxRecordDecl(isExpansionInMainFile()) 3787 1.1 joerg #include <Y.h> 3788 1.1 joerg class X {}; 3789 1.1 joerg Y.h: 3790 1.1 joerg class Y {}; 3791 1.1 joerg 3792 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> 3793 1.1 joerg </pre></td></tr> 3794 1.1 joerg 3795 1.1 joerg 3796 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('isExpansionInSystemHeader0')"><a name="isExpansionInSystemHeader0Anchor">isExpansionInSystemHeader</a></td><td></td></tr> 3797 1.1 joerg <tr><td colspan="4" class="doc" id="isExpansionInSystemHeader0"><pre>Matches AST nodes that were expanded within system-header-files. 3798 1.1 joerg 3799 1.1 joerg Example matches Y but not X 3800 1.1 joerg (matcher = cxxRecordDecl(isExpansionInSystemHeader()) 3801 1.1 joerg #include <SystemHeader.h> 3802 1.1 joerg class X {}; 3803 1.1 joerg SystemHeader.h: 3804 1.1 joerg class Y {}; 3805 1.1 joerg 3806 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> 3807 1.1 joerg </pre></td></tr> 3808 1.1 joerg 3809 1.1 joerg 3810 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('isImplicit0')"><a name="isImplicit0Anchor">isImplicit</a></td><td></td></tr> 3811 1.1 joerg <tr><td colspan="4" class="doc" id="isImplicit0"><pre>Matches a declaration that has been implicitly added 3812 1.1 joerg by the compiler (eg. implicit default/copy constructors). 3813 1.1 joerg </pre></td></tr> 3814 1.1 joerg 3815 1.1 joerg 3816 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('isInStdNamespace0')"><a name="isInStdNamespace0Anchor">isInStdNamespace</a></td><td></td></tr> 3817 1.1 joerg <tr><td colspan="4" class="doc" id="isInStdNamespace0"><pre>Matches declarations in the namespace `std`, but not in nested namespaces. 3818 1.1 joerg 3819 1.1 joerg Given 3820 1.1 joerg class vector {}; 3821 1.1 joerg namespace foo { 3822 1.1 joerg class vector {}; 3823 1.1 joerg namespace std { 3824 1.1 joerg class vector {}; 3825 1.1 joerg } 3826 1.1 joerg } 3827 1.1 joerg namespace std { 3828 1.1 joerg inline namespace __1 { 3829 1.1 joerg class vector {}; // #1 3830 1.1 joerg namespace experimental { 3831 1.1 joerg class vector {}; 3832 1.1 joerg } 3833 1.1 joerg } 3834 1.1 joerg } 3835 1.1 joerg cxxRecordDecl(hasName("vector"), isInStdNamespace()) will match only #1. 3836 1.1 joerg </pre></td></tr> 3837 1.1 joerg 3838 1.1 joerg 3839 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('isInstantiated0')"><a name="isInstantiated0Anchor">isInstantiated</a></td><td></td></tr> 3840 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="isInstantiated0"><pre>Matches declarations that are template instantiations or are inside 3841 1.1.1.2 joerg template instantiations. 3842 1.1 joerg 3843 1.1 joerg Given 3844 1.1.1.2 joerg template<typename T> void A(T t) { T i; } 3845 1.1.1.2 joerg A(0); 3846 1.1.1.2 joerg A(0U); 3847 1.1.1.2 joerg functionDecl(isInstantiated()) 3848 1.1.1.2 joerg matches 'A(int) {...};' and 'A(unsigned) {...}'. 3849 1.1.1.2 joerg </pre></td></tr> 3850 1.1.1.2 joerg 3851 1.1.1.2 joerg 3852 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('isPrivate0')"><a name="isPrivate0Anchor">isPrivate</a></td><td></td></tr> 3853 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="isPrivate0"><pre>Matches private C++ declarations and C++ base specifers that specify private 3854 1.1.1.2 joerg inheritance. 3855 1.1.1.2 joerg 3856 1.1.1.2 joerg Examples: 3857 1.1 joerg class C { 3858 1.1 joerg public: int a; 3859 1.1 joerg protected: int b; 3860 1.1.1.2 joerg private: int c; // fieldDecl(isPrivate()) matches 'c' 3861 1.1 joerg }; 3862 1.1.1.2 joerg 3863 1.1.1.2 joerg struct Base {}; 3864 1.1.1.2 joerg struct Derived1 : private Base {}; // matches 'Base' 3865 1.1.1.2 joerg class Derived2 : Base {}; // matches 'Base' 3866 1.1 joerg </pre></td></tr> 3867 1.1 joerg 3868 1.1 joerg 3869 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('isProtected0')"><a name="isProtected0Anchor">isProtected</a></td><td></td></tr> 3870 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="isProtected0"><pre>Matches protected C++ declarations and C++ base specifers that specify 3871 1.1.1.2 joerg protected inheritance. 3872 1.1 joerg 3873 1.1.1.2 joerg Examples: 3874 1.1 joerg class C { 3875 1.1 joerg public: int a; 3876 1.1.1.2 joerg protected: int b; // fieldDecl(isProtected()) matches 'b' 3877 1.1 joerg private: int c; 3878 1.1 joerg }; 3879 1.1.1.2 joerg 3880 1.1.1.2 joerg class Base {}; 3881 1.1.1.2 joerg class Derived : protected Base {}; // matches 'Base' 3882 1.1 joerg </pre></td></tr> 3883 1.1 joerg 3884 1.1 joerg 3885 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('isPublic0')"><a name="isPublic0Anchor">isPublic</a></td><td></td></tr> 3886 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="isPublic0"><pre>Matches public C++ declarations and C++ base specifers that specify public 3887 1.1.1.2 joerg inheritance. 3888 1.1 joerg 3889 1.1.1.2 joerg Examples: 3890 1.1 joerg class C { 3891 1.1.1.2 joerg public: int a; // fieldDecl(isPublic()) matches 'a' 3892 1.1 joerg protected: int b; 3893 1.1 joerg private: int c; 3894 1.1 joerg }; 3895 1.1.1.2 joerg 3896 1.1.1.2 joerg class Base {}; 3897 1.1.1.2 joerg class Derived1 : public Base {}; // matches 'Base' 3898 1.1.1.2 joerg struct Derived2 : Base {}; // matches 'Base' 3899 1.1 joerg </pre></td></tr> 3900 1.1 joerg 3901 1.1 joerg 3902 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DesignatedInitExpr.html">DesignatedInitExpr</a>></td><td class="name" onclick="toggle('designatorCountIs0')"><a name="designatorCountIs0Anchor">designatorCountIs</a></td><td>unsigned N</td></tr> 3903 1.1 joerg <tr><td colspan="4" class="doc" id="designatorCountIs0"><pre>Matches designated initializer expressions that contain 3904 1.1 joerg a specific number of designators. 3905 1.1 joerg 3906 1.1 joerg Example: Given 3907 1.1 joerg point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 }; 3908 1.1 joerg point ptarray2[10] = { [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 }; 3909 1.1 joerg designatorCountIs(2) 3910 1.1 joerg matches '{ [2].y = 1.0, [0].x = 1.0 }', 3911 1.1 joerg but not '{ [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 }'. 3912 1.1 joerg </pre></td></tr> 3913 1.1 joerg 3914 1.1 joerg 3915 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumDecl.html">EnumDecl</a>></td><td class="name" onclick="toggle('isScoped0')"><a name="isScoped0Anchor">isScoped</a></td><td></td></tr> 3916 1.1 joerg <tr><td colspan="4" class="doc" id="isScoped0"><pre>Matches C++11 scoped enum declaration. 3917 1.1 joerg 3918 1.1 joerg Example matches Y (matcher = enumDecl(isScoped())) 3919 1.1 joerg enum X {}; 3920 1.1 joerg enum class Y {}; 3921 1.1 joerg </pre></td></tr> 3922 1.1 joerg 3923 1.1 joerg 3924 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>></td><td class="name" onclick="toggle('isInstantiationDependent0')"><a name="isInstantiationDependent0Anchor">isInstantiationDependent</a></td><td></td></tr> 3925 1.1 joerg <tr><td colspan="4" class="doc" id="isInstantiationDependent0"><pre>Matches expressions that are instantiation-dependent even if it is 3926 1.1 joerg neither type- nor value-dependent. 3927 1.1 joerg 3928 1.1 joerg In the following example, the expression sizeof(sizeof(T() + T())) 3929 1.1 joerg is instantiation-dependent (since it involves a template parameter T), 3930 1.1 joerg but is neither type- nor value-dependent, since the type of the inner 3931 1.1 joerg sizeof is known (std::size_t) and therefore the size of the outer 3932 1.1 joerg sizeof is known. 3933 1.1 joerg template<typename T> 3934 1.1 joerg void f(T x, T y) { sizeof(sizeof(T() + T()); } 3935 1.1 joerg expr(isInstantiationDependent()) matches sizeof(sizeof(T() + T()) 3936 1.1 joerg </pre></td></tr> 3937 1.1 joerg 3938 1.1 joerg 3939 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>></td><td class="name" onclick="toggle('isTypeDependent0')"><a name="isTypeDependent0Anchor">isTypeDependent</a></td><td></td></tr> 3940 1.1 joerg <tr><td colspan="4" class="doc" id="isTypeDependent0"><pre>Matches expressions that are type-dependent because the template type 3941 1.1 joerg is not yet instantiated. 3942 1.1 joerg 3943 1.1 joerg For example, the expressions "x" and "x + y" are type-dependent in 3944 1.1 joerg the following code, but "y" is not type-dependent: 3945 1.1 joerg template<typename T> 3946 1.1 joerg void add(T x, int y) { 3947 1.1 joerg x + y; 3948 1.1 joerg } 3949 1.1 joerg expr(isTypeDependent()) matches x + y 3950 1.1 joerg </pre></td></tr> 3951 1.1 joerg 3952 1.1 joerg 3953 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>></td><td class="name" onclick="toggle('isValueDependent0')"><a name="isValueDependent0Anchor">isValueDependent</a></td><td></td></tr> 3954 1.1 joerg <tr><td colspan="4" class="doc" id="isValueDependent0"><pre>Matches expression that are value-dependent because they contain a 3955 1.1 joerg non-type template parameter. 3956 1.1 joerg 3957 1.1 joerg For example, the array bound of "Chars" in the following example is 3958 1.1 joerg value-dependent. 3959 1.1 joerg template<int Size> int f() { return Size; } 3960 1.1 joerg expr(isValueDependent()) matches return Size 3961 1.1 joerg </pre></td></tr> 3962 1.1 joerg 3963 1.1 joerg 3964 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>></td><td class="name" onclick="toggle('nullPointerConstant0')"><a name="nullPointerConstant0Anchor">nullPointerConstant</a></td><td></td></tr> 3965 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="nullPointerConstant0"><pre>Matches expressions that resolve to a null pointer constant, such as 3966 1.1.1.2 joerg GNU's __null, C++11's nullptr, or C's NULL macro. 3967 1.1.1.2 joerg 3968 1.1.1.2 joerg Given: 3969 1.1.1.2 joerg void *v1 = NULL; 3970 1.1.1.2 joerg void *v2 = nullptr; 3971 1.1.1.2 joerg void *v3 = __null; // GNU extension 3972 1.1.1.2 joerg char *cp = (char *)0; 3973 1.1.1.2 joerg int *ip = 0; 3974 1.1.1.2 joerg int i = 0; 3975 1.1.1.2 joerg expr(nullPointerConstant()) 3976 1.1.1.2 joerg matches the initializer for v1, v2, v3, cp, and ip. Does not match the 3977 1.1.1.2 joerg initializer for i. 3978 1.1.1.2 joerg </pre></td></tr> 3979 1.1.1.2 joerg 3980 1.1.1.2 joerg 3981 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>></td><td class="name" onclick="toggle('hasBitWidth0')"><a name="hasBitWidth0Anchor">hasBitWidth</a></td><td>unsigned Width</td></tr> 3982 1.1 joerg <tr><td colspan="4" class="doc" id="hasBitWidth0"><pre>Matches non-static data members that are bit-fields of the specified 3983 1.1 joerg bit width. 3984 1.1 joerg 3985 1.1 joerg Given 3986 1.1 joerg class C { 3987 1.1 joerg int a : 2; 3988 1.1 joerg int b : 4; 3989 1.1 joerg int c : 2; 3990 1.1 joerg }; 3991 1.1 joerg fieldDecl(hasBitWidth(2)) 3992 1.1 joerg matches 'int a;' and 'int c;' but not 'int b;'. 3993 1.1 joerg </pre></td></tr> 3994 1.1 joerg 3995 1.1 joerg 3996 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>></td><td class="name" onclick="toggle('isBitField0')"><a name="isBitField0Anchor">isBitField</a></td><td></td></tr> 3997 1.1 joerg <tr><td colspan="4" class="doc" id="isBitField0"><pre>Matches non-static data members that are bit-fields. 3998 1.1 joerg 3999 1.1 joerg Given 4000 1.1 joerg class C { 4001 1.1 joerg int a : 2; 4002 1.1 joerg int b; 4003 1.1 joerg }; 4004 1.1 joerg fieldDecl(isBitField()) 4005 1.1 joerg matches 'int a;' but not 'int b;'. 4006 1.1 joerg </pre></td></tr> 4007 1.1 joerg 4008 1.1 joerg 4009 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>></td><td class="name" onclick="toggle('equals1')"><a name="equals1Anchor">equals</a></td><td>const ValueT Value</td></tr> 4010 1.1 joerg <tr><td colspan="4" class="doc" id="equals1"><pre>Matches literals that are equal to the given value of type ValueT. 4011 1.1 joerg 4012 1.1 joerg Given 4013 1.1 joerg f('false, 3.14, 42); 4014 1.1 joerg characterLiteral(equals(0)) 4015 1.1 joerg matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0)) 4016 1.1 joerg match false 4017 1.1 joerg floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2)) 4018 1.1 joerg match 3.14 4019 1.1 joerg integerLiteral(equals(42)) 4020 1.1 joerg matches 42 4021 1.1 joerg 4022 1.1 joerg Note that you cannot directly match a negative numeric literal because the 4023 1.1 joerg minus sign is not part of the literal: It is a unary operator whose operand 4024 1.1 joerg is the positive numeric literal. Instead, you must use a unaryOperator() 4025 1.1 joerg matcher to match the minus sign: 4026 1.1 joerg 4027 1.1 joerg unaryOperator(hasOperatorName("-"), 4028 1.1 joerg hasUnaryOperand(integerLiteral(equals(13)))) 4029 1.1 joerg 4030 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>>, 4031 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>> 4032 1.1 joerg </pre></td></tr> 4033 1.1 joerg 4034 1.1 joerg 4035 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>></td><td class="name" onclick="toggle('equals12')"><a name="equals12Anchor">equals</a></td><td>double Value</td></tr> 4036 1.1 joerg <tr><td colspan="4" class="doc" id="equals12"><pre></pre></td></tr> 4037 1.1 joerg 4038 1.1 joerg 4039 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('hasAnyOverloadedOperatorName1')"><a name="hasAnyOverloadedOperatorName1Anchor">hasAnyOverloadedOperatorName</a></td><td>StringRef, ..., StringRef</td></tr> 4040 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasAnyOverloadedOperatorName1"><pre>Matches overloaded operator names. 4041 1.1.1.2 joerg 4042 1.1.1.2 joerg Matches overloaded operator names specified in strings without the 4043 1.1.1.2 joerg "operator" prefix: e.g. "<<". 4044 1.1.1.2 joerg 4045 1.1.1.2 joerg hasAnyOverloadedOperatorName("+", "-") 4046 1.1.1.2 joerg Is equivalent to 4047 1.1.1.2 joerg anyOf(hasOverloadedOperatorName("+"), hasOverloadedOperatorName("-")) 4048 1.1.1.2 joerg </pre></td></tr> 4049 1.1.1.2 joerg 4050 1.1.1.2 joerg 4051 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('hasDynamicExceptionSpec0')"><a name="hasDynamicExceptionSpec0Anchor">hasDynamicExceptionSpec</a></td><td></td></tr> 4052 1.1 joerg <tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec0"><pre>Matches functions that have a dynamic exception specification. 4053 1.1 joerg 4054 1.1 joerg Given: 4055 1.1 joerg void f(); 4056 1.1 joerg void g() noexcept; 4057 1.1 joerg void h() noexcept(true); 4058 1.1 joerg void i() noexcept(false); 4059 1.1 joerg void j() throw(); 4060 1.1 joerg void k() throw(int); 4061 1.1 joerg void l() throw(...); 4062 1.1 joerg functionDecl(hasDynamicExceptionSpec()) and 4063 1.1 joerg functionProtoType(hasDynamicExceptionSpec()) 4064 1.1 joerg match the declarations of j, k, and l, but not f, g, h, or i. 4065 1.1 joerg </pre></td></tr> 4066 1.1 joerg 4067 1.1 joerg 4068 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('hasOverloadedOperatorName0')"><a name="hasOverloadedOperatorName0Anchor">hasOverloadedOperatorName</a></td><td>StringRef Name</td></tr> 4069 1.1 joerg <tr><td colspan="4" class="doc" id="hasOverloadedOperatorName0"><pre>Matches overloaded operator names. 4070 1.1 joerg 4071 1.1 joerg Matches overloaded operator names specified in strings without the 4072 1.1 joerg "operator" prefix: e.g. "<<". 4073 1.1 joerg 4074 1.1 joerg Given: 4075 1.1 joerg class A { int operator*(); }; 4076 1.1 joerg const A &operator<<(const A &a, const A &b); 4077 1.1 joerg A a; 4078 1.1 joerg a << a; // <-- This matches 4079 1.1 joerg 4080 1.1 joerg cxxOperatorCallExpr(hasOverloadedOperatorName("<<"))) matches the 4081 1.1 joerg specified line and 4082 1.1 joerg cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*"))) 4083 1.1 joerg matches the declaration of A. 4084 1.1 joerg 4085 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>> 4086 1.1 joerg </pre></td></tr> 4087 1.1 joerg 4088 1.1 joerg 4089 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('hasTrailingReturn0')"><a name="hasTrailingReturn0Anchor">hasTrailingReturn</a></td><td></td></tr> 4090 1.1 joerg <tr><td colspan="4" class="doc" id="hasTrailingReturn0"><pre>Matches a function declared with a trailing return type. 4091 1.1 joerg 4092 1.1 joerg Example matches Y (matcher = functionDecl(hasTrailingReturn())) 4093 1.1 joerg int X() {} 4094 1.1 joerg auto Y() -> int {} 4095 1.1 joerg </pre></td></tr> 4096 1.1 joerg 4097 1.1 joerg 4098 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isConstexpr1')"><a name="isConstexpr1Anchor">isConstexpr</a></td><td></td></tr> 4099 1.1 joerg <tr><td colspan="4" class="doc" id="isConstexpr1"><pre>Matches constexpr variable and function declarations, 4100 1.1 joerg and if constexpr. 4101 1.1 joerg 4102 1.1 joerg Given: 4103 1.1 joerg constexpr int foo = 42; 4104 1.1 joerg constexpr int bar(); 4105 1.1 joerg void baz() { if constexpr(1 > 0) {} } 4106 1.1 joerg varDecl(isConstexpr()) 4107 1.1 joerg matches the declaration of foo. 4108 1.1 joerg functionDecl(isConstexpr()) 4109 1.1 joerg matches the declaration of bar. 4110 1.1 joerg ifStmt(isConstexpr()) 4111 1.1 joerg matches the if statement in baz. 4112 1.1 joerg </pre></td></tr> 4113 1.1 joerg 4114 1.1 joerg 4115 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isDefaulted0')"><a name="isDefaulted0Anchor">isDefaulted</a></td><td></td></tr> 4116 1.1 joerg <tr><td colspan="4" class="doc" id="isDefaulted0"><pre>Matches defaulted function declarations. 4117 1.1 joerg 4118 1.1 joerg Given: 4119 1.1 joerg class A { ~A(); }; 4120 1.1 joerg class B { ~B() = default; }; 4121 1.1 joerg functionDecl(isDefaulted()) 4122 1.1 joerg matches the declaration of ~B, but not ~A. 4123 1.1 joerg </pre></td></tr> 4124 1.1 joerg 4125 1.1 joerg 4126 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isDefinition3')"><a name="isDefinition3Anchor">isDefinition</a></td><td></td></tr> 4127 1.1 joerg <tr><td colspan="4" class="doc" id="isDefinition3"><pre>Matches if a declaration has a body attached. 4128 1.1 joerg 4129 1.1 joerg Example matches A, va, fa 4130 1.1 joerg class A {}; 4131 1.1 joerg class B; // Doesn't match, as it has no body. 4132 1.1 joerg int va; 4133 1.1 joerg extern int vb; // Doesn't match, as it doesn't define the variable. 4134 1.1 joerg void fa() {} 4135 1.1 joerg void fb(); // Doesn't match, as it has no body. 4136 1.1 joerg @interface X 4137 1.1 joerg - (void)ma; // Doesn't match, interface is declaration. 4138 1.1 joerg @end 4139 1.1 joerg @implementation X 4140 1.1 joerg - (void)ma {} 4141 1.1 joerg @end 4142 1.1 joerg 4143 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>>, 4144 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>> 4145 1.1 joerg </pre></td></tr> 4146 1.1 joerg 4147 1.1 joerg 4148 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isDeleted0')"><a name="isDeleted0Anchor">isDeleted</a></td><td></td></tr> 4149 1.1 joerg <tr><td colspan="4" class="doc" id="isDeleted0"><pre>Matches deleted function declarations. 4150 1.1 joerg 4151 1.1 joerg Given: 4152 1.1 joerg void Func(); 4153 1.1 joerg void DeletedFunc() = delete; 4154 1.1 joerg functionDecl(isDeleted()) 4155 1.1 joerg matches the declaration of DeletedFunc, but not Func. 4156 1.1 joerg </pre></td></tr> 4157 1.1 joerg 4158 1.1 joerg 4159 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isExplicitTemplateSpecialization0')"><a name="isExplicitTemplateSpecialization0Anchor">isExplicitTemplateSpecialization</a></td><td></td></tr> 4160 1.1 joerg <tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization0"><pre>Matches explicit template specializations of function, class, or 4161 1.1 joerg static member variable template instantiations. 4162 1.1 joerg 4163 1.1 joerg Given 4164 1.1 joerg template<typename T> void A(T t) { } 4165 1.1 joerg template<> void A(int N) { } 4166 1.1 joerg functionDecl(isExplicitTemplateSpecialization()) 4167 1.1 joerg matches the specialization A<int>(). 4168 1.1 joerg 4169 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>> 4170 1.1 joerg </pre></td></tr> 4171 1.1 joerg 4172 1.1 joerg 4173 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isExternC0')"><a name="isExternC0Anchor">isExternC</a></td><td></td></tr> 4174 1.1 joerg <tr><td colspan="4" class="doc" id="isExternC0"><pre>Matches extern "C" function or variable declarations. 4175 1.1 joerg 4176 1.1 joerg Given: 4177 1.1 joerg extern "C" void f() {} 4178 1.1 joerg extern "C" { void g() {} } 4179 1.1 joerg void h() {} 4180 1.1 joerg extern "C" int x = 1; 4181 1.1 joerg extern "C" int y = 2; 4182 1.1 joerg int z = 3; 4183 1.1 joerg functionDecl(isExternC()) 4184 1.1 joerg matches the declaration of f and g, but not the declaration of h. 4185 1.1 joerg varDecl(isExternC()) 4186 1.1 joerg matches the declaration of x and y, but not the declaration of z. 4187 1.1 joerg </pre></td></tr> 4188 1.1 joerg 4189 1.1 joerg 4190 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isInline1')"><a name="isInline1Anchor">isInline</a></td><td></td></tr> 4191 1.1 joerg <tr><td colspan="4" class="doc" id="isInline1"><pre>Matches function and namespace declarations that are marked with 4192 1.1 joerg the inline keyword. 4193 1.1 joerg 4194 1.1 joerg Given 4195 1.1 joerg inline void f(); 4196 1.1 joerg void g(); 4197 1.1 joerg namespace n { 4198 1.1 joerg inline namespace m {} 4199 1.1 joerg } 4200 1.1 joerg functionDecl(isInline()) will match ::f(). 4201 1.1 joerg namespaceDecl(isInline()) will match n::m. 4202 1.1 joerg </pre></td></tr> 4203 1.1 joerg 4204 1.1 joerg 4205 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isMain0')"><a name="isMain0Anchor">isMain</a></td><td></td></tr> 4206 1.1 joerg <tr><td colspan="4" class="doc" id="isMain0"><pre>Determines whether the function is "main", which is the entry point 4207 1.1 joerg into an executable program. 4208 1.1 joerg </pre></td></tr> 4209 1.1 joerg 4210 1.1 joerg 4211 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isNoReturn0')"><a name="isNoReturn0Anchor">isNoReturn</a></td><td></td></tr> 4212 1.1 joerg <tr><td colspan="4" class="doc" id="isNoReturn0"><pre>Matches FunctionDecls that have a noreturn attribute. 4213 1.1 joerg 4214 1.1 joerg Given 4215 1.1 joerg void nope(); 4216 1.1 joerg [[noreturn]] void a(); 4217 1.1 joerg __attribute__((noreturn)) void b(); 4218 1.1 joerg struct c { [[noreturn]] c(); }; 4219 1.1 joerg functionDecl(isNoReturn()) 4220 1.1 joerg matches all of those except 4221 1.1 joerg void nope(); 4222 1.1 joerg </pre></td></tr> 4223 1.1 joerg 4224 1.1 joerg 4225 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isNoThrow0')"><a name="isNoThrow0Anchor">isNoThrow</a></td><td></td></tr> 4226 1.1 joerg <tr><td colspan="4" class="doc" id="isNoThrow0"><pre>Matches functions that have a non-throwing exception specification. 4227 1.1 joerg 4228 1.1 joerg Given: 4229 1.1 joerg void f(); 4230 1.1 joerg void g() noexcept; 4231 1.1 joerg void h() throw(); 4232 1.1 joerg void i() throw(int); 4233 1.1 joerg void j() noexcept(false); 4234 1.1 joerg functionDecl(isNoThrow()) and functionProtoType(isNoThrow()) 4235 1.1 joerg match the declarations of g, and h, but not f, i or j. 4236 1.1 joerg </pre></td></tr> 4237 1.1 joerg 4238 1.1 joerg 4239 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isStaticStorageClass0')"><a name="isStaticStorageClass0Anchor">isStaticStorageClass</a></td><td></td></tr> 4240 1.1 joerg <tr><td colspan="4" class="doc" id="isStaticStorageClass0"><pre>Matches variable/function declarations that have "static" storage 4241 1.1 joerg class specifier ("static" keyword) written in the source. 4242 1.1 joerg 4243 1.1 joerg Given: 4244 1.1 joerg static void f() {} 4245 1.1 joerg static int i = 0; 4246 1.1 joerg extern int j; 4247 1.1 joerg int k; 4248 1.1 joerg functionDecl(isStaticStorageClass()) 4249 1.1 joerg matches the function declaration f. 4250 1.1 joerg varDecl(isStaticStorageClass()) 4251 1.1 joerg matches the variable declaration i. 4252 1.1 joerg </pre></td></tr> 4253 1.1 joerg 4254 1.1 joerg 4255 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isTemplateInstantiation0')"><a name="isTemplateInstantiation0Anchor">isTemplateInstantiation</a></td><td></td></tr> 4256 1.1 joerg <tr><td colspan="4" class="doc" id="isTemplateInstantiation0"><pre>Matches template instantiations of function, class, or static 4257 1.1 joerg member variable template instantiations. 4258 1.1 joerg 4259 1.1 joerg Given 4260 1.1 joerg template <typename T> class X {}; class A {}; X<A> x; 4261 1.1 joerg or 4262 1.1 joerg template <typename T> class X {}; class A {}; template class X<A>; 4263 1.1 joerg or 4264 1.1 joerg template <typename T> class X {}; class A {}; extern template class X<A>; 4265 1.1 joerg cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 4266 1.1 joerg matches the template instantiation of X<A>. 4267 1.1 joerg 4268 1.1 joerg But given 4269 1.1 joerg template <typename T> class X {}; class A {}; 4270 1.1 joerg template <> class X<A> {}; X<A> x; 4271 1.1 joerg cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 4272 1.1 joerg does not match, as X<A> is an explicit template specialization. 4273 1.1 joerg 4274 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>> 4275 1.1 joerg </pre></td></tr> 4276 1.1 joerg 4277 1.1 joerg 4278 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isVariadic0')"><a name="isVariadic0Anchor">isVariadic</a></td><td></td></tr> 4279 1.1 joerg <tr><td colspan="4" class="doc" id="isVariadic0"><pre>Matches if a function declaration is variadic. 4280 1.1 joerg 4281 1.1 joerg Example matches f, but not g or h. The function i will not match, even when 4282 1.1 joerg compiled in C mode. 4283 1.1 joerg void f(...); 4284 1.1 joerg void g(int); 4285 1.1 joerg template <typename... Ts> void h(Ts...); 4286 1.1 joerg void i(); 4287 1.1 joerg </pre></td></tr> 4288 1.1 joerg 4289 1.1 joerg 4290 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('isWeak0')"><a name="isWeak0Anchor">isWeak</a></td><td></td></tr> 4291 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="isWeak0"><pre>Matches weak function declarations. 4292 1.1.1.2 joerg 4293 1.1.1.2 joerg Given: 4294 1.1.1.2 joerg void foo() __attribute__((__weakref__("__foo"))); 4295 1.1.1.2 joerg void bar(); 4296 1.1.1.2 joerg functionDecl(isWeak()) 4297 1.1.1.2 joerg matches the weak declaration "foo", but not "bar". 4298 1.1.1.2 joerg </pre></td></tr> 4299 1.1.1.2 joerg 4300 1.1.1.2 joerg 4301 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('parameterCountIs0')"><a name="parameterCountIs0Anchor">parameterCountIs</a></td><td>unsigned N</td></tr> 4302 1.1 joerg <tr><td colspan="4" class="doc" id="parameterCountIs0"><pre>Matches FunctionDecls and FunctionProtoTypes that have a 4303 1.1 joerg specific parameter count. 4304 1.1 joerg 4305 1.1 joerg Given 4306 1.1 joerg void f(int i) {} 4307 1.1 joerg void g(int i, int j) {} 4308 1.1 joerg void h(int i, int j); 4309 1.1 joerg void j(int i); 4310 1.1 joerg void k(int x, int y, int z, ...); 4311 1.1 joerg functionDecl(parameterCountIs(2)) 4312 1.1 joerg matches g and h 4313 1.1 joerg functionProtoType(parameterCountIs(2)) 4314 1.1 joerg matches g and h 4315 1.1 joerg functionProtoType(parameterCountIs(3)) 4316 1.1 joerg matches k 4317 1.1 joerg </pre></td></tr> 4318 1.1 joerg 4319 1.1 joerg 4320 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionProtoType.html">FunctionProtoType</a>></td><td class="name" onclick="toggle('hasDynamicExceptionSpec1')"><a name="hasDynamicExceptionSpec1Anchor">hasDynamicExceptionSpec</a></td><td></td></tr> 4321 1.1 joerg <tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec1"><pre>Matches functions that have a dynamic exception specification. 4322 1.1 joerg 4323 1.1 joerg Given: 4324 1.1 joerg void f(); 4325 1.1 joerg void g() noexcept; 4326 1.1 joerg void h() noexcept(true); 4327 1.1 joerg void i() noexcept(false); 4328 1.1 joerg void j() throw(); 4329 1.1 joerg void k() throw(int); 4330 1.1 joerg void l() throw(...); 4331 1.1 joerg functionDecl(hasDynamicExceptionSpec()) and 4332 1.1 joerg functionProtoType(hasDynamicExceptionSpec()) 4333 1.1 joerg match the declarations of j, k, and l, but not f, g, h, or i. 4334 1.1 joerg </pre></td></tr> 4335 1.1 joerg 4336 1.1 joerg 4337 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionProtoType.html">FunctionProtoType</a>></td><td class="name" onclick="toggle('isNoThrow1')"><a name="isNoThrow1Anchor">isNoThrow</a></td><td></td></tr> 4338 1.1 joerg <tr><td colspan="4" class="doc" id="isNoThrow1"><pre>Matches functions that have a non-throwing exception specification. 4339 1.1 joerg 4340 1.1 joerg Given: 4341 1.1 joerg void f(); 4342 1.1 joerg void g() noexcept; 4343 1.1 joerg void h() throw(); 4344 1.1 joerg void i() throw(int); 4345 1.1 joerg void j() noexcept(false); 4346 1.1 joerg functionDecl(isNoThrow()) and functionProtoType(isNoThrow()) 4347 1.1 joerg match the declarations of g, and h, but not f, i or j. 4348 1.1 joerg </pre></td></tr> 4349 1.1 joerg 4350 1.1 joerg 4351 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionProtoType.html">FunctionProtoType</a>></td><td class="name" onclick="toggle('parameterCountIs1')"><a name="parameterCountIs1Anchor">parameterCountIs</a></td><td>unsigned N</td></tr> 4352 1.1 joerg <tr><td colspan="4" class="doc" id="parameterCountIs1"><pre>Matches FunctionDecls and FunctionProtoTypes that have a 4353 1.1 joerg specific parameter count. 4354 1.1 joerg 4355 1.1 joerg Given 4356 1.1 joerg void f(int i) {} 4357 1.1 joerg void g(int i, int j) {} 4358 1.1 joerg void h(int i, int j); 4359 1.1 joerg void j(int i); 4360 1.1 joerg void k(int x, int y, int z, ...); 4361 1.1 joerg functionDecl(parameterCountIs(2)) 4362 1.1 joerg matches g and h 4363 1.1 joerg functionProtoType(parameterCountIs(2)) 4364 1.1 joerg matches g and h 4365 1.1 joerg functionProtoType(parameterCountIs(3)) 4366 1.1 joerg matches k 4367 1.1 joerg </pre></td></tr> 4368 1.1 joerg 4369 1.1 joerg 4370 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt</a>></td><td class="name" onclick="toggle('isConstexpr2')"><a name="isConstexpr2Anchor">isConstexpr</a></td><td></td></tr> 4371 1.1 joerg <tr><td colspan="4" class="doc" id="isConstexpr2"><pre>Matches constexpr variable and function declarations, 4372 1.1 joerg and if constexpr. 4373 1.1 joerg 4374 1.1 joerg Given: 4375 1.1 joerg constexpr int foo = 42; 4376 1.1 joerg constexpr int bar(); 4377 1.1 joerg void baz() { if constexpr(1 > 0) {} } 4378 1.1 joerg varDecl(isConstexpr()) 4379 1.1 joerg matches the declaration of foo. 4380 1.1 joerg functionDecl(isConstexpr()) 4381 1.1 joerg matches the declaration of bar. 4382 1.1 joerg ifStmt(isConstexpr()) 4383 1.1 joerg matches the if statement in baz. 4384 1.1 joerg </pre></td></tr> 4385 1.1 joerg 4386 1.1 joerg 4387 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>></td><td class="name" onclick="toggle('equals6')"><a name="equals6Anchor">equals</a></td><td>bool Value</td></tr> 4388 1.1 joerg <tr><td colspan="4" class="doc" id="equals6"><pre></pre></td></tr> 4389 1.1 joerg 4390 1.1 joerg 4391 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>></td><td class="name" onclick="toggle('equals0')"><a name="equals0Anchor">equals</a></td><td>const ValueT Value</td></tr> 4392 1.1 joerg <tr><td colspan="4" class="doc" id="equals0"><pre>Matches literals that are equal to the given value of type ValueT. 4393 1.1 joerg 4394 1.1 joerg Given 4395 1.1 joerg f('false, 3.14, 42); 4396 1.1 joerg characterLiteral(equals(0)) 4397 1.1 joerg matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0)) 4398 1.1 joerg match false 4399 1.1 joerg floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2)) 4400 1.1 joerg match 3.14 4401 1.1 joerg integerLiteral(equals(42)) 4402 1.1 joerg matches 42 4403 1.1 joerg 4404 1.1 joerg Note that you cannot directly match a negative numeric literal because the 4405 1.1 joerg minus sign is not part of the literal: It is a unary operator whose operand 4406 1.1 joerg is the positive numeric literal. Instead, you must use a unaryOperator() 4407 1.1 joerg matcher to match the minus sign: 4408 1.1 joerg 4409 1.1 joerg unaryOperator(hasOperatorName("-"), 4410 1.1 joerg hasUnaryOperand(integerLiteral(equals(13)))) 4411 1.1 joerg 4412 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>>, 4413 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>> 4414 1.1 joerg </pre></td></tr> 4415 1.1 joerg 4416 1.1 joerg 4417 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>></td><td class="name" onclick="toggle('equals13')"><a name="equals13Anchor">equals</a></td><td>double Value</td></tr> 4418 1.1 joerg <tr><td colspan="4" class="doc" id="equals13"><pre></pre></td></tr> 4419 1.1 joerg 4420 1.1 joerg 4421 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>></td><td class="name" onclick="toggle('equals9')"><a name="equals9Anchor">equals</a></td><td>unsigned Value</td></tr> 4422 1.1 joerg <tr><td colspan="4" class="doc" id="equals9"><pre></pre></td></tr> 4423 1.1 joerg 4424 1.1 joerg 4425 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>></td><td class="name" onclick="toggle('isArrow0')"><a name="isArrow0Anchor">isArrow</a></td><td></td></tr> 4426 1.1 joerg <tr><td colspan="4" class="doc" id="isArrow0"><pre>Matches member expressions that are called with '->' as opposed 4427 1.1 joerg to '.'. 4428 1.1 joerg 4429 1.1 joerg Member calls on the implicit this pointer match as called with '->'. 4430 1.1 joerg 4431 1.1 joerg Given 4432 1.1 joerg class Y { 4433 1.1 joerg void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; } 4434 1.1 joerg template <class T> void f() { this->f<T>(); f<T>(); } 4435 1.1 joerg int a; 4436 1.1 joerg static int b; 4437 1.1 joerg }; 4438 1.1 joerg template <class T> 4439 1.1 joerg class Z { 4440 1.1 joerg void x() { this->m; } 4441 1.1 joerg }; 4442 1.1 joerg memberExpr(isArrow()) 4443 1.1 joerg matches this->x, x, y.x, a, this->b 4444 1.1 joerg cxxDependentScopeMemberExpr(isArrow()) 4445 1.1 joerg matches this->m 4446 1.1 joerg unresolvedMemberExpr(isArrow()) 4447 1.1 joerg matches this->f<T>, f<T> 4448 1.1 joerg </pre></td></tr> 4449 1.1 joerg 4450 1.1 joerg 4451 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>></td><td class="name" onclick="toggle('hasAnyName0')"><a name="hasAnyName0Anchor">hasAnyName</a></td><td>StringRef, ..., StringRef</td></tr> 4452 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasAnyName0"><pre>Matches NamedDecl nodes that have any of the specified names. 4453 1.1.1.2 joerg 4454 1.1.1.2 joerg This matcher is only provided as a performance optimization of hasName. 4455 1.1.1.2 joerg hasAnyName(a, b, c) 4456 1.1.1.2 joerg is equivalent to, but faster than 4457 1.1.1.2 joerg anyOf(hasName(a), hasName(b), hasName(c)) 4458 1.1.1.2 joerg </pre></td></tr> 4459 1.1.1.2 joerg 4460 1.1.1.2 joerg 4461 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>></td><td class="name" onclick="toggle('hasExternalFormalLinkage0')"><a name="hasExternalFormalLinkage0Anchor">hasExternalFormalLinkage</a></td><td></td></tr> 4462 1.1 joerg <tr><td colspan="4" class="doc" id="hasExternalFormalLinkage0"><pre>Matches a declaration that has external formal linkage. 4463 1.1 joerg 4464 1.1 joerg Example matches only z (matcher = varDecl(hasExternalFormalLinkage())) 4465 1.1 joerg void f() { 4466 1.1 joerg int x; 4467 1.1 joerg static int y; 4468 1.1 joerg } 4469 1.1 joerg int z; 4470 1.1 joerg 4471 1.1 joerg Example matches f() because it has external formal linkage despite being 4472 1.1 joerg unique to the translation unit as though it has internal likage 4473 1.1 joerg (matcher = functionDecl(hasExternalFormalLinkage())) 4474 1.1 joerg 4475 1.1 joerg namespace { 4476 1.1 joerg void f() {} 4477 1.1 joerg } 4478 1.1 joerg </pre></td></tr> 4479 1.1 joerg 4480 1.1 joerg 4481 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>></td><td class="name" onclick="toggle('hasName0')"><a name="hasName0Anchor">hasName</a></td><td>StringRef Name</td></tr> 4482 1.1 joerg <tr><td colspan="4" class="doc" id="hasName0"><pre>Matches NamedDecl nodes that have the specified name. 4483 1.1 joerg 4484 1.1 joerg Supports specifying enclosing namespaces or classes by prefixing the name 4485 1.1 joerg with '<enclosing>::'. 4486 1.1 joerg Does not match typedefs of an underlying type with the given name. 4487 1.1 joerg 4488 1.1 joerg Example matches X (Name == "X") 4489 1.1 joerg class X; 4490 1.1 joerg 4491 1.1 joerg Example matches X (Name is one of "::a::b::X", "a::b::X", "b::X", "X") 4492 1.1 joerg namespace a { namespace b { class X; } } 4493 1.1 joerg </pre></td></tr> 4494 1.1 joerg 4495 1.1 joerg 4496 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>></td><td class="name" onclick="toggle('matchesName0')"><a name="matchesName0Anchor">matchesName</a></td><td>StringRef RegExp, Regex::RegexFlags Flags = NoFlags</td></tr> 4497 1.1 joerg <tr><td colspan="4" class="doc" id="matchesName0"><pre>Matches NamedDecl nodes whose fully qualified names contain 4498 1.1 joerg a substring matched by the given RegExp. 4499 1.1 joerg 4500 1.1 joerg Supports specifying enclosing namespaces or classes by 4501 1.1 joerg prefixing the name with '<enclosing>::'. Does not match typedefs 4502 1.1 joerg of an underlying type with the given name. 4503 1.1 joerg 4504 1.1 joerg Example matches X (regexp == "::X") 4505 1.1 joerg class X; 4506 1.1 joerg 4507 1.1 joerg Example matches X (regexp is one of "::X", "^foo::.*X", among others) 4508 1.1 joerg namespace foo { namespace bar { class X; } } 4509 1.1.1.2 joerg 4510 1.1.1.2 joerg If the matcher is used in clang-query, RegexFlags parameter 4511 1.1.1.2 joerg should be passed as a quoted string. e.g: "NoFlags". 4512 1.1.1.2 joerg Flags can be combined with '|' example "IgnoreCase | BasicRegex" 4513 1.1 joerg </pre></td></tr> 4514 1.1 joerg 4515 1.1 joerg 4516 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamespaceDecl.html">NamespaceDecl</a>></td><td class="name" onclick="toggle('isAnonymous0')"><a name="isAnonymous0Anchor">isAnonymous</a></td><td></td></tr> 4517 1.1 joerg <tr><td colspan="4" class="doc" id="isAnonymous0"><pre>Matches anonymous namespace declarations. 4518 1.1 joerg 4519 1.1 joerg Given 4520 1.1 joerg namespace n { 4521 1.1 joerg namespace {} // #1 4522 1.1 joerg } 4523 1.1 joerg namespaceDecl(isAnonymous()) will match #1 but not ::n. 4524 1.1 joerg </pre></td></tr> 4525 1.1 joerg 4526 1.1 joerg 4527 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamespaceDecl.html">NamespaceDecl</a>></td><td class="name" onclick="toggle('isInline0')"><a name="isInline0Anchor">isInline</a></td><td></td></tr> 4528 1.1 joerg <tr><td colspan="4" class="doc" id="isInline0"><pre>Matches function and namespace declarations that are marked with 4529 1.1 joerg the inline keyword. 4530 1.1 joerg 4531 1.1 joerg Given 4532 1.1 joerg inline void f(); 4533 1.1 joerg void g(); 4534 1.1 joerg namespace n { 4535 1.1 joerg inline namespace m {} 4536 1.1 joerg } 4537 1.1 joerg functionDecl(isInline()) will match ::f(). 4538 1.1 joerg namespaceDecl(isInline()) will match n::m. 4539 1.1 joerg </pre></td></tr> 4540 1.1 joerg 4541 1.1 joerg 4542 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPDefaultClause.html">OMPDefaultClause</a>></td><td class="name" onclick="toggle('isFirstPrivateKind0')"><a name="isFirstPrivateKind0Anchor">isFirstPrivateKind</a></td><td></td></tr> 4543 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="isFirstPrivateKind0"><pre>Matches if the OpenMP ``default`` clause has ``firstprivate`` kind 4544 1.1.1.2 joerg specified. 4545 1.1.1.2 joerg 4546 1.1.1.2 joerg Given 4547 1.1.1.2 joerg 4548 1.1.1.2 joerg #pragma omp parallel 4549 1.1.1.2 joerg #pragma omp parallel default(none) 4550 1.1.1.2 joerg #pragma omp parallel default(shared) 4551 1.1.1.2 joerg #pragma omp parallel default(firstprivate) 4552 1.1.1.2 joerg 4553 1.1.1.2 joerg ``ompDefaultClause(isFirstPrivateKind())`` matches only 4554 1.1.1.2 joerg ``default(firstprivate)``. 4555 1.1.1.2 joerg </pre></td></tr> 4556 1.1.1.2 joerg 4557 1.1.1.2 joerg 4558 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPDefaultClause.html">OMPDefaultClause</a>></td><td class="name" onclick="toggle('isNoneKind0')"><a name="isNoneKind0Anchor">isNoneKind</a></td><td></td></tr> 4559 1.1 joerg <tr><td colspan="4" class="doc" id="isNoneKind0"><pre>Matches if the OpenMP ``default`` clause has ``none`` kind specified. 4560 1.1 joerg 4561 1.1 joerg Given 4562 1.1 joerg 4563 1.1 joerg #pragma omp parallel 4564 1.1 joerg #pragma omp parallel default(none) 4565 1.1 joerg #pragma omp parallel default(shared) 4566 1.1.1.2 joerg #pragma omp parallel default(firstprivate) 4567 1.1 joerg 4568 1.1 joerg ``ompDefaultClause(isNoneKind())`` matches only ``default(none)``. 4569 1.1 joerg </pre></td></tr> 4570 1.1 joerg 4571 1.1 joerg 4572 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPDefaultClause.html">OMPDefaultClause</a>></td><td class="name" onclick="toggle('isSharedKind0')"><a name="isSharedKind0Anchor">isSharedKind</a></td><td></td></tr> 4573 1.1 joerg <tr><td colspan="4" class="doc" id="isSharedKind0"><pre>Matches if the OpenMP ``default`` clause has ``shared`` kind specified. 4574 1.1 joerg 4575 1.1 joerg Given 4576 1.1 joerg 4577 1.1 joerg #pragma omp parallel 4578 1.1 joerg #pragma omp parallel default(none) 4579 1.1 joerg #pragma omp parallel default(shared) 4580 1.1.1.2 joerg #pragma omp parallel default(firstprivate) 4581 1.1 joerg 4582 1.1 joerg ``ompDefaultClause(isSharedKind())`` matches only ``default(shared)``. 4583 1.1 joerg </pre></td></tr> 4584 1.1 joerg 4585 1.1 joerg 4586 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPExecutableDirective.html">OMPExecutableDirective</a>></td><td class="name" onclick="toggle('isAllowedToContainClauseKind0')"><a name="isAllowedToContainClauseKind0Anchor">isAllowedToContainClauseKind</a></td><td>OpenMPClauseKind CKind</td></tr> 4587 1.1 joerg <tr><td colspan="4" class="doc" id="isAllowedToContainClauseKind0"><pre>Matches if the OpenMP directive is allowed to contain the specified OpenMP 4588 1.1 joerg clause kind. 4589 1.1 joerg 4590 1.1 joerg Given 4591 1.1 joerg 4592 1.1 joerg #pragma omp parallel 4593 1.1 joerg #pragma omp parallel for 4594 1.1 joerg #pragma omp for 4595 1.1 joerg 4596 1.1 joerg `ompExecutableDirective(isAllowedToContainClause(OMPC_default))`` matches 4597 1.1 joerg ``omp parallel`` and ``omp parallel for``. 4598 1.1 joerg 4599 1.1 joerg If the matcher is use from clang-query, ``OpenMPClauseKind`` parameter 4600 1.1 joerg should be passed as a quoted string. e.g., 4601 1.1 joerg ``isAllowedToContainClauseKind("OMPC_default").`` 4602 1.1 joerg </pre></td></tr> 4603 1.1 joerg 4604 1.1 joerg 4605 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPExecutableDirective.html">OMPExecutableDirective</a>></td><td class="name" onclick="toggle('isStandaloneDirective0')"><a name="isStandaloneDirective0Anchor">isStandaloneDirective</a></td><td></td></tr> 4606 1.1 joerg <tr><td colspan="4" class="doc" id="isStandaloneDirective0"><pre>Matches standalone OpenMP directives, 4607 1.1 joerg i.e., directives that can't have a structured block. 4608 1.1 joerg 4609 1.1 joerg Given 4610 1.1 joerg 4611 1.1 joerg #pragma omp parallel 4612 1.1 joerg {} 4613 1.1 joerg #pragma omp taskyield 4614 1.1 joerg 4615 1.1 joerg ``ompExecutableDirective(isStandaloneDirective()))`` matches 4616 1.1 joerg ``omp taskyield``. 4617 1.1 joerg </pre></td></tr> 4618 1.1 joerg 4619 1.1 joerg 4620 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>></td><td class="name" onclick="toggle('isDerivedFrom3')"><a name="isDerivedFrom3Anchor">isDerivedFrom</a></td><td>std::string BaseName</td></tr> 4621 1.1 joerg <tr><td colspan="4" class="doc" id="isDerivedFrom3"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)). 4622 1.1 joerg </pre></td></tr> 4623 1.1 joerg 4624 1.1 joerg 4625 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>></td><td class="name" onclick="toggle('isDirectlyDerivedFrom3')"><a name="isDirectlyDerivedFrom3Anchor">isDirectlyDerivedFrom</a></td><td>std::string BaseName</td></tr> 4626 1.1 joerg <tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom3"><pre>Overloaded method as shortcut for isDirectlyDerivedFrom(hasName(...)). 4627 1.1 joerg </pre></td></tr> 4628 1.1 joerg 4629 1.1 joerg 4630 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>></td><td class="name" onclick="toggle('isSameOrDerivedFrom3')"><a name="isSameOrDerivedFrom3Anchor">isSameOrDerivedFrom</a></td><td>std::string BaseName</td></tr> 4631 1.1 joerg <tr><td colspan="4" class="doc" id="isSameOrDerivedFrom3"><pre>Overloaded method as shortcut for 4632 1.1 joerg isSameOrDerivedFrom(hasName(...)). 4633 1.1 joerg </pre></td></tr> 4634 1.1 joerg 4635 1.1 joerg 4636 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>></td><td class="name" onclick="toggle('argumentCountIs3')"><a name="argumentCountIs3Anchor">argumentCountIs</a></td><td>unsigned N</td></tr> 4637 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="argumentCountIs3"><pre>Checks that a call expression or a constructor call expression has 4638 1.1 joerg a specific number of arguments (including absent default arguments). 4639 1.1 joerg 4640 1.1 joerg Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2))) 4641 1.1 joerg void f(int x, int y); 4642 1.1 joerg f(0, 0); 4643 1.1 joerg </pre></td></tr> 4644 1.1 joerg 4645 1.1 joerg 4646 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>></td><td class="name" onclick="toggle('hasAnySelector0')"><a name="hasAnySelector0Anchor">hasAnySelector</a></td><td>StringRef, ..., StringRef</td></tr> 4647 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasAnySelector0"><pre>Matches when at least one of the supplied string equals to the 4648 1.1.1.2 joerg Selector.getAsString() 4649 1.1.1.2 joerg 4650 1.1.1.2 joerg matcher = objCMessageExpr(hasSelector("methodA:", "methodB:")); 4651 1.1.1.2 joerg matches both of the expressions below: 4652 1.1.1.2 joerg [myObj methodA:argA]; 4653 1.1.1.2 joerg [myObj methodB:argB]; 4654 1.1.1.2 joerg </pre></td></tr> 4655 1.1.1.2 joerg 4656 1.1.1.2 joerg 4657 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>></td><td class="name" onclick="toggle('hasKeywordSelector0')"><a name="hasKeywordSelector0Anchor">hasKeywordSelector</a></td><td></td></tr> 4658 1.1 joerg <tr><td colspan="4" class="doc" id="hasKeywordSelector0"><pre>Matches when the selector is a keyword selector 4659 1.1 joerg 4660 1.1 joerg objCMessageExpr(hasKeywordSelector()) matches the generated setFrame 4661 1.1 joerg message expression in 4662 1.1 joerg 4663 1.1 joerg UIWebView *webView = ...; 4664 1.1 joerg CGRect bodyFrame = webView.frame; 4665 1.1 joerg bodyFrame.size.height = self.bodyContentHeight; 4666 1.1 joerg webView.frame = bodyFrame; 4667 1.1 joerg // ^---- matches here 4668 1.1 joerg </pre></td></tr> 4669 1.1 joerg 4670 1.1 joerg 4671 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>></td><td class="name" onclick="toggle('hasNullSelector0')"><a name="hasNullSelector0Anchor">hasNullSelector</a></td><td></td></tr> 4672 1.1 joerg <tr><td colspan="4" class="doc" id="hasNullSelector0"><pre>Matches when the selector is the empty selector 4673 1.1 joerg 4674 1.1 joerg Matches only when the selector of the objCMessageExpr is NULL. This may 4675 1.1 joerg represent an error condition in the tree! 4676 1.1 joerg </pre></td></tr> 4677 1.1 joerg 4678 1.1 joerg 4679 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>></td><td class="name" onclick="toggle('hasSelector0')"><a name="hasSelector0Anchor">hasSelector</a></td><td>std::string BaseName</td></tr> 4680 1.1 joerg <tr><td colspan="4" class="doc" id="hasSelector0"><pre>Matches when BaseName == Selector.getAsString() 4681 1.1 joerg 4682 1.1 joerg matcher = objCMessageExpr(hasSelector("loadHTMLString:baseURL:")); 4683 1.1 joerg matches the outer message expr in the code below, but NOT the message 4684 1.1 joerg invocation for self.bodyView. 4685 1.1 joerg [self.bodyView loadHTMLString:html baseURL:NULL]; 4686 1.1 joerg </pre></td></tr> 4687 1.1 joerg 4688 1.1 joerg 4689 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>></td><td class="name" onclick="toggle('hasUnarySelector0')"><a name="hasUnarySelector0Anchor">hasUnarySelector</a></td><td></td></tr> 4690 1.1 joerg <tr><td colspan="4" class="doc" id="hasUnarySelector0"><pre>Matches when the selector is a Unary Selector 4691 1.1 joerg 4692 1.1 joerg matcher = objCMessageExpr(matchesSelector(hasUnarySelector()); 4693 1.1 joerg matches self.bodyView in the code below, but NOT the outer message 4694 1.1 joerg invocation of "loadHTMLString:baseURL:". 4695 1.1 joerg [self.bodyView loadHTMLString:html baseURL:NULL]; 4696 1.1 joerg </pre></td></tr> 4697 1.1 joerg 4698 1.1 joerg 4699 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>></td><td class="name" onclick="toggle('isClassMessage0')"><a name="isClassMessage0Anchor">isClassMessage</a></td><td></td></tr> 4700 1.1 joerg <tr><td colspan="4" class="doc" id="isClassMessage0"><pre>Returns true when the Objective-C message is sent to a class. 4701 1.1 joerg 4702 1.1 joerg Example 4703 1.1 joerg matcher = objcMessageExpr(isClassMessage()) 4704 1.1 joerg matches 4705 1.1 joerg [NSString stringWithFormat:@"format"]; 4706 1.1 joerg but not 4707 1.1 joerg NSString *x = @"hello"; 4708 1.1 joerg [x containsString:@"h"]; 4709 1.1 joerg </pre></td></tr> 4710 1.1 joerg 4711 1.1 joerg 4712 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>></td><td class="name" onclick="toggle('isInstanceMessage0')"><a name="isInstanceMessage0Anchor">isInstanceMessage</a></td><td></td></tr> 4713 1.1 joerg <tr><td colspan="4" class="doc" id="isInstanceMessage0"><pre>Returns true when the Objective-C message is sent to an instance. 4714 1.1 joerg 4715 1.1 joerg Example 4716 1.1 joerg matcher = objcMessageExpr(isInstanceMessage()) 4717 1.1 joerg matches 4718 1.1 joerg NSString *x = @"hello"; 4719 1.1 joerg [x containsString:@"h"]; 4720 1.1 joerg but not 4721 1.1 joerg [NSString stringWithFormat:@"format"]; 4722 1.1 joerg </pre></td></tr> 4723 1.1 joerg 4724 1.1 joerg 4725 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>></td><td class="name" onclick="toggle('matchesSelector0')"><a name="matchesSelector0Anchor">matchesSelector</a></td><td>StringRef RegExp, Regex::RegexFlags Flags = NoFlags</td></tr> 4726 1.1 joerg <tr><td colspan="4" class="doc" id="matchesSelector0"><pre>Matches ObjC selectors whose name contains 4727 1.1 joerg a substring matched by the given RegExp. 4728 1.1 joerg matcher = objCMessageExpr(matchesSelector("loadHTMLStringmatches the outer message expr in the code below, but NOT the message 4729 1.1 joerg invocation for self.bodyView. 4730 1.1 joerg [self.bodyView loadHTMLString:html baseURL:NULL]; 4731 1.1.1.2 joerg 4732 1.1.1.2 joerg If the matcher is used in clang-query, RegexFlags parameter 4733 1.1.1.2 joerg should be passed as a quoted string. e.g: "NoFlags". 4734 1.1.1.2 joerg Flags can be combined with '|' example "IgnoreCase | BasicRegex" 4735 1.1 joerg </pre></td></tr> 4736 1.1 joerg 4737 1.1 joerg 4738 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>></td><td class="name" onclick="toggle('numSelectorArgs0')"><a name="numSelectorArgs0Anchor">numSelectorArgs</a></td><td>unsigned N</td></tr> 4739 1.1 joerg <tr><td colspan="4" class="doc" id="numSelectorArgs0"><pre>Matches when the selector has the specified number of arguments 4740 1.1 joerg 4741 1.1 joerg matcher = objCMessageExpr(numSelectorArgs(0)); 4742 1.1 joerg matches self.bodyView in the code below 4743 1.1 joerg 4744 1.1 joerg matcher = objCMessageExpr(numSelectorArgs(2)); 4745 1.1 joerg matches the invocation of "loadHTMLString:baseURL:" but not that 4746 1.1 joerg of self.bodyView 4747 1.1 joerg [self.bodyView loadHTMLString:html baseURL:NULL]; 4748 1.1 joerg </pre></td></tr> 4749 1.1 joerg 4750 1.1 joerg 4751 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>></td><td class="name" onclick="toggle('isClassMethod0')"><a name="isClassMethod0Anchor">isClassMethod</a></td><td></td></tr> 4752 1.1 joerg <tr><td colspan="4" class="doc" id="isClassMethod0"><pre>Returns true when the Objective-C method declaration is a class method. 4753 1.1 joerg 4754 1.1 joerg Example 4755 1.1 joerg matcher = objcMethodDecl(isClassMethod()) 4756 1.1 joerg matches 4757 1.1 joerg @interface I + (void)foo; @end 4758 1.1 joerg but not 4759 1.1 joerg @interface I - (void)bar; @end 4760 1.1 joerg </pre></td></tr> 4761 1.1 joerg 4762 1.1 joerg 4763 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>></td><td class="name" onclick="toggle('isDefinition2')"><a name="isDefinition2Anchor">isDefinition</a></td><td></td></tr> 4764 1.1 joerg <tr><td colspan="4" class="doc" id="isDefinition2"><pre>Matches if a declaration has a body attached. 4765 1.1 joerg 4766 1.1 joerg Example matches A, va, fa 4767 1.1 joerg class A {}; 4768 1.1 joerg class B; // Doesn't match, as it has no body. 4769 1.1 joerg int va; 4770 1.1 joerg extern int vb; // Doesn't match, as it doesn't define the variable. 4771 1.1 joerg void fa() {} 4772 1.1 joerg void fb(); // Doesn't match, as it has no body. 4773 1.1 joerg @interface X 4774 1.1 joerg - (void)ma; // Doesn't match, interface is declaration. 4775 1.1 joerg @end 4776 1.1 joerg @implementation X 4777 1.1 joerg - (void)ma {} 4778 1.1 joerg @end 4779 1.1 joerg 4780 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>>, 4781 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>> 4782 1.1 joerg </pre></td></tr> 4783 1.1 joerg 4784 1.1 joerg 4785 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>></td><td class="name" onclick="toggle('isInstanceMethod0')"><a name="isInstanceMethod0Anchor">isInstanceMethod</a></td><td></td></tr> 4786 1.1 joerg <tr><td colspan="4" class="doc" id="isInstanceMethod0"><pre>Returns true when the Objective-C method declaration is an instance method. 4787 1.1 joerg 4788 1.1 joerg Example 4789 1.1 joerg matcher = objcMethodDecl(isInstanceMethod()) 4790 1.1 joerg matches 4791 1.1 joerg @interface I - (void)bar; @end 4792 1.1 joerg but not 4793 1.1 joerg @interface I + (void)foo; @end 4794 1.1 joerg </pre></td></tr> 4795 1.1 joerg 4796 1.1 joerg 4797 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>></td><td class="name" onclick="toggle('hasDefaultArgument0')"><a name="hasDefaultArgument0Anchor">hasDefaultArgument</a></td><td></td></tr> 4798 1.1 joerg <tr><td colspan="4" class="doc" id="hasDefaultArgument0"><pre>Matches a declaration that has default arguments. 4799 1.1 joerg 4800 1.1 joerg Example matches y (matcher = parmVarDecl(hasDefaultArgument())) 4801 1.1 joerg void x(int val) {} 4802 1.1 joerg void y(int val = 0) {} 4803 1.1.1.2 joerg 4804 1.1.1.2 joerg Deprecated. Use hasInitializer() instead to be able to 4805 1.1.1.2 joerg match on the contents of the default argument. For example: 4806 1.1.1.2 joerg 4807 1.1.1.2 joerg void x(int val = 7) {} 4808 1.1.1.2 joerg void y(int val = 42) {} 4809 1.1.1.2 joerg parmVarDecl(hasInitializer(integerLiteral(equals(42)))) 4810 1.1.1.2 joerg matches the parameter of y 4811 1.1.1.2 joerg 4812 1.1.1.2 joerg A matcher such as 4813 1.1.1.2 joerg parmVarDecl(hasInitializer(anything())) 4814 1.1.1.2 joerg is equivalent to parmVarDecl(hasDefaultArgument()). 4815 1.1.1.2 joerg </pre></td></tr> 4816 1.1.1.2 joerg 4817 1.1.1.2 joerg 4818 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>></td><td class="name" onclick="toggle('isAtPosition0')"><a name="isAtPosition0Anchor">isAtPosition</a></td><td>unsigned N</td></tr> 4819 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="isAtPosition0"><pre>Matches the ParmVarDecl nodes that are at the N'th position in the parameter 4820 1.1.1.2 joerg list. The parameter list could be that of either a block, function, or 4821 1.1.1.2 joerg objc-method. 4822 1.1.1.2 joerg 4823 1.1.1.2 joerg 4824 1.1.1.2 joerg Given 4825 1.1.1.2 joerg 4826 1.1.1.2 joerg void f(int a, int b, int c) { 4827 1.1.1.2 joerg } 4828 1.1.1.2 joerg 4829 1.1.1.2 joerg ``parmVarDecl(isAtPosition(0))`` matches ``int a``. 4830 1.1.1.2 joerg 4831 1.1.1.2 joerg ``parmVarDecl(isAtPosition(1))`` matches ``int b``. 4832 1.1 joerg </pre></td></tr> 4833 1.1 joerg 4834 1.1 joerg 4835 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('asString0')"><a name="asString0Anchor">asString</a></td><td>std::string Name</td></tr> 4836 1.1 joerg <tr><td colspan="4" class="doc" id="asString0"><pre>Matches if the matched type is represented by the given string. 4837 1.1 joerg 4838 1.1 joerg Given 4839 1.1 joerg class Y { public: void x(); }; 4840 1.1 joerg void z() { Y* y; y->x(); } 4841 1.1 joerg cxxMemberCallExpr(on(hasType(asString("class Y *")))) 4842 1.1 joerg matches y->x() 4843 1.1 joerg </pre></td></tr> 4844 1.1 joerg 4845 1.1 joerg 4846 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('equalsBoundNode3')"><a name="equalsBoundNode3Anchor">equalsBoundNode</a></td><td>std::string ID</td></tr> 4847 1.1 joerg <tr><td colspan="4" class="doc" id="equalsBoundNode3"><pre>Matches if a node equals a previously bound node. 4848 1.1 joerg 4849 1.1 joerg Matches a node if it equals the node previously bound to ID. 4850 1.1 joerg 4851 1.1 joerg Given 4852 1.1 joerg class X { int a; int b; }; 4853 1.1 joerg cxxRecordDecl( 4854 1.1 joerg has(fieldDecl(hasName("a"), hasType(type().bind("t")))), 4855 1.1 joerg has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t")))))) 4856 1.1 joerg matches the class X, as a and b have the same type. 4857 1.1 joerg 4858 1.1 joerg Note that when multiple matches are involved via forEach* matchers, 4859 1.1 joerg equalsBoundNodes acts as a filter. 4860 1.1 joerg For example: 4861 1.1 joerg compoundStmt( 4862 1.1 joerg forEachDescendant(varDecl().bind("d")), 4863 1.1 joerg forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d")))))) 4864 1.1 joerg will trigger a match for each combination of variable declaration 4865 1.1 joerg and reference to that variable declaration within a compound statement. 4866 1.1 joerg </pre></td></tr> 4867 1.1 joerg 4868 1.1 joerg 4869 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('hasLocalQualifiers0')"><a name="hasLocalQualifiers0Anchor">hasLocalQualifiers</a></td><td></td></tr> 4870 1.1 joerg <tr><td colspan="4" class="doc" id="hasLocalQualifiers0"><pre>Matches QualType nodes that have local CV-qualifiers attached to 4871 1.1 joerg the node, not hidden within a typedef. 4872 1.1 joerg 4873 1.1 joerg Given 4874 1.1 joerg typedef const int const_int; 4875 1.1 joerg const_int i; 4876 1.1 joerg int *const j; 4877 1.1 joerg int *volatile k; 4878 1.1 joerg int m; 4879 1.1 joerg varDecl(hasType(hasLocalQualifiers())) matches only j and k. 4880 1.1 joerg i is const-qualified but the qualifier is not local. 4881 1.1 joerg </pre></td></tr> 4882 1.1 joerg 4883 1.1 joerg 4884 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('isAnyCharacter0')"><a name="isAnyCharacter0Anchor">isAnyCharacter</a></td><td></td></tr> 4885 1.1 joerg <tr><td colspan="4" class="doc" id="isAnyCharacter0"><pre>Matches QualType nodes that are of character type. 4886 1.1 joerg 4887 1.1 joerg Given 4888 1.1 joerg void a(char); 4889 1.1 joerg void b(wchar_t); 4890 1.1 joerg void c(double); 4891 1.1 joerg functionDecl(hasAnyParameter(hasType(isAnyCharacter()))) 4892 1.1 joerg matches "a(char)", "b(wchar_t)", but not "c(double)". 4893 1.1 joerg </pre></td></tr> 4894 1.1 joerg 4895 1.1 joerg 4896 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('isAnyPointer0')"><a name="isAnyPointer0Anchor">isAnyPointer</a></td><td></td></tr> 4897 1.1 joerg <tr><td colspan="4" class="doc" id="isAnyPointer0"><pre>Matches QualType nodes that are of any pointer type; this includes 4898 1.1 joerg the Objective-C object pointer type, which is different despite being 4899 1.1 joerg syntactically similar. 4900 1.1 joerg 4901 1.1 joerg Given 4902 1.1 joerg int *i = nullptr; 4903 1.1 joerg 4904 1.1 joerg @interface Foo 4905 1.1 joerg @end 4906 1.1 joerg Foo *f; 4907 1.1 joerg 4908 1.1 joerg int j; 4909 1.1 joerg varDecl(hasType(isAnyPointer())) 4910 1.1 joerg matches "int *i" and "Foo *f", but not "int j". 4911 1.1 joerg </pre></td></tr> 4912 1.1 joerg 4913 1.1 joerg 4914 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('isConstQualified0')"><a name="isConstQualified0Anchor">isConstQualified</a></td><td></td></tr> 4915 1.1 joerg <tr><td colspan="4" class="doc" id="isConstQualified0"><pre>Matches QualType nodes that are const-qualified, i.e., that 4916 1.1 joerg include "top-level" const. 4917 1.1 joerg 4918 1.1 joerg Given 4919 1.1 joerg void a(int); 4920 1.1 joerg void b(int const); 4921 1.1 joerg void c(const int); 4922 1.1 joerg void d(const int*); 4923 1.1 joerg void e(int const) {}; 4924 1.1 joerg functionDecl(hasAnyParameter(hasType(isConstQualified()))) 4925 1.1 joerg matches "void b(int const)", "void c(const int)" and 4926 1.1 joerg "void e(int const) {}". It does not match d as there 4927 1.1 joerg is no top-level const on the parameter type "const int *". 4928 1.1 joerg </pre></td></tr> 4929 1.1 joerg 4930 1.1 joerg 4931 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('isInteger0')"><a name="isInteger0Anchor">isInteger</a></td><td></td></tr> 4932 1.1 joerg <tr><td colspan="4" class="doc" id="isInteger0"><pre>Matches QualType nodes that are of integer type. 4933 1.1 joerg 4934 1.1 joerg Given 4935 1.1 joerg void a(int); 4936 1.1 joerg void b(long); 4937 1.1 joerg void c(double); 4938 1.1 joerg functionDecl(hasAnyParameter(hasType(isInteger()))) 4939 1.1 joerg matches "a(int)", "b(long)", but not "c(double)". 4940 1.1 joerg </pre></td></tr> 4941 1.1 joerg 4942 1.1 joerg 4943 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('isSignedInteger0')"><a name="isSignedInteger0Anchor">isSignedInteger</a></td><td></td></tr> 4944 1.1 joerg <tr><td colspan="4" class="doc" id="isSignedInteger0"><pre>Matches QualType nodes that are of signed integer type. 4945 1.1 joerg 4946 1.1 joerg Given 4947 1.1 joerg void a(int); 4948 1.1 joerg void b(unsigned long); 4949 1.1 joerg void c(double); 4950 1.1 joerg functionDecl(hasAnyParameter(hasType(isSignedInteger()))) 4951 1.1 joerg matches "a(int)", but not "b(unsigned long)" and "c(double)". 4952 1.1 joerg </pre></td></tr> 4953 1.1 joerg 4954 1.1 joerg 4955 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('isUnsignedInteger0')"><a name="isUnsignedInteger0Anchor">isUnsignedInteger</a></td><td></td></tr> 4956 1.1 joerg <tr><td colspan="4" class="doc" id="isUnsignedInteger0"><pre>Matches QualType nodes that are of unsigned integer type. 4957 1.1 joerg 4958 1.1 joerg Given 4959 1.1 joerg void a(int); 4960 1.1 joerg void b(unsigned long); 4961 1.1 joerg void c(double); 4962 1.1 joerg functionDecl(hasAnyParameter(hasType(isUnsignedInteger()))) 4963 1.1 joerg matches "b(unsigned long)", but not "a(int)" and "c(double)". 4964 1.1 joerg </pre></td></tr> 4965 1.1 joerg 4966 1.1 joerg 4967 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('isVolatileQualified0')"><a name="isVolatileQualified0Anchor">isVolatileQualified</a></td><td></td></tr> 4968 1.1 joerg <tr><td colspan="4" class="doc" id="isVolatileQualified0"><pre>Matches QualType nodes that are volatile-qualified, i.e., that 4969 1.1 joerg include "top-level" volatile. 4970 1.1 joerg 4971 1.1 joerg Given 4972 1.1 joerg void a(int); 4973 1.1 joerg void b(int volatile); 4974 1.1 joerg void c(volatile int); 4975 1.1 joerg void d(volatile int*); 4976 1.1 joerg void e(int volatile) {}; 4977 1.1 joerg functionDecl(hasAnyParameter(hasType(isVolatileQualified()))) 4978 1.1 joerg matches "void b(int volatile)", "void c(volatile int)" and 4979 1.1 joerg "void e(int volatile) {}". It does not match d as there 4980 1.1 joerg is no top-level volatile on the parameter type "volatile int *". 4981 1.1 joerg </pre></td></tr> 4982 1.1 joerg 4983 1.1 joerg 4984 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('equalsBoundNode0')"><a name="equalsBoundNode0Anchor">equalsBoundNode</a></td><td>std::string ID</td></tr> 4985 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="equalsBoundNode0"><pre>Matches if a node equals a previously bound node. 4986 1.1 joerg 4987 1.1.1.2 joerg Matches a node if it equals the node previously bound to ID. 4988 1.1 joerg 4989 1.1.1.2 joerg Given 4990 1.1.1.2 joerg class X { int a; int b; }; 4991 1.1.1.2 joerg cxxRecordDecl( 4992 1.1.1.2 joerg has(fieldDecl(hasName("a"), hasType(type().bind("t")))), 4993 1.1.1.2 joerg has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t")))))) 4994 1.1.1.2 joerg matches the class X, as a and b have the same type. 4995 1.1 joerg 4996 1.1 joerg Note that when multiple matches are involved via forEach* matchers, 4997 1.1 joerg equalsBoundNodes acts as a filter. 4998 1.1 joerg For example: 4999 1.1 joerg compoundStmt( 5000 1.1 joerg forEachDescendant(varDecl().bind("d")), 5001 1.1 joerg forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d")))))) 5002 1.1 joerg will trigger a match for each combination of variable declaration 5003 1.1 joerg and reference to that variable declaration within a compound statement. 5004 1.1 joerg </pre></td></tr> 5005 1.1 joerg 5006 1.1 joerg 5007 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('equalsNode1')"><a name="equalsNode1Anchor">equalsNode</a></td><td>const Stmt* Other</td></tr> 5008 1.1 joerg <tr><td colspan="4" class="doc" id="equalsNode1"><pre>Matches if a node equals another node. 5009 1.1 joerg 5010 1.1 joerg Stmt has pointer identity in the AST. 5011 1.1 joerg </pre></td></tr> 5012 1.1 joerg 5013 1.1 joerg 5014 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('isExpandedFromMacro1')"><a name="isExpandedFromMacro1Anchor">isExpandedFromMacro</a></td><td>std::string MacroName</td></tr> 5015 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="isExpandedFromMacro1"><pre>Matches statements that are (transitively) expanded from the named macro. 5016 1.1.1.2 joerg Does not match if only part of the statement is expanded from that macro or 5017 1.1.1.2 joerg if different parts of the the statement are expanded from different 5018 1.1.1.2 joerg appearances of the macro. 5019 1.1.1.2 joerg </pre></td></tr> 5020 1.1.1.2 joerg 5021 1.1.1.2 joerg 5022 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('isExpansionInFileMatching1')"><a name="isExpansionInFileMatching1Anchor">isExpansionInFileMatching</a></td><td>StringRef RegExp, Regex::RegexFlags Flags = NoFlags</td></tr> 5023 1.1 joerg <tr><td colspan="4" class="doc" id="isExpansionInFileMatching1"><pre>Matches AST nodes that were expanded within files whose name is 5024 1.1 joerg partially matching a given regex. 5025 1.1 joerg 5026 1.1 joerg Example matches Y but not X 5027 1.1 joerg (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*")) 5028 1.1 joerg #include "ASTMatcher.h" 5029 1.1 joerg class X {}; 5030 1.1 joerg ASTMatcher.h: 5031 1.1 joerg class Y {}; 5032 1.1 joerg 5033 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> 5034 1.1.1.2 joerg 5035 1.1.1.2 joerg If the matcher is used in clang-query, RegexFlags parameter 5036 1.1.1.2 joerg should be passed as a quoted string. e.g: "NoFlags". 5037 1.1.1.2 joerg Flags can be combined with '|' example "IgnoreCase | BasicRegex" 5038 1.1 joerg </pre></td></tr> 5039 1.1 joerg 5040 1.1 joerg 5041 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('isExpansionInMainFile1')"><a name="isExpansionInMainFile1Anchor">isExpansionInMainFile</a></td><td></td></tr> 5042 1.1 joerg <tr><td colspan="4" class="doc" id="isExpansionInMainFile1"><pre>Matches AST nodes that were expanded within the main-file. 5043 1.1 joerg 5044 1.1 joerg Example matches X but not Y 5045 1.1 joerg (matcher = cxxRecordDecl(isExpansionInMainFile()) 5046 1.1 joerg #include <Y.h> 5047 1.1 joerg class X {}; 5048 1.1 joerg Y.h: 5049 1.1 joerg class Y {}; 5050 1.1 joerg 5051 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> 5052 1.1 joerg </pre></td></tr> 5053 1.1 joerg 5054 1.1 joerg 5055 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('isExpansionInSystemHeader1')"><a name="isExpansionInSystemHeader1Anchor">isExpansionInSystemHeader</a></td><td></td></tr> 5056 1.1 joerg <tr><td colspan="4" class="doc" id="isExpansionInSystemHeader1"><pre>Matches AST nodes that were expanded within system-header-files. 5057 1.1 joerg 5058 1.1 joerg Example matches Y but not X 5059 1.1 joerg (matcher = cxxRecordDecl(isExpansionInSystemHeader()) 5060 1.1 joerg #include <SystemHeader.h> 5061 1.1 joerg class X {}; 5062 1.1 joerg SystemHeader.h: 5063 1.1 joerg class Y {}; 5064 1.1 joerg 5065 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> 5066 1.1 joerg </pre></td></tr> 5067 1.1 joerg 5068 1.1 joerg 5069 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('isInTemplateInstantiation0')"><a name="isInTemplateInstantiation0Anchor">isInTemplateInstantiation</a></td><td></td></tr> 5070 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="isInTemplateInstantiation0"><pre>Matches statements inside of a template instantiation. 5071 1.1 joerg 5072 1.1 joerg Given 5073 1.1.1.2 joerg int j; 5074 1.1.1.2 joerg template<typename T> void A(T t) { T i; j += 42;} 5075 1.1.1.2 joerg A(0); 5076 1.1.1.2 joerg A(0U); 5077 1.1.1.2 joerg declStmt(isInTemplateInstantiation()) 5078 1.1.1.2 joerg matches 'int i;' and 'unsigned i'. 5079 1.1.1.2 joerg unless(stmt(isInTemplateInstantiation())) 5080 1.1.1.2 joerg will NOT match j += 42; as it's shared between the template definition and 5081 1.1.1.2 joerg instantiation. 5082 1.1 joerg </pre></td></tr> 5083 1.1 joerg 5084 1.1 joerg 5085 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1StringLiteral.html">StringLiteral</a>></td><td class="name" onclick="toggle('hasSize1')"><a name="hasSize1Anchor">hasSize</a></td><td>unsigned N</td></tr> 5086 1.1 joerg <tr><td colspan="4" class="doc" id="hasSize1"><pre>Matches nodes that have the specified size. 5087 1.1 joerg 5088 1.1 joerg Given 5089 1.1 joerg int a[42]; 5090 1.1 joerg int b[2 * 21]; 5091 1.1 joerg int c[41], d[43]; 5092 1.1 joerg char *s = "abcd"; 5093 1.1 joerg wchar_t *ws = L"abcd"; 5094 1.1 joerg char *w = "a"; 5095 1.1 joerg constantArrayType(hasSize(42)) 5096 1.1 joerg matches "int a[42]" and "int b[2 * 21]" 5097 1.1 joerg stringLiteral(hasSize(4)) 5098 1.1 joerg matches "abcd", L"abcd" 5099 1.1 joerg </pre></td></tr> 5100 1.1 joerg 5101 1.1 joerg 5102 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>></td><td class="name" onclick="toggle('isClass0')"><a name="isClass0Anchor">isClass</a></td><td></td></tr> 5103 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="isClass0"><pre>Matches TagDecl object that are spelled with "class." 5104 1.1.1.2 joerg 5105 1.1.1.2 joerg Example matches C, but not S, U or E. 5106 1.1.1.2 joerg struct S {}; 5107 1.1.1.2 joerg class C {}; 5108 1.1.1.2 joerg union U {}; 5109 1.1.1.2 joerg enum E {}; 5110 1.1.1.2 joerg </pre></td></tr> 5111 1.1.1.2 joerg 5112 1.1.1.2 joerg 5113 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>></td><td class="name" onclick="toggle('isDefinition0')"><a name="isDefinition0Anchor">isDefinition</a></td><td></td></tr> 5114 1.1 joerg <tr><td colspan="4" class="doc" id="isDefinition0"><pre>Matches if a declaration has a body attached. 5115 1.1 joerg 5116 1.1 joerg Example matches A, va, fa 5117 1.1 joerg class A {}; 5118 1.1 joerg class B; // Doesn't match, as it has no body. 5119 1.1 joerg int va; 5120 1.1 joerg extern int vb; // Doesn't match, as it doesn't define the variable. 5121 1.1 joerg void fa() {} 5122 1.1 joerg void fb(); // Doesn't match, as it has no body. 5123 1.1 joerg @interface X 5124 1.1 joerg - (void)ma; // Doesn't match, interface is declaration. 5125 1.1 joerg @end 5126 1.1 joerg @implementation X 5127 1.1 joerg - (void)ma {} 5128 1.1 joerg @end 5129 1.1 joerg 5130 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>>, 5131 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>> 5132 1.1 joerg </pre></td></tr> 5133 1.1 joerg 5134 1.1 joerg 5135 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>></td><td class="name" onclick="toggle('isEnum0')"><a name="isEnum0Anchor">isEnum</a></td><td></td></tr> 5136 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="isEnum0"><pre>Matches TagDecl object that are spelled with "enum." 5137 1.1.1.2 joerg 5138 1.1.1.2 joerg Example matches E, but not C, S or U. 5139 1.1.1.2 joerg struct S {}; 5140 1.1.1.2 joerg class C {}; 5141 1.1.1.2 joerg union U {}; 5142 1.1.1.2 joerg enum E {}; 5143 1.1.1.2 joerg </pre></td></tr> 5144 1.1.1.2 joerg 5145 1.1.1.2 joerg 5146 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>></td><td class="name" onclick="toggle('isStruct0')"><a name="isStruct0Anchor">isStruct</a></td><td></td></tr> 5147 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="isStruct0"><pre>Matches TagDecl object that are spelled with "struct." 5148 1.1.1.2 joerg 5149 1.1.1.2 joerg Example matches S, but not C, U or E. 5150 1.1.1.2 joerg struct S {}; 5151 1.1.1.2 joerg class C {}; 5152 1.1.1.2 joerg union U {}; 5153 1.1.1.2 joerg enum E {}; 5154 1.1.1.2 joerg </pre></td></tr> 5155 1.1.1.2 joerg 5156 1.1.1.2 joerg 5157 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>></td><td class="name" onclick="toggle('isUnion0')"><a name="isUnion0Anchor">isUnion</a></td><td></td></tr> 5158 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="isUnion0"><pre>Matches TagDecl object that are spelled with "union." 5159 1.1.1.2 joerg 5160 1.1.1.2 joerg Example matches U, but not C, S or E. 5161 1.1.1.2 joerg struct S {}; 5162 1.1.1.2 joerg class C {}; 5163 1.1.1.2 joerg union U {}; 5164 1.1.1.2 joerg enum E {}; 5165 1.1.1.2 joerg </pre></td></tr> 5166 1.1.1.2 joerg 5167 1.1.1.2 joerg 5168 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>></td><td class="name" onclick="toggle('equalsIntegralValue0')"><a name="equalsIntegralValue0Anchor">equalsIntegralValue</a></td><td>std::string Value</td></tr> 5169 1.1 joerg <tr><td colspan="4" class="doc" id="equalsIntegralValue0"><pre>Matches a TemplateArgument of integral type with a given value. 5170 1.1 joerg 5171 1.1 joerg Note that 'Value' is a string as the template argument's value is 5172 1.1 joerg an arbitrary precision integer. 'Value' must be euqal to the canonical 5173 1.1 joerg representation of that integral value in base 10. 5174 1.1 joerg 5175 1.1 joerg Given 5176 1.1 joerg template<int T> struct C {}; 5177 1.1 joerg C<42> c; 5178 1.1 joerg classTemplateSpecializationDecl( 5179 1.1 joerg hasAnyTemplateArgument(equalsIntegralValue("42"))) 5180 1.1 joerg matches the implicit instantiation of C in C<42>. 5181 1.1 joerg </pre></td></tr> 5182 1.1 joerg 5183 1.1 joerg 5184 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>></td><td class="name" onclick="toggle('isIntegral0')"><a name="isIntegral0Anchor">isIntegral</a></td><td></td></tr> 5185 1.1 joerg <tr><td colspan="4" class="doc" id="isIntegral0"><pre>Matches a TemplateArgument that is an integral value. 5186 1.1 joerg 5187 1.1 joerg Given 5188 1.1 joerg template<int T> struct C {}; 5189 1.1 joerg C<42> c; 5190 1.1 joerg classTemplateSpecializationDecl( 5191 1.1 joerg hasAnyTemplateArgument(isIntegral())) 5192 1.1 joerg matches the implicit instantiation of C in C<42> 5193 1.1 joerg with isIntegral() matching 42. 5194 1.1 joerg </pre></td></tr> 5195 1.1 joerg 5196 1.1 joerg 5197 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>></td><td class="name" onclick="toggle('templateArgumentCountIs1')"><a name="templateArgumentCountIs1Anchor">templateArgumentCountIs</a></td><td>unsigned N</td></tr> 5198 1.1 joerg <tr><td colspan="4" class="doc" id="templateArgumentCountIs1"><pre>Matches if the number of template arguments equals N. 5199 1.1 joerg 5200 1.1 joerg Given 5201 1.1 joerg template<typename T> struct C {}; 5202 1.1 joerg C<int> c; 5203 1.1 joerg classTemplateSpecializationDecl(templateArgumentCountIs(1)) 5204 1.1 joerg matches C<int>. 5205 1.1 joerg </pre></td></tr> 5206 1.1 joerg 5207 1.1 joerg 5208 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>></td><td class="name" onclick="toggle('isExpandedFromMacro2')"><a name="isExpandedFromMacro2Anchor">isExpandedFromMacro</a></td><td>std::string MacroName</td></tr> 5209 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="isExpandedFromMacro2"><pre>Matches statements that are (transitively) expanded from the named macro. 5210 1.1.1.2 joerg Does not match if only part of the statement is expanded from that macro or 5211 1.1.1.2 joerg if different parts of the the statement are expanded from different 5212 1.1.1.2 joerg appearances of the macro. 5213 1.1.1.2 joerg </pre></td></tr> 5214 1.1.1.2 joerg 5215 1.1.1.2 joerg 5216 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>></td><td class="name" onclick="toggle('isExpansionInFileMatching2')"><a name="isExpansionInFileMatching2Anchor">isExpansionInFileMatching</a></td><td>StringRef RegExp, Regex::RegexFlags Flags = NoFlags</td></tr> 5217 1.1 joerg <tr><td colspan="4" class="doc" id="isExpansionInFileMatching2"><pre>Matches AST nodes that were expanded within files whose name is 5218 1.1 joerg partially matching a given regex. 5219 1.1 joerg 5220 1.1 joerg Example matches Y but not X 5221 1.1 joerg (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*")) 5222 1.1 joerg #include "ASTMatcher.h" 5223 1.1 joerg class X {}; 5224 1.1 joerg ASTMatcher.h: 5225 1.1 joerg class Y {}; 5226 1.1 joerg 5227 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> 5228 1.1.1.2 joerg 5229 1.1.1.2 joerg If the matcher is used in clang-query, RegexFlags parameter 5230 1.1.1.2 joerg should be passed as a quoted string. e.g: "NoFlags". 5231 1.1.1.2 joerg Flags can be combined with '|' example "IgnoreCase | BasicRegex" 5232 1.1 joerg </pre></td></tr> 5233 1.1 joerg 5234 1.1 joerg 5235 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>></td><td class="name" onclick="toggle('isExpansionInMainFile2')"><a name="isExpansionInMainFile2Anchor">isExpansionInMainFile</a></td><td></td></tr> 5236 1.1 joerg <tr><td colspan="4" class="doc" id="isExpansionInMainFile2"><pre>Matches AST nodes that were expanded within the main-file. 5237 1.1 joerg 5238 1.1 joerg Example matches X but not Y 5239 1.1 joerg (matcher = cxxRecordDecl(isExpansionInMainFile()) 5240 1.1 joerg #include <Y.h> 5241 1.1 joerg class X {}; 5242 1.1 joerg Y.h: 5243 1.1 joerg class Y {}; 5244 1.1 joerg 5245 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> 5246 1.1 joerg </pre></td></tr> 5247 1.1 joerg 5248 1.1 joerg 5249 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>></td><td class="name" onclick="toggle('isExpansionInSystemHeader2')"><a name="isExpansionInSystemHeader2Anchor">isExpansionInSystemHeader</a></td><td></td></tr> 5250 1.1 joerg <tr><td colspan="4" class="doc" id="isExpansionInSystemHeader2"><pre>Matches AST nodes that were expanded within system-header-files. 5251 1.1 joerg 5252 1.1 joerg Example matches Y but not X 5253 1.1 joerg (matcher = cxxRecordDecl(isExpansionInSystemHeader()) 5254 1.1 joerg #include <SystemHeader.h> 5255 1.1 joerg class X {}; 5256 1.1 joerg SystemHeader.h: 5257 1.1 joerg class Y {}; 5258 1.1 joerg 5259 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> 5260 1.1 joerg </pre></td></tr> 5261 1.1 joerg 5262 1.1 joerg 5263 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('booleanType0')"><a name="booleanType0Anchor">booleanType</a></td><td></td></tr> 5264 1.1 joerg <tr><td colspan="4" class="doc" id="booleanType0"><pre>Matches type bool. 5265 1.1 joerg 5266 1.1 joerg Given 5267 1.1 joerg struct S { bool func(); }; 5268 1.1 joerg functionDecl(returns(booleanType())) 5269 1.1 joerg matches "bool func();" 5270 1.1 joerg </pre></td></tr> 5271 1.1 joerg 5272 1.1 joerg 5273 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('equalsBoundNode2')"><a name="equalsBoundNode2Anchor">equalsBoundNode</a></td><td>std::string ID</td></tr> 5274 1.1 joerg <tr><td colspan="4" class="doc" id="equalsBoundNode2"><pre>Matches if a node equals a previously bound node. 5275 1.1 joerg 5276 1.1 joerg Matches a node if it equals the node previously bound to ID. 5277 1.1 joerg 5278 1.1 joerg Given 5279 1.1 joerg class X { int a; int b; }; 5280 1.1 joerg cxxRecordDecl( 5281 1.1 joerg has(fieldDecl(hasName("a"), hasType(type().bind("t")))), 5282 1.1 joerg has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t")))))) 5283 1.1 joerg matches the class X, as a and b have the same type. 5284 1.1 joerg 5285 1.1 joerg Note that when multiple matches are involved via forEach* matchers, 5286 1.1 joerg equalsBoundNodes acts as a filter. 5287 1.1 joerg For example: 5288 1.1 joerg compoundStmt( 5289 1.1 joerg forEachDescendant(varDecl().bind("d")), 5290 1.1 joerg forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d")))))) 5291 1.1 joerg will trigger a match for each combination of variable declaration 5292 1.1 joerg and reference to that variable declaration within a compound statement. 5293 1.1 joerg </pre></td></tr> 5294 1.1 joerg 5295 1.1 joerg 5296 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('equalsNode2')"><a name="equalsNode2Anchor">equalsNode</a></td><td>const Type* Other</td></tr> 5297 1.1 joerg <tr><td colspan="4" class="doc" id="equalsNode2"><pre>Matches if a node equals another node. 5298 1.1 joerg 5299 1.1 joerg Type has pointer identity in the AST. 5300 1.1 joerg </pre></td></tr> 5301 1.1 joerg 5302 1.1 joerg 5303 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('realFloatingPointType0')"><a name="realFloatingPointType0Anchor">realFloatingPointType</a></td><td></td></tr> 5304 1.1 joerg <tr><td colspan="4" class="doc" id="realFloatingPointType0"><pre>Matches any real floating-point type (float, double, long double). 5305 1.1 joerg 5306 1.1 joerg Given 5307 1.1 joerg int i; 5308 1.1 joerg float f; 5309 1.1 joerg realFloatingPointType() 5310 1.1 joerg matches "float f" but not "int i" 5311 1.1 joerg </pre></td></tr> 5312 1.1 joerg 5313 1.1 joerg 5314 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('voidType0')"><a name="voidType0Anchor">voidType</a></td><td></td></tr> 5315 1.1 joerg <tr><td colspan="4" class="doc" id="voidType0"><pre>Matches type void. 5316 1.1 joerg 5317 1.1 joerg Given 5318 1.1 joerg struct S { void func(); }; 5319 1.1 joerg functionDecl(returns(voidType())) 5320 1.1 joerg matches "void func();" 5321 1.1 joerg </pre></td></tr> 5322 1.1 joerg 5323 1.1 joerg 5324 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html">UnaryExprOrTypeTraitExpr</a>></td><td class="name" onclick="toggle('ofKind0')"><a name="ofKind0Anchor">ofKind</a></td><td>UnaryExprOrTypeTrait Kind</td></tr> 5325 1.1 joerg <tr><td colspan="4" class="doc" id="ofKind0"><pre>Matches unary expressions of a certain kind. 5326 1.1 joerg 5327 1.1 joerg Given 5328 1.1 joerg int x; 5329 1.1 joerg int s = sizeof(x) + alignof(x) 5330 1.1 joerg unaryExprOrTypeTraitExpr(ofKind(UETT_SizeOf)) 5331 1.1 joerg matches sizeof(x) 5332 1.1 joerg 5333 1.1 joerg If the matcher is use from clang-query, UnaryExprOrTypeTrait parameter 5334 1.1 joerg should be passed as a quoted string. e.g., ofKind("UETT_SizeOf"). 5335 1.1 joerg </pre></td></tr> 5336 1.1 joerg 5337 1.1 joerg 5338 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryOperator.html">UnaryOperator</a>></td><td class="name" onclick="toggle('hasAnyOperatorName3')"><a name="hasAnyOperatorName3Anchor">hasAnyOperatorName</a></td><td>StringRef, ..., StringRef</td></tr> 5339 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasAnyOperatorName3"><pre>Matches operator expressions (binary or unary) that have any of the 5340 1.1.1.2 joerg specified names. 5341 1.1.1.2 joerg 5342 1.1.1.2 joerg hasAnyOperatorName("+", "-") 5343 1.1.1.2 joerg Is equivalent to 5344 1.1.1.2 joerg anyOf(hasOperatorName("+"), hasOperatorName("-")) 5345 1.1.1.2 joerg </pre></td></tr> 5346 1.1.1.2 joerg 5347 1.1.1.2 joerg 5348 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryOperator.html">UnaryOperator</a>></td><td class="name" onclick="toggle('hasOperatorName3')"><a name="hasOperatorName3Anchor">hasOperatorName</a></td><td>std::string Name</td></tr> 5349 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasOperatorName3"><pre>Matches the operator Name of operator expressions (binary or 5350 1.1 joerg unary). 5351 1.1 joerg 5352 1.1 joerg Example matches a || b (matcher = binaryOperator(hasOperatorName("||"))) 5353 1.1 joerg !(a || b) 5354 1.1 joerg </pre></td></tr> 5355 1.1 joerg 5356 1.1 joerg 5357 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedMemberExpr.html">UnresolvedMemberExpr</a>></td><td class="name" onclick="toggle('isArrow1')"><a name="isArrow1Anchor">isArrow</a></td><td></td></tr> 5358 1.1 joerg <tr><td colspan="4" class="doc" id="isArrow1"><pre>Matches member expressions that are called with '->' as opposed 5359 1.1 joerg to '.'. 5360 1.1 joerg 5361 1.1 joerg Member calls on the implicit this pointer match as called with '->'. 5362 1.1 joerg 5363 1.1 joerg Given 5364 1.1 joerg class Y { 5365 1.1 joerg void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; } 5366 1.1 joerg template <class T> void f() { this->f<T>(); f<T>(); } 5367 1.1 joerg int a; 5368 1.1 joerg static int b; 5369 1.1 joerg }; 5370 1.1 joerg template <class T> 5371 1.1 joerg class Z { 5372 1.1 joerg void x() { this->m; } 5373 1.1 joerg }; 5374 1.1 joerg memberExpr(isArrow()) 5375 1.1 joerg matches this->x, x, y.x, a, this->b 5376 1.1 joerg cxxDependentScopeMemberExpr(isArrow()) 5377 1.1 joerg matches this->m 5378 1.1 joerg unresolvedMemberExpr(isArrow()) 5379 1.1 joerg matches this->f<T>, f<T> 5380 1.1 joerg </pre></td></tr> 5381 1.1 joerg 5382 1.1 joerg 5383 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('hasAutomaticStorageDuration0')"><a name="hasAutomaticStorageDuration0Anchor">hasAutomaticStorageDuration</a></td><td></td></tr> 5384 1.1 joerg <tr><td colspan="4" class="doc" id="hasAutomaticStorageDuration0"><pre>Matches a variable declaration that has automatic storage duration. 5385 1.1 joerg 5386 1.1 joerg Example matches x, but not y, z, or a. 5387 1.1 joerg (matcher = varDecl(hasAutomaticStorageDuration()) 5388 1.1 joerg void f() { 5389 1.1 joerg int x; 5390 1.1 joerg static int y; 5391 1.1 joerg thread_local int z; 5392 1.1 joerg } 5393 1.1 joerg int a; 5394 1.1 joerg </pre></td></tr> 5395 1.1 joerg 5396 1.1 joerg 5397 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('hasGlobalStorage0')"><a name="hasGlobalStorage0Anchor">hasGlobalStorage</a></td><td></td></tr> 5398 1.1 joerg <tr><td colspan="4" class="doc" id="hasGlobalStorage0"><pre>Matches a variable declaration that does not have local storage. 5399 1.1 joerg 5400 1.1 joerg Example matches y and z (matcher = varDecl(hasGlobalStorage()) 5401 1.1 joerg void f() { 5402 1.1 joerg int x; 5403 1.1 joerg static int y; 5404 1.1 joerg } 5405 1.1 joerg int z; 5406 1.1 joerg </pre></td></tr> 5407 1.1 joerg 5408 1.1 joerg 5409 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('hasLocalStorage0')"><a name="hasLocalStorage0Anchor">hasLocalStorage</a></td><td></td></tr> 5410 1.1 joerg <tr><td colspan="4" class="doc" id="hasLocalStorage0"><pre>Matches a variable declaration that has function scope and is a 5411 1.1 joerg non-static local variable. 5412 1.1 joerg 5413 1.1 joerg Example matches x (matcher = varDecl(hasLocalStorage()) 5414 1.1 joerg void f() { 5415 1.1 joerg int x; 5416 1.1 joerg static int y; 5417 1.1 joerg } 5418 1.1 joerg int z; 5419 1.1 joerg </pre></td></tr> 5420 1.1 joerg 5421 1.1 joerg 5422 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('hasStaticStorageDuration0')"><a name="hasStaticStorageDuration0Anchor">hasStaticStorageDuration</a></td><td></td></tr> 5423 1.1 joerg <tr><td colspan="4" class="doc" id="hasStaticStorageDuration0"><pre>Matches a variable declaration that has static storage duration. 5424 1.1 joerg It includes the variable declared at namespace scope and those declared 5425 1.1 joerg with "static" and "extern" storage class specifiers. 5426 1.1 joerg 5427 1.1 joerg void f() { 5428 1.1 joerg int x; 5429 1.1 joerg static int y; 5430 1.1 joerg thread_local int z; 5431 1.1 joerg } 5432 1.1 joerg int a; 5433 1.1 joerg static int b; 5434 1.1 joerg extern int c; 5435 1.1 joerg varDecl(hasStaticStorageDuration()) 5436 1.1 joerg matches the function declaration y, a, b and c. 5437 1.1 joerg </pre></td></tr> 5438 1.1 joerg 5439 1.1 joerg 5440 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('hasThreadStorageDuration0')"><a name="hasThreadStorageDuration0Anchor">hasThreadStorageDuration</a></td><td></td></tr> 5441 1.1 joerg <tr><td colspan="4" class="doc" id="hasThreadStorageDuration0"><pre>Matches a variable declaration that has thread storage duration. 5442 1.1 joerg 5443 1.1 joerg Example matches z, but not x, z, or a. 5444 1.1 joerg (matcher = varDecl(hasThreadStorageDuration()) 5445 1.1 joerg void f() { 5446 1.1 joerg int x; 5447 1.1 joerg static int y; 5448 1.1 joerg thread_local int z; 5449 1.1 joerg } 5450 1.1 joerg int a; 5451 1.1 joerg </pre></td></tr> 5452 1.1 joerg 5453 1.1 joerg 5454 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('isConstexpr0')"><a name="isConstexpr0Anchor">isConstexpr</a></td><td></td></tr> 5455 1.1 joerg <tr><td colspan="4" class="doc" id="isConstexpr0"><pre>Matches constexpr variable and function declarations, 5456 1.1 joerg and if constexpr. 5457 1.1 joerg 5458 1.1 joerg Given: 5459 1.1 joerg constexpr int foo = 42; 5460 1.1 joerg constexpr int bar(); 5461 1.1 joerg void baz() { if constexpr(1 > 0) {} } 5462 1.1 joerg varDecl(isConstexpr()) 5463 1.1 joerg matches the declaration of foo. 5464 1.1 joerg functionDecl(isConstexpr()) 5465 1.1 joerg matches the declaration of bar. 5466 1.1 joerg ifStmt(isConstexpr()) 5467 1.1 joerg matches the if statement in baz. 5468 1.1 joerg </pre></td></tr> 5469 1.1 joerg 5470 1.1 joerg 5471 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('isDefinition1')"><a name="isDefinition1Anchor">isDefinition</a></td><td></td></tr> 5472 1.1 joerg <tr><td colspan="4" class="doc" id="isDefinition1"><pre>Matches if a declaration has a body attached. 5473 1.1 joerg 5474 1.1 joerg Example matches A, va, fa 5475 1.1 joerg class A {}; 5476 1.1 joerg class B; // Doesn't match, as it has no body. 5477 1.1 joerg int va; 5478 1.1 joerg extern int vb; // Doesn't match, as it doesn't define the variable. 5479 1.1 joerg void fa() {} 5480 1.1 joerg void fb(); // Doesn't match, as it has no body. 5481 1.1 joerg @interface X 5482 1.1 joerg - (void)ma; // Doesn't match, interface is declaration. 5483 1.1 joerg @end 5484 1.1 joerg @implementation X 5485 1.1 joerg - (void)ma {} 5486 1.1 joerg @end 5487 1.1 joerg 5488 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>>, 5489 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>> 5490 1.1 joerg </pre></td></tr> 5491 1.1 joerg 5492 1.1 joerg 5493 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('isExceptionVariable0')"><a name="isExceptionVariable0Anchor">isExceptionVariable</a></td><td></td></tr> 5494 1.1 joerg <tr><td colspan="4" class="doc" id="isExceptionVariable0"><pre>Matches a variable declaration that is an exception variable from 5495 1.1 joerg a C++ catch block, or an Objective-C statement. 5496 1.1 joerg 5497 1.1 joerg Example matches x (matcher = varDecl(isExceptionVariable()) 5498 1.1 joerg void f(int y) { 5499 1.1 joerg try { 5500 1.1 joerg } catch (int x) { 5501 1.1 joerg } 5502 1.1 joerg } 5503 1.1 joerg </pre></td></tr> 5504 1.1 joerg 5505 1.1 joerg 5506 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('isExplicitTemplateSpecialization1')"><a name="isExplicitTemplateSpecialization1Anchor">isExplicitTemplateSpecialization</a></td><td></td></tr> 5507 1.1 joerg <tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization1"><pre>Matches explicit template specializations of function, class, or 5508 1.1 joerg static member variable template instantiations. 5509 1.1 joerg 5510 1.1 joerg Given 5511 1.1 joerg template<typename T> void A(T t) { } 5512 1.1 joerg template<> void A(int N) { } 5513 1.1 joerg functionDecl(isExplicitTemplateSpecialization()) 5514 1.1 joerg matches the specialization A<int>(). 5515 1.1 joerg 5516 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>> 5517 1.1 joerg </pre></td></tr> 5518 1.1 joerg 5519 1.1 joerg 5520 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('isExternC1')"><a name="isExternC1Anchor">isExternC</a></td><td></td></tr> 5521 1.1 joerg <tr><td colspan="4" class="doc" id="isExternC1"><pre>Matches extern "C" function or variable declarations. 5522 1.1 joerg 5523 1.1 joerg Given: 5524 1.1 joerg extern "C" void f() {} 5525 1.1 joerg extern "C" { void g() {} } 5526 1.1 joerg void h() {} 5527 1.1 joerg extern "C" int x = 1; 5528 1.1 joerg extern "C" int y = 2; 5529 1.1 joerg int z = 3; 5530 1.1 joerg functionDecl(isExternC()) 5531 1.1 joerg matches the declaration of f and g, but not the declaration of h. 5532 1.1 joerg varDecl(isExternC()) 5533 1.1 joerg matches the declaration of x and y, but not the declaration of z. 5534 1.1 joerg </pre></td></tr> 5535 1.1 joerg 5536 1.1 joerg 5537 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('isStaticLocal0')"><a name="isStaticLocal0Anchor">isStaticLocal</a></td><td></td></tr> 5538 1.1 joerg <tr><td colspan="4" class="doc" id="isStaticLocal0"><pre>Matches a static variable with local scope. 5539 1.1 joerg 5540 1.1 joerg Example matches y (matcher = varDecl(isStaticLocal())) 5541 1.1 joerg void f() { 5542 1.1 joerg int x; 5543 1.1 joerg static int y; 5544 1.1 joerg } 5545 1.1 joerg static int z; 5546 1.1 joerg </pre></td></tr> 5547 1.1 joerg 5548 1.1 joerg 5549 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('isStaticStorageClass1')"><a name="isStaticStorageClass1Anchor">isStaticStorageClass</a></td><td></td></tr> 5550 1.1 joerg <tr><td colspan="4" class="doc" id="isStaticStorageClass1"><pre>Matches variable/function declarations that have "static" storage 5551 1.1 joerg class specifier ("static" keyword) written in the source. 5552 1.1 joerg 5553 1.1 joerg Given: 5554 1.1 joerg static void f() {} 5555 1.1 joerg static int i = 0; 5556 1.1 joerg extern int j; 5557 1.1 joerg int k; 5558 1.1 joerg functionDecl(isStaticStorageClass()) 5559 1.1 joerg matches the function declaration f. 5560 1.1 joerg varDecl(isStaticStorageClass()) 5561 1.1 joerg matches the variable declaration i. 5562 1.1 joerg </pre></td></tr> 5563 1.1 joerg 5564 1.1 joerg 5565 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('isTemplateInstantiation1')"><a name="isTemplateInstantiation1Anchor">isTemplateInstantiation</a></td><td></td></tr> 5566 1.1 joerg <tr><td colspan="4" class="doc" id="isTemplateInstantiation1"><pre>Matches template instantiations of function, class, or static 5567 1.1 joerg member variable template instantiations. 5568 1.1 joerg 5569 1.1 joerg Given 5570 1.1 joerg template <typename T> class X {}; class A {}; X<A> x; 5571 1.1 joerg or 5572 1.1 joerg template <typename T> class X {}; class A {}; template class X<A>; 5573 1.1 joerg or 5574 1.1 joerg template <typename T> class X {}; class A {}; extern template class X<A>; 5575 1.1 joerg cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 5576 1.1 joerg matches the template instantiation of X<A>. 5577 1.1 joerg 5578 1.1 joerg But given 5579 1.1 joerg template <typename T> class X {}; class A {}; 5580 1.1 joerg template <> class X<A> {}; X<A> x; 5581 1.1 joerg cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) 5582 1.1 joerg does not match, as X<A> is an explicit template specialization. 5583 1.1 joerg 5584 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>> 5585 1.1 joerg </pre></td></tr> 5586 1.1 joerg 5587 1.1 joerg <!--END_NARROWING_MATCHERS --> 5588 1.1 joerg </table> 5589 1.1 joerg 5590 1.1 joerg <!-- ======================================================================= --> 5591 1.1 joerg <h2 id="traversal-matchers">AST Traversal Matchers</h2> 5592 1.1 joerg <!-- ======================================================================= --> 5593 1.1 joerg 5594 1.1 joerg <p>Traversal matchers specify the relationship to other nodes that are 5595 1.1 joerg reachable from the current node.</p> 5596 1.1 joerg 5597 1.1 joerg <p>Note that there are special traversal matchers (has, hasDescendant, forEach and 5598 1.1 joerg forEachDescendant) which work on all nodes and allow users to write more generic 5599 1.1 joerg match expressions.</p> 5600 1.1 joerg 5601 1.1 joerg <table> 5602 1.1 joerg <tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr> 5603 1.1 joerg <!-- START_TRAVERSAL_MATCHERS --> 5604 1.1 joerg 5605 1.1.1.2 joerg <tr><td>Matcher<*></td><td class="name" onclick="toggle('binaryOperation0')"><a name="binaryOperation0Anchor">binaryOperation</a></td><td>Matcher<*>...Matcher<*></td></tr> 5606 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="binaryOperation0"><pre>Matches nodes which can be used with binary operators. 5607 1.1.1.2 joerg 5608 1.1.1.2 joerg The code 5609 1.1.1.2 joerg var1 != var2; 5610 1.1.1.2 joerg might be represented in the clang AST as a binaryOperator, a 5611 1.1.1.2 joerg cxxOperatorCallExpr or a cxxRewrittenBinaryOperator, depending on 5612 1.1.1.2 joerg 5613 1.1.1.2 joerg * whether the types of var1 and var2 are fundamental (binaryOperator) or at 5614 1.1.1.2 joerg least one is a class type (cxxOperatorCallExpr) 5615 1.1.1.2 joerg * whether the code appears in a template declaration, if at least one of the 5616 1.1.1.2 joerg vars is a dependent-type (binaryOperator) 5617 1.1.1.2 joerg * whether the code relies on a rewritten binary operator, such as a 5618 1.1.1.2 joerg spaceship operator or an inverted equality operator 5619 1.1.1.2 joerg (cxxRewrittenBinaryOperator) 5620 1.1.1.2 joerg 5621 1.1.1.2 joerg This matcher elides details in places where the matchers for the nodes are 5622 1.1.1.2 joerg compatible. 5623 1.1.1.2 joerg 5624 1.1.1.2 joerg Given 5625 1.1.1.2 joerg binaryOperation( 5626 1.1.1.2 joerg hasOperatorName("!="), 5627 1.1.1.2 joerg hasLHS(expr().bind("lhs")), 5628 1.1.1.2 joerg hasRHS(expr().bind("rhs")) 5629 1.1.1.2 joerg ) 5630 1.1.1.2 joerg matches each use of "!=" in: 5631 1.1.1.2 joerg struct S{ 5632 1.1.1.2 joerg bool operator!=(const S&) const; 5633 1.1.1.2 joerg }; 5634 1.1.1.2 joerg 5635 1.1.1.2 joerg void foo() 5636 1.1.1.2 joerg { 5637 1.1.1.2 joerg 1 != 2; 5638 1.1.1.2 joerg S() != S(); 5639 1.1.1.2 joerg } 5640 1.1.1.2 joerg 5641 1.1.1.2 joerg template<typename T> 5642 1.1.1.2 joerg void templ() 5643 1.1.1.2 joerg { 5644 1.1.1.2 joerg 1 != 2; 5645 1.1.1.2 joerg T() != S(); 5646 1.1.1.2 joerg } 5647 1.1.1.2 joerg struct HasOpEq 5648 1.1.1.2 joerg { 5649 1.1.1.2 joerg bool operator==(const HasOpEq &) const; 5650 1.1.1.2 joerg }; 5651 1.1.1.2 joerg 5652 1.1.1.2 joerg void inverse() 5653 1.1.1.2 joerg { 5654 1.1.1.2 joerg HasOpEq s1; 5655 1.1.1.2 joerg HasOpEq s2; 5656 1.1.1.2 joerg if (s1 != s2) 5657 1.1.1.2 joerg return; 5658 1.1.1.2 joerg } 5659 1.1.1.2 joerg 5660 1.1.1.2 joerg struct HasSpaceship 5661 1.1.1.2 joerg { 5662 1.1.1.2 joerg bool operator<=>(const HasOpEq &) const; 5663 1.1.1.2 joerg }; 5664 1.1.1.2 joerg 5665 1.1.1.2 joerg void use_spaceship() 5666 1.1.1.2 joerg { 5667 1.1.1.2 joerg HasSpaceship s1; 5668 1.1.1.2 joerg HasSpaceship s2; 5669 1.1.1.2 joerg if (s1 != s2) 5670 1.1.1.2 joerg return; 5671 1.1.1.2 joerg } 5672 1.1.1.2 joerg </pre></td></tr> 5673 1.1.1.2 joerg 5674 1.1.1.2 joerg 5675 1.1 joerg <tr><td>Matcher<*></td><td class="name" onclick="toggle('eachOf0')"><a name="eachOf0Anchor">eachOf</a></td><td>Matcher<*>, ..., Matcher<*></td></tr> 5676 1.1 joerg <tr><td colspan="4" class="doc" id="eachOf0"><pre>Matches if any of the given matchers matches. 5677 1.1 joerg 5678 1.1 joerg Unlike anyOf, eachOf will generate a match result for each 5679 1.1 joerg matching submatcher. 5680 1.1 joerg 5681 1.1 joerg For example, in: 5682 1.1 joerg class A { int a; int b; }; 5683 1.1 joerg The matcher: 5684 1.1 joerg cxxRecordDecl(eachOf(has(fieldDecl(hasName("a")).bind("v")), 5685 1.1 joerg has(fieldDecl(hasName("b")).bind("v")))) 5686 1.1 joerg will generate two results binding "v", the first of which binds 5687 1.1 joerg the field declaration of a, the second the field declaration of 5688 1.1 joerg b. 5689 1.1 joerg 5690 1.1 joerg Usable as: Any Matcher 5691 1.1 joerg </pre></td></tr> 5692 1.1 joerg 5693 1.1 joerg 5694 1.1.1.2 joerg <tr><td>Matcher<*></td><td class="name" onclick="toggle('findAll0')"><a name="findAll0Anchor">findAll</a></td><td>Matcher<*> Matcher</td></tr> 5695 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="findAll0"><pre>Matches if the node or any descendant matches. 5696 1.1.1.2 joerg 5697 1.1.1.2 joerg Generates results for each match. 5698 1.1.1.2 joerg 5699 1.1.1.2 joerg For example, in: 5700 1.1.1.2 joerg class A { class B {}; class C {}; }; 5701 1.1.1.2 joerg The matcher: 5702 1.1.1.2 joerg cxxRecordDecl(hasName("::A"), 5703 1.1.1.2 joerg findAll(cxxRecordDecl(isDefinition()).bind("m"))) 5704 1.1.1.2 joerg will generate results for A, B and C. 5705 1.1.1.2 joerg 5706 1.1.1.2 joerg Usable as: Any Matcher 5707 1.1.1.2 joerg </pre></td></tr> 5708 1.1.1.2 joerg 5709 1.1.1.2 joerg 5710 1.1 joerg <tr><td>Matcher<*></td><td class="name" onclick="toggle('forEachDescendant0')"><a name="forEachDescendant0Anchor">forEachDescendant</a></td><td>Matcher<*></td></tr> 5711 1.1 joerg <tr><td colspan="4" class="doc" id="forEachDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the 5712 1.1 joerg provided matcher. 5713 1.1 joerg 5714 1.1 joerg Example matches X, A, A::X, B, B::C, B::C::X 5715 1.1 joerg (matcher = cxxRecordDecl(forEachDescendant(cxxRecordDecl(hasName("X"))))) 5716 1.1 joerg class X {}; 5717 1.1 joerg class A { class X {}; }; // Matches A, because A::X is a class of name 5718 1.1 joerg // X inside A. 5719 1.1 joerg class B { class C { class X {}; }; }; 5720 1.1 joerg 5721 1.1 joerg DescendantT must be an AST base type. 5722 1.1 joerg 5723 1.1 joerg As opposed to 'hasDescendant', 'forEachDescendant' will cause a match for 5724 1.1 joerg each result that matches instead of only on the first one. 5725 1.1 joerg 5726 1.1 joerg Note: Recursively combined ForEachDescendant can cause many matches: 5727 1.1 joerg cxxRecordDecl(forEachDescendant(cxxRecordDecl( 5728 1.1 joerg forEachDescendant(cxxRecordDecl()) 5729 1.1 joerg ))) 5730 1.1 joerg will match 10 times (plus injected class name matches) on: 5731 1.1 joerg class A { class B { class C { class D { class E {}; }; }; }; }; 5732 1.1 joerg 5733 1.1 joerg Usable as: Any Matcher 5734 1.1 joerg </pre></td></tr> 5735 1.1 joerg 5736 1.1 joerg 5737 1.1 joerg <tr><td>Matcher<*></td><td class="name" onclick="toggle('forEach0')"><a name="forEach0Anchor">forEach</a></td><td>Matcher<*></td></tr> 5738 1.1 joerg <tr><td colspan="4" class="doc" id="forEach0"><pre>Matches AST nodes that have child AST nodes that match the 5739 1.1 joerg provided matcher. 5740 1.1 joerg 5741 1.1 joerg Example matches X, Y, Y::X, Z::Y, Z::Y::X 5742 1.1 joerg (matcher = cxxRecordDecl(forEach(cxxRecordDecl(hasName("X"))) 5743 1.1 joerg class X {}; 5744 1.1 joerg class Y { class X {}; }; // Matches Y, because Y::X is a class of name X 5745 1.1 joerg // inside Y. 5746 1.1 joerg class Z { class Y { class X {}; }; }; // Does not match Z. 5747 1.1 joerg 5748 1.1 joerg ChildT must be an AST base type. 5749 1.1 joerg 5750 1.1 joerg As opposed to 'has', 'forEach' will cause a match for each result that 5751 1.1 joerg matches instead of only on the first one. 5752 1.1 joerg 5753 1.1 joerg Usable as: Any Matcher 5754 1.1 joerg </pre></td></tr> 5755 1.1 joerg 5756 1.1 joerg 5757 1.1 joerg <tr><td>Matcher<*></td><td class="name" onclick="toggle('hasAncestor0')"><a name="hasAncestor0Anchor">hasAncestor</a></td><td>Matcher<*></td></tr> 5758 1.1 joerg <tr><td colspan="4" class="doc" id="hasAncestor0"><pre>Matches AST nodes that have an ancestor that matches the provided 5759 1.1 joerg matcher. 5760 1.1 joerg 5761 1.1 joerg Given 5762 1.1 joerg void f() { if (true) { int x = 42; } } 5763 1.1 joerg void g() { for (;;) { int x = 43; } } 5764 1.1 joerg expr(integerLiteral(hasAncestor(ifStmt()))) matches 42, but not 43. 5765 1.1 joerg 5766 1.1 joerg Usable as: Any Matcher 5767 1.1 joerg </pre></td></tr> 5768 1.1 joerg 5769 1.1 joerg 5770 1.1 joerg <tr><td>Matcher<*></td><td class="name" onclick="toggle('hasDescendant0')"><a name="hasDescendant0Anchor">hasDescendant</a></td><td>Matcher<*></td></tr> 5771 1.1 joerg <tr><td colspan="4" class="doc" id="hasDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the 5772 1.1 joerg provided matcher. 5773 1.1 joerg 5774 1.1 joerg Example matches X, Y, Z 5775 1.1 joerg (matcher = cxxRecordDecl(hasDescendant(cxxRecordDecl(hasName("X"))))) 5776 1.1 joerg class X {}; // Matches X, because X::X is a class of name X inside X. 5777 1.1 joerg class Y { class X {}; }; 5778 1.1 joerg class Z { class Y { class X {}; }; }; 5779 1.1 joerg 5780 1.1 joerg DescendantT must be an AST base type. 5781 1.1 joerg 5782 1.1 joerg Usable as: Any Matcher 5783 1.1 joerg </pre></td></tr> 5784 1.1 joerg 5785 1.1 joerg 5786 1.1 joerg <tr><td>Matcher<*></td><td class="name" onclick="toggle('has0')"><a name="has0Anchor">has</a></td><td>Matcher<*></td></tr> 5787 1.1 joerg <tr><td colspan="4" class="doc" id="has0"><pre>Matches AST nodes that have child AST nodes that match the 5788 1.1 joerg provided matcher. 5789 1.1 joerg 5790 1.1 joerg Example matches X, Y 5791 1.1 joerg (matcher = cxxRecordDecl(has(cxxRecordDecl(hasName("X"))) 5792 1.1 joerg class X {}; // Matches X, because X::X is a class of name X inside X. 5793 1.1 joerg class Y { class X {}; }; 5794 1.1 joerg class Z { class Y { class X {}; }; }; // Does not match Z. 5795 1.1 joerg 5796 1.1 joerg ChildT must be an AST base type. 5797 1.1 joerg 5798 1.1 joerg Usable as: Any Matcher 5799 1.1 joerg Note that has is direct matcher, so it also matches things like implicit 5800 1.1 joerg casts and paren casts. If you are matching with expr then you should 5801 1.1 joerg probably consider using ignoringParenImpCasts like: 5802 1.1 joerg has(ignoringParenImpCasts(expr())). 5803 1.1 joerg </pre></td></tr> 5804 1.1 joerg 5805 1.1 joerg 5806 1.1 joerg <tr><td>Matcher<*></td><td class="name" onclick="toggle('hasParent0')"><a name="hasParent0Anchor">hasParent</a></td><td>Matcher<*></td></tr> 5807 1.1 joerg <tr><td colspan="4" class="doc" id="hasParent0"><pre>Matches AST nodes that have a parent that matches the provided 5808 1.1 joerg matcher. 5809 1.1 joerg 5810 1.1 joerg Given 5811 1.1 joerg void f() { for (;;) { int x = 42; if (true) { int x = 43; } } } 5812 1.1 joerg compoundStmt(hasParent(ifStmt())) matches "{ int x = 43; }". 5813 1.1 joerg 5814 1.1 joerg Usable as: Any Matcher 5815 1.1 joerg </pre></td></tr> 5816 1.1 joerg 5817 1.1 joerg 5818 1.1.1.2 joerg <tr><td>Matcher<*></td><td class="name" onclick="toggle('invocation0')"><a name="invocation0Anchor">invocation</a></td><td>Matcher<*>...Matcher<*></td></tr> 5819 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="invocation0"><pre>Matches function calls and constructor calls 5820 1.1.1.2 joerg 5821 1.1.1.2 joerg Because CallExpr and CXXConstructExpr do not share a common 5822 1.1.1.2 joerg base class with API accessing arguments etc, AST Matchers for code 5823 1.1.1.2 joerg which should match both are typically duplicated. This matcher 5824 1.1.1.2 joerg removes the need for duplication. 5825 1.1.1.2 joerg 5826 1.1.1.2 joerg Given code 5827 1.1.1.2 joerg struct ConstructorTakesInt 5828 1.1.1.2 joerg { 5829 1.1.1.2 joerg ConstructorTakesInt(int i) {} 5830 1.1.1.2 joerg }; 5831 1.1.1.2 joerg 5832 1.1.1.2 joerg void callTakesInt(int i) 5833 1.1.1.2 joerg { 5834 1.1.1.2 joerg } 5835 1.1.1.2 joerg 5836 1.1.1.2 joerg void doCall() 5837 1.1.1.2 joerg { 5838 1.1.1.2 joerg callTakesInt(42); 5839 1.1.1.2 joerg } 5840 1.1.1.2 joerg 5841 1.1.1.2 joerg void doConstruct() 5842 1.1.1.2 joerg { 5843 1.1.1.2 joerg ConstructorTakesInt cti(42); 5844 1.1.1.2 joerg } 5845 1.1.1.2 joerg 5846 1.1.1.2 joerg The matcher 5847 1.1.1.2 joerg invocation(hasArgument(0, integerLiteral(equals(42)))) 5848 1.1.1.2 joerg matches the expression in both doCall and doConstruct 5849 1.1.1.2 joerg </pre></td></tr> 5850 1.1.1.2 joerg 5851 1.1.1.2 joerg 5852 1.1.1.2 joerg <tr><td>Matcher<*></td><td class="name" onclick="toggle('optionally0')"><a name="optionally0Anchor">optionally</a></td><td>Matcher<*></td></tr> 5853 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="optionally0"><pre>Matches any node regardless of the submatcher. 5854 1.1.1.2 joerg 5855 1.1.1.2 joerg However, optionally will retain any bindings generated by the submatcher. 5856 1.1.1.2 joerg Useful when additional information which may or may not present about a main 5857 1.1.1.2 joerg matching node is desired. 5858 1.1.1.2 joerg 5859 1.1.1.2 joerg For example, in: 5860 1.1.1.2 joerg class Foo { 5861 1.1.1.2 joerg int bar; 5862 1.1.1.2 joerg } 5863 1.1.1.2 joerg The matcher: 5864 1.1.1.2 joerg cxxRecordDecl( 5865 1.1.1.2 joerg optionally(has( 5866 1.1.1.2 joerg fieldDecl(hasName("bar")).bind("var") 5867 1.1.1.2 joerg ))).bind("record") 5868 1.1.1.2 joerg will produce a result binding for both "record" and "var". 5869 1.1.1.2 joerg The matcher will produce a "record" binding for even if there is no data 5870 1.1.1.2 joerg member named "bar" in that class. 5871 1.1.1.2 joerg 5872 1.1.1.2 joerg Usable as: Any Matcher 5873 1.1.1.2 joerg </pre></td></tr> 5874 1.1.1.2 joerg 5875 1.1.1.2 joerg 5876 1.1.1.2 joerg <tr><td>Matcher<*></td><td class="name" onclick="toggle('traverse0')"><a name="traverse0Anchor">traverse</a></td><td>TraversalKind TK, Matcher<*> InnerMatcher</td></tr> 5877 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="traverse0"><pre>Causes all nested matchers to be matched with the specified traversal kind. 5878 1.1.1.2 joerg 5879 1.1.1.2 joerg Given 5880 1.1.1.2 joerg void foo() 5881 1.1.1.2 joerg { 5882 1.1.1.2 joerg int i = 3.0; 5883 1.1.1.2 joerg } 5884 1.1.1.2 joerg The matcher 5885 1.1.1.2 joerg traverse(TK_IgnoreUnlessSpelledInSource, 5886 1.1.1.2 joerg varDecl(hasInitializer(floatLiteral().bind("init"))) 5887 1.1.1.2 joerg ) 5888 1.1.1.2 joerg matches the variable declaration with "init" bound to the "3.0". 5889 1.1.1.2 joerg </pre></td></tr> 5890 1.1.1.2 joerg 5891 1.1.1.2 joerg 5892 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AbstractConditionalOperator.html">AbstractConditionalOperator</a>></td><td class="name" onclick="toggle('hasCondition5')"><a name="hasCondition5Anchor">hasCondition</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 5893 1.1 joerg <tr><td colspan="4" class="doc" id="hasCondition5"><pre>Matches the condition expression of an if statement, for loop, 5894 1.1 joerg switch statement or conditional operator. 5895 1.1 joerg 5896 1.1 joerg Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 5897 1.1 joerg if (true) {} 5898 1.1 joerg </pre></td></tr> 5899 1.1 joerg 5900 1.1 joerg 5901 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AbstractConditionalOperator.html">AbstractConditionalOperator</a>></td><td class="name" onclick="toggle('hasFalseExpression0')"><a name="hasFalseExpression0Anchor">hasFalseExpression</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 5902 1.1 joerg <tr><td colspan="4" class="doc" id="hasFalseExpression0"><pre>Matches the false branch expression of a conditional operator 5903 1.1 joerg (binary or ternary). 5904 1.1 joerg 5905 1.1 joerg Example matches b 5906 1.1 joerg condition ? a : b 5907 1.1 joerg condition ?: b 5908 1.1 joerg </pre></td></tr> 5909 1.1 joerg 5910 1.1 joerg 5911 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AbstractConditionalOperator.html">AbstractConditionalOperator</a>></td><td class="name" onclick="toggle('hasTrueExpression0')"><a name="hasTrueExpression0Anchor">hasTrueExpression</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 5912 1.1 joerg <tr><td colspan="4" class="doc" id="hasTrueExpression0"><pre>Matches the true branch expression of a conditional operator. 5913 1.1 joerg 5914 1.1 joerg Example 1 (conditional ternary operator): matches a 5915 1.1 joerg condition ? a : b 5916 1.1 joerg 5917 1.1 joerg Example 2 (conditional binary operator): matches opaqueValueExpr(condition) 5918 1.1 joerg condition ?: b 5919 1.1 joerg </pre></td></tr> 5920 1.1 joerg 5921 1.1 joerg 5922 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>></td><td class="name" onclick="toggle('hasDeclaration15')"><a name="hasDeclaration15Anchor">hasDeclaration</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 5923 1.1 joerg <tr><td colspan="4" class="doc" id="hasDeclaration15"><pre>Matches a node if the declaration associated with that node 5924 1.1 joerg matches the given matcher. 5925 1.1 joerg 5926 1.1 joerg The associated declaration is: 5927 1.1 joerg - for type nodes, the declaration of the underlying type 5928 1.1 joerg - for CallExpr, the declaration of the callee 5929 1.1 joerg - for MemberExpr, the declaration of the referenced member 5930 1.1 joerg - for CXXConstructExpr, the declaration of the constructor 5931 1.1 joerg - for CXXNewExpr, the declaration of the operator new 5932 1.1 joerg - for ObjCIvarExpr, the declaration of the ivar 5933 1.1 joerg 5934 1.1 joerg For type nodes, hasDeclaration will generally match the declaration of the 5935 1.1 joerg sugared type. Given 5936 1.1 joerg class X {}; 5937 1.1 joerg typedef X Y; 5938 1.1 joerg Y y; 5939 1.1 joerg in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 5940 1.1 joerg typedefDecl. A common use case is to match the underlying, desugared type. 5941 1.1 joerg This can be achieved by using the hasUnqualifiedDesugaredType matcher: 5942 1.1 joerg varDecl(hasType(hasUnqualifiedDesugaredType( 5943 1.1 joerg recordType(hasDeclaration(decl()))))) 5944 1.1 joerg In this matcher, the decl will match the CXXRecordDecl of class X. 5945 1.1 joerg 5946 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, 5947 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, 5948 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, 5949 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, 5950 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, 5951 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, 5952 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 5953 1.1 joerg </pre></td></tr> 5954 1.1 joerg 5955 1.1 joerg 5956 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html">ArraySubscriptExpr</a>></td><td class="name" onclick="toggle('hasBase0')"><a name="hasBase0Anchor">hasBase</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 5957 1.1 joerg <tr><td colspan="4" class="doc" id="hasBase0"><pre>Matches the base expression of an array subscript expression. 5958 1.1 joerg 5959 1.1 joerg Given 5960 1.1 joerg int i[5]; 5961 1.1 joerg void f() { i[1] = 42; } 5962 1.1 joerg arraySubscriptExpression(hasBase(implicitCastExpr( 5963 1.1 joerg hasSourceExpression(declRefExpr())))) 5964 1.1 joerg matches i[1] with the declRefExpr() matching i 5965 1.1 joerg </pre></td></tr> 5966 1.1 joerg 5967 1.1 joerg 5968 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html">ArraySubscriptExpr</a>></td><td class="name" onclick="toggle('hasIndex0')"><a name="hasIndex0Anchor">hasIndex</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 5969 1.1 joerg <tr><td colspan="4" class="doc" id="hasIndex0"><pre>Matches the index expression of an array subscript expression. 5970 1.1 joerg 5971 1.1 joerg Given 5972 1.1 joerg int i[5]; 5973 1.1 joerg void f() { i[1] = 42; } 5974 1.1 joerg arraySubscriptExpression(hasIndex(integerLiteral())) 5975 1.1 joerg matches i[1] with the integerLiteral() matching 1 5976 1.1 joerg </pre></td></tr> 5977 1.1 joerg 5978 1.1 joerg 5979 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html">ArraySubscriptExpr</a>></td><td class="name" onclick="toggle('hasLHS3')"><a name="hasLHS3Anchor">hasLHS</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 5980 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasLHS3"><pre>Matches the left hand side of binary operator expressions. 5981 1.1 joerg 5982 1.1 joerg Example matches a (matcher = binaryOperator(hasLHS())) 5983 1.1 joerg a || b 5984 1.1 joerg </pre></td></tr> 5985 1.1 joerg 5986 1.1 joerg 5987 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html">ArraySubscriptExpr</a>></td><td class="name" onclick="toggle('hasRHS3')"><a name="hasRHS3Anchor">hasRHS</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 5988 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasRHS3"><pre>Matches the right hand side of binary operator expressions. 5989 1.1 joerg 5990 1.1 joerg Example matches b (matcher = binaryOperator(hasRHS())) 5991 1.1 joerg a || b 5992 1.1 joerg </pre></td></tr> 5993 1.1 joerg 5994 1.1 joerg 5995 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ArrayType.html">ArrayType</a>></td><td class="name" onclick="toggle('hasElementType0')"><a name="hasElementType0Anchor">hasElementType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td></tr> 5996 1.1 joerg <tr><td colspan="4" class="doc" id="hasElementType0"><pre>Matches arrays and C99 complex types that have a specific element 5997 1.1 joerg type. 5998 1.1 joerg 5999 1.1 joerg Given 6000 1.1 joerg struct A {}; 6001 1.1 joerg A a[7]; 6002 1.1 joerg int b[7]; 6003 1.1 joerg arrayType(hasElementType(builtinType())) 6004 1.1 joerg matches "int b[7]" 6005 1.1 joerg 6006 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ArrayType.html">ArrayType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ComplexType.html">ComplexType</a>> 6007 1.1 joerg </pre></td></tr> 6008 1.1 joerg 6009 1.1 joerg 6010 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>></td><td class="name" onclick="toggle('hasValueType0')"><a name="hasValueType0Anchor">hasValueType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td></tr> 6011 1.1 joerg <tr><td colspan="4" class="doc" id="hasValueType0"><pre>Matches atomic types with a specific value type. 6012 1.1 joerg 6013 1.1 joerg Given 6014 1.1 joerg _Atomic(int) i; 6015 1.1 joerg _Atomic(float) f; 6016 1.1 joerg atomicType(hasValueType(isInteger())) 6017 1.1 joerg matches "_Atomic(int) i" 6018 1.1 joerg 6019 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>> 6020 1.1 joerg </pre></td></tr> 6021 1.1 joerg 6022 1.1 joerg 6023 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>></td><td class="name" onclick="toggle('hasDeducedType0')"><a name="hasDeducedType0Anchor">hasDeducedType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td></tr> 6024 1.1 joerg <tr><td colspan="4" class="doc" id="hasDeducedType0"><pre>Matches AutoType nodes where the deduced type is a specific type. 6025 1.1 joerg 6026 1.1 joerg Note: There is no TypeLoc for the deduced type and thus no 6027 1.1 joerg getDeducedLoc() matcher. 6028 1.1 joerg 6029 1.1 joerg Given 6030 1.1 joerg auto a = 1; 6031 1.1 joerg auto b = 2.0; 6032 1.1 joerg autoType(hasDeducedType(isInteger())) 6033 1.1 joerg matches "auto a" 6034 1.1 joerg 6035 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>> 6036 1.1 joerg </pre></td></tr> 6037 1.1 joerg 6038 1.1 joerg 6039 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>></td><td class="name" onclick="toggle('hasEitherOperand0')"><a name="hasEitherOperand0Anchor">hasEitherOperand</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 6040 1.1 joerg <tr><td colspan="4" class="doc" id="hasEitherOperand0"><pre>Matches if either the left hand side or the right hand side of a 6041 1.1 joerg binary operator matches. 6042 1.1 joerg </pre></td></tr> 6043 1.1 joerg 6044 1.1 joerg 6045 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>></td><td class="name" onclick="toggle('hasLHS0')"><a name="hasLHS0Anchor">hasLHS</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 6046 1.1 joerg <tr><td colspan="4" class="doc" id="hasLHS0"><pre>Matches the left hand side of binary operator expressions. 6047 1.1 joerg 6048 1.1 joerg Example matches a (matcher = binaryOperator(hasLHS())) 6049 1.1 joerg a || b 6050 1.1 joerg </pre></td></tr> 6051 1.1 joerg 6052 1.1 joerg 6053 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>></td><td class="name" onclick="toggle('hasOperands0')"><a name="hasOperands0Anchor">hasOperands</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> Matcher1, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> Matcher2</td></tr> 6054 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasOperands0"><pre>Matches if both matchers match with opposite sides of the binary operator. 6055 1.1.1.2 joerg 6056 1.1.1.2 joerg Example matcher = binaryOperator(hasOperands(integerLiteral(equals(1), 6057 1.1.1.2 joerg integerLiteral(equals(2))) 6058 1.1.1.2 joerg 1 + 2 // Match 6059 1.1.1.2 joerg 2 + 1 // Match 6060 1.1.1.2 joerg 1 + 1 // No match 6061 1.1.1.2 joerg 2 + 2 // No match 6062 1.1.1.2 joerg </pre></td></tr> 6063 1.1.1.2 joerg 6064 1.1.1.2 joerg 6065 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>></td><td class="name" onclick="toggle('hasRHS0')"><a name="hasRHS0Anchor">hasRHS</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 6066 1.1 joerg <tr><td colspan="4" class="doc" id="hasRHS0"><pre>Matches the right hand side of binary operator expressions. 6067 1.1 joerg 6068 1.1 joerg Example matches b (matcher = binaryOperator(hasRHS())) 6069 1.1 joerg a || b 6070 1.1 joerg </pre></td></tr> 6071 1.1 joerg 6072 1.1 joerg 6073 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BindingDecl.html">BindingDecl</a>></td><td class="name" onclick="toggle('forDecomposition0')"><a name="forDecomposition0Anchor">forDecomposition</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>> InnerMatcher</td></tr> 6074 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="forDecomposition0"><pre>Matches the DecompositionDecl the binding belongs to. 6075 1.1.1.2 joerg 6076 1.1.1.2 joerg For example, in: 6077 1.1.1.2 joerg void foo() 6078 1.1.1.2 joerg { 6079 1.1.1.2 joerg int arr[3]; 6080 1.1.1.2 joerg auto &[f, s, t] = arr; 6081 1.1.1.2 joerg 6082 1.1.1.2 joerg f = 42; 6083 1.1.1.2 joerg } 6084 1.1.1.2 joerg The matcher: 6085 1.1.1.2 joerg bindingDecl(hasName("f"), 6086 1.1.1.2 joerg forDecomposition(decompositionDecl()) 6087 1.1.1.2 joerg matches 'f' in 'auto &[f, s, t]'. 6088 1.1.1.2 joerg </pre></td></tr> 6089 1.1.1.2 joerg 6090 1.1.1.2 joerg 6091 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>></td><td class="name" onclick="toggle('hasAnyParameter2')"><a name="hasAnyParameter2Anchor">hasAnyParameter</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>> InnerMatcher</td></tr> 6092 1.1 joerg <tr><td colspan="4" class="doc" id="hasAnyParameter2"><pre>Matches any parameter of a function or an ObjC method declaration or a 6093 1.1 joerg block. 6094 1.1 joerg 6095 1.1 joerg Does not match the 'this' parameter of a method. 6096 1.1 joerg 6097 1.1 joerg Given 6098 1.1 joerg class X { void f(int x, int y, int z) {} }; 6099 1.1 joerg cxxMethodDecl(hasAnyParameter(hasName("y"))) 6100 1.1 joerg matches f(int x, int y, int z) {} 6101 1.1 joerg with hasAnyParameter(...) 6102 1.1 joerg matching int y 6103 1.1 joerg 6104 1.1 joerg For ObjectiveC, given 6105 1.1 joerg @interface I - (void) f:(int) y; @end 6106 1.1 joerg 6107 1.1 joerg the matcher objcMethodDecl(hasAnyParameter(hasName("y"))) 6108 1.1 joerg matches the declaration of method f with hasParameter 6109 1.1 joerg matching y. 6110 1.1 joerg 6111 1.1 joerg For blocks, given 6112 1.1 joerg b = ^(int y) { printf("%d", y) }; 6113 1.1 joerg 6114 1.1 joerg the matcher blockDecl(hasAnyParameter(hasName("y"))) 6115 1.1 joerg matches the declaration of the block b with hasParameter 6116 1.1 joerg matching y. 6117 1.1 joerg </pre></td></tr> 6118 1.1 joerg 6119 1.1 joerg 6120 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>></td><td class="name" onclick="toggle('hasParameter2')"><a name="hasParameter2Anchor">hasParameter</a></td><td>unsigned N, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>> InnerMatcher</td></tr> 6121 1.1 joerg <tr><td colspan="4" class="doc" id="hasParameter2"><pre>Matches the n'th parameter of a function or an ObjC method 6122 1.1 joerg declaration or a block. 6123 1.1 joerg 6124 1.1 joerg Given 6125 1.1 joerg class X { void f(int x) {} }; 6126 1.1 joerg cxxMethodDecl(hasParameter(0, hasType(varDecl()))) 6127 1.1 joerg matches f(int x) {} 6128 1.1 joerg with hasParameter(...) 6129 1.1 joerg matching int x 6130 1.1 joerg 6131 1.1 joerg For ObjectiveC, given 6132 1.1 joerg @interface I - (void) f:(int) y; @end 6133 1.1 joerg 6134 1.1 joerg the matcher objcMethodDecl(hasParameter(0, hasName("y"))) 6135 1.1 joerg matches the declaration of method f with hasParameter 6136 1.1 joerg matching y. 6137 1.1 joerg </pre></td></tr> 6138 1.1 joerg 6139 1.1 joerg 6140 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>></td><td class="name" onclick="toggle('hasTypeLoc0')"><a name="hasTypeLoc0Anchor">hasTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> Inner</td></tr> 6141 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasTypeLoc0"><pre>Matches if the type location of a node matches the inner matcher. 6142 1.1.1.2 joerg 6143 1.1.1.2 joerg Examples: 6144 1.1.1.2 joerg int x; 6145 1.1.1.2 joerg declaratorDecl(hasTypeLoc(loc(asString("int")))) 6146 1.1.1.2 joerg matches int x 6147 1.1.1.2 joerg 6148 1.1.1.2 joerg auto x = int(3); 6149 1.1.1.2 joerg cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) 6150 1.1.1.2 joerg matches int(3) 6151 1.1.1.2 joerg 6152 1.1.1.2 joerg struct Foo { Foo(int, int); }; 6153 1.1.1.2 joerg auto x = Foo(1, 2); 6154 1.1.1.2 joerg cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) 6155 1.1.1.2 joerg matches Foo(1, 2) 6156 1.1.1.2 joerg 6157 1.1.1.2 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>>, 6158 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>>, 6159 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>>, 6160 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>, 6161 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>>, 6162 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>>, 6163 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>>, 6164 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>> 6165 1.1.1.2 joerg </pre></td></tr> 6166 1.1.1.2 joerg 6167 1.1.1.2 joerg 6168 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>></td><td class="name" onclick="toggle('pointee0')"><a name="pointee0Anchor">pointee</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td></tr> 6169 1.1 joerg <tr><td colspan="4" class="doc" id="pointee0"><pre>Narrows PointerType (and similar) matchers to those where the 6170 1.1 joerg pointee matches a given matcher. 6171 1.1 joerg 6172 1.1 joerg Given 6173 1.1 joerg int *a; 6174 1.1 joerg int const *b; 6175 1.1 joerg float const *f; 6176 1.1 joerg pointerType(pointee(isConstQualified(), isInteger())) 6177 1.1 joerg matches "int const *b" 6178 1.1 joerg 6179 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>>, 6180 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>> 6181 1.1 joerg </pre></td></tr> 6182 1.1 joerg 6183 1.1 joerg 6184 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>></td><td class="name" onclick="toggle('hasTypeLoc1')"><a name="hasTypeLoc1Anchor">hasTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> Inner</td></tr> 6185 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasTypeLoc1"><pre>Matches if the type location of a node matches the inner matcher. 6186 1.1.1.2 joerg 6187 1.1.1.2 joerg Examples: 6188 1.1.1.2 joerg int x; 6189 1.1.1.2 joerg declaratorDecl(hasTypeLoc(loc(asString("int")))) 6190 1.1.1.2 joerg matches int x 6191 1.1.1.2 joerg 6192 1.1.1.2 joerg auto x = int(3); 6193 1.1.1.2 joerg cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) 6194 1.1.1.2 joerg matches int(3) 6195 1.1.1.2 joerg 6196 1.1.1.2 joerg struct Foo { Foo(int, int); }; 6197 1.1.1.2 joerg auto x = Foo(1, 2); 6198 1.1.1.2 joerg cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) 6199 1.1.1.2 joerg matches Foo(1, 2) 6200 1.1.1.2 joerg 6201 1.1.1.2 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>>, 6202 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>>, 6203 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>>, 6204 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>, 6205 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>>, 6206 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>>, 6207 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>>, 6208 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>> 6209 1.1.1.2 joerg </pre></td></tr> 6210 1.1.1.2 joerg 6211 1.1.1.2 joerg 6212 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>></td><td class="name" onclick="toggle('hasType8')"><a name="hasType8Anchor">hasType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 6213 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasType8"><pre>Overloaded to match the declaration of the expression's or value 6214 1.1.1.2 joerg declaration's type. 6215 1.1.1.2 joerg 6216 1.1.1.2 joerg In case of a value declaration (for example a variable declaration), 6217 1.1.1.2 joerg this resolves one layer of indirection. For example, in the value 6218 1.1.1.2 joerg declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of 6219 1.1.1.2 joerg X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the 6220 1.1.1.2 joerg declaration of x. 6221 1.1.1.2 joerg 6222 1.1.1.2 joerg Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 6223 1.1.1.2 joerg and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 6224 1.1.1.2 joerg and friend class X (matcher = friendDecl(hasType("X")) 6225 1.1.1.2 joerg and public virtual X (matcher = cxxBaseSpecifier(hasType( 6226 1.1.1.2 joerg cxxRecordDecl(hasName("X")))) 6227 1.1.1.2 joerg class X {}; 6228 1.1.1.2 joerg void y(X &x) { x; X z; } 6229 1.1.1.2 joerg class Y { friend class X; }; 6230 1.1.1.2 joerg class Z : public virtual X {}; 6231 1.1.1.2 joerg 6232 1.1.1.2 joerg Example matches class Derived 6233 1.1.1.2 joerg (matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base")))))) 6234 1.1.1.2 joerg class Base {}; 6235 1.1.1.2 joerg class Derived : Base {}; 6236 1.1.1.2 joerg 6237 1.1.1.2 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FriendDecl.html">FriendDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>>, 6238 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>> 6239 1.1.1.2 joerg </pre></td></tr> 6240 1.1.1.2 joerg 6241 1.1.1.2 joerg 6242 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>></td><td class="name" onclick="toggle('hasType4')"><a name="hasType4Anchor">hasType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 6243 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasType4"><pre>Matches if the expression's or declaration's type matches a type 6244 1.1.1.2 joerg matcher. 6245 1.1.1.2 joerg 6246 1.1.1.2 joerg Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 6247 1.1.1.2 joerg and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 6248 1.1.1.2 joerg and U (matcher = typedefDecl(hasType(asString("int"))) 6249 1.1.1.2 joerg and friend class X (matcher = friendDecl(hasType("X")) 6250 1.1.1.2 joerg and public virtual X (matcher = cxxBaseSpecifier(hasType( 6251 1.1.1.2 joerg asString("class X"))) 6252 1.1.1.2 joerg class X {}; 6253 1.1.1.2 joerg void y(X &x) { x; X z; } 6254 1.1.1.2 joerg typedef int U; 6255 1.1.1.2 joerg class Y { friend class X; }; 6256 1.1.1.2 joerg class Z : public virtual X {}; 6257 1.1.1.2 joerg </pre></td></tr> 6258 1.1.1.2 joerg 6259 1.1.1.2 joerg 6260 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>></td><td class="name" onclick="toggle('forEachArgumentWithParam1')"><a name="forEachArgumentWithParam1Anchor">forEachArgumentWithParam</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> ArgMatcher, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>> ParamMatcher</td></tr> 6261 1.1 joerg <tr><td colspan="4" class="doc" id="forEachArgumentWithParam1"><pre>Matches all arguments and their respective ParmVarDecl. 6262 1.1 joerg 6263 1.1 joerg Given 6264 1.1 joerg void f(int i); 6265 1.1 joerg int y; 6266 1.1 joerg f(y); 6267 1.1 joerg callExpr( 6268 1.1 joerg forEachArgumentWithParam( 6269 1.1 joerg declRefExpr(to(varDecl(hasName("y")))), 6270 1.1 joerg parmVarDecl(hasType(isInteger())) 6271 1.1 joerg )) 6272 1.1 joerg matches f(y); 6273 1.1 joerg with declRefExpr(...) 6274 1.1 joerg matching int y 6275 1.1 joerg and parmVarDecl(...) 6276 1.1 joerg matching int i 6277 1.1 joerg </pre></td></tr> 6278 1.1 joerg 6279 1.1 joerg 6280 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>></td><td class="name" onclick="toggle('forEachArgumentWithParamType1')"><a name="forEachArgumentWithParamType1Anchor">forEachArgumentWithParamType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> ArgMatcher, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> ParamMatcher</td></tr> 6281 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="forEachArgumentWithParamType1"><pre>Matches all arguments and their respective types for a CallExpr or 6282 1.1.1.2 joerg CXXConstructExpr. It is very similar to forEachArgumentWithParam but 6283 1.1.1.2 joerg it works on calls through function pointers as well. 6284 1.1.1.2 joerg 6285 1.1.1.2 joerg The difference is, that function pointers do not provide access to a 6286 1.1.1.2 joerg ParmVarDecl, but only the QualType for each argument. 6287 1.1.1.2 joerg 6288 1.1.1.2 joerg Given 6289 1.1.1.2 joerg void f(int i); 6290 1.1.1.2 joerg int y; 6291 1.1.1.2 joerg f(y); 6292 1.1.1.2 joerg void (*f_ptr)(int) = f; 6293 1.1.1.2 joerg f_ptr(y); 6294 1.1.1.2 joerg callExpr( 6295 1.1.1.2 joerg forEachArgumentWithParamType( 6296 1.1.1.2 joerg declRefExpr(to(varDecl(hasName("y")))), 6297 1.1.1.2 joerg qualType(isInteger()).bind("type) 6298 1.1.1.2 joerg )) 6299 1.1.1.2 joerg matches f(y) and f_ptr(y) 6300 1.1.1.2 joerg with declRefExpr(...) 6301 1.1.1.2 joerg matching int y 6302 1.1.1.2 joerg and qualType(...) 6303 1.1.1.2 joerg matching int 6304 1.1.1.2 joerg </pre></td></tr> 6305 1.1.1.2 joerg 6306 1.1.1.2 joerg 6307 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>></td><td class="name" onclick="toggle('hasAnyArgument1')"><a name="hasAnyArgument1Anchor">hasAnyArgument</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 6308 1.1 joerg <tr><td colspan="4" class="doc" id="hasAnyArgument1"><pre>Matches any argument of a call expression or a constructor call 6309 1.1 joerg expression, or an ObjC-message-send expression. 6310 1.1 joerg 6311 1.1 joerg Given 6312 1.1 joerg void x(int, int, int) { int y; x(1, y, 42); } 6313 1.1 joerg callExpr(hasAnyArgument(declRefExpr())) 6314 1.1 joerg matches x(1, y, 42) 6315 1.1 joerg with hasAnyArgument(...) 6316 1.1 joerg matching y 6317 1.1 joerg 6318 1.1 joerg For ObjectiveC, given 6319 1.1 joerg @interface I - (void) f:(int) y; @end 6320 1.1 joerg void foo(I *i) { [i f:12]; } 6321 1.1 joerg objcMessageExpr(hasAnyArgument(integerLiteral(equals(12)))) 6322 1.1 joerg matches [i f:12] 6323 1.1 joerg </pre></td></tr> 6324 1.1 joerg 6325 1.1 joerg 6326 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>></td><td class="name" onclick="toggle('hasArgument1')"><a name="hasArgument1Anchor">hasArgument</a></td><td>unsigned N, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 6327 1.1 joerg <tr><td colspan="4" class="doc" id="hasArgument1"><pre>Matches the n'th argument of a call expression or a constructor 6328 1.1 joerg call expression. 6329 1.1 joerg 6330 1.1 joerg Example matches y in x(y) 6331 1.1 joerg (matcher = callExpr(hasArgument(0, declRefExpr()))) 6332 1.1 joerg void x(int) { int y; x(y); } 6333 1.1 joerg </pre></td></tr> 6334 1.1 joerg 6335 1.1 joerg 6336 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>></td><td class="name" onclick="toggle('hasDeclaration13')"><a name="hasDeclaration13Anchor">hasDeclaration</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 6337 1.1 joerg <tr><td colspan="4" class="doc" id="hasDeclaration13"><pre>Matches a node if the declaration associated with that node 6338 1.1 joerg matches the given matcher. 6339 1.1 joerg 6340 1.1 joerg The associated declaration is: 6341 1.1 joerg - for type nodes, the declaration of the underlying type 6342 1.1 joerg - for CallExpr, the declaration of the callee 6343 1.1 joerg - for MemberExpr, the declaration of the referenced member 6344 1.1 joerg - for CXXConstructExpr, the declaration of the constructor 6345 1.1 joerg - for CXXNewExpr, the declaration of the operator new 6346 1.1 joerg - for ObjCIvarExpr, the declaration of the ivar 6347 1.1 joerg 6348 1.1 joerg For type nodes, hasDeclaration will generally match the declaration of the 6349 1.1 joerg sugared type. Given 6350 1.1 joerg class X {}; 6351 1.1 joerg typedef X Y; 6352 1.1 joerg Y y; 6353 1.1 joerg in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 6354 1.1 joerg typedefDecl. A common use case is to match the underlying, desugared type. 6355 1.1 joerg This can be achieved by using the hasUnqualifiedDesugaredType matcher: 6356 1.1 joerg varDecl(hasType(hasUnqualifiedDesugaredType( 6357 1.1 joerg recordType(hasDeclaration(decl()))))) 6358 1.1 joerg In this matcher, the decl will match the CXXRecordDecl of class X. 6359 1.1 joerg 6360 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, 6361 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, 6362 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, 6363 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, 6364 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, 6365 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, 6366 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 6367 1.1 joerg </pre></td></tr> 6368 1.1 joerg 6369 1.1 joerg 6370 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>></td><td class="name" onclick="toggle('forEachConstructorInitializer0')"><a name="forEachConstructorInitializer0Anchor">forEachConstructorInitializer</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>> InnerMatcher</td></tr> 6371 1.1 joerg <tr><td colspan="4" class="doc" id="forEachConstructorInitializer0"><pre>Matches each constructor initializer in a constructor definition. 6372 1.1 joerg 6373 1.1 joerg Given 6374 1.1 joerg class A { A() : i(42), j(42) {} int i; int j; }; 6375 1.1 joerg cxxConstructorDecl(forEachConstructorInitializer( 6376 1.1 joerg forField(decl().bind("x")) 6377 1.1 joerg )) 6378 1.1 joerg will trigger two matches, binding for 'i' and 'j' respectively. 6379 1.1 joerg </pre></td></tr> 6380 1.1 joerg 6381 1.1 joerg 6382 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>></td><td class="name" onclick="toggle('hasAnyConstructorInitializer0')"><a name="hasAnyConstructorInitializer0Anchor">hasAnyConstructorInitializer</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>> InnerMatcher</td></tr> 6383 1.1 joerg <tr><td colspan="4" class="doc" id="hasAnyConstructorInitializer0"><pre>Matches a constructor initializer. 6384 1.1 joerg 6385 1.1 joerg Given 6386 1.1 joerg struct Foo { 6387 1.1 joerg Foo() : foo_(1) { } 6388 1.1 joerg int foo_; 6389 1.1 joerg }; 6390 1.1 joerg cxxRecordDecl(has(cxxConstructorDecl( 6391 1.1 joerg hasAnyConstructorInitializer(anything()) 6392 1.1 joerg ))) 6393 1.1 joerg record matches Foo, hasAnyConstructorInitializer matches foo_(1) 6394 1.1 joerg </pre></td></tr> 6395 1.1 joerg 6396 1.1 joerg 6397 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>></td><td class="name" onclick="toggle('forField0')"><a name="forField0Anchor">forField</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>> InnerMatcher</td></tr> 6398 1.1 joerg <tr><td colspan="4" class="doc" id="forField0"><pre>Matches the field declaration of a constructor initializer. 6399 1.1 joerg 6400 1.1 joerg Given 6401 1.1 joerg struct Foo { 6402 1.1 joerg Foo() : foo_(1) { } 6403 1.1 joerg int foo_; 6404 1.1 joerg }; 6405 1.1 joerg cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer( 6406 1.1 joerg forField(hasName("foo_")))))) 6407 1.1 joerg matches Foo 6408 1.1 joerg with forField matching foo_ 6409 1.1 joerg </pre></td></tr> 6410 1.1 joerg 6411 1.1 joerg 6412 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>></td><td class="name" onclick="toggle('hasTypeLoc2')"><a name="hasTypeLoc2Anchor">hasTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> Inner</td></tr> 6413 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasTypeLoc2"><pre>Matches if the type location of a node matches the inner matcher. 6414 1.1.1.2 joerg 6415 1.1.1.2 joerg Examples: 6416 1.1.1.2 joerg int x; 6417 1.1.1.2 joerg declaratorDecl(hasTypeLoc(loc(asString("int")))) 6418 1.1.1.2 joerg matches int x 6419 1.1.1.2 joerg 6420 1.1.1.2 joerg auto x = int(3); 6421 1.1.1.2 joerg cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) 6422 1.1.1.2 joerg matches int(3) 6423 1.1.1.2 joerg 6424 1.1.1.2 joerg struct Foo { Foo(int, int); }; 6425 1.1.1.2 joerg auto x = Foo(1, 2); 6426 1.1.1.2 joerg cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) 6427 1.1.1.2 joerg matches Foo(1, 2) 6428 1.1.1.2 joerg 6429 1.1.1.2 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>>, 6430 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>>, 6431 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>>, 6432 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>, 6433 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>>, 6434 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>>, 6435 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>>, 6436 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>> 6437 1.1.1.2 joerg </pre></td></tr> 6438 1.1.1.2 joerg 6439 1.1.1.2 joerg 6440 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>></td><td class="name" onclick="toggle('withInitializer0')"><a name="withInitializer0Anchor">withInitializer</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 6441 1.1 joerg <tr><td colspan="4" class="doc" id="withInitializer0"><pre>Matches the initializer expression of a constructor initializer. 6442 1.1 joerg 6443 1.1 joerg Given 6444 1.1 joerg struct Foo { 6445 1.1 joerg Foo() : foo_(1) { } 6446 1.1 joerg int foo_; 6447 1.1 joerg }; 6448 1.1 joerg cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer( 6449 1.1 joerg withInitializer(integerLiteral(equals(1))))))) 6450 1.1 joerg matches Foo 6451 1.1 joerg with withInitializer matching (1) 6452 1.1 joerg </pre></td></tr> 6453 1.1 joerg 6454 1.1 joerg 6455 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDependentScopeMemberExpr.html">CXXDependentScopeMemberExpr</a>></td><td class="name" onclick="toggle('hasObjectExpression2')"><a name="hasObjectExpression2Anchor">hasObjectExpression</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 6456 1.1 joerg <tr><td colspan="4" class="doc" id="hasObjectExpression2"><pre>Matches a member expression where the object expression is matched by a 6457 1.1 joerg given matcher. Implicit object expressions are included; that is, it matches 6458 1.1 joerg use of implicit `this`. 6459 1.1 joerg 6460 1.1 joerg Given 6461 1.1 joerg struct X { 6462 1.1 joerg int m; 6463 1.1 joerg int f(X x) { x.m; return m; } 6464 1.1 joerg }; 6465 1.1 joerg memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X"))))) 6466 1.1 joerg matches `x.m`, but not `m`; however, 6467 1.1 joerg memberExpr(hasObjectExpression(hasType(pointsTo( 6468 1.1 joerg cxxRecordDecl(hasName("X")))))) 6469 1.1 joerg matches `m` (aka. `this->m`), but not `x.m`. 6470 1.1 joerg </pre></td></tr> 6471 1.1 joerg 6472 1.1 joerg 6473 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXForRangeStmt.html">CXXForRangeStmt</a>></td><td class="name" onclick="toggle('hasBody3')"><a name="hasBody3Anchor">hasBody</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr> 6474 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasBody3"><pre></pre></td></tr> 6475 1.1 joerg 6476 1.1.1.2 joerg 6477 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXForRangeStmt.html">CXXForRangeStmt</a>></td><td class="name" onclick="toggle('hasInitStatement2')"><a name="hasInitStatement2Anchor">hasInitStatement</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr> 6478 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasInitStatement2"><pre>Matches selection statements with initializer. 6479 1.1.1.2 joerg 6480 1.1.1.2 joerg Given: 6481 1.1.1.2 joerg void foo() { 6482 1.1.1.2 joerg if (int i = foobar(); i > 0) {} 6483 1.1.1.2 joerg switch (int i = foobar(); i) {} 6484 1.1.1.2 joerg for (auto& a = get_range(); auto& x : a) {} 6485 1.1.1.2 joerg } 6486 1.1.1.2 joerg void bar() { 6487 1.1.1.2 joerg if (foobar() > 0) {} 6488 1.1.1.2 joerg switch (foobar()) {} 6489 1.1.1.2 joerg for (auto& x : get_range()) {} 6490 1.1.1.2 joerg } 6491 1.1.1.2 joerg ifStmt(hasInitStatement(anything())) 6492 1.1.1.2 joerg matches the if statement in foo but not in bar. 6493 1.1.1.2 joerg switchStmt(hasInitStatement(anything())) 6494 1.1.1.2 joerg matches the switch statement in foo but not in bar. 6495 1.1.1.2 joerg cxxForRangeStmt(hasInitStatement(anything())) 6496 1.1.1.2 joerg matches the range for statement in foo but not in bar. 6497 1.1 joerg </pre></td></tr> 6498 1.1 joerg 6499 1.1 joerg 6500 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXForRangeStmt.html">CXXForRangeStmt</a>></td><td class="name" onclick="toggle('hasLoopVariable0')"><a name="hasLoopVariable0Anchor">hasLoopVariable</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>> InnerMatcher</td></tr> 6501 1.1 joerg <tr><td colspan="4" class="doc" id="hasLoopVariable0"><pre>Matches the initialization statement of a for loop. 6502 1.1 joerg 6503 1.1 joerg Example: 6504 1.1 joerg forStmt(hasLoopVariable(anything())) 6505 1.1 joerg matches 'int x' in 6506 1.1 joerg for (int x : a) { } 6507 1.1 joerg </pre></td></tr> 6508 1.1 joerg 6509 1.1 joerg 6510 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXForRangeStmt.html">CXXForRangeStmt</a>></td><td class="name" onclick="toggle('hasRangeInit0')"><a name="hasRangeInit0Anchor">hasRangeInit</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 6511 1.1 joerg <tr><td colspan="4" class="doc" id="hasRangeInit0"><pre>Matches the range initialization statement of a for loop. 6512 1.1 joerg 6513 1.1 joerg Example: 6514 1.1 joerg forStmt(hasRangeInit(anything())) 6515 1.1 joerg matches 'a' in 6516 1.1 joerg for (int x : a) { } 6517 1.1 joerg </pre></td></tr> 6518 1.1 joerg 6519 1.1 joerg 6520 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>></td><td class="name" onclick="toggle('hasTypeLoc3')"><a name="hasTypeLoc3Anchor">hasTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> Inner</td></tr> 6521 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasTypeLoc3"><pre>Matches if the type location of a node matches the inner matcher. 6522 1.1.1.2 joerg 6523 1.1.1.2 joerg Examples: 6524 1.1.1.2 joerg int x; 6525 1.1.1.2 joerg declaratorDecl(hasTypeLoc(loc(asString("int")))) 6526 1.1.1.2 joerg matches int x 6527 1.1.1.2 joerg 6528 1.1.1.2 joerg auto x = int(3); 6529 1.1.1.2 joerg cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) 6530 1.1.1.2 joerg matches int(3) 6531 1.1.1.2 joerg 6532 1.1.1.2 joerg struct Foo { Foo(int, int); }; 6533 1.1.1.2 joerg auto x = Foo(1, 2); 6534 1.1.1.2 joerg cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) 6535 1.1.1.2 joerg matches Foo(1, 2) 6536 1.1.1.2 joerg 6537 1.1.1.2 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>>, 6538 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>>, 6539 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>>, 6540 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>, 6541 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>>, 6542 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>>, 6543 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>>, 6544 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>> 6545 1.1.1.2 joerg </pre></td></tr> 6546 1.1.1.2 joerg 6547 1.1.1.2 joerg 6548 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMemberCallExpr.html">CXXMemberCallExpr</a>></td><td class="name" onclick="toggle('onImplicitObjectArgument0')"><a name="onImplicitObjectArgument0Anchor">onImplicitObjectArgument</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 6549 1.1 joerg <tr><td colspan="4" class="doc" id="onImplicitObjectArgument0"><pre>Matches on the implicit object argument of a member call expression. Unlike 6550 1.1 joerg `on`, matches the argument directly without stripping away anything. 6551 1.1 joerg 6552 1.1 joerg Given 6553 1.1 joerg class Y { public: void m(); }; 6554 1.1 joerg Y g(); 6555 1.1 joerg class X : public Y { void g(); }; 6556 1.1 joerg void z(Y y, X x) { y.m(); x.m(); x.g(); (g()).m(); } 6557 1.1 joerg cxxMemberCallExpr(onImplicitObjectArgument(hasType( 6558 1.1 joerg cxxRecordDecl(hasName("Y"))))) 6559 1.1 joerg matches `y.m()`, `x.m()` and (g()).m(), but not `x.g()`. 6560 1.1 joerg cxxMemberCallExpr(on(callExpr())) 6561 1.1 joerg does not match `(g()).m()`, because the parens are not ignored. 6562 1.1 joerg 6563 1.1 joerg FIXME: Overload to allow directly matching types? 6564 1.1 joerg </pre></td></tr> 6565 1.1 joerg 6566 1.1 joerg 6567 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMemberCallExpr.html">CXXMemberCallExpr</a>></td><td class="name" onclick="toggle('on0')"><a name="on0Anchor">on</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 6568 1.1 joerg <tr><td colspan="4" class="doc" id="on0"><pre>Matches on the implicit object argument of a member call expression, after 6569 1.1 joerg stripping off any parentheses or implicit casts. 6570 1.1 joerg 6571 1.1 joerg Given 6572 1.1 joerg class Y { public: void m(); }; 6573 1.1 joerg Y g(); 6574 1.1 joerg class X : public Y {}; 6575 1.1 joerg void z(Y y, X x) { y.m(); (g()).m(); x.m(); } 6576 1.1 joerg cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("Y"))))) 6577 1.1 joerg matches `y.m()` and `(g()).m()`. 6578 1.1 joerg cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("X"))))) 6579 1.1 joerg matches `x.m()`. 6580 1.1 joerg cxxMemberCallExpr(on(callExpr())) 6581 1.1 joerg matches `(g()).m()`. 6582 1.1 joerg 6583 1.1 joerg FIXME: Overload to allow directly matching types? 6584 1.1 joerg </pre></td></tr> 6585 1.1 joerg 6586 1.1 joerg 6587 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMemberCallExpr.html">CXXMemberCallExpr</a>></td><td class="name" onclick="toggle('thisPointerType1')"><a name="thisPointerType1Anchor">thisPointerType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 6588 1.1 joerg <tr><td colspan="4" class="doc" id="thisPointerType1"><pre>Overloaded to match the type's declaration. 6589 1.1 joerg </pre></td></tr> 6590 1.1 joerg 6591 1.1 joerg 6592 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMemberCallExpr.html">CXXMemberCallExpr</a>></td><td class="name" onclick="toggle('thisPointerType0')"><a name="thisPointerType0Anchor">thisPointerType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 6593 1.1 joerg <tr><td colspan="4" class="doc" id="thisPointerType0"><pre>Matches if the type of the expression's implicit object argument either 6594 1.1 joerg matches the InnerMatcher, or is a pointer to a type that matches the 6595 1.1 joerg InnerMatcher. 6596 1.1 joerg 6597 1.1 joerg Given 6598 1.1 joerg class Y { public: void m(); }; 6599 1.1 joerg class X : public Y { void g(); }; 6600 1.1 joerg void z() { Y y; y.m(); Y *p; p->m(); X x; x.m(); x.g(); } 6601 1.1 joerg cxxMemberCallExpr(thisPointerType(hasDeclaration( 6602 1.1 joerg cxxRecordDecl(hasName("Y"))))) 6603 1.1 joerg matches `y.m()`, `p->m()` and `x.m()`. 6604 1.1 joerg cxxMemberCallExpr(thisPointerType(hasDeclaration( 6605 1.1 joerg cxxRecordDecl(hasName("X"))))) 6606 1.1 joerg matches `x.g()`. 6607 1.1 joerg </pre></td></tr> 6608 1.1 joerg 6609 1.1 joerg 6610 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>></td><td class="name" onclick="toggle('forEachOverridden0')"><a name="forEachOverridden0Anchor">forEachOverridden</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>> InnerMatcher</td></tr> 6611 1.1 joerg <tr><td colspan="4" class="doc" id="forEachOverridden0"><pre>Matches each method overridden by the given method. This matcher may 6612 1.1 joerg produce multiple matches. 6613 1.1 joerg 6614 1.1 joerg Given 6615 1.1 joerg class A { virtual void f(); }; 6616 1.1 joerg class B : public A { void f(); }; 6617 1.1 joerg class C : public B { void f(); }; 6618 1.1 joerg cxxMethodDecl(ofClass(hasName("C")), 6619 1.1 joerg forEachOverridden(cxxMethodDecl().bind("b"))).bind("d") 6620 1.1 joerg matches once, with "b" binding "A::f" and "d" binding "C::f" (Note 6621 1.1 joerg that B::f is not overridden by C::f). 6622 1.1 joerg 6623 1.1 joerg The check can produce multiple matches in case of multiple inheritance, e.g. 6624 1.1 joerg class A1 { virtual void f(); }; 6625 1.1 joerg class A2 { virtual void f(); }; 6626 1.1 joerg class C : public A1, public A2 { void f(); }; 6627 1.1 joerg cxxMethodDecl(ofClass(hasName("C")), 6628 1.1 joerg forEachOverridden(cxxMethodDecl().bind("b"))).bind("d") 6629 1.1 joerg matches twice, once with "b" binding "A1::f" and "d" binding "C::f", and 6630 1.1 joerg once with "b" binding "A2::f" and "d" binding "C::f". 6631 1.1 joerg </pre></td></tr> 6632 1.1 joerg 6633 1.1 joerg 6634 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>></td><td class="name" onclick="toggle('ofClass0')"><a name="ofClass0Anchor">ofClass</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>> InnerMatcher</td></tr> 6635 1.1 joerg <tr><td colspan="4" class="doc" id="ofClass0"><pre>Matches the class declaration that the given method declaration 6636 1.1 joerg belongs to. 6637 1.1 joerg 6638 1.1 joerg FIXME: Generalize this for other kinds of declarations. 6639 1.1 joerg FIXME: What other kind of declarations would we need to generalize 6640 1.1 joerg this to? 6641 1.1 joerg 6642 1.1 joerg Example matches A() in the last line 6643 1.1 joerg (matcher = cxxConstructExpr(hasDeclaration(cxxMethodDecl( 6644 1.1 joerg ofClass(hasName("A")))))) 6645 1.1 joerg class A { 6646 1.1 joerg public: 6647 1.1 joerg A(); 6648 1.1 joerg }; 6649 1.1 joerg A a = A(); 6650 1.1 joerg </pre></td></tr> 6651 1.1 joerg 6652 1.1 joerg 6653 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>></td><td class="name" onclick="toggle('hasAnyPlacementArg0')"><a name="hasAnyPlacementArg0Anchor">hasAnyPlacementArg</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 6654 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasAnyPlacementArg0"><pre>Matches any placement new expression arguments. 6655 1.1.1.2 joerg 6656 1.1.1.2 joerg Given: 6657 1.1.1.2 joerg MyClass *p1 = new (Storage) MyClass(); 6658 1.1.1.2 joerg cxxNewExpr(hasAnyPlacementArg(anything())) 6659 1.1.1.2 joerg matches the expression 'new (Storage, 16) MyClass()'. 6660 1.1.1.2 joerg </pre></td></tr> 6661 1.1.1.2 joerg 6662 1.1.1.2 joerg 6663 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>></td><td class="name" onclick="toggle('hasArraySize0')"><a name="hasArraySize0Anchor">hasArraySize</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 6664 1.1 joerg <tr><td colspan="4" class="doc" id="hasArraySize0"><pre>Matches array new expressions with a given array size. 6665 1.1 joerg 6666 1.1 joerg Given: 6667 1.1 joerg MyClass *p1 = new MyClass[10]; 6668 1.1.1.2 joerg cxxNewExpr(hasArraySize(integerLiteral(equals(10)))) 6669 1.1 joerg matches the expression 'new MyClass[10]'. 6670 1.1 joerg </pre></td></tr> 6671 1.1 joerg 6672 1.1 joerg 6673 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>></td><td class="name" onclick="toggle('hasDeclaration12')"><a name="hasDeclaration12Anchor">hasDeclaration</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 6674 1.1 joerg <tr><td colspan="4" class="doc" id="hasDeclaration12"><pre>Matches a node if the declaration associated with that node 6675 1.1 joerg matches the given matcher. 6676 1.1 joerg 6677 1.1.1.2 joerg The associated declaration is: 6678 1.1.1.2 joerg - for type nodes, the declaration of the underlying type 6679 1.1.1.2 joerg - for CallExpr, the declaration of the callee 6680 1.1.1.2 joerg - for MemberExpr, the declaration of the referenced member 6681 1.1.1.2 joerg - for CXXConstructExpr, the declaration of the constructor 6682 1.1.1.2 joerg - for CXXNewExpr, the declaration of the operator new 6683 1.1.1.2 joerg - for ObjCIvarExpr, the declaration of the ivar 6684 1.1.1.2 joerg 6685 1.1.1.2 joerg For type nodes, hasDeclaration will generally match the declaration of the 6686 1.1.1.2 joerg sugared type. Given 6687 1.1.1.2 joerg class X {}; 6688 1.1.1.2 joerg typedef X Y; 6689 1.1.1.2 joerg Y y; 6690 1.1.1.2 joerg in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 6691 1.1.1.2 joerg typedefDecl. A common use case is to match the underlying, desugared type. 6692 1.1.1.2 joerg This can be achieved by using the hasUnqualifiedDesugaredType matcher: 6693 1.1.1.2 joerg varDecl(hasType(hasUnqualifiedDesugaredType( 6694 1.1.1.2 joerg recordType(hasDeclaration(decl()))))) 6695 1.1.1.2 joerg In this matcher, the decl will match the CXXRecordDecl of class X. 6696 1.1.1.2 joerg 6697 1.1.1.2 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, 6698 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, 6699 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, 6700 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, 6701 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, 6702 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, 6703 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 6704 1.1.1.2 joerg </pre></td></tr> 6705 1.1.1.2 joerg 6706 1.1.1.2 joerg 6707 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>></td><td class="name" onclick="toggle('hasPlacementArg0')"><a name="hasPlacementArg0Anchor">hasPlacementArg</a></td><td>unsigned Index, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 6708 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasPlacementArg0"><pre>Matches placement new expression arguments. 6709 1.1.1.2 joerg 6710 1.1.1.2 joerg Given: 6711 1.1.1.2 joerg MyClass *p1 = new (Storage, 16) MyClass(); 6712 1.1.1.2 joerg cxxNewExpr(hasPlacementArg(1, integerLiteral(equals(16)))) 6713 1.1.1.2 joerg matches the expression 'new (Storage, 16) MyClass()'. 6714 1.1.1.2 joerg </pre></td></tr> 6715 1.1.1.2 joerg 6716 1.1.1.2 joerg 6717 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>></td><td class="name" onclick="toggle('hasTypeLoc4')"><a name="hasTypeLoc4Anchor">hasTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> Inner</td></tr> 6718 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasTypeLoc4"><pre>Matches if the type location of a node matches the inner matcher. 6719 1.1.1.2 joerg 6720 1.1.1.2 joerg Examples: 6721 1.1.1.2 joerg int x; 6722 1.1.1.2 joerg declaratorDecl(hasTypeLoc(loc(asString("int")))) 6723 1.1.1.2 joerg matches int x 6724 1.1.1.2 joerg 6725 1.1.1.2 joerg auto x = int(3); 6726 1.1.1.2 joerg cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) 6727 1.1.1.2 joerg matches int(3) 6728 1.1.1.2 joerg 6729 1.1.1.2 joerg struct Foo { Foo(int, int); }; 6730 1.1.1.2 joerg auto x = Foo(1, 2); 6731 1.1.1.2 joerg cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) 6732 1.1.1.2 joerg matches Foo(1, 2) 6733 1.1.1.2 joerg 6734 1.1.1.2 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>>, 6735 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>>, 6736 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>>, 6737 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>, 6738 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>>, 6739 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>>, 6740 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>>, 6741 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>> 6742 1.1.1.2 joerg </pre></td></tr> 6743 1.1.1.2 joerg 6744 1.1.1.2 joerg 6745 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>></td><td class="name" onclick="toggle('hasEitherOperand1')"><a name="hasEitherOperand1Anchor">hasEitherOperand</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 6746 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasEitherOperand1"><pre>Matches if either the left hand side or the right hand side of a 6747 1.1.1.2 joerg binary operator matches. 6748 1.1.1.2 joerg </pre></td></tr> 6749 1.1.1.2 joerg 6750 1.1.1.2 joerg 6751 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>></td><td class="name" onclick="toggle('hasLHS1')"><a name="hasLHS1Anchor">hasLHS</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 6752 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasLHS1"><pre>Matches the left hand side of binary operator expressions. 6753 1.1.1.2 joerg 6754 1.1.1.2 joerg Example matches a (matcher = binaryOperator(hasLHS())) 6755 1.1.1.2 joerg a || b 6756 1.1.1.2 joerg </pre></td></tr> 6757 1.1.1.2 joerg 6758 1.1.1.2 joerg 6759 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>></td><td class="name" onclick="toggle('hasOperands1')"><a name="hasOperands1Anchor">hasOperands</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> Matcher1, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> Matcher2</td></tr> 6760 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasOperands1"><pre>Matches if both matchers match with opposite sides of the binary operator. 6761 1.1.1.2 joerg 6762 1.1.1.2 joerg Example matcher = binaryOperator(hasOperands(integerLiteral(equals(1), 6763 1.1.1.2 joerg integerLiteral(equals(2))) 6764 1.1.1.2 joerg 1 + 2 // Match 6765 1.1.1.2 joerg 2 + 1 // Match 6766 1.1.1.2 joerg 1 + 1 // No match 6767 1.1.1.2 joerg 2 + 2 // No match 6768 1.1.1.2 joerg </pre></td></tr> 6769 1.1.1.2 joerg 6770 1.1.1.2 joerg 6771 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>></td><td class="name" onclick="toggle('hasRHS1')"><a name="hasRHS1Anchor">hasRHS</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 6772 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasRHS1"><pre>Matches the right hand side of binary operator expressions. 6773 1.1.1.2 joerg 6774 1.1.1.2 joerg Example matches b (matcher = binaryOperator(hasRHS())) 6775 1.1.1.2 joerg a || b 6776 1.1.1.2 joerg </pre></td></tr> 6777 1.1.1.2 joerg 6778 1.1.1.2 joerg 6779 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>></td><td class="name" onclick="toggle('hasUnaryOperand1')"><a name="hasUnaryOperand1Anchor">hasUnaryOperand</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 6780 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasUnaryOperand1"><pre>Matches if the operand of a unary operator matches. 6781 1.1.1.2 joerg 6782 1.1.1.2 joerg Example matches true (matcher = hasUnaryOperand( 6783 1.1.1.2 joerg cxxBoolLiteral(equals(true)))) 6784 1.1.1.2 joerg !true 6785 1.1.1.2 joerg </pre></td></tr> 6786 1.1.1.2 joerg 6787 1.1.1.2 joerg 6788 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('hasAnyBase0')"><a name="hasAnyBase0Anchor">hasAnyBase</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>> BaseSpecMatcher</td></tr> 6789 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasAnyBase0"><pre>Matches C++ classes that have a direct or indirect base matching BaseSpecMatcher. 6790 1.1.1.2 joerg 6791 1.1.1.2 joerg Example: 6792 1.1.1.2 joerg matcher hasAnyBase(hasType(cxxRecordDecl(hasName("SpecialBase")))) 6793 1.1.1.2 joerg class Foo; 6794 1.1.1.2 joerg class Bar : Foo {}; 6795 1.1.1.2 joerg class Baz : Bar {}; 6796 1.1.1.2 joerg class SpecialBase; 6797 1.1.1.2 joerg class Proxy : SpecialBase {}; // matches Proxy 6798 1.1.1.2 joerg class IndirectlyDerived : Proxy {}; //matches IndirectlyDerived 6799 1.1.1.2 joerg 6800 1.1.1.2 joerg FIXME: Refactor this and isDerivedFrom to reuse implementation. 6801 1.1.1.2 joerg </pre></td></tr> 6802 1.1 joerg 6803 1.1 joerg 6804 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('hasDirectBase0')"><a name="hasDirectBase0Anchor">hasDirectBase</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>> BaseSpecMatcher</td></tr> 6805 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasDirectBase0"><pre>Matches C++ classes that have a direct base matching BaseSpecMatcher. 6806 1.1.1.2 joerg 6807 1.1.1.2 joerg Example: 6808 1.1.1.2 joerg matcher hasDirectBase(hasType(cxxRecordDecl(hasName("SpecialBase")))) 6809 1.1.1.2 joerg class Foo; 6810 1.1.1.2 joerg class Bar : Foo {}; 6811 1.1.1.2 joerg class Baz : Bar {}; 6812 1.1.1.2 joerg class SpecialBase; 6813 1.1.1.2 joerg class Proxy : SpecialBase {}; // matches Proxy 6814 1.1.1.2 joerg class IndirectlyDerived : Proxy {}; // doesn't match 6815 1.1 joerg </pre></td></tr> 6816 1.1 joerg 6817 1.1 joerg 6818 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('hasMethod0')"><a name="hasMethod0Anchor">hasMethod</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>> InnerMatcher</td></tr> 6819 1.1 joerg <tr><td colspan="4" class="doc" id="hasMethod0"><pre>Matches the first method of a class or struct that satisfies InnerMatcher. 6820 1.1 joerg 6821 1.1 joerg Given: 6822 1.1 joerg class A { void func(); }; 6823 1.1 joerg class B { void member(); }; 6824 1.1 joerg 6825 1.1 joerg cxxRecordDecl(hasMethod(hasName("func"))) matches the declaration of 6826 1.1 joerg A but not B. 6827 1.1 joerg </pre></td></tr> 6828 1.1 joerg 6829 1.1 joerg 6830 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('isDerivedFrom0')"><a name="isDerivedFrom0Anchor">isDerivedFrom</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>> Base</td></tr> 6831 1.1 joerg <tr><td colspan="4" class="doc" id="isDerivedFrom0"><pre>Matches C++ classes that are directly or indirectly derived from a class 6832 1.1 joerg matching Base, or Objective-C classes that directly or indirectly 6833 1.1 joerg subclass a class matching Base. 6834 1.1 joerg 6835 1.1 joerg Note that a class is not considered to be derived from itself. 6836 1.1 joerg 6837 1.1 joerg Example matches Y, Z, C (Base == hasName("X")) 6838 1.1 joerg class X; 6839 1.1 joerg class Y : public X {}; // directly derived 6840 1.1 joerg class Z : public Y {}; // indirectly derived 6841 1.1 joerg typedef X A; 6842 1.1 joerg typedef A B; 6843 1.1 joerg class C : public B {}; // derived from a typedef of X 6844 1.1 joerg 6845 1.1 joerg In the following example, Bar matches isDerivedFrom(hasName("X")): 6846 1.1 joerg class Foo; 6847 1.1 joerg typedef Foo X; 6848 1.1 joerg class Bar : public Foo {}; // derived from a type that X is a typedef of 6849 1.1 joerg 6850 1.1 joerg In the following example, Bar matches isDerivedFrom(hasName("NSObject")) 6851 1.1 joerg @interface NSObject @end 6852 1.1 joerg @interface Bar : NSObject @end 6853 1.1 joerg 6854 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>> 6855 1.1 joerg </pre></td></tr> 6856 1.1 joerg 6857 1.1 joerg 6858 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('isDirectlyDerivedFrom0')"><a name="isDirectlyDerivedFrom0Anchor">isDirectlyDerivedFrom</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>> Base</td></tr> 6859 1.1 joerg <tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom0"><pre>Matches C++ or Objective-C classes that are directly derived from a class 6860 1.1 joerg matching Base. 6861 1.1 joerg 6862 1.1 joerg Note that a class is not considered to be derived from itself. 6863 1.1 joerg 6864 1.1 joerg Example matches Y, C (Base == hasName("X")) 6865 1.1 joerg class X; 6866 1.1 joerg class Y : public X {}; // directly derived 6867 1.1 joerg class Z : public Y {}; // indirectly derived 6868 1.1 joerg typedef X A; 6869 1.1 joerg typedef A B; 6870 1.1 joerg class C : public B {}; // derived from a typedef of X 6871 1.1 joerg 6872 1.1 joerg In the following example, Bar matches isDerivedFrom(hasName("X")): 6873 1.1 joerg class Foo; 6874 1.1 joerg typedef Foo X; 6875 1.1 joerg class Bar : public Foo {}; // derived from a type that X is a typedef of 6876 1.1 joerg </pre></td></tr> 6877 1.1 joerg 6878 1.1 joerg 6879 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('isSameOrDerivedFrom0')"><a name="isSameOrDerivedFrom0Anchor">isSameOrDerivedFrom</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>> Base</td></tr> 6880 1.1 joerg <tr><td colspan="4" class="doc" id="isSameOrDerivedFrom0"><pre>Similar to isDerivedFrom(), but also matches classes that directly 6881 1.1 joerg match Base. 6882 1.1 joerg </pre></td></tr> 6883 1.1 joerg 6884 1.1 joerg 6885 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRewrittenBinaryOperator.html">CXXRewrittenBinaryOperator</a>></td><td class="name" onclick="toggle('hasEitherOperand2')"><a name="hasEitherOperand2Anchor">hasEitherOperand</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 6886 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasEitherOperand2"><pre>Matches if either the left hand side or the right hand side of a 6887 1.1.1.2 joerg binary operator matches. 6888 1.1.1.2 joerg </pre></td></tr> 6889 1.1.1.2 joerg 6890 1.1.1.2 joerg 6891 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRewrittenBinaryOperator.html">CXXRewrittenBinaryOperator</a>></td><td class="name" onclick="toggle('hasLHS2')"><a name="hasLHS2Anchor">hasLHS</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 6892 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasLHS2"><pre>Matches the left hand side of binary operator expressions. 6893 1.1.1.2 joerg 6894 1.1.1.2 joerg Example matches a (matcher = binaryOperator(hasLHS())) 6895 1.1.1.2 joerg a || b 6896 1.1.1.2 joerg </pre></td></tr> 6897 1.1.1.2 joerg 6898 1.1.1.2 joerg 6899 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRewrittenBinaryOperator.html">CXXRewrittenBinaryOperator</a>></td><td class="name" onclick="toggle('hasOperands2')"><a name="hasOperands2Anchor">hasOperands</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> Matcher1, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> Matcher2</td></tr> 6900 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasOperands2"><pre>Matches if both matchers match with opposite sides of the binary operator. 6901 1.1.1.2 joerg 6902 1.1.1.2 joerg Example matcher = binaryOperator(hasOperands(integerLiteral(equals(1), 6903 1.1.1.2 joerg integerLiteral(equals(2))) 6904 1.1.1.2 joerg 1 + 2 // Match 6905 1.1.1.2 joerg 2 + 1 // Match 6906 1.1.1.2 joerg 1 + 1 // No match 6907 1.1.1.2 joerg 2 + 2 // No match 6908 1.1.1.2 joerg </pre></td></tr> 6909 1.1.1.2 joerg 6910 1.1.1.2 joerg 6911 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRewrittenBinaryOperator.html">CXXRewrittenBinaryOperator</a>></td><td class="name" onclick="toggle('hasRHS2')"><a name="hasRHS2Anchor">hasRHS</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 6912 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasRHS2"><pre>Matches the right hand side of binary operator expressions. 6913 1.1.1.2 joerg 6914 1.1.1.2 joerg Example matches b (matcher = binaryOperator(hasRHS())) 6915 1.1.1.2 joerg a || b 6916 1.1.1.2 joerg </pre></td></tr> 6917 1.1.1.2 joerg 6918 1.1.1.2 joerg 6919 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>></td><td class="name" onclick="toggle('hasTypeLoc5')"><a name="hasTypeLoc5Anchor">hasTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> Inner</td></tr> 6920 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasTypeLoc5"><pre>Matches if the type location of a node matches the inner matcher. 6921 1.1.1.2 joerg 6922 1.1.1.2 joerg Examples: 6923 1.1.1.2 joerg int x; 6924 1.1.1.2 joerg declaratorDecl(hasTypeLoc(loc(asString("int")))) 6925 1.1.1.2 joerg matches int x 6926 1.1.1.2 joerg 6927 1.1.1.2 joerg auto x = int(3); 6928 1.1.1.2 joerg cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) 6929 1.1.1.2 joerg matches int(3) 6930 1.1.1.2 joerg 6931 1.1.1.2 joerg struct Foo { Foo(int, int); }; 6932 1.1.1.2 joerg auto x = Foo(1, 2); 6933 1.1.1.2 joerg cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) 6934 1.1.1.2 joerg matches Foo(1, 2) 6935 1.1.1.2 joerg 6936 1.1.1.2 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>>, 6937 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>>, 6938 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>>, 6939 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>, 6940 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>>, 6941 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>>, 6942 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>>, 6943 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>> 6944 1.1.1.2 joerg </pre></td></tr> 6945 1.1.1.2 joerg 6946 1.1.1.2 joerg 6947 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>></td><td class="name" onclick="toggle('hasAnyArgument2')"><a name="hasAnyArgument2Anchor">hasAnyArgument</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 6948 1.1 joerg <tr><td colspan="4" class="doc" id="hasAnyArgument2"><pre>Matches any argument of a call expression or a constructor call 6949 1.1 joerg expression, or an ObjC-message-send expression. 6950 1.1 joerg 6951 1.1 joerg Given 6952 1.1 joerg void x(int, int, int) { int y; x(1, y, 42); } 6953 1.1 joerg callExpr(hasAnyArgument(declRefExpr())) 6954 1.1 joerg matches x(1, y, 42) 6955 1.1 joerg with hasAnyArgument(...) 6956 1.1 joerg matching y 6957 1.1 joerg 6958 1.1 joerg For ObjectiveC, given 6959 1.1 joerg @interface I - (void) f:(int) y; @end 6960 1.1 joerg void foo(I *i) { [i f:12]; } 6961 1.1 joerg objcMessageExpr(hasAnyArgument(integerLiteral(equals(12)))) 6962 1.1 joerg matches [i f:12] 6963 1.1 joerg </pre></td></tr> 6964 1.1 joerg 6965 1.1 joerg 6966 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>></td><td class="name" onclick="toggle('hasArgument2')"><a name="hasArgument2Anchor">hasArgument</a></td><td>unsigned N, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 6967 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasArgument2"><pre>Matches the n'th argument of a call expression or a constructor 6968 1.1.1.2 joerg call expression. 6969 1.1.1.2 joerg 6970 1.1.1.2 joerg Example matches y in x(y) 6971 1.1.1.2 joerg (matcher = callExpr(hasArgument(0, declRefExpr()))) 6972 1.1.1.2 joerg void x(int) { int y; x(y); } 6973 1.1.1.2 joerg </pre></td></tr> 6974 1.1.1.2 joerg 6975 1.1.1.2 joerg 6976 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>></td><td class="name" onclick="toggle('hasTypeLoc6')"><a name="hasTypeLoc6Anchor">hasTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> Inner</td></tr> 6977 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasTypeLoc6"><pre>Matches if the type location of a node matches the inner matcher. 6978 1.1.1.2 joerg 6979 1.1.1.2 joerg Examples: 6980 1.1.1.2 joerg int x; 6981 1.1.1.2 joerg declaratorDecl(hasTypeLoc(loc(asString("int")))) 6982 1.1.1.2 joerg matches int x 6983 1.1.1.2 joerg 6984 1.1.1.2 joerg auto x = int(3); 6985 1.1.1.2 joerg cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) 6986 1.1.1.2 joerg matches int(3) 6987 1.1.1.2 joerg 6988 1.1.1.2 joerg struct Foo { Foo(int, int); }; 6989 1.1.1.2 joerg auto x = Foo(1, 2); 6990 1.1.1.2 joerg cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) 6991 1.1.1.2 joerg matches Foo(1, 2) 6992 1.1.1.2 joerg 6993 1.1.1.2 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>>, 6994 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>>, 6995 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>>, 6996 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>, 6997 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>>, 6998 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>>, 6999 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>>, 7000 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>> 7001 1.1.1.2 joerg </pre></td></tr> 7002 1.1.1.2 joerg 7003 1.1.1.2 joerg 7004 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>></td><td class="name" onclick="toggle('callee1')"><a name="callee1Anchor">callee</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 7005 1.1 joerg <tr><td colspan="4" class="doc" id="callee1"><pre>Matches if the call expression's callee's declaration matches the 7006 1.1 joerg given matcher. 7007 1.1 joerg 7008 1.1 joerg Example matches y.x() (matcher = callExpr(callee( 7009 1.1 joerg cxxMethodDecl(hasName("x"))))) 7010 1.1 joerg class Y { public: void x(); }; 7011 1.1 joerg void z() { Y y; y.x(); } 7012 1.1 joerg </pre></td></tr> 7013 1.1 joerg 7014 1.1 joerg 7015 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>></td><td class="name" onclick="toggle('callee0')"><a name="callee0Anchor">callee</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr> 7016 1.1 joerg <tr><td colspan="4" class="doc" id="callee0"><pre>Matches if the call expression's callee expression matches. 7017 1.1 joerg 7018 1.1 joerg Given 7019 1.1 joerg class Y { void x() { this->x(); x(); Y y; y.x(); } }; 7020 1.1 joerg void f() { f(); } 7021 1.1 joerg callExpr(callee(expr())) 7022 1.1 joerg matches this->x(), x(), y.x(), f() 7023 1.1 joerg with callee(...) 7024 1.1 joerg matching this->x, x, y.x, f respectively 7025 1.1 joerg 7026 1.1 joerg Note: Callee cannot take the more general internal::Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> 7027 1.1 joerg because this introduces ambiguous overloads with calls to Callee taking a 7028 1.1 joerg internal::Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>, as the matcher hierarchy is purely 7029 1.1 joerg implemented in terms of implicit casts. 7030 1.1 joerg </pre></td></tr> 7031 1.1 joerg 7032 1.1 joerg 7033 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>></td><td class="name" onclick="toggle('forEachArgumentWithParam0')"><a name="forEachArgumentWithParam0Anchor">forEachArgumentWithParam</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> ArgMatcher, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>> ParamMatcher</td></tr> 7034 1.1 joerg <tr><td colspan="4" class="doc" id="forEachArgumentWithParam0"><pre>Matches all arguments and their respective ParmVarDecl. 7035 1.1 joerg 7036 1.1 joerg Given 7037 1.1 joerg void f(int i); 7038 1.1 joerg int y; 7039 1.1 joerg f(y); 7040 1.1 joerg callExpr( 7041 1.1 joerg forEachArgumentWithParam( 7042 1.1 joerg declRefExpr(to(varDecl(hasName("y")))), 7043 1.1 joerg parmVarDecl(hasType(isInteger())) 7044 1.1 joerg )) 7045 1.1 joerg matches f(y); 7046 1.1 joerg with declRefExpr(...) 7047 1.1 joerg matching int y 7048 1.1 joerg and parmVarDecl(...) 7049 1.1 joerg matching int i 7050 1.1 joerg </pre></td></tr> 7051 1.1 joerg 7052 1.1 joerg 7053 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>></td><td class="name" onclick="toggle('forEachArgumentWithParamType0')"><a name="forEachArgumentWithParamType0Anchor">forEachArgumentWithParamType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> ArgMatcher, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> ParamMatcher</td></tr> 7054 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="forEachArgumentWithParamType0"><pre>Matches all arguments and their respective types for a CallExpr or 7055 1.1.1.2 joerg CXXConstructExpr. It is very similar to forEachArgumentWithParam but 7056 1.1.1.2 joerg it works on calls through function pointers as well. 7057 1.1.1.2 joerg 7058 1.1.1.2 joerg The difference is, that function pointers do not provide access to a 7059 1.1.1.2 joerg ParmVarDecl, but only the QualType for each argument. 7060 1.1.1.2 joerg 7061 1.1.1.2 joerg Given 7062 1.1.1.2 joerg void f(int i); 7063 1.1.1.2 joerg int y; 7064 1.1.1.2 joerg f(y); 7065 1.1.1.2 joerg void (*f_ptr)(int) = f; 7066 1.1.1.2 joerg f_ptr(y); 7067 1.1.1.2 joerg callExpr( 7068 1.1.1.2 joerg forEachArgumentWithParamType( 7069 1.1.1.2 joerg declRefExpr(to(varDecl(hasName("y")))), 7070 1.1.1.2 joerg qualType(isInteger()).bind("type) 7071 1.1.1.2 joerg )) 7072 1.1.1.2 joerg matches f(y) and f_ptr(y) 7073 1.1.1.2 joerg with declRefExpr(...) 7074 1.1.1.2 joerg matching int y 7075 1.1.1.2 joerg and qualType(...) 7076 1.1.1.2 joerg matching int 7077 1.1.1.2 joerg </pre></td></tr> 7078 1.1.1.2 joerg 7079 1.1.1.2 joerg 7080 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>></td><td class="name" onclick="toggle('hasAnyArgument0')"><a name="hasAnyArgument0Anchor">hasAnyArgument</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 7081 1.1 joerg <tr><td colspan="4" class="doc" id="hasAnyArgument0"><pre>Matches any argument of a call expression or a constructor call 7082 1.1 joerg expression, or an ObjC-message-send expression. 7083 1.1 joerg 7084 1.1 joerg Given 7085 1.1 joerg void x(int, int, int) { int y; x(1, y, 42); } 7086 1.1 joerg callExpr(hasAnyArgument(declRefExpr())) 7087 1.1 joerg matches x(1, y, 42) 7088 1.1 joerg with hasAnyArgument(...) 7089 1.1 joerg matching y 7090 1.1 joerg 7091 1.1 joerg For ObjectiveC, given 7092 1.1 joerg @interface I - (void) f:(int) y; @end 7093 1.1 joerg void foo(I *i) { [i f:12]; } 7094 1.1 joerg objcMessageExpr(hasAnyArgument(integerLiteral(equals(12)))) 7095 1.1 joerg matches [i f:12] 7096 1.1 joerg </pre></td></tr> 7097 1.1 joerg 7098 1.1 joerg 7099 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>></td><td class="name" onclick="toggle('hasArgument0')"><a name="hasArgument0Anchor">hasArgument</a></td><td>unsigned N, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 7100 1.1 joerg <tr><td colspan="4" class="doc" id="hasArgument0"><pre>Matches the n'th argument of a call expression or a constructor 7101 1.1 joerg call expression. 7102 1.1 joerg 7103 1.1 joerg Example matches y in x(y) 7104 1.1 joerg (matcher = callExpr(hasArgument(0, declRefExpr()))) 7105 1.1 joerg void x(int) { int y; x(y); } 7106 1.1 joerg </pre></td></tr> 7107 1.1 joerg 7108 1.1 joerg 7109 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>></td><td class="name" onclick="toggle('hasDeclaration14')"><a name="hasDeclaration14Anchor">hasDeclaration</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 7110 1.1 joerg <tr><td colspan="4" class="doc" id="hasDeclaration14"><pre>Matches a node if the declaration associated with that node 7111 1.1 joerg matches the given matcher. 7112 1.1 joerg 7113 1.1 joerg The associated declaration is: 7114 1.1 joerg - for type nodes, the declaration of the underlying type 7115 1.1 joerg - for CallExpr, the declaration of the callee 7116 1.1 joerg - for MemberExpr, the declaration of the referenced member 7117 1.1 joerg - for CXXConstructExpr, the declaration of the constructor 7118 1.1 joerg - for CXXNewExpr, the declaration of the operator new 7119 1.1 joerg - for ObjCIvarExpr, the declaration of the ivar 7120 1.1 joerg 7121 1.1 joerg For type nodes, hasDeclaration will generally match the declaration of the 7122 1.1 joerg sugared type. Given 7123 1.1 joerg class X {}; 7124 1.1 joerg typedef X Y; 7125 1.1 joerg Y y; 7126 1.1 joerg in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 7127 1.1 joerg typedefDecl. A common use case is to match the underlying, desugared type. 7128 1.1 joerg This can be achieved by using the hasUnqualifiedDesugaredType matcher: 7129 1.1 joerg varDecl(hasType(hasUnqualifiedDesugaredType( 7130 1.1 joerg recordType(hasDeclaration(decl()))))) 7131 1.1 joerg In this matcher, the decl will match the CXXRecordDecl of class X. 7132 1.1 joerg 7133 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, 7134 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, 7135 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, 7136 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, 7137 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, 7138 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, 7139 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 7140 1.1 joerg </pre></td></tr> 7141 1.1 joerg 7142 1.1 joerg 7143 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CaseStmt.html">CaseStmt</a>></td><td class="name" onclick="toggle('hasCaseConstant0')"><a name="hasCaseConstant0Anchor">hasCaseConstant</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 7144 1.1 joerg <tr><td colspan="4" class="doc" id="hasCaseConstant0"><pre>If the given case statement does not use the GNU case range 7145 1.1 joerg extension, matches the constant given in the statement. 7146 1.1 joerg 7147 1.1 joerg Given 7148 1.1 joerg switch (1) { case 1: case 1+1: case 3 ... 4: ; } 7149 1.1 joerg caseStmt(hasCaseConstant(integerLiteral())) 7150 1.1 joerg matches "case 1:" 7151 1.1 joerg </pre></td></tr> 7152 1.1 joerg 7153 1.1 joerg 7154 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CastExpr.html">CastExpr</a>></td><td class="name" onclick="toggle('hasSourceExpression0')"><a name="hasSourceExpression0Anchor">hasSourceExpression</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 7155 1.1 joerg <tr><td colspan="4" class="doc" id="hasSourceExpression0"><pre>Matches if the cast's source expression 7156 1.1 joerg or opaque value's source expression matches the given matcher. 7157 1.1 joerg 7158 1.1 joerg Example 1: matches "a string" 7159 1.1 joerg (matcher = castExpr(hasSourceExpression(cxxConstructExpr()))) 7160 1.1 joerg class URL { URL(string); }; 7161 1.1 joerg URL url = "a string"; 7162 1.1 joerg 7163 1.1 joerg Example 2: matches 'b' (matcher = 7164 1.1 joerg opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr()))) 7165 1.1 joerg int a = b ?: 1; 7166 1.1 joerg </pre></td></tr> 7167 1.1 joerg 7168 1.1 joerg 7169 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>></td><td class="name" onclick="toggle('hasAnyTemplateArgument0')"><a name="hasAnyTemplateArgument0Anchor">hasAnyTemplateArgument</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>> InnerMatcher</td></tr> 7170 1.1 joerg <tr><td colspan="4" class="doc" id="hasAnyTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and 7171 1.1 joerg functionDecl that have at least one TemplateArgument matching the given 7172 1.1 joerg InnerMatcher. 7173 1.1 joerg 7174 1.1 joerg Given 7175 1.1 joerg template<typename T> class A {}; 7176 1.1 joerg template<> class A<double> {}; 7177 1.1 joerg A<int> a; 7178 1.1 joerg 7179 1.1 joerg template<typename T> f() {}; 7180 1.1 joerg void func() { f<int>(); }; 7181 1.1 joerg 7182 1.1 joerg classTemplateSpecializationDecl(hasAnyTemplateArgument( 7183 1.1 joerg refersToType(asString("int")))) 7184 1.1 joerg matches the specialization A<int> 7185 1.1 joerg 7186 1.1 joerg functionDecl(hasAnyTemplateArgument(refersToType(asString("int")))) 7187 1.1 joerg matches the specialization f<int> 7188 1.1 joerg </pre></td></tr> 7189 1.1 joerg 7190 1.1 joerg 7191 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>></td><td class="name" onclick="toggle('hasSpecializedTemplate0')"><a name="hasSpecializedTemplate0Anchor">hasSpecializedTemplate</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateDecl.html">ClassTemplateDecl</a>> InnerMatcher</td></tr> 7192 1.1 joerg <tr><td colspan="4" class="doc" id="hasSpecializedTemplate0"><pre>Matches the specialized template of a specialization declaration. 7193 1.1 joerg 7194 1.1 joerg Given 7195 1.1 joerg template<typename T> class A {}; #1 7196 1.1 joerg template<> class A<int> {}; #2 7197 1.1 joerg classTemplateSpecializationDecl(hasSpecializedTemplate(classTemplateDecl())) 7198 1.1 joerg matches '#2' with classTemplateDecl() matching the class template 7199 1.1 joerg declaration of 'A' at #1. 7200 1.1 joerg </pre></td></tr> 7201 1.1 joerg 7202 1.1 joerg 7203 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>></td><td class="name" onclick="toggle('hasTemplateArgument0')"><a name="hasTemplateArgument0Anchor">hasTemplateArgument</a></td><td>unsigned N, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>> InnerMatcher</td></tr> 7204 1.1 joerg <tr><td colspan="4" class="doc" id="hasTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and 7205 1.1 joerg functionDecl where the n'th TemplateArgument matches the given InnerMatcher. 7206 1.1 joerg 7207 1.1 joerg Given 7208 1.1 joerg template<typename T, typename U> class A {}; 7209 1.1 joerg A<bool, int> b; 7210 1.1 joerg A<int, bool> c; 7211 1.1 joerg 7212 1.1 joerg template<typename T> void f() {} 7213 1.1 joerg void func() { f<int>(); }; 7214 1.1 joerg classTemplateSpecializationDecl(hasTemplateArgument( 7215 1.1 joerg 1, refersToType(asString("int")))) 7216 1.1 joerg matches the specialization A<bool, int> 7217 1.1 joerg 7218 1.1 joerg functionDecl(hasTemplateArgument(0, refersToType(asString("int")))) 7219 1.1 joerg matches the specialization f<int> 7220 1.1 joerg </pre></td></tr> 7221 1.1 joerg 7222 1.1 joerg 7223 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>></td><td class="name" onclick="toggle('hasTypeLoc7')"><a name="hasTypeLoc7Anchor">hasTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> Inner</td></tr> 7224 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasTypeLoc7"><pre>Matches if the type location of a node matches the inner matcher. 7225 1.1.1.2 joerg 7226 1.1.1.2 joerg Examples: 7227 1.1.1.2 joerg int x; 7228 1.1.1.2 joerg declaratorDecl(hasTypeLoc(loc(asString("int")))) 7229 1.1.1.2 joerg matches int x 7230 1.1.1.2 joerg 7231 1.1.1.2 joerg auto x = int(3); 7232 1.1.1.2 joerg cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) 7233 1.1.1.2 joerg matches int(3) 7234 1.1.1.2 joerg 7235 1.1.1.2 joerg struct Foo { Foo(int, int); }; 7236 1.1.1.2 joerg auto x = Foo(1, 2); 7237 1.1.1.2 joerg cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) 7238 1.1.1.2 joerg matches Foo(1, 2) 7239 1.1.1.2 joerg 7240 1.1.1.2 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>>, 7241 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>>, 7242 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>>, 7243 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>, 7244 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>>, 7245 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>>, 7246 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>>, 7247 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>> 7248 1.1.1.2 joerg </pre></td></tr> 7249 1.1.1.2 joerg 7250 1.1.1.2 joerg 7251 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ComplexType.html">ComplexType</a>></td><td class="name" onclick="toggle('hasElementType1')"><a name="hasElementType1Anchor">hasElementType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td></tr> 7252 1.1 joerg <tr><td colspan="4" class="doc" id="hasElementType1"><pre>Matches arrays and C99 complex types that have a specific element 7253 1.1 joerg type. 7254 1.1 joerg 7255 1.1 joerg Given 7256 1.1 joerg struct A {}; 7257 1.1 joerg A a[7]; 7258 1.1 joerg int b[7]; 7259 1.1 joerg arrayType(hasElementType(builtinType())) 7260 1.1 joerg matches "int b[7]" 7261 1.1 joerg 7262 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ArrayType.html">ArrayType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ComplexType.html">ComplexType</a>> 7263 1.1 joerg </pre></td></tr> 7264 1.1 joerg 7265 1.1 joerg 7266 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>></td><td class="name" onclick="toggle('hasTypeLoc8')"><a name="hasTypeLoc8Anchor">hasTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> Inner</td></tr> 7267 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasTypeLoc8"><pre>Matches if the type location of a node matches the inner matcher. 7268 1.1.1.2 joerg 7269 1.1.1.2 joerg Examples: 7270 1.1.1.2 joerg int x; 7271 1.1.1.2 joerg declaratorDecl(hasTypeLoc(loc(asString("int")))) 7272 1.1.1.2 joerg matches int x 7273 1.1.1.2 joerg 7274 1.1.1.2 joerg auto x = int(3); 7275 1.1.1.2 joerg cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) 7276 1.1.1.2 joerg matches int(3) 7277 1.1.1.2 joerg 7278 1.1.1.2 joerg struct Foo { Foo(int, int); }; 7279 1.1.1.2 joerg auto x = Foo(1, 2); 7280 1.1.1.2 joerg cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) 7281 1.1.1.2 joerg matches Foo(1, 2) 7282 1.1.1.2 joerg 7283 1.1.1.2 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>>, 7284 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>>, 7285 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>>, 7286 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>, 7287 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>>, 7288 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>>, 7289 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>>, 7290 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>> 7291 1.1.1.2 joerg </pre></td></tr> 7292 1.1.1.2 joerg 7293 1.1.1.2 joerg 7294 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundStmt.html">CompoundStmt</a>></td><td class="name" onclick="toggle('hasAnySubstatement0')"><a name="hasAnySubstatement0Anchor">hasAnySubstatement</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr> 7295 1.1 joerg <tr><td colspan="4" class="doc" id="hasAnySubstatement0"><pre>Matches compound statements where at least one substatement matches 7296 1.1 joerg a given matcher. Also matches StmtExprs that have CompoundStmt as children. 7297 1.1 joerg 7298 1.1 joerg Given 7299 1.1 joerg { {}; 1+2; } 7300 1.1 joerg hasAnySubstatement(compoundStmt()) 7301 1.1 joerg matches '{ {}; 1+2; }' 7302 1.1 joerg with compoundStmt() 7303 1.1 joerg matching '{}' 7304 1.1 joerg </pre></td></tr> 7305 1.1 joerg 7306 1.1 joerg 7307 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DecayedType.html">DecayedType</a>></td><td class="name" onclick="toggle('hasDecayedType0')"><a name="hasDecayedType0Anchor">hasDecayedType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerType</td></tr> 7308 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasDecayedType0"><pre>Matches the decayed type, whoes decayed type matches InnerMatcher 7309 1.1 joerg </pre></td></tr> 7310 1.1 joerg 7311 1.1 joerg 7312 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>></td><td class="name" onclick="toggle('hasDeclaration11')"><a name="hasDeclaration11Anchor">hasDeclaration</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 7313 1.1 joerg <tr><td colspan="4" class="doc" id="hasDeclaration11"><pre>Matches a node if the declaration associated with that node 7314 1.1 joerg matches the given matcher. 7315 1.1 joerg 7316 1.1 joerg The associated declaration is: 7317 1.1 joerg - for type nodes, the declaration of the underlying type 7318 1.1 joerg - for CallExpr, the declaration of the callee 7319 1.1 joerg - for MemberExpr, the declaration of the referenced member 7320 1.1 joerg - for CXXConstructExpr, the declaration of the constructor 7321 1.1 joerg - for CXXNewExpr, the declaration of the operator new 7322 1.1 joerg - for ObjCIvarExpr, the declaration of the ivar 7323 1.1 joerg 7324 1.1 joerg For type nodes, hasDeclaration will generally match the declaration of the 7325 1.1 joerg sugared type. Given 7326 1.1 joerg class X {}; 7327 1.1 joerg typedef X Y; 7328 1.1 joerg Y y; 7329 1.1 joerg in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 7330 1.1 joerg typedefDecl. A common use case is to match the underlying, desugared type. 7331 1.1 joerg This can be achieved by using the hasUnqualifiedDesugaredType matcher: 7332 1.1 joerg varDecl(hasType(hasUnqualifiedDesugaredType( 7333 1.1 joerg recordType(hasDeclaration(decl()))))) 7334 1.1 joerg In this matcher, the decl will match the CXXRecordDecl of class X. 7335 1.1 joerg 7336 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, 7337 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, 7338 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, 7339 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, 7340 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, 7341 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, 7342 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 7343 1.1 joerg </pre></td></tr> 7344 1.1 joerg 7345 1.1 joerg 7346 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>></td><td class="name" onclick="toggle('throughUsingDecl0')"><a name="throughUsingDecl0Anchor">throughUsingDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingShadowDecl.html">UsingShadowDecl</a>> InnerMatcher</td></tr> 7347 1.1 joerg <tr><td colspan="4" class="doc" id="throughUsingDecl0"><pre>Matches a DeclRefExpr that refers to a declaration through a 7348 1.1 joerg specific using shadow declaration. 7349 1.1 joerg 7350 1.1 joerg Given 7351 1.1 joerg namespace a { void f() {} } 7352 1.1 joerg using a::f; 7353 1.1 joerg void g() { 7354 1.1 joerg f(); // Matches this .. 7355 1.1 joerg a::f(); // .. but not this. 7356 1.1 joerg } 7357 1.1 joerg declRefExpr(throughUsingDecl(anything())) 7358 1.1 joerg matches f() 7359 1.1 joerg </pre></td></tr> 7360 1.1 joerg 7361 1.1 joerg 7362 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>></td><td class="name" onclick="toggle('to0')"><a name="to0Anchor">to</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 7363 1.1 joerg <tr><td colspan="4" class="doc" id="to0"><pre>Matches a DeclRefExpr that refers to a declaration that matches the 7364 1.1 joerg specified matcher. 7365 1.1 joerg 7366 1.1 joerg Example matches x in if(x) 7367 1.1 joerg (matcher = declRefExpr(to(varDecl(hasName("x"))))) 7368 1.1 joerg bool x; 7369 1.1 joerg if (x) {} 7370 1.1 joerg </pre></td></tr> 7371 1.1 joerg 7372 1.1 joerg 7373 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclStmt.html">DeclStmt</a>></td><td class="name" onclick="toggle('containsDeclaration0')"><a name="containsDeclaration0Anchor">containsDeclaration</a></td><td>unsigned N, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 7374 1.1 joerg <tr><td colspan="4" class="doc" id="containsDeclaration0"><pre>Matches the n'th declaration of a declaration statement. 7375 1.1 joerg 7376 1.1 joerg Note that this does not work for global declarations because the AST 7377 1.1 joerg breaks up multiple-declaration DeclStmt's into multiple single-declaration 7378 1.1 joerg DeclStmt's. 7379 1.1 joerg Example: Given non-global declarations 7380 1.1 joerg int a, b = 0; 7381 1.1 joerg int c; 7382 1.1 joerg int d = 2, e; 7383 1.1 joerg declStmt(containsDeclaration( 7384 1.1 joerg 0, varDecl(hasInitializer(anything())))) 7385 1.1 joerg matches only 'int d = 2, e;', and 7386 1.1 joerg declStmt(containsDeclaration(1, varDecl())) 7387 1.1 joerg matches 'int a, b = 0' as well as 'int d = 2, e;' 7388 1.1 joerg but 'int c;' is not matched. 7389 1.1 joerg </pre></td></tr> 7390 1.1 joerg 7391 1.1 joerg 7392 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclStmt.html">DeclStmt</a>></td><td class="name" onclick="toggle('hasSingleDecl0')"><a name="hasSingleDecl0Anchor">hasSingleDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 7393 1.1 joerg <tr><td colspan="4" class="doc" id="hasSingleDecl0"><pre>Matches the Decl of a DeclStmt which has a single declaration. 7394 1.1 joerg 7395 1.1 joerg Given 7396 1.1 joerg int a, b; 7397 1.1 joerg int c; 7398 1.1 joerg declStmt(hasSingleDecl(anything())) 7399 1.1 joerg matches 'int c;' but not 'int a, b;'. 7400 1.1 joerg </pre></td></tr> 7401 1.1 joerg 7402 1.1 joerg 7403 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>></td><td class="name" onclick="toggle('hasTypeLoc9')"><a name="hasTypeLoc9Anchor">hasTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> Inner</td></tr> 7404 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasTypeLoc9"><pre>Matches if the type location of a node matches the inner matcher. 7405 1.1 joerg 7406 1.1.1.2 joerg Examples: 7407 1.1 joerg int x; 7408 1.1 joerg declaratorDecl(hasTypeLoc(loc(asString("int")))) 7409 1.1 joerg matches int x 7410 1.1.1.2 joerg 7411 1.1.1.2 joerg auto x = int(3); 7412 1.1.1.2 joerg cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) 7413 1.1.1.2 joerg matches int(3) 7414 1.1.1.2 joerg 7415 1.1.1.2 joerg struct Foo { Foo(int, int); }; 7416 1.1.1.2 joerg auto x = Foo(1, 2); 7417 1.1.1.2 joerg cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) 7418 1.1.1.2 joerg matches Foo(1, 2) 7419 1.1.1.2 joerg 7420 1.1.1.2 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>>, 7421 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>>, 7422 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>>, 7423 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>, 7424 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>>, 7425 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>>, 7426 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>>, 7427 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>> 7428 1.1 joerg </pre></td></tr> 7429 1.1 joerg 7430 1.1 joerg 7431 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('hasDeclContext0')"><a name="hasDeclContext0Anchor">hasDeclContext</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 7432 1.1 joerg <tr><td colspan="4" class="doc" id="hasDeclContext0"><pre>Matches declarations whose declaration context, interpreted as a 7433 1.1 joerg Decl, matches InnerMatcher. 7434 1.1 joerg 7435 1.1 joerg Given 7436 1.1 joerg namespace N { 7437 1.1 joerg namespace M { 7438 1.1 joerg class D {}; 7439 1.1 joerg } 7440 1.1 joerg } 7441 1.1 joerg 7442 1.1 joerg cxxRcordDecl(hasDeclContext(namedDecl(hasName("M")))) matches the 7443 1.1 joerg declaration of class D. 7444 1.1 joerg </pre></td></tr> 7445 1.1 joerg 7446 1.1 joerg 7447 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DecltypeType.html">DecltypeType</a>></td><td class="name" onclick="toggle('hasUnderlyingType0')"><a name="hasUnderlyingType0Anchor">hasUnderlyingType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td></tr> 7448 1.1 joerg <tr><td colspan="4" class="doc" id="hasUnderlyingType0"><pre>Matches DecltypeType nodes to find out the underlying type. 7449 1.1 joerg 7450 1.1 joerg Given 7451 1.1 joerg decltype(1) a = 1; 7452 1.1 joerg decltype(2.0) b = 2.0; 7453 1.1 joerg decltypeType(hasUnderlyingType(isInteger())) 7454 1.1 joerg matches the type of "a" 7455 1.1 joerg 7456 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DecltypeType.html">DecltypeType</a>> 7457 1.1 joerg </pre></td></tr> 7458 1.1 joerg 7459 1.1 joerg 7460 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DecompositionDecl.html">DecompositionDecl</a>></td><td class="name" onclick="toggle('hasAnyBinding0')"><a name="hasAnyBinding0Anchor">hasAnyBinding</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BindingDecl.html">BindingDecl</a>> InnerMatcher</td></tr> 7461 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasAnyBinding0"><pre>Matches any binding of a DecompositionDecl. 7462 1.1 joerg 7463 1.1.1.2 joerg For example, in: 7464 1.1.1.2 joerg void foo() 7465 1.1.1.2 joerg { 7466 1.1.1.2 joerg int arr[3]; 7467 1.1.1.2 joerg auto &[f, s, t] = arr; 7468 1.1.1.2 joerg 7469 1.1.1.2 joerg f = 42; 7470 1.1.1.2 joerg } 7471 1.1.1.2 joerg The matcher: 7472 1.1.1.2 joerg decompositionDecl(hasAnyBinding(bindingDecl(hasName("f").bind("fBinding")))) 7473 1.1.1.2 joerg matches the decomposition decl with 'f' bound to "fBinding". 7474 1.1.1.2 joerg </pre></td></tr> 7475 1.1.1.2 joerg 7476 1.1.1.2 joerg 7477 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DecompositionDecl.html">DecompositionDecl</a>></td><td class="name" onclick="toggle('hasBinding0')"><a name="hasBinding0Anchor">hasBinding</a></td><td>unsigned N, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BindingDecl.html">BindingDecl</a>> InnerMatcher</td></tr> 7478 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasBinding0"><pre>Matches the Nth binding of a DecompositionDecl. 7479 1.1.1.2 joerg 7480 1.1.1.2 joerg For example, in: 7481 1.1.1.2 joerg void foo() 7482 1.1.1.2 joerg { 7483 1.1.1.2 joerg int arr[3]; 7484 1.1.1.2 joerg auto &[f, s, t] = arr; 7485 1.1.1.2 joerg 7486 1.1.1.2 joerg f = 42; 7487 1.1.1.2 joerg } 7488 1.1.1.2 joerg The matcher: 7489 1.1.1.2 joerg decompositionDecl(hasBinding(0, 7490 1.1.1.2 joerg bindingDecl(hasName("f").bind("fBinding")))) 7491 1.1.1.2 joerg matches the decomposition decl with 'f' bound to "fBinding". 7492 1.1 joerg </pre></td></tr> 7493 1.1 joerg 7494 1.1 joerg 7495 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DoStmt.html">DoStmt</a>></td><td class="name" onclick="toggle('hasBody0')"><a name="hasBody0Anchor">hasBody</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr> 7496 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasBody0"><pre></pre></td></tr> 7497 1.1.1.2 joerg 7498 1.1.1.2 joerg 7499 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DoStmt.html">DoStmt</a>></td><td class="name" onclick="toggle('hasCondition3')"><a name="hasCondition3Anchor">hasCondition</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 7500 1.1 joerg <tr><td colspan="4" class="doc" id="hasCondition3"><pre>Matches the condition expression of an if statement, for loop, 7501 1.1 joerg switch statement or conditional operator. 7502 1.1 joerg 7503 1.1 joerg Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 7504 1.1 joerg if (true) {} 7505 1.1 joerg </pre></td></tr> 7506 1.1 joerg 7507 1.1 joerg 7508 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ElaboratedType.html">ElaboratedType</a>></td><td class="name" onclick="toggle('hasQualifier0')"><a name="hasQualifier0Anchor">hasQualifier</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>> InnerMatcher</td></tr> 7509 1.1 joerg <tr><td colspan="4" class="doc" id="hasQualifier0"><pre>Matches ElaboratedTypes whose qualifier, a NestedNameSpecifier, 7510 1.1 joerg matches InnerMatcher if the qualifier exists. 7511 1.1 joerg 7512 1.1 joerg Given 7513 1.1 joerg namespace N { 7514 1.1 joerg namespace M { 7515 1.1 joerg class D {}; 7516 1.1 joerg } 7517 1.1 joerg } 7518 1.1 joerg N::M::D d; 7519 1.1 joerg 7520 1.1 joerg elaboratedType(hasQualifier(hasPrefix(specifiesNamespace(hasName("N")))) 7521 1.1 joerg matches the type of the variable declaration of d. 7522 1.1 joerg </pre></td></tr> 7523 1.1 joerg 7524 1.1 joerg 7525 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ElaboratedType.html">ElaboratedType</a>></td><td class="name" onclick="toggle('namesType0')"><a name="namesType0Anchor">namesType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 7526 1.1 joerg <tr><td colspan="4" class="doc" id="namesType0"><pre>Matches ElaboratedTypes whose named type matches InnerMatcher. 7527 1.1 joerg 7528 1.1 joerg Given 7529 1.1 joerg namespace N { 7530 1.1 joerg namespace M { 7531 1.1 joerg class D {}; 7532 1.1 joerg } 7533 1.1 joerg } 7534 1.1 joerg N::M::D d; 7535 1.1 joerg 7536 1.1 joerg elaboratedType(namesType(recordType( 7537 1.1 joerg hasDeclaration(namedDecl(hasName("D")))))) matches the type of the variable 7538 1.1 joerg declaration of d. 7539 1.1 joerg </pre></td></tr> 7540 1.1 joerg 7541 1.1 joerg 7542 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>></td><td class="name" onclick="toggle('hasDeclaration10')"><a name="hasDeclaration10Anchor">hasDeclaration</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 7543 1.1 joerg <tr><td colspan="4" class="doc" id="hasDeclaration10"><pre>Matches a node if the declaration associated with that node 7544 1.1 joerg matches the given matcher. 7545 1.1 joerg 7546 1.1 joerg The associated declaration is: 7547 1.1 joerg - for type nodes, the declaration of the underlying type 7548 1.1 joerg - for CallExpr, the declaration of the callee 7549 1.1 joerg - for MemberExpr, the declaration of the referenced member 7550 1.1 joerg - for CXXConstructExpr, the declaration of the constructor 7551 1.1 joerg - for CXXNewExpr, the declaration of the operator new 7552 1.1 joerg - for ObjCIvarExpr, the declaration of the ivar 7553 1.1 joerg 7554 1.1 joerg For type nodes, hasDeclaration will generally match the declaration of the 7555 1.1 joerg sugared type. Given 7556 1.1 joerg class X {}; 7557 1.1 joerg typedef X Y; 7558 1.1 joerg Y y; 7559 1.1 joerg in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 7560 1.1 joerg typedefDecl. A common use case is to match the underlying, desugared type. 7561 1.1 joerg This can be achieved by using the hasUnqualifiedDesugaredType matcher: 7562 1.1 joerg varDecl(hasType(hasUnqualifiedDesugaredType( 7563 1.1 joerg recordType(hasDeclaration(decl()))))) 7564 1.1 joerg In this matcher, the decl will match the CXXRecordDecl of class X. 7565 1.1 joerg 7566 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, 7567 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, 7568 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, 7569 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, 7570 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, 7571 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, 7572 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 7573 1.1 joerg </pre></td></tr> 7574 1.1 joerg 7575 1.1 joerg 7576 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>></td><td class="name" onclick="toggle('hasDestinationType0')"><a name="hasDestinationType0Anchor">hasDestinationType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 7577 1.1 joerg <tr><td colspan="4" class="doc" id="hasDestinationType0"><pre>Matches casts whose destination type matches a given matcher. 7578 1.1 joerg 7579 1.1 joerg (Note: Clang's AST refers to other conversions as "casts" too, and calls 7580 1.1 joerg actual casts "explicit" casts.) 7581 1.1 joerg </pre></td></tr> 7582 1.1 joerg 7583 1.1 joerg 7584 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>></td><td class="name" onclick="toggle('hasTypeLoc10')"><a name="hasTypeLoc10Anchor">hasTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> Inner</td></tr> 7585 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasTypeLoc10"><pre>Matches if the type location of a node matches the inner matcher. 7586 1.1.1.2 joerg 7587 1.1.1.2 joerg Examples: 7588 1.1.1.2 joerg int x; 7589 1.1.1.2 joerg declaratorDecl(hasTypeLoc(loc(asString("int")))) 7590 1.1.1.2 joerg matches int x 7591 1.1.1.2 joerg 7592 1.1.1.2 joerg auto x = int(3); 7593 1.1.1.2 joerg cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) 7594 1.1.1.2 joerg matches int(3) 7595 1.1.1.2 joerg 7596 1.1.1.2 joerg struct Foo { Foo(int, int); }; 7597 1.1.1.2 joerg auto x = Foo(1, 2); 7598 1.1.1.2 joerg cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) 7599 1.1.1.2 joerg matches Foo(1, 2) 7600 1.1.1.2 joerg 7601 1.1.1.2 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>>, 7602 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>>, 7603 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>>, 7604 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>, 7605 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>>, 7606 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>>, 7607 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>>, 7608 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>> 7609 1.1.1.2 joerg </pre></td></tr> 7610 1.1.1.2 joerg 7611 1.1.1.2 joerg 7612 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>></td><td class="name" onclick="toggle('hasType5')"><a name="hasType5Anchor">hasType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 7613 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasType5"><pre>Overloaded to match the declaration of the expression's or value 7614 1.1 joerg declaration's type. 7615 1.1 joerg 7616 1.1 joerg In case of a value declaration (for example a variable declaration), 7617 1.1 joerg this resolves one layer of indirection. For example, in the value 7618 1.1 joerg declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of 7619 1.1 joerg X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the 7620 1.1 joerg declaration of x. 7621 1.1 joerg 7622 1.1 joerg Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 7623 1.1 joerg and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 7624 1.1 joerg and friend class X (matcher = friendDecl(hasType("X")) 7625 1.1.1.2 joerg and public virtual X (matcher = cxxBaseSpecifier(hasType( 7626 1.1.1.2 joerg cxxRecordDecl(hasName("X")))) 7627 1.1 joerg class X {}; 7628 1.1 joerg void y(X &x) { x; X z; } 7629 1.1 joerg class Y { friend class X; }; 7630 1.1.1.2 joerg class Z : public virtual X {}; 7631 1.1.1.2 joerg 7632 1.1.1.2 joerg Example matches class Derived 7633 1.1.1.2 joerg (matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base")))))) 7634 1.1.1.2 joerg class Base {}; 7635 1.1.1.2 joerg class Derived : Base {}; 7636 1.1 joerg 7637 1.1.1.2 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FriendDecl.html">FriendDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>>, 7638 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>> 7639 1.1 joerg </pre></td></tr> 7640 1.1 joerg 7641 1.1 joerg 7642 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>></td><td class="name" onclick="toggle('hasType0')"><a name="hasType0Anchor">hasType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 7643 1.1 joerg <tr><td colspan="4" class="doc" id="hasType0"><pre>Matches if the expression's or declaration's type matches a type 7644 1.1 joerg matcher. 7645 1.1 joerg 7646 1.1 joerg Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 7647 1.1 joerg and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 7648 1.1 joerg and U (matcher = typedefDecl(hasType(asString("int"))) 7649 1.1 joerg and friend class X (matcher = friendDecl(hasType("X")) 7650 1.1.1.2 joerg and public virtual X (matcher = cxxBaseSpecifier(hasType( 7651 1.1.1.2 joerg asString("class X"))) 7652 1.1 joerg class X {}; 7653 1.1 joerg void y(X &x) { x; X z; } 7654 1.1 joerg typedef int U; 7655 1.1 joerg class Y { friend class X; }; 7656 1.1.1.2 joerg class Z : public virtual X {}; 7657 1.1 joerg </pre></td></tr> 7658 1.1 joerg 7659 1.1 joerg 7660 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>></td><td class="name" onclick="toggle('ignoringElidableConstructorCall0')"><a name="ignoringElidableConstructorCall0Anchor">ignoringElidableConstructorCall</a></td><td>ast_matchers::Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 7661 1.1 joerg <tr><td colspan="4" class="doc" id="ignoringElidableConstructorCall0"><pre>Matches expressions that match InnerMatcher that are possibly wrapped in an 7662 1.1 joerg elidable constructor and other corresponding bookkeeping nodes. 7663 1.1 joerg 7664 1.1 joerg In C++17, elidable copy constructors are no longer being generated in the 7665 1.1 joerg AST as it is not permitted by the standard. They are, however, part of the 7666 1.1 joerg AST in C++14 and earlier. So, a matcher must abstract over these differences 7667 1.1 joerg to work in all language modes. This matcher skips elidable constructor-call 7668 1.1 joerg AST nodes, `ExprWithCleanups` nodes wrapping elidable constructor-calls and 7669 1.1 joerg various implicit nodes inside the constructor calls, all of which will not 7670 1.1 joerg appear in the C++17 AST. 7671 1.1 joerg 7672 1.1 joerg Given 7673 1.1 joerg 7674 1.1 joerg struct H {}; 7675 1.1 joerg H G(); 7676 1.1 joerg void f() { 7677 1.1 joerg H D = G(); 7678 1.1 joerg } 7679 1.1 joerg 7680 1.1 joerg ``varDecl(hasInitializer(ignoringElidableConstructorCall(callExpr())))`` 7681 1.1 joerg matches ``H D = G()`` in C++11 through C++17 (and beyond). 7682 1.1 joerg </pre></td></tr> 7683 1.1 joerg 7684 1.1 joerg 7685 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>></td><td class="name" onclick="toggle('ignoringImpCasts0')"><a name="ignoringImpCasts0Anchor">ignoringImpCasts</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 7686 1.1 joerg <tr><td colspan="4" class="doc" id="ignoringImpCasts0"><pre>Matches expressions that match InnerMatcher after any implicit casts 7687 1.1 joerg are stripped off. 7688 1.1 joerg 7689 1.1 joerg Parentheses and explicit casts are not discarded. 7690 1.1 joerg Given 7691 1.1 joerg int arr[5]; 7692 1.1 joerg int a = 0; 7693 1.1 joerg char b = 0; 7694 1.1 joerg const int c = a; 7695 1.1 joerg int *d = arr; 7696 1.1 joerg long e = (long) 0l; 7697 1.1 joerg The matchers 7698 1.1 joerg varDecl(hasInitializer(ignoringImpCasts(integerLiteral()))) 7699 1.1 joerg varDecl(hasInitializer(ignoringImpCasts(declRefExpr()))) 7700 1.1 joerg would match the declarations for a, b, c, and d, but not e. 7701 1.1 joerg While 7702 1.1 joerg varDecl(hasInitializer(integerLiteral())) 7703 1.1 joerg varDecl(hasInitializer(declRefExpr())) 7704 1.1 joerg only match the declarations for b, c, and d. 7705 1.1 joerg </pre></td></tr> 7706 1.1 joerg 7707 1.1 joerg 7708 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>></td><td class="name" onclick="toggle('ignoringImplicit0')"><a name="ignoringImplicit0Anchor">ignoringImplicit</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 7709 1.1 joerg <tr><td colspan="4" class="doc" id="ignoringImplicit0"><pre>Matches expressions that match InnerMatcher after any implicit AST 7710 1.1 joerg nodes are stripped off. 7711 1.1 joerg 7712 1.1 joerg Parentheses and explicit casts are not discarded. 7713 1.1 joerg Given 7714 1.1 joerg class C {}; 7715 1.1 joerg C a = C(); 7716 1.1 joerg C b; 7717 1.1 joerg C c = b; 7718 1.1 joerg The matchers 7719 1.1 joerg varDecl(hasInitializer(ignoringImplicit(cxxConstructExpr()))) 7720 1.1 joerg would match the declarations for a, b, and c. 7721 1.1 joerg While 7722 1.1 joerg varDecl(hasInitializer(cxxConstructExpr())) 7723 1.1 joerg only match the declarations for b and c. 7724 1.1 joerg </pre></td></tr> 7725 1.1 joerg 7726 1.1 joerg 7727 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>></td><td class="name" onclick="toggle('ignoringParenCasts0')"><a name="ignoringParenCasts0Anchor">ignoringParenCasts</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 7728 1.1 joerg <tr><td colspan="4" class="doc" id="ignoringParenCasts0"><pre>Matches expressions that match InnerMatcher after parentheses and 7729 1.1 joerg casts are stripped off. 7730 1.1 joerg 7731 1.1 joerg Implicit and non-C Style casts are also discarded. 7732 1.1 joerg Given 7733 1.1 joerg int a = 0; 7734 1.1 joerg char b = (0); 7735 1.1 joerg void* c = reinterpret_cast<char*>(0); 7736 1.1 joerg char d = char(0); 7737 1.1 joerg The matcher 7738 1.1 joerg varDecl(hasInitializer(ignoringParenCasts(integerLiteral()))) 7739 1.1 joerg would match the declarations for a, b, c, and d. 7740 1.1 joerg while 7741 1.1 joerg varDecl(hasInitializer(integerLiteral())) 7742 1.1 joerg only match the declaration for a. 7743 1.1 joerg </pre></td></tr> 7744 1.1 joerg 7745 1.1 joerg 7746 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>></td><td class="name" onclick="toggle('ignoringParenImpCasts0')"><a name="ignoringParenImpCasts0Anchor">ignoringParenImpCasts</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 7747 1.1 joerg <tr><td colspan="4" class="doc" id="ignoringParenImpCasts0"><pre>Matches expressions that match InnerMatcher after implicit casts and 7748 1.1 joerg parentheses are stripped off. 7749 1.1 joerg 7750 1.1 joerg Explicit casts are not discarded. 7751 1.1 joerg Given 7752 1.1 joerg int arr[5]; 7753 1.1 joerg int a = 0; 7754 1.1 joerg char b = (0); 7755 1.1 joerg const int c = a; 7756 1.1 joerg int *d = (arr); 7757 1.1 joerg long e = ((long) 0l); 7758 1.1 joerg The matchers 7759 1.1 joerg varDecl(hasInitializer(ignoringParenImpCasts(integerLiteral()))) 7760 1.1 joerg varDecl(hasInitializer(ignoringParenImpCasts(declRefExpr()))) 7761 1.1 joerg would match the declarations for a, b, c, and d, but not e. 7762 1.1 joerg while 7763 1.1 joerg varDecl(hasInitializer(integerLiteral())) 7764 1.1 joerg varDecl(hasInitializer(declRefExpr())) 7765 1.1 joerg would only match the declaration for a. 7766 1.1 joerg </pre></td></tr> 7767 1.1 joerg 7768 1.1 joerg 7769 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>></td><td class="name" onclick="toggle('ignoringParens1')"><a name="ignoringParens1Anchor">ignoringParens</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 7770 1.1 joerg <tr><td colspan="4" class="doc" id="ignoringParens1"><pre>Overload ignoringParens for Expr. 7771 1.1 joerg 7772 1.1 joerg Given 7773 1.1 joerg const char* str = ("my-string"); 7774 1.1 joerg The matcher 7775 1.1 joerg implicitCastExpr(hasSourceExpression(ignoringParens(stringLiteral()))) 7776 1.1 joerg would match the implicit cast resulting from the assignment. 7777 1.1 joerg </pre></td></tr> 7778 1.1 joerg 7779 1.1 joerg 7780 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>></td><td class="name" onclick="toggle('hasInClassInitializer0')"><a name="hasInClassInitializer0Anchor">hasInClassInitializer</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 7781 1.1 joerg <tr><td colspan="4" class="doc" id="hasInClassInitializer0"><pre>Matches non-static data members that have an in-class initializer. 7782 1.1 joerg 7783 1.1 joerg Given 7784 1.1 joerg class C { 7785 1.1 joerg int a = 2; 7786 1.1 joerg int b = 3; 7787 1.1 joerg int c; 7788 1.1 joerg }; 7789 1.1 joerg fieldDecl(hasInClassInitializer(integerLiteral(equals(2)))) 7790 1.1 joerg matches 'int a;' but not 'int b;'. 7791 1.1 joerg fieldDecl(hasInClassInitializer(anything())) 7792 1.1 joerg matches 'int a;' and 'int b;' but not 'int c;'. 7793 1.1 joerg </pre></td></tr> 7794 1.1 joerg 7795 1.1 joerg 7796 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ForStmt.html">ForStmt</a>></td><td class="name" onclick="toggle('hasBody1')"><a name="hasBody1Anchor">hasBody</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr> 7797 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasBody1"><pre></pre></td></tr> 7798 1.1 joerg 7799 1.1 joerg 7800 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ForStmt.html">ForStmt</a>></td><td class="name" onclick="toggle('hasCondition1')"><a name="hasCondition1Anchor">hasCondition</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 7801 1.1 joerg <tr><td colspan="4" class="doc" id="hasCondition1"><pre>Matches the condition expression of an if statement, for loop, 7802 1.1 joerg switch statement or conditional operator. 7803 1.1 joerg 7804 1.1 joerg Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 7805 1.1 joerg if (true) {} 7806 1.1 joerg </pre></td></tr> 7807 1.1 joerg 7808 1.1 joerg 7809 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ForStmt.html">ForStmt</a>></td><td class="name" onclick="toggle('hasIncrement0')"><a name="hasIncrement0Anchor">hasIncrement</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr> 7810 1.1 joerg <tr><td colspan="4" class="doc" id="hasIncrement0"><pre>Matches the increment statement of a for loop. 7811 1.1 joerg 7812 1.1 joerg Example: 7813 1.1 joerg forStmt(hasIncrement(unaryOperator(hasOperatorName("++")))) 7814 1.1 joerg matches '++x' in 7815 1.1 joerg for (x; x < N; ++x) { } 7816 1.1 joerg </pre></td></tr> 7817 1.1 joerg 7818 1.1 joerg 7819 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ForStmt.html">ForStmt</a>></td><td class="name" onclick="toggle('hasLoopInit0')"><a name="hasLoopInit0Anchor">hasLoopInit</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr> 7820 1.1 joerg <tr><td colspan="4" class="doc" id="hasLoopInit0"><pre>Matches the initialization statement of a for loop. 7821 1.1 joerg 7822 1.1 joerg Example: 7823 1.1 joerg forStmt(hasLoopInit(declStmt())) 7824 1.1 joerg matches 'int x = 0' in 7825 1.1 joerg for (int x = 0; x < N; ++x) { } 7826 1.1 joerg </pre></td></tr> 7827 1.1 joerg 7828 1.1 joerg 7829 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FriendDecl.html">FriendDecl</a>></td><td class="name" onclick="toggle('hasType6')"><a name="hasType6Anchor">hasType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 7830 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasType6"><pre>Overloaded to match the declaration of the expression's or value 7831 1.1 joerg declaration's type. 7832 1.1 joerg 7833 1.1 joerg In case of a value declaration (for example a variable declaration), 7834 1.1 joerg this resolves one layer of indirection. For example, in the value 7835 1.1 joerg declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of 7836 1.1 joerg X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the 7837 1.1 joerg declaration of x. 7838 1.1 joerg 7839 1.1 joerg Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 7840 1.1 joerg and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 7841 1.1 joerg and friend class X (matcher = friendDecl(hasType("X")) 7842 1.1.1.2 joerg and public virtual X (matcher = cxxBaseSpecifier(hasType( 7843 1.1.1.2 joerg cxxRecordDecl(hasName("X")))) 7844 1.1 joerg class X {}; 7845 1.1 joerg void y(X &x) { x; X z; } 7846 1.1 joerg class Y { friend class X; }; 7847 1.1.1.2 joerg class Z : public virtual X {}; 7848 1.1 joerg 7849 1.1.1.2 joerg Example matches class Derived 7850 1.1.1.2 joerg (matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base")))))) 7851 1.1.1.2 joerg class Base {}; 7852 1.1.1.2 joerg class Derived : Base {}; 7853 1.1.1.2 joerg 7854 1.1.1.2 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FriendDecl.html">FriendDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>>, 7855 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>> 7856 1.1 joerg </pre></td></tr> 7857 1.1 joerg 7858 1.1 joerg 7859 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FriendDecl.html">FriendDecl</a>></td><td class="name" onclick="toggle('hasType1')"><a name="hasType1Anchor">hasType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 7860 1.1 joerg <tr><td colspan="4" class="doc" id="hasType1"><pre>Matches if the expression's or declaration's type matches a type 7861 1.1 joerg matcher. 7862 1.1 joerg 7863 1.1 joerg Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 7864 1.1 joerg and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 7865 1.1 joerg and U (matcher = typedefDecl(hasType(asString("int"))) 7866 1.1 joerg and friend class X (matcher = friendDecl(hasType("X")) 7867 1.1.1.2 joerg and public virtual X (matcher = cxxBaseSpecifier(hasType( 7868 1.1.1.2 joerg asString("class X"))) 7869 1.1 joerg class X {}; 7870 1.1 joerg void y(X &x) { x; X z; } 7871 1.1 joerg typedef int U; 7872 1.1 joerg class Y { friend class X; }; 7873 1.1.1.2 joerg class Z : public virtual X {}; 7874 1.1.1.2 joerg </pre></td></tr> 7875 1.1.1.2 joerg 7876 1.1.1.2 joerg 7877 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('hasAnyBody0')"><a name="hasAnyBody0Anchor">hasAnyBody</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr> 7878 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasAnyBody0"><pre>Matches a function declaration that has a given body present in the AST. 7879 1.1.1.2 joerg Note that this matcher matches all the declarations of a function whose 7880 1.1.1.2 joerg body is present in the AST. 7881 1.1.1.2 joerg 7882 1.1.1.2 joerg Given 7883 1.1.1.2 joerg void f(); 7884 1.1.1.2 joerg void f() {} 7885 1.1.1.2 joerg void g(); 7886 1.1.1.2 joerg functionDecl(hasAnyBody(compoundStmt())) 7887 1.1.1.2 joerg matches both 'void f();' 7888 1.1.1.2 joerg and 'void f() {}' 7889 1.1.1.2 joerg with compoundStmt() 7890 1.1.1.2 joerg matching '{}' 7891 1.1.1.2 joerg but does not match 'void g();' 7892 1.1 joerg </pre></td></tr> 7893 1.1 joerg 7894 1.1 joerg 7895 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('hasAnyParameter0')"><a name="hasAnyParameter0Anchor">hasAnyParameter</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>> InnerMatcher</td></tr> 7896 1.1 joerg <tr><td colspan="4" class="doc" id="hasAnyParameter0"><pre>Matches any parameter of a function or an ObjC method declaration or a 7897 1.1 joerg block. 7898 1.1 joerg 7899 1.1 joerg Does not match the 'this' parameter of a method. 7900 1.1 joerg 7901 1.1 joerg Given 7902 1.1 joerg class X { void f(int x, int y, int z) {} }; 7903 1.1 joerg cxxMethodDecl(hasAnyParameter(hasName("y"))) 7904 1.1 joerg matches f(int x, int y, int z) {} 7905 1.1 joerg with hasAnyParameter(...) 7906 1.1 joerg matching int y 7907 1.1 joerg 7908 1.1 joerg For ObjectiveC, given 7909 1.1 joerg @interface I - (void) f:(int) y; @end 7910 1.1 joerg 7911 1.1 joerg the matcher objcMethodDecl(hasAnyParameter(hasName("y"))) 7912 1.1 joerg matches the declaration of method f with hasParameter 7913 1.1 joerg matching y. 7914 1.1 joerg 7915 1.1 joerg For blocks, given 7916 1.1 joerg b = ^(int y) { printf("%d", y) }; 7917 1.1 joerg 7918 1.1 joerg the matcher blockDecl(hasAnyParameter(hasName("y"))) 7919 1.1 joerg matches the declaration of the block b with hasParameter 7920 1.1 joerg matching y. 7921 1.1 joerg </pre></td></tr> 7922 1.1 joerg 7923 1.1 joerg 7924 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('hasAnyTemplateArgument2')"><a name="hasAnyTemplateArgument2Anchor">hasAnyTemplateArgument</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>> InnerMatcher</td></tr> 7925 1.1 joerg <tr><td colspan="4" class="doc" id="hasAnyTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and 7926 1.1 joerg functionDecl that have at least one TemplateArgument matching the given 7927 1.1 joerg InnerMatcher. 7928 1.1 joerg 7929 1.1 joerg Given 7930 1.1 joerg template<typename T> class A {}; 7931 1.1 joerg template<> class A<double> {}; 7932 1.1 joerg A<int> a; 7933 1.1 joerg 7934 1.1 joerg template<typename T> f() {}; 7935 1.1 joerg void func() { f<int>(); }; 7936 1.1 joerg 7937 1.1 joerg classTemplateSpecializationDecl(hasAnyTemplateArgument( 7938 1.1 joerg refersToType(asString("int")))) 7939 1.1 joerg matches the specialization A<int> 7940 1.1 joerg 7941 1.1 joerg functionDecl(hasAnyTemplateArgument(refersToType(asString("int")))) 7942 1.1 joerg matches the specialization f<int> 7943 1.1 joerg </pre></td></tr> 7944 1.1 joerg 7945 1.1 joerg 7946 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('hasBody4')"><a name="hasBody4Anchor">hasBody</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr> 7947 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasBody4"><pre></pre></td></tr> 7948 1.1 joerg 7949 1.1 joerg 7950 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('hasExplicitSpecifier0')"><a name="hasExplicitSpecifier0Anchor">hasExplicitSpecifier</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 7951 1.1 joerg <tr><td colspan="4" class="doc" id="hasExplicitSpecifier0"><pre>Matches the expression in an explicit specifier if present in the given 7952 1.1 joerg declaration. 7953 1.1 joerg 7954 1.1 joerg Given 7955 1.1 joerg template<bool b> 7956 1.1 joerg struct S { 7957 1.1 joerg S(int); // #1 7958 1.1 joerg explicit S(double); // #2 7959 1.1 joerg operator int(); // #3 7960 1.1 joerg explicit operator bool(); // #4 7961 1.1 joerg explicit(false) S(bool) // # 7 7962 1.1 joerg explicit(true) S(char) // # 8 7963 1.1 joerg explicit(b) S(S) // # 9 7964 1.1 joerg }; 7965 1.1 joerg S(int) -> S<true> // #5 7966 1.1 joerg explicit S(double) -> S<false> // #6 7967 1.1 joerg cxxConstructorDecl(hasExplicitSpecifier(constantExpr())) will match #7, #8 and #9, but not #1 or #2. 7968 1.1 joerg cxxConversionDecl(hasExplicitSpecifier(constantExpr())) will not match #3 or #4. 7969 1.1 joerg cxxDeductionGuideDecl(hasExplicitSpecifier(constantExpr())) will not match #5 or #6. 7970 1.1 joerg </pre></td></tr> 7971 1.1 joerg 7972 1.1 joerg 7973 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('hasParameter0')"><a name="hasParameter0Anchor">hasParameter</a></td><td>unsigned N, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>> InnerMatcher</td></tr> 7974 1.1 joerg <tr><td colspan="4" class="doc" id="hasParameter0"><pre>Matches the n'th parameter of a function or an ObjC method 7975 1.1 joerg declaration or a block. 7976 1.1 joerg 7977 1.1 joerg Given 7978 1.1 joerg class X { void f(int x) {} }; 7979 1.1 joerg cxxMethodDecl(hasParameter(0, hasType(varDecl()))) 7980 1.1 joerg matches f(int x) {} 7981 1.1 joerg with hasParameter(...) 7982 1.1 joerg matching int x 7983 1.1 joerg 7984 1.1 joerg For ObjectiveC, given 7985 1.1 joerg @interface I - (void) f:(int) y; @end 7986 1.1 joerg 7987 1.1 joerg the matcher objcMethodDecl(hasParameter(0, hasName("y"))) 7988 1.1 joerg matches the declaration of method f with hasParameter 7989 1.1 joerg matching y. 7990 1.1 joerg </pre></td></tr> 7991 1.1 joerg 7992 1.1 joerg 7993 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('hasTemplateArgument2')"><a name="hasTemplateArgument2Anchor">hasTemplateArgument</a></td><td>unsigned N, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>> InnerMatcher</td></tr> 7994 1.1 joerg <tr><td colspan="4" class="doc" id="hasTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and 7995 1.1 joerg functionDecl where the n'th TemplateArgument matches the given InnerMatcher. 7996 1.1 joerg 7997 1.1 joerg Given 7998 1.1 joerg template<typename T, typename U> class A {}; 7999 1.1 joerg A<bool, int> b; 8000 1.1 joerg A<int, bool> c; 8001 1.1 joerg 8002 1.1 joerg template<typename T> void f() {} 8003 1.1 joerg void func() { f<int>(); }; 8004 1.1 joerg classTemplateSpecializationDecl(hasTemplateArgument( 8005 1.1 joerg 1, refersToType(asString("int")))) 8006 1.1 joerg matches the specialization A<bool, int> 8007 1.1 joerg 8008 1.1 joerg functionDecl(hasTemplateArgument(0, refersToType(asString("int")))) 8009 1.1 joerg matches the specialization f<int> 8010 1.1 joerg </pre></td></tr> 8011 1.1 joerg 8012 1.1 joerg 8013 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>></td><td class="name" onclick="toggle('returns0')"><a name="returns0Anchor">returns</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 8014 1.1 joerg <tr><td colspan="4" class="doc" id="returns0"><pre>Matches the return type of a function declaration. 8015 1.1 joerg 8016 1.1 joerg Given: 8017 1.1 joerg class X { int f() { return 1; } }; 8018 1.1 joerg cxxMethodDecl(returns(asString("int"))) 8019 1.1 joerg matches int f() { return 1; } 8020 1.1 joerg </pre></td></tr> 8021 1.1 joerg 8022 1.1 joerg 8023 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt</a>></td><td class="name" onclick="toggle('hasCondition0')"><a name="hasCondition0Anchor">hasCondition</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 8024 1.1 joerg <tr><td colspan="4" class="doc" id="hasCondition0"><pre>Matches the condition expression of an if statement, for loop, 8025 1.1 joerg switch statement or conditional operator. 8026 1.1 joerg 8027 1.1 joerg Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 8028 1.1 joerg if (true) {} 8029 1.1 joerg </pre></td></tr> 8030 1.1 joerg 8031 1.1 joerg 8032 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt</a>></td><td class="name" onclick="toggle('hasConditionVariableStatement0')"><a name="hasConditionVariableStatement0Anchor">hasConditionVariableStatement</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclStmt.html">DeclStmt</a>> InnerMatcher</td></tr> 8033 1.1 joerg <tr><td colspan="4" class="doc" id="hasConditionVariableStatement0"><pre>Matches the condition variable statement in an if statement. 8034 1.1 joerg 8035 1.1 joerg Given 8036 1.1 joerg if (A* a = GetAPointer()) {} 8037 1.1 joerg hasConditionVariableStatement(...) 8038 1.1 joerg matches 'A* a = GetAPointer()'. 8039 1.1 joerg </pre></td></tr> 8040 1.1 joerg 8041 1.1 joerg 8042 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt</a>></td><td class="name" onclick="toggle('hasElse0')"><a name="hasElse0Anchor">hasElse</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr> 8043 1.1 joerg <tr><td colspan="4" class="doc" id="hasElse0"><pre>Matches the else-statement of an if statement. 8044 1.1 joerg 8045 1.1 joerg Examples matches the if statement 8046 1.1 joerg (matcher = ifStmt(hasElse(cxxBoolLiteral(equals(true))))) 8047 1.1 joerg if (false) false; else true; 8048 1.1 joerg </pre></td></tr> 8049 1.1 joerg 8050 1.1 joerg 8051 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt</a>></td><td class="name" onclick="toggle('hasInitStatement0')"><a name="hasInitStatement0Anchor">hasInitStatement</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr> 8052 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasInitStatement0"><pre>Matches selection statements with initializer. 8053 1.1.1.2 joerg 8054 1.1.1.2 joerg Given: 8055 1.1.1.2 joerg void foo() { 8056 1.1.1.2 joerg if (int i = foobar(); i > 0) {} 8057 1.1.1.2 joerg switch (int i = foobar(); i) {} 8058 1.1.1.2 joerg for (auto& a = get_range(); auto& x : a) {} 8059 1.1.1.2 joerg } 8060 1.1.1.2 joerg void bar() { 8061 1.1.1.2 joerg if (foobar() > 0) {} 8062 1.1.1.2 joerg switch (foobar()) {} 8063 1.1.1.2 joerg for (auto& x : get_range()) {} 8064 1.1.1.2 joerg } 8065 1.1.1.2 joerg ifStmt(hasInitStatement(anything())) 8066 1.1.1.2 joerg matches the if statement in foo but not in bar. 8067 1.1.1.2 joerg switchStmt(hasInitStatement(anything())) 8068 1.1.1.2 joerg matches the switch statement in foo but not in bar. 8069 1.1.1.2 joerg cxxForRangeStmt(hasInitStatement(anything())) 8070 1.1.1.2 joerg matches the range for statement in foo but not in bar. 8071 1.1.1.2 joerg </pre></td></tr> 8072 1.1.1.2 joerg 8073 1.1.1.2 joerg 8074 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt</a>></td><td class="name" onclick="toggle('hasThen0')"><a name="hasThen0Anchor">hasThen</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr> 8075 1.1 joerg <tr><td colspan="4" class="doc" id="hasThen0"><pre>Matches the then-statement of an if statement. 8076 1.1 joerg 8077 1.1 joerg Examples matches the if statement 8078 1.1 joerg (matcher = ifStmt(hasThen(cxxBoolLiteral(equals(true))))) 8079 1.1 joerg if (false) true; else false; 8080 1.1 joerg </pre></td></tr> 8081 1.1 joerg 8082 1.1 joerg 8083 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ImplicitCastExpr.html">ImplicitCastExpr</a>></td><td class="name" onclick="toggle('hasImplicitDestinationType0')"><a name="hasImplicitDestinationType0Anchor">hasImplicitDestinationType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 8084 1.1 joerg <tr><td colspan="4" class="doc" id="hasImplicitDestinationType0"><pre>Matches implicit casts whose destination type matches a given 8085 1.1 joerg matcher. 8086 1.1 joerg 8087 1.1 joerg FIXME: Unit test this matcher 8088 1.1 joerg </pre></td></tr> 8089 1.1 joerg 8090 1.1 joerg 8091 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InitListExpr.html">InitListExpr</a>></td><td class="name" onclick="toggle('hasInit0')"><a name="hasInit0Anchor">hasInit</a></td><td>unsigned N, ast_matchers::Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 8092 1.1 joerg <tr><td colspan="4" class="doc" id="hasInit0"><pre>Matches the n'th item of an initializer list expression. 8093 1.1 joerg 8094 1.1 joerg Example matches y. 8095 1.1 joerg (matcher = initListExpr(hasInit(0, expr()))) 8096 1.1 joerg int x{y}. 8097 1.1 joerg </pre></td></tr> 8098 1.1 joerg 8099 1.1 joerg 8100 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InitListExpr.html">InitListExpr</a>></td><td class="name" onclick="toggle('hasSyntacticForm0')"><a name="hasSyntacticForm0Anchor">hasSyntacticForm</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 8101 1.1 joerg <tr><td colspan="4" class="doc" id="hasSyntacticForm0"><pre>Matches the syntactic form of init list expressions 8102 1.1 joerg (if expression have it). 8103 1.1 joerg </pre></td></tr> 8104 1.1 joerg 8105 1.1 joerg 8106 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>></td><td class="name" onclick="toggle('hasDeclaration9')"><a name="hasDeclaration9Anchor">hasDeclaration</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 8107 1.1 joerg <tr><td colspan="4" class="doc" id="hasDeclaration9"><pre>Matches a node if the declaration associated with that node 8108 1.1 joerg matches the given matcher. 8109 1.1 joerg 8110 1.1 joerg The associated declaration is: 8111 1.1 joerg - for type nodes, the declaration of the underlying type 8112 1.1 joerg - for CallExpr, the declaration of the callee 8113 1.1 joerg - for MemberExpr, the declaration of the referenced member 8114 1.1 joerg - for CXXConstructExpr, the declaration of the constructor 8115 1.1 joerg - for CXXNewExpr, the declaration of the operator new 8116 1.1 joerg - for ObjCIvarExpr, the declaration of the ivar 8117 1.1 joerg 8118 1.1 joerg For type nodes, hasDeclaration will generally match the declaration of the 8119 1.1 joerg sugared type. Given 8120 1.1 joerg class X {}; 8121 1.1 joerg typedef X Y; 8122 1.1 joerg Y y; 8123 1.1 joerg in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 8124 1.1 joerg typedefDecl. A common use case is to match the underlying, desugared type. 8125 1.1 joerg This can be achieved by using the hasUnqualifiedDesugaredType matcher: 8126 1.1 joerg varDecl(hasType(hasUnqualifiedDesugaredType( 8127 1.1 joerg recordType(hasDeclaration(decl()))))) 8128 1.1 joerg In this matcher, the decl will match the CXXRecordDecl of class X. 8129 1.1 joerg 8130 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, 8131 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, 8132 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, 8133 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, 8134 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, 8135 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, 8136 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 8137 1.1 joerg </pre></td></tr> 8138 1.1 joerg 8139 1.1 joerg 8140 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>></td><td class="name" onclick="toggle('hasDeclaration8')"><a name="hasDeclaration8Anchor">hasDeclaration</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 8141 1.1 joerg <tr><td colspan="4" class="doc" id="hasDeclaration8"><pre>Matches a node if the declaration associated with that node 8142 1.1 joerg matches the given matcher. 8143 1.1 joerg 8144 1.1 joerg The associated declaration is: 8145 1.1 joerg - for type nodes, the declaration of the underlying type 8146 1.1 joerg - for CallExpr, the declaration of the callee 8147 1.1 joerg - for MemberExpr, the declaration of the referenced member 8148 1.1 joerg - for CXXConstructExpr, the declaration of the constructor 8149 1.1 joerg - for CXXNewExpr, the declaration of the operator new 8150 1.1 joerg - for ObjCIvarExpr, the declaration of the ivar 8151 1.1 joerg 8152 1.1 joerg For type nodes, hasDeclaration will generally match the declaration of the 8153 1.1 joerg sugared type. Given 8154 1.1 joerg class X {}; 8155 1.1 joerg typedef X Y; 8156 1.1 joerg Y y; 8157 1.1 joerg in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 8158 1.1 joerg typedefDecl. A common use case is to match the underlying, desugared type. 8159 1.1 joerg This can be achieved by using the hasUnqualifiedDesugaredType matcher: 8160 1.1 joerg varDecl(hasType(hasUnqualifiedDesugaredType( 8161 1.1 joerg recordType(hasDeclaration(decl()))))) 8162 1.1 joerg In this matcher, the decl will match the CXXRecordDecl of class X. 8163 1.1 joerg 8164 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, 8165 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, 8166 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, 8167 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, 8168 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, 8169 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, 8170 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 8171 1.1 joerg </pre></td></tr> 8172 1.1 joerg 8173 1.1 joerg 8174 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LambdaExpr.html">LambdaExpr</a>></td><td class="name" onclick="toggle('hasAnyCapture1')"><a name="hasAnyCapture1Anchor">hasAnyCapture</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXThisExpr.html">CXXThisExpr</a>> InnerMatcher</td></tr> 8175 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasAnyCapture1"><pre>Matches any capture of 'this' in a lambda expression. 8176 1.1.1.2 joerg 8177 1.1.1.2 joerg Given 8178 1.1.1.2 joerg struct foo { 8179 1.1.1.2 joerg void bar() { 8180 1.1.1.2 joerg auto f = [this](){}; 8181 1.1.1.2 joerg } 8182 1.1.1.2 joerg } 8183 1.1.1.2 joerg lambdaExpr(hasAnyCapture(cxxThisExpr())) 8184 1.1.1.2 joerg matches [this](){}; 8185 1.1.1.2 joerg </pre></td></tr> 8186 1.1.1.2 joerg 8187 1.1.1.2 joerg 8188 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LambdaExpr.html">LambdaExpr</a>></td><td class="name" onclick="toggle('hasAnyCapture0')"><a name="hasAnyCapture0Anchor">hasAnyCapture</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>> InnerMatcher</td></tr> 8189 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasAnyCapture0"><pre>Matches any capture of a lambda expression. 8190 1.1.1.2 joerg 8191 1.1.1.2 joerg Given 8192 1.1.1.2 joerg void foo() { 8193 1.1.1.2 joerg int x; 8194 1.1.1.2 joerg auto f = [x](){}; 8195 1.1.1.2 joerg } 8196 1.1.1.2 joerg lambdaExpr(hasAnyCapture(anything())) 8197 1.1.1.2 joerg matches [x](){}; 8198 1.1.1.2 joerg </pre></td></tr> 8199 1.1.1.2 joerg 8200 1.1.1.2 joerg 8201 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>></td><td class="name" onclick="toggle('hasDeclaration7')"><a name="hasDeclaration7Anchor">hasDeclaration</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 8202 1.1 joerg <tr><td colspan="4" class="doc" id="hasDeclaration7"><pre>Matches a node if the declaration associated with that node 8203 1.1 joerg matches the given matcher. 8204 1.1 joerg 8205 1.1 joerg The associated declaration is: 8206 1.1 joerg - for type nodes, the declaration of the underlying type 8207 1.1 joerg - for CallExpr, the declaration of the callee 8208 1.1 joerg - for MemberExpr, the declaration of the referenced member 8209 1.1 joerg - for CXXConstructExpr, the declaration of the constructor 8210 1.1 joerg - for CXXNewExpr, the declaration of the operator new 8211 1.1 joerg - for ObjCIvarExpr, the declaration of the ivar 8212 1.1 joerg 8213 1.1 joerg For type nodes, hasDeclaration will generally match the declaration of the 8214 1.1 joerg sugared type. Given 8215 1.1 joerg class X {}; 8216 1.1 joerg typedef X Y; 8217 1.1 joerg Y y; 8218 1.1 joerg in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 8219 1.1 joerg typedefDecl. A common use case is to match the underlying, desugared type. 8220 1.1 joerg This can be achieved by using the hasUnqualifiedDesugaredType matcher: 8221 1.1 joerg varDecl(hasType(hasUnqualifiedDesugaredType( 8222 1.1 joerg recordType(hasDeclaration(decl()))))) 8223 1.1 joerg In this matcher, the decl will match the CXXRecordDecl of class X. 8224 1.1 joerg 8225 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, 8226 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, 8227 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, 8228 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, 8229 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, 8230 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, 8231 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 8232 1.1 joerg </pre></td></tr> 8233 1.1 joerg 8234 1.1 joerg 8235 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>></td><td class="name" onclick="toggle('hasObjectExpression0')"><a name="hasObjectExpression0Anchor">hasObjectExpression</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 8236 1.1 joerg <tr><td colspan="4" class="doc" id="hasObjectExpression0"><pre>Matches a member expression where the object expression is matched by a 8237 1.1 joerg given matcher. Implicit object expressions are included; that is, it matches 8238 1.1 joerg use of implicit `this`. 8239 1.1 joerg 8240 1.1 joerg Given 8241 1.1 joerg struct X { 8242 1.1 joerg int m; 8243 1.1 joerg int f(X x) { x.m; return m; } 8244 1.1 joerg }; 8245 1.1 joerg memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X"))))) 8246 1.1 joerg matches `x.m`, but not `m`; however, 8247 1.1 joerg memberExpr(hasObjectExpression(hasType(pointsTo( 8248 1.1 joerg cxxRecordDecl(hasName("X")))))) 8249 1.1 joerg matches `m` (aka. `this->m`), but not `x.m`. 8250 1.1 joerg </pre></td></tr> 8251 1.1 joerg 8252 1.1 joerg 8253 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>></td><td class="name" onclick="toggle('member0')"><a name="member0Anchor">member</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>> InnerMatcher</td></tr> 8254 1.1 joerg <tr><td colspan="4" class="doc" id="member0"><pre>Matches a member expression where the member is matched by a 8255 1.1 joerg given matcher. 8256 1.1 joerg 8257 1.1 joerg Given 8258 1.1 joerg struct { int first, second; } first, second; 8259 1.1 joerg int i(second.first); 8260 1.1 joerg int j(first.second); 8261 1.1 joerg memberExpr(member(hasName("first"))) 8262 1.1 joerg matches second.first 8263 1.1 joerg but not first.second (because the member name there is "second"). 8264 1.1 joerg </pre></td></tr> 8265 1.1 joerg 8266 1.1 joerg 8267 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>></td><td class="name" onclick="toggle('pointee1')"><a name="pointee1Anchor">pointee</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td></tr> 8268 1.1 joerg <tr><td colspan="4" class="doc" id="pointee1"><pre>Narrows PointerType (and similar) matchers to those where the 8269 1.1 joerg pointee matches a given matcher. 8270 1.1 joerg 8271 1.1 joerg Given 8272 1.1 joerg int *a; 8273 1.1 joerg int const *b; 8274 1.1 joerg float const *f; 8275 1.1 joerg pointerType(pointee(isConstQualified(), isInteger())) 8276 1.1 joerg matches "int const *b" 8277 1.1 joerg 8278 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>>, 8279 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>> 8280 1.1 joerg </pre></td></tr> 8281 1.1 joerg 8282 1.1 joerg 8283 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>></td><td class="name" onclick="toggle('hasUnderlyingDecl0')"><a name="hasUnderlyingDecl0Anchor">hasUnderlyingDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>> InnerMatcher</td></tr> 8284 1.1 joerg <tr><td colspan="4" class="doc" id="hasUnderlyingDecl0"><pre>Matches a NamedDecl whose underlying declaration matches the given 8285 1.1 joerg matcher. 8286 1.1 joerg 8287 1.1 joerg Given 8288 1.1 joerg namespace N { template<class T> void f(T t); } 8289 1.1 joerg template <class T> void g() { using N::f; f(T()); } 8290 1.1 joerg unresolvedLookupExpr(hasAnyDeclaration( 8291 1.1 joerg namedDecl(hasUnderlyingDecl(hasName("::N::f"))))) 8292 1.1 joerg matches the use of f in g() . 8293 1.1 joerg </pre></td></tr> 8294 1.1 joerg 8295 1.1 joerg 8296 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html">NestedNameSpecifierLoc</a>></td><td class="name" onclick="toggle('hasPrefix1')"><a name="hasPrefix1Anchor">hasPrefix</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html">NestedNameSpecifierLoc</a>> InnerMatcher</td></tr> 8297 1.1 joerg <tr><td colspan="4" class="doc" id="hasPrefix1"><pre>Matches on the prefix of a NestedNameSpecifierLoc. 8298 1.1 joerg 8299 1.1 joerg Given 8300 1.1 joerg struct A { struct B { struct C {}; }; }; 8301 1.1 joerg A::B::C c; 8302 1.1 joerg nestedNameSpecifierLoc(hasPrefix(loc(specifiesType(asString("struct A"))))) 8303 1.1 joerg matches "A::" 8304 1.1 joerg </pre></td></tr> 8305 1.1 joerg 8306 1.1 joerg 8307 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html">NestedNameSpecifierLoc</a>></td><td class="name" onclick="toggle('loc1')"><a name="loc1Anchor">loc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>> InnerMatcher</td></tr> 8308 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="loc1"><pre>Matches NestedNameSpecifierLocs for which the given inner 8309 1.1.1.2 joerg NestedNameSpecifier-matcher matches. 8310 1.1.1.2 joerg </pre></td></tr> 8311 1.1.1.2 joerg 8312 1.1.1.2 joerg 8313 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html">NestedNameSpecifierLoc</a>></td><td class="name" onclick="toggle('specifiesTypeLoc0')"><a name="specifiesTypeLoc0Anchor">specifiesTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> InnerMatcher</td></tr> 8314 1.1 joerg <tr><td colspan="4" class="doc" id="specifiesTypeLoc0"><pre>Matches nested name specifier locs that specify a type matching the 8315 1.1 joerg given TypeLoc. 8316 1.1 joerg 8317 1.1 joerg Given 8318 1.1 joerg struct A { struct B { struct C {}; }; }; 8319 1.1 joerg A::B::C c; 8320 1.1 joerg nestedNameSpecifierLoc(specifiesTypeLoc(loc(type( 8321 1.1 joerg hasDeclaration(cxxRecordDecl(hasName("A"))))))) 8322 1.1 joerg matches "A::" 8323 1.1 joerg </pre></td></tr> 8324 1.1 joerg 8325 1.1 joerg 8326 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>></td><td class="name" onclick="toggle('hasPrefix0')"><a name="hasPrefix0Anchor">hasPrefix</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>> InnerMatcher</td></tr> 8327 1.1 joerg <tr><td colspan="4" class="doc" id="hasPrefix0"><pre>Matches on the prefix of a NestedNameSpecifier. 8328 1.1 joerg 8329 1.1 joerg Given 8330 1.1 joerg struct A { struct B { struct C {}; }; }; 8331 1.1 joerg A::B::C c; 8332 1.1 joerg nestedNameSpecifier(hasPrefix(specifiesType(asString("struct A")))) and 8333 1.1 joerg matches "A::" 8334 1.1 joerg </pre></td></tr> 8335 1.1 joerg 8336 1.1 joerg 8337 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>></td><td class="name" onclick="toggle('specifiesNamespace0')"><a name="specifiesNamespace0Anchor">specifiesNamespace</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamespaceDecl.html">NamespaceDecl</a>> InnerMatcher</td></tr> 8338 1.1 joerg <tr><td colspan="4" class="doc" id="specifiesNamespace0"><pre>Matches nested name specifiers that specify a namespace matching the 8339 1.1 joerg given namespace matcher. 8340 1.1 joerg 8341 1.1 joerg Given 8342 1.1 joerg namespace ns { struct A {}; } 8343 1.1 joerg ns::A a; 8344 1.1 joerg nestedNameSpecifier(specifiesNamespace(hasName("ns"))) 8345 1.1 joerg matches "ns::" 8346 1.1 joerg </pre></td></tr> 8347 1.1 joerg 8348 1.1 joerg 8349 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>></td><td class="name" onclick="toggle('specifiesType0')"><a name="specifiesType0Anchor">specifiesType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 8350 1.1 joerg <tr><td colspan="4" class="doc" id="specifiesType0"><pre>Matches nested name specifiers that specify a type matching the 8351 1.1 joerg given QualType matcher without qualifiers. 8352 1.1 joerg 8353 1.1 joerg Given 8354 1.1 joerg struct A { struct B { struct C {}; }; }; 8355 1.1 joerg A::B::C c; 8356 1.1 joerg nestedNameSpecifier(specifiesType( 8357 1.1 joerg hasDeclaration(cxxRecordDecl(hasName("A"))) 8358 1.1 joerg )) 8359 1.1 joerg matches "A::" 8360 1.1 joerg </pre></td></tr> 8361 1.1 joerg 8362 1.1 joerg 8363 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPExecutableDirective.html">OMPExecutableDirective</a>></td><td class="name" onclick="toggle('hasAnyClause0')"><a name="hasAnyClause0Anchor">hasAnyClause</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPClause.html">OMPClause</a>> InnerMatcher</td></tr> 8364 1.1 joerg <tr><td colspan="4" class="doc" id="hasAnyClause0"><pre>Matches any clause in an OpenMP directive. 8365 1.1 joerg 8366 1.1 joerg Given 8367 1.1 joerg 8368 1.1 joerg #pragma omp parallel 8369 1.1 joerg #pragma omp parallel default(none) 8370 1.1 joerg 8371 1.1 joerg ``ompExecutableDirective(hasAnyClause(anything()))`` matches 8372 1.1 joerg ``omp parallel default(none)``. 8373 1.1 joerg </pre></td></tr> 8374 1.1 joerg 8375 1.1 joerg 8376 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPExecutableDirective.html">OMPExecutableDirective</a>></td><td class="name" onclick="toggle('hasStructuredBlock0')"><a name="hasStructuredBlock0Anchor">hasStructuredBlock</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr> 8377 1.1 joerg <tr><td colspan="4" class="doc" id="hasStructuredBlock0"><pre>Matches the structured-block of the OpenMP executable directive 8378 1.1 joerg 8379 1.1 joerg Prerequisite: the executable directive must not be standalone directive. 8380 1.1 joerg If it is, it will never match. 8381 1.1 joerg 8382 1.1 joerg Given 8383 1.1 joerg 8384 1.1 joerg #pragma omp parallel 8385 1.1 joerg ; 8386 1.1 joerg #pragma omp parallel 8387 1.1 joerg {} 8388 1.1 joerg 8389 1.1 joerg ``ompExecutableDirective(hasStructuredBlock(nullStmt()))`` will match ``;`` 8390 1.1 joerg </pre></td></tr> 8391 1.1 joerg 8392 1.1 joerg 8393 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>></td><td class="name" onclick="toggle('isDerivedFrom1')"><a name="isDerivedFrom1Anchor">isDerivedFrom</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>> Base</td></tr> 8394 1.1 joerg <tr><td colspan="4" class="doc" id="isDerivedFrom1"><pre>Matches C++ classes that are directly or indirectly derived from a class 8395 1.1 joerg matching Base, or Objective-C classes that directly or indirectly 8396 1.1 joerg subclass a class matching Base. 8397 1.1 joerg 8398 1.1 joerg Note that a class is not considered to be derived from itself. 8399 1.1 joerg 8400 1.1 joerg Example matches Y, Z, C (Base == hasName("X")) 8401 1.1 joerg class X; 8402 1.1 joerg class Y : public X {}; // directly derived 8403 1.1 joerg class Z : public Y {}; // indirectly derived 8404 1.1 joerg typedef X A; 8405 1.1 joerg typedef A B; 8406 1.1 joerg class C : public B {}; // derived from a typedef of X 8407 1.1 joerg 8408 1.1 joerg In the following example, Bar matches isDerivedFrom(hasName("X")): 8409 1.1 joerg class Foo; 8410 1.1 joerg typedef Foo X; 8411 1.1 joerg class Bar : public Foo {}; // derived from a type that X is a typedef of 8412 1.1 joerg 8413 1.1 joerg In the following example, Bar matches isDerivedFrom(hasName("NSObject")) 8414 1.1 joerg @interface NSObject @end 8415 1.1 joerg @interface Bar : NSObject @end 8416 1.1 joerg 8417 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>> 8418 1.1 joerg </pre></td></tr> 8419 1.1 joerg 8420 1.1 joerg 8421 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>></td><td class="name" onclick="toggle('isDirectlyDerivedFrom1')"><a name="isDirectlyDerivedFrom1Anchor">isDirectlyDerivedFrom</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>> Base</td></tr> 8422 1.1 joerg <tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom1"><pre>Matches C++ or Objective-C classes that are directly derived from a class 8423 1.1 joerg matching Base. 8424 1.1 joerg 8425 1.1 joerg Note that a class is not considered to be derived from itself. 8426 1.1 joerg 8427 1.1 joerg Example matches Y, C (Base == hasName("X")) 8428 1.1 joerg class X; 8429 1.1 joerg class Y : public X {}; // directly derived 8430 1.1 joerg class Z : public Y {}; // indirectly derived 8431 1.1 joerg typedef X A; 8432 1.1 joerg typedef A B; 8433 1.1 joerg class C : public B {}; // derived from a typedef of X 8434 1.1 joerg 8435 1.1 joerg In the following example, Bar matches isDerivedFrom(hasName("X")): 8436 1.1 joerg class Foo; 8437 1.1 joerg typedef Foo X; 8438 1.1 joerg class Bar : public Foo {}; // derived from a type that X is a typedef of 8439 1.1 joerg </pre></td></tr> 8440 1.1 joerg 8441 1.1 joerg 8442 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>></td><td class="name" onclick="toggle('isSameOrDerivedFrom1')"><a name="isSameOrDerivedFrom1Anchor">isSameOrDerivedFrom</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>> Base</td></tr> 8443 1.1 joerg <tr><td colspan="4" class="doc" id="isSameOrDerivedFrom1"><pre>Similar to isDerivedFrom(), but also matches classes that directly 8444 1.1 joerg match Base. 8445 1.1 joerg </pre></td></tr> 8446 1.1 joerg 8447 1.1 joerg 8448 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>></td><td class="name" onclick="toggle('hasAnyArgument3')"><a name="hasAnyArgument3Anchor">hasAnyArgument</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 8449 1.1 joerg <tr><td colspan="4" class="doc" id="hasAnyArgument3"><pre>Matches any argument of a call expression or a constructor call 8450 1.1 joerg expression, or an ObjC-message-send expression. 8451 1.1 joerg 8452 1.1 joerg Given 8453 1.1 joerg void x(int, int, int) { int y; x(1, y, 42); } 8454 1.1 joerg callExpr(hasAnyArgument(declRefExpr())) 8455 1.1 joerg matches x(1, y, 42) 8456 1.1 joerg with hasAnyArgument(...) 8457 1.1 joerg matching y 8458 1.1 joerg 8459 1.1 joerg For ObjectiveC, given 8460 1.1 joerg @interface I - (void) f:(int) y; @end 8461 1.1 joerg void foo(I *i) { [i f:12]; } 8462 1.1 joerg objcMessageExpr(hasAnyArgument(integerLiteral(equals(12)))) 8463 1.1 joerg matches [i f:12] 8464 1.1 joerg </pre></td></tr> 8465 1.1 joerg 8466 1.1 joerg 8467 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>></td><td class="name" onclick="toggle('hasArgument3')"><a name="hasArgument3Anchor">hasArgument</a></td><td>unsigned N, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 8468 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasArgument3"><pre>Matches the n'th argument of a call expression or a constructor 8469 1.1 joerg call expression. 8470 1.1 joerg 8471 1.1 joerg Example matches y in x(y) 8472 1.1 joerg (matcher = callExpr(hasArgument(0, declRefExpr()))) 8473 1.1 joerg void x(int) { int y; x(y); } 8474 1.1 joerg </pre></td></tr> 8475 1.1 joerg 8476 1.1 joerg 8477 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>></td><td class="name" onclick="toggle('hasReceiver0')"><a name="hasReceiver0Anchor">hasReceiver</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 8478 1.1 joerg <tr><td colspan="4" class="doc" id="hasReceiver0"><pre>Matches if the Objective-C message is sent to an instance, 8479 1.1 joerg and the inner matcher matches on that instance. 8480 1.1 joerg 8481 1.1 joerg For example the method call in 8482 1.1 joerg NSString *x = @"hello"; 8483 1.1 joerg [x containsString:@"h"]; 8484 1.1 joerg is matched by 8485 1.1 joerg objcMessageExpr(hasReceiver(declRefExpr(to(varDecl(hasName("x")))))) 8486 1.1 joerg </pre></td></tr> 8487 1.1 joerg 8488 1.1 joerg 8489 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>></td><td class="name" onclick="toggle('hasReceiverType0')"><a name="hasReceiverType0Anchor">hasReceiverType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 8490 1.1 joerg <tr><td colspan="4" class="doc" id="hasReceiverType0"><pre>Matches on the receiver of an ObjectiveC Message expression. 8491 1.1 joerg 8492 1.1 joerg Example 8493 1.1 joerg matcher = objCMessageExpr(hasReceiverType(asString("UIWebView *"))); 8494 1.1 joerg matches the [webView ...] message invocation. 8495 1.1 joerg NSString *webViewJavaScript = ... 8496 1.1 joerg UIWebView *webView = ... 8497 1.1 joerg [webView stringByEvaluatingJavaScriptFromString:webViewJavascript]; 8498 1.1 joerg </pre></td></tr> 8499 1.1 joerg 8500 1.1 joerg 8501 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>></td><td class="name" onclick="toggle('hasAnyParameter1')"><a name="hasAnyParameter1Anchor">hasAnyParameter</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>> InnerMatcher</td></tr> 8502 1.1 joerg <tr><td colspan="4" class="doc" id="hasAnyParameter1"><pre>Matches any parameter of a function or an ObjC method declaration or a 8503 1.1 joerg block. 8504 1.1 joerg 8505 1.1 joerg Does not match the 'this' parameter of a method. 8506 1.1 joerg 8507 1.1 joerg Given 8508 1.1 joerg class X { void f(int x, int y, int z) {} }; 8509 1.1 joerg cxxMethodDecl(hasAnyParameter(hasName("y"))) 8510 1.1 joerg matches f(int x, int y, int z) {} 8511 1.1 joerg with hasAnyParameter(...) 8512 1.1 joerg matching int y 8513 1.1 joerg 8514 1.1 joerg For ObjectiveC, given 8515 1.1 joerg @interface I - (void) f:(int) y; @end 8516 1.1 joerg 8517 1.1 joerg the matcher objcMethodDecl(hasAnyParameter(hasName("y"))) 8518 1.1 joerg matches the declaration of method f with hasParameter 8519 1.1 joerg matching y. 8520 1.1 joerg 8521 1.1 joerg For blocks, given 8522 1.1 joerg b = ^(int y) { printf("%d", y) }; 8523 1.1 joerg 8524 1.1 joerg the matcher blockDecl(hasAnyParameter(hasName("y"))) 8525 1.1 joerg matches the declaration of the block b with hasParameter 8526 1.1 joerg matching y. 8527 1.1 joerg </pre></td></tr> 8528 1.1 joerg 8529 1.1 joerg 8530 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>></td><td class="name" onclick="toggle('hasParameter1')"><a name="hasParameter1Anchor">hasParameter</a></td><td>unsigned N, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>> InnerMatcher</td></tr> 8531 1.1 joerg <tr><td colspan="4" class="doc" id="hasParameter1"><pre>Matches the n'th parameter of a function or an ObjC method 8532 1.1 joerg declaration or a block. 8533 1.1 joerg 8534 1.1 joerg Given 8535 1.1 joerg class X { void f(int x) {} }; 8536 1.1 joerg cxxMethodDecl(hasParameter(0, hasType(varDecl()))) 8537 1.1 joerg matches f(int x) {} 8538 1.1 joerg with hasParameter(...) 8539 1.1 joerg matching int x 8540 1.1 joerg 8541 1.1 joerg For ObjectiveC, given 8542 1.1 joerg @interface I - (void) f:(int) y; @end 8543 1.1 joerg 8544 1.1 joerg the matcher objcMethodDecl(hasParameter(0, hasName("y"))) 8545 1.1 joerg matches the declaration of method f with hasParameter 8546 1.1 joerg matching y. 8547 1.1 joerg </pre></td></tr> 8548 1.1 joerg 8549 1.1 joerg 8550 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>></td><td class="name" onclick="toggle('hasTypeLoc11')"><a name="hasTypeLoc11Anchor">hasTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> Inner</td></tr> 8551 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasTypeLoc11"><pre>Matches if the type location of a node matches the inner matcher. 8552 1.1.1.2 joerg 8553 1.1.1.2 joerg Examples: 8554 1.1.1.2 joerg int x; 8555 1.1.1.2 joerg declaratorDecl(hasTypeLoc(loc(asString("int")))) 8556 1.1.1.2 joerg matches int x 8557 1.1.1.2 joerg 8558 1.1.1.2 joerg auto x = int(3); 8559 1.1.1.2 joerg cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) 8560 1.1.1.2 joerg matches int(3) 8561 1.1.1.2 joerg 8562 1.1.1.2 joerg struct Foo { Foo(int, int); }; 8563 1.1.1.2 joerg auto x = Foo(1, 2); 8564 1.1.1.2 joerg cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) 8565 1.1.1.2 joerg matches Foo(1, 2) 8566 1.1.1.2 joerg 8567 1.1.1.2 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>>, 8568 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>>, 8569 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>>, 8570 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>, 8571 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>>, 8572 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>>, 8573 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>>, 8574 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>> 8575 1.1.1.2 joerg </pre></td></tr> 8576 1.1.1.2 joerg 8577 1.1.1.2 joerg 8578 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1OpaqueValueExpr.html">OpaqueValueExpr</a>></td><td class="name" onclick="toggle('hasSourceExpression1')"><a name="hasSourceExpression1Anchor">hasSourceExpression</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 8579 1.1 joerg <tr><td colspan="4" class="doc" id="hasSourceExpression1"><pre>Matches if the cast's source expression 8580 1.1 joerg or opaque value's source expression matches the given matcher. 8581 1.1 joerg 8582 1.1 joerg Example 1: matches "a string" 8583 1.1 joerg (matcher = castExpr(hasSourceExpression(cxxConstructExpr()))) 8584 1.1 joerg class URL { URL(string); }; 8585 1.1 joerg URL url = "a string"; 8586 1.1 joerg 8587 1.1 joerg Example 2: matches 'b' (matcher = 8588 1.1 joerg opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr()))) 8589 1.1 joerg int a = b ?: 1; 8590 1.1 joerg </pre></td></tr> 8591 1.1 joerg 8592 1.1 joerg 8593 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1OverloadExpr.html">OverloadExpr</a>></td><td class="name" onclick="toggle('hasAnyDeclaration0')"><a name="hasAnyDeclaration0Anchor">hasAnyDeclaration</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 8594 1.1 joerg <tr><td colspan="4" class="doc" id="hasAnyDeclaration0"><pre>Matches an OverloadExpr if any of the declarations in the set of 8595 1.1 joerg overloads matches the given matcher. 8596 1.1 joerg 8597 1.1 joerg Given 8598 1.1 joerg template <typename T> void foo(T); 8599 1.1 joerg template <typename T> void bar(T); 8600 1.1 joerg template <typename T> void baz(T t) { 8601 1.1 joerg foo(t); 8602 1.1 joerg bar(t); 8603 1.1 joerg } 8604 1.1 joerg unresolvedLookupExpr(hasAnyDeclaration( 8605 1.1 joerg functionTemplateDecl(hasName("foo")))) 8606 1.1 joerg matches foo in foo(t); but not bar in bar(t); 8607 1.1 joerg </pre></td></tr> 8608 1.1 joerg 8609 1.1 joerg 8610 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>></td><td class="name" onclick="toggle('innerType0')"><a name="innerType0Anchor">innerType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td></tr> 8611 1.1 joerg <tr><td colspan="4" class="doc" id="innerType0"><pre>Matches ParenType nodes where the inner type is a specific type. 8612 1.1 joerg 8613 1.1 joerg Given 8614 1.1 joerg int (*ptr_to_array)[4]; 8615 1.1 joerg int (*ptr_to_func)(int); 8616 1.1 joerg 8617 1.1 joerg varDecl(hasType(pointsTo(parenType(innerType(functionType()))))) matches 8618 1.1 joerg ptr_to_func but not ptr_to_array. 8619 1.1 joerg 8620 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>> 8621 1.1 joerg </pre></td></tr> 8622 1.1 joerg 8623 1.1 joerg 8624 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>></td><td class="name" onclick="toggle('pointee2')"><a name="pointee2Anchor">pointee</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td></tr> 8625 1.1 joerg <tr><td colspan="4" class="doc" id="pointee2"><pre>Narrows PointerType (and similar) matchers to those where the 8626 1.1 joerg pointee matches a given matcher. 8627 1.1 joerg 8628 1.1 joerg Given 8629 1.1 joerg int *a; 8630 1.1 joerg int const *b; 8631 1.1 joerg float const *f; 8632 1.1 joerg pointerType(pointee(isConstQualified(), isInteger())) 8633 1.1 joerg matches "int const *b" 8634 1.1 joerg 8635 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>>, 8636 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>> 8637 1.1 joerg </pre></td></tr> 8638 1.1 joerg 8639 1.1 joerg 8640 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('hasCanonicalType0')"><a name="hasCanonicalType0Anchor">hasCanonicalType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 8641 1.1 joerg <tr><td colspan="4" class="doc" id="hasCanonicalType0"><pre>Matches QualTypes whose canonical type matches InnerMatcher. 8642 1.1 joerg 8643 1.1 joerg Given: 8644 1.1 joerg typedef int &int_ref; 8645 1.1 joerg int a; 8646 1.1 joerg int_ref b = a; 8647 1.1 joerg 8648 1.1 joerg varDecl(hasType(qualType(referenceType()))))) will not match the 8649 1.1 joerg declaration of b but varDecl(hasType(qualType(hasCanonicalType(referenceType())))))) does. 8650 1.1 joerg </pre></td></tr> 8651 1.1 joerg 8652 1.1 joerg 8653 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('hasDeclaration6')"><a name="hasDeclaration6Anchor">hasDeclaration</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 8654 1.1 joerg <tr><td colspan="4" class="doc" id="hasDeclaration6"><pre>Matches a node if the declaration associated with that node 8655 1.1 joerg matches the given matcher. 8656 1.1 joerg 8657 1.1 joerg The associated declaration is: 8658 1.1 joerg - for type nodes, the declaration of the underlying type 8659 1.1 joerg - for CallExpr, the declaration of the callee 8660 1.1 joerg - for MemberExpr, the declaration of the referenced member 8661 1.1 joerg - for CXXConstructExpr, the declaration of the constructor 8662 1.1 joerg - for CXXNewExpr, the declaration of the operator new 8663 1.1 joerg - for ObjCIvarExpr, the declaration of the ivar 8664 1.1 joerg 8665 1.1 joerg For type nodes, hasDeclaration will generally match the declaration of the 8666 1.1 joerg sugared type. Given 8667 1.1 joerg class X {}; 8668 1.1 joerg typedef X Y; 8669 1.1 joerg Y y; 8670 1.1 joerg in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 8671 1.1 joerg typedefDecl. A common use case is to match the underlying, desugared type. 8672 1.1 joerg This can be achieved by using the hasUnqualifiedDesugaredType matcher: 8673 1.1 joerg varDecl(hasType(hasUnqualifiedDesugaredType( 8674 1.1 joerg recordType(hasDeclaration(decl()))))) 8675 1.1 joerg In this matcher, the decl will match the CXXRecordDecl of class X. 8676 1.1 joerg 8677 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, 8678 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, 8679 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, 8680 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, 8681 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, 8682 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, 8683 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 8684 1.1 joerg </pre></td></tr> 8685 1.1 joerg 8686 1.1 joerg 8687 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('ignoringParens0')"><a name="ignoringParens0Anchor">ignoringParens</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 8688 1.1 joerg <tr><td colspan="4" class="doc" id="ignoringParens0"><pre>Matches types that match InnerMatcher after any parens are stripped. 8689 1.1 joerg 8690 1.1 joerg Given 8691 1.1 joerg void (*fp)(void); 8692 1.1 joerg The matcher 8693 1.1 joerg varDecl(hasType(pointerType(pointee(ignoringParens(functionType()))))) 8694 1.1 joerg would match the declaration for fp. 8695 1.1 joerg </pre></td></tr> 8696 1.1 joerg 8697 1.1 joerg 8698 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('pointsTo1')"><a name="pointsTo1Anchor">pointsTo</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 8699 1.1 joerg <tr><td colspan="4" class="doc" id="pointsTo1"><pre>Overloaded to match the pointee type's declaration. 8700 1.1 joerg </pre></td></tr> 8701 1.1 joerg 8702 1.1 joerg 8703 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('pointsTo0')"><a name="pointsTo0Anchor">pointsTo</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 8704 1.1 joerg <tr><td colspan="4" class="doc" id="pointsTo0"><pre>Matches if the matched type is a pointer type and the pointee type 8705 1.1 joerg matches the specified matcher. 8706 1.1 joerg 8707 1.1 joerg Example matches y->x() 8708 1.1 joerg (matcher = cxxMemberCallExpr(on(hasType(pointsTo 8709 1.1 joerg cxxRecordDecl(hasName("Y"))))))) 8710 1.1 joerg class Y { public: void x(); }; 8711 1.1 joerg void z() { Y *y; y->x(); } 8712 1.1 joerg </pre></td></tr> 8713 1.1 joerg 8714 1.1 joerg 8715 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('references1')"><a name="references1Anchor">references</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 8716 1.1 joerg <tr><td colspan="4" class="doc" id="references1"><pre>Overloaded to match the referenced type's declaration. 8717 1.1 joerg </pre></td></tr> 8718 1.1 joerg 8719 1.1 joerg 8720 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>></td><td class="name" onclick="toggle('references0')"><a name="references0Anchor">references</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 8721 1.1 joerg <tr><td colspan="4" class="doc" id="references0"><pre>Matches if the matched type is a reference type and the referenced 8722 1.1 joerg type matches the specified matcher. 8723 1.1 joerg 8724 1.1 joerg Example matches X &x and const X &y 8725 1.1 joerg (matcher = varDecl(hasType(references(cxxRecordDecl(hasName("X")))))) 8726 1.1 joerg class X { 8727 1.1 joerg void a(X b) { 8728 1.1 joerg X &x = b; 8729 1.1 joerg const X &y = b; 8730 1.1 joerg } 8731 1.1 joerg }; 8732 1.1 joerg </pre></td></tr> 8733 1.1 joerg 8734 1.1 joerg 8735 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>></td><td class="name" onclick="toggle('hasDeclaration5')"><a name="hasDeclaration5Anchor">hasDeclaration</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 8736 1.1 joerg <tr><td colspan="4" class="doc" id="hasDeclaration5"><pre>Matches a node if the declaration associated with that node 8737 1.1 joerg matches the given matcher. 8738 1.1 joerg 8739 1.1 joerg The associated declaration is: 8740 1.1 joerg - for type nodes, the declaration of the underlying type 8741 1.1 joerg - for CallExpr, the declaration of the callee 8742 1.1 joerg - for MemberExpr, the declaration of the referenced member 8743 1.1 joerg - for CXXConstructExpr, the declaration of the constructor 8744 1.1 joerg - for CXXNewExpr, the declaration of the operator new 8745 1.1 joerg - for ObjCIvarExpr, the declaration of the ivar 8746 1.1 joerg 8747 1.1 joerg For type nodes, hasDeclaration will generally match the declaration of the 8748 1.1 joerg sugared type. Given 8749 1.1 joerg class X {}; 8750 1.1 joerg typedef X Y; 8751 1.1 joerg Y y; 8752 1.1 joerg in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 8753 1.1 joerg typedefDecl. A common use case is to match the underlying, desugared type. 8754 1.1 joerg This can be achieved by using the hasUnqualifiedDesugaredType matcher: 8755 1.1 joerg varDecl(hasType(hasUnqualifiedDesugaredType( 8756 1.1 joerg recordType(hasDeclaration(decl()))))) 8757 1.1 joerg In this matcher, the decl will match the CXXRecordDecl of class X. 8758 1.1 joerg 8759 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, 8760 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, 8761 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, 8762 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, 8763 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, 8764 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, 8765 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 8766 1.1 joerg </pre></td></tr> 8767 1.1 joerg 8768 1.1 joerg 8769 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>></td><td class="name" onclick="toggle('pointee3')"><a name="pointee3Anchor">pointee</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td></tr> 8770 1.1 joerg <tr><td colspan="4" class="doc" id="pointee3"><pre>Narrows PointerType (and similar) matchers to those where the 8771 1.1 joerg pointee matches a given matcher. 8772 1.1 joerg 8773 1.1 joerg Given 8774 1.1 joerg int *a; 8775 1.1 joerg int const *b; 8776 1.1 joerg float const *f; 8777 1.1 joerg pointerType(pointee(isConstQualified(), isInteger())) 8778 1.1 joerg matches "int const *b" 8779 1.1 joerg 8780 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>>, 8781 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>> 8782 1.1 joerg </pre></td></tr> 8783 1.1 joerg 8784 1.1 joerg 8785 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ReturnStmt.html">ReturnStmt</a>></td><td class="name" onclick="toggle('hasReturnValue0')"><a name="hasReturnValue0Anchor">hasReturnValue</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 8786 1.1 joerg <tr><td colspan="4" class="doc" id="hasReturnValue0"><pre>Matches the return value expression of a return statement 8787 1.1 joerg 8788 1.1 joerg Given 8789 1.1 joerg return a + b; 8790 1.1 joerg hasReturnValue(binaryOperator()) 8791 1.1 joerg matches 'return a + b' 8792 1.1 joerg with binaryOperator() 8793 1.1 joerg matching 'a + b' 8794 1.1 joerg </pre></td></tr> 8795 1.1 joerg 8796 1.1 joerg 8797 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1StmtExpr.html">StmtExpr</a>></td><td class="name" onclick="toggle('hasAnySubstatement1')"><a name="hasAnySubstatement1Anchor">hasAnySubstatement</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr> 8798 1.1 joerg <tr><td colspan="4" class="doc" id="hasAnySubstatement1"><pre>Matches compound statements where at least one substatement matches 8799 1.1 joerg a given matcher. Also matches StmtExprs that have CompoundStmt as children. 8800 1.1 joerg 8801 1.1 joerg Given 8802 1.1 joerg { {}; 1+2; } 8803 1.1 joerg hasAnySubstatement(compoundStmt()) 8804 1.1 joerg matches '{ {}; 1+2; }' 8805 1.1 joerg with compoundStmt() 8806 1.1 joerg matching '{}' 8807 1.1 joerg </pre></td></tr> 8808 1.1 joerg 8809 1.1 joerg 8810 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('alignOfExpr0')"><a name="alignOfExpr0Anchor">alignOfExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html">UnaryExprOrTypeTraitExpr</a>> InnerMatcher</td></tr> 8811 1.1 joerg <tr><td colspan="4" class="doc" id="alignOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching 8812 1.1 joerg alignof. 8813 1.1 joerg </pre></td></tr> 8814 1.1 joerg 8815 1.1 joerg 8816 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('forCallable0')"><a name="forCallable0Anchor">forCallable</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 8817 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="forCallable0"><pre>Matches declaration of the function, method, or block the statement 8818 1.1.1.2 joerg belongs to. 8819 1.1.1.2 joerg 8820 1.1.1.2 joerg Given: 8821 1.1.1.2 joerg F& operator=(const F& o) { 8822 1.1.1.2 joerg std::copy_if(o.begin(), o.end(), begin(), [](V v) { return v > 0; }); 8823 1.1.1.2 joerg return *this; 8824 1.1.1.2 joerg } 8825 1.1.1.2 joerg returnStmt(forCallable(functionDecl(hasName("operator=")))) 8826 1.1.1.2 joerg matches 'return *this' 8827 1.1.1.2 joerg but does not match 'return v > 0' 8828 1.1.1.2 joerg 8829 1.1.1.2 joerg Given: 8830 1.1.1.2 joerg -(void) foo { 8831 1.1.1.2 joerg int x = 1; 8832 1.1.1.2 joerg dispatch_sync(queue, ^{ int y = 2; }); 8833 1.1.1.2 joerg } 8834 1.1.1.2 joerg declStmt(forCallable(objcMethodDecl())) 8835 1.1.1.2 joerg matches 'int x = 1' 8836 1.1.1.2 joerg but does not match 'int y = 2'. 8837 1.1.1.2 joerg whereas declStmt(forCallable(blockDecl())) 8838 1.1.1.2 joerg matches 'int y = 2' 8839 1.1.1.2 joerg but does not match 'int x = 1'. 8840 1.1.1.2 joerg </pre></td></tr> 8841 1.1.1.2 joerg 8842 1.1.1.2 joerg 8843 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('forFunction0')"><a name="forFunction0Anchor">forFunction</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>> InnerMatcher</td></tr> 8844 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="forFunction0"><pre>Matches declaration of the function the statement belongs to. 8845 1.1.1.2 joerg 8846 1.1.1.2 joerg Deprecated. Use forCallable() to correctly handle the situation when 8847 1.1.1.2 joerg the declaration is not a function (but a block or an Objective-C method). 8848 1.1.1.2 joerg forFunction() not only fails to take non-functions into account but also 8849 1.1.1.2 joerg may match the wrong declaration in their presence. 8850 1.1 joerg 8851 1.1 joerg Given: 8852 1.1 joerg F& operator=(const F& o) { 8853 1.1 joerg std::copy_if(o.begin(), o.end(), begin(), [](V v) { return v > 0; }); 8854 1.1 joerg return *this; 8855 1.1 joerg } 8856 1.1 joerg returnStmt(forFunction(hasName("operator="))) 8857 1.1 joerg matches 'return *this' 8858 1.1 joerg but does not match 'return v > 0' 8859 1.1 joerg </pre></td></tr> 8860 1.1 joerg 8861 1.1 joerg 8862 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('sizeOfExpr0')"><a name="sizeOfExpr0Anchor">sizeOfExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html">UnaryExprOrTypeTraitExpr</a>> InnerMatcher</td></tr> 8863 1.1 joerg <tr><td colspan="4" class="doc" id="sizeOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching 8864 1.1 joerg sizeof. 8865 1.1 joerg </pre></td></tr> 8866 1.1 joerg 8867 1.1 joerg 8868 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1SubstTemplateTypeParmType.html">SubstTemplateTypeParmType</a>></td><td class="name" onclick="toggle('hasReplacementType0')"><a name="hasReplacementType0Anchor">hasReplacementType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td></tr> 8869 1.1 joerg <tr><td colspan="4" class="doc" id="hasReplacementType0"><pre>Matches template type parameter substitutions that have a replacement 8870 1.1 joerg type that matches the provided matcher. 8871 1.1 joerg 8872 1.1 joerg Given 8873 1.1 joerg template <typename T> 8874 1.1 joerg double F(T t); 8875 1.1 joerg int i; 8876 1.1 joerg double j = F(i); 8877 1.1 joerg 8878 1.1 joerg substTemplateTypeParmType(hasReplacementType(type())) matches int 8879 1.1 joerg </pre></td></tr> 8880 1.1 joerg 8881 1.1 joerg 8882 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1SwitchStmt.html">SwitchStmt</a>></td><td class="name" onclick="toggle('forEachSwitchCase0')"><a name="forEachSwitchCase0Anchor">forEachSwitchCase</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1SwitchCase.html">SwitchCase</a>> InnerMatcher</td></tr> 8883 1.1 joerg <tr><td colspan="4" class="doc" id="forEachSwitchCase0"><pre>Matches each case or default statement belonging to the given switch 8884 1.1 joerg statement. This matcher may produce multiple matches. 8885 1.1 joerg 8886 1.1 joerg Given 8887 1.1 joerg switch (1) { case 1: case 2: default: switch (2) { case 3: case 4: ; } } 8888 1.1 joerg switchStmt(forEachSwitchCase(caseStmt().bind("c"))).bind("s") 8889 1.1 joerg matches four times, with "c" binding each of "case 1:", "case 2:", 8890 1.1 joerg "case 3:" and "case 4:", and "s" respectively binding "switch (1)", 8891 1.1 joerg "switch (1)", "switch (2)" and "switch (2)". 8892 1.1 joerg </pre></td></tr> 8893 1.1 joerg 8894 1.1 joerg 8895 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1SwitchStmt.html">SwitchStmt</a>></td><td class="name" onclick="toggle('hasCondition4')"><a name="hasCondition4Anchor">hasCondition</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 8896 1.1 joerg <tr><td colspan="4" class="doc" id="hasCondition4"><pre>Matches the condition expression of an if statement, for loop, 8897 1.1 joerg switch statement or conditional operator. 8898 1.1 joerg 8899 1.1 joerg Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 8900 1.1 joerg if (true) {} 8901 1.1 joerg </pre></td></tr> 8902 1.1 joerg 8903 1.1 joerg 8904 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1SwitchStmt.html">SwitchStmt</a>></td><td class="name" onclick="toggle('hasInitStatement1')"><a name="hasInitStatement1Anchor">hasInitStatement</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr> 8905 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasInitStatement1"><pre>Matches selection statements with initializer. 8906 1.1.1.2 joerg 8907 1.1.1.2 joerg Given: 8908 1.1.1.2 joerg void foo() { 8909 1.1.1.2 joerg if (int i = foobar(); i > 0) {} 8910 1.1.1.2 joerg switch (int i = foobar(); i) {} 8911 1.1.1.2 joerg for (auto& a = get_range(); auto& x : a) {} 8912 1.1.1.2 joerg } 8913 1.1.1.2 joerg void bar() { 8914 1.1.1.2 joerg if (foobar() > 0) {} 8915 1.1.1.2 joerg switch (foobar()) {} 8916 1.1.1.2 joerg for (auto& x : get_range()) {} 8917 1.1.1.2 joerg } 8918 1.1.1.2 joerg ifStmt(hasInitStatement(anything())) 8919 1.1.1.2 joerg matches the if statement in foo but not in bar. 8920 1.1.1.2 joerg switchStmt(hasInitStatement(anything())) 8921 1.1.1.2 joerg matches the switch statement in foo but not in bar. 8922 1.1.1.2 joerg cxxForRangeStmt(hasInitStatement(anything())) 8923 1.1.1.2 joerg matches the range for statement in foo but not in bar. 8924 1.1.1.2 joerg </pre></td></tr> 8925 1.1.1.2 joerg 8926 1.1.1.2 joerg 8927 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>></td><td class="name" onclick="toggle('hasDeclaration4')"><a name="hasDeclaration4Anchor">hasDeclaration</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 8928 1.1 joerg <tr><td colspan="4" class="doc" id="hasDeclaration4"><pre>Matches a node if the declaration associated with that node 8929 1.1 joerg matches the given matcher. 8930 1.1 joerg 8931 1.1 joerg The associated declaration is: 8932 1.1 joerg - for type nodes, the declaration of the underlying type 8933 1.1 joerg - for CallExpr, the declaration of the callee 8934 1.1 joerg - for MemberExpr, the declaration of the referenced member 8935 1.1 joerg - for CXXConstructExpr, the declaration of the constructor 8936 1.1 joerg - for CXXNewExpr, the declaration of the operator new 8937 1.1 joerg - for ObjCIvarExpr, the declaration of the ivar 8938 1.1 joerg 8939 1.1 joerg For type nodes, hasDeclaration will generally match the declaration of the 8940 1.1 joerg sugared type. Given 8941 1.1 joerg class X {}; 8942 1.1 joerg typedef X Y; 8943 1.1 joerg Y y; 8944 1.1 joerg in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 8945 1.1 joerg typedefDecl. A common use case is to match the underlying, desugared type. 8946 1.1 joerg This can be achieved by using the hasUnqualifiedDesugaredType matcher: 8947 1.1 joerg varDecl(hasType(hasUnqualifiedDesugaredType( 8948 1.1 joerg recordType(hasDeclaration(decl()))))) 8949 1.1 joerg In this matcher, the decl will match the CXXRecordDecl of class X. 8950 1.1 joerg 8951 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, 8952 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, 8953 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, 8954 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, 8955 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, 8956 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, 8957 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 8958 1.1 joerg </pre></td></tr> 8959 1.1 joerg 8960 1.1 joerg 8961 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>></td><td class="name" onclick="toggle('hasTypeLoc12')"><a name="hasTypeLoc12Anchor">hasTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> Inner</td></tr> 8962 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasTypeLoc12"><pre>Matches if the type location of a node matches the inner matcher. 8963 1.1.1.2 joerg 8964 1.1.1.2 joerg Examples: 8965 1.1.1.2 joerg int x; 8966 1.1.1.2 joerg declaratorDecl(hasTypeLoc(loc(asString("int")))) 8967 1.1.1.2 joerg matches int x 8968 1.1.1.2 joerg 8969 1.1.1.2 joerg auto x = int(3); 8970 1.1.1.2 joerg cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) 8971 1.1.1.2 joerg matches int(3) 8972 1.1.1.2 joerg 8973 1.1.1.2 joerg struct Foo { Foo(int, int); }; 8974 1.1.1.2 joerg auto x = Foo(1, 2); 8975 1.1.1.2 joerg cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) 8976 1.1.1.2 joerg matches Foo(1, 2) 8977 1.1.1.2 joerg 8978 1.1.1.2 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>>, 8979 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>>, 8980 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>>, 8981 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>, 8982 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>>, 8983 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>>, 8984 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>>, 8985 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>> 8986 1.1.1.2 joerg </pre></td></tr> 8987 1.1.1.2 joerg 8988 1.1.1.2 joerg 8989 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>></td><td class="name" onclick="toggle('isExpr0')"><a name="isExpr0Anchor">isExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 8990 1.1 joerg <tr><td colspan="4" class="doc" id="isExpr0"><pre>Matches a sugar TemplateArgument that refers to a certain expression. 8991 1.1 joerg 8992 1.1 joerg Given 8993 1.1 joerg struct B { int next; }; 8994 1.1 joerg template<int(B::*next_ptr)> struct A {}; 8995 1.1 joerg A<&B::next> a; 8996 1.1 joerg templateSpecializationType(hasAnyTemplateArgument( 8997 1.1 joerg isExpr(hasDescendant(declRefExpr(to(fieldDecl(hasName("next")))))))) 8998 1.1 joerg matches the specialization A<&B::next> with fieldDecl(...) matching 8999 1.1 joerg B::next 9000 1.1 joerg </pre></td></tr> 9001 1.1 joerg 9002 1.1 joerg 9003 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>></td><td class="name" onclick="toggle('refersToDeclaration0')"><a name="refersToDeclaration0Anchor">refersToDeclaration</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 9004 1.1 joerg <tr><td colspan="4" class="doc" id="refersToDeclaration0"><pre>Matches a canonical TemplateArgument that refers to a certain 9005 1.1 joerg declaration. 9006 1.1 joerg 9007 1.1 joerg Given 9008 1.1 joerg struct B { int next; }; 9009 1.1 joerg template<int(B::*next_ptr)> struct A {}; 9010 1.1 joerg A<&B::next> a; 9011 1.1 joerg classTemplateSpecializationDecl(hasAnyTemplateArgument( 9012 1.1 joerg refersToDeclaration(fieldDecl(hasName("next"))))) 9013 1.1 joerg matches the specialization A<&B::next> with fieldDecl(...) matching 9014 1.1 joerg B::next 9015 1.1 joerg </pre></td></tr> 9016 1.1 joerg 9017 1.1 joerg 9018 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>></td><td class="name" onclick="toggle('refersToIntegralType0')"><a name="refersToIntegralType0Anchor">refersToIntegralType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 9019 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="refersToIntegralType0"><pre>Matches a TemplateArgument that refers to an integral type. 9020 1.1 joerg 9021 1.1 joerg Given 9022 1.1 joerg template<int T> struct C {}; 9023 1.1 joerg C<42> c; 9024 1.1 joerg classTemplateSpecializationDecl( 9025 1.1 joerg hasAnyTemplateArgument(refersToIntegralType(asString("int")))) 9026 1.1 joerg matches the implicit instantiation of C in C<42>. 9027 1.1 joerg </pre></td></tr> 9028 1.1 joerg 9029 1.1 joerg 9030 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>></td><td class="name" onclick="toggle('refersToTemplate0')"><a name="refersToTemplate0Anchor">refersToTemplate</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateName.html">TemplateName</a>> InnerMatcher</td></tr> 9031 1.1 joerg <tr><td colspan="4" class="doc" id="refersToTemplate0"><pre>Matches a TemplateArgument that refers to a certain template. 9032 1.1 joerg 9033 1.1 joerg Given 9034 1.1 joerg template<template <typename> class S> class X {}; 9035 1.1 joerg template<typename T> class Y {}; 9036 1.1 joerg X<Y> xi; 9037 1.1 joerg classTemplateSpecializationDecl(hasAnyTemplateArgument( 9038 1.1 joerg refersToTemplate(templateName()))) 9039 1.1 joerg matches the specialization X<Y> 9040 1.1 joerg </pre></td></tr> 9041 1.1 joerg 9042 1.1 joerg 9043 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>></td><td class="name" onclick="toggle('refersToType0')"><a name="refersToType0Anchor">refersToType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 9044 1.1 joerg <tr><td colspan="4" class="doc" id="refersToType0"><pre>Matches a TemplateArgument that refers to a certain type. 9045 1.1 joerg 9046 1.1 joerg Given 9047 1.1 joerg struct X {}; 9048 1.1 joerg template<typename T> struct A {}; 9049 1.1 joerg A<X> a; 9050 1.1 joerg classTemplateSpecializationDecl(hasAnyTemplateArgument( 9051 1.1 joerg refersToType(class(hasName("X"))))) 9052 1.1 joerg matches the specialization A<X> 9053 1.1 joerg </pre></td></tr> 9054 1.1 joerg 9055 1.1 joerg 9056 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>></td><td class="name" onclick="toggle('hasAnyTemplateArgument1')"><a name="hasAnyTemplateArgument1Anchor">hasAnyTemplateArgument</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>> InnerMatcher</td></tr> 9057 1.1 joerg <tr><td colspan="4" class="doc" id="hasAnyTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and 9058 1.1 joerg functionDecl that have at least one TemplateArgument matching the given 9059 1.1 joerg InnerMatcher. 9060 1.1 joerg 9061 1.1 joerg Given 9062 1.1 joerg template<typename T> class A {}; 9063 1.1 joerg template<> class A<double> {}; 9064 1.1 joerg A<int> a; 9065 1.1 joerg 9066 1.1 joerg template<typename T> f() {}; 9067 1.1 joerg void func() { f<int>(); }; 9068 1.1 joerg 9069 1.1 joerg classTemplateSpecializationDecl(hasAnyTemplateArgument( 9070 1.1 joerg refersToType(asString("int")))) 9071 1.1 joerg matches the specialization A<int> 9072 1.1 joerg 9073 1.1 joerg functionDecl(hasAnyTemplateArgument(refersToType(asString("int")))) 9074 1.1 joerg matches the specialization f<int> 9075 1.1 joerg </pre></td></tr> 9076 1.1 joerg 9077 1.1 joerg 9078 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>></td><td class="name" onclick="toggle('hasDeclaration3')"><a name="hasDeclaration3Anchor">hasDeclaration</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 9079 1.1 joerg <tr><td colspan="4" class="doc" id="hasDeclaration3"><pre>Matches a node if the declaration associated with that node 9080 1.1 joerg matches the given matcher. 9081 1.1 joerg 9082 1.1 joerg The associated declaration is: 9083 1.1 joerg - for type nodes, the declaration of the underlying type 9084 1.1 joerg - for CallExpr, the declaration of the callee 9085 1.1 joerg - for MemberExpr, the declaration of the referenced member 9086 1.1 joerg - for CXXConstructExpr, the declaration of the constructor 9087 1.1 joerg - for CXXNewExpr, the declaration of the operator new 9088 1.1 joerg - for ObjCIvarExpr, the declaration of the ivar 9089 1.1 joerg 9090 1.1 joerg For type nodes, hasDeclaration will generally match the declaration of the 9091 1.1 joerg sugared type. Given 9092 1.1 joerg class X {}; 9093 1.1 joerg typedef X Y; 9094 1.1 joerg Y y; 9095 1.1 joerg in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 9096 1.1 joerg typedefDecl. A common use case is to match the underlying, desugared type. 9097 1.1 joerg This can be achieved by using the hasUnqualifiedDesugaredType matcher: 9098 1.1 joerg varDecl(hasType(hasUnqualifiedDesugaredType( 9099 1.1 joerg recordType(hasDeclaration(decl()))))) 9100 1.1 joerg In this matcher, the decl will match the CXXRecordDecl of class X. 9101 1.1 joerg 9102 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, 9103 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, 9104 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, 9105 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, 9106 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, 9107 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, 9108 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 9109 1.1 joerg </pre></td></tr> 9110 1.1 joerg 9111 1.1 joerg 9112 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>></td><td class="name" onclick="toggle('hasTemplateArgument1')"><a name="hasTemplateArgument1Anchor">hasTemplateArgument</a></td><td>unsigned N, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>> InnerMatcher</td></tr> 9113 1.1 joerg <tr><td colspan="4" class="doc" id="hasTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and 9114 1.1 joerg functionDecl where the n'th TemplateArgument matches the given InnerMatcher. 9115 1.1 joerg 9116 1.1 joerg Given 9117 1.1 joerg template<typename T, typename U> class A {}; 9118 1.1 joerg A<bool, int> b; 9119 1.1 joerg A<int, bool> c; 9120 1.1 joerg 9121 1.1 joerg template<typename T> void f() {} 9122 1.1 joerg void func() { f<int>(); }; 9123 1.1 joerg classTemplateSpecializationDecl(hasTemplateArgument( 9124 1.1 joerg 1, refersToType(asString("int")))) 9125 1.1 joerg matches the specialization A<bool, int> 9126 1.1 joerg 9127 1.1 joerg functionDecl(hasTemplateArgument(0, refersToType(asString("int")))) 9128 1.1 joerg matches the specialization f<int> 9129 1.1 joerg </pre></td></tr> 9130 1.1 joerg 9131 1.1 joerg 9132 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>></td><td class="name" onclick="toggle('hasDeclaration2')"><a name="hasDeclaration2Anchor">hasDeclaration</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 9133 1.1 joerg <tr><td colspan="4" class="doc" id="hasDeclaration2"><pre>Matches a node if the declaration associated with that node 9134 1.1 joerg matches the given matcher. 9135 1.1 joerg 9136 1.1 joerg The associated declaration is: 9137 1.1 joerg - for type nodes, the declaration of the underlying type 9138 1.1 joerg - for CallExpr, the declaration of the callee 9139 1.1 joerg - for MemberExpr, the declaration of the referenced member 9140 1.1 joerg - for CXXConstructExpr, the declaration of the constructor 9141 1.1 joerg - for CXXNewExpr, the declaration of the operator new 9142 1.1 joerg - for ObjCIvarExpr, the declaration of the ivar 9143 1.1 joerg 9144 1.1 joerg For type nodes, hasDeclaration will generally match the declaration of the 9145 1.1 joerg sugared type. Given 9146 1.1 joerg class X {}; 9147 1.1 joerg typedef X Y; 9148 1.1 joerg Y y; 9149 1.1 joerg in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 9150 1.1 joerg typedefDecl. A common use case is to match the underlying, desugared type. 9151 1.1 joerg This can be achieved by using the hasUnqualifiedDesugaredType matcher: 9152 1.1 joerg varDecl(hasType(hasUnqualifiedDesugaredType( 9153 1.1 joerg recordType(hasDeclaration(decl()))))) 9154 1.1 joerg In this matcher, the decl will match the CXXRecordDecl of class X. 9155 1.1 joerg 9156 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, 9157 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, 9158 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, 9159 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, 9160 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, 9161 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, 9162 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 9163 1.1 joerg </pre></td></tr> 9164 1.1 joerg 9165 1.1 joerg 9166 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>></td><td class="name" onclick="toggle('loc0')"><a name="loc0Anchor">loc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 9167 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="loc0"><pre>Matches TypeLocs for which the given inner 9168 1.1.1.2 joerg QualType-matcher matches. 9169 1.1.1.2 joerg </pre></td></tr> 9170 1.1 joerg 9171 1.1 joerg 9172 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>></td><td class="name" onclick="toggle('hasTypeLoc13')"><a name="hasTypeLoc13Anchor">hasTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>> Inner</td></tr> 9173 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasTypeLoc13"><pre>Matches if the type location of a node matches the inner matcher. 9174 1.1 joerg 9175 1.1.1.2 joerg Examples: 9176 1.1.1.2 joerg int x; 9177 1.1.1.2 joerg declaratorDecl(hasTypeLoc(loc(asString("int")))) 9178 1.1.1.2 joerg matches int x 9179 1.1.1.2 joerg 9180 1.1.1.2 joerg auto x = int(3); 9181 1.1.1.2 joerg cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int")))) 9182 1.1.1.2 joerg matches int(3) 9183 1.1.1.2 joerg 9184 1.1.1.2 joerg struct Foo { Foo(int, int); }; 9185 1.1.1.2 joerg auto x = Foo(1, 2); 9186 1.1.1.2 joerg cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo")))) 9187 1.1.1.2 joerg matches Foo(1, 2) 9188 1.1.1.2 joerg 9189 1.1.1.2 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>>, 9190 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>>, 9191 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>>, 9192 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>>, 9193 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>>, 9194 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>>, 9195 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>>, 9196 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>> 9197 1.1 joerg </pre></td></tr> 9198 1.1 joerg 9199 1.1 joerg 9200 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>></td><td class="name" onclick="toggle('hasType2')"><a name="hasType2Anchor">hasType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 9201 1.1 joerg <tr><td colspan="4" class="doc" id="hasType2"><pre>Matches if the expression's or declaration's type matches a type 9202 1.1 joerg matcher. 9203 1.1 joerg 9204 1.1 joerg Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 9205 1.1 joerg and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 9206 1.1 joerg and U (matcher = typedefDecl(hasType(asString("int"))) 9207 1.1 joerg and friend class X (matcher = friendDecl(hasType("X")) 9208 1.1.1.2 joerg and public virtual X (matcher = cxxBaseSpecifier(hasType( 9209 1.1.1.2 joerg asString("class X"))) 9210 1.1 joerg class X {}; 9211 1.1 joerg void y(X &x) { x; X z; } 9212 1.1 joerg typedef int U; 9213 1.1 joerg class Y { friend class X; }; 9214 1.1.1.2 joerg class Z : public virtual X {}; 9215 1.1 joerg </pre></td></tr> 9216 1.1 joerg 9217 1.1 joerg 9218 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>></td><td class="name" onclick="toggle('hasDeclaration1')"><a name="hasDeclaration1Anchor">hasDeclaration</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 9219 1.1 joerg <tr><td colspan="4" class="doc" id="hasDeclaration1"><pre>Matches a node if the declaration associated with that node 9220 1.1 joerg matches the given matcher. 9221 1.1 joerg 9222 1.1 joerg The associated declaration is: 9223 1.1 joerg - for type nodes, the declaration of the underlying type 9224 1.1 joerg - for CallExpr, the declaration of the callee 9225 1.1 joerg - for MemberExpr, the declaration of the referenced member 9226 1.1 joerg - for CXXConstructExpr, the declaration of the constructor 9227 1.1 joerg - for CXXNewExpr, the declaration of the operator new 9228 1.1 joerg - for ObjCIvarExpr, the declaration of the ivar 9229 1.1 joerg 9230 1.1 joerg For type nodes, hasDeclaration will generally match the declaration of the 9231 1.1 joerg sugared type. Given 9232 1.1 joerg class X {}; 9233 1.1 joerg typedef X Y; 9234 1.1 joerg Y y; 9235 1.1 joerg in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 9236 1.1 joerg typedefDecl. A common use case is to match the underlying, desugared type. 9237 1.1 joerg This can be achieved by using the hasUnqualifiedDesugaredType matcher: 9238 1.1 joerg varDecl(hasType(hasUnqualifiedDesugaredType( 9239 1.1 joerg recordType(hasDeclaration(decl()))))) 9240 1.1 joerg In this matcher, the decl will match the CXXRecordDecl of class X. 9241 1.1 joerg 9242 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, 9243 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, 9244 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, 9245 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, 9246 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, 9247 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, 9248 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 9249 1.1 joerg </pre></td></tr> 9250 1.1 joerg 9251 1.1 joerg 9252 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('hasUnqualifiedDesugaredType0')"><a name="hasUnqualifiedDesugaredType0Anchor">hasUnqualifiedDesugaredType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>> InnerMatcher</td></tr> 9253 1.1 joerg <tr><td colspan="4" class="doc" id="hasUnqualifiedDesugaredType0"><pre>Matches if the matched type matches the unqualified desugared 9254 1.1 joerg type of the matched node. 9255 1.1 joerg 9256 1.1 joerg For example, in: 9257 1.1 joerg class A {}; 9258 1.1 joerg using B = A; 9259 1.1 joerg The matcher type(hasUnqualifiedDesugaredType(recordType())) matches 9260 1.1 joerg both B and A. 9261 1.1 joerg </pre></td></tr> 9262 1.1 joerg 9263 1.1 joerg 9264 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html">UnaryExprOrTypeTraitExpr</a>></td><td class="name" onclick="toggle('hasArgumentOfType0')"><a name="hasArgumentOfType0Anchor">hasArgumentOfType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 9265 1.1 joerg <tr><td colspan="4" class="doc" id="hasArgumentOfType0"><pre>Matches unary expressions that have a specific type of argument. 9266 1.1 joerg 9267 1.1 joerg Given 9268 1.1 joerg int a, c; float b; int s = sizeof(a) + sizeof(b) + alignof(c); 9269 1.1 joerg unaryExprOrTypeTraitExpr(hasArgumentOfType(asString("int")) 9270 1.1 joerg matches sizeof(a) and alignof(c) 9271 1.1 joerg </pre></td></tr> 9272 1.1 joerg 9273 1.1 joerg 9274 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryOperator.html">UnaryOperator</a>></td><td class="name" onclick="toggle('hasUnaryOperand0')"><a name="hasUnaryOperand0Anchor">hasUnaryOperand</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 9275 1.1 joerg <tr><td colspan="4" class="doc" id="hasUnaryOperand0"><pre>Matches if the operand of a unary operator matches. 9276 1.1 joerg 9277 1.1 joerg Example matches true (matcher = hasUnaryOperand( 9278 1.1 joerg cxxBoolLiteral(equals(true)))) 9279 1.1 joerg !true 9280 1.1 joerg </pre></td></tr> 9281 1.1 joerg 9282 1.1 joerg 9283 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedMemberExpr.html">UnresolvedMemberExpr</a>></td><td class="name" onclick="toggle('hasObjectExpression1')"><a name="hasObjectExpression1Anchor">hasObjectExpression</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 9284 1.1 joerg <tr><td colspan="4" class="doc" id="hasObjectExpression1"><pre>Matches a member expression where the object expression is matched by a 9285 1.1 joerg given matcher. Implicit object expressions are included; that is, it matches 9286 1.1 joerg use of implicit `this`. 9287 1.1 joerg 9288 1.1 joerg Given 9289 1.1 joerg struct X { 9290 1.1 joerg int m; 9291 1.1 joerg int f(X x) { x.m; return m; } 9292 1.1 joerg }; 9293 1.1 joerg memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X"))))) 9294 1.1 joerg matches `x.m`, but not `m`; however, 9295 1.1 joerg memberExpr(hasObjectExpression(hasType(pointsTo( 9296 1.1 joerg cxxRecordDecl(hasName("X")))))) 9297 1.1 joerg matches `m` (aka. `this->m`), but not `x.m`. 9298 1.1 joerg </pre></td></tr> 9299 1.1 joerg 9300 1.1 joerg 9301 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>></td><td class="name" onclick="toggle('hasDeclaration0')"><a name="hasDeclaration0Anchor">hasDeclaration</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 9302 1.1 joerg <tr><td colspan="4" class="doc" id="hasDeclaration0"><pre>Matches a node if the declaration associated with that node 9303 1.1 joerg matches the given matcher. 9304 1.1 joerg 9305 1.1 joerg The associated declaration is: 9306 1.1 joerg - for type nodes, the declaration of the underlying type 9307 1.1 joerg - for CallExpr, the declaration of the callee 9308 1.1 joerg - for MemberExpr, the declaration of the referenced member 9309 1.1 joerg - for CXXConstructExpr, the declaration of the constructor 9310 1.1 joerg - for CXXNewExpr, the declaration of the operator new 9311 1.1 joerg - for ObjCIvarExpr, the declaration of the ivar 9312 1.1 joerg 9313 1.1 joerg For type nodes, hasDeclaration will generally match the declaration of the 9314 1.1 joerg sugared type. Given 9315 1.1 joerg class X {}; 9316 1.1 joerg typedef X Y; 9317 1.1 joerg Y y; 9318 1.1 joerg in varDecl(hasType(hasDeclaration(decl()))) the decl will match the 9319 1.1 joerg typedefDecl. A common use case is to match the underlying, desugared type. 9320 1.1 joerg This can be achieved by using the hasUnqualifiedDesugaredType matcher: 9321 1.1 joerg varDecl(hasType(hasUnqualifiedDesugaredType( 9322 1.1 joerg recordType(hasDeclaration(decl()))))) 9323 1.1 joerg In this matcher, the decl will match the CXXRecordDecl of class X. 9324 1.1 joerg 9325 1.1 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>>, 9326 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>>, 9327 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>>, 9328 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>>, 9329 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>>, 9330 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>>, 9331 1.1 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>> 9332 1.1 joerg </pre></td></tr> 9333 1.1 joerg 9334 1.1 joerg 9335 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingDecl.html">UsingDecl</a>></td><td class="name" onclick="toggle('hasAnyUsingShadowDecl0')"><a name="hasAnyUsingShadowDecl0Anchor">hasAnyUsingShadowDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingShadowDecl.html">UsingShadowDecl</a>> InnerMatcher</td></tr> 9336 1.1 joerg <tr><td colspan="4" class="doc" id="hasAnyUsingShadowDecl0"><pre>Matches any using shadow declaration. 9337 1.1 joerg 9338 1.1 joerg Given 9339 1.1 joerg namespace X { void b(); } 9340 1.1 joerg using X::b; 9341 1.1 joerg usingDecl(hasAnyUsingShadowDecl(hasName("b")))) 9342 1.1 joerg matches using X::b </pre></td></tr> 9343 1.1 joerg 9344 1.1 joerg 9345 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingShadowDecl.html">UsingShadowDecl</a>></td><td class="name" onclick="toggle('hasTargetDecl0')"><a name="hasTargetDecl0Anchor">hasTargetDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>> InnerMatcher</td></tr> 9346 1.1 joerg <tr><td colspan="4" class="doc" id="hasTargetDecl0"><pre>Matches a using shadow declaration where the target declaration is 9347 1.1 joerg matched by the given matcher. 9348 1.1 joerg 9349 1.1 joerg Given 9350 1.1 joerg namespace X { int a; void b(); } 9351 1.1 joerg using X::a; 9352 1.1 joerg using X::b; 9353 1.1 joerg usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(functionDecl()))) 9354 1.1 joerg matches using X::b but not using X::a </pre></td></tr> 9355 1.1 joerg 9356 1.1 joerg 9357 1.1.1.2 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>></td><td class="name" onclick="toggle('hasType7')"><a name="hasType7Anchor">hasType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>> InnerMatcher</td></tr> 9358 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasType7"><pre>Overloaded to match the declaration of the expression's or value 9359 1.1 joerg declaration's type. 9360 1.1 joerg 9361 1.1 joerg In case of a value declaration (for example a variable declaration), 9362 1.1 joerg this resolves one layer of indirection. For example, in the value 9363 1.1 joerg declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of 9364 1.1 joerg X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the 9365 1.1 joerg declaration of x. 9366 1.1 joerg 9367 1.1 joerg Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 9368 1.1 joerg and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 9369 1.1 joerg and friend class X (matcher = friendDecl(hasType("X")) 9370 1.1.1.2 joerg and public virtual X (matcher = cxxBaseSpecifier(hasType( 9371 1.1.1.2 joerg cxxRecordDecl(hasName("X")))) 9372 1.1 joerg class X {}; 9373 1.1 joerg void y(X &x) { x; X z; } 9374 1.1 joerg class Y { friend class X; }; 9375 1.1.1.2 joerg class Z : public virtual X {}; 9376 1.1.1.2 joerg 9377 1.1.1.2 joerg Example matches class Derived 9378 1.1.1.2 joerg (matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base")))))) 9379 1.1.1.2 joerg class Base {}; 9380 1.1.1.2 joerg class Derived : Base {}; 9381 1.1 joerg 9382 1.1.1.2 joerg Usable as: Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FriendDecl.html">FriendDecl</a>>, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>>, 9383 1.1.1.2 joerg Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>> 9384 1.1 joerg </pre></td></tr> 9385 1.1 joerg 9386 1.1 joerg 9387 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>></td><td class="name" onclick="toggle('hasType3')"><a name="hasType3Anchor">hasType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> 9388 1.1 joerg <tr><td colspan="4" class="doc" id="hasType3"><pre>Matches if the expression's or declaration's type matches a type 9389 1.1 joerg matcher. 9390 1.1 joerg 9391 1.1 joerg Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) 9392 1.1 joerg and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) 9393 1.1 joerg and U (matcher = typedefDecl(hasType(asString("int"))) 9394 1.1 joerg and friend class X (matcher = friendDecl(hasType("X")) 9395 1.1.1.2 joerg and public virtual X (matcher = cxxBaseSpecifier(hasType( 9396 1.1.1.2 joerg asString("class X"))) 9397 1.1 joerg class X {}; 9398 1.1 joerg void y(X &x) { x; X z; } 9399 1.1 joerg typedef int U; 9400 1.1 joerg class Y { friend class X; }; 9401 1.1.1.2 joerg class Z : public virtual X {}; 9402 1.1 joerg </pre></td></tr> 9403 1.1 joerg 9404 1.1 joerg 9405 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('hasInitializer0')"><a name="hasInitializer0Anchor">hasInitializer</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 9406 1.1 joerg <tr><td colspan="4" class="doc" id="hasInitializer0"><pre>Matches a variable declaration that has an initializer expression 9407 1.1 joerg that matches the given matcher. 9408 1.1 joerg 9409 1.1 joerg Example matches x (matcher = varDecl(hasInitializer(callExpr()))) 9410 1.1 joerg bool y() { return true; } 9411 1.1 joerg bool x = y(); 9412 1.1 joerg </pre></td></tr> 9413 1.1 joerg 9414 1.1 joerg 9415 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1VariableArrayType.html">VariableArrayType</a>></td><td class="name" onclick="toggle('hasSizeExpr0')"><a name="hasSizeExpr0Anchor">hasSizeExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 9416 1.1 joerg <tr><td colspan="4" class="doc" id="hasSizeExpr0"><pre>Matches VariableArrayType nodes that have a specific size 9417 1.1 joerg expression. 9418 1.1 joerg 9419 1.1 joerg Given 9420 1.1 joerg void f(int b) { 9421 1.1 joerg int a[b]; 9422 1.1 joerg } 9423 1.1 joerg variableArrayType(hasSizeExpr(ignoringImpCasts(declRefExpr(to( 9424 1.1 joerg varDecl(hasName("b"))))))) 9425 1.1 joerg matches "int a[b]" 9426 1.1 joerg </pre></td></tr> 9427 1.1 joerg 9428 1.1 joerg 9429 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1WhileStmt.html">WhileStmt</a>></td><td class="name" onclick="toggle('hasBody2')"><a name="hasBody2Anchor">hasBody</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr> 9430 1.1.1.2 joerg <tr><td colspan="4" class="doc" id="hasBody2"><pre></pre></td></tr> 9431 1.1 joerg 9432 1.1 joerg 9433 1.1 joerg <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1WhileStmt.html">WhileStmt</a>></td><td class="name" onclick="toggle('hasCondition2')"><a name="hasCondition2Anchor">hasCondition</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> 9434 1.1 joerg <tr><td colspan="4" class="doc" id="hasCondition2"><pre>Matches the condition expression of an if statement, for loop, 9435 1.1 joerg switch statement or conditional operator. 9436 1.1 joerg 9437 1.1 joerg Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true)))) 9438 1.1 joerg if (true) {} 9439 1.1 joerg </pre></td></tr> 9440 1.1 joerg 9441 1.1 joerg <!--END_TRAVERSAL_MATCHERS --> 9442 1.1 joerg </table> 9443 1.1 joerg 9444 1.1 joerg </div> 9445 1.1 joerg </body> 9446 1.1 joerg </html> 9447 1.1 joerg 9448 1.1 joerg 9449