1 //===- ASTMatchers.h - Structural query framework ---------------*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 //  This file implements matchers to be used together with the MatchFinder to
10 //  match AST nodes.
11 //
12 //  Matchers are created by generator functions, which can be combined in
13 //  a functional in-language DSL to express queries over the C++ AST.
14 //
15 //  For example, to match a class with a certain name, one would call:
16 //    cxxRecordDecl(hasName("MyClass"))
17 //  which returns a matcher that can be used to find all AST nodes that declare
18 //  a class named 'MyClass'.
19 //
20 //  For more complicated match expressions we're often interested in accessing
21 //  multiple parts of the matched AST nodes once a match is found. In that case,
22 //  call `.bind("name")` on match expressions that match the nodes you want to
23 //  access.
24 //
25 //  For example, when we're interested in child classes of a certain class, we
26 //  would write:
27 //    cxxRecordDecl(hasName("MyClass"), has(recordDecl().bind("child")))
28 //  When the match is found via the MatchFinder, a user provided callback will
29 //  be called with a BoundNodes instance that contains a mapping from the
30 //  strings that we provided for the `.bind()` calls to the nodes that were
31 //  matched.
32 //  In the given example, each time our matcher finds a match we get a callback
33 //  where "child" is bound to the RecordDecl node of the matching child
34 //  class declaration.
35 //
36 //  See ASTMatchersInternal.h for a more in-depth explanation of the
37 //  implementation details of the matcher framework.
38 //
39 //  See ASTMatchFinder.h for how to use the generated matchers to run over
40 //  an AST.
41 //
42 //===----------------------------------------------------------------------===//
43 
44 #ifndef LLVM_CLANG_ASTMATCHERS_ASTMATCHERS_H
45 #define LLVM_CLANG_ASTMATCHERS_ASTMATCHERS_H
46 
47 #include "clang/AST/ASTContext.h"
48 #include "clang/AST/ASTTypeTraits.h"
49 #include "clang/AST/Attr.h"
50 #include "clang/AST/CXXInheritance.h"
51 #include "clang/AST/Decl.h"
52 #include "clang/AST/DeclCXX.h"
53 #include "clang/AST/DeclFriend.h"
54 #include "clang/AST/DeclObjC.h"
55 #include "clang/AST/DeclTemplate.h"
56 #include "clang/AST/Expr.h"
57 #include "clang/AST/ExprCXX.h"
58 #include "clang/AST/ExprObjC.h"
59 #include "clang/AST/LambdaCapture.h"
60 #include "clang/AST/NestedNameSpecifier.h"
61 #include "clang/AST/OpenMPClause.h"
62 #include "clang/AST/OperationKinds.h"
63 #include "clang/AST/ParentMapContext.h"
64 #include "clang/AST/Stmt.h"
65 #include "clang/AST/StmtCXX.h"
66 #include "clang/AST/StmtObjC.h"
67 #include "clang/AST/StmtOpenMP.h"
68 #include "clang/AST/TemplateBase.h"
69 #include "clang/AST/TemplateName.h"
70 #include "clang/AST/Type.h"
71 #include "clang/AST/TypeLoc.h"
72 #include "clang/ASTMatchers/ASTMatchersInternal.h"
73 #include "clang/ASTMatchers/ASTMatchersMacros.h"
74 #include "clang/Basic/AttrKinds.h"
75 #include "clang/Basic/ExceptionSpecificationType.h"
76 #include "clang/Basic/FileManager.h"
77 #include "clang/Basic/IdentifierTable.h"
78 #include "clang/Basic/LLVM.h"
79 #include "clang/Basic/SourceManager.h"
80 #include "clang/Basic/Specifiers.h"
81 #include "clang/Basic/TypeTraits.h"
82 #include "llvm/ADT/ArrayRef.h"
83 #include "llvm/ADT/SmallVector.h"
84 #include "llvm/ADT/StringRef.h"
85 #include "llvm/Support/Casting.h"
86 #include "llvm/Support/Compiler.h"
87 #include "llvm/Support/ErrorHandling.h"
88 #include "llvm/Support/Regex.h"
89 #include <cassert>
90 #include <cstddef>
91 #include <iterator>
92 #include <limits>
93 #include <optional>
94 #include <string>
95 #include <utility>
96 #include <vector>
97 
98 namespace clang {
99 namespace ast_matchers {
100 
101 /// Maps string IDs to AST nodes matched by parts of a matcher.
102 ///
103 /// The bound nodes are generated by calling \c bind("id") on the node matchers
104 /// of the nodes we want to access later.
105 ///
106 /// The instances of BoundNodes are created by \c MatchFinder when the user's
107 /// callbacks are executed every time a match is found.
108 class BoundNodes {
109 public:
110   /// Returns the AST node bound to \c ID.
111   ///
112   /// Returns NULL if there was no node bound to \c ID or if there is a node but
113   /// it cannot be converted to the specified type.
114   template <typename T>
getNodeAs(StringRef ID)115   const T *getNodeAs(StringRef ID) const {
116     return MyBoundNodes.getNodeAs<T>(ID);
117   }
118 
119   /// Type of mapping from binding identifiers to bound nodes. This type
120   /// is an associative container with a key type of \c std::string and a value
121   /// type of \c clang::DynTypedNode
122   using IDToNodeMap = internal::BoundNodesMap::IDToNodeMap;
123 
124   /// Retrieve mapping from binding identifiers to bound nodes.
getMap()125   const IDToNodeMap &getMap() const {
126     return MyBoundNodes.getMap();
127   }
128 
129 private:
130   friend class internal::BoundNodesTreeBuilder;
131 
132   /// Create BoundNodes from a pre-filled map of bindings.
BoundNodes(internal::BoundNodesMap & MyBoundNodes)133   BoundNodes(internal::BoundNodesMap &MyBoundNodes)
134       : MyBoundNodes(MyBoundNodes) {}
135 
136   internal::BoundNodesMap MyBoundNodes;
137 };
138 
139 /// Types of matchers for the top-level classes in the AST class
140 /// hierarchy.
141 /// @{
142 using DeclarationMatcher = internal::Matcher<Decl>;
143 using StatementMatcher = internal::Matcher<Stmt>;
144 using TypeMatcher = internal::Matcher<QualType>;
145 using TypeLocMatcher = internal::Matcher<TypeLoc>;
146 using NestedNameSpecifierMatcher = internal::Matcher<NestedNameSpecifier>;
147 using NestedNameSpecifierLocMatcher = internal::Matcher<NestedNameSpecifierLoc>;
148 using CXXBaseSpecifierMatcher = internal::Matcher<CXXBaseSpecifier>;
149 using CXXCtorInitializerMatcher = internal::Matcher<CXXCtorInitializer>;
150 using TemplateArgumentMatcher = internal::Matcher<TemplateArgument>;
151 using TemplateArgumentLocMatcher = internal::Matcher<TemplateArgumentLoc>;
152 using LambdaCaptureMatcher = internal::Matcher<LambdaCapture>;
153 using AttrMatcher = internal::Matcher<Attr>;
154 /// @}
155 
156 /// Matches any node.
157 ///
158 /// Useful when another matcher requires a child matcher, but there's no
159 /// additional constraint. This will often be used with an explicit conversion
160 /// to an \c internal::Matcher<> type such as \c TypeMatcher.
161 ///
162 /// Example: \c DeclarationMatcher(anything()) matches all declarations, e.g.,
163 /// \code
164 /// "int* p" and "void f()" in
165 ///   int* p;
166 ///   void f();
167 /// \endcode
168 ///
169 /// Usable as: Any Matcher
anything()170 inline internal::TrueMatcher anything() { return internal::TrueMatcher(); }
171 
172 /// Matches the top declaration context.
173 ///
174 /// Given
175 /// \code
176 ///   int X;
177 ///   namespace NS {
178 ///   int Y;
179 ///   }  // namespace NS
180 /// \endcode
181 /// decl(hasDeclContext(translationUnitDecl()))
182 ///   matches "int X", but not "int Y".
183 extern const internal::VariadicDynCastAllOfMatcher<Decl, TranslationUnitDecl>
184     translationUnitDecl;
185 
186 /// Matches typedef declarations.
187 ///
188 /// Given
189 /// \code
190 ///   typedef int X;
191 ///   using Y = int;
192 /// \endcode
193 /// typedefDecl()
194 ///   matches "typedef int X", but not "using Y = int"
195 extern const internal::VariadicDynCastAllOfMatcher<Decl, TypedefDecl>
196     typedefDecl;
197 
198 /// Matches typedef name declarations.
199 ///
200 /// Given
201 /// \code
202 ///   typedef int X;
203 ///   using Y = int;
204 /// \endcode
205 /// typedefNameDecl()
206 ///   matches "typedef int X" and "using Y = int"
207 extern const internal::VariadicDynCastAllOfMatcher<Decl, TypedefNameDecl>
208     typedefNameDecl;
209 
210 /// Matches type alias declarations.
211 ///
212 /// Given
213 /// \code
214 ///   typedef int X;
215 ///   using Y = int;
216 /// \endcode
217 /// typeAliasDecl()
218 ///   matches "using Y = int", but not "typedef int X"
219 extern const internal::VariadicDynCastAllOfMatcher<Decl, TypeAliasDecl>
220     typeAliasDecl;
221 
222 /// Matches type alias template declarations.
223 ///
224 /// typeAliasTemplateDecl() matches
225 /// \code
226 ///   template <typename T>
227 ///   using Y = X<T>;
228 /// \endcode
229 extern const internal::VariadicDynCastAllOfMatcher<Decl, TypeAliasTemplateDecl>
230     typeAliasTemplateDecl;
231 
232 /// Matches AST nodes that were expanded within the main-file.
233 ///
234 /// Example matches X but not Y
235 ///   (matcher = cxxRecordDecl(isExpansionInMainFile())
236 /// \code
237 ///   #include <Y.h>
238 ///   class X {};
239 /// \endcode
240 /// Y.h:
241 /// \code
242 ///   class Y {};
243 /// \endcode
244 ///
245 /// Usable as: Matcher<Decl>, Matcher<Stmt>, Matcher<TypeLoc>
AST_POLYMORPHIC_MATCHER(isExpansionInMainFile,AST_POLYMORPHIC_SUPPORTED_TYPES (Decl,Stmt,TypeLoc))246 AST_POLYMORPHIC_MATCHER(isExpansionInMainFile,
247                         AST_POLYMORPHIC_SUPPORTED_TYPES(Decl, Stmt, TypeLoc)) {
248   auto &SourceManager = Finder->getASTContext().getSourceManager();
249   return SourceManager.isInMainFile(
250       SourceManager.getExpansionLoc(Node.getBeginLoc()));
251 }
252 
253 /// Matches AST nodes that were expanded within system-header-files.
254 ///
255 /// Example matches Y but not X
256 ///     (matcher = cxxRecordDecl(isExpansionInSystemHeader())
257 /// \code
258 ///   #include <SystemHeader.h>
259 ///   class X {};
260 /// \endcode
261 /// SystemHeader.h:
262 /// \code
263 ///   class Y {};
264 /// \endcode
265 ///
266 /// Usable as: Matcher<Decl>, Matcher<Stmt>, Matcher<TypeLoc>
AST_POLYMORPHIC_MATCHER(isExpansionInSystemHeader,AST_POLYMORPHIC_SUPPORTED_TYPES (Decl,Stmt,TypeLoc))267 AST_POLYMORPHIC_MATCHER(isExpansionInSystemHeader,
268                         AST_POLYMORPHIC_SUPPORTED_TYPES(Decl, Stmt, TypeLoc)) {
269   auto &SourceManager = Finder->getASTContext().getSourceManager();
270   auto ExpansionLoc = SourceManager.getExpansionLoc(Node.getBeginLoc());
271   if (ExpansionLoc.isInvalid()) {
272     return false;
273   }
274   return SourceManager.isInSystemHeader(ExpansionLoc);
275 }
276 
277 /// Matches AST nodes that were expanded within files whose name is
278 /// partially matching a given regex.
279 ///
280 /// Example matches Y but not X
281 ///     (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
282 /// \code
283 ///   #include "ASTMatcher.h"
284 ///   class X {};
285 /// \endcode
286 /// ASTMatcher.h:
287 /// \code
288 ///   class Y {};
289 /// \endcode
290 ///
291 /// Usable as: Matcher<Decl>, Matcher<Stmt>, Matcher<TypeLoc>
AST_POLYMORPHIC_MATCHER_REGEX(isExpansionInFileMatching,AST_POLYMORPHIC_SUPPORTED_TYPES (Decl,Stmt,TypeLoc),RegExp)292 AST_POLYMORPHIC_MATCHER_REGEX(isExpansionInFileMatching,
293                               AST_POLYMORPHIC_SUPPORTED_TYPES(Decl, Stmt,
294                                                               TypeLoc),
295                               RegExp) {
296   auto &SourceManager = Finder->getASTContext().getSourceManager();
297   auto ExpansionLoc = SourceManager.getExpansionLoc(Node.getBeginLoc());
298   if (ExpansionLoc.isInvalid()) {
299     return false;
300   }
301   auto FileEntry =
302       SourceManager.getFileEntryForID(SourceManager.getFileID(ExpansionLoc));
303   if (!FileEntry) {
304     return false;
305   }
306 
307   auto Filename = FileEntry->getName();
308   return RegExp->match(Filename);
309 }
310 
311 /// Matches statements that are (transitively) expanded from the named macro.
312 /// Does not match if only part of the statement is expanded from that macro or
313 /// if different parts of the statement are expanded from different
314 /// appearances of the macro.
AST_POLYMORPHIC_MATCHER_P(isExpandedFromMacro,AST_POLYMORPHIC_SUPPORTED_TYPES (Decl,Stmt,TypeLoc),std::string,MacroName)315 AST_POLYMORPHIC_MATCHER_P(isExpandedFromMacro,
316                           AST_POLYMORPHIC_SUPPORTED_TYPES(Decl, Stmt, TypeLoc),
317                           std::string, MacroName) {
318   // Verifies that the statement' beginning and ending are both expanded from
319   // the same instance of the given macro.
320   auto& Context = Finder->getASTContext();
321   std::optional<SourceLocation> B =
322       internal::getExpansionLocOfMacro(MacroName, Node.getBeginLoc(), Context);
323   if (!B) return false;
324   std::optional<SourceLocation> E =
325       internal::getExpansionLocOfMacro(MacroName, Node.getEndLoc(), Context);
326   if (!E) return false;
327   return *B == *E;
328 }
329 
330 /// Matches declarations.
331 ///
332 /// Examples matches \c X, \c C, and the friend declaration inside \c C;
333 /// \code
334 ///   void X();
335 ///   class C {
336 ///     friend X;
337 ///   };
338 /// \endcode
339 extern const internal::VariadicAllOfMatcher<Decl> decl;
340 
341 /// Matches decomposition-declarations.
342 ///
343 /// Examples matches the declaration node with \c foo and \c bar, but not
344 /// \c number.
345 /// (matcher = declStmt(has(decompositionDecl())))
346 ///
347 /// \code
348 ///   int number = 42;
349 ///   auto [foo, bar] = std::make_pair{42, 42};
350 /// \endcode
351 extern const internal::VariadicDynCastAllOfMatcher<Decl, DecompositionDecl>
352     decompositionDecl;
353 
354 /// Matches binding declarations
355 /// Example matches \c foo and \c bar
356 /// (matcher = bindingDecl()
357 ///
358 /// \code
359 ///   auto [foo, bar] = std::make_pair{42, 42};
360 /// \endcode
361 extern const internal::VariadicDynCastAllOfMatcher<Decl, BindingDecl>
362     bindingDecl;
363 
364 /// Matches a declaration of a linkage specification.
365 ///
366 /// Given
367 /// \code
368 ///   extern "C" {}
369 /// \endcode
370 /// linkageSpecDecl()
371 ///   matches "extern "C" {}"
372 extern const internal::VariadicDynCastAllOfMatcher<Decl, LinkageSpecDecl>
373     linkageSpecDecl;
374 
375 /// Matches a declaration of anything that could have a name.
376 ///
377 /// Example matches \c X, \c S, the anonymous union type, \c i, and \c U;
378 /// \code
379 ///   typedef int X;
380 ///   struct S {
381 ///     union {
382 ///       int i;
383 ///     } U;
384 ///   };
385 /// \endcode
386 extern const internal::VariadicDynCastAllOfMatcher<Decl, NamedDecl> namedDecl;
387 
388 /// Matches a declaration of label.
389 ///
390 /// Given
391 /// \code
392 ///   goto FOO;
393 ///   FOO: bar();
394 /// \endcode
395 /// labelDecl()
396 ///   matches 'FOO:'
397 extern const internal::VariadicDynCastAllOfMatcher<Decl, LabelDecl> labelDecl;
398 
399 /// Matches a declaration of a namespace.
400 ///
401 /// Given
402 /// \code
403 ///   namespace {}
404 ///   namespace test {}
405 /// \endcode
406 /// namespaceDecl()
407 ///   matches "namespace {}" and "namespace test {}"
408 extern const internal::VariadicDynCastAllOfMatcher<Decl, NamespaceDecl>
409     namespaceDecl;
410 
411 /// Matches a declaration of a namespace alias.
412 ///
413 /// Given
414 /// \code
415 ///   namespace test {}
416 ///   namespace alias = ::test;
417 /// \endcode
418 /// namespaceAliasDecl()
419 ///   matches "namespace alias" but not "namespace test"
420 extern const internal::VariadicDynCastAllOfMatcher<Decl, NamespaceAliasDecl>
421     namespaceAliasDecl;
422 
423 /// Matches class, struct, and union declarations.
424 ///
425 /// Example matches \c X, \c Z, \c U, and \c S
426 /// \code
427 ///   class X;
428 ///   template<class T> class Z {};
429 ///   struct S {};
430 ///   union U {};
431 /// \endcode
432 extern const internal::VariadicDynCastAllOfMatcher<Decl, RecordDecl> recordDecl;
433 
434 /// Matches C++ class declarations.
435 ///
436 /// Example matches \c X, \c Z
437 /// \code
438 ///   class X;
439 ///   template<class T> class Z {};
440 /// \endcode
441 extern const internal::VariadicDynCastAllOfMatcher<Decl, CXXRecordDecl>
442     cxxRecordDecl;
443 
444 /// Matches C++ class template declarations.
445 ///
446 /// Example matches \c Z
447 /// \code
448 ///   template<class T> class Z {};
449 /// \endcode
450 extern const internal::VariadicDynCastAllOfMatcher<Decl, ClassTemplateDecl>
451     classTemplateDecl;
452 
453 /// Matches C++ class template specializations.
454 ///
455 /// Given
456 /// \code
457 ///   template<typename T> class A {};
458 ///   template<> class A<double> {};
459 ///   A<int> a;
460 /// \endcode
461 /// classTemplateSpecializationDecl()
462 ///   matches the specializations \c A<int> and \c A<double>
463 extern const internal::VariadicDynCastAllOfMatcher<
464     Decl, ClassTemplateSpecializationDecl>
465     classTemplateSpecializationDecl;
466 
467 /// Matches C++ class template partial specializations.
468 ///
469 /// Given
470 /// \code
471 ///   template<class T1, class T2, int I>
472 ///   class A {};
473 ///
474 ///   template<class T, int I>
475 ///   class A<T, T*, I> {};
476 ///
477 ///   template<>
478 ///   class A<int, int, 1> {};
479 /// \endcode
480 /// classTemplatePartialSpecializationDecl()
481 ///   matches the specialization \c A<T,T*,I> but not \c A<int,int,1>
482 extern const internal::VariadicDynCastAllOfMatcher<
483     Decl, ClassTemplatePartialSpecializationDecl>
484     classTemplatePartialSpecializationDecl;
485 
486 /// Matches declarator declarations (field, variable, function
487 /// and non-type template parameter declarations).
488 ///
489 /// Given
490 /// \code
491 ///   class X { int y; };
492 /// \endcode
493 /// declaratorDecl()
494 ///   matches \c int y.
495 extern const internal::VariadicDynCastAllOfMatcher<Decl, DeclaratorDecl>
496     declaratorDecl;
497 
498 /// Matches parameter variable declarations.
499 ///
500 /// Given
501 /// \code
502 ///   void f(int x);
503 /// \endcode
504 /// parmVarDecl()
505 ///   matches \c int x.
506 extern const internal::VariadicDynCastAllOfMatcher<Decl, ParmVarDecl>
507     parmVarDecl;
508 
509 /// Matches C++ access specifier declarations.
510 ///
511 /// Given
512 /// \code
513 ///   class C {
514 ///   public:
515 ///     int a;
516 ///   };
517 /// \endcode
518 /// accessSpecDecl()
519 ///   matches 'public:'
520 extern const internal::VariadicDynCastAllOfMatcher<Decl, AccessSpecDecl>
521     accessSpecDecl;
522 
523 /// Matches class bases.
524 ///
525 /// Examples matches \c public virtual B.
526 /// \code
527 ///   class B {};
528 ///   class C : public virtual B {};
529 /// \endcode
530 extern const internal::VariadicAllOfMatcher<CXXBaseSpecifier> cxxBaseSpecifier;
531 
532 /// Matches constructor initializers.
533 ///
534 /// Examples matches \c i(42).
535 /// \code
536 ///   class C {
537 ///     C() : i(42) {}
538 ///     int i;
539 ///   };
540 /// \endcode
541 extern const internal::VariadicAllOfMatcher<CXXCtorInitializer>
542     cxxCtorInitializer;
543 
544 /// Matches template arguments.
545 ///
546 /// Given
547 /// \code
548 ///   template <typename T> struct C {};
549 ///   C<int> c;
550 /// \endcode
551 /// templateArgument()
552 ///   matches 'int' in C<int>.
553 extern const internal::VariadicAllOfMatcher<TemplateArgument> templateArgument;
554 
555 /// Matches template arguments (with location info).
556 ///
557 /// Given
558 /// \code
559 ///   template <typename T> struct C {};
560 ///   C<int> c;
561 /// \endcode
562 /// templateArgumentLoc()
563 ///   matches 'int' in C<int>.
564 extern const internal::VariadicAllOfMatcher<TemplateArgumentLoc>
565     templateArgumentLoc;
566 
567 /// Matches template name.
568 ///
569 /// Given
570 /// \code
571 ///   template <typename T> class X { };
572 ///   X<int> xi;
573 /// \endcode
574 /// templateName()
575 ///   matches 'X' in X<int>.
576 extern const internal::VariadicAllOfMatcher<TemplateName> templateName;
577 
578 /// Matches non-type template parameter declarations.
579 ///
580 /// Given
581 /// \code
582 ///   template <typename T, int N> struct C {};
583 /// \endcode
584 /// nonTypeTemplateParmDecl()
585 ///   matches 'N', but not 'T'.
586 extern const internal::VariadicDynCastAllOfMatcher<Decl,
587                                                    NonTypeTemplateParmDecl>
588     nonTypeTemplateParmDecl;
589 
590 /// Matches template type parameter declarations.
591 ///
592 /// Given
593 /// \code
594 ///   template <typename T, int N> struct C {};
595 /// \endcode
596 /// templateTypeParmDecl()
597 ///   matches 'T', but not 'N'.
598 extern const internal::VariadicDynCastAllOfMatcher<Decl, TemplateTypeParmDecl>
599     templateTypeParmDecl;
600 
601 /// Matches template template parameter declarations.
602 ///
603 /// Given
604 /// \code
605 ///   template <template <typename> class Z, int N> struct C {};
606 /// \endcode
607 /// templateTypeParmDecl()
608 ///   matches 'Z', but not 'N'.
609 extern const internal::VariadicDynCastAllOfMatcher<Decl,
610                                                    TemplateTemplateParmDecl>
611     templateTemplateParmDecl;
612 
613 /// Matches public C++ declarations and C++ base specifers that specify public
614 /// inheritance.
615 ///
616 /// Examples:
617 /// \code
618 ///   class C {
619 ///   public:    int a; // fieldDecl(isPublic()) matches 'a'
620 ///   protected: int b;
621 ///   private:   int c;
622 ///   };
623 /// \endcode
624 ///
625 /// \code
626 ///   class Base {};
627 ///   class Derived1 : public Base {}; // matches 'Base'
628 ///   struct Derived2 : Base {}; // matches 'Base'
629 /// \endcode
AST_POLYMORPHIC_MATCHER(isPublic,AST_POLYMORPHIC_SUPPORTED_TYPES (Decl,CXXBaseSpecifier))630 AST_POLYMORPHIC_MATCHER(isPublic,
631                         AST_POLYMORPHIC_SUPPORTED_TYPES(Decl,
632                                                         CXXBaseSpecifier)) {
633   return getAccessSpecifier(Node) == AS_public;
634 }
635 
636 /// Matches protected C++ declarations and C++ base specifers that specify
637 /// protected inheritance.
638 ///
639 /// Examples:
640 /// \code
641 ///   class C {
642 ///   public:    int a;
643 ///   protected: int b; // fieldDecl(isProtected()) matches 'b'
644 ///   private:   int c;
645 ///   };
646 /// \endcode
647 ///
648 /// \code
649 ///   class Base {};
650 ///   class Derived : protected Base {}; // matches 'Base'
651 /// \endcode
AST_POLYMORPHIC_MATCHER(isProtected,AST_POLYMORPHIC_SUPPORTED_TYPES (Decl,CXXBaseSpecifier))652 AST_POLYMORPHIC_MATCHER(isProtected,
653                         AST_POLYMORPHIC_SUPPORTED_TYPES(Decl,
654                                                         CXXBaseSpecifier)) {
655   return getAccessSpecifier(Node) == AS_protected;
656 }
657 
658 /// Matches private C++ declarations and C++ base specifers that specify private
659 /// inheritance.
660 ///
661 /// Examples:
662 /// \code
663 ///   class C {
664 ///   public:    int a;
665 ///   protected: int b;
666 ///   private:   int c; // fieldDecl(isPrivate()) matches 'c'
667 ///   };
668 /// \endcode
669 ///
670 /// \code
671 ///   struct Base {};
672 ///   struct Derived1 : private Base {}; // matches 'Base'
673 ///   class Derived2 : Base {}; // matches 'Base'
674 /// \endcode
AST_POLYMORPHIC_MATCHER(isPrivate,AST_POLYMORPHIC_SUPPORTED_TYPES (Decl,CXXBaseSpecifier))675 AST_POLYMORPHIC_MATCHER(isPrivate,
676                         AST_POLYMORPHIC_SUPPORTED_TYPES(Decl,
677                                                         CXXBaseSpecifier)) {
678   return getAccessSpecifier(Node) == AS_private;
679 }
680 
681 /// Matches non-static data members that are bit-fields.
682 ///
683 /// Given
684 /// \code
685 ///   class C {
686 ///     int a : 2;
687 ///     int b;
688 ///   };
689 /// \endcode
690 /// fieldDecl(isBitField())
691 ///   matches 'int a;' but not 'int b;'.
AST_MATCHER(FieldDecl,isBitField)692 AST_MATCHER(FieldDecl, isBitField) {
693   return Node.isBitField();
694 }
695 
696 /// Matches non-static data members that are bit-fields of the specified
697 /// bit width.
698 ///
699 /// Given
700 /// \code
701 ///   class C {
702 ///     int a : 2;
703 ///     int b : 4;
704 ///     int c : 2;
705 ///   };
706 /// \endcode
707 /// fieldDecl(hasBitWidth(2))
708 ///   matches 'int a;' and 'int c;' but not 'int b;'.
AST_MATCHER_P(FieldDecl,hasBitWidth,unsigned,Width)709 AST_MATCHER_P(FieldDecl, hasBitWidth, unsigned, Width) {
710   return Node.isBitField() &&
711          Node.getBitWidthValue(Finder->getASTContext()) == Width;
712 }
713 
714 /// Matches non-static data members that have an in-class initializer.
715 ///
716 /// Given
717 /// \code
718 ///   class C {
719 ///     int a = 2;
720 ///     int b = 3;
721 ///     int c;
722 ///   };
723 /// \endcode
724 /// fieldDecl(hasInClassInitializer(integerLiteral(equals(2))))
725 ///   matches 'int a;' but not 'int b;'.
726 /// fieldDecl(hasInClassInitializer(anything()))
727 ///   matches 'int a;' and 'int b;' but not 'int c;'.
AST_MATCHER_P(FieldDecl,hasInClassInitializer,internal::Matcher<Expr>,InnerMatcher)728 AST_MATCHER_P(FieldDecl, hasInClassInitializer, internal::Matcher<Expr>,
729               InnerMatcher) {
730   const Expr *Initializer = Node.getInClassInitializer();
731   return (Initializer != nullptr &&
732           InnerMatcher.matches(*Initializer, Finder, Builder));
733 }
734 
735 /// Determines whether the function is "main", which is the entry point
736 /// into an executable program.
AST_MATCHER(FunctionDecl,isMain)737 AST_MATCHER(FunctionDecl, isMain) {
738   return Node.isMain();
739 }
740 
741 /// Matches the specialized template of a specialization declaration.
742 ///
743 /// Given
744 /// \code
745 ///   template<typename T> class A {}; #1
746 ///   template<> class A<int> {}; #2
747 /// \endcode
748 /// classTemplateSpecializationDecl(hasSpecializedTemplate(classTemplateDecl()))
749 ///   matches '#2' with classTemplateDecl() matching the class template
750 ///   declaration of 'A' at #1.
AST_MATCHER_P(ClassTemplateSpecializationDecl,hasSpecializedTemplate,internal::Matcher<ClassTemplateDecl>,InnerMatcher)751 AST_MATCHER_P(ClassTemplateSpecializationDecl, hasSpecializedTemplate,
752               internal::Matcher<ClassTemplateDecl>, InnerMatcher) {
753   const ClassTemplateDecl* Decl = Node.getSpecializedTemplate();
754   return (Decl != nullptr &&
755           InnerMatcher.matches(*Decl, Finder, Builder));
756 }
757 
758 /// Matches an entity that has been implicitly added by the compiler (e.g.
759 /// implicit default/copy constructors).
AST_POLYMORPHIC_MATCHER(isImplicit,AST_POLYMORPHIC_SUPPORTED_TYPES (Decl,Attr,LambdaCapture))760 AST_POLYMORPHIC_MATCHER(isImplicit,
761                         AST_POLYMORPHIC_SUPPORTED_TYPES(Decl, Attr,
762                                                         LambdaCapture)) {
763   return Node.isImplicit();
764 }
765 
766 /// Matches classTemplateSpecializations, templateSpecializationType and
767 /// functionDecl that have at least one TemplateArgument matching the given
768 /// InnerMatcher.
769 ///
770 /// Given
771 /// \code
772 ///   template<typename T> class A {};
773 ///   template<> class A<double> {};
774 ///   A<int> a;
775 ///
776 ///   template<typename T> f() {};
777 ///   void func() { f<int>(); };
778 /// \endcode
779 ///
780 /// \endcode
781 /// classTemplateSpecializationDecl(hasAnyTemplateArgument(
782 ///     refersToType(asString("int"))))
783 ///   matches the specialization \c A<int>
784 ///
785 /// functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
786 ///   matches the specialization \c f<int>
AST_POLYMORPHIC_MATCHER_P(hasAnyTemplateArgument,AST_POLYMORPHIC_SUPPORTED_TYPES (ClassTemplateSpecializationDecl,TemplateSpecializationType,FunctionDecl),internal::Matcher<TemplateArgument>,InnerMatcher)787 AST_POLYMORPHIC_MATCHER_P(
788     hasAnyTemplateArgument,
789     AST_POLYMORPHIC_SUPPORTED_TYPES(ClassTemplateSpecializationDecl,
790                                     TemplateSpecializationType,
791                                     FunctionDecl),
792     internal::Matcher<TemplateArgument>, InnerMatcher) {
793   ArrayRef<TemplateArgument> List =
794       internal::getTemplateSpecializationArgs(Node);
795   return matchesFirstInRange(InnerMatcher, List.begin(), List.end(), Finder,
796                              Builder) != List.end();
797 }
798 
799 /// Causes all nested matchers to be matched with the specified traversal kind.
800 ///
801 /// Given
802 /// \code
803 ///   void foo()
804 ///   {
805 ///       int i = 3.0;
806 ///   }
807 /// \endcode
808 /// The matcher
809 /// \code
810 ///   traverse(TK_IgnoreUnlessSpelledInSource,
811 ///     varDecl(hasInitializer(floatLiteral().bind("init")))
812 ///   )
813 /// \endcode
814 /// matches the variable declaration with "init" bound to the "3.0".
815 template <typename T>
traverse(TraversalKind TK,const internal::Matcher<T> & InnerMatcher)816 internal::Matcher<T> traverse(TraversalKind TK,
817                               const internal::Matcher<T> &InnerMatcher) {
818   return internal::DynTypedMatcher::constructRestrictedWrapper(
819              new internal::TraversalMatcher<T>(TK, InnerMatcher),
820              InnerMatcher.getID().first)
821       .template unconditionalConvertTo<T>();
822 }
823 
824 template <typename T>
825 internal::BindableMatcher<T>
traverse(TraversalKind TK,const internal::BindableMatcher<T> & InnerMatcher)826 traverse(TraversalKind TK, const internal::BindableMatcher<T> &InnerMatcher) {
827   return internal::BindableMatcher<T>(
828       internal::DynTypedMatcher::constructRestrictedWrapper(
829           new internal::TraversalMatcher<T>(TK, InnerMatcher),
830           InnerMatcher.getID().first)
831           .template unconditionalConvertTo<T>());
832 }
833 
834 template <typename... T>
835 internal::TraversalWrapper<internal::VariadicOperatorMatcher<T...>>
traverse(TraversalKind TK,const internal::VariadicOperatorMatcher<T...> & InnerMatcher)836 traverse(TraversalKind TK,
837          const internal::VariadicOperatorMatcher<T...> &InnerMatcher) {
838   return internal::TraversalWrapper<internal::VariadicOperatorMatcher<T...>>(
839       TK, InnerMatcher);
840 }
841 
842 template <template <typename ToArg, typename FromArg> class ArgumentAdapterT,
843           typename T, typename ToTypes>
844 internal::TraversalWrapper<
845     internal::ArgumentAdaptingMatcherFuncAdaptor<ArgumentAdapterT, T, ToTypes>>
traverse(TraversalKind TK,const internal::ArgumentAdaptingMatcherFuncAdaptor<ArgumentAdapterT,T,ToTypes> & InnerMatcher)846 traverse(TraversalKind TK, const internal::ArgumentAdaptingMatcherFuncAdaptor<
847                                ArgumentAdapterT, T, ToTypes> &InnerMatcher) {
848   return internal::TraversalWrapper<
849       internal::ArgumentAdaptingMatcherFuncAdaptor<ArgumentAdapterT, T,
850                                                    ToTypes>>(TK, InnerMatcher);
851 }
852 
853 template <template <typename T, typename... P> class MatcherT, typename... P,
854           typename ReturnTypesF>
855 internal::TraversalWrapper<
856     internal::PolymorphicMatcher<MatcherT, ReturnTypesF, P...>>
traverse(TraversalKind TK,const internal::PolymorphicMatcher<MatcherT,ReturnTypesF,P...> & InnerMatcher)857 traverse(TraversalKind TK,
858          const internal::PolymorphicMatcher<MatcherT, ReturnTypesF, P...>
859              &InnerMatcher) {
860   return internal::TraversalWrapper<
861       internal::PolymorphicMatcher<MatcherT, ReturnTypesF, P...>>(TK,
862                                                                   InnerMatcher);
863 }
864 
865 template <typename... T>
866 internal::Matcher<typename internal::GetClade<T...>::Type>
traverse(TraversalKind TK,const internal::MapAnyOfHelper<T...> & InnerMatcher)867 traverse(TraversalKind TK, const internal::MapAnyOfHelper<T...> &InnerMatcher) {
868   return traverse(TK, InnerMatcher.with());
869 }
870 
871 /// Matches expressions that match InnerMatcher after any implicit AST
872 /// nodes are stripped off.
873 ///
874 /// Parentheses and explicit casts are not discarded.
875 /// Given
876 /// \code
877 ///   class C {};
878 ///   C a = C();
879 ///   C b;
880 ///   C c = b;
881 /// \endcode
882 /// The matchers
883 /// \code
884 ///    varDecl(hasInitializer(ignoringImplicit(cxxConstructExpr())))
885 /// \endcode
886 /// would match the declarations for a, b, and c.
887 /// While
888 /// \code
889 ///    varDecl(hasInitializer(cxxConstructExpr()))
890 /// \endcode
891 /// only match the declarations for b and c.
AST_MATCHER_P(Expr,ignoringImplicit,internal::Matcher<Expr>,InnerMatcher)892 AST_MATCHER_P(Expr, ignoringImplicit, internal::Matcher<Expr>,
893               InnerMatcher) {
894   return InnerMatcher.matches(*Node.IgnoreImplicit(), Finder, Builder);
895 }
896 
897 /// Matches expressions that match InnerMatcher after any implicit casts
898 /// are stripped off.
899 ///
900 /// Parentheses and explicit casts are not discarded.
901 /// Given
902 /// \code
903 ///   int arr[5];
904 ///   int a = 0;
905 ///   char b = 0;
906 ///   const int c = a;
907 ///   int *d = arr;
908 ///   long e = (long) 0l;
909 /// \endcode
910 /// The matchers
911 /// \code
912 ///    varDecl(hasInitializer(ignoringImpCasts(integerLiteral())))
913 ///    varDecl(hasInitializer(ignoringImpCasts(declRefExpr())))
914 /// \endcode
915 /// would match the declarations for a, b, c, and d, but not e.
916 /// While
917 /// \code
918 ///    varDecl(hasInitializer(integerLiteral()))
919 ///    varDecl(hasInitializer(declRefExpr()))
920 /// \endcode
921 /// only match the declarations for a.
AST_MATCHER_P(Expr,ignoringImpCasts,internal::Matcher<Expr>,InnerMatcher)922 AST_MATCHER_P(Expr, ignoringImpCasts,
923               internal::Matcher<Expr>, InnerMatcher) {
924   return InnerMatcher.matches(*Node.IgnoreImpCasts(), Finder, Builder);
925 }
926 
927 /// Matches expressions that match InnerMatcher after parentheses and
928 /// casts are stripped off.
929 ///
930 /// Implicit and non-C Style casts are also discarded.
931 /// Given
932 /// \code
933 ///   int a = 0;
934 ///   char b = (0);
935 ///   void* c = reinterpret_cast<char*>(0);
936 ///   char d = char(0);
937 /// \endcode
938 /// The matcher
939 ///    varDecl(hasInitializer(ignoringParenCasts(integerLiteral())))
940 /// would match the declarations for a, b, c, and d.
941 /// while
942 ///    varDecl(hasInitializer(integerLiteral()))
943 /// only match the declaration for a.
AST_MATCHER_P(Expr,ignoringParenCasts,internal::Matcher<Expr>,InnerMatcher)944 AST_MATCHER_P(Expr, ignoringParenCasts, internal::Matcher<Expr>, InnerMatcher) {
945   return InnerMatcher.matches(*Node.IgnoreParenCasts(), Finder, Builder);
946 }
947 
948 /// Matches expressions that match InnerMatcher after implicit casts and
949 /// parentheses are stripped off.
950 ///
951 /// Explicit casts are not discarded.
952 /// Given
953 /// \code
954 ///   int arr[5];
955 ///   int a = 0;
956 ///   char b = (0);
957 ///   const int c = a;
958 ///   int *d = (arr);
959 ///   long e = ((long) 0l);
960 /// \endcode
961 /// The matchers
962 ///    varDecl(hasInitializer(ignoringParenImpCasts(integerLiteral())))
963 ///    varDecl(hasInitializer(ignoringParenImpCasts(declRefExpr())))
964 /// would match the declarations for a, b, c, and d, but not e.
965 /// while
966 ///    varDecl(hasInitializer(integerLiteral()))
967 ///    varDecl(hasInitializer(declRefExpr()))
968 /// would only match the declaration for a.
AST_MATCHER_P(Expr,ignoringParenImpCasts,internal::Matcher<Expr>,InnerMatcher)969 AST_MATCHER_P(Expr, ignoringParenImpCasts,
970               internal::Matcher<Expr>, InnerMatcher) {
971   return InnerMatcher.matches(*Node.IgnoreParenImpCasts(), Finder, Builder);
972 }
973 
974 /// Matches types that match InnerMatcher after any parens are stripped.
975 ///
976 /// Given
977 /// \code
978 ///   void (*fp)(void);
979 /// \endcode
980 /// The matcher
981 /// \code
982 ///   varDecl(hasType(pointerType(pointee(ignoringParens(functionType())))))
983 /// \endcode
984 /// would match the declaration for fp.
985 AST_MATCHER_P_OVERLOAD(QualType, ignoringParens, internal::Matcher<QualType>,
986                        InnerMatcher, 0) {
987   return InnerMatcher.matches(Node.IgnoreParens(), Finder, Builder);
988 }
989 
990 /// Overload \c ignoringParens for \c Expr.
991 ///
992 /// Given
993 /// \code
994 ///   const char* str = ("my-string");
995 /// \endcode
996 /// The matcher
997 /// \code
998 ///   implicitCastExpr(hasSourceExpression(ignoringParens(stringLiteral())))
999 /// \endcode
1000 /// would match the implicit cast resulting from the assignment.
1001 AST_MATCHER_P_OVERLOAD(Expr, ignoringParens, internal::Matcher<Expr>,
1002                        InnerMatcher, 1) {
1003   const Expr *E = Node.IgnoreParens();
1004   return InnerMatcher.matches(*E, Finder, Builder);
1005 }
1006 
1007 /// Matches expressions that are instantiation-dependent even if it is
1008 /// neither type- nor value-dependent.
1009 ///
1010 /// In the following example, the expression sizeof(sizeof(T() + T()))
1011 /// is instantiation-dependent (since it involves a template parameter T),
1012 /// but is neither type- nor value-dependent, since the type of the inner
1013 /// sizeof is known (std::size_t) and therefore the size of the outer
1014 /// sizeof is known.
1015 /// \code
1016 ///   template<typename T>
1017 ///   void f(T x, T y) { sizeof(sizeof(T() + T()); }
1018 /// \endcode
1019 /// expr(isInstantiationDependent()) matches sizeof(sizeof(T() + T())
AST_MATCHER(Expr,isInstantiationDependent)1020 AST_MATCHER(Expr, isInstantiationDependent) {
1021   return Node.isInstantiationDependent();
1022 }
1023 
1024 /// Matches expressions that are type-dependent because the template type
1025 /// is not yet instantiated.
1026 ///
1027 /// For example, the expressions "x" and "x + y" are type-dependent in
1028 /// the following code, but "y" is not type-dependent:
1029 /// \code
1030 ///   template<typename T>
1031 ///   void add(T x, int y) {
1032 ///     x + y;
1033 ///   }
1034 /// \endcode
1035 /// expr(isTypeDependent()) matches x + y
AST_MATCHER(Expr,isTypeDependent)1036 AST_MATCHER(Expr, isTypeDependent) { return Node.isTypeDependent(); }
1037 
1038 /// Matches expression that are value-dependent because they contain a
1039 /// non-type template parameter.
1040 ///
1041 /// For example, the array bound of "Chars" in the following example is
1042 /// value-dependent.
1043 /// \code
1044 ///   template<int Size> int f() { return Size; }
1045 /// \endcode
1046 /// expr(isValueDependent()) matches return Size
AST_MATCHER(Expr,isValueDependent)1047 AST_MATCHER(Expr, isValueDependent) { return Node.isValueDependent(); }
1048 
1049 /// Matches classTemplateSpecializations, templateSpecializationType and
1050 /// functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
1051 ///
1052 /// Given
1053 /// \code
1054 ///   template<typename T, typename U> class A {};
1055 ///   A<bool, int> b;
1056 ///   A<int, bool> c;
1057 ///
1058 ///   template<typename T> void f() {}
1059 ///   void func() { f<int>(); };
1060 /// \endcode
1061 /// classTemplateSpecializationDecl(hasTemplateArgument(
1062 ///     1, refersToType(asString("int"))))
1063 ///   matches the specialization \c A<bool, int>
1064 ///
1065 /// functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
1066 ///   matches the specialization \c f<int>
AST_POLYMORPHIC_MATCHER_P2(hasTemplateArgument,AST_POLYMORPHIC_SUPPORTED_TYPES (ClassTemplateSpecializationDecl,TemplateSpecializationType,FunctionDecl),unsigned,N,internal::Matcher<TemplateArgument>,InnerMatcher)1067 AST_POLYMORPHIC_MATCHER_P2(
1068     hasTemplateArgument,
1069     AST_POLYMORPHIC_SUPPORTED_TYPES(ClassTemplateSpecializationDecl,
1070                                     TemplateSpecializationType,
1071                                     FunctionDecl),
1072     unsigned, N, internal::Matcher<TemplateArgument>, InnerMatcher) {
1073   ArrayRef<TemplateArgument> List =
1074       internal::getTemplateSpecializationArgs(Node);
1075   if (List.size() <= N)
1076     return false;
1077   return InnerMatcher.matches(List[N], Finder, Builder);
1078 }
1079 
1080 /// Matches if the number of template arguments equals \p N.
1081 ///
1082 /// Given
1083 /// \code
1084 ///   template<typename T> struct C {};
1085 ///   C<int> c;
1086 /// \endcode
1087 /// classTemplateSpecializationDecl(templateArgumentCountIs(1))
1088 ///   matches C<int>.
AST_POLYMORPHIC_MATCHER_P(templateArgumentCountIs,AST_POLYMORPHIC_SUPPORTED_TYPES (ClassTemplateSpecializationDecl,TemplateSpecializationType),unsigned,N)1089 AST_POLYMORPHIC_MATCHER_P(
1090     templateArgumentCountIs,
1091     AST_POLYMORPHIC_SUPPORTED_TYPES(ClassTemplateSpecializationDecl,
1092                                     TemplateSpecializationType),
1093     unsigned, N) {
1094   return internal::getTemplateSpecializationArgs(Node).size() == N;
1095 }
1096 
1097 /// Matches a TemplateArgument that refers to a certain type.
1098 ///
1099 /// Given
1100 /// \code
1101 ///   struct X {};
1102 ///   template<typename T> struct A {};
1103 ///   A<X> a;
1104 /// \endcode
1105 /// classTemplateSpecializationDecl(hasAnyTemplateArgument(refersToType(
1106 ///   recordType(hasDeclaration(recordDecl(hasName("X")))))))
1107 /// matches the specialization of \c struct A generated by \c A<X>.
AST_MATCHER_P(TemplateArgument,refersToType,internal::Matcher<QualType>,InnerMatcher)1108 AST_MATCHER_P(TemplateArgument, refersToType,
1109               internal::Matcher<QualType>, InnerMatcher) {
1110   if (Node.getKind() != TemplateArgument::Type)
1111     return false;
1112   return InnerMatcher.matches(Node.getAsType(), Finder, Builder);
1113 }
1114 
1115 /// Matches a TemplateArgument that refers to a certain template.
1116 ///
1117 /// Given
1118 /// \code
1119 ///   template<template <typename> class S> class X {};
1120 ///   template<typename T> class Y {};
1121 ///   X<Y> xi;
1122 /// \endcode
1123 /// classTemplateSpecializationDecl(hasAnyTemplateArgument(
1124 ///     refersToTemplate(templateName())))
1125 ///   matches the specialization \c X<Y>
AST_MATCHER_P(TemplateArgument,refersToTemplate,internal::Matcher<TemplateName>,InnerMatcher)1126 AST_MATCHER_P(TemplateArgument, refersToTemplate,
1127               internal::Matcher<TemplateName>, InnerMatcher) {
1128   if (Node.getKind() != TemplateArgument::Template)
1129     return false;
1130   return InnerMatcher.matches(Node.getAsTemplate(), Finder, Builder);
1131 }
1132 
1133 /// Matches a canonical TemplateArgument that refers to a certain
1134 /// declaration.
1135 ///
1136 /// Given
1137 /// \code
1138 ///   struct B { int next; };
1139 ///   template<int(B::*next_ptr)> struct A {};
1140 ///   A<&B::next> a;
1141 /// \endcode
1142 /// classTemplateSpecializationDecl(hasAnyTemplateArgument(
1143 ///     refersToDeclaration(fieldDecl(hasName("next")))))
1144 ///   matches the specialization \c A<&B::next> with \c fieldDecl(...) matching
1145 ///     \c B::next
AST_MATCHER_P(TemplateArgument,refersToDeclaration,internal::Matcher<Decl>,InnerMatcher)1146 AST_MATCHER_P(TemplateArgument, refersToDeclaration,
1147               internal::Matcher<Decl>, InnerMatcher) {
1148   if (Node.getKind() == TemplateArgument::Declaration)
1149     return InnerMatcher.matches(*Node.getAsDecl(), Finder, Builder);
1150   return false;
1151 }
1152 
1153 /// Matches a sugar TemplateArgument that refers to a certain expression.
1154 ///
1155 /// Given
1156 /// \code
1157 ///   struct B { int next; };
1158 ///   template<int(B::*next_ptr)> struct A {};
1159 ///   A<&B::next> a;
1160 /// \endcode
1161 /// templateSpecializationType(hasAnyTemplateArgument(
1162 ///   isExpr(hasDescendant(declRefExpr(to(fieldDecl(hasName("next"))))))))
1163 ///   matches the specialization \c A<&B::next> with \c fieldDecl(...) matching
1164 ///     \c B::next
AST_MATCHER_P(TemplateArgument,isExpr,internal::Matcher<Expr>,InnerMatcher)1165 AST_MATCHER_P(TemplateArgument, isExpr, internal::Matcher<Expr>, InnerMatcher) {
1166   if (Node.getKind() == TemplateArgument::Expression)
1167     return InnerMatcher.matches(*Node.getAsExpr(), Finder, Builder);
1168   return false;
1169 }
1170 
1171 /// Matches a TemplateArgument that is an integral value.
1172 ///
1173 /// Given
1174 /// \code
1175 ///   template<int T> struct C {};
1176 ///   C<42> c;
1177 /// \endcode
1178 /// classTemplateSpecializationDecl(
1179 ///   hasAnyTemplateArgument(isIntegral()))
1180 ///   matches the implicit instantiation of C in C<42>
1181 ///   with isIntegral() matching 42.
AST_MATCHER(TemplateArgument,isIntegral)1182 AST_MATCHER(TemplateArgument, isIntegral) {
1183   return Node.getKind() == TemplateArgument::Integral;
1184 }
1185 
1186 /// Matches a TemplateArgument that refers to an integral type.
1187 ///
1188 /// Given
1189 /// \code
1190 ///   template<int T> struct C {};
1191 ///   C<42> c;
1192 /// \endcode
1193 /// classTemplateSpecializationDecl(
1194 ///   hasAnyTemplateArgument(refersToIntegralType(asString("int"))))
1195 ///   matches the implicit instantiation of C in C<42>.
AST_MATCHER_P(TemplateArgument,refersToIntegralType,internal::Matcher<QualType>,InnerMatcher)1196 AST_MATCHER_P(TemplateArgument, refersToIntegralType,
1197               internal::Matcher<QualType>, InnerMatcher) {
1198   if (Node.getKind() != TemplateArgument::Integral)
1199     return false;
1200   return InnerMatcher.matches(Node.getIntegralType(), Finder, Builder);
1201 }
1202 
1203 /// Matches a TemplateArgument of integral type with a given value.
1204 ///
1205 /// Note that 'Value' is a string as the template argument's value is
1206 /// an arbitrary precision integer. 'Value' must be euqal to the canonical
1207 /// representation of that integral value in base 10.
1208 ///
1209 /// Given
1210 /// \code
1211 ///   template<int T> struct C {};
1212 ///   C<42> c;
1213 /// \endcode
1214 /// classTemplateSpecializationDecl(
1215 ///   hasAnyTemplateArgument(equalsIntegralValue("42")))
1216 ///   matches the implicit instantiation of C in C<42>.
AST_MATCHER_P(TemplateArgument,equalsIntegralValue,std::string,Value)1217 AST_MATCHER_P(TemplateArgument, equalsIntegralValue,
1218               std::string, Value) {
1219   if (Node.getKind() != TemplateArgument::Integral)
1220     return false;
1221   return toString(Node.getAsIntegral(), 10) == Value;
1222 }
1223 
1224 /// Matches an Objective-C autorelease pool statement.
1225 ///
1226 /// Given
1227 /// \code
1228 ///   @autoreleasepool {
1229 ///     int x = 0;
1230 ///   }
1231 /// \endcode
1232 /// autoreleasePoolStmt(stmt()) matches the declaration of "x"
1233 /// inside the autorelease pool.
1234 extern const internal::VariadicDynCastAllOfMatcher<Stmt,
1235        ObjCAutoreleasePoolStmt> autoreleasePoolStmt;
1236 
1237 /// Matches any value declaration.
1238 ///
1239 /// Example matches A, B, C and F
1240 /// \code
1241 ///   enum X { A, B, C };
1242 ///   void F();
1243 /// \endcode
1244 extern const internal::VariadicDynCastAllOfMatcher<Decl, ValueDecl> valueDecl;
1245 
1246 /// Matches C++ constructor declarations.
1247 ///
1248 /// Example matches Foo::Foo() and Foo::Foo(int)
1249 /// \code
1250 ///   class Foo {
1251 ///    public:
1252 ///     Foo();
1253 ///     Foo(int);
1254 ///     int DoSomething();
1255 ///   };
1256 /// \endcode
1257 extern const internal::VariadicDynCastAllOfMatcher<Decl, CXXConstructorDecl>
1258     cxxConstructorDecl;
1259 
1260 /// Matches explicit C++ destructor declarations.
1261 ///
1262 /// Example matches Foo::~Foo()
1263 /// \code
1264 ///   class Foo {
1265 ///    public:
1266 ///     virtual ~Foo();
1267 ///   };
1268 /// \endcode
1269 extern const internal::VariadicDynCastAllOfMatcher<Decl, CXXDestructorDecl>
1270     cxxDestructorDecl;
1271 
1272 /// Matches enum declarations.
1273 ///
1274 /// Example matches X
1275 /// \code
1276 ///   enum X {
1277 ///     A, B, C
1278 ///   };
1279 /// \endcode
1280 extern const internal::VariadicDynCastAllOfMatcher<Decl, EnumDecl> enumDecl;
1281 
1282 /// Matches enum constants.
1283 ///
1284 /// Example matches A, B, C
1285 /// \code
1286 ///   enum X {
1287 ///     A, B, C
1288 ///   };
1289 /// \endcode
1290 extern const internal::VariadicDynCastAllOfMatcher<Decl, EnumConstantDecl>
1291     enumConstantDecl;
1292 
1293 /// Matches tag declarations.
1294 ///
1295 /// Example matches X, Z, U, S, E
1296 /// \code
1297 ///   class X;
1298 ///   template<class T> class Z {};
1299 ///   struct S {};
1300 ///   union U {};
1301 ///   enum E {
1302 ///     A, B, C
1303 ///   };
1304 /// \endcode
1305 extern const internal::VariadicDynCastAllOfMatcher<Decl, TagDecl> tagDecl;
1306 
1307 /// Matches method declarations.
1308 ///
1309 /// Example matches y
1310 /// \code
1311 ///   class X { void y(); };
1312 /// \endcode
1313 extern const internal::VariadicDynCastAllOfMatcher<Decl, CXXMethodDecl>
1314     cxxMethodDecl;
1315 
1316 /// Matches conversion operator declarations.
1317 ///
1318 /// Example matches the operator.
1319 /// \code
1320 ///   class X { operator int() const; };
1321 /// \endcode
1322 extern const internal::VariadicDynCastAllOfMatcher<Decl, CXXConversionDecl>
1323     cxxConversionDecl;
1324 
1325 /// Matches user-defined and implicitly generated deduction guide.
1326 ///
1327 /// Example matches the deduction guide.
1328 /// \code
1329 ///   template<typename T>
1330 ///   class X { X(int) };
1331 ///   X(int) -> X<int>;
1332 /// \endcode
1333 extern const internal::VariadicDynCastAllOfMatcher<Decl, CXXDeductionGuideDecl>
1334     cxxDeductionGuideDecl;
1335 
1336 /// Matches variable declarations.
1337 ///
1338 /// Note: this does not match declarations of member variables, which are
1339 /// "field" declarations in Clang parlance.
1340 ///
1341 /// Example matches a
1342 /// \code
1343 ///   int a;
1344 /// \endcode
1345 extern const internal::VariadicDynCastAllOfMatcher<Decl, VarDecl> varDecl;
1346 
1347 /// Matches field declarations.
1348 ///
1349 /// Given
1350 /// \code
1351 ///   class X { int m; };
1352 /// \endcode
1353 /// fieldDecl()
1354 ///   matches 'm'.
1355 extern const internal::VariadicDynCastAllOfMatcher<Decl, FieldDecl> fieldDecl;
1356 
1357 /// Matches indirect field declarations.
1358 ///
1359 /// Given
1360 /// \code
1361 ///   struct X { struct { int a; }; };
1362 /// \endcode
1363 /// indirectFieldDecl()
1364 ///   matches 'a'.
1365 extern const internal::VariadicDynCastAllOfMatcher<Decl, IndirectFieldDecl>
1366     indirectFieldDecl;
1367 
1368 /// Matches function declarations.
1369 ///
1370 /// Example matches f
1371 /// \code
1372 ///   void f();
1373 /// \endcode
1374 extern const internal::VariadicDynCastAllOfMatcher<Decl, FunctionDecl>
1375     functionDecl;
1376 
1377 /// Matches C++ function template declarations.
1378 ///
1379 /// Example matches f
1380 /// \code
1381 ///   template<class T> void f(T t) {}
1382 /// \endcode
1383 extern const internal::VariadicDynCastAllOfMatcher<Decl, FunctionTemplateDecl>
1384     functionTemplateDecl;
1385 
1386 /// Matches friend declarations.
1387 ///
1388 /// Given
1389 /// \code
1390 ///   class X { friend void foo(); };
1391 /// \endcode
1392 /// friendDecl()
1393 ///   matches 'friend void foo()'.
1394 extern const internal::VariadicDynCastAllOfMatcher<Decl, FriendDecl> friendDecl;
1395 
1396 /// Matches statements.
1397 ///
1398 /// Given
1399 /// \code
1400 ///   { ++a; }
1401 /// \endcode
1402 /// stmt()
1403 ///   matches both the compound statement '{ ++a; }' and '++a'.
1404 extern const internal::VariadicAllOfMatcher<Stmt> stmt;
1405 
1406 /// Matches declaration statements.
1407 ///
1408 /// Given
1409 /// \code
1410 ///   int a;
1411 /// \endcode
1412 /// declStmt()
1413 ///   matches 'int a'.
1414 extern const internal::VariadicDynCastAllOfMatcher<Stmt, DeclStmt> declStmt;
1415 
1416 /// Matches member expressions.
1417 ///
1418 /// Given
1419 /// \code
1420 ///   class Y {
1421 ///     void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; }
1422 ///     int a; static int b;
1423 ///   };
1424 /// \endcode
1425 /// memberExpr()
1426 ///   matches this->x, x, y.x, a, this->b
1427 extern const internal::VariadicDynCastAllOfMatcher<Stmt, MemberExpr> memberExpr;
1428 
1429 /// Matches unresolved member expressions.
1430 ///
1431 /// Given
1432 /// \code
1433 ///   struct X {
1434 ///     template <class T> void f();
1435 ///     void g();
1436 ///   };
1437 ///   template <class T> void h() { X x; x.f<T>(); x.g(); }
1438 /// \endcode
1439 /// unresolvedMemberExpr()
1440 ///   matches x.f<T>
1441 extern const internal::VariadicDynCastAllOfMatcher<Stmt, UnresolvedMemberExpr>
1442     unresolvedMemberExpr;
1443 
1444 /// Matches member expressions where the actual member referenced could not be
1445 /// resolved because the base expression or the member name was dependent.
1446 ///
1447 /// Given
1448 /// \code
1449 ///   template <class T> void f() { T t; t.g(); }
1450 /// \endcode
1451 /// cxxDependentScopeMemberExpr()
1452 ///   matches t.g
1453 extern const internal::VariadicDynCastAllOfMatcher<Stmt,
1454                                                    CXXDependentScopeMemberExpr>
1455     cxxDependentScopeMemberExpr;
1456 
1457 /// Matches call expressions.
1458 ///
1459 /// Example matches x.y() and y()
1460 /// \code
1461 ///   X x;
1462 ///   x.y();
1463 ///   y();
1464 /// \endcode
1465 extern const internal::VariadicDynCastAllOfMatcher<Stmt, CallExpr> callExpr;
1466 
1467 /// Matches call expressions which were resolved using ADL.
1468 ///
1469 /// Example matches y(x) but not y(42) or NS::y(x).
1470 /// \code
1471 ///   namespace NS {
1472 ///     struct X {};
1473 ///     void y(X);
1474 ///   }
1475 ///
1476 ///   void y(...);
1477 ///
1478 ///   void test() {
1479 ///     NS::X x;
1480 ///     y(x); // Matches
1481 ///     NS::y(x); // Doesn't match
1482 ///     y(42); // Doesn't match
1483 ///     using NS::y;
1484 ///     y(x); // Found by both unqualified lookup and ADL, doesn't match
1485 //    }
1486 /// \endcode
AST_MATCHER(CallExpr,usesADL)1487 AST_MATCHER(CallExpr, usesADL) { return Node.usesADL(); }
1488 
1489 /// Matches lambda expressions.
1490 ///
1491 /// Example matches [&](){return 5;}
1492 /// \code
1493 ///   [&](){return 5;}
1494 /// \endcode
1495 extern const internal::VariadicDynCastAllOfMatcher<Stmt, LambdaExpr> lambdaExpr;
1496 
1497 /// Matches member call expressions.
1498 ///
1499 /// Example matches x.y()
1500 /// \code
1501 ///   X x;
1502 ///   x.y();
1503 /// \endcode
1504 extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXMemberCallExpr>
1505     cxxMemberCallExpr;
1506 
1507 /// Matches ObjectiveC Message invocation expressions.
1508 ///
1509 /// The innermost message send invokes the "alloc" class method on the
1510 /// NSString class, while the outermost message send invokes the
1511 /// "initWithString" instance method on the object returned from
1512 /// NSString's "alloc". This matcher should match both message sends.
1513 /// \code
1514 ///   [[NSString alloc] initWithString:@"Hello"]
1515 /// \endcode
1516 extern const internal::VariadicDynCastAllOfMatcher<Stmt, ObjCMessageExpr>
1517     objcMessageExpr;
1518 
1519 /// Matches ObjectiveC String literal expressions.
1520 ///
1521 /// Example matches @"abcd"
1522 /// \code
1523 ///   NSString *s = @"abcd";
1524 /// \endcode
1525 extern const internal::VariadicDynCastAllOfMatcher<Stmt, ObjCStringLiteral>
1526     objcStringLiteral;
1527 
1528 /// Matches Objective-C interface declarations.
1529 ///
1530 /// Example matches Foo
1531 /// \code
1532 ///   @interface Foo
1533 ///   @end
1534 /// \endcode
1535 extern const internal::VariadicDynCastAllOfMatcher<Decl, ObjCInterfaceDecl>
1536     objcInterfaceDecl;
1537 
1538 /// Matches Objective-C implementation declarations.
1539 ///
1540 /// Example matches Foo
1541 /// \code
1542 ///   @implementation Foo
1543 ///   @end
1544 /// \endcode
1545 extern const internal::VariadicDynCastAllOfMatcher<Decl, ObjCImplementationDecl>
1546     objcImplementationDecl;
1547 
1548 /// Matches Objective-C protocol declarations.
1549 ///
1550 /// Example matches FooDelegate
1551 /// \code
1552 ///   @protocol FooDelegate
1553 ///   @end
1554 /// \endcode
1555 extern const internal::VariadicDynCastAllOfMatcher<Decl, ObjCProtocolDecl>
1556     objcProtocolDecl;
1557 
1558 /// Matches Objective-C category declarations.
1559 ///
1560 /// Example matches Foo (Additions)
1561 /// \code
1562 ///   @interface Foo (Additions)
1563 ///   @end
1564 /// \endcode
1565 extern const internal::VariadicDynCastAllOfMatcher<Decl, ObjCCategoryDecl>
1566     objcCategoryDecl;
1567 
1568 /// Matches Objective-C category definitions.
1569 ///
1570 /// Example matches Foo (Additions)
1571 /// \code
1572 ///   @implementation Foo (Additions)
1573 ///   @end
1574 /// \endcode
1575 extern const internal::VariadicDynCastAllOfMatcher<Decl, ObjCCategoryImplDecl>
1576     objcCategoryImplDecl;
1577 
1578 /// Matches Objective-C method declarations.
1579 ///
1580 /// Example matches both declaration and definition of -[Foo method]
1581 /// \code
1582 ///   @interface Foo
1583 ///   - (void)method;
1584 ///   @end
1585 ///
1586 ///   @implementation Foo
1587 ///   - (void)method {}
1588 ///   @end
1589 /// \endcode
1590 extern const internal::VariadicDynCastAllOfMatcher<Decl, ObjCMethodDecl>
1591     objcMethodDecl;
1592 
1593 /// Matches block declarations.
1594 ///
1595 /// Example matches the declaration of the nameless block printing an input
1596 /// integer.
1597 ///
1598 /// \code
1599 ///   myFunc(^(int p) {
1600 ///     printf("%d", p);
1601 ///   })
1602 /// \endcode
1603 extern const internal::VariadicDynCastAllOfMatcher<Decl, BlockDecl>
1604     blockDecl;
1605 
1606 /// Matches Objective-C instance variable declarations.
1607 ///
1608 /// Example matches _enabled
1609 /// \code
1610 ///   @implementation Foo {
1611 ///     BOOL _enabled;
1612 ///   }
1613 ///   @end
1614 /// \endcode
1615 extern const internal::VariadicDynCastAllOfMatcher<Decl, ObjCIvarDecl>
1616     objcIvarDecl;
1617 
1618 /// Matches Objective-C property declarations.
1619 ///
1620 /// Example matches enabled
1621 /// \code
1622 ///   @interface Foo
1623 ///   @property BOOL enabled;
1624 ///   @end
1625 /// \endcode
1626 extern const internal::VariadicDynCastAllOfMatcher<Decl, ObjCPropertyDecl>
1627     objcPropertyDecl;
1628 
1629 /// Matches Objective-C \@throw statements.
1630 ///
1631 /// Example matches \@throw
1632 /// \code
1633 ///   @throw obj;
1634 /// \endcode
1635 extern const internal::VariadicDynCastAllOfMatcher<Stmt, ObjCAtThrowStmt>
1636     objcThrowStmt;
1637 
1638 /// Matches Objective-C @try statements.
1639 ///
1640 /// Example matches @try
1641 /// \code
1642 ///   @try {}
1643 ///   @catch (...) {}
1644 /// \endcode
1645 extern const internal::VariadicDynCastAllOfMatcher<Stmt, ObjCAtTryStmt>
1646     objcTryStmt;
1647 
1648 /// Matches Objective-C @catch statements.
1649 ///
1650 /// Example matches @catch
1651 /// \code
1652 ///   @try {}
1653 ///   @catch (...) {}
1654 /// \endcode
1655 extern const internal::VariadicDynCastAllOfMatcher<Stmt, ObjCAtCatchStmt>
1656     objcCatchStmt;
1657 
1658 /// Matches Objective-C @finally statements.
1659 ///
1660 /// Example matches @finally
1661 /// \code
1662 ///   @try {}
1663 ///   @finally {}
1664 /// \endcode
1665 extern const internal::VariadicDynCastAllOfMatcher<Stmt, ObjCAtFinallyStmt>
1666     objcFinallyStmt;
1667 
1668 /// Matches expressions that introduce cleanups to be run at the end
1669 /// of the sub-expression's evaluation.
1670 ///
1671 /// Example matches std::string()
1672 /// \code
1673 ///   const std::string str = std::string();
1674 /// \endcode
1675 extern const internal::VariadicDynCastAllOfMatcher<Stmt, ExprWithCleanups>
1676     exprWithCleanups;
1677 
1678 /// Matches init list expressions.
1679 ///
1680 /// Given
1681 /// \code
1682 ///   int a[] = { 1, 2 };
1683 ///   struct B { int x, y; };
1684 ///   B b = { 5, 6 };
1685 /// \endcode
1686 /// initListExpr()
1687 ///   matches "{ 1, 2 }" and "{ 5, 6 }"
1688 extern const internal::VariadicDynCastAllOfMatcher<Stmt, InitListExpr>
1689     initListExpr;
1690 
1691 /// Matches the syntactic form of init list expressions
1692 /// (if expression have it).
AST_MATCHER_P(InitListExpr,hasSyntacticForm,internal::Matcher<Expr>,InnerMatcher)1693 AST_MATCHER_P(InitListExpr, hasSyntacticForm,
1694               internal::Matcher<Expr>, InnerMatcher) {
1695   const Expr *SyntForm = Node.getSyntacticForm();
1696   return (SyntForm != nullptr &&
1697           InnerMatcher.matches(*SyntForm, Finder, Builder));
1698 }
1699 
1700 /// Matches C++ initializer list expressions.
1701 ///
1702 /// Given
1703 /// \code
1704 ///   std::vector<int> a({ 1, 2, 3 });
1705 ///   std::vector<int> b = { 4, 5 };
1706 ///   int c[] = { 6, 7 };
1707 ///   std::pair<int, int> d = { 8, 9 };
1708 /// \endcode
1709 /// cxxStdInitializerListExpr()
1710 ///   matches "{ 1, 2, 3 }" and "{ 4, 5 }"
1711 extern const internal::VariadicDynCastAllOfMatcher<Stmt,
1712                                                    CXXStdInitializerListExpr>
1713     cxxStdInitializerListExpr;
1714 
1715 /// Matches implicit initializers of init list expressions.
1716 ///
1717 /// Given
1718 /// \code
1719 ///   point ptarray[10] = { [2].y = 1.0, [2].x = 2.0, [0].x = 1.0 };
1720 /// \endcode
1721 /// implicitValueInitExpr()
1722 ///   matches "[0].y" (implicitly)
1723 extern const internal::VariadicDynCastAllOfMatcher<Stmt, ImplicitValueInitExpr>
1724     implicitValueInitExpr;
1725 
1726 /// Matches paren list expressions.
1727 /// ParenListExprs don't have a predefined type and are used for late parsing.
1728 /// In the final AST, they can be met in template declarations.
1729 ///
1730 /// Given
1731 /// \code
1732 ///   template<typename T> class X {
1733 ///     void f() {
1734 ///       X x(*this);
1735 ///       int a = 0, b = 1; int i = (a, b);
1736 ///     }
1737 ///   };
1738 /// \endcode
1739 /// parenListExpr() matches "*this" but NOT matches (a, b) because (a, b)
1740 /// has a predefined type and is a ParenExpr, not a ParenListExpr.
1741 extern const internal::VariadicDynCastAllOfMatcher<Stmt, ParenListExpr>
1742     parenListExpr;
1743 
1744 /// Matches substitutions of non-type template parameters.
1745 ///
1746 /// Given
1747 /// \code
1748 ///   template <int N>
1749 ///   struct A { static const int n = N; };
1750 ///   struct B : public A<42> {};
1751 /// \endcode
1752 /// substNonTypeTemplateParmExpr()
1753 ///   matches "N" in the right-hand side of "static const int n = N;"
1754 extern const internal::VariadicDynCastAllOfMatcher<Stmt,
1755                                                    SubstNonTypeTemplateParmExpr>
1756     substNonTypeTemplateParmExpr;
1757 
1758 /// Matches using declarations.
1759 ///
1760 /// Given
1761 /// \code
1762 ///   namespace X { int x; }
1763 ///   using X::x;
1764 /// \endcode
1765 /// usingDecl()
1766 ///   matches \code using X::x \endcode
1767 extern const internal::VariadicDynCastAllOfMatcher<Decl, UsingDecl> usingDecl;
1768 
1769 /// Matches using-enum declarations.
1770 ///
1771 /// Given
1772 /// \code
1773 ///   namespace X { enum x {...}; }
1774 ///   using enum X::x;
1775 /// \endcode
1776 /// usingEnumDecl()
1777 ///   matches \code using enum X::x \endcode
1778 extern const internal::VariadicDynCastAllOfMatcher<Decl, UsingEnumDecl>
1779     usingEnumDecl;
1780 
1781 /// Matches using namespace declarations.
1782 ///
1783 /// Given
1784 /// \code
1785 ///   namespace X { int x; }
1786 ///   using namespace X;
1787 /// \endcode
1788 /// usingDirectiveDecl()
1789 ///   matches \code using namespace X \endcode
1790 extern const internal::VariadicDynCastAllOfMatcher<Decl, UsingDirectiveDecl>
1791     usingDirectiveDecl;
1792 
1793 /// Matches reference to a name that can be looked up during parsing
1794 /// but could not be resolved to a specific declaration.
1795 ///
1796 /// Given
1797 /// \code
1798 ///   template<typename T>
1799 ///   T foo() { T a; return a; }
1800 ///   template<typename T>
1801 ///   void bar() {
1802 ///     foo<T>();
1803 ///   }
1804 /// \endcode
1805 /// unresolvedLookupExpr()
1806 ///   matches \code foo<T>() \endcode
1807 extern const internal::VariadicDynCastAllOfMatcher<Stmt, UnresolvedLookupExpr>
1808     unresolvedLookupExpr;
1809 
1810 /// Matches unresolved using value declarations.
1811 ///
1812 /// Given
1813 /// \code
1814 ///   template<typename X>
1815 ///   class C : private X {
1816 ///     using X::x;
1817 ///   };
1818 /// \endcode
1819 /// unresolvedUsingValueDecl()
1820 ///   matches \code using X::x \endcode
1821 extern const internal::VariadicDynCastAllOfMatcher<Decl,
1822                                                    UnresolvedUsingValueDecl>
1823     unresolvedUsingValueDecl;
1824 
1825 /// Matches unresolved using value declarations that involve the
1826 /// typename.
1827 ///
1828 /// Given
1829 /// \code
1830 ///   template <typename T>
1831 ///   struct Base { typedef T Foo; };
1832 ///
1833 ///   template<typename T>
1834 ///   struct S : private Base<T> {
1835 ///     using typename Base<T>::Foo;
1836 ///   };
1837 /// \endcode
1838 /// unresolvedUsingTypenameDecl()
1839 ///   matches \code using Base<T>::Foo \endcode
1840 extern const internal::VariadicDynCastAllOfMatcher<Decl,
1841                                                    UnresolvedUsingTypenameDecl>
1842     unresolvedUsingTypenameDecl;
1843 
1844 /// Matches a constant expression wrapper.
1845 ///
1846 /// Example matches the constant in the case statement:
1847 ///     (matcher = constantExpr())
1848 /// \code
1849 ///   switch (a) {
1850 ///   case 37: break;
1851 ///   }
1852 /// \endcode
1853 extern const internal::VariadicDynCastAllOfMatcher<Stmt, ConstantExpr>
1854     constantExpr;
1855 
1856 /// Matches parentheses used in expressions.
1857 ///
1858 /// Example matches (foo() + 1)
1859 /// \code
1860 ///   int foo() { return 1; }
1861 ///   int a = (foo() + 1);
1862 /// \endcode
1863 extern const internal::VariadicDynCastAllOfMatcher<Stmt, ParenExpr> parenExpr;
1864 
1865 /// Matches constructor call expressions (including implicit ones).
1866 ///
1867 /// Example matches string(ptr, n) and ptr within arguments of f
1868 ///     (matcher = cxxConstructExpr())
1869 /// \code
1870 ///   void f(const string &a, const string &b);
1871 ///   char *ptr;
1872 ///   int n;
1873 ///   f(string(ptr, n), ptr);
1874 /// \endcode
1875 extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXConstructExpr>
1876     cxxConstructExpr;
1877 
1878 /// Matches unresolved constructor call expressions.
1879 ///
1880 /// Example matches T(t) in return statement of f
1881 ///     (matcher = cxxUnresolvedConstructExpr())
1882 /// \code
1883 ///   template <typename T>
1884 ///   void f(const T& t) { return T(t); }
1885 /// \endcode
1886 extern const internal::VariadicDynCastAllOfMatcher<Stmt,
1887                                                    CXXUnresolvedConstructExpr>
1888     cxxUnresolvedConstructExpr;
1889 
1890 /// Matches implicit and explicit this expressions.
1891 ///
1892 /// Example matches the implicit this expression in "return i".
1893 ///     (matcher = cxxThisExpr())
1894 /// \code
1895 /// struct foo {
1896 ///   int i;
1897 ///   int f() { return i; }
1898 /// };
1899 /// \endcode
1900 extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXThisExpr>
1901     cxxThisExpr;
1902 
1903 /// Matches nodes where temporaries are created.
1904 ///
1905 /// Example matches FunctionTakesString(GetStringByValue())
1906 ///     (matcher = cxxBindTemporaryExpr())
1907 /// \code
1908 ///   FunctionTakesString(GetStringByValue());
1909 ///   FunctionTakesStringByPointer(GetStringPointer());
1910 /// \endcode
1911 extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXBindTemporaryExpr>
1912     cxxBindTemporaryExpr;
1913 
1914 /// Matches nodes where temporaries are materialized.
1915 ///
1916 /// Example: Given
1917 /// \code
1918 ///   struct T {void func();};
1919 ///   T f();
1920 ///   void g(T);
1921 /// \endcode
1922 /// materializeTemporaryExpr() matches 'f()' in these statements
1923 /// \code
1924 ///   T u(f());
1925 ///   g(f());
1926 ///   f().func();
1927 /// \endcode
1928 /// but does not match
1929 /// \code
1930 ///   f();
1931 /// \endcode
1932 extern const internal::VariadicDynCastAllOfMatcher<Stmt,
1933                                                    MaterializeTemporaryExpr>
1934     materializeTemporaryExpr;
1935 
1936 /// Matches new expressions.
1937 ///
1938 /// Given
1939 /// \code
1940 ///   new X;
1941 /// \endcode
1942 /// cxxNewExpr()
1943 ///   matches 'new X'.
1944 extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXNewExpr> cxxNewExpr;
1945 
1946 /// Matches delete expressions.
1947 ///
1948 /// Given
1949 /// \code
1950 ///   delete X;
1951 /// \endcode
1952 /// cxxDeleteExpr()
1953 ///   matches 'delete X'.
1954 extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXDeleteExpr>
1955     cxxDeleteExpr;
1956 
1957 /// Matches noexcept expressions.
1958 ///
1959 /// Given
1960 /// \code
1961 ///   bool a() noexcept;
1962 ///   bool b() noexcept(true);
1963 ///   bool c() noexcept(false);
1964 ///   bool d() noexcept(noexcept(a()));
1965 ///   bool e = noexcept(b()) || noexcept(c());
1966 /// \endcode
1967 /// cxxNoexceptExpr()
1968 ///   matches `noexcept(a())`, `noexcept(b())` and `noexcept(c())`.
1969 ///   doesn't match the noexcept specifier in the declarations a, b, c or d.
1970 extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXNoexceptExpr>
1971     cxxNoexceptExpr;
1972 
1973 /// Matches array subscript expressions.
1974 ///
1975 /// Given
1976 /// \code
1977 ///   int i = a[1];
1978 /// \endcode
1979 /// arraySubscriptExpr()
1980 ///   matches "a[1]"
1981 extern const internal::VariadicDynCastAllOfMatcher<Stmt, ArraySubscriptExpr>
1982     arraySubscriptExpr;
1983 
1984 /// Matches the value of a default argument at the call site.
1985 ///
1986 /// Example matches the CXXDefaultArgExpr placeholder inserted for the
1987 ///     default value of the second parameter in the call expression f(42)
1988 ///     (matcher = cxxDefaultArgExpr())
1989 /// \code
1990 ///   void f(int x, int y = 0);
1991 ///   f(42);
1992 /// \endcode
1993 extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXDefaultArgExpr>
1994     cxxDefaultArgExpr;
1995 
1996 /// Matches overloaded operator calls.
1997 ///
1998 /// Note that if an operator isn't overloaded, it won't match. Instead, use
1999 /// binaryOperator matcher.
2000 /// Currently it does not match operators such as new delete.
2001 /// FIXME: figure out why these do not match?
2002 ///
2003 /// Example matches both operator<<((o << b), c) and operator<<(o, b)
2004 ///     (matcher = cxxOperatorCallExpr())
2005 /// \code
2006 ///   ostream &operator<< (ostream &out, int i) { };
2007 ///   ostream &o; int b = 1, c = 1;
2008 ///   o << b << c;
2009 /// \endcode
2010 /// See also the binaryOperation() matcher for more-general matching of binary
2011 /// uses of this AST node.
2012 extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXOperatorCallExpr>
2013     cxxOperatorCallExpr;
2014 
2015 /// Matches rewritten binary operators
2016 ///
2017 /// Example matches use of "<":
2018 /// \code
2019 ///   #include <compare>
2020 ///   struct HasSpaceshipMem {
2021 ///     int a;
2022 ///     constexpr auto operator<=>(const HasSpaceshipMem&) const = default;
2023 ///   };
2024 ///   void compare() {
2025 ///     HasSpaceshipMem hs1, hs2;
2026 ///     if (hs1 < hs2)
2027 ///         return;
2028 ///   }
2029 /// \endcode
2030 /// See also the binaryOperation() matcher for more-general matching
2031 /// of this AST node.
2032 extern const internal::VariadicDynCastAllOfMatcher<Stmt,
2033                                                    CXXRewrittenBinaryOperator>
2034     cxxRewrittenBinaryOperator;
2035 
2036 /// Matches expressions.
2037 ///
2038 /// Example matches x()
2039 /// \code
2040 ///   void f() { x(); }
2041 /// \endcode
2042 extern const internal::VariadicDynCastAllOfMatcher<Stmt, Expr> expr;
2043 
2044 /// Matches expressions that refer to declarations.
2045 ///
2046 /// Example matches x in if (x)
2047 /// \code
2048 ///   bool x;
2049 ///   if (x) {}
2050 /// \endcode
2051 extern const internal::VariadicDynCastAllOfMatcher<Stmt, DeclRefExpr>
2052     declRefExpr;
2053 
2054 /// Matches a reference to an ObjCIvar.
2055 ///
2056 /// Example: matches "a" in "init" method:
2057 /// \code
2058 /// @implementation A {
2059 ///   NSString *a;
2060 /// }
2061 /// - (void) init {
2062 ///   a = @"hello";
2063 /// }
2064 /// \endcode
2065 extern const internal::VariadicDynCastAllOfMatcher<Stmt, ObjCIvarRefExpr>
2066     objcIvarRefExpr;
2067 
2068 /// Matches a reference to a block.
2069 ///
2070 /// Example: matches "^{}":
2071 /// \code
2072 ///   void f() { ^{}(); }
2073 /// \endcode
2074 extern const internal::VariadicDynCastAllOfMatcher<Stmt, BlockExpr> blockExpr;
2075 
2076 /// Matches if statements.
2077 ///
2078 /// Example matches 'if (x) {}'
2079 /// \code
2080 ///   if (x) {}
2081 /// \endcode
2082 extern const internal::VariadicDynCastAllOfMatcher<Stmt, IfStmt> ifStmt;
2083 
2084 /// Matches for statements.
2085 ///
2086 /// Example matches 'for (;;) {}'
2087 /// \code
2088 ///   for (;;) {}
2089 ///   int i[] =  {1, 2, 3}; for (auto a : i);
2090 /// \endcode
2091 extern const internal::VariadicDynCastAllOfMatcher<Stmt, ForStmt> forStmt;
2092 
2093 /// Matches the increment statement of a for loop.
2094 ///
2095 /// Example:
2096 ///     forStmt(hasIncrement(unaryOperator(hasOperatorName("++"))))
2097 /// matches '++x' in
2098 /// \code
2099 ///     for (x; x < N; ++x) { }
2100 /// \endcode
AST_MATCHER_P(ForStmt,hasIncrement,internal::Matcher<Stmt>,InnerMatcher)2101 AST_MATCHER_P(ForStmt, hasIncrement, internal::Matcher<Stmt>,
2102               InnerMatcher) {
2103   const Stmt *const Increment = Node.getInc();
2104   return (Increment != nullptr &&
2105           InnerMatcher.matches(*Increment, Finder, Builder));
2106 }
2107 
2108 /// Matches the initialization statement of a for loop.
2109 ///
2110 /// Example:
2111 ///     forStmt(hasLoopInit(declStmt()))
2112 /// matches 'int x = 0' in
2113 /// \code
2114 ///     for (int x = 0; x < N; ++x) { }
2115 /// \endcode
AST_MATCHER_P(ForStmt,hasLoopInit,internal::Matcher<Stmt>,InnerMatcher)2116 AST_MATCHER_P(ForStmt, hasLoopInit, internal::Matcher<Stmt>,
2117               InnerMatcher) {
2118   const Stmt *const Init = Node.getInit();
2119   return (Init != nullptr && InnerMatcher.matches(*Init, Finder, Builder));
2120 }
2121 
2122 /// Matches range-based for statements.
2123 ///
2124 /// cxxForRangeStmt() matches 'for (auto a : i)'
2125 /// \code
2126 ///   int i[] =  {1, 2, 3}; for (auto a : i);
2127 ///   for(int j = 0; j < 5; ++j);
2128 /// \endcode
2129 extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXForRangeStmt>
2130     cxxForRangeStmt;
2131 
2132 /// Matches the initialization statement of a for loop.
2133 ///
2134 /// Example:
2135 ///     forStmt(hasLoopVariable(anything()))
2136 /// matches 'int x' in
2137 /// \code
2138 ///     for (int x : a) { }
2139 /// \endcode
AST_MATCHER_P(CXXForRangeStmt,hasLoopVariable,internal::Matcher<VarDecl>,InnerMatcher)2140 AST_MATCHER_P(CXXForRangeStmt, hasLoopVariable, internal::Matcher<VarDecl>,
2141               InnerMatcher) {
2142   const VarDecl *const Var = Node.getLoopVariable();
2143   return (Var != nullptr && InnerMatcher.matches(*Var, Finder, Builder));
2144 }
2145 
2146 /// Matches the range initialization statement of a for loop.
2147 ///
2148 /// Example:
2149 ///     forStmt(hasRangeInit(anything()))
2150 /// matches 'a' in
2151 /// \code
2152 ///     for (int x : a) { }
2153 /// \endcode
AST_MATCHER_P(CXXForRangeStmt,hasRangeInit,internal::Matcher<Expr>,InnerMatcher)2154 AST_MATCHER_P(CXXForRangeStmt, hasRangeInit, internal::Matcher<Expr>,
2155               InnerMatcher) {
2156   const Expr *const Init = Node.getRangeInit();
2157   return (Init != nullptr && InnerMatcher.matches(*Init, Finder, Builder));
2158 }
2159 
2160 /// Matches while statements.
2161 ///
2162 /// Given
2163 /// \code
2164 ///   while (true) {}
2165 /// \endcode
2166 /// whileStmt()
2167 ///   matches 'while (true) {}'.
2168 extern const internal::VariadicDynCastAllOfMatcher<Stmt, WhileStmt> whileStmt;
2169 
2170 /// Matches do statements.
2171 ///
2172 /// Given
2173 /// \code
2174 ///   do {} while (true);
2175 /// \endcode
2176 /// doStmt()
2177 ///   matches 'do {} while(true)'
2178 extern const internal::VariadicDynCastAllOfMatcher<Stmt, DoStmt> doStmt;
2179 
2180 /// Matches break statements.
2181 ///
2182 /// Given
2183 /// \code
2184 ///   while (true) { break; }
2185 /// \endcode
2186 /// breakStmt()
2187 ///   matches 'break'
2188 extern const internal::VariadicDynCastAllOfMatcher<Stmt, BreakStmt> breakStmt;
2189 
2190 /// Matches continue statements.
2191 ///
2192 /// Given
2193 /// \code
2194 ///   while (true) { continue; }
2195 /// \endcode
2196 /// continueStmt()
2197 ///   matches 'continue'
2198 extern const internal::VariadicDynCastAllOfMatcher<Stmt, ContinueStmt>
2199     continueStmt;
2200 
2201 /// Matches co_return statements.
2202 ///
2203 /// Given
2204 /// \code
2205 ///   while (true) { co_return; }
2206 /// \endcode
2207 /// coreturnStmt()
2208 ///   matches 'co_return'
2209 extern const internal::VariadicDynCastAllOfMatcher<Stmt, CoreturnStmt>
2210     coreturnStmt;
2211 
2212 /// Matches return statements.
2213 ///
2214 /// Given
2215 /// \code
2216 ///   return 1;
2217 /// \endcode
2218 /// returnStmt()
2219 ///   matches 'return 1'
2220 extern const internal::VariadicDynCastAllOfMatcher<Stmt, ReturnStmt> returnStmt;
2221 
2222 /// Matches goto statements.
2223 ///
2224 /// Given
2225 /// \code
2226 ///   goto FOO;
2227 ///   FOO: bar();
2228 /// \endcode
2229 /// gotoStmt()
2230 ///   matches 'goto FOO'
2231 extern const internal::VariadicDynCastAllOfMatcher<Stmt, GotoStmt> gotoStmt;
2232 
2233 /// Matches label statements.
2234 ///
2235 /// Given
2236 /// \code
2237 ///   goto FOO;
2238 ///   FOO: bar();
2239 /// \endcode
2240 /// labelStmt()
2241 ///   matches 'FOO:'
2242 extern const internal::VariadicDynCastAllOfMatcher<Stmt, LabelStmt> labelStmt;
2243 
2244 /// Matches address of label statements (GNU extension).
2245 ///
2246 /// Given
2247 /// \code
2248 ///   FOO: bar();
2249 ///   void *ptr = &&FOO;
2250 ///   goto *bar;
2251 /// \endcode
2252 /// addrLabelExpr()
2253 ///   matches '&&FOO'
2254 extern const internal::VariadicDynCastAllOfMatcher<Stmt, AddrLabelExpr>
2255     addrLabelExpr;
2256 
2257 /// Matches switch statements.
2258 ///
2259 /// Given
2260 /// \code
2261 ///   switch(a) { case 42: break; default: break; }
2262 /// \endcode
2263 /// switchStmt()
2264 ///   matches 'switch(a)'.
2265 extern const internal::VariadicDynCastAllOfMatcher<Stmt, SwitchStmt> switchStmt;
2266 
2267 /// Matches case and default statements inside switch statements.
2268 ///
2269 /// Given
2270 /// \code
2271 ///   switch(a) { case 42: break; default: break; }
2272 /// \endcode
2273 /// switchCase()
2274 ///   matches 'case 42:' and 'default:'.
2275 extern const internal::VariadicDynCastAllOfMatcher<Stmt, SwitchCase> switchCase;
2276 
2277 /// Matches case statements inside switch statements.
2278 ///
2279 /// Given
2280 /// \code
2281 ///   switch(a) { case 42: break; default: break; }
2282 /// \endcode
2283 /// caseStmt()
2284 ///   matches 'case 42:'.
2285 extern const internal::VariadicDynCastAllOfMatcher<Stmt, CaseStmt> caseStmt;
2286 
2287 /// Matches default statements inside switch statements.
2288 ///
2289 /// Given
2290 /// \code
2291 ///   switch(a) { case 42: break; default: break; }
2292 /// \endcode
2293 /// defaultStmt()
2294 ///   matches 'default:'.
2295 extern const internal::VariadicDynCastAllOfMatcher<Stmt, DefaultStmt>
2296     defaultStmt;
2297 
2298 /// Matches compound statements.
2299 ///
2300 /// Example matches '{}' and '{{}}' in 'for (;;) {{}}'
2301 /// \code
2302 ///   for (;;) {{}}
2303 /// \endcode
2304 extern const internal::VariadicDynCastAllOfMatcher<Stmt, CompoundStmt>
2305     compoundStmt;
2306 
2307 /// Matches catch statements.
2308 ///
2309 /// \code
2310 ///   try {} catch(int i) {}
2311 /// \endcode
2312 /// cxxCatchStmt()
2313 ///   matches 'catch(int i)'
2314 extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXCatchStmt>
2315     cxxCatchStmt;
2316 
2317 /// Matches try statements.
2318 ///
2319 /// \code
2320 ///   try {} catch(int i) {}
2321 /// \endcode
2322 /// cxxTryStmt()
2323 ///   matches 'try {}'
2324 extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXTryStmt> cxxTryStmt;
2325 
2326 /// Matches throw expressions.
2327 ///
2328 /// \code
2329 ///   try { throw 5; } catch(int i) {}
2330 /// \endcode
2331 /// cxxThrowExpr()
2332 ///   matches 'throw 5'
2333 extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXThrowExpr>
2334     cxxThrowExpr;
2335 
2336 /// Matches null statements.
2337 ///
2338 /// \code
2339 ///   foo();;
2340 /// \endcode
2341 /// nullStmt()
2342 ///   matches the second ';'
2343 extern const internal::VariadicDynCastAllOfMatcher<Stmt, NullStmt> nullStmt;
2344 
2345 /// Matches asm statements.
2346 ///
2347 /// \code
2348 ///  int i = 100;
2349 ///   __asm("mov al, 2");
2350 /// \endcode
2351 /// asmStmt()
2352 ///   matches '__asm("mov al, 2")'
2353 extern const internal::VariadicDynCastAllOfMatcher<Stmt, AsmStmt> asmStmt;
2354 
2355 /// Matches bool literals.
2356 ///
2357 /// Example matches true
2358 /// \code
2359 ///   true
2360 /// \endcode
2361 extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXBoolLiteralExpr>
2362     cxxBoolLiteral;
2363 
2364 /// Matches string literals (also matches wide string literals).
2365 ///
2366 /// Example matches "abcd", L"abcd"
2367 /// \code
2368 ///   char *s = "abcd";
2369 ///   wchar_t *ws = L"abcd";
2370 /// \endcode
2371 extern const internal::VariadicDynCastAllOfMatcher<Stmt, StringLiteral>
2372     stringLiteral;
2373 
2374 /// Matches character literals (also matches wchar_t).
2375 ///
2376 /// Not matching Hex-encoded chars (e.g. 0x1234, which is a IntegerLiteral),
2377 /// though.
2378 ///
2379 /// Example matches 'a', L'a'
2380 /// \code
2381 ///   char ch = 'a';
2382 ///   wchar_t chw = L'a';
2383 /// \endcode
2384 extern const internal::VariadicDynCastAllOfMatcher<Stmt, CharacterLiteral>
2385     characterLiteral;
2386 
2387 /// Matches integer literals of all sizes / encodings, e.g.
2388 /// 1, 1L, 0x1 and 1U.
2389 ///
2390 /// Does not match character-encoded integers such as L'a'.
2391 extern const internal::VariadicDynCastAllOfMatcher<Stmt, IntegerLiteral>
2392     integerLiteral;
2393 
2394 /// Matches float literals of all sizes / encodings, e.g.
2395 /// 1.0, 1.0f, 1.0L and 1e10.
2396 ///
2397 /// Does not match implicit conversions such as
2398 /// \code
2399 ///   float a = 10;
2400 /// \endcode
2401 extern const internal::VariadicDynCastAllOfMatcher<Stmt, FloatingLiteral>
2402     floatLiteral;
2403 
2404 /// Matches imaginary literals, which are based on integer and floating
2405 /// point literals e.g.: 1i, 1.0i
2406 extern const internal::VariadicDynCastAllOfMatcher<Stmt, ImaginaryLiteral>
2407     imaginaryLiteral;
2408 
2409 /// Matches fixed point literals
2410 extern const internal::VariadicDynCastAllOfMatcher<Stmt, FixedPointLiteral>
2411     fixedPointLiteral;
2412 
2413 /// Matches user defined literal operator call.
2414 ///
2415 /// Example match: "foo"_suffix
2416 extern const internal::VariadicDynCastAllOfMatcher<Stmt, UserDefinedLiteral>
2417     userDefinedLiteral;
2418 
2419 /// Matches compound (i.e. non-scalar) literals
2420 ///
2421 /// Example match: {1}, (1, 2)
2422 /// \code
2423 ///   int array[4] = {1};
2424 ///   vector int myvec = (vector int)(1, 2);
2425 /// \endcode
2426 extern const internal::VariadicDynCastAllOfMatcher<Stmt, CompoundLiteralExpr>
2427     compoundLiteralExpr;
2428 
2429 /// Matches co_await expressions.
2430 ///
2431 /// Given
2432 /// \code
2433 ///   co_await 1;
2434 /// \endcode
2435 /// coawaitExpr()
2436 ///   matches 'co_await 1'
2437 extern const internal::VariadicDynCastAllOfMatcher<Stmt, CoawaitExpr>
2438     coawaitExpr;
2439 /// Matches co_await expressions where the type of the promise is dependent
2440 extern const internal::VariadicDynCastAllOfMatcher<Stmt, DependentCoawaitExpr>
2441     dependentCoawaitExpr;
2442 /// Matches co_yield expressions.
2443 ///
2444 /// Given
2445 /// \code
2446 ///   co_yield 1;
2447 /// \endcode
2448 /// coyieldExpr()
2449 ///   matches 'co_yield 1'
2450 extern const internal::VariadicDynCastAllOfMatcher<Stmt, CoyieldExpr>
2451     coyieldExpr;
2452 
2453 /// Matches nullptr literal.
2454 extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXNullPtrLiteralExpr>
2455     cxxNullPtrLiteralExpr;
2456 
2457 /// Matches GNU __builtin_choose_expr.
2458 extern const internal::VariadicDynCastAllOfMatcher<Stmt, ChooseExpr>
2459     chooseExpr;
2460 
2461 /// Matches GNU __null expression.
2462 extern const internal::VariadicDynCastAllOfMatcher<Stmt, GNUNullExpr>
2463     gnuNullExpr;
2464 
2465 /// Matches C11 _Generic expression.
2466 extern const internal::VariadicDynCastAllOfMatcher<Stmt, GenericSelectionExpr>
2467     genericSelectionExpr;
2468 
2469 /// Matches atomic builtins.
2470 /// Example matches __atomic_load_n(ptr, 1)
2471 /// \code
2472 ///   void foo() { int *ptr; __atomic_load_n(ptr, 1); }
2473 /// \endcode
2474 extern const internal::VariadicDynCastAllOfMatcher<Stmt, AtomicExpr> atomicExpr;
2475 
2476 /// Matches statement expression (GNU extension).
2477 ///
2478 /// Example match: ({ int X = 4; X; })
2479 /// \code
2480 ///   int C = ({ int X = 4; X; });
2481 /// \endcode
2482 extern const internal::VariadicDynCastAllOfMatcher<Stmt, StmtExpr> stmtExpr;
2483 
2484 /// Matches binary operator expressions.
2485 ///
2486 /// Example matches a || b
2487 /// \code
2488 ///   !(a || b)
2489 /// \endcode
2490 /// See also the binaryOperation() matcher for more-general matching.
2491 extern const internal::VariadicDynCastAllOfMatcher<Stmt, BinaryOperator>
2492     binaryOperator;
2493 
2494 /// Matches unary operator expressions.
2495 ///
2496 /// Example matches !a
2497 /// \code
2498 ///   !a || b
2499 /// \endcode
2500 extern const internal::VariadicDynCastAllOfMatcher<Stmt, UnaryOperator>
2501     unaryOperator;
2502 
2503 /// Matches conditional operator expressions.
2504 ///
2505 /// Example matches a ? b : c
2506 /// \code
2507 ///   (a ? b : c) + 42
2508 /// \endcode
2509 extern const internal::VariadicDynCastAllOfMatcher<Stmt, ConditionalOperator>
2510     conditionalOperator;
2511 
2512 /// Matches binary conditional operator expressions (GNU extension).
2513 ///
2514 /// Example matches a ?: b
2515 /// \code
2516 ///   (a ?: b) + 42;
2517 /// \endcode
2518 extern const internal::VariadicDynCastAllOfMatcher<Stmt,
2519                                                    BinaryConditionalOperator>
2520     binaryConditionalOperator;
2521 
2522 /// Matches opaque value expressions. They are used as helpers
2523 /// to reference another expressions and can be met
2524 /// in BinaryConditionalOperators, for example.
2525 ///
2526 /// Example matches 'a'
2527 /// \code
2528 ///   (a ?: c) + 42;
2529 /// \endcode
2530 extern const internal::VariadicDynCastAllOfMatcher<Stmt, OpaqueValueExpr>
2531     opaqueValueExpr;
2532 
2533 /// Matches a C++ static_assert declaration.
2534 ///
2535 /// Example:
2536 ///   staticAssertDecl()
2537 /// matches
2538 ///   static_assert(sizeof(S) == sizeof(int))
2539 /// in
2540 /// \code
2541 ///   struct S {
2542 ///     int x;
2543 ///   };
2544 ///   static_assert(sizeof(S) == sizeof(int));
2545 /// \endcode
2546 extern const internal::VariadicDynCastAllOfMatcher<Decl, StaticAssertDecl>
2547     staticAssertDecl;
2548 
2549 /// Matches a reinterpret_cast expression.
2550 ///
2551 /// Either the source expression or the destination type can be matched
2552 /// using has(), but hasDestinationType() is more specific and can be
2553 /// more readable.
2554 ///
2555 /// Example matches reinterpret_cast<char*>(&p) in
2556 /// \code
2557 ///   void* p = reinterpret_cast<char*>(&p);
2558 /// \endcode
2559 extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXReinterpretCastExpr>
2560     cxxReinterpretCastExpr;
2561 
2562 /// Matches a C++ static_cast expression.
2563 ///
2564 /// \see hasDestinationType
2565 /// \see reinterpretCast
2566 ///
2567 /// Example:
2568 ///   cxxStaticCastExpr()
2569 /// matches
2570 ///   static_cast<long>(8)
2571 /// in
2572 /// \code
2573 ///   long eight(static_cast<long>(8));
2574 /// \endcode
2575 extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXStaticCastExpr>
2576     cxxStaticCastExpr;
2577 
2578 /// Matches a dynamic_cast expression.
2579 ///
2580 /// Example:
2581 ///   cxxDynamicCastExpr()
2582 /// matches
2583 ///   dynamic_cast<D*>(&b);
2584 /// in
2585 /// \code
2586 ///   struct B { virtual ~B() {} }; struct D : B {};
2587 ///   B b;
2588 ///   D* p = dynamic_cast<D*>(&b);
2589 /// \endcode
2590 extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXDynamicCastExpr>
2591     cxxDynamicCastExpr;
2592 
2593 /// Matches a const_cast expression.
2594 ///
2595 /// Example: Matches const_cast<int*>(&r) in
2596 /// \code
2597 ///   int n = 42;
2598 ///   const int &r(n);
2599 ///   int* p = const_cast<int*>(&r);
2600 /// \endcode
2601 extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXConstCastExpr>
2602     cxxConstCastExpr;
2603 
2604 /// Matches a C-style cast expression.
2605 ///
2606 /// Example: Matches (int) 2.2f in
2607 /// \code
2608 ///   int i = (int) 2.2f;
2609 /// \endcode
2610 extern const internal::VariadicDynCastAllOfMatcher<Stmt, CStyleCastExpr>
2611     cStyleCastExpr;
2612 
2613 /// Matches explicit cast expressions.
2614 ///
2615 /// Matches any cast expression written in user code, whether it be a
2616 /// C-style cast, a functional-style cast, or a keyword cast.
2617 ///
2618 /// Does not match implicit conversions.
2619 ///
2620 /// Note: the name "explicitCast" is chosen to match Clang's terminology, as
2621 /// Clang uses the term "cast" to apply to implicit conversions as well as to
2622 /// actual cast expressions.
2623 ///
2624 /// \see hasDestinationType.
2625 ///
2626 /// Example: matches all five of the casts in
2627 /// \code
2628 ///   int((int)(reinterpret_cast<int>(static_cast<int>(const_cast<int>(42)))))
2629 /// \endcode
2630 /// but does not match the implicit conversion in
2631 /// \code
2632 ///   long ell = 42;
2633 /// \endcode
2634 extern const internal::VariadicDynCastAllOfMatcher<Stmt, ExplicitCastExpr>
2635     explicitCastExpr;
2636 
2637 /// Matches the implicit cast nodes of Clang's AST.
2638 ///
2639 /// This matches many different places, including function call return value
2640 /// eliding, as well as any type conversions.
2641 extern const internal::VariadicDynCastAllOfMatcher<Stmt, ImplicitCastExpr>
2642     implicitCastExpr;
2643 
2644 /// Matches any cast nodes of Clang's AST.
2645 ///
2646 /// Example: castExpr() matches each of the following:
2647 /// \code
2648 ///   (int) 3;
2649 ///   const_cast<Expr *>(SubExpr);
2650 ///   char c = 0;
2651 /// \endcode
2652 /// but does not match
2653 /// \code
2654 ///   int i = (0);
2655 ///   int k = 0;
2656 /// \endcode
2657 extern const internal::VariadicDynCastAllOfMatcher<Stmt, CastExpr> castExpr;
2658 
2659 /// Matches functional cast expressions
2660 ///
2661 /// Example: Matches Foo(bar);
2662 /// \code
2663 ///   Foo f = bar;
2664 ///   Foo g = (Foo) bar;
2665 ///   Foo h = Foo(bar);
2666 /// \endcode
2667 extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXFunctionalCastExpr>
2668     cxxFunctionalCastExpr;
2669 
2670 /// Matches functional cast expressions having N != 1 arguments
2671 ///
2672 /// Example: Matches Foo(bar, bar)
2673 /// \code
2674 ///   Foo h = Foo(bar, bar);
2675 /// \endcode
2676 extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXTemporaryObjectExpr>
2677     cxxTemporaryObjectExpr;
2678 
2679 /// Matches predefined identifier expressions [C99 6.4.2.2].
2680 ///
2681 /// Example: Matches __func__
2682 /// \code
2683 ///   printf("%s", __func__);
2684 /// \endcode
2685 extern const internal::VariadicDynCastAllOfMatcher<Stmt, PredefinedExpr>
2686     predefinedExpr;
2687 
2688 /// Matches C99 designated initializer expressions [C99 6.7.8].
2689 ///
2690 /// Example: Matches { [2].y = 1.0, [0].x = 1.0 }
2691 /// \code
2692 ///   point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 };
2693 /// \endcode
2694 extern const internal::VariadicDynCastAllOfMatcher<Stmt, DesignatedInitExpr>
2695     designatedInitExpr;
2696 
2697 /// Matches designated initializer expressions that contain
2698 /// a specific number of designators.
2699 ///
2700 /// Example: Given
2701 /// \code
2702 ///   point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 };
2703 ///   point ptarray2[10] = { [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 };
2704 /// \endcode
2705 /// designatorCountIs(2)
2706 ///   matches '{ [2].y = 1.0, [0].x = 1.0 }',
2707 ///   but not '{ [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 }'.
AST_MATCHER_P(DesignatedInitExpr,designatorCountIs,unsigned,N)2708 AST_MATCHER_P(DesignatedInitExpr, designatorCountIs, unsigned, N) {
2709   return Node.size() == N;
2710 }
2711 
2712 /// Matches \c QualTypes in the clang AST.
2713 extern const internal::VariadicAllOfMatcher<QualType> qualType;
2714 
2715 /// Matches \c Types in the clang AST.
2716 extern const internal::VariadicAllOfMatcher<Type> type;
2717 
2718 /// Matches \c TypeLocs in the clang AST.
2719 extern const internal::VariadicAllOfMatcher<TypeLoc> typeLoc;
2720 
2721 /// Matches if any of the given matchers matches.
2722 ///
2723 /// Unlike \c anyOf, \c eachOf will generate a match result for each
2724 /// matching submatcher.
2725 ///
2726 /// For example, in:
2727 /// \code
2728 ///   class A { int a; int b; };
2729 /// \endcode
2730 /// The matcher:
2731 /// \code
2732 ///   cxxRecordDecl(eachOf(has(fieldDecl(hasName("a")).bind("v")),
2733 ///                        has(fieldDecl(hasName("b")).bind("v"))))
2734 /// \endcode
2735 /// will generate two results binding "v", the first of which binds
2736 /// the field declaration of \c a, the second the field declaration of
2737 /// \c b.
2738 ///
2739 /// Usable as: Any Matcher
2740 extern const internal::VariadicOperatorMatcherFunc<
2741     2, std::numeric_limits<unsigned>::max()>
2742     eachOf;
2743 
2744 /// Matches if any of the given matchers matches.
2745 ///
2746 /// Usable as: Any Matcher
2747 extern const internal::VariadicOperatorMatcherFunc<
2748     2, std::numeric_limits<unsigned>::max()>
2749     anyOf;
2750 
2751 /// Matches if all given matchers match.
2752 ///
2753 /// Usable as: Any Matcher
2754 extern const internal::VariadicOperatorMatcherFunc<
2755     2, std::numeric_limits<unsigned>::max()>
2756     allOf;
2757 
2758 /// Matches any node regardless of the submatcher.
2759 ///
2760 /// However, \c optionally will retain any bindings generated by the submatcher.
2761 /// Useful when additional information which may or may not present about a main
2762 /// matching node is desired.
2763 ///
2764 /// For example, in:
2765 /// \code
2766 ///   class Foo {
2767 ///     int bar;
2768 ///   }
2769 /// \endcode
2770 /// The matcher:
2771 /// \code
2772 ///   cxxRecordDecl(
2773 ///     optionally(has(
2774 ///       fieldDecl(hasName("bar")).bind("var")
2775 ///   ))).bind("record")
2776 /// \endcode
2777 /// will produce a result binding for both "record" and "var".
2778 /// The matcher will produce a "record" binding for even if there is no data
2779 /// member named "bar" in that class.
2780 ///
2781 /// Usable as: Any Matcher
2782 extern const internal::VariadicOperatorMatcherFunc<1, 1> optionally;
2783 
2784 /// Matches sizeof (C99), alignof (C++11) and vec_step (OpenCL)
2785 ///
2786 /// Given
2787 /// \code
2788 ///   Foo x = bar;
2789 ///   int y = sizeof(x) + alignof(x);
2790 /// \endcode
2791 /// unaryExprOrTypeTraitExpr()
2792 ///   matches \c sizeof(x) and \c alignof(x)
2793 extern const internal::VariadicDynCastAllOfMatcher<Stmt,
2794                                                    UnaryExprOrTypeTraitExpr>
2795     unaryExprOrTypeTraitExpr;
2796 
2797 /// Matches any of the \p NodeMatchers with InnerMatchers nested within
2798 ///
2799 /// Given
2800 /// \code
2801 ///   if (true);
2802 ///   for (; true; );
2803 /// \endcode
2804 /// with the matcher
2805 /// \code
2806 ///   mapAnyOf(ifStmt, forStmt).with(
2807 ///     hasCondition(cxxBoolLiteralExpr(equals(true)))
2808 ///     ).bind("trueCond")
2809 /// \endcode
2810 /// matches the \c if and the \c for. It is equivalent to:
2811 /// \code
2812 ///   auto trueCond = hasCondition(cxxBoolLiteralExpr(equals(true)));
2813 ///   anyOf(
2814 ///     ifStmt(trueCond).bind("trueCond"),
2815 ///     forStmt(trueCond).bind("trueCond")
2816 ///     );
2817 /// \endcode
2818 ///
2819 /// The with() chain-call accepts zero or more matchers which are combined
2820 /// as-if with allOf() in each of the node matchers.
2821 /// Usable as: Any Matcher
2822 template <typename T, typename... U>
mapAnyOf(internal::VariadicDynCastAllOfMatcher<T,U> const &...)2823 auto mapAnyOf(internal::VariadicDynCastAllOfMatcher<T, U> const &...) {
2824   return internal::MapAnyOfHelper<U...>();
2825 }
2826 
2827 /// Matches nodes which can be used with binary operators.
2828 ///
2829 /// The code
2830 /// \code
2831 ///   var1 != var2;
2832 /// \endcode
2833 /// might be represented in the clang AST as a binaryOperator, a
2834 /// cxxOperatorCallExpr or a cxxRewrittenBinaryOperator, depending on
2835 ///
2836 /// * whether the types of var1 and var2 are fundamental (binaryOperator) or at
2837 ///   least one is a class type (cxxOperatorCallExpr)
2838 /// * whether the code appears in a template declaration, if at least one of the
2839 ///   vars is a dependent-type (binaryOperator)
2840 /// * whether the code relies on a rewritten binary operator, such as a
2841 /// spaceship operator or an inverted equality operator
2842 /// (cxxRewrittenBinaryOperator)
2843 ///
2844 /// This matcher elides details in places where the matchers for the nodes are
2845 /// compatible.
2846 ///
2847 /// Given
2848 /// \code
2849 ///   binaryOperation(
2850 ///     hasOperatorName("!="),
2851 ///     hasLHS(expr().bind("lhs")),
2852 ///     hasRHS(expr().bind("rhs"))
2853 ///   )
2854 /// \endcode
2855 /// matches each use of "!=" in:
2856 /// \code
2857 ///   struct S{
2858 ///       bool operator!=(const S&) const;
2859 ///   };
2860 ///
2861 ///   void foo()
2862 ///   {
2863 ///      1 != 2;
2864 ///      S() != S();
2865 ///   }
2866 ///
2867 ///   template<typename T>
2868 ///   void templ()
2869 ///   {
2870 ///      1 != 2;
2871 ///      T() != S();
2872 ///   }
2873 ///   struct HasOpEq
2874 ///   {
2875 ///       bool operator==(const HasOpEq &) const;
2876 ///   };
2877 ///
2878 ///   void inverse()
2879 ///   {
2880 ///       HasOpEq s1;
2881 ///       HasOpEq s2;
2882 ///       if (s1 != s2)
2883 ///           return;
2884 ///   }
2885 ///
2886 ///   struct HasSpaceship
2887 ///   {
2888 ///       bool operator<=>(const HasOpEq &) const;
2889 ///   };
2890 ///
2891 ///   void use_spaceship()
2892 ///   {
2893 ///       HasSpaceship s1;
2894 ///       HasSpaceship s2;
2895 ///       if (s1 != s2)
2896 ///           return;
2897 ///   }
2898 /// \endcode
2899 extern const internal::MapAnyOfMatcher<BinaryOperator, CXXOperatorCallExpr,
2900                                        CXXRewrittenBinaryOperator>
2901     binaryOperation;
2902 
2903 /// Matches function calls and constructor calls
2904 ///
2905 /// Because CallExpr and CXXConstructExpr do not share a common
2906 /// base class with API accessing arguments etc, AST Matchers for code
2907 /// which should match both are typically duplicated. This matcher
2908 /// removes the need for duplication.
2909 ///
2910 /// Given code
2911 /// \code
2912 /// struct ConstructorTakesInt
2913 /// {
2914 ///   ConstructorTakesInt(int i) {}
2915 /// };
2916 ///
2917 /// void callTakesInt(int i)
2918 /// {
2919 /// }
2920 ///
2921 /// void doCall()
2922 /// {
2923 ///   callTakesInt(42);
2924 /// }
2925 ///
2926 /// void doConstruct()
2927 /// {
2928 ///   ConstructorTakesInt cti(42);
2929 /// }
2930 /// \endcode
2931 ///
2932 /// The matcher
2933 /// \code
2934 /// invocation(hasArgument(0, integerLiteral(equals(42))))
2935 /// \endcode
2936 /// matches the expression in both doCall and doConstruct
2937 extern const internal::MapAnyOfMatcher<CallExpr, CXXConstructExpr> invocation;
2938 
2939 /// Matches unary expressions that have a specific type of argument.
2940 ///
2941 /// Given
2942 /// \code
2943 ///   int a, c; float b; int s = sizeof(a) + sizeof(b) + alignof(c);
2944 /// \endcode
2945 /// unaryExprOrTypeTraitExpr(hasArgumentOfType(asString("int"))
2946 ///   matches \c sizeof(a) and \c alignof(c)
AST_MATCHER_P(UnaryExprOrTypeTraitExpr,hasArgumentOfType,internal::Matcher<QualType>,InnerMatcher)2947 AST_MATCHER_P(UnaryExprOrTypeTraitExpr, hasArgumentOfType,
2948               internal::Matcher<QualType>, InnerMatcher) {
2949   const QualType ArgumentType = Node.getTypeOfArgument();
2950   return InnerMatcher.matches(ArgumentType, Finder, Builder);
2951 }
2952 
2953 /// Matches unary expressions of a certain kind.
2954 ///
2955 /// Given
2956 /// \code
2957 ///   int x;
2958 ///   int s = sizeof(x) + alignof(x)
2959 /// \endcode
2960 /// unaryExprOrTypeTraitExpr(ofKind(UETT_SizeOf))
2961 ///   matches \c sizeof(x)
2962 ///
2963 /// If the matcher is use from clang-query, UnaryExprOrTypeTrait parameter
2964 /// should be passed as a quoted string. e.g., ofKind("UETT_SizeOf").
AST_MATCHER_P(UnaryExprOrTypeTraitExpr,ofKind,UnaryExprOrTypeTrait,Kind)2965 AST_MATCHER_P(UnaryExprOrTypeTraitExpr, ofKind, UnaryExprOrTypeTrait, Kind) {
2966   return Node.getKind() == Kind;
2967 }
2968 
2969 /// Same as unaryExprOrTypeTraitExpr, but only matching
2970 /// alignof.
alignOfExpr(const internal::Matcher<UnaryExprOrTypeTraitExpr> & InnerMatcher)2971 inline internal::BindableMatcher<Stmt> alignOfExpr(
2972     const internal::Matcher<UnaryExprOrTypeTraitExpr> &InnerMatcher) {
2973   return stmt(unaryExprOrTypeTraitExpr(
2974       allOf(anyOf(ofKind(UETT_AlignOf), ofKind(UETT_PreferredAlignOf)),
2975             InnerMatcher)));
2976 }
2977 
2978 /// Same as unaryExprOrTypeTraitExpr, but only matching
2979 /// sizeof.
sizeOfExpr(const internal::Matcher<UnaryExprOrTypeTraitExpr> & InnerMatcher)2980 inline internal::BindableMatcher<Stmt> sizeOfExpr(
2981     const internal::Matcher<UnaryExprOrTypeTraitExpr> &InnerMatcher) {
2982   return stmt(unaryExprOrTypeTraitExpr(
2983       allOf(ofKind(UETT_SizeOf), InnerMatcher)));
2984 }
2985 
2986 /// Matches NamedDecl nodes that have the specified name.
2987 ///
2988 /// Supports specifying enclosing namespaces or classes by prefixing the name
2989 /// with '<enclosing>::'.
2990 /// Does not match typedefs of an underlying type with the given name.
2991 ///
2992 /// Example matches X (Name == "X")
2993 /// \code
2994 ///   class X;
2995 /// \endcode
2996 ///
2997 /// Example matches X (Name is one of "::a::b::X", "a::b::X", "b::X", "X")
2998 /// \code
2999 ///   namespace a { namespace b { class X; } }
3000 /// \endcode
hasName(StringRef Name)3001 inline internal::Matcher<NamedDecl> hasName(StringRef Name) {
3002   return internal::Matcher<NamedDecl>(
3003       new internal::HasNameMatcher({std::string(Name)}));
3004 }
3005 
3006 /// Matches NamedDecl nodes that have any of the specified names.
3007 ///
3008 /// This matcher is only provided as a performance optimization of hasName.
3009 /// \code
3010 ///     hasAnyName(a, b, c)
3011 /// \endcode
3012 ///  is equivalent to, but faster than
3013 /// \code
3014 ///     anyOf(hasName(a), hasName(b), hasName(c))
3015 /// \endcode
3016 extern const internal::VariadicFunction<internal::Matcher<NamedDecl>, StringRef,
3017                                         internal::hasAnyNameFunc>
3018     hasAnyName;
3019 
3020 /// Matches NamedDecl nodes whose fully qualified names contain
3021 /// a substring matched by the given RegExp.
3022 ///
3023 /// Supports specifying enclosing namespaces or classes by
3024 /// prefixing the name with '<enclosing>::'.  Does not match typedefs
3025 /// of an underlying type with the given name.
3026 ///
3027 /// Example matches X (regexp == "::X")
3028 /// \code
3029 ///   class X;
3030 /// \endcode
3031 ///
3032 /// Example matches X (regexp is one of "::X", "^foo::.*X", among others)
3033 /// \code
3034 ///   namespace foo { namespace bar { class X; } }
3035 /// \endcode
AST_MATCHER_REGEX(NamedDecl,matchesName,RegExp)3036 AST_MATCHER_REGEX(NamedDecl, matchesName, RegExp) {
3037   std::string FullNameString = "::" + Node.getQualifiedNameAsString();
3038   return RegExp->match(FullNameString);
3039 }
3040 
3041 /// Matches overloaded operator names.
3042 ///
3043 /// Matches overloaded operator names specified in strings without the
3044 /// "operator" prefix: e.g. "<<".
3045 ///
3046 /// Given:
3047 /// \code
3048 ///   class A { int operator*(); };
3049 ///   const A &operator<<(const A &a, const A &b);
3050 ///   A a;
3051 ///   a << a;   // <-- This matches
3052 /// \endcode
3053 ///
3054 /// \c cxxOperatorCallExpr(hasOverloadedOperatorName("<<"))) matches the
3055 /// specified line and
3056 /// \c cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*")))
3057 /// matches the declaration of \c A.
3058 ///
3059 /// Usable as: Matcher<CXXOperatorCallExpr>, Matcher<FunctionDecl>
3060 inline internal::PolymorphicMatcher<
3061     internal::HasOverloadedOperatorNameMatcher,
3062     AST_POLYMORPHIC_SUPPORTED_TYPES(CXXOperatorCallExpr, FunctionDecl),
3063     std::vector<std::string>>
hasOverloadedOperatorName(StringRef Name)3064 hasOverloadedOperatorName(StringRef Name) {
3065   return internal::PolymorphicMatcher<
3066       internal::HasOverloadedOperatorNameMatcher,
3067       AST_POLYMORPHIC_SUPPORTED_TYPES(CXXOperatorCallExpr, FunctionDecl),
3068       std::vector<std::string>>({std::string(Name)});
3069 }
3070 
3071 /// Matches overloaded operator names.
3072 ///
3073 /// Matches overloaded operator names specified in strings without the
3074 /// "operator" prefix: e.g. "<<".
3075 ///
3076 ///   hasAnyOverloadedOperatorName("+", "-")
3077 /// Is equivalent to
3078 ///   anyOf(hasOverloadedOperatorName("+"), hasOverloadedOperatorName("-"))
3079 extern const internal::VariadicFunction<
3080     internal::PolymorphicMatcher<internal::HasOverloadedOperatorNameMatcher,
3081                                  AST_POLYMORPHIC_SUPPORTED_TYPES(
3082                                      CXXOperatorCallExpr, FunctionDecl),
3083                                  std::vector<std::string>>,
3084     StringRef, internal::hasAnyOverloadedOperatorNameFunc>
3085     hasAnyOverloadedOperatorName;
3086 
3087 /// Matches template-dependent, but known, member names.
3088 ///
3089 /// In template declarations, dependent members are not resolved and so can
3090 /// not be matched to particular named declarations.
3091 ///
3092 /// This matcher allows to match on the known name of members.
3093 ///
3094 /// Given
3095 /// \code
3096 ///   template <typename T>
3097 ///   struct S {
3098 ///       void mem();
3099 ///   };
3100 ///   template <typename T>
3101 ///   void x() {
3102 ///       S<T> s;
3103 ///       s.mem();
3104 ///   }
3105 /// \endcode
3106 /// \c cxxDependentScopeMemberExpr(hasMemberName("mem")) matches `s.mem()`
AST_MATCHER_P(CXXDependentScopeMemberExpr,hasMemberName,std::string,N)3107 AST_MATCHER_P(CXXDependentScopeMemberExpr, hasMemberName, std::string, N) {
3108   return Node.getMember().getAsString() == N;
3109 }
3110 
3111 /// Matches template-dependent, but known, member names against an already-bound
3112 /// node
3113 ///
3114 /// In template declarations, dependent members are not resolved and so can
3115 /// not be matched to particular named declarations.
3116 ///
3117 /// This matcher allows to match on the name of already-bound VarDecl, FieldDecl
3118 /// and CXXMethodDecl nodes.
3119 ///
3120 /// Given
3121 /// \code
3122 ///   template <typename T>
3123 ///   struct S {
3124 ///       void mem();
3125 ///   };
3126 ///   template <typename T>
3127 ///   void x() {
3128 ///       S<T> s;
3129 ///       s.mem();
3130 ///   }
3131 /// \endcode
3132 /// The matcher
3133 /// @code
3134 /// \c cxxDependentScopeMemberExpr(
3135 ///   hasObjectExpression(declRefExpr(hasType(templateSpecializationType(
3136 ///       hasDeclaration(classTemplateDecl(has(cxxRecordDecl(has(
3137 ///           cxxMethodDecl(hasName("mem")).bind("templMem")
3138 ///           )))))
3139 ///       )))),
3140 ///   memberHasSameNameAsBoundNode("templMem")
3141 ///   )
3142 /// @endcode
3143 /// first matches and binds the @c mem member of the @c S template, then
3144 /// compares its name to the usage in @c s.mem() in the @c x function template
AST_MATCHER_P(CXXDependentScopeMemberExpr,memberHasSameNameAsBoundNode,std::string,BindingID)3145 AST_MATCHER_P(CXXDependentScopeMemberExpr, memberHasSameNameAsBoundNode,
3146               std::string, BindingID) {
3147   auto MemberName = Node.getMember().getAsString();
3148 
3149   return Builder->removeBindings(
3150       [this, MemberName](const BoundNodesMap &Nodes) {
3151         const auto &BN = Nodes.getNode(this->BindingID);
3152         if (const auto *ND = BN.get<NamedDecl>()) {
3153           if (!isa<FieldDecl, CXXMethodDecl, VarDecl>(ND))
3154             return true;
3155           return ND->getName() != MemberName;
3156         }
3157         return true;
3158       });
3159 }
3160 
3161 /// Matches C++ classes that are directly or indirectly derived from a class
3162 /// matching \c Base, or Objective-C classes that directly or indirectly
3163 /// subclass a class matching \c Base.
3164 ///
3165 /// Note that a class is not considered to be derived from itself.
3166 ///
3167 /// Example matches Y, Z, C (Base == hasName("X"))
3168 /// \code
3169 ///   class X;
3170 ///   class Y : public X {};  // directly derived
3171 ///   class Z : public Y {};  // indirectly derived
3172 ///   typedef X A;
3173 ///   typedef A B;
3174 ///   class C : public B {};  // derived from a typedef of X
3175 /// \endcode
3176 ///
3177 /// In the following example, Bar matches isDerivedFrom(hasName("X")):
3178 /// \code
3179 ///   class Foo;
3180 ///   typedef Foo X;
3181 ///   class Bar : public Foo {};  // derived from a type that X is a typedef of
3182 /// \endcode
3183 ///
3184 /// In the following example, Bar matches isDerivedFrom(hasName("NSObject"))
3185 /// \code
3186 ///   @interface NSObject @end
3187 ///   @interface Bar : NSObject @end
3188 /// \endcode
3189 ///
3190 /// Usable as: Matcher<CXXRecordDecl>, Matcher<ObjCInterfaceDecl>
AST_POLYMORPHIC_MATCHER_P(isDerivedFrom,AST_POLYMORPHIC_SUPPORTED_TYPES (CXXRecordDecl,ObjCInterfaceDecl),internal::Matcher<NamedDecl>,Base)3191 AST_POLYMORPHIC_MATCHER_P(
3192     isDerivedFrom,
3193     AST_POLYMORPHIC_SUPPORTED_TYPES(CXXRecordDecl, ObjCInterfaceDecl),
3194     internal::Matcher<NamedDecl>, Base) {
3195   // Check if the node is a C++ struct/union/class.
3196   if (const auto *RD = dyn_cast<CXXRecordDecl>(&Node))
3197     return Finder->classIsDerivedFrom(RD, Base, Builder, /*Directly=*/false);
3198 
3199   // The node must be an Objective-C class.
3200   const auto *InterfaceDecl = cast<ObjCInterfaceDecl>(&Node);
3201   return Finder->objcClassIsDerivedFrom(InterfaceDecl, Base, Builder,
3202                                         /*Directly=*/false);
3203 }
3204 
3205 /// Overloaded method as shortcut for \c isDerivedFrom(hasName(...)).
3206 AST_POLYMORPHIC_MATCHER_P_OVERLOAD(
3207     isDerivedFrom,
3208     AST_POLYMORPHIC_SUPPORTED_TYPES(CXXRecordDecl, ObjCInterfaceDecl),
3209     std::string, BaseName, 1) {
3210   if (BaseName.empty())
3211     return false;
3212 
3213   const auto M = isDerivedFrom(hasName(BaseName));
3214 
3215   if (const auto *RD = dyn_cast<CXXRecordDecl>(&Node))
3216     return Matcher<CXXRecordDecl>(M).matches(*RD, Finder, Builder);
3217 
3218   const auto *InterfaceDecl = cast<ObjCInterfaceDecl>(&Node);
3219   return Matcher<ObjCInterfaceDecl>(M).matches(*InterfaceDecl, Finder, Builder);
3220 }
3221 
3222 /// Matches C++ classes that have a direct or indirect base matching \p
3223 /// BaseSpecMatcher.
3224 ///
3225 /// Example:
3226 /// matcher hasAnyBase(hasType(cxxRecordDecl(hasName("SpecialBase"))))
3227 /// \code
3228 ///   class Foo;
3229 ///   class Bar : Foo {};
3230 ///   class Baz : Bar {};
3231 ///   class SpecialBase;
3232 ///   class Proxy : SpecialBase {};  // matches Proxy
3233 ///   class IndirectlyDerived : Proxy {};  //matches IndirectlyDerived
3234 /// \endcode
3235 ///
3236 // FIXME: Refactor this and isDerivedFrom to reuse implementation.
AST_MATCHER_P(CXXRecordDecl,hasAnyBase,internal::Matcher<CXXBaseSpecifier>,BaseSpecMatcher)3237 AST_MATCHER_P(CXXRecordDecl, hasAnyBase, internal::Matcher<CXXBaseSpecifier>,
3238               BaseSpecMatcher) {
3239   return internal::matchesAnyBase(Node, BaseSpecMatcher, Finder, Builder);
3240 }
3241 
3242 /// Matches C++ classes that have a direct base matching \p BaseSpecMatcher.
3243 ///
3244 /// Example:
3245 /// matcher hasDirectBase(hasType(cxxRecordDecl(hasName("SpecialBase"))))
3246 /// \code
3247 ///   class Foo;
3248 ///   class Bar : Foo {};
3249 ///   class Baz : Bar {};
3250 ///   class SpecialBase;
3251 ///   class Proxy : SpecialBase {};  // matches Proxy
3252 ///   class IndirectlyDerived : Proxy {};  // doesn't match
3253 /// \endcode
AST_MATCHER_P(CXXRecordDecl,hasDirectBase,internal::Matcher<CXXBaseSpecifier>,BaseSpecMatcher)3254 AST_MATCHER_P(CXXRecordDecl, hasDirectBase, internal::Matcher<CXXBaseSpecifier>,
3255               BaseSpecMatcher) {
3256   return Node.hasDefinition() &&
3257          llvm::any_of(Node.bases(), [&](const CXXBaseSpecifier &Base) {
3258            return BaseSpecMatcher.matches(Base, Finder, Builder);
3259          });
3260 }
3261 
3262 /// Similar to \c isDerivedFrom(), but also matches classes that directly
3263 /// match \c Base.
3264 AST_POLYMORPHIC_MATCHER_P_OVERLOAD(
3265     isSameOrDerivedFrom,
3266     AST_POLYMORPHIC_SUPPORTED_TYPES(CXXRecordDecl, ObjCInterfaceDecl),
3267     internal::Matcher<NamedDecl>, Base, 0) {
3268   const auto M = anyOf(Base, isDerivedFrom(Base));
3269 
3270   if (const auto *RD = dyn_cast<CXXRecordDecl>(&Node))
3271     return Matcher<CXXRecordDecl>(M).matches(*RD, Finder, Builder);
3272 
3273   const auto *InterfaceDecl = cast<ObjCInterfaceDecl>(&Node);
3274   return Matcher<ObjCInterfaceDecl>(M).matches(*InterfaceDecl, Finder, Builder);
3275 }
3276 
3277 /// Overloaded method as shortcut for
3278 /// \c isSameOrDerivedFrom(hasName(...)).
3279 AST_POLYMORPHIC_MATCHER_P_OVERLOAD(
3280     isSameOrDerivedFrom,
3281     AST_POLYMORPHIC_SUPPORTED_TYPES(CXXRecordDecl, ObjCInterfaceDecl),
3282     std::string, BaseName, 1) {
3283   if (BaseName.empty())
3284     return false;
3285 
3286   const auto M = isSameOrDerivedFrom(hasName(BaseName));
3287 
3288   if (const auto *RD = dyn_cast<CXXRecordDecl>(&Node))
3289     return Matcher<CXXRecordDecl>(M).matches(*RD, Finder, Builder);
3290 
3291   const auto *InterfaceDecl = cast<ObjCInterfaceDecl>(&Node);
3292   return Matcher<ObjCInterfaceDecl>(M).matches(*InterfaceDecl, Finder, Builder);
3293 }
3294 
3295 /// Matches C++ or Objective-C classes that are directly derived from a class
3296 /// matching \c Base.
3297 ///
3298 /// Note that a class is not considered to be derived from itself.
3299 ///
3300 /// Example matches Y, C (Base == hasName("X"))
3301 /// \code
3302 ///   class X;
3303 ///   class Y : public X {};  // directly derived
3304 ///   class Z : public Y {};  // indirectly derived
3305 ///   typedef X A;
3306 ///   typedef A B;
3307 ///   class C : public B {};  // derived from a typedef of X
3308 /// \endcode
3309 ///
3310 /// In the following example, Bar matches isDerivedFrom(hasName("X")):
3311 /// \code
3312 ///   class Foo;
3313 ///   typedef Foo X;
3314 ///   class Bar : public Foo {};  // derived from a type that X is a typedef of
3315 /// \endcode
3316 AST_POLYMORPHIC_MATCHER_P_OVERLOAD(
3317     isDirectlyDerivedFrom,
3318     AST_POLYMORPHIC_SUPPORTED_TYPES(CXXRecordDecl, ObjCInterfaceDecl),
3319     internal::Matcher<NamedDecl>, Base, 0) {
3320   // Check if the node is a C++ struct/union/class.
3321   if (const auto *RD = dyn_cast<CXXRecordDecl>(&Node))
3322     return Finder->classIsDerivedFrom(RD, Base, Builder, /*Directly=*/true);
3323 
3324   // The node must be an Objective-C class.
3325   const auto *InterfaceDecl = cast<ObjCInterfaceDecl>(&Node);
3326   return Finder->objcClassIsDerivedFrom(InterfaceDecl, Base, Builder,
3327                                         /*Directly=*/true);
3328 }
3329 
3330 /// Overloaded method as shortcut for \c isDirectlyDerivedFrom(hasName(...)).
3331 AST_POLYMORPHIC_MATCHER_P_OVERLOAD(
3332     isDirectlyDerivedFrom,
3333     AST_POLYMORPHIC_SUPPORTED_TYPES(CXXRecordDecl, ObjCInterfaceDecl),
3334     std::string, BaseName, 1) {
3335   if (BaseName.empty())
3336     return false;
3337   const auto M = isDirectlyDerivedFrom(hasName(BaseName));
3338 
3339   if (const auto *RD = dyn_cast<CXXRecordDecl>(&Node))
3340     return Matcher<CXXRecordDecl>(M).matches(*RD, Finder, Builder);
3341 
3342   const auto *InterfaceDecl = cast<ObjCInterfaceDecl>(&Node);
3343   return Matcher<ObjCInterfaceDecl>(M).matches(*InterfaceDecl, Finder, Builder);
3344 }
3345 /// Matches the first method of a class or struct that satisfies \c
3346 /// InnerMatcher.
3347 ///
3348 /// Given:
3349 /// \code
3350 ///   class A { void func(); };
3351 ///   class B { void member(); };
3352 /// \endcode
3353 ///
3354 /// \c cxxRecordDecl(hasMethod(hasName("func"))) matches the declaration of
3355 /// \c A but not \c B.
AST_MATCHER_P(CXXRecordDecl,hasMethod,internal::Matcher<CXXMethodDecl>,InnerMatcher)3356 AST_MATCHER_P(CXXRecordDecl, hasMethod, internal::Matcher<CXXMethodDecl>,
3357               InnerMatcher) {
3358   BoundNodesTreeBuilder Result(*Builder);
3359   auto MatchIt = matchesFirstInPointerRange(InnerMatcher, Node.method_begin(),
3360                                             Node.method_end(), Finder, &Result);
3361   if (MatchIt == Node.method_end())
3362     return false;
3363 
3364   if (Finder->isTraversalIgnoringImplicitNodes() && (*MatchIt)->isImplicit())
3365     return false;
3366   *Builder = std::move(Result);
3367   return true;
3368 }
3369 
3370 /// Matches the generated class of lambda expressions.
3371 ///
3372 /// Given:
3373 /// \code
3374 ///   auto x = []{};
3375 /// \endcode
3376 ///
3377 /// \c cxxRecordDecl(isLambda()) matches the implicit class declaration of
3378 /// \c decltype(x)
AST_MATCHER(CXXRecordDecl,isLambda)3379 AST_MATCHER(CXXRecordDecl, isLambda) {
3380   return Node.isLambda();
3381 }
3382 
3383 /// Matches AST nodes that have child AST nodes that match the
3384 /// provided matcher.
3385 ///
3386 /// Example matches X, Y
3387 ///   (matcher = cxxRecordDecl(has(cxxRecordDecl(hasName("X")))
3388 /// \code
3389 ///   class X {};  // Matches X, because X::X is a class of name X inside X.
3390 ///   class Y { class X {}; };
3391 ///   class Z { class Y { class X {}; }; };  // Does not match Z.
3392 /// \endcode
3393 ///
3394 /// ChildT must be an AST base type.
3395 ///
3396 /// Usable as: Any Matcher
3397 /// Note that has is direct matcher, so it also matches things like implicit
3398 /// casts and paren casts. If you are matching with expr then you should
3399 /// probably consider using ignoringParenImpCasts like:
3400 /// has(ignoringParenImpCasts(expr())).
3401 extern const internal::ArgumentAdaptingMatcherFunc<internal::HasMatcher> has;
3402 
3403 /// Matches AST nodes that have descendant AST nodes that match the
3404 /// provided matcher.
3405 ///
3406 /// Example matches X, Y, Z
3407 ///     (matcher = cxxRecordDecl(hasDescendant(cxxRecordDecl(hasName("X")))))
3408 /// \code
3409 ///   class X {};  // Matches X, because X::X is a class of name X inside X.
3410 ///   class Y { class X {}; };
3411 ///   class Z { class Y { class X {}; }; };
3412 /// \endcode
3413 ///
3414 /// DescendantT must be an AST base type.
3415 ///
3416 /// Usable as: Any Matcher
3417 extern const internal::ArgumentAdaptingMatcherFunc<
3418     internal::HasDescendantMatcher>
3419     hasDescendant;
3420 
3421 /// Matches AST nodes that have child AST nodes that match the
3422 /// provided matcher.
3423 ///
3424 /// Example matches X, Y, Y::X, Z::Y, Z::Y::X
3425 ///   (matcher = cxxRecordDecl(forEach(cxxRecordDecl(hasName("X")))
3426 /// \code
3427 ///   class X {};
3428 ///   class Y { class X {}; };  // Matches Y, because Y::X is a class of name X
3429 ///                             // inside Y.
3430 ///   class Z { class Y { class X {}; }; };  // Does not match Z.
3431 /// \endcode
3432 ///
3433 /// ChildT must be an AST base type.
3434 ///
3435 /// As opposed to 'has', 'forEach' will cause a match for each result that
3436 /// matches instead of only on the first one.
3437 ///
3438 /// Usable as: Any Matcher
3439 extern const internal::ArgumentAdaptingMatcherFunc<internal::ForEachMatcher>
3440     forEach;
3441 
3442 /// Matches AST nodes that have descendant AST nodes that match the
3443 /// provided matcher.
3444 ///
3445 /// Example matches X, A, A::X, B, B::C, B::C::X
3446 ///   (matcher = cxxRecordDecl(forEachDescendant(cxxRecordDecl(hasName("X")))))
3447 /// \code
3448 ///   class X {};
3449 ///   class A { class X {}; };  // Matches A, because A::X is a class of name
3450 ///                             // X inside A.
3451 ///   class B { class C { class X {}; }; };
3452 /// \endcode
3453 ///
3454 /// DescendantT must be an AST base type.
3455 ///
3456 /// As opposed to 'hasDescendant', 'forEachDescendant' will cause a match for
3457 /// each result that matches instead of only on the first one.
3458 ///
3459 /// Note: Recursively combined ForEachDescendant can cause many matches:
3460 ///   cxxRecordDecl(forEachDescendant(cxxRecordDecl(
3461 ///     forEachDescendant(cxxRecordDecl())
3462 ///   )))
3463 /// will match 10 times (plus injected class name matches) on:
3464 /// \code
3465 ///   class A { class B { class C { class D { class E {}; }; }; }; };
3466 /// \endcode
3467 ///
3468 /// Usable as: Any Matcher
3469 extern const internal::ArgumentAdaptingMatcherFunc<
3470     internal::ForEachDescendantMatcher>
3471     forEachDescendant;
3472 
3473 /// Matches if the node or any descendant matches.
3474 ///
3475 /// Generates results for each match.
3476 ///
3477 /// For example, in:
3478 /// \code
3479 ///   class A { class B {}; class C {}; };
3480 /// \endcode
3481 /// The matcher:
3482 /// \code
3483 ///   cxxRecordDecl(hasName("::A"),
3484 ///                 findAll(cxxRecordDecl(isDefinition()).bind("m")))
3485 /// \endcode
3486 /// will generate results for \c A, \c B and \c C.
3487 ///
3488 /// Usable as: Any Matcher
3489 template <typename T>
findAll(const internal::Matcher<T> & Matcher)3490 internal::Matcher<T> findAll(const internal::Matcher<T> &Matcher) {
3491   return eachOf(Matcher, forEachDescendant(Matcher));
3492 }
3493 
3494 /// Matches AST nodes that have a parent that matches the provided
3495 /// matcher.
3496 ///
3497 /// Given
3498 /// \code
3499 /// void f() { for (;;) { int x = 42; if (true) { int x = 43; } } }
3500 /// \endcode
3501 /// \c compoundStmt(hasParent(ifStmt())) matches "{ int x = 43; }".
3502 ///
3503 /// Usable as: Any Matcher
3504 extern const internal::ArgumentAdaptingMatcherFunc<
3505     internal::HasParentMatcher,
3506     internal::TypeList<Decl, NestedNameSpecifierLoc, Stmt, TypeLoc, Attr>,
3507     internal::TypeList<Decl, NestedNameSpecifierLoc, Stmt, TypeLoc, Attr>>
3508     hasParent;
3509 
3510 /// Matches AST nodes that have an ancestor that matches the provided
3511 /// matcher.
3512 ///
3513 /// Given
3514 /// \code
3515 /// void f() { if (true) { int x = 42; } }
3516 /// void g() { for (;;) { int x = 43; } }
3517 /// \endcode
3518 /// \c expr(integerLiteral(hasAncestor(ifStmt()))) matches \c 42, but not 43.
3519 ///
3520 /// Usable as: Any Matcher
3521 extern const internal::ArgumentAdaptingMatcherFunc<
3522     internal::HasAncestorMatcher,
3523     internal::TypeList<Decl, NestedNameSpecifierLoc, Stmt, TypeLoc, Attr>,
3524     internal::TypeList<Decl, NestedNameSpecifierLoc, Stmt, TypeLoc, Attr>>
3525     hasAncestor;
3526 
3527 /// Matches if the provided matcher does not match.
3528 ///
3529 /// Example matches Y (matcher = cxxRecordDecl(unless(hasName("X"))))
3530 /// \code
3531 ///   class X {};
3532 ///   class Y {};
3533 /// \endcode
3534 ///
3535 /// Usable as: Any Matcher
3536 extern const internal::VariadicOperatorMatcherFunc<1, 1> unless;
3537 
3538 /// Matches a node if the declaration associated with that node
3539 /// matches the given matcher.
3540 ///
3541 /// The associated declaration is:
3542 /// - for type nodes, the declaration of the underlying type
3543 /// - for CallExpr, the declaration of the callee
3544 /// - for MemberExpr, the declaration of the referenced member
3545 /// - for CXXConstructExpr, the declaration of the constructor
3546 /// - for CXXNewExpr, the declaration of the operator new
3547 /// - for ObjCIvarExpr, the declaration of the ivar
3548 ///
3549 /// For type nodes, hasDeclaration will generally match the declaration of the
3550 /// sugared type. Given
3551 /// \code
3552 ///   class X {};
3553 ///   typedef X Y;
3554 ///   Y y;
3555 /// \endcode
3556 /// in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
3557 /// typedefDecl. A common use case is to match the underlying, desugared type.
3558 /// This can be achieved by using the hasUnqualifiedDesugaredType matcher:
3559 /// \code
3560 ///   varDecl(hasType(hasUnqualifiedDesugaredType(
3561 ///       recordType(hasDeclaration(decl())))))
3562 /// \endcode
3563 /// In this matcher, the decl will match the CXXRecordDecl of class X.
3564 ///
3565 /// Usable as: Matcher<AddrLabelExpr>, Matcher<CallExpr>,
3566 ///   Matcher<CXXConstructExpr>, Matcher<CXXNewExpr>, Matcher<DeclRefExpr>,
3567 ///   Matcher<EnumType>, Matcher<InjectedClassNameType>, Matcher<LabelStmt>,
3568 ///   Matcher<MemberExpr>, Matcher<QualType>, Matcher<RecordType>,
3569 ///   Matcher<TagType>, Matcher<TemplateSpecializationType>,
3570 ///   Matcher<TemplateTypeParmType>, Matcher<TypedefType>,
3571 ///   Matcher<UnresolvedUsingType>
3572 inline internal::PolymorphicMatcher<
3573     internal::HasDeclarationMatcher,
3574     void(internal::HasDeclarationSupportedTypes), internal::Matcher<Decl>>
hasDeclaration(const internal::Matcher<Decl> & InnerMatcher)3575 hasDeclaration(const internal::Matcher<Decl> &InnerMatcher) {
3576   return internal::PolymorphicMatcher<
3577       internal::HasDeclarationMatcher,
3578       void(internal::HasDeclarationSupportedTypes), internal::Matcher<Decl>>(
3579       InnerMatcher);
3580 }
3581 
3582 /// Matches a \c NamedDecl whose underlying declaration matches the given
3583 /// matcher.
3584 ///
3585 /// Given
3586 /// \code
3587 ///   namespace N { template<class T> void f(T t); }
3588 ///   template <class T> void g() { using N::f; f(T()); }
3589 /// \endcode
3590 /// \c unresolvedLookupExpr(hasAnyDeclaration(
3591 ///     namedDecl(hasUnderlyingDecl(hasName("::N::f")))))
3592 ///   matches the use of \c f in \c g() .
AST_MATCHER_P(NamedDecl,hasUnderlyingDecl,internal::Matcher<NamedDecl>,InnerMatcher)3593 AST_MATCHER_P(NamedDecl, hasUnderlyingDecl, internal::Matcher<NamedDecl>,
3594               InnerMatcher) {
3595   const NamedDecl *UnderlyingDecl = Node.getUnderlyingDecl();
3596 
3597   return UnderlyingDecl != nullptr &&
3598          InnerMatcher.matches(*UnderlyingDecl, Finder, Builder);
3599 }
3600 
3601 /// Matches on the implicit object argument of a member call expression, after
3602 /// stripping off any parentheses or implicit casts.
3603 ///
3604 /// Given
3605 /// \code
3606 ///   class Y { public: void m(); };
3607 ///   Y g();
3608 ///   class X : public Y {};
3609 ///   void z(Y y, X x) { y.m(); (g()).m(); x.m(); }
3610 /// \endcode
3611 /// cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("Y")))))
3612 ///   matches `y.m()` and `(g()).m()`.
3613 /// cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("X")))))
3614 ///   matches `x.m()`.
3615 /// cxxMemberCallExpr(on(callExpr()))
3616 ///   matches `(g()).m()`.
3617 ///
3618 /// FIXME: Overload to allow directly matching types?
AST_MATCHER_P(CXXMemberCallExpr,on,internal::Matcher<Expr>,InnerMatcher)3619 AST_MATCHER_P(CXXMemberCallExpr, on, internal::Matcher<Expr>,
3620               InnerMatcher) {
3621   const Expr *ExprNode = Node.getImplicitObjectArgument()
3622                             ->IgnoreParenImpCasts();
3623   return (ExprNode != nullptr &&
3624           InnerMatcher.matches(*ExprNode, Finder, Builder));
3625 }
3626 
3627 
3628 /// Matches on the receiver of an ObjectiveC Message expression.
3629 ///
3630 /// Example
3631 /// matcher = objCMessageExpr(hasReceiverType(asString("UIWebView *")));
3632 /// matches the [webView ...] message invocation.
3633 /// \code
3634 ///   NSString *webViewJavaScript = ...
3635 ///   UIWebView *webView = ...
3636 ///   [webView stringByEvaluatingJavaScriptFromString:webViewJavascript];
3637 /// \endcode
AST_MATCHER_P(ObjCMessageExpr,hasReceiverType,internal::Matcher<QualType>,InnerMatcher)3638 AST_MATCHER_P(ObjCMessageExpr, hasReceiverType, internal::Matcher<QualType>,
3639               InnerMatcher) {
3640   const QualType TypeDecl = Node.getReceiverType();
3641   return InnerMatcher.matches(TypeDecl, Finder, Builder);
3642 }
3643 
3644 /// Returns true when the Objective-C method declaration is a class method.
3645 ///
3646 /// Example
3647 /// matcher = objcMethodDecl(isClassMethod())
3648 /// matches
3649 /// \code
3650 /// @interface I + (void)foo; @end
3651 /// \endcode
3652 /// but not
3653 /// \code
3654 /// @interface I - (void)bar; @end
3655 /// \endcode
AST_MATCHER(ObjCMethodDecl,isClassMethod)3656 AST_MATCHER(ObjCMethodDecl, isClassMethod) {
3657   return Node.isClassMethod();
3658 }
3659 
3660 /// Returns true when the Objective-C method declaration is an instance method.
3661 ///
3662 /// Example
3663 /// matcher = objcMethodDecl(isInstanceMethod())
3664 /// matches
3665 /// \code
3666 /// @interface I - (void)bar; @end
3667 /// \endcode
3668 /// but not
3669 /// \code
3670 /// @interface I + (void)foo; @end
3671 /// \endcode
AST_MATCHER(ObjCMethodDecl,isInstanceMethod)3672 AST_MATCHER(ObjCMethodDecl, isInstanceMethod) {
3673   return Node.isInstanceMethod();
3674 }
3675 
3676 /// Returns true when the Objective-C message is sent to a class.
3677 ///
3678 /// Example
3679 /// matcher = objcMessageExpr(isClassMessage())
3680 /// matches
3681 /// \code
3682 ///   [NSString stringWithFormat:@"format"];
3683 /// \endcode
3684 /// but not
3685 /// \code
3686 ///   NSString *x = @"hello";
3687 ///   [x containsString:@"h"];
3688 /// \endcode
AST_MATCHER(ObjCMessageExpr,isClassMessage)3689 AST_MATCHER(ObjCMessageExpr, isClassMessage) {
3690   return Node.isClassMessage();
3691 }
3692 
3693 /// Returns true when the Objective-C message is sent to an instance.
3694 ///
3695 /// Example
3696 /// matcher = objcMessageExpr(isInstanceMessage())
3697 /// matches
3698 /// \code
3699 ///   NSString *x = @"hello";
3700 ///   [x containsString:@"h"];
3701 /// \endcode
3702 /// but not
3703 /// \code
3704 ///   [NSString stringWithFormat:@"format"];
3705 /// \endcode
AST_MATCHER(ObjCMessageExpr,isInstanceMessage)3706 AST_MATCHER(ObjCMessageExpr, isInstanceMessage) {
3707   return Node.isInstanceMessage();
3708 }
3709 
3710 /// Matches if the Objective-C message is sent to an instance,
3711 /// and the inner matcher matches on that instance.
3712 ///
3713 /// For example the method call in
3714 /// \code
3715 ///   NSString *x = @"hello";
3716 ///   [x containsString:@"h"];
3717 /// \endcode
3718 /// is matched by
3719 /// objcMessageExpr(hasReceiver(declRefExpr(to(varDecl(hasName("x"))))))
AST_MATCHER_P(ObjCMessageExpr,hasReceiver,internal::Matcher<Expr>,InnerMatcher)3720 AST_MATCHER_P(ObjCMessageExpr, hasReceiver, internal::Matcher<Expr>,
3721               InnerMatcher) {
3722   const Expr *ReceiverNode = Node.getInstanceReceiver();
3723   return (ReceiverNode != nullptr &&
3724           InnerMatcher.matches(*ReceiverNode->IgnoreParenImpCasts(), Finder,
3725                                Builder));
3726 }
3727 
3728 /// Matches when BaseName == Selector.getAsString()
3729 ///
3730 ///  matcher = objCMessageExpr(hasSelector("loadHTMLString:baseURL:"));
3731 ///  matches the outer message expr in the code below, but NOT the message
3732 ///  invocation for self.bodyView.
3733 /// \code
3734 ///     [self.bodyView loadHTMLString:html baseURL:NULL];
3735 /// \endcode
AST_MATCHER_P(ObjCMessageExpr,hasSelector,std::string,BaseName)3736 AST_MATCHER_P(ObjCMessageExpr, hasSelector, std::string, BaseName) {
3737   Selector Sel = Node.getSelector();
3738   return BaseName == Sel.getAsString();
3739 }
3740 
3741 /// Matches when at least one of the supplied string equals to the
3742 /// Selector.getAsString()
3743 ///
3744 ///  matcher = objCMessageExpr(hasSelector("methodA:", "methodB:"));
3745 ///  matches both of the expressions below:
3746 /// \code
3747 ///     [myObj methodA:argA];
3748 ///     [myObj methodB:argB];
3749 /// \endcode
3750 extern const internal::VariadicFunction<internal::Matcher<ObjCMessageExpr>,
3751                                         StringRef,
3752                                         internal::hasAnySelectorFunc>
3753                                         hasAnySelector;
3754 
3755 /// Matches ObjC selectors whose name contains
3756 /// a substring matched by the given RegExp.
3757 ///  matcher = objCMessageExpr(matchesSelector("loadHTMLString\:baseURL?"));
3758 ///  matches the outer message expr in the code below, but NOT the message
3759 ///  invocation for self.bodyView.
3760 /// \code
3761 ///     [self.bodyView loadHTMLString:html baseURL:NULL];
3762 /// \endcode
AST_MATCHER_REGEX(ObjCMessageExpr,matchesSelector,RegExp)3763 AST_MATCHER_REGEX(ObjCMessageExpr, matchesSelector, RegExp) {
3764   std::string SelectorString = Node.getSelector().getAsString();
3765   return RegExp->match(SelectorString);
3766 }
3767 
3768 /// Matches when the selector is the empty selector
3769 ///
3770 /// Matches only when the selector of the objCMessageExpr is NULL. This may
3771 /// represent an error condition in the tree!
AST_MATCHER(ObjCMessageExpr,hasNullSelector)3772 AST_MATCHER(ObjCMessageExpr, hasNullSelector) {
3773   return Node.getSelector().isNull();
3774 }
3775 
3776 /// Matches when the selector is a Unary Selector
3777 ///
3778 ///  matcher = objCMessageExpr(matchesSelector(hasUnarySelector());
3779 ///  matches self.bodyView in the code below, but NOT the outer message
3780 ///  invocation of "loadHTMLString:baseURL:".
3781 /// \code
3782 ///     [self.bodyView loadHTMLString:html baseURL:NULL];
3783 /// \endcode
AST_MATCHER(ObjCMessageExpr,hasUnarySelector)3784 AST_MATCHER(ObjCMessageExpr, hasUnarySelector) {
3785   return Node.getSelector().isUnarySelector();
3786 }
3787 
3788 /// Matches when the selector is a keyword selector
3789 ///
3790 /// objCMessageExpr(hasKeywordSelector()) matches the generated setFrame
3791 /// message expression in
3792 ///
3793 /// \code
3794 ///   UIWebView *webView = ...;
3795 ///   CGRect bodyFrame = webView.frame;
3796 ///   bodyFrame.size.height = self.bodyContentHeight;
3797 ///   webView.frame = bodyFrame;
3798 ///   //     ^---- matches here
3799 /// \endcode
AST_MATCHER(ObjCMessageExpr,hasKeywordSelector)3800 AST_MATCHER(ObjCMessageExpr, hasKeywordSelector) {
3801   return Node.getSelector().isKeywordSelector();
3802 }
3803 
3804 /// Matches when the selector has the specified number of arguments
3805 ///
3806 ///  matcher = objCMessageExpr(numSelectorArgs(0));
3807 ///  matches self.bodyView in the code below
3808 ///
3809 ///  matcher = objCMessageExpr(numSelectorArgs(2));
3810 ///  matches the invocation of "loadHTMLString:baseURL:" but not that
3811 ///  of self.bodyView
3812 /// \code
3813 ///     [self.bodyView loadHTMLString:html baseURL:NULL];
3814 /// \endcode
AST_MATCHER_P(ObjCMessageExpr,numSelectorArgs,unsigned,N)3815 AST_MATCHER_P(ObjCMessageExpr, numSelectorArgs, unsigned, N) {
3816   return Node.getSelector().getNumArgs() == N;
3817 }
3818 
3819 /// Matches if the call expression's callee expression matches.
3820 ///
3821 /// Given
3822 /// \code
3823 ///   class Y { void x() { this->x(); x(); Y y; y.x(); } };
3824 ///   void f() { f(); }
3825 /// \endcode
3826 /// callExpr(callee(expr()))
3827 ///   matches this->x(), x(), y.x(), f()
3828 /// with callee(...)
3829 ///   matching this->x, x, y.x, f respectively
3830 ///
3831 /// Note: Callee cannot take the more general internal::Matcher<Expr>
3832 /// because this introduces ambiguous overloads with calls to Callee taking a
3833 /// internal::Matcher<Decl>, as the matcher hierarchy is purely
3834 /// implemented in terms of implicit casts.
AST_MATCHER_P(CallExpr,callee,internal::Matcher<Stmt>,InnerMatcher)3835 AST_MATCHER_P(CallExpr, callee, internal::Matcher<Stmt>,
3836               InnerMatcher) {
3837   const Expr *ExprNode = Node.getCallee();
3838   return (ExprNode != nullptr &&
3839           InnerMatcher.matches(*ExprNode, Finder, Builder));
3840 }
3841 
3842 /// Matches 1) if the call expression's callee's declaration matches the
3843 /// given matcher; or 2) if the Obj-C message expression's callee's method
3844 /// declaration matches the given matcher.
3845 ///
3846 /// Example matches y.x() (matcher = callExpr(callee(
3847 ///                                    cxxMethodDecl(hasName("x")))))
3848 /// \code
3849 ///   class Y { public: void x(); };
3850 ///   void z() { Y y; y.x(); }
3851 /// \endcode
3852 ///
3853 /// Example 2. Matches [I foo] with
3854 /// objcMessageExpr(callee(objcMethodDecl(hasName("foo"))))
3855 ///
3856 /// \code
3857 ///   @interface I: NSObject
3858 ///   +(void)foo;
3859 ///   @end
3860 ///   ...
3861 ///   [I foo]
3862 /// \endcode
3863 AST_POLYMORPHIC_MATCHER_P_OVERLOAD(
3864     callee, AST_POLYMORPHIC_SUPPORTED_TYPES(ObjCMessageExpr, CallExpr),
3865     internal::Matcher<Decl>, InnerMatcher, 1) {
3866   if (const auto *CallNode = dyn_cast<CallExpr>(&Node))
3867     return callExpr(hasDeclaration(InnerMatcher))
3868         .matches(Node, Finder, Builder);
3869   else {
3870     // The dynamic cast below is guaranteed to succeed as there are only 2
3871     // supported return types.
3872     const auto *MsgNode = cast<ObjCMessageExpr>(&Node);
3873     const Decl *DeclNode = MsgNode->getMethodDecl();
3874     return (DeclNode != nullptr &&
3875             InnerMatcher.matches(*DeclNode, Finder, Builder));
3876   }
3877 }
3878 
3879 /// Matches if the expression's or declaration's type matches a type
3880 /// matcher.
3881 ///
3882 /// Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
3883 ///             and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
3884 ///             and U (matcher = typedefDecl(hasType(asString("int")))
3885 ///             and friend class X (matcher = friendDecl(hasType("X"))
3886 ///             and public virtual X (matcher = cxxBaseSpecifier(hasType(
3887 ///                                               asString("class X")))
3888 /// \code
3889 ///  class X {};
3890 ///  void y(X &x) { x; X z; }
3891 ///  typedef int U;
3892 ///  class Y { friend class X; };
3893 ///  class Z : public virtual X {};
3894 /// \endcode
3895 AST_POLYMORPHIC_MATCHER_P_OVERLOAD(
3896     hasType,
3897     AST_POLYMORPHIC_SUPPORTED_TYPES(Expr, FriendDecl, TypedefNameDecl,
3898                                     ValueDecl, CXXBaseSpecifier),
3899     internal::Matcher<QualType>, InnerMatcher, 0) {
3900   QualType QT = internal::getUnderlyingType(Node);
3901   if (!QT.isNull())
3902     return InnerMatcher.matches(QT, Finder, Builder);
3903   return false;
3904 }
3905 
3906 /// Overloaded to match the declaration of the expression's or value
3907 /// declaration's type.
3908 ///
3909 /// In case of a value declaration (for example a variable declaration),
3910 /// this resolves one layer of indirection. For example, in the value
3911 /// declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
3912 /// X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
3913 /// declaration of x.
3914 ///
3915 /// Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
3916 ///             and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
3917 ///             and friend class X (matcher = friendDecl(hasType("X"))
3918 ///             and public virtual X (matcher = cxxBaseSpecifier(hasType(
3919 ///                                               cxxRecordDecl(hasName("X"))))
3920 /// \code
3921 ///  class X {};
3922 ///  void y(X &x) { x; X z; }
3923 ///  class Y { friend class X; };
3924 ///  class Z : public virtual X {};
3925 /// \endcode
3926 ///
3927 /// Example matches class Derived
3928 /// (matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base"))))))
3929 /// \code
3930 /// class Base {};
3931 /// class Derived : Base {};
3932 /// \endcode
3933 ///
3934 /// Usable as: Matcher<Expr>, Matcher<FriendDecl>, Matcher<ValueDecl>,
3935 /// Matcher<CXXBaseSpecifier>
3936 AST_POLYMORPHIC_MATCHER_P_OVERLOAD(
3937     hasType,
3938     AST_POLYMORPHIC_SUPPORTED_TYPES(Expr, FriendDecl, ValueDecl,
3939                                     CXXBaseSpecifier),
3940     internal::Matcher<Decl>, InnerMatcher, 1) {
3941   QualType QT = internal::getUnderlyingType(Node);
3942   if (!QT.isNull())
3943     return qualType(hasDeclaration(InnerMatcher)).matches(QT, Finder, Builder);
3944   return false;
3945 }
3946 
3947 /// Matches if the type location of a node matches the inner matcher.
3948 ///
3949 /// Examples:
3950 /// \code
3951 ///   int x;
3952 /// \endcode
3953 /// declaratorDecl(hasTypeLoc(loc(asString("int"))))
3954 ///   matches int x
3955 ///
3956 /// \code
3957 /// auto x = int(3);
3958 /// \endcode
3959 /// cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
3960 ///   matches int(3)
3961 ///
3962 /// \code
3963 /// struct Foo { Foo(int, int); };
3964 /// auto x = Foo(1, 2);
3965 /// \endcode
3966 /// cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
3967 ///   matches Foo(1, 2)
3968 ///
3969 /// Usable as: Matcher<BlockDecl>, Matcher<CXXBaseSpecifier>,
3970 ///   Matcher<CXXCtorInitializer>, Matcher<CXXFunctionalCastExpr>,
3971 ///   Matcher<CXXNewExpr>, Matcher<CXXTemporaryObjectExpr>,
3972 ///   Matcher<CXXUnresolvedConstructExpr>,
3973 ///   Matcher<ClassTemplateSpecializationDecl>, Matcher<CompoundLiteralExpr>,
3974 ///   Matcher<DeclaratorDecl>, Matcher<ExplicitCastExpr>,
3975 ///   Matcher<ObjCPropertyDecl>, Matcher<TemplateArgumentLoc>,
3976 ///   Matcher<TypedefNameDecl>
AST_POLYMORPHIC_MATCHER_P(hasTypeLoc,AST_POLYMORPHIC_SUPPORTED_TYPES (BlockDecl,CXXBaseSpecifier,CXXCtorInitializer,CXXFunctionalCastExpr,CXXNewExpr,CXXTemporaryObjectExpr,CXXUnresolvedConstructExpr,ClassTemplateSpecializationDecl,CompoundLiteralExpr,DeclaratorDecl,ExplicitCastExpr,ObjCPropertyDecl,TemplateArgumentLoc,TypedefNameDecl),internal::Matcher<TypeLoc>,Inner)3977 AST_POLYMORPHIC_MATCHER_P(
3978     hasTypeLoc,
3979     AST_POLYMORPHIC_SUPPORTED_TYPES(
3980         BlockDecl, CXXBaseSpecifier, CXXCtorInitializer, CXXFunctionalCastExpr,
3981         CXXNewExpr, CXXTemporaryObjectExpr, CXXUnresolvedConstructExpr,
3982         ClassTemplateSpecializationDecl, CompoundLiteralExpr, DeclaratorDecl,
3983         ExplicitCastExpr, ObjCPropertyDecl, TemplateArgumentLoc,
3984         TypedefNameDecl),
3985     internal::Matcher<TypeLoc>, Inner) {
3986   TypeSourceInfo *source = internal::GetTypeSourceInfo(Node);
3987   if (source == nullptr) {
3988     // This happens for example for implicit destructors.
3989     return false;
3990   }
3991   return Inner.matches(source->getTypeLoc(), Finder, Builder);
3992 }
3993 
3994 /// Matches if the matched type is represented by the given string.
3995 ///
3996 /// Given
3997 /// \code
3998 ///   class Y { public: void x(); };
3999 ///   void z() { Y* y; y->x(); }
4000 /// \endcode
4001 /// cxxMemberCallExpr(on(hasType(asString("class Y *"))))
4002 ///   matches y->x()
AST_MATCHER_P(QualType,asString,std::string,Name)4003 AST_MATCHER_P(QualType, asString, std::string, Name) {
4004   return Name == Node.getAsString();
4005 }
4006 
4007 /// Matches if the matched type is a pointer type and the pointee type
4008 /// matches the specified matcher.
4009 ///
4010 /// Example matches y->x()
4011 ///   (matcher = cxxMemberCallExpr(on(hasType(pointsTo
4012 ///      cxxRecordDecl(hasName("Y")))))))
4013 /// \code
4014 ///   class Y { public: void x(); };
4015 ///   void z() { Y *y; y->x(); }
4016 /// \endcode
AST_MATCHER_P(QualType,pointsTo,internal::Matcher<QualType>,InnerMatcher)4017 AST_MATCHER_P(
4018     QualType, pointsTo, internal::Matcher<QualType>,
4019     InnerMatcher) {
4020   return (!Node.isNull() && Node->isAnyPointerType() &&
4021           InnerMatcher.matches(Node->getPointeeType(), Finder, Builder));
4022 }
4023 
4024 /// Overloaded to match the pointee type's declaration.
4025 AST_MATCHER_P_OVERLOAD(QualType, pointsTo, internal::Matcher<Decl>,
4026                        InnerMatcher, 1) {
4027   return pointsTo(qualType(hasDeclaration(InnerMatcher)))
4028       .matches(Node, Finder, Builder);
4029 }
4030 
4031 /// Matches if the matched type matches the unqualified desugared
4032 /// type of the matched node.
4033 ///
4034 /// For example, in:
4035 /// \code
4036 ///   class A {};
4037 ///   using B = A;
4038 /// \endcode
4039 /// The matcher type(hasUnqualifiedDesugaredType(recordType())) matches
4040 /// both B and A.
AST_MATCHER_P(Type,hasUnqualifiedDesugaredType,internal::Matcher<Type>,InnerMatcher)4041 AST_MATCHER_P(Type, hasUnqualifiedDesugaredType, internal::Matcher<Type>,
4042               InnerMatcher) {
4043   return InnerMatcher.matches(*Node.getUnqualifiedDesugaredType(), Finder,
4044                               Builder);
4045 }
4046 
4047 /// Matches if the matched type is a reference type and the referenced
4048 /// type matches the specified matcher.
4049 ///
4050 /// Example matches X &x and const X &y
4051 ///     (matcher = varDecl(hasType(references(cxxRecordDecl(hasName("X"))))))
4052 /// \code
4053 ///   class X {
4054 ///     void a(X b) {
4055 ///       X &x = b;
4056 ///       const X &y = b;
4057 ///     }
4058 ///   };
4059 /// \endcode
AST_MATCHER_P(QualType,references,internal::Matcher<QualType>,InnerMatcher)4060 AST_MATCHER_P(QualType, references, internal::Matcher<QualType>,
4061               InnerMatcher) {
4062   return (!Node.isNull() && Node->isReferenceType() &&
4063           InnerMatcher.matches(Node->getPointeeType(), Finder, Builder));
4064 }
4065 
4066 /// Matches QualTypes whose canonical type matches InnerMatcher.
4067 ///
4068 /// Given:
4069 /// \code
4070 ///   typedef int &int_ref;
4071 ///   int a;
4072 ///   int_ref b = a;
4073 /// \endcode
4074 ///
4075 /// \c varDecl(hasType(qualType(referenceType()))))) will not match the
4076 /// declaration of b but \c
4077 /// varDecl(hasType(qualType(hasCanonicalType(referenceType())))))) does.
AST_MATCHER_P(QualType,hasCanonicalType,internal::Matcher<QualType>,InnerMatcher)4078 AST_MATCHER_P(QualType, hasCanonicalType, internal::Matcher<QualType>,
4079               InnerMatcher) {
4080   if (Node.isNull())
4081     return false;
4082   return InnerMatcher.matches(Node.getCanonicalType(), Finder, Builder);
4083 }
4084 
4085 /// Overloaded to match the referenced type's declaration.
4086 AST_MATCHER_P_OVERLOAD(QualType, references, internal::Matcher<Decl>,
4087                        InnerMatcher, 1) {
4088   return references(qualType(hasDeclaration(InnerMatcher)))
4089       .matches(Node, Finder, Builder);
4090 }
4091 
4092 /// Matches on the implicit object argument of a member call expression. Unlike
4093 /// `on`, matches the argument directly without stripping away anything.
4094 ///
4095 /// Given
4096 /// \code
4097 ///   class Y { public: void m(); };
4098 ///   Y g();
4099 ///   class X : public Y { void g(); };
4100 ///   void z(Y y, X x) { y.m(); x.m(); x.g(); (g()).m(); }
4101 /// \endcode
4102 /// cxxMemberCallExpr(onImplicitObjectArgument(hasType(
4103 ///     cxxRecordDecl(hasName("Y")))))
4104 ///   matches `y.m()`, `x.m()` and (g()).m(), but not `x.g()`.
4105 /// cxxMemberCallExpr(on(callExpr()))
4106 ///   does not match `(g()).m()`, because the parens are not ignored.
4107 ///
4108 /// FIXME: Overload to allow directly matching types?
AST_MATCHER_P(CXXMemberCallExpr,onImplicitObjectArgument,internal::Matcher<Expr>,InnerMatcher)4109 AST_MATCHER_P(CXXMemberCallExpr, onImplicitObjectArgument,
4110               internal::Matcher<Expr>, InnerMatcher) {
4111   const Expr *ExprNode = Node.getImplicitObjectArgument();
4112   return (ExprNode != nullptr &&
4113           InnerMatcher.matches(*ExprNode, Finder, Builder));
4114 }
4115 
4116 /// Matches if the type of the expression's implicit object argument either
4117 /// matches the InnerMatcher, or is a pointer to a type that matches the
4118 /// InnerMatcher.
4119 ///
4120 /// Given
4121 /// \code
4122 ///   class Y { public: void m(); };
4123 ///   class X : public Y { void g(); };
4124 ///   void z() { Y y; y.m(); Y *p; p->m(); X x; x.m(); x.g(); }
4125 /// \endcode
4126 /// cxxMemberCallExpr(thisPointerType(hasDeclaration(
4127 ///     cxxRecordDecl(hasName("Y")))))
4128 ///   matches `y.m()`, `p->m()` and `x.m()`.
4129 /// cxxMemberCallExpr(thisPointerType(hasDeclaration(
4130 ///     cxxRecordDecl(hasName("X")))))
4131 ///   matches `x.g()`.
4132 AST_MATCHER_P_OVERLOAD(CXXMemberCallExpr, thisPointerType,
4133                        internal::Matcher<QualType>, InnerMatcher, 0) {
4134   return onImplicitObjectArgument(
4135       anyOf(hasType(InnerMatcher), hasType(pointsTo(InnerMatcher))))
4136       .matches(Node, Finder, Builder);
4137 }
4138 
4139 /// Overloaded to match the type's declaration.
4140 AST_MATCHER_P_OVERLOAD(CXXMemberCallExpr, thisPointerType,
4141                        internal::Matcher<Decl>, InnerMatcher, 1) {
4142   return onImplicitObjectArgument(
4143       anyOf(hasType(InnerMatcher), hasType(pointsTo(InnerMatcher))))
4144       .matches(Node, Finder, Builder);
4145 }
4146 
4147 /// Matches a DeclRefExpr that refers to a declaration that matches the
4148 /// specified matcher.
4149 ///
4150 /// Example matches x in if(x)
4151 ///     (matcher = declRefExpr(to(varDecl(hasName("x")))))
4152 /// \code
4153 ///   bool x;
4154 ///   if (x) {}
4155 /// \endcode
AST_MATCHER_P(DeclRefExpr,to,internal::Matcher<Decl>,InnerMatcher)4156 AST_MATCHER_P(DeclRefExpr, to, internal::Matcher<Decl>,
4157               InnerMatcher) {
4158   const Decl *DeclNode = Node.getDecl();
4159   return (DeclNode != nullptr &&
4160           InnerMatcher.matches(*DeclNode, Finder, Builder));
4161 }
4162 
4163 /// Matches if a node refers to a declaration through a specific
4164 /// using shadow declaration.
4165 ///
4166 /// Examples:
4167 /// \code
4168 ///   namespace a { int f(); }
4169 ///   using a::f;
4170 ///   int x = f();
4171 /// \endcode
4172 /// declRefExpr(throughUsingDecl(anything()))
4173 ///   matches \c f
4174 ///
4175 /// \code
4176 ///   namespace a { class X{}; }
4177 ///   using a::X;
4178 ///   X x;
4179 /// \endcode
4180 /// typeLoc(loc(usingType(throughUsingDecl(anything()))))
4181 ///   matches \c X
4182 ///
4183 /// Usable as: Matcher<DeclRefExpr>, Matcher<UsingType>
AST_POLYMORPHIC_MATCHER_P(throughUsingDecl,AST_POLYMORPHIC_SUPPORTED_TYPES (DeclRefExpr,UsingType),internal::Matcher<UsingShadowDecl>,Inner)4184 AST_POLYMORPHIC_MATCHER_P(throughUsingDecl,
4185                           AST_POLYMORPHIC_SUPPORTED_TYPES(DeclRefExpr,
4186                                                           UsingType),
4187                           internal::Matcher<UsingShadowDecl>, Inner) {
4188   const NamedDecl *FoundDecl = Node.getFoundDecl();
4189   if (const UsingShadowDecl *UsingDecl = dyn_cast<UsingShadowDecl>(FoundDecl))
4190     return Inner.matches(*UsingDecl, Finder, Builder);
4191   return false;
4192 }
4193 
4194 /// Matches an \c OverloadExpr if any of the declarations in the set of
4195 /// overloads matches the given matcher.
4196 ///
4197 /// Given
4198 /// \code
4199 ///   template <typename T> void foo(T);
4200 ///   template <typename T> void bar(T);
4201 ///   template <typename T> void baz(T t) {
4202 ///     foo(t);
4203 ///     bar(t);
4204 ///   }
4205 /// \endcode
4206 /// unresolvedLookupExpr(hasAnyDeclaration(
4207 ///     functionTemplateDecl(hasName("foo"))))
4208 ///   matches \c foo in \c foo(t); but not \c bar in \c bar(t);
AST_MATCHER_P(OverloadExpr,hasAnyDeclaration,internal::Matcher<Decl>,InnerMatcher)4209 AST_MATCHER_P(OverloadExpr, hasAnyDeclaration, internal::Matcher<Decl>,
4210               InnerMatcher) {
4211   return matchesFirstInPointerRange(InnerMatcher, Node.decls_begin(),
4212                                     Node.decls_end(), Finder,
4213                                     Builder) != Node.decls_end();
4214 }
4215 
4216 /// Matches the Decl of a DeclStmt which has a single declaration.
4217 ///
4218 /// Given
4219 /// \code
4220 ///   int a, b;
4221 ///   int c;
4222 /// \endcode
4223 /// declStmt(hasSingleDecl(anything()))
4224 ///   matches 'int c;' but not 'int a, b;'.
AST_MATCHER_P(DeclStmt,hasSingleDecl,internal::Matcher<Decl>,InnerMatcher)4225 AST_MATCHER_P(DeclStmt, hasSingleDecl, internal::Matcher<Decl>, InnerMatcher) {
4226   if (Node.isSingleDecl()) {
4227     const Decl *FoundDecl = Node.getSingleDecl();
4228     return InnerMatcher.matches(*FoundDecl, Finder, Builder);
4229   }
4230   return false;
4231 }
4232 
4233 /// Matches a variable declaration that has an initializer expression
4234 /// that matches the given matcher.
4235 ///
4236 /// Example matches x (matcher = varDecl(hasInitializer(callExpr())))
4237 /// \code
4238 ///   bool y() { return true; }
4239 ///   bool x = y();
4240 /// \endcode
AST_MATCHER_P(VarDecl,hasInitializer,internal::Matcher<Expr>,InnerMatcher)4241 AST_MATCHER_P(
4242     VarDecl, hasInitializer, internal::Matcher<Expr>,
4243     InnerMatcher) {
4244   const Expr *Initializer = Node.getAnyInitializer();
4245   return (Initializer != nullptr &&
4246           InnerMatcher.matches(*Initializer, Finder, Builder));
4247 }
4248 
4249 /// Matches a variable serving as the implicit variable for a lambda init-
4250 /// capture.
4251 ///
4252 /// Example matches x (matcher = varDecl(isInitCapture()))
4253 /// \code
4254 /// auto f = [x=3]() { return x; };
4255 /// \endcode
AST_MATCHER(VarDecl,isInitCapture)4256 AST_MATCHER(VarDecl, isInitCapture) { return Node.isInitCapture(); }
4257 
4258 /// Matches each lambda capture in a lambda expression.
4259 ///
4260 /// Given
4261 /// \code
4262 ///   int main() {
4263 ///     int x, y;
4264 ///     float z;
4265 ///     auto f = [=]() { return x + y + z; };
4266 ///   }
4267 /// \endcode
4268 /// lambdaExpr(forEachLambdaCapture(
4269 ///     lambdaCapture(capturesVar(varDecl(hasType(isInteger()))))))
4270 /// will trigger two matches, binding for 'x' and 'y' respectively.
AST_MATCHER_P(LambdaExpr,forEachLambdaCapture,internal::Matcher<LambdaCapture>,InnerMatcher)4271 AST_MATCHER_P(LambdaExpr, forEachLambdaCapture,
4272               internal::Matcher<LambdaCapture>, InnerMatcher) {
4273   BoundNodesTreeBuilder Result;
4274   bool Matched = false;
4275   for (const auto &Capture : Node.captures()) {
4276     if (Finder->isTraversalIgnoringImplicitNodes() && Capture.isImplicit())
4277       continue;
4278     BoundNodesTreeBuilder CaptureBuilder(*Builder);
4279     if (InnerMatcher.matches(Capture, Finder, &CaptureBuilder)) {
4280       Matched = true;
4281       Result.addMatch(CaptureBuilder);
4282     }
4283   }
4284   *Builder = std::move(Result);
4285   return Matched;
4286 }
4287 
4288 /// \brief Matches a static variable with local scope.
4289 ///
4290 /// Example matches y (matcher = varDecl(isStaticLocal()))
4291 /// \code
4292 /// void f() {
4293 ///   int x;
4294 ///   static int y;
4295 /// }
4296 /// static int z;
4297 /// \endcode
AST_MATCHER(VarDecl,isStaticLocal)4298 AST_MATCHER(VarDecl, isStaticLocal) {
4299   return Node.isStaticLocal();
4300 }
4301 
4302 /// Matches a variable declaration that has function scope and is a
4303 /// non-static local variable.
4304 ///
4305 /// Example matches x (matcher = varDecl(hasLocalStorage())
4306 /// \code
4307 /// void f() {
4308 ///   int x;
4309 ///   static int y;
4310 /// }
4311 /// int z;
4312 /// \endcode
AST_MATCHER(VarDecl,hasLocalStorage)4313 AST_MATCHER(VarDecl, hasLocalStorage) {
4314   return Node.hasLocalStorage();
4315 }
4316 
4317 /// Matches a variable declaration that does not have local storage.
4318 ///
4319 /// Example matches y and z (matcher = varDecl(hasGlobalStorage())
4320 /// \code
4321 /// void f() {
4322 ///   int x;
4323 ///   static int y;
4324 /// }
4325 /// int z;
4326 /// \endcode
AST_MATCHER(VarDecl,hasGlobalStorage)4327 AST_MATCHER(VarDecl, hasGlobalStorage) {
4328   return Node.hasGlobalStorage();
4329 }
4330 
4331 /// Matches a variable declaration that has automatic storage duration.
4332 ///
4333 /// Example matches x, but not y, z, or a.
4334 /// (matcher = varDecl(hasAutomaticStorageDuration())
4335 /// \code
4336 /// void f() {
4337 ///   int x;
4338 ///   static int y;
4339 ///   thread_local int z;
4340 /// }
4341 /// int a;
4342 /// \endcode
AST_MATCHER(VarDecl,hasAutomaticStorageDuration)4343 AST_MATCHER(VarDecl, hasAutomaticStorageDuration) {
4344   return Node.getStorageDuration() == SD_Automatic;
4345 }
4346 
4347 /// Matches a variable declaration that has static storage duration.
4348 /// It includes the variable declared at namespace scope and those declared
4349 /// with "static" and "extern" storage class specifiers.
4350 ///
4351 /// \code
4352 /// void f() {
4353 ///   int x;
4354 ///   static int y;
4355 ///   thread_local int z;
4356 /// }
4357 /// int a;
4358 /// static int b;
4359 /// extern int c;
4360 /// varDecl(hasStaticStorageDuration())
4361 ///   matches the function declaration y, a, b and c.
4362 /// \endcode
AST_MATCHER(VarDecl,hasStaticStorageDuration)4363 AST_MATCHER(VarDecl, hasStaticStorageDuration) {
4364   return Node.getStorageDuration() == SD_Static;
4365 }
4366 
4367 /// Matches a variable declaration that has thread storage duration.
4368 ///
4369 /// Example matches z, but not x, z, or a.
4370 /// (matcher = varDecl(hasThreadStorageDuration())
4371 /// \code
4372 /// void f() {
4373 ///   int x;
4374 ///   static int y;
4375 ///   thread_local int z;
4376 /// }
4377 /// int a;
4378 /// \endcode
AST_MATCHER(VarDecl,hasThreadStorageDuration)4379 AST_MATCHER(VarDecl, hasThreadStorageDuration) {
4380   return Node.getStorageDuration() == SD_Thread;
4381 }
4382 
4383 /// Matches a variable declaration that is an exception variable from
4384 /// a C++ catch block, or an Objective-C \@catch statement.
4385 ///
4386 /// Example matches x (matcher = varDecl(isExceptionVariable())
4387 /// \code
4388 /// void f(int y) {
4389 ///   try {
4390 ///   } catch (int x) {
4391 ///   }
4392 /// }
4393 /// \endcode
AST_MATCHER(VarDecl,isExceptionVariable)4394 AST_MATCHER(VarDecl, isExceptionVariable) {
4395   return Node.isExceptionVariable();
4396 }
4397 
4398 /// Checks that a call expression or a constructor call expression has
4399 /// a specific number of arguments (including absent default arguments).
4400 ///
4401 /// Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
4402 /// \code
4403 ///   void f(int x, int y);
4404 ///   f(0, 0);
4405 /// \endcode
AST_POLYMORPHIC_MATCHER_P(argumentCountIs,AST_POLYMORPHIC_SUPPORTED_TYPES (CallExpr,CXXConstructExpr,CXXUnresolvedConstructExpr,ObjCMessageExpr),unsigned,N)4406 AST_POLYMORPHIC_MATCHER_P(argumentCountIs,
4407                           AST_POLYMORPHIC_SUPPORTED_TYPES(
4408                               CallExpr, CXXConstructExpr,
4409                               CXXUnresolvedConstructExpr, ObjCMessageExpr),
4410                           unsigned, N) {
4411   unsigned NumArgs = Node.getNumArgs();
4412   if (!Finder->isTraversalIgnoringImplicitNodes())
4413     return NumArgs == N;
4414   while (NumArgs) {
4415     if (!isa<CXXDefaultArgExpr>(Node.getArg(NumArgs - 1)))
4416       break;
4417     --NumArgs;
4418   }
4419   return NumArgs == N;
4420 }
4421 
4422 /// Matches the n'th argument of a call expression or a constructor
4423 /// call expression.
4424 ///
4425 /// Example matches y in x(y)
4426 ///     (matcher = callExpr(hasArgument(0, declRefExpr())))
4427 /// \code
4428 ///   void x(int) { int y; x(y); }
4429 /// \endcode
AST_POLYMORPHIC_MATCHER_P2(hasArgument,AST_POLYMORPHIC_SUPPORTED_TYPES (CallExpr,CXXConstructExpr,CXXUnresolvedConstructExpr,ObjCMessageExpr),unsigned,N,internal::Matcher<Expr>,InnerMatcher)4430 AST_POLYMORPHIC_MATCHER_P2(hasArgument,
4431                            AST_POLYMORPHIC_SUPPORTED_TYPES(
4432                                CallExpr, CXXConstructExpr,
4433                                CXXUnresolvedConstructExpr, ObjCMessageExpr),
4434                            unsigned, N, internal::Matcher<Expr>, InnerMatcher) {
4435   if (N >= Node.getNumArgs())
4436     return false;
4437   const Expr *Arg = Node.getArg(N);
4438   if (Finder->isTraversalIgnoringImplicitNodes() && isa<CXXDefaultArgExpr>(Arg))
4439     return false;
4440   return InnerMatcher.matches(*Arg->IgnoreParenImpCasts(), Finder, Builder);
4441 }
4442 
4443 /// Matches the n'th item of an initializer list expression.
4444 ///
4445 /// Example matches y.
4446 ///     (matcher = initListExpr(hasInit(0, expr())))
4447 /// \code
4448 ///   int x{y}.
4449 /// \endcode
AST_MATCHER_P2(InitListExpr,hasInit,unsigned,N,ast_matchers::internal::Matcher<Expr>,InnerMatcher)4450 AST_MATCHER_P2(InitListExpr, hasInit, unsigned, N,
4451                ast_matchers::internal::Matcher<Expr>, InnerMatcher) {
4452   return N < Node.getNumInits() &&
4453           InnerMatcher.matches(*Node.getInit(N), Finder, Builder);
4454 }
4455 
4456 /// Matches declaration statements that contain a specific number of
4457 /// declarations.
4458 ///
4459 /// Example: Given
4460 /// \code
4461 ///   int a, b;
4462 ///   int c;
4463 ///   int d = 2, e;
4464 /// \endcode
4465 /// declCountIs(2)
4466 ///   matches 'int a, b;' and 'int d = 2, e;', but not 'int c;'.
AST_MATCHER_P(DeclStmt,declCountIs,unsigned,N)4467 AST_MATCHER_P(DeclStmt, declCountIs, unsigned, N) {
4468   return std::distance(Node.decl_begin(), Node.decl_end()) == (ptrdiff_t)N;
4469 }
4470 
4471 /// Matches the n'th declaration of a declaration statement.
4472 ///
4473 /// Note that this does not work for global declarations because the AST
4474 /// breaks up multiple-declaration DeclStmt's into multiple single-declaration
4475 /// DeclStmt's.
4476 /// Example: Given non-global declarations
4477 /// \code
4478 ///   int a, b = 0;
4479 ///   int c;
4480 ///   int d = 2, e;
4481 /// \endcode
4482 /// declStmt(containsDeclaration(
4483 ///       0, varDecl(hasInitializer(anything()))))
4484 ///   matches only 'int d = 2, e;', and
4485 /// declStmt(containsDeclaration(1, varDecl()))
4486 /// \code
4487 ///   matches 'int a, b = 0' as well as 'int d = 2, e;'
4488 ///   but 'int c;' is not matched.
4489 /// \endcode
AST_MATCHER_P2(DeclStmt,containsDeclaration,unsigned,N,internal::Matcher<Decl>,InnerMatcher)4490 AST_MATCHER_P2(DeclStmt, containsDeclaration, unsigned, N,
4491                internal::Matcher<Decl>, InnerMatcher) {
4492   const unsigned NumDecls = std::distance(Node.decl_begin(), Node.decl_end());
4493   if (N >= NumDecls)
4494     return false;
4495   DeclStmt::const_decl_iterator Iterator = Node.decl_begin();
4496   std::advance(Iterator, N);
4497   return InnerMatcher.matches(**Iterator, Finder, Builder);
4498 }
4499 
4500 /// Matches a C++ catch statement that has a catch-all handler.
4501 ///
4502 /// Given
4503 /// \code
4504 ///   try {
4505 ///     // ...
4506 ///   } catch (int) {
4507 ///     // ...
4508 ///   } catch (...) {
4509 ///     // ...
4510 ///   }
4511 /// \endcode
4512 /// cxxCatchStmt(isCatchAll()) matches catch(...) but not catch(int).
AST_MATCHER(CXXCatchStmt,isCatchAll)4513 AST_MATCHER(CXXCatchStmt, isCatchAll) {
4514   return Node.getExceptionDecl() == nullptr;
4515 }
4516 
4517 /// Matches a constructor initializer.
4518 ///
4519 /// Given
4520 /// \code
4521 ///   struct Foo {
4522 ///     Foo() : foo_(1) { }
4523 ///     int foo_;
4524 ///   };
4525 /// \endcode
4526 /// cxxRecordDecl(has(cxxConstructorDecl(
4527 ///   hasAnyConstructorInitializer(anything())
4528 /// )))
4529 ///   record matches Foo, hasAnyConstructorInitializer matches foo_(1)
AST_MATCHER_P(CXXConstructorDecl,hasAnyConstructorInitializer,internal::Matcher<CXXCtorInitializer>,InnerMatcher)4530 AST_MATCHER_P(CXXConstructorDecl, hasAnyConstructorInitializer,
4531               internal::Matcher<CXXCtorInitializer>, InnerMatcher) {
4532   auto MatchIt = matchesFirstInPointerRange(InnerMatcher, Node.init_begin(),
4533                                             Node.init_end(), Finder, Builder);
4534   if (MatchIt == Node.init_end())
4535     return false;
4536   return (*MatchIt)->isWritten() || !Finder->isTraversalIgnoringImplicitNodes();
4537 }
4538 
4539 /// Matches the field declaration of a constructor initializer.
4540 ///
4541 /// Given
4542 /// \code
4543 ///   struct Foo {
4544 ///     Foo() : foo_(1) { }
4545 ///     int foo_;
4546 ///   };
4547 /// \endcode
4548 /// cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer(
4549 ///     forField(hasName("foo_"))))))
4550 ///   matches Foo
4551 /// with forField matching foo_
AST_MATCHER_P(CXXCtorInitializer,forField,internal::Matcher<FieldDecl>,InnerMatcher)4552 AST_MATCHER_P(CXXCtorInitializer, forField,
4553               internal::Matcher<FieldDecl>, InnerMatcher) {
4554   const FieldDecl *NodeAsDecl = Node.getAnyMember();
4555   return (NodeAsDecl != nullptr &&
4556       InnerMatcher.matches(*NodeAsDecl, Finder, Builder));
4557 }
4558 
4559 /// Matches the initializer expression of a constructor initializer.
4560 ///
4561 /// Given
4562 /// \code
4563 ///   struct Foo {
4564 ///     Foo() : foo_(1) { }
4565 ///     int foo_;
4566 ///   };
4567 /// \endcode
4568 /// cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer(
4569 ///     withInitializer(integerLiteral(equals(1)))))))
4570 ///   matches Foo
4571 /// with withInitializer matching (1)
AST_MATCHER_P(CXXCtorInitializer,withInitializer,internal::Matcher<Expr>,InnerMatcher)4572 AST_MATCHER_P(CXXCtorInitializer, withInitializer,
4573               internal::Matcher<Expr>, InnerMatcher) {
4574   const Expr* NodeAsExpr = Node.getInit();
4575   return (NodeAsExpr != nullptr &&
4576       InnerMatcher.matches(*NodeAsExpr, Finder, Builder));
4577 }
4578 
4579 /// Matches a constructor initializer if it is explicitly written in
4580 /// code (as opposed to implicitly added by the compiler).
4581 ///
4582 /// Given
4583 /// \code
4584 ///   struct Foo {
4585 ///     Foo() { }
4586 ///     Foo(int) : foo_("A") { }
4587 ///     string foo_;
4588 ///   };
4589 /// \endcode
4590 /// cxxConstructorDecl(hasAnyConstructorInitializer(isWritten()))
4591 ///   will match Foo(int), but not Foo()
AST_MATCHER(CXXCtorInitializer,isWritten)4592 AST_MATCHER(CXXCtorInitializer, isWritten) {
4593   return Node.isWritten();
4594 }
4595 
4596 /// Matches a constructor initializer if it is initializing a base, as
4597 /// opposed to a member.
4598 ///
4599 /// Given
4600 /// \code
4601 ///   struct B {};
4602 ///   struct D : B {
4603 ///     int I;
4604 ///     D(int i) : I(i) {}
4605 ///   };
4606 ///   struct E : B {
4607 ///     E() : B() {}
4608 ///   };
4609 /// \endcode
4610 /// cxxConstructorDecl(hasAnyConstructorInitializer(isBaseInitializer()))
4611 ///   will match E(), but not match D(int).
AST_MATCHER(CXXCtorInitializer,isBaseInitializer)4612 AST_MATCHER(CXXCtorInitializer, isBaseInitializer) {
4613   return Node.isBaseInitializer();
4614 }
4615 
4616 /// Matches a constructor initializer if it is initializing a member, as
4617 /// opposed to a base.
4618 ///
4619 /// Given
4620 /// \code
4621 ///   struct B {};
4622 ///   struct D : B {
4623 ///     int I;
4624 ///     D(int i) : I(i) {}
4625 ///   };
4626 ///   struct E : B {
4627 ///     E() : B() {}
4628 ///   };
4629 /// \endcode
4630 /// cxxConstructorDecl(hasAnyConstructorInitializer(isMemberInitializer()))
4631 ///   will match D(int), but not match E().
AST_MATCHER(CXXCtorInitializer,isMemberInitializer)4632 AST_MATCHER(CXXCtorInitializer, isMemberInitializer) {
4633   return Node.isMemberInitializer();
4634 }
4635 
4636 /// Matches any argument of a call expression or a constructor call
4637 /// expression, or an ObjC-message-send expression.
4638 ///
4639 /// Given
4640 /// \code
4641 ///   void x(int, int, int) { int y; x(1, y, 42); }
4642 /// \endcode
4643 /// callExpr(hasAnyArgument(declRefExpr()))
4644 ///   matches x(1, y, 42)
4645 /// with hasAnyArgument(...)
4646 ///   matching y
4647 ///
4648 /// For ObjectiveC, given
4649 /// \code
4650 ///   @interface I - (void) f:(int) y; @end
4651 ///   void foo(I *i) { [i f:12]; }
4652 /// \endcode
4653 /// objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
4654 ///   matches [i f:12]
AST_POLYMORPHIC_MATCHER_P(hasAnyArgument,AST_POLYMORPHIC_SUPPORTED_TYPES (CallExpr,CXXConstructExpr,CXXUnresolvedConstructExpr,ObjCMessageExpr),internal::Matcher<Expr>,InnerMatcher)4655 AST_POLYMORPHIC_MATCHER_P(hasAnyArgument,
4656                           AST_POLYMORPHIC_SUPPORTED_TYPES(
4657                               CallExpr, CXXConstructExpr,
4658                               CXXUnresolvedConstructExpr, ObjCMessageExpr),
4659                           internal::Matcher<Expr>, InnerMatcher) {
4660   for (const Expr *Arg : Node.arguments()) {
4661     if (Finder->isTraversalIgnoringImplicitNodes() &&
4662         isa<CXXDefaultArgExpr>(Arg))
4663       break;
4664     BoundNodesTreeBuilder Result(*Builder);
4665     if (InnerMatcher.matches(*Arg, Finder, &Result)) {
4666       *Builder = std::move(Result);
4667       return true;
4668     }
4669   }
4670   return false;
4671 }
4672 
4673 /// Matches lambda captures.
4674 ///
4675 /// Given
4676 /// \code
4677 ///   int main() {
4678 ///     int x;
4679 ///     auto f = [x](){};
4680 ///     auto g = [x = 1](){};
4681 ///   }
4682 /// \endcode
4683 /// In the matcher `lambdaExpr(hasAnyCapture(lambdaCapture()))`,
4684 /// `lambdaCapture()` matches `x` and `x=1`.
4685 extern const internal::VariadicAllOfMatcher<LambdaCapture> lambdaCapture;
4686 
4687 /// Matches any capture in a lambda expression.
4688 ///
4689 /// Given
4690 /// \code
4691 ///   void foo() {
4692 ///     int t = 5;
4693 ///     auto f = [=](){ return t; };
4694 ///   }
4695 /// \endcode
4696 /// lambdaExpr(hasAnyCapture(lambdaCapture())) and
4697 /// lambdaExpr(hasAnyCapture(lambdaCapture(refersToVarDecl(hasName("t")))))
4698 ///   both match `[=](){ return t; }`.
AST_MATCHER_P(LambdaExpr,hasAnyCapture,internal::Matcher<LambdaCapture>,InnerMatcher)4699 AST_MATCHER_P(LambdaExpr, hasAnyCapture, internal::Matcher<LambdaCapture>,
4700               InnerMatcher) {
4701   for (const LambdaCapture &Capture : Node.captures()) {
4702     clang::ast_matchers::internal::BoundNodesTreeBuilder Result(*Builder);
4703     if (InnerMatcher.matches(Capture, Finder, &Result)) {
4704       *Builder = std::move(Result);
4705       return true;
4706     }
4707   }
4708   return false;
4709 }
4710 
4711 /// Matches a `LambdaCapture` that refers to the specified `VarDecl`. The
4712 /// `VarDecl` can be a separate variable that is captured by value or
4713 /// reference, or a synthesized variable if the capture has an initializer.
4714 ///
4715 /// Given
4716 /// \code
4717 ///   void foo() {
4718 ///     int x;
4719 ///     auto f = [x](){};
4720 ///     auto g = [x = 1](){};
4721 ///   }
4722 /// \endcode
4723 /// In the matcher
4724 /// lambdaExpr(hasAnyCapture(lambdaCapture(capturesVar(hasName("x")))),
4725 /// capturesVar(hasName("x")) matches `x` and `x = 1`.
AST_MATCHER_P(LambdaCapture,capturesVar,internal::Matcher<ValueDecl>,InnerMatcher)4726 AST_MATCHER_P(LambdaCapture, capturesVar, internal::Matcher<ValueDecl>,
4727               InnerMatcher) {
4728   auto *capturedVar = Node.getCapturedVar();
4729   return capturedVar && InnerMatcher.matches(*capturedVar, Finder, Builder);
4730 }
4731 
4732 /// Matches a `LambdaCapture` that refers to 'this'.
4733 ///
4734 /// Given
4735 /// \code
4736 /// class C {
4737 ///   int cc;
4738 ///   int f() {
4739 ///     auto l = [this]() { return cc; };
4740 ///     return l();
4741 ///   }
4742 /// };
4743 /// \endcode
4744 /// lambdaExpr(hasAnyCapture(lambdaCapture(capturesThis())))
4745 ///   matches `[this]() { return cc; }`.
AST_MATCHER(LambdaCapture,capturesThis)4746 AST_MATCHER(LambdaCapture, capturesThis) { return Node.capturesThis(); }
4747 
4748 /// Matches a constructor call expression which uses list initialization.
AST_MATCHER(CXXConstructExpr,isListInitialization)4749 AST_MATCHER(CXXConstructExpr, isListInitialization) {
4750   return Node.isListInitialization();
4751 }
4752 
4753 /// Matches a constructor call expression which requires
4754 /// zero initialization.
4755 ///
4756 /// Given
4757 /// \code
4758 /// void foo() {
4759 ///   struct point { double x; double y; };
4760 ///   point pt[2] = { { 1.0, 2.0 } };
4761 /// }
4762 /// \endcode
4763 /// initListExpr(has(cxxConstructExpr(requiresZeroInitialization()))
4764 /// will match the implicit array filler for pt[1].
AST_MATCHER(CXXConstructExpr,requiresZeroInitialization)4765 AST_MATCHER(CXXConstructExpr, requiresZeroInitialization) {
4766   return Node.requiresZeroInitialization();
4767 }
4768 
4769 /// Matches the n'th parameter of a function or an ObjC method
4770 /// declaration or a block.
4771 ///
4772 /// Given
4773 /// \code
4774 ///   class X { void f(int x) {} };
4775 /// \endcode
4776 /// cxxMethodDecl(hasParameter(0, hasType(varDecl())))
4777 ///   matches f(int x) {}
4778 /// with hasParameter(...)
4779 ///   matching int x
4780 ///
4781 /// For ObjectiveC, given
4782 /// \code
4783 ///   @interface I - (void) f:(int) y; @end
4784 /// \endcode
4785 //
4786 /// the matcher objcMethodDecl(hasParameter(0, hasName("y")))
4787 /// matches the declaration of method f with hasParameter
4788 /// matching y.
AST_POLYMORPHIC_MATCHER_P2(hasParameter,AST_POLYMORPHIC_SUPPORTED_TYPES (FunctionDecl,ObjCMethodDecl,BlockDecl),unsigned,N,internal::Matcher<ParmVarDecl>,InnerMatcher)4789 AST_POLYMORPHIC_MATCHER_P2(hasParameter,
4790                            AST_POLYMORPHIC_SUPPORTED_TYPES(FunctionDecl,
4791                                                            ObjCMethodDecl,
4792                                                            BlockDecl),
4793                            unsigned, N, internal::Matcher<ParmVarDecl>,
4794                            InnerMatcher) {
4795   return (N < Node.parameters().size()
4796           && InnerMatcher.matches(*Node.parameters()[N], Finder, Builder));
4797 }
4798 
4799 /// Matches all arguments and their respective ParmVarDecl.
4800 ///
4801 /// Given
4802 /// \code
4803 ///   void f(int i);
4804 ///   int y;
4805 ///   f(y);
4806 /// \endcode
4807 /// callExpr(
4808 ///   forEachArgumentWithParam(
4809 ///     declRefExpr(to(varDecl(hasName("y")))),
4810 ///     parmVarDecl(hasType(isInteger()))
4811 /// ))
4812 ///   matches f(y);
4813 /// with declRefExpr(...)
4814 ///   matching int y
4815 /// and parmVarDecl(...)
4816 ///   matching int i
AST_POLYMORPHIC_MATCHER_P2(forEachArgumentWithParam,AST_POLYMORPHIC_SUPPORTED_TYPES (CallExpr,CXXConstructExpr),internal::Matcher<Expr>,ArgMatcher,internal::Matcher<ParmVarDecl>,ParamMatcher)4817 AST_POLYMORPHIC_MATCHER_P2(forEachArgumentWithParam,
4818                            AST_POLYMORPHIC_SUPPORTED_TYPES(CallExpr,
4819                                                            CXXConstructExpr),
4820                            internal::Matcher<Expr>, ArgMatcher,
4821                            internal::Matcher<ParmVarDecl>, ParamMatcher) {
4822   BoundNodesTreeBuilder Result;
4823   // The first argument of an overloaded member operator is the implicit object
4824   // argument of the method which should not be matched against a parameter, so
4825   // we skip over it here.
4826   BoundNodesTreeBuilder Matches;
4827   unsigned ArgIndex = cxxOperatorCallExpr(callee(cxxMethodDecl()))
4828                               .matches(Node, Finder, &Matches)
4829                           ? 1
4830                           : 0;
4831   int ParamIndex = 0;
4832   bool Matched = false;
4833   for (; ArgIndex < Node.getNumArgs(); ++ArgIndex) {
4834     BoundNodesTreeBuilder ArgMatches(*Builder);
4835     if (ArgMatcher.matches(*(Node.getArg(ArgIndex)->IgnoreParenCasts()),
4836                            Finder, &ArgMatches)) {
4837       BoundNodesTreeBuilder ParamMatches(ArgMatches);
4838       if (expr(anyOf(cxxConstructExpr(hasDeclaration(cxxConstructorDecl(
4839                          hasParameter(ParamIndex, ParamMatcher)))),
4840                      callExpr(callee(functionDecl(
4841                          hasParameter(ParamIndex, ParamMatcher))))))
4842               .matches(Node, Finder, &ParamMatches)) {
4843         Result.addMatch(ParamMatches);
4844         Matched = true;
4845       }
4846     }
4847     ++ParamIndex;
4848   }
4849   *Builder = std::move(Result);
4850   return Matched;
4851 }
4852 
4853 /// Matches all arguments and their respective types for a \c CallExpr or
4854 /// \c CXXConstructExpr. It is very similar to \c forEachArgumentWithParam but
4855 /// it works on calls through function pointers as well.
4856 ///
4857 /// The difference is, that function pointers do not provide access to a
4858 /// \c ParmVarDecl, but only the \c QualType for each argument.
4859 ///
4860 /// Given
4861 /// \code
4862 ///   void f(int i);
4863 ///   int y;
4864 ///   f(y);
4865 ///   void (*f_ptr)(int) = f;
4866 ///   f_ptr(y);
4867 /// \endcode
4868 /// callExpr(
4869 ///   forEachArgumentWithParamType(
4870 ///     declRefExpr(to(varDecl(hasName("y")))),
4871 ///     qualType(isInteger()).bind("type)
4872 /// ))
4873 ///   matches f(y) and f_ptr(y)
4874 /// with declRefExpr(...)
4875 ///   matching int y
4876 /// and qualType(...)
4877 ///   matching int
AST_POLYMORPHIC_MATCHER_P2(forEachArgumentWithParamType,AST_POLYMORPHIC_SUPPORTED_TYPES (CallExpr,CXXConstructExpr),internal::Matcher<Expr>,ArgMatcher,internal::Matcher<QualType>,ParamMatcher)4878 AST_POLYMORPHIC_MATCHER_P2(forEachArgumentWithParamType,
4879                            AST_POLYMORPHIC_SUPPORTED_TYPES(CallExpr,
4880                                                            CXXConstructExpr),
4881                            internal::Matcher<Expr>, ArgMatcher,
4882                            internal::Matcher<QualType>, ParamMatcher) {
4883   BoundNodesTreeBuilder Result;
4884   // The first argument of an overloaded member operator is the implicit object
4885   // argument of the method which should not be matched against a parameter, so
4886   // we skip over it here.
4887   BoundNodesTreeBuilder Matches;
4888   unsigned ArgIndex = cxxOperatorCallExpr(callee(cxxMethodDecl()))
4889                               .matches(Node, Finder, &Matches)
4890                           ? 1
4891                           : 0;
4892 
4893   const FunctionProtoType *FProto = nullptr;
4894 
4895   if (const auto *Call = dyn_cast<CallExpr>(&Node)) {
4896     if (const auto *Value =
4897             dyn_cast_or_null<ValueDecl>(Call->getCalleeDecl())) {
4898       QualType QT = Value->getType().getCanonicalType();
4899 
4900       // This does not necessarily lead to a `FunctionProtoType`,
4901       // e.g. K&R functions do not have a function prototype.
4902       if (QT->isFunctionPointerType())
4903         FProto = QT->getPointeeType()->getAs<FunctionProtoType>();
4904 
4905       if (QT->isMemberFunctionPointerType()) {
4906         const auto *MP = QT->getAs<MemberPointerType>();
4907         assert(MP && "Must be member-pointer if its a memberfunctionpointer");
4908         FProto = MP->getPointeeType()->getAs<FunctionProtoType>();
4909         assert(FProto &&
4910                "The call must have happened through a member function "
4911                "pointer");
4912       }
4913     }
4914   }
4915 
4916   unsigned ParamIndex = 0;
4917   bool Matched = false;
4918   unsigned NumArgs = Node.getNumArgs();
4919   if (FProto && FProto->isVariadic())
4920     NumArgs = std::min(NumArgs, FProto->getNumParams());
4921 
4922   for (; ArgIndex < NumArgs; ++ArgIndex, ++ParamIndex) {
4923     BoundNodesTreeBuilder ArgMatches(*Builder);
4924     if (ArgMatcher.matches(*(Node.getArg(ArgIndex)->IgnoreParenCasts()), Finder,
4925                            &ArgMatches)) {
4926       BoundNodesTreeBuilder ParamMatches(ArgMatches);
4927 
4928       // This test is cheaper compared to the big matcher in the next if.
4929       // Therefore, please keep this order.
4930       if (FProto && FProto->getNumParams() > ParamIndex) {
4931         QualType ParamType = FProto->getParamType(ParamIndex);
4932         if (ParamMatcher.matches(ParamType, Finder, &ParamMatches)) {
4933           Result.addMatch(ParamMatches);
4934           Matched = true;
4935           continue;
4936         }
4937       }
4938       if (expr(anyOf(cxxConstructExpr(hasDeclaration(cxxConstructorDecl(
4939                          hasParameter(ParamIndex, hasType(ParamMatcher))))),
4940                      callExpr(callee(functionDecl(
4941                          hasParameter(ParamIndex, hasType(ParamMatcher)))))))
4942               .matches(Node, Finder, &ParamMatches)) {
4943         Result.addMatch(ParamMatches);
4944         Matched = true;
4945         continue;
4946       }
4947     }
4948   }
4949   *Builder = std::move(Result);
4950   return Matched;
4951 }
4952 
4953 /// Matches the ParmVarDecl nodes that are at the N'th position in the parameter
4954 /// list. The parameter list could be that of either a block, function, or
4955 /// objc-method.
4956 ///
4957 ///
4958 /// Given
4959 ///
4960 /// \code
4961 /// void f(int a, int b, int c) {
4962 /// }
4963 /// \endcode
4964 ///
4965 /// ``parmVarDecl(isAtPosition(0))`` matches ``int a``.
4966 ///
4967 /// ``parmVarDecl(isAtPosition(1))`` matches ``int b``.
AST_MATCHER_P(ParmVarDecl,isAtPosition,unsigned,N)4968 AST_MATCHER_P(ParmVarDecl, isAtPosition, unsigned, N) {
4969   const clang::DeclContext *Context = Node.getParentFunctionOrMethod();
4970 
4971   if (const auto *Decl = dyn_cast_or_null<FunctionDecl>(Context))
4972     return N < Decl->param_size() && Decl->getParamDecl(N) == &Node;
4973   if (const auto *Decl = dyn_cast_or_null<BlockDecl>(Context))
4974     return N < Decl->param_size() && Decl->getParamDecl(N) == &Node;
4975   if (const auto *Decl = dyn_cast_or_null<ObjCMethodDecl>(Context))
4976     return N < Decl->param_size() && Decl->getParamDecl(N) == &Node;
4977 
4978   return false;
4979 }
4980 
4981 /// Matches any parameter of a function or an ObjC method declaration or a
4982 /// block.
4983 ///
4984 /// Does not match the 'this' parameter of a method.
4985 ///
4986 /// Given
4987 /// \code
4988 ///   class X { void f(int x, int y, int z) {} };
4989 /// \endcode
4990 /// cxxMethodDecl(hasAnyParameter(hasName("y")))
4991 ///   matches f(int x, int y, int z) {}
4992 /// with hasAnyParameter(...)
4993 ///   matching int y
4994 ///
4995 /// For ObjectiveC, given
4996 /// \code
4997 ///   @interface I - (void) f:(int) y; @end
4998 /// \endcode
4999 //
5000 /// the matcher objcMethodDecl(hasAnyParameter(hasName("y")))
5001 /// matches the declaration of method f with hasParameter
5002 /// matching y.
5003 ///
5004 /// For blocks, given
5005 /// \code
5006 ///   b = ^(int y) { printf("%d", y) };
5007 /// \endcode
5008 ///
5009 /// the matcher blockDecl(hasAnyParameter(hasName("y")))
5010 /// matches the declaration of the block b with hasParameter
5011 /// matching y.
AST_POLYMORPHIC_MATCHER_P(hasAnyParameter,AST_POLYMORPHIC_SUPPORTED_TYPES (FunctionDecl,ObjCMethodDecl,BlockDecl),internal::Matcher<ParmVarDecl>,InnerMatcher)5012 AST_POLYMORPHIC_MATCHER_P(hasAnyParameter,
5013                           AST_POLYMORPHIC_SUPPORTED_TYPES(FunctionDecl,
5014                                                           ObjCMethodDecl,
5015                                                           BlockDecl),
5016                           internal::Matcher<ParmVarDecl>,
5017                           InnerMatcher) {
5018   return matchesFirstInPointerRange(InnerMatcher, Node.param_begin(),
5019                                     Node.param_end(), Finder,
5020                                     Builder) != Node.param_end();
5021 }
5022 
5023 /// Matches \c FunctionDecls and \c FunctionProtoTypes that have a
5024 /// specific parameter count.
5025 ///
5026 /// Given
5027 /// \code
5028 ///   void f(int i) {}
5029 ///   void g(int i, int j) {}
5030 ///   void h(int i, int j);
5031 ///   void j(int i);
5032 ///   void k(int x, int y, int z, ...);
5033 /// \endcode
5034 /// functionDecl(parameterCountIs(2))
5035 ///   matches \c g and \c h
5036 /// functionProtoType(parameterCountIs(2))
5037 ///   matches \c g and \c h
5038 /// functionProtoType(parameterCountIs(3))
5039 ///   matches \c k
AST_POLYMORPHIC_MATCHER_P(parameterCountIs,AST_POLYMORPHIC_SUPPORTED_TYPES (FunctionDecl,FunctionProtoType),unsigned,N)5040 AST_POLYMORPHIC_MATCHER_P(parameterCountIs,
5041                           AST_POLYMORPHIC_SUPPORTED_TYPES(FunctionDecl,
5042                                                           FunctionProtoType),
5043                           unsigned, N) {
5044   return Node.getNumParams() == N;
5045 }
5046 
5047 /// Matches classTemplateSpecialization, templateSpecializationType and
5048 /// functionDecl nodes where the template argument matches the inner matcher.
5049 /// This matcher may produce multiple matches.
5050 ///
5051 /// Given
5052 /// \code
5053 ///   template <typename T, unsigned N, unsigned M>
5054 ///   struct Matrix {};
5055 ///
5056 ///   constexpr unsigned R = 2;
5057 ///   Matrix<int, R * 2, R * 4> M;
5058 ///
5059 ///   template <typename T, typename U>
5060 ///   void f(T&& t, U&& u) {}
5061 ///
5062 ///   bool B = false;
5063 ///   f(R, B);
5064 /// \endcode
5065 /// templateSpecializationType(forEachTemplateArgument(isExpr(expr())))
5066 ///   matches twice, with expr() matching 'R * 2' and 'R * 4'
5067 /// functionDecl(forEachTemplateArgument(refersToType(builtinType())))
5068 ///   matches the specialization f<unsigned, bool> twice, for 'unsigned'
5069 ///   and 'bool'
AST_POLYMORPHIC_MATCHER_P(forEachTemplateArgument,AST_POLYMORPHIC_SUPPORTED_TYPES (ClassTemplateSpecializationDecl,TemplateSpecializationType,FunctionDecl),clang::ast_matchers::internal::Matcher<TemplateArgument>,InnerMatcher)5070 AST_POLYMORPHIC_MATCHER_P(
5071     forEachTemplateArgument,
5072     AST_POLYMORPHIC_SUPPORTED_TYPES(ClassTemplateSpecializationDecl,
5073                                     TemplateSpecializationType, FunctionDecl),
5074     clang::ast_matchers::internal::Matcher<TemplateArgument>, InnerMatcher) {
5075   ArrayRef<TemplateArgument> TemplateArgs =
5076       clang::ast_matchers::internal::getTemplateSpecializationArgs(Node);
5077   clang::ast_matchers::internal::BoundNodesTreeBuilder Result;
5078   bool Matched = false;
5079   for (const auto &Arg : TemplateArgs) {
5080     clang::ast_matchers::internal::BoundNodesTreeBuilder ArgBuilder(*Builder);
5081     if (InnerMatcher.matches(Arg, Finder, &ArgBuilder)) {
5082       Matched = true;
5083       Result.addMatch(ArgBuilder);
5084     }
5085   }
5086   *Builder = std::move(Result);
5087   return Matched;
5088 }
5089 
5090 /// Matches \c FunctionDecls that have a noreturn attribute.
5091 ///
5092 /// Given
5093 /// \code
5094 ///   void nope();
5095 ///   [[noreturn]] void a();
5096 ///   __attribute__((noreturn)) void b();
5097 ///   struct c { [[noreturn]] c(); };
5098 /// \endcode
5099 /// functionDecl(isNoReturn())
5100 ///   matches all of those except
5101 /// \code
5102 ///   void nope();
5103 /// \endcode
AST_MATCHER(FunctionDecl,isNoReturn)5104 AST_MATCHER(FunctionDecl, isNoReturn) { return Node.isNoReturn(); }
5105 
5106 /// Matches the return type of a function declaration.
5107 ///
5108 /// Given:
5109 /// \code
5110 ///   class X { int f() { return 1; } };
5111 /// \endcode
5112 /// cxxMethodDecl(returns(asString("int")))
5113 ///   matches int f() { return 1; }
AST_MATCHER_P(FunctionDecl,returns,internal::Matcher<QualType>,InnerMatcher)5114 AST_MATCHER_P(FunctionDecl, returns,
5115               internal::Matcher<QualType>, InnerMatcher) {
5116   return InnerMatcher.matches(Node.getReturnType(), Finder, Builder);
5117 }
5118 
5119 /// Matches extern "C" function or variable declarations.
5120 ///
5121 /// Given:
5122 /// \code
5123 ///   extern "C" void f() {}
5124 ///   extern "C" { void g() {} }
5125 ///   void h() {}
5126 ///   extern "C" int x = 1;
5127 ///   extern "C" int y = 2;
5128 ///   int z = 3;
5129 /// \endcode
5130 /// functionDecl(isExternC())
5131 ///   matches the declaration of f and g, but not the declaration of h.
5132 /// varDecl(isExternC())
5133 ///   matches the declaration of x and y, but not the declaration of z.
AST_POLYMORPHIC_MATCHER(isExternC,AST_POLYMORPHIC_SUPPORTED_TYPES (FunctionDecl,VarDecl))5134 AST_POLYMORPHIC_MATCHER(isExternC, AST_POLYMORPHIC_SUPPORTED_TYPES(FunctionDecl,
5135                                                                    VarDecl)) {
5136   return Node.isExternC();
5137 }
5138 
5139 /// Matches variable/function declarations that have "static" storage
5140 /// class specifier ("static" keyword) written in the source.
5141 ///
5142 /// Given:
5143 /// \code
5144 ///   static void f() {}
5145 ///   static int i = 0;
5146 ///   extern int j;
5147 ///   int k;
5148 /// \endcode
5149 /// functionDecl(isStaticStorageClass())
5150 ///   matches the function declaration f.
5151 /// varDecl(isStaticStorageClass())
5152 ///   matches the variable declaration i.
AST_POLYMORPHIC_MATCHER(isStaticStorageClass,AST_POLYMORPHIC_SUPPORTED_TYPES (FunctionDecl,VarDecl))5153 AST_POLYMORPHIC_MATCHER(isStaticStorageClass,
5154                         AST_POLYMORPHIC_SUPPORTED_TYPES(FunctionDecl,
5155                                                         VarDecl)) {
5156   return Node.getStorageClass() == SC_Static;
5157 }
5158 
5159 /// Matches deleted function declarations.
5160 ///
5161 /// Given:
5162 /// \code
5163 ///   void Func();
5164 ///   void DeletedFunc() = delete;
5165 /// \endcode
5166 /// functionDecl(isDeleted())
5167 ///   matches the declaration of DeletedFunc, but not Func.
AST_MATCHER(FunctionDecl,isDeleted)5168 AST_MATCHER(FunctionDecl, isDeleted) {
5169   return Node.isDeleted();
5170 }
5171 
5172 /// Matches defaulted function declarations.
5173 ///
5174 /// Given:
5175 /// \code
5176 ///   class A { ~A(); };
5177 ///   class B { ~B() = default; };
5178 /// \endcode
5179 /// functionDecl(isDefaulted())
5180 ///   matches the declaration of ~B, but not ~A.
AST_MATCHER(FunctionDecl,isDefaulted)5181 AST_MATCHER(FunctionDecl, isDefaulted) {
5182   return Node.isDefaulted();
5183 }
5184 
5185 /// Matches weak function declarations.
5186 ///
5187 /// Given:
5188 /// \code
5189 ///   void foo() __attribute__((__weakref__("__foo")));
5190 ///   void bar();
5191 /// \endcode
5192 /// functionDecl(isWeak())
5193 ///   matches the weak declaration "foo", but not "bar".
AST_MATCHER(FunctionDecl,isWeak)5194 AST_MATCHER(FunctionDecl, isWeak) { return Node.isWeak(); }
5195 
5196 /// Matches functions that have a dynamic exception specification.
5197 ///
5198 /// Given:
5199 /// \code
5200 ///   void f();
5201 ///   void g() noexcept;
5202 ///   void h() noexcept(true);
5203 ///   void i() noexcept(false);
5204 ///   void j() throw();
5205 ///   void k() throw(int);
5206 ///   void l() throw(...);
5207 /// \endcode
5208 /// functionDecl(hasDynamicExceptionSpec()) and
5209 ///   functionProtoType(hasDynamicExceptionSpec())
5210 ///   match the declarations of j, k, and l, but not f, g, h, or i.
AST_POLYMORPHIC_MATCHER(hasDynamicExceptionSpec,AST_POLYMORPHIC_SUPPORTED_TYPES (FunctionDecl,FunctionProtoType))5211 AST_POLYMORPHIC_MATCHER(hasDynamicExceptionSpec,
5212                         AST_POLYMORPHIC_SUPPORTED_TYPES(FunctionDecl,
5213                                                         FunctionProtoType)) {
5214   if (const FunctionProtoType *FnTy = internal::getFunctionProtoType(Node))
5215     return FnTy->hasDynamicExceptionSpec();
5216   return false;
5217 }
5218 
5219 /// Matches functions that have a non-throwing exception specification.
5220 ///
5221 /// Given:
5222 /// \code
5223 ///   void f();
5224 ///   void g() noexcept;
5225 ///   void h() throw();
5226 ///   void i() throw(int);
5227 ///   void j() noexcept(false);
5228 /// \endcode
5229 /// functionDecl(isNoThrow()) and functionProtoType(isNoThrow())
5230 ///   match the declarations of g, and h, but not f, i or j.
AST_POLYMORPHIC_MATCHER(isNoThrow,AST_POLYMORPHIC_SUPPORTED_TYPES (FunctionDecl,FunctionProtoType))5231 AST_POLYMORPHIC_MATCHER(isNoThrow,
5232                         AST_POLYMORPHIC_SUPPORTED_TYPES(FunctionDecl,
5233                                                         FunctionProtoType)) {
5234   const FunctionProtoType *FnTy = internal::getFunctionProtoType(Node);
5235 
5236   // If the function does not have a prototype, then it is assumed to be a
5237   // throwing function (as it would if the function did not have any exception
5238   // specification).
5239   if (!FnTy)
5240     return false;
5241 
5242   // Assume the best for any unresolved exception specification.
5243   if (isUnresolvedExceptionSpec(FnTy->getExceptionSpecType()))
5244     return true;
5245 
5246   return FnTy->isNothrow();
5247 }
5248 
5249 /// Matches consteval function declarations and if consteval/if ! consteval
5250 /// statements.
5251 ///
5252 /// Given:
5253 /// \code
5254 ///   consteval int a();
5255 ///   void b() { if consteval {} }
5256 ///   void c() { if ! consteval {} }
5257 ///   void d() { if ! consteval {} else {} }
5258 /// \endcode
5259 /// functionDecl(isConsteval())
5260 ///   matches the declaration of "int a()".
5261 /// ifStmt(isConsteval())
5262 ///   matches the if statement in "void b()", "void c()", "void d()".
AST_POLYMORPHIC_MATCHER(isConsteval,AST_POLYMORPHIC_SUPPORTED_TYPES (FunctionDecl,IfStmt))5263 AST_POLYMORPHIC_MATCHER(isConsteval,
5264                         AST_POLYMORPHIC_SUPPORTED_TYPES(FunctionDecl, IfStmt)) {
5265   return Node.isConsteval();
5266 }
5267 
5268 /// Matches constexpr variable and function declarations,
5269 ///        and if constexpr.
5270 ///
5271 /// Given:
5272 /// \code
5273 ///   constexpr int foo = 42;
5274 ///   constexpr int bar();
5275 ///   void baz() { if constexpr(1 > 0) {} }
5276 /// \endcode
5277 /// varDecl(isConstexpr())
5278 ///   matches the declaration of foo.
5279 /// functionDecl(isConstexpr())
5280 ///   matches the declaration of bar.
5281 /// ifStmt(isConstexpr())
5282 ///   matches the if statement in baz.
AST_POLYMORPHIC_MATCHER(isConstexpr,AST_POLYMORPHIC_SUPPORTED_TYPES (VarDecl,FunctionDecl,IfStmt))5283 AST_POLYMORPHIC_MATCHER(isConstexpr,
5284                         AST_POLYMORPHIC_SUPPORTED_TYPES(VarDecl,
5285                                                         FunctionDecl,
5286                                                         IfStmt)) {
5287   return Node.isConstexpr();
5288 }
5289 
5290 /// Matches constinit variable declarations.
5291 ///
5292 /// Given:
5293 /// \code
5294 ///   constinit int foo = 42;
5295 ///   constinit const char* bar = "bar";
5296 ///   int baz = 42;
5297 ///   [[clang::require_constant_initialization]] int xyz = 42;
5298 /// \endcode
5299 /// varDecl(isConstinit())
5300 ///   matches the declaration of `foo` and `bar`, but not `baz` and `xyz`.
AST_MATCHER(VarDecl,isConstinit)5301 AST_MATCHER(VarDecl, isConstinit) {
5302   if (const auto *CIA = Node.getAttr<ConstInitAttr>())
5303     return CIA->isConstinit();
5304   return false;
5305 }
5306 
5307 /// Matches selection statements with initializer.
5308 ///
5309 /// Given:
5310 /// \code
5311 ///  void foo() {
5312 ///    if (int i = foobar(); i > 0) {}
5313 ///    switch (int i = foobar(); i) {}
5314 ///    for (auto& a = get_range(); auto& x : a) {}
5315 ///  }
5316 ///  void bar() {
5317 ///    if (foobar() > 0) {}
5318 ///    switch (foobar()) {}
5319 ///    for (auto& x : get_range()) {}
5320 ///  }
5321 /// \endcode
5322 /// ifStmt(hasInitStatement(anything()))
5323 ///   matches the if statement in foo but not in bar.
5324 /// switchStmt(hasInitStatement(anything()))
5325 ///   matches the switch statement in foo but not in bar.
5326 /// cxxForRangeStmt(hasInitStatement(anything()))
5327 ///   matches the range for statement in foo but not in bar.
AST_POLYMORPHIC_MATCHER_P(hasInitStatement,AST_POLYMORPHIC_SUPPORTED_TYPES (IfStmt,SwitchStmt,CXXForRangeStmt),internal::Matcher<Stmt>,InnerMatcher)5328 AST_POLYMORPHIC_MATCHER_P(hasInitStatement,
5329                           AST_POLYMORPHIC_SUPPORTED_TYPES(IfStmt, SwitchStmt,
5330                                                           CXXForRangeStmt),
5331                           internal::Matcher<Stmt>, InnerMatcher) {
5332   const Stmt *Init = Node.getInit();
5333   return Init != nullptr && InnerMatcher.matches(*Init, Finder, Builder);
5334 }
5335 
5336 /// Matches the condition expression of an if statement, for loop,
5337 /// switch statement or conditional operator.
5338 ///
5339 /// Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
5340 /// \code
5341 ///   if (true) {}
5342 /// \endcode
AST_POLYMORPHIC_MATCHER_P(hasCondition,AST_POLYMORPHIC_SUPPORTED_TYPES (IfStmt,ForStmt,WhileStmt,DoStmt,SwitchStmt,AbstractConditionalOperator),internal::Matcher<Expr>,InnerMatcher)5343 AST_POLYMORPHIC_MATCHER_P(
5344     hasCondition,
5345     AST_POLYMORPHIC_SUPPORTED_TYPES(IfStmt, ForStmt, WhileStmt, DoStmt,
5346                                     SwitchStmt, AbstractConditionalOperator),
5347     internal::Matcher<Expr>, InnerMatcher) {
5348   const Expr *const Condition = Node.getCond();
5349   return (Condition != nullptr &&
5350           InnerMatcher.matches(*Condition, Finder, Builder));
5351 }
5352 
5353 /// Matches the then-statement of an if statement.
5354 ///
5355 /// Examples matches the if statement
5356 ///   (matcher = ifStmt(hasThen(cxxBoolLiteral(equals(true)))))
5357 /// \code
5358 ///   if (false) true; else false;
5359 /// \endcode
AST_MATCHER_P(IfStmt,hasThen,internal::Matcher<Stmt>,InnerMatcher)5360 AST_MATCHER_P(IfStmt, hasThen, internal::Matcher<Stmt>, InnerMatcher) {
5361   const Stmt *const Then = Node.getThen();
5362   return (Then != nullptr && InnerMatcher.matches(*Then, Finder, Builder));
5363 }
5364 
5365 /// Matches the else-statement of an if statement.
5366 ///
5367 /// Examples matches the if statement
5368 ///   (matcher = ifStmt(hasElse(cxxBoolLiteral(equals(true)))))
5369 /// \code
5370 ///   if (false) false; else true;
5371 /// \endcode
AST_MATCHER_P(IfStmt,hasElse,internal::Matcher<Stmt>,InnerMatcher)5372 AST_MATCHER_P(IfStmt, hasElse, internal::Matcher<Stmt>, InnerMatcher) {
5373   const Stmt *const Else = Node.getElse();
5374   return (Else != nullptr && InnerMatcher.matches(*Else, Finder, Builder));
5375 }
5376 
5377 /// Matches if a node equals a previously bound node.
5378 ///
5379 /// Matches a node if it equals the node previously bound to \p ID.
5380 ///
5381 /// Given
5382 /// \code
5383 ///   class X { int a; int b; };
5384 /// \endcode
5385 /// cxxRecordDecl(
5386 ///     has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
5387 ///     has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
5388 ///   matches the class \c X, as \c a and \c b have the same type.
5389 ///
5390 /// Note that when multiple matches are involved via \c forEach* matchers,
5391 /// \c equalsBoundNodes acts as a filter.
5392 /// For example:
5393 /// compoundStmt(
5394 ///     forEachDescendant(varDecl().bind("d")),
5395 ///     forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
5396 /// will trigger a match for each combination of variable declaration
5397 /// and reference to that variable declaration within a compound statement.
AST_POLYMORPHIC_MATCHER_P(equalsBoundNode,AST_POLYMORPHIC_SUPPORTED_TYPES (Stmt,Decl,Type,QualType),std::string,ID)5398 AST_POLYMORPHIC_MATCHER_P(equalsBoundNode,
5399                           AST_POLYMORPHIC_SUPPORTED_TYPES(Stmt, Decl, Type,
5400                                                           QualType),
5401                           std::string, ID) {
5402   // FIXME: Figure out whether it makes sense to allow this
5403   // on any other node types.
5404   // For *Loc it probably does not make sense, as those seem
5405   // unique. For NestedNameSepcifier it might make sense, as
5406   // those also have pointer identity, but I'm not sure whether
5407   // they're ever reused.
5408   internal::NotEqualsBoundNodePredicate Predicate;
5409   Predicate.ID = ID;
5410   Predicate.Node = DynTypedNode::create(Node);
5411   return Builder->removeBindings(Predicate);
5412 }
5413 
5414 /// Matches the condition variable statement in an if statement.
5415 ///
5416 /// Given
5417 /// \code
5418 ///   if (A* a = GetAPointer()) {}
5419 /// \endcode
5420 /// hasConditionVariableStatement(...)
5421 ///   matches 'A* a = GetAPointer()'.
AST_MATCHER_P(IfStmt,hasConditionVariableStatement,internal::Matcher<DeclStmt>,InnerMatcher)5422 AST_MATCHER_P(IfStmt, hasConditionVariableStatement,
5423               internal::Matcher<DeclStmt>, InnerMatcher) {
5424   const DeclStmt* const DeclarationStatement =
5425     Node.getConditionVariableDeclStmt();
5426   return DeclarationStatement != nullptr &&
5427          InnerMatcher.matches(*DeclarationStatement, Finder, Builder);
5428 }
5429 
5430 /// Matches the index expression of an array subscript expression.
5431 ///
5432 /// Given
5433 /// \code
5434 ///   int i[5];
5435 ///   void f() { i[1] = 42; }
5436 /// \endcode
5437 /// arraySubscriptExpression(hasIndex(integerLiteral()))
5438 ///   matches \c i[1] with the \c integerLiteral() matching \c 1
AST_MATCHER_P(ArraySubscriptExpr,hasIndex,internal::Matcher<Expr>,InnerMatcher)5439 AST_MATCHER_P(ArraySubscriptExpr, hasIndex,
5440               internal::Matcher<Expr>, InnerMatcher) {
5441   if (const Expr* Expression = Node.getIdx())
5442     return InnerMatcher.matches(*Expression, Finder, Builder);
5443   return false;
5444 }
5445 
5446 /// Matches the base expression of an array subscript expression.
5447 ///
5448 /// Given
5449 /// \code
5450 ///   int i[5];
5451 ///   void f() { i[1] = 42; }
5452 /// \endcode
5453 /// arraySubscriptExpression(hasBase(implicitCastExpr(
5454 ///     hasSourceExpression(declRefExpr()))))
5455 ///   matches \c i[1] with the \c declRefExpr() matching \c i
AST_MATCHER_P(ArraySubscriptExpr,hasBase,internal::Matcher<Expr>,InnerMatcher)5456 AST_MATCHER_P(ArraySubscriptExpr, hasBase,
5457               internal::Matcher<Expr>, InnerMatcher) {
5458   if (const Expr* Expression = Node.getBase())
5459     return InnerMatcher.matches(*Expression, Finder, Builder);
5460   return false;
5461 }
5462 
5463 /// Matches a 'for', 'while', 'do' statement or a function definition that has
5464 /// a given body. Note that in case of functions this matcher only matches the
5465 /// definition itself and not the other declarations of the same function.
5466 ///
5467 /// Given
5468 /// \code
5469 ///   for (;;) {}
5470 /// \endcode
5471 /// forStmt(hasBody(compoundStmt()))
5472 ///   matches 'for (;;) {}'
5473 /// with compoundStmt()
5474 ///   matching '{}'
5475 ///
5476 /// Given
5477 /// \code
5478 ///   void f();
5479 ///   void f() {}
5480 /// \endcode
5481 /// functionDecl(hasBody(compoundStmt()))
5482 ///   matches 'void f() {}'
5483 /// with compoundStmt()
5484 ///   matching '{}'
5485 ///   but does not match 'void f();'
AST_POLYMORPHIC_MATCHER_P(hasBody,AST_POLYMORPHIC_SUPPORTED_TYPES (DoStmt,ForStmt,WhileStmt,CXXForRangeStmt,FunctionDecl),internal::Matcher<Stmt>,InnerMatcher)5486 AST_POLYMORPHIC_MATCHER_P(hasBody,
5487                           AST_POLYMORPHIC_SUPPORTED_TYPES(DoStmt, ForStmt,
5488                                                           WhileStmt,
5489                                                           CXXForRangeStmt,
5490                                                           FunctionDecl),
5491                           internal::Matcher<Stmt>, InnerMatcher) {
5492   if (Finder->isTraversalIgnoringImplicitNodes() && isDefaultedHelper(&Node))
5493     return false;
5494   const Stmt *const Statement = internal::GetBodyMatcher<NodeType>::get(Node);
5495   return (Statement != nullptr &&
5496           InnerMatcher.matches(*Statement, Finder, Builder));
5497 }
5498 
5499 /// Matches a function declaration that has a given body present in the AST.
5500 /// Note that this matcher matches all the declarations of a function whose
5501 /// body is present in the AST.
5502 ///
5503 /// Given
5504 /// \code
5505 ///   void f();
5506 ///   void f() {}
5507 ///   void g();
5508 /// \endcode
5509 /// functionDecl(hasAnyBody(compoundStmt()))
5510 ///   matches both 'void f();'
5511 ///   and 'void f() {}'
5512 /// with compoundStmt()
5513 ///   matching '{}'
5514 ///   but does not match 'void g();'
AST_MATCHER_P(FunctionDecl,hasAnyBody,internal::Matcher<Stmt>,InnerMatcher)5515 AST_MATCHER_P(FunctionDecl, hasAnyBody,
5516               internal::Matcher<Stmt>, InnerMatcher) {
5517   const Stmt *const Statement = Node.getBody();
5518   return (Statement != nullptr &&
5519           InnerMatcher.matches(*Statement, Finder, Builder));
5520 }
5521 
5522 
5523 /// Matches compound statements where at least one substatement matches
5524 /// a given matcher. Also matches StmtExprs that have CompoundStmt as children.
5525 ///
5526 /// Given
5527 /// \code
5528 ///   { {}; 1+2; }
5529 /// \endcode
5530 /// hasAnySubstatement(compoundStmt())
5531 ///   matches '{ {}; 1+2; }'
5532 /// with compoundStmt()
5533 ///   matching '{}'
AST_POLYMORPHIC_MATCHER_P(hasAnySubstatement,AST_POLYMORPHIC_SUPPORTED_TYPES (CompoundStmt,StmtExpr),internal::Matcher<Stmt>,InnerMatcher)5534 AST_POLYMORPHIC_MATCHER_P(hasAnySubstatement,
5535                           AST_POLYMORPHIC_SUPPORTED_TYPES(CompoundStmt,
5536                                                           StmtExpr),
5537                           internal::Matcher<Stmt>, InnerMatcher) {
5538   const CompoundStmt *CS = CompoundStmtMatcher<NodeType>::get(Node);
5539   return CS && matchesFirstInPointerRange(InnerMatcher, CS->body_begin(),
5540                                           CS->body_end(), Finder,
5541                                           Builder) != CS->body_end();
5542 }
5543 
5544 /// Checks that a compound statement contains a specific number of
5545 /// child statements.
5546 ///
5547 /// Example: Given
5548 /// \code
5549 ///   { for (;;) {} }
5550 /// \endcode
5551 /// compoundStmt(statementCountIs(0)))
5552 ///   matches '{}'
5553 ///   but does not match the outer compound statement.
AST_MATCHER_P(CompoundStmt,statementCountIs,unsigned,N)5554 AST_MATCHER_P(CompoundStmt, statementCountIs, unsigned, N) {
5555   return Node.size() == N;
5556 }
5557 
5558 /// Matches literals that are equal to the given value of type ValueT.
5559 ///
5560 /// Given
5561 /// \code
5562 ///   f('\0', false, 3.14, 42);
5563 /// \endcode
5564 /// characterLiteral(equals(0))
5565 ///   matches '\0'
5566 /// cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
5567 ///   match false
5568 /// floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
5569 ///   match 3.14
5570 /// integerLiteral(equals(42))
5571 ///   matches 42
5572 ///
5573 /// Note that you cannot directly match a negative numeric literal because the
5574 /// minus sign is not part of the literal: It is a unary operator whose operand
5575 /// is the positive numeric literal. Instead, you must use a unaryOperator()
5576 /// matcher to match the minus sign:
5577 ///
5578 /// unaryOperator(hasOperatorName("-"),
5579 ///               hasUnaryOperand(integerLiteral(equals(13))))
5580 ///
5581 /// Usable as: Matcher<CharacterLiteral>, Matcher<CXXBoolLiteralExpr>,
5582 ///            Matcher<FloatingLiteral>, Matcher<IntegerLiteral>
5583 template <typename ValueT>
5584 internal::PolymorphicMatcher<internal::ValueEqualsMatcher,
5585                              void(internal::AllNodeBaseTypes), ValueT>
equals(const ValueT & Value)5586 equals(const ValueT &Value) {
5587   return internal::PolymorphicMatcher<internal::ValueEqualsMatcher,
5588                                       void(internal::AllNodeBaseTypes), ValueT>(
5589       Value);
5590 }
5591 
5592 AST_POLYMORPHIC_MATCHER_P_OVERLOAD(equals,
5593                           AST_POLYMORPHIC_SUPPORTED_TYPES(CharacterLiteral,
5594                                                           CXXBoolLiteralExpr,
5595                                                           IntegerLiteral),
5596                           bool, Value, 0) {
5597   return internal::ValueEqualsMatcher<NodeType, ParamT>(Value)
5598     .matchesNode(Node);
5599 }
5600 
5601 AST_POLYMORPHIC_MATCHER_P_OVERLOAD(equals,
5602                           AST_POLYMORPHIC_SUPPORTED_TYPES(CharacterLiteral,
5603                                                           CXXBoolLiteralExpr,
5604                                                           IntegerLiteral),
5605                           unsigned, Value, 1) {
5606   return internal::ValueEqualsMatcher<NodeType, ParamT>(Value)
5607     .matchesNode(Node);
5608 }
5609 
5610 AST_POLYMORPHIC_MATCHER_P_OVERLOAD(equals,
5611                           AST_POLYMORPHIC_SUPPORTED_TYPES(CharacterLiteral,
5612                                                           CXXBoolLiteralExpr,
5613                                                           FloatingLiteral,
5614                                                           IntegerLiteral),
5615                           double, Value, 2) {
5616   return internal::ValueEqualsMatcher<NodeType, ParamT>(Value)
5617     .matchesNode(Node);
5618 }
5619 
5620 /// Matches the operator Name of operator expressions (binary or
5621 /// unary).
5622 ///
5623 /// Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
5624 /// \code
5625 ///   !(a || b)
5626 /// \endcode
AST_POLYMORPHIC_MATCHER_P(hasOperatorName,AST_POLYMORPHIC_SUPPORTED_TYPES (BinaryOperator,CXXOperatorCallExpr,CXXRewrittenBinaryOperator,UnaryOperator),std::string,Name)5627 AST_POLYMORPHIC_MATCHER_P(
5628     hasOperatorName,
5629     AST_POLYMORPHIC_SUPPORTED_TYPES(BinaryOperator, CXXOperatorCallExpr,
5630                                     CXXRewrittenBinaryOperator, UnaryOperator),
5631     std::string, Name) {
5632   if (std::optional<StringRef> OpName = internal::getOpName(Node))
5633     return *OpName == Name;
5634   return false;
5635 }
5636 
5637 /// Matches operator expressions (binary or unary) that have any of the
5638 /// specified names.
5639 ///
5640 ///    hasAnyOperatorName("+", "-")
5641 ///  Is equivalent to
5642 ///    anyOf(hasOperatorName("+"), hasOperatorName("-"))
5643 extern const internal::VariadicFunction<
5644     internal::PolymorphicMatcher<internal::HasAnyOperatorNameMatcher,
5645                                  AST_POLYMORPHIC_SUPPORTED_TYPES(
5646                                      BinaryOperator, CXXOperatorCallExpr,
5647                                      CXXRewrittenBinaryOperator, UnaryOperator),
5648                                  std::vector<std::string>>,
5649     StringRef, internal::hasAnyOperatorNameFunc>
5650     hasAnyOperatorName;
5651 
5652 /// Matches all kinds of assignment operators.
5653 ///
5654 /// Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator()))
5655 /// \code
5656 ///   if (a == b)
5657 ///     a += b;
5658 /// \endcode
5659 ///
5660 /// Example 2: matches s1 = s2
5661 ///            (matcher = cxxOperatorCallExpr(isAssignmentOperator()))
5662 /// \code
5663 ///   struct S { S& operator=(const S&); };
5664 ///   void x() { S s1, s2; s1 = s2; }
5665 /// \endcode
AST_POLYMORPHIC_MATCHER(isAssignmentOperator,AST_POLYMORPHIC_SUPPORTED_TYPES (BinaryOperator,CXXOperatorCallExpr,CXXRewrittenBinaryOperator))5666 AST_POLYMORPHIC_MATCHER(
5667     isAssignmentOperator,
5668     AST_POLYMORPHIC_SUPPORTED_TYPES(BinaryOperator, CXXOperatorCallExpr,
5669                                     CXXRewrittenBinaryOperator)) {
5670   return Node.isAssignmentOp();
5671 }
5672 
5673 /// Matches comparison operators.
5674 ///
5675 /// Example 1: matches a == b (matcher = binaryOperator(isComparisonOperator()))
5676 /// \code
5677 ///   if (a == b)
5678 ///     a += b;
5679 /// \endcode
5680 ///
5681 /// Example 2: matches s1 < s2
5682 ///            (matcher = cxxOperatorCallExpr(isComparisonOperator()))
5683 /// \code
5684 ///   struct S { bool operator<(const S& other); };
5685 ///   void x(S s1, S s2) { bool b1 = s1 < s2; }
5686 /// \endcode
AST_POLYMORPHIC_MATCHER(isComparisonOperator,AST_POLYMORPHIC_SUPPORTED_TYPES (BinaryOperator,CXXOperatorCallExpr,CXXRewrittenBinaryOperator))5687 AST_POLYMORPHIC_MATCHER(
5688     isComparisonOperator,
5689     AST_POLYMORPHIC_SUPPORTED_TYPES(BinaryOperator, CXXOperatorCallExpr,
5690                                     CXXRewrittenBinaryOperator)) {
5691   return Node.isComparisonOp();
5692 }
5693 
5694 /// Matches the left hand side of binary operator expressions.
5695 ///
5696 /// Example matches a (matcher = binaryOperator(hasLHS()))
5697 /// \code
5698 ///   a || b
5699 /// \endcode
AST_POLYMORPHIC_MATCHER_P(hasLHS,AST_POLYMORPHIC_SUPPORTED_TYPES (BinaryOperator,CXXOperatorCallExpr,CXXRewrittenBinaryOperator,ArraySubscriptExpr),internal::Matcher<Expr>,InnerMatcher)5700 AST_POLYMORPHIC_MATCHER_P(hasLHS,
5701                           AST_POLYMORPHIC_SUPPORTED_TYPES(
5702                               BinaryOperator, CXXOperatorCallExpr,
5703                               CXXRewrittenBinaryOperator, ArraySubscriptExpr),
5704                           internal::Matcher<Expr>, InnerMatcher) {
5705   const Expr *LeftHandSide = internal::getLHS(Node);
5706   return (LeftHandSide != nullptr &&
5707           InnerMatcher.matches(*LeftHandSide, Finder, Builder));
5708 }
5709 
5710 /// Matches the right hand side of binary operator expressions.
5711 ///
5712 /// Example matches b (matcher = binaryOperator(hasRHS()))
5713 /// \code
5714 ///   a || b
5715 /// \endcode
AST_POLYMORPHIC_MATCHER_P(hasRHS,AST_POLYMORPHIC_SUPPORTED_TYPES (BinaryOperator,CXXOperatorCallExpr,CXXRewrittenBinaryOperator,ArraySubscriptExpr),internal::Matcher<Expr>,InnerMatcher)5716 AST_POLYMORPHIC_MATCHER_P(hasRHS,
5717                           AST_POLYMORPHIC_SUPPORTED_TYPES(
5718                               BinaryOperator, CXXOperatorCallExpr,
5719                               CXXRewrittenBinaryOperator, ArraySubscriptExpr),
5720                           internal::Matcher<Expr>, InnerMatcher) {
5721   const Expr *RightHandSide = internal::getRHS(Node);
5722   return (RightHandSide != nullptr &&
5723           InnerMatcher.matches(*RightHandSide, Finder, Builder));
5724 }
5725 
5726 /// Matches if either the left hand side or the right hand side of a
5727 /// binary operator matches.
AST_POLYMORPHIC_MATCHER_P(hasEitherOperand,AST_POLYMORPHIC_SUPPORTED_TYPES (BinaryOperator,CXXOperatorCallExpr,CXXRewrittenBinaryOperator),internal::Matcher<Expr>,InnerMatcher)5728 AST_POLYMORPHIC_MATCHER_P(
5729     hasEitherOperand,
5730     AST_POLYMORPHIC_SUPPORTED_TYPES(BinaryOperator, CXXOperatorCallExpr,
5731                                     CXXRewrittenBinaryOperator),
5732     internal::Matcher<Expr>, InnerMatcher) {
5733   return internal::VariadicDynCastAllOfMatcher<Stmt, NodeType>()(
5734              anyOf(hasLHS(InnerMatcher), hasRHS(InnerMatcher)))
5735       .matches(Node, Finder, Builder);
5736 }
5737 
5738 /// Matches if both matchers match with opposite sides of the binary operator.
5739 ///
5740 /// Example matcher = binaryOperator(hasOperands(integerLiteral(equals(1),
5741 ///                                              integerLiteral(equals(2)))
5742 /// \code
5743 ///   1 + 2 // Match
5744 ///   2 + 1 // Match
5745 ///   1 + 1 // No match
5746 ///   2 + 2 // No match
5747 /// \endcode
AST_POLYMORPHIC_MATCHER_P2(hasOperands,AST_POLYMORPHIC_SUPPORTED_TYPES (BinaryOperator,CXXOperatorCallExpr,CXXRewrittenBinaryOperator),internal::Matcher<Expr>,Matcher1,internal::Matcher<Expr>,Matcher2)5748 AST_POLYMORPHIC_MATCHER_P2(
5749     hasOperands,
5750     AST_POLYMORPHIC_SUPPORTED_TYPES(BinaryOperator, CXXOperatorCallExpr,
5751                                     CXXRewrittenBinaryOperator),
5752     internal::Matcher<Expr>, Matcher1, internal::Matcher<Expr>, Matcher2) {
5753   return internal::VariadicDynCastAllOfMatcher<Stmt, NodeType>()(
5754              anyOf(allOf(hasLHS(Matcher1), hasRHS(Matcher2)),
5755                    allOf(hasLHS(Matcher2), hasRHS(Matcher1))))
5756       .matches(Node, Finder, Builder);
5757 }
5758 
5759 /// Matches if the operand of a unary operator matches.
5760 ///
5761 /// Example matches true (matcher = hasUnaryOperand(
5762 ///                                   cxxBoolLiteral(equals(true))))
5763 /// \code
5764 ///   !true
5765 /// \endcode
AST_POLYMORPHIC_MATCHER_P(hasUnaryOperand,AST_POLYMORPHIC_SUPPORTED_TYPES (UnaryOperator,CXXOperatorCallExpr),internal::Matcher<Expr>,InnerMatcher)5766 AST_POLYMORPHIC_MATCHER_P(hasUnaryOperand,
5767                           AST_POLYMORPHIC_SUPPORTED_TYPES(UnaryOperator,
5768                                                           CXXOperatorCallExpr),
5769                           internal::Matcher<Expr>, InnerMatcher) {
5770   const Expr *const Operand = internal::getSubExpr(Node);
5771   return (Operand != nullptr &&
5772           InnerMatcher.matches(*Operand, Finder, Builder));
5773 }
5774 
5775 /// Matches if the cast's source expression
5776 /// or opaque value's source expression matches the given matcher.
5777 ///
5778 /// Example 1: matches "a string"
5779 /// (matcher = castExpr(hasSourceExpression(cxxConstructExpr())))
5780 /// \code
5781 /// class URL { URL(string); };
5782 /// URL url = "a string";
5783 /// \endcode
5784 ///
5785 /// Example 2: matches 'b' (matcher =
5786 /// opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr())))
5787 /// \code
5788 /// int a = b ?: 1;
5789 /// \endcode
AST_POLYMORPHIC_MATCHER_P(hasSourceExpression,AST_POLYMORPHIC_SUPPORTED_TYPES (CastExpr,OpaqueValueExpr),internal::Matcher<Expr>,InnerMatcher)5790 AST_POLYMORPHIC_MATCHER_P(hasSourceExpression,
5791                           AST_POLYMORPHIC_SUPPORTED_TYPES(CastExpr,
5792                                                           OpaqueValueExpr),
5793                           internal::Matcher<Expr>, InnerMatcher) {
5794   const Expr *const SubExpression =
5795       internal::GetSourceExpressionMatcher<NodeType>::get(Node);
5796   return (SubExpression != nullptr &&
5797           InnerMatcher.matches(*SubExpression, Finder, Builder));
5798 }
5799 
5800 /// Matches casts that has a given cast kind.
5801 ///
5802 /// Example: matches the implicit cast around \c 0
5803 /// (matcher = castExpr(hasCastKind(CK_NullToPointer)))
5804 /// \code
5805 ///   int *p = 0;
5806 /// \endcode
5807 ///
5808 /// If the matcher is use from clang-query, CastKind parameter
5809 /// should be passed as a quoted string. e.g., hasCastKind("CK_NullToPointer").
AST_MATCHER_P(CastExpr,hasCastKind,CastKind,Kind)5810 AST_MATCHER_P(CastExpr, hasCastKind, CastKind, Kind) {
5811   return Node.getCastKind() == Kind;
5812 }
5813 
5814 /// Matches casts whose destination type matches a given matcher.
5815 ///
5816 /// (Note: Clang's AST refers to other conversions as "casts" too, and calls
5817 /// actual casts "explicit" casts.)
AST_MATCHER_P(ExplicitCastExpr,hasDestinationType,internal::Matcher<QualType>,InnerMatcher)5818 AST_MATCHER_P(ExplicitCastExpr, hasDestinationType,
5819               internal::Matcher<QualType>, InnerMatcher) {
5820   const QualType NodeType = Node.getTypeAsWritten();
5821   return InnerMatcher.matches(NodeType, Finder, Builder);
5822 }
5823 
5824 /// Matches implicit casts whose destination type matches a given
5825 /// matcher.
AST_MATCHER_P(ImplicitCastExpr,hasImplicitDestinationType,internal::Matcher<QualType>,InnerMatcher)5826 AST_MATCHER_P(ImplicitCastExpr, hasImplicitDestinationType,
5827               internal::Matcher<QualType>, InnerMatcher) {
5828   return InnerMatcher.matches(Node.getType(), Finder, Builder);
5829 }
5830 
5831 /// Matches TagDecl object that are spelled with "struct."
5832 ///
5833 /// Example matches S, but not C, U or E.
5834 /// \code
5835 ///   struct S {};
5836 ///   class C {};
5837 ///   union U {};
5838 ///   enum E {};
5839 /// \endcode
AST_MATCHER(TagDecl,isStruct)5840 AST_MATCHER(TagDecl, isStruct) {
5841   return Node.isStruct();
5842 }
5843 
5844 /// Matches TagDecl object that are spelled with "union."
5845 ///
5846 /// Example matches U, but not C, S or E.
5847 /// \code
5848 ///   struct S {};
5849 ///   class C {};
5850 ///   union U {};
5851 ///   enum E {};
5852 /// \endcode
AST_MATCHER(TagDecl,isUnion)5853 AST_MATCHER(TagDecl, isUnion) {
5854   return Node.isUnion();
5855 }
5856 
5857 /// Matches TagDecl object that are spelled with "class."
5858 ///
5859 /// Example matches C, but not S, U or E.
5860 /// \code
5861 ///   struct S {};
5862 ///   class C {};
5863 ///   union U {};
5864 ///   enum E {};
5865 /// \endcode
AST_MATCHER(TagDecl,isClass)5866 AST_MATCHER(TagDecl, isClass) {
5867   return Node.isClass();
5868 }
5869 
5870 /// Matches TagDecl object that are spelled with "enum."
5871 ///
5872 /// Example matches E, but not C, S or U.
5873 /// \code
5874 ///   struct S {};
5875 ///   class C {};
5876 ///   union U {};
5877 ///   enum E {};
5878 /// \endcode
AST_MATCHER(TagDecl,isEnum)5879 AST_MATCHER(TagDecl, isEnum) {
5880   return Node.isEnum();
5881 }
5882 
5883 /// Matches the true branch expression of a conditional operator.
5884 ///
5885 /// Example 1 (conditional ternary operator): matches a
5886 /// \code
5887 ///   condition ? a : b
5888 /// \endcode
5889 ///
5890 /// Example 2 (conditional binary operator): matches opaqueValueExpr(condition)
5891 /// \code
5892 ///   condition ?: b
5893 /// \endcode
AST_MATCHER_P(AbstractConditionalOperator,hasTrueExpression,internal::Matcher<Expr>,InnerMatcher)5894 AST_MATCHER_P(AbstractConditionalOperator, hasTrueExpression,
5895               internal::Matcher<Expr>, InnerMatcher) {
5896   const Expr *Expression = Node.getTrueExpr();
5897   return (Expression != nullptr &&
5898           InnerMatcher.matches(*Expression, Finder, Builder));
5899 }
5900 
5901 /// Matches the false branch expression of a conditional operator
5902 /// (binary or ternary).
5903 ///
5904 /// Example matches b
5905 /// \code
5906 ///   condition ? a : b
5907 ///   condition ?: b
5908 /// \endcode
AST_MATCHER_P(AbstractConditionalOperator,hasFalseExpression,internal::Matcher<Expr>,InnerMatcher)5909 AST_MATCHER_P(AbstractConditionalOperator, hasFalseExpression,
5910               internal::Matcher<Expr>, InnerMatcher) {
5911   const Expr *Expression = Node.getFalseExpr();
5912   return (Expression != nullptr &&
5913           InnerMatcher.matches(*Expression, Finder, Builder));
5914 }
5915 
5916 /// Matches if a declaration has a body attached.
5917 ///
5918 /// Example matches A, va, fa
5919 /// \code
5920 ///   class A {};
5921 ///   class B;  // Doesn't match, as it has no body.
5922 ///   int va;
5923 ///   extern int vb;  // Doesn't match, as it doesn't define the variable.
5924 ///   void fa() {}
5925 ///   void fb();  // Doesn't match, as it has no body.
5926 ///   @interface X
5927 ///   - (void)ma; // Doesn't match, interface is declaration.
5928 ///   @end
5929 ///   @implementation X
5930 ///   - (void)ma {}
5931 ///   @end
5932 /// \endcode
5933 ///
5934 /// Usable as: Matcher<TagDecl>, Matcher<VarDecl>, Matcher<FunctionDecl>,
5935 ///   Matcher<ObjCMethodDecl>
AST_POLYMORPHIC_MATCHER(isDefinition,AST_POLYMORPHIC_SUPPORTED_TYPES (TagDecl,VarDecl,ObjCMethodDecl,FunctionDecl))5936 AST_POLYMORPHIC_MATCHER(isDefinition,
5937                         AST_POLYMORPHIC_SUPPORTED_TYPES(TagDecl, VarDecl,
5938                                                         ObjCMethodDecl,
5939                                                         FunctionDecl)) {
5940   return Node.isThisDeclarationADefinition();
5941 }
5942 
5943 /// Matches if a function declaration is variadic.
5944 ///
5945 /// Example matches f, but not g or h. The function i will not match, even when
5946 /// compiled in C mode.
5947 /// \code
5948 ///   void f(...);
5949 ///   void g(int);
5950 ///   template <typename... Ts> void h(Ts...);
5951 ///   void i();
5952 /// \endcode
AST_MATCHER(FunctionDecl,isVariadic)5953 AST_MATCHER(FunctionDecl, isVariadic) {
5954   return Node.isVariadic();
5955 }
5956 
5957 /// Matches the class declaration that the given method declaration
5958 /// belongs to.
5959 ///
5960 /// FIXME: Generalize this for other kinds of declarations.
5961 /// FIXME: What other kind of declarations would we need to generalize
5962 /// this to?
5963 ///
5964 /// Example matches A() in the last line
5965 ///     (matcher = cxxConstructExpr(hasDeclaration(cxxMethodDecl(
5966 ///         ofClass(hasName("A"))))))
5967 /// \code
5968 ///   class A {
5969 ///    public:
5970 ///     A();
5971 ///   };
5972 ///   A a = A();
5973 /// \endcode
AST_MATCHER_P(CXXMethodDecl,ofClass,internal::Matcher<CXXRecordDecl>,InnerMatcher)5974 AST_MATCHER_P(CXXMethodDecl, ofClass,
5975               internal::Matcher<CXXRecordDecl>, InnerMatcher) {
5976 
5977   ASTChildrenNotSpelledInSourceScope RAII(Finder, false);
5978 
5979   const CXXRecordDecl *Parent = Node.getParent();
5980   return (Parent != nullptr &&
5981           InnerMatcher.matches(*Parent, Finder, Builder));
5982 }
5983 
5984 /// Matches each method overridden by the given method. This matcher may
5985 /// produce multiple matches.
5986 ///
5987 /// Given
5988 /// \code
5989 ///   class A { virtual void f(); };
5990 ///   class B : public A { void f(); };
5991 ///   class C : public B { void f(); };
5992 /// \endcode
5993 /// cxxMethodDecl(ofClass(hasName("C")),
5994 ///               forEachOverridden(cxxMethodDecl().bind("b"))).bind("d")
5995 ///   matches once, with "b" binding "A::f" and "d" binding "C::f" (Note
5996 ///   that B::f is not overridden by C::f).
5997 ///
5998 /// The check can produce multiple matches in case of multiple inheritance, e.g.
5999 /// \code
6000 ///   class A1 { virtual void f(); };
6001 ///   class A2 { virtual void f(); };
6002 ///   class C : public A1, public A2 { void f(); };
6003 /// \endcode
6004 /// cxxMethodDecl(ofClass(hasName("C")),
6005 ///               forEachOverridden(cxxMethodDecl().bind("b"))).bind("d")
6006 ///   matches twice, once with "b" binding "A1::f" and "d" binding "C::f", and
6007 ///   once with "b" binding "A2::f" and "d" binding "C::f".
AST_MATCHER_P(CXXMethodDecl,forEachOverridden,internal::Matcher<CXXMethodDecl>,InnerMatcher)6008 AST_MATCHER_P(CXXMethodDecl, forEachOverridden,
6009               internal::Matcher<CXXMethodDecl>, InnerMatcher) {
6010   BoundNodesTreeBuilder Result;
6011   bool Matched = false;
6012   for (const auto *Overridden : Node.overridden_methods()) {
6013     BoundNodesTreeBuilder OverriddenBuilder(*Builder);
6014     const bool OverriddenMatched =
6015         InnerMatcher.matches(*Overridden, Finder, &OverriddenBuilder);
6016     if (OverriddenMatched) {
6017       Matched = true;
6018       Result.addMatch(OverriddenBuilder);
6019     }
6020   }
6021   *Builder = std::move(Result);
6022   return Matched;
6023 }
6024 
6025 /// Matches declarations of virtual methods and C++ base specifers that specify
6026 /// virtual inheritance.
6027 ///
6028 /// Example:
6029 /// \code
6030 ///   class A {
6031 ///    public:
6032 ///     virtual void x(); // matches x
6033 ///   };
6034 /// \endcode
6035 ///
6036 /// Example:
6037 /// \code
6038 ///   class Base {};
6039 ///   class DirectlyDerived : virtual Base {}; // matches Base
6040 ///   class IndirectlyDerived : DirectlyDerived, Base {}; // matches Base
6041 /// \endcode
6042 ///
6043 /// Usable as: Matcher<CXXMethodDecl>, Matcher<CXXBaseSpecifier>
AST_POLYMORPHIC_MATCHER(isVirtual,AST_POLYMORPHIC_SUPPORTED_TYPES (CXXMethodDecl,CXXBaseSpecifier))6044 AST_POLYMORPHIC_MATCHER(isVirtual,
6045                         AST_POLYMORPHIC_SUPPORTED_TYPES(CXXMethodDecl,
6046                                                         CXXBaseSpecifier)) {
6047   return Node.isVirtual();
6048 }
6049 
6050 /// Matches if the given method declaration has an explicit "virtual".
6051 ///
6052 /// Given
6053 /// \code
6054 ///   class A {
6055 ///    public:
6056 ///     virtual void x();
6057 ///   };
6058 ///   class B : public A {
6059 ///    public:
6060 ///     void x();
6061 ///   };
6062 /// \endcode
6063 ///   matches A::x but not B::x
AST_MATCHER(CXXMethodDecl,isVirtualAsWritten)6064 AST_MATCHER(CXXMethodDecl, isVirtualAsWritten) {
6065   return Node.isVirtualAsWritten();
6066 }
6067 
AST_MATCHER(CXXConstructorDecl,isInheritingConstructor)6068 AST_MATCHER(CXXConstructorDecl, isInheritingConstructor) {
6069   return Node.isInheritingConstructor();
6070 }
6071 
6072 /// Matches if the given method or class declaration is final.
6073 ///
6074 /// Given:
6075 /// \code
6076 ///   class A final {};
6077 ///
6078 ///   struct B {
6079 ///     virtual void f();
6080 ///   };
6081 ///
6082 ///   struct C : B {
6083 ///     void f() final;
6084 ///   };
6085 /// \endcode
6086 /// matches A and C::f, but not B, C, or B::f
AST_POLYMORPHIC_MATCHER(isFinal,AST_POLYMORPHIC_SUPPORTED_TYPES (CXXRecordDecl,CXXMethodDecl))6087 AST_POLYMORPHIC_MATCHER(isFinal,
6088                         AST_POLYMORPHIC_SUPPORTED_TYPES(CXXRecordDecl,
6089                                                         CXXMethodDecl)) {
6090   return Node.template hasAttr<FinalAttr>();
6091 }
6092 
6093 /// Matches if the given method declaration is pure.
6094 ///
6095 /// Given
6096 /// \code
6097 ///   class A {
6098 ///    public:
6099 ///     virtual void x() = 0;
6100 ///   };
6101 /// \endcode
6102 ///   matches A::x
AST_MATCHER(CXXMethodDecl,isPure)6103 AST_MATCHER(CXXMethodDecl, isPure) {
6104   return Node.isPure();
6105 }
6106 
6107 /// Matches if the given method declaration is const.
6108 ///
6109 /// Given
6110 /// \code
6111 /// struct A {
6112 ///   void foo() const;
6113 ///   void bar();
6114 /// };
6115 /// \endcode
6116 ///
6117 /// cxxMethodDecl(isConst()) matches A::foo() but not A::bar()
AST_MATCHER(CXXMethodDecl,isConst)6118 AST_MATCHER(CXXMethodDecl, isConst) {
6119   return Node.isConst();
6120 }
6121 
6122 /// Matches if the given method declaration declares a copy assignment
6123 /// operator.
6124 ///
6125 /// Given
6126 /// \code
6127 /// struct A {
6128 ///   A &operator=(const A &);
6129 ///   A &operator=(A &&);
6130 /// };
6131 /// \endcode
6132 ///
6133 /// cxxMethodDecl(isCopyAssignmentOperator()) matches the first method but not
6134 /// the second one.
AST_MATCHER(CXXMethodDecl,isCopyAssignmentOperator)6135 AST_MATCHER(CXXMethodDecl, isCopyAssignmentOperator) {
6136   return Node.isCopyAssignmentOperator();
6137 }
6138 
6139 /// Matches if the given method declaration declares a move assignment
6140 /// operator.
6141 ///
6142 /// Given
6143 /// \code
6144 /// struct A {
6145 ///   A &operator=(const A &);
6146 ///   A &operator=(A &&);
6147 /// };
6148 /// \endcode
6149 ///
6150 /// cxxMethodDecl(isMoveAssignmentOperator()) matches the second method but not
6151 /// the first one.
AST_MATCHER(CXXMethodDecl,isMoveAssignmentOperator)6152 AST_MATCHER(CXXMethodDecl, isMoveAssignmentOperator) {
6153   return Node.isMoveAssignmentOperator();
6154 }
6155 
6156 /// Matches if the given method declaration overrides another method.
6157 ///
6158 /// Given
6159 /// \code
6160 ///   class A {
6161 ///    public:
6162 ///     virtual void x();
6163 ///   };
6164 ///   class B : public A {
6165 ///    public:
6166 ///     virtual void x();
6167 ///   };
6168 /// \endcode
6169 ///   matches B::x
AST_MATCHER(CXXMethodDecl,isOverride)6170 AST_MATCHER(CXXMethodDecl, isOverride) {
6171   return Node.size_overridden_methods() > 0 || Node.hasAttr<OverrideAttr>();
6172 }
6173 
6174 /// Matches method declarations that are user-provided.
6175 ///
6176 /// Given
6177 /// \code
6178 ///   struct S {
6179 ///     S(); // #1
6180 ///     S(const S &) = default; // #2
6181 ///     S(S &&) = delete; // #3
6182 ///   };
6183 /// \endcode
6184 /// cxxConstructorDecl(isUserProvided()) will match #1, but not #2 or #3.
AST_MATCHER(CXXMethodDecl,isUserProvided)6185 AST_MATCHER(CXXMethodDecl, isUserProvided) {
6186   return Node.isUserProvided();
6187 }
6188 
6189 /// Matches member expressions that are called with '->' as opposed
6190 /// to '.'.
6191 ///
6192 /// Member calls on the implicit this pointer match as called with '->'.
6193 ///
6194 /// Given
6195 /// \code
6196 ///   class Y {
6197 ///     void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; }
6198 ///     template <class T> void f() { this->f<T>(); f<T>(); }
6199 ///     int a;
6200 ///     static int b;
6201 ///   };
6202 ///   template <class T>
6203 ///   class Z {
6204 ///     void x() { this->m; }
6205 ///   };
6206 /// \endcode
6207 /// memberExpr(isArrow())
6208 ///   matches this->x, x, y.x, a, this->b
6209 /// cxxDependentScopeMemberExpr(isArrow())
6210 ///   matches this->m
6211 /// unresolvedMemberExpr(isArrow())
6212 ///   matches this->f<T>, f<T>
AST_POLYMORPHIC_MATCHER(isArrow,AST_POLYMORPHIC_SUPPORTED_TYPES (MemberExpr,UnresolvedMemberExpr,CXXDependentScopeMemberExpr))6213 AST_POLYMORPHIC_MATCHER(
6214     isArrow, AST_POLYMORPHIC_SUPPORTED_TYPES(MemberExpr, UnresolvedMemberExpr,
6215                                              CXXDependentScopeMemberExpr)) {
6216   return Node.isArrow();
6217 }
6218 
6219 /// Matches QualType nodes that are of integer type.
6220 ///
6221 /// Given
6222 /// \code
6223 ///   void a(int);
6224 ///   void b(long);
6225 ///   void c(double);
6226 /// \endcode
6227 /// functionDecl(hasAnyParameter(hasType(isInteger())))
6228 /// matches "a(int)", "b(long)", but not "c(double)".
AST_MATCHER(QualType,isInteger)6229 AST_MATCHER(QualType, isInteger) {
6230     return Node->isIntegerType();
6231 }
6232 
6233 /// Matches QualType nodes that are of unsigned integer type.
6234 ///
6235 /// Given
6236 /// \code
6237 ///   void a(int);
6238 ///   void b(unsigned long);
6239 ///   void c(double);
6240 /// \endcode
6241 /// functionDecl(hasAnyParameter(hasType(isUnsignedInteger())))
6242 /// matches "b(unsigned long)", but not "a(int)" and "c(double)".
AST_MATCHER(QualType,isUnsignedInteger)6243 AST_MATCHER(QualType, isUnsignedInteger) {
6244     return Node->isUnsignedIntegerType();
6245 }
6246 
6247 /// Matches QualType nodes that are of signed integer type.
6248 ///
6249 /// Given
6250 /// \code
6251 ///   void a(int);
6252 ///   void b(unsigned long);
6253 ///   void c(double);
6254 /// \endcode
6255 /// functionDecl(hasAnyParameter(hasType(isSignedInteger())))
6256 /// matches "a(int)", but not "b(unsigned long)" and "c(double)".
AST_MATCHER(QualType,isSignedInteger)6257 AST_MATCHER(QualType, isSignedInteger) {
6258     return Node->isSignedIntegerType();
6259 }
6260 
6261 /// Matches QualType nodes that are of character type.
6262 ///
6263 /// Given
6264 /// \code
6265 ///   void a(char);
6266 ///   void b(wchar_t);
6267 ///   void c(double);
6268 /// \endcode
6269 /// functionDecl(hasAnyParameter(hasType(isAnyCharacter())))
6270 /// matches "a(char)", "b(wchar_t)", but not "c(double)".
AST_MATCHER(QualType,isAnyCharacter)6271 AST_MATCHER(QualType, isAnyCharacter) {
6272     return Node->isAnyCharacterType();
6273 }
6274 
6275 /// Matches QualType nodes that are of any pointer type; this includes
6276 /// the Objective-C object pointer type, which is different despite being
6277 /// syntactically similar.
6278 ///
6279 /// Given
6280 /// \code
6281 ///   int *i = nullptr;
6282 ///
6283 ///   @interface Foo
6284 ///   @end
6285 ///   Foo *f;
6286 ///
6287 ///   int j;
6288 /// \endcode
6289 /// varDecl(hasType(isAnyPointer()))
6290 ///   matches "int *i" and "Foo *f", but not "int j".
AST_MATCHER(QualType,isAnyPointer)6291 AST_MATCHER(QualType, isAnyPointer) {
6292   return Node->isAnyPointerType();
6293 }
6294 
6295 /// Matches QualType nodes that are const-qualified, i.e., that
6296 /// include "top-level" const.
6297 ///
6298 /// Given
6299 /// \code
6300 ///   void a(int);
6301 ///   void b(int const);
6302 ///   void c(const int);
6303 ///   void d(const int*);
6304 ///   void e(int const) {};
6305 /// \endcode
6306 /// functionDecl(hasAnyParameter(hasType(isConstQualified())))
6307 ///   matches "void b(int const)", "void c(const int)" and
6308 ///   "void e(int const) {}". It does not match d as there
6309 ///   is no top-level const on the parameter type "const int *".
AST_MATCHER(QualType,isConstQualified)6310 AST_MATCHER(QualType, isConstQualified) {
6311   return Node.isConstQualified();
6312 }
6313 
6314 /// Matches QualType nodes that are volatile-qualified, i.e., that
6315 /// include "top-level" volatile.
6316 ///
6317 /// Given
6318 /// \code
6319 ///   void a(int);
6320 ///   void b(int volatile);
6321 ///   void c(volatile int);
6322 ///   void d(volatile int*);
6323 ///   void e(int volatile) {};
6324 /// \endcode
6325 /// functionDecl(hasAnyParameter(hasType(isVolatileQualified())))
6326 ///   matches "void b(int volatile)", "void c(volatile int)" and
6327 ///   "void e(int volatile) {}". It does not match d as there
6328 ///   is no top-level volatile on the parameter type "volatile int *".
AST_MATCHER(QualType,isVolatileQualified)6329 AST_MATCHER(QualType, isVolatileQualified) {
6330   return Node.isVolatileQualified();
6331 }
6332 
6333 /// Matches QualType nodes that have local CV-qualifiers attached to
6334 /// the node, not hidden within a typedef.
6335 ///
6336 /// Given
6337 /// \code
6338 ///   typedef const int const_int;
6339 ///   const_int i;
6340 ///   int *const j;
6341 ///   int *volatile k;
6342 ///   int m;
6343 /// \endcode
6344 /// \c varDecl(hasType(hasLocalQualifiers())) matches only \c j and \c k.
6345 /// \c i is const-qualified but the qualifier is not local.
AST_MATCHER(QualType,hasLocalQualifiers)6346 AST_MATCHER(QualType, hasLocalQualifiers) {
6347   return Node.hasLocalQualifiers();
6348 }
6349 
6350 /// Matches a member expression where the member is matched by a
6351 /// given matcher.
6352 ///
6353 /// Given
6354 /// \code
6355 ///   struct { int first, second; } first, second;
6356 ///   int i(second.first);
6357 ///   int j(first.second);
6358 /// \endcode
6359 /// memberExpr(member(hasName("first")))
6360 ///   matches second.first
6361 ///   but not first.second (because the member name there is "second").
AST_MATCHER_P(MemberExpr,member,internal::Matcher<ValueDecl>,InnerMatcher)6362 AST_MATCHER_P(MemberExpr, member,
6363               internal::Matcher<ValueDecl>, InnerMatcher) {
6364   return InnerMatcher.matches(*Node.getMemberDecl(), Finder, Builder);
6365 }
6366 
6367 /// Matches a member expression where the object expression is matched by a
6368 /// given matcher. Implicit object expressions are included; that is, it matches
6369 /// use of implicit `this`.
6370 ///
6371 /// Given
6372 /// \code
6373 ///   struct X {
6374 ///     int m;
6375 ///     int f(X x) { x.m; return m; }
6376 ///   };
6377 /// \endcode
6378 /// memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X")))))
6379 ///   matches `x.m`, but not `m`; however,
6380 /// memberExpr(hasObjectExpression(hasType(pointsTo(
6381 //      cxxRecordDecl(hasName("X"))))))
6382 ///   matches `m` (aka. `this->m`), but not `x.m`.
AST_POLYMORPHIC_MATCHER_P(hasObjectExpression,AST_POLYMORPHIC_SUPPORTED_TYPES (MemberExpr,UnresolvedMemberExpr,CXXDependentScopeMemberExpr),internal::Matcher<Expr>,InnerMatcher)6383 AST_POLYMORPHIC_MATCHER_P(
6384     hasObjectExpression,
6385     AST_POLYMORPHIC_SUPPORTED_TYPES(MemberExpr, UnresolvedMemberExpr,
6386                                     CXXDependentScopeMemberExpr),
6387     internal::Matcher<Expr>, InnerMatcher) {
6388   if (const auto *E = dyn_cast<UnresolvedMemberExpr>(&Node))
6389     if (E->isImplicitAccess())
6390       return false;
6391   if (const auto *E = dyn_cast<CXXDependentScopeMemberExpr>(&Node))
6392     if (E->isImplicitAccess())
6393       return false;
6394   return InnerMatcher.matches(*Node.getBase(), Finder, Builder);
6395 }
6396 
6397 /// Matches any using shadow declaration.
6398 ///
6399 /// Given
6400 /// \code
6401 ///   namespace X { void b(); }
6402 ///   using X::b;
6403 /// \endcode
6404 /// usingDecl(hasAnyUsingShadowDecl(hasName("b"))))
6405 ///   matches \code using X::b \endcode
AST_MATCHER_P(BaseUsingDecl,hasAnyUsingShadowDecl,internal::Matcher<UsingShadowDecl>,InnerMatcher)6406 AST_MATCHER_P(BaseUsingDecl, hasAnyUsingShadowDecl,
6407               internal::Matcher<UsingShadowDecl>, InnerMatcher) {
6408   return matchesFirstInPointerRange(InnerMatcher, Node.shadow_begin(),
6409                                     Node.shadow_end(), Finder,
6410                                     Builder) != Node.shadow_end();
6411 }
6412 
6413 /// Matches a using shadow declaration where the target declaration is
6414 /// matched by the given matcher.
6415 ///
6416 /// Given
6417 /// \code
6418 ///   namespace X { int a; void b(); }
6419 ///   using X::a;
6420 ///   using X::b;
6421 /// \endcode
6422 /// usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(functionDecl())))
6423 ///   matches \code using X::b \endcode
6424 ///   but not \code using X::a \endcode
AST_MATCHER_P(UsingShadowDecl,hasTargetDecl,internal::Matcher<NamedDecl>,InnerMatcher)6425 AST_MATCHER_P(UsingShadowDecl, hasTargetDecl,
6426               internal::Matcher<NamedDecl>, InnerMatcher) {
6427   return InnerMatcher.matches(*Node.getTargetDecl(), Finder, Builder);
6428 }
6429 
6430 /// Matches template instantiations of function, class, or static
6431 /// member variable template instantiations.
6432 ///
6433 /// Given
6434 /// \code
6435 ///   template <typename T> class X {}; class A {}; X<A> x;
6436 /// \endcode
6437 /// or
6438 /// \code
6439 ///   template <typename T> class X {}; class A {}; template class X<A>;
6440 /// \endcode
6441 /// or
6442 /// \code
6443 ///   template <typename T> class X {}; class A {}; extern template class X<A>;
6444 /// \endcode
6445 /// cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
6446 ///   matches the template instantiation of X<A>.
6447 ///
6448 /// But given
6449 /// \code
6450 ///   template <typename T>  class X {}; class A {};
6451 ///   template <> class X<A> {}; X<A> x;
6452 /// \endcode
6453 /// cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
6454 ///   does not match, as X<A> is an explicit template specialization.
6455 ///
6456 /// Usable as: Matcher<FunctionDecl>, Matcher<VarDecl>, Matcher<CXXRecordDecl>
AST_POLYMORPHIC_MATCHER(isTemplateInstantiation,AST_POLYMORPHIC_SUPPORTED_TYPES (FunctionDecl,VarDecl,CXXRecordDecl))6457 AST_POLYMORPHIC_MATCHER(isTemplateInstantiation,
6458                         AST_POLYMORPHIC_SUPPORTED_TYPES(FunctionDecl, VarDecl,
6459                                                         CXXRecordDecl)) {
6460   return (Node.getTemplateSpecializationKind() == TSK_ImplicitInstantiation ||
6461           Node.getTemplateSpecializationKind() ==
6462               TSK_ExplicitInstantiationDefinition ||
6463           Node.getTemplateSpecializationKind() ==
6464               TSK_ExplicitInstantiationDeclaration);
6465 }
6466 
6467 /// Matches declarations that are template instantiations or are inside
6468 /// template instantiations.
6469 ///
6470 /// Given
6471 /// \code
6472 ///   template<typename T> void A(T t) { T i; }
6473 ///   A(0);
6474 ///   A(0U);
6475 /// \endcode
6476 /// functionDecl(isInstantiated())
6477 ///   matches 'A(int) {...};' and 'A(unsigned) {...}'.
AST_MATCHER_FUNCTION(internal::Matcher<Decl>,isInstantiated)6478 AST_MATCHER_FUNCTION(internal::Matcher<Decl>, isInstantiated) {
6479   auto IsInstantiation = decl(anyOf(cxxRecordDecl(isTemplateInstantiation()),
6480                                     functionDecl(isTemplateInstantiation())));
6481   return decl(anyOf(IsInstantiation, hasAncestor(IsInstantiation)));
6482 }
6483 
6484 /// Matches statements inside of a template instantiation.
6485 ///
6486 /// Given
6487 /// \code
6488 ///   int j;
6489 ///   template<typename T> void A(T t) { T i; j += 42;}
6490 ///   A(0);
6491 ///   A(0U);
6492 /// \endcode
6493 /// declStmt(isInTemplateInstantiation())
6494 ///   matches 'int i;' and 'unsigned i'.
6495 /// unless(stmt(isInTemplateInstantiation()))
6496 ///   will NOT match j += 42; as it's shared between the template definition and
6497 ///   instantiation.
AST_MATCHER_FUNCTION(internal::Matcher<Stmt>,isInTemplateInstantiation)6498 AST_MATCHER_FUNCTION(internal::Matcher<Stmt>, isInTemplateInstantiation) {
6499   return stmt(
6500       hasAncestor(decl(anyOf(cxxRecordDecl(isTemplateInstantiation()),
6501                              functionDecl(isTemplateInstantiation())))));
6502 }
6503 
6504 /// Matches explicit template specializations of function, class, or
6505 /// static member variable template instantiations.
6506 ///
6507 /// Given
6508 /// \code
6509 ///   template<typename T> void A(T t) { }
6510 ///   template<> void A(int N) { }
6511 /// \endcode
6512 /// functionDecl(isExplicitTemplateSpecialization())
6513 ///   matches the specialization A<int>().
6514 ///
6515 /// Usable as: Matcher<FunctionDecl>, Matcher<VarDecl>, Matcher<CXXRecordDecl>
AST_POLYMORPHIC_MATCHER(isExplicitTemplateSpecialization,AST_POLYMORPHIC_SUPPORTED_TYPES (FunctionDecl,VarDecl,CXXRecordDecl))6516 AST_POLYMORPHIC_MATCHER(isExplicitTemplateSpecialization,
6517                         AST_POLYMORPHIC_SUPPORTED_TYPES(FunctionDecl, VarDecl,
6518                                                         CXXRecordDecl)) {
6519   return (Node.getTemplateSpecializationKind() == TSK_ExplicitSpecialization);
6520 }
6521 
6522 /// Matches \c TypeLocs for which the given inner
6523 /// QualType-matcher matches.
6524 AST_MATCHER_FUNCTION_P_OVERLOAD(internal::BindableMatcher<TypeLoc>, loc,
6525                                 internal::Matcher<QualType>, InnerMatcher, 0) {
6526   return internal::BindableMatcher<TypeLoc>(
6527       new internal::TypeLocTypeMatcher(InnerMatcher));
6528 }
6529 
6530 /// Matches `QualifiedTypeLoc`s in the clang AST.
6531 ///
6532 /// Given
6533 /// \code
6534 ///   const int x = 0;
6535 /// \endcode
6536 /// qualifiedTypeLoc()
6537 ///   matches `const int`.
6538 extern const internal::VariadicDynCastAllOfMatcher<TypeLoc, QualifiedTypeLoc>
6539     qualifiedTypeLoc;
6540 
6541 /// Matches `QualifiedTypeLoc`s that have an unqualified `TypeLoc` matching
6542 /// `InnerMatcher`.
6543 ///
6544 /// Given
6545 /// \code
6546 ///   int* const x;
6547 ///   const int y;
6548 /// \endcode
6549 /// qualifiedTypeLoc(hasUnqualifiedLoc(pointerTypeLoc()))
6550 ///   matches the `TypeLoc` of the variable declaration of `x`, but not `y`.
AST_MATCHER_P(QualifiedTypeLoc,hasUnqualifiedLoc,internal::Matcher<TypeLoc>,InnerMatcher)6551 AST_MATCHER_P(QualifiedTypeLoc, hasUnqualifiedLoc, internal::Matcher<TypeLoc>,
6552               InnerMatcher) {
6553   return InnerMatcher.matches(Node.getUnqualifiedLoc(), Finder, Builder);
6554 }
6555 
6556 /// Matches a function declared with the specified return `TypeLoc`.
6557 ///
6558 /// Given
6559 /// \code
6560 ///   int f() { return 5; }
6561 ///   void g() {}
6562 /// \endcode
6563 /// functionDecl(hasReturnTypeLoc(loc(asString("int"))))
6564 ///   matches the declaration of `f`, but not `g`.
AST_MATCHER_P(FunctionDecl,hasReturnTypeLoc,internal::Matcher<TypeLoc>,ReturnMatcher)6565 AST_MATCHER_P(FunctionDecl, hasReturnTypeLoc, internal::Matcher<TypeLoc>,
6566               ReturnMatcher) {
6567   auto Loc = Node.getFunctionTypeLoc();
6568   return Loc && ReturnMatcher.matches(Loc.getReturnLoc(), Finder, Builder);
6569 }
6570 
6571 /// Matches pointer `TypeLoc`s.
6572 ///
6573 /// Given
6574 /// \code
6575 ///   int* x;
6576 /// \endcode
6577 /// pointerTypeLoc()
6578 ///   matches `int*`.
6579 extern const internal::VariadicDynCastAllOfMatcher<TypeLoc, PointerTypeLoc>
6580     pointerTypeLoc;
6581 
6582 /// Matches pointer `TypeLoc`s that have a pointee `TypeLoc` matching
6583 /// `PointeeMatcher`.
6584 ///
6585 /// Given
6586 /// \code
6587 ///   int* x;
6588 /// \endcode
6589 /// pointerTypeLoc(hasPointeeLoc(loc(asString("int"))))
6590 ///   matches `int*`.
AST_MATCHER_P(PointerTypeLoc,hasPointeeLoc,internal::Matcher<TypeLoc>,PointeeMatcher)6591 AST_MATCHER_P(PointerTypeLoc, hasPointeeLoc, internal::Matcher<TypeLoc>,
6592               PointeeMatcher) {
6593   return PointeeMatcher.matches(Node.getPointeeLoc(), Finder, Builder);
6594 }
6595 
6596 /// Matches reference `TypeLoc`s.
6597 ///
6598 /// Given
6599 /// \code
6600 ///   int x = 3;
6601 ///   int& l = x;
6602 ///   int&& r = 3;
6603 /// \endcode
6604 /// referenceTypeLoc()
6605 ///   matches `int&` and `int&&`.
6606 extern const internal::VariadicDynCastAllOfMatcher<TypeLoc, ReferenceTypeLoc>
6607     referenceTypeLoc;
6608 
6609 /// Matches reference `TypeLoc`s that have a referent `TypeLoc` matching
6610 /// `ReferentMatcher`.
6611 ///
6612 /// Given
6613 /// \code
6614 ///   int x = 3;
6615 ///   int& xx = x;
6616 /// \endcode
6617 /// referenceTypeLoc(hasReferentLoc(loc(asString("int"))))
6618 ///   matches `int&`.
AST_MATCHER_P(ReferenceTypeLoc,hasReferentLoc,internal::Matcher<TypeLoc>,ReferentMatcher)6619 AST_MATCHER_P(ReferenceTypeLoc, hasReferentLoc, internal::Matcher<TypeLoc>,
6620               ReferentMatcher) {
6621   return ReferentMatcher.matches(Node.getPointeeLoc(), Finder, Builder);
6622 }
6623 
6624 /// Matches template specialization `TypeLoc`s.
6625 ///
6626 /// Given
6627 /// \code
6628 ///   template <typename T> class C {};
6629 ///   C<char> var;
6630 /// \endcode
6631 /// varDecl(hasTypeLoc(templateSpecializationTypeLoc(typeLoc())))
6632 ///   matches `C<char> var`.
6633 extern const internal::VariadicDynCastAllOfMatcher<
6634     TypeLoc, TemplateSpecializationTypeLoc>
6635     templateSpecializationTypeLoc;
6636 
6637 /// Matches template specialization `TypeLoc`s that have at least one
6638 /// `TemplateArgumentLoc` matching the given `InnerMatcher`.
6639 ///
6640 /// Given
6641 /// \code
6642 ///   template<typename T> class A {};
6643 ///   A<int> a;
6644 /// \endcode
6645 /// varDecl(hasTypeLoc(templateSpecializationTypeLoc(hasAnyTemplateArgumentLoc(
6646 ///   hasTypeLoc(loc(asString("int")))))))
6647 ///   matches `A<int> a`.
AST_MATCHER_P(TemplateSpecializationTypeLoc,hasAnyTemplateArgumentLoc,internal::Matcher<TemplateArgumentLoc>,InnerMatcher)6648 AST_MATCHER_P(TemplateSpecializationTypeLoc, hasAnyTemplateArgumentLoc,
6649               internal::Matcher<TemplateArgumentLoc>, InnerMatcher) {
6650   for (unsigned Index = 0, N = Node.getNumArgs(); Index < N; ++Index) {
6651     clang::ast_matchers::internal::BoundNodesTreeBuilder Result(*Builder);
6652     if (InnerMatcher.matches(Node.getArgLoc(Index), Finder, &Result)) {
6653       *Builder = std::move(Result);
6654       return true;
6655     }
6656   }
6657   return false;
6658 }
6659 
6660 /// Matches template specialization `TypeLoc`s where the n'th
6661 /// `TemplateArgumentLoc` matches the given `InnerMatcher`.
6662 ///
6663 /// Given
6664 /// \code
6665 ///   template<typename T, typename U> class A {};
6666 ///   A<double, int> b;
6667 ///   A<int, double> c;
6668 /// \endcode
6669 /// varDecl(hasTypeLoc(templateSpecializationTypeLoc(hasTemplateArgumentLoc(0,
6670 ///   hasTypeLoc(loc(asString("double")))))))
6671 ///   matches `A<double, int> b`, but not `A<int, double> c`.
AST_POLYMORPHIC_MATCHER_P2(hasTemplateArgumentLoc,AST_POLYMORPHIC_SUPPORTED_TYPES (DeclRefExpr,TemplateSpecializationTypeLoc),unsigned,Index,internal::Matcher<TemplateArgumentLoc>,InnerMatcher)6672 AST_POLYMORPHIC_MATCHER_P2(
6673     hasTemplateArgumentLoc,
6674     AST_POLYMORPHIC_SUPPORTED_TYPES(DeclRefExpr, TemplateSpecializationTypeLoc),
6675     unsigned, Index, internal::Matcher<TemplateArgumentLoc>, InnerMatcher) {
6676   return internal::MatchTemplateArgLocAt(Node, Index, InnerMatcher, Finder,
6677                                          Builder);
6678 }
6679 
6680 /// Matches C or C++ elaborated `TypeLoc`s.
6681 ///
6682 /// Given
6683 /// \code
6684 ///   struct s {};
6685 ///   struct s ss;
6686 /// \endcode
6687 /// elaboratedTypeLoc()
6688 ///   matches the `TypeLoc` of the variable declaration of `ss`.
6689 extern const internal::VariadicDynCastAllOfMatcher<TypeLoc, ElaboratedTypeLoc>
6690     elaboratedTypeLoc;
6691 
6692 /// Matches elaborated `TypeLoc`s that have a named `TypeLoc` matching
6693 /// `InnerMatcher`.
6694 ///
6695 /// Given
6696 /// \code
6697 ///   template <typename T>
6698 ///   class C {};
6699 ///   class C<int> c;
6700 ///
6701 ///   class D {};
6702 ///   class D d;
6703 /// \endcode
6704 /// elaboratedTypeLoc(hasNamedTypeLoc(templateSpecializationTypeLoc()));
6705 ///   matches the `TypeLoc` of the variable declaration of `c`, but not `d`.
AST_MATCHER_P(ElaboratedTypeLoc,hasNamedTypeLoc,internal::Matcher<TypeLoc>,InnerMatcher)6706 AST_MATCHER_P(ElaboratedTypeLoc, hasNamedTypeLoc, internal::Matcher<TypeLoc>,
6707               InnerMatcher) {
6708   return InnerMatcher.matches(Node.getNamedTypeLoc(), Finder, Builder);
6709 }
6710 
6711 /// Matches type \c bool.
6712 ///
6713 /// Given
6714 /// \code
6715 ///  struct S { bool func(); };
6716 /// \endcode
6717 /// functionDecl(returns(booleanType()))
6718 ///   matches "bool func();"
AST_MATCHER(Type,booleanType)6719 AST_MATCHER(Type, booleanType) {
6720   return Node.isBooleanType();
6721 }
6722 
6723 /// Matches type \c void.
6724 ///
6725 /// Given
6726 /// \code
6727 ///  struct S { void func(); };
6728 /// \endcode
6729 /// functionDecl(returns(voidType()))
6730 ///   matches "void func();"
AST_MATCHER(Type,voidType)6731 AST_MATCHER(Type, voidType) {
6732   return Node.isVoidType();
6733 }
6734 
6735 template <typename NodeType>
6736 using AstTypeMatcher = internal::VariadicDynCastAllOfMatcher<Type, NodeType>;
6737 
6738 /// Matches builtin Types.
6739 ///
6740 /// Given
6741 /// \code
6742 ///   struct A {};
6743 ///   A a;
6744 ///   int b;
6745 ///   float c;
6746 ///   bool d;
6747 /// \endcode
6748 /// builtinType()
6749 ///   matches "int b", "float c" and "bool d"
6750 extern const AstTypeMatcher<BuiltinType> builtinType;
6751 
6752 /// Matches all kinds of arrays.
6753 ///
6754 /// Given
6755 /// \code
6756 ///   int a[] = { 2, 3 };
6757 ///   int b[4];
6758 ///   void f() { int c[a[0]]; }
6759 /// \endcode
6760 /// arrayType()
6761 ///   matches "int a[]", "int b[4]" and "int c[a[0]]";
6762 extern const AstTypeMatcher<ArrayType> arrayType;
6763 
6764 /// Matches C99 complex types.
6765 ///
6766 /// Given
6767 /// \code
6768 ///   _Complex float f;
6769 /// \endcode
6770 /// complexType()
6771 ///   matches "_Complex float f"
6772 extern const AstTypeMatcher<ComplexType> complexType;
6773 
6774 /// Matches any real floating-point type (float, double, long double).
6775 ///
6776 /// Given
6777 /// \code
6778 ///   int i;
6779 ///   float f;
6780 /// \endcode
6781 /// realFloatingPointType()
6782 ///   matches "float f" but not "int i"
AST_MATCHER(Type,realFloatingPointType)6783 AST_MATCHER(Type, realFloatingPointType) {
6784   return Node.isRealFloatingType();
6785 }
6786 
6787 /// Matches arrays and C99 complex types that have a specific element
6788 /// type.
6789 ///
6790 /// Given
6791 /// \code
6792 ///   struct A {};
6793 ///   A a[7];
6794 ///   int b[7];
6795 /// \endcode
6796 /// arrayType(hasElementType(builtinType()))
6797 ///   matches "int b[7]"
6798 ///
6799 /// Usable as: Matcher<ArrayType>, Matcher<ComplexType>
6800 AST_TYPELOC_TRAVERSE_MATCHER_DECL(hasElementType, getElement,
6801                                   AST_POLYMORPHIC_SUPPORTED_TYPES(ArrayType,
6802                                                                   ComplexType));
6803 
6804 /// Matches C arrays with a specified constant size.
6805 ///
6806 /// Given
6807 /// \code
6808 ///   void() {
6809 ///     int a[2];
6810 ///     int b[] = { 2, 3 };
6811 ///     int c[b[0]];
6812 ///   }
6813 /// \endcode
6814 /// constantArrayType()
6815 ///   matches "int a[2]"
6816 extern const AstTypeMatcher<ConstantArrayType> constantArrayType;
6817 
6818 /// Matches nodes that have the specified size.
6819 ///
6820 /// Given
6821 /// \code
6822 ///   int a[42];
6823 ///   int b[2 * 21];
6824 ///   int c[41], d[43];
6825 ///   char *s = "abcd";
6826 ///   wchar_t *ws = L"abcd";
6827 ///   char *w = "a";
6828 /// \endcode
6829 /// constantArrayType(hasSize(42))
6830 ///   matches "int a[42]" and "int b[2 * 21]"
6831 /// stringLiteral(hasSize(4))
6832 ///   matches "abcd", L"abcd"
AST_POLYMORPHIC_MATCHER_P(hasSize,AST_POLYMORPHIC_SUPPORTED_TYPES (ConstantArrayType,StringLiteral),unsigned,N)6833 AST_POLYMORPHIC_MATCHER_P(hasSize,
6834                           AST_POLYMORPHIC_SUPPORTED_TYPES(ConstantArrayType,
6835                                                           StringLiteral),
6836                           unsigned, N) {
6837   return internal::HasSizeMatcher<NodeType>::hasSize(Node, N);
6838 }
6839 
6840 /// Matches C++ arrays whose size is a value-dependent expression.
6841 ///
6842 /// Given
6843 /// \code
6844 ///   template<typename T, int Size>
6845 ///   class array {
6846 ///     T data[Size];
6847 ///   };
6848 /// \endcode
6849 /// dependentSizedArrayType
6850 ///   matches "T data[Size]"
6851 extern const AstTypeMatcher<DependentSizedArrayType> dependentSizedArrayType;
6852 
6853 /// Matches C arrays with unspecified size.
6854 ///
6855 /// Given
6856 /// \code
6857 ///   int a[] = { 2, 3 };
6858 ///   int b[42];
6859 ///   void f(int c[]) { int d[a[0]]; };
6860 /// \endcode
6861 /// incompleteArrayType()
6862 ///   matches "int a[]" and "int c[]"
6863 extern const AstTypeMatcher<IncompleteArrayType> incompleteArrayType;
6864 
6865 /// Matches C arrays with a specified size that is not an
6866 /// integer-constant-expression.
6867 ///
6868 /// Given
6869 /// \code
6870 ///   void f() {
6871 ///     int a[] = { 2, 3 }
6872 ///     int b[42];
6873 ///     int c[a[0]];
6874 ///   }
6875 /// \endcode
6876 /// variableArrayType()
6877 ///   matches "int c[a[0]]"
6878 extern const AstTypeMatcher<VariableArrayType> variableArrayType;
6879 
6880 /// Matches \c VariableArrayType nodes that have a specific size
6881 /// expression.
6882 ///
6883 /// Given
6884 /// \code
6885 ///   void f(int b) {
6886 ///     int a[b];
6887 ///   }
6888 /// \endcode
6889 /// variableArrayType(hasSizeExpr(ignoringImpCasts(declRefExpr(to(
6890 ///   varDecl(hasName("b")))))))
6891 ///   matches "int a[b]"
AST_MATCHER_P(VariableArrayType,hasSizeExpr,internal::Matcher<Expr>,InnerMatcher)6892 AST_MATCHER_P(VariableArrayType, hasSizeExpr,
6893               internal::Matcher<Expr>, InnerMatcher) {
6894   return InnerMatcher.matches(*Node.getSizeExpr(), Finder, Builder);
6895 }
6896 
6897 /// Matches atomic types.
6898 ///
6899 /// Given
6900 /// \code
6901 ///   _Atomic(int) i;
6902 /// \endcode
6903 /// atomicType()
6904 ///   matches "_Atomic(int) i"
6905 extern const AstTypeMatcher<AtomicType> atomicType;
6906 
6907 /// Matches atomic types with a specific value type.
6908 ///
6909 /// Given
6910 /// \code
6911 ///   _Atomic(int) i;
6912 ///   _Atomic(float) f;
6913 /// \endcode
6914 /// atomicType(hasValueType(isInteger()))
6915 ///  matches "_Atomic(int) i"
6916 ///
6917 /// Usable as: Matcher<AtomicType>
6918 AST_TYPELOC_TRAVERSE_MATCHER_DECL(hasValueType, getValue,
6919                                   AST_POLYMORPHIC_SUPPORTED_TYPES(AtomicType));
6920 
6921 /// Matches types nodes representing C++11 auto types.
6922 ///
6923 /// Given:
6924 /// \code
6925 ///   auto n = 4;
6926 ///   int v[] = { 2, 3 }
6927 ///   for (auto i : v) { }
6928 /// \endcode
6929 /// autoType()
6930 ///   matches "auto n" and "auto i"
6931 extern const AstTypeMatcher<AutoType> autoType;
6932 
6933 /// Matches types nodes representing C++11 decltype(<expr>) types.
6934 ///
6935 /// Given:
6936 /// \code
6937 ///   short i = 1;
6938 ///   int j = 42;
6939 ///   decltype(i + j) result = i + j;
6940 /// \endcode
6941 /// decltypeType()
6942 ///   matches "decltype(i + j)"
6943 extern const AstTypeMatcher<DecltypeType> decltypeType;
6944 
6945 /// Matches \c AutoType nodes where the deduced type is a specific type.
6946 ///
6947 /// Note: There is no \c TypeLoc for the deduced type and thus no
6948 /// \c getDeducedLoc() matcher.
6949 ///
6950 /// Given
6951 /// \code
6952 ///   auto a = 1;
6953 ///   auto b = 2.0;
6954 /// \endcode
6955 /// autoType(hasDeducedType(isInteger()))
6956 ///   matches "auto a"
6957 ///
6958 /// Usable as: Matcher<AutoType>
6959 AST_TYPE_TRAVERSE_MATCHER(hasDeducedType, getDeducedType,
6960                           AST_POLYMORPHIC_SUPPORTED_TYPES(AutoType));
6961 
6962 /// Matches \c DecltypeType or \c UsingType nodes to find the underlying type.
6963 ///
6964 /// Given
6965 /// \code
6966 ///   decltype(1) a = 1;
6967 ///   decltype(2.0) b = 2.0;
6968 /// \endcode
6969 /// decltypeType(hasUnderlyingType(isInteger()))
6970 ///   matches the type of "a"
6971 ///
6972 /// Usable as: Matcher<DecltypeType>, Matcher<UsingType>
6973 AST_TYPE_TRAVERSE_MATCHER(hasUnderlyingType, getUnderlyingType,
6974                           AST_POLYMORPHIC_SUPPORTED_TYPES(DecltypeType,
6975                                                           UsingType));
6976 
6977 /// Matches \c FunctionType nodes.
6978 ///
6979 /// Given
6980 /// \code
6981 ///   int (*f)(int);
6982 ///   void g();
6983 /// \endcode
6984 /// functionType()
6985 ///   matches "int (*f)(int)" and the type of "g".
6986 extern const AstTypeMatcher<FunctionType> functionType;
6987 
6988 /// Matches \c FunctionProtoType nodes.
6989 ///
6990 /// Given
6991 /// \code
6992 ///   int (*f)(int);
6993 ///   void g();
6994 /// \endcode
6995 /// functionProtoType()
6996 ///   matches "int (*f)(int)" and the type of "g" in C++ mode.
6997 ///   In C mode, "g" is not matched because it does not contain a prototype.
6998 extern const AstTypeMatcher<FunctionProtoType> functionProtoType;
6999 
7000 /// Matches \c ParenType nodes.
7001 ///
7002 /// Given
7003 /// \code
7004 ///   int (*ptr_to_array)[4];
7005 ///   int *array_of_ptrs[4];
7006 /// \endcode
7007 ///
7008 /// \c varDecl(hasType(pointsTo(parenType()))) matches \c ptr_to_array but not
7009 /// \c array_of_ptrs.
7010 extern const AstTypeMatcher<ParenType> parenType;
7011 
7012 /// Matches \c ParenType nodes where the inner type is a specific type.
7013 ///
7014 /// Given
7015 /// \code
7016 ///   int (*ptr_to_array)[4];
7017 ///   int (*ptr_to_func)(int);
7018 /// \endcode
7019 ///
7020 /// \c varDecl(hasType(pointsTo(parenType(innerType(functionType()))))) matches
7021 /// \c ptr_to_func but not \c ptr_to_array.
7022 ///
7023 /// Usable as: Matcher<ParenType>
7024 AST_TYPE_TRAVERSE_MATCHER(innerType, getInnerType,
7025                           AST_POLYMORPHIC_SUPPORTED_TYPES(ParenType));
7026 
7027 /// Matches block pointer types, i.e. types syntactically represented as
7028 /// "void (^)(int)".
7029 ///
7030 /// The \c pointee is always required to be a \c FunctionType.
7031 extern const AstTypeMatcher<BlockPointerType> blockPointerType;
7032 
7033 /// Matches member pointer types.
7034 /// Given
7035 /// \code
7036 ///   struct A { int i; }
7037 ///   A::* ptr = A::i;
7038 /// \endcode
7039 /// memberPointerType()
7040 ///   matches "A::* ptr"
7041 extern const AstTypeMatcher<MemberPointerType> memberPointerType;
7042 
7043 /// Matches pointer types, but does not match Objective-C object pointer
7044 /// types.
7045 ///
7046 /// Given
7047 /// \code
7048 ///   int *a;
7049 ///   int &b = *a;
7050 ///   int c = 5;
7051 ///
7052 ///   @interface Foo
7053 ///   @end
7054 ///   Foo *f;
7055 /// \endcode
7056 /// pointerType()
7057 ///   matches "int *a", but does not match "Foo *f".
7058 extern const AstTypeMatcher<PointerType> pointerType;
7059 
7060 /// Matches an Objective-C object pointer type, which is different from
7061 /// a pointer type, despite being syntactically similar.
7062 ///
7063 /// Given
7064 /// \code
7065 ///   int *a;
7066 ///
7067 ///   @interface Foo
7068 ///   @end
7069 ///   Foo *f;
7070 /// \endcode
7071 /// pointerType()
7072 ///   matches "Foo *f", but does not match "int *a".
7073 extern const AstTypeMatcher<ObjCObjectPointerType> objcObjectPointerType;
7074 
7075 /// Matches both lvalue and rvalue reference types.
7076 ///
7077 /// Given
7078 /// \code
7079 ///   int *a;
7080 ///   int &b = *a;
7081 ///   int &&c = 1;
7082 ///   auto &d = b;
7083 ///   auto &&e = c;
7084 ///   auto &&f = 2;
7085 ///   int g = 5;
7086 /// \endcode
7087 ///
7088 /// \c referenceType() matches the types of \c b, \c c, \c d, \c e, and \c f.
7089 extern const AstTypeMatcher<ReferenceType> referenceType;
7090 
7091 /// Matches lvalue reference types.
7092 ///
7093 /// Given:
7094 /// \code
7095 ///   int *a;
7096 ///   int &b = *a;
7097 ///   int &&c = 1;
7098 ///   auto &d = b;
7099 ///   auto &&e = c;
7100 ///   auto &&f = 2;
7101 ///   int g = 5;
7102 /// \endcode
7103 ///
7104 /// \c lValueReferenceType() matches the types of \c b, \c d, and \c e. \c e is
7105 /// matched since the type is deduced as int& by reference collapsing rules.
7106 extern const AstTypeMatcher<LValueReferenceType> lValueReferenceType;
7107 
7108 /// Matches rvalue reference types.
7109 ///
7110 /// Given:
7111 /// \code
7112 ///   int *a;
7113 ///   int &b = *a;
7114 ///   int &&c = 1;
7115 ///   auto &d = b;
7116 ///   auto &&e = c;
7117 ///   auto &&f = 2;
7118 ///   int g = 5;
7119 /// \endcode
7120 ///
7121 /// \c rValueReferenceType() matches the types of \c c and \c f. \c e is not
7122 /// matched as it is deduced to int& by reference collapsing rules.
7123 extern const AstTypeMatcher<RValueReferenceType> rValueReferenceType;
7124 
7125 /// Narrows PointerType (and similar) matchers to those where the
7126 /// \c pointee matches a given matcher.
7127 ///
7128 /// Given
7129 /// \code
7130 ///   int *a;
7131 ///   int const *b;
7132 ///   float const *f;
7133 /// \endcode
7134 /// pointerType(pointee(isConstQualified(), isInteger()))
7135 ///   matches "int const *b"
7136 ///
7137 /// Usable as: Matcher<BlockPointerType>, Matcher<MemberPointerType>,
7138 ///   Matcher<PointerType>, Matcher<ReferenceType>
7139 AST_TYPELOC_TRAVERSE_MATCHER_DECL(
7140     pointee, getPointee,
7141     AST_POLYMORPHIC_SUPPORTED_TYPES(BlockPointerType, MemberPointerType,
7142                                     PointerType, ReferenceType));
7143 
7144 /// Matches typedef types.
7145 ///
7146 /// Given
7147 /// \code
7148 ///   typedef int X;
7149 /// \endcode
7150 /// typedefType()
7151 ///   matches "typedef int X"
7152 extern const AstTypeMatcher<TypedefType> typedefType;
7153 
7154 /// Matches enum types.
7155 ///
7156 /// Given
7157 /// \code
7158 ///   enum C { Green };
7159 ///   enum class S { Red };
7160 ///
7161 ///   C c;
7162 ///   S s;
7163 /// \endcode
7164 //
7165 /// \c enumType() matches the type of the variable declarations of both \c c and
7166 /// \c s.
7167 extern const AstTypeMatcher<EnumType> enumType;
7168 
7169 /// Matches template specialization types.
7170 ///
7171 /// Given
7172 /// \code
7173 ///   template <typename T>
7174 ///   class C { };
7175 ///
7176 ///   template class C<int>;  // A
7177 ///   C<char> var;            // B
7178 /// \endcode
7179 ///
7180 /// \c templateSpecializationType() matches the type of the explicit
7181 /// instantiation in \c A and the type of the variable declaration in \c B.
7182 extern const AstTypeMatcher<TemplateSpecializationType>
7183     templateSpecializationType;
7184 
7185 /// Matches C++17 deduced template specialization types, e.g. deduced class
7186 /// template types.
7187 ///
7188 /// Given
7189 /// \code
7190 ///   template <typename T>
7191 ///   class C { public: C(T); };
7192 ///
7193 ///   C c(123);
7194 /// \endcode
7195 /// \c deducedTemplateSpecializationType() matches the type in the declaration
7196 /// of the variable \c c.
7197 extern const AstTypeMatcher<DeducedTemplateSpecializationType>
7198     deducedTemplateSpecializationType;
7199 
7200 /// Matches types nodes representing unary type transformations.
7201 ///
7202 /// Given:
7203 /// \code
7204 ///   typedef __underlying_type(T) type;
7205 /// \endcode
7206 /// unaryTransformType()
7207 ///   matches "__underlying_type(T)"
7208 extern const AstTypeMatcher<UnaryTransformType> unaryTransformType;
7209 
7210 /// Matches record types (e.g. structs, classes).
7211 ///
7212 /// Given
7213 /// \code
7214 ///   class C {};
7215 ///   struct S {};
7216 ///
7217 ///   C c;
7218 ///   S s;
7219 /// \endcode
7220 ///
7221 /// \c recordType() matches the type of the variable declarations of both \c c
7222 /// and \c s.
7223 extern const AstTypeMatcher<RecordType> recordType;
7224 
7225 /// Matches tag types (record and enum types).
7226 ///
7227 /// Given
7228 /// \code
7229 ///   enum E {};
7230 ///   class C {};
7231 ///
7232 ///   E e;
7233 ///   C c;
7234 /// \endcode
7235 ///
7236 /// \c tagType() matches the type of the variable declarations of both \c e
7237 /// and \c c.
7238 extern const AstTypeMatcher<TagType> tagType;
7239 
7240 /// Matches types specified with an elaborated type keyword or with a
7241 /// qualified name.
7242 ///
7243 /// Given
7244 /// \code
7245 ///   namespace N {
7246 ///     namespace M {
7247 ///       class D {};
7248 ///     }
7249 ///   }
7250 ///   class C {};
7251 ///
7252 ///   class C c;
7253 ///   N::M::D d;
7254 /// \endcode
7255 ///
7256 /// \c elaboratedType() matches the type of the variable declarations of both
7257 /// \c c and \c d.
7258 extern const AstTypeMatcher<ElaboratedType> elaboratedType;
7259 
7260 /// Matches ElaboratedTypes whose qualifier, a NestedNameSpecifier,
7261 /// matches \c InnerMatcher if the qualifier exists.
7262 ///
7263 /// Given
7264 /// \code
7265 ///   namespace N {
7266 ///     namespace M {
7267 ///       class D {};
7268 ///     }
7269 ///   }
7270 ///   N::M::D d;
7271 /// \endcode
7272 ///
7273 /// \c elaboratedType(hasQualifier(hasPrefix(specifiesNamespace(hasName("N"))))
7274 /// matches the type of the variable declaration of \c d.
AST_MATCHER_P(ElaboratedType,hasQualifier,internal::Matcher<NestedNameSpecifier>,InnerMatcher)7275 AST_MATCHER_P(ElaboratedType, hasQualifier,
7276               internal::Matcher<NestedNameSpecifier>, InnerMatcher) {
7277   if (const NestedNameSpecifier *Qualifier = Node.getQualifier())
7278     return InnerMatcher.matches(*Qualifier, Finder, Builder);
7279 
7280   return false;
7281 }
7282 
7283 /// Matches ElaboratedTypes whose named type matches \c InnerMatcher.
7284 ///
7285 /// Given
7286 /// \code
7287 ///   namespace N {
7288 ///     namespace M {
7289 ///       class D {};
7290 ///     }
7291 ///   }
7292 ///   N::M::D d;
7293 /// \endcode
7294 ///
7295 /// \c elaboratedType(namesType(recordType(
7296 /// hasDeclaration(namedDecl(hasName("D")))))) matches the type of the variable
7297 /// declaration of \c d.
AST_MATCHER_P(ElaboratedType,namesType,internal::Matcher<QualType>,InnerMatcher)7298 AST_MATCHER_P(ElaboratedType, namesType, internal::Matcher<QualType>,
7299               InnerMatcher) {
7300   return InnerMatcher.matches(Node.getNamedType(), Finder, Builder);
7301 }
7302 
7303 /// Matches types specified through a using declaration.
7304 ///
7305 /// Given
7306 /// \code
7307 ///   namespace a { struct S {}; }
7308 ///   using a::S;
7309 ///   S s;
7310 /// \endcode
7311 ///
7312 /// \c usingType() matches the type of the variable declaration of \c s.
7313 extern const AstTypeMatcher<UsingType> usingType;
7314 
7315 /// Matches types that represent the result of substituting a type for a
7316 /// template type parameter.
7317 ///
7318 /// Given
7319 /// \code
7320 ///   template <typename T>
7321 ///   void F(T t) {
7322 ///     int i = 1 + t;
7323 ///   }
7324 /// \endcode
7325 ///
7326 /// \c substTemplateTypeParmType() matches the type of 't' but not '1'
7327 extern const AstTypeMatcher<SubstTemplateTypeParmType>
7328     substTemplateTypeParmType;
7329 
7330 /// Matches template type parameter substitutions that have a replacement
7331 /// type that matches the provided matcher.
7332 ///
7333 /// Given
7334 /// \code
7335 ///   template <typename T>
7336 ///   double F(T t);
7337 ///   int i;
7338 ///   double j = F(i);
7339 /// \endcode
7340 ///
7341 /// \c substTemplateTypeParmType(hasReplacementType(type())) matches int
7342 AST_TYPE_TRAVERSE_MATCHER(
7343     hasReplacementType, getReplacementType,
7344     AST_POLYMORPHIC_SUPPORTED_TYPES(SubstTemplateTypeParmType));
7345 
7346 /// Matches template type parameter types.
7347 ///
7348 /// Example matches T, but not int.
7349 ///     (matcher = templateTypeParmType())
7350 /// \code
7351 ///   template <typename T> void f(int i);
7352 /// \endcode
7353 extern const AstTypeMatcher<TemplateTypeParmType> templateTypeParmType;
7354 
7355 /// Matches injected class name types.
7356 ///
7357 /// Example matches S s, but not S<T> s.
7358 ///     (matcher = parmVarDecl(hasType(injectedClassNameType())))
7359 /// \code
7360 ///   template <typename T> struct S {
7361 ///     void f(S s);
7362 ///     void g(S<T> s);
7363 ///   };
7364 /// \endcode
7365 extern const AstTypeMatcher<InjectedClassNameType> injectedClassNameType;
7366 
7367 /// Matches decayed type
7368 /// Example matches i[] in declaration of f.
7369 ///     (matcher = valueDecl(hasType(decayedType(hasDecayedType(pointerType())))))
7370 /// Example matches i[1].
7371 ///     (matcher = expr(hasType(decayedType(hasDecayedType(pointerType())))))
7372 /// \code
7373 ///   void f(int i[]) {
7374 ///     i[1] = 0;
7375 ///   }
7376 /// \endcode
7377 extern const AstTypeMatcher<DecayedType> decayedType;
7378 
7379 /// Matches the decayed type, whoes decayed type matches \c InnerMatcher
AST_MATCHER_P(DecayedType,hasDecayedType,internal::Matcher<QualType>,InnerType)7380 AST_MATCHER_P(DecayedType, hasDecayedType, internal::Matcher<QualType>,
7381               InnerType) {
7382   return InnerType.matches(Node.getDecayedType(), Finder, Builder);
7383 }
7384 
7385 /// Matches declarations whose declaration context, interpreted as a
7386 /// Decl, matches \c InnerMatcher.
7387 ///
7388 /// Given
7389 /// \code
7390 ///   namespace N {
7391 ///     namespace M {
7392 ///       class D {};
7393 ///     }
7394 ///   }
7395 /// \endcode
7396 ///
7397 /// \c cxxRcordDecl(hasDeclContext(namedDecl(hasName("M")))) matches the
7398 /// declaration of \c class \c D.
AST_MATCHER_P(Decl,hasDeclContext,internal::Matcher<Decl>,InnerMatcher)7399 AST_MATCHER_P(Decl, hasDeclContext, internal::Matcher<Decl>, InnerMatcher) {
7400   const DeclContext *DC = Node.getDeclContext();
7401   if (!DC) return false;
7402   return InnerMatcher.matches(*Decl::castFromDeclContext(DC), Finder, Builder);
7403 }
7404 
7405 /// Matches nested name specifiers.
7406 ///
7407 /// Given
7408 /// \code
7409 ///   namespace ns {
7410 ///     struct A { static void f(); };
7411 ///     void A::f() {}
7412 ///     void g() { A::f(); }
7413 ///   }
7414 ///   ns::A a;
7415 /// \endcode
7416 /// nestedNameSpecifier()
7417 ///   matches "ns::" and both "A::"
7418 extern const internal::VariadicAllOfMatcher<NestedNameSpecifier>
7419     nestedNameSpecifier;
7420 
7421 /// Same as \c nestedNameSpecifier but matches \c NestedNameSpecifierLoc.
7422 extern const internal::VariadicAllOfMatcher<NestedNameSpecifierLoc>
7423     nestedNameSpecifierLoc;
7424 
7425 /// Matches \c NestedNameSpecifierLocs for which the given inner
7426 /// NestedNameSpecifier-matcher matches.
7427 AST_MATCHER_FUNCTION_P_OVERLOAD(
7428     internal::BindableMatcher<NestedNameSpecifierLoc>, loc,
7429     internal::Matcher<NestedNameSpecifier>, InnerMatcher, 1) {
7430   return internal::BindableMatcher<NestedNameSpecifierLoc>(
7431       new internal::LocMatcher<NestedNameSpecifierLoc, NestedNameSpecifier>(
7432           InnerMatcher));
7433 }
7434 
7435 /// Matches nested name specifiers that specify a type matching the
7436 /// given \c QualType matcher without qualifiers.
7437 ///
7438 /// Given
7439 /// \code
7440 ///   struct A { struct B { struct C {}; }; };
7441 ///   A::B::C c;
7442 /// \endcode
7443 /// nestedNameSpecifier(specifiesType(
7444 ///   hasDeclaration(cxxRecordDecl(hasName("A")))
7445 /// ))
7446 ///   matches "A::"
AST_MATCHER_P(NestedNameSpecifier,specifiesType,internal::Matcher<QualType>,InnerMatcher)7447 AST_MATCHER_P(NestedNameSpecifier, specifiesType,
7448               internal::Matcher<QualType>, InnerMatcher) {
7449   if (!Node.getAsType())
7450     return false;
7451   return InnerMatcher.matches(QualType(Node.getAsType(), 0), Finder, Builder);
7452 }
7453 
7454 /// Matches nested name specifier locs that specify a type matching the
7455 /// given \c TypeLoc.
7456 ///
7457 /// Given
7458 /// \code
7459 ///   struct A { struct B { struct C {}; }; };
7460 ///   A::B::C c;
7461 /// \endcode
7462 /// nestedNameSpecifierLoc(specifiesTypeLoc(loc(type(
7463 ///   hasDeclaration(cxxRecordDecl(hasName("A")))))))
7464 ///   matches "A::"
AST_MATCHER_P(NestedNameSpecifierLoc,specifiesTypeLoc,internal::Matcher<TypeLoc>,InnerMatcher)7465 AST_MATCHER_P(NestedNameSpecifierLoc, specifiesTypeLoc,
7466               internal::Matcher<TypeLoc>, InnerMatcher) {
7467   return Node && Node.getNestedNameSpecifier()->getAsType() &&
7468          InnerMatcher.matches(Node.getTypeLoc(), Finder, Builder);
7469 }
7470 
7471 /// Matches on the prefix of a \c NestedNameSpecifier.
7472 ///
7473 /// Given
7474 /// \code
7475 ///   struct A { struct B { struct C {}; }; };
7476 ///   A::B::C c;
7477 /// \endcode
7478 /// nestedNameSpecifier(hasPrefix(specifiesType(asString("struct A")))) and
7479 ///   matches "A::"
7480 AST_MATCHER_P_OVERLOAD(NestedNameSpecifier, hasPrefix,
7481                        internal::Matcher<NestedNameSpecifier>, InnerMatcher,
7482                        0) {
7483   const NestedNameSpecifier *NextNode = Node.getPrefix();
7484   if (!NextNode)
7485     return false;
7486   return InnerMatcher.matches(*NextNode, Finder, Builder);
7487 }
7488 
7489 /// Matches on the prefix of a \c NestedNameSpecifierLoc.
7490 ///
7491 /// Given
7492 /// \code
7493 ///   struct A { struct B { struct C {}; }; };
7494 ///   A::B::C c;
7495 /// \endcode
7496 /// nestedNameSpecifierLoc(hasPrefix(loc(specifiesType(asString("struct A")))))
7497 ///   matches "A::"
7498 AST_MATCHER_P_OVERLOAD(NestedNameSpecifierLoc, hasPrefix,
7499                        internal::Matcher<NestedNameSpecifierLoc>, InnerMatcher,
7500                        1) {
7501   NestedNameSpecifierLoc NextNode = Node.getPrefix();
7502   if (!NextNode)
7503     return false;
7504   return InnerMatcher.matches(NextNode, Finder, Builder);
7505 }
7506 
7507 /// Matches nested name specifiers that specify a namespace matching the
7508 /// given namespace matcher.
7509 ///
7510 /// Given
7511 /// \code
7512 ///   namespace ns { struct A {}; }
7513 ///   ns::A a;
7514 /// \endcode
7515 /// nestedNameSpecifier(specifiesNamespace(hasName("ns")))
7516 ///   matches "ns::"
AST_MATCHER_P(NestedNameSpecifier,specifiesNamespace,internal::Matcher<NamespaceDecl>,InnerMatcher)7517 AST_MATCHER_P(NestedNameSpecifier, specifiesNamespace,
7518               internal::Matcher<NamespaceDecl>, InnerMatcher) {
7519   if (!Node.getAsNamespace())
7520     return false;
7521   return InnerMatcher.matches(*Node.getAsNamespace(), Finder, Builder);
7522 }
7523 
7524 /// Matches attributes.
7525 /// Attributes may be attached with a variety of different syntaxes (including
7526 /// keywords, C++11 attributes, GNU ``__attribute``` and MSVC `__declspec``,
7527 /// and ``#pragma``s). They may also be implicit.
7528 ///
7529 /// Given
7530 /// \code
7531 ///   struct [[nodiscard]] Foo{};
7532 ///   void bar(int * __attribute__((nonnull)) );
7533 ///   __declspec(noinline) void baz();
7534 ///
7535 ///   #pragma omp declare simd
7536 ///   int min();
7537 /// \endcode
7538 /// attr()
7539 ///   matches "nodiscard", "nonnull", "noinline", and the whole "#pragma" line.
7540 extern const internal::VariadicAllOfMatcher<Attr> attr;
7541 
7542 /// Overloads for the \c equalsNode matcher.
7543 /// FIXME: Implement for other node types.
7544 /// @{
7545 
7546 /// Matches if a node equals another node.
7547 ///
7548 /// \c Decl has pointer identity in the AST.
7549 AST_MATCHER_P_OVERLOAD(Decl, equalsNode, const Decl*, Other, 0) {
7550   return &Node == Other;
7551 }
7552 /// Matches if a node equals another node.
7553 ///
7554 /// \c Stmt has pointer identity in the AST.
7555 AST_MATCHER_P_OVERLOAD(Stmt, equalsNode, const Stmt*, Other, 1) {
7556   return &Node == Other;
7557 }
7558 /// Matches if a node equals another node.
7559 ///
7560 /// \c Type has pointer identity in the AST.
7561 AST_MATCHER_P_OVERLOAD(Type, equalsNode, const Type*, Other, 2) {
7562     return &Node == Other;
7563 }
7564 
7565 /// @}
7566 
7567 /// Matches each case or default statement belonging to the given switch
7568 /// statement. This matcher may produce multiple matches.
7569 ///
7570 /// Given
7571 /// \code
7572 ///   switch (1) { case 1: case 2: default: switch (2) { case 3: case 4: ; } }
7573 /// \endcode
7574 /// switchStmt(forEachSwitchCase(caseStmt().bind("c"))).bind("s")
7575 ///   matches four times, with "c" binding each of "case 1:", "case 2:",
7576 /// "case 3:" and "case 4:", and "s" respectively binding "switch (1)",
7577 /// "switch (1)", "switch (2)" and "switch (2)".
AST_MATCHER_P(SwitchStmt,forEachSwitchCase,internal::Matcher<SwitchCase>,InnerMatcher)7578 AST_MATCHER_P(SwitchStmt, forEachSwitchCase, internal::Matcher<SwitchCase>,
7579               InnerMatcher) {
7580   BoundNodesTreeBuilder Result;
7581   // FIXME: getSwitchCaseList() does not necessarily guarantee a stable
7582   // iteration order. We should use the more general iterating matchers once
7583   // they are capable of expressing this matcher (for example, it should ignore
7584   // case statements belonging to nested switch statements).
7585   bool Matched = false;
7586   for (const SwitchCase *SC = Node.getSwitchCaseList(); SC;
7587        SC = SC->getNextSwitchCase()) {
7588     BoundNodesTreeBuilder CaseBuilder(*Builder);
7589     bool CaseMatched = InnerMatcher.matches(*SC, Finder, &CaseBuilder);
7590     if (CaseMatched) {
7591       Matched = true;
7592       Result.addMatch(CaseBuilder);
7593     }
7594   }
7595   *Builder = std::move(Result);
7596   return Matched;
7597 }
7598 
7599 /// Matches each constructor initializer in a constructor definition.
7600 ///
7601 /// Given
7602 /// \code
7603 ///   class A { A() : i(42), j(42) {} int i; int j; };
7604 /// \endcode
7605 /// cxxConstructorDecl(forEachConstructorInitializer(
7606 ///   forField(decl().bind("x"))
7607 /// ))
7608 ///   will trigger two matches, binding for 'i' and 'j' respectively.
AST_MATCHER_P(CXXConstructorDecl,forEachConstructorInitializer,internal::Matcher<CXXCtorInitializer>,InnerMatcher)7609 AST_MATCHER_P(CXXConstructorDecl, forEachConstructorInitializer,
7610               internal::Matcher<CXXCtorInitializer>, InnerMatcher) {
7611   BoundNodesTreeBuilder Result;
7612   bool Matched = false;
7613   for (const auto *I : Node.inits()) {
7614     if (Finder->isTraversalIgnoringImplicitNodes() && !I->isWritten())
7615       continue;
7616     BoundNodesTreeBuilder InitBuilder(*Builder);
7617     if (InnerMatcher.matches(*I, Finder, &InitBuilder)) {
7618       Matched = true;
7619       Result.addMatch(InitBuilder);
7620     }
7621   }
7622   *Builder = std::move(Result);
7623   return Matched;
7624 }
7625 
7626 /// Matches constructor declarations that are copy constructors.
7627 ///
7628 /// Given
7629 /// \code
7630 ///   struct S {
7631 ///     S(); // #1
7632 ///     S(const S &); // #2
7633 ///     S(S &&); // #3
7634 ///   };
7635 /// \endcode
7636 /// cxxConstructorDecl(isCopyConstructor()) will match #2, but not #1 or #3.
AST_MATCHER(CXXConstructorDecl,isCopyConstructor)7637 AST_MATCHER(CXXConstructorDecl, isCopyConstructor) {
7638   return Node.isCopyConstructor();
7639 }
7640 
7641 /// Matches constructor declarations that are move constructors.
7642 ///
7643 /// Given
7644 /// \code
7645 ///   struct S {
7646 ///     S(); // #1
7647 ///     S(const S &); // #2
7648 ///     S(S &&); // #3
7649 ///   };
7650 /// \endcode
7651 /// cxxConstructorDecl(isMoveConstructor()) will match #3, but not #1 or #2.
AST_MATCHER(CXXConstructorDecl,isMoveConstructor)7652 AST_MATCHER(CXXConstructorDecl, isMoveConstructor) {
7653   return Node.isMoveConstructor();
7654 }
7655 
7656 /// Matches constructor declarations that are default constructors.
7657 ///
7658 /// Given
7659 /// \code
7660 ///   struct S {
7661 ///     S(); // #1
7662 ///     S(const S &); // #2
7663 ///     S(S &&); // #3
7664 ///   };
7665 /// \endcode
7666 /// cxxConstructorDecl(isDefaultConstructor()) will match #1, but not #2 or #3.
AST_MATCHER(CXXConstructorDecl,isDefaultConstructor)7667 AST_MATCHER(CXXConstructorDecl, isDefaultConstructor) {
7668   return Node.isDefaultConstructor();
7669 }
7670 
7671 /// Matches constructors that delegate to another constructor.
7672 ///
7673 /// Given
7674 /// \code
7675 ///   struct S {
7676 ///     S(); // #1
7677 ///     S(int) {} // #2
7678 ///     S(S &&) : S() {} // #3
7679 ///   };
7680 ///   S::S() : S(0) {} // #4
7681 /// \endcode
7682 /// cxxConstructorDecl(isDelegatingConstructor()) will match #3 and #4, but not
7683 /// #1 or #2.
AST_MATCHER(CXXConstructorDecl,isDelegatingConstructor)7684 AST_MATCHER(CXXConstructorDecl, isDelegatingConstructor) {
7685   return Node.isDelegatingConstructor();
7686 }
7687 
7688 /// Matches constructor, conversion function, and deduction guide declarations
7689 /// that have an explicit specifier if this explicit specifier is resolved to
7690 /// true.
7691 ///
7692 /// Given
7693 /// \code
7694 ///   template<bool b>
7695 ///   struct S {
7696 ///     S(int); // #1
7697 ///     explicit S(double); // #2
7698 ///     operator int(); // #3
7699 ///     explicit operator bool(); // #4
7700 ///     explicit(false) S(bool) // # 7
7701 ///     explicit(true) S(char) // # 8
7702 ///     explicit(b) S(S) // # 9
7703 ///   };
7704 ///   S(int) -> S<true> // #5
7705 ///   explicit S(double) -> S<false> // #6
7706 /// \endcode
7707 /// cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9.
7708 /// cxxConversionDecl(isExplicit()) will match #4, but not #3.
7709 /// cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5.
AST_POLYMORPHIC_MATCHER(isExplicit,AST_POLYMORPHIC_SUPPORTED_TYPES (CXXConstructorDecl,CXXConversionDecl,CXXDeductionGuideDecl))7710 AST_POLYMORPHIC_MATCHER(isExplicit, AST_POLYMORPHIC_SUPPORTED_TYPES(
7711                                         CXXConstructorDecl, CXXConversionDecl,
7712                                         CXXDeductionGuideDecl)) {
7713   return Node.isExplicit();
7714 }
7715 
7716 /// Matches the expression in an explicit specifier if present in the given
7717 /// declaration.
7718 ///
7719 /// Given
7720 /// \code
7721 ///   template<bool b>
7722 ///   struct S {
7723 ///     S(int); // #1
7724 ///     explicit S(double); // #2
7725 ///     operator int(); // #3
7726 ///     explicit operator bool(); // #4
7727 ///     explicit(false) S(bool) // # 7
7728 ///     explicit(true) S(char) // # 8
7729 ///     explicit(b) S(S) // # 9
7730 ///   };
7731 ///   S(int) -> S<true> // #5
7732 ///   explicit S(double) -> S<false> // #6
7733 /// \endcode
7734 /// cxxConstructorDecl(hasExplicitSpecifier(constantExpr())) will match #7, #8 and #9, but not #1 or #2.
7735 /// cxxConversionDecl(hasExplicitSpecifier(constantExpr())) will not match #3 or #4.
7736 /// cxxDeductionGuideDecl(hasExplicitSpecifier(constantExpr())) will not match #5 or #6.
AST_MATCHER_P(FunctionDecl,hasExplicitSpecifier,internal::Matcher<Expr>,InnerMatcher)7737 AST_MATCHER_P(FunctionDecl, hasExplicitSpecifier, internal::Matcher<Expr>,
7738               InnerMatcher) {
7739   ExplicitSpecifier ES = ExplicitSpecifier::getFromDecl(&Node);
7740   if (!ES.getExpr())
7741     return false;
7742 
7743   ASTChildrenNotSpelledInSourceScope RAII(Finder, false);
7744 
7745   return InnerMatcher.matches(*ES.getExpr(), Finder, Builder);
7746 }
7747 
7748 /// Matches functions, variables and namespace declarations that are marked with
7749 /// the inline keyword.
7750 ///
7751 /// Given
7752 /// \code
7753 ///   inline void f();
7754 ///   void g();
7755 ///   namespace n {
7756 ///   inline namespace m {}
7757 ///   }
7758 ///   inline int Foo = 5;
7759 /// \endcode
7760 /// functionDecl(isInline()) will match ::f().
7761 /// namespaceDecl(isInline()) will match n::m.
7762 /// varDecl(isInline()) will match Foo;
AST_POLYMORPHIC_MATCHER(isInline,AST_POLYMORPHIC_SUPPORTED_TYPES (NamespaceDecl,FunctionDecl,VarDecl))7763 AST_POLYMORPHIC_MATCHER(isInline, AST_POLYMORPHIC_SUPPORTED_TYPES(NamespaceDecl,
7764                                                                   FunctionDecl,
7765                                                                   VarDecl)) {
7766   // This is required because the spelling of the function used to determine
7767   // whether inline is specified or not differs between the polymorphic types.
7768   if (const auto *FD = dyn_cast<FunctionDecl>(&Node))
7769     return FD->isInlineSpecified();
7770   if (const auto *NSD = dyn_cast<NamespaceDecl>(&Node))
7771     return NSD->isInline();
7772   if (const auto *VD = dyn_cast<VarDecl>(&Node))
7773     return VD->isInline();
7774   llvm_unreachable("Not a valid polymorphic type");
7775 }
7776 
7777 /// Matches anonymous namespace declarations.
7778 ///
7779 /// Given
7780 /// \code
7781 ///   namespace n {
7782 ///   namespace {} // #1
7783 ///   }
7784 /// \endcode
7785 /// namespaceDecl(isAnonymous()) will match #1 but not ::n.
AST_MATCHER(NamespaceDecl,isAnonymous)7786 AST_MATCHER(NamespaceDecl, isAnonymous) {
7787   return Node.isAnonymousNamespace();
7788 }
7789 
7790 /// Matches declarations in the namespace `std`, but not in nested namespaces.
7791 ///
7792 /// Given
7793 /// \code
7794 ///   class vector {};
7795 ///   namespace foo {
7796 ///     class vector {};
7797 ///     namespace std {
7798 ///       class vector {};
7799 ///     }
7800 ///   }
7801 ///   namespace std {
7802 ///     inline namespace __1 {
7803 ///       class vector {}; // #1
7804 ///       namespace experimental {
7805 ///         class vector {};
7806 ///       }
7807 ///     }
7808 ///   }
7809 /// \endcode
7810 /// cxxRecordDecl(hasName("vector"), isInStdNamespace()) will match only #1.
AST_MATCHER(Decl,isInStdNamespace)7811 AST_MATCHER(Decl, isInStdNamespace) { return Node.isInStdNamespace(); }
7812 
7813 /// Matches declarations in an anonymous namespace.
7814 ///
7815 /// Given
7816 /// \code
7817 ///   class vector {};
7818 ///   namespace foo {
7819 ///     class vector {};
7820 ///     namespace {
7821 ///       class vector {}; // #1
7822 ///     }
7823 ///   }
7824 ///   namespace {
7825 ///     class vector {}; // #2
7826 ///     namespace foo {
7827 ///       class vector{}; // #3
7828 ///     }
7829 ///   }
7830 /// \endcode
7831 /// cxxRecordDecl(hasName("vector"), isInAnonymousNamespace()) will match
7832 /// #1, #2 and #3.
AST_MATCHER(Decl,isInAnonymousNamespace)7833 AST_MATCHER(Decl, isInAnonymousNamespace) {
7834   return Node.isInAnonymousNamespace();
7835 }
7836 
7837 /// If the given case statement does not use the GNU case range
7838 /// extension, matches the constant given in the statement.
7839 ///
7840 /// Given
7841 /// \code
7842 ///   switch (1) { case 1: case 1+1: case 3 ... 4: ; }
7843 /// \endcode
7844 /// caseStmt(hasCaseConstant(integerLiteral()))
7845 ///   matches "case 1:"
AST_MATCHER_P(CaseStmt,hasCaseConstant,internal::Matcher<Expr>,InnerMatcher)7846 AST_MATCHER_P(CaseStmt, hasCaseConstant, internal::Matcher<Expr>,
7847               InnerMatcher) {
7848   if (Node.getRHS())
7849     return false;
7850 
7851   return InnerMatcher.matches(*Node.getLHS(), Finder, Builder);
7852 }
7853 
7854 /// Matches declaration that has a given attribute.
7855 ///
7856 /// Given
7857 /// \code
7858 ///   __attribute__((device)) void f() { ... }
7859 /// \endcode
7860 /// decl(hasAttr(clang::attr::CUDADevice)) matches the function declaration of
7861 /// f. If the matcher is used from clang-query, attr::Kind parameter should be
7862 /// passed as a quoted string. e.g., hasAttr("attr::CUDADevice").
AST_MATCHER_P(Decl,hasAttr,attr::Kind,AttrKind)7863 AST_MATCHER_P(Decl, hasAttr, attr::Kind, AttrKind) {
7864   for (const auto *Attr : Node.attrs()) {
7865     if (Attr->getKind() == AttrKind)
7866       return true;
7867   }
7868   return false;
7869 }
7870 
7871 /// Matches the return value expression of a return statement
7872 ///
7873 /// Given
7874 /// \code
7875 ///   return a + b;
7876 /// \endcode
7877 /// hasReturnValue(binaryOperator())
7878 ///   matches 'return a + b'
7879 /// with binaryOperator()
7880 ///   matching 'a + b'
AST_MATCHER_P(ReturnStmt,hasReturnValue,internal::Matcher<Expr>,InnerMatcher)7881 AST_MATCHER_P(ReturnStmt, hasReturnValue, internal::Matcher<Expr>,
7882               InnerMatcher) {
7883   if (const auto *RetValue = Node.getRetValue())
7884     return InnerMatcher.matches(*RetValue, Finder, Builder);
7885   return false;
7886 }
7887 
7888 /// Matches CUDA kernel call expression.
7889 ///
7890 /// Example matches,
7891 /// \code
7892 ///   kernel<<<i,j>>>();
7893 /// \endcode
7894 extern const internal::VariadicDynCastAllOfMatcher<Stmt, CUDAKernelCallExpr>
7895     cudaKernelCallExpr;
7896 
7897 /// Matches expressions that resolve to a null pointer constant, such as
7898 /// GNU's __null, C++11's nullptr, or C's NULL macro.
7899 ///
7900 /// Given:
7901 /// \code
7902 ///   void *v1 = NULL;
7903 ///   void *v2 = nullptr;
7904 ///   void *v3 = __null; // GNU extension
7905 ///   char *cp = (char *)0;
7906 ///   int *ip = 0;
7907 ///   int i = 0;
7908 /// \endcode
7909 /// expr(nullPointerConstant())
7910 ///   matches the initializer for v1, v2, v3, cp, and ip. Does not match the
7911 ///   initializer for i.
AST_MATCHER_FUNCTION(internal::Matcher<Expr>,nullPointerConstant)7912 AST_MATCHER_FUNCTION(internal::Matcher<Expr>, nullPointerConstant) {
7913   return anyOf(
7914       gnuNullExpr(), cxxNullPtrLiteralExpr(),
7915       integerLiteral(equals(0), hasParent(expr(hasType(pointerType())))));
7916 }
7917 
7918 /// Matches the DecompositionDecl the binding belongs to.
7919 ///
7920 /// For example, in:
7921 /// \code
7922 /// void foo()
7923 /// {
7924 ///     int arr[3];
7925 ///     auto &[f, s, t] = arr;
7926 ///
7927 ///     f = 42;
7928 /// }
7929 /// \endcode
7930 /// The matcher:
7931 /// \code
7932 ///   bindingDecl(hasName("f"),
7933 ///                 forDecomposition(decompositionDecl())
7934 /// \endcode
7935 /// matches 'f' in 'auto &[f, s, t]'.
AST_MATCHER_P(BindingDecl,forDecomposition,internal::Matcher<ValueDecl>,InnerMatcher)7936 AST_MATCHER_P(BindingDecl, forDecomposition, internal::Matcher<ValueDecl>,
7937               InnerMatcher) {
7938   if (const ValueDecl *VD = Node.getDecomposedDecl())
7939     return InnerMatcher.matches(*VD, Finder, Builder);
7940   return false;
7941 }
7942 
7943 /// Matches the Nth binding of a DecompositionDecl.
7944 ///
7945 /// For example, in:
7946 /// \code
7947 /// void foo()
7948 /// {
7949 ///     int arr[3];
7950 ///     auto &[f, s, t] = arr;
7951 ///
7952 ///     f = 42;
7953 /// }
7954 /// \endcode
7955 /// The matcher:
7956 /// \code
7957 ///   decompositionDecl(hasBinding(0,
7958 ///   bindingDecl(hasName("f").bind("fBinding"))))
7959 /// \endcode
7960 /// matches the decomposition decl with 'f' bound to "fBinding".
AST_MATCHER_P2(DecompositionDecl,hasBinding,unsigned,N,internal::Matcher<BindingDecl>,InnerMatcher)7961 AST_MATCHER_P2(DecompositionDecl, hasBinding, unsigned, N,
7962                internal::Matcher<BindingDecl>, InnerMatcher) {
7963   if (Node.bindings().size() <= N)
7964     return false;
7965   return InnerMatcher.matches(*Node.bindings()[N], Finder, Builder);
7966 }
7967 
7968 /// Matches any binding of a DecompositionDecl.
7969 ///
7970 /// For example, in:
7971 /// \code
7972 /// void foo()
7973 /// {
7974 ///     int arr[3];
7975 ///     auto &[f, s, t] = arr;
7976 ///
7977 ///     f = 42;
7978 /// }
7979 /// \endcode
7980 /// The matcher:
7981 /// \code
7982 ///   decompositionDecl(hasAnyBinding(bindingDecl(hasName("f").bind("fBinding"))))
7983 /// \endcode
7984 /// matches the decomposition decl with 'f' bound to "fBinding".
AST_MATCHER_P(DecompositionDecl,hasAnyBinding,internal::Matcher<BindingDecl>,InnerMatcher)7985 AST_MATCHER_P(DecompositionDecl, hasAnyBinding, internal::Matcher<BindingDecl>,
7986               InnerMatcher) {
7987   return llvm::any_of(Node.bindings(), [&](const auto *Binding) {
7988     return InnerMatcher.matches(*Binding, Finder, Builder);
7989   });
7990 }
7991 
7992 /// Matches declaration of the function the statement belongs to.
7993 ///
7994 /// Deprecated. Use forCallable() to correctly handle the situation when
7995 /// the declaration is not a function (but a block or an Objective-C method).
7996 /// forFunction() not only fails to take non-functions into account but also
7997 /// may match the wrong declaration in their presence.
7998 ///
7999 /// Given:
8000 /// \code
8001 /// F& operator=(const F& o) {
8002 ///   std::copy_if(o.begin(), o.end(), begin(), [](V v) { return v > 0; });
8003 ///   return *this;
8004 /// }
8005 /// \endcode
8006 /// returnStmt(forFunction(hasName("operator=")))
8007 ///   matches 'return *this'
8008 ///   but does not match 'return v > 0'
AST_MATCHER_P(Stmt,forFunction,internal::Matcher<FunctionDecl>,InnerMatcher)8009 AST_MATCHER_P(Stmt, forFunction, internal::Matcher<FunctionDecl>,
8010               InnerMatcher) {
8011   const auto &Parents = Finder->getASTContext().getParents(Node);
8012 
8013   llvm::SmallVector<DynTypedNode, 8> Stack(Parents.begin(), Parents.end());
8014   while (!Stack.empty()) {
8015     const auto &CurNode = Stack.back();
8016     Stack.pop_back();
8017     if (const auto *FuncDeclNode = CurNode.get<FunctionDecl>()) {
8018       if (InnerMatcher.matches(*FuncDeclNode, Finder, Builder)) {
8019         return true;
8020       }
8021     } else if (const auto *LambdaExprNode = CurNode.get<LambdaExpr>()) {
8022       if (InnerMatcher.matches(*LambdaExprNode->getCallOperator(), Finder,
8023                                Builder)) {
8024         return true;
8025       }
8026     } else {
8027       llvm::append_range(Stack, Finder->getASTContext().getParents(CurNode));
8028     }
8029   }
8030   return false;
8031 }
8032 
8033 /// Matches declaration of the function, method, or block the statement
8034 /// belongs to.
8035 ///
8036 /// Given:
8037 /// \code
8038 /// F& operator=(const F& o) {
8039 ///   std::copy_if(o.begin(), o.end(), begin(), [](V v) { return v > 0; });
8040 ///   return *this;
8041 /// }
8042 /// \endcode
8043 /// returnStmt(forCallable(functionDecl(hasName("operator="))))
8044 ///   matches 'return *this'
8045 ///   but does not match 'return v > 0'
8046 ///
8047 /// Given:
8048 /// \code
8049 /// -(void) foo {
8050 ///   int x = 1;
8051 ///   dispatch_sync(queue, ^{ int y = 2; });
8052 /// }
8053 /// \endcode
8054 /// declStmt(forCallable(objcMethodDecl()))
8055 ///   matches 'int x = 1'
8056 ///   but does not match 'int y = 2'.
8057 /// whereas declStmt(forCallable(blockDecl()))
8058 ///   matches 'int y = 2'
8059 ///   but does not match 'int x = 1'.
AST_MATCHER_P(Stmt,forCallable,internal::Matcher<Decl>,InnerMatcher)8060 AST_MATCHER_P(Stmt, forCallable, internal::Matcher<Decl>, InnerMatcher) {
8061   const auto &Parents = Finder->getASTContext().getParents(Node);
8062 
8063   llvm::SmallVector<DynTypedNode, 8> Stack(Parents.begin(), Parents.end());
8064   while (!Stack.empty()) {
8065     const auto &CurNode = Stack.back();
8066     Stack.pop_back();
8067     if (const auto *FuncDeclNode = CurNode.get<FunctionDecl>()) {
8068       if (InnerMatcher.matches(*FuncDeclNode, Finder, Builder)) {
8069         return true;
8070       }
8071     } else if (const auto *LambdaExprNode = CurNode.get<LambdaExpr>()) {
8072       if (InnerMatcher.matches(*LambdaExprNode->getCallOperator(), Finder,
8073                                Builder)) {
8074         return true;
8075       }
8076     } else if (const auto *ObjCMethodDeclNode = CurNode.get<ObjCMethodDecl>()) {
8077       if (InnerMatcher.matches(*ObjCMethodDeclNode, Finder, Builder)) {
8078         return true;
8079       }
8080     } else if (const auto *BlockDeclNode = CurNode.get<BlockDecl>()) {
8081       if (InnerMatcher.matches(*BlockDeclNode, Finder, Builder)) {
8082         return true;
8083       }
8084     } else {
8085       llvm::append_range(Stack, Finder->getASTContext().getParents(CurNode));
8086     }
8087   }
8088   return false;
8089 }
8090 
8091 /// Matches a declaration that has external formal linkage.
8092 ///
8093 /// Example matches only z (matcher = varDecl(hasExternalFormalLinkage()))
8094 /// \code
8095 /// void f() {
8096 ///   int x;
8097 ///   static int y;
8098 /// }
8099 /// int z;
8100 /// \endcode
8101 ///
8102 /// Example matches f() because it has external formal linkage despite being
8103 /// unique to the translation unit as though it has internal likage
8104 /// (matcher = functionDecl(hasExternalFormalLinkage()))
8105 ///
8106 /// \code
8107 /// namespace {
8108 /// void f() {}
8109 /// }
8110 /// \endcode
AST_MATCHER(NamedDecl,hasExternalFormalLinkage)8111 AST_MATCHER(NamedDecl, hasExternalFormalLinkage) {
8112   return Node.hasExternalFormalLinkage();
8113 }
8114 
8115 /// Matches a declaration that has default arguments.
8116 ///
8117 /// Example matches y (matcher = parmVarDecl(hasDefaultArgument()))
8118 /// \code
8119 /// void x(int val) {}
8120 /// void y(int val = 0) {}
8121 /// \endcode
8122 ///
8123 /// Deprecated. Use hasInitializer() instead to be able to
8124 /// match on the contents of the default argument.  For example:
8125 ///
8126 /// \code
8127 /// void x(int val = 7) {}
8128 /// void y(int val = 42) {}
8129 /// \endcode
8130 /// parmVarDecl(hasInitializer(integerLiteral(equals(42))))
8131 ///   matches the parameter of y
8132 ///
8133 /// A matcher such as
8134 ///   parmVarDecl(hasInitializer(anything()))
8135 /// is equivalent to parmVarDecl(hasDefaultArgument()).
AST_MATCHER(ParmVarDecl,hasDefaultArgument)8136 AST_MATCHER(ParmVarDecl, hasDefaultArgument) {
8137   return Node.hasDefaultArg();
8138 }
8139 
8140 /// Matches array new expressions.
8141 ///
8142 /// Given:
8143 /// \code
8144 ///   MyClass *p1 = new MyClass[10];
8145 /// \endcode
8146 /// cxxNewExpr(isArray())
8147 ///   matches the expression 'new MyClass[10]'.
AST_MATCHER(CXXNewExpr,isArray)8148 AST_MATCHER(CXXNewExpr, isArray) {
8149   return Node.isArray();
8150 }
8151 
8152 /// Matches placement new expression arguments.
8153 ///
8154 /// Given:
8155 /// \code
8156 ///   MyClass *p1 = new (Storage, 16) MyClass();
8157 /// \endcode
8158 /// cxxNewExpr(hasPlacementArg(1, integerLiteral(equals(16))))
8159 ///   matches the expression 'new (Storage, 16) MyClass()'.
AST_MATCHER_P2(CXXNewExpr,hasPlacementArg,unsigned,Index,internal::Matcher<Expr>,InnerMatcher)8160 AST_MATCHER_P2(CXXNewExpr, hasPlacementArg, unsigned, Index,
8161                internal::Matcher<Expr>, InnerMatcher) {
8162   return Node.getNumPlacementArgs() > Index &&
8163          InnerMatcher.matches(*Node.getPlacementArg(Index), Finder, Builder);
8164 }
8165 
8166 /// Matches any placement new expression arguments.
8167 ///
8168 /// Given:
8169 /// \code
8170 ///   MyClass *p1 = new (Storage) MyClass();
8171 /// \endcode
8172 /// cxxNewExpr(hasAnyPlacementArg(anything()))
8173 ///   matches the expression 'new (Storage, 16) MyClass()'.
AST_MATCHER_P(CXXNewExpr,hasAnyPlacementArg,internal::Matcher<Expr>,InnerMatcher)8174 AST_MATCHER_P(CXXNewExpr, hasAnyPlacementArg, internal::Matcher<Expr>,
8175               InnerMatcher) {
8176   return llvm::any_of(Node.placement_arguments(), [&](const Expr *Arg) {
8177     return InnerMatcher.matches(*Arg, Finder, Builder);
8178   });
8179 }
8180 
8181 /// Matches array new expressions with a given array size.
8182 ///
8183 /// Given:
8184 /// \code
8185 ///   MyClass *p1 = new MyClass[10];
8186 /// \endcode
8187 /// cxxNewExpr(hasArraySize(integerLiteral(equals(10))))
8188 ///   matches the expression 'new MyClass[10]'.
AST_MATCHER_P(CXXNewExpr,hasArraySize,internal::Matcher<Expr>,InnerMatcher)8189 AST_MATCHER_P(CXXNewExpr, hasArraySize, internal::Matcher<Expr>, InnerMatcher) {
8190   return Node.isArray() && *Node.getArraySize() &&
8191          InnerMatcher.matches(**Node.getArraySize(), Finder, Builder);
8192 }
8193 
8194 /// Matches a class declaration that is defined.
8195 ///
8196 /// Example matches x (matcher = cxxRecordDecl(hasDefinition()))
8197 /// \code
8198 /// class x {};
8199 /// class y;
8200 /// \endcode
AST_MATCHER(CXXRecordDecl,hasDefinition)8201 AST_MATCHER(CXXRecordDecl, hasDefinition) {
8202   return Node.hasDefinition();
8203 }
8204 
8205 /// Matches C++11 scoped enum declaration.
8206 ///
8207 /// Example matches Y (matcher = enumDecl(isScoped()))
8208 /// \code
8209 /// enum X {};
8210 /// enum class Y {};
8211 /// \endcode
AST_MATCHER(EnumDecl,isScoped)8212 AST_MATCHER(EnumDecl, isScoped) {
8213   return Node.isScoped();
8214 }
8215 
8216 /// Matches a function declared with a trailing return type.
8217 ///
8218 /// Example matches Y (matcher = functionDecl(hasTrailingReturn()))
8219 /// \code
8220 /// int X() {}
8221 /// auto Y() -> int {}
8222 /// \endcode
AST_MATCHER(FunctionDecl,hasTrailingReturn)8223 AST_MATCHER(FunctionDecl, hasTrailingReturn) {
8224   if (const auto *F = Node.getType()->getAs<FunctionProtoType>())
8225     return F->hasTrailingReturn();
8226   return false;
8227 }
8228 
8229 /// Matches expressions that match InnerMatcher that are possibly wrapped in an
8230 /// elidable constructor and other corresponding bookkeeping nodes.
8231 ///
8232 /// In C++17, elidable copy constructors are no longer being generated in the
8233 /// AST as it is not permitted by the standard. They are, however, part of the
8234 /// AST in C++14 and earlier. So, a matcher must abstract over these differences
8235 /// to work in all language modes. This matcher skips elidable constructor-call
8236 /// AST nodes, `ExprWithCleanups` nodes wrapping elidable constructor-calls and
8237 /// various implicit nodes inside the constructor calls, all of which will not
8238 /// appear in the C++17 AST.
8239 ///
8240 /// Given
8241 ///
8242 /// \code
8243 /// struct H {};
8244 /// H G();
8245 /// void f() {
8246 ///   H D = G();
8247 /// }
8248 /// \endcode
8249 ///
8250 /// ``varDecl(hasInitializer(ignoringElidableConstructorCall(callExpr())))``
8251 /// matches ``H D = G()`` in C++11 through C++17 (and beyond).
AST_MATCHER_P(Expr,ignoringElidableConstructorCall,ast_matchers::internal::Matcher<Expr>,InnerMatcher)8252 AST_MATCHER_P(Expr, ignoringElidableConstructorCall,
8253               ast_matchers::internal::Matcher<Expr>, InnerMatcher) {
8254   // E tracks the node that we are examining.
8255   const Expr *E = &Node;
8256   // If present, remove an outer `ExprWithCleanups` corresponding to the
8257   // underlying `CXXConstructExpr`. This check won't cover all cases of added
8258   // `ExprWithCleanups` corresponding to `CXXConstructExpr` nodes (because the
8259   // EWC is placed on the outermost node of the expression, which this may not
8260   // be), but, it still improves the coverage of this matcher.
8261   if (const auto *CleanupsExpr = dyn_cast<ExprWithCleanups>(&Node))
8262     E = CleanupsExpr->getSubExpr();
8263   if (const auto *CtorExpr = dyn_cast<CXXConstructExpr>(E)) {
8264     if (CtorExpr->isElidable()) {
8265       if (const auto *MaterializeTemp =
8266               dyn_cast<MaterializeTemporaryExpr>(CtorExpr->getArg(0))) {
8267         return InnerMatcher.matches(*MaterializeTemp->getSubExpr(), Finder,
8268                                     Builder);
8269       }
8270     }
8271   }
8272   return InnerMatcher.matches(Node, Finder, Builder);
8273 }
8274 
8275 //----------------------------------------------------------------------------//
8276 // OpenMP handling.
8277 //----------------------------------------------------------------------------//
8278 
8279 /// Matches any ``#pragma omp`` executable directive.
8280 ///
8281 /// Given
8282 ///
8283 /// \code
8284 ///   #pragma omp parallel
8285 ///   #pragma omp parallel default(none)
8286 ///   #pragma omp taskyield
8287 /// \endcode
8288 ///
8289 /// ``ompExecutableDirective()`` matches ``omp parallel``,
8290 /// ``omp parallel default(none)`` and ``omp taskyield``.
8291 extern const internal::VariadicDynCastAllOfMatcher<Stmt, OMPExecutableDirective>
8292     ompExecutableDirective;
8293 
8294 /// Matches standalone OpenMP directives,
8295 /// i.e., directives that can't have a structured block.
8296 ///
8297 /// Given
8298 ///
8299 /// \code
8300 ///   #pragma omp parallel
8301 ///   {}
8302 ///   #pragma omp taskyield
8303 /// \endcode
8304 ///
8305 /// ``ompExecutableDirective(isStandaloneDirective()))`` matches
8306 /// ``omp taskyield``.
AST_MATCHER(OMPExecutableDirective,isStandaloneDirective)8307 AST_MATCHER(OMPExecutableDirective, isStandaloneDirective) {
8308   return Node.isStandaloneDirective();
8309 }
8310 
8311 /// Matches the structured-block of the OpenMP executable directive
8312 ///
8313 /// Prerequisite: the executable directive must not be standalone directive.
8314 /// If it is, it will never match.
8315 ///
8316 /// Given
8317 ///
8318 /// \code
8319 ///    #pragma omp parallel
8320 ///    ;
8321 ///    #pragma omp parallel
8322 ///    {}
8323 /// \endcode
8324 ///
8325 /// ``ompExecutableDirective(hasStructuredBlock(nullStmt()))`` will match ``;``
AST_MATCHER_P(OMPExecutableDirective,hasStructuredBlock,internal::Matcher<Stmt>,InnerMatcher)8326 AST_MATCHER_P(OMPExecutableDirective, hasStructuredBlock,
8327               internal::Matcher<Stmt>, InnerMatcher) {
8328   if (Node.isStandaloneDirective())
8329     return false; // Standalone directives have no structured blocks.
8330   return InnerMatcher.matches(*Node.getStructuredBlock(), Finder, Builder);
8331 }
8332 
8333 /// Matches any clause in an OpenMP directive.
8334 ///
8335 /// Given
8336 ///
8337 /// \code
8338 ///   #pragma omp parallel
8339 ///   #pragma omp parallel default(none)
8340 /// \endcode
8341 ///
8342 /// ``ompExecutableDirective(hasAnyClause(anything()))`` matches
8343 /// ``omp parallel default(none)``.
AST_MATCHER_P(OMPExecutableDirective,hasAnyClause,internal::Matcher<OMPClause>,InnerMatcher)8344 AST_MATCHER_P(OMPExecutableDirective, hasAnyClause,
8345               internal::Matcher<OMPClause>, InnerMatcher) {
8346   ArrayRef<OMPClause *> Clauses = Node.clauses();
8347   return matchesFirstInPointerRange(InnerMatcher, Clauses.begin(),
8348                                     Clauses.end(), Finder,
8349                                     Builder) != Clauses.end();
8350 }
8351 
8352 /// Matches OpenMP ``default`` clause.
8353 ///
8354 /// Given
8355 ///
8356 /// \code
8357 ///   #pragma omp parallel default(none)
8358 ///   #pragma omp parallel default(shared)
8359 ///   #pragma omp parallel default(private)
8360 ///   #pragma omp parallel default(firstprivate)
8361 ///   #pragma omp parallel
8362 /// \endcode
8363 ///
8364 /// ``ompDefaultClause()`` matches ``default(none)``, ``default(shared)``,
8365 /// `` default(private)`` and ``default(firstprivate)``
8366 extern const internal::VariadicDynCastAllOfMatcher<OMPClause, OMPDefaultClause>
8367     ompDefaultClause;
8368 
8369 /// Matches if the OpenMP ``default`` clause has ``none`` kind specified.
8370 ///
8371 /// Given
8372 ///
8373 /// \code
8374 ///   #pragma omp parallel
8375 ///   #pragma omp parallel default(none)
8376 ///   #pragma omp parallel default(shared)
8377 ///   #pragma omp parallel default(private)
8378 ///   #pragma omp parallel default(firstprivate)
8379 /// \endcode
8380 ///
8381 /// ``ompDefaultClause(isNoneKind())`` matches only ``default(none)``.
AST_MATCHER(OMPDefaultClause,isNoneKind)8382 AST_MATCHER(OMPDefaultClause, isNoneKind) {
8383   return Node.getDefaultKind() == llvm::omp::OMP_DEFAULT_none;
8384 }
8385 
8386 /// Matches if the OpenMP ``default`` clause has ``shared`` kind specified.
8387 ///
8388 /// Given
8389 ///
8390 /// \code
8391 ///   #pragma omp parallel
8392 ///   #pragma omp parallel default(none)
8393 ///   #pragma omp parallel default(shared)
8394 ///   #pragma omp parallel default(private)
8395 ///   #pragma omp parallel default(firstprivate)
8396 /// \endcode
8397 ///
8398 /// ``ompDefaultClause(isSharedKind())`` matches only ``default(shared)``.
AST_MATCHER(OMPDefaultClause,isSharedKind)8399 AST_MATCHER(OMPDefaultClause, isSharedKind) {
8400   return Node.getDefaultKind() == llvm::omp::OMP_DEFAULT_shared;
8401 }
8402 
8403 /// Matches if the OpenMP ``default`` clause has ``private`` kind
8404 /// specified.
8405 ///
8406 /// Given
8407 ///
8408 /// \code
8409 ///   #pragma omp parallel
8410 ///   #pragma omp parallel default(none)
8411 ///   #pragma omp parallel default(shared)
8412 ///   #pragma omp parallel default(private)
8413 ///   #pragma omp parallel default(firstprivate)
8414 /// \endcode
8415 ///
8416 /// ``ompDefaultClause(isPrivateKind())`` matches only
8417 /// ``default(private)``.
AST_MATCHER(OMPDefaultClause,isPrivateKind)8418 AST_MATCHER(OMPDefaultClause, isPrivateKind) {
8419   return Node.getDefaultKind() == llvm::omp::OMP_DEFAULT_private;
8420 }
8421 
8422 /// Matches if the OpenMP ``default`` clause has ``firstprivate`` kind
8423 /// specified.
8424 ///
8425 /// Given
8426 ///
8427 /// \code
8428 ///   #pragma omp parallel
8429 ///   #pragma omp parallel default(none)
8430 ///   #pragma omp parallel default(shared)
8431 ///   #pragma omp parallel default(private)
8432 ///   #pragma omp parallel default(firstprivate)
8433 /// \endcode
8434 ///
8435 /// ``ompDefaultClause(isFirstPrivateKind())`` matches only
8436 /// ``default(firstprivate)``.
AST_MATCHER(OMPDefaultClause,isFirstPrivateKind)8437 AST_MATCHER(OMPDefaultClause, isFirstPrivateKind) {
8438   return Node.getDefaultKind() == llvm::omp::OMP_DEFAULT_firstprivate;
8439 }
8440 
8441 /// Matches if the OpenMP directive is allowed to contain the specified OpenMP
8442 /// clause kind.
8443 ///
8444 /// Given
8445 ///
8446 /// \code
8447 ///   #pragma omp parallel
8448 ///   #pragma omp parallel for
8449 ///   #pragma omp          for
8450 /// \endcode
8451 ///
8452 /// `ompExecutableDirective(isAllowedToContainClause(OMPC_default))`` matches
8453 /// ``omp parallel`` and ``omp parallel for``.
8454 ///
8455 /// If the matcher is use from clang-query, ``OpenMPClauseKind`` parameter
8456 /// should be passed as a quoted string. e.g.,
8457 /// ``isAllowedToContainClauseKind("OMPC_default").``
AST_MATCHER_P(OMPExecutableDirective,isAllowedToContainClauseKind,OpenMPClauseKind,CKind)8458 AST_MATCHER_P(OMPExecutableDirective, isAllowedToContainClauseKind,
8459               OpenMPClauseKind, CKind) {
8460   return llvm::omp::isAllowedClauseForDirective(
8461       Node.getDirectiveKind(), CKind,
8462       Finder->getASTContext().getLangOpts().OpenMP);
8463 }
8464 
8465 //----------------------------------------------------------------------------//
8466 // End OpenMP handling.
8467 //----------------------------------------------------------------------------//
8468 
8469 } // namespace ast_matchers
8470 } // namespace clang
8471 
8472 #endif // LLVM_CLANG_ASTMATCHERS_ASTMATCHERS_H
8473