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"
16478851c3ed6bd784e7377dffd8e57b200c1b9ba9Benjamin Kramer#include "clang/AST/ASTContext.h"
17cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall#include "clang/AST/Expr.h"
18ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor#include "llvm/Support/ErrorHandling.h"
19b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidisusing namespace clang;
20b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis
21b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis//===----------------------------------------------------------------------===//
22b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis// TypeLoc Implementation
23b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis//===----------------------------------------------------------------------===//
24b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis
2568006af18fb880cd8547ce797152111b810aa0baArgyrios Kyrtzidisnamespace {
2651bd803fbdade51d674598ed45da3d54190a656cJohn McCall  class TypeLocRanger : public TypeLocVisitor<TypeLocRanger, SourceRange> {
2751bd803fbdade51d674598ed45da3d54190a656cJohn McCall  public:
2851bd803fbdade51d674598ed45da3d54190a656cJohn McCall#define ABSTRACT_TYPELOC(CLASS, PARENT)
2934a0447b8072e0da14c0980597da9d03a1495662John McCall#define TYPELOC(CLASS, PARENT) \
3051bd803fbdade51d674598ed45da3d54190a656cJohn McCall    SourceRange Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc) { \
31bd054dba8a3023821f2a0951b0fae05e3522a7c9Abramo Bagnara      return TyLoc.getLocalSourceRange(); \
3251bd803fbdade51d674598ed45da3d54190a656cJohn McCall    }
3368006af18fb880cd8547ce797152111b810aa0baArgyrios Kyrtzidis#include "clang/AST/TypeLocNodes.def"
3451bd803fbdade51d674598ed45da3d54190a656cJohn McCall  };
3568006af18fb880cd8547ce797152111b810aa0baArgyrios Kyrtzidis}
3668006af18fb880cd8547ce797152111b810aa0baArgyrios Kyrtzidis
37bd054dba8a3023821f2a0951b0fae05e3522a7c9Abramo BagnaraSourceRange TypeLoc::getLocalSourceRangeImpl(TypeLoc TL) {
3851bd803fbdade51d674598ed45da3d54190a656cJohn McCall  if (TL.isNull()) return SourceRange();
3951bd803fbdade51d674598ed45da3d54190a656cJohn McCall  return TypeLocRanger().Visit(TL);
40b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis}
41b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis
42b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidisnamespace {
4351bd803fbdade51d674598ed45da3d54190a656cJohn McCall  class TypeSizer : public TypeLocVisitor<TypeSizer, unsigned> {
4451bd803fbdade51d674598ed45da3d54190a656cJohn McCall  public:
4551bd803fbdade51d674598ed45da3d54190a656cJohn McCall#define ABSTRACT_TYPELOC(CLASS, PARENT)
4634a0447b8072e0da14c0980597da9d03a1495662John McCall#define TYPELOC(CLASS, PARENT) \
4751bd803fbdade51d674598ed45da3d54190a656cJohn McCall    unsigned Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc) { \
4851bd803fbdade51d674598ed45da3d54190a656cJohn McCall      return TyLoc.getFullDataSize(); \
4951bd803fbdade51d674598ed45da3d54190a656cJohn McCall    }
50b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis#include "clang/AST/TypeLocNodes.def"
5151bd803fbdade51d674598ed45da3d54190a656cJohn McCall  };
52b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis}
53b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis
54b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis/// \brief Returns the size of the type source info data block.
5534a0447b8072e0da14c0980597da9d03a1495662John McCallunsigned TypeLoc::getFullDataSizeForType(QualType Ty) {
5634a0447b8072e0da14c0980597da9d03a1495662John McCall  if (Ty.isNull()) return 0;
5734a0447b8072e0da14c0980597da9d03a1495662John McCall  return TypeSizer().Visit(TypeLoc(Ty, 0));
58b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis}
59b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis
60b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidisnamespace {
6151bd803fbdade51d674598ed45da3d54190a656cJohn McCall  class NextLoc : public TypeLocVisitor<NextLoc, TypeLoc> {
6251bd803fbdade51d674598ed45da3d54190a656cJohn McCall  public:
6351bd803fbdade51d674598ed45da3d54190a656cJohn McCall#define ABSTRACT_TYPELOC(CLASS, PARENT)
6451bd803fbdade51d674598ed45da3d54190a656cJohn McCall#define TYPELOC(CLASS, PARENT) \
6551bd803fbdade51d674598ed45da3d54190a656cJohn McCall    TypeLoc Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc) { \
6651bd803fbdade51d674598ed45da3d54190a656cJohn McCall      return TyLoc.getNextTypeLoc(); \
6751bd803fbdade51d674598ed45da3d54190a656cJohn McCall    }
68b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis#include "clang/AST/TypeLocNodes.def"
6951bd803fbdade51d674598ed45da3d54190a656cJohn McCall  };
70b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis}
71b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis
72b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis/// \brief Get the next TypeLoc pointed by this TypeLoc, e.g for "int*" the
73b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis/// TypeLoc is a PointerLoc and next TypeLoc is for "int".
7451bd803fbdade51d674598ed45da3d54190a656cJohn McCallTypeLoc TypeLoc::getNextTypeLocImpl(TypeLoc TL) {
7551bd803fbdade51d674598ed45da3d54190a656cJohn McCall  return NextLoc().Visit(TL);
764ce74bd425dccd9d9ad6ccfc9ffbc01698a6e71aJohn McCall}
774ce74bd425dccd9d9ad6ccfc9ffbc01698a6e71aJohn McCall
7851bd803fbdade51d674598ed45da3d54190a656cJohn McCall/// \brief Initializes a type location, and all of its children
7951bd803fbdade51d674598ed45da3d54190a656cJohn McCall/// recursively, as if the entire tree had been written in the
8051bd803fbdade51d674598ed45da3d54190a656cJohn McCall/// given location.
81c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregorvoid TypeLoc::initializeImpl(ASTContext &Context, TypeLoc TL,
82c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor                             SourceLocation Loc) {
837eb914b1398e636845ce4ae8dd7022f72429d8c9John McCall  while (true) {
847eb914b1398e636845ce4ae8dd7022f72429d8c9John McCall    switch (TL.getTypeLocClass()) {
857eb914b1398e636845ce4ae8dd7022f72429d8c9John McCall#define ABSTRACT_TYPELOC(CLASS, PARENT)
867eb914b1398e636845ce4ae8dd7022f72429d8c9John McCall#define TYPELOC(CLASS, PARENT)        \
877eb914b1398e636845ce4ae8dd7022f72429d8c9John McCall    case CLASS: {                     \
887eb914b1398e636845ce4ae8dd7022f72429d8c9John McCall      CLASS##TypeLoc TLCasted = cast<CLASS##TypeLoc>(TL); \
89c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor      TLCasted.initializeLocal(Context, Loc);  \
907eb914b1398e636845ce4ae8dd7022f72429d8c9John McCall      TL = TLCasted.getNextTypeLoc(); \
917eb914b1398e636845ce4ae8dd7022f72429d8c9John McCall      if (!TL) return;                \
927eb914b1398e636845ce4ae8dd7022f72429d8c9John McCall      continue;                       \
937eb914b1398e636845ce4ae8dd7022f72429d8c9John McCall    }
947eb914b1398e636845ce4ae8dd7022f72429d8c9John McCall#include "clang/AST/TypeLocNodes.def"
957eb914b1398e636845ce4ae8dd7022f72429d8c9John McCall    }
967eb914b1398e636845ce4ae8dd7022f72429d8c9John McCall  }
97b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis}
98ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
99e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo BagnaraSourceLocation TypeLoc::getBeginLoc() const {
100e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara  TypeLoc Cur = *this;
101e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara  while (true) {
102e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara    switch (Cur.getTypeLocClass()) {
103e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara    // FIXME: Currently QualifiedTypeLoc does not have a source range
104e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara    // case Qualified:
105e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara    case Elaborated:
106059101f922de6eb765601459925f4c8914420b23Douglas Gregor    case DependentName:
107059101f922de6eb765601459925f4c8914420b23Douglas Gregor    case DependentTemplateSpecialization:
108e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara      break;
109e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara    default:
110e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara      TypeLoc Next = Cur.getNextTypeLoc();
111e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara      if (Next.isNull()) break;
112e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara      Cur = Next;
113e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara      continue;
114e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara    }
115e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara    break;
116e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara  }
117e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara  return Cur.getLocalSourceRange().getBegin();
118e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara}
119e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara
120e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo BagnaraSourceLocation TypeLoc::getEndLoc() const {
121e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara  TypeLoc Cur = *this;
122a2026c96d3935e7909e049ad9096762844544ed6Abramo Bagnara  TypeLoc Last;
123e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara  while (true) {
124e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara    switch (Cur.getTypeLocClass()) {
125e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara    default:
126a2026c96d3935e7909e049ad9096762844544ed6Abramo Bagnara      if (!Last)
127a2026c96d3935e7909e049ad9096762844544ed6Abramo Bagnara	Last = Cur;
128a2026c96d3935e7909e049ad9096762844544ed6Abramo Bagnara      return Last.getLocalSourceRange().getEnd();
129a2026c96d3935e7909e049ad9096762844544ed6Abramo Bagnara    case Paren:
130a2026c96d3935e7909e049ad9096762844544ed6Abramo Bagnara    case ConstantArray:
131a2026c96d3935e7909e049ad9096762844544ed6Abramo Bagnara    case DependentSizedArray:
132a2026c96d3935e7909e049ad9096762844544ed6Abramo Bagnara    case IncompleteArray:
133a2026c96d3935e7909e049ad9096762844544ed6Abramo Bagnara    case VariableArray:
134a2026c96d3935e7909e049ad9096762844544ed6Abramo Bagnara    case FunctionProto:
135a2026c96d3935e7909e049ad9096762844544ed6Abramo Bagnara    case FunctionNoProto:
136a2026c96d3935e7909e049ad9096762844544ed6Abramo Bagnara      Last = Cur;
137a2026c96d3935e7909e049ad9096762844544ed6Abramo Bagnara      break;
138a2026c96d3935e7909e049ad9096762844544ed6Abramo Bagnara    case Pointer:
139a2026c96d3935e7909e049ad9096762844544ed6Abramo Bagnara    case BlockPointer:
140a2026c96d3935e7909e049ad9096762844544ed6Abramo Bagnara    case MemberPointer:
141a2026c96d3935e7909e049ad9096762844544ed6Abramo Bagnara    case LValueReference:
142a2026c96d3935e7909e049ad9096762844544ed6Abramo Bagnara    case RValueReference:
143a2026c96d3935e7909e049ad9096762844544ed6Abramo Bagnara    case PackExpansion:
144a2026c96d3935e7909e049ad9096762844544ed6Abramo Bagnara      if (!Last)
145a2026c96d3935e7909e049ad9096762844544ed6Abramo Bagnara	Last = Cur;
146e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara      break;
147e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara    case Qualified:
148e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara    case Elaborated:
149a2026c96d3935e7909e049ad9096762844544ed6Abramo Bagnara      break;
150e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara    }
151a2026c96d3935e7909e049ad9096762844544ed6Abramo Bagnara    Cur = Cur.getNextTypeLoc();
152e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara  }
153e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara}
154e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara
155e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara
156ed97649e9574b9d854fa4d6109c9333ae0993554John McCallnamespace {
157ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  struct TSTChecker : public TypeLocVisitor<TSTChecker, bool> {
158ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    // Overload resolution does the real work for us.
159ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    static bool isTypeSpec(TypeSpecTypeLoc _) { return true; }
160ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    static bool isTypeSpec(TypeLoc _) { return false; }
161ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
162ed97649e9574b9d854fa4d6109c9333ae0993554John McCall#define ABSTRACT_TYPELOC(CLASS, PARENT)
163ed97649e9574b9d854fa4d6109c9333ae0993554John McCall#define TYPELOC(CLASS, PARENT) \
164ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    bool Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc) { \
165ed97649e9574b9d854fa4d6109c9333ae0993554John McCall      return isTypeSpec(TyLoc); \
166ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    }
167ed97649e9574b9d854fa4d6109c9333ae0993554John McCall#include "clang/AST/TypeLocNodes.def"
168ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  };
169ed97649e9574b9d854fa4d6109c9333ae0993554John McCall}
170ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
171ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
172ed97649e9574b9d854fa4d6109c9333ae0993554John McCall/// \brief Determines if the given type loc corresponds to a
173ed97649e9574b9d854fa4d6109c9333ae0993554John McCall/// TypeSpecTypeLoc.  Since there is not actually a TypeSpecType in
174ed97649e9574b9d854fa4d6109c9333ae0993554John McCall/// the type hierarchy, this is made somewhat complicated.
175ed97649e9574b9d854fa4d6109c9333ae0993554John McCall///
176ed97649e9574b9d854fa4d6109c9333ae0993554John McCall/// There are a lot of types that currently use TypeSpecTypeLoc
177ed97649e9574b9d854fa4d6109c9333ae0993554John McCall/// because it's a convenient base class.  Ideally we would not accept
178ed97649e9574b9d854fa4d6109c9333ae0993554John McCall/// those here, but ideally we would have better implementations for
179ed97649e9574b9d854fa4d6109c9333ae0993554John McCall/// them.
180ed97649e9574b9d854fa4d6109c9333ae0993554John McCallbool TypeSpecTypeLoc::classof(const TypeLoc *TL) {
181ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  if (TL->getType().hasLocalQualifiers()) return false;
182ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  return TSTChecker().Visit(*TL);
183ed97649e9574b9d854fa4d6109c9333ae0993554John McCall}
184cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall
185cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall// Reimplemented to account for GNU/C++ extension
186cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall//     typeof unary-expression
187cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall// where there are no parentheses.
188bd054dba8a3023821f2a0951b0fae05e3522a7c9Abramo BagnaraSourceRange TypeOfExprTypeLoc::getLocalSourceRange() const {
189cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  if (getRParenLoc().isValid())
190cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall    return SourceRange(getTypeofLoc(), getRParenLoc());
191cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  else
192cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall    return SourceRange(getTypeofLoc(),
193cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall                       getUnderlyingExpr()->getSourceRange().getEnd());
194cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall}
195ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor
196ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor
197ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas GregorTypeSpecifierType BuiltinTypeLoc::getWrittenTypeSpec() const {
198ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor  if (needsExtraLocalData())
199ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor    return static_cast<TypeSpecifierType>(getWrittenBuiltinSpecs().Type);
2003026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie  switch (getTypePtr()->getKind()) {
2013026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie  case BuiltinType::Void:
2023026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie    return TST_void;
2033026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie  case BuiltinType::Bool:
2043026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie    return TST_bool;
2053026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie  case BuiltinType::Char_U:
2063026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie  case BuiltinType::Char_S:
2073026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie    return TST_char;
2083026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie  case BuiltinType::Char16:
2093026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie    return TST_char16;
2103026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie  case BuiltinType::Char32:
2113026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie    return TST_char32;
2123026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie  case BuiltinType::WChar_S:
2133026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie  case BuiltinType::WChar_U:
2143026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie    return TST_wchar;
2153026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie  case BuiltinType::UChar:
2163026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie  case BuiltinType::UShort:
2173026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie  case BuiltinType::UInt:
2183026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie  case BuiltinType::ULong:
2193026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie  case BuiltinType::ULongLong:
2203026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie  case BuiltinType::UInt128:
2213026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie  case BuiltinType::SChar:
2223026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie  case BuiltinType::Short:
2233026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie  case BuiltinType::Int:
2243026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie  case BuiltinType::Long:
2253026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie  case BuiltinType::LongLong:
2263026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie  case BuiltinType::Int128:
2273026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie  case BuiltinType::Half:
2283026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie  case BuiltinType::Float:
2293026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie  case BuiltinType::Double:
2303026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie  case BuiltinType::LongDouble:
2313026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie    llvm_unreachable("Builtin type needs extra local data!");
2323026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie    // Fall through, if the impossible happens.
2333026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie
2343026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie  case BuiltinType::NullPtr:
2353026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie  case BuiltinType::Overload:
2363026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie  case BuiltinType::Dependent:
2373026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie  case BuiltinType::BoundMember:
2383026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie  case BuiltinType::UnknownAny:
2393026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie  case BuiltinType::ARCUnbridgedCast:
2403026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie  case BuiltinType::PseudoObject:
2413026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie  case BuiltinType::ObjCId:
2423026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie  case BuiltinType::ObjCClass:
2433026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie  case BuiltinType::ObjCSel:
244a6c66cedc022c9e5d45a937d6b8cff491a6bf81bEli Friedman  case BuiltinType::BuiltinFn:
2453026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie    return TST_unspecified;
246ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor  }
2473026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie
2483026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie  llvm_unreachable("Invalid BuiltinType Kind!");
249ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor}
250140a2bd77539b4537010d8cd6a0a3805ce724b3eAbramo Bagnara
251723df245307a530da5433dfb43accf187dc3e243Abramo BagnaraTypeLoc TypeLoc::IgnoreParensImpl(TypeLoc TL) {
252140a2bd77539b4537010d8cd6a0a3805ce724b3eAbramo Bagnara  while (ParenTypeLoc* PTL = dyn_cast<ParenTypeLoc>(&TL))
253140a2bd77539b4537010d8cd6a0a3805ce724b3eAbramo Bagnara    TL = PTL->getInnerLoc();
254140a2bd77539b4537010d8cd6a0a3805ce724b3eAbramo Bagnara  return TL;
255140a2bd77539b4537010d8cd6a0a3805ce724b3eAbramo Bagnara}
256c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor
2579e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregorvoid ElaboratedTypeLoc::initializeLocal(ASTContext &Context,
2589e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor                                        SourceLocation Loc) {
25938a42916cb07fd368d9e2ae1e7915fa896f9ec06Abramo Bagnara  setElaboratedKeywordLoc(Loc);
2609e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor  NestedNameSpecifierLocBuilder Builder;
2619e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor  Builder.MakeTrivial(Context, getTypePtr()->getQualifier(), Loc);
2629e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor  setQualifierLoc(Builder.getWithLocInContext(Context));
2639e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor}
2649e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor
2652494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregorvoid DependentNameTypeLoc::initializeLocal(ASTContext &Context,
2662494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor                                           SourceLocation Loc) {
26738a42916cb07fd368d9e2ae1e7915fa896f9ec06Abramo Bagnara  setElaboratedKeywordLoc(Loc);
2682494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor  NestedNameSpecifierLocBuilder Builder;
2692494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor  Builder.MakeTrivial(Context, getTypePtr()->getQualifier(), Loc);
2702494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor  setQualifierLoc(Builder.getWithLocInContext(Context));
2712494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor  setNameLoc(Loc);
2722494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor}
2732494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor
27466581d41527628d4b37f7b05c288f77be7415d7dAbramo Bagnaravoid
27566581d41527628d4b37f7b05c288f77be7415d7dAbramo BagnaraDependentTemplateSpecializationTypeLoc::initializeLocal(ASTContext &Context,
27694fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor                                                        SourceLocation Loc) {
27755d23c925b058be29b792008ddb7d68f6c4fa9a0Abramo Bagnara  setElaboratedKeywordLoc(Loc);
27894fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor  if (getTypePtr()->getQualifier()) {
27994fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor    NestedNameSpecifierLocBuilder Builder;
28094fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor    Builder.MakeTrivial(Context, getTypePtr()->getQualifier(), Loc);
28194fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor    setQualifierLoc(Builder.getWithLocInContext(Context));
28294fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor  } else {
28394fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor    setQualifierLoc(NestedNameSpecifierLoc());
28494fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor  }
28566581d41527628d4b37f7b05c288f77be7415d7dAbramo Bagnara  setTemplateKeywordLoc(Loc);
28655d23c925b058be29b792008ddb7d68f6c4fa9a0Abramo Bagnara  setTemplateNameLoc(Loc);
28794fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor  setLAngleLoc(Loc);
28894fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor  setRAngleLoc(Loc);
28994fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor  TemplateSpecializationTypeLoc::initializeArgLocs(Context, getNumArgs(),
29094fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor                                                   getTypePtr()->getArgs(),
29194fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor                                                   getArgInfos(), Loc);
29294fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor}
29394fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor
294c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregorvoid TemplateSpecializationTypeLoc::initializeArgLocs(ASTContext &Context,
295c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor                                                      unsigned NumArgs,
296c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor                                                  const TemplateArgument *Args,
297c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor                                              TemplateArgumentLocInfo *ArgInfos,
298c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor                                                      SourceLocation Loc) {
299c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor  for (unsigned i = 0, e = NumArgs; i != e; ++i) {
300c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor    switch (Args[i].getKind()) {
301c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor    case TemplateArgument::Null:
302c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor    case TemplateArgument::Declaration:
303c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor    case TemplateArgument::Integral:
304c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor    case TemplateArgument::Pack:
305c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor    case TemplateArgument::Expression:
3061e855657867e95c8302f55de3f63409f9b1927c3Matt Beaumont-Gay      ArgInfos[i] = TemplateArgumentLocInfo(Args[i].getAsExpr());
307c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor      break;
308c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor
309c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor    case TemplateArgument::Type:
310c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor      ArgInfos[i] = TemplateArgumentLocInfo(
311c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor                          Context.getTrivialTypeSourceInfo(Args[i].getAsType(),
312c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor                                                           Loc));
313c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor      break;
314c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor
315c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor    case TemplateArgument::Template:
316b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor    case TemplateArgument::TemplateExpansion: {
317b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor      NestedNameSpecifierLocBuilder Builder;
318b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor      TemplateName Template = Args[i].getAsTemplate();
319b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor      if (DependentTemplateName *DTN = Template.getAsDependentTemplateName())
320b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor        Builder.MakeTrivial(Context, DTN->getQualifier(), Loc);
321b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor      else if (QualifiedTemplateName *QTN = Template.getAsQualifiedTemplateName())
322b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor        Builder.MakeTrivial(Context, QTN->getQualifier(), Loc);
323c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor
324b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor      ArgInfos[i] = TemplateArgumentLocInfo(
325b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor                                           Builder.getWithLocInContext(Context),
326b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor                                            Loc,
327b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor                                Args[i].getKind() == TemplateArgument::Template
328b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor                                            ? SourceLocation()
329b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor                                            : Loc);
330c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor      break;
331b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor    }
332c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor    }
333c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor  }
334c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor}
335