DeclarationName.cpp revision a6c058dd75c5563cced821fc16766a7cc179e00c
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" 16d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor#include "clang/AST/TypeOrdering.h" 1710bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor#include "clang/AST/Decl.h" 182e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor#include "clang/Basic/IdentifierTable.h" 19370187c8a3e96517c943329f2511737a04b85450Douglas Gregor#include "llvm/ADT/DenseMap.h" 202e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor#include "llvm/ADT/FoldingSet.h" 21894993f48aedbed10519416052a7c6a47ad365bbChandler Carruth#include <cstdio> 222e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregorusing namespace clang; 232e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 242e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregornamespace clang { 252e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// CXXSpecialName - Records the type associated with one of the 262e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// "special" kinds of declaration names in C++, e.g., constructors, 272e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// destructors, and conversion functions. 281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpclass CXXSpecialName 292e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor : public DeclarationNameExtra, public llvm::FoldingSetNode { 302e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregorpublic: 312def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor /// Type - The type associated with this declaration name. 322e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor QualType Type; 332e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 342def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor /// FETokenInfo - Extra information associated with this declaration 352def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor /// name that can be used by the front end. 362def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor void *FETokenInfo; 372def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor 382e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor void Profile(llvm::FoldingSetNodeID &ID) { 392e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor ID.AddInteger(ExtraKindOrNumArgs); 402e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor ID.AddPointer(Type.getAsOpaquePtr()); 412e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor } 422e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor}; 432e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 44e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor/// CXXOperatorIdName - Contains extra information for the name of an 451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// overloaded operator in C++, such as "operator+. 46e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregorclass CXXOperatorIdName : public DeclarationNameExtra { 47e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregorpublic: 48e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor /// FETokenInfo - Extra information associated with this operator 49e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor /// name that can be used by the front end. 50e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor void *FETokenInfo; 51e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor}; 52e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor 533e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt/// CXXLiberalOperatorName - Contains the actual identifier that makes up the 543e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt/// name. 553e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt/// 563e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt/// This identifier is stored here rather than directly in DeclarationName so as 573e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt/// to allow Objective-C selectors, which are about a million times more common, 583e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt/// to consume minimal memory. 59a6c058dd75c5563cced821fc16766a7cc179e00cSean Huntclass CXXLiteralOperatorIdName 60a6c058dd75c5563cced821fc16766a7cc179e00cSean Hunt : public DeclarationNameExtra, public llvm::FoldingSetNode { 613e518bda00d710754ca077cf9be8dd821e16a854Sean Huntpublic: 623e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt IdentifierInfo *ID; 63a6c058dd75c5563cced821fc16766a7cc179e00cSean Hunt 64a6c058dd75c5563cced821fc16766a7cc179e00cSean Hunt void Profile(llvm::FoldingSetNodeID &FSID) { 65a6c058dd75c5563cced821fc16766a7cc179e00cSean Hunt FSID.AddPointer(ID); 66a6c058dd75c5563cced821fc16766a7cc179e00cSean Hunt } 673e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt}; 683e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt 692e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregorbool operator<(DeclarationName LHS, DeclarationName RHS) { 70d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor if (LHS.getNameKind() != RHS.getNameKind()) 71d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor return LHS.getNameKind() < RHS.getNameKind(); 72d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor 73d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor switch (LHS.getNameKind()) { 74d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor case DeclarationName::Identifier: 75d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor return LHS.getAsIdentifierInfo()->getName() < 76d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor RHS.getAsIdentifierInfo()->getName(); 772e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 78d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor case DeclarationName::ObjCZeroArgSelector: 79d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor case DeclarationName::ObjCOneArgSelector: 80d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor case DeclarationName::ObjCMultiArgSelector: { 81d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor Selector LHSSelector = LHS.getObjCSelector(); 82d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor Selector RHSSelector = RHS.getObjCSelector(); 83d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor for (unsigned I = 0, 84d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor N = std::min(LHSSelector.getNumArgs(), RHSSelector.getNumArgs()); 85d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor I != N; ++I) { 86d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor IdentifierInfo *LHSId = LHSSelector.getIdentifierInfoForSlot(I); 87d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor IdentifierInfo *RHSId = RHSSelector.getIdentifierInfoForSlot(I); 88d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor if (!LHSId || !RHSId) 89d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor return LHSId && !RHSId; 90d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor 91d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor switch (LHSId->getName().compare(RHSId->getName())) { 92d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor case -1: return true; 93d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor case 1: return false; 94d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor default: break; 95d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor } 96d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor } 97d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor 98d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor return LHSSelector.getNumArgs() < RHSSelector.getNumArgs(); 99d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor } 100d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor 101d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor case DeclarationName::CXXConstructorName: 102d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor case DeclarationName::CXXDestructorName: 103d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor case DeclarationName::CXXConversionFunctionName: 104d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor return QualTypeOrdering()(LHS.getCXXNameType(), RHS.getCXXNameType()); 105d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor 106d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor case DeclarationName::CXXOperatorName: 107d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor return LHS.getCXXOverloadedOperator() < RHS.getCXXOverloadedOperator(); 1083e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt 1093e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt case DeclarationName::CXXLiteralOperatorName: 1103e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt return LHS.getCXXLiteralIdentifier()->getName() < 1113e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt RHS.getCXXLiteralIdentifier()->getName(); 112d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor 113d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor case DeclarationName::CXXUsingDirective: 114d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor return false; 115d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor } 116d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor 117d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor return false; 1182e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor} 1192e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 1202e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor} // end namespace clang 1212e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 1222e1cd4264d363ca869bf37ef160902f211d21b8cDouglas GregorDeclarationName::DeclarationName(Selector Sel) { 123319ac896a0fef7365d5589b8021db7e41207fe42Douglas Gregor if (!Sel.getAsOpaquePtr()) { 124813a97b3eee957eac3ac1fb111b8892fb9afd0d4Douglas Gregor Ptr = 0; 125319ac896a0fef7365d5589b8021db7e41207fe42Douglas Gregor return; 126319ac896a0fef7365d5589b8021db7e41207fe42Douglas Gregor } 127319ac896a0fef7365d5589b8021db7e41207fe42Douglas Gregor 1282e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor switch (Sel.getNumArgs()) { 1292e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor case 0: 1302e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor Ptr = reinterpret_cast<uintptr_t>(Sel.getAsIdentifierInfo()); 1313eb8dd78a622d257a7fed279714428c3de906f93Ted Kremenek assert((Ptr & PtrMask) == 0 && "Improperly aligned IdentifierInfo"); 1322e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor Ptr |= StoredObjCZeroArgSelector; 1332e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor break; 1342e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 1352e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor case 1: 1362e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor Ptr = reinterpret_cast<uintptr_t>(Sel.getAsIdentifierInfo()); 1373eb8dd78a622d257a7fed279714428c3de906f93Ted Kremenek assert((Ptr & PtrMask) == 0 && "Improperly aligned IdentifierInfo"); 1382e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor Ptr |= StoredObjCOneArgSelector; 1392e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor break; 1402e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 1412e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor default: 1422e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor Ptr = Sel.InfoPtr & ~Selector::ArgFlags; 1433eb8dd78a622d257a7fed279714428c3de906f93Ted Kremenek assert((Ptr & PtrMask) == 0 && "Improperly aligned MultiKeywordSelector"); 144e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor Ptr |= StoredDeclarationNameExtra; 1452e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor break; 1462e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor } 1472e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor} 1482e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 1492e1cd4264d363ca869bf37ef160902f211d21b8cDouglas GregorDeclarationName::NameKind DeclarationName::getNameKind() const { 1502e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor switch (getStoredNameKind()) { 1512e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor case StoredIdentifier: return Identifier; 1522e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor case StoredObjCZeroArgSelector: return ObjCZeroArgSelector; 1532e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor case StoredObjCOneArgSelector: return ObjCOneArgSelector; 1542e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 155e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor case StoredDeclarationNameExtra: 1562e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor switch (getExtra()->ExtraKindOrNumArgs) { 1571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump case DeclarationNameExtra::CXXConstructor: 1582e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return CXXConstructorName; 1592e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 1601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump case DeclarationNameExtra::CXXDestructor: 1612e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return CXXDestructorName; 1622e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 1631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump case DeclarationNameExtra::CXXConversionFunction: 1642e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return CXXConversionFunctionName; 1652e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 1663e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt case DeclarationNameExtra::CXXLiteralOperator: 1673e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt return CXXLiteralOperatorName; 1683e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt 1692a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor case DeclarationNameExtra::CXXUsingDirective: 1702a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor return CXXUsingDirective; 1712a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor 1722e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor default: 173e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor // Check if we have one of the CXXOperator* enumeration values. 1741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (getExtra()->ExtraKindOrNumArgs < 1752a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor DeclarationNameExtra::CXXUsingDirective) 176e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor return CXXOperatorName; 177e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor 1782e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return ObjCMultiArgSelector; 1792e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor } 1802e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor break; 1812e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor } 1822e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 1832e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor // Can't actually get here. 184ac8d75fe94f2aefde5179d53e230b99a1fe1201aChris Lattner assert(0 && "This should be unreachable!"); 1852e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return Identifier; 1862e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor} 1872e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 18848026d26fb58e413544874eead5491b1452e2ebfDouglas Gregorbool DeclarationName::isDependentName() const { 18948026d26fb58e413544874eead5491b1452e2ebfDouglas Gregor QualType T = getCXXNameType(); 19048026d26fb58e413544874eead5491b1452e2ebfDouglas Gregor return !T.isNull() && T->isDependentType(); 19148026d26fb58e413544874eead5491b1452e2ebfDouglas Gregor} 19248026d26fb58e413544874eead5491b1452e2ebfDouglas Gregor 19310bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregorstd::string DeclarationName::getAsString() const { 19410bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor switch (getNameKind()) { 19510bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor case Identifier: 19610bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor if (const IdentifierInfo *II = getAsIdentifierInfo()) 19710bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor return II->getName(); 19810bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor return ""; 19910bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor 20010bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor case ObjCZeroArgSelector: 20110bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor case ObjCOneArgSelector: 20210bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor case ObjCMultiArgSelector: 203077bf5e2f48acfa9e7d69429b6e4ba86ea14896dChris Lattner return getObjCSelector().getAsString(); 20410bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor 20510bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor case CXXConstructorName: { 20610bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor QualType ClassType = getCXXNameType(); 2076217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek if (const RecordType *ClassRec = ClassType->getAs<RecordType>()) 20839f34e97d6a468f0a7dfa5664c61217cffc65b74Chris Lattner return ClassRec->getDecl()->getNameAsString(); 20910bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor return ClassType.getAsString(); 21010bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor } 21110bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor 21210bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor case CXXDestructorName: { 21310bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor std::string Result = "~"; 21410bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor QualType Type = getCXXNameType(); 2156217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek if (const RecordType *Rec = Type->getAs<RecordType>()) 21639f34e97d6a468f0a7dfa5664c61217cffc65b74Chris Lattner Result += Rec->getDecl()->getNameAsString(); 21710bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor else 21810bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor Result += Type.getAsString(); 21910bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor return Result; 22010bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor } 22110bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor 222e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor case CXXOperatorName: { 2232550d70aabb5f603e8f74cc5fb6a69a7af5b51f3Nuno Lopes static const char* const OperatorNames[NUM_OVERLOADED_OPERATORS] = { 224e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor 0, 225e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor#define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \ 226e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor Spelling, 227e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor#include "clang/Basic/OperatorKinds.def" 228e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor }; 229e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor const char *OpName = OperatorNames[getCXXOverloadedOperator()]; 230e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor assert(OpName && "not an overloaded operator"); 2311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 232e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor std::string Result = "operator"; 233e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor if (OpName[0] >= 'a' && OpName[0] <= 'z') 234e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor Result += ' '; 235e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor Result += OpName; 236e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor return Result; 237e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor } 238e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor 2393e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt case CXXLiteralOperatorName: { 2403e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt return "operator \"\" " + std::string(getCXXLiteralIdentifier()->getName()); 2413e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt } 2423e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt 24310bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor case CXXConversionFunctionName: { 24410bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor std::string Result = "operator "; 24510bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor QualType Type = getCXXNameType(); 2466217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek if (const RecordType *Rec = Type->getAs<RecordType>()) 24739f34e97d6a468f0a7dfa5664c61217cffc65b74Chris Lattner Result += Rec->getDecl()->getNameAsString(); 24810bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor else 24910bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor Result += Type.getAsString(); 25010bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor return Result; 25110bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor } 2522a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor case CXXUsingDirective: 2532a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor return "<using-directive>"; 25410bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor } 25510bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor 25610bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor assert(false && "Unexpected declaration name kind"); 25710bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor return ""; 25810bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor} 25910bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor 2602e1cd4264d363ca869bf37ef160902f211d21b8cDouglas GregorQualType DeclarationName::getCXXNameType() const { 2612e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor if (CXXSpecialName *CXXName = getAsCXXSpecialName()) 2622e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return CXXName->Type; 2632e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor else 2642e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return QualType(); 2652e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor} 2662e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 267e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas GregorOverloadedOperatorKind DeclarationName::getCXXOverloadedOperator() const { 268e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor if (CXXOperatorIdName *CXXOp = getAsCXXOperatorIdName()) { 2691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump unsigned value 270e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor = CXXOp->ExtraKindOrNumArgs - DeclarationNameExtra::CXXConversionFunction; 271e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor return static_cast<OverloadedOperatorKind>(value); 272e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor } else { 273e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor return OO_None; 274e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor } 275e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor} 276e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor 2773e518bda00d710754ca077cf9be8dd821e16a854Sean HuntIdentifierInfo *DeclarationName::getCXXLiteralIdentifier() const { 2783e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt if (CXXLiteralOperatorIdName *CXXLit = getAsCXXLiteralOperatorIdName()) 2793e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt return CXXLit->ID; 2803e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt else 2813e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt return 0; 2823e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt} 2833e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt 2842e1cd4264d363ca869bf37ef160902f211d21b8cDouglas GregorSelector DeclarationName::getObjCSelector() const { 2852e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor switch (getNameKind()) { 2862e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor case ObjCZeroArgSelector: 2872e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return Selector(reinterpret_cast<IdentifierInfo *>(Ptr & ~PtrMask), 0); 2882e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 2892e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor case ObjCOneArgSelector: 2902e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return Selector(reinterpret_cast<IdentifierInfo *>(Ptr & ~PtrMask), 1); 2912e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 2922e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor case ObjCMultiArgSelector: 2932e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return Selector(reinterpret_cast<MultiKeywordSelector *>(Ptr & ~PtrMask)); 2942e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 2952e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor default: 2962e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor break; 2972e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor } 2982e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 2992e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return Selector(); 3002e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor} 3012e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 3022def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregorvoid *DeclarationName::getFETokenInfoAsVoid() const { 3032def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor switch (getNameKind()) { 3042def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor case Identifier: 3052def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor return getAsIdentifierInfo()->getFETokenInfo<void>(); 3062def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor 3072def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor case CXXConstructorName: 3082def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor case CXXDestructorName: 3092def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor case CXXConversionFunctionName: 3102def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor return getAsCXXSpecialName()->FETokenInfo; 3112def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor 312e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor case CXXOperatorName: 313e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor return getAsCXXOperatorIdName()->FETokenInfo; 314e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor 3153e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt case CXXLiteralOperatorName: 3163e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt return getCXXLiteralIdentifier()->getFETokenInfo<void>(); 3173e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt 3182def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor default: 3192def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor assert(false && "Declaration name has no FETokenInfo"); 3202def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor } 3212def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor return 0; 3222def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor} 3232def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor 3242def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregorvoid DeclarationName::setFETokenInfo(void *T) { 3252def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor switch (getNameKind()) { 3262def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor case Identifier: 3272def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor getAsIdentifierInfo()->setFETokenInfo(T); 3282def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor break; 3292def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor 3302def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor case CXXConstructorName: 3312def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor case CXXDestructorName: 3322def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor case CXXConversionFunctionName: 3332def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor getAsCXXSpecialName()->FETokenInfo = T; 3342def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor break; 3352def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor 336e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor case CXXOperatorName: 337e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor getAsCXXOperatorIdName()->FETokenInfo = T; 338e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor break; 339e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor 3403e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt case CXXLiteralOperatorName: 3413e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt getCXXLiteralIdentifier()->setFETokenInfo(T); 3423e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt break; 3433e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt 3442def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor default: 3452def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor assert(false && "Declaration name has no FETokenInfo"); 3462def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor } 3472def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor} 3482def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor 3492a3009a432bdcec59e6383d7b2b17494d6f91649Douglas GregorDeclarationName DeclarationName::getUsingDirectiveName() { 3502a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor // Single instance of DeclarationNameExtra for using-directive 35168f7a2426227476bcfa33ada70b708c82419dfdcNuno Lopes static const DeclarationNameExtra UDirExtra = 3522a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor { DeclarationNameExtra::CXXUsingDirective }; 3532a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor 3542a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor uintptr_t Ptr = reinterpret_cast<uintptr_t>(&UDirExtra); 3552a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor Ptr |= StoredDeclarationNameExtra; 3562a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor 3572a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor return DeclarationName(Ptr); 3582a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor} 3592a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor 36070f5bc77dbe4172bde860e15d8b3c29e0d5005cbAnders Carlssonvoid DeclarationName::dump() const { 36170f5bc77dbe4172bde860e15d8b3c29e0d5005cbAnders Carlsson fprintf(stderr, "%s\n", getAsString().c_str()); 36270f5bc77dbe4172bde860e15d8b3c29e0d5005cbAnders Carlsson} 36370f5bc77dbe4172bde860e15d8b3c29e0d5005cbAnders Carlsson 3642e1cd4264d363ca869bf37ef160902f211d21b8cDouglas GregorDeclarationNameTable::DeclarationNameTable() { 3652e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor CXXSpecialNamesImpl = new llvm::FoldingSet<CXXSpecialName>; 366a6c058dd75c5563cced821fc16766a7cc179e00cSean Hunt CXXLiteralOperatorNames = new llvm::FoldingSet<CXXLiteralOperatorIdName>; 367e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor 368e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor // Initialize the overloaded operator names. 369e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor CXXOperatorNames = new CXXOperatorIdName[NUM_OVERLOADED_OPERATORS]; 370e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor for (unsigned Op = 0; Op < NUM_OVERLOADED_OPERATORS; ++Op) { 3711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump CXXOperatorNames[Op].ExtraKindOrNumArgs 372e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor = Op + DeclarationNameExtra::CXXConversionFunction; 373e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor CXXOperatorNames[Op].FETokenInfo = 0; 374e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor } 3752e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor} 3762e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 3772e1cd4264d363ca869bf37ef160902f211d21b8cDouglas GregorDeclarationNameTable::~DeclarationNameTable() { 378a6c058dd75c5563cced821fc16766a7cc179e00cSean Hunt llvm::FoldingSet<CXXSpecialName> *SpecialNames = 3796d34ae5370a41268cc7c39b05e287cab1786fa8eNuno Lopes static_cast<llvm::FoldingSet<CXXSpecialName>*>(CXXSpecialNamesImpl); 380a6c058dd75c5563cced821fc16766a7cc179e00cSean Hunt llvm::FoldingSetIterator<CXXSpecialName> 381a6c058dd75c5563cced821fc16766a7cc179e00cSean Hunt SI = SpecialNames->begin(), SE = SpecialNames->end(); 382a6c058dd75c5563cced821fc16766a7cc179e00cSean Hunt 383a6c058dd75c5563cced821fc16766a7cc179e00cSean Hunt while (SI != SE) { 384a6c058dd75c5563cced821fc16766a7cc179e00cSean Hunt CXXSpecialName *n = &*SI++; 385a6c058dd75c5563cced821fc16766a7cc179e00cSean Hunt delete n; 386a6c058dd75c5563cced821fc16766a7cc179e00cSean Hunt } 387a6c058dd75c5563cced821fc16766a7cc179e00cSean Hunt 3886d34ae5370a41268cc7c39b05e287cab1786fa8eNuno Lopes 389a6c058dd75c5563cced821fc16766a7cc179e00cSean Hunt llvm::FoldingSet<CXXLiteralOperatorIdName> *LiteralNames 390a6c058dd75c5563cced821fc16766a7cc179e00cSean Hunt = static_cast<llvm::FoldingSet<CXXLiteralOperatorIdName>*> 391a6c058dd75c5563cced821fc16766a7cc179e00cSean Hunt (CXXLiteralOperatorNames); 392a6c058dd75c5563cced821fc16766a7cc179e00cSean Hunt llvm::FoldingSetIterator<CXXLiteralOperatorIdName> 393a6c058dd75c5563cced821fc16766a7cc179e00cSean Hunt LI = LiteralNames->begin(), LE = LiteralNames->end(); 394a6c058dd75c5563cced821fc16766a7cc179e00cSean Hunt 395a6c058dd75c5563cced821fc16766a7cc179e00cSean Hunt while (LI != LE) { 396a6c058dd75c5563cced821fc16766a7cc179e00cSean Hunt CXXLiteralOperatorIdName *n = &*LI++; 397f9d1e4bc60690386e0b2c658d707b75a77717a9cNuno Lopes delete n; 3986d34ae5370a41268cc7c39b05e287cab1786fa8eNuno Lopes } 3996d34ae5370a41268cc7c39b05e287cab1786fa8eNuno Lopes 400a6c058dd75c5563cced821fc16766a7cc179e00cSean Hunt delete SpecialNames; 401a6c058dd75c5563cced821fc16766a7cc179e00cSean Hunt delete LiteralNames; 402e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor delete [] CXXOperatorNames; 4032e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor} 4042e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 4051eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpDeclarationName 4061eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpDeclarationNameTable::getCXXSpecialName(DeclarationName::NameKind Kind, 40750d62d1b4a98adbc83de8f8cd1379ea1c25656f7Douglas Gregor CanQualType Ty) { 4082e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor assert(Kind >= DeclarationName::CXXConstructorName && 4092e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor Kind <= DeclarationName::CXXConversionFunctionName && 4102e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor "Kind must be a C++ special name kind"); 4111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump llvm::FoldingSet<CXXSpecialName> *SpecialNames 4122e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor = static_cast<llvm::FoldingSet<CXXSpecialName>*>(CXXSpecialNamesImpl); 4132e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 4142e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor DeclarationNameExtra::ExtraKind EKind; 4152e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor switch (Kind) { 4161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump case DeclarationName::CXXConstructorName: 4172e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor EKind = DeclarationNameExtra::CXXConstructor; 4180953e767ff7817f97b3ab20896b229891eeff45bJohn McCall assert(!Ty.hasQualifiers() &&"Constructor type must be unqualified"); 4192e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor break; 4202e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor case DeclarationName::CXXDestructorName: 4212e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor EKind = DeclarationNameExtra::CXXDestructor; 4220953e767ff7817f97b3ab20896b229891eeff45bJohn McCall assert(!Ty.hasQualifiers() && "Destructor type must be unqualified"); 4232e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor break; 4242e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor case DeclarationName::CXXConversionFunctionName: 4252e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor EKind = DeclarationNameExtra::CXXConversionFunction; 4262e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor break; 4272e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor default: 4282e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return DeclarationName(); 4292e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor } 4302e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 4312e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor // Unique selector, to guarantee there is one per name. 4322e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor llvm::FoldingSetNodeID ID; 4332e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor ID.AddInteger(EKind); 4342e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor ID.AddPointer(Ty.getAsOpaquePtr()); 4352e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 4362e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor void *InsertPos = 0; 4372e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor if (CXXSpecialName *Name = SpecialNames->FindNodeOrInsertPos(ID, InsertPos)) 4382e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return DeclarationName(Name); 4392e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 4402e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor CXXSpecialName *SpecialName = new CXXSpecialName; 4412e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor SpecialName->ExtraKindOrNumArgs = EKind; 4422e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor SpecialName->Type = Ty; 4432def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor SpecialName->FETokenInfo = 0; 4442e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 4452e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor SpecialNames->InsertNode(SpecialName, InsertPos); 4462e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return DeclarationName(SpecialName); 4472e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor} 4482e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 4491eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpDeclarationName 450e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas GregorDeclarationNameTable::getCXXOperatorName(OverloadedOperatorKind Op) { 451e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor return DeclarationName(&CXXOperatorNames[(unsigned)Op]); 452e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor} 453e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor 4543e518bda00d710754ca077cf9be8dd821e16a854Sean HuntDeclarationName 4553e518bda00d710754ca077cf9be8dd821e16a854Sean HuntDeclarationNameTable::getCXXLiteralOperatorName(IdentifierInfo *II) { 456a6c058dd75c5563cced821fc16766a7cc179e00cSean Hunt llvm::FoldingSet<CXXLiteralOperatorIdName> *LiteralNames 457a6c058dd75c5563cced821fc16766a7cc179e00cSean Hunt = static_cast<llvm::FoldingSet<CXXLiteralOperatorIdName>*> 458a6c058dd75c5563cced821fc16766a7cc179e00cSean Hunt (CXXLiteralOperatorNames); 459a6c058dd75c5563cced821fc16766a7cc179e00cSean Hunt 460a6c058dd75c5563cced821fc16766a7cc179e00cSean Hunt llvm::FoldingSetNodeID ID; 461a6c058dd75c5563cced821fc16766a7cc179e00cSean Hunt ID.AddPointer(II); 462a6c058dd75c5563cced821fc16766a7cc179e00cSean Hunt 463a6c058dd75c5563cced821fc16766a7cc179e00cSean Hunt void *InsertPos = 0; 464a6c058dd75c5563cced821fc16766a7cc179e00cSean Hunt if (CXXLiteralOperatorIdName *Name = 465a6c058dd75c5563cced821fc16766a7cc179e00cSean Hunt LiteralNames->FindNodeOrInsertPos(ID, InsertPos)) 466a6c058dd75c5563cced821fc16766a7cc179e00cSean Hunt return DeclarationName (Name); 467a6c058dd75c5563cced821fc16766a7cc179e00cSean Hunt 4683e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt CXXLiteralOperatorIdName *LiteralName = new CXXLiteralOperatorIdName; 4693e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt LiteralName->ExtraKindOrNumArgs = DeclarationNameExtra::CXXLiteralOperator; 4703e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt LiteralName->ID = II; 471a6c058dd75c5563cced821fc16766a7cc179e00cSean Hunt 472a6c058dd75c5563cced821fc16766a7cc179e00cSean Hunt LiteralNames->InsertNode(LiteralName, InsertPos); 4733e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt return DeclarationName(LiteralName); 4743e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt} 4753e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt 4761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpunsigned 47744b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregorllvm::DenseMapInfo<clang::DeclarationName>:: 47844b4321feab46299d3f5cfd404680884752a0fcfDouglas GregorgetHashValue(clang::DeclarationName N) { 47944b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor return DenseMapInfo<void*>::getHashValue(N.getAsOpaquePtr()); 48044b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor} 48144b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 482