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