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