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//===----------------------------------------------------------------------===//
14ac9590effa90406767a544005ed1de52e258306bTed Kremenek#include "clang/AST/ASTContext.h"
15ac9590effa90406767a544005ed1de52e258306bTed Kremenek#include "clang/AST/Decl.h"
162e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor#include "clang/AST/DeclarationName.h"
1710bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor#include "clang/AST/Type.h"
182577743c5650c646fb705df01403707e94f2df04Abramo Bagnara#include "clang/AST/TypeLoc.h"
19d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor#include "clang/AST/TypeOrdering.h"
202e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor#include "clang/Basic/IdentifierTable.h"
21370187c8a3e96517c943329f2511737a04b85450Douglas Gregor#include "llvm/ADT/DenseMap.h"
222e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor#include "llvm/ADT/FoldingSet.h"
23f24e54a0c8f0621dc1e964e79dd2fc47f6a2e723Chandler Carruth#include "llvm/Support/ErrorHandling.h"
24f6cde77d7bc34bbee26b086ff192637af8e9da59Benjamin Kramer#include "llvm/Support/raw_ostream.h"
252e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregorusing namespace clang;
262e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
272e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregornamespace clang {
282e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// CXXSpecialName - Records the type associated with one of the
292e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// "special" kinds of declaration names in C++, e.g., constructors,
302e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// destructors, and conversion functions.
311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpclass CXXSpecialName
322e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  : public DeclarationNameExtra, public llvm::FoldingSetNode {
332e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregorpublic:
342def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  /// Type - The type associated with this declaration name.
352e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  QualType Type;
362e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
372def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  /// FETokenInfo - Extra information associated with this declaration
382def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  /// name that can be used by the front end.
392def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  void *FETokenInfo;
402def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor
412e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  void Profile(llvm::FoldingSetNodeID &ID) {
422e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    ID.AddInteger(ExtraKindOrNumArgs);
432e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    ID.AddPointer(Type.getAsOpaquePtr());
442e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  }
452e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor};
462e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
47e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor/// CXXOperatorIdName - Contains extra information for the name of an
481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// overloaded operator in C++, such as "operator+.
49e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregorclass CXXOperatorIdName : public DeclarationNameExtra {
50e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregorpublic:
51e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor  /// FETokenInfo - Extra information associated with this operator
52e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor  /// name that can be used by the front end.
53e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor  void *FETokenInfo;
54e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor};
55e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor
563a5032b89df601ab2e0c5c7e9667db2301bf10cfRichard Smith/// CXXLiteralOperatorName - Contains the actual identifier that makes up the
573e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt/// name.
583e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt///
593e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt/// This identifier is stored here rather than directly in DeclarationName so as
603e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt/// to allow Objective-C selectors, which are about a million times more common,
613e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt/// to consume minimal memory.
62a6c058dd75c5563cced821fc16766a7cc179e00cSean Huntclass CXXLiteralOperatorIdName
63a6c058dd75c5563cced821fc16766a7cc179e00cSean Hunt  : public DeclarationNameExtra, public llvm::FoldingSetNode {
643e518bda00d710754ca077cf9be8dd821e16a854Sean Huntpublic:
653e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt  IdentifierInfo *ID;
66a6c058dd75c5563cced821fc16766a7cc179e00cSean Hunt
673a5032b89df601ab2e0c5c7e9667db2301bf10cfRichard Smith  /// FETokenInfo - Extra information associated with this operator
683a5032b89df601ab2e0c5c7e9667db2301bf10cfRichard Smith  /// name that can be used by the front end.
693a5032b89df601ab2e0c5c7e9667db2301bf10cfRichard Smith  void *FETokenInfo;
703a5032b89df601ab2e0c5c7e9667db2301bf10cfRichard Smith
71a6c058dd75c5563cced821fc16766a7cc179e00cSean Hunt  void Profile(llvm::FoldingSetNodeID &FSID) {
72a6c058dd75c5563cced821fc16766a7cc179e00cSean Hunt    FSID.AddPointer(ID);
73a6c058dd75c5563cced821fc16766a7cc179e00cSean Hunt  }
743e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt};
753e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt
767fe0b9ea2c8137c035402e6ea01dfdfbc93214cbJohn McCallstatic int compareInt(unsigned A, unsigned B) {
777fe0b9ea2c8137c035402e6ea01dfdfbc93214cbJohn McCall  return (A < B ? -1 : (A > B ? 1 : 0));
787fe0b9ea2c8137c035402e6ea01dfdfbc93214cbJohn McCall}
797fe0b9ea2c8137c035402e6ea01dfdfbc93214cbJohn McCall
807fe0b9ea2c8137c035402e6ea01dfdfbc93214cbJohn McCallint DeclarationName::compare(DeclarationName LHS, DeclarationName RHS) {
81d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor  if (LHS.getNameKind() != RHS.getNameKind())
827fe0b9ea2c8137c035402e6ea01dfdfbc93214cbJohn McCall    return (LHS.getNameKind() < RHS.getNameKind() ? -1 : 1);
83d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor
84d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor  switch (LHS.getNameKind()) {
857fe0b9ea2c8137c035402e6ea01dfdfbc93214cbJohn McCall  case DeclarationName::Identifier: {
867fe0b9ea2c8137c035402e6ea01dfdfbc93214cbJohn McCall    IdentifierInfo *LII = LHS.getAsIdentifierInfo();
877fe0b9ea2c8137c035402e6ea01dfdfbc93214cbJohn McCall    IdentifierInfo *RII = RHS.getAsIdentifierInfo();
887fe0b9ea2c8137c035402e6ea01dfdfbc93214cbJohn McCall    if (!LII) return RII ? -1 : 0;
897fe0b9ea2c8137c035402e6ea01dfdfbc93214cbJohn McCall    if (!RII) return 1;
907fe0b9ea2c8137c035402e6ea01dfdfbc93214cbJohn McCall
917fe0b9ea2c8137c035402e6ea01dfdfbc93214cbJohn McCall    return LII->getName().compare(RII->getName());
927fe0b9ea2c8137c035402e6ea01dfdfbc93214cbJohn McCall  }
932e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
94d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor  case DeclarationName::ObjCZeroArgSelector:
95d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor  case DeclarationName::ObjCOneArgSelector:
96d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor  case DeclarationName::ObjCMultiArgSelector: {
97d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor    Selector LHSSelector = LHS.getObjCSelector();
98d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor    Selector RHSSelector = RHS.getObjCSelector();
997fe0b9ea2c8137c035402e6ea01dfdfbc93214cbJohn McCall    unsigned LN = LHSSelector.getNumArgs(), RN = RHSSelector.getNumArgs();
1007fe0b9ea2c8137c035402e6ea01dfdfbc93214cbJohn McCall    for (unsigned I = 0, N = std::min(LN, RN); I != N; ++I) {
101813d8346529bf094eb2b249648906ba7fd226688Douglas Gregor      switch (LHSSelector.getNameForSlot(I).compare(
102813d8346529bf094eb2b249648906ba7fd226688Douglas Gregor                                               RHSSelector.getNameForSlot(I))) {
103d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor      case -1: return true;
104d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor      case 1: return false;
105d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor      default: break;
106d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor      }
107d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor    }
1087fe0b9ea2c8137c035402e6ea01dfdfbc93214cbJohn McCall
1097fe0b9ea2c8137c035402e6ea01dfdfbc93214cbJohn McCall    return compareInt(LN, RN);
110d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor  }
111d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor
112d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor  case DeclarationName::CXXConstructorName:
113d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor  case DeclarationName::CXXDestructorName:
114d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor  case DeclarationName::CXXConversionFunctionName:
1157fe0b9ea2c8137c035402e6ea01dfdfbc93214cbJohn McCall    if (QualTypeOrdering()(LHS.getCXXNameType(), RHS.getCXXNameType()))
1167fe0b9ea2c8137c035402e6ea01dfdfbc93214cbJohn McCall      return -1;
1177fe0b9ea2c8137c035402e6ea01dfdfbc93214cbJohn McCall    if (QualTypeOrdering()(RHS.getCXXNameType(), LHS.getCXXNameType()))
1187fe0b9ea2c8137c035402e6ea01dfdfbc93214cbJohn McCall      return 1;
1197fe0b9ea2c8137c035402e6ea01dfdfbc93214cbJohn McCall    return 0;
120d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor
121d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor  case DeclarationName::CXXOperatorName:
1227fe0b9ea2c8137c035402e6ea01dfdfbc93214cbJohn McCall    return compareInt(LHS.getCXXOverloadedOperator(),
1237fe0b9ea2c8137c035402e6ea01dfdfbc93214cbJohn McCall                      RHS.getCXXOverloadedOperator());
1243e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt
1253e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt  case DeclarationName::CXXLiteralOperatorName:
1267fe0b9ea2c8137c035402e6ea01dfdfbc93214cbJohn McCall    return LHS.getCXXLiteralIdentifier()->getName().compare(
1277fe0b9ea2c8137c035402e6ea01dfdfbc93214cbJohn McCall                                   RHS.getCXXLiteralIdentifier()->getName());
128d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor
129d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor  case DeclarationName::CXXUsingDirective:
1307fe0b9ea2c8137c035402e6ea01dfdfbc93214cbJohn McCall    return 0;
131d6b5f13ba3b8d03656d272df5454a9f0a22f139bDouglas Gregor  }
1323026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie
1333026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie  llvm_unreachable("Invalid DeclarationName Kind!");
1342e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor}
1352e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
13617828ca5857d5d9cadfffd339f888de58182c8f1David Blaikieraw_ostream &operator<<(raw_ostream &OS, DeclarationName N) {
13717828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie  switch (N.getNameKind()) {
13817828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie  case DeclarationName::Identifier:
13917828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie    if (const IdentifierInfo *II = N.getAsIdentifierInfo())
14017828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie      OS << II->getName();
14117828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie    return OS;
14217828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie
14317828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie  case DeclarationName::ObjCZeroArgSelector:
14417828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie  case DeclarationName::ObjCOneArgSelector:
14517828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie  case DeclarationName::ObjCMultiArgSelector:
146651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    N.getObjCSelector().print(OS);
147651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return OS;
14817828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie
14917828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie  case DeclarationName::CXXConstructorName: {
15017828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie    QualType ClassType = N.getCXXNameType();
15117828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie    if (const RecordType *ClassRec = ClassType->getAs<RecordType>())
15217828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie      return OS << *ClassRec->getDecl();
153651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    LangOptions LO;
154651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    LO.CPlusPlus = true;
155651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return OS << ClassType.getAsString(PrintingPolicy(LO));
15617828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie  }
15717828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie
15817828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie  case DeclarationName::CXXDestructorName: {
15917828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie    OS << '~';
16017828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie    QualType Type = N.getCXXNameType();
16117828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie    if (const RecordType *Rec = Type->getAs<RecordType>())
16217828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie      return OS << *Rec->getDecl();
163651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    LangOptions LO;
164651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    LO.CPlusPlus = true;
165651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return OS << Type.getAsString(PrintingPolicy(LO));
16617828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie  }
16717828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie
16817828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie  case DeclarationName::CXXOperatorName: {
16917828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie    static const char* const OperatorNames[NUM_OVERLOADED_OPERATORS] = {
1706bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      nullptr,
17117828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie#define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \
17217828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie      Spelling,
17317828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie#include "clang/Basic/OperatorKinds.def"
17417828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie    };
17517828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie    const char *OpName = OperatorNames[N.getCXXOverloadedOperator()];
17617828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie    assert(OpName && "not an overloaded operator");
17717828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie
17817828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie    OS << "operator";
17917828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie    if (OpName[0] >= 'a' && OpName[0] <= 'z')
18017828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie      OS << ' ';
18117828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie    return OS << OpName;
18217828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie  }
18317828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie
18417828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie  case DeclarationName::CXXLiteralOperatorName:
18517828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie    return OS << "operator \"\" " << N.getCXXLiteralIdentifier()->getName();
18617828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie
18717828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie  case DeclarationName::CXXConversionFunctionName: {
18817828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie    OS << "operator ";
18917828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie    QualType Type = N.getCXXNameType();
19017828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie    if (const RecordType *Rec = Type->getAs<RecordType>())
19117828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie      return OS << *Rec->getDecl();
192651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    LangOptions LO;
193651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    LO.CPlusPlus = true;
194651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    LO.Bool = true;
195651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return OS << Type.getAsString(PrintingPolicy(LO));
19617828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie  }
19717828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie  case DeclarationName::CXXUsingDirective:
19817828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie    return OS << "<using-directive>";
19917828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie  }
20017828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie
20117828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie  llvm_unreachable("Unexpected declaration name kind");
20217828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie}
20317828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie
2042e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor} // end namespace clang
2052e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
2062e1cd4264d363ca869bf37ef160902f211d21b8cDouglas GregorDeclarationName::NameKind DeclarationName::getNameKind() const {
2072e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  switch (getStoredNameKind()) {
2082e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  case StoredIdentifier:          return Identifier;
2092e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  case StoredObjCZeroArgSelector: return ObjCZeroArgSelector;
2102e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  case StoredObjCOneArgSelector:  return ObjCOneArgSelector;
2112e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
212e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor  case StoredDeclarationNameExtra:
2132e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    switch (getExtra()->ExtraKindOrNumArgs) {
2141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    case DeclarationNameExtra::CXXConstructor:
2152e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor      return CXXConstructorName;
2162e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
2171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    case DeclarationNameExtra::CXXDestructor:
2182e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor      return CXXDestructorName;
2192e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
2201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    case DeclarationNameExtra::CXXConversionFunction:
2212e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor      return CXXConversionFunctionName;
2222e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
2233e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt    case DeclarationNameExtra::CXXLiteralOperator:
2243e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt      return CXXLiteralOperatorName;
2253e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt
2262a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor    case DeclarationNameExtra::CXXUsingDirective:
2272a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor      return CXXUsingDirective;
2282a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor
2292e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    default:
230e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor      // Check if we have one of the CXXOperator* enumeration values.
2311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      if (getExtra()->ExtraKindOrNumArgs <
2322a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor            DeclarationNameExtra::CXXUsingDirective)
233e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor        return CXXOperatorName;
234e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor
2352e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor      return ObjCMultiArgSelector;
2362e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    }
2372e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  }
2382e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
2392e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  // Can't actually get here.
240b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie  llvm_unreachable("This should be unreachable!");
2412e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor}
2422e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
24348026d26fb58e413544874eead5491b1452e2ebfDouglas Gregorbool DeclarationName::isDependentName() const {
24448026d26fb58e413544874eead5491b1452e2ebfDouglas Gregor  QualType T = getCXXNameType();
24548026d26fb58e413544874eead5491b1452e2ebfDouglas Gregor  return !T.isNull() && T->isDependentType();
24648026d26fb58e413544874eead5491b1452e2ebfDouglas Gregor}
24748026d26fb58e413544874eead5491b1452e2ebfDouglas Gregor
24810bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregorstd::string DeclarationName::getAsString() const {
249f6cde77d7bc34bbee26b086ff192637af8e9da59Benjamin Kramer  std::string Result;
250f6cde77d7bc34bbee26b086ff192637af8e9da59Benjamin Kramer  llvm::raw_string_ostream OS(Result);
25117828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie  OS << *this;
252f6cde77d7bc34bbee26b086ff192637af8e9da59Benjamin Kramer  return OS.str();
253f6cde77d7bc34bbee26b086ff192637af8e9da59Benjamin Kramer}
254f6cde77d7bc34bbee26b086ff192637af8e9da59Benjamin Kramer
2552e1cd4264d363ca869bf37ef160902f211d21b8cDouglas GregorQualType DeclarationName::getCXXNameType() const {
2562e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  if (CXXSpecialName *CXXName = getAsCXXSpecialName())
2572e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    return CXXName->Type;
2582e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  else
2592e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    return QualType();
2602e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor}
2612e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
262e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas GregorOverloadedOperatorKind DeclarationName::getCXXOverloadedOperator() const {
263e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor  if (CXXOperatorIdName *CXXOp = getAsCXXOperatorIdName()) {
2641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    unsigned value
265e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor      = CXXOp->ExtraKindOrNumArgs - DeclarationNameExtra::CXXConversionFunction;
266e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor    return static_cast<OverloadedOperatorKind>(value);
267e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor  } else {
268e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor    return OO_None;
269e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor  }
270e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor}
271e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor
2723e518bda00d710754ca077cf9be8dd821e16a854Sean HuntIdentifierInfo *DeclarationName::getCXXLiteralIdentifier() const {
2733e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt  if (CXXLiteralOperatorIdName *CXXLit = getAsCXXLiteralOperatorIdName())
2743e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt    return CXXLit->ID;
2753e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt  else
2766bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    return nullptr;
2773e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt}
2783e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt
279514d3b6b93c83c0841d2f9dd7af8ecc2877fe921Douglas Gregorvoid *DeclarationName::getFETokenInfoAsVoidSlow() const {
2802def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  switch (getNameKind()) {
2812def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  case Identifier:
282c470442fe144b93c2877134559d0067b3215289dBenjamin Kramer    llvm_unreachable("Handled by getFETokenInfo()");
2832def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor
2842def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  case CXXConstructorName:
2852def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  case CXXDestructorName:
2862def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  case CXXConversionFunctionName:
2872def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor    return getAsCXXSpecialName()->FETokenInfo;
2882def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor
289e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor  case CXXOperatorName:
290e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor    return getAsCXXOperatorIdName()->FETokenInfo;
291e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor
2923e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt  case CXXLiteralOperatorName:
2933a5032b89df601ab2e0c5c7e9667db2301bf10cfRichard Smith    return getAsCXXLiteralOperatorIdName()->FETokenInfo;
2943e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt
2952def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  default:
296b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie    llvm_unreachable("Declaration name has no FETokenInfo");
2972def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  }
2982def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor}
2992def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor
3002def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregorvoid DeclarationName::setFETokenInfo(void *T) {
3012def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  switch (getNameKind()) {
3022def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  case Identifier:
3032def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor    getAsIdentifierInfo()->setFETokenInfo(T);
3042def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor    break;
3052def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor
3062def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  case CXXConstructorName:
3072def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  case CXXDestructorName:
3082def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  case CXXConversionFunctionName:
3092def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor    getAsCXXSpecialName()->FETokenInfo = T;
3102def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor    break;
3112def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor
312e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor  case CXXOperatorName:
313e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor    getAsCXXOperatorIdName()->FETokenInfo = T;
314e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor    break;
315e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor
3163e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt  case CXXLiteralOperatorName:
3173a5032b89df601ab2e0c5c7e9667db2301bf10cfRichard Smith    getAsCXXLiteralOperatorIdName()->FETokenInfo = T;
3183e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt    break;
3193e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt
3202def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  default:
321b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie    llvm_unreachable("Declaration name has no FETokenInfo");
3222def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  }
3232def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor}
3242def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor
3252a3009a432bdcec59e6383d7b2b17494d6f91649Douglas GregorDeclarationName DeclarationName::getUsingDirectiveName() {
3262a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor  // Single instance of DeclarationNameExtra for using-directive
32768f7a2426227476bcfa33ada70b708c82419dfdcNuno Lopes  static const DeclarationNameExtra UDirExtra =
3282a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor    { DeclarationNameExtra::CXXUsingDirective };
3292a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor
3302a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor  uintptr_t Ptr = reinterpret_cast<uintptr_t>(&UDirExtra);
3312a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor  Ptr |= StoredDeclarationNameExtra;
3322a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor
3332a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor  return DeclarationName(Ptr);
3342a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor}
3352a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor
33670f5bc77dbe4172bde860e15d8b3c29e0d5005cbAnders Carlssonvoid DeclarationName::dump() const {
33717828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie  llvm::errs() << *this << '\n';
33870f5bc77dbe4172bde860e15d8b3c29e0d5005cbAnders Carlsson}
33970f5bc77dbe4172bde860e15d8b3c29e0d5005cbAnders Carlsson
3404ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadDeclarationNameTable::DeclarationNameTable(const ASTContext &C) : Ctx(C) {
3412e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  CXXSpecialNamesImpl = new llvm::FoldingSet<CXXSpecialName>;
342a6c058dd75c5563cced821fc16766a7cc179e00cSean Hunt  CXXLiteralOperatorNames = new llvm::FoldingSet<CXXLiteralOperatorIdName>;
343e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor
344e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor  // Initialize the overloaded operator names.
34545d9c2d2b1b4ada29160edadc071db9779c0ec07Ted Kremenek  CXXOperatorNames = new (Ctx) CXXOperatorIdName[NUM_OVERLOADED_OPERATORS];
346e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor  for (unsigned Op = 0; Op < NUM_OVERLOADED_OPERATORS; ++Op) {
3471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    CXXOperatorNames[Op].ExtraKindOrNumArgs
348e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor      = Op + DeclarationNameExtra::CXXConversionFunction;
3496bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    CXXOperatorNames[Op].FETokenInfo = nullptr;
350e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor  }
3512e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor}
3522e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
3532e1cd4264d363ca869bf37ef160902f211d21b8cDouglas GregorDeclarationNameTable::~DeclarationNameTable() {
354a6c058dd75c5563cced821fc16766a7cc179e00cSean Hunt  llvm::FoldingSet<CXXSpecialName> *SpecialNames =
3556d34ae5370a41268cc7c39b05e287cab1786fa8eNuno Lopes    static_cast<llvm::FoldingSet<CXXSpecialName>*>(CXXSpecialNamesImpl);
35645d9c2d2b1b4ada29160edadc071db9779c0ec07Ted Kremenek  llvm::FoldingSet<CXXLiteralOperatorIdName> *LiteralNames
35745d9c2d2b1b4ada29160edadc071db9779c0ec07Ted Kremenek    = static_cast<llvm::FoldingSet<CXXLiteralOperatorIdName>*>
35845d9c2d2b1b4ada29160edadc071db9779c0ec07Ted Kremenek        (CXXLiteralOperatorNames);
359a6c058dd75c5563cced821fc16766a7cc179e00cSean Hunt
360a6c058dd75c5563cced821fc16766a7cc179e00cSean Hunt  delete SpecialNames;
361a6c058dd75c5563cced821fc16766a7cc179e00cSean Hunt  delete LiteralNames;
362ac9590effa90406767a544005ed1de52e258306bTed Kremenek}
363ac9590effa90406767a544005ed1de52e258306bTed Kremenek
3649852f58f50b4fc20914fbce5b4454135a42343f4Benjamin KramerDeclarationName DeclarationNameTable::getCXXConstructorName(CanQualType Ty) {
3659852f58f50b4fc20914fbce5b4454135a42343f4Benjamin Kramer  return getCXXSpecialName(DeclarationName::CXXConstructorName,
3669852f58f50b4fc20914fbce5b4454135a42343f4Benjamin Kramer                           Ty.getUnqualifiedType());
3679852f58f50b4fc20914fbce5b4454135a42343f4Benjamin Kramer}
3689852f58f50b4fc20914fbce5b4454135a42343f4Benjamin Kramer
3699852f58f50b4fc20914fbce5b4454135a42343f4Benjamin KramerDeclarationName DeclarationNameTable::getCXXDestructorName(CanQualType Ty) {
3709852f58f50b4fc20914fbce5b4454135a42343f4Benjamin Kramer  return getCXXSpecialName(DeclarationName::CXXDestructorName,
3719852f58f50b4fc20914fbce5b4454135a42343f4Benjamin Kramer                           Ty.getUnqualifiedType());
3729852f58f50b4fc20914fbce5b4454135a42343f4Benjamin Kramer}
3739852f58f50b4fc20914fbce5b4454135a42343f4Benjamin Kramer
3749852f58f50b4fc20914fbce5b4454135a42343f4Benjamin KramerDeclarationName
3759852f58f50b4fc20914fbce5b4454135a42343f4Benjamin KramerDeclarationNameTable::getCXXConversionFunctionName(CanQualType Ty) {
3769852f58f50b4fc20914fbce5b4454135a42343f4Benjamin Kramer  return getCXXSpecialName(DeclarationName::CXXConversionFunctionName, Ty);
3779852f58f50b4fc20914fbce5b4454135a42343f4Benjamin Kramer}
3789852f58f50b4fc20914fbce5b4454135a42343f4Benjamin Kramer
3791eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpDeclarationName
3801eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpDeclarationNameTable::getCXXSpecialName(DeclarationName::NameKind Kind,
38150d62d1b4a98adbc83de8f8cd1379ea1c25656f7Douglas Gregor                                        CanQualType Ty) {
3822e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  assert(Kind >= DeclarationName::CXXConstructorName &&
3832e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor         Kind <= DeclarationName::CXXConversionFunctionName &&
3842e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor         "Kind must be a C++ special name kind");
3851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  llvm::FoldingSet<CXXSpecialName> *SpecialNames
3862e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    = static_cast<llvm::FoldingSet<CXXSpecialName>*>(CXXSpecialNamesImpl);
3872e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
3882e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  DeclarationNameExtra::ExtraKind EKind;
3892e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  switch (Kind) {
3901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  case DeclarationName::CXXConstructorName:
3912e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    EKind = DeclarationNameExtra::CXXConstructor;
3920953e767ff7817f97b3ab20896b229891eeff45bJohn McCall    assert(!Ty.hasQualifiers() &&"Constructor type must be unqualified");
3932e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    break;
3942e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  case DeclarationName::CXXDestructorName:
3952e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    EKind = DeclarationNameExtra::CXXDestructor;
3960953e767ff7817f97b3ab20896b229891eeff45bJohn McCall    assert(!Ty.hasQualifiers() && "Destructor type must be unqualified");
3972e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    break;
3982e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  case DeclarationName::CXXConversionFunctionName:
3992e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    EKind = DeclarationNameExtra::CXXConversionFunction;
4002e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    break;
4012e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  default:
4022e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    return DeclarationName();
4032e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  }
4042e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
4052e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  // Unique selector, to guarantee there is one per name.
4062e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  llvm::FoldingSetNodeID ID;
4072e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  ID.AddInteger(EKind);
4082e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  ID.AddPointer(Ty.getAsOpaquePtr());
4092e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
4106bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  void *InsertPos = nullptr;
4112e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  if (CXXSpecialName *Name = SpecialNames->FindNodeOrInsertPos(ID, InsertPos))
4122e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    return DeclarationName(Name);
4132e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
41445d9c2d2b1b4ada29160edadc071db9779c0ec07Ted Kremenek  CXXSpecialName *SpecialName = new (Ctx) CXXSpecialName;
4152e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  SpecialName->ExtraKindOrNumArgs = EKind;
4162e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  SpecialName->Type = Ty;
4176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  SpecialName->FETokenInfo = nullptr;
4182e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
4192e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  SpecialNames->InsertNode(SpecialName, InsertPos);
4202e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  return DeclarationName(SpecialName);
4212e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor}
4222e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
4231eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpDeclarationName
424e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas GregorDeclarationNameTable::getCXXOperatorName(OverloadedOperatorKind Op) {
425e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor  return DeclarationName(&CXXOperatorNames[(unsigned)Op]);
426e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor}
427e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor
4283e518bda00d710754ca077cf9be8dd821e16a854Sean HuntDeclarationName
4293e518bda00d710754ca077cf9be8dd821e16a854Sean HuntDeclarationNameTable::getCXXLiteralOperatorName(IdentifierInfo *II) {
430a6c058dd75c5563cced821fc16766a7cc179e00cSean Hunt  llvm::FoldingSet<CXXLiteralOperatorIdName> *LiteralNames
431a6c058dd75c5563cced821fc16766a7cc179e00cSean Hunt    = static_cast<llvm::FoldingSet<CXXLiteralOperatorIdName>*>
432a6c058dd75c5563cced821fc16766a7cc179e00cSean Hunt                                                      (CXXLiteralOperatorNames);
433a6c058dd75c5563cced821fc16766a7cc179e00cSean Hunt
434a6c058dd75c5563cced821fc16766a7cc179e00cSean Hunt  llvm::FoldingSetNodeID ID;
435a6c058dd75c5563cced821fc16766a7cc179e00cSean Hunt  ID.AddPointer(II);
436a6c058dd75c5563cced821fc16766a7cc179e00cSean Hunt
4376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  void *InsertPos = nullptr;
438a6c058dd75c5563cced821fc16766a7cc179e00cSean Hunt  if (CXXLiteralOperatorIdName *Name =
439a6c058dd75c5563cced821fc16766a7cc179e00cSean Hunt                               LiteralNames->FindNodeOrInsertPos(ID, InsertPos))
440a6c058dd75c5563cced821fc16766a7cc179e00cSean Hunt    return DeclarationName (Name);
441a6c058dd75c5563cced821fc16766a7cc179e00cSean Hunt
44245d9c2d2b1b4ada29160edadc071db9779c0ec07Ted Kremenek  CXXLiteralOperatorIdName *LiteralName = new (Ctx) CXXLiteralOperatorIdName;
4433e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt  LiteralName->ExtraKindOrNumArgs = DeclarationNameExtra::CXXLiteralOperator;
4443e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt  LiteralName->ID = II;
4456bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  LiteralName->FETokenInfo = nullptr;
446a6c058dd75c5563cced821fc16766a7cc179e00cSean Hunt
447a6c058dd75c5563cced821fc16766a7cc179e00cSean Hunt  LiteralNames->InsertNode(LiteralName, InsertPos);
4483e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt  return DeclarationName(LiteralName);
4493e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt}
4503e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt
4512577743c5650c646fb705df01403707e94f2df04Abramo BagnaraDeclarationNameLoc::DeclarationNameLoc(DeclarationName Name) {
4522577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  switch (Name.getNameKind()) {
4532577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  case DeclarationName::Identifier:
4542577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    break;
4552577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  case DeclarationName::CXXConstructorName:
4562577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  case DeclarationName::CXXDestructorName:
4572577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  case DeclarationName::CXXConversionFunctionName:
4586bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    NamedType.TInfo = nullptr;
4592577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    break;
4602577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  case DeclarationName::CXXOperatorName:
4612577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    CXXOperatorName.BeginOpNameLoc = SourceLocation().getRawEncoding();
4622577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    CXXOperatorName.EndOpNameLoc = SourceLocation().getRawEncoding();
4632577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    break;
4642577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  case DeclarationName::CXXLiteralOperatorName:
4652577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    CXXLiteralOperatorName.OpNameLoc = SourceLocation().getRawEncoding();
4662577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    break;
4672577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  case DeclarationName::ObjCZeroArgSelector:
4682577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  case DeclarationName::ObjCOneArgSelector:
4692577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  case DeclarationName::ObjCMultiArgSelector:
4702577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    // FIXME: ?
4712577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    break;
4722577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  case DeclarationName::CXXUsingDirective:
4732577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    break;
4742577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  }
4752577743c5650c646fb705df01403707e94f2df04Abramo Bagnara}
4762577743c5650c646fb705df01403707e94f2df04Abramo Bagnara
477bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregorbool DeclarationNameInfo::containsUnexpandedParameterPack() const {
478bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  switch (Name.getNameKind()) {
479bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  case DeclarationName::Identifier:
480bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  case DeclarationName::ObjCZeroArgSelector:
481bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  case DeclarationName::ObjCOneArgSelector:
482bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  case DeclarationName::ObjCMultiArgSelector:
483bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  case DeclarationName::CXXOperatorName:
484bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  case DeclarationName::CXXLiteralOperatorName:
485bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  case DeclarationName::CXXUsingDirective:
486bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor    return false;
487bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor
488bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  case DeclarationName::CXXConstructorName:
489bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  case DeclarationName::CXXDestructorName:
490bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  case DeclarationName::CXXConversionFunctionName:
491bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor    if (TypeSourceInfo *TInfo = LocInfo.NamedType.TInfo)
492bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor      return TInfo->getType()->containsUnexpandedParameterPack();
493bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor
494bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor    return Name.getCXXNameType()->containsUnexpandedParameterPack();
495bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  }
496f24e54a0c8f0621dc1e964e79dd2fc47f6a2e723Chandler Carruth  llvm_unreachable("All name kinds handled.");
497bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor}
498bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor
499561f81243f665cf2001caadc45df505f826b72d6Douglas Gregorbool DeclarationNameInfo::isInstantiationDependent() const {
500561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor  switch (Name.getNameKind()) {
501561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor  case DeclarationName::Identifier:
502561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor  case DeclarationName::ObjCZeroArgSelector:
503561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor  case DeclarationName::ObjCOneArgSelector:
504561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor  case DeclarationName::ObjCMultiArgSelector:
505561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor  case DeclarationName::CXXOperatorName:
506561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor  case DeclarationName::CXXLiteralOperatorName:
507561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor  case DeclarationName::CXXUsingDirective:
508561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor    return false;
509561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor
510561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor  case DeclarationName::CXXConstructorName:
511561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor  case DeclarationName::CXXDestructorName:
512561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor  case DeclarationName::CXXConversionFunctionName:
513561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor    if (TypeSourceInfo *TInfo = LocInfo.NamedType.TInfo)
514561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor      return TInfo->getType()->isInstantiationDependentType();
515561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor
516561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor    return Name.getCXXNameType()->isInstantiationDependentType();
517561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor  }
518561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor  llvm_unreachable("All name kinds handled.");
519561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor}
520561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor
5212577743c5650c646fb705df01403707e94f2df04Abramo Bagnarastd::string DeclarationNameInfo::getAsString() const {
5222577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  std::string Result;
5232577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  llvm::raw_string_ostream OS(Result);
5242577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  printName(OS);
5252577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  return OS.str();
5262577743c5650c646fb705df01403707e94f2df04Abramo Bagnara}
5272577743c5650c646fb705df01403707e94f2df04Abramo Bagnara
5285f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnervoid DeclarationNameInfo::printName(raw_ostream &OS) const {
5292577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  switch (Name.getNameKind()) {
5302577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  case DeclarationName::Identifier:
5312577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  case DeclarationName::ObjCZeroArgSelector:
5322577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  case DeclarationName::ObjCOneArgSelector:
5332577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  case DeclarationName::ObjCMultiArgSelector:
5342577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  case DeclarationName::CXXOperatorName:
5352577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  case DeclarationName::CXXLiteralOperatorName:
5362577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  case DeclarationName::CXXUsingDirective:
53717828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie    OS << Name;
5382577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    return;
5392577743c5650c646fb705df01403707e94f2df04Abramo Bagnara
5402577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  case DeclarationName::CXXConstructorName:
5412577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  case DeclarationName::CXXDestructorName:
5422577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  case DeclarationName::CXXConversionFunctionName:
5432577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    if (TypeSourceInfo *TInfo = LocInfo.NamedType.TInfo) {
5442577743c5650c646fb705df01403707e94f2df04Abramo Bagnara      if (Name.getNameKind() == DeclarationName::CXXDestructorName)
5452577743c5650c646fb705df01403707e94f2df04Abramo Bagnara        OS << '~';
5462577743c5650c646fb705df01403707e94f2df04Abramo Bagnara      else if (Name.getNameKind() == DeclarationName::CXXConversionFunctionName)
5472577743c5650c646fb705df01403707e94f2df04Abramo Bagnara        OS << "operator ";
548651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      LangOptions LO;
549651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      LO.CPlusPlus = true;
550651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      LO.Bool = true;
551651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      OS << TInfo->getType().getAsString(PrintingPolicy(LO));
55217828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie    } else
55317828ca5857d5d9cadfffd339f888de58182c8f1David Blaikie      OS << Name;
5542577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    return;
5552577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  }
556b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie  llvm_unreachable("Unexpected declaration name kind");
5572577743c5650c646fb705df01403707e94f2df04Abramo Bagnara}
5582577743c5650c646fb705df01403707e94f2df04Abramo Bagnara
5592577743c5650c646fb705df01403707e94f2df04Abramo BagnaraSourceLocation DeclarationNameInfo::getEndLoc() const {
5602577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  switch (Name.getNameKind()) {
5612577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  case DeclarationName::Identifier:
5622577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    return NameLoc;
5632577743c5650c646fb705df01403707e94f2df04Abramo Bagnara
5642577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  case DeclarationName::CXXOperatorName: {
5652577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    unsigned raw = LocInfo.CXXOperatorName.EndOpNameLoc;
5662577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    return SourceLocation::getFromRawEncoding(raw);
5672577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  }
5682577743c5650c646fb705df01403707e94f2df04Abramo Bagnara
5692577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  case DeclarationName::CXXLiteralOperatorName: {
5702577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    unsigned raw = LocInfo.CXXLiteralOperatorName.OpNameLoc;
5712577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    return SourceLocation::getFromRawEncoding(raw);
5722577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  }
5732577743c5650c646fb705df01403707e94f2df04Abramo Bagnara
5742577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  case DeclarationName::CXXConstructorName:
5752577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  case DeclarationName::CXXDestructorName:
5762577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  case DeclarationName::CXXConversionFunctionName:
5772577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    if (TypeSourceInfo *TInfo = LocInfo.NamedType.TInfo)
5782577743c5650c646fb705df01403707e94f2df04Abramo Bagnara      return TInfo->getTypeLoc().getEndLoc();
5792577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    else
5802577743c5650c646fb705df01403707e94f2df04Abramo Bagnara      return NameLoc;
5812577743c5650c646fb705df01403707e94f2df04Abramo Bagnara
5822577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    // DNInfo work in progress: FIXME.
5832577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  case DeclarationName::ObjCZeroArgSelector:
5842577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  case DeclarationName::ObjCOneArgSelector:
5852577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  case DeclarationName::ObjCMultiArgSelector:
5862577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  case DeclarationName::CXXUsingDirective:
5872577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    return NameLoc;
5882577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  }
589b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie  llvm_unreachable("Unexpected declaration name kind");
5902577743c5650c646fb705df01403707e94f2df04Abramo Bagnara}
591