xref: /aosp_15_r20/external/clang/lib/AST/DeclarationName.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li //===-- DeclarationName.cpp - Declaration names implementation --*- C++ -*-===//
2*67e74705SXin Li //
3*67e74705SXin Li //                     The LLVM Compiler Infrastructure
4*67e74705SXin Li //
5*67e74705SXin Li // This file is distributed under the University of Illinois Open Source
6*67e74705SXin Li // License. See LICENSE.TXT for details.
7*67e74705SXin Li //
8*67e74705SXin Li //===----------------------------------------------------------------------===//
9*67e74705SXin Li //
10*67e74705SXin Li // This file implements the DeclarationName and DeclarationNameTable
11*67e74705SXin Li // classes.
12*67e74705SXin Li //
13*67e74705SXin Li //===----------------------------------------------------------------------===//
14*67e74705SXin Li #include "clang/AST/ASTContext.h"
15*67e74705SXin Li #include "clang/AST/DeclCXX.h"
16*67e74705SXin Li #include "clang/AST/DeclarationName.h"
17*67e74705SXin Li #include "clang/AST/Type.h"
18*67e74705SXin Li #include "clang/AST/TypeLoc.h"
19*67e74705SXin Li #include "clang/AST/TypeOrdering.h"
20*67e74705SXin Li #include "clang/Basic/IdentifierTable.h"
21*67e74705SXin Li #include "llvm/ADT/DenseMap.h"
22*67e74705SXin Li #include "llvm/ADT/FoldingSet.h"
23*67e74705SXin Li #include "llvm/Support/ErrorHandling.h"
24*67e74705SXin Li #include "llvm/Support/raw_ostream.h"
25*67e74705SXin Li using namespace clang;
26*67e74705SXin Li 
27*67e74705SXin Li namespace clang {
28*67e74705SXin Li /// CXXSpecialName - Records the type associated with one of the
29*67e74705SXin Li /// "special" kinds of declaration names in C++, e.g., constructors,
30*67e74705SXin Li /// destructors, and conversion functions.
31*67e74705SXin Li class CXXSpecialName
32*67e74705SXin Li   : public DeclarationNameExtra, public llvm::FoldingSetNode {
33*67e74705SXin Li public:
34*67e74705SXin Li   /// Type - The type associated with this declaration name.
35*67e74705SXin Li   QualType Type;
36*67e74705SXin Li 
37*67e74705SXin Li   /// FETokenInfo - Extra information associated with this declaration
38*67e74705SXin Li   /// name that can be used by the front end.
39*67e74705SXin Li   void *FETokenInfo;
40*67e74705SXin Li 
Profile(llvm::FoldingSetNodeID & ID)41*67e74705SXin Li   void Profile(llvm::FoldingSetNodeID &ID) {
42*67e74705SXin Li     ID.AddInteger(ExtraKindOrNumArgs);
43*67e74705SXin Li     ID.AddPointer(Type.getAsOpaquePtr());
44*67e74705SXin Li   }
45*67e74705SXin Li };
46*67e74705SXin Li 
47*67e74705SXin Li /// CXXOperatorIdName - Contains extra information for the name of an
48*67e74705SXin Li /// overloaded operator in C++, such as "operator+.
49*67e74705SXin Li class CXXOperatorIdName : public DeclarationNameExtra {
50*67e74705SXin Li public:
51*67e74705SXin Li   /// FETokenInfo - Extra information associated with this operator
52*67e74705SXin Li   /// name that can be used by the front end.
53*67e74705SXin Li   void *FETokenInfo;
54*67e74705SXin Li };
55*67e74705SXin Li 
56*67e74705SXin Li /// CXXLiteralOperatorName - Contains the actual identifier that makes up the
57*67e74705SXin Li /// name.
58*67e74705SXin Li ///
59*67e74705SXin Li /// This identifier is stored here rather than directly in DeclarationName so as
60*67e74705SXin Li /// to allow Objective-C selectors, which are about a million times more common,
61*67e74705SXin Li /// to consume minimal memory.
62*67e74705SXin Li class CXXLiteralOperatorIdName
63*67e74705SXin Li   : public DeclarationNameExtra, public llvm::FoldingSetNode {
64*67e74705SXin Li public:
65*67e74705SXin Li   IdentifierInfo *ID;
66*67e74705SXin Li 
67*67e74705SXin Li   /// FETokenInfo - Extra information associated with this operator
68*67e74705SXin Li   /// name that can be used by the front end.
69*67e74705SXin Li   void *FETokenInfo;
70*67e74705SXin Li 
Profile(llvm::FoldingSetNodeID & FSID)71*67e74705SXin Li   void Profile(llvm::FoldingSetNodeID &FSID) {
72*67e74705SXin Li     FSID.AddPointer(ID);
73*67e74705SXin Li   }
74*67e74705SXin Li };
75*67e74705SXin Li 
compareInt(unsigned A,unsigned B)76*67e74705SXin Li static int compareInt(unsigned A, unsigned B) {
77*67e74705SXin Li   return (A < B ? -1 : (A > B ? 1 : 0));
78*67e74705SXin Li }
79*67e74705SXin Li 
compare(DeclarationName LHS,DeclarationName RHS)80*67e74705SXin Li int DeclarationName::compare(DeclarationName LHS, DeclarationName RHS) {
81*67e74705SXin Li   if (LHS.getNameKind() != RHS.getNameKind())
82*67e74705SXin Li     return (LHS.getNameKind() < RHS.getNameKind() ? -1 : 1);
83*67e74705SXin Li 
84*67e74705SXin Li   switch (LHS.getNameKind()) {
85*67e74705SXin Li   case DeclarationName::Identifier: {
86*67e74705SXin Li     IdentifierInfo *LII = LHS.getAsIdentifierInfo();
87*67e74705SXin Li     IdentifierInfo *RII = RHS.getAsIdentifierInfo();
88*67e74705SXin Li     if (!LII) return RII ? -1 : 0;
89*67e74705SXin Li     if (!RII) return 1;
90*67e74705SXin Li 
91*67e74705SXin Li     return LII->getName().compare(RII->getName());
92*67e74705SXin Li   }
93*67e74705SXin Li 
94*67e74705SXin Li   case DeclarationName::ObjCZeroArgSelector:
95*67e74705SXin Li   case DeclarationName::ObjCOneArgSelector:
96*67e74705SXin Li   case DeclarationName::ObjCMultiArgSelector: {
97*67e74705SXin Li     Selector LHSSelector = LHS.getObjCSelector();
98*67e74705SXin Li     Selector RHSSelector = RHS.getObjCSelector();
99*67e74705SXin Li     unsigned LN = LHSSelector.getNumArgs(), RN = RHSSelector.getNumArgs();
100*67e74705SXin Li     for (unsigned I = 0, N = std::min(LN, RN); I != N; ++I) {
101*67e74705SXin Li       switch (LHSSelector.getNameForSlot(I).compare(
102*67e74705SXin Li                                                RHSSelector.getNameForSlot(I))) {
103*67e74705SXin Li       case -1: return true;
104*67e74705SXin Li       case 1: return false;
105*67e74705SXin Li       default: break;
106*67e74705SXin Li       }
107*67e74705SXin Li     }
108*67e74705SXin Li 
109*67e74705SXin Li     return compareInt(LN, RN);
110*67e74705SXin Li   }
111*67e74705SXin Li 
112*67e74705SXin Li   case DeclarationName::CXXConstructorName:
113*67e74705SXin Li   case DeclarationName::CXXDestructorName:
114*67e74705SXin Li   case DeclarationName::CXXConversionFunctionName:
115*67e74705SXin Li     if (QualTypeOrdering()(LHS.getCXXNameType(), RHS.getCXXNameType()))
116*67e74705SXin Li       return -1;
117*67e74705SXin Li     if (QualTypeOrdering()(RHS.getCXXNameType(), LHS.getCXXNameType()))
118*67e74705SXin Li       return 1;
119*67e74705SXin Li     return 0;
120*67e74705SXin Li 
121*67e74705SXin Li   case DeclarationName::CXXOperatorName:
122*67e74705SXin Li     return compareInt(LHS.getCXXOverloadedOperator(),
123*67e74705SXin Li                       RHS.getCXXOverloadedOperator());
124*67e74705SXin Li 
125*67e74705SXin Li   case DeclarationName::CXXLiteralOperatorName:
126*67e74705SXin Li     return LHS.getCXXLiteralIdentifier()->getName().compare(
127*67e74705SXin Li                                    RHS.getCXXLiteralIdentifier()->getName());
128*67e74705SXin Li 
129*67e74705SXin Li   case DeclarationName::CXXUsingDirective:
130*67e74705SXin Li     return 0;
131*67e74705SXin Li   }
132*67e74705SXin Li 
133*67e74705SXin Li   llvm_unreachable("Invalid DeclarationName Kind!");
134*67e74705SXin Li }
135*67e74705SXin Li 
printCXXConstructorDestructorName(QualType ClassType,raw_ostream & OS,PrintingPolicy Policy)136*67e74705SXin Li static void printCXXConstructorDestructorName(QualType ClassType,
137*67e74705SXin Li                                               raw_ostream &OS,
138*67e74705SXin Li                                               PrintingPolicy Policy) {
139*67e74705SXin Li   // We know we're printing C++ here. Ensure we print types properly.
140*67e74705SXin Li   Policy.adjustForCPlusPlus();
141*67e74705SXin Li 
142*67e74705SXin Li   if (const RecordType *ClassRec = ClassType->getAs<RecordType>()) {
143*67e74705SXin Li     OS << *ClassRec->getDecl();
144*67e74705SXin Li     return;
145*67e74705SXin Li   }
146*67e74705SXin Li   if (Policy.SuppressTemplateArgsInCXXConstructors) {
147*67e74705SXin Li     if (auto *InjTy = ClassType->getAs<InjectedClassNameType>()) {
148*67e74705SXin Li       OS << *InjTy->getDecl();
149*67e74705SXin Li       return;
150*67e74705SXin Li     }
151*67e74705SXin Li   }
152*67e74705SXin Li   ClassType.print(OS, Policy);
153*67e74705SXin Li }
154*67e74705SXin Li 
print(raw_ostream & OS,const PrintingPolicy & Policy)155*67e74705SXin Li void DeclarationName::print(raw_ostream &OS, const PrintingPolicy &Policy) {
156*67e74705SXin Li   DeclarationName &N = *this;
157*67e74705SXin Li   switch (N.getNameKind()) {
158*67e74705SXin Li   case DeclarationName::Identifier:
159*67e74705SXin Li     if (const IdentifierInfo *II = N.getAsIdentifierInfo())
160*67e74705SXin Li       OS << II->getName();
161*67e74705SXin Li     return;
162*67e74705SXin Li 
163*67e74705SXin Li   case DeclarationName::ObjCZeroArgSelector:
164*67e74705SXin Li   case DeclarationName::ObjCOneArgSelector:
165*67e74705SXin Li   case DeclarationName::ObjCMultiArgSelector:
166*67e74705SXin Li     N.getObjCSelector().print(OS);
167*67e74705SXin Li     return;
168*67e74705SXin Li 
169*67e74705SXin Li   case DeclarationName::CXXConstructorName:
170*67e74705SXin Li     return printCXXConstructorDestructorName(N.getCXXNameType(), OS, Policy);
171*67e74705SXin Li 
172*67e74705SXin Li   case DeclarationName::CXXDestructorName: {
173*67e74705SXin Li     OS << '~';
174*67e74705SXin Li     return printCXXConstructorDestructorName(N.getCXXNameType(), OS, Policy);
175*67e74705SXin Li   }
176*67e74705SXin Li 
177*67e74705SXin Li   case DeclarationName::CXXOperatorName: {
178*67e74705SXin Li     static const char* const OperatorNames[NUM_OVERLOADED_OPERATORS] = {
179*67e74705SXin Li       nullptr,
180*67e74705SXin Li #define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \
181*67e74705SXin Li       Spelling,
182*67e74705SXin Li #include "clang/Basic/OperatorKinds.def"
183*67e74705SXin Li     };
184*67e74705SXin Li     const char *OpName = OperatorNames[N.getCXXOverloadedOperator()];
185*67e74705SXin Li     assert(OpName && "not an overloaded operator");
186*67e74705SXin Li 
187*67e74705SXin Li     OS << "operator";
188*67e74705SXin Li     if (OpName[0] >= 'a' && OpName[0] <= 'z')
189*67e74705SXin Li       OS << ' ';
190*67e74705SXin Li     OS << OpName;
191*67e74705SXin Li     return;
192*67e74705SXin Li   }
193*67e74705SXin Li 
194*67e74705SXin Li   case DeclarationName::CXXLiteralOperatorName:
195*67e74705SXin Li     OS << "operator\"\"" << N.getCXXLiteralIdentifier()->getName();
196*67e74705SXin Li     return;
197*67e74705SXin Li 
198*67e74705SXin Li   case DeclarationName::CXXConversionFunctionName: {
199*67e74705SXin Li     OS << "operator ";
200*67e74705SXin Li     QualType Type = N.getCXXNameType();
201*67e74705SXin Li     if (const RecordType *Rec = Type->getAs<RecordType>()) {
202*67e74705SXin Li       OS << *Rec->getDecl();
203*67e74705SXin Li       return;
204*67e74705SXin Li     }
205*67e74705SXin Li     // We know we're printing C++ here, ensure we print 'bool' properly.
206*67e74705SXin Li     PrintingPolicy CXXPolicy = Policy;
207*67e74705SXin Li     CXXPolicy.adjustForCPlusPlus();
208*67e74705SXin Li     Type.print(OS, CXXPolicy);
209*67e74705SXin Li     return;
210*67e74705SXin Li   }
211*67e74705SXin Li   case DeclarationName::CXXUsingDirective:
212*67e74705SXin Li     OS << "<using-directive>";
213*67e74705SXin Li     return;
214*67e74705SXin Li   }
215*67e74705SXin Li 
216*67e74705SXin Li   llvm_unreachable("Unexpected declaration name kind");
217*67e74705SXin Li }
218*67e74705SXin Li 
operator <<(raw_ostream & OS,DeclarationName N)219*67e74705SXin Li raw_ostream &operator<<(raw_ostream &OS, DeclarationName N) {
220*67e74705SXin Li   LangOptions LO;
221*67e74705SXin Li   N.print(OS, PrintingPolicy(LO));
222*67e74705SXin Li   return OS;
223*67e74705SXin Li }
224*67e74705SXin Li 
225*67e74705SXin Li } // end namespace clang
226*67e74705SXin Li 
getNameKind() const227*67e74705SXin Li DeclarationName::NameKind DeclarationName::getNameKind() const {
228*67e74705SXin Li   switch (getStoredNameKind()) {
229*67e74705SXin Li   case StoredIdentifier:          return Identifier;
230*67e74705SXin Li   case StoredObjCZeroArgSelector: return ObjCZeroArgSelector;
231*67e74705SXin Li   case StoredObjCOneArgSelector:  return ObjCOneArgSelector;
232*67e74705SXin Li 
233*67e74705SXin Li   case StoredDeclarationNameExtra:
234*67e74705SXin Li     switch (getExtra()->ExtraKindOrNumArgs) {
235*67e74705SXin Li     case DeclarationNameExtra::CXXConstructor:
236*67e74705SXin Li       return CXXConstructorName;
237*67e74705SXin Li 
238*67e74705SXin Li     case DeclarationNameExtra::CXXDestructor:
239*67e74705SXin Li       return CXXDestructorName;
240*67e74705SXin Li 
241*67e74705SXin Li     case DeclarationNameExtra::CXXConversionFunction:
242*67e74705SXin Li       return CXXConversionFunctionName;
243*67e74705SXin Li 
244*67e74705SXin Li     case DeclarationNameExtra::CXXLiteralOperator:
245*67e74705SXin Li       return CXXLiteralOperatorName;
246*67e74705SXin Li 
247*67e74705SXin Li     case DeclarationNameExtra::CXXUsingDirective:
248*67e74705SXin Li       return CXXUsingDirective;
249*67e74705SXin Li 
250*67e74705SXin Li     default:
251*67e74705SXin Li       // Check if we have one of the CXXOperator* enumeration values.
252*67e74705SXin Li       if (getExtra()->ExtraKindOrNumArgs <
253*67e74705SXin Li             DeclarationNameExtra::CXXUsingDirective)
254*67e74705SXin Li         return CXXOperatorName;
255*67e74705SXin Li 
256*67e74705SXin Li       return ObjCMultiArgSelector;
257*67e74705SXin Li     }
258*67e74705SXin Li   }
259*67e74705SXin Li 
260*67e74705SXin Li   // Can't actually get here.
261*67e74705SXin Li   llvm_unreachable("This should be unreachable!");
262*67e74705SXin Li }
263*67e74705SXin Li 
isDependentName() const264*67e74705SXin Li bool DeclarationName::isDependentName() const {
265*67e74705SXin Li   QualType T = getCXXNameType();
266*67e74705SXin Li   return !T.isNull() && T->isDependentType();
267*67e74705SXin Li }
268*67e74705SXin Li 
getAsString() const269*67e74705SXin Li std::string DeclarationName::getAsString() const {
270*67e74705SXin Li   std::string Result;
271*67e74705SXin Li   llvm::raw_string_ostream OS(Result);
272*67e74705SXin Li   OS << *this;
273*67e74705SXin Li   return OS.str();
274*67e74705SXin Li }
275*67e74705SXin Li 
getCXXNameType() const276*67e74705SXin Li QualType DeclarationName::getCXXNameType() const {
277*67e74705SXin Li   if (CXXSpecialName *CXXName = getAsCXXSpecialName())
278*67e74705SXin Li     return CXXName->Type;
279*67e74705SXin Li   else
280*67e74705SXin Li     return QualType();
281*67e74705SXin Li }
282*67e74705SXin Li 
getCXXOverloadedOperator() const283*67e74705SXin Li OverloadedOperatorKind DeclarationName::getCXXOverloadedOperator() const {
284*67e74705SXin Li   if (CXXOperatorIdName *CXXOp = getAsCXXOperatorIdName()) {
285*67e74705SXin Li     unsigned value
286*67e74705SXin Li       = CXXOp->ExtraKindOrNumArgs - DeclarationNameExtra::CXXConversionFunction;
287*67e74705SXin Li     return static_cast<OverloadedOperatorKind>(value);
288*67e74705SXin Li   } else {
289*67e74705SXin Li     return OO_None;
290*67e74705SXin Li   }
291*67e74705SXin Li }
292*67e74705SXin Li 
getCXXLiteralIdentifier() const293*67e74705SXin Li IdentifierInfo *DeclarationName::getCXXLiteralIdentifier() const {
294*67e74705SXin Li   if (CXXLiteralOperatorIdName *CXXLit = getAsCXXLiteralOperatorIdName())
295*67e74705SXin Li     return CXXLit->ID;
296*67e74705SXin Li   else
297*67e74705SXin Li     return nullptr;
298*67e74705SXin Li }
299*67e74705SXin Li 
getFETokenInfoAsVoidSlow() const300*67e74705SXin Li void *DeclarationName::getFETokenInfoAsVoidSlow() const {
301*67e74705SXin Li   switch (getNameKind()) {
302*67e74705SXin Li   case Identifier:
303*67e74705SXin Li     llvm_unreachable("Handled by getFETokenInfo()");
304*67e74705SXin Li 
305*67e74705SXin Li   case CXXConstructorName:
306*67e74705SXin Li   case CXXDestructorName:
307*67e74705SXin Li   case CXXConversionFunctionName:
308*67e74705SXin Li     return getAsCXXSpecialName()->FETokenInfo;
309*67e74705SXin Li 
310*67e74705SXin Li   case CXXOperatorName:
311*67e74705SXin Li     return getAsCXXOperatorIdName()->FETokenInfo;
312*67e74705SXin Li 
313*67e74705SXin Li   case CXXLiteralOperatorName:
314*67e74705SXin Li     return getAsCXXLiteralOperatorIdName()->FETokenInfo;
315*67e74705SXin Li 
316*67e74705SXin Li   default:
317*67e74705SXin Li     llvm_unreachable("Declaration name has no FETokenInfo");
318*67e74705SXin Li   }
319*67e74705SXin Li }
320*67e74705SXin Li 
setFETokenInfo(void * T)321*67e74705SXin Li void DeclarationName::setFETokenInfo(void *T) {
322*67e74705SXin Li   switch (getNameKind()) {
323*67e74705SXin Li   case Identifier:
324*67e74705SXin Li     getAsIdentifierInfo()->setFETokenInfo(T);
325*67e74705SXin Li     break;
326*67e74705SXin Li 
327*67e74705SXin Li   case CXXConstructorName:
328*67e74705SXin Li   case CXXDestructorName:
329*67e74705SXin Li   case CXXConversionFunctionName:
330*67e74705SXin Li     getAsCXXSpecialName()->FETokenInfo = T;
331*67e74705SXin Li     break;
332*67e74705SXin Li 
333*67e74705SXin Li   case CXXOperatorName:
334*67e74705SXin Li     getAsCXXOperatorIdName()->FETokenInfo = T;
335*67e74705SXin Li     break;
336*67e74705SXin Li 
337*67e74705SXin Li   case CXXLiteralOperatorName:
338*67e74705SXin Li     getAsCXXLiteralOperatorIdName()->FETokenInfo = T;
339*67e74705SXin Li     break;
340*67e74705SXin Li 
341*67e74705SXin Li   default:
342*67e74705SXin Li     llvm_unreachable("Declaration name has no FETokenInfo");
343*67e74705SXin Li   }
344*67e74705SXin Li }
345*67e74705SXin Li 
getUsingDirectiveName()346*67e74705SXin Li DeclarationName DeclarationName::getUsingDirectiveName() {
347*67e74705SXin Li   // Single instance of DeclarationNameExtra for using-directive
348*67e74705SXin Li   static const DeclarationNameExtra UDirExtra =
349*67e74705SXin Li     { DeclarationNameExtra::CXXUsingDirective };
350*67e74705SXin Li 
351*67e74705SXin Li   uintptr_t Ptr = reinterpret_cast<uintptr_t>(&UDirExtra);
352*67e74705SXin Li   Ptr |= StoredDeclarationNameExtra;
353*67e74705SXin Li 
354*67e74705SXin Li   return DeclarationName(Ptr);
355*67e74705SXin Li }
356*67e74705SXin Li 
dump() const357*67e74705SXin Li LLVM_DUMP_METHOD void DeclarationName::dump() const {
358*67e74705SXin Li   llvm::errs() << *this << '\n';
359*67e74705SXin Li }
360*67e74705SXin Li 
DeclarationNameTable(const ASTContext & C)361*67e74705SXin Li DeclarationNameTable::DeclarationNameTable(const ASTContext &C) : Ctx(C) {
362*67e74705SXin Li   CXXSpecialNamesImpl = new llvm::FoldingSet<CXXSpecialName>;
363*67e74705SXin Li   CXXLiteralOperatorNames = new llvm::FoldingSet<CXXLiteralOperatorIdName>;
364*67e74705SXin Li 
365*67e74705SXin Li   // Initialize the overloaded operator names.
366*67e74705SXin Li   CXXOperatorNames = new (Ctx) CXXOperatorIdName[NUM_OVERLOADED_OPERATORS];
367*67e74705SXin Li   for (unsigned Op = 0; Op < NUM_OVERLOADED_OPERATORS; ++Op) {
368*67e74705SXin Li     CXXOperatorNames[Op].ExtraKindOrNumArgs
369*67e74705SXin Li       = Op + DeclarationNameExtra::CXXConversionFunction;
370*67e74705SXin Li     CXXOperatorNames[Op].FETokenInfo = nullptr;
371*67e74705SXin Li   }
372*67e74705SXin Li }
373*67e74705SXin Li 
~DeclarationNameTable()374*67e74705SXin Li DeclarationNameTable::~DeclarationNameTable() {
375*67e74705SXin Li   llvm::FoldingSet<CXXSpecialName> *SpecialNames =
376*67e74705SXin Li     static_cast<llvm::FoldingSet<CXXSpecialName>*>(CXXSpecialNamesImpl);
377*67e74705SXin Li   llvm::FoldingSet<CXXLiteralOperatorIdName> *LiteralNames
378*67e74705SXin Li     = static_cast<llvm::FoldingSet<CXXLiteralOperatorIdName>*>
379*67e74705SXin Li         (CXXLiteralOperatorNames);
380*67e74705SXin Li 
381*67e74705SXin Li   delete SpecialNames;
382*67e74705SXin Li   delete LiteralNames;
383*67e74705SXin Li }
384*67e74705SXin Li 
getCXXConstructorName(CanQualType Ty)385*67e74705SXin Li DeclarationName DeclarationNameTable::getCXXConstructorName(CanQualType Ty) {
386*67e74705SXin Li   return getCXXSpecialName(DeclarationName::CXXConstructorName,
387*67e74705SXin Li                            Ty.getUnqualifiedType());
388*67e74705SXin Li }
389*67e74705SXin Li 
getCXXDestructorName(CanQualType Ty)390*67e74705SXin Li DeclarationName DeclarationNameTable::getCXXDestructorName(CanQualType Ty) {
391*67e74705SXin Li   return getCXXSpecialName(DeclarationName::CXXDestructorName,
392*67e74705SXin Li                            Ty.getUnqualifiedType());
393*67e74705SXin Li }
394*67e74705SXin Li 
395*67e74705SXin Li DeclarationName
getCXXConversionFunctionName(CanQualType Ty)396*67e74705SXin Li DeclarationNameTable::getCXXConversionFunctionName(CanQualType Ty) {
397*67e74705SXin Li   return getCXXSpecialName(DeclarationName::CXXConversionFunctionName, Ty);
398*67e74705SXin Li }
399*67e74705SXin Li 
400*67e74705SXin Li DeclarationName
getCXXSpecialName(DeclarationName::NameKind Kind,CanQualType Ty)401*67e74705SXin Li DeclarationNameTable::getCXXSpecialName(DeclarationName::NameKind Kind,
402*67e74705SXin Li                                         CanQualType Ty) {
403*67e74705SXin Li   assert(Kind >= DeclarationName::CXXConstructorName &&
404*67e74705SXin Li          Kind <= DeclarationName::CXXConversionFunctionName &&
405*67e74705SXin Li          "Kind must be a C++ special name kind");
406*67e74705SXin Li   llvm::FoldingSet<CXXSpecialName> *SpecialNames
407*67e74705SXin Li     = static_cast<llvm::FoldingSet<CXXSpecialName>*>(CXXSpecialNamesImpl);
408*67e74705SXin Li 
409*67e74705SXin Li   DeclarationNameExtra::ExtraKind EKind;
410*67e74705SXin Li   switch (Kind) {
411*67e74705SXin Li   case DeclarationName::CXXConstructorName:
412*67e74705SXin Li     EKind = DeclarationNameExtra::CXXConstructor;
413*67e74705SXin Li     assert(!Ty.hasQualifiers() &&"Constructor type must be unqualified");
414*67e74705SXin Li     break;
415*67e74705SXin Li   case DeclarationName::CXXDestructorName:
416*67e74705SXin Li     EKind = DeclarationNameExtra::CXXDestructor;
417*67e74705SXin Li     assert(!Ty.hasQualifiers() && "Destructor type must be unqualified");
418*67e74705SXin Li     break;
419*67e74705SXin Li   case DeclarationName::CXXConversionFunctionName:
420*67e74705SXin Li     EKind = DeclarationNameExtra::CXXConversionFunction;
421*67e74705SXin Li     break;
422*67e74705SXin Li   default:
423*67e74705SXin Li     return DeclarationName();
424*67e74705SXin Li   }
425*67e74705SXin Li 
426*67e74705SXin Li   // Unique selector, to guarantee there is one per name.
427*67e74705SXin Li   llvm::FoldingSetNodeID ID;
428*67e74705SXin Li   ID.AddInteger(EKind);
429*67e74705SXin Li   ID.AddPointer(Ty.getAsOpaquePtr());
430*67e74705SXin Li 
431*67e74705SXin Li   void *InsertPos = nullptr;
432*67e74705SXin Li   if (CXXSpecialName *Name = SpecialNames->FindNodeOrInsertPos(ID, InsertPos))
433*67e74705SXin Li     return DeclarationName(Name);
434*67e74705SXin Li 
435*67e74705SXin Li   CXXSpecialName *SpecialName = new (Ctx) CXXSpecialName;
436*67e74705SXin Li   SpecialName->ExtraKindOrNumArgs = EKind;
437*67e74705SXin Li   SpecialName->Type = Ty;
438*67e74705SXin Li   SpecialName->FETokenInfo = nullptr;
439*67e74705SXin Li 
440*67e74705SXin Li   SpecialNames->InsertNode(SpecialName, InsertPos);
441*67e74705SXin Li   return DeclarationName(SpecialName);
442*67e74705SXin Li }
443*67e74705SXin Li 
444*67e74705SXin Li DeclarationName
getCXXOperatorName(OverloadedOperatorKind Op)445*67e74705SXin Li DeclarationNameTable::getCXXOperatorName(OverloadedOperatorKind Op) {
446*67e74705SXin Li   return DeclarationName(&CXXOperatorNames[(unsigned)Op]);
447*67e74705SXin Li }
448*67e74705SXin Li 
449*67e74705SXin Li DeclarationName
getCXXLiteralOperatorName(IdentifierInfo * II)450*67e74705SXin Li DeclarationNameTable::getCXXLiteralOperatorName(IdentifierInfo *II) {
451*67e74705SXin Li   llvm::FoldingSet<CXXLiteralOperatorIdName> *LiteralNames
452*67e74705SXin Li     = static_cast<llvm::FoldingSet<CXXLiteralOperatorIdName>*>
453*67e74705SXin Li                                                       (CXXLiteralOperatorNames);
454*67e74705SXin Li 
455*67e74705SXin Li   llvm::FoldingSetNodeID ID;
456*67e74705SXin Li   ID.AddPointer(II);
457*67e74705SXin Li 
458*67e74705SXin Li   void *InsertPos = nullptr;
459*67e74705SXin Li   if (CXXLiteralOperatorIdName *Name =
460*67e74705SXin Li                                LiteralNames->FindNodeOrInsertPos(ID, InsertPos))
461*67e74705SXin Li     return DeclarationName (Name);
462*67e74705SXin Li 
463*67e74705SXin Li   CXXLiteralOperatorIdName *LiteralName = new (Ctx) CXXLiteralOperatorIdName;
464*67e74705SXin Li   LiteralName->ExtraKindOrNumArgs = DeclarationNameExtra::CXXLiteralOperator;
465*67e74705SXin Li   LiteralName->ID = II;
466*67e74705SXin Li   LiteralName->FETokenInfo = nullptr;
467*67e74705SXin Li 
468*67e74705SXin Li   LiteralNames->InsertNode(LiteralName, InsertPos);
469*67e74705SXin Li   return DeclarationName(LiteralName);
470*67e74705SXin Li }
471*67e74705SXin Li 
DeclarationNameLoc(DeclarationName Name)472*67e74705SXin Li DeclarationNameLoc::DeclarationNameLoc(DeclarationName Name) {
473*67e74705SXin Li   switch (Name.getNameKind()) {
474*67e74705SXin Li   case DeclarationName::Identifier:
475*67e74705SXin Li     break;
476*67e74705SXin Li   case DeclarationName::CXXConstructorName:
477*67e74705SXin Li   case DeclarationName::CXXDestructorName:
478*67e74705SXin Li   case DeclarationName::CXXConversionFunctionName:
479*67e74705SXin Li     NamedType.TInfo = nullptr;
480*67e74705SXin Li     break;
481*67e74705SXin Li   case DeclarationName::CXXOperatorName:
482*67e74705SXin Li     CXXOperatorName.BeginOpNameLoc = SourceLocation().getRawEncoding();
483*67e74705SXin Li     CXXOperatorName.EndOpNameLoc = SourceLocation().getRawEncoding();
484*67e74705SXin Li     break;
485*67e74705SXin Li   case DeclarationName::CXXLiteralOperatorName:
486*67e74705SXin Li     CXXLiteralOperatorName.OpNameLoc = SourceLocation().getRawEncoding();
487*67e74705SXin Li     break;
488*67e74705SXin Li   case DeclarationName::ObjCZeroArgSelector:
489*67e74705SXin Li   case DeclarationName::ObjCOneArgSelector:
490*67e74705SXin Li   case DeclarationName::ObjCMultiArgSelector:
491*67e74705SXin Li     // FIXME: ?
492*67e74705SXin Li     break;
493*67e74705SXin Li   case DeclarationName::CXXUsingDirective:
494*67e74705SXin Li     break;
495*67e74705SXin Li   }
496*67e74705SXin Li }
497*67e74705SXin Li 
containsUnexpandedParameterPack() const498*67e74705SXin Li bool DeclarationNameInfo::containsUnexpandedParameterPack() const {
499*67e74705SXin Li   switch (Name.getNameKind()) {
500*67e74705SXin Li   case DeclarationName::Identifier:
501*67e74705SXin Li   case DeclarationName::ObjCZeroArgSelector:
502*67e74705SXin Li   case DeclarationName::ObjCOneArgSelector:
503*67e74705SXin Li   case DeclarationName::ObjCMultiArgSelector:
504*67e74705SXin Li   case DeclarationName::CXXOperatorName:
505*67e74705SXin Li   case DeclarationName::CXXLiteralOperatorName:
506*67e74705SXin Li   case DeclarationName::CXXUsingDirective:
507*67e74705SXin Li     return false;
508*67e74705SXin Li 
509*67e74705SXin Li   case DeclarationName::CXXConstructorName:
510*67e74705SXin Li   case DeclarationName::CXXDestructorName:
511*67e74705SXin Li   case DeclarationName::CXXConversionFunctionName:
512*67e74705SXin Li     if (TypeSourceInfo *TInfo = LocInfo.NamedType.TInfo)
513*67e74705SXin Li       return TInfo->getType()->containsUnexpandedParameterPack();
514*67e74705SXin Li 
515*67e74705SXin Li     return Name.getCXXNameType()->containsUnexpandedParameterPack();
516*67e74705SXin Li   }
517*67e74705SXin Li   llvm_unreachable("All name kinds handled.");
518*67e74705SXin Li }
519*67e74705SXin Li 
isInstantiationDependent() const520*67e74705SXin Li bool DeclarationNameInfo::isInstantiationDependent() const {
521*67e74705SXin Li   switch (Name.getNameKind()) {
522*67e74705SXin Li   case DeclarationName::Identifier:
523*67e74705SXin Li   case DeclarationName::ObjCZeroArgSelector:
524*67e74705SXin Li   case DeclarationName::ObjCOneArgSelector:
525*67e74705SXin Li   case DeclarationName::ObjCMultiArgSelector:
526*67e74705SXin Li   case DeclarationName::CXXOperatorName:
527*67e74705SXin Li   case DeclarationName::CXXLiteralOperatorName:
528*67e74705SXin Li   case DeclarationName::CXXUsingDirective:
529*67e74705SXin Li     return false;
530*67e74705SXin Li 
531*67e74705SXin Li   case DeclarationName::CXXConstructorName:
532*67e74705SXin Li   case DeclarationName::CXXDestructorName:
533*67e74705SXin Li   case DeclarationName::CXXConversionFunctionName:
534*67e74705SXin Li     if (TypeSourceInfo *TInfo = LocInfo.NamedType.TInfo)
535*67e74705SXin Li       return TInfo->getType()->isInstantiationDependentType();
536*67e74705SXin Li 
537*67e74705SXin Li     return Name.getCXXNameType()->isInstantiationDependentType();
538*67e74705SXin Li   }
539*67e74705SXin Li   llvm_unreachable("All name kinds handled.");
540*67e74705SXin Li }
541*67e74705SXin Li 
getAsString() const542*67e74705SXin Li std::string DeclarationNameInfo::getAsString() const {
543*67e74705SXin Li   std::string Result;
544*67e74705SXin Li   llvm::raw_string_ostream OS(Result);
545*67e74705SXin Li   printName(OS);
546*67e74705SXin Li   return OS.str();
547*67e74705SXin Li }
548*67e74705SXin Li 
printName(raw_ostream & OS) const549*67e74705SXin Li void DeclarationNameInfo::printName(raw_ostream &OS) const {
550*67e74705SXin Li   switch (Name.getNameKind()) {
551*67e74705SXin Li   case DeclarationName::Identifier:
552*67e74705SXin Li   case DeclarationName::ObjCZeroArgSelector:
553*67e74705SXin Li   case DeclarationName::ObjCOneArgSelector:
554*67e74705SXin Li   case DeclarationName::ObjCMultiArgSelector:
555*67e74705SXin Li   case DeclarationName::CXXOperatorName:
556*67e74705SXin Li   case DeclarationName::CXXLiteralOperatorName:
557*67e74705SXin Li   case DeclarationName::CXXUsingDirective:
558*67e74705SXin Li     OS << Name;
559*67e74705SXin Li     return;
560*67e74705SXin Li 
561*67e74705SXin Li   case DeclarationName::CXXConstructorName:
562*67e74705SXin Li   case DeclarationName::CXXDestructorName:
563*67e74705SXin Li   case DeclarationName::CXXConversionFunctionName:
564*67e74705SXin Li     if (TypeSourceInfo *TInfo = LocInfo.NamedType.TInfo) {
565*67e74705SXin Li       if (Name.getNameKind() == DeclarationName::CXXDestructorName)
566*67e74705SXin Li         OS << '~';
567*67e74705SXin Li       else if (Name.getNameKind() == DeclarationName::CXXConversionFunctionName)
568*67e74705SXin Li         OS << "operator ";
569*67e74705SXin Li       LangOptions LO;
570*67e74705SXin Li       LO.CPlusPlus = true;
571*67e74705SXin Li       LO.Bool = true;
572*67e74705SXin Li       OS << TInfo->getType().getAsString(PrintingPolicy(LO));
573*67e74705SXin Li     } else
574*67e74705SXin Li       OS << Name;
575*67e74705SXin Li     return;
576*67e74705SXin Li   }
577*67e74705SXin Li   llvm_unreachable("Unexpected declaration name kind");
578*67e74705SXin Li }
579*67e74705SXin Li 
getEndLoc() const580*67e74705SXin Li SourceLocation DeclarationNameInfo::getEndLoc() const {
581*67e74705SXin Li   switch (Name.getNameKind()) {
582*67e74705SXin Li   case DeclarationName::Identifier:
583*67e74705SXin Li     return NameLoc;
584*67e74705SXin Li 
585*67e74705SXin Li   case DeclarationName::CXXOperatorName: {
586*67e74705SXin Li     unsigned raw = LocInfo.CXXOperatorName.EndOpNameLoc;
587*67e74705SXin Li     return SourceLocation::getFromRawEncoding(raw);
588*67e74705SXin Li   }
589*67e74705SXin Li 
590*67e74705SXin Li   case DeclarationName::CXXLiteralOperatorName: {
591*67e74705SXin Li     unsigned raw = LocInfo.CXXLiteralOperatorName.OpNameLoc;
592*67e74705SXin Li     return SourceLocation::getFromRawEncoding(raw);
593*67e74705SXin Li   }
594*67e74705SXin Li 
595*67e74705SXin Li   case DeclarationName::CXXConstructorName:
596*67e74705SXin Li   case DeclarationName::CXXDestructorName:
597*67e74705SXin Li   case DeclarationName::CXXConversionFunctionName:
598*67e74705SXin Li     if (TypeSourceInfo *TInfo = LocInfo.NamedType.TInfo)
599*67e74705SXin Li       return TInfo->getTypeLoc().getEndLoc();
600*67e74705SXin Li     else
601*67e74705SXin Li       return NameLoc;
602*67e74705SXin Li 
603*67e74705SXin Li     // DNInfo work in progress: FIXME.
604*67e74705SXin Li   case DeclarationName::ObjCZeroArgSelector:
605*67e74705SXin Li   case DeclarationName::ObjCOneArgSelector:
606*67e74705SXin Li   case DeclarationName::ObjCMultiArgSelector:
607*67e74705SXin Li   case DeclarationName::CXXUsingDirective:
608*67e74705SXin Li     return NameLoc;
609*67e74705SXin Li   }
610*67e74705SXin Li   llvm_unreachable("Unexpected declaration name kind");
611*67e74705SXin Li }
612