TypeLoc.h revision 68006af18fb880cd8547ce797152111b810aa0ba
1b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis//===--- TypeLoc.h - Type Source Info Wrapper -------------------*- C++ -*-===//
2b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis//
3b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis//                     The LLVM Compiler Infrastructure
4b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis//
5b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis// This file is distributed under the University of Illinois Open Source
6b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis// License. See LICENSE.TXT for details.
7b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis//
8b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis//===----------------------------------------------------------------------===//
9b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis//
10b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis//  This file defines the TypeLoc interface and subclasses.
11b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis//
12b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis//===----------------------------------------------------------------------===//
13b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis
14b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis#ifndef LLVM_CLANG_AST_TYPELOC_H
15b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis#define LLVM_CLANG_AST_TYPELOC_H
16b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis
17b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis#include "clang/AST/Type.h"
18b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis#include "clang/AST/TypeVisitor.h"
19b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis
20b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidisnamespace clang {
21b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  class ParmVarDecl;
22b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  class TypeSpecLoc;
23b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  class DeclaratorInfo;
24b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis
25b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis/// \brief Base wrapper for a particular "section" of type source info.
26b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis///
27b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis/// A client should use the TypeLoc subclasses through cast/dyn_cast in order to
28b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis/// get at the actual information.
29b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidisclass TypeLoc {
30b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidisprotected:
31b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  QualType Ty;
32b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  void *Data;
331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
34b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidispublic:
35b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  TypeLoc() : Data(0) { }
36b735471f3848065120d7210e557b5f0d37ed4c43Argyrios Kyrtzidis  TypeLoc(QualType ty, void *opaqueData) : Ty(ty), Data(opaqueData) { }
37b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis
38b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  bool isNull() const { return Ty.isNull(); }
3919a97e27a545959ee9b395a96140661148a6b5b0Argyrios Kyrtzidis  operator bool() const { return !isNull(); }
40b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis
41b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  /// \brief Returns the size of type source info data block for the given type.
42b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  static unsigned getFullDataSizeForType(QualType Ty);
43b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis
44b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  /// \brief Get the type for which this source info wrapper provides
45b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  /// information.
46b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  QualType getSourceType() const { return Ty; }
47b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis
48b735471f3848065120d7210e557b5f0d37ed4c43Argyrios Kyrtzidis  /// \brief Get the pointer where source information is stored.
49b735471f3848065120d7210e557b5f0d37ed4c43Argyrios Kyrtzidis  void *getOpaqueData() const { return Data; }
50b735471f3848065120d7210e557b5f0d37ed4c43Argyrios Kyrtzidis
5168006af18fb880cd8547ce797152111b810aa0baArgyrios Kyrtzidis  SourceRange getSourceRange() const;
5268006af18fb880cd8547ce797152111b810aa0baArgyrios Kyrtzidis
53b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  /// \brief Find the TypeSpecLoc that is part of this TypeLoc.
54b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  TypeSpecLoc getTypeSpecLoc() const;
55b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis
56b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  /// \brief Find the TypeSpecLoc that is part of this TypeLoc and return its
57b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  /// SourceRange.
58b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  SourceRange getTypeSpecRange() const;
59b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis
60b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  /// \brief Returns the size of the type source info data block.
61b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  unsigned getFullDataSize() const;
62b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis
63b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  /// \brief Get the next TypeLoc pointed by this TypeLoc, e.g for "int*" the
64b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  /// TypeLoc is a PointerLoc and next TypeLoc is for "int".
65b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  TypeLoc getNextTypeLoc() const;
66b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis
67b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  friend bool operator==(const TypeLoc &LHS, const TypeLoc &RHS) {
68b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis    return LHS.Ty == RHS.Ty && LHS.Data == RHS.Data;
69b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  }
70b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis
71b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  friend bool operator!=(const TypeLoc &LHS, const TypeLoc &RHS) {
72b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis    return !(LHS == RHS);
73b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  }
74b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis
75b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  static bool classof(const TypeLoc *TL) { return true; }
76b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis};
77b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis
78b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis/// \brief Base wrapper of type source info data for type-spec types.
79b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidisclass TypeSpecLoc : public TypeLoc  {
80b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidispublic:
81b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  static bool classof(const TypeLoc *TL);
82b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  static bool classof(const TypeSpecLoc *TL) { return true; }
83b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis};
84b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis
85b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis/// \brief Base wrapper of type source info data for types part of a declarator,
86b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis/// excluding type-spec types.
87b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidisclass DeclaratorLoc : public TypeLoc  {
88b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidispublic:
89b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  /// \brief Find the TypeSpecLoc that is part of this DeclaratorLoc.
901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  TypeSpecLoc getTypeSpecLoc() const;
91b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis
92b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  static bool classof(const TypeLoc *TL);
93b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  static bool classof(const DeclaratorLoc *TL) { return true; }
94b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis};
95b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis
96b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis/// \brief The default wrapper for type-spec types that are not handled by
97b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis/// another specific wrapper.
98b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidisclass DefaultTypeSpecLoc : public TypeSpecLoc {
99b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  struct Info {
100b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis    SourceLocation StartLoc;
101b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  };
1021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
103b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidispublic:
104b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  SourceLocation getStartLoc() const {
105b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis    return static_cast<Info*>(Data)->StartLoc;
106b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  }
107b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  void setStartLoc(SourceLocation Loc) {
108b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis    static_cast<Info*>(Data)->StartLoc = Loc;
109b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  }
110b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  SourceRange getSourceRange() const {
111b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis    return SourceRange(getStartLoc(), getStartLoc());
112b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  }
113b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis
114b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  /// \brief Returns the size of the type source info data block that is
115b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  /// specific to this type.
116b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  unsigned getLocalDataSize() const { return sizeof(Info); }
117b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis
118b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  /// \brief Returns the size of the type source info data block.
119b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  unsigned getFullDataSize() const { return getLocalDataSize(); }
120b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis
121b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  static bool classof(const TypeLoc *TL);
122b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  static bool classof(const DefaultTypeSpecLoc *TL) { return true; }
123b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis};
124b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis
125b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis/// \brief Wrapper for source info for typedefs.
126b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidisclass TypedefLoc : public TypeSpecLoc {
127b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  struct Info {
128b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis    SourceLocation NameLoc;
129b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  };
130b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis
131b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidispublic:
132b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  SourceLocation getNameLoc() const {
133b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis    return static_cast<Info*>(Data)->NameLoc;
134b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  }
135b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  void setNameLoc(SourceLocation Loc) {
136b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis    static_cast<Info*>(Data)->NameLoc = Loc;
137b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  }
138b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  SourceRange getSourceRange() const {
139b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis    return SourceRange(getNameLoc(), getNameLoc());
140b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  }
1411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
142b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  /// \brief Returns the size of the type source info data block that is
143b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  /// specific to this type.
144b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  unsigned getLocalDataSize() const { return sizeof(Info); }
145b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis
146b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  /// \brief Returns the size of the type source info data block.
147b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  unsigned getFullDataSize() const { return getLocalDataSize(); }
148b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis
149b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  static bool classof(const TypeLoc *TL);
150b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  static bool classof(const TypedefLoc *TL) { return true; }
151b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis};
152b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis
153b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis/// \brief Wrapper for source info for pointers.
154b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidisclass PointerLoc : public DeclaratorLoc {
155b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  struct Info {
156b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis    SourceLocation StarLoc;
157b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  };
158b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis
159b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidispublic:
160b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  SourceLocation getStarLoc() const {
161b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis    return static_cast<Info*>(Data)->StarLoc;
162b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  }
163b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  void setStarLoc(SourceLocation Loc) {
164b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis    static_cast<Info*>(Data)->StarLoc = Loc;
165b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  }
166b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis
167b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  TypeLoc getPointeeLoc() const {
168b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis    void *Next = static_cast<char*>(Data) + getLocalDataSize();
169b735471f3848065120d7210e557b5f0d37ed4c43Argyrios Kyrtzidis    return TypeLoc(cast<PointerType>(Ty)->getPointeeType(), Next);
170b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  }
171b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis
172b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  /// \brief Find the TypeSpecLoc that is part of this PointerLoc.
173b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  TypeSpecLoc getTypeSpecLoc() const {
174b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis    return getPointeeLoc().getTypeSpecLoc();
175b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  }
176b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis
177b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  SourceRange getSourceRange() const {
178b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis    return SourceRange(getStarLoc(), getStarLoc());
179b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  }
180b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis
181b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  /// \brief Returns the size of the type source info data block that is
182b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  /// specific to this type.
183b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  unsigned getLocalDataSize() const { return sizeof(Info); }
184b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis
185b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  /// \brief Returns the size of the type source info data block.
186b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  unsigned getFullDataSize() const {
187b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis    return getLocalDataSize() + getPointeeLoc().getFullDataSize();
188b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  }
189b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis
190b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  static bool classof(const TypeLoc *TL);
191b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  static bool classof(const PointerLoc *TL) { return true; }
192b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis};
193b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis
194b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis/// \brief Wrapper for source info for block pointers.
195b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidisclass BlockPointerLoc : public DeclaratorLoc {
196b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  struct Info {
197b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis    SourceLocation CaretLoc;
198b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  };
199b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis
200b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidispublic:
201b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  SourceLocation getCaretLoc() const {
202b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis    return static_cast<Info*>(Data)->CaretLoc;
203b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  }
204b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  void setCaretLoc(SourceLocation Loc) {
205b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis    static_cast<Info*>(Data)->CaretLoc = Loc;
206b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  }
207b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis
208b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  TypeLoc getPointeeLoc() const {
209b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis    void *Next = static_cast<char*>(Data) + getLocalDataSize();
210b735471f3848065120d7210e557b5f0d37ed4c43Argyrios Kyrtzidis    return TypeLoc(cast<BlockPointerType>(Ty)->getPointeeType(), Next);
211b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  }
212b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis
213b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  /// \brief Find the TypeSpecLoc that is part of this BlockPointerLoc.
214b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  TypeSpecLoc getTypeSpecLoc() const {
215b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis    return getPointeeLoc().getTypeSpecLoc();
216b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  }
217b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis
218b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  SourceRange getSourceRange() const {
219b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis    return SourceRange(getCaretLoc(), getCaretLoc());
220b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  }
221b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis
222b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  /// \brief Returns the size of the type source info data block that is
223b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  /// specific to this type.
224b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  unsigned getLocalDataSize() const { return sizeof(Info); }
225b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis
226b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  /// \brief Returns the size of the type source info data block.
227b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  unsigned getFullDataSize() const {
228b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis    return getLocalDataSize() + getPointeeLoc().getFullDataSize();
229b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  }
230b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis
231b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  static bool classof(const TypeLoc *TL);
232b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  static bool classof(const BlockPointerLoc *TL) { return true; }
233b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis};
234b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis
235b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis/// \brief Wrapper for source info for member pointers.
236b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidisclass MemberPointerLoc : public DeclaratorLoc {
237b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  struct Info {
238b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis    SourceLocation StarLoc;
239b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  };
240b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis
241b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidispublic:
242b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  SourceLocation getStarLoc() const {
243b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis    return static_cast<Info*>(Data)->StarLoc;
244b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  }
245b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  void setStarLoc(SourceLocation Loc) {
246b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis    static_cast<Info*>(Data)->StarLoc = Loc;
247b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  }
248b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis
249b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  TypeLoc getPointeeLoc() const {
250b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis    void *Next = static_cast<char*>(Data) + getLocalDataSize();
251b735471f3848065120d7210e557b5f0d37ed4c43Argyrios Kyrtzidis    return TypeLoc(cast<MemberPointerType>(Ty)->getPointeeType(), Next);
252b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  }
253b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis
254b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  /// \brief Find the TypeSpecLoc that is part of this MemberPointerLoc.
255b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  TypeSpecLoc getTypeSpecLoc() const {
256b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis    return getPointeeLoc().getTypeSpecLoc();
257b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  }
258b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis
259b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  SourceRange getSourceRange() const {
260b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis    return SourceRange(getStarLoc(), getStarLoc());
261b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  }
262b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis
263b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  /// \brief Returns the size of the type source info data block that is
264b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  /// specific to this type.
265b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  unsigned getLocalDataSize() const { return sizeof(Info); }
266b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis
267b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  /// \brief Returns the size of the type source info data block.
268b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  unsigned getFullDataSize() const {
269b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis    return getLocalDataSize() + getPointeeLoc().getFullDataSize();
270b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  }
271b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis
272b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  static bool classof(const TypeLoc *TL);
273b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  static bool classof(const MemberPointerLoc *TL) { return true; }
274b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis};
275b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis
276b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis/// \brief Wrapper for source info for references.
277b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidisclass ReferenceLoc : public DeclaratorLoc {
278b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  struct Info {
279b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis    SourceLocation AmpLoc;
280b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  };
281b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis
282b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidispublic:
283b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  SourceLocation getAmpLoc() const {
284b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis    return static_cast<Info*>(Data)->AmpLoc;
285b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  }
286b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  void setAmpLoc(SourceLocation Loc) {
287b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis    static_cast<Info*>(Data)->AmpLoc = Loc;
288b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  }
289b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis
290b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  TypeLoc getPointeeLoc() const {
291b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis    void *Next = static_cast<char*>(Data) + getLocalDataSize();
292b735471f3848065120d7210e557b5f0d37ed4c43Argyrios Kyrtzidis    return TypeLoc(cast<ReferenceType>(Ty)->getPointeeType(), Next);
293b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  }
294b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis
295b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  /// \brief Find the TypeSpecLoc that is part of this ReferenceLoc.
296b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  TypeSpecLoc getTypeSpecLoc() const {
297b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis    return getPointeeLoc().getTypeSpecLoc();
298b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  }
299b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis
300b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  SourceRange getSourceRange() const {
301b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis    return SourceRange(getAmpLoc(), getAmpLoc());
302b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  }
303b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis
304b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  /// \brief Returns the size of the type source info data block that is
305b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  /// specific to this type.
306b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  unsigned getLocalDataSize() const { return sizeof(Info); }
307b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis
308b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  /// \brief Returns the size of the type source info data block.
309b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  unsigned getFullDataSize() const {
310b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis    return getLocalDataSize() + getPointeeLoc().getFullDataSize();
311b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  }
312b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis
313b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  static bool classof(const TypeLoc *TL);
314b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  static bool classof(const ReferenceLoc *TL) { return true; }
315b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis};
316b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis
317b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis/// \brief Wrapper for source info for functions.
318b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidisclass FunctionLoc : public DeclaratorLoc {
319b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  struct Info {
320b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis    SourceLocation LParenLoc, RParenLoc;
321b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  };
322b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  // ParmVarDecls* are stored after Info, one for each argument.
323b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  ParmVarDecl **getParmArray() const {
324b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis    return reinterpret_cast<ParmVarDecl**>(static_cast<Info*>(Data) + 1);
325b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  }
326b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis
327b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidispublic:
328b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  SourceLocation getLParenLoc() const {
329b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis    return static_cast<Info*>(Data)->LParenLoc;
330b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  }
331b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  void setLParenLoc(SourceLocation Loc) {
332b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis    static_cast<Info*>(Data)->LParenLoc = Loc;
333b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  }
334b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis
335b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  SourceLocation getRParenLoc() const {
336b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis    return static_cast<Info*>(Data)->RParenLoc;
337b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  }
338b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  void setRParenLoc(SourceLocation Loc) {
339b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis    static_cast<Info*>(Data)->RParenLoc = Loc;
340b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  }
341b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis
342b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  unsigned getNumArgs() const {
343b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis    if (isa<FunctionNoProtoType>(Ty))
344b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis      return 0;
345b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis    return cast<FunctionProtoType>(Ty)->getNumArgs();
346b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  }
347b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  ParmVarDecl *getArg(unsigned i) const { return getParmArray()[i]; }
348b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  void setArg(unsigned i, ParmVarDecl *VD) { getParmArray()[i] = VD; }
349b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis
350b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  TypeLoc getArgLoc(unsigned i) const;
351b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis
352b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  TypeLoc getResultLoc() const {
353b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis    void *Next = static_cast<char*>(Data) + getLocalDataSize();
354b735471f3848065120d7210e557b5f0d37ed4c43Argyrios Kyrtzidis    return TypeLoc(cast<FunctionType>(Ty)->getResultType(), Next);
355b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  }
356b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis
357b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  /// \brief Find the TypeSpecLoc that is part of this FunctionLoc.
358b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  TypeSpecLoc getTypeSpecLoc() const {
359b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis    return getResultLoc().getTypeSpecLoc();
360b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  }
361b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  SourceRange getSourceRange() const {
362b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis    return SourceRange(getLParenLoc(), getRParenLoc());
363b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  }
364b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis
365b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  /// \brief Returns the size of the type source info data block that is
366b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  /// specific to this type.
367b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  unsigned getLocalDataSize() const {
368b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis    return sizeof(Info) + getNumArgs() * sizeof(ParmVarDecl*);
369b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  }
370b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis
371b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  /// \brief Returns the size of the type source info data block.
372b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  unsigned getFullDataSize() const {
373b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis    return getLocalDataSize() + getResultLoc().getFullDataSize();
374b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  }
375b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis
376b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  static bool classof(const TypeLoc *TL);
377b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  static bool classof(const FunctionLoc *TL) { return true; }
378b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis};
379b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis
380b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis/// \brief Wrapper for source info for arrays.
381b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidisclass ArrayLoc : public DeclaratorLoc {
382b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  struct Info {
383b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis    SourceLocation LBracketLoc, RBracketLoc;
384b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis    Expr *Size;
385b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  };
386b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidispublic:
387b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  SourceLocation getLBracketLoc() const {
388b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis    return static_cast<Info*>(Data)->LBracketLoc;
389b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  }
390b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  void setLBracketLoc(SourceLocation Loc) {
391b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis    static_cast<Info*>(Data)->LBracketLoc = Loc;
392b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  }
393b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis
394b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  SourceLocation getRBracketLoc() const {
395b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis    return static_cast<Info*>(Data)->RBracketLoc;
396b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  }
397b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  void setRBracketLoc(SourceLocation Loc) {
398b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis    static_cast<Info*>(Data)->RBracketLoc = Loc;
399b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  }
400b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis
401b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  Expr *getSizeExpr() const {
402b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis    return static_cast<Info*>(Data)->Size;
403b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  }
404b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  void setSizeExpr(Expr *Size) {
405b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis    static_cast<Info*>(Data)->Size = Size;
406b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  }
407b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis
408b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  TypeLoc getElementLoc() const {
409b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis    void *Next = static_cast<char*>(Data) + getLocalDataSize();
410b735471f3848065120d7210e557b5f0d37ed4c43Argyrios Kyrtzidis    return TypeLoc(cast<ArrayType>(Ty)->getElementType(), Next);
411b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  }
412b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis
413b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  /// \brief Find the TypeSpecLoc that is part of this ArrayLoc.
414b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  TypeSpecLoc getTypeSpecLoc() const {
415b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis    return getElementLoc().getTypeSpecLoc();
416b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  }
417b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  SourceRange getSourceRange() const {
418b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis    return SourceRange(getLBracketLoc(), getRBracketLoc());
419b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  }
420b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis
421b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  /// \brief Returns the size of the type source info data block that is
422b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  /// specific to this type.
423b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  unsigned getLocalDataSize() const { return sizeof(Info); }
424b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis
425b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  /// \brief Returns the size of the type source info data block.
426b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  unsigned getFullDataSize() const {
427b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis    return getLocalDataSize() + getElementLoc().getFullDataSize();
428b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  }
429b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis
430b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  static bool classof(const TypeLoc *TL);
431b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  static bool classof(const ArrayLoc *TL) { return true; }
432b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis};
433b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis
434b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis#define DISPATCH(CLASS) \
435b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  return static_cast<ImplClass*>(this)->Visit ## CLASS(cast<CLASS>(TyLoc))
436b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis
437b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidistemplate<typename ImplClass, typename RetTy=void>
438b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidisclass TypeLocVisitor {
439b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  class TypeDispatch : public TypeVisitor<TypeDispatch, RetTy> {
440b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis    ImplClass *Impl;
441b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis    TypeLoc TyLoc;
442b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis
443b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  public:
444b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis    TypeDispatch(ImplClass *impl, TypeLoc &tyLoc) : Impl(impl), TyLoc(tyLoc) { }
445b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis#define ABSTRACT_TYPELOC(CLASS)
446b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis#define TYPELOC(CLASS, PARENT, TYPE)                              \
447b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis    RetTy Visit##TYPE(TYPE *) {                                   \
448b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis      return Impl->Visit##CLASS(reinterpret_cast<CLASS&>(TyLoc)); \
4491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    }
450b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis#include "clang/AST/TypeLocNodes.def"
451b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  };
452b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis
453b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidispublic:
454b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  RetTy Visit(TypeLoc TyLoc) {
455b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis    TypeDispatch TD(static_cast<ImplClass*>(this), TyLoc);
456b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis    return TD.Visit(TyLoc.getSourceType().getTypePtr());
457b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  }
458b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis
459b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis#define TYPELOC(CLASS, PARENT, TYPE) RetTy Visit##CLASS(CLASS TyLoc) {       \
460b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  DISPATCH(PARENT);                                                          \
461b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis}
462b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis#include "clang/AST/TypeLocNodes.def"
463b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis
464b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis  RetTy VisitTypeLoc(TypeLoc TyLoc) { return RetTy(); }
465b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis};
466b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis
467b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis#undef DISPATCH
468b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis
469b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis}
470b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis
471b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis#endif
472