1d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor//===--- RecursiveASTVisitor.h - Recursive AST Visitor ----------*- C++ -*-===//
2d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor//
3d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor//                     The LLVM Compiler Infrastructure
4d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor//
5d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor// This file is distributed under the University of Illinois Open Source
6d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor// License. See LICENSE.TXT for details.
7d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor//
8d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor//===----------------------------------------------------------------------===//
9d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor//
10d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor//  This file defines the RecursiveASTVisitor interface, which recursively
11d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor//  traverses the entire AST.
12d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor//
13d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor//===----------------------------------------------------------------------===//
14d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor#ifndef LLVM_CLANG_AST_RECURSIVEASTVISITOR_H
15d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor#define LLVM_CLANG_AST_RECURSIVEASTVISITOR_H
16d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor
1787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar#include <type_traits>
1887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
19651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#include "clang/AST/Attr.h"
20d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor#include "clang/AST/Decl.h"
21d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor#include "clang/AST/DeclCXX.h"
22d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor#include "clang/AST/DeclFriend.h"
23d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor#include "clang/AST/DeclObjC.h"
24c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev#include "clang/AST/DeclOpenMP.h"
25d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor#include "clang/AST/DeclTemplate.h"
26d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor#include "clang/AST/Expr.h"
27d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor#include "clang/AST/ExprCXX.h"
28d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor#include "clang/AST/ExprObjC.h"
2987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar#include "clang/AST/ExprOpenMP.h"
30d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor#include "clang/AST/NestedNameSpecifier.h"
31d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor#include "clang/AST/Stmt.h"
32d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor#include "clang/AST/StmtCXX.h"
33d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor#include "clang/AST/StmtObjC.h"
344fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev#include "clang/AST/StmtOpenMP.h"
35d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor#include "clang/AST/TemplateBase.h"
36d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor#include "clang/AST/TemplateName.h"
37d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor#include "clang/AST/Type.h"
384d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky#include "clang/AST/TypeLoc.h"
39d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor
407d66f8cafd807e551efb4739cdb37fc272cf5345Chandler Carruth// The following three macros are used for meta programming.  The code
417d66f8cafd807e551efb4739cdb37fc272cf5345Chandler Carruth// using them is responsible for defining macro OPERATOR().
427d66f8cafd807e551efb4739cdb37fc272cf5345Chandler Carruth
437d66f8cafd807e551efb4739cdb37fc272cf5345Chandler Carruth// All unary operators.
446bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#define UNARYOP_LIST()                                                         \
456bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  OPERATOR(PostInc) OPERATOR(PostDec) OPERATOR(PreInc) OPERATOR(PreDec)        \
466bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      OPERATOR(AddrOf) OPERATOR(Deref) OPERATOR(Plus) OPERATOR(Minus)          \
476bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      OPERATOR(Not) OPERATOR(LNot) OPERATOR(Real) OPERATOR(Imag)               \
4887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      OPERATOR(Extension) OPERATOR(Coawait)
497d66f8cafd807e551efb4739cdb37fc272cf5345Chandler Carruth
507d66f8cafd807e551efb4739cdb37fc272cf5345Chandler Carruth// All binary operators (excluding compound assign operators).
516bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#define BINOP_LIST()                                                           \
526bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  OPERATOR(PtrMemD) OPERATOR(PtrMemI) OPERATOR(Mul) OPERATOR(Div)              \
536bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      OPERATOR(Rem) OPERATOR(Add) OPERATOR(Sub) OPERATOR(Shl) OPERATOR(Shr)    \
546bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      OPERATOR(LT) OPERATOR(GT) OPERATOR(LE) OPERATOR(GE) OPERATOR(EQ)         \
556bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      OPERATOR(NE) OPERATOR(And) OPERATOR(Xor) OPERATOR(Or) OPERATOR(LAnd)     \
566bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      OPERATOR(LOr) OPERATOR(Assign) OPERATOR(Comma)
577d66f8cafd807e551efb4739cdb37fc272cf5345Chandler Carruth
587d66f8cafd807e551efb4739cdb37fc272cf5345Chandler Carruth// All compound assign operators.
596bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#define CAO_LIST()                                                             \
606bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  OPERATOR(Mul) OPERATOR(Div) OPERATOR(Rem) OPERATOR(Add) OPERATOR(Sub)        \
616bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      OPERATOR(Shl) OPERATOR(Shr) OPERATOR(And) OPERATOR(Or) OPERATOR(Xor)
627d66f8cafd807e551efb4739cdb37fc272cf5345Chandler Carruth
63d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregornamespace clang {
64facfc77487a890bfb7b5eee7e21cd2b395a9faafChandler Carruth
65dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth// A helper macro to implement short-circuiting when recursing.  It
66dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth// invokes CALL_EXPR, which must be a method call, on the derived
67dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth// object (s.t. a user of RecursiveASTVisitor can override the method
68dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth// in CALL_EXPR).
696bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#define TRY_TO(CALL_EXPR)                                                      \
706bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  do {                                                                         \
716bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    if (!getDerived().CALL_EXPR)                                               \
726bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      return false;                                                            \
736bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  } while (0)
74dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth
754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar/// \brief A class that does preordor or postorder
764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar/// depth-first traversal on the entire Clang AST and visits each node.
77dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth///
78dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth/// This class performs three distinct tasks:
79dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth///   1. traverse the AST (i.e. go to each node);
80dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth///   2. at a given node, walk up the class hierarchy, starting from
81dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth///      the node's dynamic type, until the top-most class (e.g. Stmt,
82dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth///      Decl, or Type) is reached.
83dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth///   3. given a (node, class) combination, where 'class' is some base
84dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth///      class of the dynamic type of 'node', call a user-overridable
85dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth///      function to actually visit the node.
86dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth///
87dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth/// These tasks are done by three groups of methods, respectively:
88ea245e0ba48caf7e7acf870880c030d7ddc76667Craig Silverstein///   1. TraverseDecl(Decl *x) does task #1.  It is the entry point
89dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth///      for traversing an AST rooted at x.  This method simply
90ea245e0ba48caf7e7acf870880c030d7ddc76667Craig Silverstein///      dispatches (i.e. forwards) to TraverseFoo(Foo *x) where Foo
91dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth///      is the dynamic type of *x, which calls WalkUpFromFoo(x) and
92dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth///      then recursively visits the child nodes of x.
93ea245e0ba48caf7e7acf870880c030d7ddc76667Craig Silverstein///      TraverseStmt(Stmt *x) and TraverseType(QualType x) work
94dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth///      similarly.
95ea245e0ba48caf7e7acf870880c030d7ddc76667Craig Silverstein///   2. WalkUpFromFoo(Foo *x) does task #2.  It does not try to visit
96dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth///      any child node of x.  Instead, it first calls WalkUpFromBar(x)
97dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth///      where Bar is the direct parent class of Foo (unless Foo has
98dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth///      no parent), and then calls VisitFoo(x) (see the next list item).
99ea245e0ba48caf7e7acf870880c030d7ddc76667Craig Silverstein///   3. VisitFoo(Foo *x) does task #3.
100dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth///
101dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth/// These three method groups are tiered (Traverse* > WalkUpFrom* >
102dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth/// Visit*).  A method (e.g. Traverse*) may call methods from the same
103e3e210c3aa3c1b289eee669a1d235fc16df384a0Chandler Carruth/// tier (e.g. other Traverse*) or one tier lower (e.g. WalkUpFrom*).
104dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth/// It may not call methods from a higher tier.
105dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth///
106b5c202f9e4f6d0f230d5cb8848779259ebf95b7fChandler Carruth/// Note that since WalkUpFromFoo() calls WalkUpFromBar() (where Bar
107b5c202f9e4f6d0f230d5cb8848779259ebf95b7fChandler Carruth/// is Foo's super class) before calling VisitFoo(), the result is
108b5c202f9e4f6d0f230d5cb8848779259ebf95b7fChandler Carruth/// that the Visit*() methods for a given node are called in the
10980434a334c92d2f24f38fbbd14acd6c3f6c72306Michael Han/// top-down order (e.g. for a node of type NamespaceDecl, the order will
110b5c202f9e4f6d0f230d5cb8848779259ebf95b7fChandler Carruth/// be VisitDecl(), VisitNamedDecl(), and then VisitNamespaceDecl()).
111b5c202f9e4f6d0f230d5cb8848779259ebf95b7fChandler Carruth///
112dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth/// This scheme guarantees that all Visit*() calls for the same AST
113dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth/// node are grouped together.  In other words, Visit*() methods for
114dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth/// different nodes are never interleaved.
115dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth///
116dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth/// Clients of this visitor should subclass the visitor (providing
117dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth/// themselves as the template argument, using the curiously recurring
118dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth/// template pattern) and override any of the Traverse*, WalkUpFrom*,
119dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth/// and Visit* methods for declarations, types, statements,
120dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth/// expressions, or other AST nodes where the visitor should customize
121dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth/// behavior.  Most users only need to override Visit*.  Advanced
122dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth/// users may override Traverse* and WalkUpFrom* to implement custom
123e3e210c3aa3c1b289eee669a1d235fc16df384a0Chandler Carruth/// traversal strategies.  Returning false from one of these overridden
124dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth/// functions will abort the entire traversal.
125760c8af273d9871d063250ae626fb6df94c121f2John McCall///
126760c8af273d9871d063250ae626fb6df94c121f2John McCall/// By default, this visitor tries to visit every part of the explicit
127760c8af273d9871d063250ae626fb6df94c121f2John McCall/// source code exactly once.  The default policy towards templates
128760c8af273d9871d063250ae626fb6df94c121f2John McCall/// is to descend into the 'pattern' class or function body, not any
129760c8af273d9871d063250ae626fb6df94c121f2John McCall/// explicit or implicit instantiations.  Explicit specializations
130760c8af273d9871d063250ae626fb6df94c121f2John McCall/// are still visited, and the patterns of partial specializations
131760c8af273d9871d063250ae626fb6df94c121f2John McCall/// are visited separately.  This behavior can be changed by
132760c8af273d9871d063250ae626fb6df94c121f2John McCall/// overriding shouldVisitTemplateInstantiations() in the derived class
133760c8af273d9871d063250ae626fb6df94c121f2John McCall/// to return true, in which case all known implicit and explicit
134760c8af273d9871d063250ae626fb6df94c121f2John McCall/// instantiations will be visited at the same time as the pattern
135760c8af273d9871d063250ae626fb6df94c121f2John McCall/// from which they were produced.
1364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar///
1374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar/// By default, this visitor preorder traverses the AST. If postorder traversal
1384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar/// is needed, the \c shouldTraversePostOrder method needs to be overriden
1394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar/// to return \c true.
1406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate <typename Derived> class RecursiveASTVisitor {
141db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewyckypublic:
14287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// A queue used for performing data recursion over statements.
14387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// Parameters involving this type are used to implement data
14487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// recursion over Stmts and Exprs within this class, and should
14587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// typically not be explicitly specified by derived classes.
1464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// The bool bit indicates whether the statement has been traversed or not.
1474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  typedef SmallVectorImpl<llvm::PointerIntPair<Stmt *, 1, bool>>
1484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    DataRecursionQueue;
14987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
150db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky  /// \brief Return a reference to the derived class.
1516bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  Derived &getDerived() { return *static_cast<Derived *>(this); }
152db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky
153760c8af273d9871d063250ae626fb6df94c121f2John McCall  /// \brief Return whether this visitor should recurse into
154760c8af273d9871d063250ae626fb6df94c121f2John McCall  /// template instantiations.
155760c8af273d9871d063250ae626fb6df94c121f2John McCall  bool shouldVisitTemplateInstantiations() const { return false; }
156536bab452fa38692834233187ed3d49b83722cb3Craig Silverstein
157a40bc724849f9cdc6a7706bc5d230685c3bdf63cDouglas Gregor  /// \brief Return whether this visitor should recurse into the types of
158a40bc724849f9cdc6a7706bc5d230685c3bdf63cDouglas Gregor  /// TypeLocs.
159a40bc724849f9cdc6a7706bc5d230685c3bdf63cDouglas Gregor  bool shouldWalkTypesOfTypeLocs() const { return true; }
160ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie
161c28a335184207a47f34eb9d1707dc8d7c6c7b8b6Richard Smith  /// \brief Return whether this visitor should recurse into implicit
16252ec0c0357ce970ca52a27c1086626450f0967e7Daniel Jasper  /// code, e.g., implicit constructors and destructors.
16352ec0c0357ce970ca52a27c1086626450f0967e7Daniel Jasper  bool shouldVisitImplicitCode() const { return false; }
164c28a335184207a47f34eb9d1707dc8d7c6c7b8b6Richard Smith
1654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief Return whether this visitor should traverse post-order.
1664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  bool shouldTraversePostOrder() const { return false; }
1674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
168db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky  /// \brief Recursively visit a statement or expression, by
169717cc00c16eabf0eefd3cc69394e97f7229af0c8Zhanyong Wan  /// dispatching to Traverse*() based on the argument's dynamic type.
170db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky  ///
171e3e210c3aa3c1b289eee669a1d235fc16df384a0Chandler Carruth  /// \returns false if the visitation was terminated early, true
17287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// otherwise (including when the argument is nullptr).
17387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  bool TraverseStmt(Stmt *S, DataRecursionQueue *Queue = nullptr);
174db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky
1754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// Invoked before visiting a statement or expression via data recursion.
1764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///
1774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \returns false to skip visiting the node, true otherwise.
1784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  bool dataTraverseStmtPre(Stmt *S) { return true; }
1794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// Invoked after visiting a statement or expression via data recursion.
1814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// This is not invoked if the previously invoked \c dataTraverseStmtPre
1824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// returned false.
1834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///
1844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \returns false if the visitation was terminated early, true otherwise.
1854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  bool dataTraverseStmtPost(Stmt *S) { return true; }
1864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
187db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky  /// \brief Recursively visit a type, by dispatching to
188717cc00c16eabf0eefd3cc69394e97f7229af0c8Zhanyong Wan  /// Traverse*Type() based on the argument's getTypeClass() property.
189db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky  ///
190e3e210c3aa3c1b289eee669a1d235fc16df384a0Chandler Carruth  /// \returns false if the visitation was terminated early, true
191db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky  /// otherwise (including when the argument is a Null type).
192dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth  bool TraverseType(QualType T);
193db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky
1944d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky  /// \brief Recursively visit a type with location, by dispatching to
195717cc00c16eabf0eefd3cc69394e97f7229af0c8Zhanyong Wan  /// Traverse*TypeLoc() based on the argument type's getTypeClass() property.
1964d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky  ///
1974d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky  /// \returns false if the visitation was terminated early, true
1984d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky  /// otherwise (including when the argument is a Null type location).
1994d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky  bool TraverseTypeLoc(TypeLoc TL);
2004d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky
201651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \brief Recursively visit an attribute, by dispatching to
202651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// Traverse*Attr() based on the argument's dynamic type.
203651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  ///
204651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// \returns false if the visitation was terminated early, true
205651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// otherwise (including when the argument is a Null type location).
206651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  bool TraverseAttr(Attr *At);
207651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
208db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky  /// \brief Recursively visit a declaration, by dispatching to
209717cc00c16eabf0eefd3cc69394e97f7229af0c8Zhanyong Wan  /// Traverse*Decl() based on the argument's dynamic type.
210db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky  ///
211e3e210c3aa3c1b289eee669a1d235fc16df384a0Chandler Carruth  /// \returns false if the visitation was terminated early, true
212db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky  /// otherwise (including when the argument is NULL).
213dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth  bool TraverseDecl(Decl *D);
214db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky
215db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky  /// \brief Recursively visit a C++ nested-name-specifier.
216db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky  ///
217e3e210c3aa3c1b289eee669a1d235fc16df384a0Chandler Carruth  /// \returns false if the visitation was terminated early, true otherwise.
218dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth  bool TraverseNestedNameSpecifier(NestedNameSpecifier *NNS);
219db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky
220ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie  /// \brief Recursively visit a C++ nested-name-specifier with location
221dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor  /// information.
222dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor  ///
223dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor  /// \returns false if the visitation was terminated early, true otherwise.
224dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor  bool TraverseNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS);
225dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor
22665019acfc46ffb191fac4e781ac0c4b8d0c8434eDouglas Gregor  /// \brief Recursively visit a name with its location information.
22765019acfc46ffb191fac4e781ac0c4b8d0c8434eDouglas Gregor  ///
22865019acfc46ffb191fac4e781ac0c4b8d0c8434eDouglas Gregor  /// \returns false if the visitation was terminated early, true otherwise.
22965019acfc46ffb191fac4e781ac0c4b8d0c8434eDouglas Gregor  bool TraverseDeclarationNameInfo(DeclarationNameInfo NameInfo);
230ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie
231dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth  /// \brief Recursively visit a template name and dispatch to the
232dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth  /// appropriate method.
233db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky  ///
234e3e210c3aa3c1b289eee669a1d235fc16df384a0Chandler Carruth  /// \returns false if the visitation was terminated early, true otherwise.
235dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth  bool TraverseTemplateName(TemplateName Template);
236db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky
237dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth  /// \brief Recursively visit a template argument and dispatch to the
238dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth  /// appropriate method for the argument type.
239db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky  ///
240e3e210c3aa3c1b289eee669a1d235fc16df384a0Chandler Carruth  /// \returns false if the visitation was terminated early, true otherwise.
2414d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky  // FIXME: migrate callers to TemplateArgumentLoc instead.
242dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth  bool TraverseTemplateArgument(const TemplateArgument &Arg);
243db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky
2444d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky  /// \brief Recursively visit a template argument location and dispatch to the
2454d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky  /// appropriate method for the argument type.
2464d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky  ///
2474d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky  /// \returns false if the visitation was terminated early, true otherwise.
2484d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky  bool TraverseTemplateArgumentLoc(const TemplateArgumentLoc &ArgLoc);
2494d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky
250db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky  /// \brief Recursively visit a set of template arguments.
251dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth  /// This can be overridden by a subclass, but it's not expected that
252dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth  /// will be needed -- this visitor always dispatches to another.
253db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky  ///
254e3e210c3aa3c1b289eee669a1d235fc16df384a0Chandler Carruth  /// \returns false if the visitation was terminated early, true otherwise.
255dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth  // FIXME: take a TemplateArgumentLoc* (or TemplateArgumentListInfo) instead.
256dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth  bool TraverseTemplateArguments(const TemplateArgument *Args,
257dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth                                 unsigned NumArgs);
258db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky
2590f8c08843fc6c8abe03654f609e1e03fcc557855Craig Silverstein  /// \brief Recursively visit a constructor initializer.  This
2600f8c08843fc6c8abe03654f609e1e03fcc557855Craig Silverstein  /// automatically dispatches to another visitor for the initializer
2610f8c08843fc6c8abe03654f609e1e03fcc557855Craig Silverstein  /// expression, but not for the name of the initializer, so may
2624d072932287eb074a4168804cac1acb18a51d5e8Craig Silverstein  /// be overridden for clients that need access to the name.
2630f8c08843fc6c8abe03654f609e1e03fcc557855Craig Silverstein  ///
2640f8c08843fc6c8abe03654f609e1e03fcc557855Craig Silverstein  /// \returns false if the visitation was terminated early, true otherwise.
265cbb67480094b3bcb5b715acd827cbad55e2a204cSean Hunt  bool TraverseConstructorInitializer(CXXCtorInitializer *Init);
2660f8c08843fc6c8abe03654f609e1e03fcc557855Craig Silverstein
267011d8b93b7cfa8492b8a9c909a850d6577e08dcaDouglas Gregor  /// \brief Recursively visit a lambda capture.
268011d8b93b7cfa8492b8a9c909a850d6577e08dcaDouglas Gregor  ///
269011d8b93b7cfa8492b8a9c909a850d6577e08dcaDouglas Gregor  /// \returns false if the visitation was terminated early, true otherwise.
2706bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  bool TraverseLambdaCapture(LambdaExpr *LE, const LambdaCapture *C);
27149007d7561212c0ae168702c1af1404c01ef43ffJames Dennett
27249007d7561212c0ae168702c1af1404c01ef43ffJames Dennett  /// \brief Recursively visit the body of a lambda expression.
27349007d7561212c0ae168702c1af1404c01ef43ffJames Dennett  ///
27449007d7561212c0ae168702c1af1404c01ef43ffJames Dennett  /// This provides a hook for visitors that need more context when visiting
27549007d7561212c0ae168702c1af1404c01ef43ffJames Dennett  /// \c LE->getBody().
27649007d7561212c0ae168702c1af1404c01ef43ffJames Dennett  ///
27749007d7561212c0ae168702c1af1404c01ef43ffJames Dennett  /// \returns false if the visitation was terminated early, true otherwise.
27887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  bool TraverseLambdaBody(LambdaExpr *LE, DataRecursionQueue *Queue = nullptr);
27987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
28087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Recursively visit the syntactic or semantic form of an
28187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// initialization list.
28287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  ///
28387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \returns false if the visitation was terminated early, true otherwise.
28487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  bool TraverseSynOrSemInitListExpr(InitListExpr *S,
28587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                                    DataRecursionQueue *Queue = nullptr);
28649007d7561212c0ae168702c1af1404c01ef43ffJames Dennett
287651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // ---- Methods on Attrs ----
288651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
289651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // \brief Visit an attribute.
290651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  bool VisitAttr(Attr *A) { return true; }
291651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
2926bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// Declare Traverse* and empty Visit* for all Attr classes.
293651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#define ATTR_VISITOR_DECLS_ONLY
294651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#include "clang/AST/AttrVisitor.inc"
295651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#undef ATTR_VISITOR_DECLS_ONLY
296651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
2976bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// ---- Methods on Stmts ----
298dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth
29987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarprivate:
30087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  template<typename T, typename U>
30187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  struct has_same_member_pointer_type : std::false_type {};
30287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  template<typename T, typename U, typename R, typename... P>
30387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  struct has_same_member_pointer_type<R (T::*)(P...), R (U::*)(P...)>
30487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      : std::true_type {};
30587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
30687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  // Traverse the given statement. If the most-derived traverse function takes a
30787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  // data recursion queue, pass it on; otherwise, discard it. Note that the
30887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  // first branch of this conditional must compile whether or not the derived
30987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  // class can take a queue, so if we're taking the second arm, make the first
31087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  // arm call our function rather than the derived class version.
31187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar#define TRAVERSE_STMT_BASE(NAME, CLASS, VAR, QUEUE)                            \
31287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  (has_same_member_pointer_type<decltype(                                      \
31387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                                    &RecursiveASTVisitor::Traverse##NAME),     \
31487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                                decltype(&Derived::Traverse##NAME)>::value     \
31587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar       ? static_cast<typename std::conditional<                                \
31687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar             has_same_member_pointer_type<                                     \
31787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                 decltype(&RecursiveASTVisitor::Traverse##NAME),               \
31887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                 decltype(&Derived::Traverse##NAME)>::value,                   \
31987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar             Derived &, RecursiveASTVisitor &>::type>(*this)                   \
32087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar             .Traverse##NAME(static_cast<CLASS *>(VAR), QUEUE)                 \
32187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar       : getDerived().Traverse##NAME(static_cast<CLASS *>(VAR)))
32287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
32387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// Try to traverse the given statement, or enqueue it if we're performing data
32487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// recursion in the middle of traversing another statement. Can only be called
32587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// from within a DEF_TRAVERSE_STMT body or similar context.
32687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar#define TRY_TO_TRAVERSE_OR_ENQUEUE_STMT(S)                                     \
32787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  do {                                                                         \
32887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    if (!TRAVERSE_STMT_BASE(Stmt, Stmt, S, Queue))                             \
32987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      return false;                                                            \
33087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  } while (0)
33187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
33287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarpublic:
3336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// Declare Traverse*() for all concrete Stmt classes.
334dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth#define ABSTRACT_STMT(STMT)
33587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar#define STMT(CLASS, PARENT) \
33687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  bool Traverse##CLASS(CLASS *S, DataRecursionQueue *Queue = nullptr);
337dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth#include "clang/AST/StmtNodes.inc"
338dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth  // The above header #undefs ABSTRACT_STMT and STMT upon exit.
339dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth
340dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth  // Define WalkUpFrom*() and empty Visit*() for all Stmt classes.
341dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth  bool WalkUpFromStmt(Stmt *S) { return getDerived().VisitStmt(S); }
342e3e210c3aa3c1b289eee669a1d235fc16df384a0Chandler Carruth  bool VisitStmt(Stmt *S) { return true; }
3436bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#define STMT(CLASS, PARENT)                                                    \
3446bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  bool WalkUpFrom##CLASS(CLASS *S) {                                           \
3456bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(WalkUpFrom##PARENT(S));                                             \
3466bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(Visit##CLASS(S));                                                   \
3476bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    return true;                                                               \
3486bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  }                                                                            \
349e3e210c3aa3c1b289eee669a1d235fc16df384a0Chandler Carruth  bool Visit##CLASS(CLASS *S) { return true; }
350d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor#include "clang/AST/StmtNodes.inc"
351db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky
3526bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// Define Traverse*(), WalkUpFrom*(), and Visit*() for unary
3536bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// operator methods.  Unary operators are not classes in themselves
3546bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// (they're all opcodes in UnaryOperator) but do have visitors.
3556bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#define OPERATOR(NAME)                                                         \
35687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  bool TraverseUnary##NAME(UnaryOperator *S,                                   \
35787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                           DataRecursionQueue *Queue = nullptr) {              \
3586bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(WalkUpFromUnary##NAME(S));                                          \
3594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    TRY_TO_TRAVERSE_OR_ENQUEUE_STMT(S->getSubExpr());                          \
3606bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    return true;                                                               \
3616bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  }                                                                            \
3626bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  bool WalkUpFromUnary##NAME(UnaryOperator *S) {                               \
3636bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(WalkUpFromUnaryOperator(S));                                        \
3646bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(VisitUnary##NAME(S));                                               \
3656bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    return true;                                                               \
3666bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  }                                                                            \
367e3e210c3aa3c1b289eee669a1d235fc16df384a0Chandler Carruth  bool VisitUnary##NAME(UnaryOperator *S) { return true; }
368dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth
3697d66f8cafd807e551efb4739cdb37fc272cf5345Chandler Carruth  UNARYOP_LIST()
3707d66f8cafd807e551efb4739cdb37fc272cf5345Chandler Carruth#undef OPERATOR
371dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth
3726bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// Define Traverse*(), WalkUpFrom*(), and Visit*() for binary
3736bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// operator methods.  Binary operators are not classes in themselves
3746bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// (they're all opcodes in BinaryOperator) but do have visitors.
3756bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#define GENERAL_BINOP_FALLBACK(NAME, BINOP_TYPE)                               \
37687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  bool TraverseBin##NAME(BINOP_TYPE *S, DataRecursionQueue *Queue = nullptr) { \
3774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    if (!getDerived().shouldTraversePostOrder())                               \
3784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      TRY_TO(WalkUpFromBin##NAME(S));                                          \
3794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    TRY_TO_TRAVERSE_OR_ENQUEUE_STMT(S->getLHS());                              \
3804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    TRY_TO_TRAVERSE_OR_ENQUEUE_STMT(S->getRHS());                              \
3816bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    return true;                                                               \
3826bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  }                                                                            \
3836bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  bool WalkUpFromBin##NAME(BINOP_TYPE *S) {                                    \
3846bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(WalkUpFrom##BINOP_TYPE(S));                                         \
3856bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(VisitBin##NAME(S));                                                 \
3866bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    return true;                                                               \
3876bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  }                                                                            \
388e3e210c3aa3c1b289eee669a1d235fc16df384a0Chandler Carruth  bool VisitBin##NAME(BINOP_TYPE *S) { return true; }
389dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth
3907d66f8cafd807e551efb4739cdb37fc272cf5345Chandler Carruth#define OPERATOR(NAME) GENERAL_BINOP_FALLBACK(NAME, BinaryOperator)
3917d66f8cafd807e551efb4739cdb37fc272cf5345Chandler Carruth  BINOP_LIST()
3927d66f8cafd807e551efb4739cdb37fc272cf5345Chandler Carruth#undef OPERATOR
393db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky
3946bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// Define Traverse*(), WalkUpFrom*(), and Visit*() for compound
3956bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// assignment methods.  Compound assignment operators are not
3966bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// classes in themselves (they're all opcodes in
3976bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// CompoundAssignOperator) but do have visitors.
3986bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#define OPERATOR(NAME)                                                         \
3997d66f8cafd807e551efb4739cdb37fc272cf5345Chandler Carruth  GENERAL_BINOP_FALLBACK(NAME##Assign, CompoundAssignOperator)
400dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth
4017d66f8cafd807e551efb4739cdb37fc272cf5345Chandler Carruth  CAO_LIST()
4027d66f8cafd807e551efb4739cdb37fc272cf5345Chandler Carruth#undef OPERATOR
403dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth#undef GENERAL_BINOP_FALLBACK
404facfc77487a890bfb7b5eee7e21cd2b395a9faafChandler Carruth
4056bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// ---- Methods on Types ----
4066bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// FIXME: revamp to take TypeLoc's rather than Types.
407facfc77487a890bfb7b5eee7e21cd2b395a9faafChandler Carruth
4086bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// Declare Traverse*() for all concrete Type classes.
409dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth#define ABSTRACT_TYPE(CLASS, BASE)
4106bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#define TYPE(CLASS, BASE) bool Traverse##CLASS##Type(CLASS##Type *T);
411dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth#include "clang/AST/TypeNodes.def"
412dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth  // The above header #undefs ABSTRACT_TYPE and TYPE upon exit.
413dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth
414dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth  // Define WalkUpFrom*() and empty Visit*() for all Type classes.
415dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth  bool WalkUpFromType(Type *T) { return getDerived().VisitType(T); }
416e3e210c3aa3c1b289eee669a1d235fc16df384a0Chandler Carruth  bool VisitType(Type *T) { return true; }
4176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#define TYPE(CLASS, BASE)                                                      \
4186bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  bool WalkUpFrom##CLASS##Type(CLASS##Type *T) {                               \
4196bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(WalkUpFrom##BASE(T));                                               \
4206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(Visit##CLASS##Type(T));                                             \
4216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    return true;                                                               \
4226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  }                                                                            \
423e3e210c3aa3c1b289eee669a1d235fc16df384a0Chandler Carruth  bool Visit##CLASS##Type(CLASS##Type *T) { return true; }
424d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor#include "clang/AST/TypeNodes.def"
425facfc77487a890bfb7b5eee7e21cd2b395a9faafChandler Carruth
4266bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// ---- Methods on TypeLocs ----
4276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// FIXME: this currently just calls the matching Type methods
4284d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky
4296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// Declare Traverse*() for all concrete TypeLoc classes.
4304d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky#define ABSTRACT_TYPELOC(CLASS, BASE)
4316bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#define TYPELOC(CLASS, BASE) bool Traverse##CLASS##TypeLoc(CLASS##TypeLoc TL);
4324d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky#include "clang/AST/TypeLocNodes.def"
4334d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky  // The above header #undefs ABSTRACT_TYPELOC and TYPELOC upon exit.
4344d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky
435717cc00c16eabf0eefd3cc69394e97f7229af0c8Zhanyong Wan  // Define WalkUpFrom*() and empty Visit*() for all TypeLoc classes.
4364d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky  bool WalkUpFromTypeLoc(TypeLoc TL) { return getDerived().VisitTypeLoc(TL); }
437717cc00c16eabf0eefd3cc69394e97f7229af0c8Zhanyong Wan  bool VisitTypeLoc(TypeLoc TL) { return true; }
438717cc00c16eabf0eefd3cc69394e97f7229af0c8Zhanyong Wan
439717cc00c16eabf0eefd3cc69394e97f7229af0c8Zhanyong Wan  // QualifiedTypeLoc and UnqualTypeLoc are not declared in
440717cc00c16eabf0eefd3cc69394e97f7229af0c8Zhanyong Wan  // TypeNodes.def and thus need to be handled specially.
4414d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky  bool WalkUpFromQualifiedTypeLoc(QualifiedTypeLoc TL) {
4424d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky    return getDerived().VisitUnqualTypeLoc(TL.getUnqualifiedLoc());
4434d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky  }
444717cc00c16eabf0eefd3cc69394e97f7229af0c8Zhanyong Wan  bool VisitQualifiedTypeLoc(QualifiedTypeLoc TL) { return true; }
4454d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky  bool WalkUpFromUnqualTypeLoc(UnqualTypeLoc TL) {
4464d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky    return getDerived().VisitUnqualTypeLoc(TL.getUnqualifiedLoc());
4474d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky  }
448717cc00c16eabf0eefd3cc69394e97f7229af0c8Zhanyong Wan  bool VisitUnqualTypeLoc(UnqualTypeLoc TL) { return true; }
449717cc00c16eabf0eefd3cc69394e97f7229af0c8Zhanyong Wan
4506bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// Note that BASE includes trailing 'Type' which CLASS doesn't.
4516bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#define TYPE(CLASS, BASE)                                                      \
4526bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  bool WalkUpFrom##CLASS##TypeLoc(CLASS##TypeLoc TL) {                         \
4536bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(WalkUpFrom##BASE##Loc(TL));                                         \
4546bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(Visit##CLASS##TypeLoc(TL));                                         \
4556bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    return true;                                                               \
4566bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  }                                                                            \
457717cc00c16eabf0eefd3cc69394e97f7229af0c8Zhanyong Wan  bool Visit##CLASS##TypeLoc(CLASS##TypeLoc TL) { return true; }
4584d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky#include "clang/AST/TypeNodes.def"
4594d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky
4606bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// ---- Methods on Decls ----
461dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth
4626bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// Declare Traverse*() for all concrete Decl classes.
463dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth#define ABSTRACT_DECL(DECL)
4646bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#define DECL(CLASS, BASE) bool Traverse##CLASS##Decl(CLASS##Decl *D);
465dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth#include "clang/AST/DeclNodes.inc"
466dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth  // The above header #undefs ABSTRACT_DECL and DECL upon exit.
467dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth
468dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth  // Define WalkUpFrom*() and empty Visit*() for all Decl classes.
469dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth  bool WalkUpFromDecl(Decl *D) { return getDerived().VisitDecl(D); }
470e3e210c3aa3c1b289eee669a1d235fc16df384a0Chandler Carruth  bool VisitDecl(Decl *D) { return true; }
4716bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#define DECL(CLASS, BASE)                                                      \
4726bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  bool WalkUpFrom##CLASS##Decl(CLASS##Decl *D) {                               \
4736bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(WalkUpFrom##BASE(D));                                               \
4746bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(Visit##CLASS##Decl(D));                                             \
4756bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    return true;                                                               \
4766bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  }                                                                            \
477e3e210c3aa3c1b289eee669a1d235fc16df384a0Chandler Carruth  bool Visit##CLASS##Decl(CLASS##Decl *D) { return true; }
4789a55591af3e5506b95a9718e15380129fbfc5ebcSean Hunt#include "clang/AST/DeclNodes.inc"
4799a55591af3e5506b95a9718e15380129fbfc5ebcSean Hunt
480dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruthprivate:
481dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth  // These are helper methods used by more than one Traverse* method.
482dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth  bool TraverseTemplateParameterListHelper(TemplateParameterList *TPL);
4838d2a5ea694ed0002b45deb2bd35db451b16a07d6Larisse Voufo#define DEF_TRAVERSE_TMPL_INST(TMPLDECLKIND)                                   \
4848d2a5ea694ed0002b45deb2bd35db451b16a07d6Larisse Voufo  bool TraverseTemplateInstantiations(TMPLDECLKIND##TemplateDecl *D);
4858d2a5ea694ed0002b45deb2bd35db451b16a07d6Larisse Voufo  DEF_TRAVERSE_TMPL_INST(Class)
4868d2a5ea694ed0002b45deb2bd35db451b16a07d6Larisse Voufo  DEF_TRAVERSE_TMPL_INST(Var)
4878d2a5ea694ed0002b45deb2bd35db451b16a07d6Larisse Voufo  DEF_TRAVERSE_TMPL_INST(Function)
4888d2a5ea694ed0002b45deb2bd35db451b16a07d6Larisse Voufo#undef DEF_TRAVERSE_TMPL_INST
489536bab452fa38692834233187ed3d49b83722cb3Craig Silverstein  bool TraverseTemplateArgumentLocsHelper(const TemplateArgumentLoc *TAL,
490dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth                                          unsigned Count);
491cf4679e60a5c5fa13e4bfe69f8186658c828af49Craig Silverstein  bool TraverseArrayTypeLocHelper(ArrayTypeLoc TL);
492dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth  bool TraverseRecordHelper(RecordDecl *D);
493dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth  bool TraverseCXXRecordHelper(CXXRecordDecl *D);
494dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth  bool TraverseDeclaratorHelper(DeclaratorDecl *D);
4954d072932287eb074a4168804cac1acb18a51d5e8Craig Silverstein  bool TraverseDeclContextHelper(DeclContext *DC);
496dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth  bool TraverseFunctionHelper(FunctionDecl *D);
497dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth  bool TraverseVarHelper(VarDecl *D);
498651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  bool TraverseOMPExecutableDirective(OMPExecutableDirective *S);
499176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  bool TraverseOMPLoopDirective(OMPLoopDirective *S);
500c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  bool TraverseOMPClause(OMPClause *C);
5016bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#define OPENMP_CLAUSE(Name, Class) bool Visit##Class(Class *C);
5024fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev#include "clang/Basic/OpenMPKinds.def"
503543c4ae954f2bce5ac58ed22080f23cbd94794d2Alexey Bataev  /// \brief Process clauses with list of variables.
504c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  template <typename T> bool VisitOMPClauseList(T *Node);
5054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// Process clauses with pre-initis.
5064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  bool VisitOMPClauseWithPreInit(OMPClauseWithPreInit *Node);
5074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  bool VisitOMPClauseWithPostUpdate(OMPClauseWithPostUpdate *Node);
50890226acd0b9be2964343cd63ae604bf0a656d33bArgyrios Kyrtzidis
50987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  bool dataTraverseNode(Stmt *S, DataRecursionQueue *Queue);
5104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  bool PostVisitStmt(Stmt *S);
51186b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek};
51286b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek
5136bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate <typename Derived>
51486b32fd702d794bb655c59a1238bf7422869f506Ted Kremenekbool RecursiveASTVisitor<Derived>::dataTraverseNode(Stmt *S,
51587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                                                    DataRecursionQueue *Queue) {
51687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar#define DISPATCH_STMT(NAME, CLASS, VAR)                                        \
51787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  return TRAVERSE_STMT_BASE(NAME, CLASS, VAR, Queue);
51886b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek
51987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  // If we have a binary expr, dispatch to the subcode of the binop.  A smart
52087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  // optimizer (e.g. LLVM) will fold this comparison into the switch stmt
52187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  // below.
52286b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek  if (BinaryOperator *BinOp = dyn_cast<BinaryOperator>(S)) {
52386b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek    switch (BinOp->getOpcode()) {
5246bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#define OPERATOR(NAME)                                                         \
5256bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  case BO_##NAME:                                                              \
52687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    DISPATCH_STMT(Bin##NAME, BinaryOperator, S);
52786b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek
5286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      BINOP_LIST()
52986b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek#undef OPERATOR
53087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar#undef BINOP_LIST
53186b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek
5326bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#define OPERATOR(NAME)                                                         \
5336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  case BO_##NAME##Assign:                                                      \
53487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    DISPATCH_STMT(Bin##NAME##Assign, CompoundAssignOperator, S);
53586b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek
5366bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      CAO_LIST()
53786b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek#undef OPERATOR
53887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar#undef CAO_LIST
53990226acd0b9be2964343cd63ae604bf0a656d33bArgyrios Kyrtzidis    }
54086b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek  } else if (UnaryOperator *UnOp = dyn_cast<UnaryOperator>(S)) {
54186b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek    switch (UnOp->getOpcode()) {
5426bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#define OPERATOR(NAME)                                                         \
5436bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  case UO_##NAME:                                                              \
54487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    DISPATCH_STMT(Unary##NAME, UnaryOperator, S);
54590226acd0b9be2964343cd63ae604bf0a656d33bArgyrios Kyrtzidis
5466bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      UNARYOP_LIST()
54786b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek#undef OPERATOR
54887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar#undef UNARYOP_LIST
54990226acd0b9be2964343cd63ae604bf0a656d33bArgyrios Kyrtzidis    }
55086b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek  }
55186b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek
55286b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek  // Top switch stmt: dispatch to TraverseFooStmt for each concrete FooStmt.
55386b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek  switch (S->getStmtClass()) {
5546bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  case Stmt::NoStmtClass:
5556bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    break;
55686b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek#define ABSTRACT_STMT(STMT)
5576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#define STMT(CLASS, PARENT)                                                    \
5586bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  case Stmt::CLASS##Class:                                                     \
55987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    DISPATCH_STMT(CLASS, CLASS, S);
56086b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek#include "clang/AST/StmtNodes.inc"
56186b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek  }
56286b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek
56386b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek  return true;
56486b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek}
56590226acd0b9be2964343cd63ae604bf0a656d33bArgyrios Kyrtzidis
56687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar#undef DISPATCH_STMT
567dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth
5684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
5694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainartemplate <typename Derived>
5704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarbool RecursiveASTVisitor<Derived>::PostVisitStmt(Stmt *S) {
5714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  switch (S->getStmtClass()) {
5724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  case Stmt::NoStmtClass:
5734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    break;
5744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#define ABSTRACT_STMT(STMT)
5754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#define STMT(CLASS, PARENT)                                                    \
5764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  case Stmt::CLASS##Class:                                                     \
5774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    TRY_TO(WalkUpFrom##CLASS(static_cast<CLASS *>(S))); break;
5784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#include "clang/AST/StmtNodes.inc"
5794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
5804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
5814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  return true;
5824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
5834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
5844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#undef DISPATCH_STMT
5854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
5866bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate <typename Derived>
58787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarbool RecursiveASTVisitor<Derived>::TraverseStmt(Stmt *S,
58887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                                                DataRecursionQueue *Queue) {
589db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky  if (!S)
590e3e210c3aa3c1b289eee669a1d235fc16df384a0Chandler Carruth    return true;
591db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky
59287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  if (Queue) {
5934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    Queue->push_back({S, false});
59487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return true;
59587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  }
59686b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek
5974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  SmallVector<llvm::PointerIntPair<Stmt *, 1, bool>, 8> LocalQueue;
5984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  LocalQueue.push_back({S, false});
59986b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek
60087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  while (!LocalQueue.empty()) {
6014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    auto &CurrSAndVisited = LocalQueue.back();
6024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    Stmt *CurrS = CurrSAndVisited.getPointer();
6034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    bool Visited = CurrSAndVisited.getInt();
6044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    if (Visited) {
6054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      LocalQueue.pop_back();
6064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      TRY_TO(dataTraverseStmtPost(CurrS));
6074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      if (getDerived().shouldTraversePostOrder()) {
6084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        TRY_TO(PostVisitStmt(CurrS));
6094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      }
6104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      continue;
6114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    }
61286b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek
6134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    if (getDerived().dataTraverseStmtPre(CurrS)) {
6144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      CurrSAndVisited.setInt(true);
6154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      size_t N = LocalQueue.size();
6164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      TRY_TO(dataTraverseNode(CurrS, &LocalQueue));
6174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      // Process new children in the order they were added.
6184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      std::reverse(LocalQueue.begin() + N, LocalQueue.end());
6194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    } else {
6204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      LocalQueue.pop_back();
6214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    }
622d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor  }
623db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky
624e3e210c3aa3c1b289eee669a1d235fc16df384a0Chandler Carruth  return true;
625db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky}
626db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky
62787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar#define DISPATCH(NAME, CLASS, VAR)                                             \
62887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  return getDerived().Traverse##NAME(static_cast<CLASS *>(VAR))
6296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
6306bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate <typename Derived>
631dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruthbool RecursiveASTVisitor<Derived>::TraverseType(QualType T) {
632db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky  if (T.isNull())
633e3e210c3aa3c1b289eee669a1d235fc16df384a0Chandler Carruth    return true;
634db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky
635db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky  switch (T->getTypeClass()) {
636dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth#define ABSTRACT_TYPE(CLASS, BASE)
6376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#define TYPE(CLASS, BASE)                                                      \
6386bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  case Type::CLASS:                                                            \
6396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    DISPATCH(CLASS##Type, CLASS##Type, const_cast<Type *>(T.getTypePtr()));
640d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor#include "clang/AST/TypeNodes.def"
641d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor  }
642db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky
643e3e210c3aa3c1b289eee669a1d235fc16df384a0Chandler Carruth  return true;
644db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky}
645db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky
6466bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate <typename Derived>
6474d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewyckybool RecursiveASTVisitor<Derived>::TraverseTypeLoc(TypeLoc TL) {
6484d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky  if (TL.isNull())
6494d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky    return true;
6504d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky
6514d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky  switch (TL.getTypeLocClass()) {
6524d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky#define ABSTRACT_TYPELOC(CLASS, BASE)
6536bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#define TYPELOC(CLASS, BASE)                                                   \
6546bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  case TypeLoc::CLASS:                                                         \
65539e6ab4be93d9c5e729a578ddd9d415cd2d49872David Blaikie    return getDerived().Traverse##CLASS##TypeLoc(TL.castAs<CLASS##TypeLoc>());
6564d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky#include "clang/AST/TypeLocNodes.def"
6574d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky  }
6584d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky
6594d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky  return true;
6604d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky}
6614d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky
662651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// Define the Traverse*Attr(Attr* A) methods
663651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#define VISITORCLASS RecursiveASTVisitor
664651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#include "clang/AST/AttrVisitor.inc"
665651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#undef VISITORCLASS
666651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
6676bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate <typename Derived>
668dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruthbool RecursiveASTVisitor<Derived>::TraverseDecl(Decl *D) {
669db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky  if (!D)
670e3e210c3aa3c1b289eee669a1d235fc16df384a0Chandler Carruth    return true;
671db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky
672c28a335184207a47f34eb9d1707dc8d7c6c7b8b6Richard Smith  // As a syntax visitor, by default we want to ignore declarations for
673c28a335184207a47f34eb9d1707dc8d7c6c7b8b6Richard Smith  // implicit declarations (ones not typed explicitly by the user).
67452ec0c0357ce970ca52a27c1086626450f0967e7Daniel Jasper  if (!getDerived().shouldVisitImplicitCode() && D->isImplicit())
675d0b982ca5cf685af08d5015e8c2dfae3ecab1a0bCraig Silverstein    return true;
676d0b982ca5cf685af08d5015e8c2dfae3ecab1a0bCraig Silverstein
677db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky  switch (D->getKind()) {
6789a55591af3e5506b95a9718e15380129fbfc5ebcSean Hunt#define ABSTRACT_DECL(DECL)
6796bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#define DECL(CLASS, BASE)                                                      \
6806bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  case Decl::CLASS:                                                            \
6816bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    if (!getDerived().Traverse##CLASS##Decl(static_cast<CLASS##Decl *>(D)))    \
6826bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      return false;                                                            \
683651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    break;
6849a55591af3e5506b95a9718e15380129fbfc5ebcSean Hunt#include "clang/AST/DeclNodes.inc"
685651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
686d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor
687651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // Visit any attributes attached to this declaration.
688651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  for (auto *I : D->attrs()) {
689651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    if (!getDerived().TraverseAttr(I))
690651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      return false;
691651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
692e3e210c3aa3c1b289eee669a1d235fc16df384a0Chandler Carruth  return true;
693db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky}
694db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky
695dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth#undef DISPATCH
696dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth
6976bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate <typename Derived>
698dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruthbool RecursiveASTVisitor<Derived>::TraverseNestedNameSpecifier(
6996bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    NestedNameSpecifier *NNS) {
700dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth  if (!NNS)
701e3e210c3aa3c1b289eee669a1d235fc16df384a0Chandler Carruth    return true;
702dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth
7036c321e35008f2c99eeb1409b43859a04c48e5ce5Chandler Carruth  if (NNS->getPrefix())
7046c321e35008f2c99eeb1409b43859a04c48e5ce5Chandler Carruth    TRY_TO(TraverseNestedNameSpecifier(NNS->getPrefix()));
705db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky
706db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky  switch (NNS->getKind()) {
707db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky  case NestedNameSpecifier::Identifier:
708db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky  case NestedNameSpecifier::Namespace:
70914aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor  case NestedNameSpecifier::NamespaceAlias:
710db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky  case NestedNameSpecifier::Global:
711176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  case NestedNameSpecifier::Super:
712e3e210c3aa3c1b289eee669a1d235fc16df384a0Chandler Carruth    return true;
713db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky
714db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky  case NestedNameSpecifier::TypeSpec:
715db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky  case NestedNameSpecifier::TypeSpecWithTemplate:
7166c321e35008f2c99eeb1409b43859a04c48e5ce5Chandler Carruth    TRY_TO(TraverseType(QualType(NNS->getAsType(), 0)));
717d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor  }
718d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor
719e3e210c3aa3c1b289eee669a1d235fc16df384a0Chandler Carruth  return true;
720db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky}
721d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor
7226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate <typename Derived>
723dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregorbool RecursiveASTVisitor<Derived>::TraverseNestedNameSpecifierLoc(
7246bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    NestedNameSpecifierLoc NNS) {
725dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor  if (!NNS)
726dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor    return true;
727ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie
7286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (NestedNameSpecifierLoc Prefix = NNS.getPrefix())
7296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(TraverseNestedNameSpecifierLoc(Prefix));
730ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie
731dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor  switch (NNS.getNestedNameSpecifier()->getKind()) {
732dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor  case NestedNameSpecifier::Identifier:
733dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor  case NestedNameSpecifier::Namespace:
734dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor  case NestedNameSpecifier::NamespaceAlias:
735dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor  case NestedNameSpecifier::Global:
736176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  case NestedNameSpecifier::Super:
737dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor    return true;
738ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie
739dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor  case NestedNameSpecifier::TypeSpec:
740dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor  case NestedNameSpecifier::TypeSpecWithTemplate:
741dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor    TRY_TO(TraverseTypeLoc(NNS.getTypeLoc()));
742dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor    break;
743dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor  }
744ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie
745dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor  return true;
746dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor}
747dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor
7486bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate <typename Derived>
74965019acfc46ffb191fac4e781ac0c4b8d0c8434eDouglas Gregorbool RecursiveASTVisitor<Derived>::TraverseDeclarationNameInfo(
7506bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    DeclarationNameInfo NameInfo) {
75165019acfc46ffb191fac4e781ac0c4b8d0c8434eDouglas Gregor  switch (NameInfo.getName().getNameKind()) {
75265019acfc46ffb191fac4e781ac0c4b8d0c8434eDouglas Gregor  case DeclarationName::CXXConstructorName:
75365019acfc46ffb191fac4e781ac0c4b8d0c8434eDouglas Gregor  case DeclarationName::CXXDestructorName:
75465019acfc46ffb191fac4e781ac0c4b8d0c8434eDouglas Gregor  case DeclarationName::CXXConversionFunctionName:
75565019acfc46ffb191fac4e781ac0c4b8d0c8434eDouglas Gregor    if (TypeSourceInfo *TSInfo = NameInfo.getNamedTypeInfo())
75665019acfc46ffb191fac4e781ac0c4b8d0c8434eDouglas Gregor      TRY_TO(TraverseTypeLoc(TSInfo->getTypeLoc()));
757ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie
75865019acfc46ffb191fac4e781ac0c4b8d0c8434eDouglas Gregor    break;
759ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie
76065019acfc46ffb191fac4e781ac0c4b8d0c8434eDouglas Gregor  case DeclarationName::Identifier:
76165019acfc46ffb191fac4e781ac0c4b8d0c8434eDouglas Gregor  case DeclarationName::ObjCZeroArgSelector:
76265019acfc46ffb191fac4e781ac0c4b8d0c8434eDouglas Gregor  case DeclarationName::ObjCOneArgSelector:
76365019acfc46ffb191fac4e781ac0c4b8d0c8434eDouglas Gregor  case DeclarationName::ObjCMultiArgSelector:
76465019acfc46ffb191fac4e781ac0c4b8d0c8434eDouglas Gregor  case DeclarationName::CXXOperatorName:
76565019acfc46ffb191fac4e781ac0c4b8d0c8434eDouglas Gregor  case DeclarationName::CXXLiteralOperatorName:
76665019acfc46ffb191fac4e781ac0c4b8d0c8434eDouglas Gregor  case DeclarationName::CXXUsingDirective:
76765019acfc46ffb191fac4e781ac0c4b8d0c8434eDouglas Gregor    break;
76865019acfc46ffb191fac4e781ac0c4b8d0c8434eDouglas Gregor  }
769ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie
77065019acfc46ffb191fac4e781ac0c4b8d0c8434eDouglas Gregor  return true;
77165019acfc46ffb191fac4e781ac0c4b8d0c8434eDouglas Gregor}
77265019acfc46ffb191fac4e781ac0c4b8d0c8434eDouglas Gregor
7736bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate <typename Derived>
774dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruthbool RecursiveASTVisitor<Derived>::TraverseTemplateName(TemplateName Template) {
775db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky  if (DependentTemplateName *DTN = Template.getAsDependentTemplateName())
7766c321e35008f2c99eeb1409b43859a04c48e5ce5Chandler Carruth    TRY_TO(TraverseNestedNameSpecifier(DTN->getQualifier()));
7776c321e35008f2c99eeb1409b43859a04c48e5ce5Chandler Carruth  else if (QualifiedTemplateName *QTN = Template.getAsQualifiedTemplateName())
7786c321e35008f2c99eeb1409b43859a04c48e5ce5Chandler Carruth    TRY_TO(TraverseNestedNameSpecifier(QTN->getQualifier()));
779db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky
780e3e210c3aa3c1b289eee669a1d235fc16df384a0Chandler Carruth  return true;
781db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky}
782db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky
7836bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate <typename Derived>
784dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruthbool RecursiveASTVisitor<Derived>::TraverseTemplateArgument(
7856bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    const TemplateArgument &Arg) {
786db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky  switch (Arg.getKind()) {
787db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky  case TemplateArgument::Null:
788db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky  case TemplateArgument::Declaration:
789db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky  case TemplateArgument::Integral:
790d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman  case TemplateArgument::NullPtr:
791e3e210c3aa3c1b289eee669a1d235fc16df384a0Chandler Carruth    return true;
792d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor
793db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky  case TemplateArgument::Type:
794dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth    return getDerived().TraverseType(Arg.getAsType());
795d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor
796db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky  case TemplateArgument::Template:
797a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor  case TemplateArgument::TemplateExpansion:
798a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor    return getDerived().TraverseTemplateName(
7996bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines        Arg.getAsTemplateOrTemplatePattern());
800db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky
801db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky  case TemplateArgument::Expression:
802dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth    return getDerived().TraverseStmt(Arg.getAsExpr());
803db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky
804db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky  case TemplateArgument::Pack:
805dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth    return getDerived().TraverseTemplateArguments(Arg.pack_begin(),
806dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth                                                  Arg.pack_size());
807d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor  }
808d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor
809e3e210c3aa3c1b289eee669a1d235fc16df384a0Chandler Carruth  return true;
810db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky}
811db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky
8124d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky// FIXME: no template name location?
8134d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky// FIXME: no source locations for a template argument pack?
8146bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate <typename Derived>
8154d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewyckybool RecursiveASTVisitor<Derived>::TraverseTemplateArgumentLoc(
8166bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    const TemplateArgumentLoc &ArgLoc) {
8174d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky  const TemplateArgument &Arg = ArgLoc.getArgument();
8184d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky
8194d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky  switch (Arg.getKind()) {
8204d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky  case TemplateArgument::Null:
8214d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky  case TemplateArgument::Declaration:
8224d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky  case TemplateArgument::Integral:
823d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman  case TemplateArgument::NullPtr:
8244d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky    return true;
8254d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky
8264d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky  case TemplateArgument::Type: {
827fcf431609769a9600c24618d1a33135caec4fef2Zhanyong Wan    // FIXME: how can TSI ever be NULL?
828fcf431609769a9600c24618d1a33135caec4fef2Zhanyong Wan    if (TypeSourceInfo *TSI = ArgLoc.getTypeSourceInfo())
829fcf431609769a9600c24618d1a33135caec4fef2Zhanyong Wan      return getDerived().TraverseTypeLoc(TSI->getTypeLoc());
830ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie    else
831f1fe3759e6e8b1756c514f1181c86bd4b9d1666cDouglas Gregor      return getDerived().TraverseType(Arg.getAsType());
8324d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky  }
8334d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky
8344d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky  case TemplateArgument::Template:
835a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor  case TemplateArgument::TemplateExpansion:
836b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor    if (ArgLoc.getTemplateQualifierLoc())
837b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor      TRY_TO(getDerived().TraverseNestedNameSpecifierLoc(
8386bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines          ArgLoc.getTemplateQualifierLoc()));
839a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor    return getDerived().TraverseTemplateName(
8406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines        Arg.getAsTemplateOrTemplatePattern());
8414d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky
8424d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky  case TemplateArgument::Expression:
8434d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky    return getDerived().TraverseStmt(ArgLoc.getSourceExpression());
8444d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky
8454d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky  case TemplateArgument::Pack:
8464d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky    return getDerived().TraverseTemplateArguments(Arg.pack_begin(),
8474d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky                                                  Arg.pack_size());
8484d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky  }
8494d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky
8504d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky  return true;
8514d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky}
8524d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky
8536bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate <typename Derived>
854dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruthbool RecursiveASTVisitor<Derived>::TraverseTemplateArguments(
8556bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    const TemplateArgument *Args, unsigned NumArgs) {
856dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth  for (unsigned I = 0; I != NumArgs; ++I) {
857dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth    TRY_TO(TraverseTemplateArgument(Args[I]));
858dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth  }
859d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor
860e3e210c3aa3c1b289eee669a1d235fc16df384a0Chandler Carruth  return true;
861db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky}
862db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky
8636bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate <typename Derived>
8644d072932287eb074a4168804cac1acb18a51d5e8Craig Silversteinbool RecursiveASTVisitor<Derived>::TraverseConstructorInitializer(
8656bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    CXXCtorInitializer *Init) {
86676852c218a207ef43583515cb835b6e855353a0fDouglas Gregor  if (TypeSourceInfo *TInfo = Init->getTypeSourceInfo())
86776852c218a207ef43583515cb835b6e855353a0fDouglas Gregor    TRY_TO(TraverseTypeLoc(TInfo->getTypeLoc()));
868ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie
8698268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett  if (Init->isWritten() || getDerived().shouldVisitImplicitCode())
8700f8c08843fc6c8abe03654f609e1e03fcc557855Craig Silverstein    TRY_TO(TraverseStmt(Init->getInit()));
8714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
8724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  if (getDerived().shouldVisitImplicitCode())
8734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // The braces for this one-line loop are required for MSVC2013.  It
8744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // refuses to compile
8754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    //     for (int i : int_vec)
8764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    //       do {} while(false);
8774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // without braces on the for loop.
8784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    for (VarDecl *VD : Init->getArrayIndices()) {
8794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      TRY_TO(TraverseDecl(VD));
8804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    }
8814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
8820f8c08843fc6c8abe03654f609e1e03fcc557855Craig Silverstein  return true;
8830f8c08843fc6c8abe03654f609e1e03fcc557855Craig Silverstein}
8840f8c08843fc6c8abe03654f609e1e03fcc557855Craig Silverstein
8856bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate <typename Derived>
8866bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesbool
8876bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesRecursiveASTVisitor<Derived>::TraverseLambdaCapture(LambdaExpr *LE,
8886bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                                                    const LambdaCapture *C) {
889b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  if (LE->isInitCapture(C))
89004fa7a33279808dc3e5117c41b5f84c40eeb7362Richard Smith    TRY_TO(TraverseDecl(C->getCapturedVar()));
891011d8b93b7cfa8492b8a9c909a850d6577e08dcaDouglas Gregor  return true;
892011d8b93b7cfa8492b8a9c909a850d6577e08dcaDouglas Gregor}
8930f8c08843fc6c8abe03654f609e1e03fcc557855Craig Silverstein
8946bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate <typename Derived>
89587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarbool RecursiveASTVisitor<Derived>::TraverseLambdaBody(
89687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    LambdaExpr *LE, DataRecursionQueue *Queue) {
89787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  TRY_TO_TRAVERSE_OR_ENQUEUE_STMT(LE->getBody());
89849007d7561212c0ae168702c1af1404c01ef43ffJames Dennett  return true;
89949007d7561212c0ae168702c1af1404c01ef43ffJames Dennett}
90049007d7561212c0ae168702c1af1404c01ef43ffJames Dennett
901dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth// ----------------- Type traversal -----------------
902dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth
903dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth// This macro makes available a variable T, the passed-in type.
9046bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#define DEF_TRAVERSE_TYPE(TYPE, CODE)                                          \
9056bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  template <typename Derived>                                                  \
9066bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  bool RecursiveASTVisitor<Derived>::Traverse##TYPE(TYPE *T) {                 \
9074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    if (!getDerived().shouldTraversePostOrder())                               \
9084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      TRY_TO(WalkUpFrom##TYPE(T));                                             \
9096bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    { CODE; }                                                                  \
9104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    if (getDerived().shouldTraversePostOrder())                                \
9114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      TRY_TO(WalkUpFrom##TYPE(T));                                             \
9126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    return true;                                                               \
913d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor  }
914d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor
9156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPE(BuiltinType, {})
916db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky
9176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPE(ComplexType, { TRY_TO(TraverseType(T->getElementType())); })
918db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky
9196bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPE(PointerType, { TRY_TO(TraverseType(T->getPointeeType())); })
920db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky
9216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPE(BlockPointerType,
9226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                  { TRY_TO(TraverseType(T->getPointeeType())); })
923db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky
9246bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPE(LValueReferenceType,
9256bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                  { TRY_TO(TraverseType(T->getPointeeType())); })
926db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky
9276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPE(RValueReferenceType,
9286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                  { TRY_TO(TraverseType(T->getPointeeType())); })
929db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky
930dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_TYPE(MemberPointerType, {
9316bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseType(QualType(T->getClass(), 0)));
9326bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseType(T->getPointeeType()));
9336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
934db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky
9356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPE(AdjustedType, { TRY_TO(TraverseType(T->getOriginalType())); })
936651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
9376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPE(DecayedType, { TRY_TO(TraverseType(T->getOriginalType())); })
93812df246d6dea2ee1f92c186f922f1afcf499647aReid Kleckner
9396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPE(ConstantArrayType,
9406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                  { TRY_TO(TraverseType(T->getElementType())); })
941d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor
9426bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPE(IncompleteArrayType,
9436bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                  { TRY_TO(TraverseType(T->getElementType())); })
944db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky
945dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_TYPE(VariableArrayType, {
9466bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseType(T->getElementType()));
9476bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseStmt(T->getSizeExpr()));
9486bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
949db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky
950dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_TYPE(DependentSizedArrayType, {
9516bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseType(T->getElementType()));
9526bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (T->getSizeExpr())
9536bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(TraverseStmt(T->getSizeExpr()));
9546bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
955d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor
956dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_TYPE(DependentSizedExtVectorType, {
9576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (T->getSizeExpr())
9586bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(TraverseStmt(T->getSizeExpr()));
9596bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseType(T->getElementType()));
9606bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
961d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor
9626bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPE(VectorType, { TRY_TO(TraverseType(T->getElementType())); })
963d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor
9646bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPE(ExtVectorType, { TRY_TO(TraverseType(T->getElementType())); })
965d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor
966651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesDEF_TRAVERSE_TYPE(FunctionNoProtoType,
967651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                  { TRY_TO(TraverseType(T->getReturnType())); })
968db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky
969dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_TYPE(FunctionProtoType, {
970651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  TRY_TO(TraverseType(T->getReturnType()));
971db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky
972651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  for (const auto &A : T->param_types()) {
973651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    TRY_TO(TraverseType(A));
974651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
975d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor
976651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  for (const auto &E : T->exceptions()) {
977651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    TRY_TO(TraverseType(E));
978651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
979176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
980176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  if (Expr *NE = T->getNoexceptExpr())
981176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    TRY_TO(TraverseStmt(NE));
982651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines})
983d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor
9846bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPE(UnresolvedUsingType, {})
9856bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPE(TypedefType, {})
986d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor
9876bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPE(TypeOfExprType,
9886bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                  { TRY_TO(TraverseStmt(T->getUnderlyingExpr())); })
989d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor
9906bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPE(TypeOfType, { TRY_TO(TraverseType(T->getUnderlyingType())); })
991db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky
9926bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPE(DecltypeType,
9936bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                  { TRY_TO(TraverseStmt(T->getUnderlyingExpr())); })
994d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor
995ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean HuntDEF_TRAVERSE_TYPE(UnaryTransformType, {
9966bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseType(T->getBaseType()));
9976bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseType(T->getUnderlyingType()));
9986bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
999ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt
10006bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPE(AutoType, { TRY_TO(TraverseType(T->getDeducedType())); })
100134b41d939a1328f484511c6002ba2456db879a29Richard Smith
10026bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPE(RecordType, {})
10036bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPE(EnumType, {})
10046bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPE(TemplateTypeParmType, {})
10056bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPE(SubstTemplateTypeParmType, {})
10066bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPE(SubstTemplateTypeParmPackType, {})
1007db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky
1008dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_TYPE(TemplateSpecializationType, {
10096bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseTemplateName(T->getTemplateName()));
10106bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseTemplateArguments(T->getArgs(), T->getNumArgs()));
10116bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
1012d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor
10136bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPE(InjectedClassNameType, {})
1014d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor
10156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPE(AttributedType,
10166bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                  { TRY_TO(TraverseType(T->getModifiedType())); })
10179d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall
10186bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPE(ParenType, { TRY_TO(TraverseType(T->getInnerType())); })
1019075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara
1020dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_TYPE(ElaboratedType, {
10216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (T->getQualifier()) {
102233500955d731c73717af52088b7fc0e7a85681e7John McCall    TRY_TO(TraverseNestedNameSpecifier(T->getQualifier()));
10236bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  }
10246bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseType(T->getNamedType()));
10256bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
10266bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
10276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPE(DependentNameType,
10286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                  { TRY_TO(TraverseNestedNameSpecifier(T->getQualifier())); })
1029d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor
103033500955d731c73717af52088b7fc0e7a85681e7John McCallDEF_TRAVERSE_TYPE(DependentTemplateSpecializationType, {
10316bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseNestedNameSpecifier(T->getQualifier()));
10326bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseTemplateArguments(T->getArgs(), T->getNumArgs()));
10336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
1034d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor
10356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPE(PackExpansionType, { TRY_TO(TraverseType(T->getPattern())); })
10367536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor
10376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPE(ObjCInterfaceType, {})
1038d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor
1039dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_TYPE(ObjCObjectType, {
10406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // We have to watch out here because an ObjCInterfaceType's base
10416bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // type is itself.
10426bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (T->getBaseType().getTypePtr() != T)
10436bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(TraverseType(T->getBaseType()));
104487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  for (auto typeArg : T->getTypeArgsAsWritten()) {
104587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    TRY_TO(TraverseType(typeArg));
104687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  }
10476bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
1048d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor
10496bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPE(ObjCObjectPointerType,
10506bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                  { TRY_TO(TraverseType(T->getPointeeType())); })
1051dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth
10526bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPE(AtomicType, { TRY_TO(TraverseType(T->getValueType())); })
1053b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman
10544967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarDEF_TRAVERSE_TYPE(PipeType, { TRY_TO(TraverseType(T->getElementType())); })
10554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1056dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth#undef DEF_TRAVERSE_TYPE
1057dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth
10584d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky// ----------------- TypeLoc traversal -----------------
10594d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky
10604d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky// This macro makes available a variable TL, the passed-in TypeLoc.
1061ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie// If requested, it calls WalkUpFrom* for the Type in the given TypeLoc,
1062ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie// in addition to WalkUpFrom* for the TypeLoc itself, such that existing
1063a40bc724849f9cdc6a7706bc5d230685c3bdf63cDouglas Gregor// clients that override the WalkUpFrom*Type() and/or Visit*Type() methods
1064717cc00c16eabf0eefd3cc69394e97f7229af0c8Zhanyong Wan// continue to work.
10656bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#define DEF_TRAVERSE_TYPELOC(TYPE, CODE)                                       \
10666bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  template <typename Derived>                                                  \
10676bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  bool RecursiveASTVisitor<Derived>::Traverse##TYPE##Loc(TYPE##Loc TL) {       \
10686bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    if (getDerived().shouldWalkTypesOfTypeLocs())                              \
10696bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      TRY_TO(WalkUpFrom##TYPE(const_cast<TYPE *>(TL.getTypePtr())));           \
10706bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(WalkUpFrom##TYPE##Loc(TL));                                         \
10716bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    { CODE; }                                                                  \
10726bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    return true;                                                               \
10734d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky  }
10744d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky
10756bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate <typename Derived>
10766bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesbool
10776bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesRecursiveASTVisitor<Derived>::TraverseQualifiedTypeLoc(QualifiedTypeLoc TL) {
10786b3f1ebce775499aff03845193de78128671262fCraig Silverstein  // Move this over to the 'main' typeloc tree.  Note that this is a
10796b3f1ebce775499aff03845193de78128671262fCraig Silverstein  // move -- we pretend that we were really looking at the unqualified
10806b3f1ebce775499aff03845193de78128671262fCraig Silverstein  // typeloc all along -- rather than a recursion, so we don't follow
10816b3f1ebce775499aff03845193de78128671262fCraig Silverstein  // the normal CRTP plan of going through
10826b3f1ebce775499aff03845193de78128671262fCraig Silverstein  // getDerived().TraverseTypeLoc.  If we did, we'd be traversing
10836b3f1ebce775499aff03845193de78128671262fCraig Silverstein  // twice for the same type (once as a QualifiedTypeLoc version of
10846b3f1ebce775499aff03845193de78128671262fCraig Silverstein  // the type, once as an UnqualifiedTypeLoc version of the type),
10856b3f1ebce775499aff03845193de78128671262fCraig Silverstein  // which in effect means we'd call VisitTypeLoc twice with the
10866b3f1ebce775499aff03845193de78128671262fCraig Silverstein  // 'same' type.  This solves that problem, at the cost of never
10876b3f1ebce775499aff03845193de78128671262fCraig Silverstein  // seeing the qualified version of the type (unless the client
10886b3f1ebce775499aff03845193de78128671262fCraig Silverstein  // subclasses TraverseQualifiedTypeLoc themselves).  It's not a
10896b3f1ebce775499aff03845193de78128671262fCraig Silverstein  // perfect solution.  A perfect solution probably requires making
10906b3f1ebce775499aff03845193de78128671262fCraig Silverstein  // QualifiedTypeLoc a wrapper around TypeLoc -- like QualType is a
10916b3f1ebce775499aff03845193de78128671262fCraig Silverstein  // wrapper around Type* -- rather than being its own class in the
10926b3f1ebce775499aff03845193de78128671262fCraig Silverstein  // type hierarchy.
10936b3f1ebce775499aff03845193de78128671262fCraig Silverstein  return TraverseTypeLoc(TL.getUnqualifiedLoc());
1094c34c2116346a29869b47b190f6dea589823d6947Craig Silverstein}
10954d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky
10966bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPELOC(BuiltinType, {})
10974d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky
10984d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky// FIXME: ComplexTypeLoc is unfinished
1099717cc00c16eabf0eefd3cc69394e97f7229af0c8Zhanyong WanDEF_TRAVERSE_TYPELOC(ComplexType, {
11006bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseType(TL.getTypePtr()->getElementType()));
11016bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
11024d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky
11036bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPELOC(PointerType,
11046bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                     { TRY_TO(TraverseTypeLoc(TL.getPointeeLoc())); })
11054d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky
11066bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPELOC(BlockPointerType,
11076bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                     { TRY_TO(TraverseTypeLoc(TL.getPointeeLoc())); })
11084d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky
11096bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPELOC(LValueReferenceType,
11106bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                     { TRY_TO(TraverseTypeLoc(TL.getPointeeLoc())); })
11114d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky
11126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPELOC(RValueReferenceType,
11136bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                     { TRY_TO(TraverseTypeLoc(TL.getPointeeLoc())); })
11144d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky
11154d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky// FIXME: location of base class?
11164d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky// We traverse this in the type case as well, but how is it not reached through
11174d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky// the pointee type?
1118717cc00c16eabf0eefd3cc69394e97f7229af0c8Zhanyong WanDEF_TRAVERSE_TYPELOC(MemberPointerType, {
11196bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseType(QualType(TL.getTypePtr()->getClass(), 0)));
11206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseTypeLoc(TL.getPointeeLoc()));
11216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
11224d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky
11236bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPELOC(AdjustedType,
11246bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                     { TRY_TO(TraverseTypeLoc(TL.getOriginalLoc())); })
1125651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
11266bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPELOC(DecayedType,
11276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                     { TRY_TO(TraverseTypeLoc(TL.getOriginalLoc())); })
112812df246d6dea2ee1f92c186f922f1afcf499647aReid Kleckner
11296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate <typename Derived>
1130cf4679e60a5c5fa13e4bfe69f8186658c828af49Craig Silversteinbool RecursiveASTVisitor<Derived>::TraverseArrayTypeLocHelper(ArrayTypeLoc TL) {
1131cf4679e60a5c5fa13e4bfe69f8186658c828af49Craig Silverstein  // This isn't available for ArrayType, but is for the ArrayTypeLoc.
1132cf4679e60a5c5fa13e4bfe69f8186658c828af49Craig Silverstein  TRY_TO(TraverseStmt(TL.getSizeExpr()));
1133cf4679e60a5c5fa13e4bfe69f8186658c828af49Craig Silverstein  return true;
1134cf4679e60a5c5fa13e4bfe69f8186658c828af49Craig Silverstein}
1135cf4679e60a5c5fa13e4bfe69f8186658c828af49Craig Silverstein
1136717cc00c16eabf0eefd3cc69394e97f7229af0c8Zhanyong WanDEF_TRAVERSE_TYPELOC(ConstantArrayType, {
11376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseTypeLoc(TL.getElementLoc()));
11386bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  return TraverseArrayTypeLocHelper(TL);
11396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
11404d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky
1141717cc00c16eabf0eefd3cc69394e97f7229af0c8Zhanyong WanDEF_TRAVERSE_TYPELOC(IncompleteArrayType, {
11426bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseTypeLoc(TL.getElementLoc()));
11436bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  return TraverseArrayTypeLocHelper(TL);
11446bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
11454d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky
1146717cc00c16eabf0eefd3cc69394e97f7229af0c8Zhanyong WanDEF_TRAVERSE_TYPELOC(VariableArrayType, {
11476bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseTypeLoc(TL.getElementLoc()));
11486bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  return TraverseArrayTypeLocHelper(TL);
11496bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
11504d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky
1151717cc00c16eabf0eefd3cc69394e97f7229af0c8Zhanyong WanDEF_TRAVERSE_TYPELOC(DependentSizedArrayType, {
11526bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseTypeLoc(TL.getElementLoc()));
11536bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  return TraverseArrayTypeLocHelper(TL);
11546bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
11554d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky
11564d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky// FIXME: order? why not size expr first?
11574d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky// FIXME: base VectorTypeLoc is unfinished
1158717cc00c16eabf0eefd3cc69394e97f7229af0c8Zhanyong WanDEF_TRAVERSE_TYPELOC(DependentSizedExtVectorType, {
11596bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (TL.getTypePtr()->getSizeExpr())
11606bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(TraverseStmt(TL.getTypePtr()->getSizeExpr()));
11616bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseType(TL.getTypePtr()->getElementType()));
11626bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
11634d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky
11644d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky// FIXME: VectorTypeLoc is unfinished
1165717cc00c16eabf0eefd3cc69394e97f7229af0c8Zhanyong WanDEF_TRAVERSE_TYPELOC(VectorType, {
11666bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseType(TL.getTypePtr()->getElementType()));
11676bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
11684d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky
11694d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky// FIXME: size and attributes
11704d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky// FIXME: base VectorTypeLoc is unfinished
1171717cc00c16eabf0eefd3cc69394e97f7229af0c8Zhanyong WanDEF_TRAVERSE_TYPELOC(ExtVectorType, {
11726bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseType(TL.getTypePtr()->getElementType()));
11736bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
11744d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky
11756bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPELOC(FunctionNoProtoType,
11766bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                     { TRY_TO(TraverseTypeLoc(TL.getReturnLoc())); })
11774d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky
1178536bab452fa38692834233187ed3d49b83722cb3Craig Silverstein// FIXME: location of exception specifications (attributes?)
1179717cc00c16eabf0eefd3cc69394e97f7229af0c8Zhanyong WanDEF_TRAVERSE_TYPELOC(FunctionProtoType, {
11806bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseTypeLoc(TL.getReturnLoc()));
11814d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky
11826bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  const FunctionProtoType *T = TL.getTypePtr();
1183536bab452fa38692834233187ed3d49b83722cb3Craig Silverstein
11846bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  for (unsigned I = 0, E = TL.getNumParams(); I != E; ++I) {
11856bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    if (TL.getParam(I)) {
11866bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      TRY_TO(TraverseDecl(TL.getParam(I)));
11876bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    } else if (I < T->getNumParams()) {
11886bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      TRY_TO(TraverseType(T->getParamType(I)));
11894d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky    }
11906bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  }
1191536bab452fa38692834233187ed3d49b83722cb3Craig Silverstein
11926bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  for (const auto &E : T->exceptions()) {
11936bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(TraverseType(E));
11946bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  }
1195176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
1196176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  if (Expr *NE = T->getNoexceptExpr())
1197176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    TRY_TO(TraverseStmt(NE));
11986bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
11994d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky
12006bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPELOC(UnresolvedUsingType, {})
12016bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPELOC(TypedefType, {})
12024d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky
12036bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPELOC(TypeOfExprType,
12046bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                     { TRY_TO(TraverseStmt(TL.getUnderlyingExpr())); })
12054d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky
1206717cc00c16eabf0eefd3cc69394e97f7229af0c8Zhanyong WanDEF_TRAVERSE_TYPELOC(TypeOfType, {
12076bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseTypeLoc(TL.getUnderlyingTInfo()->getTypeLoc()));
12086bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
12094d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky
12104d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky// FIXME: location of underlying expr
1211717cc00c16eabf0eefd3cc69394e97f7229af0c8Zhanyong WanDEF_TRAVERSE_TYPELOC(DecltypeType, {
12126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseStmt(TL.getTypePtr()->getUnderlyingExpr()));
12136bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
12144d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky
1215ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean HuntDEF_TRAVERSE_TYPELOC(UnaryTransformType, {
12166bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseTypeLoc(TL.getUnderlyingTInfo()->getTypeLoc()));
12176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
1218ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt
121934b41d939a1328f484511c6002ba2456db879a29Richard SmithDEF_TRAVERSE_TYPELOC(AutoType, {
12206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseType(TL.getTypePtr()->getDeducedType()));
12216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
122234b41d939a1328f484511c6002ba2456db879a29Richard Smith
12236bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPELOC(RecordType, {})
12246bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPELOC(EnumType, {})
12256bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPELOC(TemplateTypeParmType, {})
12266bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPELOC(SubstTemplateTypeParmType, {})
12276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPELOC(SubstTemplateTypeParmPackType, {})
12284d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky
12294d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky// FIXME: use the loc for the template name?
1230717cc00c16eabf0eefd3cc69394e97f7229af0c8Zhanyong WanDEF_TRAVERSE_TYPELOC(TemplateSpecializationType, {
12316bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseTemplateName(TL.getTypePtr()->getTemplateName()));
12326bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  for (unsigned I = 0, E = TL.getNumArgs(); I != E; ++I) {
12336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(TraverseTemplateArgumentLoc(TL.getArgLoc(I)));
12346bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  }
12356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
12364d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky
12376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPELOC(InjectedClassNameType, {})
12384d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky
12396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPELOC(ParenType, { TRY_TO(TraverseTypeLoc(TL.getInnerLoc())); })
1240075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara
12416bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPELOC(AttributedType,
12426bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                     { TRY_TO(TraverseTypeLoc(TL.getModifiedLoc())); })
12439d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall
1244717cc00c16eabf0eefd3cc69394e97f7229af0c8Zhanyong WanDEF_TRAVERSE_TYPELOC(ElaboratedType, {
12456bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (TL.getQualifierLoc()) {
12466bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(TraverseNestedNameSpecifierLoc(TL.getQualifierLoc()));
12476bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  }
12486bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseTypeLoc(TL.getNamedTypeLoc()));
12496bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
12504d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky
1251717cc00c16eabf0eefd3cc69394e97f7229af0c8Zhanyong WanDEF_TRAVERSE_TYPELOC(DependentNameType, {
12526bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseNestedNameSpecifierLoc(TL.getQualifierLoc()));
12536bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
12544d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky
1255717cc00c16eabf0eefd3cc69394e97f7229af0c8Zhanyong WanDEF_TRAVERSE_TYPELOC(DependentTemplateSpecializationType, {
12566bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (TL.getQualifierLoc()) {
12576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(TraverseNestedNameSpecifierLoc(TL.getQualifierLoc()));
12586bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  }
1259ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie
12606bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  for (unsigned I = 0, E = TL.getNumArgs(); I != E; ++I) {
12616bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(TraverseTemplateArgumentLoc(TL.getArgLoc(I)));
12626bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  }
12636bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
12644d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky
12656bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPELOC(PackExpansionType,
12666bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                     { TRY_TO(TraverseTypeLoc(TL.getPatternLoc())); })
12677536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor
12686bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPELOC(ObjCInterfaceType, {})
12694d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky
1270717cc00c16eabf0eefd3cc69394e97f7229af0c8Zhanyong WanDEF_TRAVERSE_TYPELOC(ObjCObjectType, {
12716bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // We have to watch out here because an ObjCInterfaceType's base
12726bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // type is itself.
12736bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (TL.getTypePtr()->getBaseType().getTypePtr() != TL.getTypePtr())
12746bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(TraverseTypeLoc(TL.getBaseLoc()));
127587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i)
127687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    TRY_TO(TraverseTypeLoc(TL.getTypeArgTInfo(i)->getTypeLoc()));
12776bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
12784d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky
12796bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPELOC(ObjCObjectPointerType,
12806bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                     { TRY_TO(TraverseTypeLoc(TL.getPointeeLoc())); })
12814d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky
12826bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_TYPELOC(AtomicType, { TRY_TO(TraverseTypeLoc(TL.getValueLoc())); })
1283b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman
12844967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarDEF_TRAVERSE_TYPELOC(PipeType, { TRY_TO(TraverseTypeLoc(TL.getValueLoc())); })
12854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
12864d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky#undef DEF_TRAVERSE_TYPELOC
12874d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky
1288dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth// ----------------- Decl traversal -----------------
1289dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth//
1290dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth// For a Decl, we automate (in the DEF_TRAVERSE_DECL macro) traversing
1291dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth// the children that come from the DeclContext associated with it.
1292dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth// Therefore each Traverse* only needs to worry about children other
1293dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth// than those.
1294dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth
12956bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate <typename Derived>
12964d072932287eb074a4168804cac1acb18a51d5e8Craig Silversteinbool RecursiveASTVisitor<Derived>::TraverseDeclContextHelper(DeclContext *DC) {
12970c05a1bae9e8a57f56663991d0442a69df34a003Zhanyong Wan  if (!DC)
12980c05a1bae9e8a57f56663991d0442a69df34a003Zhanyong Wan    return true;
12990c05a1bae9e8a57f56663991d0442a69df34a003Zhanyong Wan
1300651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  for (auto *Child : DC->decls()) {
13016afcf8875d4e447645cd7bf3733dd8e2eb8455dcTareq A. Siraj    // BlockDecls and CapturedDecls are traversed through BlockExprs and
13026afcf8875d4e447645cd7bf3733dd8e2eb8455dcTareq A. Siraj    // CapturedStmts respectively.
1303651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    if (!isa<BlockDecl>(Child) && !isa<CapturedDecl>(Child))
1304651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      TRY_TO(TraverseDecl(Child));
13050c05a1bae9e8a57f56663991d0442a69df34a003Zhanyong Wan  }
13060c05a1bae9e8a57f56663991d0442a69df34a003Zhanyong Wan
13070c05a1bae9e8a57f56663991d0442a69df34a003Zhanyong Wan  return true;
13080c05a1bae9e8a57f56663991d0442a69df34a003Zhanyong Wan}
13090c05a1bae9e8a57f56663991d0442a69df34a003Zhanyong Wan
1310dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth// This macro makes available a variable D, the passed-in decl.
13116bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#define DEF_TRAVERSE_DECL(DECL, CODE)                                          \
13126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  template <typename Derived>                                                  \
13136bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  bool RecursiveASTVisitor<Derived>::Traverse##DECL(DECL *D) {                 \
13144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    bool ShouldVisitChildren = true;                                           \
13154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    bool ReturnValue = true;                                                   \
13164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    if (!getDerived().shouldTraversePostOrder())                               \
13174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      TRY_TO(WalkUpFrom##DECL(D));                                             \
13186bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    { CODE; }                                                                  \
13194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    if (ReturnValue && ShouldVisitChildren)                                    \
13204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      TRY_TO(TraverseDeclContextHelper(dyn_cast<DeclContext>(D)));             \
13214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    if (ReturnValue && getDerived().shouldTraversePostOrder())                 \
13224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      TRY_TO(WalkUpFrom##DECL(D));                                             \
13234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return ReturnValue;                                                        \
13246bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  }
1325d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor
13266bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_DECL(AccessSpecDecl, {})
1327d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor
1328dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_DECL(BlockDecl, {
13296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (TypeSourceInfo *TInfo = D->getSignatureAsWritten())
13306bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(TraverseTypeLoc(TInfo->getTypeLoc()));
13316bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseStmt(D->getBody()));
1332c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  for (const auto &I : D->captures()) {
1333c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    if (I.hasCopyExpr()) {
1334c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines      TRY_TO(TraverseStmt(I.getCopyExpr()));
1335c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    }
1336c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  }
13374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ShouldVisitChildren = false;
13386bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
1339d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor
13406afcf8875d4e447645cd7bf3733dd8e2eb8455dcTareq A. SirajDEF_TRAVERSE_DECL(CapturedDecl, {
13416bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseStmt(D->getBody()));
13424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ShouldVisitChildren = false;
13436bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
13446afcf8875d4e447645cd7bf3733dd8e2eb8455dcTareq A. Siraj
13456bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_DECL(EmptyDecl, {})
1346684aa73192d92850a926870be62a1787eb5b7ed9Michael Han
13476bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_DECL(FileScopeAsmDecl,
13486bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                  { TRY_TO(TraverseStmt(D->getAsmString())); })
1349d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor
13506bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_DECL(ImportDecl, {})
135115de72cf580840c61e5704c2f8a2b56f9d0638e1Douglas Gregor
1352dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_DECL(FriendDecl, {
13536bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // Friend is either decl or a type.
13546bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (D->getFriendType())
13556bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(TraverseTypeLoc(D->getFriendType()->getTypeLoc()));
13566bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  else
13576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(TraverseDecl(D->getFriendDecl()));
13586bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
1359d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor
1360dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_DECL(FriendTemplateDecl, {
13616bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (D->getFriendType())
13626bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(TraverseTypeLoc(D->getFriendType()->getTypeLoc()));
13636bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  else
13646bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(TraverseDecl(D->getFriendDecl()));
13656bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  for (unsigned I = 0, E = D->getNumTemplateParameters(); I < E; ++I) {
13666bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TemplateParameterList *TPL = D->getTemplateParameterList(I);
13676bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    for (TemplateParameterList::iterator ITPL = TPL->begin(), ETPL = TPL->end();
13686bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines         ITPL != ETPL; ++ITPL) {
13696bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      TRY_TO(TraverseDecl(*ITPL));
1370dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth    }
13716bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  }
13726bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
1373d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor
1374af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois PichetDEF_TRAVERSE_DECL(ClassScopeFunctionSpecializationDecl, {
13756bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseDecl(D->getSpecialization()));
13766b02009359a462ffe633696a4441313b462e6566Nico Weber
13776bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (D->hasExplicitTemplateArgs()) {
13786bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    const TemplateArgumentListInfo &args = D->templateArgs();
13796bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(TraverseTemplateArgumentLocsHelper(args.getArgumentArray(),
13806bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                                              args.size()));
13816bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  }
13826bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
1383af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet
13846bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_DECL(LinkageSpecDecl, {})
1385db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky
13866bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_DECL(ObjCPropertyImplDecl, {// FIXME: implement this
13876bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                                        })
1388db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky
1389dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_DECL(StaticAssertDecl, {
13906bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseStmt(D->getAssertExpr()));
13916bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseStmt(D->getMessage()));
13926bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
1393db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky
13946bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_DECL(
13956bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TranslationUnitDecl,
13966bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    {// Code in an unnamed namespace shows up automatically in
13976bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines     // decls_begin()/decls_end().  Thus we don't need to recurse on
13986bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines     // D->getAnonymousNamespace().
13996bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    })
1400db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky
14014967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarDEF_TRAVERSE_DECL(PragmaCommentDecl, {})
14024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
14034967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarDEF_TRAVERSE_DECL(PragmaDetectMismatchDecl, {})
14044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
14053ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga NainarDEF_TRAVERSE_DECL(ExternCContextDecl, {})
14063ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar
1407dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_DECL(NamespaceAliasDecl, {
140887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  TRY_TO(TraverseNestedNameSpecifierLoc(D->getQualifierLoc()));
140987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
14106bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // We shouldn't traverse an aliased namespace, since it will be
14116bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // defined (and, therefore, traversed) somewhere else.
14124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ShouldVisitChildren = false;
1413ad8dcf4a9df0e24051dc31bf9e6f3cd138a34298Chris Lattner})
1414ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie
14156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_DECL(LabelDecl, {// There is no code in a LabelDecl.
14166bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                             })
1417ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie
14186bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_DECL(
14196bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    NamespaceDecl,
14206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    {// Code in an unnamed namespace shows up automatically in
14216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines     // decls_begin()/decls_end().  Thus we don't need to recurse on
14226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines     // D->getAnonymousNamespace().
14236bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    })
1424d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor
14256bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_DECL(ObjCCompatibleAliasDecl, {// FIXME: implement
14266bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                                           })
1427db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky
14286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_DECL(ObjCCategoryDecl, {// FIXME: implement
142987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  if (ObjCTypeParamList *typeParamList = D->getTypeParamList()) {
143087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    for (auto typeParam : *typeParamList) {
143187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      TRY_TO(TraverseObjCTypeParamDecl(typeParam));
143287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    }
143387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  }
143487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar})
1435dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth
14366bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_DECL(ObjCCategoryImplDecl, {// FIXME: implement
14376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                                        })
1438dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth
14396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_DECL(ObjCImplementationDecl, {// FIXME: implement
14406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                                          })
1441dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth
14426bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_DECL(ObjCInterfaceDecl, {// FIXME: implement
144387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  if (ObjCTypeParamList *typeParamList = D->getTypeParamListAsWritten()) {
144487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    for (auto typeParam : *typeParamList) {
144587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      TRY_TO(TraverseObjCTypeParamDecl(typeParam));
144687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    }
144787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  }
144887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
144987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  if (TypeSourceInfo *superTInfo = D->getSuperClassTInfo()) {
145087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    TRY_TO(TraverseTypeLoc(superTInfo->getTypeLoc()));
145187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  }
145287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar})
1453dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth
14546bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_DECL(ObjCProtocolDecl, {// FIXME: implement
14556bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                                    })
1456dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth
1457dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_DECL(ObjCMethodDecl, {
1458651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (D->getReturnTypeSourceInfo()) {
1459651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    TRY_TO(TraverseTypeLoc(D->getReturnTypeSourceInfo()->getTypeLoc()));
1460651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
14614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  for (ParmVarDecl *Parameter : D->parameters()) {
14624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    TRY_TO(TraverseDecl(Parameter));
1463651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
1464651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (D->isThisDeclarationADefinition()) {
1465651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    TRY_TO(TraverseStmt(D->getBody()));
1466651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
14674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ShouldVisitChildren = false;
1468651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines})
1469dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth
147087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga NainarDEF_TRAVERSE_DECL(ObjCTypeParamDecl, {
147187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  if (D->hasExplicitBound()) {
147287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    TRY_TO(TraverseTypeLoc(D->getTypeSourceInfo()->getTypeLoc()));
147387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    // We shouldn't traverse D->getTypeForDecl(); it's a result of
147487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    // declaring the type alias, not something that was written in the
147587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    // source.
147687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  }
147787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar})
147887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
1479c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen HinesDEF_TRAVERSE_DECL(ObjCPropertyDecl, {
1480c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  if (D->getTypeSourceInfo())
1481c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    TRY_TO(TraverseTypeLoc(D->getTypeSourceInfo()->getTypeLoc()));
1482c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  else
1483c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    TRY_TO(TraverseType(D->getType()));
14844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ShouldVisitChildren = false;
1485c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines})
1486dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth
1487dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_DECL(UsingDecl, {
14886bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseNestedNameSpecifierLoc(D->getQualifierLoc()));
14896bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseDeclarationNameInfo(D->getNameInfo()));
14906bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
1491dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth
1492dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_DECL(UsingDirectiveDecl, {
14936bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseNestedNameSpecifierLoc(D->getQualifierLoc()));
14946bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
1495dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth
14966bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_DECL(UsingShadowDecl, {})
1497d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor
14984967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarDEF_TRAVERSE_DECL(ConstructorUsingShadowDecl, {})
14994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1500c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey BataevDEF_TRAVERSE_DECL(OMPThreadPrivateDecl, {
15016bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  for (auto *I : D->varlists()) {
15026bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(TraverseStmt(I));
15036bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  }
15046bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
1505c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev
15064967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarDEF_TRAVERSE_DECL(OMPDeclareReductionDecl, {
15074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  TRY_TO(TraverseStmt(D->getCombiner()));
15084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  if (auto *Initializer = D->getInitializer())
15094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    TRY_TO(TraverseStmt(Initializer));
15104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  TRY_TO(TraverseType(D->getType()));
15114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  return true;
15124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar})
15134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
15144967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarDEF_TRAVERSE_DECL(OMPCapturedExprDecl, { TRY_TO(TraverseVarHelper(D)); })
15154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1516dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth// A helper method for TemplateDecl's children.
15176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate <typename Derived>
1518dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruthbool RecursiveASTVisitor<Derived>::TraverseTemplateParameterListHelper(
1519dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth    TemplateParameterList *TPL) {
1520dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth  if (TPL) {
1521dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth    for (TemplateParameterList::iterator I = TPL->begin(), E = TPL->end();
1522dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth         I != E; ++I) {
1523dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth      TRY_TO(TraverseDecl(*I));
1524dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth    }
1525dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth  }
1526e3e210c3aa3c1b289eee669a1d235fc16df384a0Chandler Carruth  return true;
1527db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky}
1528d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor
15296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate <typename Derived>
1530651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesbool RecursiveASTVisitor<Derived>::TraverseTemplateInstantiations(
1531651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    ClassTemplateDecl *D) {
1532651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  for (auto *SD : D->specializations()) {
1533651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    for (auto *RD : SD->redecls()) {
1534651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      // We don't want to visit injected-class-names in this traversal.
1535651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      if (cast<CXXRecordDecl>(RD)->isInjectedClassName())
1536651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        continue;
1537651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
15386bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      switch (
15396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines          cast<ClassTemplateSpecializationDecl>(RD)->getSpecializationKind()) {
1540651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      // Visit the implicit instantiations with the requested pattern.
1541651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      case TSK_Undeclared:
1542651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      case TSK_ImplicitInstantiation:
1543651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        TRY_TO(TraverseDecl(RD));
1544651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        break;
1545651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1546651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      // We don't need to do anything on an explicit instantiation
1547651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      // or explicit specialization because there will be an explicit
1548651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      // node for it elsewhere.
1549651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      case TSK_ExplicitInstantiationDeclaration:
1550651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      case TSK_ExplicitInstantiationDefinition:
1551651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      case TSK_ExplicitSpecialization:
1552651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        break;
1553651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      }
1554651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    }
1555651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
1556651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1557651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return true;
1558651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
1559651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
15606bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate <typename Derived>
1561651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesbool RecursiveASTVisitor<Derived>::TraverseTemplateInstantiations(
1562651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    VarTemplateDecl *D) {
1563651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  for (auto *SD : D->specializations()) {
1564651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    for (auto *RD : SD->redecls()) {
15656bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      switch (
15666bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines          cast<VarTemplateSpecializationDecl>(RD)->getSpecializationKind()) {
1567651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      case TSK_Undeclared:
1568651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      case TSK_ImplicitInstantiation:
1569651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        TRY_TO(TraverseDecl(RD));
1570651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        break;
1571651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1572651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      case TSK_ExplicitInstantiationDeclaration:
1573651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      case TSK_ExplicitInstantiationDefinition:
1574651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      case TSK_ExplicitSpecialization:
1575651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        break;
1576651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      }
1577651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    }
1578651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
1579651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1580651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return true;
1581ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo}
1582ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
1583760c8af273d9871d063250ae626fb6df94c121f2John McCall// A helper method for traversing the instantiations of a
1584760c8af273d9871d063250ae626fb6df94c121f2John McCall// function while skipping its specializations.
15856bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate <typename Derived>
15868d2a5ea694ed0002b45deb2bd35db451b16a07d6Larisse Voufobool RecursiveASTVisitor<Derived>::TraverseTemplateInstantiations(
1587a313b2fbba86c901e58dc58df036e731f24fdaeeRichard Smith    FunctionTemplateDecl *D) {
1588651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  for (auto *FD : D->specializations()) {
1589651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    for (auto *RD : FD->redecls()) {
1590651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      switch (RD->getTemplateSpecializationKind()) {
1591651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      case TSK_Undeclared:
1592651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      case TSK_ImplicitInstantiation:
1593651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        // We don't know what kind of FunctionDecl this is.
1594651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        TRY_TO(TraverseDecl(RD));
1595651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        break;
1596651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1597651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      // FIXME: For now traverse explicit instantiations here. Change that
1598651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      // once they are represented as dedicated nodes in the AST.
1599651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      case TSK_ExplicitInstantiationDeclaration:
1600651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      case TSK_ExplicitInstantiationDefinition:
1601651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        TRY_TO(TraverseDecl(RD));
1602651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        break;
1603651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1604651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      case TSK_ExplicitSpecialization:
1605651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        break;
1606651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      }
1607760c8af273d9871d063250ae626fb6df94c121f2John McCall    }
1608760c8af273d9871d063250ae626fb6df94c121f2John McCall  }
1609536bab452fa38692834233187ed3d49b83722cb3Craig Silverstein
1610760c8af273d9871d063250ae626fb6df94c121f2John McCall  return true;
1611760c8af273d9871d063250ae626fb6df94c121f2John McCall}
1612536bab452fa38692834233187ed3d49b83722cb3Craig Silverstein
16138d2a5ea694ed0002b45deb2bd35db451b16a07d6Larisse Voufo// This macro unifies the traversal of class, variable and function
16148d2a5ea694ed0002b45deb2bd35db451b16a07d6Larisse Voufo// template declarations.
16156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#define DEF_TRAVERSE_TMPL_DECL(TMPLDECLKIND)                                   \
16166bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  DEF_TRAVERSE_DECL(TMPLDECLKIND##TemplateDecl, {                              \
1617c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    TRY_TO(TraverseDecl(D->getTemplatedDecl()));                               \
1618c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    TRY_TO(TraverseTemplateParameterListHelper(D->getTemplateParameters()));   \
1619c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines                                                                               \
1620c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    /* By default, we do not traverse the instantiations of                    \
1621c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines       class templates since they do not appear in the user code. The          \
1622c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines       following code optionally traverses them.                               \
1623c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines                                                                               \
1624c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines       We only traverse the class instantiations when we see the canonical     \
1625c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines       declaration of the template, to ensure we only visit them once. */      \
1626c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    if (getDerived().shouldVisitTemplateInstantiations() &&                    \
1627c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines        D == D->getCanonicalDecl())                                            \
1628c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines      TRY_TO(TraverseTemplateInstantiations(D));                               \
1629c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines                                                                               \
1630c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    /* Note that getInstantiatedFromMemberTemplate() is just a link            \
1631c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines       from a template instantiation back to the template from which           \
1632c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines       it was instantiated, and thus should not be traversed. */               \
16338d2a5ea694ed0002b45deb2bd35db451b16a07d6Larisse Voufo  })
16348d2a5ea694ed0002b45deb2bd35db451b16a07d6Larisse Voufo
16358d2a5ea694ed0002b45deb2bd35db451b16a07d6Larisse VoufoDEF_TRAVERSE_TMPL_DECL(Class)
16368d2a5ea694ed0002b45deb2bd35db451b16a07d6Larisse VoufoDEF_TRAVERSE_TMPL_DECL(Var)
16378d2a5ea694ed0002b45deb2bd35db451b16a07d6Larisse VoufoDEF_TRAVERSE_TMPL_DECL(Function)
1638dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth
1639dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_DECL(TemplateTemplateParmDecl, {
16406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // D is the "T" in something like
16416bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  //   template <template <typename> class T> class container { };
16426bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseDecl(D->getTemplatedDecl()));
16436bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (D->hasDefaultArgument() && !D->defaultArgumentWasInherited()) {
16446bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(TraverseTemplateArgumentLoc(D->getDefaultArgument()));
16456bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  }
16466bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseTemplateParameterListHelper(D->getTemplateParameters()));
16476bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
1648dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth
164987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga NainarDEF_TRAVERSE_DECL(BuiltinTemplateDecl, {
165087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  TRY_TO(TraverseTemplateParameterListHelper(D->getTemplateParameters()));
165187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar})
165287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
1653dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_DECL(TemplateTypeParmDecl, {
16546bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // D is the "T" in something like "template<typename T> class vector;"
16556bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (D->getTypeForDecl())
16566bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(TraverseType(QualType(D->getTypeForDecl(), 0)));
16576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (D->hasDefaultArgument() && !D->defaultArgumentWasInherited())
16586bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(TraverseTypeLoc(D->getDefaultArgumentInfo()->getTypeLoc()));
16596bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
1660dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth
1661dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_DECL(TypedefDecl, {
16626bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseTypeLoc(D->getTypeSourceInfo()->getTypeLoc()));
16636bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // We shouldn't traverse D->getTypeForDecl(); it's a result of
16646bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // declaring the typedef, not something that was written in the
16656bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // source.
16666bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
1667dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth
1668162e1c1b487352434552147967c3dd296ebee2f7Richard SmithDEF_TRAVERSE_DECL(TypeAliasDecl, {
16696bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseTypeLoc(D->getTypeSourceInfo()->getTypeLoc()));
16706bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // We shouldn't traverse D->getTypeForDecl(); it's a result of
16716bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // declaring the type alias, not something that was written in the
16726bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // source.
16736bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
1674162e1c1b487352434552147967c3dd296ebee2f7Richard Smith
16753e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard SmithDEF_TRAVERSE_DECL(TypeAliasTemplateDecl, {
16766bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseDecl(D->getTemplatedDecl()));
16776bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseTemplateParameterListHelper(D->getTemplateParameters()));
16786bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
16793e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith
1680dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_DECL(UnresolvedUsingTypenameDecl, {
16816bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // A dependent using declaration which was marked with 'typename'.
16826bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  //   template<class T> class A : public B<T> { using typename B<T>::foo; };
16836bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseNestedNameSpecifierLoc(D->getQualifierLoc()));
16846bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // We shouldn't traverse D->getTypeForDecl(); it's a result of
16856bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // declaring the type, not something that was written in the
16866bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // source.
16876bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
1688d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor
1689dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_DECL(EnumDecl, {
16906bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (D->getTypeForDecl())
16916bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(TraverseType(QualType(D->getTypeForDecl(), 0)));
1692dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth
16936bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseNestedNameSpecifierLoc(D->getQualifierLoc()));
16946bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // The enumerators are already traversed by
16956bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // decls_begin()/decls_end().
16966bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
1697dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth
1698dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth// Helper methods for RecordDecl and its children.
16996bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate <typename Derived>
17006bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesbool RecursiveASTVisitor<Derived>::TraverseRecordHelper(RecordDecl *D) {
1701dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth  // We shouldn't traverse D->getTypeForDecl(); it's a result of
1702dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth  // declaring the type, not something that was written in the source.
1703a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet
17043812999df1a50e0804985c8845fcfa3fd7ffe14cCraig Silverstein  TRY_TO(TraverseNestedNameSpecifierLoc(D->getQualifierLoc()));
1705e3e210c3aa3c1b289eee669a1d235fc16df384a0Chandler Carruth  return true;
1706db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky}
1707d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor
17086bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate <typename Derived>
17096bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesbool RecursiveASTVisitor<Derived>::TraverseCXXRecordHelper(CXXRecordDecl *D) {
1710e3e210c3aa3c1b289eee669a1d235fc16df384a0Chandler Carruth  if (!TraverseRecordHelper(D))
1711e3e210c3aa3c1b289eee669a1d235fc16df384a0Chandler Carruth    return false;
17129f99d06e0d22380b9d1f0609a083dbfbd8b37c10Manuel Klimek  if (D->isCompleteDefinition()) {
1713651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    for (const auto &I : D->bases()) {
1714651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      TRY_TO(TraverseTypeLoc(I.getTypeSourceInfo()->getTypeLoc()));
1715dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth    }
1716dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth    // We don't traverse the friends or the conversions, as they are
1717dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth    // already in decls_begin()/decls_end().
1718dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth  }
1719e3e210c3aa3c1b289eee669a1d235fc16df384a0Chandler Carruth  return true;
1720db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky}
1721d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor
17226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_DECL(RecordDecl, { TRY_TO(TraverseRecordHelper(D)); })
17236bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
17246bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_DECL(CXXRecordDecl, { TRY_TO(TraverseCXXRecordHelper(D)); })
17256bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
17266bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#define DEF_TRAVERSE_TMPL_SPEC_DECL(TMPLDECLKIND)                              \
17276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  DEF_TRAVERSE_DECL(TMPLDECLKIND##TemplateSpecializationDecl, {                \
17286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    /* For implicit instantiations ("set<int> x;"), we don't want to           \
17296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines       recurse at all, since the instatiated template isn't written in         \
17306bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines       the source code anywhere.  (Note the instatiated *type* --              \
17316bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines       set<int> -- is written, and will still get a callback of                \
17326bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines       TemplateSpecializationType).  For explicit instantiations               \
17336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines       ("template set<int>;"), we do need a callback, since this               \
17346bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines       is the only callback that's made for this instantiation.                \
17356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines       We use getTypeAsWritten() to distinguish. */                            \
17366bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    if (TypeSourceInfo *TSI = D->getTypeAsWritten())                           \
17376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      TRY_TO(TraverseTypeLoc(TSI->getTypeLoc()));                              \
17386bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                                                                               \
17396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    if (!getDerived().shouldVisitTemplateInstantiations() &&                   \
17406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines        D->getTemplateSpecializationKind() != TSK_ExplicitSpecialization)      \
17416bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      /* Returning from here skips traversing the                              \
17426bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines         declaration context of the *TemplateSpecializationDecl                \
17436bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines         (embedded in the DEF_TRAVERSE_DECL() macro)                           \
17446bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines         which contains the instantiated members of the template. */           \
17456bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      return true;                                                             \
17468d2a5ea694ed0002b45deb2bd35db451b16a07d6Larisse Voufo  })
17478d2a5ea694ed0002b45deb2bd35db451b16a07d6Larisse Voufo
17488d2a5ea694ed0002b45deb2bd35db451b16a07d6Larisse VoufoDEF_TRAVERSE_TMPL_SPEC_DECL(Class)
17498d2a5ea694ed0002b45deb2bd35db451b16a07d6Larisse VoufoDEF_TRAVERSE_TMPL_SPEC_DECL(Var)
1750d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor
1751dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruthtemplate <typename Derived>
1752dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruthbool RecursiveASTVisitor<Derived>::TraverseTemplateArgumentLocsHelper(
1753dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth    const TemplateArgumentLoc *TAL, unsigned Count) {
1754dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth  for (unsigned I = 0; I < Count; ++I) {
17554d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky    TRY_TO(TraverseTemplateArgumentLoc(TAL[I]));
1756dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth  }
1757e3e210c3aa3c1b289eee669a1d235fc16df384a0Chandler Carruth  return true;
1758db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky}
1759db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky
17606bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#define DEF_TRAVERSE_TMPL_PART_SPEC_DECL(TMPLDECLKIND, DECLKIND)               \
17616bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  DEF_TRAVERSE_DECL(TMPLDECLKIND##TemplatePartialSpecializationDecl, {         \
1762c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    /* The partial specialization. */                                          \
1763c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    if (TemplateParameterList *TPL = D->getTemplateParameters()) {             \
1764c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines      for (TemplateParameterList::iterator I = TPL->begin(), E = TPL->end();   \
1765c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines           I != E; ++I) {                                                      \
1766c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines        TRY_TO(TraverseDecl(*I));                                              \
1767c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines      }                                                                        \
1768c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    }                                                                          \
1769c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    /* The args that remains unspecialized. */                                 \
1770c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    TRY_TO(TraverseTemplateArgumentLocsHelper(                                 \
1771c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines        D->getTemplateArgsAsWritten()->getTemplateArgs(),                      \
1772c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines        D->getTemplateArgsAsWritten()->NumTemplateArgs));                      \
1773c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines                                                                               \
1774c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    /* Don't need the *TemplatePartialSpecializationHelper, even               \
1775c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines       though that's our parent class -- we already visit all the              \
1776c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines       template args here. */                                                  \
1777c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    TRY_TO(Traverse##DECLKIND##Helper(D));                                     \
1778c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines                                                                               \
1779c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    /* Instantiations will have been visited with the primary template. */     \
17808d2a5ea694ed0002b45deb2bd35db451b16a07d6Larisse Voufo  })
17818d2a5ea694ed0002b45deb2bd35db451b16a07d6Larisse Voufo
17828d2a5ea694ed0002b45deb2bd35db451b16a07d6Larisse VoufoDEF_TRAVERSE_TMPL_PART_SPEC_DECL(Class, CXXRecord)
17838d2a5ea694ed0002b45deb2bd35db451b16a07d6Larisse VoufoDEF_TRAVERSE_TMPL_PART_SPEC_DECL(Var, Var)
1784dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth
17856bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_DECL(EnumConstantDecl, { TRY_TO(TraverseStmt(D->getInitExpr())); })
1786dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth
1787dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_DECL(UnresolvedUsingValueDecl, {
17886bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // Like UnresolvedUsingTypenameDecl, but without the 'typename':
17896bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  //    template <class T> Class A : public Base<T> { using Base<T>::foo; };
17906bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseNestedNameSpecifierLoc(D->getQualifierLoc()));
17916bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseDeclarationNameInfo(D->getNameInfo()));
17926bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
1793dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth
179487c2e121cf0522fc266efe2922b58091cd2e0182Francois PichetDEF_TRAVERSE_DECL(IndirectFieldDecl, {})
179587c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet
17966bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate <typename Derived>
1797dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruthbool RecursiveASTVisitor<Derived>::TraverseDeclaratorHelper(DeclaratorDecl *D) {
17983812999df1a50e0804985c8845fcfa3fd7ffe14cCraig Silverstein  TRY_TO(TraverseNestedNameSpecifierLoc(D->getQualifierLoc()));
1799dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth  if (D->getTypeSourceInfo())
18004d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky    TRY_TO(TraverseTypeLoc(D->getTypeSourceInfo()->getTypeLoc()));
1801406f98f6a5a7bde5707085af8d66204e7e76af45Douglas Gregor  else
1802406f98f6a5a7bde5707085af8d66204e7e76af45Douglas Gregor    TRY_TO(TraverseType(D->getType()));
1803e3e210c3aa3c1b289eee669a1d235fc16df384a0Chandler Carruth  return true;
1804db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky}
1805c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall
18066bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_DECL(MSPropertyDecl, { TRY_TO(TraverseDeclaratorHelper(D)); })
180776da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall
1808dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_DECL(FieldDecl, {
18096bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseDeclaratorHelper(D));
18106bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (D->isBitField())
18116bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(TraverseStmt(D->getBitWidth()));
18126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  else if (D->hasInClassInitializer())
18136bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(TraverseStmt(D->getInClassInitializer()));
18146bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
1815dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth
1816dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_DECL(ObjCAtDefsFieldDecl, {
18176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseDeclaratorHelper(D));
18186bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (D->isBitField())
18196bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(TraverseStmt(D->getBitWidth()));
18206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // FIXME: implement the rest.
18216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
1822dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth
1823dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_DECL(ObjCIvarDecl, {
18246bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseDeclaratorHelper(D));
18256bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (D->isBitField())
18266bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(TraverseStmt(D->getBitWidth()));
18276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // FIXME: implement the rest.
18286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
1829dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth
18306bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate <typename Derived>
1831dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruthbool RecursiveASTVisitor<Derived>::TraverseFunctionHelper(FunctionDecl *D) {
18323812999df1a50e0804985c8845fcfa3fd7ffe14cCraig Silverstein  TRY_TO(TraverseNestedNameSpecifierLoc(D->getQualifierLoc()));
183365019acfc46ffb191fac4e781ac0c4b8d0c8434eDouglas Gregor  TRY_TO(TraverseDeclarationNameInfo(D->getNameInfo()));
18340c05a1bae9e8a57f56663991d0442a69df34a003Zhanyong Wan
1835cf4679e60a5c5fa13e4bfe69f8186658c828af49Craig Silverstein  // If we're an explicit template specialization, iterate over the
1836536bab452fa38692834233187ed3d49b83722cb3Craig Silverstein  // template args that were explicitly specified.  If we were doing
1837536bab452fa38692834233187ed3d49b83722cb3Craig Silverstein  // this in typing order, we'd do it between the return type and
1838536bab452fa38692834233187ed3d49b83722cb3Craig Silverstein  // the function args, but both are handled by the FunctionTypeLoc
1839536bab452fa38692834233187ed3d49b83722cb3Craig Silverstein  // above, so we have to choose one side.  I've decided to do before.
1840cf4679e60a5c5fa13e4bfe69f8186658c828af49Craig Silverstein  if (const FunctionTemplateSpecializationInfo *FTSI =
18416bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines          D->getTemplateSpecializationInfo()) {
1842cf4679e60a5c5fa13e4bfe69f8186658c828af49Craig Silverstein    if (FTSI->getTemplateSpecializationKind() != TSK_Undeclared &&
1843cf4679e60a5c5fa13e4bfe69f8186658c828af49Craig Silverstein        FTSI->getTemplateSpecializationKind() != TSK_ImplicitInstantiation) {
184444db3251aec7c0e6edaf1c70d7d53a272686791aNick Lewycky      // A specialization might not have explicit template arguments if it has
184544db3251aec7c0e6edaf1c70d7d53a272686791aNick Lewycky      // a templated return type and concrete arguments.
184671a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis      if (const ASTTemplateArgumentListInfo *TALI =
18476bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines              FTSI->TemplateArgumentsAsWritten) {
184871a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis        TRY_TO(TraverseTemplateArgumentLocsHelper(TALI->getTemplateArgs(),
184971a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis                                                  TALI->NumTemplateArgs));
185044db3251aec7c0e6edaf1c70d7d53a272686791aNick Lewycky      }
1851cf4679e60a5c5fa13e4bfe69f8186658c828af49Craig Silverstein    }
1852cf4679e60a5c5fa13e4bfe69f8186658c828af49Craig Silverstein  }
1853cf4679e60a5c5fa13e4bfe69f8186658c828af49Craig Silverstein
1854536bab452fa38692834233187ed3d49b83722cb3Craig Silverstein  // Visit the function type itself, which can be either
1855536bab452fa38692834233187ed3d49b83722cb3Craig Silverstein  // FunctionNoProtoType or FunctionProtoType, or a typedef.  This
1856536bab452fa38692834233187ed3d49b83722cb3Craig Silverstein  // also covers the return type and the function parameters,
1857536bab452fa38692834233187ed3d49b83722cb3Craig Silverstein  // including exception specifications.
18588ddfb0b72d0e439d01759c1bc7a79ba73dd2830cManuel Klimek  if (TypeSourceInfo *TSI = D->getTypeSourceInfo()) {
1859c28a335184207a47f34eb9d1707dc8d7c6c7b8b6Richard Smith    TRY_TO(TraverseTypeLoc(TSI->getTypeLoc()));
18604b6730d40e7c603bd0e223d3fa8b56a0c88a324aMichael Han  } else if (getDerived().shouldVisitImplicitCode()) {
18614b6730d40e7c603bd0e223d3fa8b56a0c88a324aMichael Han    // Visit parameter variable declarations of the implicit function
18624b6730d40e7c603bd0e223d3fa8b56a0c88a324aMichael Han    // if the traverser is visiting implicit code. Parameter variable
18634b6730d40e7c603bd0e223d3fa8b56a0c88a324aMichael Han    // declarations do not have valid TypeSourceInfo, so to visit them
18644b6730d40e7c603bd0e223d3fa8b56a0c88a324aMichael Han    // we need to traverse the declarations explicitly.
18654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    for (ParmVarDecl *Parameter : D->parameters()) {
18664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      TRY_TO(TraverseDecl(Parameter));
18674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    }
1868c28a335184207a47f34eb9d1707dc8d7c6c7b8b6Richard Smith  }
1869cf4679e60a5c5fa13e4bfe69f8186658c828af49Craig Silverstein
18706beaf938c0a2587ac4b2b60a51fbb9a80f72b766Zhanyong Wan  if (CXXConstructorDecl *Ctor = dyn_cast<CXXConstructorDecl>(D)) {
18716beaf938c0a2587ac4b2b60a51fbb9a80f72b766Zhanyong Wan    // Constructor initializers.
1872651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    for (auto *I : Ctor->inits()) {
1873651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      TRY_TO(TraverseConstructorInitializer(I));
18746beaf938c0a2587ac4b2b60a51fbb9a80f72b766Zhanyong Wan    }
18756beaf938c0a2587ac4b2b60a51fbb9a80f72b766Zhanyong Wan  }
18766beaf938c0a2587ac4b2b60a51fbb9a80f72b766Zhanyong Wan
1877dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth  if (D->isThisDeclarationADefinition()) {
18786bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(TraverseStmt(D->getBody())); // Function body.
1879dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth  }
1880e3e210c3aa3c1b289eee669a1d235fc16df384a0Chandler Carruth  return true;
1881db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky}
1882d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor
1883dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_DECL(FunctionDecl, {
18846bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // We skip decls_begin/decls_end, which are already covered by
18856bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // TraverseFunctionHelper().
18864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ShouldVisitChildren = false;
18874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ReturnValue = TraverseFunctionHelper(D);
18886bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
1889facfc77487a890bfb7b5eee7e21cd2b395a9faafChandler Carruth
1890dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_DECL(CXXMethodDecl, {
18916bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // We skip decls_begin/decls_end, which are already covered by
18926bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // TraverseFunctionHelper().
18934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ShouldVisitChildren = false;
18944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ReturnValue = TraverseFunctionHelper(D);
18956bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
1896facfc77487a890bfb7b5eee7e21cd2b395a9faafChandler Carruth
1897dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_DECL(CXXConstructorDecl, {
18986bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // We skip decls_begin/decls_end, which are already covered by
18996bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // TraverseFunctionHelper().
19004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ShouldVisitChildren = false;
19014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ReturnValue = TraverseFunctionHelper(D);
19026bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
1903facfc77487a890bfb7b5eee7e21cd2b395a9faafChandler Carruth
19040c05a1bae9e8a57f56663991d0442a69df34a003Zhanyong Wan// CXXConversionDecl is the declaration of a type conversion operator.
19050c05a1bae9e8a57f56663991d0442a69df34a003Zhanyong Wan// It's not a cast expression.
1906dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_DECL(CXXConversionDecl, {
19076bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // We skip decls_begin/decls_end, which are already covered by
19086bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // TraverseFunctionHelper().
19094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ShouldVisitChildren = false;
19104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ReturnValue = TraverseFunctionHelper(D);
19116bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
1912d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor
1913dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_DECL(CXXDestructorDecl, {
19146bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // We skip decls_begin/decls_end, which are already covered by
19156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // TraverseFunctionHelper().
19164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ShouldVisitChildren = false;
19174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ReturnValue = TraverseFunctionHelper(D);
19186bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
1919dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth
19206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate <typename Derived>
1921dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruthbool RecursiveASTVisitor<Derived>::TraverseVarHelper(VarDecl *D) {
19226c321e35008f2c99eeb1409b43859a04c48e5ce5Chandler Carruth  TRY_TO(TraverseDeclaratorHelper(D));
1923c874ca1c7378d62aff008d74cf744636730f2db4Argyrios Kyrtzidis  // Default params are taken care of when we traverse the ParmVarDecl.
192452ec0c0357ce970ca52a27c1086626450f0967e7Daniel Jasper  if (!isa<ParmVarDecl>(D) &&
19257349cce2b303c8cc1e00c3aa7192513d6ca5004fDaniel Jasper      (!D->isCXXForRangeDecl() || getDerived().shouldVisitImplicitCode()))
1926c874ca1c7378d62aff008d74cf744636730f2db4Argyrios Kyrtzidis    TRY_TO(TraverseStmt(D->getInit()));
1927e3e210c3aa3c1b289eee669a1d235fc16df384a0Chandler Carruth  return true;
1928db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky}
1929db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky
19306bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_DECL(VarDecl, { TRY_TO(TraverseVarHelper(D)); })
1931db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky
19326bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_DECL(ImplicitParamDecl, { TRY_TO(TraverseVarHelper(D)); })
1933facfc77487a890bfb7b5eee7e21cd2b395a9faafChandler Carruth
1934dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_DECL(NonTypeTemplateParmDecl, {
19356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // A non-type template parameter, e.g. "S" in template<int S> class Foo ...
19366bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseDeclaratorHelper(D));
19376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (D->hasDefaultArgument() && !D->defaultArgumentWasInherited())
19386bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(TraverseStmt(D->getDefaultArgument()));
19396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
1940facfc77487a890bfb7b5eee7e21cd2b395a9faafChandler Carruth
1941dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_DECL(ParmVarDecl, {
19426bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseVarHelper(D));
1943be9aa9614f0f15f2182c9ac5c571a868263131adCraig Silverstein
19446bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (D->hasDefaultArg() && D->hasUninstantiatedDefaultArg() &&
19456bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      !D->hasUnparsedDefaultArg())
19466bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(TraverseStmt(D->getUninstantiatedDefaultArg()));
1947dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth
19486bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (D->hasDefaultArg() && !D->hasUninstantiatedDefaultArg() &&
19496bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      !D->hasUnparsedDefaultArg())
19506bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(TraverseStmt(D->getDefaultArg()));
19516bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
1952facfc77487a890bfb7b5eee7e21cd2b395a9faafChandler Carruth
1953dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth#undef DEF_TRAVERSE_DECL
1954facfc77487a890bfb7b5eee7e21cd2b395a9faafChandler Carruth
1955dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth// ----------------- Stmt traversal -----------------
1956dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth//
1957dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth// For stmts, we automate (in the DEF_TRAVERSE_STMT macro) iterating
19587502c1d3ce8bb97bcc4f7bebef507040bd93b26fJohn McCall// over the children defined in children() (every stmt defines these,
19597502c1d3ce8bb97bcc4f7bebef507040bd93b26fJohn McCall// though sometimes the range is empty).  Each individual Traverse*
19607502c1d3ce8bb97bcc4f7bebef507040bd93b26fJohn McCall// method only needs to worry about children other than those.  To see
19617502c1d3ce8bb97bcc4f7bebef507040bd93b26fJohn McCall// what children() does for a given class, see, e.g.,
19627502c1d3ce8bb97bcc4f7bebef507040bd93b26fJohn McCall//   http://clang.llvm.org/doxygen/Stmt_8cpp_source.html
1963dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth
1964dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth// This macro makes available a variable S, the passed-in stmt.
19656bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#define DEF_TRAVERSE_STMT(STMT, CODE)                                          \
19666bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  template <typename Derived>                                                  \
196787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  bool RecursiveASTVisitor<Derived>::Traverse##STMT(                           \
196887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      STMT *S, DataRecursionQueue *Queue) {                                    \
19694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    bool ShouldVisitChildren = true;                                           \
19704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    bool ReturnValue = true;                                                   \
19714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    if (!getDerived().shouldTraversePostOrder())                               \
19724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      TRY_TO(WalkUpFrom##STMT(S));                                             \
19736bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    { CODE; }                                                                  \
19744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    if (ShouldVisitChildren) {                                                 \
19754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      for (Stmt *SubStmt : S->children()) {                                    \
19764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        TRY_TO_TRAVERSE_OR_ENQUEUE_STMT(SubStmt);                              \
19774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      }                                                                        \
19786bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    }                                                                          \
19794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    if (!Queue && ReturnValue && getDerived().shouldTraversePostOrder())       \
19804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      TRY_TO(WalkUpFrom##STMT(S));                                             \
19814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return ReturnValue;                                                        \
19826bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  }
1983facfc77487a890bfb7b5eee7e21cd2b395a9faafChandler Carruth
1984df5faf5e7ae6823d0af0b801c4ac26d47f2cee97Chad RosierDEF_TRAVERSE_STMT(GCCAsmStmt, {
198587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  TRY_TO_TRAVERSE_OR_ENQUEUE_STMT(S->getAsmString());
19866bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  for (unsigned I = 0, E = S->getNumInputs(); I < E; ++I) {
198787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    TRY_TO_TRAVERSE_OR_ENQUEUE_STMT(S->getInputConstraintLiteral(I));
19886bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  }
19896bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  for (unsigned I = 0, E = S->getNumOutputs(); I < E; ++I) {
199087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    TRY_TO_TRAVERSE_OR_ENQUEUE_STMT(S->getOutputConstraintLiteral(I));
19916bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  }
19926bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  for (unsigned I = 0, E = S->getNumClobbers(); I < E; ++I) {
199387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    TRY_TO_TRAVERSE_OR_ENQUEUE_STMT(S->getClobberStringLiteral(I));
19946bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  }
19956bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // children() iterates over inputExpr and outputExpr.
19966bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
1997facfc77487a890bfb7b5eee7e21cd2b395a9faafChandler Carruth
19986bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(
19996bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    MSAsmStmt,
20006bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    {// FIXME: MS Asm doesn't currently parse Constraints, Clobbers, etc.  Once
20016bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines     // added this needs to be implemented.
20026bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    })
20038cd64b4c5553fa6284d248336cb7c82dc960a394Chad Rosier
2004dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_STMT(CXXCatchStmt, {
20056bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseDecl(S->getExceptionDecl()));
20066bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // children() iterates over the handler block.
20076bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
2008dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth
2009be9aa9614f0f15f2182c9ac5c571a868263131adCraig SilversteinDEF_TRAVERSE_STMT(DeclStmt, {
20106bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  for (auto *I : S->decls()) {
20116bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(TraverseDecl(I));
20126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  }
20136bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // Suppress the default iteration over children() by
20146bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // returning.  Here's why: A DeclStmt looks like 'type var [=
20156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // initializer]'.  The decls above already traverse over the
20166bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // initializers, so we don't have to do it again (which
20176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // children() would do).
20184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ShouldVisitChildren = false;
20196bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
2020dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth
2021dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth// These non-expr stmts (most of them), do not need any action except
2022dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth// iterating over the children.
20236bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(BreakStmt, {})
20246bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(CXXTryStmt, {})
20256bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(CaseStmt, {})
20266bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(CompoundStmt, {})
20276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(ContinueStmt, {})
20286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(DefaultStmt, {})
20296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(DoStmt, {})
20306bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(ForStmt, {})
20316bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(GotoStmt, {})
20326bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(IfStmt, {})
20336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(IndirectGotoStmt, {})
20346bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(LabelStmt, {})
20356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(AttributedStmt, {})
20366bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(NullStmt, {})
20376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(ObjCAtCatchStmt, {})
20386bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(ObjCAtFinallyStmt, {})
20396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(ObjCAtSynchronizedStmt, {})
20406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(ObjCAtThrowStmt, {})
20416bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(ObjCAtTryStmt, {})
20426bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(ObjCForCollectionStmt, {})
20436bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(ObjCAutoreleasePoolStmt, {})
204452ec0c0357ce970ca52a27c1086626450f0967e7Daniel JasperDEF_TRAVERSE_STMT(CXXForRangeStmt, {
20457349cce2b303c8cc1e00c3aa7192513d6ca5004fDaniel Jasper  if (!getDerived().shouldVisitImplicitCode()) {
204687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    TRY_TO_TRAVERSE_OR_ENQUEUE_STMT(S->getLoopVarStmt());
204787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    TRY_TO_TRAVERSE_OR_ENQUEUE_STMT(S->getRangeInit());
204887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    TRY_TO_TRAVERSE_OR_ENQUEUE_STMT(S->getBody());
204952ec0c0357ce970ca52a27c1086626450f0967e7Daniel Jasper    // Visit everything else only if shouldVisitImplicitCode().
20504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    ShouldVisitChildren = false;
205152ec0c0357ce970ca52a27c1086626450f0967e7Daniel Jasper  }
205252ec0c0357ce970ca52a27c1086626450f0967e7Daniel Jasper})
2053ba243b59a1074e0962f6abfa3bb9aa984eac1245David BlaikieDEF_TRAVERSE_STMT(MSDependentExistsStmt, {
20546bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseNestedNameSpecifierLoc(S->getQualifierLoc()));
20556bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseDeclarationNameInfo(S->getNameInfo()));
2056ba0513de93d2fab6db5ab30b6927209fcc883078Douglas Gregor})
20576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(ReturnStmt, {})
20586bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(SwitchStmt, {})
20596bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(WhileStmt, {})
2060dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth
2061dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_STMT(CXXDependentScopeMemberExpr, {
20626bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseNestedNameSpecifierLoc(S->getQualifierLoc()));
20636bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseDeclarationNameInfo(S->getMemberNameInfo()));
20646bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (S->hasExplicitTemplateArgs()) {
20656bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(TraverseTemplateArgumentLocsHelper(S->getTemplateArgs(),
20666bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                                              S->getNumTemplateArgs()));
20676bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  }
20686bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
2069dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth
2070dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_STMT(DeclRefExpr, {
20716bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseNestedNameSpecifierLoc(S->getQualifierLoc()));
20726bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseDeclarationNameInfo(S->getNameInfo()));
20736bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseTemplateArgumentLocsHelper(S->getTemplateArgs(),
20746bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                                            S->getNumTemplateArgs()));
20756bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
2076dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth
2077dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_STMT(DependentScopeDeclRefExpr, {
20786bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseNestedNameSpecifierLoc(S->getQualifierLoc()));
20796bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseDeclarationNameInfo(S->getNameInfo()));
20806bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (S->hasExplicitTemplateArgs()) {
20814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    TRY_TO(TraverseTemplateArgumentLocsHelper(S->getTemplateArgs(),
20824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                              S->getNumTemplateArgs()));
20836bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  }
20846bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
2085dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth
2086dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_STMT(MemberExpr, {
20876bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseNestedNameSpecifierLoc(S->getQualifierLoc()));
20886bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseDeclarationNameInfo(S->getMemberNameInfo()));
20896bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseTemplateArgumentLocsHelper(S->getTemplateArgs(),
20906bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                                            S->getNumTemplateArgs()));
20916bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
2092facfc77487a890bfb7b5eee7e21cd2b395a9faafChandler Carruth
20936bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(
20946bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    ImplicitCastExpr,
20956bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    {// We don't traverse the cast type, as it's not written in the
20966bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines     // source code.
20976bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    })
2098facfc77487a890bfb7b5eee7e21cd2b395a9faafChandler Carruth
2099dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_STMT(CStyleCastExpr, {
21006bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseTypeLoc(S->getTypeInfoAsWritten()->getTypeLoc()));
21016bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
2102dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth
2103dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_STMT(CXXFunctionalCastExpr, {
21046bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseTypeLoc(S->getTypeInfoAsWritten()->getTypeLoc()));
21056bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
2106dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth
2107dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_STMT(CXXConstCastExpr, {
21086bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseTypeLoc(S->getTypeInfoAsWritten()->getTypeLoc()));
21096bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
2110dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth
2111dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_STMT(CXXDynamicCastExpr, {
21126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseTypeLoc(S->getTypeInfoAsWritten()->getTypeLoc()));
21136bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
2114dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth
2115dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_STMT(CXXReinterpretCastExpr, {
21166bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseTypeLoc(S->getTypeInfoAsWritten()->getTypeLoc()));
21176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
2118dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth
2119dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_STMT(CXXStaticCastExpr, {
21206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseTypeLoc(S->getTypeInfoAsWritten()->getTypeLoc()));
21216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
2122dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth
21236bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate <typename Derived>
212487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarbool RecursiveASTVisitor<Derived>::TraverseSynOrSemInitListExpr(
212587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    InitListExpr *S, DataRecursionQueue *Queue) {
212687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  if (S) {
21274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // Skip this if we traverse postorder. We will visit it later
21284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // in PostVisitStmt.
21294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    if (!getDerived().shouldTraversePostOrder())
21304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      TRY_TO(WalkUpFromInitListExpr(S));
21314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
21320e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    // All we need are the default actions.  FIXME: use a helper function.
213387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    for (Stmt *SubStmt : S->children()) {
213487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      TRY_TO_TRAVERSE_OR_ENQUEUE_STMT(SubStmt);
21350e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    }
2136ea245e0ba48caf7e7acf870880c030d7ddc76667Craig Silverstein  }
2137ea245e0ba48caf7e7acf870880c030d7ddc76667Craig Silverstein  return true;
2138ea245e0ba48caf7e7acf870880c030d7ddc76667Craig Silverstein}
2139ea245e0ba48caf7e7acf870880c030d7ddc76667Craig Silverstein
214087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// This method is called once for each pair of syntactic and semantic
214187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// InitListExpr, and it traverses the subtrees defined by the two forms. This
214287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// may cause some of the children to be visited twice, if they appear both in
214387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// the syntactic and the semantic form.
214487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar//
214587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// There is no guarantee about which form \p S takes when this method is called.
214687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga NainarDEF_TRAVERSE_STMT(InitListExpr, {
214787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  TRY_TO(TraverseSynOrSemInitListExpr(
214887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      S->isSemanticForm() ? S->getSyntacticForm() : S, Queue));
214987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  TRY_TO(TraverseSynOrSemInitListExpr(
215087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      S->isSemanticForm() ? S : S->getSemanticForm(), Queue));
21514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ShouldVisitChildren = false;
215287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar})
215387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
2154f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne// GenericSelectionExpr is a special case because the types and expressions
2155f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne// are interleaved.  We also need to watch out for null types (default
2156f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne// generic associations).
215787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga NainarDEF_TRAVERSE_STMT(GenericSelectionExpr, {
215886b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek  TRY_TO(TraverseStmt(S->getControllingExpr()));
2159f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne  for (unsigned i = 0; i != S->getNumAssocs(); ++i) {
2160f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne    if (TypeSourceInfo *TS = S->getAssocTypeSourceInfo(i))
2161f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne      TRY_TO(TraverseTypeLoc(TS->getTypeLoc()));
216287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    TRY_TO_TRAVERSE_OR_ENQUEUE_STMT(S->getAssocExpr(i));
2163f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne  }
21644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ShouldVisitChildren = false;
216587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar})
2166f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne
216787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// PseudoObjectExpr is a special case because of the weirdness with
21684b9c2d235fb9449e249d74f48ecfec601650de93John McCall// syntactic expressions and opaque values.
216987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga NainarDEF_TRAVERSE_STMT(PseudoObjectExpr, {
217087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  TRY_TO_TRAVERSE_OR_ENQUEUE_STMT(S->getSyntacticForm());
21716bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  for (PseudoObjectExpr::semantics_iterator i = S->semantics_begin(),
21726bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                                            e = S->semantics_end();
21736bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines       i != e; ++i) {
21744b9c2d235fb9449e249d74f48ecfec601650de93John McCall    Expr *sub = *i;
21754b9c2d235fb9449e249d74f48ecfec601650de93John McCall    if (OpaqueValueExpr *OVE = dyn_cast<OpaqueValueExpr>(sub))
21764b9c2d235fb9449e249d74f48ecfec601650de93John McCall      sub = OVE->getSourceExpr();
217787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    TRY_TO_TRAVERSE_OR_ENQUEUE_STMT(sub);
21784b9c2d235fb9449e249d74f48ecfec601650de93John McCall  }
21794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ShouldVisitChildren = false;
218087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar})
21814b9c2d235fb9449e249d74f48ecfec601650de93John McCall
2182ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas GregorDEF_TRAVERSE_STMT(CXXScalarValueInitExpr, {
21836bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // This is called for code like 'return T()' where T is a built-in
21846bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // (i.e. non-class) type.
21856bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseTypeLoc(S->getTypeSourceInfo()->getTypeLoc()));
21866bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
2187ea245e0ba48caf7e7acf870880c030d7ddc76667Craig Silverstein
2188ea245e0ba48caf7e7acf870880c030d7ddc76667Craig SilversteinDEF_TRAVERSE_STMT(CXXNewExpr, {
21891bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor  // The child-iterator will pick up the other arguments.
21901bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor  TRY_TO(TraverseTypeLoc(S->getAllocatedTypeSourceInfo()->getTypeLoc()));
21916bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
2192ea245e0ba48caf7e7acf870880c030d7ddc76667Craig Silverstein
2193cf4679e60a5c5fa13e4bfe69f8186658c828af49Craig SilversteinDEF_TRAVERSE_STMT(OffsetOfExpr, {
21946bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // The child-iterator will pick up the expression representing
21956bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // the field.
21966bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // FIMXE: for code like offsetof(Foo, a.b.c), should we get
21976bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // making a MemberExpr callbacks for Foo.a, Foo.a.b, and Foo.a.b.c?
21986bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseTypeLoc(S->getTypeSourceInfo()->getTypeLoc()));
21996bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
2200cf4679e60a5c5fa13e4bfe69f8186658c828af49Craig Silverstein
2201f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter CollingbourneDEF_TRAVERSE_STMT(UnaryExprOrTypeTraitExpr, {
22026bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // The child-iterator will pick up the arg if it's an expression,
22036bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // but not if it's a type.
22046bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (S->isArgumentType())
22056bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(TraverseTypeLoc(S->getArgumentTypeInfo()->getTypeLoc()));
22066bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
2207cf4679e60a5c5fa13e4bfe69f8186658c828af49Craig Silverstein
220827de0f2cb3e8c26c37f31e61929b0e442c809ca5Craig SilversteinDEF_TRAVERSE_STMT(CXXTypeidExpr, {
22096bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // The child-iterator will pick up the arg if it's an expression,
22106bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // but not if it's a type.
22116bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (S->isTypeOperand())
22126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(TraverseTypeLoc(S->getTypeOperandSourceInfo()->getTypeLoc()));
22136bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
221401b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet
221576da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCallDEF_TRAVERSE_STMT(MSPropertyRefExpr, {
221676da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall  TRY_TO(TraverseNestedNameSpecifierLoc(S->getQualifierLoc()));
221776da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall})
221876da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall
221987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga NainarDEF_TRAVERSE_STMT(MSPropertySubscriptExpr, {})
222087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
222101b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois PichetDEF_TRAVERSE_STMT(CXXUuidofExpr, {
22226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // The child-iterator will pick up the arg if it's an expression,
22236bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // but not if it's a type.
22246bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (S->isTypeOperand())
22256bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    TRY_TO(TraverseTypeLoc(S->getTypeOperandSourceInfo()->getTypeLoc()));
22266bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
222727de0f2cb3e8c26c37f31e61929b0e442c809ca5Craig Silverstein
22284ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas GregorDEF_TRAVERSE_STMT(TypeTraitExpr, {
22294ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor  for (unsigned I = 0, N = S->getNumArgs(); I != N; ++I)
22304ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor    TRY_TO(TraverseTypeLoc(S->getArg(I)->getTypeLoc()));
22314ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor})
22324ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor
223321ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John WiegleyDEF_TRAVERSE_STMT(ArrayTypeTraitExpr, {
22346bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseTypeLoc(S->getQueriedTypeSourceInfo()->getTypeLoc()));
22356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
223621ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley
22376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(ExpressionTraitExpr,
223887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                  { TRY_TO_TRAVERSE_OR_ENQUEUE_STMT(S->getQueriedExpression()); })
2239552622067dc45013d240f73952fece703f5e63bdJohn Wiegley
2240ac45ad57f0641b0d556ca27d19a59930925d6addCraig SilversteinDEF_TRAVERSE_STMT(VAArgExpr, {
22416bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // The child-iterator will pick up the expression argument.
22426bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseTypeLoc(S->getWrittenTypeInfo()->getTypeLoc()));
22436bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
2244ac45ad57f0641b0d556ca27d19a59930925d6addCraig Silverstein
2245ac45ad57f0641b0d556ca27d19a59930925d6addCraig SilversteinDEF_TRAVERSE_STMT(CXXTemporaryObjectExpr, {
22466bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // This is called for code like 'return T()' where T is a class type.
22476bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseTypeLoc(S->getTypeSourceInfo()->getTypeLoc()));
22486bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
2249ac45ad57f0641b0d556ca27d19a59930925d6addCraig Silverstein
22506bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// Walk only the visible parts of lambda expressions.
225187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga NainarDEF_TRAVERSE_STMT(LambdaExpr, {
2252011d8b93b7cfa8492b8a9c909a850d6577e08dcaDouglas Gregor  for (LambdaExpr::capture_iterator C = S->explicit_capture_begin(),
22536bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                                    CEnd = S->explicit_capture_end();
2254011d8b93b7cfa8492b8a9c909a850d6577e08dcaDouglas Gregor       C != CEnd; ++C) {
22550d8e9646bc000bab521ce52ed294209a92298cefRichard Smith    TRY_TO(TraverseLambdaCapture(S, C));
2256011d8b93b7cfa8492b8a9c909a850d6577e08dcaDouglas Gregor  }
2257011d8b93b7cfa8492b8a9c909a850d6577e08dcaDouglas Gregor
2258176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  TypeLoc TL = S->getCallOperator()->getTypeSourceInfo()->getTypeLoc();
2259176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  FunctionProtoTypeLoc Proto = TL.castAs<FunctionProtoTypeLoc>();
2260176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
2261176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  if (S->hasExplicitParameters() && S->hasExplicitResultType()) {
2262176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    // Visit the whole type.
2263176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    TRY_TO(TraverseTypeLoc(TL));
2264176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  } else {
2265176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    if (S->hasExplicitParameters()) {
2266176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      // Visit parameters.
2267176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      for (unsigned I = 0, N = Proto.getNumParams(); I != N; ++I) {
2268176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        TRY_TO(TraverseDecl(Proto.getParam(I)));
22696bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      }
2270176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    } else if (S->hasExplicitResultType()) {
2271176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      TRY_TO(TraverseTypeLoc(Proto.getReturnLoc()));
2272011d8b93b7cfa8492b8a9c909a850d6577e08dcaDouglas Gregor    }
2273176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
2274176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    auto *T = Proto.getTypePtr();
2275176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    for (const auto &E : T->exceptions()) {
2276176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      TRY_TO(TraverseType(E));
2277176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
2278176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
2279176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    if (Expr *NE = T->getNoexceptExpr())
228087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      TRY_TO_TRAVERSE_OR_ENQUEUE_STMT(NE);
2281011d8b93b7cfa8492b8a9c909a850d6577e08dcaDouglas Gregor  }
2282011d8b93b7cfa8492b8a9c909a850d6577e08dcaDouglas Gregor
22834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ReturnValue = TRAVERSE_STMT_BASE(LambdaBody, LambdaExpr, S, Queue);
22844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ShouldVisitChildren = false;
228587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar})
228601d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor
2287ac45ad57f0641b0d556ca27d19a59930925d6addCraig SilversteinDEF_TRAVERSE_STMT(CXXUnresolvedConstructExpr, {
22886bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // This is called for code like 'T()', where T is a template argument.
22896bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TRY_TO(TraverseTypeLoc(S->getTypeSourceInfo()->getTypeLoc()));
22906bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines})
2291ac45ad57f0641b0d556ca27d19a59930925d6addCraig Silverstein
2292ac45ad57f0641b0d556ca27d19a59930925d6addCraig Silverstein// These expressions all might take explicit template arguments.
2293ac45ad57f0641b0d556ca27d19a59930925d6addCraig Silverstein// We traverse those if so.  FIXME: implement these.
22946bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(CXXConstructExpr, {})
22956bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(CallExpr, {})
22966bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(CXXMemberCallExpr, {})
2297ac45ad57f0641b0d556ca27d19a59930925d6addCraig Silverstein
2298dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth// These exprs (most of them), do not need any action except iterating
2299dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth// over the children.
23006bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(AddrLabelExpr, {})
23016bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(ArraySubscriptExpr, {})
230287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga NainarDEF_TRAVERSE_STMT(OMPArraySectionExpr, {})
2303336f51e463340dc7b159bc38517ac4a68081302dArgyrios KyrtzidisDEF_TRAVERSE_STMT(BlockExpr, {
2304336f51e463340dc7b159bc38517ac4a68081302dArgyrios Kyrtzidis  TRY_TO(TraverseDecl(S->getBlockDecl()));
2305336f51e463340dc7b159bc38517ac4a68081302dArgyrios Kyrtzidis  return true; // no child statements to loop through.
2306336f51e463340dc7b159bc38517ac4a68081302dArgyrios Kyrtzidis})
23076bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(ChooseExpr, {})
230882b4550fb25ad578b6c8143b87a003fae7106caeRichard SmithDEF_TRAVERSE_STMT(CompoundLiteralExpr, {
230982b4550fb25ad578b6c8143b87a003fae7106caeRichard Smith  TRY_TO(TraverseTypeLoc(S->getTypeSourceInfo()->getTypeLoc()));
231082b4550fb25ad578b6c8143b87a003fae7106caeRichard Smith})
23116bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(CXXBindTemporaryExpr, {})
23126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(CXXBoolLiteralExpr, {})
23136bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(CXXDefaultArgExpr, {})
23146bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(CXXDefaultInitExpr, {})
23156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(CXXDeleteExpr, {})
23166bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(ExprWithCleanups, {})
23174967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarDEF_TRAVERSE_STMT(CXXInheritedCtorInitExpr, {})
23186bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(CXXNullPtrLiteralExpr, {})
23196bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(CXXStdInitializerListExpr, {})
2320ba243b59a1074e0962f6abfa3bb9aa984eac1245David BlaikieDEF_TRAVERSE_STMT(CXXPseudoDestructorExpr, {
2321f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor  TRY_TO(TraverseNestedNameSpecifierLoc(S->getQualifierLoc()));
232210ffc00e2177f042808f507c8dd50b744ed6f738Douglas Gregor  if (TypeSourceInfo *ScopeInfo = S->getScopeTypeInfo())
232310ffc00e2177f042808f507c8dd50b744ed6f738Douglas Gregor    TRY_TO(TraverseTypeLoc(ScopeInfo->getTypeLoc()));
232410ffc00e2177f042808f507c8dd50b744ed6f738Douglas Gregor  if (TypeSourceInfo *DestroyedTypeInfo = S->getDestroyedTypeInfo())
232510ffc00e2177f042808f507c8dd50b744ed6f738Douglas Gregor    TRY_TO(TraverseTypeLoc(DestroyedTypeInfo->getTypeLoc()));
232610ffc00e2177f042808f507c8dd50b744ed6f738Douglas Gregor})
23276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(CXXThisExpr, {})
23286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(CXXThrowExpr, {})
23296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(UserDefinedLiteral, {})
23306bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(DesignatedInitExpr, {})
2331b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga NainarDEF_TRAVERSE_STMT(DesignatedInitUpdateExpr, {})
23326bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(ExtVectorElementExpr, {})
23336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(GNUNullExpr, {})
23346bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(ImplicitValueInitExpr, {})
2335b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga NainarDEF_TRAVERSE_STMT(NoInitExpr, {})
23366bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(ObjCBoolLiteralExpr, {})
233787014f33f123461a012995b2f7eb5e6ecf6dc461Argyrios KyrtzidisDEF_TRAVERSE_STMT(ObjCEncodeExpr, {
233887014f33f123461a012995b2f7eb5e6ecf6dc461Argyrios Kyrtzidis  if (TypeSourceInfo *TInfo = S->getEncodedTypeSourceInfo())
233987014f33f123461a012995b2f7eb5e6ecf6dc461Argyrios Kyrtzidis    TRY_TO(TraverseTypeLoc(TInfo->getTypeLoc()));
234087014f33f123461a012995b2f7eb5e6ecf6dc461Argyrios Kyrtzidis})
23416bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(ObjCIsaExpr, {})
23426bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(ObjCIvarRefExpr, {})
23431270673bf5208a140b397419c8c34e7bdcce2339Argyrios KyrtzidisDEF_TRAVERSE_STMT(ObjCMessageExpr, {
23441270673bf5208a140b397419c8c34e7bdcce2339Argyrios Kyrtzidis  if (TypeSourceInfo *TInfo = S->getClassReceiverTypeInfo())
23451270673bf5208a140b397419c8c34e7bdcce2339Argyrios Kyrtzidis    TRY_TO(TraverseTypeLoc(TInfo->getTypeLoc()));
23461270673bf5208a140b397419c8c34e7bdcce2339Argyrios Kyrtzidis})
23476bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(ObjCPropertyRefExpr, {})
23486bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(ObjCSubscriptRefExpr, {})
23496bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(ObjCProtocolExpr, {})
23506bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(ObjCSelectorExpr, {})
23516bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(ObjCIndirectCopyRestoreExpr, {})
2352f85e193739c953358c865005855253af4f68a497John McCallDEF_TRAVERSE_STMT(ObjCBridgedCastExpr, {
2353f85e193739c953358c865005855253af4f68a497John McCall  TRY_TO(TraverseTypeLoc(S->getTypeInfoAsWritten()->getTypeLoc()));
2354f85e193739c953358c865005855253af4f68a497John McCall})
23556bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(ParenExpr, {})
23566bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(ParenListExpr, {})
23576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(PredefinedExpr, {})
23586bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(ShuffleVectorExpr, {})
23596bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(ConvertVectorExpr, {})
23606bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(StmtExpr, {})
2361d3731198193eee92796ddeb493973b7a598b003eDouglas GregorDEF_TRAVERSE_STMT(UnresolvedLookupExpr, {
23624c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor  TRY_TO(TraverseNestedNameSpecifierLoc(S->getQualifierLoc()));
236366cf92a9670d57da61842adb69f9b038ce29dca5Matt Beaumont-Gay  if (S->hasExplicitTemplateArgs()) {
2364ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie    TRY_TO(TraverseTemplateArgumentLocsHelper(S->getTemplateArgs(),
236566cf92a9670d57da61842adb69f9b038ce29dca5Matt Beaumont-Gay                                              S->getNumTemplateArgs()));
236666cf92a9670d57da61842adb69f9b038ce29dca5Matt Beaumont-Gay  }
2367d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor})
2368ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie
2369d3731198193eee92796ddeb493973b7a598b003eDouglas GregorDEF_TRAVERSE_STMT(UnresolvedMemberExpr, {
23704c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor  TRY_TO(TraverseNestedNameSpecifierLoc(S->getQualifierLoc()));
237166cf92a9670d57da61842adb69f9b038ce29dca5Matt Beaumont-Gay  if (S->hasExplicitTemplateArgs()) {
2372ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie    TRY_TO(TraverseTemplateArgumentLocsHelper(S->getTemplateArgs(),
237366cf92a9670d57da61842adb69f9b038ce29dca5Matt Beaumont-Gay                                              S->getNumTemplateArgs()));
237466cf92a9670d57da61842adb69f9b038ce29dca5Matt Beaumont-Gay  }
2375d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor})
2376d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor
237728bbe4b8acc338476fe0825769b41fb32b423c72John WiegleyDEF_TRAVERSE_STMT(SEHTryStmt, {})
237828bbe4b8acc338476fe0825769b41fb32b423c72John WiegleyDEF_TRAVERSE_STMT(SEHExceptStmt, {})
23796bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(SEHFinallyStmt, {})
2380c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen HinesDEF_TRAVERSE_STMT(SEHLeaveStmt, {})
23816bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(CapturedStmt, { TRY_TO(TraverseDecl(S->getCapturedDecl())); })
238228bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley
23836bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(CXXOperatorCallExpr, {})
23846bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(OpaqueValueExpr, {})
2385176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesDEF_TRAVERSE_STMT(TypoExpr, {})
23866bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(CUDAKernelCallExpr, {})
2387dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth
2388dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth// These operators (all of them) do not need any action except
2389dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth// iterating over the children.
23906bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(BinaryConditionalOperator, {})
23916bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(ConditionalOperator, {})
23926bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(UnaryOperator, {})
23936bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(BinaryOperator, {})
23946bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(CompoundAssignOperator, {})
23956bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(CXXNoexceptExpr, {})
23966bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(PackExpansionExpr, {})
23976bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(SizeOfPackExpr, {})
23986bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(SubstNonTypeTemplateParmPackExpr, {})
23996bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(SubstNonTypeTemplateParmExpr, {})
24006bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(FunctionParmPackExpr, {})
24016bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(MaterializeTemporaryExpr, {})
2402176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesDEF_TRAVERSE_STMT(CXXFoldExpr, {})
24036bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(AtomicExpr, {})
2404dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth
240587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// For coroutines expressions, traverse either the operand
240687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// as written or the implied calls, depending on what the
240787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// derived class requests.
240887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga NainarDEF_TRAVERSE_STMT(CoroutineBodyStmt, {
240987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  if (!getDerived().shouldVisitImplicitCode()) {
241087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    TRY_TO_TRAVERSE_OR_ENQUEUE_STMT(S->getBody());
24114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    ShouldVisitChildren = false;
241287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  }
241387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar})
241487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga NainarDEF_TRAVERSE_STMT(CoreturnStmt, {
241587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  if (!getDerived().shouldVisitImplicitCode()) {
241687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    TRY_TO_TRAVERSE_OR_ENQUEUE_STMT(S->getOperand());
24174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    ShouldVisitChildren = false;
241887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  }
241987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar})
242087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga NainarDEF_TRAVERSE_STMT(CoawaitExpr, {
242187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  if (!getDerived().shouldVisitImplicitCode()) {
242287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    TRY_TO_TRAVERSE_OR_ENQUEUE_STMT(S->getOperand());
24234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    ShouldVisitChildren = false;
242487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  }
242587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar})
242687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga NainarDEF_TRAVERSE_STMT(CoyieldExpr, {
242787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  if (!getDerived().shouldVisitImplicitCode()) {
242887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    TRY_TO_TRAVERSE_OR_ENQUEUE_STMT(S->getOperand());
24294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    ShouldVisitChildren = false;
243087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  }
243187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar})
243287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
2433dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth// These literals (all of them) do not need any action.
24346bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(IntegerLiteral, {})
24356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(CharacterLiteral, {})
24366bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(FloatingLiteral, {})
24376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(ImaginaryLiteral, {})
24386bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(StringLiteral, {})
24396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(ObjCStringLiteral, {})
24406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(ObjCBoxedExpr, {})
24416bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(ObjCArrayLiteral, {})
24426bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(ObjCDictionaryLiteral, {})
24436bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
244461eee0ca33b29e102f11bab77c8b74cc00e2392bTanya Lattner// Traverse OpenCL: AsType, Convert.
24456bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDEF_TRAVERSE_STMT(AsTypeExpr, {})
2446dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth
24474fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev// OpenMP directives.
24486bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate <typename Derived>
2449651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesbool RecursiveASTVisitor<Derived>::TraverseOMPExecutableDirective(
24506bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    OMPExecutableDirective *S) {
2451c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  for (auto *C : S->clauses()) {
2452c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    TRY_TO(TraverseOMPClause(C));
2453c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  }
2454651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return true;
2455651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
2456651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
2457176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinestemplate <typename Derived>
2458176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesbool
2459176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesRecursiveASTVisitor<Derived>::TraverseOMPLoopDirective(OMPLoopDirective *S) {
2460176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  return TraverseOMPExecutableDirective(S);
2461176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
2462176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
2463c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen HinesDEF_TRAVERSE_STMT(OMPParallelDirective,
2464c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines                  { TRY_TO(TraverseOMPExecutableDirective(S)); })
2465651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
2466c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen HinesDEF_TRAVERSE_STMT(OMPSimdDirective,
2467c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines                  { TRY_TO(TraverseOMPExecutableDirective(S)); })
2468c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
2469c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen HinesDEF_TRAVERSE_STMT(OMPForDirective,
2470c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines                  { TRY_TO(TraverseOMPExecutableDirective(S)); })
2471c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
2472176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesDEF_TRAVERSE_STMT(OMPForSimdDirective,
2473176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines                  { TRY_TO(TraverseOMPExecutableDirective(S)); })
2474176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
2475c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen HinesDEF_TRAVERSE_STMT(OMPSectionsDirective,
2476c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines                  { TRY_TO(TraverseOMPExecutableDirective(S)); })
2477c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
2478c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen HinesDEF_TRAVERSE_STMT(OMPSectionDirective,
2479c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines                  { TRY_TO(TraverseOMPExecutableDirective(S)); })
2480c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
2481c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen HinesDEF_TRAVERSE_STMT(OMPSingleDirective,
2482c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines                  { TRY_TO(TraverseOMPExecutableDirective(S)); })
2483c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
2484176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesDEF_TRAVERSE_STMT(OMPMasterDirective,
2485176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines                  { TRY_TO(TraverseOMPExecutableDirective(S)); })
2486176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
2487176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesDEF_TRAVERSE_STMT(OMPCriticalDirective, {
2488176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  TRY_TO(TraverseDeclarationNameInfo(S->getDirectiveName()));
2489176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  TRY_TO(TraverseOMPExecutableDirective(S));
2490176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines})
2491176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
2492c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen HinesDEF_TRAVERSE_STMT(OMPParallelForDirective,
2493c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines                  { TRY_TO(TraverseOMPExecutableDirective(S)); })
2494c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
2495176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesDEF_TRAVERSE_STMT(OMPParallelForSimdDirective,
2496176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines                  { TRY_TO(TraverseOMPExecutableDirective(S)); })
2497176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
2498c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen HinesDEF_TRAVERSE_STMT(OMPParallelSectionsDirective,
2499c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines                  { TRY_TO(TraverseOMPExecutableDirective(S)); })
25004fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev
2501176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesDEF_TRAVERSE_STMT(OMPTaskDirective,
2502176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines                  { TRY_TO(TraverseOMPExecutableDirective(S)); })
2503176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
2504176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesDEF_TRAVERSE_STMT(OMPTaskyieldDirective,
2505176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines                  { TRY_TO(TraverseOMPExecutableDirective(S)); })
2506176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
2507176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesDEF_TRAVERSE_STMT(OMPBarrierDirective,
2508176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines                  { TRY_TO(TraverseOMPExecutableDirective(S)); })
2509176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
2510176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesDEF_TRAVERSE_STMT(OMPTaskwaitDirective,
2511176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines                  { TRY_TO(TraverseOMPExecutableDirective(S)); })
2512176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
251387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga NainarDEF_TRAVERSE_STMT(OMPTaskgroupDirective,
251487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                  { TRY_TO(TraverseOMPExecutableDirective(S)); })
251587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
251687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga NainarDEF_TRAVERSE_STMT(OMPCancellationPointDirective,
251787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                  { TRY_TO(TraverseOMPExecutableDirective(S)); })
251887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
251987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga NainarDEF_TRAVERSE_STMT(OMPCancelDirective,
252087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                  { TRY_TO(TraverseOMPExecutableDirective(S)); })
252187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
2522176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesDEF_TRAVERSE_STMT(OMPFlushDirective,
2523176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines                  { TRY_TO(TraverseOMPExecutableDirective(S)); })
2524176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
2525176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesDEF_TRAVERSE_STMT(OMPOrderedDirective,
2526176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines                  { TRY_TO(TraverseOMPExecutableDirective(S)); })
2527176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
2528176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesDEF_TRAVERSE_STMT(OMPAtomicDirective,
2529176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines                  { TRY_TO(TraverseOMPExecutableDirective(S)); })
2530176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
2531176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesDEF_TRAVERSE_STMT(OMPTargetDirective,
2532176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines                  { TRY_TO(TraverseOMPExecutableDirective(S)); })
2533176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
253487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga NainarDEF_TRAVERSE_STMT(OMPTargetDataDirective,
253587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                  { TRY_TO(TraverseOMPExecutableDirective(S)); })
253687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
25374967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarDEF_TRAVERSE_STMT(OMPTargetEnterDataDirective,
25384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                  { TRY_TO(TraverseOMPExecutableDirective(S)); })
25394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
25404967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarDEF_TRAVERSE_STMT(OMPTargetExitDataDirective,
25414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                  { TRY_TO(TraverseOMPExecutableDirective(S)); })
25424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
25434967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarDEF_TRAVERSE_STMT(OMPTargetParallelDirective,
25444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                  { TRY_TO(TraverseOMPExecutableDirective(S)); })
25454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
25464967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarDEF_TRAVERSE_STMT(OMPTargetParallelForDirective,
25474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                  { TRY_TO(TraverseOMPExecutableDirective(S)); })
25484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
2549176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesDEF_TRAVERSE_STMT(OMPTeamsDirective,
2550176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines                  { TRY_TO(TraverseOMPExecutableDirective(S)); })
2551176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
25524967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarDEF_TRAVERSE_STMT(OMPTargetUpdateDirective,
25534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                  { TRY_TO(TraverseOMPExecutableDirective(S)); })
25544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
255587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga NainarDEF_TRAVERSE_STMT(OMPTaskLoopDirective,
255687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                  { TRY_TO(TraverseOMPExecutableDirective(S)); })
255787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
255887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga NainarDEF_TRAVERSE_STMT(OMPTaskLoopSimdDirective,
255987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                  { TRY_TO(TraverseOMPExecutableDirective(S)); })
256087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
256187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga NainarDEF_TRAVERSE_STMT(OMPDistributeDirective,
256287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                  { TRY_TO(TraverseOMPExecutableDirective(S)); })
256387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
25644967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarDEF_TRAVERSE_STMT(OMPDistributeParallelForDirective,
25654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                  { TRY_TO(TraverseOMPExecutableDirective(S)); })
25664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
25674967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarDEF_TRAVERSE_STMT(OMPDistributeParallelForSimdDirective,
25684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                  { TRY_TO(TraverseOMPExecutableDirective(S)); })
25694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
25704967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarDEF_TRAVERSE_STMT(OMPDistributeSimdDirective,
25714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                  { TRY_TO(TraverseOMPExecutableDirective(S)); })
25724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
25734967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarDEF_TRAVERSE_STMT(OMPTargetParallelForSimdDirective,
25744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                  { TRY_TO(TraverseOMPExecutableDirective(S)); })
25754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
25764fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev// OpenMP clauses.
25776bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate <typename Derived>
25784fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataevbool RecursiveASTVisitor<Derived>::TraverseOMPClause(OMPClause *C) {
25796bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (!C)
25806bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    return true;
25814fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  switch (C->getClauseKind()) {
25826bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#define OPENMP_CLAUSE(Name, Class)                                             \
25836bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  case OMPC_##Name:                                                            \
2584c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    TRY_TO(Visit##Class(static_cast<Class *>(C)));                             \
2585c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    break;
25864fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev#include "clang/Basic/OpenMPKinds.def"
2587c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  case OMPC_threadprivate:
25884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  case OMPC_uniform:
2589c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  case OMPC_unknown:
25906bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    break;
25914fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  }
25924fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  return true;
25934fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev}
25944fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev
25956bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate <typename Derived>
25964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarbool RecursiveASTVisitor<Derived>::VisitOMPClauseWithPreInit(
25974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    OMPClauseWithPreInit *Node) {
25984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  TRY_TO(TraverseStmt(Node->getPreInitStmt()));
25994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  return true;
26004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
26014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
26024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainartemplate <typename Derived>
26034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarbool RecursiveASTVisitor<Derived>::VisitOMPClauseWithPostUpdate(
26044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    OMPClauseWithPostUpdate *Node) {
26054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  TRY_TO(VisitOMPClauseWithPreInit(Node));
26064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  TRY_TO(TraverseStmt(Node->getPostUpdateExpr()));
26074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  return true;
26084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
26094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
26104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainartemplate <typename Derived>
2611651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesbool RecursiveASTVisitor<Derived>::VisitOMPIfClause(OMPIfClause *C) {
2612c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  TRY_TO(TraverseStmt(C->getCondition()));
2613651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return true;
2614651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
2615651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
26166bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate <typename Derived>
2617176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesbool RecursiveASTVisitor<Derived>::VisitOMPFinalClause(OMPFinalClause *C) {
2618176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  TRY_TO(TraverseStmt(C->getCondition()));
2619176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  return true;
2620176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
2621176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
2622176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinestemplate <typename Derived>
26236bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesbool
26246bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesRecursiveASTVisitor<Derived>::VisitOMPNumThreadsClause(OMPNumThreadsClause *C) {
2625c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  TRY_TO(TraverseStmt(C->getNumThreads()));
2626651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return true;
2627651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
2628651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
2629c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinestemplate <typename Derived>
2630651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesbool RecursiveASTVisitor<Derived>::VisitOMPSafelenClause(OMPSafelenClause *C) {
2631c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  TRY_TO(TraverseStmt(C->getSafelen()));
2632c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  return true;
2633c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines}
2634c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
2635c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinestemplate <typename Derived>
263687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarbool RecursiveASTVisitor<Derived>::VisitOMPSimdlenClause(OMPSimdlenClause *C) {
263787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  TRY_TO(TraverseStmt(C->getSimdlen()));
263887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  return true;
263987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
264087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
264187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainartemplate <typename Derived>
2642c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesbool
2643c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen HinesRecursiveASTVisitor<Derived>::VisitOMPCollapseClause(OMPCollapseClause *C) {
2644c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  TRY_TO(TraverseStmt(C->getNumForLoops()));
2645651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return true;
2646651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
2647651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
26486bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate <typename Derived>
2649c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesbool RecursiveASTVisitor<Derived>::VisitOMPDefaultClause(OMPDefaultClause *) {
26506bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  return true;
26516bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}
26526bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
2653c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinestemplate <typename Derived>
2654c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesbool RecursiveASTVisitor<Derived>::VisitOMPProcBindClause(OMPProcBindClause *) {
26554fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  return true;
26564fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev}
26574fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev
26586bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate <typename Derived>
26596bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesbool
2660c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen HinesRecursiveASTVisitor<Derived>::VisitOMPScheduleClause(OMPScheduleClause *C) {
26614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  TRY_TO(VisitOMPClauseWithPreInit(C));
2662c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  TRY_TO(TraverseStmt(C->getChunkSize()));
2663c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  return true;
2664c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines}
2665c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
2666c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinestemplate <typename Derived>
266787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarbool RecursiveASTVisitor<Derived>::VisitOMPOrderedClause(OMPOrderedClause *C) {
266887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  TRY_TO(TraverseStmt(C->getNumForLoops()));
2669c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  return true;
2670c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines}
2671c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
2672c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinestemplate <typename Derived>
2673c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesbool RecursiveASTVisitor<Derived>::VisitOMPNowaitClause(OMPNowaitClause *) {
26746bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  return true;
26756bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}
26766bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
26776bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate <typename Derived>
2678176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesbool RecursiveASTVisitor<Derived>::VisitOMPUntiedClause(OMPUntiedClause *) {
2679176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  return true;
2680176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
2681176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
2682176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinestemplate <typename Derived>
2683176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesbool
2684176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesRecursiveASTVisitor<Derived>::VisitOMPMergeableClause(OMPMergeableClause *) {
2685176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  return true;
2686176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
2687176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
2688176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinestemplate <typename Derived>
2689176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesbool RecursiveASTVisitor<Derived>::VisitOMPReadClause(OMPReadClause *) {
2690176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  return true;
2691176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
2692176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
2693176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinestemplate <typename Derived>
2694176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesbool RecursiveASTVisitor<Derived>::VisitOMPWriteClause(OMPWriteClause *) {
2695176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  return true;
2696176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
2697176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
2698176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinestemplate <typename Derived>
2699176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesbool RecursiveASTVisitor<Derived>::VisitOMPUpdateClause(OMPUpdateClause *) {
2700176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  return true;
2701176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
2702176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
2703176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinestemplate <typename Derived>
2704176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesbool RecursiveASTVisitor<Derived>::VisitOMPCaptureClause(OMPCaptureClause *) {
2705176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  return true;
2706176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
2707176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
2708176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinestemplate <typename Derived>
2709176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesbool RecursiveASTVisitor<Derived>::VisitOMPSeqCstClause(OMPSeqCstClause *) {
2710176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  return true;
2711176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
2712176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
2713176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinestemplate <typename Derived>
271487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarbool RecursiveASTVisitor<Derived>::VisitOMPThreadsClause(OMPThreadsClause *) {
271587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  return true;
271687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
271787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
271887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainartemplate <typename Derived>
271987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarbool RecursiveASTVisitor<Derived>::VisitOMPSIMDClause(OMPSIMDClause *) {
272087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  return true;
272187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
272287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
272387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainartemplate <typename Derived>
272487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarbool RecursiveASTVisitor<Derived>::VisitOMPNogroupClause(OMPNogroupClause *) {
272587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  return true;
272687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
272787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
272887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainartemplate <typename Derived>
27296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate <typename T>
2730c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesbool RecursiveASTVisitor<Derived>::VisitOMPClauseList(T *Node) {
2731c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  for (auto *E : Node->varlists()) {
2732c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    TRY_TO(TraverseStmt(E));
2733c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  }
2734c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  return true;
2735543c4ae954f2bce5ac58ed22080f23cbd94794d2Alexey Bataev}
27364fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev
27376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate <typename Derived>
27380c018357b8bbb1f96bbf622a5807421e626b4228Alexey Bataevbool RecursiveASTVisitor<Derived>::VisitOMPPrivateClause(OMPPrivateClause *C) {
2739c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  TRY_TO(VisitOMPClauseList(C));
2740176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  for (auto *E : C->private_copies()) {
2741176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    TRY_TO(TraverseStmt(E));
2742176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  }
27434fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  return true;
27444fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev}
27454fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev
27466bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate <typename Derived>
2747d195bc38fd424b0c928e3c354038a8ca6e2ccac3Alexey Bataevbool RecursiveASTVisitor<Derived>::VisitOMPFirstprivateClause(
27486bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    OMPFirstprivateClause *C) {
2749c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  TRY_TO(VisitOMPClauseList(C));
27504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  TRY_TO(VisitOMPClauseWithPreInit(C));
2751176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  for (auto *E : C->private_copies()) {
2752176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    TRY_TO(TraverseStmt(E));
2753176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  }
2754176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  for (auto *E : C->inits()) {
2755176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    TRY_TO(TraverseStmt(E));
2756176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  }
2757c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  return true;
2758c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines}
2759c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
2760c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinestemplate <typename Derived>
2761c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesbool RecursiveASTVisitor<Derived>::VisitOMPLastprivateClause(
2762c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    OMPLastprivateClause *C) {
2763c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  TRY_TO(VisitOMPClauseList(C));
27644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  TRY_TO(VisitOMPClauseWithPostUpdate(C));
276558878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  for (auto *E : C->private_copies()) {
276658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar    TRY_TO(TraverseStmt(E));
276758878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  }
276858878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  for (auto *E : C->source_exprs()) {
276958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar    TRY_TO(TraverseStmt(E));
277058878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  }
277158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  for (auto *E : C->destination_exprs()) {
277258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar    TRY_TO(TraverseStmt(E));
277358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  }
277458878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  for (auto *E : C->assignment_ops()) {
277558878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar    TRY_TO(TraverseStmt(E));
277658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  }
2777d195bc38fd424b0c928e3c354038a8ca6e2ccac3Alexey Bataev  return true;
2778d195bc38fd424b0c928e3c354038a8ca6e2ccac3Alexey Bataev}
2779d195bc38fd424b0c928e3c354038a8ca6e2ccac3Alexey Bataev
27806bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate <typename Derived>
27810c018357b8bbb1f96bbf622a5807421e626b4228Alexey Bataevbool RecursiveASTVisitor<Derived>::VisitOMPSharedClause(OMPSharedClause *C) {
2782c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  TRY_TO(VisitOMPClauseList(C));
27830c018357b8bbb1f96bbf622a5807421e626b4228Alexey Bataev  return true;
27840c018357b8bbb1f96bbf622a5807421e626b4228Alexey Bataev}
27850c018357b8bbb1f96bbf622a5807421e626b4228Alexey Bataev
27866bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate <typename Derived>
27876bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesbool RecursiveASTVisitor<Derived>::VisitOMPLinearClause(OMPLinearClause *C) {
2788c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  TRY_TO(TraverseStmt(C->getStep()));
27893ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  TRY_TO(TraverseStmt(C->getCalcStep()));
2790c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  TRY_TO(VisitOMPClauseList(C));
27914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  TRY_TO(VisitOMPClauseWithPostUpdate(C));
279287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  for (auto *E : C->privates()) {
279387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    TRY_TO(TraverseStmt(E));
279487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  }
27953ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  for (auto *E : C->inits()) {
27963ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar    TRY_TO(TraverseStmt(E));
27973ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  }
27983ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  for (auto *E : C->updates()) {
27993ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar    TRY_TO(TraverseStmt(E));
28003ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  }
28013ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  for (auto *E : C->finals()) {
28023ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar    TRY_TO(TraverseStmt(E));
28033ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  }
2804c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  return true;
2805c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines}
2806c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
2807c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinestemplate <typename Derived>
2808c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesbool RecursiveASTVisitor<Derived>::VisitOMPAlignedClause(OMPAlignedClause *C) {
2809c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  TRY_TO(TraverseStmt(C->getAlignment()));
2810c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  TRY_TO(VisitOMPClauseList(C));
28116bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  return true;
28126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}
28136bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
28146bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate <typename Derived>
2815651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesbool RecursiveASTVisitor<Derived>::VisitOMPCopyinClause(OMPCopyinClause *C) {
2816c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  TRY_TO(VisitOMPClauseList(C));
281758878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  for (auto *E : C->source_exprs()) {
281858878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar    TRY_TO(TraverseStmt(E));
281958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  }
282058878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  for (auto *E : C->destination_exprs()) {
282158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar    TRY_TO(TraverseStmt(E));
282258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  }
282358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  for (auto *E : C->assignment_ops()) {
282458878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar    TRY_TO(TraverseStmt(E));
282558878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  }
2826c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  return true;
2827c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines}
2828c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
2829c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinestemplate <typename Derived>
2830c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesbool RecursiveASTVisitor<Derived>::VisitOMPCopyprivateClause(
2831c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    OMPCopyprivateClause *C) {
2832c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  TRY_TO(VisitOMPClauseList(C));
28333ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  for (auto *E : C->source_exprs()) {
28343ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar    TRY_TO(TraverseStmt(E));
28353ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  }
28363ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  for (auto *E : C->destination_exprs()) {
28373ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar    TRY_TO(TraverseStmt(E));
28383ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  }
28393ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  for (auto *E : C->assignment_ops()) {
28403ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar    TRY_TO(TraverseStmt(E));
28413ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  }
2842c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  return true;
2843c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines}
2844c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
2845c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinestemplate <typename Derived>
2846c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesbool
2847c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen HinesRecursiveASTVisitor<Derived>::VisitOMPReductionClause(OMPReductionClause *C) {
2848c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  TRY_TO(TraverseNestedNameSpecifierLoc(C->getQualifierLoc()));
2849c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  TRY_TO(TraverseDeclarationNameInfo(C->getNameInfo()));
2850c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  TRY_TO(VisitOMPClauseList(C));
28514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  TRY_TO(VisitOMPClauseWithPostUpdate(C));
285287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  for (auto *E : C->privates()) {
285387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    TRY_TO(TraverseStmt(E));
285487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  }
285558878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  for (auto *E : C->lhs_exprs()) {
285658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar    TRY_TO(TraverseStmt(E));
285758878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  }
285858878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  for (auto *E : C->rhs_exprs()) {
285958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar    TRY_TO(TraverseStmt(E));
286058878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  }
286158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  for (auto *E : C->reduction_ops()) {
286258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar    TRY_TO(TraverseStmt(E));
286358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  }
2864651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return true;
2865651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
2866651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
2867176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinestemplate <typename Derived>
2868176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesbool RecursiveASTVisitor<Derived>::VisitOMPFlushClause(OMPFlushClause *C) {
2869176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  TRY_TO(VisitOMPClauseList(C));
2870176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  return true;
2871176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
2872176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
287387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainartemplate <typename Derived>
287487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarbool RecursiveASTVisitor<Derived>::VisitOMPDependClause(OMPDependClause *C) {
287587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  TRY_TO(VisitOMPClauseList(C));
287687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  return true;
287787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
287887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
287987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainartemplate <typename Derived>
288087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarbool RecursiveASTVisitor<Derived>::VisitOMPDeviceClause(OMPDeviceClause *C) {
288187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  TRY_TO(TraverseStmt(C->getDevice()));
288287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  return true;
288387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
288487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
288587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainartemplate <typename Derived>
288687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarbool RecursiveASTVisitor<Derived>::VisitOMPMapClause(OMPMapClause *C) {
288787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  TRY_TO(VisitOMPClauseList(C));
288887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  return true;
288987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
289087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
289187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainartemplate <typename Derived>
289287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarbool RecursiveASTVisitor<Derived>::VisitOMPNumTeamsClause(
289387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    OMPNumTeamsClause *C) {
289487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  TRY_TO(TraverseStmt(C->getNumTeams()));
289587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  return true;
289687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
289787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
289887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainartemplate <typename Derived>
289987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarbool RecursiveASTVisitor<Derived>::VisitOMPThreadLimitClause(
290087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    OMPThreadLimitClause *C) {
290187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  TRY_TO(TraverseStmt(C->getThreadLimit()));
290287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  return true;
290387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
290487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
290587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainartemplate <typename Derived>
290687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarbool RecursiveASTVisitor<Derived>::VisitOMPPriorityClause(
290787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    OMPPriorityClause *C) {
290887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  TRY_TO(TraverseStmt(C->getPriority()));
290987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  return true;
291087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
291187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
291287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainartemplate <typename Derived>
291387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarbool RecursiveASTVisitor<Derived>::VisitOMPGrainsizeClause(
291487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    OMPGrainsizeClause *C) {
291587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  TRY_TO(TraverseStmt(C->getGrainsize()));
291687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  return true;
291787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
291887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
291987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainartemplate <typename Derived>
292087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarbool RecursiveASTVisitor<Derived>::VisitOMPNumTasksClause(
292187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    OMPNumTasksClause *C) {
292287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  TRY_TO(TraverseStmt(C->getNumTasks()));
292387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  return true;
292487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
292587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
292687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainartemplate <typename Derived>
292787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarbool RecursiveASTVisitor<Derived>::VisitOMPHintClause(OMPHintClause *C) {
292887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  TRY_TO(TraverseStmt(C->getHint()));
292987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  return true;
293087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
293187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
29324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainartemplate <typename Derived>
29334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarbool RecursiveASTVisitor<Derived>::VisitOMPDistScheduleClause(
29344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    OMPDistScheduleClause *C) {
29354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  TRY_TO(VisitOMPClauseWithPreInit(C));
29364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  TRY_TO(TraverseStmt(C->getChunkSize()));
29374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  return true;
29384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
29394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
29404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainartemplate <typename Derived>
29414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarbool
29424967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarRecursiveASTVisitor<Derived>::VisitOMPDefaultmapClause(OMPDefaultmapClause *C) {
29434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  return true;
29444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
29454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
29464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainartemplate <typename Derived>
29474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarbool RecursiveASTVisitor<Derived>::VisitOMPToClause(OMPToClause *C) {
29484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  TRY_TO(VisitOMPClauseList(C));
29494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  return true;
29504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
29514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
29524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainartemplate <typename Derived>
29534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarbool RecursiveASTVisitor<Derived>::VisitOMPFromClause(OMPFromClause *C) {
29544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  TRY_TO(VisitOMPClauseList(C));
29554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  return true;
29564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
29574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
29584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainartemplate <typename Derived>
29594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarbool RecursiveASTVisitor<Derived>::VisitOMPUseDevicePtrClause(
29604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    OMPUseDevicePtrClause *C) {
29614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  TRY_TO(VisitOMPClauseList(C));
29624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  return true;
29634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
29644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
29654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainartemplate <typename Derived>
29664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarbool RecursiveASTVisitor<Derived>::VisitOMPIsDevicePtrClause(
29674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    OMPIsDevicePtrClause *C) {
29684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  TRY_TO(VisitOMPClauseList(C));
29694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  return true;
29704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
29714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
2972dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth// FIXME: look at the following tricky-seeming exprs to see if we
2973dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth// need to recurse on anything.  These are ones that have methods
2974dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth// returning decls or qualtypes or nestednamespecifier -- though I'm
2975dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth// not sure if they own them -- or just seemed very complicated, or
2976dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth// had lots of sub-types to explore.
2977dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth//
2978dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth// VisitOverloadExpr and its children: recurse on template args? etc?
2979dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth
2980dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth// FIXME: go through all the stmts and exprs again, and see which of them
2981dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth// create new types, and recurse on the types (TypeLocs?) of those.
2982dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth// Candidates:
29832ac54ec0a8ad305fdd76847c2fd6631cfb7baa82Zhanyong Wan//
2984dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth//    http://clang.llvm.org/doxygen/classclang_1_1CXXTypeidExpr.html
2985f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne//    http://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html
2986dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth//    http://clang.llvm.org/doxygen/classclang_1_1TypesCompatibleExpr.html
2987dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth//    Every class that has getQualifier.
2988dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth
2989dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth#undef DEF_TRAVERSE_STMT
299087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar#undef TRAVERSE_STMT
299187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar#undef TRAVERSE_STMT_BASE
2992dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth
2993dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth#undef TRY_TO
2994facfc77487a890bfb7b5eee7e21cd2b395a9faafChandler Carruth
2995d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor} // end namespace clang
2996d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor
2997d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor#endif // LLVM_CLANG_AST_RECURSIVEASTVISITOR_H
2998