annotate clang/lib/AST/DeclarationName.cpp @ 176:de4ac79aef9d

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 17:13:11 +0900
parents 0572611fdcc8
children 2e18cbf3894f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
150
anatofuz
parents:
diff changeset
1 //===- DeclarationName.cpp - Declaration names implementation -------------===//
anatofuz
parents:
diff changeset
2 //
anatofuz
parents:
diff changeset
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
anatofuz
parents:
diff changeset
4 // See https://llvm.org/LICENSE.txt for license information.
anatofuz
parents:
diff changeset
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
anatofuz
parents:
diff changeset
6 //
anatofuz
parents:
diff changeset
7 //===----------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
8 //
anatofuz
parents:
diff changeset
9 // This file implements the DeclarationName and DeclarationNameTable
anatofuz
parents:
diff changeset
10 // classes.
anatofuz
parents:
diff changeset
11 //
anatofuz
parents:
diff changeset
12 //===----------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
13
anatofuz
parents:
diff changeset
14 #include "clang/AST/DeclarationName.h"
anatofuz
parents:
diff changeset
15 #include "clang/AST/ASTContext.h"
anatofuz
parents:
diff changeset
16 #include "clang/AST/Decl.h"
anatofuz
parents:
diff changeset
17 #include "clang/AST/DeclBase.h"
anatofuz
parents:
diff changeset
18 #include "clang/AST/DeclCXX.h"
anatofuz
parents:
diff changeset
19 #include "clang/AST/DeclTemplate.h"
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
20 #include "clang/AST/OpenMPClause.h"
150
anatofuz
parents:
diff changeset
21 #include "clang/AST/PrettyPrinter.h"
anatofuz
parents:
diff changeset
22 #include "clang/AST/Type.h"
anatofuz
parents:
diff changeset
23 #include "clang/AST/TypeLoc.h"
anatofuz
parents:
diff changeset
24 #include "clang/AST/TypeOrdering.h"
anatofuz
parents:
diff changeset
25 #include "clang/Basic/IdentifierTable.h"
anatofuz
parents:
diff changeset
26 #include "clang/Basic/LLVM.h"
anatofuz
parents:
diff changeset
27 #include "clang/Basic/LangOptions.h"
anatofuz
parents:
diff changeset
28 #include "clang/Basic/OperatorKinds.h"
anatofuz
parents:
diff changeset
29 #include "clang/Basic/SourceLocation.h"
anatofuz
parents:
diff changeset
30 #include "llvm/ADT/FoldingSet.h"
anatofuz
parents:
diff changeset
31 #include "llvm/Support/Casting.h"
anatofuz
parents:
diff changeset
32 #include "llvm/Support/Compiler.h"
anatofuz
parents:
diff changeset
33 #include "llvm/Support/ErrorHandling.h"
anatofuz
parents:
diff changeset
34 #include "llvm/Support/raw_ostream.h"
anatofuz
parents:
diff changeset
35 #include <algorithm>
anatofuz
parents:
diff changeset
36 #include <cassert>
anatofuz
parents:
diff changeset
37 #include <cstdint>
anatofuz
parents:
diff changeset
38 #include <string>
anatofuz
parents:
diff changeset
39
anatofuz
parents:
diff changeset
40 using namespace clang;
anatofuz
parents:
diff changeset
41
anatofuz
parents:
diff changeset
42 static int compareInt(unsigned A, unsigned B) {
anatofuz
parents:
diff changeset
43 return (A < B ? -1 : (A > B ? 1 : 0));
anatofuz
parents:
diff changeset
44 }
anatofuz
parents:
diff changeset
45
anatofuz
parents:
diff changeset
46 int DeclarationName::compare(DeclarationName LHS, DeclarationName RHS) {
anatofuz
parents:
diff changeset
47 if (LHS.getNameKind() != RHS.getNameKind())
anatofuz
parents:
diff changeset
48 return (LHS.getNameKind() < RHS.getNameKind() ? -1 : 1);
anatofuz
parents:
diff changeset
49
anatofuz
parents:
diff changeset
50 switch (LHS.getNameKind()) {
anatofuz
parents:
diff changeset
51 case DeclarationName::Identifier: {
anatofuz
parents:
diff changeset
52 IdentifierInfo *LII = LHS.castAsIdentifierInfo();
anatofuz
parents:
diff changeset
53 IdentifierInfo *RII = RHS.castAsIdentifierInfo();
anatofuz
parents:
diff changeset
54 if (!LII)
anatofuz
parents:
diff changeset
55 return RII ? -1 : 0;
anatofuz
parents:
diff changeset
56 if (!RII)
anatofuz
parents:
diff changeset
57 return 1;
anatofuz
parents:
diff changeset
58
anatofuz
parents:
diff changeset
59 return LII->getName().compare(RII->getName());
anatofuz
parents:
diff changeset
60 }
anatofuz
parents:
diff changeset
61
anatofuz
parents:
diff changeset
62 case DeclarationName::ObjCZeroArgSelector:
anatofuz
parents:
diff changeset
63 case DeclarationName::ObjCOneArgSelector:
anatofuz
parents:
diff changeset
64 case DeclarationName::ObjCMultiArgSelector: {
anatofuz
parents:
diff changeset
65 Selector LHSSelector = LHS.getObjCSelector();
anatofuz
parents:
diff changeset
66 Selector RHSSelector = RHS.getObjCSelector();
anatofuz
parents:
diff changeset
67 // getNumArgs for ZeroArgSelector returns 0, but we still need to compare.
anatofuz
parents:
diff changeset
68 if (LHS.getNameKind() == DeclarationName::ObjCZeroArgSelector &&
anatofuz
parents:
diff changeset
69 RHS.getNameKind() == DeclarationName::ObjCZeroArgSelector) {
anatofuz
parents:
diff changeset
70 return LHSSelector.getAsIdentifierInfo()->getName().compare(
anatofuz
parents:
diff changeset
71 RHSSelector.getAsIdentifierInfo()->getName());
anatofuz
parents:
diff changeset
72 }
anatofuz
parents:
diff changeset
73 unsigned LN = LHSSelector.getNumArgs(), RN = RHSSelector.getNumArgs();
anatofuz
parents:
diff changeset
74 for (unsigned I = 0, N = std::min(LN, RN); I != N; ++I) {
anatofuz
parents:
diff changeset
75 switch (LHSSelector.getNameForSlot(I).compare(
anatofuz
parents:
diff changeset
76 RHSSelector.getNameForSlot(I))) {
anatofuz
parents:
diff changeset
77 case -1:
anatofuz
parents:
diff changeset
78 return -1;
anatofuz
parents:
diff changeset
79 case 1:
anatofuz
parents:
diff changeset
80 return 1;
anatofuz
parents:
diff changeset
81 default:
anatofuz
parents:
diff changeset
82 break;
anatofuz
parents:
diff changeset
83 }
anatofuz
parents:
diff changeset
84 }
anatofuz
parents:
diff changeset
85
anatofuz
parents:
diff changeset
86 return compareInt(LN, RN);
anatofuz
parents:
diff changeset
87 }
anatofuz
parents:
diff changeset
88
anatofuz
parents:
diff changeset
89 case DeclarationName::CXXConstructorName:
anatofuz
parents:
diff changeset
90 case DeclarationName::CXXDestructorName:
anatofuz
parents:
diff changeset
91 case DeclarationName::CXXConversionFunctionName:
anatofuz
parents:
diff changeset
92 if (QualTypeOrdering()(LHS.getCXXNameType(), RHS.getCXXNameType()))
anatofuz
parents:
diff changeset
93 return -1;
anatofuz
parents:
diff changeset
94 if (QualTypeOrdering()(RHS.getCXXNameType(), LHS.getCXXNameType()))
anatofuz
parents:
diff changeset
95 return 1;
anatofuz
parents:
diff changeset
96 return 0;
anatofuz
parents:
diff changeset
97
anatofuz
parents:
diff changeset
98 case DeclarationName::CXXDeductionGuideName:
anatofuz
parents:
diff changeset
99 // We never want to compare deduction guide names for templates from
anatofuz
parents:
diff changeset
100 // different scopes, so just compare the template-name.
anatofuz
parents:
diff changeset
101 return compare(LHS.getCXXDeductionGuideTemplate()->getDeclName(),
anatofuz
parents:
diff changeset
102 RHS.getCXXDeductionGuideTemplate()->getDeclName());
anatofuz
parents:
diff changeset
103
anatofuz
parents:
diff changeset
104 case DeclarationName::CXXOperatorName:
anatofuz
parents:
diff changeset
105 return compareInt(LHS.getCXXOverloadedOperator(),
anatofuz
parents:
diff changeset
106 RHS.getCXXOverloadedOperator());
anatofuz
parents:
diff changeset
107
anatofuz
parents:
diff changeset
108 case DeclarationName::CXXLiteralOperatorName:
anatofuz
parents:
diff changeset
109 return LHS.getCXXLiteralIdentifier()->getName().compare(
anatofuz
parents:
diff changeset
110 RHS.getCXXLiteralIdentifier()->getName());
anatofuz
parents:
diff changeset
111
anatofuz
parents:
diff changeset
112 case DeclarationName::CXXUsingDirective:
anatofuz
parents:
diff changeset
113 return 0;
anatofuz
parents:
diff changeset
114 }
anatofuz
parents:
diff changeset
115
anatofuz
parents:
diff changeset
116 llvm_unreachable("Invalid DeclarationName Kind!");
anatofuz
parents:
diff changeset
117 }
anatofuz
parents:
diff changeset
118
anatofuz
parents:
diff changeset
119 static void printCXXConstructorDestructorName(QualType ClassType,
anatofuz
parents:
diff changeset
120 raw_ostream &OS,
anatofuz
parents:
diff changeset
121 PrintingPolicy Policy) {
anatofuz
parents:
diff changeset
122 // We know we're printing C++ here. Ensure we print types properly.
anatofuz
parents:
diff changeset
123 Policy.adjustForCPlusPlus();
anatofuz
parents:
diff changeset
124
anatofuz
parents:
diff changeset
125 if (const RecordType *ClassRec = ClassType->getAs<RecordType>()) {
anatofuz
parents:
diff changeset
126 OS << *ClassRec->getDecl();
anatofuz
parents:
diff changeset
127 return;
anatofuz
parents:
diff changeset
128 }
anatofuz
parents:
diff changeset
129 if (Policy.SuppressTemplateArgsInCXXConstructors) {
anatofuz
parents:
diff changeset
130 if (auto *InjTy = ClassType->getAs<InjectedClassNameType>()) {
anatofuz
parents:
diff changeset
131 OS << *InjTy->getDecl();
anatofuz
parents:
diff changeset
132 return;
anatofuz
parents:
diff changeset
133 }
anatofuz
parents:
diff changeset
134 }
anatofuz
parents:
diff changeset
135 ClassType.print(OS, Policy);
anatofuz
parents:
diff changeset
136 }
anatofuz
parents:
diff changeset
137
anatofuz
parents:
diff changeset
138 void DeclarationName::print(raw_ostream &OS,
anatofuz
parents:
diff changeset
139 const PrintingPolicy &Policy) const {
anatofuz
parents:
diff changeset
140 switch (getNameKind()) {
anatofuz
parents:
diff changeset
141 case DeclarationName::Identifier:
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
142 if (const IdentifierInfo *II = getAsIdentifierInfo()) {
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
143 StringRef Name = II->getName();
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
144 // If this is a mangled OpenMP variant name we strip off the mangling for
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
145 // printing. It should not be visible to the user at all.
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
146 if (II->isMangledOpenMPVariantName()) {
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
147 std::pair<StringRef, StringRef> NameContextPair =
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
148 Name.split(getOpenMPVariantManglingSeparatorStr());
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
149 OS << NameContextPair.first << "["
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
150 << OMPTraitInfo(NameContextPair.second) << "]";
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
151 } else {
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
152 OS << Name;
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
153 }
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
154 }
150
anatofuz
parents:
diff changeset
155 return;
anatofuz
parents:
diff changeset
156
anatofuz
parents:
diff changeset
157 case DeclarationName::ObjCZeroArgSelector:
anatofuz
parents:
diff changeset
158 case DeclarationName::ObjCOneArgSelector:
anatofuz
parents:
diff changeset
159 case DeclarationName::ObjCMultiArgSelector:
anatofuz
parents:
diff changeset
160 getObjCSelector().print(OS);
anatofuz
parents:
diff changeset
161 return;
anatofuz
parents:
diff changeset
162
anatofuz
parents:
diff changeset
163 case DeclarationName::CXXConstructorName:
anatofuz
parents:
diff changeset
164 return printCXXConstructorDestructorName(getCXXNameType(), OS, Policy);
anatofuz
parents:
diff changeset
165
anatofuz
parents:
diff changeset
166 case DeclarationName::CXXDestructorName:
anatofuz
parents:
diff changeset
167 OS << '~';
anatofuz
parents:
diff changeset
168 return printCXXConstructorDestructorName(getCXXNameType(), OS, Policy);
anatofuz
parents:
diff changeset
169
anatofuz
parents:
diff changeset
170 case DeclarationName::CXXDeductionGuideName:
anatofuz
parents:
diff changeset
171 OS << "<deduction guide for ";
anatofuz
parents:
diff changeset
172 getCXXDeductionGuideTemplate()->getDeclName().print(OS, Policy);
anatofuz
parents:
diff changeset
173 OS << '>';
anatofuz
parents:
diff changeset
174 return;
anatofuz
parents:
diff changeset
175
anatofuz
parents:
diff changeset
176 case DeclarationName::CXXOperatorName: {
anatofuz
parents:
diff changeset
177 const char *OpName = getOperatorSpelling(getCXXOverloadedOperator());
anatofuz
parents:
diff changeset
178 assert(OpName && "not an overloaded operator");
anatofuz
parents:
diff changeset
179
anatofuz
parents:
diff changeset
180 OS << "operator";
anatofuz
parents:
diff changeset
181 if (OpName[0] >= 'a' && OpName[0] <= 'z')
anatofuz
parents:
diff changeset
182 OS << ' ';
anatofuz
parents:
diff changeset
183 OS << OpName;
anatofuz
parents:
diff changeset
184 return;
anatofuz
parents:
diff changeset
185 }
anatofuz
parents:
diff changeset
186
anatofuz
parents:
diff changeset
187 case DeclarationName::CXXLiteralOperatorName:
anatofuz
parents:
diff changeset
188 OS << "operator\"\"" << getCXXLiteralIdentifier()->getName();
anatofuz
parents:
diff changeset
189 return;
anatofuz
parents:
diff changeset
190
anatofuz
parents:
diff changeset
191 case DeclarationName::CXXConversionFunctionName: {
anatofuz
parents:
diff changeset
192 OS << "operator ";
anatofuz
parents:
diff changeset
193 QualType Type = getCXXNameType();
anatofuz
parents:
diff changeset
194 if (const RecordType *Rec = Type->getAs<RecordType>()) {
anatofuz
parents:
diff changeset
195 OS << *Rec->getDecl();
anatofuz
parents:
diff changeset
196 return;
anatofuz
parents:
diff changeset
197 }
anatofuz
parents:
diff changeset
198 // We know we're printing C++ here, ensure we print 'bool' properly.
anatofuz
parents:
diff changeset
199 PrintingPolicy CXXPolicy = Policy;
anatofuz
parents:
diff changeset
200 CXXPolicy.adjustForCPlusPlus();
anatofuz
parents:
diff changeset
201 Type.print(OS, CXXPolicy);
anatofuz
parents:
diff changeset
202 return;
anatofuz
parents:
diff changeset
203 }
anatofuz
parents:
diff changeset
204 case DeclarationName::CXXUsingDirective:
anatofuz
parents:
diff changeset
205 OS << "<using-directive>";
anatofuz
parents:
diff changeset
206 return;
anatofuz
parents:
diff changeset
207 }
anatofuz
parents:
diff changeset
208
anatofuz
parents:
diff changeset
209 llvm_unreachable("Unexpected declaration name kind");
anatofuz
parents:
diff changeset
210 }
anatofuz
parents:
diff changeset
211
anatofuz
parents:
diff changeset
212 namespace clang {
anatofuz
parents:
diff changeset
213
anatofuz
parents:
diff changeset
214 raw_ostream &operator<<(raw_ostream &OS, DeclarationName N) {
anatofuz
parents:
diff changeset
215 LangOptions LO;
anatofuz
parents:
diff changeset
216 N.print(OS, PrintingPolicy(LO));
anatofuz
parents:
diff changeset
217 return OS;
anatofuz
parents:
diff changeset
218 }
anatofuz
parents:
diff changeset
219
anatofuz
parents:
diff changeset
220 } // namespace clang
anatofuz
parents:
diff changeset
221
anatofuz
parents:
diff changeset
222 bool DeclarationName::isDependentName() const {
anatofuz
parents:
diff changeset
223 QualType T = getCXXNameType();
anatofuz
parents:
diff changeset
224 if (!T.isNull() && T->isDependentType())
anatofuz
parents:
diff changeset
225 return true;
anatofuz
parents:
diff changeset
226
anatofuz
parents:
diff changeset
227 // A class-scope deduction guide in a dependent context has a dependent name.
anatofuz
parents:
diff changeset
228 auto *TD = getCXXDeductionGuideTemplate();
anatofuz
parents:
diff changeset
229 if (TD && TD->getDeclContext()->isDependentContext())
anatofuz
parents:
diff changeset
230 return true;
anatofuz
parents:
diff changeset
231
anatofuz
parents:
diff changeset
232 return false;
anatofuz
parents:
diff changeset
233 }
anatofuz
parents:
diff changeset
234
anatofuz
parents:
diff changeset
235 std::string DeclarationName::getAsString() const {
anatofuz
parents:
diff changeset
236 std::string Result;
anatofuz
parents:
diff changeset
237 llvm::raw_string_ostream OS(Result);
anatofuz
parents:
diff changeset
238 OS << *this;
anatofuz
parents:
diff changeset
239 return OS.str();
anatofuz
parents:
diff changeset
240 }
anatofuz
parents:
diff changeset
241
anatofuz
parents:
diff changeset
242 void *DeclarationName::getFETokenInfoSlow() const {
anatofuz
parents:
diff changeset
243 switch (getNameKind()) {
anatofuz
parents:
diff changeset
244 case Identifier:
anatofuz
parents:
diff changeset
245 llvm_unreachable("case Identifier already handled by getFETokenInfo!");
anatofuz
parents:
diff changeset
246 case CXXConstructorName:
anatofuz
parents:
diff changeset
247 case CXXDestructorName:
anatofuz
parents:
diff changeset
248 case CXXConversionFunctionName:
anatofuz
parents:
diff changeset
249 return castAsCXXSpecialNameExtra()->FETokenInfo;
anatofuz
parents:
diff changeset
250 case CXXOperatorName:
anatofuz
parents:
diff changeset
251 return castAsCXXOperatorIdName()->FETokenInfo;
anatofuz
parents:
diff changeset
252 case CXXDeductionGuideName:
anatofuz
parents:
diff changeset
253 return castAsCXXDeductionGuideNameExtra()->FETokenInfo;
anatofuz
parents:
diff changeset
254 case CXXLiteralOperatorName:
anatofuz
parents:
diff changeset
255 return castAsCXXLiteralOperatorIdName()->FETokenInfo;
anatofuz
parents:
diff changeset
256 default:
anatofuz
parents:
diff changeset
257 llvm_unreachable("DeclarationName has no FETokenInfo!");
anatofuz
parents:
diff changeset
258 }
anatofuz
parents:
diff changeset
259 }
anatofuz
parents:
diff changeset
260
anatofuz
parents:
diff changeset
261 void DeclarationName::setFETokenInfoSlow(void *T) {
anatofuz
parents:
diff changeset
262 switch (getNameKind()) {
anatofuz
parents:
diff changeset
263 case Identifier:
anatofuz
parents:
diff changeset
264 llvm_unreachable("case Identifier already handled by setFETokenInfo!");
anatofuz
parents:
diff changeset
265 case CXXConstructorName:
anatofuz
parents:
diff changeset
266 case CXXDestructorName:
anatofuz
parents:
diff changeset
267 case CXXConversionFunctionName:
anatofuz
parents:
diff changeset
268 castAsCXXSpecialNameExtra()->FETokenInfo = T;
anatofuz
parents:
diff changeset
269 break;
anatofuz
parents:
diff changeset
270 case CXXOperatorName:
anatofuz
parents:
diff changeset
271 castAsCXXOperatorIdName()->FETokenInfo = T;
anatofuz
parents:
diff changeset
272 break;
anatofuz
parents:
diff changeset
273 case CXXDeductionGuideName:
anatofuz
parents:
diff changeset
274 castAsCXXDeductionGuideNameExtra()->FETokenInfo = T;
anatofuz
parents:
diff changeset
275 break;
anatofuz
parents:
diff changeset
276 case CXXLiteralOperatorName:
anatofuz
parents:
diff changeset
277 castAsCXXLiteralOperatorIdName()->FETokenInfo = T;
anatofuz
parents:
diff changeset
278 break;
anatofuz
parents:
diff changeset
279 default:
anatofuz
parents:
diff changeset
280 llvm_unreachable("DeclarationName has no FETokenInfo!");
anatofuz
parents:
diff changeset
281 }
anatofuz
parents:
diff changeset
282 }
anatofuz
parents:
diff changeset
283
anatofuz
parents:
diff changeset
284 LLVM_DUMP_METHOD void DeclarationName::dump() const {
anatofuz
parents:
diff changeset
285 llvm::errs() << *this << '\n';
anatofuz
parents:
diff changeset
286 }
anatofuz
parents:
diff changeset
287
anatofuz
parents:
diff changeset
288 DeclarationNameTable::DeclarationNameTable(const ASTContext &C) : Ctx(C) {
anatofuz
parents:
diff changeset
289 // Initialize the overloaded operator names.
anatofuz
parents:
diff changeset
290 for (unsigned Op = 0; Op < NUM_OVERLOADED_OPERATORS; ++Op)
anatofuz
parents:
diff changeset
291 CXXOperatorNames[Op].Kind = static_cast<OverloadedOperatorKind>(Op);
anatofuz
parents:
diff changeset
292 }
anatofuz
parents:
diff changeset
293
anatofuz
parents:
diff changeset
294 DeclarationName
anatofuz
parents:
diff changeset
295 DeclarationNameTable::getCXXDeductionGuideName(TemplateDecl *Template) {
anatofuz
parents:
diff changeset
296 Template = cast<TemplateDecl>(Template->getCanonicalDecl());
anatofuz
parents:
diff changeset
297
anatofuz
parents:
diff changeset
298 llvm::FoldingSetNodeID ID;
anatofuz
parents:
diff changeset
299 ID.AddPointer(Template);
anatofuz
parents:
diff changeset
300
anatofuz
parents:
diff changeset
301 void *InsertPos = nullptr;
anatofuz
parents:
diff changeset
302 if (auto *Name = CXXDeductionGuideNames.FindNodeOrInsertPos(ID, InsertPos))
anatofuz
parents:
diff changeset
303 return DeclarationName(Name);
anatofuz
parents:
diff changeset
304
anatofuz
parents:
diff changeset
305 auto *Name = new (Ctx) detail::CXXDeductionGuideNameExtra(Template);
anatofuz
parents:
diff changeset
306 CXXDeductionGuideNames.InsertNode(Name, InsertPos);
anatofuz
parents:
diff changeset
307 return DeclarationName(Name);
anatofuz
parents:
diff changeset
308 }
anatofuz
parents:
diff changeset
309
anatofuz
parents:
diff changeset
310 DeclarationName DeclarationNameTable::getCXXConstructorName(CanQualType Ty) {
anatofuz
parents:
diff changeset
311 // The type of constructors is unqualified.
anatofuz
parents:
diff changeset
312 Ty = Ty.getUnqualifiedType();
anatofuz
parents:
diff changeset
313 // Do we already have this C++ constructor name ?
anatofuz
parents:
diff changeset
314 llvm::FoldingSetNodeID ID;
anatofuz
parents:
diff changeset
315 ID.AddPointer(Ty.getAsOpaquePtr());
anatofuz
parents:
diff changeset
316 void *InsertPos = nullptr;
anatofuz
parents:
diff changeset
317 if (auto *Name = CXXConstructorNames.FindNodeOrInsertPos(ID, InsertPos))
anatofuz
parents:
diff changeset
318 return {Name, DeclarationName::StoredCXXConstructorName};
anatofuz
parents:
diff changeset
319
anatofuz
parents:
diff changeset
320 // We have to create it.
anatofuz
parents:
diff changeset
321 auto *SpecialName = new (Ctx) detail::CXXSpecialNameExtra(Ty);
anatofuz
parents:
diff changeset
322 CXXConstructorNames.InsertNode(SpecialName, InsertPos);
anatofuz
parents:
diff changeset
323 return {SpecialName, DeclarationName::StoredCXXConstructorName};
anatofuz
parents:
diff changeset
324 }
anatofuz
parents:
diff changeset
325
anatofuz
parents:
diff changeset
326 DeclarationName DeclarationNameTable::getCXXDestructorName(CanQualType Ty) {
anatofuz
parents:
diff changeset
327 // The type of destructors is unqualified.
anatofuz
parents:
diff changeset
328 Ty = Ty.getUnqualifiedType();
anatofuz
parents:
diff changeset
329 // Do we already have this C++ destructor name ?
anatofuz
parents:
diff changeset
330 llvm::FoldingSetNodeID ID;
anatofuz
parents:
diff changeset
331 ID.AddPointer(Ty.getAsOpaquePtr());
anatofuz
parents:
diff changeset
332 void *InsertPos = nullptr;
anatofuz
parents:
diff changeset
333 if (auto *Name = CXXDestructorNames.FindNodeOrInsertPos(ID, InsertPos))
anatofuz
parents:
diff changeset
334 return {Name, DeclarationName::StoredCXXDestructorName};
anatofuz
parents:
diff changeset
335
anatofuz
parents:
diff changeset
336 // We have to create it.
anatofuz
parents:
diff changeset
337 auto *SpecialName = new (Ctx) detail::CXXSpecialNameExtra(Ty);
anatofuz
parents:
diff changeset
338 CXXDestructorNames.InsertNode(SpecialName, InsertPos);
anatofuz
parents:
diff changeset
339 return {SpecialName, DeclarationName::StoredCXXDestructorName};
anatofuz
parents:
diff changeset
340 }
anatofuz
parents:
diff changeset
341
anatofuz
parents:
diff changeset
342 DeclarationName
anatofuz
parents:
diff changeset
343 DeclarationNameTable::getCXXConversionFunctionName(CanQualType Ty) {
anatofuz
parents:
diff changeset
344 // Do we already have this C++ conversion function name ?
anatofuz
parents:
diff changeset
345 llvm::FoldingSetNodeID ID;
anatofuz
parents:
diff changeset
346 ID.AddPointer(Ty.getAsOpaquePtr());
anatofuz
parents:
diff changeset
347 void *InsertPos = nullptr;
anatofuz
parents:
diff changeset
348 if (auto *Name =
anatofuz
parents:
diff changeset
349 CXXConversionFunctionNames.FindNodeOrInsertPos(ID, InsertPos))
anatofuz
parents:
diff changeset
350 return {Name, DeclarationName::StoredCXXConversionFunctionName};
anatofuz
parents:
diff changeset
351
anatofuz
parents:
diff changeset
352 // We have to create it.
anatofuz
parents:
diff changeset
353 auto *SpecialName = new (Ctx) detail::CXXSpecialNameExtra(Ty);
anatofuz
parents:
diff changeset
354 CXXConversionFunctionNames.InsertNode(SpecialName, InsertPos);
anatofuz
parents:
diff changeset
355 return {SpecialName, DeclarationName::StoredCXXConversionFunctionName};
anatofuz
parents:
diff changeset
356 }
anatofuz
parents:
diff changeset
357
anatofuz
parents:
diff changeset
358 DeclarationName
anatofuz
parents:
diff changeset
359 DeclarationNameTable::getCXXSpecialName(DeclarationName::NameKind Kind,
anatofuz
parents:
diff changeset
360 CanQualType Ty) {
anatofuz
parents:
diff changeset
361 switch (Kind) {
anatofuz
parents:
diff changeset
362 case DeclarationName::CXXConstructorName:
anatofuz
parents:
diff changeset
363 return getCXXConstructorName(Ty);
anatofuz
parents:
diff changeset
364 case DeclarationName::CXXDestructorName:
anatofuz
parents:
diff changeset
365 return getCXXDestructorName(Ty);
anatofuz
parents:
diff changeset
366 case DeclarationName::CXXConversionFunctionName:
anatofuz
parents:
diff changeset
367 return getCXXConversionFunctionName(Ty);
anatofuz
parents:
diff changeset
368 default:
anatofuz
parents:
diff changeset
369 llvm_unreachable("Invalid kind in getCXXSpecialName!");
anatofuz
parents:
diff changeset
370 }
anatofuz
parents:
diff changeset
371 }
anatofuz
parents:
diff changeset
372
anatofuz
parents:
diff changeset
373 DeclarationName
anatofuz
parents:
diff changeset
374 DeclarationNameTable::getCXXLiteralOperatorName(IdentifierInfo *II) {
anatofuz
parents:
diff changeset
375 llvm::FoldingSetNodeID ID;
anatofuz
parents:
diff changeset
376 ID.AddPointer(II);
anatofuz
parents:
diff changeset
377
anatofuz
parents:
diff changeset
378 void *InsertPos = nullptr;
anatofuz
parents:
diff changeset
379 if (auto *Name = CXXLiteralOperatorNames.FindNodeOrInsertPos(ID, InsertPos))
anatofuz
parents:
diff changeset
380 return DeclarationName(Name);
anatofuz
parents:
diff changeset
381
anatofuz
parents:
diff changeset
382 auto *LiteralName = new (Ctx) detail::CXXLiteralOperatorIdName(II);
anatofuz
parents:
diff changeset
383 CXXLiteralOperatorNames.InsertNode(LiteralName, InsertPos);
anatofuz
parents:
diff changeset
384 return DeclarationName(LiteralName);
anatofuz
parents:
diff changeset
385 }
anatofuz
parents:
diff changeset
386
anatofuz
parents:
diff changeset
387 DeclarationNameLoc::DeclarationNameLoc(DeclarationName Name) {
anatofuz
parents:
diff changeset
388 switch (Name.getNameKind()) {
anatofuz
parents:
diff changeset
389 case DeclarationName::Identifier:
anatofuz
parents:
diff changeset
390 case DeclarationName::CXXDeductionGuideName:
anatofuz
parents:
diff changeset
391 break;
anatofuz
parents:
diff changeset
392 case DeclarationName::CXXConstructorName:
anatofuz
parents:
diff changeset
393 case DeclarationName::CXXDestructorName:
anatofuz
parents:
diff changeset
394 case DeclarationName::CXXConversionFunctionName:
anatofuz
parents:
diff changeset
395 NamedType.TInfo = nullptr;
anatofuz
parents:
diff changeset
396 break;
anatofuz
parents:
diff changeset
397 case DeclarationName::CXXOperatorName:
anatofuz
parents:
diff changeset
398 CXXOperatorName.BeginOpNameLoc = SourceLocation().getRawEncoding();
anatofuz
parents:
diff changeset
399 CXXOperatorName.EndOpNameLoc = SourceLocation().getRawEncoding();
anatofuz
parents:
diff changeset
400 break;
anatofuz
parents:
diff changeset
401 case DeclarationName::CXXLiteralOperatorName:
anatofuz
parents:
diff changeset
402 CXXLiteralOperatorName.OpNameLoc = SourceLocation().getRawEncoding();
anatofuz
parents:
diff changeset
403 break;
anatofuz
parents:
diff changeset
404 case DeclarationName::ObjCZeroArgSelector:
anatofuz
parents:
diff changeset
405 case DeclarationName::ObjCOneArgSelector:
anatofuz
parents:
diff changeset
406 case DeclarationName::ObjCMultiArgSelector:
anatofuz
parents:
diff changeset
407 // FIXME: ?
anatofuz
parents:
diff changeset
408 break;
anatofuz
parents:
diff changeset
409 case DeclarationName::CXXUsingDirective:
anatofuz
parents:
diff changeset
410 break;
anatofuz
parents:
diff changeset
411 }
anatofuz
parents:
diff changeset
412 }
anatofuz
parents:
diff changeset
413
anatofuz
parents:
diff changeset
414 bool DeclarationNameInfo::containsUnexpandedParameterPack() const {
anatofuz
parents:
diff changeset
415 switch (Name.getNameKind()) {
anatofuz
parents:
diff changeset
416 case DeclarationName::Identifier:
anatofuz
parents:
diff changeset
417 case DeclarationName::ObjCZeroArgSelector:
anatofuz
parents:
diff changeset
418 case DeclarationName::ObjCOneArgSelector:
anatofuz
parents:
diff changeset
419 case DeclarationName::ObjCMultiArgSelector:
anatofuz
parents:
diff changeset
420 case DeclarationName::CXXOperatorName:
anatofuz
parents:
diff changeset
421 case DeclarationName::CXXLiteralOperatorName:
anatofuz
parents:
diff changeset
422 case DeclarationName::CXXUsingDirective:
anatofuz
parents:
diff changeset
423 case DeclarationName::CXXDeductionGuideName:
anatofuz
parents:
diff changeset
424 return false;
anatofuz
parents:
diff changeset
425
anatofuz
parents:
diff changeset
426 case DeclarationName::CXXConstructorName:
anatofuz
parents:
diff changeset
427 case DeclarationName::CXXDestructorName:
anatofuz
parents:
diff changeset
428 case DeclarationName::CXXConversionFunctionName:
anatofuz
parents:
diff changeset
429 if (TypeSourceInfo *TInfo = LocInfo.NamedType.TInfo)
anatofuz
parents:
diff changeset
430 return TInfo->getType()->containsUnexpandedParameterPack();
anatofuz
parents:
diff changeset
431
anatofuz
parents:
diff changeset
432 return Name.getCXXNameType()->containsUnexpandedParameterPack();
anatofuz
parents:
diff changeset
433 }
anatofuz
parents:
diff changeset
434 llvm_unreachable("All name kinds handled.");
anatofuz
parents:
diff changeset
435 }
anatofuz
parents:
diff changeset
436
anatofuz
parents:
diff changeset
437 bool DeclarationNameInfo::isInstantiationDependent() const {
anatofuz
parents:
diff changeset
438 switch (Name.getNameKind()) {
anatofuz
parents:
diff changeset
439 case DeclarationName::Identifier:
anatofuz
parents:
diff changeset
440 case DeclarationName::ObjCZeroArgSelector:
anatofuz
parents:
diff changeset
441 case DeclarationName::ObjCOneArgSelector:
anatofuz
parents:
diff changeset
442 case DeclarationName::ObjCMultiArgSelector:
anatofuz
parents:
diff changeset
443 case DeclarationName::CXXOperatorName:
anatofuz
parents:
diff changeset
444 case DeclarationName::CXXLiteralOperatorName:
anatofuz
parents:
diff changeset
445 case DeclarationName::CXXUsingDirective:
anatofuz
parents:
diff changeset
446 case DeclarationName::CXXDeductionGuideName:
anatofuz
parents:
diff changeset
447 return false;
anatofuz
parents:
diff changeset
448
anatofuz
parents:
diff changeset
449 case DeclarationName::CXXConstructorName:
anatofuz
parents:
diff changeset
450 case DeclarationName::CXXDestructorName:
anatofuz
parents:
diff changeset
451 case DeclarationName::CXXConversionFunctionName:
anatofuz
parents:
diff changeset
452 if (TypeSourceInfo *TInfo = LocInfo.NamedType.TInfo)
anatofuz
parents:
diff changeset
453 return TInfo->getType()->isInstantiationDependentType();
anatofuz
parents:
diff changeset
454
anatofuz
parents:
diff changeset
455 return Name.getCXXNameType()->isInstantiationDependentType();
anatofuz
parents:
diff changeset
456 }
anatofuz
parents:
diff changeset
457 llvm_unreachable("All name kinds handled.");
anatofuz
parents:
diff changeset
458 }
anatofuz
parents:
diff changeset
459
anatofuz
parents:
diff changeset
460 std::string DeclarationNameInfo::getAsString() const {
anatofuz
parents:
diff changeset
461 std::string Result;
anatofuz
parents:
diff changeset
462 llvm::raw_string_ostream OS(Result);
anatofuz
parents:
diff changeset
463 OS << *this;
anatofuz
parents:
diff changeset
464 return OS.str();
anatofuz
parents:
diff changeset
465 }
anatofuz
parents:
diff changeset
466
anatofuz
parents:
diff changeset
467 raw_ostream &clang::operator<<(raw_ostream &OS, DeclarationNameInfo DNInfo) {
anatofuz
parents:
diff changeset
468 LangOptions LO;
anatofuz
parents:
diff changeset
469 DNInfo.printName(OS, PrintingPolicy(LangOptions()));
anatofuz
parents:
diff changeset
470 return OS;
anatofuz
parents:
diff changeset
471 }
anatofuz
parents:
diff changeset
472
anatofuz
parents:
diff changeset
473 void DeclarationNameInfo::printName(raw_ostream &OS, PrintingPolicy Policy) const {
anatofuz
parents:
diff changeset
474 switch (Name.getNameKind()) {
anatofuz
parents:
diff changeset
475 case DeclarationName::Identifier:
anatofuz
parents:
diff changeset
476 case DeclarationName::ObjCZeroArgSelector:
anatofuz
parents:
diff changeset
477 case DeclarationName::ObjCOneArgSelector:
anatofuz
parents:
diff changeset
478 case DeclarationName::ObjCMultiArgSelector:
anatofuz
parents:
diff changeset
479 case DeclarationName::CXXOperatorName:
anatofuz
parents:
diff changeset
480 case DeclarationName::CXXLiteralOperatorName:
anatofuz
parents:
diff changeset
481 case DeclarationName::CXXUsingDirective:
anatofuz
parents:
diff changeset
482 case DeclarationName::CXXDeductionGuideName:
anatofuz
parents:
diff changeset
483 Name.print(OS, Policy);
anatofuz
parents:
diff changeset
484 return;
anatofuz
parents:
diff changeset
485
anatofuz
parents:
diff changeset
486 case DeclarationName::CXXConstructorName:
anatofuz
parents:
diff changeset
487 case DeclarationName::CXXDestructorName:
anatofuz
parents:
diff changeset
488 case DeclarationName::CXXConversionFunctionName:
anatofuz
parents:
diff changeset
489 if (TypeSourceInfo *TInfo = LocInfo.NamedType.TInfo) {
anatofuz
parents:
diff changeset
490 if (Name.getNameKind() == DeclarationName::CXXDestructorName)
anatofuz
parents:
diff changeset
491 OS << '~';
anatofuz
parents:
diff changeset
492 else if (Name.getNameKind() == DeclarationName::CXXConversionFunctionName)
anatofuz
parents:
diff changeset
493 OS << "operator ";
anatofuz
parents:
diff changeset
494 LangOptions LO;
anatofuz
parents:
diff changeset
495 Policy.adjustForCPlusPlus();
anatofuz
parents:
diff changeset
496 Policy.SuppressScope = true;
anatofuz
parents:
diff changeset
497 OS << TInfo->getType().getAsString(Policy);
anatofuz
parents:
diff changeset
498 } else
anatofuz
parents:
diff changeset
499 Name.print(OS, Policy);
anatofuz
parents:
diff changeset
500 return;
anatofuz
parents:
diff changeset
501 }
anatofuz
parents:
diff changeset
502 llvm_unreachable("Unexpected declaration name kind");
anatofuz
parents:
diff changeset
503 }
anatofuz
parents:
diff changeset
504
anatofuz
parents:
diff changeset
505 SourceLocation DeclarationNameInfo::getEndLocPrivate() const {
anatofuz
parents:
diff changeset
506 switch (Name.getNameKind()) {
anatofuz
parents:
diff changeset
507 case DeclarationName::Identifier:
anatofuz
parents:
diff changeset
508 case DeclarationName::CXXDeductionGuideName:
anatofuz
parents:
diff changeset
509 return NameLoc;
anatofuz
parents:
diff changeset
510
anatofuz
parents:
diff changeset
511 case DeclarationName::CXXOperatorName: {
anatofuz
parents:
diff changeset
512 unsigned raw = LocInfo.CXXOperatorName.EndOpNameLoc;
anatofuz
parents:
diff changeset
513 return SourceLocation::getFromRawEncoding(raw);
anatofuz
parents:
diff changeset
514 }
anatofuz
parents:
diff changeset
515
anatofuz
parents:
diff changeset
516 case DeclarationName::CXXLiteralOperatorName: {
anatofuz
parents:
diff changeset
517 unsigned raw = LocInfo.CXXLiteralOperatorName.OpNameLoc;
anatofuz
parents:
diff changeset
518 return SourceLocation::getFromRawEncoding(raw);
anatofuz
parents:
diff changeset
519 }
anatofuz
parents:
diff changeset
520
anatofuz
parents:
diff changeset
521 case DeclarationName::CXXConstructorName:
anatofuz
parents:
diff changeset
522 case DeclarationName::CXXDestructorName:
anatofuz
parents:
diff changeset
523 case DeclarationName::CXXConversionFunctionName:
anatofuz
parents:
diff changeset
524 if (TypeSourceInfo *TInfo = LocInfo.NamedType.TInfo)
anatofuz
parents:
diff changeset
525 return TInfo->getTypeLoc().getEndLoc();
anatofuz
parents:
diff changeset
526 else
anatofuz
parents:
diff changeset
527 return NameLoc;
anatofuz
parents:
diff changeset
528
anatofuz
parents:
diff changeset
529 // DNInfo work in progress: FIXME.
anatofuz
parents:
diff changeset
530 case DeclarationName::ObjCZeroArgSelector:
anatofuz
parents:
diff changeset
531 case DeclarationName::ObjCOneArgSelector:
anatofuz
parents:
diff changeset
532 case DeclarationName::ObjCMultiArgSelector:
anatofuz
parents:
diff changeset
533 case DeclarationName::CXXUsingDirective:
anatofuz
parents:
diff changeset
534 return NameLoc;
anatofuz
parents:
diff changeset
535 }
anatofuz
parents:
diff changeset
536 llvm_unreachable("Unexpected declaration name kind");
anatofuz
parents:
diff changeset
537 }