TypeLoc.cpp revision 44ee0a710c59d8e6793189f903bae21c16814324
1dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller//===--- TypeLoc.cpp - Type Source Info Wrapper -----------------*- C++ -*-===//
2dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller//
3dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller//                     The LLVM Compiler Infrastructure
4dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller//
5dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller// This file is distributed under the University of Illinois Open Source
6dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller// License. See LICENSE.TXT for details.
7dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller//
8dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller//===----------------------------------------------------------------------===//
9dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller//
10dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller//  This file defines the TypeLoc subclasses implementations.
11dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller//
12dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller//===----------------------------------------------------------------------===//
13dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
14dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller#include "clang/AST/TypeLoc.h"
15dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller#include "clang/AST/ASTContext.h"
16dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller#include "clang/AST/Expr.h"
175ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller#include "clang/AST/TypeLocVisitor.h"
185ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller#include "llvm/Support/ErrorHandling.h"
195ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller#include "llvm/Support/raw_ostream.h"
205ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Millerusing namespace clang;
215ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller
22dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller//===----------------------------------------------------------------------===//
23dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller// TypeLoc Implementation
24dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller//===----------------------------------------------------------------------===//
25dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
26dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millernamespace {
27dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller  class TypeLocRanger : public TypeLocVisitor<TypeLocRanger, SourceRange> {
2823d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler  public:
299cf2c523d82ec14632fd0db920dcc8909c0f44a5Jim Miller#define ABSTRACT_TYPELOC(CLASS, PARENT)
3023d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler#define TYPELOC(CLASS, PARENT) \
31dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    SourceRange Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc) { \
32dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller      return TyLoc.getLocalSourceRange(); \
33dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
34dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller#include "clang/AST/TypeLocNodes.def"
35dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller  };
3623d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler}
3723d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler
3823d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel SandlerSourceRange TypeLoc::getLocalSourceRangeImpl(TypeLoc TL) {
3923d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler  if (TL.isNull()) return SourceRange();
4023d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler  return TypeLocRanger().Visit(TL);
41dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller}
42dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
434b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Millernamespace {
443efe106264262924a9218268d3c7d19d272fb7a2Jim Miller  class TypeAligner : public TypeLocVisitor<TypeAligner, unsigned> {
453efe106264262924a9218268d3c7d19d272fb7a2Jim Miller  public:
463efe106264262924a9218268d3c7d19d272fb7a2Jim Miller#define ABSTRACT_TYPELOC(CLASS, PARENT)
473efe106264262924a9218268d3c7d19d272fb7a2Jim Miller#define TYPELOC(CLASS, PARENT) \
483efe106264262924a9218268d3c7d19d272fb7a2Jim Miller    unsigned Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc) { \
493efe106264262924a9218268d3c7d19d272fb7a2Jim Miller      return TyLoc.getLocalDataAlignment(); \
503efe106264262924a9218268d3c7d19d272fb7a2Jim Miller    }
513efe106264262924a9218268d3c7d19d272fb7a2Jim Miller#include "clang/AST/TypeLocNodes.def"
523efe106264262924a9218268d3c7d19d272fb7a2Jim Miller  };
533efe106264262924a9218268d3c7d19d272fb7a2Jim Miller}
543efe106264262924a9218268d3c7d19d272fb7a2Jim Miller
553efe106264262924a9218268d3c7d19d272fb7a2Jim Miller/// \brief Returns the alignment of the type source info data block.
563efe106264262924a9218268d3c7d19d272fb7a2Jim Millerunsigned TypeLoc::getLocalAlignmentForType(QualType Ty) {
573efe106264262924a9218268d3c7d19d272fb7a2Jim Miller  if (Ty.isNull()) return 1;
583efe106264262924a9218268d3c7d19d272fb7a2Jim Miller  return TypeAligner().Visit(TypeLoc(Ty, 0));
593efe106264262924a9218268d3c7d19d272fb7a2Jim Miller}
603efe106264262924a9218268d3c7d19d272fb7a2Jim Miller
613efe106264262924a9218268d3c7d19d272fb7a2Jim Millernamespace {
623efe106264262924a9218268d3c7d19d272fb7a2Jim Miller  class TypeSizer : public TypeLocVisitor<TypeSizer, unsigned> {
633efe106264262924a9218268d3c7d19d272fb7a2Jim Miller  public:
643efe106264262924a9218268d3c7d19d272fb7a2Jim Miller#define ABSTRACT_TYPELOC(CLASS, PARENT)
653efe106264262924a9218268d3c7d19d272fb7a2Jim Miller#define TYPELOC(CLASS, PARENT) \
663efe106264262924a9218268d3c7d19d272fb7a2Jim Miller    unsigned Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc) { \
673efe106264262924a9218268d3c7d19d272fb7a2Jim Miller      return TyLoc.getLocalDataSize(); \
683efe106264262924a9218268d3c7d19d272fb7a2Jim Miller    }
693efe106264262924a9218268d3c7d19d272fb7a2Jim Miller#include "clang/AST/TypeLocNodes.def"
703efe106264262924a9218268d3c7d19d272fb7a2Jim Miller  };
713efe106264262924a9218268d3c7d19d272fb7a2Jim Miller}
723efe106264262924a9218268d3c7d19d272fb7a2Jim Miller
733efe106264262924a9218268d3c7d19d272fb7a2Jim Miller/// \brief Returns the size of the type source info data block.
745ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Millerunsigned TypeLoc::getFullDataSizeForType(QualType Ty) {
753efe106264262924a9218268d3c7d19d272fb7a2Jim Miller  unsigned Total = 0;
763efe106264262924a9218268d3c7d19d272fb7a2Jim Miller  TypeLoc TyLoc(Ty, 0);
7723d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler  unsigned MaxAlign = 1;
783efe106264262924a9218268d3c7d19d272fb7a2Jim Miller  while (!TyLoc.isNull()) {
793efe106264262924a9218268d3c7d19d272fb7a2Jim Miller    unsigned Align = getLocalAlignmentForType(TyLoc.getType());
803efe106264262924a9218268d3c7d19d272fb7a2Jim Miller    MaxAlign = std::max(Align, MaxAlign);
8123d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler    Total = llvm::RoundUpToAlignment(Total, Align);
823efe106264262924a9218268d3c7d19d272fb7a2Jim Miller    Total += TypeSizer().Visit(TyLoc);
830a4f900463024908220d0c9bf4b291a6e1284846Adam Cohen    TyLoc = TyLoc.getNextTypeLoc();
843efe106264262924a9218268d3c7d19d272fb7a2Jim Miller  }
853efe106264262924a9218268d3c7d19d272fb7a2Jim Miller  Total = llvm::RoundUpToAlignment(Total, MaxAlign);
863efe106264262924a9218268d3c7d19d272fb7a2Jim Miller  return Total;
873efe106264262924a9218268d3c7d19d272fb7a2Jim Miller}
883efe106264262924a9218268d3c7d19d272fb7a2Jim Miller
893efe106264262924a9218268d3c7d19d272fb7a2Jim Millernamespace {
903efe106264262924a9218268d3c7d19d272fb7a2Jim Miller  class NextLoc : public TypeLocVisitor<NextLoc, TypeLoc> {
916dbf8610e94c1b41e0124577101d6369fd204ad3Adam Cohen  public:
9223d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler#define ABSTRACT_TYPELOC(CLASS, PARENT)
933efe106264262924a9218268d3c7d19d272fb7a2Jim Miller#define TYPELOC(CLASS, PARENT) \
943efe106264262924a9218268d3c7d19d272fb7a2Jim Miller    TypeLoc Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc) { \
953efe106264262924a9218268d3c7d19d272fb7a2Jim Miller      return TyLoc.getNextTypeLoc(); \
96dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
97dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller#include "clang/AST/TypeLocNodes.def"
98dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller  };
99dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller}
100dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
101dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller/// \brief Get the next TypeLoc pointed by this TypeLoc, e.g for "int*" the
102dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller/// TypeLoc is a PointerLoc and next TypeLoc is for "int".
103dcb3d84b82cc2448d04e73359a716581bfb657dbJim MillerTypeLoc TypeLoc::getNextTypeLocImpl(TypeLoc TL) {
10423d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler  return NextLoc().Visit(TL);
10523d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler}
10623d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler
107dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller/// \brief Initializes a type location, and all of its children
108dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller/// recursively, as if the entire tree had been written in the
109dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller/// given location.
11023d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandlervoid TypeLoc::initializeImpl(ASTContext &Context, TypeLoc TL,
11123d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler                             SourceLocation Loc) {
112dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller  while (true) {
113dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    switch (TL.getTypeLocClass()) {
114dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller#define ABSTRACT_TYPELOC(CLASS, PARENT)
11523d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler#define TYPELOC(CLASS, PARENT)        \
11623d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler    case CLASS: {                     \
117dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller      CLASS##TypeLoc TLCasted = TL.castAs<CLASS##TypeLoc>(); \
11823d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler      TLCasted.initializeLocal(Context, Loc);  \
11923d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler      TL = TLCasted.getNextTypeLoc(); \
12023d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler      if (!TL) return;                \
12123d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler      continue;                       \
12223d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler    }
12323d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler#include "clang/AST/TypeLocNodes.def"
12423d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler    }
12523d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler  }
12623d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler}
12723d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler
128dcb3d84b82cc2448d04e73359a716581bfb657dbJim MillerSourceLocation TypeLoc::getBeginLoc() const {
12923d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler  TypeLoc Cur = *this;
13023d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler  TypeLoc LeftMost = Cur;
13123d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler  while (true) {
13223d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler    switch (Cur.getTypeLocClass()) {
13323d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler    case Elaborated:
13423d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler      LeftMost = Cur;
13523d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler      break;
13623d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler    case FunctionProto:
13723d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler      if (Cur.castAs<FunctionProtoTypeLoc>().getTypePtr()
13823d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler              ->hasTrailingReturn()) {
13923d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler        LeftMost = Cur;
14023d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler        break;
14123d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler      }
14223d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler      /* Fall through */
14323d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler    case FunctionNoProto:
14423d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler    case ConstantArray:
14523d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler    case DependentSizedArray:
14623d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler    case IncompleteArray:
14723d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler    case VariableArray:
14823d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler      // FIXME: Currently QualifiedTypeLoc does not have a source range
14923d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler    case Qualified:
15023d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler      Cur = Cur.getNextTypeLoc();
151dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller      continue;
15223d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler    default:
15323d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler      if (!Cur.getLocalSourceRange().getBegin().isInvalid())
15423d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler        LeftMost = Cur;
15523d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler      Cur = Cur.getNextTypeLoc();
15623d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler      if (Cur.isNull())
157dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        break;
15823d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler      continue;
159dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    } // switch
160dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    break;
1616fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen  } // while
1626fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen  return LeftMost.getLocalSourceRange().getBegin();
1636fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen}
1646fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen
16523d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel SandlerSourceLocation TypeLoc::getEndLoc() const {
16623d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler  TypeLoc Cur = *this;
167dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller  TypeLoc Last;
168dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller  while (true) {
169dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    switch (Cur.getTypeLocClass()) {
170dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    default:
171dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller      if (!Last)
172dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller	Last = Cur;
173dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller      return Last.getLocalSourceRange().getEnd();
174dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    case Paren:
175dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    case ConstantArray:
176dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    case DependentSizedArray:
177dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    case IncompleteArray:
178dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    case VariableArray:
179dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    case FunctionNoProto:
180dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller      Last = Cur;
181dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller      break;
182dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    case FunctionProto:
183dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller      if (Cur.castAs<FunctionProtoTypeLoc>().getTypePtr()->hasTrailingReturn())
184dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        Last = TypeLoc();
185dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller      else
186dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        Last = Cur;
187dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller      break;
188dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    case Pointer:
189dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    case BlockPointer:
190dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    case MemberPointer:
191dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    case LValueReference:
192dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    case RValueReference:
193dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    case PackExpansion:
194dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller      if (!Last)
195dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller	Last = Cur;
196dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller      break;
197dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    case Qualified:
198dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    case Elaborated:
199dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller      break;
200dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
201dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    Cur = Cur.getNextTypeLoc();
202dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller  }
203dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller}
204dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
205dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
206dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millernamespace {
207dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller  struct TSTChecker : public TypeLocVisitor<TSTChecker, bool> {
208dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    // Overload resolution does the real work for us.
209dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    static bool isTypeSpec(TypeSpecTypeLoc _) { return true; }
210dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    static bool isTypeSpec(TypeLoc _) { return false; }
211dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
212dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller#define ABSTRACT_TYPELOC(CLASS, PARENT)
21323d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler#define TYPELOC(CLASS, PARENT) \
21423d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler    bool Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc) { \
215dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller      return isTypeSpec(TyLoc); \
216dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
217dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller#include "clang/AST/TypeLocNodes.def"
218dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller  };
219dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller}
220dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
221dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
222dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller/// \brief Determines if the given type loc corresponds to a
223dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller/// TypeSpecTypeLoc.  Since there is not actually a TypeSpecType in
224dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller/// the type hierarchy, this is made somewhat complicated.
2253efe106264262924a9218268d3c7d19d272fb7a2Jim Miller///
226dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller/// There are a lot of types that currently use TypeSpecTypeLoc
22723d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler/// because it's a convenient base class.  Ideally we would not accept
22823d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler/// those here, but ideally we would have better implementations for
2293efe106264262924a9218268d3c7d19d272fb7a2Jim Miller/// them.
230dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerbool TypeSpecTypeLoc::isKind(const TypeLoc &TL) {
2313efe106264262924a9218268d3c7d19d272fb7a2Jim Miller  if (TL.getType().hasLocalQualifiers()) return false;
2323efe106264262924a9218268d3c7d19d272fb7a2Jim Miller  return TSTChecker().Visit(TL);
233dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller}
2343efe106264262924a9218268d3c7d19d272fb7a2Jim Miller
235dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller// Reimplemented to account for GNU/C++ extension
23623d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler//     typeof unary-expression
2373efe106264262924a9218268d3c7d19d272fb7a2Jim Miller// where there are no parentheses.
23823d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel SandlerSourceRange TypeOfExprTypeLoc::getLocalSourceRange() const {
2393efe106264262924a9218268d3c7d19d272fb7a2Jim Miller  if (getRParenLoc().isValid())
240dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    return SourceRange(getTypeofLoc(), getRParenLoc());
2413efe106264262924a9218268d3c7d19d272fb7a2Jim Miller  else
2423efe106264262924a9218268d3c7d19d272fb7a2Jim Miller    return SourceRange(getTypeofLoc(),
243dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                       getUnderlyingExpr()->getSourceRange().getEnd());
2443efe106264262924a9218268d3c7d19d272fb7a2Jim Miller}
24523d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler
2463efe106264262924a9218268d3c7d19d272fb7a2Jim Miller
2473efe106264262924a9218268d3c7d19d272fb7a2Jim MillerTypeSpecifierType BuiltinTypeLoc::getWrittenTypeSpec() const {
2483efe106264262924a9218268d3c7d19d272fb7a2Jim Miller  if (needsExtraLocalData())
249dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    return static_cast<TypeSpecifierType>(getWrittenBuiltinSpecs().Type);
250dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller  switch (getTypePtr()->getKind()) {
2514b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller  case BuiltinType::Void:
2524b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller    return TST_void;
2533efe106264262924a9218268d3c7d19d272fb7a2Jim Miller  case BuiltinType::Bool:
2544b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller    return TST_bool;
2553efe106264262924a9218268d3c7d19d272fb7a2Jim Miller  case BuiltinType::Char_U:
2564b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller  case BuiltinType::Char_S:
2574b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller    return TST_char;
2584b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller  case BuiltinType::Char16:
2594b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller    return TST_char16;
2604b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller  case BuiltinType::Char32:
2614b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller    return TST_char32;
2624b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller  case BuiltinType::WChar_S:
2633efe106264262924a9218268d3c7d19d272fb7a2Jim Miller  case BuiltinType::WChar_U:
2640a4f900463024908220d0c9bf4b291a6e1284846Adam Cohen    return TST_wchar;
2654b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller  case BuiltinType::UChar:
2664b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller  case BuiltinType::UShort:
267dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller  case BuiltinType::UInt:
2684b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller  case BuiltinType::ULong:
2694b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller  case BuiltinType::ULongLong:
2704b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller  case BuiltinType::UInt128:
2714b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller  case BuiltinType::SChar:
272dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller  case BuiltinType::Short:
273dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller  case BuiltinType::Int:
274dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller  case BuiltinType::Long:
27523d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler  case BuiltinType::LongLong:
27623d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler  case BuiltinType::Int128:
2779cf2c523d82ec14632fd0db920dcc8909c0f44a5Jim Miller  case BuiltinType::Half:
27823d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler  case BuiltinType::Float:
2799cf2c523d82ec14632fd0db920dcc8909c0f44a5Jim Miller  case BuiltinType::Double:
2809cf2c523d82ec14632fd0db920dcc8909c0f44a5Jim Miller  case BuiltinType::LongDouble:
281    llvm_unreachable("Builtin type needs extra local data!");
282    // Fall through, if the impossible happens.
283
284  case BuiltinType::NullPtr:
285  case BuiltinType::Overload:
286  case BuiltinType::Dependent:
287  case BuiltinType::BoundMember:
288  case BuiltinType::UnknownAny:
289  case BuiltinType::ARCUnbridgedCast:
290  case BuiltinType::PseudoObject:
291  case BuiltinType::ObjCId:
292  case BuiltinType::ObjCClass:
293  case BuiltinType::ObjCSel:
294  case BuiltinType::OCLImage1d:
295  case BuiltinType::OCLImage1dArray:
296  case BuiltinType::OCLImage1dBuffer:
297  case BuiltinType::OCLImage2d:
298  case BuiltinType::OCLImage2dArray:
299  case BuiltinType::OCLImage3d:
300  case BuiltinType::OCLSampler:
301  case BuiltinType::OCLEvent:
302  case BuiltinType::BuiltinFn:
303    return TST_unspecified;
304  }
305
306  llvm_unreachable("Invalid BuiltinType Kind!");
307}
308
309TypeLoc TypeLoc::IgnoreParensImpl(TypeLoc TL) {
310  while (ParenTypeLoc PTL = TL.getAs<ParenTypeLoc>())
311    TL = PTL.getInnerLoc();
312  return TL;
313}
314
315void ElaboratedTypeLoc::initializeLocal(ASTContext &Context,
316                                        SourceLocation Loc) {
317  setElaboratedKeywordLoc(Loc);
318  NestedNameSpecifierLocBuilder Builder;
319  Builder.MakeTrivial(Context, getTypePtr()->getQualifier(), Loc);
320  setQualifierLoc(Builder.getWithLocInContext(Context));
321}
322
323void DependentNameTypeLoc::initializeLocal(ASTContext &Context,
324                                           SourceLocation Loc) {
325  setElaboratedKeywordLoc(Loc);
326  NestedNameSpecifierLocBuilder Builder;
327  Builder.MakeTrivial(Context, getTypePtr()->getQualifier(), Loc);
328  setQualifierLoc(Builder.getWithLocInContext(Context));
329  setNameLoc(Loc);
330}
331
332void
333DependentTemplateSpecializationTypeLoc::initializeLocal(ASTContext &Context,
334                                                        SourceLocation Loc) {
335  setElaboratedKeywordLoc(Loc);
336  if (getTypePtr()->getQualifier()) {
337    NestedNameSpecifierLocBuilder Builder;
338    Builder.MakeTrivial(Context, getTypePtr()->getQualifier(), Loc);
339    setQualifierLoc(Builder.getWithLocInContext(Context));
340  } else {
341    setQualifierLoc(NestedNameSpecifierLoc());
342  }
343  setTemplateKeywordLoc(Loc);
344  setTemplateNameLoc(Loc);
345  setLAngleLoc(Loc);
346  setRAngleLoc(Loc);
347  TemplateSpecializationTypeLoc::initializeArgLocs(Context, getNumArgs(),
348                                                   getTypePtr()->getArgs(),
349                                                   getArgInfos(), Loc);
350}
351
352void TemplateSpecializationTypeLoc::initializeArgLocs(ASTContext &Context,
353                                                      unsigned NumArgs,
354                                                  const TemplateArgument *Args,
355                                              TemplateArgumentLocInfo *ArgInfos,
356                                                      SourceLocation Loc) {
357  for (unsigned i = 0, e = NumArgs; i != e; ++i) {
358    switch (Args[i].getKind()) {
359    case TemplateArgument::Null:
360    case TemplateArgument::Declaration:
361    case TemplateArgument::Integral:
362    case TemplateArgument::NullPtr:
363      llvm_unreachable("Impossible TemplateArgument");
364
365    case TemplateArgument::Expression:
366      ArgInfos[i] = TemplateArgumentLocInfo(Args[i].getAsExpr());
367      break;
368
369    case TemplateArgument::Type:
370      ArgInfos[i] = TemplateArgumentLocInfo(
371                          Context.getTrivialTypeSourceInfo(Args[i].getAsType(),
372                                                           Loc));
373      break;
374
375    case TemplateArgument::Template:
376    case TemplateArgument::TemplateExpansion: {
377      NestedNameSpecifierLocBuilder Builder;
378      TemplateName Template = Args[i].getAsTemplate();
379      if (DependentTemplateName *DTN = Template.getAsDependentTemplateName())
380        Builder.MakeTrivial(Context, DTN->getQualifier(), Loc);
381      else if (QualifiedTemplateName *QTN = Template.getAsQualifiedTemplateName())
382        Builder.MakeTrivial(Context, QTN->getQualifier(), Loc);
383
384      ArgInfos[i] = TemplateArgumentLocInfo(
385                                           Builder.getWithLocInContext(Context),
386                                            Loc,
387                                Args[i].getKind() == TemplateArgument::Template
388                                            ? SourceLocation()
389                                            : Loc);
390      break;
391    }
392
393    case TemplateArgument::Pack:
394      ArgInfos[i] = TemplateArgumentLocInfo();
395      break;
396    }
397  }
398}
399