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