1651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines//===--- DataRecursiveASTVisitor.h - Data-Recursive AST Visitor -*- C++ -*-===//
2dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis//
3dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis//                     The LLVM Compiler Infrastructure
4dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis//
5dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis// This file is distributed under the University of Illinois Open Source
6dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis// License. See LICENSE.TXT for details.
7dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis//
8dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis//===----------------------------------------------------------------------===//
9dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis//
10651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines//  This file defines the DataRecursiveASTVisitor interface, which recursively
11651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines//  traverses the entire AST, using data recursion for Stmts/Exprs.
12dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis//
13dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis//===----------------------------------------------------------------------===//
14651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#ifndef LLVM_CLANG_AST_DATARECURSIVEASTVISITOR_H
15651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#define LLVM_CLANG_AST_DATARECURSIVEASTVISITOR_H
16dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
17651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#include "clang/AST/Attr.h"
18dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis#include "clang/AST/Decl.h"
19dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis#include "clang/AST/DeclCXX.h"
20dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis#include "clang/AST/DeclFriend.h"
21dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis#include "clang/AST/DeclObjC.h"
22c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev#include "clang/AST/DeclOpenMP.h"
23dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis#include "clang/AST/DeclTemplate.h"
24dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis#include "clang/AST/Expr.h"
25dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis#include "clang/AST/ExprCXX.h"
26dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis#include "clang/AST/ExprObjC.h"
27dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis#include "clang/AST/NestedNameSpecifier.h"
28dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis#include "clang/AST/Stmt.h"
29dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis#include "clang/AST/StmtCXX.h"
30dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis#include "clang/AST/StmtObjC.h"
314fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev#include "clang/AST/StmtOpenMP.h"
32dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis#include "clang/AST/TemplateBase.h"
33dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis#include "clang/AST/TemplateName.h"
34dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis#include "clang/AST/Type.h"
35dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis#include "clang/AST/TypeLoc.h"
36dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
37dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis// The following three macros are used for meta programming.  The code
38dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis// using them is responsible for defining macro OPERATOR().
39dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
40dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis// All unary operators.
416bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#define UNARYOP_LIST()                                                         \
426bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  OPERATOR(PostInc) OPERATOR(PostDec) OPERATOR(PreInc) OPERATOR(PreDec)        \
436bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      OPERATOR(AddrOf) OPERATOR(Deref) OPERATOR(Plus) OPERATOR(Minus)          \
446bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      OPERATOR(Not) OPERATOR(LNot) OPERATOR(Real) OPERATOR(Imag)               \
456bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      OPERATOR(Extension)
46dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
47dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis// All binary operators (excluding compound assign operators).
486bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#define BINOP_LIST()                                                           \
496bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  OPERATOR(PtrMemD) OPERATOR(PtrMemI) OPERATOR(Mul) OPERATOR(Div)              \
506bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      OPERATOR(Rem) OPERATOR(Add) OPERATOR(Sub) OPERATOR(Shl) OPERATOR(Shr)    \
516bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      OPERATOR(LT) OPERATOR(GT) OPERATOR(LE) OPERATOR(GE) OPERATOR(EQ)         \
526bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      OPERATOR(NE) OPERATOR(And) OPERATOR(Xor) OPERATOR(Or) OPERATOR(LAnd)     \
536bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      OPERATOR(LOr) OPERATOR(Assign) OPERATOR(Comma)
54dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
55dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis// All compound assign operators.
566bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#define CAO_LIST()                                                             \
576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  OPERATOR(Mul) OPERATOR(Div) OPERATOR(Rem) OPERATOR(Add) OPERATOR(Sub)        \
586bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      OPERATOR(Shl) OPERATOR(Shr) OPERATOR(And) OPERATOR(Or) OPERATOR(Xor)
59dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
60dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidisnamespace clang {
61dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
626bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// Reduce the diff between RecursiveASTVisitor / DataRecursiveASTVisitor to
636bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// make it easier to track changes and keep the two in sync.
646bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#define RecursiveASTVisitor DataRecursiveASTVisitor
656bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
66dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis// A helper macro to implement short-circuiting when recursing.  It
67dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis// invokes CALL_EXPR, which must be a method call, on the derived
686bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// object (s.t. a user of RecursiveASTVisitor can override the method
69dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis// in CALL_EXPR).
706bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#define TRY_TO(CALL_EXPR)                                                      \
716bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  do {                                                                         \
726bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    if (!getDerived().CALL_EXPR)                                               \
736bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      return false;                                                            \
746bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  } while (0)
75dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
76dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis/// \brief A class that does preorder depth-first traversal on the
77dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis/// entire Clang AST and visits each node.
78dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis///
79dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis/// This class performs three distinct tasks:
80dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis///   1. traverse the AST (i.e. go to each node);
81dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis///   2. at a given node, walk up the class hierarchy, starting from
82dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis///      the node's dynamic type, until the top-most class (e.g. Stmt,
83dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis///      Decl, or Type) is reached.
84dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis///   3. given a (node, class) combination, where 'class' is some base
85dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis///      class of the dynamic type of 'node', call a user-overridable
86dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis///      function to actually visit the node.
87dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis///
88dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis/// These tasks are done by three groups of methods, respectively:
89dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis///   1. TraverseDecl(Decl *x) does task #1.  It is the entry point
90dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis///      for traversing an AST rooted at x.  This method simply
91dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis///      dispatches (i.e. forwards) to TraverseFoo(Foo *x) where Foo
92dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis///      is the dynamic type of *x, which calls WalkUpFromFoo(x) and
93dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis///      then recursively visits the child nodes of x.
94dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis///      TraverseStmt(Stmt *x) and TraverseType(QualType x) work
95dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis///      similarly.
96dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis///   2. WalkUpFromFoo(Foo *x) does task #2.  It does not try to visit
97dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis///      any child node of x.  Instead, it first calls WalkUpFromBar(x)
98dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis///      where Bar is the direct parent class of Foo (unless Foo has
99dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis///      no parent), and then calls VisitFoo(x) (see the next list item).
100dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis///   3. VisitFoo(Foo *x) does task #3.
101dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis///
102dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis/// These three method groups are tiered (Traverse* > WalkUpFrom* >
103dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis/// Visit*).  A method (e.g. Traverse*) may call methods from the same
104dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis/// tier (e.g. other Traverse*) or one tier lower (e.g. WalkUpFrom*).
105dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis/// It may not call methods from a higher tier.
106dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis///
107dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis/// Note that since WalkUpFromFoo() calls WalkUpFromBar() (where Bar
108dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis/// is Foo's super class) before calling VisitFoo(), the result is
109dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis/// that the Visit*() methods for a given node are called in the
1106bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines/// top-down order (e.g. for a node of type NamespaceDecl, the order will
111dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis/// be VisitDecl(), VisitNamedDecl(), and then VisitNamespaceDecl()).
112dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis///
113dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis/// This scheme guarantees that all Visit*() calls for the same AST
114dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis/// node are grouped together.  In other words, Visit*() methods for
115dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis/// different nodes are never interleaved.
116dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis///
117428499e6f5731e98c15af4fe7ff1f6ff458c2766Argyrios Kyrtzidis/// Stmts are traversed internally using a data queue to avoid a stack overflow
118428499e6f5731e98c15af4fe7ff1f6ff458c2766Argyrios Kyrtzidis/// with hugely nested ASTs.
119428499e6f5731e98c15af4fe7ff1f6ff458c2766Argyrios Kyrtzidis///
120dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis/// Clients of this visitor should subclass the visitor (providing
121dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis/// themselves as the template argument, using the curiously recurring
122dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis/// template pattern) and override any of the Traverse*, WalkUpFrom*,
123dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis/// and Visit* methods for declarations, types, statements,
124dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis/// expressions, or other AST nodes where the visitor should customize
125dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis/// behavior.  Most users only need to override Visit*.  Advanced
126dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis/// users may override Traverse* and WalkUpFrom* to implement custom
127dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis/// traversal strategies.  Returning false from one of these overridden
128dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis/// functions will abort the entire traversal.
129dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis///
130dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis/// By default, this visitor tries to visit every part of the explicit
131dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis/// source code exactly once.  The default policy towards templates
132dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis/// is to descend into the 'pattern' class or function body, not any
133dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis/// explicit or implicit instantiations.  Explicit specializations
134dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis/// are still visited, and the patterns of partial specializations
135dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis/// are visited separately.  This behavior can be changed by
136dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis/// overriding shouldVisitTemplateInstantiations() in the derived class
137dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis/// to return true, in which case all known implicit and explicit
138dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis/// instantiations will be visited at the same time as the pattern
139dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis/// from which they were produced.
1406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate <typename Derived> class RecursiveASTVisitor {
141dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidispublic:
142dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  /// \brief Return a reference to the derived class.
1436bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  Derived &getDerived() { return *static_cast<Derived *>(this); }
144dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
145dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  /// \brief Return whether this visitor should recurse into
146dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  /// template instantiations.
147dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  bool shouldVisitTemplateInstantiations() const { return false; }
148dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
149dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  /// \brief Return whether this visitor should recurse into the types of
150dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  /// TypeLocs.
151dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  bool shouldWalkTypesOfTypeLocs() const { return true; }
152dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
153dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  /// \brief Recursively visit a statement or expression, by
154dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  /// dispatching to Traverse*() based on the argument's dynamic type.
155dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  ///
156dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  /// \returns false if the visitation was terminated early, true
157dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  /// otherwise (including when the argument is NULL).
158dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  bool TraverseStmt(Stmt *S);
159dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
160dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  /// \brief Recursively visit a type, by dispatching to
161dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  /// Traverse*Type() based on the argument's getTypeClass() property.
162dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  ///
163dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  /// \returns false if the visitation was terminated early, true
164dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  /// otherwise (including when the argument is a Null type).
165dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  bool TraverseType(QualType T);
166dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
167dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  /// \brief Recursively visit a type with location, by dispatching to
168dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  /// Traverse*TypeLoc() based on the argument type's getTypeClass() property.
169dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  ///
170dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  /// \returns false if the visitation was terminated early, true
171dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  /// otherwise (including when the argument is a Null type location).
172dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  bool TraverseTypeLoc(TypeLoc TL);
173dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
174651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \brief Recursively visit an attribute, by dispatching to
175651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// Traverse*Attr() based on the argument's dynamic type.
176651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  ///
177651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \returns false if the visitation was terminated early, true
178651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// otherwise (including when the argument is a Null type location).
179651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  bool TraverseAttr(Attr *At);
180651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
181dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  /// \brief Recursively visit a declaration, by dispatching to
182dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  /// Traverse*Decl() based on the argument's dynamic type.
183dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  ///
184dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  /// \returns false if the visitation was terminated early, true
185dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  /// otherwise (including when the argument is NULL).
186dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  bool TraverseDecl(Decl *D);
187dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
188dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  /// \brief Recursively visit a C++ nested-name-specifier.
189dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  ///
190dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  /// \returns false if the visitation was terminated early, true otherwise.
191dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  bool TraverseNestedNameSpecifier(NestedNameSpecifier *NNS);
192dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
193dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  /// \brief Recursively visit a C++ nested-name-specifier with location
194dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  /// information.
195dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  ///
196dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  /// \returns false if the visitation was terminated early, true otherwise.
197dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  bool TraverseNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS);
198dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
199dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  /// \brief Recursively visit a name with its location information.
200dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  ///
201dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  /// \returns false if the visitation was terminated early, true otherwise.
202dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  bool TraverseDeclarationNameInfo(DeclarationNameInfo NameInfo);
203dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
204dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  /// \brief Recursively visit a template name and dispatch to the
205dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  /// appropriate method.
206dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  ///
207dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  /// \returns false if the visitation was terminated early, true otherwise.
208dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  bool TraverseTemplateName(TemplateName Template);
209dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
210dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  /// \brief Recursively visit a template argument and dispatch to the
211dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  /// appropriate method for the argument type.
212dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  ///
213dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  /// \returns false if the visitation was terminated early, true otherwise.
214dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  // FIXME: migrate callers to TemplateArgumentLoc instead.
215dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  bool TraverseTemplateArgument(const TemplateArgument &Arg);
216dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
217dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  /// \brief Recursively visit a template argument location and dispatch to the
218dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  /// appropriate method for the argument type.
219dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  ///
220dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  /// \returns false if the visitation was terminated early, true otherwise.
221dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  bool TraverseTemplateArgumentLoc(const TemplateArgumentLoc &ArgLoc);
222dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
223dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  /// \brief Recursively visit a set of template arguments.
224dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  /// This can be overridden by a subclass, but it's not expected that
225dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  /// will be needed -- this visitor always dispatches to another.
226dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  ///
227dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  /// \returns false if the visitation was terminated early, true otherwise.
228dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  // FIXME: take a TemplateArgumentLoc* (or TemplateArgumentListInfo) instead.
229dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  bool TraverseTemplateArguments(const TemplateArgument *Args,
230dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis                                 unsigned NumArgs);
231dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
232dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  /// \brief Recursively visit a constructor initializer.  This
233dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  /// automatically dispatches to another visitor for the initializer
234dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  /// expression, but not for the name of the initializer, so may
235dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  /// be overridden for clients that need access to the name.
236dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  ///
237dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  /// \returns false if the visitation was terminated early, true otherwise.
238dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  bool TraverseConstructorInitializer(CXXCtorInitializer *Init);
239dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
240dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  /// \brief Recursively visit a lambda capture.
241dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  ///
242dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  /// \returns false if the visitation was terminated early, true otherwise.
2436bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  bool TraverseLambdaCapture(LambdaExpr *LE, const LambdaCapture *C);
2446bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
2456bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  /// \brief Recursively visit the body of a lambda expression.
2466bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  ///
2476bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  /// This provides a hook for visitors that need more context when visiting
2486bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  /// \c LE->getBody().
2496bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  ///
2506bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  /// \returns false if the visitation was terminated early, true otherwise.
2516bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  bool TraverseLambdaBody(LambdaExpr *LE);
252651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
253651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // ---- Methods on Attrs ----
254651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
255651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // \brief Visit an attribute.
256651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  bool VisitAttr(Attr *A) { return true; }
257651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
2586bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// Declare Traverse* and empty Visit* for all Attr classes.
259651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#define ATTR_VISITOR_DECLS_ONLY
260651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#include "clang/AST/AttrVisitor.inc"
261651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#undef ATTR_VISITOR_DECLS_ONLY
262651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
2636bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// ---- Methods on Stmts ----
264dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
2656bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// Declare Traverse*() for all concrete Stmt classes.
266dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis#define ABSTRACT_STMT(STMT)
2676bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#define STMT(CLASS, PARENT) bool Traverse##CLASS(CLASS *S);
268dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis#include "clang/AST/StmtNodes.inc"
269dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  // The above header #undefs ABSTRACT_STMT and STMT upon exit.
270dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
271dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  // Define WalkUpFrom*() and empty Visit*() for all Stmt classes.
272dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  bool WalkUpFromStmt(Stmt *S) { return getDerived().VisitStmt(S); }
273dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  bool VisitStmt(Stmt *S) { return true; }
2746bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#define STMT(CLASS, PARENT)                                                    \
2756bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  bool WalkUpFrom##CLASS(CLASS *S) {                                           \
2766bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(WalkUpFrom##PARENT(S));                                             \
2776bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(Visit##CLASS(S));                                                   \
2786bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    return true;                                                               \
2796bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  }                                                                            \
280dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  bool Visit##CLASS(CLASS *S) { return true; }
281dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis#include "clang/AST/StmtNodes.inc"
282dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
2836bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// Define Traverse*(), WalkUpFrom*(), and Visit*() for unary
2846bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// operator methods.  Unary operators are not classes in themselves
2856bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// (they're all opcodes in UnaryOperator) but do have visitors.
2866bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#define OPERATOR(NAME)                                                         \
2876bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  bool TraverseUnary##NAME(UnaryOperator *S) {                                 \
2886bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(WalkUpFromUnary##NAME(S));                                          \
2896bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    StmtQueueAction StmtQueue(*this);                                          \
2906bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    StmtQueue.queue(S->getSubExpr());                                          \
2916bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    return true;                                                               \
2926bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  }                                                                            \
2936bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  bool WalkUpFromUnary##NAME(UnaryOperator *S) {                               \
2946bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(WalkUpFromUnaryOperator(S));                                        \
2956bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(VisitUnary##NAME(S));                                               \
2966bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    return true;                                                               \
2976bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  }                                                                            \
298dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  bool VisitUnary##NAME(UnaryOperator *S) { return true; }
299dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
300dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  UNARYOP_LIST()
301dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis#undef OPERATOR
302dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
3036bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// Define Traverse*(), WalkUpFrom*(), and Visit*() for binary
3046bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// operator methods.  Binary operators are not classes in themselves
3056bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// (they're all opcodes in BinaryOperator) but do have visitors.
3066bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#define GENERAL_BINOP_FALLBACK(NAME, BINOP_TYPE)                               \
3076bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  bool TraverseBin##NAME(BINOP_TYPE *S) {                                      \
3086bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(WalkUpFromBin##NAME(S));                                            \
3096bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    StmtQueueAction StmtQueue(*this);                                          \
3106bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    StmtQueue.queue(S->getLHS());                                              \
3116bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    StmtQueue.queue(S->getRHS());                                              \
3126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    return true;                                                               \
3136bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  }                                                                            \
3146bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  bool WalkUpFromBin##NAME(BINOP_TYPE *S) {                                    \
3156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(WalkUpFrom##BINOP_TYPE(S));                                         \
3166bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(VisitBin##NAME(S));                                                 \
3176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    return true;                                                               \
3186bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  }                                                                            \
319dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  bool VisitBin##NAME(BINOP_TYPE *S) { return true; }
320dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
321dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis#define OPERATOR(NAME) GENERAL_BINOP_FALLBACK(NAME, BinaryOperator)
322dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  BINOP_LIST()
323dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis#undef OPERATOR
324dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
3256bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// Define Traverse*(), WalkUpFrom*(), and Visit*() for compound
3266bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// assignment methods.  Compound assignment operators are not
3276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// classes in themselves (they're all opcodes in
3286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// CompoundAssignOperator) but do have visitors.
3296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#define OPERATOR(NAME)                                                         \
330dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  GENERAL_BINOP_FALLBACK(NAME##Assign, CompoundAssignOperator)
331dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
332dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  CAO_LIST()
333dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis#undef OPERATOR
334dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis#undef GENERAL_BINOP_FALLBACK
335dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
3366bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// ---- Methods on Types ----
3376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// FIXME: revamp to take TypeLoc's rather than Types.
338dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
3396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// Declare Traverse*() for all concrete Type classes.
340dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis#define ABSTRACT_TYPE(CLASS, BASE)
3416bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#define TYPE(CLASS, BASE) bool Traverse##CLASS##Type(CLASS##Type *T);
342dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis#include "clang/AST/TypeNodes.def"
343dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  // The above header #undefs ABSTRACT_TYPE and TYPE upon exit.
344dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
345dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  // Define WalkUpFrom*() and empty Visit*() for all Type classes.
346dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  bool WalkUpFromType(Type *T) { return getDerived().VisitType(T); }
347dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  bool VisitType(Type *T) { return true; }
3486bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#define TYPE(CLASS, BASE)                                                      \
3496bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  bool WalkUpFrom##CLASS##Type(CLASS##Type *T) {                               \
3506bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(WalkUpFrom##BASE(T));                                               \
3516bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(Visit##CLASS##Type(T));                                             \
3526bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    return true;                                                               \
3536bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  }                                                                            \
354dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  bool Visit##CLASS##Type(CLASS##Type *T) { return true; }
355dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis#include "clang/AST/TypeNodes.def"
356dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
3576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// ---- Methods on TypeLocs ----
3586bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// FIXME: this currently just calls the matching Type methods
359dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
3606bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// Declare Traverse*() for all concrete TypeLoc classes.
361dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis#define ABSTRACT_TYPELOC(CLASS, BASE)
3626bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#define TYPELOC(CLASS, BASE) bool Traverse##CLASS##TypeLoc(CLASS##TypeLoc TL);
363dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis#include "clang/AST/TypeLocNodes.def"
364dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  // The above header #undefs ABSTRACT_TYPELOC and TYPELOC upon exit.
365dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
366dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  // Define WalkUpFrom*() and empty Visit*() for all TypeLoc classes.
367dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  bool WalkUpFromTypeLoc(TypeLoc TL) { return getDerived().VisitTypeLoc(TL); }
368dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  bool VisitTypeLoc(TypeLoc TL) { return true; }
369dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
370dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  // QualifiedTypeLoc and UnqualTypeLoc are not declared in
371dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  // TypeNodes.def and thus need to be handled specially.
372dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  bool WalkUpFromQualifiedTypeLoc(QualifiedTypeLoc TL) {
373dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis    return getDerived().VisitUnqualTypeLoc(TL.getUnqualifiedLoc());
374dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  }
375dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  bool VisitQualifiedTypeLoc(QualifiedTypeLoc TL) { return true; }
376dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  bool WalkUpFromUnqualTypeLoc(UnqualTypeLoc TL) {
377dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis    return getDerived().VisitUnqualTypeLoc(TL.getUnqualifiedLoc());
378dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  }
379dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  bool VisitUnqualTypeLoc(UnqualTypeLoc TL) { return true; }
380dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
3816bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// Note that BASE includes trailing 'Type' which CLASS doesn't.
3826bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#define TYPE(CLASS, BASE)                                                      \
3836bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  bool WalkUpFrom##CLASS##TypeLoc(CLASS##TypeLoc TL) {                         \
3846bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(WalkUpFrom##BASE##Loc(TL));                                         \
3856bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(Visit##CLASS##TypeLoc(TL));                                         \
3866bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    return true;                                                               \
3876bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  }                                                                            \
388dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  bool Visit##CLASS##TypeLoc(CLASS##TypeLoc TL) { return true; }
389dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis#include "clang/AST/TypeNodes.def"
390dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
3916bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// ---- Methods on Decls ----
392dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
3936bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// Declare Traverse*() for all concrete Decl classes.
394dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis#define ABSTRACT_DECL(DECL)
3956bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#define DECL(CLASS, BASE) bool Traverse##CLASS##Decl(CLASS##Decl *D);
396dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis#include "clang/AST/DeclNodes.inc"
397dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  // The above header #undefs ABSTRACT_DECL and DECL upon exit.
398dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
399dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  // Define WalkUpFrom*() and empty Visit*() for all Decl classes.
400dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  bool WalkUpFromDecl(Decl *D) { return getDerived().VisitDecl(D); }
401dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  bool VisitDecl(Decl *D) { return true; }
4026bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#define DECL(CLASS, BASE)                                                      \
4036bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  bool WalkUpFrom##CLASS##Decl(CLASS##Decl *D) {                               \
4046bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(WalkUpFrom##BASE(D));                                               \
4056bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(Visit##CLASS##Decl(D));                                             \
4066bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    return true;                                                               \
4076bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  }                                                                            \
408dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  bool Visit##CLASS##Decl(CLASS##Decl *D) { return true; }
409dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis#include "clang/AST/DeclNodes.inc"
410dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
411dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidisprivate:
412dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  // These are helper methods used by more than one Traverse* method.
413dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  bool TraverseTemplateParameterListHelper(TemplateParameterList *TPL);
414428499e6f5731e98c15af4fe7ff1f6ff458c2766Argyrios Kyrtzidis  bool TraverseClassInstantiations(ClassTemplateDecl *D);
415ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  bool TraverseVariableInstantiations(VarTemplateDecl *D);
4166bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  bool TraverseFunctionInstantiations(FunctionTemplateDecl *D);
417dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  bool TraverseTemplateArgumentLocsHelper(const TemplateArgumentLoc *TAL,
418dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis                                          unsigned Count);
419dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  bool TraverseArrayTypeLocHelper(ArrayTypeLoc TL);
420dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  bool TraverseRecordHelper(RecordDecl *D);
421dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  bool TraverseCXXRecordHelper(CXXRecordDecl *D);
422dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  bool TraverseDeclaratorHelper(DeclaratorDecl *D);
423dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  bool TraverseDeclContextHelper(DeclContext *DC);
424dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  bool TraverseFunctionHelper(FunctionDecl *D);
425dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  bool TraverseVarHelper(VarDecl *D);
426651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  bool TraverseOMPExecutableDirective(OMPExecutableDirective *S);
427176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  bool TraverseOMPLoopDirective(OMPLoopDirective *S);
428c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  bool TraverseOMPClause(OMPClause *C);
4296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#define OPENMP_CLAUSE(Name, Class) bool Visit##Class(Class *C);
4304fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev#include "clang/Basic/OpenMPKinds.def"
431543c4ae954f2bce5ac58ed22080f23cbd94794d2Alexey Bataev  /// \brief Process clauses with list of variables.
432c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  template <typename T> bool VisitOMPClauseList(T *Node);
433dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
434428499e6f5731e98c15af4fe7ff1f6ff458c2766Argyrios Kyrtzidis  typedef SmallVector<Stmt *, 16> StmtsTy;
435428499e6f5731e98c15af4fe7ff1f6ff458c2766Argyrios Kyrtzidis  typedef SmallVector<StmtsTy *, 4> QueuesTy;
4366bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
437428499e6f5731e98c15af4fe7ff1f6ff458c2766Argyrios Kyrtzidis  QueuesTy Queues;
438dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
439428499e6f5731e98c15af4fe7ff1f6ff458c2766Argyrios Kyrtzidis  class NewQueueRAII {
4406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    RecursiveASTVisitor &RAV;
4416bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
442428499e6f5731e98c15af4fe7ff1f6ff458c2766Argyrios Kyrtzidis  public:
4436bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    NewQueueRAII(StmtsTy &queue, RecursiveASTVisitor &RAV) : RAV(RAV) {
444428499e6f5731e98c15af4fe7ff1f6ff458c2766Argyrios Kyrtzidis      RAV.Queues.push_back(&queue);
445dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis    }
4466bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    ~NewQueueRAII() { RAV.Queues.pop_back(); }
447428499e6f5731e98c15af4fe7ff1f6ff458c2766Argyrios Kyrtzidis  };
448dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
449428499e6f5731e98c15af4fe7ff1f6ff458c2766Argyrios Kyrtzidis  StmtsTy &getCurrentQueue() {
450428499e6f5731e98c15af4fe7ff1f6ff458c2766Argyrios Kyrtzidis    assert(!Queues.empty() && "base TraverseStmt was never called?");
451428499e6f5731e98c15af4fe7ff1f6ff458c2766Argyrios Kyrtzidis    return *Queues.back();
452dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  }
453dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
454428499e6f5731e98c15af4fe7ff1f6ff458c2766Argyrios Kyrtzidispublic:
455428499e6f5731e98c15af4fe7ff1f6ff458c2766Argyrios Kyrtzidis  class StmtQueueAction {
456428499e6f5731e98c15af4fe7ff1f6ff458c2766Argyrios Kyrtzidis    StmtsTy &CurrQueue;
4576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
458428499e6f5731e98c15af4fe7ff1f6ff458c2766Argyrios Kyrtzidis  public:
4596bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    explicit StmtQueueAction(RecursiveASTVisitor &RAV)
4606bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines        : CurrQueue(RAV.getCurrentQueue()) {}
461428499e6f5731e98c15af4fe7ff1f6ff458c2766Argyrios Kyrtzidis
4626bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    void queue(Stmt *S) { CurrQueue.push_back(S); }
463428499e6f5731e98c15af4fe7ff1f6ff458c2766Argyrios Kyrtzidis  };
464428499e6f5731e98c15af4fe7ff1f6ff458c2766Argyrios Kyrtzidis};
465dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
4666bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#define DISPATCH(NAME, CLASS, VAR)                                             \
4676bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  return getDerived().Traverse##NAME(static_cast<CLASS *>(VAR))
468dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
4696bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate <typename Derived>
4706bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesbool RecursiveASTVisitor<Derived>::TraverseStmt(Stmt *S) {
471dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  if (!S)
472dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis    return true;
473dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
4746bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  StmtsTy Queue, StmtsToEnqueue;
475428499e6f5731e98c15af4fe7ff1f6ff458c2766Argyrios Kyrtzidis  Queue.push_back(S);
4766bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  NewQueueRAII NQ(StmtsToEnqueue, *this);
477428499e6f5731e98c15af4fe7ff1f6ff458c2766Argyrios Kyrtzidis
478428499e6f5731e98c15af4fe7ff1f6ff458c2766Argyrios Kyrtzidis  while (!Queue.empty()) {
479428499e6f5731e98c15af4fe7ff1f6ff458c2766Argyrios Kyrtzidis    S = Queue.pop_back_val();
480428499e6f5731e98c15af4fe7ff1f6ff458c2766Argyrios Kyrtzidis    if (!S)
481428499e6f5731e98c15af4fe7ff1f6ff458c2766Argyrios Kyrtzidis      continue;
482428499e6f5731e98c15af4fe7ff1f6ff458c2766Argyrios Kyrtzidis
4836bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    StmtsToEnqueue.clear();
484dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
4856bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#define DISPATCH_STMT(NAME, CLASS, VAR)                                        \
4866bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(Traverse##NAME(static_cast<CLASS *>(VAR)));                           \
4876bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  break
488dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
489428499e6f5731e98c15af4fe7ff1f6ff458c2766Argyrios Kyrtzidis    // If we have a binary expr, dispatch to the subcode of the binop.  A smart
490428499e6f5731e98c15af4fe7ff1f6ff458c2766Argyrios Kyrtzidis    // optimizer (e.g. LLVM) will fold this comparison into the switch stmt
491428499e6f5731e98c15af4fe7ff1f6ff458c2766Argyrios Kyrtzidis    // below.
492428499e6f5731e98c15af4fe7ff1f6ff458c2766Argyrios Kyrtzidis    if (BinaryOperator *BinOp = dyn_cast<BinaryOperator>(S)) {
493428499e6f5731e98c15af4fe7ff1f6ff458c2766Argyrios Kyrtzidis      switch (BinOp->getOpcode()) {
4946bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#define OPERATOR(NAME)                                                         \
4956bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  case BO_##NAME:                                                              \
4966bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    DISPATCH_STMT(Bin##NAME, BinaryOperator, S);
4976bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
4986bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines        BINOP_LIST()
499dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis#undef OPERATOR
500dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis#undef BINOP_LIST
5016bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
5026bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#define OPERATOR(NAME)                                                         \
5036bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  case BO_##NAME##Assign:                                                      \
5046bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    DISPATCH_STMT(Bin##NAME##Assign, CompoundAssignOperator, S);
5056bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
5066bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines        CAO_LIST()
507dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis#undef OPERATOR
508dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis#undef CAO_LIST
509428499e6f5731e98c15af4fe7ff1f6ff458c2766Argyrios Kyrtzidis      }
510428499e6f5731e98c15af4fe7ff1f6ff458c2766Argyrios Kyrtzidis    } else if (UnaryOperator *UnOp = dyn_cast<UnaryOperator>(S)) {
511428499e6f5731e98c15af4fe7ff1f6ff458c2766Argyrios Kyrtzidis      switch (UnOp->getOpcode()) {
5126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#define OPERATOR(NAME)                                                         \
5136bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  case UO_##NAME:                                                              \
5146bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    DISPATCH_STMT(Unary##NAME, UnaryOperator, S);
5156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
5166bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines        UNARYOP_LIST()
517dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis#undef OPERATOR
518dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis#undef UNARYOP_LIST
519428499e6f5731e98c15af4fe7ff1f6ff458c2766Argyrios Kyrtzidis      }
520428499e6f5731e98c15af4fe7ff1f6ff458c2766Argyrios Kyrtzidis    } else {
5216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
522428499e6f5731e98c15af4fe7ff1f6ff458c2766Argyrios Kyrtzidis      // Top switch stmt: dispatch to TraverseFooStmt for each concrete FooStmt.
523428499e6f5731e98c15af4fe7ff1f6ff458c2766Argyrios Kyrtzidis      switch (S->getStmtClass()) {
5246bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      case Stmt::NoStmtClass:
5256bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines        break;
526dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis#define ABSTRACT_STMT(STMT)
5276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#define STMT(CLASS, PARENT)                                                    \
5286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  case Stmt::CLASS##Class:                                                     \
5296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    DISPATCH_STMT(CLASS, CLASS, S);
530dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis#include "clang/AST/StmtNodes.inc"
531428499e6f5731e98c15af4fe7ff1f6ff458c2766Argyrios Kyrtzidis      }
532428499e6f5731e98c15af4fe7ff1f6ff458c2766Argyrios Kyrtzidis    }
533428499e6f5731e98c15af4fe7ff1f6ff458c2766Argyrios Kyrtzidis
5346bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    for (SmallVectorImpl<Stmt *>::reverse_iterator RI = StmtsToEnqueue.rbegin(),
5356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                                                   RE = StmtsToEnqueue.rend();
5366bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines         RI != RE; ++RI)
537428499e6f5731e98c15af4fe7ff1f6ff458c2766Argyrios Kyrtzidis      Queue.push_back(*RI);
538dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  }
539dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
540dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  return true;
541dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis}
542dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
5436bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#undef DISPATCH_STMT
5446bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
5456bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate <typename Derived>
5466bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesbool RecursiveASTVisitor<Derived>::TraverseType(QualType T) {
547dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  if (T.isNull())
548dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis    return true;
549dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
550dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  switch (T->getTypeClass()) {
551dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis#define ABSTRACT_TYPE(CLASS, BASE)
5526bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#define TYPE(CLASS, BASE)                                                      \
5536bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  case Type::CLASS:                                                            \
5546bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    DISPATCH(CLASS##Type, CLASS##Type, const_cast<Type *>(T.getTypePtr()));
555dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis#include "clang/AST/TypeNodes.def"
556dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  }
557dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
558dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  return true;
559dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis}
560dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
5616bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate <typename Derived>
5626bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesbool RecursiveASTVisitor<Derived>::TraverseTypeLoc(TypeLoc TL) {
563dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  if (TL.isNull())
564dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis    return true;
565dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
566dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  switch (TL.getTypeLocClass()) {
567dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis#define ABSTRACT_TYPELOC(CLASS, BASE)
5686bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#define TYPELOC(CLASS, BASE)                                                   \
5696bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  case TypeLoc::CLASS:                                                         \
57039e6ab4be93d9c5e729a578ddd9d415cd2d49872David Blaikie    return getDerived().Traverse##CLASS##TypeLoc(TL.castAs<CLASS##TypeLoc>());
571dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis#include "clang/AST/TypeLocNodes.def"
572dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  }
573dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
574dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  return true;
575dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis}
576dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
577651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// Define the Traverse*Attr(Attr* A) methods
5786bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#define VISITORCLASS RecursiveASTVisitor
579651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#include "clang/AST/AttrVisitor.inc"
580651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#undef VISITORCLASS
581651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
5826bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate <typename Derived>
5836bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesbool RecursiveASTVisitor<Derived>::TraverseDecl(Decl *D) {
584dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  if (!D)
585dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis    return true;
586dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
587dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  // As a syntax visitor, we want to ignore declarations for
588dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  // implicitly-defined declarations (ones not typed explicitly by the
589dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  // user).
590dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  if (D->isImplicit())
591dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis    return true;
592dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
593dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  switch (D->getKind()) {
594dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis#define ABSTRACT_DECL(DECL)
5956bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#define DECL(CLASS, BASE)                                                      \
5966bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  case Decl::CLASS:                                                            \
5976bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    if (!getDerived().Traverse##CLASS##Decl(static_cast<CLASS##Decl *>(D)))    \
5986bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      return false;                                                            \
599651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    break;
600dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis#include "clang/AST/DeclNodes.inc"
601651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
602dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
603651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // Visit any attributes attached to this declaration.
604651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  for (auto *I : D->attrs()) {
605651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    if (!getDerived().TraverseAttr(I))
606651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      return false;
607651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
608dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  return true;
609dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis}
610dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
611dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis#undef DISPATCH
612dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
6136bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate <typename Derived>
6146bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesbool RecursiveASTVisitor<Derived>::TraverseNestedNameSpecifier(
6156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    NestedNameSpecifier *NNS) {
616dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  if (!NNS)
617dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis    return true;
618dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
619dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  if (NNS->getPrefix())
620dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis    TRY_TO(TraverseNestedNameSpecifier(NNS->getPrefix()));
621dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
622dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  switch (NNS->getKind()) {
623dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  case NestedNameSpecifier::Identifier:
624dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  case NestedNameSpecifier::Namespace:
625dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  case NestedNameSpecifier::NamespaceAlias:
626dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  case NestedNameSpecifier::Global:
627176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  case NestedNameSpecifier::Super:
628dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis    return true;
629dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
630dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  case NestedNameSpecifier::TypeSpec:
631dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  case NestedNameSpecifier::TypeSpecWithTemplate:
632dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis    TRY_TO(TraverseType(QualType(NNS->getAsType(), 0)));
633dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  }
634dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
635dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  return true;
636dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis}
637dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
6386bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate <typename Derived>
6396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesbool RecursiveASTVisitor<Derived>::TraverseNestedNameSpecifierLoc(
6406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    NestedNameSpecifierLoc NNS) {
641dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  if (!NNS)
642dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis    return true;
643dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
6446bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (NestedNameSpecifierLoc Prefix = NNS.getPrefix())
6456bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(TraverseNestedNameSpecifierLoc(Prefix));
646dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
647dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  switch (NNS.getNestedNameSpecifier()->getKind()) {
648dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  case NestedNameSpecifier::Identifier:
649dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  case NestedNameSpecifier::Namespace:
650dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  case NestedNameSpecifier::NamespaceAlias:
651dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  case NestedNameSpecifier::Global:
652176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  case NestedNameSpecifier::Super:
653dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis    return true;
654dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
655dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  case NestedNameSpecifier::TypeSpec:
656dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  case NestedNameSpecifier::TypeSpecWithTemplate:
657dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis    TRY_TO(TraverseTypeLoc(NNS.getTypeLoc()));
658dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis    break;
659dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  }
660dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
661dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  return true;
662dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis}
663dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
6646bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate <typename Derived>
6656bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesbool RecursiveASTVisitor<Derived>::TraverseDeclarationNameInfo(
6666bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    DeclarationNameInfo NameInfo) {
667dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  switch (NameInfo.getName().getNameKind()) {
668dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  case DeclarationName::CXXConstructorName:
669dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  case DeclarationName::CXXDestructorName:
670dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  case DeclarationName::CXXConversionFunctionName:
671dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis    if (TypeSourceInfo *TSInfo = NameInfo.getNamedTypeInfo())
672dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis      TRY_TO(TraverseTypeLoc(TSInfo->getTypeLoc()));
673dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
674dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis    break;
675dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
676dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  case DeclarationName::Identifier:
677dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  case DeclarationName::ObjCZeroArgSelector:
678dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  case DeclarationName::ObjCOneArgSelector:
679dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  case DeclarationName::ObjCMultiArgSelector:
680dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  case DeclarationName::CXXOperatorName:
681dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  case DeclarationName::CXXLiteralOperatorName:
682dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  case DeclarationName::CXXUsingDirective:
683dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis    break;
684dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  }
685dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
686dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  return true;
687dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis}
688dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
6896bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate <typename Derived>
6906bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesbool RecursiveASTVisitor<Derived>::TraverseTemplateName(TemplateName Template) {
691dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  if (DependentTemplateName *DTN = Template.getAsDependentTemplateName())
692dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis    TRY_TO(TraverseNestedNameSpecifier(DTN->getQualifier()));
693dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  else if (QualifiedTemplateName *QTN = Template.getAsQualifiedTemplateName())
694dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis    TRY_TO(TraverseNestedNameSpecifier(QTN->getQualifier()));
695dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
696dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  return true;
697dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis}
698dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
6996bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate <typename Derived>
7006bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesbool RecursiveASTVisitor<Derived>::TraverseTemplateArgument(
7016bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    const TemplateArgument &Arg) {
702dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  switch (Arg.getKind()) {
703dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  case TemplateArgument::Null:
704dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  case TemplateArgument::Declaration:
705dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  case TemplateArgument::Integral:
706d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman  case TemplateArgument::NullPtr:
707dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis    return true;
708dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
709dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  case TemplateArgument::Type:
710dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis    return getDerived().TraverseType(Arg.getAsType());
711dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
712dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  case TemplateArgument::Template:
713dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  case TemplateArgument::TemplateExpansion:
714dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis    return getDerived().TraverseTemplateName(
7156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines        Arg.getAsTemplateOrTemplatePattern());
716dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
717dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  case TemplateArgument::Expression:
718dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis    return getDerived().TraverseStmt(Arg.getAsExpr());
719dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
720dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  case TemplateArgument::Pack:
721dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis    return getDerived().TraverseTemplateArguments(Arg.pack_begin(),
722dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis                                                  Arg.pack_size());
723dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  }
724dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
725dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  return true;
726dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis}
727dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
728dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis// FIXME: no template name location?
729dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis// FIXME: no source locations for a template argument pack?
7306bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate <typename Derived>
7316bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesbool RecursiveASTVisitor<Derived>::TraverseTemplateArgumentLoc(
7326bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    const TemplateArgumentLoc &ArgLoc) {
733dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  const TemplateArgument &Arg = ArgLoc.getArgument();
734dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
735dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  switch (Arg.getKind()) {
736dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  case TemplateArgument::Null:
737dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  case TemplateArgument::Declaration:
738dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  case TemplateArgument::Integral:
739d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman  case TemplateArgument::NullPtr:
740dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis    return true;
741dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
742dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  case TemplateArgument::Type: {
743dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis    // FIXME: how can TSI ever be NULL?
744dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis    if (TypeSourceInfo *TSI = ArgLoc.getTypeSourceInfo())
745dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis      return getDerived().TraverseTypeLoc(TSI->getTypeLoc());
746dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis    else
747dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis      return getDerived().TraverseType(Arg.getAsType());
748dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  }
749dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
750dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  case TemplateArgument::Template:
751dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  case TemplateArgument::TemplateExpansion:
752dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis    if (ArgLoc.getTemplateQualifierLoc())
753dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis      TRY_TO(getDerived().TraverseNestedNameSpecifierLoc(
7546bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines          ArgLoc.getTemplateQualifierLoc()));
755dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis    return getDerived().TraverseTemplateName(
7566bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines        Arg.getAsTemplateOrTemplatePattern());
757dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
758dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  case TemplateArgument::Expression:
759dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis    return getDerived().TraverseStmt(ArgLoc.getSourceExpression());
760dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
761dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  case TemplateArgument::Pack:
762dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis    return getDerived().TraverseTemplateArguments(Arg.pack_begin(),
763dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis                                                  Arg.pack_size());
764dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  }
765dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
766dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  return true;
767dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis}
768dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
7696bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate <typename Derived>
7706bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesbool RecursiveASTVisitor<Derived>::TraverseTemplateArguments(
7716bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    const TemplateArgument *Args, unsigned NumArgs) {
772dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  for (unsigned I = 0; I != NumArgs; ++I) {
773dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis    TRY_TO(TraverseTemplateArgument(Args[I]));
774dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  }
775dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
776dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  return true;
777dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis}
778dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
7796bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate <typename Derived>
7806bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesbool RecursiveASTVisitor<Derived>::TraverseConstructorInitializer(
7816bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    CXXCtorInitializer *Init) {
782dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  if (TypeSourceInfo *TInfo = Init->getTypeSourceInfo())
783dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis    TRY_TO(TraverseTypeLoc(TInfo->getTypeLoc()));
784dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
785dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  if (Init->isWritten())
786dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis    TRY_TO(TraverseStmt(Init->getInit()));
787dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  return true;
788dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis}
789dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
7906bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate <typename Derived>
7916bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesbool
7926bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesRecursiveASTVisitor<Derived>::TraverseLambdaCapture(LambdaExpr *LE,
7936bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                                                    const LambdaCapture *C) {
7946bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (C->isInitCapture())
7956bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(TraverseDecl(C->getCapturedVar()));
7966bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  return true;
7976bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}
7986bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
7996bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate <typename Derived>
8006bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesbool RecursiveASTVisitor<Derived>::TraverseLambdaBody(LambdaExpr *LE) {
8016bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  StmtQueueAction StmtQueue(*this);
8026bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  StmtQueue.queue(LE->getBody());
803dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  return true;
804dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis}
805dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
806dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis// ----------------- Type traversal -----------------
807dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
808dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis// This macro makes available a variable T, the passed-in type.
8096bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#define DEF_TRAVERSE_TYPE(TYPE, CODE)                                          \
8106bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  template <typename Derived>                                                  \
8116bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  bool RecursiveASTVisitor<Derived>::Traverse##TYPE(TYPE *T) {                 \
8126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(WalkUpFrom##TYPE(T));                                               \
8136bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    { CODE; }                                                                  \
8146bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    return true;                                                               \
815dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  }
816dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
8176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPE(BuiltinType, {})
818dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
8196bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPE(ComplexType, { TRY_TO(TraverseType(T->getElementType())); })
820dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
8216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPE(PointerType, { TRY_TO(TraverseType(T->getPointeeType())); })
822dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
8236bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPE(BlockPointerType,
8246bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                  { TRY_TO(TraverseType(T->getPointeeType())); })
825dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
8266bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPE(LValueReferenceType,
8276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                  { TRY_TO(TraverseType(T->getPointeeType())); })
828dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
8296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPE(RValueReferenceType,
8306bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                  { TRY_TO(TraverseType(T->getPointeeType())); })
831dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
832dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios KyrtzidisDEF_TRAVERSE_TYPE(MemberPointerType, {
8336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseType(QualType(T->getClass(), 0)));
8346bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseType(T->getPointeeType()));
8356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
836dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
8376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPE(AdjustedType, { TRY_TO(TraverseType(T->getOriginalType())); })
83812df246d6dea2ee1f92c186f922f1afcf499647aReid Kleckner
8396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPE(DecayedType, { TRY_TO(TraverseType(T->getOriginalType())); })
840651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
8416bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPE(ConstantArrayType,
8426bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                  { TRY_TO(TraverseType(T->getElementType())); })
843dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
8446bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPE(IncompleteArrayType,
8456bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                  { TRY_TO(TraverseType(T->getElementType())); })
846dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
847dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios KyrtzidisDEF_TRAVERSE_TYPE(VariableArrayType, {
8486bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseType(T->getElementType()));
8496bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseStmt(T->getSizeExpr()));
8506bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
851dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
852dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios KyrtzidisDEF_TRAVERSE_TYPE(DependentSizedArrayType, {
8536bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseType(T->getElementType()));
8546bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (T->getSizeExpr())
8556bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(TraverseStmt(T->getSizeExpr()));
8566bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
857dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
858dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios KyrtzidisDEF_TRAVERSE_TYPE(DependentSizedExtVectorType, {
8596bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (T->getSizeExpr())
8606bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(TraverseStmt(T->getSizeExpr()));
8616bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseType(T->getElementType()));
8626bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
863dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
8646bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPE(VectorType, { TRY_TO(TraverseType(T->getElementType())); })
865dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
8666bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPE(ExtVectorType, { TRY_TO(TraverseType(T->getElementType())); })
867dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
868651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesDEF_TRAVERSE_TYPE(FunctionNoProtoType,
869651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                  { TRY_TO(TraverseType(T->getReturnType())); })
870dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
871dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios KyrtzidisDEF_TRAVERSE_TYPE(FunctionProtoType, {
872651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  TRY_TO(TraverseType(T->getReturnType()));
873dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
874651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  for (const auto &A : T->param_types()) {
875651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    TRY_TO(TraverseType(A));
876651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
877dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
878651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  for (const auto &E : T->exceptions()) {
879651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    TRY_TO(TraverseType(E));
880651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
881176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
882176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  if (Expr *NE = T->getNoexceptExpr())
883176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    TRY_TO(TraverseStmt(NE));
884651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines})
885dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
8866bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPE(UnresolvedUsingType, {})
8876bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPE(TypedefType, {})
888dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
8896bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPE(TypeOfExprType,
8906bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                  { TRY_TO(TraverseStmt(T->getUnderlyingExpr())); })
891dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
8926bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPE(TypeOfType, { TRY_TO(TraverseType(T->getUnderlyingType())); })
893dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
8946bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPE(DecltypeType,
8956bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                  { TRY_TO(TraverseStmt(T->getUnderlyingExpr())); })
896dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
897dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios KyrtzidisDEF_TRAVERSE_TYPE(UnaryTransformType, {
8986bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseType(T->getBaseType()));
8996bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseType(T->getUnderlyingType()));
9006bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
901dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
9026bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPE(AutoType, { TRY_TO(TraverseType(T->getDeducedType())); })
903dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
9046bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPE(RecordType, {})
9056bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPE(EnumType, {})
9066bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPE(TemplateTypeParmType, {})
9076bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPE(SubstTemplateTypeParmType, {})
9086bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPE(SubstTemplateTypeParmPackType, {})
909dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
910dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios KyrtzidisDEF_TRAVERSE_TYPE(TemplateSpecializationType, {
9116bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseTemplateName(T->getTemplateName()));
9126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseTemplateArguments(T->getArgs(), T->getNumArgs()));
9136bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
914dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
9156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPE(InjectedClassNameType, {})
916dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
9176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPE(AttributedType,
9186bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                  { TRY_TO(TraverseType(T->getModifiedType())); })
919dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
9206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPE(ParenType, { TRY_TO(TraverseType(T->getInnerType())); })
921dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
922dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios KyrtzidisDEF_TRAVERSE_TYPE(ElaboratedType, {
9236bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (T->getQualifier()) {
924dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis    TRY_TO(TraverseNestedNameSpecifier(T->getQualifier()));
9256bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  }
9266bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseType(T->getNamedType()));
9276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
9286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
9296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPE(DependentNameType,
9306bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                  { TRY_TO(TraverseNestedNameSpecifier(T->getQualifier())); })
931dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
932dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios KyrtzidisDEF_TRAVERSE_TYPE(DependentTemplateSpecializationType, {
9336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseNestedNameSpecifier(T->getQualifier()));
9346bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseTemplateArguments(T->getArgs(), T->getNumArgs()));
9356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
936dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
9376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPE(PackExpansionType, { TRY_TO(TraverseType(T->getPattern())); })
938dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
9396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPE(ObjCInterfaceType, {})
940dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
941dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios KyrtzidisDEF_TRAVERSE_TYPE(ObjCObjectType, {
9426bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // We have to watch out here because an ObjCInterfaceType's base
9436bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // type is itself.
9446bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (T->getBaseType().getTypePtr() != T)
9456bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(TraverseType(T->getBaseType()));
9466bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
947dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
9486bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPE(ObjCObjectPointerType,
9496bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                  { TRY_TO(TraverseType(T->getPointeeType())); })
950dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
9516bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPE(AtomicType, { TRY_TO(TraverseType(T->getValueType())); })
952dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
953dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis#undef DEF_TRAVERSE_TYPE
954dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
955dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis// ----------------- TypeLoc traversal -----------------
956dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
957dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis// This macro makes available a variable TL, the passed-in TypeLoc.
958dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis// If requested, it calls WalkUpFrom* for the Type in the given TypeLoc,
959dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis// in addition to WalkUpFrom* for the TypeLoc itself, such that existing
960dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis// clients that override the WalkUpFrom*Type() and/or Visit*Type() methods
961dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis// continue to work.
9626bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#define DEF_TRAVERSE_TYPELOC(TYPE, CODE)                                       \
9636bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  template <typename Derived>                                                  \
9646bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  bool RecursiveASTVisitor<Derived>::Traverse##TYPE##Loc(TYPE##Loc TL) {       \
9656bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    if (getDerived().shouldWalkTypesOfTypeLocs())                              \
9666bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      TRY_TO(WalkUpFrom##TYPE(const_cast<TYPE *>(TL.getTypePtr())));           \
9676bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(WalkUpFrom##TYPE##Loc(TL));                                         \
9686bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    { CODE; }                                                                  \
9696bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    return true;                                                               \
970dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  }
971dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
9726bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate <typename Derived>
9736bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesbool
9746bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesRecursiveASTVisitor<Derived>::TraverseQualifiedTypeLoc(QualifiedTypeLoc TL) {
975dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  // Move this over to the 'main' typeloc tree.  Note that this is a
976dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  // move -- we pretend that we were really looking at the unqualified
977dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  // typeloc all along -- rather than a recursion, so we don't follow
978dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  // the normal CRTP plan of going through
979dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  // getDerived().TraverseTypeLoc.  If we did, we'd be traversing
980dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  // twice for the same type (once as a QualifiedTypeLoc version of
981dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  // the type, once as an UnqualifiedTypeLoc version of the type),
982dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  // which in effect means we'd call VisitTypeLoc twice with the
983dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  // 'same' type.  This solves that problem, at the cost of never
984dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  // seeing the qualified version of the type (unless the client
985dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  // subclasses TraverseQualifiedTypeLoc themselves).  It's not a
986dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  // perfect solution.  A perfect solution probably requires making
987dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  // QualifiedTypeLoc a wrapper around TypeLoc -- like QualType is a
988dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  // wrapper around Type* -- rather than being its own class in the
989dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  // type hierarchy.
990dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  return TraverseTypeLoc(TL.getUnqualifiedLoc());
991dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis}
992dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
9936bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPELOC(BuiltinType, {})
994dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
995dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis// FIXME: ComplexTypeLoc is unfinished
996dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios KyrtzidisDEF_TRAVERSE_TYPELOC(ComplexType, {
9976bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseType(TL.getTypePtr()->getElementType()));
9986bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
999dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
10006bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPELOC(PointerType,
10016bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                     { TRY_TO(TraverseTypeLoc(TL.getPointeeLoc())); })
1002dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
10036bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPELOC(BlockPointerType,
10046bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                     { TRY_TO(TraverseTypeLoc(TL.getPointeeLoc())); })
1005dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
10066bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPELOC(LValueReferenceType,
10076bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                     { TRY_TO(TraverseTypeLoc(TL.getPointeeLoc())); })
1008dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
10096bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPELOC(RValueReferenceType,
10106bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                     { TRY_TO(TraverseTypeLoc(TL.getPointeeLoc())); })
1011dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
1012dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis// FIXME: location of base class?
1013dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis// We traverse this in the type case as well, but how is it not reached through
1014dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis// the pointee type?
1015dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios KyrtzidisDEF_TRAVERSE_TYPELOC(MemberPointerType, {
10166bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseType(QualType(TL.getTypePtr()->getClass(), 0)));
10176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseTypeLoc(TL.getPointeeLoc()));
10186bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
1019dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
10206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPELOC(AdjustedType,
10216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                     { TRY_TO(TraverseTypeLoc(TL.getOriginalLoc())); })
102212df246d6dea2ee1f92c186f922f1afcf499647aReid Kleckner
10236bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPELOC(DecayedType,
10246bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                     { TRY_TO(TraverseTypeLoc(TL.getOriginalLoc())); })
1025651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
10266bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate <typename Derived>
10276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesbool RecursiveASTVisitor<Derived>::TraverseArrayTypeLocHelper(ArrayTypeLoc TL) {
1028dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  // This isn't available for ArrayType, but is for the ArrayTypeLoc.
1029dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  TRY_TO(TraverseStmt(TL.getSizeExpr()));
1030dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  return true;
1031dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis}
1032dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
1033dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios KyrtzidisDEF_TRAVERSE_TYPELOC(ConstantArrayType, {
10346bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseTypeLoc(TL.getElementLoc()));
10356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  return TraverseArrayTypeLocHelper(TL);
10366bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
1037dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
1038dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios KyrtzidisDEF_TRAVERSE_TYPELOC(IncompleteArrayType, {
10396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseTypeLoc(TL.getElementLoc()));
10406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  return TraverseArrayTypeLocHelper(TL);
10416bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
1042dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
1043dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios KyrtzidisDEF_TRAVERSE_TYPELOC(VariableArrayType, {
10446bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseTypeLoc(TL.getElementLoc()));
10456bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  return TraverseArrayTypeLocHelper(TL);
10466bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
1047dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
1048dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios KyrtzidisDEF_TRAVERSE_TYPELOC(DependentSizedArrayType, {
10496bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseTypeLoc(TL.getElementLoc()));
10506bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  return TraverseArrayTypeLocHelper(TL);
10516bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
1052dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
1053dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis// FIXME: order? why not size expr first?
1054dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis// FIXME: base VectorTypeLoc is unfinished
1055dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios KyrtzidisDEF_TRAVERSE_TYPELOC(DependentSizedExtVectorType, {
10566bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (TL.getTypePtr()->getSizeExpr())
10576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(TraverseStmt(TL.getTypePtr()->getSizeExpr()));
10586bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseType(TL.getTypePtr()->getElementType()));
10596bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
1060dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
1061dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis// FIXME: VectorTypeLoc is unfinished
1062dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios KyrtzidisDEF_TRAVERSE_TYPELOC(VectorType, {
10636bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseType(TL.getTypePtr()->getElementType()));
10646bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
1065dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
1066dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis// FIXME: size and attributes
1067dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis// FIXME: base VectorTypeLoc is unfinished
1068dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios KyrtzidisDEF_TRAVERSE_TYPELOC(ExtVectorType, {
10696bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseType(TL.getTypePtr()->getElementType()));
10706bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
1071dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
10726bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPELOC(FunctionNoProtoType,
10736bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                     { TRY_TO(TraverseTypeLoc(TL.getReturnLoc())); })
1074dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
1075dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis// FIXME: location of exception specifications (attributes?)
1076dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios KyrtzidisDEF_TRAVERSE_TYPELOC(FunctionProtoType, {
10776bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseTypeLoc(TL.getReturnLoc()));
1078dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
10796bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  const FunctionProtoType *T = TL.getTypePtr();
1080dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
10816bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  for (unsigned I = 0, E = TL.getNumParams(); I != E; ++I) {
10826bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    if (TL.getParam(I)) {
10836bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      TRY_TO(TraverseDecl(TL.getParam(I)));
10846bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    } else if (I < T->getNumParams()) {
10856bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      TRY_TO(TraverseType(T->getParamType(I)));
1086dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis    }
10876bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  }
1088dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
10896bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  for (const auto &E : T->exceptions()) {
10906bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(TraverseType(E));
10916bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  }
1092176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
1093176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  if (Expr *NE = T->getNoexceptExpr())
1094176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    TRY_TO(TraverseStmt(NE));
10956bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
1096dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
10976bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPELOC(UnresolvedUsingType, {})
10986bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPELOC(TypedefType, {})
1099dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
11006bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPELOC(TypeOfExprType,
11016bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                     { TRY_TO(TraverseStmt(TL.getUnderlyingExpr())); })
1102dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
1103dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios KyrtzidisDEF_TRAVERSE_TYPELOC(TypeOfType, {
11046bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseTypeLoc(TL.getUnderlyingTInfo()->getTypeLoc()));
11056bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
1106dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
1107dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis// FIXME: location of underlying expr
1108dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios KyrtzidisDEF_TRAVERSE_TYPELOC(DecltypeType, {
11096bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseStmt(TL.getTypePtr()->getUnderlyingExpr()));
11106bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
1111dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
1112dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios KyrtzidisDEF_TRAVERSE_TYPELOC(UnaryTransformType, {
11136bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseTypeLoc(TL.getUnderlyingTInfo()->getTypeLoc()));
11146bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
1115dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
1116dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios KyrtzidisDEF_TRAVERSE_TYPELOC(AutoType, {
11176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseType(TL.getTypePtr()->getDeducedType()));
11186bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
1119dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
11206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPELOC(RecordType, {})
11216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPELOC(EnumType, {})
11226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPELOC(TemplateTypeParmType, {})
11236bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPELOC(SubstTemplateTypeParmType, {})
11246bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPELOC(SubstTemplateTypeParmPackType, {})
1125dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
1126dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis// FIXME: use the loc for the template name?
1127dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios KyrtzidisDEF_TRAVERSE_TYPELOC(TemplateSpecializationType, {
11286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseTemplateName(TL.getTypePtr()->getTemplateName()));
11296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  for (unsigned I = 0, E = TL.getNumArgs(); I != E; ++I) {
11306bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(TraverseTemplateArgumentLoc(TL.getArgLoc(I)));
11316bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  }
11326bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
1133dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
11346bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPELOC(InjectedClassNameType, {})
1135dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
11366bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPELOC(ParenType, { TRY_TO(TraverseTypeLoc(TL.getInnerLoc())); })
1137dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
11386bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPELOC(AttributedType,
11396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                     { TRY_TO(TraverseTypeLoc(TL.getModifiedLoc())); })
1140dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
1141dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios KyrtzidisDEF_TRAVERSE_TYPELOC(ElaboratedType, {
11426bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (TL.getQualifierLoc()) {
11436bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(TraverseNestedNameSpecifierLoc(TL.getQualifierLoc()));
11446bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  }
11456bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseTypeLoc(TL.getNamedTypeLoc()));
11466bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
1147dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
1148dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios KyrtzidisDEF_TRAVERSE_TYPELOC(DependentNameType, {
11496bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseNestedNameSpecifierLoc(TL.getQualifierLoc()));
11506bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
1151dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
1152dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios KyrtzidisDEF_TRAVERSE_TYPELOC(DependentTemplateSpecializationType, {
11536bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (TL.getQualifierLoc()) {
11546bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(TraverseNestedNameSpecifierLoc(TL.getQualifierLoc()));
11556bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  }
1156dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
11576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  for (unsigned I = 0, E = TL.getNumArgs(); I != E; ++I) {
11586bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(TraverseTemplateArgumentLoc(TL.getArgLoc(I)));
11596bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  }
11606bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
1161dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
11626bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPELOC(PackExpansionType,
11636bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                     { TRY_TO(TraverseTypeLoc(TL.getPatternLoc())); })
1164dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
11656bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPELOC(ObjCInterfaceType, {})
1166dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
1167dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios KyrtzidisDEF_TRAVERSE_TYPELOC(ObjCObjectType, {
11686bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // We have to watch out here because an ObjCInterfaceType's base
11696bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // type is itself.
11706bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (TL.getTypePtr()->getBaseType().getTypePtr() != TL.getTypePtr())
11716bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(TraverseTypeLoc(TL.getBaseLoc()));
11726bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
1173dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
11746bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPELOC(ObjCObjectPointerType,
11756bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                     { TRY_TO(TraverseTypeLoc(TL.getPointeeLoc())); })
1176dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
11776bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPELOC(AtomicType, { TRY_TO(TraverseTypeLoc(TL.getValueLoc())); })
1178dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
1179dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis#undef DEF_TRAVERSE_TYPELOC
1180dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
1181dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis// ----------------- Decl traversal -----------------
1182dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis//
1183dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis// For a Decl, we automate (in the DEF_TRAVERSE_DECL macro) traversing
1184dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis// the children that come from the DeclContext associated with it.
1185dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis// Therefore each Traverse* only needs to worry about children other
1186dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis// than those.
1187dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
11886bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate <typename Derived>
11896bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesbool RecursiveASTVisitor<Derived>::TraverseDeclContextHelper(DeclContext *DC) {
1190dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  if (!DC)
1191dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis    return true;
1192dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
1193651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  for (auto *Child : DC->decls()) {
11946afcf8875d4e447645cd7bf3733dd8e2eb8455dcTareq A. Siraj    // BlockDecls and CapturedDecls are traversed through BlockExprs and
11956afcf8875d4e447645cd7bf3733dd8e2eb8455dcTareq A. Siraj    // CapturedStmts respectively.
1196651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    if (!isa<BlockDecl>(Child) && !isa<CapturedDecl>(Child))
1197651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      TRY_TO(TraverseDecl(Child));
1198dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  }
1199dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
1200dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  return true;
1201dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis}
1202dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
1203dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis// This macro makes available a variable D, the passed-in decl.
12046bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#define DEF_TRAVERSE_DECL(DECL, CODE)                                          \
12056bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  template <typename Derived>                                                  \
12066bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  bool RecursiveASTVisitor<Derived>::Traverse##DECL(DECL *D) {                 \
12076bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(WalkUpFrom##DECL(D));                                               \
12086bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    { CODE; }                                                                  \
12096bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(TraverseDeclContextHelper(dyn_cast<DeclContext>(D)));               \
12106bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    return true;                                                               \
12116bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  }
1212dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
12136bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_DECL(AccessSpecDecl, {})
1214dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
1215dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios KyrtzidisDEF_TRAVERSE_DECL(BlockDecl, {
12166bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (TypeSourceInfo *TInfo = D->getSignatureAsWritten())
12176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(TraverseTypeLoc(TInfo->getTypeLoc()));
12186bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseStmt(D->getBody()));
1219c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  for (const auto &I : D->captures()) {
1220c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    if (I.hasCopyExpr()) {
1221c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines      TRY_TO(TraverseStmt(I.getCopyExpr()));
1222c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    }
1223c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  }
12246bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // This return statement makes sure the traversal of nodes in
12256bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // decls_begin()/decls_end() (done in the DEF_TRAVERSE_DECL macro)
12266bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // is skipped - don't remove it.
12276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  return true;
12286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
1229dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
12306afcf8875d4e447645cd7bf3733dd8e2eb8455dcTareq A. SirajDEF_TRAVERSE_DECL(CapturedDecl, {
12316bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseStmt(D->getBody()));
12326bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // This return statement makes sure the traversal of nodes in
12336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // decls_begin()/decls_end() (done in the DEF_TRAVERSE_DECL macro)
12346bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // is skipped - don't remove it.
12356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  return true;
12366bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
12376afcf8875d4e447645cd7bf3733dd8e2eb8455dcTareq A. Siraj
12386bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_DECL(EmptyDecl, {})
1239684aa73192d92850a926870be62a1787eb5b7ed9Michael Han
12406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_DECL(FileScopeAsmDecl,
12416bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                  { TRY_TO(TraverseStmt(D->getAsmString())); })
1242dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
12436bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_DECL(ImportDecl, {})
1244dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
1245dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios KyrtzidisDEF_TRAVERSE_DECL(FriendDecl, {
12466bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // Friend is either decl or a type.
12476bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (D->getFriendType())
12486bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(TraverseTypeLoc(D->getFriendType()->getTypeLoc()));
12496bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  else
12506bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(TraverseDecl(D->getFriendDecl()));
12516bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
1252dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
1253dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios KyrtzidisDEF_TRAVERSE_DECL(FriendTemplateDecl, {
12546bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (D->getFriendType())
12556bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(TraverseTypeLoc(D->getFriendType()->getTypeLoc()));
12566bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  else
12576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(TraverseDecl(D->getFriendDecl()));
12586bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  for (unsigned I = 0, E = D->getNumTemplateParameters(); I < E; ++I) {
12596bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TemplateParameterList *TPL = D->getTemplateParameterList(I);
12606bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    for (TemplateParameterList::iterator ITPL = TPL->begin(), ETPL = TPL->end();
12616bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines         ITPL != ETPL; ++ITPL) {
12626bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      TRY_TO(TraverseDecl(*ITPL));
1263dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis    }
12646bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  }
12656bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
1266dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
12676bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_DECL(ClassScopeFunctionSpecializationDecl,
12686bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                  { TRY_TO(TraverseDecl(D->getSpecialization())); })
1269dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
12706bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_DECL(LinkageSpecDecl, {})
1271dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
12726bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_DECL(ObjCPropertyImplDecl, {// FIXME: implement this
12736bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                                        })
1274dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
1275dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios KyrtzidisDEF_TRAVERSE_DECL(StaticAssertDecl, {
12766bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseStmt(D->getAssertExpr()));
12776bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseStmt(D->getMessage()));
12786bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
1279dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
12806bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_DECL(
12816bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TranslationUnitDecl,
12826bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    {// Code in an unnamed namespace shows up automatically in
12836bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines     // decls_begin()/decls_end().  Thus we don't need to recurse on
12846bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines     // D->getAnonymousNamespace().
12856bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    })
1286dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
12873ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga NainarDEF_TRAVERSE_DECL(ExternCContextDecl, {})
12883ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar
1289dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios KyrtzidisDEF_TRAVERSE_DECL(NamespaceAliasDecl, {
12906bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // We shouldn't traverse an aliased namespace, since it will be
12916bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // defined (and, therefore, traversed) somewhere else.
12926bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  //
12936bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // This return statement makes sure the traversal of nodes in
12946bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // decls_begin()/decls_end() (done in the DEF_TRAVERSE_DECL macro)
12956bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // is skipped - don't remove it.
12966bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  return true;
1297dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis})
1298dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
12996bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_DECL(LabelDecl, {// There is no code in a LabelDecl.
13006bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                             })
1301dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
13026bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_DECL(
13036bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    NamespaceDecl,
13046bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    {// Code in an unnamed namespace shows up automatically in
13056bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines     // decls_begin()/decls_end().  Thus we don't need to recurse on
13066bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines     // D->getAnonymousNamespace().
13076bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    })
1308dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
13096bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_DECL(ObjCCompatibleAliasDecl, {// FIXME: implement
13106bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                                           })
1311dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
13126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_DECL(ObjCCategoryDecl, {// FIXME: implement
13136bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                                    })
1314dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
13156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_DECL(ObjCCategoryImplDecl, {// FIXME: implement
13166bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                                        })
1317dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
13186bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_DECL(ObjCImplementationDecl, {// FIXME: implement
13196bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                                          })
1320dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
13216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_DECL(ObjCInterfaceDecl, {// FIXME: implement
13226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                                     })
1323dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
13246bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_DECL(ObjCProtocolDecl, {// FIXME: implement
13256bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                                    })
1326dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
1327dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios KyrtzidisDEF_TRAVERSE_DECL(ObjCMethodDecl, {
1328651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (D->getReturnTypeSourceInfo()) {
1329651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    TRY_TO(TraverseTypeLoc(D->getReturnTypeSourceInfo()->getTypeLoc()));
1330651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
1331651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  for (ObjCMethodDecl::param_iterator I = D->param_begin(), E = D->param_end();
1332651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines       I != E; ++I) {
1333651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    TRY_TO(TraverseDecl(*I));
1334651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
1335651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (D->isThisDeclarationADefinition()) {
1336651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    TRY_TO(TraverseStmt(D->getBody()));
1337651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
1338651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return true;
1339651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines})
1340dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
1341c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen HinesDEF_TRAVERSE_DECL(ObjCPropertyDecl, {
1342c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  if (D->getTypeSourceInfo())
1343c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    TRY_TO(TraverseTypeLoc(D->getTypeSourceInfo()->getTypeLoc()));
1344c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  else
1345c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    TRY_TO(TraverseType(D->getType()));
1346c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  return true;
1347c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines})
1348dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
1349dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios KyrtzidisDEF_TRAVERSE_DECL(UsingDecl, {
13506bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseNestedNameSpecifierLoc(D->getQualifierLoc()));
13516bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseDeclarationNameInfo(D->getNameInfo()));
13526bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
1353dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
1354dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios KyrtzidisDEF_TRAVERSE_DECL(UsingDirectiveDecl, {
13556bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseNestedNameSpecifierLoc(D->getQualifierLoc()));
13566bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
1357dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
13586bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_DECL(UsingShadowDecl, {})
1359dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
1360c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey BataevDEF_TRAVERSE_DECL(OMPThreadPrivateDecl, {
13616bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  for (auto *I : D->varlists()) {
13626bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(TraverseStmt(I));
13636bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  }
13646bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
1365c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev
1366dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis// A helper method for TemplateDecl's children.
13676bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate <typename Derived>
13686bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesbool RecursiveASTVisitor<Derived>::TraverseTemplateParameterListHelper(
1369dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis    TemplateParameterList *TPL) {
1370dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  if (TPL) {
1371dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis    for (TemplateParameterList::iterator I = TPL->begin(), E = TPL->end();
1372dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis         I != E; ++I) {
1373dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis      TRY_TO(TraverseDecl(*I));
1374dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis    }
1375dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  }
1376dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  return true;
1377dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis}
1378dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
1379dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis// A helper method for traversing the implicit instantiations of a
1380428499e6f5731e98c15af4fe7ff1f6ff458c2766Argyrios Kyrtzidis// class template.
13816bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate <typename Derived>
13826bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesbool RecursiveASTVisitor<Derived>::TraverseClassInstantiations(
1383428499e6f5731e98c15af4fe7ff1f6ff458c2766Argyrios Kyrtzidis    ClassTemplateDecl *D) {
1384651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  for (auto *SD : D->specializations()) {
1385651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    for (auto *RD : SD->redecls()) {
1386651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      // We don't want to visit injected-class-names in this traversal.
1387651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      if (cast<CXXRecordDecl>(RD)->isInjectedClassName())
1388651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        continue;
1389651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
13906bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      switch (
13916bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines          cast<ClassTemplateSpecializationDecl>(RD)->getSpecializationKind()) {
1392651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      // Visit the implicit instantiations with the requested pattern.
1393651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      case TSK_Undeclared:
1394651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      case TSK_ImplicitInstantiation:
1395651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        TRY_TO(TraverseDecl(RD));
1396651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        break;
1397651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1398651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      // We don't need to do anything on an explicit instantiation
1399651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      // or explicit specialization because there will be an explicit
1400651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      // node for it elsewhere.
1401651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      case TSK_ExplicitInstantiationDeclaration:
1402651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      case TSK_ExplicitInstantiationDefinition:
1403651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      case TSK_ExplicitSpecialization:
1404651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        break;
1405651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      }
1406dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis    }
1407dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  }
1408dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
1409dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  return true;
1410dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis}
1411dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
1412dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios KyrtzidisDEF_TRAVERSE_DECL(ClassTemplateDecl, {
14136bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  CXXRecordDecl *TempDecl = D->getTemplatedDecl();
14146bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseDecl(TempDecl));
14156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseTemplateParameterListHelper(D->getTemplateParameters()));
14166bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
14176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // By default, we do not traverse the instantiations of
14186bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // class templates since they do not appear in the user code. The
14196bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // following code optionally traverses them.
14206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  //
14216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // We only traverse the class instantiations when we see the canonical
14226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // declaration of the template, to ensure we only visit them once.
14236bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (getDerived().shouldVisitTemplateInstantiations() &&
14246bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      D == D->getCanonicalDecl())
14256bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(TraverseClassInstantiations(D));
14266bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
14276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // Note that getInstantiatedFromMemberTemplate() is just a link
14286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // from a template instantiation back to the template from which
14296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // it was instantiated, and thus should not be traversed.
14306bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
1431dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
1432ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo// A helper method for traversing the implicit instantiations of a
1433ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo// class template.
1434ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufotemplate <typename Derived>
14356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesbool RecursiveASTVisitor<Derived>::TraverseVariableInstantiations(
1436ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    VarTemplateDecl *D) {
1437651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  for (auto *SD : D->specializations()) {
1438651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    for (auto *RD : SD->redecls()) {
14396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      switch (
14406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines          cast<VarTemplateSpecializationDecl>(RD)->getSpecializationKind()) {
1441651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      // Visit the implicit instantiations with the requested pattern.
1442651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      case TSK_Undeclared:
1443651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      case TSK_ImplicitInstantiation:
1444651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        TRY_TO(TraverseDecl(RD));
1445651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        break;
1446651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1447651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      // We don't need to do anything on an explicit instantiation
1448651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      // or explicit specialization because there will be an explicit
1449651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      // node for it elsewhere.
1450651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      case TSK_ExplicitInstantiationDeclaration:
1451651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      case TSK_ExplicitInstantiationDefinition:
1452651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      case TSK_ExplicitSpecialization:
1453651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        break;
1454651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      }
1455ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    }
1456ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  }
1457ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
1458ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  return true;
1459ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo}
1460ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
14616bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_DECL(VarTemplateDecl, {
1462ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  VarDecl *TempDecl = D->getTemplatedDecl();
1463ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  TRY_TO(TraverseDecl(TempDecl));
1464ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  TRY_TO(TraverseTemplateParameterListHelper(D->getTemplateParameters()));
1465ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
1466ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  // By default, we do not traverse the instantiations of
1467ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  // variable templates since they do not appear in the user code. The
1468ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  // following code optionally traverses them.
1469ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  //
1470ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  // We only traverse the variable instantiations when we see the canonical
1471ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  // declaration of the template, to ensure we only visit them once.
1472ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  if (getDerived().shouldVisitTemplateInstantiations() &&
1473ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo      D == D->getCanonicalDecl())
1474ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    TRY_TO(TraverseVariableInstantiations(D));
1475ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
14766bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // Note that getInstantiatedFromMemberTemplate() is just a link
14776bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // from a template instantiation back to the template from which
14786bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // it was instantiated, and thus should not be traversed.
1479ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo})
1480ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
1481dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis// A helper method for traversing the instantiations of a
1482dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis// function while skipping its specializations.
14836bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate <typename Derived>
14846bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesbool RecursiveASTVisitor<Derived>::TraverseFunctionInstantiations(
1485428499e6f5731e98c15af4fe7ff1f6ff458c2766Argyrios Kyrtzidis    FunctionTemplateDecl *D) {
1486651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  for (auto *FD : D->specializations()) {
1487651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    for (auto *RD : FD->redecls()) {
1488651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      switch (RD->getTemplateSpecializationKind()) {
1489651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      case TSK_Undeclared:
1490651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      case TSK_ImplicitInstantiation:
1491651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        // We don't know what kind of FunctionDecl this is.
1492651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        TRY_TO(TraverseDecl(RD));
1493651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        break;
1494651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1495651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      // No need to visit explicit instantiations, we'll find the node
1496651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      // eventually.
1497651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      // FIXME: This is incorrect; there is no other node for an explicit
1498651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      // instantiation of a function template specialization.
1499651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      case TSK_ExplicitInstantiationDeclaration:
1500651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      case TSK_ExplicitInstantiationDefinition:
1501651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        break;
1502651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1503651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      case TSK_ExplicitSpecialization:
1504651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        break;
1505651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      }
1506dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis    }
1507dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  }
1508dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
1509dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  return true;
1510dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis}
1511dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
1512dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios KyrtzidisDEF_TRAVERSE_DECL(FunctionTemplateDecl, {
15136bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseDecl(D->getTemplatedDecl()));
15146bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseTemplateParameterListHelper(D->getTemplateParameters()));
15156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
15166bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // By default, we do not traverse the instantiations of
15176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // function templates since they do not appear in the user code. The
15186bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // following code optionally traverses them.
15196bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  //
15206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // We only traverse the function instantiations when we see the canonical
15216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // declaration of the template, to ensure we only visit them once.
15226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (getDerived().shouldVisitTemplateInstantiations() &&
15236bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      D == D->getCanonicalDecl())
15246bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(TraverseFunctionInstantiations(D));
15256bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
1526dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
1527dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios KyrtzidisDEF_TRAVERSE_DECL(TemplateTemplateParmDecl, {
15286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // D is the "T" in something like
15296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  //   template <template <typename> class T> class container { };
15306bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseDecl(D->getTemplatedDecl()));
15316bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (D->hasDefaultArgument()) {
15326bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(TraverseTemplateArgumentLoc(D->getDefaultArgument()));
15336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  }
15346bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseTemplateParameterListHelper(D->getTemplateParameters()));
15356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
1536dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
1537dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios KyrtzidisDEF_TRAVERSE_DECL(TemplateTypeParmDecl, {
15386bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // D is the "T" in something like "template<typename T> class vector;"
15396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (D->getTypeForDecl())
15406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(TraverseType(QualType(D->getTypeForDecl(), 0)));
15416bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (D->hasDefaultArgument())
15426bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(TraverseTypeLoc(D->getDefaultArgumentInfo()->getTypeLoc()));
15436bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
1544dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
1545dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios KyrtzidisDEF_TRAVERSE_DECL(TypedefDecl, {
15466bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseTypeLoc(D->getTypeSourceInfo()->getTypeLoc()));
15476bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // We shouldn't traverse D->getTypeForDecl(); it's a result of
15486bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // declaring the typedef, not something that was written in the
15496bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // source.
15506bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
1551dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
1552dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios KyrtzidisDEF_TRAVERSE_DECL(TypeAliasDecl, {
15536bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseTypeLoc(D->getTypeSourceInfo()->getTypeLoc()));
15546bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // We shouldn't traverse D->getTypeForDecl(); it's a result of
15556bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // declaring the type alias, not something that was written in the
15566bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // source.
15576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
1558dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
1559dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios KyrtzidisDEF_TRAVERSE_DECL(TypeAliasTemplateDecl, {
15606bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseDecl(D->getTemplatedDecl()));
15616bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseTemplateParameterListHelper(D->getTemplateParameters()));
15626bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
1563dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
1564dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios KyrtzidisDEF_TRAVERSE_DECL(UnresolvedUsingTypenameDecl, {
15656bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // A dependent using declaration which was marked with 'typename'.
15666bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  //   template<class T> class A : public B<T> { using typename B<T>::foo; };
15676bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseNestedNameSpecifierLoc(D->getQualifierLoc()));
15686bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // We shouldn't traverse D->getTypeForDecl(); it's a result of
15696bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // declaring the type, not something that was written in the
15706bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // source.
15716bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
1572dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
1573dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios KyrtzidisDEF_TRAVERSE_DECL(EnumDecl, {
15746bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (D->getTypeForDecl())
15756bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(TraverseType(QualType(D->getTypeForDecl(), 0)));
1576dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
15776bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseNestedNameSpecifierLoc(D->getQualifierLoc()));
15786bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // The enumerators are already traversed by
15796bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // decls_begin()/decls_end().
15806bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
1581dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
1582dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis// Helper methods for RecordDecl and its children.
15836bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate <typename Derived>
15846bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesbool RecursiveASTVisitor<Derived>::TraverseRecordHelper(RecordDecl *D) {
1585dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  // We shouldn't traverse D->getTypeForDecl(); it's a result of
1586dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  // declaring the type, not something that was written in the source.
1587dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
1588dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  TRY_TO(TraverseNestedNameSpecifierLoc(D->getQualifierLoc()));
1589dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  return true;
1590dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis}
1591dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
15926bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate <typename Derived>
15936bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesbool RecursiveASTVisitor<Derived>::TraverseCXXRecordHelper(CXXRecordDecl *D) {
1594dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  if (!TraverseRecordHelper(D))
1595dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis    return false;
1596428499e6f5731e98c15af4fe7ff1f6ff458c2766Argyrios Kyrtzidis  if (D->isCompleteDefinition()) {
1597651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    for (const auto &I : D->bases()) {
1598651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      TRY_TO(TraverseTypeLoc(I.getTypeSourceInfo()->getTypeLoc()));
1599dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis    }
1600dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis    // We don't traverse the friends or the conversions, as they are
1601dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis    // already in decls_begin()/decls_end().
1602dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  }
1603dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  return true;
1604dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis}
1605dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
16066bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_DECL(RecordDecl, { TRY_TO(TraverseRecordHelper(D)); })
1607dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
16086bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_DECL(CXXRecordDecl, { TRY_TO(TraverseCXXRecordHelper(D)); })
1609dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
1610dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios KyrtzidisDEF_TRAVERSE_DECL(ClassTemplateSpecializationDecl, {
16116bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // For implicit instantiations ("set<int> x;"), we don't want to
16126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // recurse at all, since the instatiated class isn't written in
16136bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // the source code anywhere.  (Note the instatiated *type* --
16146bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // set<int> -- is written, and will still get a callback of
16156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // TemplateSpecializationType).  For explicit instantiations
16166bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // ("template set<int>;"), we do need a callback, since this
16176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // is the only callback that's made for this instantiation.
16186bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // We use getTypeAsWritten() to distinguish.
16196bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (TypeSourceInfo *TSI = D->getTypeAsWritten())
16206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(TraverseTypeLoc(TSI->getTypeLoc()));
16216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
16226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (!getDerived().shouldVisitTemplateInstantiations() &&
16236bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      D->getTemplateSpecializationKind() != TSK_ExplicitSpecialization)
16246bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    // Returning from here skips traversing the
16256bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    // declaration context of the ClassTemplateSpecializationDecl
16266bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    // (embedded in the DEF_TRAVERSE_DECL() macro)
16276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    // which contains the instantiated members of the class.
16286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    return true;
16296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
1630dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
1631dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidistemplate <typename Derived>
16326bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesbool RecursiveASTVisitor<Derived>::TraverseTemplateArgumentLocsHelper(
1633dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis    const TemplateArgumentLoc *TAL, unsigned Count) {
1634dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  for (unsigned I = 0; I < Count; ++I) {
1635dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis    TRY_TO(TraverseTemplateArgumentLoc(TAL[I]));
1636dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  }
1637dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  return true;
1638dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis}
1639dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
1640dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios KyrtzidisDEF_TRAVERSE_DECL(ClassTemplatePartialSpecializationDecl, {
16416bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // The partial specialization.
16426bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (TemplateParameterList *TPL = D->getTemplateParameters()) {
16436bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    for (TemplateParameterList::iterator I = TPL->begin(), E = TPL->end();
16446bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines         I != E; ++I) {
16456bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      TRY_TO(TraverseDecl(*I));
1646dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis    }
16476bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  }
16486bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // The args that remains unspecialized.
16496bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseTemplateArgumentLocsHelper(
16506bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      D->getTemplateArgsAsWritten()->getTemplateArgs(),
16516bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      D->getTemplateArgsAsWritten()->NumTemplateArgs));
1652dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
16536bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // Don't need the ClassTemplatePartialSpecializationHelper, even
16546bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // though that's our parent class -- we already visit all the
16556bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // template args here.
16566bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseCXXRecordHelper(D));
1657dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
16586bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // Instantiations will have been visited with the primary template.
16596bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
1660dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
16616bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_DECL(EnumConstantDecl, { TRY_TO(TraverseStmt(D->getInitExpr())); })
1662dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
1663dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios KyrtzidisDEF_TRAVERSE_DECL(UnresolvedUsingValueDecl, {
16646bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // Like UnresolvedUsingTypenameDecl, but without the 'typename':
16656bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  //    template <class T> Class A : public Base<T> { using Base<T>::foo; };
16666bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseNestedNameSpecifierLoc(D->getQualifierLoc()));
16676bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseDeclarationNameInfo(D->getNameInfo()));
16686bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
1669dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
1670dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios KyrtzidisDEF_TRAVERSE_DECL(IndirectFieldDecl, {})
1671dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
16726bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate <typename Derived>
16736bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesbool RecursiveASTVisitor<Derived>::TraverseDeclaratorHelper(DeclaratorDecl *D) {
1674dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  TRY_TO(TraverseNestedNameSpecifierLoc(D->getQualifierLoc()));
1675dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  if (D->getTypeSourceInfo())
1676dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis    TRY_TO(TraverseTypeLoc(D->getTypeSourceInfo()->getTypeLoc()));
1677dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  else
1678dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis    TRY_TO(TraverseType(D->getType()));
1679dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  return true;
1680dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis}
1681dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
16826bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_DECL(MSPropertyDecl, { TRY_TO(TraverseDeclaratorHelper(D)); })
1683dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
16846bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_DECL(FieldDecl, {
16856bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseDeclaratorHelper(D));
16866bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (D->isBitField())
16876bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(TraverseStmt(D->getBitWidth()));
16886bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  else if (D->hasInClassInitializer())
16896bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(TraverseStmt(D->getInClassInitializer()));
16906bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
169176da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall
1692dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios KyrtzidisDEF_TRAVERSE_DECL(ObjCAtDefsFieldDecl, {
16936bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseDeclaratorHelper(D));
16946bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (D->isBitField())
16956bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(TraverseStmt(D->getBitWidth()));
16966bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // FIXME: implement the rest.
16976bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
1698dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
1699dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios KyrtzidisDEF_TRAVERSE_DECL(ObjCIvarDecl, {
17006bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseDeclaratorHelper(D));
17016bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (D->isBitField())
17026bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(TraverseStmt(D->getBitWidth()));
17036bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // FIXME: implement the rest.
17046bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
17056bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
17066bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate <typename Derived>
17076bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesbool RecursiveASTVisitor<Derived>::TraverseFunctionHelper(FunctionDecl *D) {
1708dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  TRY_TO(TraverseNestedNameSpecifierLoc(D->getQualifierLoc()));
1709dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  TRY_TO(TraverseDeclarationNameInfo(D->getNameInfo()));
1710dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
1711dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  // If we're an explicit template specialization, iterate over the
1712dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  // template args that were explicitly specified.  If we were doing
1713dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  // this in typing order, we'd do it between the return type and
1714dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  // the function args, but both are handled by the FunctionTypeLoc
1715dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  // above, so we have to choose one side.  I've decided to do before.
1716dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  if (const FunctionTemplateSpecializationInfo *FTSI =
17176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines          D->getTemplateSpecializationInfo()) {
1718dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis    if (FTSI->getTemplateSpecializationKind() != TSK_Undeclared &&
1719dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis        FTSI->getTemplateSpecializationKind() != TSK_ImplicitInstantiation) {
1720dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis      // A specialization might not have explicit template arguments if it has
1721dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis      // a templated return type and concrete arguments.
1722dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis      if (const ASTTemplateArgumentListInfo *TALI =
17236bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines              FTSI->TemplateArgumentsAsWritten) {
1724dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis        TRY_TO(TraverseTemplateArgumentLocsHelper(TALI->getTemplateArgs(),
1725dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis                                                  TALI->NumTemplateArgs));
1726dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis      }
1727dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis    }
1728dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  }
1729dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
1730dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  // Visit the function type itself, which can be either
1731dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  // FunctionNoProtoType or FunctionProtoType, or a typedef.  This
1732dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  // also covers the return type and the function parameters,
1733dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  // including exception specifications.
1734dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  TRY_TO(TraverseTypeLoc(D->getTypeSourceInfo()->getTypeLoc()));
1735dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
1736dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  if (CXXConstructorDecl *Ctor = dyn_cast<CXXConstructorDecl>(D)) {
1737dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis    // Constructor initializers.
1738651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    for (auto *I : Ctor->inits()) {
1739651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      TRY_TO(TraverseConstructorInitializer(I));
1740dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis    }
1741dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  }
1742dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
1743dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  if (D->isThisDeclarationADefinition()) {
17446bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(TraverseStmt(D->getBody())); // Function body.
1745dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  }
1746dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  return true;
1747dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis}
1748dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
1749dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios KyrtzidisDEF_TRAVERSE_DECL(FunctionDecl, {
17506bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // We skip decls_begin/decls_end, which are already covered by
17516bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // TraverseFunctionHelper().
17526bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  return TraverseFunctionHelper(D);
17536bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
1754dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
1755dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios KyrtzidisDEF_TRAVERSE_DECL(CXXMethodDecl, {
17566bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // We skip decls_begin/decls_end, which are already covered by
17576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // TraverseFunctionHelper().
17586bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  return TraverseFunctionHelper(D);
17596bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
1760dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
1761dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios KyrtzidisDEF_TRAVERSE_DECL(CXXConstructorDecl, {
17626bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // We skip decls_begin/decls_end, which are already covered by
17636bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // TraverseFunctionHelper().
17646bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  return TraverseFunctionHelper(D);
17656bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
1766dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
1767dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis// CXXConversionDecl is the declaration of a type conversion operator.
1768dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis// It's not a cast expression.
1769dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios KyrtzidisDEF_TRAVERSE_DECL(CXXConversionDecl, {
17706bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // We skip decls_begin/decls_end, which are already covered by
17716bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // TraverseFunctionHelper().
17726bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  return TraverseFunctionHelper(D);
17736bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
1774dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
1775dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios KyrtzidisDEF_TRAVERSE_DECL(CXXDestructorDecl, {
17766bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // We skip decls_begin/decls_end, which are already covered by
17776bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // TraverseFunctionHelper().
17786bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  return TraverseFunctionHelper(D);
17796bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
1780dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
17816bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate <typename Derived>
17826bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesbool RecursiveASTVisitor<Derived>::TraverseVarHelper(VarDecl *D) {
1783dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  TRY_TO(TraverseDeclaratorHelper(D));
1784dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  // Default params are taken care of when we traverse the ParmVarDecl.
1785dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  if (!isa<ParmVarDecl>(D))
1786dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis    TRY_TO(TraverseStmt(D->getInit()));
1787dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  return true;
1788dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis}
1789dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
17906bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_DECL(VarDecl, { TRY_TO(TraverseVarHelper(D)); })
1791dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
1792ef4579cda09b73e3d4d98af48201da25adc29326Larisse VoufoDEF_TRAVERSE_DECL(VarTemplateSpecializationDecl, {
1793ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  // For implicit instantiations, we don't want to
1794ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  // recurse at all, since the instatiated class isn't written in
1795ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  // the source code anywhere.
1796ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  if (TypeSourceInfo *TSI = D->getTypeAsWritten())
1797ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    TRY_TO(TraverseTypeLoc(TSI->getTypeLoc()));
1798ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
1799ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  if (!getDerived().shouldVisitTemplateInstantiations() &&
1800ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo      D->getTemplateSpecializationKind() != TSK_ExplicitSpecialization)
1801ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    // Returning from here skips traversing the
1802ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    // declaration context of the VarTemplateSpecializationDecl
1803ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    // (embedded in the DEF_TRAVERSE_DECL() macro).
1804ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    return true;
1805ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo})
1806ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
18076bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_DECL(VarTemplatePartialSpecializationDecl, {
1808ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  // The partial specialization.
1809ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  if (TemplateParameterList *TPL = D->getTemplateParameters()) {
1810ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    for (TemplateParameterList::iterator I = TPL->begin(), E = TPL->end();
1811ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo         I != E; ++I) {
1812ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo      TRY_TO(TraverseDecl(*I));
1813ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    }
1814ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  }
1815ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  // The args that remains unspecialized.
1816c1cef0892e049fcd31084f02d1efdd9985d4dfa4Enea Zaffanella  TRY_TO(TraverseTemplateArgumentLocsHelper(
18176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      D->getTemplateArgsAsWritten()->getTemplateArgs(),
18186bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      D->getTemplateArgsAsWritten()->NumTemplateArgs));
1819ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
1820ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  // Don't need the VarTemplatePartialSpecializationHelper, even
1821ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  // though that's our parent class -- we already visit all the
1822ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  // template args here.
1823ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  TRY_TO(TraverseVarHelper(D));
1824ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
18256bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // Instantiations will have been visited with the primary
18266bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // template.
1827ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo})
1828ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
18296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_DECL(ImplicitParamDecl, { TRY_TO(TraverseVarHelper(D)); })
1830dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
1831dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios KyrtzidisDEF_TRAVERSE_DECL(NonTypeTemplateParmDecl, {
18326bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // A non-type template parameter, e.g. "S" in template<int S> class Foo ...
18336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseDeclaratorHelper(D));
18346bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseStmt(D->getDefaultArgument()));
18356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
1836dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
1837dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios KyrtzidisDEF_TRAVERSE_DECL(ParmVarDecl, {
18386bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseVarHelper(D));
1839dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
18406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (D->hasDefaultArg() && D->hasUninstantiatedDefaultArg() &&
18416bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      !D->hasUnparsedDefaultArg())
18426bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(TraverseStmt(D->getUninstantiatedDefaultArg()));
1843dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
18446bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (D->hasDefaultArg() && !D->hasUninstantiatedDefaultArg() &&
18456bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      !D->hasUnparsedDefaultArg())
18466bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(TraverseStmt(D->getDefaultArg()));
18476bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
1848dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
1849dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis#undef DEF_TRAVERSE_DECL
1850dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
1851dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis// ----------------- Stmt traversal -----------------
1852dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis//
1853dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis// For stmts, we automate (in the DEF_TRAVERSE_STMT macro) iterating
1854dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis// over the children defined in children() (every stmt defines these,
1855dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis// though sometimes the range is empty).  Each individual Traverse*
1856dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis// method only needs to worry about children other than those.  To see
1857dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis// what children() does for a given class, see, e.g.,
1858dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis//   http://clang.llvm.org/doxygen/Stmt_8cpp_source.html
1859dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
1860dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis// This macro makes available a variable S, the passed-in stmt.
18616bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#define DEF_TRAVERSE_STMT(STMT, CODE)                                          \
18626bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  template <typename Derived>                                                  \
18636bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  bool RecursiveASTVisitor<Derived>::Traverse##STMT(STMT *S) {                 \
18646bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(WalkUpFrom##STMT(S));                                               \
18656bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    StmtQueueAction StmtQueue(*this);                                          \
18666bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    { CODE; }                                                                  \
18676bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    for (Stmt::child_range range = S->children(); range; ++range) {            \
18686bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      StmtQueue.queue(*range);                                                 \
18696bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    }                                                                          \
18706bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    return true;                                                               \
18716bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  }
1872dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
1873df5faf5e7ae6823d0af0b801c4ac26d47f2cee97Chad RosierDEF_TRAVERSE_STMT(GCCAsmStmt, {
18746bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  StmtQueue.queue(S->getAsmString());
18756bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  for (unsigned I = 0, E = S->getNumInputs(); I < E; ++I) {
18766bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    StmtQueue.queue(S->getInputConstraintLiteral(I));
18776bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  }
18786bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  for (unsigned I = 0, E = S->getNumOutputs(); I < E; ++I) {
18796bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    StmtQueue.queue(S->getOutputConstraintLiteral(I));
18806bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  }
18816bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  for (unsigned I = 0, E = S->getNumClobbers(); I < E; ++I) {
18826bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    StmtQueue.queue(S->getClobberStringLiteral(I));
18836bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  }
18846bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // children() iterates over inputExpr and outputExpr.
18856bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
1886dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
18876bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(
18886bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    MSAsmStmt,
18896bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    {// FIXME: MS Asm doesn't currently parse Constraints, Clobbers, etc.  Once
18906bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines     // added this needs to be implemented.
18916bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    })
18928cd64b4c5553fa6284d248336cb7c82dc960a394Chad Rosier
1893dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios KyrtzidisDEF_TRAVERSE_STMT(CXXCatchStmt, {
18946bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseDecl(S->getExceptionDecl()));
18956bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // children() iterates over the handler block.
18966bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
1897dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
1898dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios KyrtzidisDEF_TRAVERSE_STMT(DeclStmt, {
18996bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  for (auto *I : S->decls()) {
19006bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(TraverseDecl(I));
19016bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  }
19026bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // Suppress the default iteration over children() by
19036bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // returning.  Here's why: A DeclStmt looks like 'type var [=
19046bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // initializer]'.  The decls above already traverse over the
19056bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // initializers, so we don't have to do it again (which
19066bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // children() would do).
19076bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  return true;
19086bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
1909dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
1910dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis// These non-expr stmts (most of them), do not need any action except
1911dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis// iterating over the children.
19126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(BreakStmt, {})
19136bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(CXXTryStmt, {})
19146bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(CaseStmt, {})
19156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(CompoundStmt, {})
19166bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(ContinueStmt, {})
19176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(DefaultStmt, {})
19186bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(DoStmt, {})
19196bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(ForStmt, {})
19206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(GotoStmt, {})
19216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(IfStmt, {})
19226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(IndirectGotoStmt, {})
19236bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(LabelStmt, {})
19246bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(AttributedStmt, {})
19256bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(NullStmt, {})
19266bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(ObjCAtCatchStmt, {})
19276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(ObjCAtFinallyStmt, {})
19286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(ObjCAtSynchronizedStmt, {})
19296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(ObjCAtThrowStmt, {})
19306bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(ObjCAtTryStmt, {})
19316bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(ObjCForCollectionStmt, {})
19326bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(ObjCAutoreleasePoolStmt, {})
19336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(CXXForRangeStmt, {})
1934dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios KyrtzidisDEF_TRAVERSE_STMT(MSDependentExistsStmt, {
19356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseNestedNameSpecifierLoc(S->getQualifierLoc()));
19366bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseDeclarationNameInfo(S->getNameInfo()));
1937dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis})
19386bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(ReturnStmt, {})
19396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(SwitchStmt, {})
19406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(WhileStmt, {})
1941dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
1942dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios KyrtzidisDEF_TRAVERSE_STMT(CXXDependentScopeMemberExpr, {
19436bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseNestedNameSpecifierLoc(S->getQualifierLoc()));
19446bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseDeclarationNameInfo(S->getMemberNameInfo()));
19456bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (S->hasExplicitTemplateArgs()) {
19466bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(TraverseTemplateArgumentLocsHelper(S->getTemplateArgs(),
19476bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                                              S->getNumTemplateArgs()));
19486bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  }
19496bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
1950dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
1951dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios KyrtzidisDEF_TRAVERSE_STMT(DeclRefExpr, {
19526bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseNestedNameSpecifierLoc(S->getQualifierLoc()));
19536bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseDeclarationNameInfo(S->getNameInfo()));
19546bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseTemplateArgumentLocsHelper(S->getTemplateArgs(),
19556bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                                            S->getNumTemplateArgs()));
19566bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
1957dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
1958dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios KyrtzidisDEF_TRAVERSE_STMT(DependentScopeDeclRefExpr, {
19596bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseNestedNameSpecifierLoc(S->getQualifierLoc()));
19606bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseDeclarationNameInfo(S->getNameInfo()));
19616bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (S->hasExplicitTemplateArgs()) {
19626bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(TraverseTemplateArgumentLocsHelper(
19636bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines        S->getExplicitTemplateArgs().getTemplateArgs(),
19646bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines        S->getNumTemplateArgs()));
19656bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  }
19666bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
1967dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
1968dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios KyrtzidisDEF_TRAVERSE_STMT(MemberExpr, {
19696bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseNestedNameSpecifierLoc(S->getQualifierLoc()));
19706bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseDeclarationNameInfo(S->getMemberNameInfo()));
19716bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseTemplateArgumentLocsHelper(S->getTemplateArgs(),
19726bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                                            S->getNumTemplateArgs()));
19736bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
1974dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
19756bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(
19766bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    ImplicitCastExpr,
19776bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    {// We don't traverse the cast type, as it's not written in the
19786bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines     // source code.
19796bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    })
1980dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
1981dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios KyrtzidisDEF_TRAVERSE_STMT(CStyleCastExpr, {
19826bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseTypeLoc(S->getTypeInfoAsWritten()->getTypeLoc()));
19836bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
1984dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
1985dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios KyrtzidisDEF_TRAVERSE_STMT(CXXFunctionalCastExpr, {
19866bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseTypeLoc(S->getTypeInfoAsWritten()->getTypeLoc()));
19876bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
1988dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
1989dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios KyrtzidisDEF_TRAVERSE_STMT(CXXConstCastExpr, {
19906bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseTypeLoc(S->getTypeInfoAsWritten()->getTypeLoc()));
19916bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
1992dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
1993dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios KyrtzidisDEF_TRAVERSE_STMT(CXXDynamicCastExpr, {
19946bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseTypeLoc(S->getTypeInfoAsWritten()->getTypeLoc()));
19956bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
1996dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
1997dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios KyrtzidisDEF_TRAVERSE_STMT(CXXReinterpretCastExpr, {
19986bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseTypeLoc(S->getTypeInfoAsWritten()->getTypeLoc()));
19996bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
2000dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
2001dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios KyrtzidisDEF_TRAVERSE_STMT(CXXStaticCastExpr, {
20026bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseTypeLoc(S->getTypeInfoAsWritten()->getTypeLoc()));
20036bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
2004dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
2005dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis// InitListExpr is a tricky one, because we want to do all our work on
2006dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis// the syntactic form of the listexpr, but this method takes the
2007dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis// semantic form by default.  We can't use the macro helper because it
2008dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis// calls WalkUp*() on the semantic form, before our code can convert
2009dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis// to the syntactic form.
20106bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate <typename Derived>
20116bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesbool RecursiveASTVisitor<Derived>::TraverseInitListExpr(InitListExpr *S) {
2012dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  if (InitListExpr *Syn = S->getSyntacticForm())
2013dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis    S = Syn;
2014dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  TRY_TO(WalkUpFromInitListExpr(S));
2015428499e6f5731e98c15af4fe7ff1f6ff458c2766Argyrios Kyrtzidis  StmtQueueAction StmtQueue(*this);
2016dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  // All we need are the default actions.  FIXME: use a helper function.
2017dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  for (Stmt::child_range range = S->children(); range; ++range) {
2018428499e6f5731e98c15af4fe7ff1f6ff458c2766Argyrios Kyrtzidis    StmtQueue.queue(*range);
2019dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  }
2020dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  return true;
2021dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis}
2022dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
2023dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis// GenericSelectionExpr is a special case because the types and expressions
2024dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis// are interleaved.  We also need to watch out for null types (default
2025dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis// generic associations).
20266bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate <typename Derived>
20276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesbool RecursiveASTVisitor<Derived>::TraverseGenericSelectionExpr(
20286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    GenericSelectionExpr *S) {
2029dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  TRY_TO(WalkUpFromGenericSelectionExpr(S));
2030428499e6f5731e98c15af4fe7ff1f6ff458c2766Argyrios Kyrtzidis  StmtQueueAction StmtQueue(*this);
2031428499e6f5731e98c15af4fe7ff1f6ff458c2766Argyrios Kyrtzidis  StmtQueue.queue(S->getControllingExpr());
2032dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  for (unsigned i = 0; i != S->getNumAssocs(); ++i) {
2033dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis    if (TypeSourceInfo *TS = S->getAssocTypeSourceInfo(i))
2034dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis      TRY_TO(TraverseTypeLoc(TS->getTypeLoc()));
2035428499e6f5731e98c15af4fe7ff1f6ff458c2766Argyrios Kyrtzidis    StmtQueue.queue(S->getAssocExpr(i));
2036dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  }
2037dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  return true;
2038dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis}
2039dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
2040dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis// PseudoObjectExpr is a special case because of the wierdness with
2041dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis// syntactic expressions and opaque values.
20426bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate <typename Derived>
20436bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesbool
20446bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesRecursiveASTVisitor<Derived>::TraversePseudoObjectExpr(PseudoObjectExpr *S) {
2045dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  TRY_TO(WalkUpFromPseudoObjectExpr(S));
2046428499e6f5731e98c15af4fe7ff1f6ff458c2766Argyrios Kyrtzidis  StmtQueueAction StmtQueue(*this);
2047428499e6f5731e98c15af4fe7ff1f6ff458c2766Argyrios Kyrtzidis  StmtQueue.queue(S->getSyntacticForm());
20486bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  for (PseudoObjectExpr::semantics_iterator i = S->semantics_begin(),
20496bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                                            e = S->semantics_end();
20506bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines       i != e; ++i) {
2051dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis    Expr *sub = *i;
2052dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis    if (OpaqueValueExpr *OVE = dyn_cast<OpaqueValueExpr>(sub))
2053dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis      sub = OVE->getSourceExpr();
2054428499e6f5731e98c15af4fe7ff1f6ff458c2766Argyrios Kyrtzidis    StmtQueue.queue(sub);
2055dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  }
2056dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  return true;
2057dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis}
2058dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
2059dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios KyrtzidisDEF_TRAVERSE_STMT(CXXScalarValueInitExpr, {
20606bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // This is called for code like 'return T()' where T is a built-in
20616bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // (i.e. non-class) type.
20626bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseTypeLoc(S->getTypeSourceInfo()->getTypeLoc()));
20636bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
2064dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
2065dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios KyrtzidisDEF_TRAVERSE_STMT(CXXNewExpr, {
2066dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  // The child-iterator will pick up the other arguments.
2067dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  TRY_TO(TraverseTypeLoc(S->getAllocatedTypeSourceInfo()->getTypeLoc()));
20686bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
2069dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
2070dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios KyrtzidisDEF_TRAVERSE_STMT(OffsetOfExpr, {
20716bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // The child-iterator will pick up the expression representing
20726bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // the field.
20736bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // FIMXE: for code like offsetof(Foo, a.b.c), should we get
20746bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // making a MemberExpr callbacks for Foo.a, Foo.a.b, and Foo.a.b.c?
20756bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseTypeLoc(S->getTypeSourceInfo()->getTypeLoc()));
20766bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
2077dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
2078dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios KyrtzidisDEF_TRAVERSE_STMT(UnaryExprOrTypeTraitExpr, {
20796bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // The child-iterator will pick up the arg if it's an expression,
20806bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // but not if it's a type.
20816bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (S->isArgumentType())
20826bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(TraverseTypeLoc(S->getArgumentTypeInfo()->getTypeLoc()));
20836bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
2084dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
2085dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios KyrtzidisDEF_TRAVERSE_STMT(CXXTypeidExpr, {
20866bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // The child-iterator will pick up the arg if it's an expression,
20876bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // but not if it's a type.
20886bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (S->isTypeOperand())
20896bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(TraverseTypeLoc(S->getTypeOperandSourceInfo()->getTypeLoc()));
20906bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
20916bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
20926bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(MSPropertyRefExpr, {
20936bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseNestedNameSpecifierLoc(S->getQualifierLoc()));
20946bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
2095dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
2096dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios KyrtzidisDEF_TRAVERSE_STMT(CXXUuidofExpr, {
20976bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // The child-iterator will pick up the arg if it's an expression,
20986bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // but not if it's a type.
20996bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (S->isTypeOperand())
21006bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(TraverseTypeLoc(S->getTypeOperandSourceInfo()->getTypeLoc()));
21016bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
2102dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
2103dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios KyrtzidisDEF_TRAVERSE_STMT(TypeTraitExpr, {
2104dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  for (unsigned I = 0, N = S->getNumArgs(); I != N; ++I)
2105dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis    TRY_TO(TraverseTypeLoc(S->getArg(I)->getTypeLoc()));
2106dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis})
2107dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
2108dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios KyrtzidisDEF_TRAVERSE_STMT(ArrayTypeTraitExpr, {
21096bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseTypeLoc(S->getQueriedTypeSourceInfo()->getTypeLoc()));
21106bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
2111dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
21126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(ExpressionTraitExpr,
21136bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                  { StmtQueue.queue(S->getQueriedExpression()); })
2114dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
2115dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios KyrtzidisDEF_TRAVERSE_STMT(VAArgExpr, {
21166bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // The child-iterator will pick up the expression argument.
21176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseTypeLoc(S->getWrittenTypeInfo()->getTypeLoc()));
21186bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
2119dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
2120dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios KyrtzidisDEF_TRAVERSE_STMT(CXXTemporaryObjectExpr, {
21216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // This is called for code like 'return T()' where T is a class type.
21226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseTypeLoc(S->getTypeSourceInfo()->getTypeLoc()));
21236bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
2124dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
21256bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// Walk only the visible parts of lambda expressions.
21266bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate <typename Derived>
21276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesbool RecursiveASTVisitor<Derived>::TraverseLambdaExpr(LambdaExpr *S) {
212889faf86c6e23ed62519dfe369f8ea408df1cb02eJames Dennett  TRY_TO(WalkUpFromLambdaExpr(S));
212989faf86c6e23ed62519dfe369f8ea408df1cb02eJames Dennett
2130dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  for (LambdaExpr::capture_iterator C = S->explicit_capture_begin(),
21316bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                                    CEnd = S->explicit_capture_end();
2132dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis       C != CEnd; ++C) {
21336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(TraverseLambdaCapture(S, C));
2134dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  }
2135dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
2136176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  TypeLoc TL = S->getCallOperator()->getTypeSourceInfo()->getTypeLoc();
2137176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  FunctionProtoTypeLoc Proto = TL.castAs<FunctionProtoTypeLoc>();
2138176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
2139176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  if (S->hasExplicitParameters() && S->hasExplicitResultType()) {
2140176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    // Visit the whole type.
2141176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    TRY_TO(TraverseTypeLoc(TL));
2142176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  } else {
2143176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    if (S->hasExplicitParameters()) {
2144176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      // Visit parameters.
2145176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      for (unsigned I = 0, N = Proto.getNumParams(); I != N; ++I) {
2146176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        TRY_TO(TraverseDecl(Proto.getParam(I)));
21476bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      }
2148176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    } else if (S->hasExplicitResultType()) {
2149176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      TRY_TO(TraverseTypeLoc(Proto.getReturnLoc()));
2150dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis    }
2151176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
2152176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    auto *T = Proto.getTypePtr();
2153176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    for (const auto &E : T->exceptions()) {
2154176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      TRY_TO(TraverseType(E));
2155176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
2156176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
2157176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    if (Expr *NE = T->getNoexceptExpr())
2158176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      TRY_TO(TraverseStmt(NE));
2159dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  }
2160dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
21616bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseLambdaBody(S));
2162dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  return true;
2163dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis}
2164dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
2165dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios KyrtzidisDEF_TRAVERSE_STMT(CXXUnresolvedConstructExpr, {
21666bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // This is called for code like 'T()', where T is a template argument.
21676bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseTypeLoc(S->getTypeSourceInfo()->getTypeLoc()));
21686bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
2169dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
2170dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis// These expressions all might take explicit template arguments.
2171dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis// We traverse those if so.  FIXME: implement these.
21726bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(CXXConstructExpr, {})
21736bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(CallExpr, {})
21746bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(CXXMemberCallExpr, {})
2175dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
2176dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis// These exprs (most of them), do not need any action except iterating
2177dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis// over the children.
21786bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(AddrLabelExpr, {})
21796bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(ArraySubscriptExpr, {})
2180dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios KyrtzidisDEF_TRAVERSE_STMT(BlockExpr, {
2181dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  TRY_TO(TraverseDecl(S->getBlockDecl()));
2182dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  return true; // no child statements to loop through.
2183dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis})
21846bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(ChooseExpr, {})
21856bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(CompoundLiteralExpr, {
21866bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseTypeLoc(S->getTypeSourceInfo()->getTypeLoc()));
21876bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
21886bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(CXXBindTemporaryExpr, {})
21896bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(CXXBoolLiteralExpr, {})
21906bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(CXXDefaultArgExpr, {})
21916bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(CXXDefaultInitExpr, {})
21926bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(CXXDeleteExpr, {})
21936bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(ExprWithCleanups, {})
21946bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(CXXNullPtrLiteralExpr, {})
21956bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(CXXStdInitializerListExpr, {})
2196dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios KyrtzidisDEF_TRAVERSE_STMT(CXXPseudoDestructorExpr, {
2197dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  TRY_TO(TraverseNestedNameSpecifierLoc(S->getQualifierLoc()));
2198dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  if (TypeSourceInfo *ScopeInfo = S->getScopeTypeInfo())
2199dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis    TRY_TO(TraverseTypeLoc(ScopeInfo->getTypeLoc()));
2200dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  if (TypeSourceInfo *DestroyedTypeInfo = S->getDestroyedTypeInfo())
2201dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis    TRY_TO(TraverseTypeLoc(DestroyedTypeInfo->getTypeLoc()));
2202dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis})
22036bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(CXXThisExpr, {})
22046bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(CXXThrowExpr, {})
22056bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(UserDefinedLiteral, {})
22066bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(DesignatedInitExpr, {})
22076bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(ExtVectorElementExpr, {})
22086bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(GNUNullExpr, {})
22096bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(ImplicitValueInitExpr, {})
22106bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(ObjCBoolLiteralExpr, {})
221187014f33f123461a012995b2f7eb5e6ecf6dc461Argyrios KyrtzidisDEF_TRAVERSE_STMT(ObjCEncodeExpr, {
221287014f33f123461a012995b2f7eb5e6ecf6dc461Argyrios Kyrtzidis  if (TypeSourceInfo *TInfo = S->getEncodedTypeSourceInfo())
221387014f33f123461a012995b2f7eb5e6ecf6dc461Argyrios Kyrtzidis    TRY_TO(TraverseTypeLoc(TInfo->getTypeLoc()));
221487014f33f123461a012995b2f7eb5e6ecf6dc461Argyrios Kyrtzidis})
22156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(ObjCIsaExpr, {})
22166bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(ObjCIvarRefExpr, {})
22171270673bf5208a140b397419c8c34e7bdcce2339Argyrios KyrtzidisDEF_TRAVERSE_STMT(ObjCMessageExpr, {
22181270673bf5208a140b397419c8c34e7bdcce2339Argyrios Kyrtzidis  if (TypeSourceInfo *TInfo = S->getClassReceiverTypeInfo())
22191270673bf5208a140b397419c8c34e7bdcce2339Argyrios Kyrtzidis    TRY_TO(TraverseTypeLoc(TInfo->getTypeLoc()));
22201270673bf5208a140b397419c8c34e7bdcce2339Argyrios Kyrtzidis})
22216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(ObjCPropertyRefExpr, {})
22226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(ObjCSubscriptRefExpr, {})
22236bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(ObjCProtocolExpr, {})
22246bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(ObjCSelectorExpr, {})
22256bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(ObjCIndirectCopyRestoreExpr, {})
2226dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios KyrtzidisDEF_TRAVERSE_STMT(ObjCBridgedCastExpr, {
2227dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  TRY_TO(TraverseTypeLoc(S->getTypeInfoAsWritten()->getTypeLoc()));
2228dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis})
22296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(ParenExpr, {})
22306bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(ParenListExpr, {})
22316bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(PredefinedExpr, {})
22326bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(ShuffleVectorExpr, {})
22336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(ConvertVectorExpr, {})
22346bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(StmtExpr, {})
2235dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios KyrtzidisDEF_TRAVERSE_STMT(UnresolvedLookupExpr, {
2236dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  TRY_TO(TraverseNestedNameSpecifierLoc(S->getQualifierLoc()));
2237dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  if (S->hasExplicitTemplateArgs()) {
2238dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis    TRY_TO(TraverseTemplateArgumentLocsHelper(S->getTemplateArgs(),
2239dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis                                              S->getNumTemplateArgs()));
2240dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  }
2241dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis})
2242dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
2243dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios KyrtzidisDEF_TRAVERSE_STMT(UnresolvedMemberExpr, {
2244dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  TRY_TO(TraverseNestedNameSpecifierLoc(S->getQualifierLoc()));
2245dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  if (S->hasExplicitTemplateArgs()) {
2246dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis    TRY_TO(TraverseTemplateArgumentLocsHelper(S->getTemplateArgs(),
2247dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis                                              S->getNumTemplateArgs()));
2248dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis  }
2249dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis})
2250dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
2251dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios KyrtzidisDEF_TRAVERSE_STMT(SEHTryStmt, {})
2252dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios KyrtzidisDEF_TRAVERSE_STMT(SEHExceptStmt, {})
22536bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(SEHFinallyStmt, {})
2254c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen HinesDEF_TRAVERSE_STMT(SEHLeaveStmt, {})
22556bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(CapturedStmt, { TRY_TO(TraverseDecl(S->getCapturedDecl())); })
2256dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
22576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(CXXOperatorCallExpr, {})
22586bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(OpaqueValueExpr, {})
2259176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesDEF_TRAVERSE_STMT(TypoExpr, {})
22606bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(CUDAKernelCallExpr, {})
2261dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
2262dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis// These operators (all of them) do not need any action except
2263dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis// iterating over the children.
22646bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(BinaryConditionalOperator, {})
22656bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(ConditionalOperator, {})
22666bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(UnaryOperator, {})
22676bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(BinaryOperator, {})
22686bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(CompoundAssignOperator, {})
22696bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(CXXNoexceptExpr, {})
22706bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(PackExpansionExpr, {})
22716bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(SizeOfPackExpr, {})
22726bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(SubstNonTypeTemplateParmPackExpr, {})
22736bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(SubstNonTypeTemplateParmExpr, {})
22746bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(FunctionParmPackExpr, {})
22756bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(MaterializeTemporaryExpr, {})
2276176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesDEF_TRAVERSE_STMT(CXXFoldExpr, {})
22776bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(AtomicExpr, {})
2278dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
2279dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis// These literals (all of them) do not need any action.
22806bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(IntegerLiteral, {})
22816bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(CharacterLiteral, {})
22826bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(FloatingLiteral, {})
22836bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(ImaginaryLiteral, {})
22846bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(StringLiteral, {})
22856bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(ObjCStringLiteral, {})
22866bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(ObjCBoxedExpr, {})
22876bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(ObjCArrayLiteral, {})
22886bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(ObjCDictionaryLiteral, {})
22896bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
2290dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis// Traverse OpenCL: AsType, Convert.
22916bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(AsTypeExpr, {})
2292dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
22934fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev// OpenMP directives.
22946bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate <typename Derived>
22956bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesbool RecursiveASTVisitor<Derived>::TraverseOMPExecutableDirective(
22966bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    OMPExecutableDirective *S) {
2297c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  for (auto *C : S->clauses()) {
2298c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    TRY_TO(TraverseOMPClause(C));
2299c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  }
2300651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return true;
2301651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
2302651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
2303176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinestemplate <typename Derived>
2304176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesbool
2305176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesRecursiveASTVisitor<Derived>::TraverseOMPLoopDirective(OMPLoopDirective *S) {
2306176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  return TraverseOMPExecutableDirective(S);
2307176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
2308176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
2309c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen HinesDEF_TRAVERSE_STMT(OMPParallelDirective,
2310c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines                  { TRY_TO(TraverseOMPExecutableDirective(S)); })
2311651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
2312c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen HinesDEF_TRAVERSE_STMT(OMPSimdDirective,
2313c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines                  { TRY_TO(TraverseOMPExecutableDirective(S)); })
2314c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
2315c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen HinesDEF_TRAVERSE_STMT(OMPForDirective,
2316c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines                  { TRY_TO(TraverseOMPExecutableDirective(S)); })
2317c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
2318176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesDEF_TRAVERSE_STMT(OMPForSimdDirective,
2319176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines                  { TRY_TO(TraverseOMPExecutableDirective(S)); })
2320176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
2321c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen HinesDEF_TRAVERSE_STMT(OMPSectionsDirective,
2322c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines                  { TRY_TO(TraverseOMPExecutableDirective(S)); })
2323c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
2324c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen HinesDEF_TRAVERSE_STMT(OMPSectionDirective,
2325c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines                  { TRY_TO(TraverseOMPExecutableDirective(S)); })
2326c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
2327c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen HinesDEF_TRAVERSE_STMT(OMPSingleDirective,
2328c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines                  { TRY_TO(TraverseOMPExecutableDirective(S)); })
2329c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
2330176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesDEF_TRAVERSE_STMT(OMPMasterDirective,
2331176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines                  { TRY_TO(TraverseOMPExecutableDirective(S)); })
2332176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
2333176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesDEF_TRAVERSE_STMT(OMPCriticalDirective, {
2334176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  TRY_TO(TraverseDeclarationNameInfo(S->getDirectiveName()));
2335176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  TRY_TO(TraverseOMPExecutableDirective(S));
2336176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines})
2337176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
2338c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen HinesDEF_TRAVERSE_STMT(OMPParallelForDirective,
2339c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines                  { TRY_TO(TraverseOMPExecutableDirective(S)); })
2340c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
2341176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesDEF_TRAVERSE_STMT(OMPParallelForSimdDirective,
2342176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines                  { TRY_TO(TraverseOMPExecutableDirective(S)); })
2343176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
2344c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen HinesDEF_TRAVERSE_STMT(OMPParallelSectionsDirective,
2345c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines                  { TRY_TO(TraverseOMPExecutableDirective(S)); })
23464fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev
2347176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesDEF_TRAVERSE_STMT(OMPTaskDirective,
2348176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines                  { TRY_TO(TraverseOMPExecutableDirective(S)); })
2349176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
2350176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesDEF_TRAVERSE_STMT(OMPTaskyieldDirective,
2351176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines                  { TRY_TO(TraverseOMPExecutableDirective(S)); })
2352176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
2353176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesDEF_TRAVERSE_STMT(OMPBarrierDirective,
2354176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines                  { TRY_TO(TraverseOMPExecutableDirective(S)); })
2355176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
2356176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesDEF_TRAVERSE_STMT(OMPTaskwaitDirective,
2357176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines                  { TRY_TO(TraverseOMPExecutableDirective(S)); })
2358176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
2359176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesDEF_TRAVERSE_STMT(OMPFlushDirective,
2360176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines                  { TRY_TO(TraverseOMPExecutableDirective(S)); })
2361176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
2362176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesDEF_TRAVERSE_STMT(OMPOrderedDirective,
2363176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines                  { TRY_TO(TraverseOMPExecutableDirective(S)); })
2364176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
2365176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesDEF_TRAVERSE_STMT(OMPAtomicDirective,
2366176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines                  { TRY_TO(TraverseOMPExecutableDirective(S)); })
2367176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
2368176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesDEF_TRAVERSE_STMT(OMPTargetDirective,
2369176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines                  { TRY_TO(TraverseOMPExecutableDirective(S)); })
2370176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
2371176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesDEF_TRAVERSE_STMT(OMPTeamsDirective,
2372176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines                  { TRY_TO(TraverseOMPExecutableDirective(S)); })
2373176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
23744fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev// OpenMP clauses.
23756bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate <typename Derived>
23766bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesbool RecursiveASTVisitor<Derived>::TraverseOMPClause(OMPClause *C) {
23776bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (!C)
23786bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    return true;
23794fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  switch (C->getClauseKind()) {
23806bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#define OPENMP_CLAUSE(Name, Class)                                             \
23816bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  case OMPC_##Name:                                                            \
2382c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    TRY_TO(Visit##Class(static_cast<Class *>(C)));                             \
2383c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    break;
23844fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev#include "clang/Basic/OpenMPKinds.def"
2385c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  case OMPC_threadprivate:
2386c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  case OMPC_unknown:
23876bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    break;
23884fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  }
23894fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  return true;
23904fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev}
23914fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev
23926bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate <typename Derived>
23936bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesbool RecursiveASTVisitor<Derived>::VisitOMPIfClause(OMPIfClause *C) {
2394c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  TRY_TO(TraverseStmt(C->getCondition()));
2395651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return true;
2396651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
2397651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
23986bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate <typename Derived>
2399176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesbool RecursiveASTVisitor<Derived>::VisitOMPFinalClause(OMPFinalClause *C) {
2400176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  TRY_TO(TraverseStmt(C->getCondition()));
2401176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  return true;
2402176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
2403176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
2404176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinestemplate <typename Derived>
24056bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesbool
24066bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesRecursiveASTVisitor<Derived>::VisitOMPNumThreadsClause(OMPNumThreadsClause *C) {
2407c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  TRY_TO(TraverseStmt(C->getNumThreads()));
2408651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return true;
2409651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
2410651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
24116bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate <typename Derived>
24126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesbool RecursiveASTVisitor<Derived>::VisitOMPSafelenClause(OMPSafelenClause *C) {
2413c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  TRY_TO(TraverseStmt(C->getSafelen()));
2414651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return true;
2415651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
2416651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
24176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate <typename Derived>
24186bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesbool
24196bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesRecursiveASTVisitor<Derived>::VisitOMPCollapseClause(OMPCollapseClause *C) {
2420c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  TRY_TO(TraverseStmt(C->getNumForLoops()));
2421c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  return true;
2422c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines}
2423c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
2424c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinestemplate <typename Derived>
2425c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesbool RecursiveASTVisitor<Derived>::VisitOMPDefaultClause(OMPDefaultClause *) {
24266bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  return true;
24276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}
24286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
24296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate <typename Derived>
2430c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesbool RecursiveASTVisitor<Derived>::VisitOMPProcBindClause(OMPProcBindClause *) {
24314fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  return true;
24324fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev}
24334fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev
24346bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate <typename Derived>
24356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesbool
2436c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen HinesRecursiveASTVisitor<Derived>::VisitOMPScheduleClause(OMPScheduleClause *C) {
2437c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  TRY_TO(TraverseStmt(C->getChunkSize()));
2438c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  return true;
2439c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines}
2440c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
2441c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinestemplate <typename Derived>
2442c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesbool RecursiveASTVisitor<Derived>::VisitOMPOrderedClause(OMPOrderedClause *) {
2443c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  return true;
2444c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines}
2445c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
2446c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinestemplate <typename Derived>
2447c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesbool RecursiveASTVisitor<Derived>::VisitOMPNowaitClause(OMPNowaitClause *) {
24486bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  return true;
24496bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}
24506bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
24516bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate <typename Derived>
2452176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesbool RecursiveASTVisitor<Derived>::VisitOMPUntiedClause(OMPUntiedClause *) {
2453176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  return true;
2454176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
2455176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
2456176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinestemplate <typename Derived>
2457176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesbool
2458176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesRecursiveASTVisitor<Derived>::VisitOMPMergeableClause(OMPMergeableClause *) {
2459176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  return true;
2460176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
2461176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
2462176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinestemplate <typename Derived>
2463176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesbool RecursiveASTVisitor<Derived>::VisitOMPReadClause(OMPReadClause *) {
2464176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  return true;
2465176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
2466176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
2467176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinestemplate <typename Derived>
2468176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesbool RecursiveASTVisitor<Derived>::VisitOMPWriteClause(OMPWriteClause *) {
2469176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  return true;
2470176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
2471176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
2472176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinestemplate <typename Derived>
2473176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesbool RecursiveASTVisitor<Derived>::VisitOMPUpdateClause(OMPUpdateClause *) {
2474176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  return true;
2475176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
2476176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
2477176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinestemplate <typename Derived>
2478176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesbool RecursiveASTVisitor<Derived>::VisitOMPCaptureClause(OMPCaptureClause *) {
2479176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  return true;
2480176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
2481176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
2482176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinestemplate <typename Derived>
2483176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesbool RecursiveASTVisitor<Derived>::VisitOMPSeqCstClause(OMPSeqCstClause *) {
2484176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  return true;
2485176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
2486176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
2487176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinestemplate <typename Derived>
24886bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate <typename T>
2489c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesbool RecursiveASTVisitor<Derived>::VisitOMPClauseList(T *Node) {
2490c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  for (auto *E : Node->varlists()) {
2491c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    TRY_TO(TraverseStmt(E));
2492c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  }
2493c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  return true;
2494543c4ae954f2bce5ac58ed22080f23cbd94794d2Alexey Bataev}
24954fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev
24966bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate <typename Derived>
24976bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesbool RecursiveASTVisitor<Derived>::VisitOMPPrivateClause(OMPPrivateClause *C) {
2498c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  TRY_TO(VisitOMPClauseList(C));
2499176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  for (auto *E : C->private_copies()) {
2500176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    TRY_TO(TraverseStmt(E));
2501176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  }
25026bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  return true;
25036bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}
25046bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
25056bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate <typename Derived>
25066bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesbool RecursiveASTVisitor<Derived>::VisitOMPFirstprivateClause(
25076bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    OMPFirstprivateClause *C) {
2508c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  TRY_TO(VisitOMPClauseList(C));
2509176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  for (auto *E : C->private_copies()) {
2510176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    TRY_TO(TraverseStmt(E));
2511176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  }
2512176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  for (auto *E : C->inits()) {
2513176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    TRY_TO(TraverseStmt(E));
2514176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  }
2515c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  return true;
2516c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines}
2517c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
2518c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinestemplate <typename Derived>
2519c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesbool RecursiveASTVisitor<Derived>::VisitOMPLastprivateClause(
2520c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    OMPLastprivateClause *C) {
2521c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  TRY_TO(VisitOMPClauseList(C));
252233337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar  for (auto *E : C->private_copies()) {
252333337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar    TRY_TO(TraverseStmt(E));
252433337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar  }
252533337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar  for (auto *E : C->source_exprs()) {
252633337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar    TRY_TO(TraverseStmt(E));
252733337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar  }
252833337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar  for (auto *E : C->destination_exprs()) {
252933337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar    TRY_TO(TraverseStmt(E));
253033337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar  }
253133337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar  for (auto *E : C->assignment_ops()) {
253233337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar    TRY_TO(TraverseStmt(E));
253333337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar  }
25344fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  return true;
25354fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev}
25364fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev
25376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate <typename Derived>
25386bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesbool RecursiveASTVisitor<Derived>::VisitOMPSharedClause(OMPSharedClause *C) {
2539c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  TRY_TO(VisitOMPClauseList(C));
2540d195bc38fd424b0c928e3c354038a8ca6e2ccac3Alexey Bataev  return true;
2541d195bc38fd424b0c928e3c354038a8ca6e2ccac3Alexey Bataev}
2542d195bc38fd424b0c928e3c354038a8ca6e2ccac3Alexey Bataev
25436bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate <typename Derived>
25446bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesbool RecursiveASTVisitor<Derived>::VisitOMPLinearClause(OMPLinearClause *C) {
2545c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  TRY_TO(TraverseStmt(C->getStep()));
25463ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  TRY_TO(TraverseStmt(C->getCalcStep()));
2547c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  TRY_TO(VisitOMPClauseList(C));
25483ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  for (auto *E : C->inits()) {
25493ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar    TRY_TO(TraverseStmt(E));
25503ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  }
25513ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  for (auto *E : C->updates()) {
25523ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar    TRY_TO(TraverseStmt(E));
25533ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  }
25543ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  for (auto *E : C->finals()) {
25553ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar    TRY_TO(TraverseStmt(E));
25563ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  }
2557c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  return true;
2558c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines}
2559c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
2560c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinestemplate <typename Derived>
2561c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesbool RecursiveASTVisitor<Derived>::VisitOMPAlignedClause(OMPAlignedClause *C) {
2562c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  TRY_TO(TraverseStmt(C->getAlignment()));
2563c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  TRY_TO(VisitOMPClauseList(C));
2564651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return true;
2565651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
2566651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
25676bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate <typename Derived>
25686bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesbool RecursiveASTVisitor<Derived>::VisitOMPCopyinClause(OMPCopyinClause *C) {
2569c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  TRY_TO(VisitOMPClauseList(C));
257033337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar  for (auto *E : C->source_exprs()) {
257133337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar    TRY_TO(TraverseStmt(E));
257233337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar  }
257333337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar  for (auto *E : C->destination_exprs()) {
257433337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar    TRY_TO(TraverseStmt(E));
257533337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar  }
257633337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar  for (auto *E : C->assignment_ops()) {
257733337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar    TRY_TO(TraverseStmt(E));
257833337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar  }
2579c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  return true;
2580c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines}
2581c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
2582c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinestemplate <typename Derived>
2583c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesbool RecursiveASTVisitor<Derived>::VisitOMPCopyprivateClause(
2584c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    OMPCopyprivateClause *C) {
2585c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  TRY_TO(VisitOMPClauseList(C));
25863ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  for (auto *E : C->source_exprs()) {
25873ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar    TRY_TO(TraverseStmt(E));
25883ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  }
25893ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  for (auto *E : C->destination_exprs()) {
25903ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar    TRY_TO(TraverseStmt(E));
25913ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  }
25923ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  for (auto *E : C->assignment_ops()) {
25933ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar    TRY_TO(TraverseStmt(E));
25943ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  }
2595c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  return true;
2596c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines}
2597c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
2598c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinestemplate <typename Derived>
2599c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesbool
2600c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen HinesRecursiveASTVisitor<Derived>::VisitOMPReductionClause(OMPReductionClause *C) {
2601c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  TRY_TO(TraverseNestedNameSpecifierLoc(C->getQualifierLoc()));
2602c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  TRY_TO(TraverseDeclarationNameInfo(C->getNameInfo()));
2603c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  TRY_TO(VisitOMPClauseList(C));
260433337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar  for (auto *E : C->lhs_exprs()) {
260533337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar    TRY_TO(TraverseStmt(E));
260633337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar  }
260733337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar  for (auto *E : C->rhs_exprs()) {
260833337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar    TRY_TO(TraverseStmt(E));
260933337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar  }
261033337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar  for (auto *E : C->reduction_ops()) {
261133337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar    TRY_TO(TraverseStmt(E));
261233337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar  }
26130c018357b8bbb1f96bbf622a5807421e626b4228Alexey Bataev  return true;
26140c018357b8bbb1f96bbf622a5807421e626b4228Alexey Bataev}
26150c018357b8bbb1f96bbf622a5807421e626b4228Alexey Bataev
2616176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinestemplate <typename Derived>
2617176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesbool RecursiveASTVisitor<Derived>::VisitOMPFlushClause(OMPFlushClause *C) {
2618176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  TRY_TO(VisitOMPClauseList(C));
2619176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  return true;
2620176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
2621176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
2622dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis// FIXME: look at the following tricky-seeming exprs to see if we
2623dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis// need to recurse on anything.  These are ones that have methods
2624dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis// returning decls or qualtypes or nestednamespecifier -- though I'm
2625dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis// not sure if they own them -- or just seemed very complicated, or
2626dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis// had lots of sub-types to explore.
2627dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis//
2628dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis// VisitOverloadExpr and its children: recurse on template args? etc?
2629dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
2630dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis// FIXME: go through all the stmts and exprs again, and see which of them
2631dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis// create new types, and recurse on the types (TypeLocs?) of those.
2632dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis// Candidates:
2633dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis//
2634dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis//    http://clang.llvm.org/doxygen/classclang_1_1CXXTypeidExpr.html
2635dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis//    http://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html
2636dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis//    http://clang.llvm.org/doxygen/classclang_1_1TypesCompatibleExpr.html
2637dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis//    Every class that has getQualifier.
2638dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
2639dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis#undef DEF_TRAVERSE_STMT
2640dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
2641dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis#undef TRY_TO
2642dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
26436bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#undef RecursiveASTVisitor
26446bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
2645dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis} // end namespace clang
2646dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis
2647dec35a9848b3580855ea53eaeeafd3e17a5fb934Argyrios Kyrtzidis#endif // LLVM_CLANG_LIBCLANG_RECURSIVEASTVISITOR_H
2648