DeclarationName.cpp revision 077bf5e2f48acfa9e7d69429b6e4ba86ea14896d
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"
1610bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor#include "clang/AST/Decl.h"
172e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor#include "clang/Basic/IdentifierTable.h"
182e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor#include "llvm/ADT/FoldingSet.h"
192e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor#include "llvm/Bitcode/Serialize.h"
202e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor#include "llvm/Bitcode/Deserialize.h"
212e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregorusing namespace clang;
222e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
232e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregornamespace clang {
242e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// CXXSpecialName - Records the type associated with one of the
252e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// "special" kinds of declaration names in C++, e.g., constructors,
262e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// destructors, and conversion functions.
272e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregorclass CXXSpecialName
282e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  : public DeclarationNameExtra, public llvm::FoldingSetNode {
292e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregorpublic:
302def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  /// Type - The type associated with this declaration name.
312e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  QualType Type;
322e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
332def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  /// FETokenInfo - Extra information associated with this declaration
342def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  /// name that can be used by the front end.
352def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  void *FETokenInfo;
362def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor
372e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  void Profile(llvm::FoldingSetNodeID &ID) {
382e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    ID.AddInteger(ExtraKindOrNumArgs);
392e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    ID.AddPointer(Type.getAsOpaquePtr());
402e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  }
412e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor};
422e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
43e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor/// CXXOperatorIdName - Contains extra information for the name of an
44e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor/// overloaded operator in C++, such as "operator+.
45e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregorclass CXXOperatorIdName : public DeclarationNameExtra {
46e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregorpublic:
47e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor  /// FETokenInfo - Extra information associated with this operator
48e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor  /// name that can be used by the front end.
49e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor  void *FETokenInfo;
50e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor};
51e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor
522e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregorbool operator<(DeclarationName LHS, DeclarationName RHS) {
532e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  if (IdentifierInfo *LhsId = LHS.getAsIdentifierInfo())
542e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    if (IdentifierInfo *RhsId = RHS.getAsIdentifierInfo())
552e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor      return strcmp(LhsId->getName(), RhsId->getName()) < 0;
562e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
572e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  return LHS.getAsOpaqueInteger() < RHS.getAsOpaqueInteger();
582e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor}
592e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
602e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor} // end namespace clang
612e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
622e1cd4264d363ca869bf37ef160902f211d21b8cDouglas GregorDeclarationName::DeclarationName(Selector Sel) {
632e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  switch (Sel.getNumArgs()) {
642e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  case 0:
652e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    Ptr = reinterpret_cast<uintptr_t>(Sel.getAsIdentifierInfo());
662e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    Ptr |= StoredObjCZeroArgSelector;
672e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    break;
682e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
692e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  case 1:
702e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    Ptr = reinterpret_cast<uintptr_t>(Sel.getAsIdentifierInfo());
712e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    Ptr |= StoredObjCOneArgSelector;
722e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    break;
732e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
742e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  default:
752e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    Ptr = Sel.InfoPtr & ~Selector::ArgFlags;
76e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor    Ptr |= StoredDeclarationNameExtra;
772e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    break;
782e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  }
792e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor}
802e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
812e1cd4264d363ca869bf37ef160902f211d21b8cDouglas GregorDeclarationName::NameKind DeclarationName::getNameKind() const {
822e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  switch (getStoredNameKind()) {
832e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  case StoredIdentifier:          return Identifier;
842e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  case StoredObjCZeroArgSelector: return ObjCZeroArgSelector;
852e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  case StoredObjCOneArgSelector:  return ObjCOneArgSelector;
862e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
87e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor  case StoredDeclarationNameExtra:
882e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    switch (getExtra()->ExtraKindOrNumArgs) {
892e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    case DeclarationNameExtra::CXXConstructor:
902e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor      return CXXConstructorName;
912e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
922e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    case DeclarationNameExtra::CXXDestructor:
932e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor      return CXXDestructorName;
942e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
952e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    case DeclarationNameExtra::CXXConversionFunction:
962e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor      return CXXConversionFunctionName;
972e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
982e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    default:
99e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor      // Check if we have one of the CXXOperator* enumeration values.
100e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor      if (getExtra()->ExtraKindOrNumArgs <
101e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor            DeclarationNameExtra::NUM_EXTRA_KINDS)
102e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor        return CXXOperatorName;
103e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor
1042e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor      return ObjCMultiArgSelector;
1052e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    }
1062e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    break;
1072e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  }
1082e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
1092e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  // Can't actually get here.
1102e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  return Identifier;
1112e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor}
1122e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
11310bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregorstd::string DeclarationName::getAsString() const {
11410bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor  switch (getNameKind()) {
11510bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor  case Identifier:
11610bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor    if (const IdentifierInfo *II = getAsIdentifierInfo())
11710bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor      return II->getName();
11810bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor    return "";
11910bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor
12010bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor  case ObjCZeroArgSelector:
12110bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor  case ObjCOneArgSelector:
12210bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor  case ObjCMultiArgSelector:
123077bf5e2f48acfa9e7d69429b6e4ba86ea14896dChris Lattner    return getObjCSelector().getAsString();
12410bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor
12510bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor  case CXXConstructorName: {
12610bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor    QualType ClassType = getCXXNameType();
12710bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor    if (const RecordType *ClassRec = ClassType->getAsRecordType())
12810bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor      return ClassRec->getDecl()->getName();
12910bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor    return ClassType.getAsString();
13010bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor  }
13110bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor
13210bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor  case CXXDestructorName: {
13310bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor    std::string Result = "~";
13410bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor    QualType Type = getCXXNameType();
13510bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor    if (const RecordType *Rec = Type->getAsRecordType())
13610bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor      Result += Rec->getDecl()->getName();
13710bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor    else
13810bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor      Result += Type.getAsString();
13910bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor    return Result;
14010bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor  }
14110bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor
142e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor  case CXXOperatorName: {
143e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor    static const char *OperatorNames[NUM_OVERLOADED_OPERATORS] = {
144e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor      0,
145e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor#define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \
146e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor      Spelling,
147e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor#include "clang/Basic/OperatorKinds.def"
148e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor    };
149e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor    const char *OpName = OperatorNames[getCXXOverloadedOperator()];
150e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor    assert(OpName && "not an overloaded operator");
151e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor
152e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor    std::string Result = "operator";
153e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor    if (OpName[0] >= 'a' && OpName[0] <= 'z')
154e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor      Result += ' ';
155e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor    Result += OpName;
156e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor    return Result;
157e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor  }
158e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor
15910bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor  case CXXConversionFunctionName: {
16010bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor    std::string Result = "operator ";
16110bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor    QualType Type = getCXXNameType();
16210bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor    if (const RecordType *Rec = Type->getAsRecordType())
16310bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor      Result += Rec->getDecl()->getName();
16410bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor    else
16510bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor      Result += Type.getAsString();
16610bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor    return Result;
16710bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor  }
16810bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor  }
16910bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor
17010bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor  assert(false && "Unexpected declaration name kind");
17110bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor  return "";
17210bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor}
17310bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor
1742e1cd4264d363ca869bf37ef160902f211d21b8cDouglas GregorQualType DeclarationName::getCXXNameType() const {
1752e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  if (CXXSpecialName *CXXName = getAsCXXSpecialName())
1762e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    return CXXName->Type;
1772e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  else
1782e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    return QualType();
1792e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor}
1802e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
181e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas GregorOverloadedOperatorKind DeclarationName::getCXXOverloadedOperator() const {
182e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor  if (CXXOperatorIdName *CXXOp = getAsCXXOperatorIdName()) {
183e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor    unsigned value
184e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor      = CXXOp->ExtraKindOrNumArgs - DeclarationNameExtra::CXXConversionFunction;
185e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor    return static_cast<OverloadedOperatorKind>(value);
186e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor  } else {
187e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor    return OO_None;
188e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor  }
189e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor}
190e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor
1912e1cd4264d363ca869bf37ef160902f211d21b8cDouglas GregorSelector DeclarationName::getObjCSelector() const {
1922e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  switch (getNameKind()) {
1932e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  case ObjCZeroArgSelector:
1942e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    return Selector(reinterpret_cast<IdentifierInfo *>(Ptr & ~PtrMask), 0);
1952e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
1962e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  case ObjCOneArgSelector:
1972e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    return Selector(reinterpret_cast<IdentifierInfo *>(Ptr & ~PtrMask), 1);
1982e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
1992e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  case ObjCMultiArgSelector:
2002e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    return Selector(reinterpret_cast<MultiKeywordSelector *>(Ptr & ~PtrMask));
2012e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
2022e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  default:
2032e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    break;
2042e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  }
2052e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
2062e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  return Selector();
2072e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor}
2082e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
2092def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregorvoid *DeclarationName::getFETokenInfoAsVoid() const {
2102def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  switch (getNameKind()) {
2112def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  case Identifier:
2122def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor    return getAsIdentifierInfo()->getFETokenInfo<void>();
2132def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor
2142def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  case CXXConstructorName:
2152def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  case CXXDestructorName:
2162def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  case CXXConversionFunctionName:
2172def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor    return getAsCXXSpecialName()->FETokenInfo;
2182def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor
219e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor  case CXXOperatorName:
220e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor    return getAsCXXOperatorIdName()->FETokenInfo;
221e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor
2222def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  default:
2232def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor    assert(false && "Declaration name has no FETokenInfo");
2242def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  }
2252def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  return 0;
2262def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor}
2272def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor
2282def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregorvoid DeclarationName::setFETokenInfo(void *T) {
2292def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  switch (getNameKind()) {
2302def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  case Identifier:
2312def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor    getAsIdentifierInfo()->setFETokenInfo(T);
2322def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor    break;
2332def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor
2342def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  case CXXConstructorName:
2352def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  case CXXDestructorName:
2362def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  case CXXConversionFunctionName:
2372def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor    getAsCXXSpecialName()->FETokenInfo = T;
2382def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor    break;
2392def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor
240e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor  case CXXOperatorName:
241e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor    getAsCXXOperatorIdName()->FETokenInfo = T;
242e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor    break;
243e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor
2442def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  default:
2452def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor    assert(false && "Declaration name has no FETokenInfo");
2462def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  }
2472def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor}
2482def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor
2492e1cd4264d363ca869bf37ef160902f211d21b8cDouglas GregorDeclarationNameTable::DeclarationNameTable() {
2502e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  CXXSpecialNamesImpl = new llvm::FoldingSet<CXXSpecialName>;
251e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor
252e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor  // Initialize the overloaded operator names.
253e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor  CXXOperatorNames = new CXXOperatorIdName[NUM_OVERLOADED_OPERATORS];
254e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor  for (unsigned Op = 0; Op < NUM_OVERLOADED_OPERATORS; ++Op) {
255e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor    CXXOperatorNames[Op].ExtraKindOrNumArgs
256e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor      = Op + DeclarationNameExtra::CXXConversionFunction;
257e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor    CXXOperatorNames[Op].FETokenInfo = 0;
258e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor  }
2592e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor}
2602e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
2612e1cd4264d363ca869bf37ef160902f211d21b8cDouglas GregorDeclarationNameTable::~DeclarationNameTable() {
2622e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  delete static_cast<llvm::FoldingSet<CXXSpecialName>*>(CXXSpecialNamesImpl);
263e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor  delete [] CXXOperatorNames;
2642e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor}
2652e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
2662e1cd4264d363ca869bf37ef160902f211d21b8cDouglas GregorDeclarationName
2672e1cd4264d363ca869bf37ef160902f211d21b8cDouglas GregorDeclarationNameTable::getCXXSpecialName(DeclarationName::NameKind Kind,
2682e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor                                        QualType Ty) {
2692e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  assert(Kind >= DeclarationName::CXXConstructorName &&
2702e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor         Kind <= DeclarationName::CXXConversionFunctionName &&
2712e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor         "Kind must be a C++ special name kind");
2722e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
2732e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  llvm::FoldingSet<CXXSpecialName> *SpecialNames
2742e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    = static_cast<llvm::FoldingSet<CXXSpecialName>*>(CXXSpecialNamesImpl);
2752e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
2762e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  DeclarationNameExtra::ExtraKind EKind;
2772e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  switch (Kind) {
2782e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  case DeclarationName::CXXConstructorName:
2792e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    EKind = DeclarationNameExtra::CXXConstructor;
2802e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    break;
2812e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  case DeclarationName::CXXDestructorName:
2822e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    EKind = DeclarationNameExtra::CXXDestructor;
2832e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    break;
2842e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  case DeclarationName::CXXConversionFunctionName:
2852e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    EKind = DeclarationNameExtra::CXXConversionFunction;
2862e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    break;
2872e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  default:
2882e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    return DeclarationName();
2892e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  }
2902e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
2912e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  // Unique selector, to guarantee there is one per name.
2922e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  llvm::FoldingSetNodeID ID;
2932e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  ID.AddInteger(EKind);
2942e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  ID.AddPointer(Ty.getAsOpaquePtr());
2952e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
2962e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  void *InsertPos = 0;
2972e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  if (CXXSpecialName *Name = SpecialNames->FindNodeOrInsertPos(ID, InsertPos))
2982e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    return DeclarationName(Name);
2992e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
3002e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  CXXSpecialName *SpecialName = new CXXSpecialName;
3012e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  SpecialName->ExtraKindOrNumArgs = EKind;
3022e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  SpecialName->Type = Ty;
3032def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  SpecialName->FETokenInfo = 0;
3042e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
3052e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  SpecialNames->InsertNode(SpecialName, InsertPos);
3062e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  return DeclarationName(SpecialName);
3072e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor}
3082e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
309e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas GregorDeclarationName
310e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas GregorDeclarationNameTable::getCXXOperatorName(OverloadedOperatorKind Op) {
311e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor  return DeclarationName(&CXXOperatorNames[(unsigned)Op]);
312e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor}
313e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor
314