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