1d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor//===--- RecursiveASTVisitor.h - Recursive AST Visitor ----------*- C++ -*-===// 2d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor// 3d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor// The LLVM Compiler Infrastructure 4d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor// 5d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor// This file is distributed under the University of Illinois Open Source 6d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor// License. See LICENSE.TXT for details. 7d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor// 8d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor//===----------------------------------------------------------------------===// 9d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor// 10d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor// This file defines the RecursiveASTVisitor interface, which recursively 11d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor// traverses the entire AST. 12d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor// 13d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor//===----------------------------------------------------------------------===// 14d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor#ifndef LLVM_CLANG_AST_RECURSIVEASTVISITOR_H 15d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor#define LLVM_CLANG_AST_RECURSIVEASTVISITOR_H 16d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor 17d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor#include "clang/AST/Decl.h" 18d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor#include "clang/AST/DeclCXX.h" 19d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor#include "clang/AST/DeclFriend.h" 20d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor#include "clang/AST/DeclObjC.h" 21d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor#include "clang/AST/DeclTemplate.h" 22d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor#include "clang/AST/Expr.h" 23d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor#include "clang/AST/ExprCXX.h" 24d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor#include "clang/AST/ExprObjC.h" 25d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor#include "clang/AST/NestedNameSpecifier.h" 26d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor#include "clang/AST/Stmt.h" 27d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor#include "clang/AST/StmtCXX.h" 28d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor#include "clang/AST/StmtObjC.h" 29d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor#include "clang/AST/TemplateBase.h" 30d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor#include "clang/AST/TemplateName.h" 31d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor#include "clang/AST/Type.h" 324d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky#include "clang/AST/TypeLoc.h" 33d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor 347d66f8cafd807e551efb4739cdb37fc272cf5345Chandler Carruth// The following three macros are used for meta programming. The code 357d66f8cafd807e551efb4739cdb37fc272cf5345Chandler Carruth// using them is responsible for defining macro OPERATOR(). 367d66f8cafd807e551efb4739cdb37fc272cf5345Chandler Carruth 377d66f8cafd807e551efb4739cdb37fc272cf5345Chandler Carruth// All unary operators. 387d66f8cafd807e551efb4739cdb37fc272cf5345Chandler Carruth#define UNARYOP_LIST() \ 397d66f8cafd807e551efb4739cdb37fc272cf5345Chandler Carruth OPERATOR(PostInc) OPERATOR(PostDec) \ 407d66f8cafd807e551efb4739cdb37fc272cf5345Chandler Carruth OPERATOR(PreInc) OPERATOR(PreDec) \ 417d66f8cafd807e551efb4739cdb37fc272cf5345Chandler Carruth OPERATOR(AddrOf) OPERATOR(Deref) \ 427d66f8cafd807e551efb4739cdb37fc272cf5345Chandler Carruth OPERATOR(Plus) OPERATOR(Minus) \ 437d66f8cafd807e551efb4739cdb37fc272cf5345Chandler Carruth OPERATOR(Not) OPERATOR(LNot) \ 447d66f8cafd807e551efb4739cdb37fc272cf5345Chandler Carruth OPERATOR(Real) OPERATOR(Imag) \ 45de7e66256b1bdfcf6526994825a8c8fced52a31cEli Friedman OPERATOR(Extension) 467d66f8cafd807e551efb4739cdb37fc272cf5345Chandler Carruth 477d66f8cafd807e551efb4739cdb37fc272cf5345Chandler Carruth// All binary operators (excluding compound assign operators). 487d66f8cafd807e551efb4739cdb37fc272cf5345Chandler Carruth#define BINOP_LIST() \ 497d66f8cafd807e551efb4739cdb37fc272cf5345Chandler Carruth OPERATOR(PtrMemD) OPERATOR(PtrMemI) \ 507d66f8cafd807e551efb4739cdb37fc272cf5345Chandler Carruth OPERATOR(Mul) OPERATOR(Div) OPERATOR(Rem) \ 517d66f8cafd807e551efb4739cdb37fc272cf5345Chandler Carruth OPERATOR(Add) OPERATOR(Sub) OPERATOR(Shl) \ 527d66f8cafd807e551efb4739cdb37fc272cf5345Chandler Carruth OPERATOR(Shr) \ 537d66f8cafd807e551efb4739cdb37fc272cf5345Chandler Carruth \ 547d66f8cafd807e551efb4739cdb37fc272cf5345Chandler Carruth OPERATOR(LT) OPERATOR(GT) OPERATOR(LE) \ 557d66f8cafd807e551efb4739cdb37fc272cf5345Chandler Carruth OPERATOR(GE) OPERATOR(EQ) OPERATOR(NE) \ 567d66f8cafd807e551efb4739cdb37fc272cf5345Chandler Carruth OPERATOR(And) OPERATOR(Xor) OPERATOR(Or) \ 577d66f8cafd807e551efb4739cdb37fc272cf5345Chandler Carruth OPERATOR(LAnd) OPERATOR(LOr) \ 587d66f8cafd807e551efb4739cdb37fc272cf5345Chandler Carruth \ 597d66f8cafd807e551efb4739cdb37fc272cf5345Chandler Carruth OPERATOR(Assign) \ 607d66f8cafd807e551efb4739cdb37fc272cf5345Chandler Carruth OPERATOR(Comma) 617d66f8cafd807e551efb4739cdb37fc272cf5345Chandler Carruth 627d66f8cafd807e551efb4739cdb37fc272cf5345Chandler Carruth// All compound assign operators. 637d66f8cafd807e551efb4739cdb37fc272cf5345Chandler Carruth#define CAO_LIST() \ 647d66f8cafd807e551efb4739cdb37fc272cf5345Chandler Carruth OPERATOR(Mul) OPERATOR(Div) OPERATOR(Rem) OPERATOR(Add) OPERATOR(Sub) \ 657d66f8cafd807e551efb4739cdb37fc272cf5345Chandler Carruth OPERATOR(Shl) OPERATOR(Shr) OPERATOR(And) OPERATOR(Or) OPERATOR(Xor) 667d66f8cafd807e551efb4739cdb37fc272cf5345Chandler Carruth 67d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregornamespace clang { 68facfc77487a890bfb7b5eee7e21cd2b395a9faafChandler Carruth 69dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth// A helper macro to implement short-circuiting when recursing. It 70dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth// invokes CALL_EXPR, which must be a method call, on the derived 71dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth// object (s.t. a user of RecursiveASTVisitor can override the method 72dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth// in CALL_EXPR). 73dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth#define TRY_TO(CALL_EXPR) \ 74e3e210c3aa3c1b289eee669a1d235fc16df384a0Chandler Carruth do { if (!getDerived().CALL_EXPR) return false; } while (0) 75dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth 76dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth/// \brief A class that does preorder depth-first traversal on the 77dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth/// entire Clang AST and visits each node. 78dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth/// 79dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth/// This class performs three distinct tasks: 80dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth/// 1. traverse the AST (i.e. go to each node); 81dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth/// 2. at a given node, walk up the class hierarchy, starting from 82dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth/// the node's dynamic type, until the top-most class (e.g. Stmt, 83dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth/// Decl, or Type) is reached. 84dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth/// 3. given a (node, class) combination, where 'class' is some base 85dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth/// class of the dynamic type of 'node', call a user-overridable 86dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth/// function to actually visit the node. 87dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth/// 88dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth/// These tasks are done by three groups of methods, respectively: 89ea245e0ba48caf7e7acf870880c030d7ddc76667Craig Silverstein/// 1. TraverseDecl(Decl *x) does task #1. It is the entry point 90dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth/// for traversing an AST rooted at x. This method simply 91ea245e0ba48caf7e7acf870880c030d7ddc76667Craig Silverstein/// dispatches (i.e. forwards) to TraverseFoo(Foo *x) where Foo 92dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth/// is the dynamic type of *x, which calls WalkUpFromFoo(x) and 93dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth/// then recursively visits the child nodes of x. 94ea245e0ba48caf7e7acf870880c030d7ddc76667Craig Silverstein/// TraverseStmt(Stmt *x) and TraverseType(QualType x) work 95dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth/// similarly. 96ea245e0ba48caf7e7acf870880c030d7ddc76667Craig Silverstein/// 2. WalkUpFromFoo(Foo *x) does task #2. It does not try to visit 97dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth/// any child node of x. Instead, it first calls WalkUpFromBar(x) 98dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth/// where Bar is the direct parent class of Foo (unless Foo has 99dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth/// no parent), and then calls VisitFoo(x) (see the next list item). 100ea245e0ba48caf7e7acf870880c030d7ddc76667Craig Silverstein/// 3. VisitFoo(Foo *x) does task #3. 101dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth/// 102dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth/// These three method groups are tiered (Traverse* > WalkUpFrom* > 103dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth/// Visit*). A method (e.g. Traverse*) may call methods from the same 104e3e210c3aa3c1b289eee669a1d235fc16df384a0Chandler Carruth/// tier (e.g. other Traverse*) or one tier lower (e.g. WalkUpFrom*). 105dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth/// It may not call methods from a higher tier. 106dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth/// 107b5c202f9e4f6d0f230d5cb8848779259ebf95b7fChandler Carruth/// Note that since WalkUpFromFoo() calls WalkUpFromBar() (where Bar 108b5c202f9e4f6d0f230d5cb8848779259ebf95b7fChandler Carruth/// is Foo's super class) before calling VisitFoo(), the result is 109b5c202f9e4f6d0f230d5cb8848779259ebf95b7fChandler Carruth/// that the Visit*() methods for a given node are called in the 110b5c202f9e4f6d0f230d5cb8848779259ebf95b7fChandler Carruth/// top-down order (e.g. for a node of type NamedDecl, the order will 111b5c202f9e4f6d0f230d5cb8848779259ebf95b7fChandler Carruth/// be VisitDecl(), VisitNamedDecl(), and then VisitNamespaceDecl()). 112b5c202f9e4f6d0f230d5cb8848779259ebf95b7fChandler Carruth/// 113dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth/// This scheme guarantees that all Visit*() calls for the same AST 114dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth/// node are grouped together. In other words, Visit*() methods for 115dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth/// different nodes are never interleaved. 116dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth/// 117dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth/// Clients of this visitor should subclass the visitor (providing 118dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth/// themselves as the template argument, using the curiously recurring 119dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth/// template pattern) and override any of the Traverse*, WalkUpFrom*, 120dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth/// and Visit* methods for declarations, types, statements, 121dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth/// expressions, or other AST nodes where the visitor should customize 122dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth/// behavior. Most users only need to override Visit*. Advanced 123dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth/// users may override Traverse* and WalkUpFrom* to implement custom 124e3e210c3aa3c1b289eee669a1d235fc16df384a0Chandler Carruth/// traversal strategies. Returning false from one of these overridden 125dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth/// functions will abort the entire traversal. 126760c8af273d9871d063250ae626fb6df94c121f2John McCall/// 127760c8af273d9871d063250ae626fb6df94c121f2John McCall/// By default, this visitor tries to visit every part of the explicit 128760c8af273d9871d063250ae626fb6df94c121f2John McCall/// source code exactly once. The default policy towards templates 129760c8af273d9871d063250ae626fb6df94c121f2John McCall/// is to descend into the 'pattern' class or function body, not any 130760c8af273d9871d063250ae626fb6df94c121f2John McCall/// explicit or implicit instantiations. Explicit specializations 131760c8af273d9871d063250ae626fb6df94c121f2John McCall/// are still visited, and the patterns of partial specializations 132760c8af273d9871d063250ae626fb6df94c121f2John McCall/// are visited separately. This behavior can be changed by 133760c8af273d9871d063250ae626fb6df94c121f2John McCall/// overriding shouldVisitTemplateInstantiations() in the derived class 134760c8af273d9871d063250ae626fb6df94c121f2John McCall/// to return true, in which case all known implicit and explicit 135760c8af273d9871d063250ae626fb6df94c121f2John McCall/// instantiations will be visited at the same time as the pattern 136760c8af273d9871d063250ae626fb6df94c121f2John McCall/// from which they were produced. 137db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewyckytemplate<typename Derived> 138dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruthclass RecursiveASTVisitor { 139db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewyckypublic: 140db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky /// \brief Return a reference to the derived class. 141db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky Derived &getDerived() { return *static_cast<Derived*>(this); } 142db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky 143760c8af273d9871d063250ae626fb6df94c121f2John McCall /// \brief Return whether this visitor should recurse into 144760c8af273d9871d063250ae626fb6df94c121f2John McCall /// template instantiations. 145760c8af273d9871d063250ae626fb6df94c121f2John McCall bool shouldVisitTemplateInstantiations() const { return false; } 146536bab452fa38692834233187ed3d49b83722cb3Craig Silverstein 147a40bc724849f9cdc6a7706bc5d230685c3bdf63cDouglas Gregor /// \brief Return whether this visitor should recurse into the types of 148a40bc724849f9cdc6a7706bc5d230685c3bdf63cDouglas Gregor /// TypeLocs. 149a40bc724849f9cdc6a7706bc5d230685c3bdf63cDouglas Gregor bool shouldWalkTypesOfTypeLocs() const { return true; } 150ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 151c28a335184207a47f34eb9d1707dc8d7c6c7b8b6Richard Smith /// \brief Return whether this visitor should recurse into implicit 15252ec0c0357ce970ca52a27c1086626450f0967e7Daniel Jasper /// code, e.g., implicit constructors and destructors. 15352ec0c0357ce970ca52a27c1086626450f0967e7Daniel Jasper bool shouldVisitImplicitCode() const { return false; } 154c28a335184207a47f34eb9d1707dc8d7c6c7b8b6Richard Smith 15586b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek /// \brief Return whether \param S should be traversed using data recursion 15686b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek /// to avoid a stack overflow with extreme cases. 15786b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek bool shouldUseDataRecursionFor(Stmt *S) const { 15886b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek return isa<BinaryOperator>(S) || isa<UnaryOperator>(S) || 15986b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek isa<CaseStmt>(S) || isa<CXXOperatorCallExpr>(S); 16086b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek } 16186b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek 162db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky /// \brief Recursively visit a statement or expression, by 163717cc00c16eabf0eefd3cc69394e97f7229af0c8Zhanyong Wan /// dispatching to Traverse*() based on the argument's dynamic type. 164db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky /// 165e3e210c3aa3c1b289eee669a1d235fc16df384a0Chandler Carruth /// \returns false if the visitation was terminated early, true 166db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky /// otherwise (including when the argument is NULL). 167dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth bool TraverseStmt(Stmt *S); 168db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky 169db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky /// \brief Recursively visit a type, by dispatching to 170717cc00c16eabf0eefd3cc69394e97f7229af0c8Zhanyong Wan /// Traverse*Type() based on the argument's getTypeClass() property. 171db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky /// 172e3e210c3aa3c1b289eee669a1d235fc16df384a0Chandler Carruth /// \returns false if the visitation was terminated early, true 173db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky /// otherwise (including when the argument is a Null type). 174dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth bool TraverseType(QualType T); 175db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky 1764d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky /// \brief Recursively visit a type with location, by dispatching to 177717cc00c16eabf0eefd3cc69394e97f7229af0c8Zhanyong Wan /// Traverse*TypeLoc() based on the argument type's getTypeClass() property. 1784d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky /// 1794d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky /// \returns false if the visitation was terminated early, true 1804d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky /// otherwise (including when the argument is a Null type location). 1814d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky bool TraverseTypeLoc(TypeLoc TL); 1824d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky 183db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky /// \brief Recursively visit a declaration, by dispatching to 184717cc00c16eabf0eefd3cc69394e97f7229af0c8Zhanyong Wan /// Traverse*Decl() based on the argument's dynamic type. 185db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky /// 186e3e210c3aa3c1b289eee669a1d235fc16df384a0Chandler Carruth /// \returns false if the visitation was terminated early, true 187db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky /// otherwise (including when the argument is NULL). 188dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth bool TraverseDecl(Decl *D); 189db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky 190db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky /// \brief Recursively visit a C++ nested-name-specifier. 191db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky /// 192e3e210c3aa3c1b289eee669a1d235fc16df384a0Chandler Carruth /// \returns false if the visitation was terminated early, true otherwise. 193dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth bool TraverseNestedNameSpecifier(NestedNameSpecifier *NNS); 194db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky 195ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie /// \brief Recursively visit a C++ nested-name-specifier with location 196dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor /// information. 197dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor /// 198dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor /// \returns false if the visitation was terminated early, true otherwise. 199dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor bool TraverseNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS); 200dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor 20165019acfc46ffb191fac4e781ac0c4b8d0c8434eDouglas Gregor /// \brief Recursively visit a name with its location information. 20265019acfc46ffb191fac4e781ac0c4b8d0c8434eDouglas Gregor /// 20365019acfc46ffb191fac4e781ac0c4b8d0c8434eDouglas Gregor /// \returns false if the visitation was terminated early, true otherwise. 20465019acfc46ffb191fac4e781ac0c4b8d0c8434eDouglas Gregor bool TraverseDeclarationNameInfo(DeclarationNameInfo NameInfo); 205ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 206dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth /// \brief Recursively visit a template name and dispatch to the 207dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth /// appropriate method. 208db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky /// 209e3e210c3aa3c1b289eee669a1d235fc16df384a0Chandler Carruth /// \returns false if the visitation was terminated early, true otherwise. 210dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth bool TraverseTemplateName(TemplateName Template); 211db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky 212dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth /// \brief Recursively visit a template argument and dispatch to the 213dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth /// appropriate method for the argument type. 214db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky /// 215e3e210c3aa3c1b289eee669a1d235fc16df384a0Chandler Carruth /// \returns false if the visitation was terminated early, true otherwise. 2164d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky // FIXME: migrate callers to TemplateArgumentLoc instead. 217dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth bool TraverseTemplateArgument(const TemplateArgument &Arg); 218db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky 2194d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky /// \brief Recursively visit a template argument location and dispatch to the 2204d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky /// appropriate method for the argument type. 2214d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky /// 2224d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky /// \returns false if the visitation was terminated early, true otherwise. 2234d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky bool TraverseTemplateArgumentLoc(const TemplateArgumentLoc &ArgLoc); 2244d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky 225db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky /// \brief Recursively visit a set of template arguments. 226dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth /// This can be overridden by a subclass, but it's not expected that 227dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth /// will be needed -- this visitor always dispatches to another. 228db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky /// 229e3e210c3aa3c1b289eee669a1d235fc16df384a0Chandler Carruth /// \returns false if the visitation was terminated early, true otherwise. 230dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth // FIXME: take a TemplateArgumentLoc* (or TemplateArgumentListInfo) instead. 231dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth bool TraverseTemplateArguments(const TemplateArgument *Args, 232dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth unsigned NumArgs); 233db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky 2340f8c08843fc6c8abe03654f609e1e03fcc557855Craig Silverstein /// \brief Recursively visit a constructor initializer. This 2350f8c08843fc6c8abe03654f609e1e03fcc557855Craig Silverstein /// automatically dispatches to another visitor for the initializer 2360f8c08843fc6c8abe03654f609e1e03fcc557855Craig Silverstein /// expression, but not for the name of the initializer, so may 2374d072932287eb074a4168804cac1acb18a51d5e8Craig Silverstein /// be overridden for clients that need access to the name. 2380f8c08843fc6c8abe03654f609e1e03fcc557855Craig Silverstein /// 2390f8c08843fc6c8abe03654f609e1e03fcc557855Craig Silverstein /// \returns false if the visitation was terminated early, true otherwise. 240cbb67480094b3bcb5b715acd827cbad55e2a204cSean Hunt bool TraverseConstructorInitializer(CXXCtorInitializer *Init); 2410f8c08843fc6c8abe03654f609e1e03fcc557855Craig Silverstein 242011d8b93b7cfa8492b8a9c909a850d6577e08dcaDouglas Gregor /// \brief Recursively visit a lambda capture. 243011d8b93b7cfa8492b8a9c909a850d6577e08dcaDouglas Gregor /// 244011d8b93b7cfa8492b8a9c909a850d6577e08dcaDouglas Gregor /// \returns false if the visitation was terminated early, true otherwise. 245011d8b93b7cfa8492b8a9c909a850d6577e08dcaDouglas Gregor bool TraverseLambdaCapture(LambdaExpr::Capture C); 246011d8b93b7cfa8492b8a9c909a850d6577e08dcaDouglas Gregor 247dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth // ---- Methods on Stmts ---- 248dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth 249dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth // Declare Traverse*() for all concrete Stmt classes. 250dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth#define ABSTRACT_STMT(STMT) 251dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth#define STMT(CLASS, PARENT) \ 252dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth bool Traverse##CLASS(CLASS *S); 253dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth#include "clang/AST/StmtNodes.inc" 254dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth // The above header #undefs ABSTRACT_STMT and STMT upon exit. 255dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth 256dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth // Define WalkUpFrom*() and empty Visit*() for all Stmt classes. 257dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth bool WalkUpFromStmt(Stmt *S) { return getDerived().VisitStmt(S); } 258e3e210c3aa3c1b289eee669a1d235fc16df384a0Chandler Carruth bool VisitStmt(Stmt *S) { return true; } 259dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth#define STMT(CLASS, PARENT) \ 260dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth bool WalkUpFrom##CLASS(CLASS *S) { \ 261dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth TRY_TO(WalkUpFrom##PARENT(S)); \ 262dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth TRY_TO(Visit##CLASS(S)); \ 263e3e210c3aa3c1b289eee669a1d235fc16df384a0Chandler Carruth return true; \ 264dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth } \ 265e3e210c3aa3c1b289eee669a1d235fc16df384a0Chandler Carruth bool Visit##CLASS(CLASS *S) { return true; } 266d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor#include "clang/AST/StmtNodes.inc" 267db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky 268dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth // Define Traverse*(), WalkUpFrom*(), and Visit*() for unary 269dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth // operator methods. Unary operators are not classes in themselves 270dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth // (they're all opcodes in UnaryOperator) but do have visitors. 2717d66f8cafd807e551efb4739cdb37fc272cf5345Chandler Carruth#define OPERATOR(NAME) \ 272dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth bool TraverseUnary##NAME(UnaryOperator *S) { \ 273dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth TRY_TO(WalkUpFromUnary##NAME(S)); \ 27486b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek TRY_TO(TraverseStmt(S->getSubExpr())); \ 275e3e210c3aa3c1b289eee669a1d235fc16df384a0Chandler Carruth return true; \ 276dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth } \ 277dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth bool WalkUpFromUnary##NAME(UnaryOperator *S) { \ 278dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth TRY_TO(WalkUpFromUnaryOperator(S)); \ 279dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth TRY_TO(VisitUnary##NAME(S)); \ 280e3e210c3aa3c1b289eee669a1d235fc16df384a0Chandler Carruth return true; \ 281dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth } \ 282e3e210c3aa3c1b289eee669a1d235fc16df384a0Chandler Carruth bool VisitUnary##NAME(UnaryOperator *S) { return true; } 283dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth 2847d66f8cafd807e551efb4739cdb37fc272cf5345Chandler Carruth UNARYOP_LIST() 2857d66f8cafd807e551efb4739cdb37fc272cf5345Chandler Carruth#undef OPERATOR 286dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth 287dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth // Define Traverse*(), WalkUpFrom*(), and Visit*() for binary 288dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth // operator methods. Binary operators are not classes in themselves 289dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth // (they're all opcodes in BinaryOperator) but do have visitors. 290dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth#define GENERAL_BINOP_FALLBACK(NAME, BINOP_TYPE) \ 291dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth bool TraverseBin##NAME(BINOP_TYPE *S) { \ 292dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth TRY_TO(WalkUpFromBin##NAME(S)); \ 29386b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek TRY_TO(TraverseStmt(S->getLHS())); \ 29486b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek TRY_TO(TraverseStmt(S->getRHS())); \ 295e3e210c3aa3c1b289eee669a1d235fc16df384a0Chandler Carruth return true; \ 296dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth } \ 297dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth bool WalkUpFromBin##NAME(BINOP_TYPE *S) { \ 298dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth TRY_TO(WalkUpFrom##BINOP_TYPE(S)); \ 299dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth TRY_TO(VisitBin##NAME(S)); \ 300e3e210c3aa3c1b289eee669a1d235fc16df384a0Chandler Carruth return true; \ 301dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth } \ 302e3e210c3aa3c1b289eee669a1d235fc16df384a0Chandler Carruth bool VisitBin##NAME(BINOP_TYPE *S) { return true; } 303dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth 3047d66f8cafd807e551efb4739cdb37fc272cf5345Chandler Carruth#define OPERATOR(NAME) GENERAL_BINOP_FALLBACK(NAME, BinaryOperator) 3057d66f8cafd807e551efb4739cdb37fc272cf5345Chandler Carruth BINOP_LIST() 3067d66f8cafd807e551efb4739cdb37fc272cf5345Chandler Carruth#undef OPERATOR 307db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky 308dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth // Define Traverse*(), WalkUpFrom*(), and Visit*() for compound 309dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth // assignment methods. Compound assignment operators are not 310dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth // classes in themselves (they're all opcodes in 311dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth // CompoundAssignOperator) but do have visitors. 3127d66f8cafd807e551efb4739cdb37fc272cf5345Chandler Carruth#define OPERATOR(NAME) \ 3137d66f8cafd807e551efb4739cdb37fc272cf5345Chandler Carruth GENERAL_BINOP_FALLBACK(NAME##Assign, CompoundAssignOperator) 314dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth 3157d66f8cafd807e551efb4739cdb37fc272cf5345Chandler Carruth CAO_LIST() 3167d66f8cafd807e551efb4739cdb37fc272cf5345Chandler Carruth#undef OPERATOR 317dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth#undef GENERAL_BINOP_FALLBACK 318facfc77487a890bfb7b5eee7e21cd2b395a9faafChandler Carruth 319dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth // ---- Methods on Types ---- 320dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth // FIXME: revamp to take TypeLoc's rather than Types. 321facfc77487a890bfb7b5eee7e21cd2b395a9faafChandler Carruth 322dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth // Declare Traverse*() for all concrete Type classes. 323dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth#define ABSTRACT_TYPE(CLASS, BASE) 324dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth#define TYPE(CLASS, BASE) \ 325dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth bool Traverse##CLASS##Type(CLASS##Type *T); 326dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth#include "clang/AST/TypeNodes.def" 327dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth // The above header #undefs ABSTRACT_TYPE and TYPE upon exit. 328dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth 329dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth // Define WalkUpFrom*() and empty Visit*() for all Type classes. 330dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth bool WalkUpFromType(Type *T) { return getDerived().VisitType(T); } 331e3e210c3aa3c1b289eee669a1d235fc16df384a0Chandler Carruth bool VisitType(Type *T) { return true; } 332dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth#define TYPE(CLASS, BASE) \ 333dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth bool WalkUpFrom##CLASS##Type(CLASS##Type *T) { \ 334dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth TRY_TO(WalkUpFrom##BASE(T)); \ 335dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth TRY_TO(Visit##CLASS##Type(T)); \ 336e3e210c3aa3c1b289eee669a1d235fc16df384a0Chandler Carruth return true; \ 337dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth } \ 338e3e210c3aa3c1b289eee669a1d235fc16df384a0Chandler Carruth bool Visit##CLASS##Type(CLASS##Type *T) { return true; } 339d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor#include "clang/AST/TypeNodes.def" 340facfc77487a890bfb7b5eee7e21cd2b395a9faafChandler Carruth 3414d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky // ---- Methods on TypeLocs ---- 3424d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky // FIXME: this currently just calls the matching Type methods 3434d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky 3444d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky // Declare Traverse*() for all concrete Type classes. 3454d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky#define ABSTRACT_TYPELOC(CLASS, BASE) 3464d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky#define TYPELOC(CLASS, BASE) \ 3474d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky bool Traverse##CLASS##TypeLoc(CLASS##TypeLoc TL); 3484d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky#include "clang/AST/TypeLocNodes.def" 3494d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky // The above header #undefs ABSTRACT_TYPELOC and TYPELOC upon exit. 3504d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky 351717cc00c16eabf0eefd3cc69394e97f7229af0c8Zhanyong Wan // Define WalkUpFrom*() and empty Visit*() for all TypeLoc classes. 3524d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky bool WalkUpFromTypeLoc(TypeLoc TL) { return getDerived().VisitTypeLoc(TL); } 353717cc00c16eabf0eefd3cc69394e97f7229af0c8Zhanyong Wan bool VisitTypeLoc(TypeLoc TL) { return true; } 354717cc00c16eabf0eefd3cc69394e97f7229af0c8Zhanyong Wan 355717cc00c16eabf0eefd3cc69394e97f7229af0c8Zhanyong Wan // QualifiedTypeLoc and UnqualTypeLoc are not declared in 356717cc00c16eabf0eefd3cc69394e97f7229af0c8Zhanyong Wan // TypeNodes.def and thus need to be handled specially. 3574d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky bool WalkUpFromQualifiedTypeLoc(QualifiedTypeLoc TL) { 3584d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky return getDerived().VisitUnqualTypeLoc(TL.getUnqualifiedLoc()); 3594d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky } 360717cc00c16eabf0eefd3cc69394e97f7229af0c8Zhanyong Wan bool VisitQualifiedTypeLoc(QualifiedTypeLoc TL) { return true; } 3614d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky bool WalkUpFromUnqualTypeLoc(UnqualTypeLoc TL) { 3624d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky return getDerived().VisitUnqualTypeLoc(TL.getUnqualifiedLoc()); 3634d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky } 364717cc00c16eabf0eefd3cc69394e97f7229af0c8Zhanyong Wan bool VisitUnqualTypeLoc(UnqualTypeLoc TL) { return true; } 365717cc00c16eabf0eefd3cc69394e97f7229af0c8Zhanyong Wan 3664d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky // Note that BASE includes trailing 'Type' which CLASS doesn't. 3674d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky#define TYPE(CLASS, BASE) \ 3684d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky bool WalkUpFrom##CLASS##TypeLoc(CLASS##TypeLoc TL) { \ 3694d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky TRY_TO(WalkUpFrom##BASE##Loc(TL)); \ 3704d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky TRY_TO(Visit##CLASS##TypeLoc(TL)); \ 3714d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky return true; \ 3724d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky } \ 373717cc00c16eabf0eefd3cc69394e97f7229af0c8Zhanyong Wan bool Visit##CLASS##TypeLoc(CLASS##TypeLoc TL) { return true; } 3744d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky#include "clang/AST/TypeNodes.def" 3754d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky 376dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth // ---- Methods on Decls ---- 377dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth 378dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth // Declare Traverse*() for all concrete Decl classes. 379dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth#define ABSTRACT_DECL(DECL) 380dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth#define DECL(CLASS, BASE) \ 381dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth bool Traverse##CLASS##Decl(CLASS##Decl *D); 382dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth#include "clang/AST/DeclNodes.inc" 383dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth // The above header #undefs ABSTRACT_DECL and DECL upon exit. 384dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth 385dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth // Define WalkUpFrom*() and empty Visit*() for all Decl classes. 386dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth bool WalkUpFromDecl(Decl *D) { return getDerived().VisitDecl(D); } 387e3e210c3aa3c1b289eee669a1d235fc16df384a0Chandler Carruth bool VisitDecl(Decl *D) { return true; } 388dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth#define DECL(CLASS, BASE) \ 389dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth bool WalkUpFrom##CLASS##Decl(CLASS##Decl *D) { \ 390dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth TRY_TO(WalkUpFrom##BASE(D)); \ 391dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth TRY_TO(Visit##CLASS##Decl(D)); \ 392e3e210c3aa3c1b289eee669a1d235fc16df384a0Chandler Carruth return true; \ 393dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth } \ 394e3e210c3aa3c1b289eee669a1d235fc16df384a0Chandler Carruth bool Visit##CLASS##Decl(CLASS##Decl *D) { return true; } 3959a55591af3e5506b95a9718e15380129fbfc5ebcSean Hunt#include "clang/AST/DeclNodes.inc" 3969a55591af3e5506b95a9718e15380129fbfc5ebcSean Hunt 397dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruthprivate: 398dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth // These are helper methods used by more than one Traverse* method. 399dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth bool TraverseTemplateParameterListHelper(TemplateParameterList *TPL); 400a313b2fbba86c901e58dc58df036e731f24fdaeeRichard Smith bool TraverseClassInstantiations(ClassTemplateDecl *D); 401a313b2fbba86c901e58dc58df036e731f24fdaeeRichard Smith bool TraverseFunctionInstantiations(FunctionTemplateDecl *D) ; 402536bab452fa38692834233187ed3d49b83722cb3Craig Silverstein bool TraverseTemplateArgumentLocsHelper(const TemplateArgumentLoc *TAL, 403dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth unsigned Count); 404cf4679e60a5c5fa13e4bfe69f8186658c828af49Craig Silverstein bool TraverseArrayTypeLocHelper(ArrayTypeLoc TL); 405dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth bool TraverseRecordHelper(RecordDecl *D); 406dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth bool TraverseCXXRecordHelper(CXXRecordDecl *D); 407dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth bool TraverseDeclaratorHelper(DeclaratorDecl *D); 4084d072932287eb074a4168804cac1acb18a51d5e8Craig Silverstein bool TraverseDeclContextHelper(DeclContext *DC); 409dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth bool TraverseFunctionHelper(FunctionDecl *D); 410dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth bool TraverseVarHelper(VarDecl *D); 41190226acd0b9be2964343cd63ae604bf0a656d33bArgyrios Kyrtzidis 41286b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek struct EnqueueJob { 41386b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek Stmt *S; 41486b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek Stmt::child_iterator StmtIt; 41586b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek 41686b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek EnqueueJob(Stmt *S) : S(S), StmtIt() {} 41786b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek }; 41886b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek bool dataTraverse(Stmt *S); 41986b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek bool dataTraverseNode(Stmt *S, bool &EnqueueChildren); 42086b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek}; 42186b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek 42286b32fd702d794bb655c59a1238bf7422869f506Ted Kremenektemplate<typename Derived> 42386b32fd702d794bb655c59a1238bf7422869f506Ted Kremenekbool RecursiveASTVisitor<Derived>::dataTraverse(Stmt *S) { 42490226acd0b9be2964343cd63ae604bf0a656d33bArgyrios Kyrtzidis 42586b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek SmallVector<EnqueueJob, 16> Queue; 42686b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek Queue.push_back(S); 42786b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek 42886b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek while (!Queue.empty()) { 42986b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek EnqueueJob &job = Queue.back(); 43086b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek Stmt *CurrS = job.S; 43186b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek if (!CurrS) { 43286b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek Queue.pop_back(); 43386b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek continue; 43490226acd0b9be2964343cd63ae604bf0a656d33bArgyrios Kyrtzidis } 43586b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek 43686b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek if (getDerived().shouldUseDataRecursionFor(CurrS)) { 43786b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek if (job.StmtIt == Stmt::child_iterator()) { 43886b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek bool EnqueueChildren = true; 43986b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek if (!dataTraverseNode(CurrS, EnqueueChildren)) return false; 44086b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek if (!EnqueueChildren) { 44186b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek Queue.pop_back(); 44286b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek continue; 44386b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek } 44486b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek job.StmtIt = CurrS->child_begin(); 44586b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek } else { 44686b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek ++job.StmtIt; 44786b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek } 44886b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek 44986b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek if (job.StmtIt != CurrS->child_end()) 45086b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek Queue.push_back(*job.StmtIt); 45186b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek else 45286b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek Queue.pop_back(); 45386b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek continue; 45490226acd0b9be2964343cd63ae604bf0a656d33bArgyrios Kyrtzidis } 45590226acd0b9be2964343cd63ae604bf0a656d33bArgyrios Kyrtzidis 45686b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek Queue.pop_back(); 45786b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek TRY_TO(TraverseStmt(CurrS)); 45890226acd0b9be2964343cd63ae604bf0a656d33bArgyrios Kyrtzidis } 45990226acd0b9be2964343cd63ae604bf0a656d33bArgyrios Kyrtzidis 46086b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek return true; 46186b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek} 46286b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek 46386b32fd702d794bb655c59a1238bf7422869f506Ted Kremenektemplate<typename Derived> 46486b32fd702d794bb655c59a1238bf7422869f506Ted Kremenekbool RecursiveASTVisitor<Derived>::dataTraverseNode(Stmt *S, 46586b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek bool &EnqueueChildren) { 46686b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek 467ce40e6f3dc3287348fb51a0eb7d4654b317435b8NAKAMURA Takumi// The cast for DISPATCH_WALK is needed for older versions of g++, but causes 468ce40e6f3dc3287348fb51a0eb7d4654b317435b8NAKAMURA Takumi// problems for MSVC. So we'll skip the cast entirely for MSVC. 469ce40e6f3dc3287348fb51a0eb7d4654b317435b8NAKAMURA Takumi#if defined(_MSC_VER) 470ce40e6f3dc3287348fb51a0eb7d4654b317435b8NAKAMURA Takumi #define GCC_CAST(CLASS) 471ce40e6f3dc3287348fb51a0eb7d4654b317435b8NAKAMURA Takumi#else 472ce40e6f3dc3287348fb51a0eb7d4654b317435b8NAKAMURA Takumi #define GCC_CAST(CLASS) (bool (RecursiveASTVisitor::*)(CLASS*)) 473ce40e6f3dc3287348fb51a0eb7d4654b317435b8NAKAMURA Takumi#endif 474ce40e6f3dc3287348fb51a0eb7d4654b317435b8NAKAMURA Takumi 47586b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek // Dispatch to the corresponding WalkUpFrom* function only if the derived 47686b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek // class didn't override Traverse* (and thus the traversal is trivial). 47786b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek#define DISPATCH_WALK(NAME, CLASS, VAR) \ 478ce40e6f3dc3287348fb51a0eb7d4654b317435b8NAKAMURA Takumi if (&RecursiveASTVisitor::Traverse##NAME == \ 479ce40e6f3dc3287348fb51a0eb7d4654b317435b8NAKAMURA Takumi GCC_CAST(CLASS)&Derived::Traverse##NAME) \ 48086b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek return getDerived().WalkUpFrom##NAME(static_cast<CLASS*>(VAR)); \ 48186b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek EnqueueChildren = false; \ 48286b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek return getDerived().Traverse##NAME(static_cast<CLASS*>(VAR)); 48386b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek 48486b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek if (BinaryOperator *BinOp = dyn_cast<BinaryOperator>(S)) { 48586b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek switch (BinOp->getOpcode()) { 48686b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek#define OPERATOR(NAME) \ 48786b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek case BO_##NAME: DISPATCH_WALK(Bin##NAME, BinaryOperator, S); 48886b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek 48986b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek BINOP_LIST() 49086b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek#undef OPERATOR 49186b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek 49286b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek#define OPERATOR(NAME) \ 49386b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek case BO_##NAME##Assign: \ 49486b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek DISPATCH_WALK(Bin##NAME##Assign, CompoundAssignOperator, S); 49586b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek 49686b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek CAO_LIST() 49786b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek#undef OPERATOR 49890226acd0b9be2964343cd63ae604bf0a656d33bArgyrios Kyrtzidis } 49986b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek } else if (UnaryOperator *UnOp = dyn_cast<UnaryOperator>(S)) { 50086b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek switch (UnOp->getOpcode()) { 50186b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek#define OPERATOR(NAME) \ 50286b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek case UO_##NAME: DISPATCH_WALK(Unary##NAME, UnaryOperator, S); 50390226acd0b9be2964343cd63ae604bf0a656d33bArgyrios Kyrtzidis 50486b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek UNARYOP_LIST() 50586b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek#undef OPERATOR 50690226acd0b9be2964343cd63ae604bf0a656d33bArgyrios Kyrtzidis } 50786b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek } 50886b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek 50986b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek // Top switch stmt: dispatch to TraverseFooStmt for each concrete FooStmt. 51086b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek switch (S->getStmtClass()) { 51186b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek case Stmt::NoStmtClass: break; 51286b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek#define ABSTRACT_STMT(STMT) 51386b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek#define STMT(CLASS, PARENT) \ 51486b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek case Stmt::CLASS##Class: DISPATCH_WALK(CLASS, CLASS, S); 51586b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek#include "clang/AST/StmtNodes.inc" 51686b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek } 51786b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek 51886b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek#undef DISPATCH_WALK 519ce40e6f3dc3287348fb51a0eb7d4654b317435b8NAKAMURA Takumi#undef GCC_CAST 52086b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek 52186b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek return true; 52286b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek} 52390226acd0b9be2964343cd63ae604bf0a656d33bArgyrios Kyrtzidis 524dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth#define DISPATCH(NAME, CLASS, VAR) \ 525dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth return getDerived().Traverse##NAME(static_cast<CLASS*>(VAR)) 526dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth 527db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewyckytemplate<typename Derived> 528dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruthbool RecursiveASTVisitor<Derived>::TraverseStmt(Stmt *S) { 529db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky if (!S) 530e3e210c3aa3c1b289eee669a1d235fc16df384a0Chandler Carruth return true; 531db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky 53286b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek if (getDerived().shouldUseDataRecursionFor(S)) 53386b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek return dataTraverse(S); 5347d66f8cafd807e551efb4739cdb37fc272cf5345Chandler Carruth 53586b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek // If we have a binary expr, dispatch to the subcode of the binop. A smart 53686b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek // optimizer (e.g. LLVM) will fold this comparison into the switch stmt 53786b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek // below. 53886b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek if (BinaryOperator *BinOp = dyn_cast<BinaryOperator>(S)) { 53986b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek switch (BinOp->getOpcode()) { 5404ed57820a2b14a979537ace3f03bde68baf386eeArgyrios Kyrtzidis#define OPERATOR(NAME) \ 54186b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek case BO_##NAME: DISPATCH(Bin##NAME, BinaryOperator, S); 54286b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek 54386b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek BINOP_LIST() 5447d66f8cafd807e551efb4739cdb37fc272cf5345Chandler Carruth#undef OPERATOR 5457d66f8cafd807e551efb4739cdb37fc272cf5345Chandler Carruth#undef BINOP_LIST 54686b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek 5477d66f8cafd807e551efb4739cdb37fc272cf5345Chandler Carruth#define OPERATOR(NAME) \ 54886b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek case BO_##NAME##Assign: \ 54986b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek DISPATCH(Bin##NAME##Assign, CompoundAssignOperator, S); 55086b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek 55186b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek CAO_LIST() 5527d66f8cafd807e551efb4739cdb37fc272cf5345Chandler Carruth#undef OPERATOR 5537d66f8cafd807e551efb4739cdb37fc272cf5345Chandler Carruth#undef CAO_LIST 55486b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek } 55586b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek } else if (UnaryOperator *UnOp = dyn_cast<UnaryOperator>(S)) { 55686b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek switch (UnOp->getOpcode()) { 5577d66f8cafd807e551efb4739cdb37fc272cf5345Chandler Carruth#define OPERATOR(NAME) \ 55886b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek case UO_##NAME: DISPATCH(Unary##NAME, UnaryOperator, S); 55986b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek 56086b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek UNARYOP_LIST() 5617d66f8cafd807e551efb4739cdb37fc272cf5345Chandler Carruth#undef OPERATOR 5627d66f8cafd807e551efb4739cdb37fc272cf5345Chandler Carruth#undef UNARYOP_LIST 5637d66f8cafd807e551efb4739cdb37fc272cf5345Chandler Carruth } 56486b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek } 56586b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek 56686b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek // Top switch stmt: dispatch to TraverseFooStmt for each concrete FooStmt. 56786b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek switch (S->getStmtClass()) { 56886b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek case Stmt::NoStmtClass: break; 5697381d5cfbd599fa2b9e215011ad7cbd449de231aSean Hunt#define ABSTRACT_STMT(STMT) 5709a55591af3e5506b95a9718e15380129fbfc5ebcSean Hunt#define STMT(CLASS, PARENT) \ 57186b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek case Stmt::CLASS##Class: DISPATCH(CLASS, CLASS, S); 572d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor#include "clang/AST/StmtNodes.inc" 573d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor } 574db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky 575e3e210c3aa3c1b289eee669a1d235fc16df384a0Chandler Carruth return true; 576db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky} 577db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky 578db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewyckytemplate<typename Derived> 579dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruthbool RecursiveASTVisitor<Derived>::TraverseType(QualType T) { 580db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky if (T.isNull()) 581e3e210c3aa3c1b289eee669a1d235fc16df384a0Chandler Carruth return true; 582db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky 583db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky switch (T->getTypeClass()) { 584dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth#define ABSTRACT_TYPE(CLASS, BASE) 585dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth#define TYPE(CLASS, BASE) \ 586f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall case Type::CLASS: DISPATCH(CLASS##Type, CLASS##Type, \ 587f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall const_cast<Type*>(T.getTypePtr())); 588d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor#include "clang/AST/TypeNodes.def" 589d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor } 590db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky 591e3e210c3aa3c1b289eee669a1d235fc16df384a0Chandler Carruth return true; 592db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky} 593db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky 594db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewyckytemplate<typename Derived> 5954d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewyckybool RecursiveASTVisitor<Derived>::TraverseTypeLoc(TypeLoc TL) { 5964d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky if (TL.isNull()) 5974d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky return true; 5984d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky 5994d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky switch (TL.getTypeLocClass()) { 6004d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky#define ABSTRACT_TYPELOC(CLASS, BASE) 6014d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky#define TYPELOC(CLASS, BASE) \ 6024d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky case TypeLoc::CLASS: \ 6034d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky return getDerived().Traverse##CLASS##TypeLoc(*cast<CLASS##TypeLoc>(&TL)); 6044d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky#include "clang/AST/TypeLocNodes.def" 6054d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky } 6064d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky 6074d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky return true; 6084d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky} 6094d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky 6104d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky 6114d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewyckytemplate<typename Derived> 612dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruthbool RecursiveASTVisitor<Derived>::TraverseDecl(Decl *D) { 613db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky if (!D) 614e3e210c3aa3c1b289eee669a1d235fc16df384a0Chandler Carruth return true; 615db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky 616c28a335184207a47f34eb9d1707dc8d7c6c7b8b6Richard Smith // As a syntax visitor, by default we want to ignore declarations for 617c28a335184207a47f34eb9d1707dc8d7c6c7b8b6Richard Smith // implicit declarations (ones not typed explicitly by the user). 61852ec0c0357ce970ca52a27c1086626450f0967e7Daniel Jasper if (!getDerived().shouldVisitImplicitCode() && D->isImplicit()) 619d0b982ca5cf685af08d5015e8c2dfae3ecab1a0bCraig Silverstein return true; 620d0b982ca5cf685af08d5015e8c2dfae3ecab1a0bCraig Silverstein 621db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky switch (D->getKind()) { 6229a55591af3e5506b95a9718e15380129fbfc5ebcSean Hunt#define ABSTRACT_DECL(DECL) 6239a55591af3e5506b95a9718e15380129fbfc5ebcSean Hunt#define DECL(CLASS, BASE) \ 624dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth case Decl::CLASS: DISPATCH(CLASS##Decl, CLASS##Decl, D); 6259a55591af3e5506b95a9718e15380129fbfc5ebcSean Hunt#include "clang/AST/DeclNodes.inc" 6269a55591af3e5506b95a9718e15380129fbfc5ebcSean Hunt } 627d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor 628e3e210c3aa3c1b289eee669a1d235fc16df384a0Chandler Carruth return true; 629db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky} 630db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky 631dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth#undef DISPATCH 632dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth 633db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewyckytemplate<typename Derived> 634dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruthbool RecursiveASTVisitor<Derived>::TraverseNestedNameSpecifier( 635d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor NestedNameSpecifier *NNS) { 636dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth if (!NNS) 637e3e210c3aa3c1b289eee669a1d235fc16df384a0Chandler Carruth return true; 638dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth 6396c321e35008f2c99eeb1409b43859a04c48e5ce5Chandler Carruth if (NNS->getPrefix()) 6406c321e35008f2c99eeb1409b43859a04c48e5ce5Chandler Carruth TRY_TO(TraverseNestedNameSpecifier(NNS->getPrefix())); 641db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky 642db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky switch (NNS->getKind()) { 643db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky case NestedNameSpecifier::Identifier: 644db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky case NestedNameSpecifier::Namespace: 64514aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor case NestedNameSpecifier::NamespaceAlias: 646db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky case NestedNameSpecifier::Global: 647e3e210c3aa3c1b289eee669a1d235fc16df384a0Chandler Carruth return true; 648db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky 649db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky case NestedNameSpecifier::TypeSpec: 650db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky case NestedNameSpecifier::TypeSpecWithTemplate: 6516c321e35008f2c99eeb1409b43859a04c48e5ce5Chandler Carruth TRY_TO(TraverseType(QualType(NNS->getAsType(), 0))); 652d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor } 653d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor 654e3e210c3aa3c1b289eee669a1d235fc16df384a0Chandler Carruth return true; 655db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky} 656d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor 657db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewyckytemplate<typename Derived> 658dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregorbool RecursiveASTVisitor<Derived>::TraverseNestedNameSpecifierLoc( 659dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor NestedNameSpecifierLoc NNS) { 660dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor if (!NNS) 661dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor return true; 662ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 663dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor if (NestedNameSpecifierLoc Prefix = NNS.getPrefix()) 664dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor TRY_TO(TraverseNestedNameSpecifierLoc(Prefix)); 665ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 666dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor switch (NNS.getNestedNameSpecifier()->getKind()) { 667dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor case NestedNameSpecifier::Identifier: 668dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor case NestedNameSpecifier::Namespace: 669dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor case NestedNameSpecifier::NamespaceAlias: 670dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor case NestedNameSpecifier::Global: 671dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor return true; 672ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 673dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor case NestedNameSpecifier::TypeSpec: 674dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor case NestedNameSpecifier::TypeSpecWithTemplate: 675dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor TRY_TO(TraverseTypeLoc(NNS.getTypeLoc())); 676dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor break; 677dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor } 678ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 679dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor return true; 680dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor} 681dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor 682dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregortemplate<typename Derived> 68365019acfc46ffb191fac4e781ac0c4b8d0c8434eDouglas Gregorbool RecursiveASTVisitor<Derived>::TraverseDeclarationNameInfo( 68465019acfc46ffb191fac4e781ac0c4b8d0c8434eDouglas Gregor DeclarationNameInfo NameInfo) { 68565019acfc46ffb191fac4e781ac0c4b8d0c8434eDouglas Gregor switch (NameInfo.getName().getNameKind()) { 68665019acfc46ffb191fac4e781ac0c4b8d0c8434eDouglas Gregor case DeclarationName::CXXConstructorName: 68765019acfc46ffb191fac4e781ac0c4b8d0c8434eDouglas Gregor case DeclarationName::CXXDestructorName: 68865019acfc46ffb191fac4e781ac0c4b8d0c8434eDouglas Gregor case DeclarationName::CXXConversionFunctionName: 68965019acfc46ffb191fac4e781ac0c4b8d0c8434eDouglas Gregor if (TypeSourceInfo *TSInfo = NameInfo.getNamedTypeInfo()) 69065019acfc46ffb191fac4e781ac0c4b8d0c8434eDouglas Gregor TRY_TO(TraverseTypeLoc(TSInfo->getTypeLoc())); 691ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 69265019acfc46ffb191fac4e781ac0c4b8d0c8434eDouglas Gregor break; 693ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 69465019acfc46ffb191fac4e781ac0c4b8d0c8434eDouglas Gregor case DeclarationName::Identifier: 69565019acfc46ffb191fac4e781ac0c4b8d0c8434eDouglas Gregor case DeclarationName::ObjCZeroArgSelector: 69665019acfc46ffb191fac4e781ac0c4b8d0c8434eDouglas Gregor case DeclarationName::ObjCOneArgSelector: 69765019acfc46ffb191fac4e781ac0c4b8d0c8434eDouglas Gregor case DeclarationName::ObjCMultiArgSelector: 69865019acfc46ffb191fac4e781ac0c4b8d0c8434eDouglas Gregor case DeclarationName::CXXOperatorName: 69965019acfc46ffb191fac4e781ac0c4b8d0c8434eDouglas Gregor case DeclarationName::CXXLiteralOperatorName: 70065019acfc46ffb191fac4e781ac0c4b8d0c8434eDouglas Gregor case DeclarationName::CXXUsingDirective: 70165019acfc46ffb191fac4e781ac0c4b8d0c8434eDouglas Gregor break; 70265019acfc46ffb191fac4e781ac0c4b8d0c8434eDouglas Gregor } 703ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 70465019acfc46ffb191fac4e781ac0c4b8d0c8434eDouglas Gregor return true; 70565019acfc46ffb191fac4e781ac0c4b8d0c8434eDouglas Gregor} 70665019acfc46ffb191fac4e781ac0c4b8d0c8434eDouglas Gregor 70765019acfc46ffb191fac4e781ac0c4b8d0c8434eDouglas Gregortemplate<typename Derived> 708dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruthbool RecursiveASTVisitor<Derived>::TraverseTemplateName(TemplateName Template) { 709db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) 7106c321e35008f2c99eeb1409b43859a04c48e5ce5Chandler Carruth TRY_TO(TraverseNestedNameSpecifier(DTN->getQualifier())); 7116c321e35008f2c99eeb1409b43859a04c48e5ce5Chandler Carruth else if (QualifiedTemplateName *QTN = Template.getAsQualifiedTemplateName()) 7126c321e35008f2c99eeb1409b43859a04c48e5ce5Chandler Carruth TRY_TO(TraverseNestedNameSpecifier(QTN->getQualifier())); 713db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky 714e3e210c3aa3c1b289eee669a1d235fc16df384a0Chandler Carruth return true; 715db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky} 716db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky 717db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewyckytemplate<typename Derived> 718dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruthbool RecursiveASTVisitor<Derived>::TraverseTemplateArgument( 719d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor const TemplateArgument &Arg) { 720db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky switch (Arg.getKind()) { 721db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky case TemplateArgument::Null: 722db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky case TemplateArgument::Declaration: 723db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky case TemplateArgument::Integral: 724e3e210c3aa3c1b289eee669a1d235fc16df384a0Chandler Carruth return true; 725d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor 726db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky case TemplateArgument::Type: 727dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth return getDerived().TraverseType(Arg.getAsType()); 728d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor 729db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky case TemplateArgument::Template: 730a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor case TemplateArgument::TemplateExpansion: 731a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor return getDerived().TraverseTemplateName( 732a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor Arg.getAsTemplateOrTemplatePattern()); 733db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky 734db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky case TemplateArgument::Expression: 735dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth return getDerived().TraverseStmt(Arg.getAsExpr()); 736db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky 737db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky case TemplateArgument::Pack: 738dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth return getDerived().TraverseTemplateArguments(Arg.pack_begin(), 739dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth Arg.pack_size()); 740d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor } 741d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor 742e3e210c3aa3c1b289eee669a1d235fc16df384a0Chandler Carruth return true; 743db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky} 744db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky 7454d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky// FIXME: no template name location? 7464d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky// FIXME: no source locations for a template argument pack? 7474d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewyckytemplate<typename Derived> 7484d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewyckybool RecursiveASTVisitor<Derived>::TraverseTemplateArgumentLoc( 7494d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky const TemplateArgumentLoc &ArgLoc) { 7504d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky const TemplateArgument &Arg = ArgLoc.getArgument(); 7514d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky 7524d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky switch (Arg.getKind()) { 7534d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky case TemplateArgument::Null: 7544d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky case TemplateArgument::Declaration: 7554d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky case TemplateArgument::Integral: 7564d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky return true; 7574d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky 7584d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky case TemplateArgument::Type: { 759fcf431609769a9600c24618d1a33135caec4fef2Zhanyong Wan // FIXME: how can TSI ever be NULL? 760fcf431609769a9600c24618d1a33135caec4fef2Zhanyong Wan if (TypeSourceInfo *TSI = ArgLoc.getTypeSourceInfo()) 761fcf431609769a9600c24618d1a33135caec4fef2Zhanyong Wan return getDerived().TraverseTypeLoc(TSI->getTypeLoc()); 762ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie else 763f1fe3759e6e8b1756c514f1181c86bd4b9d1666cDouglas Gregor return getDerived().TraverseType(Arg.getAsType()); 7644d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky } 7654d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky 7664d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky case TemplateArgument::Template: 767a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor case TemplateArgument::TemplateExpansion: 768b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor if (ArgLoc.getTemplateQualifierLoc()) 769b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor TRY_TO(getDerived().TraverseNestedNameSpecifierLoc( 770b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor ArgLoc.getTemplateQualifierLoc())); 771a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor return getDerived().TraverseTemplateName( 772a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor Arg.getAsTemplateOrTemplatePattern()); 7734d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky 7744d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky case TemplateArgument::Expression: 7754d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky return getDerived().TraverseStmt(ArgLoc.getSourceExpression()); 7764d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky 7774d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky case TemplateArgument::Pack: 7784d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky return getDerived().TraverseTemplateArguments(Arg.pack_begin(), 7794d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky Arg.pack_size()); 7804d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky } 7814d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky 7824d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky return true; 7834d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky} 7844d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky 785db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewyckytemplate<typename Derived> 786dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruthbool RecursiveASTVisitor<Derived>::TraverseTemplateArguments( 787db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky const TemplateArgument *Args, 788db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky unsigned NumArgs) { 789dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth for (unsigned I = 0; I != NumArgs; ++I) { 790dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth TRY_TO(TraverseTemplateArgument(Args[I])); 791dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth } 792d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor 793e3e210c3aa3c1b289eee669a1d235fc16df384a0Chandler Carruth return true; 794db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky} 795db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky 7960f8c08843fc6c8abe03654f609e1e03fcc557855Craig Silversteintemplate<typename Derived> 7974d072932287eb074a4168804cac1acb18a51d5e8Craig Silversteinbool RecursiveASTVisitor<Derived>::TraverseConstructorInitializer( 798cbb67480094b3bcb5b715acd827cbad55e2a204cSean Hunt CXXCtorInitializer *Init) { 79976852c218a207ef43583515cb835b6e855353a0fDouglas Gregor if (TypeSourceInfo *TInfo = Init->getTypeSourceInfo()) 80076852c218a207ef43583515cb835b6e855353a0fDouglas Gregor TRY_TO(TraverseTypeLoc(TInfo->getTypeLoc())); 801ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 8028268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett if (Init->isWritten() || getDerived().shouldVisitImplicitCode()) 8030f8c08843fc6c8abe03654f609e1e03fcc557855Craig Silverstein TRY_TO(TraverseStmt(Init->getInit())); 8040f8c08843fc6c8abe03654f609e1e03fcc557855Craig Silverstein return true; 8050f8c08843fc6c8abe03654f609e1e03fcc557855Craig Silverstein} 8060f8c08843fc6c8abe03654f609e1e03fcc557855Craig Silverstein 807011d8b93b7cfa8492b8a9c909a850d6577e08dcaDouglas Gregortemplate<typename Derived> 808011d8b93b7cfa8492b8a9c909a850d6577e08dcaDouglas Gregorbool RecursiveASTVisitor<Derived>::TraverseLambdaCapture(LambdaExpr::Capture C){ 809011d8b93b7cfa8492b8a9c909a850d6577e08dcaDouglas Gregor return true; 810011d8b93b7cfa8492b8a9c909a850d6577e08dcaDouglas Gregor} 8110f8c08843fc6c8abe03654f609e1e03fcc557855Craig Silverstein 812dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth// ----------------- Type traversal ----------------- 813dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth 814dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth// This macro makes available a variable T, the passed-in type. 815dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth#define DEF_TRAVERSE_TYPE(TYPE, CODE) \ 816dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth template<typename Derived> \ 817dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth bool RecursiveASTVisitor<Derived>::Traverse##TYPE (TYPE *T) { \ 818dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth TRY_TO(WalkUpFrom##TYPE (T)); \ 819dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth { CODE; } \ 820e3e210c3aa3c1b289eee669a1d235fc16df384a0Chandler Carruth return true; \ 821d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor } 822d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor 823dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_TYPE(BuiltinType, { }) 824db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky 825dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_TYPE(ComplexType, { 826dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth TRY_TO(TraverseType(T->getElementType())); 827dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth }) 828db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky 829dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_TYPE(PointerType, { 830dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth TRY_TO(TraverseType(T->getPointeeType())); 831dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth }) 832db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky 833dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_TYPE(BlockPointerType, { 834dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth TRY_TO(TraverseType(T->getPointeeType())); 835dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth }) 836db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky 837dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_TYPE(LValueReferenceType, { 838dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth TRY_TO(TraverseType(T->getPointeeType())); 839dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth }) 840db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky 841dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_TYPE(RValueReferenceType, { 842dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth TRY_TO(TraverseType(T->getPointeeType())); 843dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth }) 844db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky 845dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_TYPE(MemberPointerType, { 846dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth TRY_TO(TraverseType(QualType(T->getClass(), 0))); 847dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth TRY_TO(TraverseType(T->getPointeeType())); 848dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth }) 849db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky 850dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_TYPE(ConstantArrayType, { 851dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth TRY_TO(TraverseType(T->getElementType())); 852dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth }) 853d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor 854dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_TYPE(IncompleteArrayType, { 855dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth TRY_TO(TraverseType(T->getElementType())); 856dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth }) 857db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky 858dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_TYPE(VariableArrayType, { 859dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth TRY_TO(TraverseType(T->getElementType())); 860dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth TRY_TO(TraverseStmt(T->getSizeExpr())); 861dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth }) 862db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky 863dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_TYPE(DependentSizedArrayType, { 864dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth TRY_TO(TraverseType(T->getElementType())); 865dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth if (T->getSizeExpr()) 866dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth TRY_TO(TraverseStmt(T->getSizeExpr())); 867dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth }) 868d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor 869dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_TYPE(DependentSizedExtVectorType, { 870dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth if (T->getSizeExpr()) 871dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth TRY_TO(TraverseStmt(T->getSizeExpr())); 872dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth TRY_TO(TraverseType(T->getElementType())); 873dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth }) 874d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor 875dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_TYPE(VectorType, { 876dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth TRY_TO(TraverseType(T->getElementType())); 877dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth }) 878d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor 8794d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick LewyckyDEF_TRAVERSE_TYPE(ExtVectorType, { 8804d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky TRY_TO(TraverseType(T->getElementType())); 8814d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky }) 882d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor 883dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_TYPE(FunctionNoProtoType, { 884dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth TRY_TO(TraverseType(T->getResultType())); 885dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth }) 886db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky 887dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_TYPE(FunctionProtoType, { 888dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth TRY_TO(TraverseType(T->getResultType())); 889db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky 890dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth for (FunctionProtoType::arg_type_iterator A = T->arg_type_begin(), 891dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth AEnd = T->arg_type_end(); 892dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth A != AEnd; ++A) { 893dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth TRY_TO(TraverseType(*A)); 894dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth } 895d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor 896dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth for (FunctionProtoType::exception_iterator E = T->exception_begin(), 897dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth EEnd = T->exception_end(); 898dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth E != EEnd; ++E) { 899dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth TRY_TO(TraverseType(*E)); 900dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth } 901dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth }) 902d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor 903dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_TYPE(UnresolvedUsingType, { }) 904dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_TYPE(TypedefType, { }) 905d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor 906dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_TYPE(TypeOfExprType, { 907dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth TRY_TO(TraverseStmt(T->getUnderlyingExpr())); 908dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth }) 909d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor 910dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_TYPE(TypeOfType, { 911dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth TRY_TO(TraverseType(T->getUnderlyingType())); 912dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth }) 913db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky 914dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_TYPE(DecltypeType, { 915dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth TRY_TO(TraverseStmt(T->getUnderlyingExpr())); 916dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth }) 917d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor 918ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean HuntDEF_TRAVERSE_TYPE(UnaryTransformType, { 919ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt TRY_TO(TraverseType(T->getBaseType())); 920ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt TRY_TO(TraverseType(T->getUnderlyingType())); 921ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt }) 922ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt 92334b41d939a1328f484511c6002ba2456db879a29Richard SmithDEF_TRAVERSE_TYPE(AutoType, { 92434b41d939a1328f484511c6002ba2456db879a29Richard Smith TRY_TO(TraverseType(T->getDeducedType())); 92534b41d939a1328f484511c6002ba2456db879a29Richard Smith }) 92634b41d939a1328f484511c6002ba2456db879a29Richard Smith 927dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_TYPE(RecordType, { }) 928dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_TYPE(EnumType, { }) 929dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_TYPE(TemplateTypeParmType, { }) 930dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_TYPE(SubstTemplateTypeParmType, { }) 931c3069d618f4661d923cb1b5c4525b082fce73b04Douglas GregorDEF_TRAVERSE_TYPE(SubstTemplateTypeParmPackType, { }) 932db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky 933dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_TYPE(TemplateSpecializationType, { 934dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth TRY_TO(TraverseTemplateName(T->getTemplateName())); 935dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth TRY_TO(TraverseTemplateArguments(T->getArgs(), T->getNumArgs())); 936dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth }) 937d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor 938dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_TYPE(InjectedClassNameType, { }) 939d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor 9409d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCallDEF_TRAVERSE_TYPE(AttributedType, { 9419d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall TRY_TO(TraverseType(T->getModifiedType())); 9429d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall }) 9439d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall 944075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo BagnaraDEF_TRAVERSE_TYPE(ParenType, { 945075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara TRY_TO(TraverseType(T->getInnerType())); 946075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara }) 947075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara 948dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_TYPE(ElaboratedType, { 949dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth if (T->getQualifier()) { 950dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth TRY_TO(TraverseNestedNameSpecifier(T->getQualifier())); 951dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth } 952dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth TRY_TO(TraverseType(T->getNamedType())); 953dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth }) 954d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor 955dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_TYPE(DependentNameType, { 95633500955d731c73717af52088b7fc0e7a85681e7John McCall TRY_TO(TraverseNestedNameSpecifier(T->getQualifier())); 95733500955d731c73717af52088b7fc0e7a85681e7John McCall }) 958d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor 95933500955d731c73717af52088b7fc0e7a85681e7John McCallDEF_TRAVERSE_TYPE(DependentTemplateSpecializationType, { 96033500955d731c73717af52088b7fc0e7a85681e7John McCall TRY_TO(TraverseNestedNameSpecifier(T->getQualifier())); 96133500955d731c73717af52088b7fc0e7a85681e7John McCall TRY_TO(TraverseTemplateArguments(T->getArgs(), T->getNumArgs())); 962dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth }) 963d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor 9647536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas GregorDEF_TRAVERSE_TYPE(PackExpansionType, { 9657536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor TRY_TO(TraverseType(T->getPattern())); 9667536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor }) 9677536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor 968dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_TYPE(ObjCInterfaceType, { }) 969d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor 970dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_TYPE(ObjCObjectType, { 971dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth // We have to watch out here because an ObjCInterfaceType's base 972dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth // type is itself. 973dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth if (T->getBaseType().getTypePtr() != T) 974dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth TRY_TO(TraverseType(T->getBaseType())); 975dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth }) 976d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor 977dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_TYPE(ObjCObjectPointerType, { 978dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth TRY_TO(TraverseType(T->getPointeeType())); 979dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth }) 980dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth 981b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli FriedmanDEF_TRAVERSE_TYPE(AtomicType, { 982b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman TRY_TO(TraverseType(T->getValueType())); 983b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman }) 984b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman 985dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth#undef DEF_TRAVERSE_TYPE 986dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth 9874d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky// ----------------- TypeLoc traversal ----------------- 9884d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky 9894d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky// This macro makes available a variable TL, the passed-in TypeLoc. 990ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie// If requested, it calls WalkUpFrom* for the Type in the given TypeLoc, 991ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie// in addition to WalkUpFrom* for the TypeLoc itself, such that existing 992a40bc724849f9cdc6a7706bc5d230685c3bdf63cDouglas Gregor// clients that override the WalkUpFrom*Type() and/or Visit*Type() methods 993717cc00c16eabf0eefd3cc69394e97f7229af0c8Zhanyong Wan// continue to work. 994717cc00c16eabf0eefd3cc69394e97f7229af0c8Zhanyong Wan#define DEF_TRAVERSE_TYPELOC(TYPE, CODE) \ 995717cc00c16eabf0eefd3cc69394e97f7229af0c8Zhanyong Wan template<typename Derived> \ 996717cc00c16eabf0eefd3cc69394e97f7229af0c8Zhanyong Wan bool RecursiveASTVisitor<Derived>::Traverse##TYPE##Loc(TYPE##Loc TL) { \ 997a40bc724849f9cdc6a7706bc5d230685c3bdf63cDouglas Gregor if (getDerived().shouldWalkTypesOfTypeLocs()) \ 998f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall TRY_TO(WalkUpFrom##TYPE(const_cast<TYPE*>(TL.getTypePtr()))); \ 999717cc00c16eabf0eefd3cc69394e97f7229af0c8Zhanyong Wan TRY_TO(WalkUpFrom##TYPE##Loc(TL)); \ 1000717cc00c16eabf0eefd3cc69394e97f7229af0c8Zhanyong Wan { CODE; } \ 1001717cc00c16eabf0eefd3cc69394e97f7229af0c8Zhanyong Wan return true; \ 10024d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky } 10034d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky 1004717cc00c16eabf0eefd3cc69394e97f7229af0c8Zhanyong Wantemplate<typename Derived> 1005c34c2116346a29869b47b190f6dea589823d6947Craig Silversteinbool RecursiveASTVisitor<Derived>::TraverseQualifiedTypeLoc( 1006717cc00c16eabf0eefd3cc69394e97f7229af0c8Zhanyong Wan QualifiedTypeLoc TL) { 10076b3f1ebce775499aff03845193de78128671262fCraig Silverstein // Move this over to the 'main' typeloc tree. Note that this is a 10086b3f1ebce775499aff03845193de78128671262fCraig Silverstein // move -- we pretend that we were really looking at the unqualified 10096b3f1ebce775499aff03845193de78128671262fCraig Silverstein // typeloc all along -- rather than a recursion, so we don't follow 10106b3f1ebce775499aff03845193de78128671262fCraig Silverstein // the normal CRTP plan of going through 10116b3f1ebce775499aff03845193de78128671262fCraig Silverstein // getDerived().TraverseTypeLoc. If we did, we'd be traversing 10126b3f1ebce775499aff03845193de78128671262fCraig Silverstein // twice for the same type (once as a QualifiedTypeLoc version of 10136b3f1ebce775499aff03845193de78128671262fCraig Silverstein // the type, once as an UnqualifiedTypeLoc version of the type), 10146b3f1ebce775499aff03845193de78128671262fCraig Silverstein // which in effect means we'd call VisitTypeLoc twice with the 10156b3f1ebce775499aff03845193de78128671262fCraig Silverstein // 'same' type. This solves that problem, at the cost of never 10166b3f1ebce775499aff03845193de78128671262fCraig Silverstein // seeing the qualified version of the type (unless the client 10176b3f1ebce775499aff03845193de78128671262fCraig Silverstein // subclasses TraverseQualifiedTypeLoc themselves). It's not a 10186b3f1ebce775499aff03845193de78128671262fCraig Silverstein // perfect solution. A perfect solution probably requires making 10196b3f1ebce775499aff03845193de78128671262fCraig Silverstein // QualifiedTypeLoc a wrapper around TypeLoc -- like QualType is a 10206b3f1ebce775499aff03845193de78128671262fCraig Silverstein // wrapper around Type* -- rather than being its own class in the 10216b3f1ebce775499aff03845193de78128671262fCraig Silverstein // type hierarchy. 10226b3f1ebce775499aff03845193de78128671262fCraig Silverstein return TraverseTypeLoc(TL.getUnqualifiedLoc()); 1023c34c2116346a29869b47b190f6dea589823d6947Craig Silverstein} 10244d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky 1025717cc00c16eabf0eefd3cc69394e97f7229af0c8Zhanyong WanDEF_TRAVERSE_TYPELOC(BuiltinType, { }) 10264d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky 10274d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky// FIXME: ComplexTypeLoc is unfinished 1028717cc00c16eabf0eefd3cc69394e97f7229af0c8Zhanyong WanDEF_TRAVERSE_TYPELOC(ComplexType, { 10294d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky TRY_TO(TraverseType(TL.getTypePtr()->getElementType())); 10304d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky }) 10314d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky 1032717cc00c16eabf0eefd3cc69394e97f7229af0c8Zhanyong WanDEF_TRAVERSE_TYPELOC(PointerType, { 10334d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky TRY_TO(TraverseTypeLoc(TL.getPointeeLoc())); 10344d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky }) 10354d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky 1036717cc00c16eabf0eefd3cc69394e97f7229af0c8Zhanyong WanDEF_TRAVERSE_TYPELOC(BlockPointerType, { 10374d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky TRY_TO(TraverseTypeLoc(TL.getPointeeLoc())); 10384d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky }) 10394d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky 1040717cc00c16eabf0eefd3cc69394e97f7229af0c8Zhanyong WanDEF_TRAVERSE_TYPELOC(LValueReferenceType, { 10414d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky TRY_TO(TraverseTypeLoc(TL.getPointeeLoc())); 10424d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky }) 10434d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky 1044717cc00c16eabf0eefd3cc69394e97f7229af0c8Zhanyong WanDEF_TRAVERSE_TYPELOC(RValueReferenceType, { 10454d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky TRY_TO(TraverseTypeLoc(TL.getPointeeLoc())); 10464d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky }) 10474d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky 10484d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky// FIXME: location of base class? 10494d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky// We traverse this in the type case as well, but how is it not reached through 10504d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky// the pointee type? 1051717cc00c16eabf0eefd3cc69394e97f7229af0c8Zhanyong WanDEF_TRAVERSE_TYPELOC(MemberPointerType, { 10524d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky TRY_TO(TraverseType(QualType(TL.getTypePtr()->getClass(), 0))); 10534d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky TRY_TO(TraverseTypeLoc(TL.getPointeeLoc())); 10544d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky }) 10554d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky 1056cf4679e60a5c5fa13e4bfe69f8186658c828af49Craig Silversteintemplate<typename Derived> 1057cf4679e60a5c5fa13e4bfe69f8186658c828af49Craig Silversteinbool RecursiveASTVisitor<Derived>::TraverseArrayTypeLocHelper(ArrayTypeLoc TL) { 1058cf4679e60a5c5fa13e4bfe69f8186658c828af49Craig Silverstein // This isn't available for ArrayType, but is for the ArrayTypeLoc. 1059cf4679e60a5c5fa13e4bfe69f8186658c828af49Craig Silverstein TRY_TO(TraverseStmt(TL.getSizeExpr())); 1060cf4679e60a5c5fa13e4bfe69f8186658c828af49Craig Silverstein return true; 1061cf4679e60a5c5fa13e4bfe69f8186658c828af49Craig Silverstein} 1062cf4679e60a5c5fa13e4bfe69f8186658c828af49Craig Silverstein 1063717cc00c16eabf0eefd3cc69394e97f7229af0c8Zhanyong WanDEF_TRAVERSE_TYPELOC(ConstantArrayType, { 10644d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky TRY_TO(TraverseTypeLoc(TL.getElementLoc())); 1065cf4679e60a5c5fa13e4bfe69f8186658c828af49Craig Silverstein return TraverseArrayTypeLocHelper(TL); 10664d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky }) 10674d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky 1068717cc00c16eabf0eefd3cc69394e97f7229af0c8Zhanyong WanDEF_TRAVERSE_TYPELOC(IncompleteArrayType, { 10694d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky TRY_TO(TraverseTypeLoc(TL.getElementLoc())); 1070cf4679e60a5c5fa13e4bfe69f8186658c828af49Craig Silverstein return TraverseArrayTypeLocHelper(TL); 10714d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky }) 10724d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky 1073717cc00c16eabf0eefd3cc69394e97f7229af0c8Zhanyong WanDEF_TRAVERSE_TYPELOC(VariableArrayType, { 10744d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky TRY_TO(TraverseTypeLoc(TL.getElementLoc())); 1075cf4679e60a5c5fa13e4bfe69f8186658c828af49Craig Silverstein return TraverseArrayTypeLocHelper(TL); 10764d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky }) 10774d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky 1078717cc00c16eabf0eefd3cc69394e97f7229af0c8Zhanyong WanDEF_TRAVERSE_TYPELOC(DependentSizedArrayType, { 10794d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky TRY_TO(TraverseTypeLoc(TL.getElementLoc())); 1080cf4679e60a5c5fa13e4bfe69f8186658c828af49Craig Silverstein return TraverseArrayTypeLocHelper(TL); 10814d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky }) 10824d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky 10834d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky// FIXME: order? why not size expr first? 10844d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky// FIXME: base VectorTypeLoc is unfinished 1085717cc00c16eabf0eefd3cc69394e97f7229af0c8Zhanyong WanDEF_TRAVERSE_TYPELOC(DependentSizedExtVectorType, { 10864d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky if (TL.getTypePtr()->getSizeExpr()) 10874d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky TRY_TO(TraverseStmt(TL.getTypePtr()->getSizeExpr())); 10884d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky TRY_TO(TraverseType(TL.getTypePtr()->getElementType())); 10894d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky }) 10904d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky 10914d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky// FIXME: VectorTypeLoc is unfinished 1092717cc00c16eabf0eefd3cc69394e97f7229af0c8Zhanyong WanDEF_TRAVERSE_TYPELOC(VectorType, { 10934d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky TRY_TO(TraverseType(TL.getTypePtr()->getElementType())); 10944d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky }) 10954d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky 10964d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky// FIXME: size and attributes 10974d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky// FIXME: base VectorTypeLoc is unfinished 1098717cc00c16eabf0eefd3cc69394e97f7229af0c8Zhanyong WanDEF_TRAVERSE_TYPELOC(ExtVectorType, { 10994d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky TRY_TO(TraverseType(TL.getTypePtr()->getElementType())); 11004d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky }) 11014d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky 1102717cc00c16eabf0eefd3cc69394e97f7229af0c8Zhanyong WanDEF_TRAVERSE_TYPELOC(FunctionNoProtoType, { 11034d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky TRY_TO(TraverseTypeLoc(TL.getResultLoc())); 11044d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky }) 11054d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky 1106536bab452fa38692834233187ed3d49b83722cb3Craig Silverstein// FIXME: location of exception specifications (attributes?) 1107717cc00c16eabf0eefd3cc69394e97f7229af0c8Zhanyong WanDEF_TRAVERSE_TYPELOC(FunctionProtoType, { 11084d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky TRY_TO(TraverseTypeLoc(TL.getResultLoc())); 11094d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky 1110f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall const FunctionProtoType *T = TL.getTypePtr(); 1111536bab452fa38692834233187ed3d49b83722cb3Craig Silverstein 11124d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky for (unsigned I = 0, E = TL.getNumArgs(); I != E; ++I) { 1113406f98f6a5a7bde5707085af8d66204e7e76af45Douglas Gregor if (TL.getArg(I)) { 1114406f98f6a5a7bde5707085af8d66204e7e76af45Douglas Gregor TRY_TO(TraverseDecl(TL.getArg(I))); 1115406f98f6a5a7bde5707085af8d66204e7e76af45Douglas Gregor } else if (I < T->getNumArgs()) { 1116406f98f6a5a7bde5707085af8d66204e7e76af45Douglas Gregor TRY_TO(TraverseType(T->getArgType(I))); 1117406f98f6a5a7bde5707085af8d66204e7e76af45Douglas Gregor } 11184d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky } 1119536bab452fa38692834233187ed3d49b83722cb3Craig Silverstein 11204d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky for (FunctionProtoType::exception_iterator E = T->exception_begin(), 11214d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky EEnd = T->exception_end(); 11224d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky E != EEnd; ++E) { 11234d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky TRY_TO(TraverseType(*E)); 11244d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky } 11254d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky }) 11264d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky 1127717cc00c16eabf0eefd3cc69394e97f7229af0c8Zhanyong WanDEF_TRAVERSE_TYPELOC(UnresolvedUsingType, { }) 1128717cc00c16eabf0eefd3cc69394e97f7229af0c8Zhanyong WanDEF_TRAVERSE_TYPELOC(TypedefType, { }) 11294d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky 1130717cc00c16eabf0eefd3cc69394e97f7229af0c8Zhanyong WanDEF_TRAVERSE_TYPELOC(TypeOfExprType, { 11314d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky TRY_TO(TraverseStmt(TL.getUnderlyingExpr())); 11324d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky }) 11334d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky 1134717cc00c16eabf0eefd3cc69394e97f7229af0c8Zhanyong WanDEF_TRAVERSE_TYPELOC(TypeOfType, { 11354d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky TRY_TO(TraverseTypeLoc(TL.getUnderlyingTInfo()->getTypeLoc())); 11364d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky }) 11374d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky 11384d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky// FIXME: location of underlying expr 1139717cc00c16eabf0eefd3cc69394e97f7229af0c8Zhanyong WanDEF_TRAVERSE_TYPELOC(DecltypeType, { 11404d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky TRY_TO(TraverseStmt(TL.getTypePtr()->getUnderlyingExpr())); 11414d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky }) 11424d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky 1143ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean HuntDEF_TRAVERSE_TYPELOC(UnaryTransformType, { 1144ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt TRY_TO(TraverseTypeLoc(TL.getUnderlyingTInfo()->getTypeLoc())); 1145ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt }) 1146ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt 114734b41d939a1328f484511c6002ba2456db879a29Richard SmithDEF_TRAVERSE_TYPELOC(AutoType, { 114834b41d939a1328f484511c6002ba2456db879a29Richard Smith TRY_TO(TraverseType(TL.getTypePtr()->getDeducedType())); 114934b41d939a1328f484511c6002ba2456db879a29Richard Smith }) 115034b41d939a1328f484511c6002ba2456db879a29Richard Smith 1151717cc00c16eabf0eefd3cc69394e97f7229af0c8Zhanyong WanDEF_TRAVERSE_TYPELOC(RecordType, { }) 1152717cc00c16eabf0eefd3cc69394e97f7229af0c8Zhanyong WanDEF_TRAVERSE_TYPELOC(EnumType, { }) 1153717cc00c16eabf0eefd3cc69394e97f7229af0c8Zhanyong WanDEF_TRAVERSE_TYPELOC(TemplateTypeParmType, { }) 1154717cc00c16eabf0eefd3cc69394e97f7229af0c8Zhanyong WanDEF_TRAVERSE_TYPELOC(SubstTemplateTypeParmType, { }) 1155c3069d618f4661d923cb1b5c4525b082fce73b04Douglas GregorDEF_TRAVERSE_TYPELOC(SubstTemplateTypeParmPackType, { }) 11564d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky 11574d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky// FIXME: use the loc for the template name? 1158717cc00c16eabf0eefd3cc69394e97f7229af0c8Zhanyong WanDEF_TRAVERSE_TYPELOC(TemplateSpecializationType, { 11594d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky TRY_TO(TraverseTemplateName(TL.getTypePtr()->getTemplateName())); 11604d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky for (unsigned I = 0, E = TL.getNumArgs(); I != E; ++I) { 11614d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky TRY_TO(TraverseTemplateArgumentLoc(TL.getArgLoc(I))); 11624d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky } 11634d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky }) 11644d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky 1165717cc00c16eabf0eefd3cc69394e97f7229af0c8Zhanyong WanDEF_TRAVERSE_TYPELOC(InjectedClassNameType, { }) 11664d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky 1167075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo BagnaraDEF_TRAVERSE_TYPELOC(ParenType, { 1168075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara TRY_TO(TraverseTypeLoc(TL.getInnerLoc())); 1169075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara }) 1170075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara 11719d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCallDEF_TRAVERSE_TYPELOC(AttributedType, { 11729d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall TRY_TO(TraverseTypeLoc(TL.getModifiedLoc())); 11739d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall }) 11749d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall 1175717cc00c16eabf0eefd3cc69394e97f7229af0c8Zhanyong WanDEF_TRAVERSE_TYPELOC(ElaboratedType, { 11769e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor if (TL.getQualifierLoc()) { 11779e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor TRY_TO(TraverseNestedNameSpecifierLoc(TL.getQualifierLoc())); 11784d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky } 11794d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky TRY_TO(TraverseTypeLoc(TL.getNamedTypeLoc())); 11804d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky }) 11814d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky 1182717cc00c16eabf0eefd3cc69394e97f7229af0c8Zhanyong WanDEF_TRAVERSE_TYPELOC(DependentNameType, { 11832494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor TRY_TO(TraverseNestedNameSpecifierLoc(TL.getQualifierLoc())); 11844d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky }) 11854d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky 1186717cc00c16eabf0eefd3cc69394e97f7229af0c8Zhanyong WanDEF_TRAVERSE_TYPELOC(DependentTemplateSpecializationType, { 118794fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor if (TL.getQualifierLoc()) { 118894fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor TRY_TO(TraverseNestedNameSpecifierLoc(TL.getQualifierLoc())); 118994fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor } 1190ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 11914d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky for (unsigned I = 0, E = TL.getNumArgs(); I != E; ++I) { 11924d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky TRY_TO(TraverseTemplateArgumentLoc(TL.getArgLoc(I))); 11934d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky } 11944d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky }) 11954d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky 11967536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas GregorDEF_TRAVERSE_TYPELOC(PackExpansionType, { 11977536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor TRY_TO(TraverseTypeLoc(TL.getPatternLoc())); 11987536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor }) 11997536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor 1200717cc00c16eabf0eefd3cc69394e97f7229af0c8Zhanyong WanDEF_TRAVERSE_TYPELOC(ObjCInterfaceType, { }) 12014d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky 1202717cc00c16eabf0eefd3cc69394e97f7229af0c8Zhanyong WanDEF_TRAVERSE_TYPELOC(ObjCObjectType, { 12034d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky // We have to watch out here because an ObjCInterfaceType's base 12044d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky // type is itself. 12054d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky if (TL.getTypePtr()->getBaseType().getTypePtr() != TL.getTypePtr()) 12064d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky TRY_TO(TraverseTypeLoc(TL.getBaseLoc())); 12074d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky }) 12084d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky 1209717cc00c16eabf0eefd3cc69394e97f7229af0c8Zhanyong WanDEF_TRAVERSE_TYPELOC(ObjCObjectPointerType, { 12104d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky TRY_TO(TraverseTypeLoc(TL.getPointeeLoc())); 12114d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky }) 12124d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky 1213b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli FriedmanDEF_TRAVERSE_TYPELOC(AtomicType, { 1214b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman TRY_TO(TraverseTypeLoc(TL.getValueLoc())); 1215b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman }) 1216b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman 12174d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky#undef DEF_TRAVERSE_TYPELOC 12184d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky 1219dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth// ----------------- Decl traversal ----------------- 1220dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth// 1221dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth// For a Decl, we automate (in the DEF_TRAVERSE_DECL macro) traversing 1222dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth// the children that come from the DeclContext associated with it. 1223dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth// Therefore each Traverse* only needs to worry about children other 1224dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth// than those. 1225dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth 12260c05a1bae9e8a57f56663991d0442a69df34a003Zhanyong Wantemplate<typename Derived> 12274d072932287eb074a4168804cac1acb18a51d5e8Craig Silversteinbool RecursiveASTVisitor<Derived>::TraverseDeclContextHelper(DeclContext *DC) { 12280c05a1bae9e8a57f56663991d0442a69df34a003Zhanyong Wan if (!DC) 12290c05a1bae9e8a57f56663991d0442a69df34a003Zhanyong Wan return true; 12300c05a1bae9e8a57f56663991d0442a69df34a003Zhanyong Wan 12310c05a1bae9e8a57f56663991d0442a69df34a003Zhanyong Wan for (DeclContext::decl_iterator Child = DC->decls_begin(), 12320c05a1bae9e8a57f56663991d0442a69df34a003Zhanyong Wan ChildEnd = DC->decls_end(); 12330c05a1bae9e8a57f56663991d0442a69df34a003Zhanyong Wan Child != ChildEnd; ++Child) { 1234336f51e463340dc7b159bc38517ac4a68081302dArgyrios Kyrtzidis // BlockDecls are traversed through BlockExprs. 1235336f51e463340dc7b159bc38517ac4a68081302dArgyrios Kyrtzidis if (!isa<BlockDecl>(*Child)) 1236336f51e463340dc7b159bc38517ac4a68081302dArgyrios Kyrtzidis TRY_TO(TraverseDecl(*Child)); 12370c05a1bae9e8a57f56663991d0442a69df34a003Zhanyong Wan } 12380c05a1bae9e8a57f56663991d0442a69df34a003Zhanyong Wan 12390c05a1bae9e8a57f56663991d0442a69df34a003Zhanyong Wan return true; 12400c05a1bae9e8a57f56663991d0442a69df34a003Zhanyong Wan} 12410c05a1bae9e8a57f56663991d0442a69df34a003Zhanyong Wan 1242dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth// This macro makes available a variable D, the passed-in decl. 1243dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth#define DEF_TRAVERSE_DECL(DECL, CODE) \ 1244dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruthtemplate<typename Derived> \ 1245dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruthbool RecursiveASTVisitor<Derived>::Traverse##DECL (DECL *D) { \ 1246dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth TRY_TO(WalkUpFrom##DECL (D)); \ 1247dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth { CODE; } \ 12480c05a1bae9e8a57f56663991d0442a69df34a003Zhanyong Wan TRY_TO(TraverseDeclContextHelper(dyn_cast<DeclContext>(D))); \ 1249e3e210c3aa3c1b289eee669a1d235fc16df384a0Chandler Carruth return true; \ 1250db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky} 1251d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor 1252dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_DECL(AccessSpecDecl, { }) 1253d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor 1254dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_DECL(BlockDecl, { 125587014f33f123461a012995b2f7eb5e6ecf6dc461Argyrios Kyrtzidis if (TypeSourceInfo *TInfo = D->getSignatureAsWritten()) 125645246a7fc00f07bba9a34a3f13c0af72a05f95beAnna Zaks TRY_TO(TraverseTypeLoc(TInfo->getTypeLoc())); 1257dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth TRY_TO(TraverseStmt(D->getBody())); 1258336f51e463340dc7b159bc38517ac4a68081302dArgyrios Kyrtzidis // This return statement makes sure the traversal of nodes in 1259336f51e463340dc7b159bc38517ac4a68081302dArgyrios Kyrtzidis // decls_begin()/decls_end() (done in the DEF_TRAVERSE_DECL macro) 1260336f51e463340dc7b159bc38517ac4a68081302dArgyrios Kyrtzidis // is skipped - don't remove it. 1261336f51e463340dc7b159bc38517ac4a68081302dArgyrios Kyrtzidis return true; 1262dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth }) 1263d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor 1264dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_DECL(FileScopeAsmDecl, { 1265dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth TRY_TO(TraverseStmt(D->getAsmString())); 1266dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth }) 1267d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor 126815de72cf580840c61e5704c2f8a2b56f9d0638e1Douglas GregorDEF_TRAVERSE_DECL(ImportDecl, { }) 126915de72cf580840c61e5704c2f8a2b56f9d0638e1Douglas Gregor 1270dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_DECL(FriendDecl, { 1271b5b38adbe29cd82711595bd184d6123125bd9a9bCraig Silverstein // Friend is either decl or a type. 1272bb6afcb7f5f9c2e9121a548726d6d03283cb52bcCraig Silverstein if (D->getFriendType()) 1273bb6afcb7f5f9c2e9121a548726d6d03283cb52bcCraig Silverstein TRY_TO(TraverseTypeLoc(D->getFriendType()->getTypeLoc())); 1274b5b38adbe29cd82711595bd184d6123125bd9a9bCraig Silverstein else 1275b5b38adbe29cd82711595bd184d6123125bd9a9bCraig Silverstein TRY_TO(TraverseDecl(D->getFriendDecl())); 1276dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth }) 1277d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor 1278dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_DECL(FriendTemplateDecl, { 1279bb6afcb7f5f9c2e9121a548726d6d03283cb52bcCraig Silverstein if (D->getFriendType()) 1280bb6afcb7f5f9c2e9121a548726d6d03283cb52bcCraig Silverstein TRY_TO(TraverseTypeLoc(D->getFriendType()->getTypeLoc())); 1281b5b38adbe29cd82711595bd184d6123125bd9a9bCraig Silverstein else 1282b5b38adbe29cd82711595bd184d6123125bd9a9bCraig Silverstein TRY_TO(TraverseDecl(D->getFriendDecl())); 1283dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth for (unsigned I = 0, E = D->getNumTemplateParameters(); I < E; ++I) { 1284dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth TemplateParameterList *TPL = D->getTemplateParameterList(I); 1285dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth for (TemplateParameterList::iterator ITPL = TPL->begin(), 1286dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth ETPL = TPL->end(); 1287dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth ITPL != ETPL; ++ITPL) { 1288dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth TRY_TO(TraverseDecl(*ITPL)); 1289dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth } 1290dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth } 1291dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth }) 1292d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor 1293af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois PichetDEF_TRAVERSE_DECL(ClassScopeFunctionSpecializationDecl, { 12946b02009359a462ffe633696a4441313b462e6566Nico Weber TRY_TO(TraverseDecl(D->getSpecialization())); 12956b02009359a462ffe633696a4441313b462e6566Nico Weber 12966b02009359a462ffe633696a4441313b462e6566Nico Weber if (D->hasExplicitTemplateArgs()) { 12976b02009359a462ffe633696a4441313b462e6566Nico Weber const TemplateArgumentListInfo& args = D->templateArgs(); 12986b02009359a462ffe633696a4441313b462e6566Nico Weber TRY_TO(TraverseTemplateArgumentLocsHelper( 12996b02009359a462ffe633696a4441313b462e6566Nico Weber args.getArgumentArray(), args.size())); 13006b02009359a462ffe633696a4441313b462e6566Nico Weber } 1301af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet }) 1302af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet 1303dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_DECL(LinkageSpecDecl, { }) 1304db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky 1305dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_DECL(ObjCPropertyImplDecl, { 1306dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth // FIXME: implement this 1307dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth }) 1308db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky 1309dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_DECL(StaticAssertDecl, { 1310dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth TRY_TO(TraverseStmt(D->getAssertExpr())); 1311dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth TRY_TO(TraverseStmt(D->getMessage())); 1312dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth }) 1313db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky 1314dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_DECL(TranslationUnitDecl, { 1315dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth // Code in an unnamed namespace shows up automatically in 1316dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth // decls_begin()/decls_end(). Thus we don't need to recurse on 1317dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth // D->getAnonymousNamespace(). 1318dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth }) 1319db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky 1320dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_DECL(NamespaceAliasDecl, { 1321dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth // We shouldn't traverse an aliased namespace, since it will be 1322dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth // defined (and, therefore, traversed) somewhere else. 1323dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth // 1324dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth // This return statement makes sure the traversal of nodes in 1325dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth // decls_begin()/decls_end() (done in the DEF_TRAVERSE_DECL macro) 1326dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth // is skipped - don't remove it. 1327e3e210c3aa3c1b289eee669a1d235fc16df384a0Chandler Carruth return true; 1328dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth }) 1329db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky 1330ad8dcf4a9df0e24051dc31bf9e6f3cd138a34298Chris LattnerDEF_TRAVERSE_DECL(LabelDecl, { 1331ad8dcf4a9df0e24051dc31bf9e6f3cd138a34298Chris Lattner // There is no code in a LabelDecl. 1332ad8dcf4a9df0e24051dc31bf9e6f3cd138a34298Chris Lattner}) 1333ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 1334ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 1335dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_DECL(NamespaceDecl, { 1336dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth // Code in an unnamed namespace shows up automatically in 1337dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth // decls_begin()/decls_end(). Thus we don't need to recurse on 1338dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth // D->getAnonymousNamespace(). 1339dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth }) 1340d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor 1341dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_DECL(ObjCCompatibleAliasDecl, { 1342dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth // FIXME: implement 1343dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth }) 1344db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky 1345dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_DECL(ObjCCategoryDecl, { 1346dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth // FIXME: implement 1347dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth }) 1348dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth 1349dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_DECL(ObjCCategoryImplDecl, { 1350dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth // FIXME: implement 1351dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth }) 1352dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth 1353dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_DECL(ObjCImplementationDecl, { 1354dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth // FIXME: implement 1355dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth }) 1356dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth 1357dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_DECL(ObjCInterfaceDecl, { 1358dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth // FIXME: implement 1359dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth }) 1360dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth 1361dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_DECL(ObjCProtocolDecl, { 1362dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth // FIXME: implement 1363dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth }) 1364dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth 1365dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_DECL(ObjCMethodDecl, { 1366ec7346077c1fb423c9279771675c098bc2dffc92Argyrios Kyrtzidis if (D->getResultTypeSourceInfo()) { 1367ec7346077c1fb423c9279771675c098bc2dffc92Argyrios Kyrtzidis TRY_TO(TraverseTypeLoc(D->getResultTypeSourceInfo()->getTypeLoc())); 1368ec7346077c1fb423c9279771675c098bc2dffc92Argyrios Kyrtzidis } 1369ec7346077c1fb423c9279771675c098bc2dffc92Argyrios Kyrtzidis for (ObjCMethodDecl::param_iterator 1370ec7346077c1fb423c9279771675c098bc2dffc92Argyrios Kyrtzidis I = D->param_begin(), E = D->param_end(); I != E; ++I) { 1371ec7346077c1fb423c9279771675c098bc2dffc92Argyrios Kyrtzidis TRY_TO(TraverseDecl(*I)); 1372ec7346077c1fb423c9279771675c098bc2dffc92Argyrios Kyrtzidis } 1373ec7346077c1fb423c9279771675c098bc2dffc92Argyrios Kyrtzidis if (D->isThisDeclarationADefinition()) { 1374ec7346077c1fb423c9279771675c098bc2dffc92Argyrios Kyrtzidis TRY_TO(TraverseStmt(D->getBody())); 1375ec7346077c1fb423c9279771675c098bc2dffc92Argyrios Kyrtzidis } 1376ec7346077c1fb423c9279771675c098bc2dffc92Argyrios Kyrtzidis return true; 1377dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth }) 1378dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth 1379dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_DECL(ObjCPropertyDecl, { 1380dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth // FIXME: implement 1381dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth }) 1382dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth 1383dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_DECL(UsingDecl, { 1384dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor TRY_TO(TraverseNestedNameSpecifierLoc(D->getQualifierLoc())); 138565019acfc46ffb191fac4e781ac0c4b8d0c8434eDouglas Gregor TRY_TO(TraverseDeclarationNameInfo(D->getNameInfo())); 1386dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth }) 1387dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth 1388dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_DECL(UsingDirectiveDecl, { 1389db9924191092b4d426cc066637d81698211846aaDouglas Gregor TRY_TO(TraverseNestedNameSpecifierLoc(D->getQualifierLoc())); 1390dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth }) 1391dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth 1392dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_DECL(UsingShadowDecl, { }) 1393d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor 1394dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth// A helper method for TemplateDecl's children. 1395db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewyckytemplate<typename Derived> 1396dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruthbool RecursiveASTVisitor<Derived>::TraverseTemplateParameterListHelper( 1397dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth TemplateParameterList *TPL) { 1398dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth if (TPL) { 1399dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth for (TemplateParameterList::iterator I = TPL->begin(), E = TPL->end(); 1400dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth I != E; ++I) { 1401dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth TRY_TO(TraverseDecl(*I)); 1402dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth } 1403dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth } 1404e3e210c3aa3c1b289eee669a1d235fc16df384a0Chandler Carruth return true; 1405db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky} 1406d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor 1407760c8af273d9871d063250ae626fb6df94c121f2John McCall// A helper method for traversing the implicit instantiations of a 1408a313b2fbba86c901e58dc58df036e731f24fdaeeRichard Smith// class template. 1409760c8af273d9871d063250ae626fb6df94c121f2John McCalltemplate<typename Derived> 1410760c8af273d9871d063250ae626fb6df94c121f2John McCallbool RecursiveASTVisitor<Derived>::TraverseClassInstantiations( 1411a313b2fbba86c901e58dc58df036e731f24fdaeeRichard Smith ClassTemplateDecl *D) { 1412760c8af273d9871d063250ae626fb6df94c121f2John McCall ClassTemplateDecl::spec_iterator end = D->spec_end(); 1413760c8af273d9871d063250ae626fb6df94c121f2John McCall for (ClassTemplateDecl::spec_iterator it = D->spec_begin(); it != end; ++it) { 1414760c8af273d9871d063250ae626fb6df94c121f2John McCall ClassTemplateSpecializationDecl* SD = *it; 1415760c8af273d9871d063250ae626fb6df94c121f2John McCall 1416760c8af273d9871d063250ae626fb6df94c121f2John McCall switch (SD->getSpecializationKind()) { 1417760c8af273d9871d063250ae626fb6df94c121f2John McCall // Visit the implicit instantiations with the requested pattern. 1418a313b2fbba86c901e58dc58df036e731f24fdaeeRichard Smith case TSK_Undeclared: 1419a313b2fbba86c901e58dc58df036e731f24fdaeeRichard Smith case TSK_ImplicitInstantiation: 1420a313b2fbba86c901e58dc58df036e731f24fdaeeRichard Smith TRY_TO(TraverseDecl(SD)); 1421d39d23e610c2a7815515d60c5a538d65d05e8bdcRichard Smith break; 1422760c8af273d9871d063250ae626fb6df94c121f2John McCall 1423760c8af273d9871d063250ae626fb6df94c121f2John McCall // We don't need to do anything on an explicit instantiation 1424760c8af273d9871d063250ae626fb6df94c121f2John McCall // or explicit specialization because there will be an explicit 1425760c8af273d9871d063250ae626fb6df94c121f2John McCall // node for it elsewhere. 1426760c8af273d9871d063250ae626fb6df94c121f2John McCall case TSK_ExplicitInstantiationDeclaration: 1427760c8af273d9871d063250ae626fb6df94c121f2John McCall case TSK_ExplicitInstantiationDefinition: 1428760c8af273d9871d063250ae626fb6df94c121f2John McCall case TSK_ExplicitSpecialization: 1429760c8af273d9871d063250ae626fb6df94c121f2John McCall break; 1430760c8af273d9871d063250ae626fb6df94c121f2John McCall } 1431760c8af273d9871d063250ae626fb6df94c121f2John McCall } 1432760c8af273d9871d063250ae626fb6df94c121f2John McCall 1433760c8af273d9871d063250ae626fb6df94c121f2John McCall return true; 1434760c8af273d9871d063250ae626fb6df94c121f2John McCall} 1435760c8af273d9871d063250ae626fb6df94c121f2John McCall 1436dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_DECL(ClassTemplateDecl, { 1437760c8af273d9871d063250ae626fb6df94c121f2John McCall CXXRecordDecl* TempDecl = D->getTemplatedDecl(); 1438760c8af273d9871d063250ae626fb6df94c121f2John McCall TRY_TO(TraverseDecl(TempDecl)); 1439dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth TRY_TO(TraverseTemplateParameterListHelper(D->getTemplateParameters())); 1440760c8af273d9871d063250ae626fb6df94c121f2John McCall 1441760c8af273d9871d063250ae626fb6df94c121f2John McCall // By default, we do not traverse the instantiations of 14421f89b4016505045d79b53ce1204fc2c46c7d01c9Manuel Klimek // class templates since they do not appear in the user code. The 1443760c8af273d9871d063250ae626fb6df94c121f2John McCall // following code optionally traverses them. 1444a313b2fbba86c901e58dc58df036e731f24fdaeeRichard Smith // 1445a313b2fbba86c901e58dc58df036e731f24fdaeeRichard Smith // We only traverse the class instantiations when we see the canonical 1446a313b2fbba86c901e58dc58df036e731f24fdaeeRichard Smith // declaration of the template, to ensure we only visit them once. 1447a313b2fbba86c901e58dc58df036e731f24fdaeeRichard Smith if (getDerived().shouldVisitTemplateInstantiations() && 1448a313b2fbba86c901e58dc58df036e731f24fdaeeRichard Smith D == D->getCanonicalDecl()) 1449a313b2fbba86c901e58dc58df036e731f24fdaeeRichard Smith TRY_TO(TraverseClassInstantiations(D)); 1450536bab452fa38692834233187ed3d49b83722cb3Craig Silverstein 1451760c8af273d9871d063250ae626fb6df94c121f2John McCall // Note that getInstantiatedFromMemberTemplate() is just a link 1452760c8af273d9871d063250ae626fb6df94c121f2John McCall // from a template instantiation back to the template from which 1453760c8af273d9871d063250ae626fb6df94c121f2John McCall // it was instantiated, and thus should not be traversed. 1454dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth }) 1455db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky 1456760c8af273d9871d063250ae626fb6df94c121f2John McCall// A helper method for traversing the instantiations of a 1457760c8af273d9871d063250ae626fb6df94c121f2John McCall// function while skipping its specializations. 1458760c8af273d9871d063250ae626fb6df94c121f2John McCalltemplate<typename Derived> 1459760c8af273d9871d063250ae626fb6df94c121f2John McCallbool RecursiveASTVisitor<Derived>::TraverseFunctionInstantiations( 1460a313b2fbba86c901e58dc58df036e731f24fdaeeRichard Smith FunctionTemplateDecl *D) { 1461760c8af273d9871d063250ae626fb6df94c121f2John McCall FunctionTemplateDecl::spec_iterator end = D->spec_end(); 1462ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie for (FunctionTemplateDecl::spec_iterator it = D->spec_begin(); it != end; 1463ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie ++it) { 1464760c8af273d9871d063250ae626fb6df94c121f2John McCall FunctionDecl* FD = *it; 1465760c8af273d9871d063250ae626fb6df94c121f2John McCall switch (FD->getTemplateSpecializationKind()) { 1466a313b2fbba86c901e58dc58df036e731f24fdaeeRichard Smith case TSK_Undeclared: 1467760c8af273d9871d063250ae626fb6df94c121f2John McCall case TSK_ImplicitInstantiation: 1468760c8af273d9871d063250ae626fb6df94c121f2John McCall // We don't know what kind of FunctionDecl this is. 1469760c8af273d9871d063250ae626fb6df94c121f2John McCall TRY_TO(TraverseDecl(FD)); 1470760c8af273d9871d063250ae626fb6df94c121f2John McCall break; 1471760c8af273d9871d063250ae626fb6df94c121f2John McCall 147206cd51a83577019ea26661b7d570ae9aef06f674Richard Smith // FIXME: For now traverse explicit instantiations here. Change that 147306cd51a83577019ea26661b7d570ae9aef06f674Richard Smith // once they are represented as dedicated nodes in the AST. 1474760c8af273d9871d063250ae626fb6df94c121f2John McCall case TSK_ExplicitInstantiationDeclaration: 1475760c8af273d9871d063250ae626fb6df94c121f2John McCall case TSK_ExplicitInstantiationDefinition: 147606cd51a83577019ea26661b7d570ae9aef06f674Richard Smith TRY_TO(TraverseDecl(FD)); 1477760c8af273d9871d063250ae626fb6df94c121f2John McCall break; 1478760c8af273d9871d063250ae626fb6df94c121f2John McCall 1479760c8af273d9871d063250ae626fb6df94c121f2John McCall case TSK_ExplicitSpecialization: 1480760c8af273d9871d063250ae626fb6df94c121f2John McCall break; 1481760c8af273d9871d063250ae626fb6df94c121f2John McCall } 1482760c8af273d9871d063250ae626fb6df94c121f2John McCall } 1483536bab452fa38692834233187ed3d49b83722cb3Craig Silverstein 1484760c8af273d9871d063250ae626fb6df94c121f2John McCall return true; 1485760c8af273d9871d063250ae626fb6df94c121f2John McCall} 1486536bab452fa38692834233187ed3d49b83722cb3Craig Silverstein 1487dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_DECL(FunctionTemplateDecl, { 1488dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth TRY_TO(TraverseDecl(D->getTemplatedDecl())); 1489dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth TRY_TO(TraverseTemplateParameterListHelper(D->getTemplateParameters())); 1490760c8af273d9871d063250ae626fb6df94c121f2John McCall 1491760c8af273d9871d063250ae626fb6df94c121f2John McCall // By default, we do not traverse the instantiations of 1492a313b2fbba86c901e58dc58df036e731f24fdaeeRichard Smith // function templates since they do not appear in the user code. The 1493760c8af273d9871d063250ae626fb6df94c121f2John McCall // following code optionally traverses them. 1494a313b2fbba86c901e58dc58df036e731f24fdaeeRichard Smith // 1495a313b2fbba86c901e58dc58df036e731f24fdaeeRichard Smith // We only traverse the function instantiations when we see the canonical 1496a313b2fbba86c901e58dc58df036e731f24fdaeeRichard Smith // declaration of the template, to ensure we only visit them once. 1497a313b2fbba86c901e58dc58df036e731f24fdaeeRichard Smith if (getDerived().shouldVisitTemplateInstantiations() && 1498a313b2fbba86c901e58dc58df036e731f24fdaeeRichard Smith D == D->getCanonicalDecl()) 1499a313b2fbba86c901e58dc58df036e731f24fdaeeRichard Smith TRY_TO(TraverseFunctionInstantiations(D)); 1500dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth }) 1501dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth 1502dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_DECL(TemplateTemplateParmDecl, { 1503dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth // D is the "T" in something like 1504dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth // template <template <typename> class T> class container { }; 1505dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth TRY_TO(TraverseDecl(D->getTemplatedDecl())); 15066fada8e820f2fd1b4cd38e48c8986110e87c5915Richard Smith if (D->hasDefaultArgument() && !D->defaultArgumentWasInherited()) { 15074d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky TRY_TO(TraverseTemplateArgumentLoc(D->getDefaultArgument())); 1508dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth } 1509dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth TRY_TO(TraverseTemplateParameterListHelper(D->getTemplateParameters())); 1510dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth }) 1511dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth 1512dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_DECL(TemplateTypeParmDecl, { 1513dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth // D is the "T" in something like "template<typename T> class vector;" 1514dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth if (D->getTypeForDecl()) 1515dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth TRY_TO(TraverseType(QualType(D->getTypeForDecl(), 0))); 15166fada8e820f2fd1b4cd38e48c8986110e87c5915Richard Smith if (D->hasDefaultArgument() && !D->defaultArgumentWasInherited()) 1517be9aa9614f0f15f2182c9ac5c571a868263131adCraig Silverstein TRY_TO(TraverseTypeLoc(D->getDefaultArgumentInfo()->getTypeLoc())); 1518dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth }) 1519dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth 1520dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_DECL(TypedefDecl, { 152184a8e0a846d658d784090c4f378cc1c6c6b0ef3fCraig Silverstein TRY_TO(TraverseTypeLoc(D->getTypeSourceInfo()->getTypeLoc())); 1522dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth // We shouldn't traverse D->getTypeForDecl(); it's a result of 1523dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth // declaring the typedef, not something that was written in the 1524dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth // source. 1525dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth }) 1526dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth 1527162e1c1b487352434552147967c3dd296ebee2f7Richard SmithDEF_TRAVERSE_DECL(TypeAliasDecl, { 1528162e1c1b487352434552147967c3dd296ebee2f7Richard Smith TRY_TO(TraverseTypeLoc(D->getTypeSourceInfo()->getTypeLoc())); 1529162e1c1b487352434552147967c3dd296ebee2f7Richard Smith // We shouldn't traverse D->getTypeForDecl(); it's a result of 1530162e1c1b487352434552147967c3dd296ebee2f7Richard Smith // declaring the type alias, not something that was written in the 1531162e1c1b487352434552147967c3dd296ebee2f7Richard Smith // source. 1532162e1c1b487352434552147967c3dd296ebee2f7Richard Smith }) 1533162e1c1b487352434552147967c3dd296ebee2f7Richard Smith 15343e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard SmithDEF_TRAVERSE_DECL(TypeAliasTemplateDecl, { 15353e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith TRY_TO(TraverseDecl(D->getTemplatedDecl())); 15363e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith TRY_TO(TraverseTemplateParameterListHelper(D->getTemplateParameters())); 15373e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith }) 15383e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith 1539dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_DECL(UnresolvedUsingTypenameDecl, { 1540dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth // A dependent using declaration which was marked with 'typename'. 1541dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth // template<class T> class A : public B<T> { using typename B<T>::foo; }; 1542dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor TRY_TO(TraverseNestedNameSpecifierLoc(D->getQualifierLoc())); 1543dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth // We shouldn't traverse D->getTypeForDecl(); it's a result of 1544dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth // declaring the type, not something that was written in the 1545dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth // source. 1546dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth }) 1547d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor 1548dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_DECL(EnumDecl, { 1549dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth if (D->getTypeForDecl()) 1550dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth TRY_TO(TraverseType(QualType(D->getTypeForDecl(), 0))); 1551dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth 15523812999df1a50e0804985c8845fcfa3fd7ffe14cCraig Silverstein TRY_TO(TraverseNestedNameSpecifierLoc(D->getQualifierLoc())); 1553dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth // The enumerators are already traversed by 1554dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth // decls_begin()/decls_end(). 1555dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth }) 1556dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth 1557dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth 1558dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth// Helper methods for RecordDecl and its children. 1559db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewyckytemplate<typename Derived> 1560dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruthbool RecursiveASTVisitor<Derived>::TraverseRecordHelper( 1561dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth RecordDecl *D) { 1562dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth // We shouldn't traverse D->getTypeForDecl(); it's a result of 1563dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth // declaring the type, not something that was written in the source. 1564a0e27f00158c9306d53b0003b94182e415380ea9Francois Pichet 15653812999df1a50e0804985c8845fcfa3fd7ffe14cCraig Silverstein TRY_TO(TraverseNestedNameSpecifierLoc(D->getQualifierLoc())); 1566e3e210c3aa3c1b289eee669a1d235fc16df384a0Chandler Carruth return true; 1567db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky} 1568d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor 1569db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewyckytemplate<typename Derived> 1570dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruthbool RecursiveASTVisitor<Derived>::TraverseCXXRecordHelper( 1571dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth CXXRecordDecl *D) { 1572e3e210c3aa3c1b289eee669a1d235fc16df384a0Chandler Carruth if (!TraverseRecordHelper(D)) 1573e3e210c3aa3c1b289eee669a1d235fc16df384a0Chandler Carruth return false; 15749f99d06e0d22380b9d1f0609a083dbfbd8b37c10Manuel Klimek if (D->isCompleteDefinition()) { 1575dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth for (CXXRecordDecl::base_class_iterator I = D->bases_begin(), 1576dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth E = D->bases_end(); 1577dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth I != E; ++I) { 157864a15230a9e0e030bd761c6848a5876354653dedNick Lewycky TRY_TO(TraverseTypeLoc(I->getTypeSourceInfo()->getTypeLoc())); 1579dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth } 1580dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth // We don't traverse the friends or the conversions, as they are 1581dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth // already in decls_begin()/decls_end(). 1582dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth } 1583e3e210c3aa3c1b289eee669a1d235fc16df384a0Chandler Carruth return true; 1584db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky} 1585d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor 1586dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_DECL(RecordDecl, { 1587dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth TRY_TO(TraverseRecordHelper(D)); 1588dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth }) 1589db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky 1590dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_DECL(CXXRecordDecl, { 1591dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth TRY_TO(TraverseCXXRecordHelper(D)); 1592dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth }) 1593dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth 1594dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_DECL(ClassTemplateSpecializationDecl, { 1595bc55618eb97c519b8c186c350cb419f89021b073Craig Silverstein // For implicit instantiations ("set<int> x;"), we don't want to 1596bc55618eb97c519b8c186c350cb419f89021b073Craig Silverstein // recurse at all, since the instatiated class isn't written in 1597bc55618eb97c519b8c186c350cb419f89021b073Craig Silverstein // the source code anywhere. (Note the instatiated *type* -- 1598bc55618eb97c519b8c186c350cb419f89021b073Craig Silverstein // set<int> -- is written, and will still get a callback of 1599bc55618eb97c519b8c186c350cb419f89021b073Craig Silverstein // TemplateSpecializationType). For explicit instantiations 1600bc55618eb97c519b8c186c350cb419f89021b073Craig Silverstein // ("template set<int>;"), we do need a callback, since this 1601bc55618eb97c519b8c186c350cb419f89021b073Craig Silverstein // is the only callback that's made for this instantiation. 1602bc55618eb97c519b8c186c350cb419f89021b073Craig Silverstein // We use getTypeAsWritten() to distinguish. 16034d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky if (TypeSourceInfo *TSI = D->getTypeAsWritten()) 16044d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky TRY_TO(TraverseTypeLoc(TSI->getTypeLoc())); 1605760c8af273d9871d063250ae626fb6df94c121f2John McCall 1606760c8af273d9871d063250ae626fb6df94c121f2John McCall if (!getDerived().shouldVisitTemplateInstantiations() && 1607760c8af273d9871d063250ae626fb6df94c121f2John McCall D->getTemplateSpecializationKind() != TSK_ExplicitSpecialization) 1608760c8af273d9871d063250ae626fb6df94c121f2John McCall // Returning from here skips traversing the 1609760c8af273d9871d063250ae626fb6df94c121f2John McCall // declaration context of the ClassTemplateSpecializationDecl 1610760c8af273d9871d063250ae626fb6df94c121f2John McCall // (embedded in the DEF_TRAVERSE_DECL() macro) 1611760c8af273d9871d063250ae626fb6df94c121f2John McCall // which contains the instantiated members of the class. 1612760c8af273d9871d063250ae626fb6df94c121f2John McCall return true; 1613dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth }) 1614d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor 1615dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruthtemplate <typename Derived> 1616dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruthbool RecursiveASTVisitor<Derived>::TraverseTemplateArgumentLocsHelper( 1617dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth const TemplateArgumentLoc *TAL, unsigned Count) { 1618dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth for (unsigned I = 0; I < Count; ++I) { 16194d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky TRY_TO(TraverseTemplateArgumentLoc(TAL[I])); 1620dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth } 1621e3e210c3aa3c1b289eee669a1d235fc16df384a0Chandler Carruth return true; 1622db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky} 1623db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky 1624dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_DECL(ClassTemplatePartialSpecializationDecl, { 1625dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth // The partial specialization. 16264d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky if (TemplateParameterList *TPL = D->getTemplateParameters()) { 1627dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth for (TemplateParameterList::iterator I = TPL->begin(), E = TPL->end(); 1628dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth I != E; ++I) { 1629dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth TRY_TO(TraverseDecl(*I)); 1630dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth } 1631dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth } 1632dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth // The args that remains unspecialized. 1633dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth TRY_TO(TraverseTemplateArgumentLocsHelper( 1634dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth D->getTemplateArgsAsWritten(), D->getNumTemplateArgsAsWritten())); 1635dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth 1636dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth // Don't need the ClassTemplatePartialSpecializationHelper, even 1637dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth // though that's our parent class -- we already visit all the 1638dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth // template args here. 1639dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth TRY_TO(TraverseCXXRecordHelper(D)); 1640760c8af273d9871d063250ae626fb6df94c121f2John McCall 1641a313b2fbba86c901e58dc58df036e731f24fdaeeRichard Smith // Instantiations will have been visited with the primary template. 1642dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth }) 1643dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth 1644dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_DECL(EnumConstantDecl, { 1645dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth TRY_TO(TraverseStmt(D->getInitExpr())); 1646dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth }) 1647dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth 1648dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_DECL(UnresolvedUsingValueDecl, { 1649dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth // Like UnresolvedUsingTypenameDecl, but without the 'typename': 1650dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth // template <class T> Class A : public Base<T> { using Base<T>::foo; }; 1651dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor TRY_TO(TraverseNestedNameSpecifierLoc(D->getQualifierLoc())); 165265019acfc46ffb191fac4e781ac0c4b8d0c8434eDouglas Gregor TRY_TO(TraverseDeclarationNameInfo(D->getNameInfo())); 1653dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth }) 1654dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth 165587c2e121cf0522fc266efe2922b58091cd2e0182Francois PichetDEF_TRAVERSE_DECL(IndirectFieldDecl, {}) 165687c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet 1657db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewyckytemplate<typename Derived> 1658dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruthbool RecursiveASTVisitor<Derived>::TraverseDeclaratorHelper(DeclaratorDecl *D) { 16593812999df1a50e0804985c8845fcfa3fd7ffe14cCraig Silverstein TRY_TO(TraverseNestedNameSpecifierLoc(D->getQualifierLoc())); 1660dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth if (D->getTypeSourceInfo()) 16614d2229c7a9514ee2b960aa9e59f7259cebbaa421Nick Lewycky TRY_TO(TraverseTypeLoc(D->getTypeSourceInfo()->getTypeLoc())); 1662406f98f6a5a7bde5707085af8d66204e7e76af45Douglas Gregor else 1663406f98f6a5a7bde5707085af8d66204e7e76af45Douglas Gregor TRY_TO(TraverseType(D->getType())); 1664e3e210c3aa3c1b289eee669a1d235fc16df384a0Chandler Carruth return true; 1665db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky} 1666c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall 1667dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_DECL(FieldDecl, { 1668dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth TRY_TO(TraverseDeclaratorHelper(D)); 1669dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth if (D->isBitField()) 1670dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth TRY_TO(TraverseStmt(D->getBitWidth())); 1671e422e45a6a89d450b8eca10f671b49874e87617aArgyrios Kyrtzidis else if (D->hasInClassInitializer()) 1672e422e45a6a89d450b8eca10f671b49874e87617aArgyrios Kyrtzidis TRY_TO(TraverseStmt(D->getInClassInitializer())); 1673dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth }) 1674dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth 1675dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_DECL(ObjCAtDefsFieldDecl, { 1676dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth TRY_TO(TraverseDeclaratorHelper(D)); 1677dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth if (D->isBitField()) 1678dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth TRY_TO(TraverseStmt(D->getBitWidth())); 1679dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth // FIXME: implement the rest. 1680dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth }) 1681dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth 1682dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_DECL(ObjCIvarDecl, { 1683dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth TRY_TO(TraverseDeclaratorHelper(D)); 1684dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth if (D->isBitField()) 1685dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth TRY_TO(TraverseStmt(D->getBitWidth())); 1686dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth // FIXME: implement the rest. 1687dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth }) 1688dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth 1689db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewyckytemplate<typename Derived> 1690dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruthbool RecursiveASTVisitor<Derived>::TraverseFunctionHelper(FunctionDecl *D) { 16913812999df1a50e0804985c8845fcfa3fd7ffe14cCraig Silverstein TRY_TO(TraverseNestedNameSpecifierLoc(D->getQualifierLoc())); 169265019acfc46ffb191fac4e781ac0c4b8d0c8434eDouglas Gregor TRY_TO(TraverseDeclarationNameInfo(D->getNameInfo())); 16930c05a1bae9e8a57f56663991d0442a69df34a003Zhanyong Wan 1694cf4679e60a5c5fa13e4bfe69f8186658c828af49Craig Silverstein // If we're an explicit template specialization, iterate over the 1695536bab452fa38692834233187ed3d49b83722cb3Craig Silverstein // template args that were explicitly specified. If we were doing 1696536bab452fa38692834233187ed3d49b83722cb3Craig Silverstein // this in typing order, we'd do it between the return type and 1697536bab452fa38692834233187ed3d49b83722cb3Craig Silverstein // the function args, but both are handled by the FunctionTypeLoc 1698536bab452fa38692834233187ed3d49b83722cb3Craig Silverstein // above, so we have to choose one side. I've decided to do before. 1699cf4679e60a5c5fa13e4bfe69f8186658c828af49Craig Silverstein if (const FunctionTemplateSpecializationInfo *FTSI = 1700cf4679e60a5c5fa13e4bfe69f8186658c828af49Craig Silverstein D->getTemplateSpecializationInfo()) { 1701cf4679e60a5c5fa13e4bfe69f8186658c828af49Craig Silverstein if (FTSI->getTemplateSpecializationKind() != TSK_Undeclared && 1702cf4679e60a5c5fa13e4bfe69f8186658c828af49Craig Silverstein FTSI->getTemplateSpecializationKind() != TSK_ImplicitInstantiation) { 170344db3251aec7c0e6edaf1c70d7d53a272686791aNick Lewycky // A specialization might not have explicit template arguments if it has 170444db3251aec7c0e6edaf1c70d7d53a272686791aNick Lewycky // a templated return type and concrete arguments. 170571a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis if (const ASTTemplateArgumentListInfo *TALI = 170644db3251aec7c0e6edaf1c70d7d53a272686791aNick Lewycky FTSI->TemplateArgumentsAsWritten) { 170771a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis TRY_TO(TraverseTemplateArgumentLocsHelper(TALI->getTemplateArgs(), 170871a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis TALI->NumTemplateArgs)); 170944db3251aec7c0e6edaf1c70d7d53a272686791aNick Lewycky } 1710cf4679e60a5c5fa13e4bfe69f8186658c828af49Craig Silverstein } 1711cf4679e60a5c5fa13e4bfe69f8186658c828af49Craig Silverstein } 1712cf4679e60a5c5fa13e4bfe69f8186658c828af49Craig Silverstein 1713536bab452fa38692834233187ed3d49b83722cb3Craig Silverstein // Visit the function type itself, which can be either 1714536bab452fa38692834233187ed3d49b83722cb3Craig Silverstein // FunctionNoProtoType or FunctionProtoType, or a typedef. This 1715536bab452fa38692834233187ed3d49b83722cb3Craig Silverstein // also covers the return type and the function parameters, 1716536bab452fa38692834233187ed3d49b83722cb3Craig Silverstein // including exception specifications. 1717c28a335184207a47f34eb9d1707dc8d7c6c7b8b6Richard Smith if (clang::TypeSourceInfo *TSI = D->getTypeSourceInfo()) { 1718c28a335184207a47f34eb9d1707dc8d7c6c7b8b6Richard Smith TRY_TO(TraverseTypeLoc(TSI->getTypeLoc())); 1719c28a335184207a47f34eb9d1707dc8d7c6c7b8b6Richard Smith } 1720cf4679e60a5c5fa13e4bfe69f8186658c828af49Craig Silverstein 17216beaf938c0a2587ac4b2b60a51fbb9a80f72b766Zhanyong Wan if (CXXConstructorDecl *Ctor = dyn_cast<CXXConstructorDecl>(D)) { 17226beaf938c0a2587ac4b2b60a51fbb9a80f72b766Zhanyong Wan // Constructor initializers. 17236beaf938c0a2587ac4b2b60a51fbb9a80f72b766Zhanyong Wan for (CXXConstructorDecl::init_iterator I = Ctor->init_begin(), 17246beaf938c0a2587ac4b2b60a51fbb9a80f72b766Zhanyong Wan E = Ctor->init_end(); 17256beaf938c0a2587ac4b2b60a51fbb9a80f72b766Zhanyong Wan I != E; ++I) { 17266beaf938c0a2587ac4b2b60a51fbb9a80f72b766Zhanyong Wan TRY_TO(TraverseConstructorInitializer(*I)); 17276beaf938c0a2587ac4b2b60a51fbb9a80f72b766Zhanyong Wan } 17286beaf938c0a2587ac4b2b60a51fbb9a80f72b766Zhanyong Wan } 17296beaf938c0a2587ac4b2b60a51fbb9a80f72b766Zhanyong Wan 1730dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth if (D->isThisDeclarationADefinition()) { 17310c05a1bae9e8a57f56663991d0442a69df34a003Zhanyong Wan TRY_TO(TraverseStmt(D->getBody())); // Function body. 1732dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth } 1733e3e210c3aa3c1b289eee669a1d235fc16df384a0Chandler Carruth return true; 1734db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky} 1735d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor 1736dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_DECL(FunctionDecl, { 17370c05a1bae9e8a57f56663991d0442a69df34a003Zhanyong Wan // We skip decls_begin/decls_end, which are already covered by 17380c05a1bae9e8a57f56663991d0442a69df34a003Zhanyong Wan // TraverseFunctionHelper(). 17390c05a1bae9e8a57f56663991d0442a69df34a003Zhanyong Wan return TraverseFunctionHelper(D); 1740dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth }) 1741facfc77487a890bfb7b5eee7e21cd2b395a9faafChandler Carruth 1742dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_DECL(CXXMethodDecl, { 17430c05a1bae9e8a57f56663991d0442a69df34a003Zhanyong Wan // We skip decls_begin/decls_end, which are already covered by 17440c05a1bae9e8a57f56663991d0442a69df34a003Zhanyong Wan // TraverseFunctionHelper(). 17450c05a1bae9e8a57f56663991d0442a69df34a003Zhanyong Wan return TraverseFunctionHelper(D); 1746dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth }) 1747facfc77487a890bfb7b5eee7e21cd2b395a9faafChandler Carruth 1748dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_DECL(CXXConstructorDecl, { 17490c05a1bae9e8a57f56663991d0442a69df34a003Zhanyong Wan // We skip decls_begin/decls_end, which are already covered by 17500c05a1bae9e8a57f56663991d0442a69df34a003Zhanyong Wan // TraverseFunctionHelper(). 17516beaf938c0a2587ac4b2b60a51fbb9a80f72b766Zhanyong Wan return TraverseFunctionHelper(D); 1752dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth }) 1753facfc77487a890bfb7b5eee7e21cd2b395a9faafChandler Carruth 17540c05a1bae9e8a57f56663991d0442a69df34a003Zhanyong Wan// CXXConversionDecl is the declaration of a type conversion operator. 17550c05a1bae9e8a57f56663991d0442a69df34a003Zhanyong Wan// It's not a cast expression. 1756dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_DECL(CXXConversionDecl, { 17570c05a1bae9e8a57f56663991d0442a69df34a003Zhanyong Wan // We skip decls_begin/decls_end, which are already covered by 17580c05a1bae9e8a57f56663991d0442a69df34a003Zhanyong Wan // TraverseFunctionHelper(). 17590c05a1bae9e8a57f56663991d0442a69df34a003Zhanyong Wan return TraverseFunctionHelper(D); 1760dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth }) 1761d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor 1762dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_DECL(CXXDestructorDecl, { 17630c05a1bae9e8a57f56663991d0442a69df34a003Zhanyong Wan // We skip decls_begin/decls_end, which are already covered by 17640c05a1bae9e8a57f56663991d0442a69df34a003Zhanyong Wan // TraverseFunctionHelper(). 17650c05a1bae9e8a57f56663991d0442a69df34a003Zhanyong Wan return TraverseFunctionHelper(D); 1766dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth }) 1767dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth 1768dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruthtemplate<typename Derived> 1769dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruthbool RecursiveASTVisitor<Derived>::TraverseVarHelper(VarDecl *D) { 17706c321e35008f2c99eeb1409b43859a04c48e5ce5Chandler Carruth TRY_TO(TraverseDeclaratorHelper(D)); 1771c874ca1c7378d62aff008d74cf744636730f2db4Argyrios Kyrtzidis // Default params are taken care of when we traverse the ParmVarDecl. 177252ec0c0357ce970ca52a27c1086626450f0967e7Daniel Jasper if (!isa<ParmVarDecl>(D) && 17737349cce2b303c8cc1e00c3aa7192513d6ca5004fDaniel Jasper (!D->isCXXForRangeDecl() || getDerived().shouldVisitImplicitCode())) 1774c874ca1c7378d62aff008d74cf744636730f2db4Argyrios Kyrtzidis TRY_TO(TraverseStmt(D->getInit())); 1775e3e210c3aa3c1b289eee669a1d235fc16df384a0Chandler Carruth return true; 1776db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky} 1777db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky 1778dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_DECL(VarDecl, { 1779dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth TRY_TO(TraverseVarHelper(D)); 1780dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth }) 1781db3f847cb883fdb19d79c7223fa032e7266c0ee5Nick Lewycky 1782dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_DECL(ImplicitParamDecl, { 1783dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth TRY_TO(TraverseVarHelper(D)); 1784dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth }) 1785facfc77487a890bfb7b5eee7e21cd2b395a9faafChandler Carruth 1786dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_DECL(NonTypeTemplateParmDecl, { 1787dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth // A non-type template parameter, e.g. "S" in template<int S> class Foo ... 178876a40219ee5624d78aba167dce02bdbaa930955fJohn McCall TRY_TO(TraverseDeclaratorHelper(D)); 17896fada8e820f2fd1b4cd38e48c8986110e87c5915Richard Smith if (D->hasDefaultArgument() && !D->defaultArgumentWasInherited()) 17906fada8e820f2fd1b4cd38e48c8986110e87c5915Richard Smith TRY_TO(TraverseStmt(D->getDefaultArgument())); 1791facfc77487a890bfb7b5eee7e21cd2b395a9faafChandler Carruth }) 1792facfc77487a890bfb7b5eee7e21cd2b395a9faafChandler Carruth 1793dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_DECL(ParmVarDecl, { 1794be9aa9614f0f15f2182c9ac5c571a868263131adCraig Silverstein TRY_TO(TraverseVarHelper(D)); 1795be9aa9614f0f15f2182c9ac5c571a868263131adCraig Silverstein 1796dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth if (D->hasDefaultArg() && 1797dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth D->hasUninstantiatedDefaultArg() && 1798dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth !D->hasUnparsedDefaultArg()) 1799dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth TRY_TO(TraverseStmt(D->getUninstantiatedDefaultArg())); 1800dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth 1801dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth if (D->hasDefaultArg() && 1802dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth !D->hasUninstantiatedDefaultArg() && 1803dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth !D->hasUnparsedDefaultArg()) 1804dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth TRY_TO(TraverseStmt(D->getDefaultArg())); 1805facfc77487a890bfb7b5eee7e21cd2b395a9faafChandler Carruth }) 1806facfc77487a890bfb7b5eee7e21cd2b395a9faafChandler Carruth 1807dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth#undef DEF_TRAVERSE_DECL 1808facfc77487a890bfb7b5eee7e21cd2b395a9faafChandler Carruth 1809dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth// ----------------- Stmt traversal ----------------- 1810dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth// 1811dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth// For stmts, we automate (in the DEF_TRAVERSE_STMT macro) iterating 18127502c1d3ce8bb97bcc4f7bebef507040bd93b26fJohn McCall// over the children defined in children() (every stmt defines these, 18137502c1d3ce8bb97bcc4f7bebef507040bd93b26fJohn McCall// though sometimes the range is empty). Each individual Traverse* 18147502c1d3ce8bb97bcc4f7bebef507040bd93b26fJohn McCall// method only needs to worry about children other than those. To see 18157502c1d3ce8bb97bcc4f7bebef507040bd93b26fJohn McCall// what children() does for a given class, see, e.g., 18167502c1d3ce8bb97bcc4f7bebef507040bd93b26fJohn McCall// http://clang.llvm.org/doxygen/Stmt_8cpp_source.html 1817dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth 1818dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth// This macro makes available a variable S, the passed-in stmt. 1819dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth#define DEF_TRAVERSE_STMT(STMT, CODE) \ 1820dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruthtemplate<typename Derived> \ 1821dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruthbool RecursiveASTVisitor<Derived>::Traverse##STMT (STMT *S) { \ 1822dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth TRY_TO(WalkUpFrom##STMT(S)); \ 1823dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth { CODE; } \ 18247502c1d3ce8bb97bcc4f7bebef507040bd93b26fJohn McCall for (Stmt::child_range range = S->children(); range; ++range) { \ 182586b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek TRY_TO(TraverseStmt(*range)); \ 1826dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth } \ 1827e3e210c3aa3c1b289eee669a1d235fc16df384a0Chandler Carruth return true; \ 1828dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth} 1829facfc77487a890bfb7b5eee7e21cd2b395a9faafChandler Carruth 1830df5faf5e7ae6823d0af0b801c4ac26d47f2cee97Chad RosierDEF_TRAVERSE_STMT(GCCAsmStmt, { 183186b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek TRY_TO(TraverseStmt(S->getAsmString())); 1832dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth for (unsigned I = 0, E = S->getNumInputs(); I < E; ++I) { 183386b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek TRY_TO(TraverseStmt(S->getInputConstraintLiteral(I))); 1834facfc77487a890bfb7b5eee7e21cd2b395a9faafChandler Carruth } 1835dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth for (unsigned I = 0, E = S->getNumOutputs(); I < E; ++I) { 183686b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek TRY_TO(TraverseStmt(S->getOutputConstraintLiteral(I))); 1837dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth } 1838dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth for (unsigned I = 0, E = S->getNumClobbers(); I < E; ++I) { 18395c7f59445ae68109c7ffee731aca2ce32db587c7Chad Rosier TRY_TO(TraverseStmt(S->getClobberStringLiteral(I))); 1840dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth } 18417502c1d3ce8bb97bcc4f7bebef507040bd93b26fJohn McCall // children() iterates over inputExpr and outputExpr. 1842facfc77487a890bfb7b5eee7e21cd2b395a9faafChandler Carruth }) 1843facfc77487a890bfb7b5eee7e21cd2b395a9faafChandler Carruth 18448cd64b4c5553fa6284d248336cb7c82dc960a394Chad RosierDEF_TRAVERSE_STMT(MSAsmStmt, { 18458cd64b4c5553fa6284d248336cb7c82dc960a394Chad Rosier // FIXME: MS Asm doesn't currently parse Constraints, Clobbers, etc. Once 18468cd64b4c5553fa6284d248336cb7c82dc960a394Chad Rosier // added this needs to be implemented. 18478cd64b4c5553fa6284d248336cb7c82dc960a394Chad Rosier }) 18488cd64b4c5553fa6284d248336cb7c82dc960a394Chad Rosier 1849dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_STMT(CXXCatchStmt, { 1850be9aa9614f0f15f2182c9ac5c571a868263131adCraig Silverstein TRY_TO(TraverseDecl(S->getExceptionDecl())); 18517502c1d3ce8bb97bcc4f7bebef507040bd93b26fJohn McCall // children() iterates over the handler block. 1852dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth }) 1853dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth 1854be9aa9614f0f15f2182c9ac5c571a868263131adCraig SilversteinDEF_TRAVERSE_STMT(DeclStmt, { 1855be9aa9614f0f15f2182c9ac5c571a868263131adCraig Silverstein for (DeclStmt::decl_iterator I = S->decl_begin(), E = S->decl_end(); 1856be9aa9614f0f15f2182c9ac5c571a868263131adCraig Silverstein I != E; ++I) { 1857be9aa9614f0f15f2182c9ac5c571a868263131adCraig Silverstein TRY_TO(TraverseDecl(*I)); 1858be9aa9614f0f15f2182c9ac5c571a868263131adCraig Silverstein } 18597502c1d3ce8bb97bcc4f7bebef507040bd93b26fJohn McCall // Suppress the default iteration over children() by 1860be9aa9614f0f15f2182c9ac5c571a868263131adCraig Silverstein // returning. Here's why: A DeclStmt looks like 'type var [= 1861be9aa9614f0f15f2182c9ac5c571a868263131adCraig Silverstein // initializer]'. The decls above already traverse over the 1862be9aa9614f0f15f2182c9ac5c571a868263131adCraig Silverstein // initializers, so we don't have to do it again (which 18637502c1d3ce8bb97bcc4f7bebef507040bd93b26fJohn McCall // children() would do). 1864be9aa9614f0f15f2182c9ac5c571a868263131adCraig Silverstein return true; 1865dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth }) 1866dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth 1867dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth 1868dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth// These non-expr stmts (most of them), do not need any action except 1869dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth// iterating over the children. 1870dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_STMT(BreakStmt, { }) 1871be9aa9614f0f15f2182c9ac5c571a868263131adCraig SilversteinDEF_TRAVERSE_STMT(CXXTryStmt, { }) 1872be9aa9614f0f15f2182c9ac5c571a868263131adCraig SilversteinDEF_TRAVERSE_STMT(CaseStmt, { }) 1873dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_STMT(CompoundStmt, { }) 1874dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_STMT(ContinueStmt, { }) 1875be9aa9614f0f15f2182c9ac5c571a868263131adCraig SilversteinDEF_TRAVERSE_STMT(DefaultStmt, { }) 1876dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_STMT(DoStmt, { }) 1877be9aa9614f0f15f2182c9ac5c571a868263131adCraig SilversteinDEF_TRAVERSE_STMT(ForStmt, { }) 1878dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_STMT(GotoStmt, { }) 1879be9aa9614f0f15f2182c9ac5c571a868263131adCraig SilversteinDEF_TRAVERSE_STMT(IfStmt, { }) 1880dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_STMT(IndirectGotoStmt, { }) 1881dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_STMT(LabelStmt, { }) 1882534986f2b21e6050bf00163cd6423fd92155a6edRichard SmithDEF_TRAVERSE_STMT(AttributedStmt, { }) 1883dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_STMT(NullStmt, { }) 1884dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_STMT(ObjCAtCatchStmt, { }) 1885dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_STMT(ObjCAtFinallyStmt, { }) 1886dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_STMT(ObjCAtSynchronizedStmt, { }) 1887dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_STMT(ObjCAtThrowStmt, { }) 1888dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_STMT(ObjCAtTryStmt, { }) 1889dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_STMT(ObjCForCollectionStmt, { }) 1890f85e193739c953358c865005855253af4f68a497John McCallDEF_TRAVERSE_STMT(ObjCAutoreleasePoolStmt, { }) 189152ec0c0357ce970ca52a27c1086626450f0967e7Daniel JasperDEF_TRAVERSE_STMT(CXXForRangeStmt, { 18927349cce2b303c8cc1e00c3aa7192513d6ca5004fDaniel Jasper if (!getDerived().shouldVisitImplicitCode()) { 189352ec0c0357ce970ca52a27c1086626450f0967e7Daniel Jasper TRY_TO(TraverseStmt(S->getLoopVarStmt())); 189452ec0c0357ce970ca52a27c1086626450f0967e7Daniel Jasper TRY_TO(TraverseStmt(S->getRangeInit())); 18951071ba9c324d831b437870a1fe63bf2ecdc4e9e4Daniel Jasper TRY_TO(TraverseStmt(S->getBody())); 189652ec0c0357ce970ca52a27c1086626450f0967e7Daniel Jasper // Visit everything else only if shouldVisitImplicitCode(). 189752ec0c0357ce970ca52a27c1086626450f0967e7Daniel Jasper return true; 189852ec0c0357ce970ca52a27c1086626450f0967e7Daniel Jasper } 189952ec0c0357ce970ca52a27c1086626450f0967e7Daniel Jasper}) 1900ba243b59a1074e0962f6abfa3bb9aa984eac1245David BlaikieDEF_TRAVERSE_STMT(MSDependentExistsStmt, { 1901ba0513de93d2fab6db5ab30b6927209fcc883078Douglas Gregor TRY_TO(TraverseNestedNameSpecifierLoc(S->getQualifierLoc())); 190265019acfc46ffb191fac4e781ac0c4b8d0c8434eDouglas Gregor TRY_TO(TraverseDeclarationNameInfo(S->getNameInfo())); 1903ba0513de93d2fab6db5ab30b6927209fcc883078Douglas Gregor}) 1904dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_STMT(ReturnStmt, { }) 1905be9aa9614f0f15f2182c9ac5c571a868263131adCraig SilversteinDEF_TRAVERSE_STMT(SwitchStmt, { }) 1906be9aa9614f0f15f2182c9ac5c571a868263131adCraig SilversteinDEF_TRAVERSE_STMT(WhileStmt, { }) 1907be9aa9614f0f15f2182c9ac5c571a868263131adCraig Silverstein 1908dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth 1909dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_STMT(CXXDependentScopeMemberExpr, { 19107c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor TRY_TO(TraverseNestedNameSpecifierLoc(S->getQualifierLoc())); 191165019acfc46ffb191fac4e781ac0c4b8d0c8434eDouglas Gregor TRY_TO(TraverseDeclarationNameInfo(S->getMemberNameInfo())); 1912dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth if (S->hasExplicitTemplateArgs()) { 1913dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth TRY_TO(TraverseTemplateArgumentLocsHelper( 1914dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth S->getTemplateArgs(), S->getNumTemplateArgs())); 1915facfc77487a890bfb7b5eee7e21cd2b395a9faafChandler Carruth } 1916dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth }) 1917dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth 1918dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_STMT(DeclRefExpr, { 191940d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor TRY_TO(TraverseNestedNameSpecifierLoc(S->getQualifierLoc())); 192065019acfc46ffb191fac4e781ac0c4b8d0c8434eDouglas Gregor TRY_TO(TraverseDeclarationNameInfo(S->getNameInfo())); 1921dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth TRY_TO(TraverseTemplateArgumentLocsHelper( 1922dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth S->getTemplateArgs(), S->getNumTemplateArgs())); 1923dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth }) 1924dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth 1925dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_STMT(DependentScopeDeclRefExpr, { 192600cf3cc2718671aa48e8da264a523b0058a8591eDouglas Gregor TRY_TO(TraverseNestedNameSpecifierLoc(S->getQualifierLoc())); 192765019acfc46ffb191fac4e781ac0c4b8d0c8434eDouglas Gregor TRY_TO(TraverseDeclarationNameInfo(S->getNameInfo())); 1928dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth if (S->hasExplicitTemplateArgs()) { 1929dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth TRY_TO(TraverseTemplateArgumentLocsHelper( 1930dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth S->getExplicitTemplateArgs().getTemplateArgs(), 1931dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth S->getNumTemplateArgs())); 1932facfc77487a890bfb7b5eee7e21cd2b395a9faafChandler Carruth } 1933dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth }) 1934dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth 1935dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_STMT(MemberExpr, { 193640d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor TRY_TO(TraverseNestedNameSpecifierLoc(S->getQualifierLoc())); 193765019acfc46ffb191fac4e781ac0c4b8d0c8434eDouglas Gregor TRY_TO(TraverseDeclarationNameInfo(S->getMemberNameInfo())); 1938dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth TRY_TO(TraverseTemplateArgumentLocsHelper( 1939dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth S->getTemplateArgs(), S->getNumTemplateArgs())); 1940facfc77487a890bfb7b5eee7e21cd2b395a9faafChandler Carruth }) 1941facfc77487a890bfb7b5eee7e21cd2b395a9faafChandler Carruth 1942dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_STMT(ImplicitCastExpr, { 1943dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth // We don't traverse the cast type, as it's not written in the 1944dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth // source code. 1945dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth }) 1946facfc77487a890bfb7b5eee7e21cd2b395a9faafChandler Carruth 1947dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_STMT(CStyleCastExpr, { 1948c11e1d7f1eff113b8a4b2a6370975eb1dc7c9205Douglas Gregor TRY_TO(TraverseTypeLoc(S->getTypeInfoAsWritten()->getTypeLoc())); 1949dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth }) 1950dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth 1951dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_STMT(CXXFunctionalCastExpr, { 1952c11e1d7f1eff113b8a4b2a6370975eb1dc7c9205Douglas Gregor TRY_TO(TraverseTypeLoc(S->getTypeInfoAsWritten()->getTypeLoc())); 1953dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth }) 1954dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth 1955dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_STMT(CXXConstCastExpr, { 1956c11e1d7f1eff113b8a4b2a6370975eb1dc7c9205Douglas Gregor TRY_TO(TraverseTypeLoc(S->getTypeInfoAsWritten()->getTypeLoc())); 1957dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth }) 1958dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth 1959dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_STMT(CXXDynamicCastExpr, { 1960c11e1d7f1eff113b8a4b2a6370975eb1dc7c9205Douglas Gregor TRY_TO(TraverseTypeLoc(S->getTypeInfoAsWritten()->getTypeLoc())); 1961dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth }) 1962dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth 1963dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_STMT(CXXReinterpretCastExpr, { 1964c11e1d7f1eff113b8a4b2a6370975eb1dc7c9205Douglas Gregor TRY_TO(TraverseTypeLoc(S->getTypeInfoAsWritten()->getTypeLoc())); 1965dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth }) 1966dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth 1967dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_STMT(CXXStaticCastExpr, { 1968c11e1d7f1eff113b8a4b2a6370975eb1dc7c9205Douglas Gregor TRY_TO(TraverseTypeLoc(S->getTypeInfoAsWritten()->getTypeLoc())); 1969dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth }) 1970dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth 1971ea245e0ba48caf7e7acf870880c030d7ddc76667Craig Silverstein// InitListExpr is a tricky one, because we want to do all our work on 1972ea245e0ba48caf7e7acf870880c030d7ddc76667Craig Silverstein// the syntactic form of the listexpr, but this method takes the 1973ea245e0ba48caf7e7acf870880c030d7ddc76667Craig Silverstein// semantic form by default. We can't use the macro helper because it 1974ea245e0ba48caf7e7acf870880c030d7ddc76667Craig Silverstein// calls WalkUp*() on the semantic form, before our code can convert 1975ea245e0ba48caf7e7acf870880c030d7ddc76667Craig Silverstein// to the syntactic form. 1976ea245e0ba48caf7e7acf870880c030d7ddc76667Craig Silversteintemplate<typename Derived> 1977ea245e0ba48caf7e7acf870880c030d7ddc76667Craig Silversteinbool RecursiveASTVisitor<Derived>::TraverseInitListExpr(InitListExpr *S) { 1978ea245e0ba48caf7e7acf870880c030d7ddc76667Craig Silverstein if (InitListExpr *Syn = S->getSyntacticForm()) 1979ae6de57e6c823471f04a15dbfbbb39449d4d1e56Chris Lattner S = Syn; 1980ea245e0ba48caf7e7acf870880c030d7ddc76667Craig Silverstein TRY_TO(WalkUpFromInitListExpr(S)); 1981ea245e0ba48caf7e7acf870880c030d7ddc76667Craig Silverstein // All we need are the default actions. FIXME: use a helper function. 19827502c1d3ce8bb97bcc4f7bebef507040bd93b26fJohn McCall for (Stmt::child_range range = S->children(); range; ++range) { 198386b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek TRY_TO(TraverseStmt(*range)); 1984ea245e0ba48caf7e7acf870880c030d7ddc76667Craig Silverstein } 1985ea245e0ba48caf7e7acf870880c030d7ddc76667Craig Silverstein return true; 1986ea245e0ba48caf7e7acf870880c030d7ddc76667Craig Silverstein} 1987ea245e0ba48caf7e7acf870880c030d7ddc76667Craig Silverstein 1988f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne// GenericSelectionExpr is a special case because the types and expressions 1989f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne// are interleaved. We also need to watch out for null types (default 1990f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne// generic associations). 1991f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbournetemplate<typename Derived> 1992f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbournebool RecursiveASTVisitor<Derived>:: 1993f111d935722ed488144600cea5ed03a6b5069e8fPeter CollingbourneTraverseGenericSelectionExpr(GenericSelectionExpr *S) { 1994f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne TRY_TO(WalkUpFromGenericSelectionExpr(S)); 199586b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek TRY_TO(TraverseStmt(S->getControllingExpr())); 1996f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne for (unsigned i = 0; i != S->getNumAssocs(); ++i) { 1997f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne if (TypeSourceInfo *TS = S->getAssocTypeSourceInfo(i)) 1998f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne TRY_TO(TraverseTypeLoc(TS->getTypeLoc())); 199986b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek TRY_TO(TraverseStmt(S->getAssocExpr(i))); 2000f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne } 2001f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne return true; 2002f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne} 2003f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne 20044b9c2d235fb9449e249d74f48ecfec601650de93John McCall// PseudoObjectExpr is a special case because of the wierdness with 20054b9c2d235fb9449e249d74f48ecfec601650de93John McCall// syntactic expressions and opaque values. 20064b9c2d235fb9449e249d74f48ecfec601650de93John McCalltemplate<typename Derived> 20074b9c2d235fb9449e249d74f48ecfec601650de93John McCallbool RecursiveASTVisitor<Derived>:: 20084b9c2d235fb9449e249d74f48ecfec601650de93John McCallTraversePseudoObjectExpr(PseudoObjectExpr *S) { 20094b9c2d235fb9449e249d74f48ecfec601650de93John McCall TRY_TO(WalkUpFromPseudoObjectExpr(S)); 201086b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek TRY_TO(TraverseStmt(S->getSyntacticForm())); 20114b9c2d235fb9449e249d74f48ecfec601650de93John McCall for (PseudoObjectExpr::semantics_iterator 20124b9c2d235fb9449e249d74f48ecfec601650de93John McCall i = S->semantics_begin(), e = S->semantics_end(); i != e; ++i) { 20134b9c2d235fb9449e249d74f48ecfec601650de93John McCall Expr *sub = *i; 20144b9c2d235fb9449e249d74f48ecfec601650de93John McCall if (OpaqueValueExpr *OVE = dyn_cast<OpaqueValueExpr>(sub)) 20154b9c2d235fb9449e249d74f48ecfec601650de93John McCall sub = OVE->getSourceExpr(); 201686b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek TRY_TO(TraverseStmt(sub)); 20174b9c2d235fb9449e249d74f48ecfec601650de93John McCall } 20184b9c2d235fb9449e249d74f48ecfec601650de93John McCall return true; 20194b9c2d235fb9449e249d74f48ecfec601650de93John McCall} 20204b9c2d235fb9449e249d74f48ecfec601650de93John McCall 2021ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas GregorDEF_TRAVERSE_STMT(CXXScalarValueInitExpr, { 202280db8cbff5afc047a23dbfe11f7ef787d891feecZhanyong Wan // This is called for code like 'return T()' where T is a built-in 202380db8cbff5afc047a23dbfe11f7ef787d891feecZhanyong Wan // (i.e. non-class) type. 2024ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor TRY_TO(TraverseTypeLoc(S->getTypeSourceInfo()->getTypeLoc())); 2025ea245e0ba48caf7e7acf870880c030d7ddc76667Craig Silverstein }) 2026ea245e0ba48caf7e7acf870880c030d7ddc76667Craig Silverstein 2027ea245e0ba48caf7e7acf870880c030d7ddc76667Craig SilversteinDEF_TRAVERSE_STMT(CXXNewExpr, { 20281bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor // The child-iterator will pick up the other arguments. 20291bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor TRY_TO(TraverseTypeLoc(S->getAllocatedTypeSourceInfo()->getTypeLoc())); 2030ea245e0ba48caf7e7acf870880c030d7ddc76667Craig Silverstein }) 2031ea245e0ba48caf7e7acf870880c030d7ddc76667Craig Silverstein 2032cf4679e60a5c5fa13e4bfe69f8186658c828af49Craig SilversteinDEF_TRAVERSE_STMT(OffsetOfExpr, { 2033cf4679e60a5c5fa13e4bfe69f8186658c828af49Craig Silverstein // The child-iterator will pick up the expression representing 2034cf4679e60a5c5fa13e4bfe69f8186658c828af49Craig Silverstein // the field. 2035cf4679e60a5c5fa13e4bfe69f8186658c828af49Craig Silverstein // FIMXE: for code like offsetof(Foo, a.b.c), should we get 2036cf4679e60a5c5fa13e4bfe69f8186658c828af49Craig Silverstein // making a MemberExpr callbacks for Foo.a, Foo.a.b, and Foo.a.b.c? 2037cf4679e60a5c5fa13e4bfe69f8186658c828af49Craig Silverstein TRY_TO(TraverseTypeLoc(S->getTypeSourceInfo()->getTypeLoc())); 2038cf4679e60a5c5fa13e4bfe69f8186658c828af49Craig Silverstein }) 2039cf4679e60a5c5fa13e4bfe69f8186658c828af49Craig Silverstein 2040f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter CollingbourneDEF_TRAVERSE_STMT(UnaryExprOrTypeTraitExpr, { 2041cf4679e60a5c5fa13e4bfe69f8186658c828af49Craig Silverstein // The child-iterator will pick up the arg if it's an expression, 2042cf4679e60a5c5fa13e4bfe69f8186658c828af49Craig Silverstein // but not if it's a type. 2043cf4679e60a5c5fa13e4bfe69f8186658c828af49Craig Silverstein if (S->isArgumentType()) 2044cf4679e60a5c5fa13e4bfe69f8186658c828af49Craig Silverstein TRY_TO(TraverseTypeLoc(S->getArgumentTypeInfo()->getTypeLoc())); 2045cf4679e60a5c5fa13e4bfe69f8186658c828af49Craig Silverstein }) 2046cf4679e60a5c5fa13e4bfe69f8186658c828af49Craig Silverstein 204727de0f2cb3e8c26c37f31e61929b0e442c809ca5Craig SilversteinDEF_TRAVERSE_STMT(CXXTypeidExpr, { 204827de0f2cb3e8c26c37f31e61929b0e442c809ca5Craig Silverstein // The child-iterator will pick up the arg if it's an expression, 204901b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet // but not if it's a type. 205001b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet if (S->isTypeOperand()) 205101b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet TRY_TO(TraverseTypeLoc(S->getTypeOperandSourceInfo()->getTypeLoc())); 205201b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet }) 205301b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet 205401b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois PichetDEF_TRAVERSE_STMT(CXXUuidofExpr, { 205501b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet // The child-iterator will pick up the arg if it's an expression, 205627de0f2cb3e8c26c37f31e61929b0e442c809ca5Craig Silverstein // but not if it's a type. 205727de0f2cb3e8c26c37f31e61929b0e442c809ca5Craig Silverstein if (S->isTypeOperand()) 205827de0f2cb3e8c26c37f31e61929b0e442c809ca5Craig Silverstein TRY_TO(TraverseTypeLoc(S->getTypeOperandSourceInfo()->getTypeLoc())); 205927de0f2cb3e8c26c37f31e61929b0e442c809ca5Craig Silverstein }) 206027de0f2cb3e8c26c37f31e61929b0e442c809ca5Craig Silverstein 2061cf4679e60a5c5fa13e4bfe69f8186658c828af49Craig SilversteinDEF_TRAVERSE_STMT(UnaryTypeTraitExpr, { 20623d37c0ada0e46b87be0a10e8d52d990a97d3907aDouglas Gregor TRY_TO(TraverseTypeLoc(S->getQueriedTypeSourceInfo()->getTypeLoc())); 2063cf4679e60a5c5fa13e4bfe69f8186658c828af49Craig Silverstein }) 2064cf4679e60a5c5fa13e4bfe69f8186658c828af49Craig Silverstein 20656ad6f2848d7652ab2991286eb48be440d3493b28Francois PichetDEF_TRAVERSE_STMT(BinaryTypeTraitExpr, { 20666ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet TRY_TO(TraverseTypeLoc(S->getLhsTypeSourceInfo()->getTypeLoc())); 20676ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet TRY_TO(TraverseTypeLoc(S->getRhsTypeSourceInfo()->getTypeLoc())); 20686ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet }) 20696ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet 20704ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas GregorDEF_TRAVERSE_STMT(TypeTraitExpr, { 20714ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor for (unsigned I = 0, N = S->getNumArgs(); I != N; ++I) 20724ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor TRY_TO(TraverseTypeLoc(S->getArg(I)->getTypeLoc())); 20734ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor}) 20744ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor 207521ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John WiegleyDEF_TRAVERSE_STMT(ArrayTypeTraitExpr, { 207621ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley TRY_TO(TraverseTypeLoc(S->getQueriedTypeSourceInfo()->getTypeLoc())); 207721ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley }) 207821ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley 2079552622067dc45013d240f73952fece703f5e63bdJohn WiegleyDEF_TRAVERSE_STMT(ExpressionTraitExpr, { 208086b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek TRY_TO(TraverseStmt(S->getQueriedExpression())); 2081552622067dc45013d240f73952fece703f5e63bdJohn Wiegley }) 2082552622067dc45013d240f73952fece703f5e63bdJohn Wiegley 2083ac45ad57f0641b0d556ca27d19a59930925d6addCraig SilversteinDEF_TRAVERSE_STMT(VAArgExpr, { 2084ac45ad57f0641b0d556ca27d19a59930925d6addCraig Silverstein // The child-iterator will pick up the expression argument. 2085ac45ad57f0641b0d556ca27d19a59930925d6addCraig Silverstein TRY_TO(TraverseTypeLoc(S->getWrittenTypeInfo()->getTypeLoc())); 2086ac45ad57f0641b0d556ca27d19a59930925d6addCraig Silverstein }) 2087ac45ad57f0641b0d556ca27d19a59930925d6addCraig Silverstein 2088ac45ad57f0641b0d556ca27d19a59930925d6addCraig SilversteinDEF_TRAVERSE_STMT(CXXTemporaryObjectExpr, { 2089ac45ad57f0641b0d556ca27d19a59930925d6addCraig Silverstein // This is called for code like 'return T()' where T is a class type. 2090ac45ad57f0641b0d556ca27d19a59930925d6addCraig Silverstein TRY_TO(TraverseTypeLoc(S->getTypeSourceInfo()->getTypeLoc())); 2091ac45ad57f0641b0d556ca27d19a59930925d6addCraig Silverstein }) 2092ac45ad57f0641b0d556ca27d19a59930925d6addCraig Silverstein 2093011d8b93b7cfa8492b8a9c909a850d6577e08dcaDouglas Gregor// Walk only the visible parts of lambda expressions. 2094011d8b93b7cfa8492b8a9c909a850d6577e08dcaDouglas Gregortemplate<typename Derived> 2095011d8b93b7cfa8492b8a9c909a850d6577e08dcaDouglas Gregorbool RecursiveASTVisitor<Derived>::TraverseLambdaExpr(LambdaExpr *S) { 2096011d8b93b7cfa8492b8a9c909a850d6577e08dcaDouglas Gregor for (LambdaExpr::capture_iterator C = S->explicit_capture_begin(), 2097011d8b93b7cfa8492b8a9c909a850d6577e08dcaDouglas Gregor CEnd = S->explicit_capture_end(); 2098011d8b93b7cfa8492b8a9c909a850d6577e08dcaDouglas Gregor C != CEnd; ++C) { 2099011d8b93b7cfa8492b8a9c909a850d6577e08dcaDouglas Gregor TRY_TO(TraverseLambdaCapture(*C)); 2100011d8b93b7cfa8492b8a9c909a850d6577e08dcaDouglas Gregor } 2101011d8b93b7cfa8492b8a9c909a850d6577e08dcaDouglas Gregor 2102011d8b93b7cfa8492b8a9c909a850d6577e08dcaDouglas Gregor if (S->hasExplicitParameters() || S->hasExplicitResultType()) { 2103011d8b93b7cfa8492b8a9c909a850d6577e08dcaDouglas Gregor TypeLoc TL = S->getCallOperator()->getTypeSourceInfo()->getTypeLoc(); 2104011d8b93b7cfa8492b8a9c909a850d6577e08dcaDouglas Gregor if (S->hasExplicitParameters() && S->hasExplicitResultType()) { 2105011d8b93b7cfa8492b8a9c909a850d6577e08dcaDouglas Gregor // Visit the whole type. 2106011d8b93b7cfa8492b8a9c909a850d6577e08dcaDouglas Gregor TRY_TO(TraverseTypeLoc(TL)); 2107011d8b93b7cfa8492b8a9c909a850d6577e08dcaDouglas Gregor } else if (isa<FunctionProtoTypeLoc>(TL)) { 2108011d8b93b7cfa8492b8a9c909a850d6577e08dcaDouglas Gregor FunctionProtoTypeLoc Proto = cast<FunctionProtoTypeLoc>(TL); 2109011d8b93b7cfa8492b8a9c909a850d6577e08dcaDouglas Gregor if (S->hasExplicitParameters()) { 2110011d8b93b7cfa8492b8a9c909a850d6577e08dcaDouglas Gregor // Visit parameters. 2111011d8b93b7cfa8492b8a9c909a850d6577e08dcaDouglas Gregor for (unsigned I = 0, N = Proto.getNumArgs(); I != N; ++I) { 2112011d8b93b7cfa8492b8a9c909a850d6577e08dcaDouglas Gregor TRY_TO(TraverseDecl(Proto.getArg(I))); 2113011d8b93b7cfa8492b8a9c909a850d6577e08dcaDouglas Gregor } 2114011d8b93b7cfa8492b8a9c909a850d6577e08dcaDouglas Gregor } else { 2115011d8b93b7cfa8492b8a9c909a850d6577e08dcaDouglas Gregor TRY_TO(TraverseTypeLoc(Proto.getResultLoc())); 2116011d8b93b7cfa8492b8a9c909a850d6577e08dcaDouglas Gregor } 2117011d8b93b7cfa8492b8a9c909a850d6577e08dcaDouglas Gregor } 2118011d8b93b7cfa8492b8a9c909a850d6577e08dcaDouglas Gregor } 2119011d8b93b7cfa8492b8a9c909a850d6577e08dcaDouglas Gregor 212086b32fd702d794bb655c59a1238bf7422869f506Ted Kremenek TRY_TO(TraverseStmt(S->getBody())); 2121011d8b93b7cfa8492b8a9c909a850d6577e08dcaDouglas Gregor return true; 2122011d8b93b7cfa8492b8a9c909a850d6577e08dcaDouglas Gregor} 212301d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor 2124ac45ad57f0641b0d556ca27d19a59930925d6addCraig SilversteinDEF_TRAVERSE_STMT(CXXUnresolvedConstructExpr, { 2125ac45ad57f0641b0d556ca27d19a59930925d6addCraig Silverstein // This is called for code like 'T()', where T is a template argument. 2126ac45ad57f0641b0d556ca27d19a59930925d6addCraig Silverstein TRY_TO(TraverseTypeLoc(S->getTypeSourceInfo()->getTypeLoc())); 2127ac45ad57f0641b0d556ca27d19a59930925d6addCraig Silverstein }) 2128ac45ad57f0641b0d556ca27d19a59930925d6addCraig Silverstein 2129ac45ad57f0641b0d556ca27d19a59930925d6addCraig Silverstein// These expressions all might take explicit template arguments. 2130ac45ad57f0641b0d556ca27d19a59930925d6addCraig Silverstein// We traverse those if so. FIXME: implement these. 2131ac45ad57f0641b0d556ca27d19a59930925d6addCraig SilversteinDEF_TRAVERSE_STMT(CXXConstructExpr, { }) 2132ac45ad57f0641b0d556ca27d19a59930925d6addCraig SilversteinDEF_TRAVERSE_STMT(CallExpr, { }) 2133ac45ad57f0641b0d556ca27d19a59930925d6addCraig SilversteinDEF_TRAVERSE_STMT(CXXMemberCallExpr, { }) 2134ac45ad57f0641b0d556ca27d19a59930925d6addCraig Silverstein 2135dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth// These exprs (most of them), do not need any action except iterating 2136dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth// over the children. 2137dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_STMT(AddrLabelExpr, { }) 2138dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_STMT(ArraySubscriptExpr, { }) 2139336f51e463340dc7b159bc38517ac4a68081302dArgyrios KyrtzidisDEF_TRAVERSE_STMT(BlockExpr, { 2140336f51e463340dc7b159bc38517ac4a68081302dArgyrios Kyrtzidis TRY_TO(TraverseDecl(S->getBlockDecl())); 2141336f51e463340dc7b159bc38517ac4a68081302dArgyrios Kyrtzidis return true; // no child statements to loop through. 2142336f51e463340dc7b159bc38517ac4a68081302dArgyrios Kyrtzidis}) 2143dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_STMT(ChooseExpr, { }) 214482b4550fb25ad578b6c8143b87a003fae7106caeRichard SmithDEF_TRAVERSE_STMT(CompoundLiteralExpr, { 214582b4550fb25ad578b6c8143b87a003fae7106caeRichard Smith TRY_TO(TraverseTypeLoc(S->getTypeSourceInfo()->getTypeLoc())); 214682b4550fb25ad578b6c8143b87a003fae7106caeRichard Smith}) 2147dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_STMT(CXXBindTemporaryExpr, { }) 2148dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_STMT(CXXBoolLiteralExpr, { }) 2149dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_STMT(CXXDefaultArgExpr, { }) 2150dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_STMT(CXXDeleteExpr, { }) 21514765fa05b5652fcc4356371c2f481d0ea9a1b007John McCallDEF_TRAVERSE_STMT(ExprWithCleanups, { }) 2152dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_STMT(CXXNullPtrLiteralExpr, { }) 2153ba243b59a1074e0962f6abfa3bb9aa984eac1245David BlaikieDEF_TRAVERSE_STMT(CXXPseudoDestructorExpr, { 2154f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor TRY_TO(TraverseNestedNameSpecifierLoc(S->getQualifierLoc())); 215510ffc00e2177f042808f507c8dd50b744ed6f738Douglas Gregor if (TypeSourceInfo *ScopeInfo = S->getScopeTypeInfo()) 215610ffc00e2177f042808f507c8dd50b744ed6f738Douglas Gregor TRY_TO(TraverseTypeLoc(ScopeInfo->getTypeLoc())); 215710ffc00e2177f042808f507c8dd50b744ed6f738Douglas Gregor if (TypeSourceInfo *DestroyedTypeInfo = S->getDestroyedTypeInfo()) 215810ffc00e2177f042808f507c8dd50b744ed6f738Douglas Gregor TRY_TO(TraverseTypeLoc(DestroyedTypeInfo->getTypeLoc())); 215910ffc00e2177f042808f507c8dd50b744ed6f738Douglas Gregor}) 2160dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_STMT(CXXThisExpr, { }) 2161dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_STMT(CXXThrowExpr, { }) 21629fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard SmithDEF_TRAVERSE_STMT(UserDefinedLiteral, { }) 2163dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_STMT(DesignatedInitExpr, { }) 2164dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_STMT(ExtVectorElementExpr, { }) 2165dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_STMT(GNUNullExpr, { }) 2166dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_STMT(ImplicitValueInitExpr, { }) 2167ebcb57a8d298862c65043e88b2429591ab3c58d3Ted KremenekDEF_TRAVERSE_STMT(ObjCBoolLiteralExpr, { }) 216887014f33f123461a012995b2f7eb5e6ecf6dc461Argyrios KyrtzidisDEF_TRAVERSE_STMT(ObjCEncodeExpr, { 216987014f33f123461a012995b2f7eb5e6ecf6dc461Argyrios Kyrtzidis if (TypeSourceInfo *TInfo = S->getEncodedTypeSourceInfo()) 217087014f33f123461a012995b2f7eb5e6ecf6dc461Argyrios Kyrtzidis TRY_TO(TraverseTypeLoc(TInfo->getTypeLoc())); 217187014f33f123461a012995b2f7eb5e6ecf6dc461Argyrios Kyrtzidis}) 2172dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_STMT(ObjCIsaExpr, { }) 2173dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_STMT(ObjCIvarRefExpr, { }) 2174dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_STMT(ObjCMessageExpr, { }) 2175dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_STMT(ObjCPropertyRefExpr, { }) 2176ebcb57a8d298862c65043e88b2429591ab3c58d3Ted KremenekDEF_TRAVERSE_STMT(ObjCSubscriptRefExpr, { }) 2177dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_STMT(ObjCProtocolExpr, { }) 2178dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_STMT(ObjCSelectorExpr, { }) 2179f85e193739c953358c865005855253af4f68a497John McCallDEF_TRAVERSE_STMT(ObjCIndirectCopyRestoreExpr, { }) 2180f85e193739c953358c865005855253af4f68a497John McCallDEF_TRAVERSE_STMT(ObjCBridgedCastExpr, { 2181f85e193739c953358c865005855253af4f68a497John McCall TRY_TO(TraverseTypeLoc(S->getTypeInfoAsWritten()->getTypeLoc())); 2182f85e193739c953358c865005855253af4f68a497John McCall}) 2183dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_STMT(ParenExpr, { }) 2184dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_STMT(ParenListExpr, { }) 2185dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_STMT(PredefinedExpr, { }) 2186dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_STMT(ShuffleVectorExpr, { }) 2187dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_STMT(StmtExpr, { }) 2188d3731198193eee92796ddeb493973b7a598b003eDouglas GregorDEF_TRAVERSE_STMT(UnresolvedLookupExpr, { 21894c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor TRY_TO(TraverseNestedNameSpecifierLoc(S->getQualifierLoc())); 219066cf92a9670d57da61842adb69f9b038ce29dca5Matt Beaumont-Gay if (S->hasExplicitTemplateArgs()) { 2191ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie TRY_TO(TraverseTemplateArgumentLocsHelper(S->getTemplateArgs(), 219266cf92a9670d57da61842adb69f9b038ce29dca5Matt Beaumont-Gay S->getNumTemplateArgs())); 219366cf92a9670d57da61842adb69f9b038ce29dca5Matt Beaumont-Gay } 2194d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor}) 2195ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 2196d3731198193eee92796ddeb493973b7a598b003eDouglas GregorDEF_TRAVERSE_STMT(UnresolvedMemberExpr, { 21974c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor TRY_TO(TraverseNestedNameSpecifierLoc(S->getQualifierLoc())); 219866cf92a9670d57da61842adb69f9b038ce29dca5Matt Beaumont-Gay if (S->hasExplicitTemplateArgs()) { 2199ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie TRY_TO(TraverseTemplateArgumentLocsHelper(S->getTemplateArgs(), 220066cf92a9670d57da61842adb69f9b038ce29dca5Matt Beaumont-Gay S->getNumTemplateArgs())); 220166cf92a9670d57da61842adb69f9b038ce29dca5Matt Beaumont-Gay } 2202d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor}) 2203d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor 220428bbe4b8acc338476fe0825769b41fb32b423c72John WiegleyDEF_TRAVERSE_STMT(SEHTryStmt, {}) 220528bbe4b8acc338476fe0825769b41fb32b423c72John WiegleyDEF_TRAVERSE_STMT(SEHExceptStmt, {}) 220628bbe4b8acc338476fe0825769b41fb32b423c72John WiegleyDEF_TRAVERSE_STMT(SEHFinallyStmt,{}) 220728bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley 2208dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_STMT(CXXOperatorCallExpr, { }) 22097cd7d1ad33fdf49eef83942e8855fe20d95aa1b9John McCallDEF_TRAVERSE_STMT(OpaqueValueExpr, { }) 2210e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter CollingbourneDEF_TRAVERSE_STMT(CUDAKernelCallExpr, { }) 2211dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth 2212dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth// These operators (all of them) do not need any action except 2213dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth// iterating over the children. 221456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCallDEF_TRAVERSE_STMT(BinaryConditionalOperator, { }) 2215dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_STMT(ConditionalOperator, { }) 2216dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_STMT(UnaryOperator, { }) 2217dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_STMT(BinaryOperator, { }) 2218dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_STMT(CompoundAssignOperator, { }) 22192e156225a29407a50dd19041aa5750171ad44ea3Sebastian RedlDEF_TRAVERSE_STMT(CXXNoexceptExpr, { }) 2220be230c36e32142cbdcdbe9c97511d097beeecbabDouglas GregorDEF_TRAVERSE_STMT(PackExpansionExpr, { }) 2221ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas GregorDEF_TRAVERSE_STMT(SizeOfPackExpr, { }) 2222c7793c73ba8a343de3f2552d984851985a46f159Douglas GregorDEF_TRAVERSE_STMT(SubstNonTypeTemplateParmPackExpr, { }) 222391a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCallDEF_TRAVERSE_STMT(SubstNonTypeTemplateParmExpr, { }) 222403e80030515c800d1ab44125b9052dfffd1bd04cDouglas GregorDEF_TRAVERSE_STMT(MaterializeTemporaryExpr, { }) 2225276b061970939293f1abaf694bd3ef05b2cbda79Eli FriedmanDEF_TRAVERSE_STMT(AtomicExpr, { }) 2226dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth 2227dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth// These literals (all of them) do not need any action. 2228dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_STMT(IntegerLiteral, { }) 2229dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_STMT(CharacterLiteral, { }) 2230dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_STMT(FloatingLiteral, { }) 2231dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_STMT(ImaginaryLiteral, { }) 2232dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_STMT(StringLiteral, { }) 2233dfc35e33177a433b56454f1d2b5e53734f65b288Chandler CarruthDEF_TRAVERSE_STMT(ObjCStringLiteral, { }) 2234eb382ec1507cf2c8c12d7443d0b67c076223aec6Patrick BeardDEF_TRAVERSE_STMT(ObjCBoxedExpr, { }) 2235ebcb57a8d298862c65043e88b2429591ab3c58d3Ted KremenekDEF_TRAVERSE_STMT(ObjCArrayLiteral, { }) 2236ebcb57a8d298862c65043e88b2429591ab3c58d3Ted KremenekDEF_TRAVERSE_STMT(ObjCDictionaryLiteral, { }) 2237ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek 223861eee0ca33b29e102f11bab77c8b74cc00e2392bTanya Lattner// Traverse OpenCL: AsType, Convert. 223961eee0ca33b29e102f11bab77c8b74cc00e2392bTanya LattnerDEF_TRAVERSE_STMT(AsTypeExpr, { }) 2240dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth 2241dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth// FIXME: look at the following tricky-seeming exprs to see if we 2242dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth// need to recurse on anything. These are ones that have methods 2243dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth// returning decls or qualtypes or nestednamespecifier -- though I'm 2244dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth// not sure if they own them -- or just seemed very complicated, or 2245dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth// had lots of sub-types to explore. 2246dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth// 2247dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth// VisitOverloadExpr and its children: recurse on template args? etc? 2248dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth 2249dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth// FIXME: go through all the stmts and exprs again, and see which of them 2250dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth// create new types, and recurse on the types (TypeLocs?) of those. 2251dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth// Candidates: 22522ac54ec0a8ad305fdd76847c2fd6631cfb7baa82Zhanyong Wan// 2253dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth// http://clang.llvm.org/doxygen/classclang_1_1CXXTypeidExpr.html 2254f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne// http://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html 2255dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth// http://clang.llvm.org/doxygen/classclang_1_1TypesCompatibleExpr.html 2256dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth// Every class that has getQualifier. 2257dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth 2258dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth#undef DEF_TRAVERSE_STMT 2259dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth 2260dfc35e33177a433b56454f1d2b5e53734f65b288Chandler Carruth#undef TRY_TO 2261facfc77487a890bfb7b5eee7e21cd2b395a9faafChandler Carruth 2262d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor} // end namespace clang 2263d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor 2264d30bf2eb6d6bbebd41236bf205d3a6dfc51a3659Douglas Gregor#endif // LLVM_CLANG_AST_RECURSIVEASTVISITOR_H 2265