DeclarationName.cpp revision 2550d70aabb5f603e8f74cc5fb6a69a7af5b51f3
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. 593e518bda00d710754ca077cf9be8dd821e16a854Sean Huntclass CXXLiteralOperatorIdName : public DeclarationNameExtra { 603e518bda00d710754ca077cf9be8dd821e16a854Sean Huntpublic: 613e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt IdentifierInfo *ID; 623e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt}; 633e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt 642e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregorbool operator<(DeclarationName LHS, DeclarationName RHS) { 65d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor if (LHS.getNameKind() != RHS.getNameKind()) 66d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor return LHS.getNameKind() < RHS.getNameKind(); 67d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor 68d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor switch (LHS.getNameKind()) { 69d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor case DeclarationName::Identifier: 70d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor return LHS.getAsIdentifierInfo()->getName() < 71d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor RHS.getAsIdentifierInfo()->getName(); 722e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 73d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor case DeclarationName::ObjCZeroArgSelector: 74d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor case DeclarationName::ObjCOneArgSelector: 75d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor case DeclarationName::ObjCMultiArgSelector: { 76d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor Selector LHSSelector = LHS.getObjCSelector(); 77d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor Selector RHSSelector = RHS.getObjCSelector(); 78d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor for (unsigned I = 0, 79d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor N = std::min(LHSSelector.getNumArgs(), RHSSelector.getNumArgs()); 80d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor I != N; ++I) { 81d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor IdentifierInfo *LHSId = LHSSelector.getIdentifierInfoForSlot(I); 82d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor IdentifierInfo *RHSId = RHSSelector.getIdentifierInfoForSlot(I); 83d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor if (!LHSId || !RHSId) 84d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor return LHSId && !RHSId; 85d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor 86d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor switch (LHSId->getName().compare(RHSId->getName())) { 87d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor case -1: return true; 88d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor case 1: return false; 89d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor default: break; 90d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor } 91d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor } 92d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor 93d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor return LHSSelector.getNumArgs() < RHSSelector.getNumArgs(); 94d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor } 95d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor 96d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor case DeclarationName::CXXConstructorName: 97d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor case DeclarationName::CXXDestructorName: 98d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor case DeclarationName::CXXConversionFunctionName: 99d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor return QualTypeOrdering()(LHS.getCXXNameType(), RHS.getCXXNameType()); 100d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor 101d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor case DeclarationName::CXXOperatorName: 102d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor return LHS.getCXXOverloadedOperator() < RHS.getCXXOverloadedOperator(); 1033e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt 1043e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt case DeclarationName::CXXLiteralOperatorName: 1053e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt return LHS.getCXXLiteralIdentifier()->getName() < 1063e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt RHS.getCXXLiteralIdentifier()->getName(); 107d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor 108d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor case DeclarationName::CXXUsingDirective: 109d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor return false; 110d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor } 111d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor 112d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor return false; 1132e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor} 1142e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 1152e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor} // end namespace clang 1162e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 1172e1cd4264d363ca869bf37ef160902f211d21b8cDouglas GregorDeclarationName::DeclarationName(Selector Sel) { 118319ac896a0fef7365d5589b8021db7e41207fe42Douglas Gregor if (!Sel.getAsOpaquePtr()) { 119813a97b3eee957eac3ac1fb111b8892fb9afd0d4Douglas Gregor Ptr = 0; 120319ac896a0fef7365d5589b8021db7e41207fe42Douglas Gregor return; 121319ac896a0fef7365d5589b8021db7e41207fe42Douglas Gregor } 122319ac896a0fef7365d5589b8021db7e41207fe42Douglas Gregor 1232e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor switch (Sel.getNumArgs()) { 1242e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor case 0: 1252e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor Ptr = reinterpret_cast<uintptr_t>(Sel.getAsIdentifierInfo()); 1263eb8dd78a622d257a7fed279714428c3de906f93Ted Kremenek assert((Ptr & PtrMask) == 0 && "Improperly aligned IdentifierInfo"); 1272e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor Ptr |= StoredObjCZeroArgSelector; 1282e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor break; 1292e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 1302e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor case 1: 1312e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor Ptr = reinterpret_cast<uintptr_t>(Sel.getAsIdentifierInfo()); 1323eb8dd78a622d257a7fed279714428c3de906f93Ted Kremenek assert((Ptr & PtrMask) == 0 && "Improperly aligned IdentifierInfo"); 1332e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor Ptr |= StoredObjCOneArgSelector; 1342e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor break; 1352e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 1362e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor default: 1372e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor Ptr = Sel.InfoPtr & ~Selector::ArgFlags; 1383eb8dd78a622d257a7fed279714428c3de906f93Ted Kremenek assert((Ptr & PtrMask) == 0 && "Improperly aligned MultiKeywordSelector"); 139e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor Ptr |= StoredDeclarationNameExtra; 1402e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor break; 1412e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor } 1422e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor} 1432e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 1442e1cd4264d363ca869bf37ef160902f211d21b8cDouglas GregorDeclarationName::NameKind DeclarationName::getNameKind() const { 1452e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor switch (getStoredNameKind()) { 1462e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor case StoredIdentifier: return Identifier; 1472e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor case StoredObjCZeroArgSelector: return ObjCZeroArgSelector; 1482e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor case StoredObjCOneArgSelector: return ObjCOneArgSelector; 1492e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 150e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor case StoredDeclarationNameExtra: 1512e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor switch (getExtra()->ExtraKindOrNumArgs) { 1521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump case DeclarationNameExtra::CXXConstructor: 1532e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return CXXConstructorName; 1542e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 1551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump case DeclarationNameExtra::CXXDestructor: 1562e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return CXXDestructorName; 1572e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 1581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump case DeclarationNameExtra::CXXConversionFunction: 1592e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return CXXConversionFunctionName; 1602e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 1613e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt case DeclarationNameExtra::CXXLiteralOperator: 1623e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt return CXXLiteralOperatorName; 1633e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt 1642a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor case DeclarationNameExtra::CXXUsingDirective: 1652a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor return CXXUsingDirective; 1662a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor 1672e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor default: 168e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor // Check if we have one of the CXXOperator* enumeration values. 1691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (getExtra()->ExtraKindOrNumArgs < 1702a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor DeclarationNameExtra::CXXUsingDirective) 171e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor return CXXOperatorName; 172e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor 1732e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return ObjCMultiArgSelector; 1742e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor } 1752e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor break; 1762e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor } 1772e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 1782e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor // Can't actually get here. 179ac8d75fe94f2aefde5179d53e230b99a1fe1201aChris Lattner assert(0 && "This should be unreachable!"); 1802e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return Identifier; 1812e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor} 1822e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 18310bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregorstd::string DeclarationName::getAsString() const { 18410bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor switch (getNameKind()) { 18510bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor case Identifier: 18610bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor if (const IdentifierInfo *II = getAsIdentifierInfo()) 18710bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor return II->getName(); 18810bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor return ""; 18910bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor 19010bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor case ObjCZeroArgSelector: 19110bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor case ObjCOneArgSelector: 19210bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor case ObjCMultiArgSelector: 193077bf5e2f48acfa9e7d69429b6e4ba86ea14896dChris Lattner return getObjCSelector().getAsString(); 19410bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor 19510bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor case CXXConstructorName: { 19610bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor QualType ClassType = getCXXNameType(); 1976217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek if (const RecordType *ClassRec = ClassType->getAs<RecordType>()) 19839f34e97d6a468f0a7dfa5664c61217cffc65b74Chris Lattner return ClassRec->getDecl()->getNameAsString(); 19910bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor return ClassType.getAsString(); 20010bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor } 20110bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor 20210bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor case CXXDestructorName: { 20310bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor std::string Result = "~"; 20410bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor QualType Type = getCXXNameType(); 2056217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek if (const RecordType *Rec = Type->getAs<RecordType>()) 20639f34e97d6a468f0a7dfa5664c61217cffc65b74Chris Lattner Result += Rec->getDecl()->getNameAsString(); 20710bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor else 20810bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor Result += Type.getAsString(); 20910bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor return Result; 21010bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor } 21110bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor 212e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor case CXXOperatorName: { 2132550d70aabb5f603e8f74cc5fb6a69a7af5b51f3Nuno Lopes static const char* const OperatorNames[NUM_OVERLOADED_OPERATORS] = { 214e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor 0, 215e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor#define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \ 216e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor Spelling, 217e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor#include "clang/Basic/OperatorKinds.def" 218e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor }; 219e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor const char *OpName = OperatorNames[getCXXOverloadedOperator()]; 220e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor assert(OpName && "not an overloaded operator"); 2211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 222e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor std::string Result = "operator"; 223e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor if (OpName[0] >= 'a' && OpName[0] <= 'z') 224e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor Result += ' '; 225e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor Result += OpName; 226e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor return Result; 227e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor } 228e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor 2293e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt case CXXLiteralOperatorName: { 2303e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt return "operator \"\" " + std::string(getCXXLiteralIdentifier()->getName()); 2313e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt } 2323e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt 23310bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor case CXXConversionFunctionName: { 23410bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor std::string Result = "operator "; 23510bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor QualType Type = getCXXNameType(); 2366217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek if (const RecordType *Rec = Type->getAs<RecordType>()) 23739f34e97d6a468f0a7dfa5664c61217cffc65b74Chris Lattner Result += Rec->getDecl()->getNameAsString(); 23810bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor else 23910bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor Result += Type.getAsString(); 24010bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor return Result; 24110bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor } 2422a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor case CXXUsingDirective: 2432a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor return "<using-directive>"; 24410bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor } 24510bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor 24610bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor assert(false && "Unexpected declaration name kind"); 24710bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor return ""; 24810bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor} 24910bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor 2502e1cd4264d363ca869bf37ef160902f211d21b8cDouglas GregorQualType DeclarationName::getCXXNameType() const { 2512e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor if (CXXSpecialName *CXXName = getAsCXXSpecialName()) 2522e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return CXXName->Type; 2532e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor else 2542e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return QualType(); 2552e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor} 2562e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 257e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas GregorOverloadedOperatorKind DeclarationName::getCXXOverloadedOperator() const { 258e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor if (CXXOperatorIdName *CXXOp = getAsCXXOperatorIdName()) { 2591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump unsigned value 260e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor = CXXOp->ExtraKindOrNumArgs - DeclarationNameExtra::CXXConversionFunction; 261e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor return static_cast<OverloadedOperatorKind>(value); 262e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor } else { 263e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor return OO_None; 264e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor } 265e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor} 266e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor 2673e518bda00d710754ca077cf9be8dd821e16a854Sean HuntIdentifierInfo *DeclarationName::getCXXLiteralIdentifier() const { 2683e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt if (CXXLiteralOperatorIdName *CXXLit = getAsCXXLiteralOperatorIdName()) 2693e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt return CXXLit->ID; 2703e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt else 2713e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt return 0; 2723e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt} 2733e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt 2742e1cd4264d363ca869bf37ef160902f211d21b8cDouglas GregorSelector DeclarationName::getObjCSelector() const { 2752e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor switch (getNameKind()) { 2762e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor case ObjCZeroArgSelector: 2772e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return Selector(reinterpret_cast<IdentifierInfo *>(Ptr & ~PtrMask), 0); 2782e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 2792e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor case ObjCOneArgSelector: 2802e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return Selector(reinterpret_cast<IdentifierInfo *>(Ptr & ~PtrMask), 1); 2812e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 2822e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor case ObjCMultiArgSelector: 2832e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return Selector(reinterpret_cast<MultiKeywordSelector *>(Ptr & ~PtrMask)); 2842e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 2852e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor default: 2862e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor break; 2872e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor } 2882e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 2892e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return Selector(); 2902e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor} 2912e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 2922def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregorvoid *DeclarationName::getFETokenInfoAsVoid() const { 2932def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor switch (getNameKind()) { 2942def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor case Identifier: 2952def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor return getAsIdentifierInfo()->getFETokenInfo<void>(); 2962def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor 2972def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor case CXXConstructorName: 2982def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor case CXXDestructorName: 2992def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor case CXXConversionFunctionName: 3002def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor return getAsCXXSpecialName()->FETokenInfo; 3012def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor 302e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor case CXXOperatorName: 303e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor return getAsCXXOperatorIdName()->FETokenInfo; 304e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor 3053e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt case CXXLiteralOperatorName: 3063e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt return getCXXLiteralIdentifier()->getFETokenInfo<void>(); 3073e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt 3082def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor default: 3092def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor assert(false && "Declaration name has no FETokenInfo"); 3102def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor } 3112def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor return 0; 3122def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor} 3132def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor 3142def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregorvoid DeclarationName::setFETokenInfo(void *T) { 3152def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor switch (getNameKind()) { 3162def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor case Identifier: 3172def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor getAsIdentifierInfo()->setFETokenInfo(T); 3182def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor break; 3192def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor 3202def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor case CXXConstructorName: 3212def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor case CXXDestructorName: 3222def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor case CXXConversionFunctionName: 3232def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor getAsCXXSpecialName()->FETokenInfo = T; 3242def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor break; 3252def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor 326e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor case CXXOperatorName: 327e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor getAsCXXOperatorIdName()->FETokenInfo = T; 328e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor break; 329e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor 3303e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt case CXXLiteralOperatorName: 3313e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt getCXXLiteralIdentifier()->setFETokenInfo(T); 3323e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt break; 3333e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt 3342def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor default: 3352def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor assert(false && "Declaration name has no FETokenInfo"); 3362def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor } 3372def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor} 3382def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor 3392a3009a432bdcec59e6383d7b2b17494d6f91649Douglas GregorDeclarationName DeclarationName::getUsingDirectiveName() { 3402a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor // Single instance of DeclarationNameExtra for using-directive 34168f7a2426227476bcfa33ada70b708c82419dfdcNuno Lopes static const DeclarationNameExtra UDirExtra = 3422a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor { DeclarationNameExtra::CXXUsingDirective }; 3432a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor 3442a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor uintptr_t Ptr = reinterpret_cast<uintptr_t>(&UDirExtra); 3452a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor Ptr |= StoredDeclarationNameExtra; 3462a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor 3472a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor return DeclarationName(Ptr); 3482a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor} 3492a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor 35070f5bc77dbe4172bde860e15d8b3c29e0d5005cbAnders Carlssonvoid DeclarationName::dump() const { 35170f5bc77dbe4172bde860e15d8b3c29e0d5005cbAnders Carlsson fprintf(stderr, "%s\n", getAsString().c_str()); 35270f5bc77dbe4172bde860e15d8b3c29e0d5005cbAnders Carlsson} 35370f5bc77dbe4172bde860e15d8b3c29e0d5005cbAnders Carlsson 3542e1cd4264d363ca869bf37ef160902f211d21b8cDouglas GregorDeclarationNameTable::DeclarationNameTable() { 3552e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor CXXSpecialNamesImpl = new llvm::FoldingSet<CXXSpecialName>; 356e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor 357e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor // Initialize the overloaded operator names. 358e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor CXXOperatorNames = new CXXOperatorIdName[NUM_OVERLOADED_OPERATORS]; 359e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor for (unsigned Op = 0; Op < NUM_OVERLOADED_OPERATORS; ++Op) { 3601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump CXXOperatorNames[Op].ExtraKindOrNumArgs 361e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor = Op + DeclarationNameExtra::CXXConversionFunction; 362e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor CXXOperatorNames[Op].FETokenInfo = 0; 363e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor } 3642e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor} 3652e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 3662e1cd4264d363ca869bf37ef160902f211d21b8cDouglas GregorDeclarationNameTable::~DeclarationNameTable() { 3676d34ae5370a41268cc7c39b05e287cab1786fa8eNuno Lopes llvm::FoldingSet<CXXSpecialName> *set = 3686d34ae5370a41268cc7c39b05e287cab1786fa8eNuno Lopes static_cast<llvm::FoldingSet<CXXSpecialName>*>(CXXSpecialNamesImpl); 369f9d1e4bc60690386e0b2c658d707b75a77717a9cNuno Lopes llvm::FoldingSetIterator<CXXSpecialName> I = set->begin(), E = set->end(); 3706d34ae5370a41268cc7c39b05e287cab1786fa8eNuno Lopes 371f9d1e4bc60690386e0b2c658d707b75a77717a9cNuno Lopes while (I != E) { 372f9d1e4bc60690386e0b2c658d707b75a77717a9cNuno Lopes CXXSpecialName *n = &*I++; 373f9d1e4bc60690386e0b2c658d707b75a77717a9cNuno Lopes delete n; 3746d34ae5370a41268cc7c39b05e287cab1786fa8eNuno Lopes } 3756d34ae5370a41268cc7c39b05e287cab1786fa8eNuno Lopes 3766d34ae5370a41268cc7c39b05e287cab1786fa8eNuno Lopes delete set; 377e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor delete [] CXXOperatorNames; 3782e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor} 3792e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 3801eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpDeclarationName 3811eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpDeclarationNameTable::getCXXSpecialName(DeclarationName::NameKind Kind, 38250d62d1b4a98adbc83de8f8cd1379ea1c25656f7Douglas Gregor CanQualType Ty) { 3832e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor assert(Kind >= DeclarationName::CXXConstructorName && 3842e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor Kind <= DeclarationName::CXXConversionFunctionName && 3852e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor "Kind must be a C++ special name kind"); 3861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump llvm::FoldingSet<CXXSpecialName> *SpecialNames 3872e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor = static_cast<llvm::FoldingSet<CXXSpecialName>*>(CXXSpecialNamesImpl); 3882e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 3892e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor DeclarationNameExtra::ExtraKind EKind; 3902e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor switch (Kind) { 3911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump case DeclarationName::CXXConstructorName: 3922e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor EKind = DeclarationNameExtra::CXXConstructor; 3930953e767ff7817f97b3ab20896b229891eeff45bJohn McCall assert(!Ty.hasQualifiers() &&"Constructor type must be unqualified"); 3942e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor break; 3952e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor case DeclarationName::CXXDestructorName: 3962e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor EKind = DeclarationNameExtra::CXXDestructor; 3970953e767ff7817f97b3ab20896b229891eeff45bJohn McCall assert(!Ty.hasQualifiers() && "Destructor type must be unqualified"); 3982e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor break; 3992e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor case DeclarationName::CXXConversionFunctionName: 4002e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor EKind = DeclarationNameExtra::CXXConversionFunction; 4012e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor break; 4022e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor default: 4032e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return DeclarationName(); 4042e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor } 4052e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 4062e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor // Unique selector, to guarantee there is one per name. 4072e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor llvm::FoldingSetNodeID ID; 4082e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor ID.AddInteger(EKind); 4092e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor ID.AddPointer(Ty.getAsOpaquePtr()); 4102e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 4112e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor void *InsertPos = 0; 4122e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor if (CXXSpecialName *Name = SpecialNames->FindNodeOrInsertPos(ID, InsertPos)) 4132e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return DeclarationName(Name); 4142e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 4152e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor CXXSpecialName *SpecialName = new CXXSpecialName; 4162e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor SpecialName->ExtraKindOrNumArgs = EKind; 4172e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor SpecialName->Type = Ty; 4182def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor SpecialName->FETokenInfo = 0; 4192e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 4202e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor SpecialNames->InsertNode(SpecialName, InsertPos); 4212e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return DeclarationName(SpecialName); 4222e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor} 4232e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 4241eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpDeclarationName 425e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas GregorDeclarationNameTable::getCXXOperatorName(OverloadedOperatorKind Op) { 426e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor return DeclarationName(&CXXOperatorNames[(unsigned)Op]); 427e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor} 428e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor 4293e518bda00d710754ca077cf9be8dd821e16a854Sean HuntDeclarationName 4303e518bda00d710754ca077cf9be8dd821e16a854Sean HuntDeclarationNameTable::getCXXLiteralOperatorName(IdentifierInfo *II) { 4313e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt CXXLiteralOperatorIdName *LiteralName = new CXXLiteralOperatorIdName; 4323e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt LiteralName->ExtraKindOrNumArgs = DeclarationNameExtra::CXXLiteralOperator; 4333e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt LiteralName->ID = II; 4343e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt return DeclarationName(LiteralName); 4353e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt} 4363e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt 4371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpunsigned 43844b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregorllvm::DenseMapInfo<clang::DeclarationName>:: 43944b4321feab46299d3f5cfd404680884752a0fcfDouglas GregorgetHashValue(clang::DeclarationName N) { 44044b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor return DenseMapInfo<void*>::getHashValue(N.getAsOpaquePtr()); 44144b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor} 44244b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 443