DeclarationName.cpp revision 6217b80b7a1379b74cced1c076338262c3c980b3
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" 18370187c8a3e96517c943329f2511737a04b85450Douglas Gregor#include "llvm/ADT/DenseMap.h" 192e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor#include "llvm/ADT/FoldingSet.h" 202e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregorusing namespace clang; 212e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 222e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregornamespace clang { 232e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// CXXSpecialName - Records the type associated with one of the 242e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// "special" kinds of declaration names in C++, e.g., constructors, 252e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// destructors, and conversion functions. 262e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregorclass CXXSpecialName 272e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor : public DeclarationNameExtra, public llvm::FoldingSetNode { 282e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregorpublic: 292def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor /// Type - The type associated with this declaration name. 302e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor QualType Type; 312e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 322def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor /// FETokenInfo - Extra information associated with this declaration 332def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor /// name that can be used by the front end. 342def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor void *FETokenInfo; 352def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor 362e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor void Profile(llvm::FoldingSetNodeID &ID) { 372e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor ID.AddInteger(ExtraKindOrNumArgs); 382e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor ID.AddPointer(Type.getAsOpaquePtr()); 392e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor } 402e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor}; 412e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 42e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor/// CXXOperatorIdName - Contains extra information for the name of an 43e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor/// overloaded operator in C++, such as "operator+. 44e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregorclass CXXOperatorIdName : public DeclarationNameExtra { 45e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregorpublic: 46e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor /// FETokenInfo - Extra information associated with this operator 47e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor /// name that can be used by the front end. 48e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor void *FETokenInfo; 49e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor}; 50e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor 512e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregorbool operator<(DeclarationName LHS, DeclarationName RHS) { 522e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor if (IdentifierInfo *LhsId = LHS.getAsIdentifierInfo()) 532e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor if (IdentifierInfo *RhsId = RHS.getAsIdentifierInfo()) 542e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return strcmp(LhsId->getName(), RhsId->getName()) < 0; 552e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 562e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return LHS.getAsOpaqueInteger() < RHS.getAsOpaqueInteger(); 572e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor} 582e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 592e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor} // end namespace clang 602e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 612e1cd4264d363ca869bf37ef160902f211d21b8cDouglas GregorDeclarationName::DeclarationName(Selector Sel) { 62319ac896a0fef7365d5589b8021db7e41207fe42Douglas Gregor if (!Sel.getAsOpaquePtr()) { 63319ac896a0fef7365d5589b8021db7e41207fe42Douglas Gregor Ptr = StoredObjCZeroArgSelector; 64319ac896a0fef7365d5589b8021db7e41207fe42Douglas Gregor return; 65319ac896a0fef7365d5589b8021db7e41207fe42Douglas Gregor } 66319ac896a0fef7365d5589b8021db7e41207fe42Douglas Gregor 672e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor switch (Sel.getNumArgs()) { 682e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor case 0: 692e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor Ptr = reinterpret_cast<uintptr_t>(Sel.getAsIdentifierInfo()); 703eb8dd78a622d257a7fed279714428c3de906f93Ted Kremenek assert((Ptr & PtrMask) == 0 && "Improperly aligned IdentifierInfo"); 712e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor Ptr |= StoredObjCZeroArgSelector; 722e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor break; 732e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 742e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor case 1: 752e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor Ptr = reinterpret_cast<uintptr_t>(Sel.getAsIdentifierInfo()); 763eb8dd78a622d257a7fed279714428c3de906f93Ted Kremenek assert((Ptr & PtrMask) == 0 && "Improperly aligned IdentifierInfo"); 772e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor Ptr |= StoredObjCOneArgSelector; 782e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor break; 792e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 802e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor default: 812e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor Ptr = Sel.InfoPtr & ~Selector::ArgFlags; 823eb8dd78a622d257a7fed279714428c3de906f93Ted Kremenek assert((Ptr & PtrMask) == 0 && "Improperly aligned MultiKeywordSelector"); 83e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor Ptr |= StoredDeclarationNameExtra; 842e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor break; 852e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor } 862e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor} 872e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 882e1cd4264d363ca869bf37ef160902f211d21b8cDouglas GregorDeclarationName::NameKind DeclarationName::getNameKind() const { 892e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor switch (getStoredNameKind()) { 902e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor case StoredIdentifier: return Identifier; 912e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor case StoredObjCZeroArgSelector: return ObjCZeroArgSelector; 922e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor case StoredObjCOneArgSelector: return ObjCOneArgSelector; 932e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 94e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor case StoredDeclarationNameExtra: 952e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor switch (getExtra()->ExtraKindOrNumArgs) { 962e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor case DeclarationNameExtra::CXXConstructor: 972e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return CXXConstructorName; 982e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 992e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor case DeclarationNameExtra::CXXDestructor: 1002e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return CXXDestructorName; 1012e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 1022e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor case DeclarationNameExtra::CXXConversionFunction: 1032e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return CXXConversionFunctionName; 1042e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 1052a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor case DeclarationNameExtra::CXXUsingDirective: 1062a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor return CXXUsingDirective; 1072a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor 1082e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor default: 109e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor // Check if we have one of the CXXOperator* enumeration values. 110e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor if (getExtra()->ExtraKindOrNumArgs < 1112a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor DeclarationNameExtra::CXXUsingDirective) 112e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor return CXXOperatorName; 113e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor 1142e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return ObjCMultiArgSelector; 1152e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor } 1162e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor break; 1172e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor } 1182e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 1192e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor // Can't actually get here. 120ac8d75fe94f2aefde5179d53e230b99a1fe1201aChris Lattner assert(0 && "This should be unreachable!"); 1212e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return Identifier; 1222e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor} 1232e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 12410bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregorstd::string DeclarationName::getAsString() const { 12510bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor switch (getNameKind()) { 12610bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor case Identifier: 12710bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor if (const IdentifierInfo *II = getAsIdentifierInfo()) 12810bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor return II->getName(); 12910bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor return ""; 13010bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor 13110bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor case ObjCZeroArgSelector: 13210bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor case ObjCOneArgSelector: 13310bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor case ObjCMultiArgSelector: 134077bf5e2f48acfa9e7d69429b6e4ba86ea14896dChris Lattner return getObjCSelector().getAsString(); 13510bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor 13610bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor case CXXConstructorName: { 13710bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor QualType ClassType = getCXXNameType(); 1386217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek if (const RecordType *ClassRec = ClassType->getAs<RecordType>()) 13939f34e97d6a468f0a7dfa5664c61217cffc65b74Chris Lattner return ClassRec->getDecl()->getNameAsString(); 14010bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor return ClassType.getAsString(); 14110bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor } 14210bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor 14310bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor case CXXDestructorName: { 14410bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor std::string Result = "~"; 14510bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor QualType Type = getCXXNameType(); 1466217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek if (const RecordType *Rec = Type->getAs<RecordType>()) 14739f34e97d6a468f0a7dfa5664c61217cffc65b74Chris Lattner Result += Rec->getDecl()->getNameAsString(); 14810bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor else 14910bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor Result += Type.getAsString(); 15010bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor return Result; 15110bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor } 15210bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor 153e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor case CXXOperatorName: { 154e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor static const char *OperatorNames[NUM_OVERLOADED_OPERATORS] = { 155e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor 0, 156e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor#define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \ 157e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor Spelling, 158e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor#include "clang/Basic/OperatorKinds.def" 159e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor }; 160e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor const char *OpName = OperatorNames[getCXXOverloadedOperator()]; 161e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor assert(OpName && "not an overloaded operator"); 162e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor 163e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor std::string Result = "operator"; 164e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor if (OpName[0] >= 'a' && OpName[0] <= 'z') 165e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor Result += ' '; 166e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor Result += OpName; 167e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor return Result; 168e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor } 169e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor 17010bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor case CXXConversionFunctionName: { 17110bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor std::string Result = "operator "; 17210bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor QualType Type = getCXXNameType(); 1736217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek if (const RecordType *Rec = Type->getAs<RecordType>()) 17439f34e97d6a468f0a7dfa5664c61217cffc65b74Chris Lattner Result += Rec->getDecl()->getNameAsString(); 17510bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor else 17610bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor Result += Type.getAsString(); 17710bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor return Result; 17810bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor } 1792a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor case CXXUsingDirective: 1802a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor return "<using-directive>"; 18110bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor } 18210bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor 18310bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor assert(false && "Unexpected declaration name kind"); 18410bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor return ""; 18510bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor} 18610bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor 1872e1cd4264d363ca869bf37ef160902f211d21b8cDouglas GregorQualType DeclarationName::getCXXNameType() const { 1882e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor if (CXXSpecialName *CXXName = getAsCXXSpecialName()) 1892e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return CXXName->Type; 1902e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor else 1912e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return QualType(); 1922e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor} 1932e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 194e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas GregorOverloadedOperatorKind DeclarationName::getCXXOverloadedOperator() const { 195e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor if (CXXOperatorIdName *CXXOp = getAsCXXOperatorIdName()) { 196e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor unsigned value 197e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor = CXXOp->ExtraKindOrNumArgs - DeclarationNameExtra::CXXConversionFunction; 198e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor return static_cast<OverloadedOperatorKind>(value); 199e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor } else { 200e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor return OO_None; 201e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor } 202e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor} 203e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor 2042e1cd4264d363ca869bf37ef160902f211d21b8cDouglas GregorSelector DeclarationName::getObjCSelector() const { 2052e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor switch (getNameKind()) { 2062e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor case ObjCZeroArgSelector: 2072e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return Selector(reinterpret_cast<IdentifierInfo *>(Ptr & ~PtrMask), 0); 2082e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 2092e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor case ObjCOneArgSelector: 2102e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return Selector(reinterpret_cast<IdentifierInfo *>(Ptr & ~PtrMask), 1); 2112e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 2122e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor case ObjCMultiArgSelector: 2132e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return Selector(reinterpret_cast<MultiKeywordSelector *>(Ptr & ~PtrMask)); 2142e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 2152e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor default: 2162e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor break; 2172e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor } 2182e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 2192e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return Selector(); 2202e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor} 2212e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 2222def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregorvoid *DeclarationName::getFETokenInfoAsVoid() const { 2232def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor switch (getNameKind()) { 2242def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor case Identifier: 2252def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor return getAsIdentifierInfo()->getFETokenInfo<void>(); 2262def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor 2272def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor case CXXConstructorName: 2282def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor case CXXDestructorName: 2292def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor case CXXConversionFunctionName: 2302def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor return getAsCXXSpecialName()->FETokenInfo; 2312def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor 232e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor case CXXOperatorName: 233e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor return getAsCXXOperatorIdName()->FETokenInfo; 234e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor 2352def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor default: 2362def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor assert(false && "Declaration name has no FETokenInfo"); 2372def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor } 2382def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor return 0; 2392def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor} 2402def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor 2412def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregorvoid DeclarationName::setFETokenInfo(void *T) { 2422def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor switch (getNameKind()) { 2432def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor case Identifier: 2442def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor getAsIdentifierInfo()->setFETokenInfo(T); 2452def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor break; 2462def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor 2472def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor case CXXConstructorName: 2482def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor case CXXDestructorName: 2492def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor case CXXConversionFunctionName: 2502def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor getAsCXXSpecialName()->FETokenInfo = T; 2512def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor break; 2522def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor 253e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor case CXXOperatorName: 254e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor getAsCXXOperatorIdName()->FETokenInfo = T; 255e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor break; 256e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor 2572def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor default: 2582def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor assert(false && "Declaration name has no FETokenInfo"); 2592def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor } 2602def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor} 2612def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor 2622a3009a432bdcec59e6383d7b2b17494d6f91649Douglas GregorDeclarationName DeclarationName::getUsingDirectiveName() { 2632a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor // Single instance of DeclarationNameExtra for using-directive 2642a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor static DeclarationNameExtra UDirExtra = 2652a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor { DeclarationNameExtra::CXXUsingDirective }; 2662a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor 2672a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor uintptr_t Ptr = reinterpret_cast<uintptr_t>(&UDirExtra); 2682a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor Ptr |= StoredDeclarationNameExtra; 2692a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor 2702a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor return DeclarationName(Ptr); 2712a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor} 2722a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor 2732e1cd4264d363ca869bf37ef160902f211d21b8cDouglas GregorDeclarationNameTable::DeclarationNameTable() { 2742e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor CXXSpecialNamesImpl = new llvm::FoldingSet<CXXSpecialName>; 275e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor 276e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor // Initialize the overloaded operator names. 277e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor CXXOperatorNames = new CXXOperatorIdName[NUM_OVERLOADED_OPERATORS]; 278e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor for (unsigned Op = 0; Op < NUM_OVERLOADED_OPERATORS; ++Op) { 279e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor CXXOperatorNames[Op].ExtraKindOrNumArgs 280e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor = Op + DeclarationNameExtra::CXXConversionFunction; 281e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor CXXOperatorNames[Op].FETokenInfo = 0; 282e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor } 2832e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor} 2842e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 2852e1cd4264d363ca869bf37ef160902f211d21b8cDouglas GregorDeclarationNameTable::~DeclarationNameTable() { 2866d34ae5370a41268cc7c39b05e287cab1786fa8eNuno Lopes llvm::FoldingSet<CXXSpecialName> *set = 2876d34ae5370a41268cc7c39b05e287cab1786fa8eNuno Lopes static_cast<llvm::FoldingSet<CXXSpecialName>*>(CXXSpecialNamesImpl); 288f9d1e4bc60690386e0b2c658d707b75a77717a9cNuno Lopes llvm::FoldingSetIterator<CXXSpecialName> I = set->begin(), E = set->end(); 2896d34ae5370a41268cc7c39b05e287cab1786fa8eNuno Lopes 290f9d1e4bc60690386e0b2c658d707b75a77717a9cNuno Lopes while (I != E) { 291f9d1e4bc60690386e0b2c658d707b75a77717a9cNuno Lopes CXXSpecialName *n = &*I++; 292f9d1e4bc60690386e0b2c658d707b75a77717a9cNuno Lopes delete n; 2936d34ae5370a41268cc7c39b05e287cab1786fa8eNuno Lopes } 2946d34ae5370a41268cc7c39b05e287cab1786fa8eNuno Lopes 2956d34ae5370a41268cc7c39b05e287cab1786fa8eNuno Lopes delete set; 296e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor delete [] CXXOperatorNames; 2972e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor} 2982e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 2992e1cd4264d363ca869bf37ef160902f211d21b8cDouglas GregorDeclarationName 3002e1cd4264d363ca869bf37ef160902f211d21b8cDouglas GregorDeclarationNameTable::getCXXSpecialName(DeclarationName::NameKind Kind, 3012e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor QualType Ty) { 3022e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor assert(Kind >= DeclarationName::CXXConstructorName && 3032e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor Kind <= DeclarationName::CXXConversionFunctionName && 3042e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor "Kind must be a C++ special name kind"); 30549f25ecf7ff358039ce4c9254b867f32110e660eDouglas Gregor assert(Ty->isCanonical() && 30649f25ecf7ff358039ce4c9254b867f32110e660eDouglas Gregor "Can only build C++ special names from canonical types"); 3072e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor llvm::FoldingSet<CXXSpecialName> *SpecialNames 3082e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor = static_cast<llvm::FoldingSet<CXXSpecialName>*>(CXXSpecialNamesImpl); 3092e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 3102e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor DeclarationNameExtra::ExtraKind EKind; 3112e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor switch (Kind) { 3122e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor case DeclarationName::CXXConstructorName: 3132e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor EKind = DeclarationNameExtra::CXXConstructor; 314d603eaa682cecac2c10771a700cb83aa301653b4Chris Lattner assert(Ty.getCVRQualifiers() == 0 &&"Constructor type must be unqualified"); 3152e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor break; 3162e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor case DeclarationName::CXXDestructorName: 3172e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor EKind = DeclarationNameExtra::CXXDestructor; 318e63ef48b76b84e7ffb0a38fbf475ddea5c48adb4Douglas Gregor assert(Ty.getCVRQualifiers() == 0 && "Destructor type must be unqualified"); 3192e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor break; 3202e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor case DeclarationName::CXXConversionFunctionName: 3212e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor EKind = DeclarationNameExtra::CXXConversionFunction; 3222e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor break; 3232e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor default: 3242e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return DeclarationName(); 3252e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor } 3262e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 3272e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor // Unique selector, to guarantee there is one per name. 3282e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor llvm::FoldingSetNodeID ID; 3292e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor ID.AddInteger(EKind); 3302e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor ID.AddPointer(Ty.getAsOpaquePtr()); 3312e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 3322e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor void *InsertPos = 0; 3332e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor if (CXXSpecialName *Name = SpecialNames->FindNodeOrInsertPos(ID, InsertPos)) 3342e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return DeclarationName(Name); 3352e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 3362e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor CXXSpecialName *SpecialName = new CXXSpecialName; 3372e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor SpecialName->ExtraKindOrNumArgs = EKind; 3382e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor SpecialName->Type = Ty; 3392def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor SpecialName->FETokenInfo = 0; 3402e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 3412e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor SpecialNames->InsertNode(SpecialName, InsertPos); 3422e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return DeclarationName(SpecialName); 3432e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor} 3442e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 345e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas GregorDeclarationName 346e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas GregorDeclarationNameTable::getCXXOperatorName(OverloadedOperatorKind Op) { 347e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor return DeclarationName(&CXXOperatorNames[(unsigned)Op]); 348e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor} 349e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor 35044b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregorunsigned 35144b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregorllvm::DenseMapInfo<clang::DeclarationName>:: 35244b4321feab46299d3f5cfd404680884752a0fcfDouglas GregorgetHashValue(clang::DeclarationName N) { 35344b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor return DenseMapInfo<void*>::getHashValue(N.getAsOpaquePtr()); 35444b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor} 35544b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 356