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:
105059101f922de6eb765601459925f4c8914420b23Douglas Gregor    case DependentName:
106059101f922de6eb765601459925f4c8914420b23Douglas Gregor    case DependentTemplateSpecialization:
107e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara      break;
108e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara    default:
109e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara      TypeLoc Next = Cur.getNextTypeLoc();
110e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara      if (Next.isNull()) break;
111e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara      Cur = Next;
112e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara      continue;
113e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara    }
114e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara    break;
115e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara  }
116e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara  return Cur.getLocalSourceRange().getBegin();
117e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara}
118e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara
119e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo BagnaraSourceLocation TypeLoc::getEndLoc() const {
120e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara  TypeLoc Cur = *this;
121a2026c96d3935e7909e049ad9096762844544ed6Abramo Bagnara  TypeLoc Last;
122e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara  while (true) {
123e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara    switch (Cur.getTypeLocClass()) {
124e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara    default:
125a2026c96d3935e7909e049ad9096762844544ed6Abramo Bagnara      if (!Last)
126a2026c96d3935e7909e049ad9096762844544ed6Abramo Bagnara	Last = Cur;
127a2026c96d3935e7909e049ad9096762844544ed6Abramo Bagnara      return Last.getLocalSourceRange().getEnd();
128a2026c96d3935e7909e049ad9096762844544ed6Abramo Bagnara    case Paren:
129a2026c96d3935e7909e049ad9096762844544ed6Abramo Bagnara    case ConstantArray:
130a2026c96d3935e7909e049ad9096762844544ed6Abramo Bagnara    case DependentSizedArray:
131a2026c96d3935e7909e049ad9096762844544ed6Abramo Bagnara    case IncompleteArray:
132a2026c96d3935e7909e049ad9096762844544ed6Abramo Bagnara    case VariableArray:
133a2026c96d3935e7909e049ad9096762844544ed6Abramo Bagnara    case FunctionProto:
134a2026c96d3935e7909e049ad9096762844544ed6Abramo Bagnara    case FunctionNoProto:
135a2026c96d3935e7909e049ad9096762844544ed6Abramo Bagnara      Last = Cur;
136a2026c96d3935e7909e049ad9096762844544ed6Abramo Bagnara      break;
137a2026c96d3935e7909e049ad9096762844544ed6Abramo Bagnara    case Pointer:
138a2026c96d3935e7909e049ad9096762844544ed6Abramo Bagnara    case BlockPointer:
139a2026c96d3935e7909e049ad9096762844544ed6Abramo Bagnara    case MemberPointer:
140a2026c96d3935e7909e049ad9096762844544ed6Abramo Bagnara    case LValueReference:
141a2026c96d3935e7909e049ad9096762844544ed6Abramo Bagnara    case RValueReference:
142a2026c96d3935e7909e049ad9096762844544ed6Abramo Bagnara    case PackExpansion:
143a2026c96d3935e7909e049ad9096762844544ed6Abramo Bagnara      if (!Last)
144a2026c96d3935e7909e049ad9096762844544ed6Abramo Bagnara	Last = Cur;
145e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara      break;
146e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara    case Qualified:
147e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara    case Elaborated:
148a2026c96d3935e7909e049ad9096762844544ed6Abramo Bagnara      break;
149e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara    }
150a2026c96d3935e7909e049ad9096762844544ed6Abramo Bagnara    Cur = Cur.getNextTypeLoc();
151e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara  }
152e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara}
153e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara
154e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara
155ed97649e9574b9d854fa4d6109c9333ae0993554John McCallnamespace {
156ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  struct TSTChecker : public TypeLocVisitor<TSTChecker, bool> {
157ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    // Overload resolution does the real work for us.
158ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    static bool isTypeSpec(TypeSpecTypeLoc _) { return true; }
159ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    static bool isTypeSpec(TypeLoc _) { return false; }
160ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
161ed97649e9574b9d854fa4d6109c9333ae0993554John McCall#define ABSTRACT_TYPELOC(CLASS, PARENT)
162ed97649e9574b9d854fa4d6109c9333ae0993554John McCall#define TYPELOC(CLASS, PARENT) \
163ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    bool Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc) { \
164ed97649e9574b9d854fa4d6109c9333ae0993554John McCall      return isTypeSpec(TyLoc); \
165ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    }
166ed97649e9574b9d854fa4d6109c9333ae0993554John McCall#include "clang/AST/TypeLocNodes.def"
167ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  };
168ed97649e9574b9d854fa4d6109c9333ae0993554John McCall}
169ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
170ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
171ed97649e9574b9d854fa4d6109c9333ae0993554John McCall/// \brief Determines if the given type loc corresponds to a
172ed97649e9574b9d854fa4d6109c9333ae0993554John McCall/// TypeSpecTypeLoc.  Since there is not actually a TypeSpecType in
173ed97649e9574b9d854fa4d6109c9333ae0993554John McCall/// the type hierarchy, this is made somewhat complicated.
174ed97649e9574b9d854fa4d6109c9333ae0993554John McCall///
175ed97649e9574b9d854fa4d6109c9333ae0993554John McCall/// There are a lot of types that currently use TypeSpecTypeLoc
176ed97649e9574b9d854fa4d6109c9333ae0993554John McCall/// because it's a convenient base class.  Ideally we would not accept
177ed97649e9574b9d854fa4d6109c9333ae0993554John McCall/// those here, but ideally we would have better implementations for
178ed97649e9574b9d854fa4d6109c9333ae0993554John McCall/// them.
179ed97649e9574b9d854fa4d6109c9333ae0993554John McCallbool TypeSpecTypeLoc::classof(const TypeLoc *TL) {
180ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  if (TL->getType().hasLocalQualifiers()) return false;
181ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  return TSTChecker().Visit(*TL);
182ed97649e9574b9d854fa4d6109c9333ae0993554John McCall}
183cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall
184cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall// Reimplemented to account for GNU/C++ extension
185cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall//     typeof unary-expression
186cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall// where there are no parentheses.
187bd054dba8a3023821f2a0951b0fae05e3522a7c9Abramo BagnaraSourceRange TypeOfExprTypeLoc::getLocalSourceRange() const {
188cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  if (getRParenLoc().isValid())
189cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall    return SourceRange(getTypeofLoc(), getRParenLoc());
190cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  else
191cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall    return SourceRange(getTypeofLoc(),
192cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall                       getUnderlyingExpr()->getSourceRange().getEnd());
193cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall}
194ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor
195ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor
196ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas GregorTypeSpecifierType BuiltinTypeLoc::getWrittenTypeSpec() const {
197ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor  if (needsExtraLocalData())
198ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor    return static_cast<TypeSpecifierType>(getWrittenBuiltinSpecs().Type);
1993026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie  switch (getTypePtr()->getKind()) {
2003026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie  case BuiltinType::Void:
2013026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie    return TST_void;
2023026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie  case BuiltinType::Bool:
2033026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie    return TST_bool;
2043026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie  case BuiltinType::Char_U:
2053026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie  case BuiltinType::Char_S:
2063026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie    return TST_char;
2073026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie  case BuiltinType::Char16:
2083026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie    return TST_char16;
2093026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie  case BuiltinType::Char32:
2103026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie    return TST_char32;
2113026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie  case BuiltinType::WChar_S:
2123026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie  case BuiltinType::WChar_U:
2133026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie    return TST_wchar;
2143026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie  case BuiltinType::UChar:
2153026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie  case BuiltinType::UShort:
2163026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie  case BuiltinType::UInt:
2173026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie  case BuiltinType::ULong:
2183026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie  case BuiltinType::ULongLong:
2193026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie  case BuiltinType::UInt128:
2203026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie  case BuiltinType::SChar:
2213026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie  case BuiltinType::Short:
2223026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie  case BuiltinType::Int:
2233026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie  case BuiltinType::Long:
2243026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie  case BuiltinType::LongLong:
2253026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie  case BuiltinType::Int128:
2263026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie  case BuiltinType::Half:
2273026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie  case BuiltinType::Float:
2283026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie  case BuiltinType::Double:
2293026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie  case BuiltinType::LongDouble:
2303026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie    llvm_unreachable("Builtin type needs extra local data!");
2313026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie    // Fall through, if the impossible happens.
2323026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie
2333026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie  case BuiltinType::NullPtr:
2343026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie  case BuiltinType::Overload:
2353026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie  case BuiltinType::Dependent:
2363026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie  case BuiltinType::BoundMember:
2373026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie  case BuiltinType::UnknownAny:
2383026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie  case BuiltinType::ARCUnbridgedCast:
2393026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie  case BuiltinType::PseudoObject:
2403026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie  case BuiltinType::ObjCId:
2413026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie  case BuiltinType::ObjCClass:
2423026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie  case BuiltinType::ObjCSel:
2433026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie    return TST_unspecified;
244ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor  }
2453026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie
2463026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie  llvm_unreachable("Invalid BuiltinType Kind!");
247ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor}
248140a2bd77539b4537010d8cd6a0a3805ce724b3eAbramo Bagnara
249723df245307a530da5433dfb43accf187dc3e243Abramo BagnaraTypeLoc TypeLoc::IgnoreParensImpl(TypeLoc TL) {
250140a2bd77539b4537010d8cd6a0a3805ce724b3eAbramo Bagnara  while (ParenTypeLoc* PTL = dyn_cast<ParenTypeLoc>(&TL))
251140a2bd77539b4537010d8cd6a0a3805ce724b3eAbramo Bagnara    TL = PTL->getInnerLoc();
252140a2bd77539b4537010d8cd6a0a3805ce724b3eAbramo Bagnara  return TL;
253140a2bd77539b4537010d8cd6a0a3805ce724b3eAbramo Bagnara}
254c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor
2559e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregorvoid ElaboratedTypeLoc::initializeLocal(ASTContext &Context,
2569e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor                                        SourceLocation Loc) {
25738a42916cb07fd368d9e2ae1e7915fa896f9ec06Abramo Bagnara  setElaboratedKeywordLoc(Loc);
2589e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor  NestedNameSpecifierLocBuilder Builder;
2599e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor  Builder.MakeTrivial(Context, getTypePtr()->getQualifier(), Loc);
2609e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor  setQualifierLoc(Builder.getWithLocInContext(Context));
2619e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor}
2629e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor
2632494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregorvoid DependentNameTypeLoc::initializeLocal(ASTContext &Context,
2642494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor                                           SourceLocation Loc) {
26538a42916cb07fd368d9e2ae1e7915fa896f9ec06Abramo Bagnara  setElaboratedKeywordLoc(Loc);
2662494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor  NestedNameSpecifierLocBuilder Builder;
2672494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor  Builder.MakeTrivial(Context, getTypePtr()->getQualifier(), Loc);
2682494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor  setQualifierLoc(Builder.getWithLocInContext(Context));
2692494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor  setNameLoc(Loc);
2702494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor}
2712494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor
27266581d41527628d4b37f7b05c288f77be7415d7dAbramo Bagnaravoid
27366581d41527628d4b37f7b05c288f77be7415d7dAbramo BagnaraDependentTemplateSpecializationTypeLoc::initializeLocal(ASTContext &Context,
27494fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor                                                        SourceLocation Loc) {
27555d23c925b058be29b792008ddb7d68f6c4fa9a0Abramo Bagnara  setElaboratedKeywordLoc(Loc);
27694fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor  if (getTypePtr()->getQualifier()) {
27794fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor    NestedNameSpecifierLocBuilder Builder;
27894fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor    Builder.MakeTrivial(Context, getTypePtr()->getQualifier(), Loc);
27994fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor    setQualifierLoc(Builder.getWithLocInContext(Context));
28094fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor  } else {
28194fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor    setQualifierLoc(NestedNameSpecifierLoc());
28294fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor  }
28366581d41527628d4b37f7b05c288f77be7415d7dAbramo Bagnara  setTemplateKeywordLoc(Loc);
28455d23c925b058be29b792008ddb7d68f6c4fa9a0Abramo Bagnara  setTemplateNameLoc(Loc);
28594fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor  setLAngleLoc(Loc);
28694fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor  setRAngleLoc(Loc);
28794fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor  TemplateSpecializationTypeLoc::initializeArgLocs(Context, getNumArgs(),
28894fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor                                                   getTypePtr()->getArgs(),
28994fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor                                                   getArgInfos(), Loc);
29094fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor}
29194fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor
292c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregorvoid TemplateSpecializationTypeLoc::initializeArgLocs(ASTContext &Context,
293c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor                                                      unsigned NumArgs,
294c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor                                                  const TemplateArgument *Args,
295c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor                                              TemplateArgumentLocInfo *ArgInfos,
296c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor                                                      SourceLocation Loc) {
297c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor  for (unsigned i = 0, e = NumArgs; i != e; ++i) {
298c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor    switch (Args[i].getKind()) {
299c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor    case TemplateArgument::Null:
300c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor    case TemplateArgument::Declaration:
301c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor    case TemplateArgument::Integral:
302c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor    case TemplateArgument::Pack:
303c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor    case TemplateArgument::Expression:
3041e855657867e95c8302f55de3f63409f9b1927c3Matt Beaumont-Gay      ArgInfos[i] = TemplateArgumentLocInfo(Args[i].getAsExpr());
305c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor      break;
306c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor
307c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor    case TemplateArgument::Type:
308c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor      ArgInfos[i] = TemplateArgumentLocInfo(
309c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor                          Context.getTrivialTypeSourceInfo(Args[i].getAsType(),
310c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor                                                           Loc));
311c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor      break;
312c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor
313c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor    case TemplateArgument::Template:
314b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor    case TemplateArgument::TemplateExpansion: {
315b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor      NestedNameSpecifierLocBuilder Builder;
316b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor      TemplateName Template = Args[i].getAsTemplate();
317b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor      if (DependentTemplateName *DTN = Template.getAsDependentTemplateName())
318b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor        Builder.MakeTrivial(Context, DTN->getQualifier(), Loc);
319b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor      else if (QualifiedTemplateName *QTN = Template.getAsQualifiedTemplateName())
320b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor        Builder.MakeTrivial(Context, QTN->getQualifier(), Loc);
321c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor
322b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor      ArgInfos[i] = TemplateArgumentLocInfo(
323b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor                                           Builder.getWithLocInContext(Context),
324b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor                                            Loc,
325b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor                                Args[i].getKind() == TemplateArgument::Template
326b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor                                            ? SourceLocation()
327b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor                                            : Loc);
328c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor      break;
329b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor    }
330c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor    }
331c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor  }
332c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor}
333