DeclarationName.cpp revision ac8d75fe94f2aefde5179d53e230b99a1fe1201a
12e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor//===-- DeclarationName.cpp - Declaration names implementation --*- C++ -*-===// 22e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor// 32e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor// The LLVM Compiler Infrastructure 42e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor// 52e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor// This file is distributed under the University of Illinois Open Source 62e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor// License. See LICENSE.TXT for details. 72e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor// 82e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor//===----------------------------------------------------------------------===// 92e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor// 102e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor// This file implements the DeclarationName and DeclarationNameTable 112e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor// classes. 122e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor// 132e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor//===----------------------------------------------------------------------===// 142e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor#include "clang/AST/DeclarationName.h" 1510bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor#include "clang/AST/Type.h" 1610bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor#include "clang/AST/Decl.h" 172e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor#include "clang/Basic/IdentifierTable.h" 182e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor#include "llvm/ADT/FoldingSet.h" 192e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor#include "llvm/Bitcode/Serialize.h" 202e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor#include "llvm/Bitcode/Deserialize.h" 212e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregorusing namespace clang; 222e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 232e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregornamespace clang { 242e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// CXXSpecialName - Records the type associated with one of the 252e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// "special" kinds of declaration names in C++, e.g., constructors, 262e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// destructors, and conversion functions. 272e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregorclass CXXSpecialName 282e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor : public DeclarationNameExtra, public llvm::FoldingSetNode { 292e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregorpublic: 302def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor /// Type - The type associated with this declaration name. 312e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor QualType Type; 322e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 332def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor /// FETokenInfo - Extra information associated with this declaration 342def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor /// name that can be used by the front end. 352def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor void *FETokenInfo; 362def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor 372e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor void Profile(llvm::FoldingSetNodeID &ID) { 382e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor ID.AddInteger(ExtraKindOrNumArgs); 392e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor ID.AddPointer(Type.getAsOpaquePtr()); 402e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor } 412e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor}; 422e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 43e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor/// CXXOperatorIdName - Contains extra information for the name of an 44e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor/// overloaded operator in C++, such as "operator+. 45e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregorclass CXXOperatorIdName : public DeclarationNameExtra { 46e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregorpublic: 47e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor /// FETokenInfo - Extra information associated with this operator 48e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor /// name that can be used by the front end. 49e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor void *FETokenInfo; 50e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor}; 51e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor 522e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregorbool operator<(DeclarationName LHS, DeclarationName RHS) { 532e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor if (IdentifierInfo *LhsId = LHS.getAsIdentifierInfo()) 542e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor if (IdentifierInfo *RhsId = RHS.getAsIdentifierInfo()) 552e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return strcmp(LhsId->getName(), RhsId->getName()) < 0; 562e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 572e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return LHS.getAsOpaqueInteger() < RHS.getAsOpaqueInteger(); 582e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor} 592e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 602e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor} // end namespace clang 612e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 622e1cd4264d363ca869bf37ef160902f211d21b8cDouglas GregorDeclarationName::DeclarationName(Selector Sel) { 632e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor switch (Sel.getNumArgs()) { 642e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor case 0: 652e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor Ptr = reinterpret_cast<uintptr_t>(Sel.getAsIdentifierInfo()); 663eb8dd78a622d257a7fed279714428c3de906f93Ted Kremenek assert((Ptr & PtrMask) == 0 && "Improperly aligned IdentifierInfo"); 672e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor Ptr |= StoredObjCZeroArgSelector; 682e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor break; 692e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 702e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor case 1: 712e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor Ptr = reinterpret_cast<uintptr_t>(Sel.getAsIdentifierInfo()); 723eb8dd78a622d257a7fed279714428c3de906f93Ted Kremenek assert((Ptr & PtrMask) == 0 && "Improperly aligned IdentifierInfo"); 732e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor Ptr |= StoredObjCOneArgSelector; 742e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor break; 752e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 762e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor default: 772e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor Ptr = Sel.InfoPtr & ~Selector::ArgFlags; 783eb8dd78a622d257a7fed279714428c3de906f93Ted Kremenek assert((Ptr & PtrMask) == 0 && "Improperly aligned MultiKeywordSelector"); 79e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor Ptr |= StoredDeclarationNameExtra; 802e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor break; 812e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor } 822e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor} 832e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 842e1cd4264d363ca869bf37ef160902f211d21b8cDouglas GregorDeclarationName::NameKind DeclarationName::getNameKind() const { 852e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor switch (getStoredNameKind()) { 862e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor case StoredIdentifier: return Identifier; 872e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor case StoredObjCZeroArgSelector: return ObjCZeroArgSelector; 882e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor case StoredObjCOneArgSelector: return ObjCOneArgSelector; 892e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 90e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor case StoredDeclarationNameExtra: 912e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor switch (getExtra()->ExtraKindOrNumArgs) { 922e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor case DeclarationNameExtra::CXXConstructor: 932e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return CXXConstructorName; 942e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 952e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor case DeclarationNameExtra::CXXDestructor: 962e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return CXXDestructorName; 972e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 982e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor case DeclarationNameExtra::CXXConversionFunction: 992e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return CXXConversionFunctionName; 1002e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 1012a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor case DeclarationNameExtra::CXXUsingDirective: 1022a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor return CXXUsingDirective; 1032a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor 1042e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor default: 105e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor // Check if we have one of the CXXOperator* enumeration values. 106e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor if (getExtra()->ExtraKindOrNumArgs < 1072a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor DeclarationNameExtra::CXXUsingDirective) 108e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor return CXXOperatorName; 109e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor 1102e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return ObjCMultiArgSelector; 1112e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor } 1122e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor break; 1132e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor } 1142e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 1152e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor // Can't actually get here. 116ac8d75fe94f2aefde5179d53e230b99a1fe1201aChris Lattner assert(0 && "This should be unreachable!"); 1172e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return Identifier; 1182e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor} 1192e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 12010bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregorstd::string DeclarationName::getAsString() const { 12110bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor switch (getNameKind()) { 12210bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor case Identifier: 12310bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor if (const IdentifierInfo *II = getAsIdentifierInfo()) 12410bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor return II->getName(); 12510bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor return ""; 12610bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor 12710bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor case ObjCZeroArgSelector: 12810bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor case ObjCOneArgSelector: 12910bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor case ObjCMultiArgSelector: 130077bf5e2f48acfa9e7d69429b6e4ba86ea14896dChris Lattner return getObjCSelector().getAsString(); 13110bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor 13210bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor case CXXConstructorName: { 13310bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor QualType ClassType = getCXXNameType(); 13410bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor if (const RecordType *ClassRec = ClassType->getAsRecordType()) 13539f34e97d6a468f0a7dfa5664c61217cffc65b74Chris Lattner return ClassRec->getDecl()->getNameAsString(); 13610bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor return ClassType.getAsString(); 13710bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor } 13810bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor 13910bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor case CXXDestructorName: { 14010bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor std::string Result = "~"; 14110bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor QualType Type = getCXXNameType(); 14210bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor if (const RecordType *Rec = Type->getAsRecordType()) 14339f34e97d6a468f0a7dfa5664c61217cffc65b74Chris Lattner Result += Rec->getDecl()->getNameAsString(); 14410bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor else 14510bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor Result += Type.getAsString(); 14610bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor return Result; 14710bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor } 14810bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor 149e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor case CXXOperatorName: { 150e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor static const char *OperatorNames[NUM_OVERLOADED_OPERATORS] = { 151e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor 0, 152e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor#define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \ 153e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor Spelling, 154e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor#include "clang/Basic/OperatorKinds.def" 155e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor }; 156e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor const char *OpName = OperatorNames[getCXXOverloadedOperator()]; 157e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor assert(OpName && "not an overloaded operator"); 158e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor 159e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor std::string Result = "operator"; 160e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor if (OpName[0] >= 'a' && OpName[0] <= 'z') 161e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor Result += ' '; 162e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor Result += OpName; 163e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor return Result; 164e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor } 165e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor 16610bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor case CXXConversionFunctionName: { 16710bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor std::string Result = "operator "; 16810bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor QualType Type = getCXXNameType(); 16910bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor if (const RecordType *Rec = Type->getAsRecordType()) 17039f34e97d6a468f0a7dfa5664c61217cffc65b74Chris Lattner Result += Rec->getDecl()->getNameAsString(); 17110bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor else 17210bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor Result += Type.getAsString(); 17310bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor return Result; 17410bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor } 1752a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor case CXXUsingDirective: 1762a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor return "<using-directive>"; 17710bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor } 17810bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor 17910bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor assert(false && "Unexpected declaration name kind"); 18010bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor return ""; 18110bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor} 18210bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor 1832e1cd4264d363ca869bf37ef160902f211d21b8cDouglas GregorQualType DeclarationName::getCXXNameType() const { 1842e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor if (CXXSpecialName *CXXName = getAsCXXSpecialName()) 1852e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return CXXName->Type; 1862e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor else 1872e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return QualType(); 1882e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor} 1892e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 190e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas GregorOverloadedOperatorKind DeclarationName::getCXXOverloadedOperator() const { 191e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor if (CXXOperatorIdName *CXXOp = getAsCXXOperatorIdName()) { 192e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor unsigned value 193e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor = CXXOp->ExtraKindOrNumArgs - DeclarationNameExtra::CXXConversionFunction; 194e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor return static_cast<OverloadedOperatorKind>(value); 195e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor } else { 196e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor return OO_None; 197e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor } 198e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor} 199e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor 2002e1cd4264d363ca869bf37ef160902f211d21b8cDouglas GregorSelector DeclarationName::getObjCSelector() const { 2012e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor switch (getNameKind()) { 2022e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor case ObjCZeroArgSelector: 2032e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return Selector(reinterpret_cast<IdentifierInfo *>(Ptr & ~PtrMask), 0); 2042e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 2052e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor case ObjCOneArgSelector: 2062e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return Selector(reinterpret_cast<IdentifierInfo *>(Ptr & ~PtrMask), 1); 2072e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 2082e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor case ObjCMultiArgSelector: 2092e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return Selector(reinterpret_cast<MultiKeywordSelector *>(Ptr & ~PtrMask)); 2102e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 2112e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor default: 2122e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor break; 2132e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor } 2142e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 2152e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return Selector(); 2162e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor} 2172e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 2182def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregorvoid *DeclarationName::getFETokenInfoAsVoid() const { 2192def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor switch (getNameKind()) { 2202def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor case Identifier: 2212def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor return getAsIdentifierInfo()->getFETokenInfo<void>(); 2222def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor 2232def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor case CXXConstructorName: 2242def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor case CXXDestructorName: 2252def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor case CXXConversionFunctionName: 2262def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor return getAsCXXSpecialName()->FETokenInfo; 2272def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor 228e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor case CXXOperatorName: 229e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor return getAsCXXOperatorIdName()->FETokenInfo; 230e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor 2312def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor default: 2322def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor assert(false && "Declaration name has no FETokenInfo"); 2332def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor } 2342def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor return 0; 2352def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor} 2362def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor 2372def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregorvoid DeclarationName::setFETokenInfo(void *T) { 2382def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor switch (getNameKind()) { 2392def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor case Identifier: 2402def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor getAsIdentifierInfo()->setFETokenInfo(T); 2412def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor break; 2422def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor 2432def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor case CXXConstructorName: 2442def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor case CXXDestructorName: 2452def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor case CXXConversionFunctionName: 2462def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor getAsCXXSpecialName()->FETokenInfo = T; 2472def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor break; 2482def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor 249e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor case CXXOperatorName: 250e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor getAsCXXOperatorIdName()->FETokenInfo = T; 251e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor break; 252e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor 2532def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor default: 2542def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor assert(false && "Declaration name has no FETokenInfo"); 2552def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor } 2562def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor} 2572def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor 2582a3009a432bdcec59e6383d7b2b17494d6f91649Douglas GregorDeclarationName DeclarationName::getUsingDirectiveName() { 2592a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor // Single instance of DeclarationNameExtra for using-directive 2602a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor static DeclarationNameExtra UDirExtra = 2612a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor { DeclarationNameExtra::CXXUsingDirective }; 2622a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor 2632a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor uintptr_t Ptr = reinterpret_cast<uintptr_t>(&UDirExtra); 2642a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor Ptr |= StoredDeclarationNameExtra; 2652a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor 2662a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor return DeclarationName(Ptr); 2672a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor} 2682a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor 2692e1cd4264d363ca869bf37ef160902f211d21b8cDouglas GregorDeclarationNameTable::DeclarationNameTable() { 2702e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor CXXSpecialNamesImpl = new llvm::FoldingSet<CXXSpecialName>; 271e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor 272e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor // Initialize the overloaded operator names. 273e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor CXXOperatorNames = new CXXOperatorIdName[NUM_OVERLOADED_OPERATORS]; 274e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor for (unsigned Op = 0; Op < NUM_OVERLOADED_OPERATORS; ++Op) { 275e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor CXXOperatorNames[Op].ExtraKindOrNumArgs 276e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor = Op + DeclarationNameExtra::CXXConversionFunction; 277e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor CXXOperatorNames[Op].FETokenInfo = 0; 278e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor } 2792e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor} 2802e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 2812e1cd4264d363ca869bf37ef160902f211d21b8cDouglas GregorDeclarationNameTable::~DeclarationNameTable() { 2826d34ae5370a41268cc7c39b05e287cab1786fa8eNuno Lopes llvm::FoldingSet<CXXSpecialName> *set = 2836d34ae5370a41268cc7c39b05e287cab1786fa8eNuno Lopes static_cast<llvm::FoldingSet<CXXSpecialName>*>(CXXSpecialNamesImpl); 284f9d1e4bc60690386e0b2c658d707b75a77717a9cNuno Lopes llvm::FoldingSetIterator<CXXSpecialName> I = set->begin(), E = set->end(); 2856d34ae5370a41268cc7c39b05e287cab1786fa8eNuno Lopes 286f9d1e4bc60690386e0b2c658d707b75a77717a9cNuno Lopes while (I != E) { 287f9d1e4bc60690386e0b2c658d707b75a77717a9cNuno Lopes CXXSpecialName *n = &*I++; 288f9d1e4bc60690386e0b2c658d707b75a77717a9cNuno Lopes delete n; 2896d34ae5370a41268cc7c39b05e287cab1786fa8eNuno Lopes } 2906d34ae5370a41268cc7c39b05e287cab1786fa8eNuno Lopes 2916d34ae5370a41268cc7c39b05e287cab1786fa8eNuno Lopes delete set; 292e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor delete [] CXXOperatorNames; 2932e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor} 2942e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 2952e1cd4264d363ca869bf37ef160902f211d21b8cDouglas GregorDeclarationName 2962e1cd4264d363ca869bf37ef160902f211d21b8cDouglas GregorDeclarationNameTable::getCXXSpecialName(DeclarationName::NameKind Kind, 2972e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor QualType Ty) { 2982e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor assert(Kind >= DeclarationName::CXXConstructorName && 2992e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor Kind <= DeclarationName::CXXConversionFunctionName && 3002e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor "Kind must be a C++ special name kind"); 3012e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 3022e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor llvm::FoldingSet<CXXSpecialName> *SpecialNames 3032e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor = static_cast<llvm::FoldingSet<CXXSpecialName>*>(CXXSpecialNamesImpl); 3042e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 3052e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor DeclarationNameExtra::ExtraKind EKind; 3062e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor switch (Kind) { 3072e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor case DeclarationName::CXXConstructorName: 3082e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor EKind = DeclarationNameExtra::CXXConstructor; 309d603eaa682cecac2c10771a700cb83aa301653b4Chris Lattner assert(Ty.getCVRQualifiers() == 0 &&"Constructor type must be unqualified"); 3102e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor break; 3112e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor case DeclarationName::CXXDestructorName: 3122e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor EKind = DeclarationNameExtra::CXXDestructor; 313e63ef48b76b84e7ffb0a38fbf475ddea5c48adb4Douglas Gregor assert(Ty.getCVRQualifiers() == 0 && "Destructor type must be unqualified"); 3142e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor break; 3152e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor case DeclarationName::CXXConversionFunctionName: 3162e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor EKind = DeclarationNameExtra::CXXConversionFunction; 3172e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor break; 3182e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor default: 3192e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return DeclarationName(); 3202e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor } 3212e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 3222e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor // Unique selector, to guarantee there is one per name. 3232e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor llvm::FoldingSetNodeID ID; 3242e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor ID.AddInteger(EKind); 3252e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor ID.AddPointer(Ty.getAsOpaquePtr()); 3262e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 3272e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor void *InsertPos = 0; 3282e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor if (CXXSpecialName *Name = SpecialNames->FindNodeOrInsertPos(ID, InsertPos)) 3292e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return DeclarationName(Name); 3302e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 3312e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor CXXSpecialName *SpecialName = new CXXSpecialName; 3322e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor SpecialName->ExtraKindOrNumArgs = EKind; 3332e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor SpecialName->Type = Ty; 3342def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor SpecialName->FETokenInfo = 0; 3352e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 3362e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor SpecialNames->InsertNode(SpecialName, InsertPos); 3372e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return DeclarationName(SpecialName); 3382e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor} 3392e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 340e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas GregorDeclarationName 341e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas GregorDeclarationNameTable::getCXXOperatorName(OverloadedOperatorKind Op) { 342e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor return DeclarationName(&CXXOperatorNames[(unsigned)Op]); 343e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor} 344e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor 34544b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregorunsigned 34644b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregorllvm::DenseMapInfo<clang::DeclarationName>:: 34744b4321feab46299d3f5cfd404680884752a0fcfDouglas GregorgetHashValue(clang::DeclarationName N) { 34844b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor return DenseMapInfo<void*>::getHashValue(N.getAsOpaquePtr()); 34944b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor} 35044b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 351