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