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