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//===----------------------------------------------------------------------===// 14ac9590effa90406767a544005ed1de52e258306bTed Kremenek#include "clang/AST/ASTContext.h" 15ac9590effa90406767a544005ed1de52e258306bTed Kremenek#include "clang/AST/Decl.h" 162e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor#include "clang/AST/DeclarationName.h" 1710bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor#include "clang/AST/Type.h" 182577743c5650c646fb705df01403707e94f2df04Abramo Bagnara#include "clang/AST/TypeLoc.h" 19d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor#include "clang/AST/TypeOrdering.h" 202e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor#include "clang/Basic/IdentifierTable.h" 21370187c8a3e96517c943329f2511737a04b85450Douglas Gregor#include "llvm/ADT/DenseMap.h" 222e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor#include "llvm/ADT/FoldingSet.h" 23f24e54a0c8f0621dc1e964e79dd2fc47f6a2e723Chandler Carruth#include "llvm/Support/ErrorHandling.h" 24f6cde77d7bc34bbee26b086ff192637af8e9da59Benjamin Kramer#include "llvm/Support/raw_ostream.h" 252e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregorusing namespace clang; 262e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 272e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregornamespace clang { 282e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// CXXSpecialName - Records the type associated with one of the 292e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// "special" kinds of declaration names in C++, e.g., constructors, 302e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// destructors, and conversion functions. 311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpclass CXXSpecialName 322e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor : public DeclarationNameExtra, public llvm::FoldingSetNode { 332e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregorpublic: 342def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor /// Type - The type associated with this declaration name. 352e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor QualType Type; 362e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 372def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor /// FETokenInfo - Extra information associated with this declaration 382def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor /// name that can be used by the front end. 392def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor void *FETokenInfo; 402def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor 412e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor void Profile(llvm::FoldingSetNodeID &ID) { 422e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor ID.AddInteger(ExtraKindOrNumArgs); 432e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor ID.AddPointer(Type.getAsOpaquePtr()); 442e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor } 452e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor}; 462e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 47e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor/// CXXOperatorIdName - Contains extra information for the name of an 481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// overloaded operator in C++, such as "operator+. 49e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregorclass CXXOperatorIdName : public DeclarationNameExtra { 50e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregorpublic: 51e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor /// FETokenInfo - Extra information associated with this operator 52e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor /// name that can be used by the front end. 53e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor void *FETokenInfo; 54e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor}; 55e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor 563a5032b89df601ab2e0c5c7e9667db2301bf10cfRichard Smith/// CXXLiteralOperatorName - Contains the actual identifier that makes up the 573e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt/// name. 583e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt/// 593e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt/// This identifier is stored here rather than directly in DeclarationName so as 603e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt/// to allow Objective-C selectors, which are about a million times more common, 613e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt/// to consume minimal memory. 62a6c058dd75c5563cced821fc16766a7cc179e00cSean Huntclass CXXLiteralOperatorIdName 63a6c058dd75c5563cced821fc16766a7cc179e00cSean Hunt : public DeclarationNameExtra, public llvm::FoldingSetNode { 643e518bda00d710754ca077cf9be8dd821e16a854Sean Huntpublic: 653e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt IdentifierInfo *ID; 66a6c058dd75c5563cced821fc16766a7cc179e00cSean Hunt 673a5032b89df601ab2e0c5c7e9667db2301bf10cfRichard Smith /// FETokenInfo - Extra information associated with this operator 683a5032b89df601ab2e0c5c7e9667db2301bf10cfRichard Smith /// name that can be used by the front end. 693a5032b89df601ab2e0c5c7e9667db2301bf10cfRichard Smith void *FETokenInfo; 703a5032b89df601ab2e0c5c7e9667db2301bf10cfRichard Smith 71a6c058dd75c5563cced821fc16766a7cc179e00cSean Hunt void Profile(llvm::FoldingSetNodeID &FSID) { 72a6c058dd75c5563cced821fc16766a7cc179e00cSean Hunt FSID.AddPointer(ID); 73a6c058dd75c5563cced821fc16766a7cc179e00cSean Hunt } 743e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt}; 753e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt 767fe0b9ea2c8137c035402e6ea01dfdfbc93214cbJohn McCallstatic int compareInt(unsigned A, unsigned B) { 777fe0b9ea2c8137c035402e6ea01dfdfbc93214cbJohn McCall return (A < B ? -1 : (A > B ? 1 : 0)); 787fe0b9ea2c8137c035402e6ea01dfdfbc93214cbJohn McCall} 797fe0b9ea2c8137c035402e6ea01dfdfbc93214cbJohn McCall 807fe0b9ea2c8137c035402e6ea01dfdfbc93214cbJohn McCallint DeclarationName::compare(DeclarationName LHS, DeclarationName RHS) { 81d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor if (LHS.getNameKind() != RHS.getNameKind()) 827fe0b9ea2c8137c035402e6ea01dfdfbc93214cbJohn McCall return (LHS.getNameKind() < RHS.getNameKind() ? -1 : 1); 83d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor 84d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor switch (LHS.getNameKind()) { 857fe0b9ea2c8137c035402e6ea01dfdfbc93214cbJohn McCall case DeclarationName::Identifier: { 867fe0b9ea2c8137c035402e6ea01dfdfbc93214cbJohn McCall IdentifierInfo *LII = LHS.getAsIdentifierInfo(); 877fe0b9ea2c8137c035402e6ea01dfdfbc93214cbJohn McCall IdentifierInfo *RII = RHS.getAsIdentifierInfo(); 887fe0b9ea2c8137c035402e6ea01dfdfbc93214cbJohn McCall if (!LII) return RII ? -1 : 0; 897fe0b9ea2c8137c035402e6ea01dfdfbc93214cbJohn McCall if (!RII) return 1; 907fe0b9ea2c8137c035402e6ea01dfdfbc93214cbJohn McCall 917fe0b9ea2c8137c035402e6ea01dfdfbc93214cbJohn McCall return LII->getName().compare(RII->getName()); 927fe0b9ea2c8137c035402e6ea01dfdfbc93214cbJohn McCall } 932e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 94d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor case DeclarationName::ObjCZeroArgSelector: 95d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor case DeclarationName::ObjCOneArgSelector: 96d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor case DeclarationName::ObjCMultiArgSelector: { 97d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor Selector LHSSelector = LHS.getObjCSelector(); 98d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor Selector RHSSelector = RHS.getObjCSelector(); 997fe0b9ea2c8137c035402e6ea01dfdfbc93214cbJohn McCall unsigned LN = LHSSelector.getNumArgs(), RN = RHSSelector.getNumArgs(); 1007fe0b9ea2c8137c035402e6ea01dfdfbc93214cbJohn McCall for (unsigned I = 0, N = std::min(LN, RN); I != N; ++I) { 101813d8346529bf094eb2b249648906ba7fd226688Douglas Gregor switch (LHSSelector.getNameForSlot(I).compare( 102813d8346529bf094eb2b249648906ba7fd226688Douglas Gregor RHSSelector.getNameForSlot(I))) { 103d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor case -1: return true; 104d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor case 1: return false; 105d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor default: break; 106d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor } 107d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor } 1087fe0b9ea2c8137c035402e6ea01dfdfbc93214cbJohn McCall 1097fe0b9ea2c8137c035402e6ea01dfdfbc93214cbJohn McCall return compareInt(LN, RN); 110d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor } 111d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor 112d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor case DeclarationName::CXXConstructorName: 113d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor case DeclarationName::CXXDestructorName: 114d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor case DeclarationName::CXXConversionFunctionName: 1157fe0b9ea2c8137c035402e6ea01dfdfbc93214cbJohn McCall if (QualTypeOrdering()(LHS.getCXXNameType(), RHS.getCXXNameType())) 1167fe0b9ea2c8137c035402e6ea01dfdfbc93214cbJohn McCall return -1; 1177fe0b9ea2c8137c035402e6ea01dfdfbc93214cbJohn McCall if (QualTypeOrdering()(RHS.getCXXNameType(), LHS.getCXXNameType())) 1187fe0b9ea2c8137c035402e6ea01dfdfbc93214cbJohn McCall return 1; 1197fe0b9ea2c8137c035402e6ea01dfdfbc93214cbJohn McCall return 0; 120d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor 121d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor case DeclarationName::CXXOperatorName: 1227fe0b9ea2c8137c035402e6ea01dfdfbc93214cbJohn McCall return compareInt(LHS.getCXXOverloadedOperator(), 1237fe0b9ea2c8137c035402e6ea01dfdfbc93214cbJohn McCall RHS.getCXXOverloadedOperator()); 1243e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt 1253e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt case DeclarationName::CXXLiteralOperatorName: 1267fe0b9ea2c8137c035402e6ea01dfdfbc93214cbJohn McCall return LHS.getCXXLiteralIdentifier()->getName().compare( 1277fe0b9ea2c8137c035402e6ea01dfdfbc93214cbJohn McCall RHS.getCXXLiteralIdentifier()->getName()); 128d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor 129d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor case DeclarationName::CXXUsingDirective: 1307fe0b9ea2c8137c035402e6ea01dfdfbc93214cbJohn McCall return 0; 131d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor } 1323026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie 1333026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie llvm_unreachable("Invalid DeclarationName Kind!"); 1342e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor} 1352e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 13617828ca5857d5d9cadfffd339f888de58182c8f1David Blaikieraw_ostream &operator<<(raw_ostream &OS, DeclarationName N) { 13717828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie switch (N.getNameKind()) { 13817828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie case DeclarationName::Identifier: 13917828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie if (const IdentifierInfo *II = N.getAsIdentifierInfo()) 14017828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie OS << II->getName(); 14117828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie return OS; 14217828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie 14317828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie case DeclarationName::ObjCZeroArgSelector: 14417828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie case DeclarationName::ObjCOneArgSelector: 14517828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie case DeclarationName::ObjCMultiArgSelector: 146651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines N.getObjCSelector().print(OS); 147651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return OS; 14817828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie 14917828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie case DeclarationName::CXXConstructorName: { 15017828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie QualType ClassType = N.getCXXNameType(); 15117828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie if (const RecordType *ClassRec = ClassType->getAs<RecordType>()) 15217828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie return OS << *ClassRec->getDecl(); 153651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines LangOptions LO; 154651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines LO.CPlusPlus = true; 155651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return OS << ClassType.getAsString(PrintingPolicy(LO)); 15617828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie } 15717828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie 15817828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie case DeclarationName::CXXDestructorName: { 15917828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie OS << '~'; 16017828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie QualType Type = N.getCXXNameType(); 16117828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie if (const RecordType *Rec = Type->getAs<RecordType>()) 16217828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie return OS << *Rec->getDecl(); 163651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines LangOptions LO; 164651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines LO.CPlusPlus = true; 165651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return OS << Type.getAsString(PrintingPolicy(LO)); 16617828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie } 16717828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie 16817828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie case DeclarationName::CXXOperatorName: { 16917828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie static const char* const OperatorNames[NUM_OVERLOADED_OPERATORS] = { 1706bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines nullptr, 17117828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie#define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \ 17217828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie Spelling, 17317828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie#include "clang/Basic/OperatorKinds.def" 17417828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie }; 17517828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie const char *OpName = OperatorNames[N.getCXXOverloadedOperator()]; 17617828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie assert(OpName && "not an overloaded operator"); 17717828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie 17817828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie OS << "operator"; 17917828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie if (OpName[0] >= 'a' && OpName[0] <= 'z') 18017828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie OS << ' '; 18117828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie return OS << OpName; 18217828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie } 18317828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie 18417828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie case DeclarationName::CXXLiteralOperatorName: 18517828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie return OS << "operator \"\" " << N.getCXXLiteralIdentifier()->getName(); 18617828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie 18717828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie case DeclarationName::CXXConversionFunctionName: { 18817828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie OS << "operator "; 18917828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie QualType Type = N.getCXXNameType(); 19017828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie if (const RecordType *Rec = Type->getAs<RecordType>()) 19117828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie return OS << *Rec->getDecl(); 192651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines LangOptions LO; 193651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines LO.CPlusPlus = true; 194651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines LO.Bool = true; 195651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return OS << Type.getAsString(PrintingPolicy(LO)); 19617828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie } 19717828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie case DeclarationName::CXXUsingDirective: 19817828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie return OS << "<using-directive>"; 19917828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie } 20017828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie 20117828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie llvm_unreachable("Unexpected declaration name kind"); 20217828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie} 20317828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie 2042e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor} // end namespace clang 2052e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 2062e1cd4264d363ca869bf37ef160902f211d21b8cDouglas GregorDeclarationName::NameKind DeclarationName::getNameKind() const { 2072e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor switch (getStoredNameKind()) { 2082e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor case StoredIdentifier: return Identifier; 2092e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor case StoredObjCZeroArgSelector: return ObjCZeroArgSelector; 2102e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor case StoredObjCOneArgSelector: return ObjCOneArgSelector; 2112e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 212e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor case StoredDeclarationNameExtra: 2132e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor switch (getExtra()->ExtraKindOrNumArgs) { 2141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump case DeclarationNameExtra::CXXConstructor: 2152e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return CXXConstructorName; 2162e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 2171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump case DeclarationNameExtra::CXXDestructor: 2182e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return CXXDestructorName; 2192e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 2201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump case DeclarationNameExtra::CXXConversionFunction: 2212e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return CXXConversionFunctionName; 2222e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 2233e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt case DeclarationNameExtra::CXXLiteralOperator: 2243e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt return CXXLiteralOperatorName; 2253e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt 2262a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor case DeclarationNameExtra::CXXUsingDirective: 2272a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor return CXXUsingDirective; 2282a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor 2292e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor default: 230e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor // Check if we have one of the CXXOperator* enumeration values. 2311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (getExtra()->ExtraKindOrNumArgs < 2322a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor DeclarationNameExtra::CXXUsingDirective) 233e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor return CXXOperatorName; 234e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor 2352e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return ObjCMultiArgSelector; 2362e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor } 2372e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor } 2382e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 2392e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor // Can't actually get here. 240b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie llvm_unreachable("This should be unreachable!"); 2412e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor} 2422e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 24348026d26fb58e413544874eead5491b1452e2ebfDouglas Gregorbool DeclarationName::isDependentName() const { 24448026d26fb58e413544874eead5491b1452e2ebfDouglas Gregor QualType T = getCXXNameType(); 24548026d26fb58e413544874eead5491b1452e2ebfDouglas Gregor return !T.isNull() && T->isDependentType(); 24648026d26fb58e413544874eead5491b1452e2ebfDouglas Gregor} 24748026d26fb58e413544874eead5491b1452e2ebfDouglas Gregor 24810bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregorstd::string DeclarationName::getAsString() const { 249f6cde77d7bc34bbee26b086ff192637af8e9da59Benjamin Kramer std::string Result; 250f6cde77d7bc34bbee26b086ff192637af8e9da59Benjamin Kramer llvm::raw_string_ostream OS(Result); 25117828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie OS << *this; 252f6cde77d7bc34bbee26b086ff192637af8e9da59Benjamin Kramer return OS.str(); 253f6cde77d7bc34bbee26b086ff192637af8e9da59Benjamin Kramer} 254f6cde77d7bc34bbee26b086ff192637af8e9da59Benjamin Kramer 2552e1cd4264d363ca869bf37ef160902f211d21b8cDouglas GregorQualType DeclarationName::getCXXNameType() const { 2562e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor if (CXXSpecialName *CXXName = getAsCXXSpecialName()) 2572e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return CXXName->Type; 2582e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor else 2592e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return QualType(); 2602e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor} 2612e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 262e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas GregorOverloadedOperatorKind DeclarationName::getCXXOverloadedOperator() const { 263e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor if (CXXOperatorIdName *CXXOp = getAsCXXOperatorIdName()) { 2641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump unsigned value 265e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor = CXXOp->ExtraKindOrNumArgs - DeclarationNameExtra::CXXConversionFunction; 266e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor return static_cast<OverloadedOperatorKind>(value); 267e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor } else { 268e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor return OO_None; 269e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor } 270e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor} 271e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor 2723e518bda00d710754ca077cf9be8dd821e16a854Sean HuntIdentifierInfo *DeclarationName::getCXXLiteralIdentifier() const { 2733e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt if (CXXLiteralOperatorIdName *CXXLit = getAsCXXLiteralOperatorIdName()) 2743e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt return CXXLit->ID; 2753e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt else 2766bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 2773e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt} 2783e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt 279514d3b6b93c83c0841d2f9dd7af8ecc2877fe921Douglas Gregorvoid *DeclarationName::getFETokenInfoAsVoidSlow() const { 2802def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor switch (getNameKind()) { 2812def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor case Identifier: 282c470442fe144b93c2877134559d0067b3215289dBenjamin Kramer llvm_unreachable("Handled by getFETokenInfo()"); 2832def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor 2842def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor case CXXConstructorName: 2852def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor case CXXDestructorName: 2862def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor case CXXConversionFunctionName: 2872def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor return getAsCXXSpecialName()->FETokenInfo; 2882def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor 289e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor case CXXOperatorName: 290e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor return getAsCXXOperatorIdName()->FETokenInfo; 291e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor 2923e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt case CXXLiteralOperatorName: 2933a5032b89df601ab2e0c5c7e9667db2301bf10cfRichard Smith return getAsCXXLiteralOperatorIdName()->FETokenInfo; 2943e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt 2952def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor default: 296b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie llvm_unreachable("Declaration name has no FETokenInfo"); 2972def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor } 2982def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor} 2992def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor 3002def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregorvoid DeclarationName::setFETokenInfo(void *T) { 3012def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor switch (getNameKind()) { 3022def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor case Identifier: 3032def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor getAsIdentifierInfo()->setFETokenInfo(T); 3042def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor break; 3052def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor 3062def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor case CXXConstructorName: 3072def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor case CXXDestructorName: 3082def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor case CXXConversionFunctionName: 3092def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor getAsCXXSpecialName()->FETokenInfo = T; 3102def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor break; 3112def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor 312e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor case CXXOperatorName: 313e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor getAsCXXOperatorIdName()->FETokenInfo = T; 314e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor break; 315e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor 3163e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt case CXXLiteralOperatorName: 3173a5032b89df601ab2e0c5c7e9667db2301bf10cfRichard Smith getAsCXXLiteralOperatorIdName()->FETokenInfo = T; 3183e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt break; 3193e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt 3202def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor default: 321b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie llvm_unreachable("Declaration name has no FETokenInfo"); 3222def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor } 3232def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor} 3242def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor 3252a3009a432bdcec59e6383d7b2b17494d6f91649Douglas GregorDeclarationName DeclarationName::getUsingDirectiveName() { 3262a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor // Single instance of DeclarationNameExtra for using-directive 32768f7a2426227476bcfa33ada70b708c82419dfdcNuno Lopes static const DeclarationNameExtra UDirExtra = 3282a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor { DeclarationNameExtra::CXXUsingDirective }; 3292a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor 3302a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor uintptr_t Ptr = reinterpret_cast<uintptr_t>(&UDirExtra); 3312a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor Ptr |= StoredDeclarationNameExtra; 3322a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor 3332a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor return DeclarationName(Ptr); 3342a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor} 3352a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor 33670f5bc77dbe4172bde860e15d8b3c29e0d5005cbAnders Carlssonvoid DeclarationName::dump() const { 33717828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie llvm::errs() << *this << '\n'; 33870f5bc77dbe4172bde860e15d8b3c29e0d5005cbAnders Carlsson} 33970f5bc77dbe4172bde860e15d8b3c29e0d5005cbAnders Carlsson 3404ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadDeclarationNameTable::DeclarationNameTable(const ASTContext &C) : Ctx(C) { 3412e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor CXXSpecialNamesImpl = new llvm::FoldingSet<CXXSpecialName>; 342a6c058dd75c5563cced821fc16766a7cc179e00cSean Hunt CXXLiteralOperatorNames = new llvm::FoldingSet<CXXLiteralOperatorIdName>; 343e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor 344e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor // Initialize the overloaded operator names. 34545d9c2d2b1b4ada29160edadc071db9779c0ec07Ted Kremenek CXXOperatorNames = new (Ctx) CXXOperatorIdName[NUM_OVERLOADED_OPERATORS]; 346e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor for (unsigned Op = 0; Op < NUM_OVERLOADED_OPERATORS; ++Op) { 3471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump CXXOperatorNames[Op].ExtraKindOrNumArgs 348e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor = Op + DeclarationNameExtra::CXXConversionFunction; 3496bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines CXXOperatorNames[Op].FETokenInfo = nullptr; 350e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor } 3512e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor} 3522e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 3532e1cd4264d363ca869bf37ef160902f211d21b8cDouglas GregorDeclarationNameTable::~DeclarationNameTable() { 354a6c058dd75c5563cced821fc16766a7cc179e00cSean Hunt llvm::FoldingSet<CXXSpecialName> *SpecialNames = 3556d34ae5370a41268cc7c39b05e287cab1786fa8eNuno Lopes static_cast<llvm::FoldingSet<CXXSpecialName>*>(CXXSpecialNamesImpl); 35645d9c2d2b1b4ada29160edadc071db9779c0ec07Ted Kremenek llvm::FoldingSet<CXXLiteralOperatorIdName> *LiteralNames 35745d9c2d2b1b4ada29160edadc071db9779c0ec07Ted Kremenek = static_cast<llvm::FoldingSet<CXXLiteralOperatorIdName>*> 35845d9c2d2b1b4ada29160edadc071db9779c0ec07Ted Kremenek (CXXLiteralOperatorNames); 359a6c058dd75c5563cced821fc16766a7cc179e00cSean Hunt 360a6c058dd75c5563cced821fc16766a7cc179e00cSean Hunt delete SpecialNames; 361a6c058dd75c5563cced821fc16766a7cc179e00cSean Hunt delete LiteralNames; 362ac9590effa90406767a544005ed1de52e258306bTed Kremenek} 363ac9590effa90406767a544005ed1de52e258306bTed Kremenek 3649852f58f50b4fc20914fbce5b4454135a42343f4Benjamin KramerDeclarationName DeclarationNameTable::getCXXConstructorName(CanQualType Ty) { 3659852f58f50b4fc20914fbce5b4454135a42343f4Benjamin Kramer return getCXXSpecialName(DeclarationName::CXXConstructorName, 3669852f58f50b4fc20914fbce5b4454135a42343f4Benjamin Kramer Ty.getUnqualifiedType()); 3679852f58f50b4fc20914fbce5b4454135a42343f4Benjamin Kramer} 3689852f58f50b4fc20914fbce5b4454135a42343f4Benjamin Kramer 3699852f58f50b4fc20914fbce5b4454135a42343f4Benjamin KramerDeclarationName DeclarationNameTable::getCXXDestructorName(CanQualType Ty) { 3709852f58f50b4fc20914fbce5b4454135a42343f4Benjamin Kramer return getCXXSpecialName(DeclarationName::CXXDestructorName, 3719852f58f50b4fc20914fbce5b4454135a42343f4Benjamin Kramer Ty.getUnqualifiedType()); 3729852f58f50b4fc20914fbce5b4454135a42343f4Benjamin Kramer} 3739852f58f50b4fc20914fbce5b4454135a42343f4Benjamin Kramer 3749852f58f50b4fc20914fbce5b4454135a42343f4Benjamin KramerDeclarationName 3759852f58f50b4fc20914fbce5b4454135a42343f4Benjamin KramerDeclarationNameTable::getCXXConversionFunctionName(CanQualType Ty) { 3769852f58f50b4fc20914fbce5b4454135a42343f4Benjamin Kramer return getCXXSpecialName(DeclarationName::CXXConversionFunctionName, Ty); 3779852f58f50b4fc20914fbce5b4454135a42343f4Benjamin Kramer} 3789852f58f50b4fc20914fbce5b4454135a42343f4Benjamin Kramer 3791eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpDeclarationName 3801eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpDeclarationNameTable::getCXXSpecialName(DeclarationName::NameKind Kind, 38150d62d1b4a98adbc83de8f8cd1379ea1c25656f7Douglas Gregor CanQualType Ty) { 3822e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor assert(Kind >= DeclarationName::CXXConstructorName && 3832e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor Kind <= DeclarationName::CXXConversionFunctionName && 3842e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor "Kind must be a C++ special name kind"); 3851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump llvm::FoldingSet<CXXSpecialName> *SpecialNames 3862e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor = static_cast<llvm::FoldingSet<CXXSpecialName>*>(CXXSpecialNamesImpl); 3872e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 3882e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor DeclarationNameExtra::ExtraKind EKind; 3892e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor switch (Kind) { 3901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump case DeclarationName::CXXConstructorName: 3912e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor EKind = DeclarationNameExtra::CXXConstructor; 3920953e767ff7817f97b3ab20896b229891eeff45bJohn McCall assert(!Ty.hasQualifiers() &&"Constructor type must be unqualified"); 3932e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor break; 3942e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor case DeclarationName::CXXDestructorName: 3952e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor EKind = DeclarationNameExtra::CXXDestructor; 3960953e767ff7817f97b3ab20896b229891eeff45bJohn McCall assert(!Ty.hasQualifiers() && "Destructor type must be unqualified"); 3972e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor break; 3982e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor case DeclarationName::CXXConversionFunctionName: 3992e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor EKind = DeclarationNameExtra::CXXConversionFunction; 4002e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor break; 4012e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor default: 4022e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return DeclarationName(); 4032e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor } 4042e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 4052e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor // Unique selector, to guarantee there is one per name. 4062e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor llvm::FoldingSetNodeID ID; 4072e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor ID.AddInteger(EKind); 4082e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor ID.AddPointer(Ty.getAsOpaquePtr()); 4092e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 4106bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines void *InsertPos = nullptr; 4112e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor if (CXXSpecialName *Name = SpecialNames->FindNodeOrInsertPos(ID, InsertPos)) 4122e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return DeclarationName(Name); 4132e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 41445d9c2d2b1b4ada29160edadc071db9779c0ec07Ted Kremenek CXXSpecialName *SpecialName = new (Ctx) CXXSpecialName; 4152e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor SpecialName->ExtraKindOrNumArgs = EKind; 4162e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor SpecialName->Type = Ty; 4176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines SpecialName->FETokenInfo = nullptr; 4182e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 4192e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor SpecialNames->InsertNode(SpecialName, InsertPos); 4202e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return DeclarationName(SpecialName); 4212e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor} 4222e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 4231eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpDeclarationName 424e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas GregorDeclarationNameTable::getCXXOperatorName(OverloadedOperatorKind Op) { 425e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor return DeclarationName(&CXXOperatorNames[(unsigned)Op]); 426e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor} 427e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor 4283e518bda00d710754ca077cf9be8dd821e16a854Sean HuntDeclarationName 4293e518bda00d710754ca077cf9be8dd821e16a854Sean HuntDeclarationNameTable::getCXXLiteralOperatorName(IdentifierInfo *II) { 430a6c058dd75c5563cced821fc16766a7cc179e00cSean Hunt llvm::FoldingSet<CXXLiteralOperatorIdName> *LiteralNames 431a6c058dd75c5563cced821fc16766a7cc179e00cSean Hunt = static_cast<llvm::FoldingSet<CXXLiteralOperatorIdName>*> 432a6c058dd75c5563cced821fc16766a7cc179e00cSean Hunt (CXXLiteralOperatorNames); 433a6c058dd75c5563cced821fc16766a7cc179e00cSean Hunt 434a6c058dd75c5563cced821fc16766a7cc179e00cSean Hunt llvm::FoldingSetNodeID ID; 435a6c058dd75c5563cced821fc16766a7cc179e00cSean Hunt ID.AddPointer(II); 436a6c058dd75c5563cced821fc16766a7cc179e00cSean Hunt 4376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines void *InsertPos = nullptr; 438a6c058dd75c5563cced821fc16766a7cc179e00cSean Hunt if (CXXLiteralOperatorIdName *Name = 439a6c058dd75c5563cced821fc16766a7cc179e00cSean Hunt LiteralNames->FindNodeOrInsertPos(ID, InsertPos)) 440a6c058dd75c5563cced821fc16766a7cc179e00cSean Hunt return DeclarationName (Name); 441a6c058dd75c5563cced821fc16766a7cc179e00cSean Hunt 44245d9c2d2b1b4ada29160edadc071db9779c0ec07Ted Kremenek CXXLiteralOperatorIdName *LiteralName = new (Ctx) CXXLiteralOperatorIdName; 4433e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt LiteralName->ExtraKindOrNumArgs = DeclarationNameExtra::CXXLiteralOperator; 4443e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt LiteralName->ID = II; 4456bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines LiteralName->FETokenInfo = nullptr; 446a6c058dd75c5563cced821fc16766a7cc179e00cSean Hunt 447a6c058dd75c5563cced821fc16766a7cc179e00cSean Hunt LiteralNames->InsertNode(LiteralName, InsertPos); 4483e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt return DeclarationName(LiteralName); 4493e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt} 4503e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt 4512577743c5650c646fb705df01403707e94f2df04Abramo BagnaraDeclarationNameLoc::DeclarationNameLoc(DeclarationName Name) { 4522577743c5650c646fb705df01403707e94f2df04Abramo Bagnara switch (Name.getNameKind()) { 4532577743c5650c646fb705df01403707e94f2df04Abramo Bagnara case DeclarationName::Identifier: 4542577743c5650c646fb705df01403707e94f2df04Abramo Bagnara break; 4552577743c5650c646fb705df01403707e94f2df04Abramo Bagnara case DeclarationName::CXXConstructorName: 4562577743c5650c646fb705df01403707e94f2df04Abramo Bagnara case DeclarationName::CXXDestructorName: 4572577743c5650c646fb705df01403707e94f2df04Abramo Bagnara case DeclarationName::CXXConversionFunctionName: 4586bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines NamedType.TInfo = nullptr; 4592577743c5650c646fb705df01403707e94f2df04Abramo Bagnara break; 4602577743c5650c646fb705df01403707e94f2df04Abramo Bagnara case DeclarationName::CXXOperatorName: 4612577743c5650c646fb705df01403707e94f2df04Abramo Bagnara CXXOperatorName.BeginOpNameLoc = SourceLocation().getRawEncoding(); 4622577743c5650c646fb705df01403707e94f2df04Abramo Bagnara CXXOperatorName.EndOpNameLoc = SourceLocation().getRawEncoding(); 4632577743c5650c646fb705df01403707e94f2df04Abramo Bagnara break; 4642577743c5650c646fb705df01403707e94f2df04Abramo Bagnara case DeclarationName::CXXLiteralOperatorName: 4652577743c5650c646fb705df01403707e94f2df04Abramo Bagnara CXXLiteralOperatorName.OpNameLoc = SourceLocation().getRawEncoding(); 4662577743c5650c646fb705df01403707e94f2df04Abramo Bagnara break; 4672577743c5650c646fb705df01403707e94f2df04Abramo Bagnara case DeclarationName::ObjCZeroArgSelector: 4682577743c5650c646fb705df01403707e94f2df04Abramo Bagnara case DeclarationName::ObjCOneArgSelector: 4692577743c5650c646fb705df01403707e94f2df04Abramo Bagnara case DeclarationName::ObjCMultiArgSelector: 4702577743c5650c646fb705df01403707e94f2df04Abramo Bagnara // FIXME: ? 4712577743c5650c646fb705df01403707e94f2df04Abramo Bagnara break; 4722577743c5650c646fb705df01403707e94f2df04Abramo Bagnara case DeclarationName::CXXUsingDirective: 4732577743c5650c646fb705df01403707e94f2df04Abramo Bagnara break; 4742577743c5650c646fb705df01403707e94f2df04Abramo Bagnara } 4752577743c5650c646fb705df01403707e94f2df04Abramo Bagnara} 4762577743c5650c646fb705df01403707e94f2df04Abramo Bagnara 477bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregorbool DeclarationNameInfo::containsUnexpandedParameterPack() const { 478bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor switch (Name.getNameKind()) { 479bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor case DeclarationName::Identifier: 480bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor case DeclarationName::ObjCZeroArgSelector: 481bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor case DeclarationName::ObjCOneArgSelector: 482bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor case DeclarationName::ObjCMultiArgSelector: 483bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor case DeclarationName::CXXOperatorName: 484bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor case DeclarationName::CXXLiteralOperatorName: 485bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor case DeclarationName::CXXUsingDirective: 486bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor return false; 487bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor 488bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor case DeclarationName::CXXConstructorName: 489bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor case DeclarationName::CXXDestructorName: 490bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor case DeclarationName::CXXConversionFunctionName: 491bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor if (TypeSourceInfo *TInfo = LocInfo.NamedType.TInfo) 492bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor return TInfo->getType()->containsUnexpandedParameterPack(); 493bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor 494bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor return Name.getCXXNameType()->containsUnexpandedParameterPack(); 495bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor } 496f24e54a0c8f0621dc1e964e79dd2fc47f6a2e723Chandler Carruth llvm_unreachable("All name kinds handled."); 497bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor} 498bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor 499561f81243f665cf2001caadc45df505f826b72d6Douglas Gregorbool DeclarationNameInfo::isInstantiationDependent() const { 500561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor switch (Name.getNameKind()) { 501561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor case DeclarationName::Identifier: 502561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor case DeclarationName::ObjCZeroArgSelector: 503561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor case DeclarationName::ObjCOneArgSelector: 504561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor case DeclarationName::ObjCMultiArgSelector: 505561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor case DeclarationName::CXXOperatorName: 506561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor case DeclarationName::CXXLiteralOperatorName: 507561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor case DeclarationName::CXXUsingDirective: 508561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor return false; 509561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor 510561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor case DeclarationName::CXXConstructorName: 511561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor case DeclarationName::CXXDestructorName: 512561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor case DeclarationName::CXXConversionFunctionName: 513561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor if (TypeSourceInfo *TInfo = LocInfo.NamedType.TInfo) 514561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor return TInfo->getType()->isInstantiationDependentType(); 515561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor 516561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor return Name.getCXXNameType()->isInstantiationDependentType(); 517561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor } 518561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor llvm_unreachable("All name kinds handled."); 519561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor} 520561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor 5212577743c5650c646fb705df01403707e94f2df04Abramo Bagnarastd::string DeclarationNameInfo::getAsString() const { 5222577743c5650c646fb705df01403707e94f2df04Abramo Bagnara std::string Result; 5232577743c5650c646fb705df01403707e94f2df04Abramo Bagnara llvm::raw_string_ostream OS(Result); 5242577743c5650c646fb705df01403707e94f2df04Abramo Bagnara printName(OS); 5252577743c5650c646fb705df01403707e94f2df04Abramo Bagnara return OS.str(); 5262577743c5650c646fb705df01403707e94f2df04Abramo Bagnara} 5272577743c5650c646fb705df01403707e94f2df04Abramo Bagnara 5285f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnervoid DeclarationNameInfo::printName(raw_ostream &OS) const { 5292577743c5650c646fb705df01403707e94f2df04Abramo Bagnara switch (Name.getNameKind()) { 5302577743c5650c646fb705df01403707e94f2df04Abramo Bagnara case DeclarationName::Identifier: 5312577743c5650c646fb705df01403707e94f2df04Abramo Bagnara case DeclarationName::ObjCZeroArgSelector: 5322577743c5650c646fb705df01403707e94f2df04Abramo Bagnara case DeclarationName::ObjCOneArgSelector: 5332577743c5650c646fb705df01403707e94f2df04Abramo Bagnara case DeclarationName::ObjCMultiArgSelector: 5342577743c5650c646fb705df01403707e94f2df04Abramo Bagnara case DeclarationName::CXXOperatorName: 5352577743c5650c646fb705df01403707e94f2df04Abramo Bagnara case DeclarationName::CXXLiteralOperatorName: 5362577743c5650c646fb705df01403707e94f2df04Abramo Bagnara case DeclarationName::CXXUsingDirective: 53717828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie OS << Name; 5382577743c5650c646fb705df01403707e94f2df04Abramo Bagnara return; 5392577743c5650c646fb705df01403707e94f2df04Abramo Bagnara 5402577743c5650c646fb705df01403707e94f2df04Abramo Bagnara case DeclarationName::CXXConstructorName: 5412577743c5650c646fb705df01403707e94f2df04Abramo Bagnara case DeclarationName::CXXDestructorName: 5422577743c5650c646fb705df01403707e94f2df04Abramo Bagnara case DeclarationName::CXXConversionFunctionName: 5432577743c5650c646fb705df01403707e94f2df04Abramo Bagnara if (TypeSourceInfo *TInfo = LocInfo.NamedType.TInfo) { 5442577743c5650c646fb705df01403707e94f2df04Abramo Bagnara if (Name.getNameKind() == DeclarationName::CXXDestructorName) 5452577743c5650c646fb705df01403707e94f2df04Abramo Bagnara OS << '~'; 5462577743c5650c646fb705df01403707e94f2df04Abramo Bagnara else if (Name.getNameKind() == DeclarationName::CXXConversionFunctionName) 5472577743c5650c646fb705df01403707e94f2df04Abramo Bagnara OS << "operator "; 548651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines LangOptions LO; 549651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines LO.CPlusPlus = true; 550651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines LO.Bool = true; 551651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines OS << TInfo->getType().getAsString(PrintingPolicy(LO)); 55217828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie } else 55317828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie OS << Name; 5542577743c5650c646fb705df01403707e94f2df04Abramo Bagnara return; 5552577743c5650c646fb705df01403707e94f2df04Abramo Bagnara } 556b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie llvm_unreachable("Unexpected declaration name kind"); 5572577743c5650c646fb705df01403707e94f2df04Abramo Bagnara} 5582577743c5650c646fb705df01403707e94f2df04Abramo Bagnara 5592577743c5650c646fb705df01403707e94f2df04Abramo BagnaraSourceLocation DeclarationNameInfo::getEndLoc() const { 5602577743c5650c646fb705df01403707e94f2df04Abramo Bagnara switch (Name.getNameKind()) { 5612577743c5650c646fb705df01403707e94f2df04Abramo Bagnara case DeclarationName::Identifier: 5622577743c5650c646fb705df01403707e94f2df04Abramo Bagnara return NameLoc; 5632577743c5650c646fb705df01403707e94f2df04Abramo Bagnara 5642577743c5650c646fb705df01403707e94f2df04Abramo Bagnara case DeclarationName::CXXOperatorName: { 5652577743c5650c646fb705df01403707e94f2df04Abramo Bagnara unsigned raw = LocInfo.CXXOperatorName.EndOpNameLoc; 5662577743c5650c646fb705df01403707e94f2df04Abramo Bagnara return SourceLocation::getFromRawEncoding(raw); 5672577743c5650c646fb705df01403707e94f2df04Abramo Bagnara } 5682577743c5650c646fb705df01403707e94f2df04Abramo Bagnara 5692577743c5650c646fb705df01403707e94f2df04Abramo Bagnara case DeclarationName::CXXLiteralOperatorName: { 5702577743c5650c646fb705df01403707e94f2df04Abramo Bagnara unsigned raw = LocInfo.CXXLiteralOperatorName.OpNameLoc; 5712577743c5650c646fb705df01403707e94f2df04Abramo Bagnara return SourceLocation::getFromRawEncoding(raw); 5722577743c5650c646fb705df01403707e94f2df04Abramo Bagnara } 5732577743c5650c646fb705df01403707e94f2df04Abramo Bagnara 5742577743c5650c646fb705df01403707e94f2df04Abramo Bagnara case DeclarationName::CXXConstructorName: 5752577743c5650c646fb705df01403707e94f2df04Abramo Bagnara case DeclarationName::CXXDestructorName: 5762577743c5650c646fb705df01403707e94f2df04Abramo Bagnara case DeclarationName::CXXConversionFunctionName: 5772577743c5650c646fb705df01403707e94f2df04Abramo Bagnara if (TypeSourceInfo *TInfo = LocInfo.NamedType.TInfo) 5782577743c5650c646fb705df01403707e94f2df04Abramo Bagnara return TInfo->getTypeLoc().getEndLoc(); 5792577743c5650c646fb705df01403707e94f2df04Abramo Bagnara else 5802577743c5650c646fb705df01403707e94f2df04Abramo Bagnara return NameLoc; 5812577743c5650c646fb705df01403707e94f2df04Abramo Bagnara 5822577743c5650c646fb705df01403707e94f2df04Abramo Bagnara // DNInfo work in progress: FIXME. 5832577743c5650c646fb705df01403707e94f2df04Abramo Bagnara case DeclarationName::ObjCZeroArgSelector: 5842577743c5650c646fb705df01403707e94f2df04Abramo Bagnara case DeclarationName::ObjCOneArgSelector: 5852577743c5650c646fb705df01403707e94f2df04Abramo Bagnara case DeclarationName::ObjCMultiArgSelector: 5862577743c5650c646fb705df01403707e94f2df04Abramo Bagnara case DeclarationName::CXXUsingDirective: 5872577743c5650c646fb705df01403707e94f2df04Abramo Bagnara return NameLoc; 5882577743c5650c646fb705df01403707e94f2df04Abramo Bagnara } 589b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie llvm_unreachable("Unexpected declaration name kind"); 5902577743c5650c646fb705df01403707e94f2df04Abramo Bagnara} 591