TypeLoc.cpp revision 94fdffa4a572fc14ac296f5f1aae9db3734c72f1
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: 105e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara break; 106e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara default: 107e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara TypeLoc Next = Cur.getNextTypeLoc(); 108e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara if (Next.isNull()) break; 109e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara Cur = Next; 110e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara continue; 111e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara } 112e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara break; 113e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara } 114e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara return Cur.getLocalSourceRange().getBegin(); 115e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara} 116e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara 117e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo BagnaraSourceLocation TypeLoc::getEndLoc() const { 118e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara TypeLoc Cur = *this; 119e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara while (true) { 120e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara switch (Cur.getTypeLocClass()) { 121e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara default: 122e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara break; 123e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara case Qualified: 124e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara case Elaborated: 125e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara Cur = Cur.getNextTypeLoc(); 126e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara continue; 127e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara } 128e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara break; 129e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara } 130e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara return Cur.getLocalSourceRange().getEnd(); 131e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara} 132e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara 133e4aec0eae303e926643c7239cf7b0197ea9f63e2Abramo Bagnara 134ed97649e9574b9d854fa4d6109c9333ae0993554John McCallnamespace { 135ed97649e9574b9d854fa4d6109c9333ae0993554John McCall struct TSTChecker : public TypeLocVisitor<TSTChecker, bool> { 136ed97649e9574b9d854fa4d6109c9333ae0993554John McCall // Overload resolution does the real work for us. 137ed97649e9574b9d854fa4d6109c9333ae0993554John McCall static bool isTypeSpec(TypeSpecTypeLoc _) { return true; } 138ed97649e9574b9d854fa4d6109c9333ae0993554John McCall static bool isTypeSpec(TypeLoc _) { return false; } 139ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 140ed97649e9574b9d854fa4d6109c9333ae0993554John McCall#define ABSTRACT_TYPELOC(CLASS, PARENT) 141ed97649e9574b9d854fa4d6109c9333ae0993554John McCall#define TYPELOC(CLASS, PARENT) \ 142ed97649e9574b9d854fa4d6109c9333ae0993554John McCall bool Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc) { \ 143ed97649e9574b9d854fa4d6109c9333ae0993554John McCall return isTypeSpec(TyLoc); \ 144ed97649e9574b9d854fa4d6109c9333ae0993554John McCall } 145ed97649e9574b9d854fa4d6109c9333ae0993554John McCall#include "clang/AST/TypeLocNodes.def" 146ed97649e9574b9d854fa4d6109c9333ae0993554John McCall }; 147ed97649e9574b9d854fa4d6109c9333ae0993554John McCall} 148ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 149ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 150ed97649e9574b9d854fa4d6109c9333ae0993554John McCall/// \brief Determines if the given type loc corresponds to a 151ed97649e9574b9d854fa4d6109c9333ae0993554John McCall/// TypeSpecTypeLoc. Since there is not actually a TypeSpecType in 152ed97649e9574b9d854fa4d6109c9333ae0993554John McCall/// the type hierarchy, this is made somewhat complicated. 153ed97649e9574b9d854fa4d6109c9333ae0993554John McCall/// 154ed97649e9574b9d854fa4d6109c9333ae0993554John McCall/// There are a lot of types that currently use TypeSpecTypeLoc 155ed97649e9574b9d854fa4d6109c9333ae0993554John McCall/// because it's a convenient base class. Ideally we would not accept 156ed97649e9574b9d854fa4d6109c9333ae0993554John McCall/// those here, but ideally we would have better implementations for 157ed97649e9574b9d854fa4d6109c9333ae0993554John McCall/// them. 158ed97649e9574b9d854fa4d6109c9333ae0993554John McCallbool TypeSpecTypeLoc::classof(const TypeLoc *TL) { 159ed97649e9574b9d854fa4d6109c9333ae0993554John McCall if (TL->getType().hasLocalQualifiers()) return false; 160ed97649e9574b9d854fa4d6109c9333ae0993554John McCall return TSTChecker().Visit(*TL); 161ed97649e9574b9d854fa4d6109c9333ae0993554John McCall} 162cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall 163cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall// Reimplemented to account for GNU/C++ extension 164cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall// typeof unary-expression 165cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall// where there are no parentheses. 166bd054dba8a3023821f2a0951b0fae05e3522a7c9Abramo BagnaraSourceRange TypeOfExprTypeLoc::getLocalSourceRange() const { 167cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall if (getRParenLoc().isValid()) 168cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall return SourceRange(getTypeofLoc(), getRParenLoc()); 169cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall else 170cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall return SourceRange(getTypeofLoc(), 171cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall getUnderlyingExpr()->getSourceRange().getEnd()); 172cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall} 173ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor 174ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor 175ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas GregorTypeSpecifierType BuiltinTypeLoc::getWrittenTypeSpec() const { 176ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor if (needsExtraLocalData()) 177ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor return static_cast<TypeSpecifierType>(getWrittenBuiltinSpecs().Type); 178ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor else { 179ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor switch (getTypePtr()->getKind()) { 180ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor case BuiltinType::Void: 181ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor return TST_void; 182ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor case BuiltinType::Bool: 183ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor return TST_bool; 184ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor case BuiltinType::Char_U: 185ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor case BuiltinType::Char_S: 186ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor return TST_char; 187ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor case BuiltinType::Char16: 188ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor return TST_char16; 189ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor case BuiltinType::Char32: 190ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor return TST_char32; 1913f59c975aa5d047f7edd1b900b5e885c38af0ef7Chris Lattner case BuiltinType::WChar_S: 1923f59c975aa5d047f7edd1b900b5e885c38af0ef7Chris Lattner case BuiltinType::WChar_U: 193ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor return TST_wchar; 19434b41d939a1328f484511c6002ba2456db879a29Richard Smith 195ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor case BuiltinType::UChar: 196ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor case BuiltinType::UShort: 197ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor case BuiltinType::UInt: 198ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor case BuiltinType::ULong: 199ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor case BuiltinType::ULongLong: 200ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor case BuiltinType::UInt128: 201ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor case BuiltinType::SChar: 202ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor case BuiltinType::Short: 203ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor case BuiltinType::Int: 204ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor case BuiltinType::Long: 205ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor case BuiltinType::LongLong: 206ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor case BuiltinType::Int128: 207d038f361d2b4368af7ab85bd04d5aafcc3ea649dDouglas Gregor case BuiltinType::Float: 208d038f361d2b4368af7ab85bd04d5aafcc3ea649dDouglas Gregor case BuiltinType::Double: 209d038f361d2b4368af7ab85bd04d5aafcc3ea649dDouglas Gregor case BuiltinType::LongDouble: 210ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor llvm_unreachable("Builtin type needs extra local data!"); 211ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor // Fall through, if the impossible happens. 212ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor 213ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor case BuiltinType::NullPtr: 214ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor case BuiltinType::Overload: 215ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor case BuiltinType::Dependent: 216ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor case BuiltinType::ObjCId: 217ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor case BuiltinType::ObjCClass: 218ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor case BuiltinType::ObjCSel: 219ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor return TST_unspecified; 220ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor } 221ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor } 222ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor 223ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor return TST_unspecified; 224ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor} 225140a2bd77539b4537010d8cd6a0a3805ce724b3eAbramo Bagnara 226723df245307a530da5433dfb43accf187dc3e243Abramo BagnaraTypeLoc TypeLoc::IgnoreParensImpl(TypeLoc TL) { 227140a2bd77539b4537010d8cd6a0a3805ce724b3eAbramo Bagnara while (ParenTypeLoc* PTL = dyn_cast<ParenTypeLoc>(&TL)) 228140a2bd77539b4537010d8cd6a0a3805ce724b3eAbramo Bagnara TL = PTL->getInnerLoc(); 229140a2bd77539b4537010d8cd6a0a3805ce724b3eAbramo Bagnara return TL; 230140a2bd77539b4537010d8cd6a0a3805ce724b3eAbramo Bagnara} 231c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor 2329e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregorvoid ElaboratedTypeLoc::initializeLocal(ASTContext &Context, 2339e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor SourceLocation Loc) { 2349e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor setKeywordLoc(Loc); 2359e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor NestedNameSpecifierLocBuilder Builder; 2369e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor Builder.MakeTrivial(Context, getTypePtr()->getQualifier(), Loc); 2379e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor setQualifierLoc(Builder.getWithLocInContext(Context)); 2389e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor} 2399e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor 2402494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregorvoid DependentNameTypeLoc::initializeLocal(ASTContext &Context, 2412494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor SourceLocation Loc) { 2422494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor setKeywordLoc(Loc); 2432494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor NestedNameSpecifierLocBuilder Builder; 2442494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor Builder.MakeTrivial(Context, getTypePtr()->getQualifier(), Loc); 2452494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor setQualifierLoc(Builder.getWithLocInContext(Context)); 2462494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor setNameLoc(Loc); 2472494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor} 2482494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor 24994fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregorvoid 25094fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas GregorDependentTemplateSpecializationTypeLoc::initializeLocal(ASTContext &Context, 25194fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor SourceLocation Loc) { 25294fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor setKeywordLoc(Loc); 25394fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor if (getTypePtr()->getQualifier()) { 25494fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor NestedNameSpecifierLocBuilder Builder; 25594fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor Builder.MakeTrivial(Context, getTypePtr()->getQualifier(), Loc); 25694fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor setQualifierLoc(Builder.getWithLocInContext(Context)); 25794fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor } else { 25894fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor setQualifierLoc(NestedNameSpecifierLoc()); 25994fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor } 26094fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor 26194fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor setNameLoc(Loc); 26294fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor setLAngleLoc(Loc); 26394fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor setRAngleLoc(Loc); 26494fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor TemplateSpecializationTypeLoc::initializeArgLocs(Context, getNumArgs(), 26594fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor getTypePtr()->getArgs(), 26694fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor getArgInfos(), Loc); 26794fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor} 26894fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor 269c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregorvoid TemplateSpecializationTypeLoc::initializeArgLocs(ASTContext &Context, 270c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor unsigned NumArgs, 271c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor const TemplateArgument *Args, 272c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor TemplateArgumentLocInfo *ArgInfos, 273c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor SourceLocation Loc) { 274c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor for (unsigned i = 0, e = NumArgs; i != e; ++i) { 275c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor switch (Args[i].getKind()) { 276c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor case TemplateArgument::Null: 277c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor case TemplateArgument::Declaration: 278c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor case TemplateArgument::Integral: 279c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor case TemplateArgument::Pack: 280c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor case TemplateArgument::Expression: 281c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor // FIXME: Can we do better for declarations and integral values? 282c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor ArgInfos[i] = TemplateArgumentLocInfo(); 283c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor break; 284c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor 285c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor case TemplateArgument::Type: 286c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor ArgInfos[i] = TemplateArgumentLocInfo( 287c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor Context.getTrivialTypeSourceInfo(Args[i].getAsType(), 288c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor Loc)); 289c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor break; 290c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor 291c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor case TemplateArgument::Template: 292c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor ArgInfos[i] = TemplateArgumentLocInfo(SourceRange(Loc), Loc, 293c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor SourceLocation()); 294c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor break; 295c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor 296c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor case TemplateArgument::TemplateExpansion: 297c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor ArgInfos[i] = TemplateArgumentLocInfo(SourceRange(Loc), Loc, Loc); 298c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor break; 299c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor } 300c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor } 301c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor} 302c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor 303