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