DeclarationName.cpp revision ac8d75fe94f2aefde5179d53e230b99a1fe1201a
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());
663eb8dd78a622d257a7fed279714428c3de906f93Ted Kremenek    assert((Ptr & PtrMask) == 0 && "Improperly aligned IdentifierInfo");
672e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    Ptr |= StoredObjCZeroArgSelector;
682e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    break;
692e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
702e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  case 1:
712e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    Ptr = reinterpret_cast<uintptr_t>(Sel.getAsIdentifierInfo());
723eb8dd78a622d257a7fed279714428c3de906f93Ted Kremenek    assert((Ptr & PtrMask) == 0 && "Improperly aligned IdentifierInfo");
732e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    Ptr |= StoredObjCOneArgSelector;
742e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    break;
752e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
762e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  default:
772e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    Ptr = Sel.InfoPtr & ~Selector::ArgFlags;
783eb8dd78a622d257a7fed279714428c3de906f93Ted Kremenek    assert((Ptr & PtrMask) == 0 && "Improperly aligned MultiKeywordSelector");
79e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor    Ptr |= StoredDeclarationNameExtra;
802e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    break;
812e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  }
822e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor}
832e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
842e1cd4264d363ca869bf37ef160902f211d21b8cDouglas GregorDeclarationName::NameKind DeclarationName::getNameKind() const {
852e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  switch (getStoredNameKind()) {
862e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  case StoredIdentifier:          return Identifier;
872e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  case StoredObjCZeroArgSelector: return ObjCZeroArgSelector;
882e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  case StoredObjCOneArgSelector:  return ObjCOneArgSelector;
892e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
90e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor  case StoredDeclarationNameExtra:
912e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    switch (getExtra()->ExtraKindOrNumArgs) {
922e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    case DeclarationNameExtra::CXXConstructor:
932e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor      return CXXConstructorName;
942e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
952e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    case DeclarationNameExtra::CXXDestructor:
962e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor      return CXXDestructorName;
972e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
982e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    case DeclarationNameExtra::CXXConversionFunction:
992e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor      return CXXConversionFunctionName;
1002e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
1012a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor    case DeclarationNameExtra::CXXUsingDirective:
1022a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor      return CXXUsingDirective;
1032a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor
1042e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    default:
105e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor      // Check if we have one of the CXXOperator* enumeration values.
106e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor      if (getExtra()->ExtraKindOrNumArgs <
1072a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor            DeclarationNameExtra::CXXUsingDirective)
108e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor        return CXXOperatorName;
109e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor
1102e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor      return ObjCMultiArgSelector;
1112e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    }
1122e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    break;
1132e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  }
1142e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
1152e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  // Can't actually get here.
116ac8d75fe94f2aefde5179d53e230b99a1fe1201aChris Lattner  assert(0 && "This should be unreachable!");
1172e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  return Identifier;
1182e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor}
1192e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
12010bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregorstd::string DeclarationName::getAsString() const {
12110bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor  switch (getNameKind()) {
12210bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor  case Identifier:
12310bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor    if (const IdentifierInfo *II = getAsIdentifierInfo())
12410bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor      return II->getName();
12510bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor    return "";
12610bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor
12710bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor  case ObjCZeroArgSelector:
12810bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor  case ObjCOneArgSelector:
12910bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor  case ObjCMultiArgSelector:
130077bf5e2f48acfa9e7d69429b6e4ba86ea14896dChris Lattner    return getObjCSelector().getAsString();
13110bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor
13210bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor  case CXXConstructorName: {
13310bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor    QualType ClassType = getCXXNameType();
13410bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor    if (const RecordType *ClassRec = ClassType->getAsRecordType())
13539f34e97d6a468f0a7dfa5664c61217cffc65b74Chris Lattner      return ClassRec->getDecl()->getNameAsString();
13610bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor    return ClassType.getAsString();
13710bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor  }
13810bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor
13910bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor  case CXXDestructorName: {
14010bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor    std::string Result = "~";
14110bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor    QualType Type = getCXXNameType();
14210bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor    if (const RecordType *Rec = Type->getAsRecordType())
14339f34e97d6a468f0a7dfa5664c61217cffc65b74Chris Lattner      Result += Rec->getDecl()->getNameAsString();
14410bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor    else
14510bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor      Result += Type.getAsString();
14610bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor    return Result;
14710bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor  }
14810bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor
149e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor  case CXXOperatorName: {
150e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor    static const char *OperatorNames[NUM_OVERLOADED_OPERATORS] = {
151e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor      0,
152e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor#define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \
153e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor      Spelling,
154e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor#include "clang/Basic/OperatorKinds.def"
155e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor    };
156e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor    const char *OpName = OperatorNames[getCXXOverloadedOperator()];
157e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor    assert(OpName && "not an overloaded operator");
158e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor
159e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor    std::string Result = "operator";
160e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor    if (OpName[0] >= 'a' && OpName[0] <= 'z')
161e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor      Result += ' ';
162e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor    Result += OpName;
163e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor    return Result;
164e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor  }
165e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor
16610bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor  case CXXConversionFunctionName: {
16710bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor    std::string Result = "operator ";
16810bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor    QualType Type = getCXXNameType();
16910bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor    if (const RecordType *Rec = Type->getAsRecordType())
17039f34e97d6a468f0a7dfa5664c61217cffc65b74Chris Lattner      Result += Rec->getDecl()->getNameAsString();
17110bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor    else
17210bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor      Result += Type.getAsString();
17310bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor    return Result;
17410bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor  }
1752a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor  case CXXUsingDirective:
1762a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor    return "<using-directive>";
17710bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor  }
17810bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor
17910bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor  assert(false && "Unexpected declaration name kind");
18010bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor  return "";
18110bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor}
18210bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor
1832e1cd4264d363ca869bf37ef160902f211d21b8cDouglas GregorQualType DeclarationName::getCXXNameType() const {
1842e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  if (CXXSpecialName *CXXName = getAsCXXSpecialName())
1852e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    return CXXName->Type;
1862e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  else
1872e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    return QualType();
1882e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor}
1892e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
190e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas GregorOverloadedOperatorKind DeclarationName::getCXXOverloadedOperator() const {
191e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor  if (CXXOperatorIdName *CXXOp = getAsCXXOperatorIdName()) {
192e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor    unsigned value
193e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor      = CXXOp->ExtraKindOrNumArgs - DeclarationNameExtra::CXXConversionFunction;
194e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor    return static_cast<OverloadedOperatorKind>(value);
195e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor  } else {
196e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor    return OO_None;
197e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor  }
198e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor}
199e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor
2002e1cd4264d363ca869bf37ef160902f211d21b8cDouglas GregorSelector DeclarationName::getObjCSelector() const {
2012e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  switch (getNameKind()) {
2022e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  case ObjCZeroArgSelector:
2032e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    return Selector(reinterpret_cast<IdentifierInfo *>(Ptr & ~PtrMask), 0);
2042e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
2052e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  case ObjCOneArgSelector:
2062e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    return Selector(reinterpret_cast<IdentifierInfo *>(Ptr & ~PtrMask), 1);
2072e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
2082e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  case ObjCMultiArgSelector:
2092e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    return Selector(reinterpret_cast<MultiKeywordSelector *>(Ptr & ~PtrMask));
2102e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
2112e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  default:
2122e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    break;
2132e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  }
2142e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
2152e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  return Selector();
2162e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor}
2172e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
2182def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregorvoid *DeclarationName::getFETokenInfoAsVoid() const {
2192def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  switch (getNameKind()) {
2202def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  case Identifier:
2212def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor    return getAsIdentifierInfo()->getFETokenInfo<void>();
2222def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor
2232def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  case CXXConstructorName:
2242def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  case CXXDestructorName:
2252def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  case CXXConversionFunctionName:
2262def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor    return getAsCXXSpecialName()->FETokenInfo;
2272def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor
228e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor  case CXXOperatorName:
229e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor    return getAsCXXOperatorIdName()->FETokenInfo;
230e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor
2312def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  default:
2322def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor    assert(false && "Declaration name has no FETokenInfo");
2332def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  }
2342def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  return 0;
2352def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor}
2362def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor
2372def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregorvoid DeclarationName::setFETokenInfo(void *T) {
2382def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  switch (getNameKind()) {
2392def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  case Identifier:
2402def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor    getAsIdentifierInfo()->setFETokenInfo(T);
2412def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor    break;
2422def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor
2432def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  case CXXConstructorName:
2442def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  case CXXDestructorName:
2452def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  case CXXConversionFunctionName:
2462def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor    getAsCXXSpecialName()->FETokenInfo = T;
2472def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor    break;
2482def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor
249e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor  case CXXOperatorName:
250e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor    getAsCXXOperatorIdName()->FETokenInfo = T;
251e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor    break;
252e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor
2532def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  default:
2542def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor    assert(false && "Declaration name has no FETokenInfo");
2552def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  }
2562def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor}
2572def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor
2582a3009a432bdcec59e6383d7b2b17494d6f91649Douglas GregorDeclarationName DeclarationName::getUsingDirectiveName() {
2592a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor  // Single instance of DeclarationNameExtra for using-directive
2602a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor  static DeclarationNameExtra UDirExtra =
2612a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor    { DeclarationNameExtra::CXXUsingDirective };
2622a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor
2632a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor  uintptr_t Ptr = reinterpret_cast<uintptr_t>(&UDirExtra);
2642a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor  Ptr |= StoredDeclarationNameExtra;
2652a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor
2662a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor  return DeclarationName(Ptr);
2672a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor}
2682a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor
2692e1cd4264d363ca869bf37ef160902f211d21b8cDouglas GregorDeclarationNameTable::DeclarationNameTable() {
2702e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  CXXSpecialNamesImpl = new llvm::FoldingSet<CXXSpecialName>;
271e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor
272e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor  // Initialize the overloaded operator names.
273e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor  CXXOperatorNames = new CXXOperatorIdName[NUM_OVERLOADED_OPERATORS];
274e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor  for (unsigned Op = 0; Op < NUM_OVERLOADED_OPERATORS; ++Op) {
275e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor    CXXOperatorNames[Op].ExtraKindOrNumArgs
276e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor      = Op + DeclarationNameExtra::CXXConversionFunction;
277e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor    CXXOperatorNames[Op].FETokenInfo = 0;
278e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor  }
2792e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor}
2802e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
2812e1cd4264d363ca869bf37ef160902f211d21b8cDouglas GregorDeclarationNameTable::~DeclarationNameTable() {
2826d34ae5370a41268cc7c39b05e287cab1786fa8eNuno Lopes  llvm::FoldingSet<CXXSpecialName> *set =
2836d34ae5370a41268cc7c39b05e287cab1786fa8eNuno Lopes    static_cast<llvm::FoldingSet<CXXSpecialName>*>(CXXSpecialNamesImpl);
284f9d1e4bc60690386e0b2c658d707b75a77717a9cNuno Lopes  llvm::FoldingSetIterator<CXXSpecialName> I = set->begin(), E = set->end();
2856d34ae5370a41268cc7c39b05e287cab1786fa8eNuno Lopes
286f9d1e4bc60690386e0b2c658d707b75a77717a9cNuno Lopes  while (I != E) {
287f9d1e4bc60690386e0b2c658d707b75a77717a9cNuno Lopes    CXXSpecialName *n = &*I++;
288f9d1e4bc60690386e0b2c658d707b75a77717a9cNuno Lopes    delete n;
2896d34ae5370a41268cc7c39b05e287cab1786fa8eNuno Lopes  }
2906d34ae5370a41268cc7c39b05e287cab1786fa8eNuno Lopes
2916d34ae5370a41268cc7c39b05e287cab1786fa8eNuno Lopes  delete set;
292e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor  delete [] CXXOperatorNames;
2932e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor}
2942e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
2952e1cd4264d363ca869bf37ef160902f211d21b8cDouglas GregorDeclarationName
2962e1cd4264d363ca869bf37ef160902f211d21b8cDouglas GregorDeclarationNameTable::getCXXSpecialName(DeclarationName::NameKind Kind,
2972e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor                                        QualType Ty) {
2982e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  assert(Kind >= DeclarationName::CXXConstructorName &&
2992e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor         Kind <= DeclarationName::CXXConversionFunctionName &&
3002e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor         "Kind must be a C++ special name kind");
3012e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
3022e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  llvm::FoldingSet<CXXSpecialName> *SpecialNames
3032e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    = static_cast<llvm::FoldingSet<CXXSpecialName>*>(CXXSpecialNamesImpl);
3042e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
3052e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  DeclarationNameExtra::ExtraKind EKind;
3062e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  switch (Kind) {
3072e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  case DeclarationName::CXXConstructorName:
3082e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    EKind = DeclarationNameExtra::CXXConstructor;
309d603eaa682cecac2c10771a700cb83aa301653b4Chris Lattner    assert(Ty.getCVRQualifiers() == 0 &&"Constructor type must be unqualified");
3102e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    break;
3112e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  case DeclarationName::CXXDestructorName:
3122e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    EKind = DeclarationNameExtra::CXXDestructor;
313e63ef48b76b84e7ffb0a38fbf475ddea5c48adb4Douglas Gregor    assert(Ty.getCVRQualifiers() == 0 && "Destructor type must be unqualified");
3142e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    break;
3152e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  case DeclarationName::CXXConversionFunctionName:
3162e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    EKind = DeclarationNameExtra::CXXConversionFunction;
3172e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    break;
3182e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  default:
3192e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    return DeclarationName();
3202e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  }
3212e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
3222e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  // Unique selector, to guarantee there is one per name.
3232e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  llvm::FoldingSetNodeID ID;
3242e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  ID.AddInteger(EKind);
3252e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  ID.AddPointer(Ty.getAsOpaquePtr());
3262e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
3272e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  void *InsertPos = 0;
3282e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  if (CXXSpecialName *Name = SpecialNames->FindNodeOrInsertPos(ID, InsertPos))
3292e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    return DeclarationName(Name);
3302e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
3312e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  CXXSpecialName *SpecialName = new CXXSpecialName;
3322e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  SpecialName->ExtraKindOrNumArgs = EKind;
3332e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  SpecialName->Type = Ty;
3342def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  SpecialName->FETokenInfo = 0;
3352e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
3362e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  SpecialNames->InsertNode(SpecialName, InsertPos);
3372e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  return DeclarationName(SpecialName);
3382e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor}
3392e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
340e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas GregorDeclarationName
341e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas GregorDeclarationNameTable::getCXXOperatorName(OverloadedOperatorKind Op) {
342e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor  return DeclarationName(&CXXOperatorNames[(unsigned)Op]);
343e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor}
344e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor
34544b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregorunsigned
34644b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregorllvm::DenseMapInfo<clang::DeclarationName>::
34744b4321feab46299d3f5cfd404680884752a0fcfDouglas GregorgetHashValue(clang::DeclarationName N) {
34844b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor  return DenseMapInfo<void*>::getHashValue(N.getAsOpaquePtr());
34944b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor}
35044b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor
351