DeclarationName.cpp revision 077bf5e2f48acfa9e7d69429b6e4ba86ea14896d
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()); 662e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor Ptr |= StoredObjCZeroArgSelector; 672e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor break; 682e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 692e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor case 1: 702e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor Ptr = reinterpret_cast<uintptr_t>(Sel.getAsIdentifierInfo()); 712e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor Ptr |= StoredObjCOneArgSelector; 722e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor break; 732e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 742e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor default: 752e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor Ptr = Sel.InfoPtr & ~Selector::ArgFlags; 76e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor Ptr |= StoredDeclarationNameExtra; 772e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor break; 782e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor } 792e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor} 802e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 812e1cd4264d363ca869bf37ef160902f211d21b8cDouglas GregorDeclarationName::NameKind DeclarationName::getNameKind() const { 822e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor switch (getStoredNameKind()) { 832e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor case StoredIdentifier: return Identifier; 842e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor case StoredObjCZeroArgSelector: return ObjCZeroArgSelector; 852e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor case StoredObjCOneArgSelector: return ObjCOneArgSelector; 862e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 87e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor case StoredDeclarationNameExtra: 882e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor switch (getExtra()->ExtraKindOrNumArgs) { 892e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor case DeclarationNameExtra::CXXConstructor: 902e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return CXXConstructorName; 912e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 922e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor case DeclarationNameExtra::CXXDestructor: 932e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return CXXDestructorName; 942e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 952e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor case DeclarationNameExtra::CXXConversionFunction: 962e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return CXXConversionFunctionName; 972e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 982e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor default: 99e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor // Check if we have one of the CXXOperator* enumeration values. 100e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor if (getExtra()->ExtraKindOrNumArgs < 101e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor DeclarationNameExtra::NUM_EXTRA_KINDS) 102e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor return CXXOperatorName; 103e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor 1042e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return ObjCMultiArgSelector; 1052e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor } 1062e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor break; 1072e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor } 1082e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 1092e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor // Can't actually get here. 1102e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return Identifier; 1112e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor} 1122e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 11310bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregorstd::string DeclarationName::getAsString() const { 11410bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor switch (getNameKind()) { 11510bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor case Identifier: 11610bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor if (const IdentifierInfo *II = getAsIdentifierInfo()) 11710bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor return II->getName(); 11810bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor return ""; 11910bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor 12010bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor case ObjCZeroArgSelector: 12110bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor case ObjCOneArgSelector: 12210bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor case ObjCMultiArgSelector: 123077bf5e2f48acfa9e7d69429b6e4ba86ea14896dChris Lattner return getObjCSelector().getAsString(); 12410bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor 12510bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor case CXXConstructorName: { 12610bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor QualType ClassType = getCXXNameType(); 12710bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor if (const RecordType *ClassRec = ClassType->getAsRecordType()) 12810bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor return ClassRec->getDecl()->getName(); 12910bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor return ClassType.getAsString(); 13010bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor } 13110bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor 13210bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor case CXXDestructorName: { 13310bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor std::string Result = "~"; 13410bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor QualType Type = getCXXNameType(); 13510bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor if (const RecordType *Rec = Type->getAsRecordType()) 13610bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor Result += Rec->getDecl()->getName(); 13710bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor else 13810bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor Result += Type.getAsString(); 13910bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor return Result; 14010bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor } 14110bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor 142e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor case CXXOperatorName: { 143e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor static const char *OperatorNames[NUM_OVERLOADED_OPERATORS] = { 144e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor 0, 145e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor#define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \ 146e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor Spelling, 147e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor#include "clang/Basic/OperatorKinds.def" 148e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor }; 149e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor const char *OpName = OperatorNames[getCXXOverloadedOperator()]; 150e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor assert(OpName && "not an overloaded operator"); 151e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor 152e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor std::string Result = "operator"; 153e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor if (OpName[0] >= 'a' && OpName[0] <= 'z') 154e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor Result += ' '; 155e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor Result += OpName; 156e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor return Result; 157e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor } 158e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor 15910bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor case CXXConversionFunctionName: { 16010bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor std::string Result = "operator "; 16110bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor QualType Type = getCXXNameType(); 16210bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor if (const RecordType *Rec = Type->getAsRecordType()) 16310bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor Result += Rec->getDecl()->getName(); 16410bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor else 16510bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor Result += Type.getAsString(); 16610bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor return Result; 16710bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor } 16810bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor } 16910bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor 17010bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor assert(false && "Unexpected declaration name kind"); 17110bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor return ""; 17210bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor} 17310bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor 1742e1cd4264d363ca869bf37ef160902f211d21b8cDouglas GregorQualType DeclarationName::getCXXNameType() const { 1752e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor if (CXXSpecialName *CXXName = getAsCXXSpecialName()) 1762e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return CXXName->Type; 1772e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor else 1782e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return QualType(); 1792e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor} 1802e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 181e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas GregorOverloadedOperatorKind DeclarationName::getCXXOverloadedOperator() const { 182e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor if (CXXOperatorIdName *CXXOp = getAsCXXOperatorIdName()) { 183e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor unsigned value 184e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor = CXXOp->ExtraKindOrNumArgs - DeclarationNameExtra::CXXConversionFunction; 185e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor return static_cast<OverloadedOperatorKind>(value); 186e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor } else { 187e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor return OO_None; 188e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor } 189e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor} 190e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor 1912e1cd4264d363ca869bf37ef160902f211d21b8cDouglas GregorSelector DeclarationName::getObjCSelector() const { 1922e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor switch (getNameKind()) { 1932e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor case ObjCZeroArgSelector: 1942e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return Selector(reinterpret_cast<IdentifierInfo *>(Ptr & ~PtrMask), 0); 1952e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 1962e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor case ObjCOneArgSelector: 1972e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return Selector(reinterpret_cast<IdentifierInfo *>(Ptr & ~PtrMask), 1); 1982e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 1992e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor case ObjCMultiArgSelector: 2002e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return Selector(reinterpret_cast<MultiKeywordSelector *>(Ptr & ~PtrMask)); 2012e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 2022e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor default: 2032e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor break; 2042e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor } 2052e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 2062e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return Selector(); 2072e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor} 2082e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 2092def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregorvoid *DeclarationName::getFETokenInfoAsVoid() const { 2102def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor switch (getNameKind()) { 2112def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor case Identifier: 2122def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor return getAsIdentifierInfo()->getFETokenInfo<void>(); 2132def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor 2142def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor case CXXConstructorName: 2152def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor case CXXDestructorName: 2162def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor case CXXConversionFunctionName: 2172def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor return getAsCXXSpecialName()->FETokenInfo; 2182def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor 219e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor case CXXOperatorName: 220e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor return getAsCXXOperatorIdName()->FETokenInfo; 221e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor 2222def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor default: 2232def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor assert(false && "Declaration name has no FETokenInfo"); 2242def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor } 2252def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor return 0; 2262def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor} 2272def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor 2282def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregorvoid DeclarationName::setFETokenInfo(void *T) { 2292def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor switch (getNameKind()) { 2302def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor case Identifier: 2312def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor getAsIdentifierInfo()->setFETokenInfo(T); 2322def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor break; 2332def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor 2342def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor case CXXConstructorName: 2352def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor case CXXDestructorName: 2362def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor case CXXConversionFunctionName: 2372def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor getAsCXXSpecialName()->FETokenInfo = T; 2382def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor break; 2392def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor 240e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor case CXXOperatorName: 241e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor getAsCXXOperatorIdName()->FETokenInfo = T; 242e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor break; 243e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor 2442def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor default: 2452def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor assert(false && "Declaration name has no FETokenInfo"); 2462def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor } 2472def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor} 2482def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor 2492e1cd4264d363ca869bf37ef160902f211d21b8cDouglas GregorDeclarationNameTable::DeclarationNameTable() { 2502e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor CXXSpecialNamesImpl = new llvm::FoldingSet<CXXSpecialName>; 251e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor 252e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor // Initialize the overloaded operator names. 253e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor CXXOperatorNames = new CXXOperatorIdName[NUM_OVERLOADED_OPERATORS]; 254e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor for (unsigned Op = 0; Op < NUM_OVERLOADED_OPERATORS; ++Op) { 255e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor CXXOperatorNames[Op].ExtraKindOrNumArgs 256e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor = Op + DeclarationNameExtra::CXXConversionFunction; 257e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor CXXOperatorNames[Op].FETokenInfo = 0; 258e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor } 2592e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor} 2602e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 2612e1cd4264d363ca869bf37ef160902f211d21b8cDouglas GregorDeclarationNameTable::~DeclarationNameTable() { 2622e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor delete static_cast<llvm::FoldingSet<CXXSpecialName>*>(CXXSpecialNamesImpl); 263e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor delete [] CXXOperatorNames; 2642e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor} 2652e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 2662e1cd4264d363ca869bf37ef160902f211d21b8cDouglas GregorDeclarationName 2672e1cd4264d363ca869bf37ef160902f211d21b8cDouglas GregorDeclarationNameTable::getCXXSpecialName(DeclarationName::NameKind Kind, 2682e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor QualType Ty) { 2692e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor assert(Kind >= DeclarationName::CXXConstructorName && 2702e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor Kind <= DeclarationName::CXXConversionFunctionName && 2712e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor "Kind must be a C++ special name kind"); 2722e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 2732e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor llvm::FoldingSet<CXXSpecialName> *SpecialNames 2742e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor = static_cast<llvm::FoldingSet<CXXSpecialName>*>(CXXSpecialNamesImpl); 2752e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 2762e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor DeclarationNameExtra::ExtraKind EKind; 2772e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor switch (Kind) { 2782e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor case DeclarationName::CXXConstructorName: 2792e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor EKind = DeclarationNameExtra::CXXConstructor; 2802e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor break; 2812e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor case DeclarationName::CXXDestructorName: 2822e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor EKind = DeclarationNameExtra::CXXDestructor; 2832e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor break; 2842e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor case DeclarationName::CXXConversionFunctionName: 2852e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor EKind = DeclarationNameExtra::CXXConversionFunction; 2862e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor break; 2872e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor default: 2882e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return DeclarationName(); 2892e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor } 2902e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 2912e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor // Unique selector, to guarantee there is one per name. 2922e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor llvm::FoldingSetNodeID ID; 2932e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor ID.AddInteger(EKind); 2942e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor ID.AddPointer(Ty.getAsOpaquePtr()); 2952e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 2962e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor void *InsertPos = 0; 2972e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor if (CXXSpecialName *Name = SpecialNames->FindNodeOrInsertPos(ID, InsertPos)) 2982e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return DeclarationName(Name); 2992e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 3002e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor CXXSpecialName *SpecialName = new CXXSpecialName; 3012e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor SpecialName->ExtraKindOrNumArgs = EKind; 3022e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor SpecialName->Type = Ty; 3032def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor SpecialName->FETokenInfo = 0; 3042e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 3052e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor SpecialNames->InsertNode(SpecialName, InsertPos); 3062e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return DeclarationName(SpecialName); 3072e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor} 3082e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 309e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas GregorDeclarationName 310e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas GregorDeclarationNameTable::getCXXOperatorName(OverloadedOperatorKind Op) { 311e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor return DeclarationName(&CXXOperatorNames[(unsigned)Op]); 312e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor} 313e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor 314