TypeLoc.cpp revision 94fdffa4a572fc14ac296f5f1aae9db3734c72f1
1b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis//===--- TypeLoc.cpp - 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 subclasses implementations.
11b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis//
12b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis//===----------------------------------------------------------------------===//
13b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis
1434a0447b8072e0da14c0980597da9d03a1495662John McCall#include "llvm/Support/raw_ostream.h"
150c411806d540f7158bf12fee5c10f7de2647de76Argyrios Kyrtzidis#include "clang/AST/TypeLocVisitor.h"
16cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall#include "clang/AST/Expr.h"
17ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor#include "llvm/Support/ErrorHandling.h"
18b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidisusing namespace clang;
19b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis
20b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis//===----------------------------------------------------------------------===//
21b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis// TypeLoc Implementation
22b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis//===----------------------------------------------------------------------===//
23b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis
2468006af18fb880cd8547ce797152111b810aa0baArgyrios Kyrtzidisnamespace {
2551bd803fbdade51d674598ed45da3d54190a656cJohn McCall  class TypeLocRanger : public TypeLocVisitor<TypeLocRanger, SourceRange> {
2651bd803fbdade51d674598ed45da3d54190a656cJohn McCall  public:
2751bd803fbdade51d674598ed45da3d54190a656cJohn McCall#define ABSTRACT_TYPELOC(CLASS, PARENT)
2834a0447b8072e0da14c0980597da9d03a1495662John McCall#define TYPELOC(CLASS, PARENT) \
2951bd803fbdade51d674598ed45da3d54190a656cJohn McCall    SourceRange Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc) { \
30bd054dba8a3023821f2a0951b0fae05e3522a7c9Abramo Bagnara      return TyLoc.getLocalSourceRange(); \
3151bd803fbdade51d674598ed45da3d54190a656cJohn McCall    }
3268006af18fb880cd8547ce797152111b810aa0baArgyrios Kyrtzidis#include "clang/AST/TypeLocNodes.def"
3351bd803fbdade51d674598ed45da3d54190a656cJohn McCall  };
3468006af18fb880cd8547ce797152111b810aa0baArgyrios Kyrtzidis}
3568006af18fb880cd8547ce797152111b810aa0baArgyrios Kyrtzidis
36bd054dba8a3023821f2a0951b0fae05e3522a7c9Abramo BagnaraSourceRange TypeLoc::getLocalSourceRangeImpl(TypeLoc TL) {
3751bd803fbdade51d674598ed45da3d54190a656cJohn McCall  if (TL.isNull()) return SourceRange();
3851bd803fbdade51d674598ed45da3d54190a656cJohn McCall  return TypeLocRanger().Visit(TL);
39b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis}
40b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis
41b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidisnamespace {
4251bd803fbdade51d674598ed45da3d54190a656cJohn McCall  class TypeSizer : public TypeLocVisitor<TypeSizer, unsigned> {
4351bd803fbdade51d674598ed45da3d54190a656cJohn McCall  public:
4451bd803fbdade51d674598ed45da3d54190a656cJohn McCall#define ABSTRACT_TYPELOC(CLASS, PARENT)
4534a0447b8072e0da14c0980597da9d03a1495662John McCall#define TYPELOC(CLASS, PARENT) \
4651bd803fbdade51d674598ed45da3d54190a656cJohn McCall    unsigned Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc) { \
4751bd803fbdade51d674598ed45da3d54190a656cJohn McCall      return TyLoc.getFullDataSize(); \
4851bd803fbdade51d674598ed45da3d54190a656cJohn McCall    }
49b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis#include "clang/AST/TypeLocNodes.def"
5051bd803fbdade51d674598ed45da3d54190a656cJohn McCall  };
51b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis}
52b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis
53b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis/// \brief Returns the size of the type source info data block.
5434a0447b8072e0da14c0980597da9d03a1495662John McCallunsigned TypeLoc::getFullDataSizeForType(QualType Ty) {
5534a0447b8072e0da14c0980597da9d03a1495662John McCall  if (Ty.isNull()) return 0;
5634a0447b8072e0da14c0980597da9d03a1495662John McCall  return TypeSizer().Visit(TypeLoc(Ty, 0));
57b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis}
58b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis
59b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidisnamespace {
6051bd803fbdade51d674598ed45da3d54190a656cJohn McCall  class NextLoc : public TypeLocVisitor<NextLoc, TypeLoc> {
6151bd803fbdade51d674598ed45da3d54190a656cJohn McCall  public:
6251bd803fbdade51d674598ed45da3d54190a656cJohn McCall#define ABSTRACT_TYPELOC(CLASS, PARENT)
6351bd803fbdade51d674598ed45da3d54190a656cJohn McCall#define TYPELOC(CLASS, PARENT) \
6451bd803fbdade51d674598ed45da3d54190a656cJohn McCall    TypeLoc Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc) { \
6551bd803fbdade51d674598ed45da3d54190a656cJohn McCall      return TyLoc.getNextTypeLoc(); \
6651bd803fbdade51d674598ed45da3d54190a656cJohn McCall    }
67b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis#include "clang/AST/TypeLocNodes.def"
6851bd803fbdade51d674598ed45da3d54190a656cJohn McCall  };
69b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis}
70b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis
71b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis/// \brief Get the next TypeLoc pointed by this TypeLoc, e.g for "int*" the
72b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis/// TypeLoc is a PointerLoc and next TypeLoc is for "int".
7351bd803fbdade51d674598ed45da3d54190a656cJohn McCallTypeLoc TypeLoc::getNextTypeLocImpl(TypeLoc TL) {
7451bd803fbdade51d674598ed45da3d54190a656cJohn McCall  return NextLoc().Visit(TL);
754ce74bd425dccd9d9ad6ccfc9ffbc01698a6e71aJohn McCall}
764ce74bd425dccd9d9ad6ccfc9ffbc01698a6e71aJohn McCall
7751bd803fbdade51d674598ed45da3d54190a656cJohn McCall/// \brief Initializes a type location, and all of its children
7851bd803fbdade51d674598ed45da3d54190a656cJohn McCall/// recursively, as if the entire tree had been written in the
7951bd803fbdade51d674598ed45da3d54190a656cJohn McCall/// given location.
80c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregorvoid TypeLoc::initializeImpl(ASTContext &Context, TypeLoc TL,
81c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor                             SourceLocation Loc) {
827eb914b1398e636845ce4ae8dd7022f72429d8c9John McCall  while (true) {
837eb914b1398e636845ce4ae8dd7022f72429d8c9John McCall    switch (TL.getTypeLocClass()) {
847eb914b1398e636845ce4ae8dd7022f72429d8c9John McCall#define ABSTRACT_TYPELOC(CLASS, PARENT)
857eb914b1398e636845ce4ae8dd7022f72429d8c9John McCall#define TYPELOC(CLASS, PARENT)        \
867eb914b1398e636845ce4ae8dd7022f72429d8c9John McCall    case CLASS: {                     \
877eb914b1398e636845ce4ae8dd7022f72429d8c9John McCall      CLASS##TypeLoc TLCasted = cast<CLASS##TypeLoc>(TL); \
88c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor      TLCasted.initializeLocal(Context, Loc);  \
897eb914b1398e636845ce4ae8dd7022f72429d8c9John McCall      TL = TLCasted.getNextTypeLoc(); \
907eb914b1398e636845ce4ae8dd7022f72429d8c9John McCall      if (!TL) return;                \
917eb914b1398e636845ce4ae8dd7022f72429d8c9John McCall      continue;                       \
927eb914b1398e636845ce4ae8dd7022f72429d8c9John McCall    }
937eb914b1398e636845ce4ae8dd7022f72429d8c9John McCall#include "clang/AST/TypeLocNodes.def"
947eb914b1398e636845ce4ae8dd7022f72429d8c9John McCall    }
957eb914b1398e636845ce4ae8dd7022f72429d8c9John McCall  }
96b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis}
97ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
98e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo BagnaraSourceLocation TypeLoc::getBeginLoc() const {
99e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara  TypeLoc Cur = *this;
100e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara  while (true) {
101e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara    switch (Cur.getTypeLocClass()) {
102e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara    // FIXME: Currently QualifiedTypeLoc does not have a source range
103e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara    // case Qualified:
104e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara    case Elaborated:
105e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara      break;
106e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara    default:
107e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara      TypeLoc Next = Cur.getNextTypeLoc();
108e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara      if (Next.isNull()) break;
109e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara      Cur = Next;
110e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara      continue;
111e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara    }
112e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara    break;
113e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara  }
114e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara  return Cur.getLocalSourceRange().getBegin();
115e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara}
116e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara
117e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo BagnaraSourceLocation TypeLoc::getEndLoc() const {
118e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara  TypeLoc Cur = *this;
119e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara  while (true) {
120e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara    switch (Cur.getTypeLocClass()) {
121e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara    default:
122e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara      break;
123e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara    case Qualified:
124e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara    case Elaborated:
125e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara      Cur = Cur.getNextTypeLoc();
126e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara      continue;
127e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara    }
128e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara    break;
129e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara  }
130e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara  return Cur.getLocalSourceRange().getEnd();
131e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara}
132e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara
133e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara
134ed97649e9574b9d854fa4d6109c9333ae0993554John McCallnamespace {
135ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  struct TSTChecker : public TypeLocVisitor<TSTChecker, bool> {
136ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    // Overload resolution does the real work for us.
137ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    static bool isTypeSpec(TypeSpecTypeLoc _) { return true; }
138ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    static bool isTypeSpec(TypeLoc _) { return false; }
139ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
140ed97649e9574b9d854fa4d6109c9333ae0993554John McCall#define ABSTRACT_TYPELOC(CLASS, PARENT)
141ed97649e9574b9d854fa4d6109c9333ae0993554John McCall#define TYPELOC(CLASS, PARENT) \
142ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    bool Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc) { \
143ed97649e9574b9d854fa4d6109c9333ae0993554John McCall      return isTypeSpec(TyLoc); \
144ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    }
145ed97649e9574b9d854fa4d6109c9333ae0993554John McCall#include "clang/AST/TypeLocNodes.def"
146ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  };
147ed97649e9574b9d854fa4d6109c9333ae0993554John McCall}
148ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
149ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
150ed97649e9574b9d854fa4d6109c9333ae0993554John McCall/// \brief Determines if the given type loc corresponds to a
151ed97649e9574b9d854fa4d6109c9333ae0993554John McCall/// TypeSpecTypeLoc.  Since there is not actually a TypeSpecType in
152ed97649e9574b9d854fa4d6109c9333ae0993554John McCall/// the type hierarchy, this is made somewhat complicated.
153ed97649e9574b9d854fa4d6109c9333ae0993554John McCall///
154ed97649e9574b9d854fa4d6109c9333ae0993554John McCall/// There are a lot of types that currently use TypeSpecTypeLoc
155ed97649e9574b9d854fa4d6109c9333ae0993554John McCall/// because it's a convenient base class.  Ideally we would not accept
156ed97649e9574b9d854fa4d6109c9333ae0993554John McCall/// those here, but ideally we would have better implementations for
157ed97649e9574b9d854fa4d6109c9333ae0993554John McCall/// them.
158ed97649e9574b9d854fa4d6109c9333ae0993554John McCallbool TypeSpecTypeLoc::classof(const TypeLoc *TL) {
159ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  if (TL->getType().hasLocalQualifiers()) return false;
160ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  return TSTChecker().Visit(*TL);
161ed97649e9574b9d854fa4d6109c9333ae0993554John McCall}
162cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall
163cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall// Reimplemented to account for GNU/C++ extension
164cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall//     typeof unary-expression
165cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall// where there are no parentheses.
166bd054dba8a3023821f2a0951b0fae05e3522a7c9Abramo BagnaraSourceRange TypeOfExprTypeLoc::getLocalSourceRange() const {
167cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  if (getRParenLoc().isValid())
168cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall    return SourceRange(getTypeofLoc(), getRParenLoc());
169cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  else
170cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall    return SourceRange(getTypeofLoc(),
171cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall                       getUnderlyingExpr()->getSourceRange().getEnd());
172cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall}
173ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor
174ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor
175ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas GregorTypeSpecifierType BuiltinTypeLoc::getWrittenTypeSpec() const {
176ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor  if (needsExtraLocalData())
177ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor    return static_cast<TypeSpecifierType>(getWrittenBuiltinSpecs().Type);
178ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor  else {
179ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor    switch (getTypePtr()->getKind()) {
180ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor    case BuiltinType::Void:
181ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor      return TST_void;
182ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor    case BuiltinType::Bool:
183ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor      return TST_bool;
184ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor    case BuiltinType::Char_U:
185ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor    case BuiltinType::Char_S:
186ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor      return TST_char;
187ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor    case BuiltinType::Char16:
188ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor      return TST_char16;
189ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor    case BuiltinType::Char32:
190ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor      return TST_char32;
1913f59c975aa5d047f7edd1b900b5e885c38af0ef7Chris Lattner    case BuiltinType::WChar_S:
1923f59c975aa5d047f7edd1b900b5e885c38af0ef7Chris Lattner    case BuiltinType::WChar_U:
193ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor      return TST_wchar;
19434b41d939a1328f484511c6002ba2456db879a29Richard Smith
195ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor    case BuiltinType::UChar:
196ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor    case BuiltinType::UShort:
197ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor    case BuiltinType::UInt:
198ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor    case BuiltinType::ULong:
199ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor    case BuiltinType::ULongLong:
200ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor    case BuiltinType::UInt128:
201ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor    case BuiltinType::SChar:
202ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor    case BuiltinType::Short:
203ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor    case BuiltinType::Int:
204ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor    case BuiltinType::Long:
205ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor    case BuiltinType::LongLong:
206ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor    case BuiltinType::Int128:
207d038f361d2b4368af7ab85bd04d5aafcc3ea649dDouglas Gregor    case BuiltinType::Float:
208d038f361d2b4368af7ab85bd04d5aafcc3ea649dDouglas Gregor    case BuiltinType::Double:
209d038f361d2b4368af7ab85bd04d5aafcc3ea649dDouglas Gregor    case BuiltinType::LongDouble:
210ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor      llvm_unreachable("Builtin type needs extra local data!");
211ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor      // Fall through, if the impossible happens.
212ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor
213ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor    case BuiltinType::NullPtr:
214ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor    case BuiltinType::Overload:
215ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor    case BuiltinType::Dependent:
216ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor    case BuiltinType::ObjCId:
217ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor    case BuiltinType::ObjCClass:
218ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor    case BuiltinType::ObjCSel:
219ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor      return TST_unspecified;
220ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor    }
221ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor  }
222ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor
223ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor  return TST_unspecified;
224ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor}
225140a2bd77539b4537010d8cd6a0a3805ce724b3eAbramo Bagnara
226723df245307a530da5433dfb43accf187dc3e243Abramo BagnaraTypeLoc TypeLoc::IgnoreParensImpl(TypeLoc TL) {
227140a2bd77539b4537010d8cd6a0a3805ce724b3eAbramo Bagnara  while (ParenTypeLoc* PTL = dyn_cast<ParenTypeLoc>(&TL))
228140a2bd77539b4537010d8cd6a0a3805ce724b3eAbramo Bagnara    TL = PTL->getInnerLoc();
229140a2bd77539b4537010d8cd6a0a3805ce724b3eAbramo Bagnara  return TL;
230140a2bd77539b4537010d8cd6a0a3805ce724b3eAbramo Bagnara}
231c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor
2329e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregorvoid ElaboratedTypeLoc::initializeLocal(ASTContext &Context,
2339e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor                                        SourceLocation Loc) {
2349e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor  setKeywordLoc(Loc);
2359e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor  NestedNameSpecifierLocBuilder Builder;
2369e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor  Builder.MakeTrivial(Context, getTypePtr()->getQualifier(), Loc);
2379e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor  setQualifierLoc(Builder.getWithLocInContext(Context));
2389e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor}
2399e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor
2402494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregorvoid DependentNameTypeLoc::initializeLocal(ASTContext &Context,
2412494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor                                           SourceLocation Loc) {
2422494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor  setKeywordLoc(Loc);
2432494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor  NestedNameSpecifierLocBuilder Builder;
2442494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor  Builder.MakeTrivial(Context, getTypePtr()->getQualifier(), Loc);
2452494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor  setQualifierLoc(Builder.getWithLocInContext(Context));
2462494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor  setNameLoc(Loc);
2472494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor}
2482494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor
24994fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregorvoid
25094fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas GregorDependentTemplateSpecializationTypeLoc::initializeLocal(ASTContext &Context,
25194fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor                                                        SourceLocation Loc) {
25294fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor  setKeywordLoc(Loc);
25394fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor  if (getTypePtr()->getQualifier()) {
25494fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor    NestedNameSpecifierLocBuilder Builder;
25594fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor    Builder.MakeTrivial(Context, getTypePtr()->getQualifier(), Loc);
25694fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor    setQualifierLoc(Builder.getWithLocInContext(Context));
25794fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor  } else {
25894fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor    setQualifierLoc(NestedNameSpecifierLoc());
25994fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor  }
26094fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor
26194fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor  setNameLoc(Loc);
26294fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor  setLAngleLoc(Loc);
26394fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor  setRAngleLoc(Loc);
26494fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor  TemplateSpecializationTypeLoc::initializeArgLocs(Context, getNumArgs(),
26594fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor                                                   getTypePtr()->getArgs(),
26694fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor                                                   getArgInfos(), Loc);
26794fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor}
26894fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor
269c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregorvoid TemplateSpecializationTypeLoc::initializeArgLocs(ASTContext &Context,
270c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor                                                      unsigned NumArgs,
271c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor                                                  const TemplateArgument *Args,
272c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor                                              TemplateArgumentLocInfo *ArgInfos,
273c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor                                                      SourceLocation Loc) {
274c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor  for (unsigned i = 0, e = NumArgs; i != e; ++i) {
275c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor    switch (Args[i].getKind()) {
276c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor    case TemplateArgument::Null:
277c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor    case TemplateArgument::Declaration:
278c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor    case TemplateArgument::Integral:
279c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor    case TemplateArgument::Pack:
280c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor    case TemplateArgument::Expression:
281c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor      // FIXME: Can we do better for declarations and integral values?
282c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor      ArgInfos[i] = TemplateArgumentLocInfo();
283c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor      break;
284c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor
285c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor    case TemplateArgument::Type:
286c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor      ArgInfos[i] = TemplateArgumentLocInfo(
287c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor                          Context.getTrivialTypeSourceInfo(Args[i].getAsType(),
288c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor                                                           Loc));
289c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor      break;
290c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor
291c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor    case TemplateArgument::Template:
292c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor      ArgInfos[i] = TemplateArgumentLocInfo(SourceRange(Loc), Loc,
293c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor                                            SourceLocation());
294c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor      break;
295c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor
296c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor    case TemplateArgument::TemplateExpansion:
297c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor      ArgInfos[i] = TemplateArgumentLocInfo(SourceRange(Loc), Loc, Loc);
298c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor      break;
299c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor    }
300c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor  }
301c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor}
302c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor
303