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