DeclarationName.cpp revision 6217b80b7a1379b74cced1c076338262c3c980b3
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"
18370187c8a3e96517c943329f2511737a04b85450Douglas Gregor#include "llvm/ADT/DenseMap.h"
192e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor#include "llvm/ADT/FoldingSet.h"
202e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregorusing namespace clang;
212e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
222e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregornamespace clang {
232e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// CXXSpecialName - Records the type associated with one of the
242e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// "special" kinds of declaration names in C++, e.g., constructors,
252e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// destructors, and conversion functions.
262e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregorclass CXXSpecialName
272e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  : public DeclarationNameExtra, public llvm::FoldingSetNode {
282e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregorpublic:
292def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  /// Type - The type associated with this declaration name.
302e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  QualType Type;
312e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
322def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  /// FETokenInfo - Extra information associated with this declaration
332def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  /// name that can be used by the front end.
342def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  void *FETokenInfo;
352def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor
362e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  void Profile(llvm::FoldingSetNodeID &ID) {
372e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    ID.AddInteger(ExtraKindOrNumArgs);
382e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    ID.AddPointer(Type.getAsOpaquePtr());
392e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  }
402e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor};
412e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
42e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor/// CXXOperatorIdName - Contains extra information for the name of an
43e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor/// overloaded operator in C++, such as "operator+.
44e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregorclass CXXOperatorIdName : public DeclarationNameExtra {
45e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregorpublic:
46e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor  /// FETokenInfo - Extra information associated with this operator
47e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor  /// name that can be used by the front end.
48e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor  void *FETokenInfo;
49e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor};
50e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor
512e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregorbool operator<(DeclarationName LHS, DeclarationName RHS) {
522e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  if (IdentifierInfo *LhsId = LHS.getAsIdentifierInfo())
532e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    if (IdentifierInfo *RhsId = RHS.getAsIdentifierInfo())
542e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor      return strcmp(LhsId->getName(), RhsId->getName()) < 0;
552e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
562e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  return LHS.getAsOpaqueInteger() < RHS.getAsOpaqueInteger();
572e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor}
582e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
592e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor} // end namespace clang
602e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
612e1cd4264d363ca869bf37ef160902f211d21b8cDouglas GregorDeclarationName::DeclarationName(Selector Sel) {
62319ac896a0fef7365d5589b8021db7e41207fe42Douglas Gregor  if (!Sel.getAsOpaquePtr()) {
63319ac896a0fef7365d5589b8021db7e41207fe42Douglas Gregor    Ptr = StoredObjCZeroArgSelector;
64319ac896a0fef7365d5589b8021db7e41207fe42Douglas Gregor    return;
65319ac896a0fef7365d5589b8021db7e41207fe42Douglas Gregor  }
66319ac896a0fef7365d5589b8021db7e41207fe42Douglas Gregor
672e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  switch (Sel.getNumArgs()) {
682e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  case 0:
692e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    Ptr = reinterpret_cast<uintptr_t>(Sel.getAsIdentifierInfo());
703eb8dd78a622d257a7fed279714428c3de906f93Ted Kremenek    assert((Ptr & PtrMask) == 0 && "Improperly aligned IdentifierInfo");
712e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    Ptr |= StoredObjCZeroArgSelector;
722e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    break;
732e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
742e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  case 1:
752e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    Ptr = reinterpret_cast<uintptr_t>(Sel.getAsIdentifierInfo());
763eb8dd78a622d257a7fed279714428c3de906f93Ted Kremenek    assert((Ptr & PtrMask) == 0 && "Improperly aligned IdentifierInfo");
772e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    Ptr |= StoredObjCOneArgSelector;
782e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    break;
792e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
802e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  default:
812e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    Ptr = Sel.InfoPtr & ~Selector::ArgFlags;
823eb8dd78a622d257a7fed279714428c3de906f93Ted Kremenek    assert((Ptr & PtrMask) == 0 && "Improperly aligned MultiKeywordSelector");
83e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor    Ptr |= StoredDeclarationNameExtra;
842e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    break;
852e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  }
862e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor}
872e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
882e1cd4264d363ca869bf37ef160902f211d21b8cDouglas GregorDeclarationName::NameKind DeclarationName::getNameKind() const {
892e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  switch (getStoredNameKind()) {
902e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  case StoredIdentifier:          return Identifier;
912e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  case StoredObjCZeroArgSelector: return ObjCZeroArgSelector;
922e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  case StoredObjCOneArgSelector:  return ObjCOneArgSelector;
932e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
94e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor  case StoredDeclarationNameExtra:
952e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    switch (getExtra()->ExtraKindOrNumArgs) {
962e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    case DeclarationNameExtra::CXXConstructor:
972e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor      return CXXConstructorName;
982e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
992e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    case DeclarationNameExtra::CXXDestructor:
1002e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor      return CXXDestructorName;
1012e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
1022e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    case DeclarationNameExtra::CXXConversionFunction:
1032e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor      return CXXConversionFunctionName;
1042e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
1052a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor    case DeclarationNameExtra::CXXUsingDirective:
1062a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor      return CXXUsingDirective;
1072a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor
1082e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    default:
109e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor      // Check if we have one of the CXXOperator* enumeration values.
110e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor      if (getExtra()->ExtraKindOrNumArgs <
1112a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor            DeclarationNameExtra::CXXUsingDirective)
112e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor        return CXXOperatorName;
113e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor
1142e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor      return ObjCMultiArgSelector;
1152e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    }
1162e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    break;
1172e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  }
1182e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
1192e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  // Can't actually get here.
120ac8d75fe94f2aefde5179d53e230b99a1fe1201aChris Lattner  assert(0 && "This should be unreachable!");
1212e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  return Identifier;
1222e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor}
1232e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
12410bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregorstd::string DeclarationName::getAsString() const {
12510bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor  switch (getNameKind()) {
12610bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor  case Identifier:
12710bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor    if (const IdentifierInfo *II = getAsIdentifierInfo())
12810bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor      return II->getName();
12910bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor    return "";
13010bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor
13110bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor  case ObjCZeroArgSelector:
13210bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor  case ObjCOneArgSelector:
13310bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor  case ObjCMultiArgSelector:
134077bf5e2f48acfa9e7d69429b6e4ba86ea14896dChris Lattner    return getObjCSelector().getAsString();
13510bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor
13610bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor  case CXXConstructorName: {
13710bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor    QualType ClassType = getCXXNameType();
1386217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek    if (const RecordType *ClassRec = ClassType->getAs<RecordType>())
13939f34e97d6a468f0a7dfa5664c61217cffc65b74Chris Lattner      return ClassRec->getDecl()->getNameAsString();
14010bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor    return ClassType.getAsString();
14110bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor  }
14210bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor
14310bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor  case CXXDestructorName: {
14410bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor    std::string Result = "~";
14510bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor    QualType Type = getCXXNameType();
1466217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek    if (const RecordType *Rec = Type->getAs<RecordType>())
14739f34e97d6a468f0a7dfa5664c61217cffc65b74Chris Lattner      Result += Rec->getDecl()->getNameAsString();
14810bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor    else
14910bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor      Result += Type.getAsString();
15010bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor    return Result;
15110bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor  }
15210bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor
153e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor  case CXXOperatorName: {
154e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor    static const char *OperatorNames[NUM_OVERLOADED_OPERATORS] = {
155e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor      0,
156e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor#define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \
157e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor      Spelling,
158e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor#include "clang/Basic/OperatorKinds.def"
159e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor    };
160e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor    const char *OpName = OperatorNames[getCXXOverloadedOperator()];
161e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor    assert(OpName && "not an overloaded operator");
162e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor
163e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor    std::string Result = "operator";
164e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor    if (OpName[0] >= 'a' && OpName[0] <= 'z')
165e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor      Result += ' ';
166e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor    Result += OpName;
167e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor    return Result;
168e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor  }
169e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor
17010bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor  case CXXConversionFunctionName: {
17110bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor    std::string Result = "operator ";
17210bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor    QualType Type = getCXXNameType();
1736217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek    if (const RecordType *Rec = Type->getAs<RecordType>())
17439f34e97d6a468f0a7dfa5664c61217cffc65b74Chris Lattner      Result += Rec->getDecl()->getNameAsString();
17510bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor    else
17610bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor      Result += Type.getAsString();
17710bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor    return Result;
17810bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor  }
1792a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor  case CXXUsingDirective:
1802a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor    return "<using-directive>";
18110bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor  }
18210bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor
18310bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor  assert(false && "Unexpected declaration name kind");
18410bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor  return "";
18510bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor}
18610bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor
1872e1cd4264d363ca869bf37ef160902f211d21b8cDouglas GregorQualType DeclarationName::getCXXNameType() const {
1882e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  if (CXXSpecialName *CXXName = getAsCXXSpecialName())
1892e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    return CXXName->Type;
1902e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  else
1912e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    return QualType();
1922e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor}
1932e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
194e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas GregorOverloadedOperatorKind DeclarationName::getCXXOverloadedOperator() const {
195e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor  if (CXXOperatorIdName *CXXOp = getAsCXXOperatorIdName()) {
196e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor    unsigned value
197e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor      = CXXOp->ExtraKindOrNumArgs - DeclarationNameExtra::CXXConversionFunction;
198e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor    return static_cast<OverloadedOperatorKind>(value);
199e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor  } else {
200e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor    return OO_None;
201e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor  }
202e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor}
203e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor
2042e1cd4264d363ca869bf37ef160902f211d21b8cDouglas GregorSelector DeclarationName::getObjCSelector() const {
2052e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  switch (getNameKind()) {
2062e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  case ObjCZeroArgSelector:
2072e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    return Selector(reinterpret_cast<IdentifierInfo *>(Ptr & ~PtrMask), 0);
2082e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
2092e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  case ObjCOneArgSelector:
2102e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    return Selector(reinterpret_cast<IdentifierInfo *>(Ptr & ~PtrMask), 1);
2112e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
2122e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  case ObjCMultiArgSelector:
2132e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    return Selector(reinterpret_cast<MultiKeywordSelector *>(Ptr & ~PtrMask));
2142e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
2152e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  default:
2162e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    break;
2172e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  }
2182e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
2192e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  return Selector();
2202e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor}
2212e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
2222def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregorvoid *DeclarationName::getFETokenInfoAsVoid() const {
2232def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  switch (getNameKind()) {
2242def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  case Identifier:
2252def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor    return getAsIdentifierInfo()->getFETokenInfo<void>();
2262def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor
2272def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  case CXXConstructorName:
2282def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  case CXXDestructorName:
2292def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  case CXXConversionFunctionName:
2302def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor    return getAsCXXSpecialName()->FETokenInfo;
2312def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor
232e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor  case CXXOperatorName:
233e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor    return getAsCXXOperatorIdName()->FETokenInfo;
234e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor
2352def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  default:
2362def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor    assert(false && "Declaration name has no FETokenInfo");
2372def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  }
2382def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  return 0;
2392def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor}
2402def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor
2412def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregorvoid DeclarationName::setFETokenInfo(void *T) {
2422def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  switch (getNameKind()) {
2432def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  case Identifier:
2442def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor    getAsIdentifierInfo()->setFETokenInfo(T);
2452def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor    break;
2462def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor
2472def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  case CXXConstructorName:
2482def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  case CXXDestructorName:
2492def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  case CXXConversionFunctionName:
2502def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor    getAsCXXSpecialName()->FETokenInfo = T;
2512def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor    break;
2522def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor
253e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor  case CXXOperatorName:
254e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor    getAsCXXOperatorIdName()->FETokenInfo = T;
255e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor    break;
256e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor
2572def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  default:
2582def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor    assert(false && "Declaration name has no FETokenInfo");
2592def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  }
2602def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor}
2612def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor
2622a3009a432bdcec59e6383d7b2b17494d6f91649Douglas GregorDeclarationName DeclarationName::getUsingDirectiveName() {
2632a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor  // Single instance of DeclarationNameExtra for using-directive
2642a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor  static DeclarationNameExtra UDirExtra =
2652a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor    { DeclarationNameExtra::CXXUsingDirective };
2662a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor
2672a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor  uintptr_t Ptr = reinterpret_cast<uintptr_t>(&UDirExtra);
2682a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor  Ptr |= StoredDeclarationNameExtra;
2692a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor
2702a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor  return DeclarationName(Ptr);
2712a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor}
2722a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor
2732e1cd4264d363ca869bf37ef160902f211d21b8cDouglas GregorDeclarationNameTable::DeclarationNameTable() {
2742e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  CXXSpecialNamesImpl = new llvm::FoldingSet<CXXSpecialName>;
275e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor
276e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor  // Initialize the overloaded operator names.
277e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor  CXXOperatorNames = new CXXOperatorIdName[NUM_OVERLOADED_OPERATORS];
278e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor  for (unsigned Op = 0; Op < NUM_OVERLOADED_OPERATORS; ++Op) {
279e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor    CXXOperatorNames[Op].ExtraKindOrNumArgs
280e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor      = Op + DeclarationNameExtra::CXXConversionFunction;
281e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor    CXXOperatorNames[Op].FETokenInfo = 0;
282e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor  }
2832e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor}
2842e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
2852e1cd4264d363ca869bf37ef160902f211d21b8cDouglas GregorDeclarationNameTable::~DeclarationNameTable() {
2866d34ae5370a41268cc7c39b05e287cab1786fa8eNuno Lopes  llvm::FoldingSet<CXXSpecialName> *set =
2876d34ae5370a41268cc7c39b05e287cab1786fa8eNuno Lopes    static_cast<llvm::FoldingSet<CXXSpecialName>*>(CXXSpecialNamesImpl);
288f9d1e4bc60690386e0b2c658d707b75a77717a9cNuno Lopes  llvm::FoldingSetIterator<CXXSpecialName> I = set->begin(), E = set->end();
2896d34ae5370a41268cc7c39b05e287cab1786fa8eNuno Lopes
290f9d1e4bc60690386e0b2c658d707b75a77717a9cNuno Lopes  while (I != E) {
291f9d1e4bc60690386e0b2c658d707b75a77717a9cNuno Lopes    CXXSpecialName *n = &*I++;
292f9d1e4bc60690386e0b2c658d707b75a77717a9cNuno Lopes    delete n;
2936d34ae5370a41268cc7c39b05e287cab1786fa8eNuno Lopes  }
2946d34ae5370a41268cc7c39b05e287cab1786fa8eNuno Lopes
2956d34ae5370a41268cc7c39b05e287cab1786fa8eNuno Lopes  delete set;
296e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor  delete [] CXXOperatorNames;
2972e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor}
2982e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
2992e1cd4264d363ca869bf37ef160902f211d21b8cDouglas GregorDeclarationName
3002e1cd4264d363ca869bf37ef160902f211d21b8cDouglas GregorDeclarationNameTable::getCXXSpecialName(DeclarationName::NameKind Kind,
3012e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor                                        QualType Ty) {
3022e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  assert(Kind >= DeclarationName::CXXConstructorName &&
3032e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor         Kind <= DeclarationName::CXXConversionFunctionName &&
3042e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor         "Kind must be a C++ special name kind");
30549f25ecf7ff358039ce4c9254b867f32110e660eDouglas Gregor  assert(Ty->isCanonical() &&
30649f25ecf7ff358039ce4c9254b867f32110e660eDouglas Gregor         "Can only build C++ special names from canonical types");
3072e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  llvm::FoldingSet<CXXSpecialName> *SpecialNames
3082e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    = static_cast<llvm::FoldingSet<CXXSpecialName>*>(CXXSpecialNamesImpl);
3092e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
3102e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  DeclarationNameExtra::ExtraKind EKind;
3112e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  switch (Kind) {
3122e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  case DeclarationName::CXXConstructorName:
3132e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    EKind = DeclarationNameExtra::CXXConstructor;
314d603eaa682cecac2c10771a700cb83aa301653b4Chris Lattner    assert(Ty.getCVRQualifiers() == 0 &&"Constructor type must be unqualified");
3152e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    break;
3162e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  case DeclarationName::CXXDestructorName:
3172e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    EKind = DeclarationNameExtra::CXXDestructor;
318e63ef48b76b84e7ffb0a38fbf475ddea5c48adb4Douglas Gregor    assert(Ty.getCVRQualifiers() == 0 && "Destructor type must be unqualified");
3192e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    break;
3202e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  case DeclarationName::CXXConversionFunctionName:
3212e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    EKind = DeclarationNameExtra::CXXConversionFunction;
3222e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    break;
3232e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  default:
3242e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    return DeclarationName();
3252e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  }
3262e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
3272e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  // Unique selector, to guarantee there is one per name.
3282e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  llvm::FoldingSetNodeID ID;
3292e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  ID.AddInteger(EKind);
3302e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  ID.AddPointer(Ty.getAsOpaquePtr());
3312e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
3322e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  void *InsertPos = 0;
3332e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  if (CXXSpecialName *Name = SpecialNames->FindNodeOrInsertPos(ID, InsertPos))
3342e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    return DeclarationName(Name);
3352e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
3362e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  CXXSpecialName *SpecialName = new CXXSpecialName;
3372e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  SpecialName->ExtraKindOrNumArgs = EKind;
3382e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  SpecialName->Type = Ty;
3392def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  SpecialName->FETokenInfo = 0;
3402e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
3412e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  SpecialNames->InsertNode(SpecialName, InsertPos);
3422e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  return DeclarationName(SpecialName);
3432e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor}
3442e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
345e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas GregorDeclarationName
346e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas GregorDeclarationNameTable::getCXXOperatorName(OverloadedOperatorKind Op) {
347e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor  return DeclarationName(&CXXOperatorNames[(unsigned)Op]);
348e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor}
349e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor
35044b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregorunsigned
35144b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregorllvm::DenseMapInfo<clang::DeclarationName>::
35244b4321feab46299d3f5cfd404680884752a0fcfDouglas GregorgetHashValue(clang::DeclarationName N) {
35344b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor  return DenseMapInfo<void*>::getHashValue(N.getAsOpaquePtr());
35444b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor}
35544b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor
356