1 //===- ASTContext.cpp - Context to hold long-lived AST nodes --------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // This file implements the ASTContext interface.
10 //
11 //===----------------------------------------------------------------------===//
12
13 #include "clang/AST/ASTContext.h"
14 #include "CXXABI.h"
15 #include "Interp/Context.h"
16 #include "clang/AST/APValue.h"
17 #include "clang/AST/ASTConcept.h"
18 #include "clang/AST/ASTMutationListener.h"
19 #include "clang/AST/ASTTypeTraits.h"
20 #include "clang/AST/Attr.h"
21 #include "clang/AST/AttrIterator.h"
22 #include "clang/AST/CharUnits.h"
23 #include "clang/AST/Comment.h"
24 #include "clang/AST/Decl.h"
25 #include "clang/AST/DeclBase.h"
26 #include "clang/AST/DeclCXX.h"
27 #include "clang/AST/DeclContextInternals.h"
28 #include "clang/AST/DeclObjC.h"
29 #include "clang/AST/DeclOpenMP.h"
30 #include "clang/AST/DeclTemplate.h"
31 #include "clang/AST/DeclarationName.h"
32 #include "clang/AST/DependenceFlags.h"
33 #include "clang/AST/Expr.h"
34 #include "clang/AST/ExprCXX.h"
35 #include "clang/AST/ExprConcepts.h"
36 #include "clang/AST/ExternalASTSource.h"
37 #include "clang/AST/Mangle.h"
38 #include "clang/AST/MangleNumberingContext.h"
39 #include "clang/AST/NestedNameSpecifier.h"
40 #include "clang/AST/ParentMapContext.h"
41 #include "clang/AST/RawCommentList.h"
42 #include "clang/AST/RecordLayout.h"
43 #include "clang/AST/Stmt.h"
44 #include "clang/AST/TemplateBase.h"
45 #include "clang/AST/TemplateName.h"
46 #include "clang/AST/Type.h"
47 #include "clang/AST/TypeLoc.h"
48 #include "clang/AST/UnresolvedSet.h"
49 #include "clang/AST/VTableBuilder.h"
50 #include "clang/Basic/AddressSpaces.h"
51 #include "clang/Basic/Builtins.h"
52 #include "clang/Basic/CommentOptions.h"
53 #include "clang/Basic/ExceptionSpecificationType.h"
54 #include "clang/Basic/IdentifierTable.h"
55 #include "clang/Basic/LLVM.h"
56 #include "clang/Basic/LangOptions.h"
57 #include "clang/Basic/Linkage.h"
58 #include "clang/Basic/Module.h"
59 #include "clang/Basic/NoSanitizeList.h"
60 #include "clang/Basic/ObjCRuntime.h"
61 #include "clang/Basic/SourceLocation.h"
62 #include "clang/Basic/SourceManager.h"
63 #include "clang/Basic/Specifiers.h"
64 #include "clang/Basic/TargetCXXABI.h"
65 #include "clang/Basic/TargetInfo.h"
66 #include "clang/Basic/XRayLists.h"
67 #include "llvm/ADT/APFixedPoint.h"
68 #include "llvm/ADT/APInt.h"
69 #include "llvm/ADT/APSInt.h"
70 #include "llvm/ADT/ArrayRef.h"
71 #include "llvm/ADT/DenseMap.h"
72 #include "llvm/ADT/DenseSet.h"
73 #include "llvm/ADT/FoldingSet.h"
74 #include "llvm/ADT/None.h"
75 #include "llvm/ADT/Optional.h"
76 #include "llvm/ADT/PointerUnion.h"
77 #include "llvm/ADT/STLExtras.h"
78 #include "llvm/ADT/SmallPtrSet.h"
79 #include "llvm/ADT/SmallVector.h"
80 #include "llvm/ADT/StringExtras.h"
81 #include "llvm/ADT/StringRef.h"
82 #include "llvm/ADT/Triple.h"
83 #include "llvm/Support/Capacity.h"
84 #include "llvm/Support/Casting.h"
85 #include "llvm/Support/Compiler.h"
86 #include "llvm/Support/ErrorHandling.h"
87 #include "llvm/Support/MD5.h"
88 #include "llvm/Support/MathExtras.h"
89 #include "llvm/Support/raw_ostream.h"
90 #include <algorithm>
91 #include <cassert>
92 #include <cstddef>
93 #include <cstdint>
94 #include <cstdlib>
95 #include <map>
96 #include <memory>
97 #include <string>
98 #include <tuple>
99 #include <utility>
100
101 using namespace clang;
102
103 enum FloatingRank {
104 BFloat16Rank,
105 Float16Rank,
106 HalfRank,
107 FloatRank,
108 DoubleRank,
109 LongDoubleRank,
110 Float128Rank,
111 Ibm128Rank
112 };
113
114 /// \returns location that is relevant when searching for Doc comments related
115 /// to \p D.
getDeclLocForCommentSearch(const Decl * D,SourceManager & SourceMgr)116 static SourceLocation getDeclLocForCommentSearch(const Decl *D,
117 SourceManager &SourceMgr) {
118 assert(D);
119
120 // User can not attach documentation to implicit declarations.
121 if (D->isImplicit())
122 return {};
123
124 // User can not attach documentation to implicit instantiations.
125 if (const auto *FD = dyn_cast<FunctionDecl>(D)) {
126 if (FD->getTemplateSpecializationKind() == TSK_ImplicitInstantiation)
127 return {};
128 }
129
130 if (const auto *VD = dyn_cast<VarDecl>(D)) {
131 if (VD->isStaticDataMember() &&
132 VD->getTemplateSpecializationKind() == TSK_ImplicitInstantiation)
133 return {};
134 }
135
136 if (const auto *CRD = dyn_cast<CXXRecordDecl>(D)) {
137 if (CRD->getTemplateSpecializationKind() == TSK_ImplicitInstantiation)
138 return {};
139 }
140
141 if (const auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(D)) {
142 TemplateSpecializationKind TSK = CTSD->getSpecializationKind();
143 if (TSK == TSK_ImplicitInstantiation ||
144 TSK == TSK_Undeclared)
145 return {};
146 }
147
148 if (const auto *ED = dyn_cast<EnumDecl>(D)) {
149 if (ED->getTemplateSpecializationKind() == TSK_ImplicitInstantiation)
150 return {};
151 }
152 if (const auto *TD = dyn_cast<TagDecl>(D)) {
153 // When tag declaration (but not definition!) is part of the
154 // decl-specifier-seq of some other declaration, it doesn't get comment
155 if (TD->isEmbeddedInDeclarator() && !TD->isCompleteDefinition())
156 return {};
157 }
158 // TODO: handle comments for function parameters properly.
159 if (isa<ParmVarDecl>(D))
160 return {};
161
162 // TODO: we could look up template parameter documentation in the template
163 // documentation.
164 if (isa<TemplateTypeParmDecl>(D) ||
165 isa<NonTypeTemplateParmDecl>(D) ||
166 isa<TemplateTemplateParmDecl>(D))
167 return {};
168
169 // Find declaration location.
170 // For Objective-C declarations we generally don't expect to have multiple
171 // declarators, thus use declaration starting location as the "declaration
172 // location".
173 // For all other declarations multiple declarators are used quite frequently,
174 // so we use the location of the identifier as the "declaration location".
175 if (isa<ObjCMethodDecl>(D) || isa<ObjCContainerDecl>(D) ||
176 isa<ObjCPropertyDecl>(D) ||
177 isa<RedeclarableTemplateDecl>(D) ||
178 isa<ClassTemplateSpecializationDecl>(D) ||
179 // Allow association with Y across {} in `typedef struct X {} Y`.
180 isa<TypedefDecl>(D))
181 return D->getBeginLoc();
182
183 const SourceLocation DeclLoc = D->getLocation();
184 if (DeclLoc.isMacroID()) {
185 if (isa<TypedefDecl>(D)) {
186 // If location of the typedef name is in a macro, it is because being
187 // declared via a macro. Try using declaration's starting location as
188 // the "declaration location".
189 return D->getBeginLoc();
190 }
191
192 if (const auto *TD = dyn_cast<TagDecl>(D)) {
193 // If location of the tag decl is inside a macro, but the spelling of
194 // the tag name comes from a macro argument, it looks like a special
195 // macro like NS_ENUM is being used to define the tag decl. In that
196 // case, adjust the source location to the expansion loc so that we can
197 // attach the comment to the tag decl.
198 if (SourceMgr.isMacroArgExpansion(DeclLoc) && TD->isCompleteDefinition())
199 return SourceMgr.getExpansionLoc(DeclLoc);
200 }
201 }
202
203 return DeclLoc;
204 }
205
getRawCommentForDeclNoCacheImpl(const Decl * D,const SourceLocation RepresentativeLocForDecl,const std::map<unsigned,RawComment * > & CommentsInTheFile) const206 RawComment *ASTContext::getRawCommentForDeclNoCacheImpl(
207 const Decl *D, const SourceLocation RepresentativeLocForDecl,
208 const std::map<unsigned, RawComment *> &CommentsInTheFile) const {
209 // If the declaration doesn't map directly to a location in a file, we
210 // can't find the comment.
211 if (RepresentativeLocForDecl.isInvalid() ||
212 !RepresentativeLocForDecl.isFileID())
213 return nullptr;
214
215 // If there are no comments anywhere, we won't find anything.
216 if (CommentsInTheFile.empty())
217 return nullptr;
218
219 // Decompose the location for the declaration and find the beginning of the
220 // file buffer.
221 const std::pair<FileID, unsigned> DeclLocDecomp =
222 SourceMgr.getDecomposedLoc(RepresentativeLocForDecl);
223
224 // Slow path.
225 auto OffsetCommentBehindDecl =
226 CommentsInTheFile.lower_bound(DeclLocDecomp.second);
227
228 // First check whether we have a trailing comment.
229 if (OffsetCommentBehindDecl != CommentsInTheFile.end()) {
230 RawComment *CommentBehindDecl = OffsetCommentBehindDecl->second;
231 if ((CommentBehindDecl->isDocumentation() ||
232 LangOpts.CommentOpts.ParseAllComments) &&
233 CommentBehindDecl->isTrailingComment() &&
234 (isa<FieldDecl>(D) || isa<EnumConstantDecl>(D) || isa<VarDecl>(D) ||
235 isa<ObjCMethodDecl>(D) || isa<ObjCPropertyDecl>(D))) {
236
237 // Check that Doxygen trailing comment comes after the declaration, starts
238 // on the same line and in the same file as the declaration.
239 if (SourceMgr.getLineNumber(DeclLocDecomp.first, DeclLocDecomp.second) ==
240 Comments.getCommentBeginLine(CommentBehindDecl, DeclLocDecomp.first,
241 OffsetCommentBehindDecl->first)) {
242 return CommentBehindDecl;
243 }
244 }
245 }
246
247 // The comment just after the declaration was not a trailing comment.
248 // Let's look at the previous comment.
249 if (OffsetCommentBehindDecl == CommentsInTheFile.begin())
250 return nullptr;
251
252 auto OffsetCommentBeforeDecl = --OffsetCommentBehindDecl;
253 RawComment *CommentBeforeDecl = OffsetCommentBeforeDecl->second;
254
255 // Check that we actually have a non-member Doxygen comment.
256 if (!(CommentBeforeDecl->isDocumentation() ||
257 LangOpts.CommentOpts.ParseAllComments) ||
258 CommentBeforeDecl->isTrailingComment())
259 return nullptr;
260
261 // Decompose the end of the comment.
262 const unsigned CommentEndOffset =
263 Comments.getCommentEndOffset(CommentBeforeDecl);
264
265 // Get the corresponding buffer.
266 bool Invalid = false;
267 const char *Buffer = SourceMgr.getBufferData(DeclLocDecomp.first,
268 &Invalid).data();
269 if (Invalid)
270 return nullptr;
271
272 // Extract text between the comment and declaration.
273 StringRef Text(Buffer + CommentEndOffset,
274 DeclLocDecomp.second - CommentEndOffset);
275
276 // There should be no other declarations or preprocessor directives between
277 // comment and declaration.
278 if (Text.find_first_of(";{}#@") != StringRef::npos)
279 return nullptr;
280
281 return CommentBeforeDecl;
282 }
283
getRawCommentForDeclNoCache(const Decl * D) const284 RawComment *ASTContext::getRawCommentForDeclNoCache(const Decl *D) const {
285 const SourceLocation DeclLoc = getDeclLocForCommentSearch(D, SourceMgr);
286
287 // If the declaration doesn't map directly to a location in a file, we
288 // can't find the comment.
289 if (DeclLoc.isInvalid() || !DeclLoc.isFileID())
290 return nullptr;
291
292 if (ExternalSource && !CommentsLoaded) {
293 ExternalSource->ReadComments();
294 CommentsLoaded = true;
295 }
296
297 if (Comments.empty())
298 return nullptr;
299
300 const FileID File = SourceMgr.getDecomposedLoc(DeclLoc).first;
301 const auto CommentsInThisFile = Comments.getCommentsInFile(File);
302 if (!CommentsInThisFile || CommentsInThisFile->empty())
303 return nullptr;
304
305 return getRawCommentForDeclNoCacheImpl(D, DeclLoc, *CommentsInThisFile);
306 }
307
addComment(const RawComment & RC)308 void ASTContext::addComment(const RawComment &RC) {
309 assert(LangOpts.RetainCommentsFromSystemHeaders ||
310 !SourceMgr.isInSystemHeader(RC.getSourceRange().getBegin()));
311 Comments.addComment(RC, LangOpts.CommentOpts, BumpAlloc);
312 }
313
314 /// If we have a 'templated' declaration for a template, adjust 'D' to
315 /// refer to the actual template.
316 /// If we have an implicit instantiation, adjust 'D' to refer to template.
adjustDeclToTemplate(const Decl & D)317 static const Decl &adjustDeclToTemplate(const Decl &D) {
318 if (const auto *FD = dyn_cast<FunctionDecl>(&D)) {
319 // Is this function declaration part of a function template?
320 if (const FunctionTemplateDecl *FTD = FD->getDescribedFunctionTemplate())
321 return *FTD;
322
323 // Nothing to do if function is not an implicit instantiation.
324 if (FD->getTemplateSpecializationKind() != TSK_ImplicitInstantiation)
325 return D;
326
327 // Function is an implicit instantiation of a function template?
328 if (const FunctionTemplateDecl *FTD = FD->getPrimaryTemplate())
329 return *FTD;
330
331 // Function is instantiated from a member definition of a class template?
332 if (const FunctionDecl *MemberDecl =
333 FD->getInstantiatedFromMemberFunction())
334 return *MemberDecl;
335
336 return D;
337 }
338 if (const auto *VD = dyn_cast<VarDecl>(&D)) {
339 // Static data member is instantiated from a member definition of a class
340 // template?
341 if (VD->isStaticDataMember())
342 if (const VarDecl *MemberDecl = VD->getInstantiatedFromStaticDataMember())
343 return *MemberDecl;
344
345 return D;
346 }
347 if (const auto *CRD = dyn_cast<CXXRecordDecl>(&D)) {
348 // Is this class declaration part of a class template?
349 if (const ClassTemplateDecl *CTD = CRD->getDescribedClassTemplate())
350 return *CTD;
351
352 // Class is an implicit instantiation of a class template or partial
353 // specialization?
354 if (const auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(CRD)) {
355 if (CTSD->getSpecializationKind() != TSK_ImplicitInstantiation)
356 return D;
357 llvm::PointerUnion<ClassTemplateDecl *,
358 ClassTemplatePartialSpecializationDecl *>
359 PU = CTSD->getSpecializedTemplateOrPartial();
360 return PU.is<ClassTemplateDecl *>()
361 ? *static_cast<const Decl *>(PU.get<ClassTemplateDecl *>())
362 : *static_cast<const Decl *>(
363 PU.get<ClassTemplatePartialSpecializationDecl *>());
364 }
365
366 // Class is instantiated from a member definition of a class template?
367 if (const MemberSpecializationInfo *Info =
368 CRD->getMemberSpecializationInfo())
369 return *Info->getInstantiatedFrom();
370
371 return D;
372 }
373 if (const auto *ED = dyn_cast<EnumDecl>(&D)) {
374 // Enum is instantiated from a member definition of a class template?
375 if (const EnumDecl *MemberDecl = ED->getInstantiatedFromMemberEnum())
376 return *MemberDecl;
377
378 return D;
379 }
380 // FIXME: Adjust alias templates?
381 return D;
382 }
383
getRawCommentForAnyRedecl(const Decl * D,const Decl ** OriginalDecl) const384 const RawComment *ASTContext::getRawCommentForAnyRedecl(
385 const Decl *D,
386 const Decl **OriginalDecl) const {
387 if (!D) {
388 if (OriginalDecl)
389 OriginalDecl = nullptr;
390 return nullptr;
391 }
392
393 D = &adjustDeclToTemplate(*D);
394
395 // Any comment directly attached to D?
396 {
397 auto DeclComment = DeclRawComments.find(D);
398 if (DeclComment != DeclRawComments.end()) {
399 if (OriginalDecl)
400 *OriginalDecl = D;
401 return DeclComment->second;
402 }
403 }
404
405 // Any comment attached to any redeclaration of D?
406 const Decl *CanonicalD = D->getCanonicalDecl();
407 if (!CanonicalD)
408 return nullptr;
409
410 {
411 auto RedeclComment = RedeclChainComments.find(CanonicalD);
412 if (RedeclComment != RedeclChainComments.end()) {
413 if (OriginalDecl)
414 *OriginalDecl = RedeclComment->second;
415 auto CommentAtRedecl = DeclRawComments.find(RedeclComment->second);
416 assert(CommentAtRedecl != DeclRawComments.end() &&
417 "This decl is supposed to have comment attached.");
418 return CommentAtRedecl->second;
419 }
420 }
421
422 // Any redeclarations of D that we haven't checked for comments yet?
423 // We can't use DenseMap::iterator directly since it'd get invalid.
424 auto LastCheckedRedecl = [this, CanonicalD]() -> const Decl * {
425 auto LookupRes = CommentlessRedeclChains.find(CanonicalD);
426 if (LookupRes != CommentlessRedeclChains.end())
427 return LookupRes->second;
428 return nullptr;
429 }();
430
431 for (const auto Redecl : D->redecls()) {
432 assert(Redecl);
433 // Skip all redeclarations that have been checked previously.
434 if (LastCheckedRedecl) {
435 if (LastCheckedRedecl == Redecl) {
436 LastCheckedRedecl = nullptr;
437 }
438 continue;
439 }
440 const RawComment *RedeclComment = getRawCommentForDeclNoCache(Redecl);
441 if (RedeclComment) {
442 cacheRawCommentForDecl(*Redecl, *RedeclComment);
443 if (OriginalDecl)
444 *OriginalDecl = Redecl;
445 return RedeclComment;
446 }
447 CommentlessRedeclChains[CanonicalD] = Redecl;
448 }
449
450 if (OriginalDecl)
451 *OriginalDecl = nullptr;
452 return nullptr;
453 }
454
cacheRawCommentForDecl(const Decl & OriginalD,const RawComment & Comment) const455 void ASTContext::cacheRawCommentForDecl(const Decl &OriginalD,
456 const RawComment &Comment) const {
457 assert(Comment.isDocumentation() || LangOpts.CommentOpts.ParseAllComments);
458 DeclRawComments.try_emplace(&OriginalD, &Comment);
459 const Decl *const CanonicalDecl = OriginalD.getCanonicalDecl();
460 RedeclChainComments.try_emplace(CanonicalDecl, &OriginalD);
461 CommentlessRedeclChains.erase(CanonicalDecl);
462 }
463
addRedeclaredMethods(const ObjCMethodDecl * ObjCMethod,SmallVectorImpl<const NamedDecl * > & Redeclared)464 static void addRedeclaredMethods(const ObjCMethodDecl *ObjCMethod,
465 SmallVectorImpl<const NamedDecl *> &Redeclared) {
466 const DeclContext *DC = ObjCMethod->getDeclContext();
467 if (const auto *IMD = dyn_cast<ObjCImplDecl>(DC)) {
468 const ObjCInterfaceDecl *ID = IMD->getClassInterface();
469 if (!ID)
470 return;
471 // Add redeclared method here.
472 for (const auto *Ext : ID->known_extensions()) {
473 if (ObjCMethodDecl *RedeclaredMethod =
474 Ext->getMethod(ObjCMethod->getSelector(),
475 ObjCMethod->isInstanceMethod()))
476 Redeclared.push_back(RedeclaredMethod);
477 }
478 }
479 }
480
attachCommentsToJustParsedDecls(ArrayRef<Decl * > Decls,const Preprocessor * PP)481 void ASTContext::attachCommentsToJustParsedDecls(ArrayRef<Decl *> Decls,
482 const Preprocessor *PP) {
483 if (Comments.empty() || Decls.empty())
484 return;
485
486 FileID File;
487 for (Decl *D : Decls) {
488 SourceLocation Loc = D->getLocation();
489 if (Loc.isValid()) {
490 // See if there are any new comments that are not attached to a decl.
491 // The location doesn't have to be precise - we care only about the file.
492 File = SourceMgr.getDecomposedLoc(Loc).first;
493 break;
494 }
495 }
496
497 if (File.isInvalid())
498 return;
499
500 auto CommentsInThisFile = Comments.getCommentsInFile(File);
501 if (!CommentsInThisFile || CommentsInThisFile->empty() ||
502 CommentsInThisFile->rbegin()->second->isAttached())
503 return;
504
505 // There is at least one comment not attached to a decl.
506 // Maybe it should be attached to one of Decls?
507 //
508 // Note that this way we pick up not only comments that precede the
509 // declaration, but also comments that *follow* the declaration -- thanks to
510 // the lookahead in the lexer: we've consumed the semicolon and looked
511 // ahead through comments.
512
513 for (const Decl *D : Decls) {
514 assert(D);
515 if (D->isInvalidDecl())
516 continue;
517
518 D = &adjustDeclToTemplate(*D);
519
520 const SourceLocation DeclLoc = getDeclLocForCommentSearch(D, SourceMgr);
521
522 if (DeclLoc.isInvalid() || !DeclLoc.isFileID())
523 continue;
524
525 if (DeclRawComments.count(D) > 0)
526 continue;
527
528 if (RawComment *const DocComment =
529 getRawCommentForDeclNoCacheImpl(D, DeclLoc, *CommentsInThisFile)) {
530 cacheRawCommentForDecl(*D, *DocComment);
531 comments::FullComment *FC = DocComment->parse(*this, PP, D);
532 ParsedComments[D->getCanonicalDecl()] = FC;
533 }
534 }
535 }
536
cloneFullComment(comments::FullComment * FC,const Decl * D) const537 comments::FullComment *ASTContext::cloneFullComment(comments::FullComment *FC,
538 const Decl *D) const {
539 auto *ThisDeclInfo = new (*this) comments::DeclInfo;
540 ThisDeclInfo->CommentDecl = D;
541 ThisDeclInfo->IsFilled = false;
542 ThisDeclInfo->fill();
543 ThisDeclInfo->CommentDecl = FC->getDecl();
544 if (!ThisDeclInfo->TemplateParameters)
545 ThisDeclInfo->TemplateParameters = FC->getDeclInfo()->TemplateParameters;
546 comments::FullComment *CFC =
547 new (*this) comments::FullComment(FC->getBlocks(),
548 ThisDeclInfo);
549 return CFC;
550 }
551
getLocalCommentForDeclUncached(const Decl * D) const552 comments::FullComment *ASTContext::getLocalCommentForDeclUncached(const Decl *D) const {
553 const RawComment *RC = getRawCommentForDeclNoCache(D);
554 return RC ? RC->parse(*this, nullptr, D) : nullptr;
555 }
556
getCommentForDecl(const Decl * D,const Preprocessor * PP) const557 comments::FullComment *ASTContext::getCommentForDecl(
558 const Decl *D,
559 const Preprocessor *PP) const {
560 if (!D || D->isInvalidDecl())
561 return nullptr;
562 D = &adjustDeclToTemplate(*D);
563
564 const Decl *Canonical = D->getCanonicalDecl();
565 llvm::DenseMap<const Decl *, comments::FullComment *>::iterator Pos =
566 ParsedComments.find(Canonical);
567
568 if (Pos != ParsedComments.end()) {
569 if (Canonical != D) {
570 comments::FullComment *FC = Pos->second;
571 comments::FullComment *CFC = cloneFullComment(FC, D);
572 return CFC;
573 }
574 return Pos->second;
575 }
576
577 const Decl *OriginalDecl = nullptr;
578
579 const RawComment *RC = getRawCommentForAnyRedecl(D, &OriginalDecl);
580 if (!RC) {
581 if (isa<ObjCMethodDecl>(D) || isa<FunctionDecl>(D)) {
582 SmallVector<const NamedDecl*, 8> Overridden;
583 const auto *OMD = dyn_cast<ObjCMethodDecl>(D);
584 if (OMD && OMD->isPropertyAccessor())
585 if (const ObjCPropertyDecl *PDecl = OMD->findPropertyDecl())
586 if (comments::FullComment *FC = getCommentForDecl(PDecl, PP))
587 return cloneFullComment(FC, D);
588 if (OMD)
589 addRedeclaredMethods(OMD, Overridden);
590 getOverriddenMethods(dyn_cast<NamedDecl>(D), Overridden);
591 for (unsigned i = 0, e = Overridden.size(); i < e; i++)
592 if (comments::FullComment *FC = getCommentForDecl(Overridden[i], PP))
593 return cloneFullComment(FC, D);
594 }
595 else if (const auto *TD = dyn_cast<TypedefNameDecl>(D)) {
596 // Attach any tag type's documentation to its typedef if latter
597 // does not have one of its own.
598 QualType QT = TD->getUnderlyingType();
599 if (const auto *TT = QT->getAs<TagType>())
600 if (const Decl *TD = TT->getDecl())
601 if (comments::FullComment *FC = getCommentForDecl(TD, PP))
602 return cloneFullComment(FC, D);
603 }
604 else if (const auto *IC = dyn_cast<ObjCInterfaceDecl>(D)) {
605 while (IC->getSuperClass()) {
606 IC = IC->getSuperClass();
607 if (comments::FullComment *FC = getCommentForDecl(IC, PP))
608 return cloneFullComment(FC, D);
609 }
610 }
611 else if (const auto *CD = dyn_cast<ObjCCategoryDecl>(D)) {
612 if (const ObjCInterfaceDecl *IC = CD->getClassInterface())
613 if (comments::FullComment *FC = getCommentForDecl(IC, PP))
614 return cloneFullComment(FC, D);
615 }
616 else if (const auto *RD = dyn_cast<CXXRecordDecl>(D)) {
617 if (!(RD = RD->getDefinition()))
618 return nullptr;
619 // Check non-virtual bases.
620 for (const auto &I : RD->bases()) {
621 if (I.isVirtual() || (I.getAccessSpecifier() != AS_public))
622 continue;
623 QualType Ty = I.getType();
624 if (Ty.isNull())
625 continue;
626 if (const CXXRecordDecl *NonVirtualBase = Ty->getAsCXXRecordDecl()) {
627 if (!(NonVirtualBase= NonVirtualBase->getDefinition()))
628 continue;
629
630 if (comments::FullComment *FC = getCommentForDecl((NonVirtualBase), PP))
631 return cloneFullComment(FC, D);
632 }
633 }
634 // Check virtual bases.
635 for (const auto &I : RD->vbases()) {
636 if (I.getAccessSpecifier() != AS_public)
637 continue;
638 QualType Ty = I.getType();
639 if (Ty.isNull())
640 continue;
641 if (const CXXRecordDecl *VirtualBase = Ty->getAsCXXRecordDecl()) {
642 if (!(VirtualBase= VirtualBase->getDefinition()))
643 continue;
644 if (comments::FullComment *FC = getCommentForDecl((VirtualBase), PP))
645 return cloneFullComment(FC, D);
646 }
647 }
648 }
649 return nullptr;
650 }
651
652 // If the RawComment was attached to other redeclaration of this Decl, we
653 // should parse the comment in context of that other Decl. This is important
654 // because comments can contain references to parameter names which can be
655 // different across redeclarations.
656 if (D != OriginalDecl && OriginalDecl)
657 return getCommentForDecl(OriginalDecl, PP);
658
659 comments::FullComment *FC = RC->parse(*this, PP, D);
660 ParsedComments[Canonical] = FC;
661 return FC;
662 }
663
664 void
Profile(llvm::FoldingSetNodeID & ID,const ASTContext & C,TemplateTemplateParmDecl * Parm)665 ASTContext::CanonicalTemplateTemplateParm::Profile(llvm::FoldingSetNodeID &ID,
666 const ASTContext &C,
667 TemplateTemplateParmDecl *Parm) {
668 ID.AddInteger(Parm->getDepth());
669 ID.AddInteger(Parm->getPosition());
670 ID.AddBoolean(Parm->isParameterPack());
671
672 TemplateParameterList *Params = Parm->getTemplateParameters();
673 ID.AddInteger(Params->size());
674 for (TemplateParameterList::const_iterator P = Params->begin(),
675 PEnd = Params->end();
676 P != PEnd; ++P) {
677 if (const auto *TTP = dyn_cast<TemplateTypeParmDecl>(*P)) {
678 ID.AddInteger(0);
679 ID.AddBoolean(TTP->isParameterPack());
680 const TypeConstraint *TC = TTP->getTypeConstraint();
681 ID.AddBoolean(TC != nullptr);
682 if (TC)
683 TC->getImmediatelyDeclaredConstraint()->Profile(ID, C,
684 /*Canonical=*/true);
685 if (TTP->isExpandedParameterPack()) {
686 ID.AddBoolean(true);
687 ID.AddInteger(TTP->getNumExpansionParameters());
688 } else
689 ID.AddBoolean(false);
690 continue;
691 }
692
693 if (const auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(*P)) {
694 ID.AddInteger(1);
695 ID.AddBoolean(NTTP->isParameterPack());
696 ID.AddPointer(NTTP->getType().getCanonicalType().getAsOpaquePtr());
697 if (NTTP->isExpandedParameterPack()) {
698 ID.AddBoolean(true);
699 ID.AddInteger(NTTP->getNumExpansionTypes());
700 for (unsigned I = 0, N = NTTP->getNumExpansionTypes(); I != N; ++I) {
701 QualType T = NTTP->getExpansionType(I);
702 ID.AddPointer(T.getCanonicalType().getAsOpaquePtr());
703 }
704 } else
705 ID.AddBoolean(false);
706 continue;
707 }
708
709 auto *TTP = cast<TemplateTemplateParmDecl>(*P);
710 ID.AddInteger(2);
711 Profile(ID, C, TTP);
712 }
713 Expr *RequiresClause = Parm->getTemplateParameters()->getRequiresClause();
714 ID.AddBoolean(RequiresClause != nullptr);
715 if (RequiresClause)
716 RequiresClause->Profile(ID, C, /*Canonical=*/true);
717 }
718
719 static Expr *
canonicalizeImmediatelyDeclaredConstraint(const ASTContext & C,Expr * IDC,QualType ConstrainedType)720 canonicalizeImmediatelyDeclaredConstraint(const ASTContext &C, Expr *IDC,
721 QualType ConstrainedType) {
722 // This is a bit ugly - we need to form a new immediately-declared
723 // constraint that references the new parameter; this would ideally
724 // require semantic analysis (e.g. template<C T> struct S {}; - the
725 // converted arguments of C<T> could be an argument pack if C is
726 // declared as template<typename... T> concept C = ...).
727 // We don't have semantic analysis here so we dig deep into the
728 // ready-made constraint expr and change the thing manually.
729 ConceptSpecializationExpr *CSE;
730 if (const auto *Fold = dyn_cast<CXXFoldExpr>(IDC))
731 CSE = cast<ConceptSpecializationExpr>(Fold->getLHS());
732 else
733 CSE = cast<ConceptSpecializationExpr>(IDC);
734 ArrayRef<TemplateArgument> OldConverted = CSE->getTemplateArguments();
735 SmallVector<TemplateArgument, 3> NewConverted;
736 NewConverted.reserve(OldConverted.size());
737 if (OldConverted.front().getKind() == TemplateArgument::Pack) {
738 // The case:
739 // template<typename... T> concept C = true;
740 // template<C<int> T> struct S; -> constraint is C<{T, int}>
741 NewConverted.push_back(ConstrainedType);
742 for (auto &Arg : OldConverted.front().pack_elements().drop_front(1))
743 NewConverted.push_back(Arg);
744 TemplateArgument NewPack(NewConverted);
745
746 NewConverted.clear();
747 NewConverted.push_back(NewPack);
748 assert(OldConverted.size() == 1 &&
749 "Template parameter pack should be the last parameter");
750 } else {
751 assert(OldConverted.front().getKind() == TemplateArgument::Type &&
752 "Unexpected first argument kind for immediately-declared "
753 "constraint");
754 NewConverted.push_back(ConstrainedType);
755 for (auto &Arg : OldConverted.drop_front(1))
756 NewConverted.push_back(Arg);
757 }
758 Expr *NewIDC = ConceptSpecializationExpr::Create(
759 C, CSE->getNamedConcept(), NewConverted, nullptr,
760 CSE->isInstantiationDependent(), CSE->containsUnexpandedParameterPack());
761
762 if (auto *OrigFold = dyn_cast<CXXFoldExpr>(IDC))
763 NewIDC = new (C) CXXFoldExpr(
764 OrigFold->getType(), /*Callee*/nullptr, SourceLocation(), NewIDC,
765 BinaryOperatorKind::BO_LAnd, SourceLocation(), /*RHS=*/nullptr,
766 SourceLocation(), /*NumExpansions=*/None);
767 return NewIDC;
768 }
769
770 TemplateTemplateParmDecl *
getCanonicalTemplateTemplateParmDecl(TemplateTemplateParmDecl * TTP) const771 ASTContext::getCanonicalTemplateTemplateParmDecl(
772 TemplateTemplateParmDecl *TTP) const {
773 // Check if we already have a canonical template template parameter.
774 llvm::FoldingSetNodeID ID;
775 CanonicalTemplateTemplateParm::Profile(ID, *this, TTP);
776 void *InsertPos = nullptr;
777 CanonicalTemplateTemplateParm *Canonical
778 = CanonTemplateTemplateParms.FindNodeOrInsertPos(ID, InsertPos);
779 if (Canonical)
780 return Canonical->getParam();
781
782 // Build a canonical template parameter list.
783 TemplateParameterList *Params = TTP->getTemplateParameters();
784 SmallVector<NamedDecl *, 4> CanonParams;
785 CanonParams.reserve(Params->size());
786 for (TemplateParameterList::const_iterator P = Params->begin(),
787 PEnd = Params->end();
788 P != PEnd; ++P) {
789 if (const auto *TTP = dyn_cast<TemplateTypeParmDecl>(*P)) {
790 TemplateTypeParmDecl *NewTTP = TemplateTypeParmDecl::Create(*this,
791 getTranslationUnitDecl(), SourceLocation(), SourceLocation(),
792 TTP->getDepth(), TTP->getIndex(), nullptr, false,
793 TTP->isParameterPack(), TTP->hasTypeConstraint(),
794 TTP->isExpandedParameterPack() ?
795 llvm::Optional<unsigned>(TTP->getNumExpansionParameters()) : None);
796 if (const auto *TC = TTP->getTypeConstraint()) {
797 QualType ParamAsArgument(NewTTP->getTypeForDecl(), 0);
798 Expr *NewIDC = canonicalizeImmediatelyDeclaredConstraint(
799 *this, TC->getImmediatelyDeclaredConstraint(),
800 ParamAsArgument);
801 TemplateArgumentListInfo CanonArgsAsWritten;
802 if (auto *Args = TC->getTemplateArgsAsWritten())
803 for (const auto &ArgLoc : Args->arguments())
804 CanonArgsAsWritten.addArgument(
805 TemplateArgumentLoc(ArgLoc.getArgument(),
806 TemplateArgumentLocInfo()));
807 NewTTP->setTypeConstraint(
808 NestedNameSpecifierLoc(),
809 DeclarationNameInfo(TC->getNamedConcept()->getDeclName(),
810 SourceLocation()), /*FoundDecl=*/nullptr,
811 // Actually canonicalizing a TemplateArgumentLoc is difficult so we
812 // simply omit the ArgsAsWritten
813 TC->getNamedConcept(), /*ArgsAsWritten=*/nullptr, NewIDC);
814 }
815 CanonParams.push_back(NewTTP);
816 } else if (const auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(*P)) {
817 QualType T = getCanonicalType(NTTP->getType());
818 TypeSourceInfo *TInfo = getTrivialTypeSourceInfo(T);
819 NonTypeTemplateParmDecl *Param;
820 if (NTTP->isExpandedParameterPack()) {
821 SmallVector<QualType, 2> ExpandedTypes;
822 SmallVector<TypeSourceInfo *, 2> ExpandedTInfos;
823 for (unsigned I = 0, N = NTTP->getNumExpansionTypes(); I != N; ++I) {
824 ExpandedTypes.push_back(getCanonicalType(NTTP->getExpansionType(I)));
825 ExpandedTInfos.push_back(
826 getTrivialTypeSourceInfo(ExpandedTypes.back()));
827 }
828
829 Param = NonTypeTemplateParmDecl::Create(*this, getTranslationUnitDecl(),
830 SourceLocation(),
831 SourceLocation(),
832 NTTP->getDepth(),
833 NTTP->getPosition(), nullptr,
834 T,
835 TInfo,
836 ExpandedTypes,
837 ExpandedTInfos);
838 } else {
839 Param = NonTypeTemplateParmDecl::Create(*this, getTranslationUnitDecl(),
840 SourceLocation(),
841 SourceLocation(),
842 NTTP->getDepth(),
843 NTTP->getPosition(), nullptr,
844 T,
845 NTTP->isParameterPack(),
846 TInfo);
847 }
848 if (AutoType *AT = T->getContainedAutoType()) {
849 if (AT->isConstrained()) {
850 Param->setPlaceholderTypeConstraint(
851 canonicalizeImmediatelyDeclaredConstraint(
852 *this, NTTP->getPlaceholderTypeConstraint(), T));
853 }
854 }
855 CanonParams.push_back(Param);
856
857 } else
858 CanonParams.push_back(getCanonicalTemplateTemplateParmDecl(
859 cast<TemplateTemplateParmDecl>(*P)));
860 }
861
862 Expr *CanonRequiresClause = nullptr;
863 if (Expr *RequiresClause = TTP->getTemplateParameters()->getRequiresClause())
864 CanonRequiresClause = RequiresClause;
865
866 TemplateTemplateParmDecl *CanonTTP
867 = TemplateTemplateParmDecl::Create(*this, getTranslationUnitDecl(),
868 SourceLocation(), TTP->getDepth(),
869 TTP->getPosition(),
870 TTP->isParameterPack(),
871 nullptr,
872 TemplateParameterList::Create(*this, SourceLocation(),
873 SourceLocation(),
874 CanonParams,
875 SourceLocation(),
876 CanonRequiresClause));
877
878 // Get the new insert position for the node we care about.
879 Canonical = CanonTemplateTemplateParms.FindNodeOrInsertPos(ID, InsertPos);
880 assert(!Canonical && "Shouldn't be in the map!");
881 (void)Canonical;
882
883 // Create the canonical template template parameter entry.
884 Canonical = new (*this) CanonicalTemplateTemplateParm(CanonTTP);
885 CanonTemplateTemplateParms.InsertNode(Canonical, InsertPos);
886 return CanonTTP;
887 }
888
getCXXABIKind() const889 TargetCXXABI::Kind ASTContext::getCXXABIKind() const {
890 auto Kind = getTargetInfo().getCXXABI().getKind();
891 return getLangOpts().CXXABI.getValueOr(Kind);
892 }
893
createCXXABI(const TargetInfo & T)894 CXXABI *ASTContext::createCXXABI(const TargetInfo &T) {
895 if (!LangOpts.CPlusPlus) return nullptr;
896
897 switch (getCXXABIKind()) {
898 case TargetCXXABI::AppleARM64:
899 case TargetCXXABI::Fuchsia:
900 case TargetCXXABI::GenericARM: // Same as Itanium at this level
901 case TargetCXXABI::iOS:
902 case TargetCXXABI::WatchOS:
903 case TargetCXXABI::GenericAArch64:
904 case TargetCXXABI::GenericMIPS:
905 case TargetCXXABI::GenericItanium:
906 case TargetCXXABI::WebAssembly:
907 case TargetCXXABI::XL:
908 return CreateItaniumCXXABI(*this);
909 case TargetCXXABI::Microsoft:
910 return CreateMicrosoftCXXABI(*this);
911 }
912 llvm_unreachable("Invalid CXXABI type!");
913 }
914
getInterpContext()915 interp::Context &ASTContext::getInterpContext() {
916 if (!InterpContext) {
917 InterpContext.reset(new interp::Context(*this));
918 }
919 return *InterpContext.get();
920 }
921
getParentMapContext()922 ParentMapContext &ASTContext::getParentMapContext() {
923 if (!ParentMapCtx)
924 ParentMapCtx.reset(new ParentMapContext(*this));
925 return *ParentMapCtx.get();
926 }
927
getAddressSpaceMap(const TargetInfo & T,const LangOptions & LOpts)928 static const LangASMap *getAddressSpaceMap(const TargetInfo &T,
929 const LangOptions &LOpts) {
930 if (LOpts.FakeAddressSpaceMap) {
931 // The fake address space map must have a distinct entry for each
932 // language-specific address space.
933 static const unsigned FakeAddrSpaceMap[] = {
934 0, // Default
935 1, // opencl_global
936 3, // opencl_local
937 2, // opencl_constant
938 0, // opencl_private
939 4, // opencl_generic
940 5, // opencl_global_device
941 6, // opencl_global_host
942 7, // cuda_device
943 8, // cuda_constant
944 9, // cuda_shared
945 1, // sycl_global
946 5, // sycl_global_device
947 6, // sycl_global_host
948 3, // sycl_local
949 0, // sycl_private
950 10, // ptr32_sptr
951 11, // ptr32_uptr
952 12 // ptr64
953 };
954 return &FakeAddrSpaceMap;
955 } else {
956 return &T.getAddressSpaceMap();
957 }
958 }
959
isAddrSpaceMapManglingEnabled(const TargetInfo & TI,const LangOptions & LangOpts)960 static bool isAddrSpaceMapManglingEnabled(const TargetInfo &TI,
961 const LangOptions &LangOpts) {
962 switch (LangOpts.getAddressSpaceMapMangling()) {
963 case LangOptions::ASMM_Target:
964 return TI.useAddressSpaceMapMangling();
965 case LangOptions::ASMM_On:
966 return true;
967 case LangOptions::ASMM_Off:
968 return false;
969 }
970 llvm_unreachable("getAddressSpaceMapMangling() doesn't cover anything.");
971 }
972
ASTContext(LangOptions & LOpts,SourceManager & SM,IdentifierTable & idents,SelectorTable & sels,Builtin::Context & builtins,TranslationUnitKind TUKind)973 ASTContext::ASTContext(LangOptions &LOpts, SourceManager &SM,
974 IdentifierTable &idents, SelectorTable &sels,
975 Builtin::Context &builtins, TranslationUnitKind TUKind)
976 : ConstantArrayTypes(this_()), FunctionProtoTypes(this_()),
977 TemplateSpecializationTypes(this_()),
978 DependentTemplateSpecializationTypes(this_()), AutoTypes(this_()),
979 SubstTemplateTemplateParmPacks(this_()),
980 CanonTemplateTemplateParms(this_()), SourceMgr(SM), LangOpts(LOpts),
981 NoSanitizeL(new NoSanitizeList(LangOpts.NoSanitizeFiles, SM)),
982 XRayFilter(new XRayFunctionFilter(LangOpts.XRayAlwaysInstrumentFiles,
983 LangOpts.XRayNeverInstrumentFiles,
984 LangOpts.XRayAttrListFiles, SM)),
985 ProfList(new ProfileList(LangOpts.ProfileListFiles, SM)),
986 PrintingPolicy(LOpts), Idents(idents), Selectors(sels),
987 BuiltinInfo(builtins), TUKind(TUKind), DeclarationNames(*this),
988 Comments(SM), CommentCommandTraits(BumpAlloc, LOpts.CommentOpts),
989 CompCategories(this_()), LastSDM(nullptr, 0) {
990 addTranslationUnitDecl();
991 }
992
~ASTContext()993 ASTContext::~ASTContext() {
994 // Release the DenseMaps associated with DeclContext objects.
995 // FIXME: Is this the ideal solution?
996 ReleaseDeclContextMaps();
997
998 // Call all of the deallocation functions on all of their targets.
999 for (auto &Pair : Deallocations)
1000 (Pair.first)(Pair.second);
1001
1002 // ASTRecordLayout objects in ASTRecordLayouts must always be destroyed
1003 // because they can contain DenseMaps.
1004 for (llvm::DenseMap<const ObjCContainerDecl*,
1005 const ASTRecordLayout*>::iterator
1006 I = ObjCLayouts.begin(), E = ObjCLayouts.end(); I != E; )
1007 // Increment in loop to prevent using deallocated memory.
1008 if (auto *R = const_cast<ASTRecordLayout *>((I++)->second))
1009 R->Destroy(*this);
1010
1011 for (llvm::DenseMap<const RecordDecl*, const ASTRecordLayout*>::iterator
1012 I = ASTRecordLayouts.begin(), E = ASTRecordLayouts.end(); I != E; ) {
1013 // Increment in loop to prevent using deallocated memory.
1014 if (auto *R = const_cast<ASTRecordLayout *>((I++)->second))
1015 R->Destroy(*this);
1016 }
1017
1018 for (llvm::DenseMap<const Decl*, AttrVec*>::iterator A = DeclAttrs.begin(),
1019 AEnd = DeclAttrs.end();
1020 A != AEnd; ++A)
1021 A->second->~AttrVec();
1022
1023 for (const auto &Value : ModuleInitializers)
1024 Value.second->~PerModuleInitializers();
1025 }
1026
setTraversalScope(const std::vector<Decl * > & TopLevelDecls)1027 void ASTContext::setTraversalScope(const std::vector<Decl *> &TopLevelDecls) {
1028 TraversalScope = TopLevelDecls;
1029 getParentMapContext().clear();
1030 }
1031
AddDeallocation(void (* Callback)(void *),void * Data) const1032 void ASTContext::AddDeallocation(void (*Callback)(void *), void *Data) const {
1033 Deallocations.push_back({Callback, Data});
1034 }
1035
1036 void
setExternalSource(IntrusiveRefCntPtr<ExternalASTSource> Source)1037 ASTContext::setExternalSource(IntrusiveRefCntPtr<ExternalASTSource> Source) {
1038 ExternalSource = std::move(Source);
1039 }
1040
PrintStats() const1041 void ASTContext::PrintStats() const {
1042 llvm::errs() << "\n*** AST Context Stats:\n";
1043 llvm::errs() << " " << Types.size() << " types total.\n";
1044
1045 unsigned counts[] = {
1046 #define TYPE(Name, Parent) 0,
1047 #define ABSTRACT_TYPE(Name, Parent)
1048 #include "clang/AST/TypeNodes.inc"
1049 0 // Extra
1050 };
1051
1052 for (unsigned i = 0, e = Types.size(); i != e; ++i) {
1053 Type *T = Types[i];
1054 counts[(unsigned)T->getTypeClass()]++;
1055 }
1056
1057 unsigned Idx = 0;
1058 unsigned TotalBytes = 0;
1059 #define TYPE(Name, Parent) \
1060 if (counts[Idx]) \
1061 llvm::errs() << " " << counts[Idx] << " " << #Name \
1062 << " types, " << sizeof(Name##Type) << " each " \
1063 << "(" << counts[Idx] * sizeof(Name##Type) \
1064 << " bytes)\n"; \
1065 TotalBytes += counts[Idx] * sizeof(Name##Type); \
1066 ++Idx;
1067 #define ABSTRACT_TYPE(Name, Parent)
1068 #include "clang/AST/TypeNodes.inc"
1069
1070 llvm::errs() << "Total bytes = " << TotalBytes << "\n";
1071
1072 // Implicit special member functions.
1073 llvm::errs() << NumImplicitDefaultConstructorsDeclared << "/"
1074 << NumImplicitDefaultConstructors
1075 << " implicit default constructors created\n";
1076 llvm::errs() << NumImplicitCopyConstructorsDeclared << "/"
1077 << NumImplicitCopyConstructors
1078 << " implicit copy constructors created\n";
1079 if (getLangOpts().CPlusPlus)
1080 llvm::errs() << NumImplicitMoveConstructorsDeclared << "/"
1081 << NumImplicitMoveConstructors
1082 << " implicit move constructors created\n";
1083 llvm::errs() << NumImplicitCopyAssignmentOperatorsDeclared << "/"
1084 << NumImplicitCopyAssignmentOperators
1085 << " implicit copy assignment operators created\n";
1086 if (getLangOpts().CPlusPlus)
1087 llvm::errs() << NumImplicitMoveAssignmentOperatorsDeclared << "/"
1088 << NumImplicitMoveAssignmentOperators
1089 << " implicit move assignment operators created\n";
1090 llvm::errs() << NumImplicitDestructorsDeclared << "/"
1091 << NumImplicitDestructors
1092 << " implicit destructors created\n";
1093
1094 if (ExternalSource) {
1095 llvm::errs() << "\n";
1096 ExternalSource->PrintStats();
1097 }
1098
1099 BumpAlloc.PrintStats();
1100 }
1101
mergeDefinitionIntoModule(NamedDecl * ND,Module * M,bool NotifyListeners)1102 void ASTContext::mergeDefinitionIntoModule(NamedDecl *ND, Module *M,
1103 bool NotifyListeners) {
1104 if (NotifyListeners)
1105 if (auto *Listener = getASTMutationListener())
1106 Listener->RedefinedHiddenDefinition(ND, M);
1107
1108 MergedDefModules[cast<NamedDecl>(ND->getCanonicalDecl())].push_back(M);
1109 }
1110
deduplicateMergedDefinitonsFor(NamedDecl * ND)1111 void ASTContext::deduplicateMergedDefinitonsFor(NamedDecl *ND) {
1112 auto It = MergedDefModules.find(cast<NamedDecl>(ND->getCanonicalDecl()));
1113 if (It == MergedDefModules.end())
1114 return;
1115
1116 auto &Merged = It->second;
1117 llvm::DenseSet<Module*> Found;
1118 for (Module *&M : Merged)
1119 if (!Found.insert(M).second)
1120 M = nullptr;
1121 Merged.erase(std::remove(Merged.begin(), Merged.end(), nullptr), Merged.end());
1122 }
1123
1124 ArrayRef<Module *>
getModulesWithMergedDefinition(const NamedDecl * Def)1125 ASTContext::getModulesWithMergedDefinition(const NamedDecl *Def) {
1126 auto MergedIt =
1127 MergedDefModules.find(cast<NamedDecl>(Def->getCanonicalDecl()));
1128 if (MergedIt == MergedDefModules.end())
1129 return None;
1130 return MergedIt->second;
1131 }
1132
resolve(ASTContext & Ctx)1133 void ASTContext::PerModuleInitializers::resolve(ASTContext &Ctx) {
1134 if (LazyInitializers.empty())
1135 return;
1136
1137 auto *Source = Ctx.getExternalSource();
1138 assert(Source && "lazy initializers but no external source");
1139
1140 auto LazyInits = std::move(LazyInitializers);
1141 LazyInitializers.clear();
1142
1143 for (auto ID : LazyInits)
1144 Initializers.push_back(Source->GetExternalDecl(ID));
1145
1146 assert(LazyInitializers.empty() &&
1147 "GetExternalDecl for lazy module initializer added more inits");
1148 }
1149
addModuleInitializer(Module * M,Decl * D)1150 void ASTContext::addModuleInitializer(Module *M, Decl *D) {
1151 // One special case: if we add a module initializer that imports another
1152 // module, and that module's only initializer is an ImportDecl, simplify.
1153 if (const auto *ID = dyn_cast<ImportDecl>(D)) {
1154 auto It = ModuleInitializers.find(ID->getImportedModule());
1155
1156 // Maybe the ImportDecl does nothing at all. (Common case.)
1157 if (It == ModuleInitializers.end())
1158 return;
1159
1160 // Maybe the ImportDecl only imports another ImportDecl.
1161 auto &Imported = *It->second;
1162 if (Imported.Initializers.size() + Imported.LazyInitializers.size() == 1) {
1163 Imported.resolve(*this);
1164 auto *OnlyDecl = Imported.Initializers.front();
1165 if (isa<ImportDecl>(OnlyDecl))
1166 D = OnlyDecl;
1167 }
1168 }
1169
1170 auto *&Inits = ModuleInitializers[M];
1171 if (!Inits)
1172 Inits = new (*this) PerModuleInitializers;
1173 Inits->Initializers.push_back(D);
1174 }
1175
addLazyModuleInitializers(Module * M,ArrayRef<uint32_t> IDs)1176 void ASTContext::addLazyModuleInitializers(Module *M, ArrayRef<uint32_t> IDs) {
1177 auto *&Inits = ModuleInitializers[M];
1178 if (!Inits)
1179 Inits = new (*this) PerModuleInitializers;
1180 Inits->LazyInitializers.insert(Inits->LazyInitializers.end(),
1181 IDs.begin(), IDs.end());
1182 }
1183
getModuleInitializers(Module * M)1184 ArrayRef<Decl *> ASTContext::getModuleInitializers(Module *M) {
1185 auto It = ModuleInitializers.find(M);
1186 if (It == ModuleInitializers.end())
1187 return None;
1188
1189 auto *Inits = It->second;
1190 Inits->resolve(*this);
1191 return Inits->Initializers;
1192 }
1193
getExternCContextDecl() const1194 ExternCContextDecl *ASTContext::getExternCContextDecl() const {
1195 if (!ExternCContext)
1196 ExternCContext = ExternCContextDecl::Create(*this, getTranslationUnitDecl());
1197
1198 return ExternCContext;
1199 }
1200
1201 BuiltinTemplateDecl *
buildBuiltinTemplateDecl(BuiltinTemplateKind BTK,const IdentifierInfo * II) const1202 ASTContext::buildBuiltinTemplateDecl(BuiltinTemplateKind BTK,
1203 const IdentifierInfo *II) const {
1204 auto *BuiltinTemplate =
1205 BuiltinTemplateDecl::Create(*this, getTranslationUnitDecl(), II, BTK);
1206 BuiltinTemplate->setImplicit();
1207 getTranslationUnitDecl()->addDecl(BuiltinTemplate);
1208
1209 return BuiltinTemplate;
1210 }
1211
1212 BuiltinTemplateDecl *
getMakeIntegerSeqDecl() const1213 ASTContext::getMakeIntegerSeqDecl() const {
1214 if (!MakeIntegerSeqDecl)
1215 MakeIntegerSeqDecl = buildBuiltinTemplateDecl(BTK__make_integer_seq,
1216 getMakeIntegerSeqName());
1217 return MakeIntegerSeqDecl;
1218 }
1219
1220 BuiltinTemplateDecl *
getTypePackElementDecl() const1221 ASTContext::getTypePackElementDecl() const {
1222 if (!TypePackElementDecl)
1223 TypePackElementDecl = buildBuiltinTemplateDecl(BTK__type_pack_element,
1224 getTypePackElementName());
1225 return TypePackElementDecl;
1226 }
1227
buildImplicitRecord(StringRef Name,RecordDecl::TagKind TK) const1228 RecordDecl *ASTContext::buildImplicitRecord(StringRef Name,
1229 RecordDecl::TagKind TK) const {
1230 SourceLocation Loc;
1231 RecordDecl *NewDecl;
1232 if (getLangOpts().CPlusPlus)
1233 NewDecl = CXXRecordDecl::Create(*this, TK, getTranslationUnitDecl(), Loc,
1234 Loc, &Idents.get(Name));
1235 else
1236 NewDecl = RecordDecl::Create(*this, TK, getTranslationUnitDecl(), Loc, Loc,
1237 &Idents.get(Name));
1238 NewDecl->setImplicit();
1239 NewDecl->addAttr(TypeVisibilityAttr::CreateImplicit(
1240 const_cast<ASTContext &>(*this), TypeVisibilityAttr::Default));
1241 return NewDecl;
1242 }
1243
buildImplicitTypedef(QualType T,StringRef Name) const1244 TypedefDecl *ASTContext::buildImplicitTypedef(QualType T,
1245 StringRef Name) const {
1246 TypeSourceInfo *TInfo = getTrivialTypeSourceInfo(T);
1247 TypedefDecl *NewDecl = TypedefDecl::Create(
1248 const_cast<ASTContext &>(*this), getTranslationUnitDecl(),
1249 SourceLocation(), SourceLocation(), &Idents.get(Name), TInfo);
1250 NewDecl->setImplicit();
1251 return NewDecl;
1252 }
1253
getInt128Decl() const1254 TypedefDecl *ASTContext::getInt128Decl() const {
1255 if (!Int128Decl)
1256 Int128Decl = buildImplicitTypedef(Int128Ty, "__int128_t");
1257 return Int128Decl;
1258 }
1259
getUInt128Decl() const1260 TypedefDecl *ASTContext::getUInt128Decl() const {
1261 if (!UInt128Decl)
1262 UInt128Decl = buildImplicitTypedef(UnsignedInt128Ty, "__uint128_t");
1263 return UInt128Decl;
1264 }
1265
InitBuiltinType(CanQualType & R,BuiltinType::Kind K)1266 void ASTContext::InitBuiltinType(CanQualType &R, BuiltinType::Kind K) {
1267 auto *Ty = new (*this, TypeAlignment) BuiltinType(K);
1268 R = CanQualType::CreateUnsafe(QualType(Ty, 0));
1269 Types.push_back(Ty);
1270 }
1271
InitBuiltinTypes(const TargetInfo & Target,const TargetInfo * AuxTarget)1272 void ASTContext::InitBuiltinTypes(const TargetInfo &Target,
1273 const TargetInfo *AuxTarget) {
1274 assert((!this->Target || this->Target == &Target) &&
1275 "Incorrect target reinitialization");
1276 assert(VoidTy.isNull() && "Context reinitialized?");
1277
1278 this->Target = &Target;
1279 this->AuxTarget = AuxTarget;
1280
1281 ABI.reset(createCXXABI(Target));
1282 AddrSpaceMap = getAddressSpaceMap(Target, LangOpts);
1283 AddrSpaceMapMangling = isAddrSpaceMapManglingEnabled(Target, LangOpts);
1284
1285 // C99 6.2.5p19.
1286 InitBuiltinType(VoidTy, BuiltinType::Void);
1287
1288 // C99 6.2.5p2.
1289 InitBuiltinType(BoolTy, BuiltinType::Bool);
1290 // C99 6.2.5p3.
1291 if (LangOpts.CharIsSigned)
1292 InitBuiltinType(CharTy, BuiltinType::Char_S);
1293 else
1294 InitBuiltinType(CharTy, BuiltinType::Char_U);
1295 // C99 6.2.5p4.
1296 InitBuiltinType(SignedCharTy, BuiltinType::SChar);
1297 InitBuiltinType(ShortTy, BuiltinType::Short);
1298 InitBuiltinType(IntTy, BuiltinType::Int);
1299 InitBuiltinType(LongTy, BuiltinType::Long);
1300 InitBuiltinType(LongLongTy, BuiltinType::LongLong);
1301
1302 // C99 6.2.5p6.
1303 InitBuiltinType(UnsignedCharTy, BuiltinType::UChar);
1304 InitBuiltinType(UnsignedShortTy, BuiltinType::UShort);
1305 InitBuiltinType(UnsignedIntTy, BuiltinType::UInt);
1306 InitBuiltinType(UnsignedLongTy, BuiltinType::ULong);
1307 InitBuiltinType(UnsignedLongLongTy, BuiltinType::ULongLong);
1308
1309 // C99 6.2.5p10.
1310 InitBuiltinType(FloatTy, BuiltinType::Float);
1311 InitBuiltinType(DoubleTy, BuiltinType::Double);
1312 InitBuiltinType(LongDoubleTy, BuiltinType::LongDouble);
1313
1314 // GNU extension, __float128 for IEEE quadruple precision
1315 InitBuiltinType(Float128Ty, BuiltinType::Float128);
1316
1317 // __ibm128 for IBM extended precision
1318 InitBuiltinType(Ibm128Ty, BuiltinType::Ibm128);
1319
1320 // C11 extension ISO/IEC TS 18661-3
1321 InitBuiltinType(Float16Ty, BuiltinType::Float16);
1322
1323 // ISO/IEC JTC1 SC22 WG14 N1169 Extension
1324 InitBuiltinType(ShortAccumTy, BuiltinType::ShortAccum);
1325 InitBuiltinType(AccumTy, BuiltinType::Accum);
1326 InitBuiltinType(LongAccumTy, BuiltinType::LongAccum);
1327 InitBuiltinType(UnsignedShortAccumTy, BuiltinType::UShortAccum);
1328 InitBuiltinType(UnsignedAccumTy, BuiltinType::UAccum);
1329 InitBuiltinType(UnsignedLongAccumTy, BuiltinType::ULongAccum);
1330 InitBuiltinType(ShortFractTy, BuiltinType::ShortFract);
1331 InitBuiltinType(FractTy, BuiltinType::Fract);
1332 InitBuiltinType(LongFractTy, BuiltinType::LongFract);
1333 InitBuiltinType(UnsignedShortFractTy, BuiltinType::UShortFract);
1334 InitBuiltinType(UnsignedFractTy, BuiltinType::UFract);
1335 InitBuiltinType(UnsignedLongFractTy, BuiltinType::ULongFract);
1336 InitBuiltinType(SatShortAccumTy, BuiltinType::SatShortAccum);
1337 InitBuiltinType(SatAccumTy, BuiltinType::SatAccum);
1338 InitBuiltinType(SatLongAccumTy, BuiltinType::SatLongAccum);
1339 InitBuiltinType(SatUnsignedShortAccumTy, BuiltinType::SatUShortAccum);
1340 InitBuiltinType(SatUnsignedAccumTy, BuiltinType::SatUAccum);
1341 InitBuiltinType(SatUnsignedLongAccumTy, BuiltinType::SatULongAccum);
1342 InitBuiltinType(SatShortFractTy, BuiltinType::SatShortFract);
1343 InitBuiltinType(SatFractTy, BuiltinType::SatFract);
1344 InitBuiltinType(SatLongFractTy, BuiltinType::SatLongFract);
1345 InitBuiltinType(SatUnsignedShortFractTy, BuiltinType::SatUShortFract);
1346 InitBuiltinType(SatUnsignedFractTy, BuiltinType::SatUFract);
1347 InitBuiltinType(SatUnsignedLongFractTy, BuiltinType::SatULongFract);
1348
1349 // GNU extension, 128-bit integers.
1350 InitBuiltinType(Int128Ty, BuiltinType::Int128);
1351 InitBuiltinType(UnsignedInt128Ty, BuiltinType::UInt128);
1352
1353 // C++ 3.9.1p5
1354 if (TargetInfo::isTypeSigned(Target.getWCharType()))
1355 InitBuiltinType(WCharTy, BuiltinType::WChar_S);
1356 else // -fshort-wchar makes wchar_t be unsigned.
1357 InitBuiltinType(WCharTy, BuiltinType::WChar_U);
1358 if (LangOpts.CPlusPlus && LangOpts.WChar)
1359 WideCharTy = WCharTy;
1360 else {
1361 // C99 (or C++ using -fno-wchar).
1362 WideCharTy = getFromTargetType(Target.getWCharType());
1363 }
1364
1365 WIntTy = getFromTargetType(Target.getWIntType());
1366
1367 // C++20 (proposed)
1368 InitBuiltinType(Char8Ty, BuiltinType::Char8);
1369
1370 if (LangOpts.CPlusPlus) // C++0x 3.9.1p5, extension for C++
1371 InitBuiltinType(Char16Ty, BuiltinType::Char16);
1372 else // C99
1373 Char16Ty = getFromTargetType(Target.getChar16Type());
1374
1375 if (LangOpts.CPlusPlus) // C++0x 3.9.1p5, extension for C++
1376 InitBuiltinType(Char32Ty, BuiltinType::Char32);
1377 else // C99
1378 Char32Ty = getFromTargetType(Target.getChar32Type());
1379
1380 // Placeholder type for type-dependent expressions whose type is
1381 // completely unknown. No code should ever check a type against
1382 // DependentTy and users should never see it; however, it is here to
1383 // help diagnose failures to properly check for type-dependent
1384 // expressions.
1385 InitBuiltinType(DependentTy, BuiltinType::Dependent);
1386
1387 // Placeholder type for functions.
1388 InitBuiltinType(OverloadTy, BuiltinType::Overload);
1389
1390 // Placeholder type for bound members.
1391 InitBuiltinType(BoundMemberTy, BuiltinType::BoundMember);
1392
1393 // Placeholder type for pseudo-objects.
1394 InitBuiltinType(PseudoObjectTy, BuiltinType::PseudoObject);
1395
1396 // "any" type; useful for debugger-like clients.
1397 InitBuiltinType(UnknownAnyTy, BuiltinType::UnknownAny);
1398
1399 // Placeholder type for unbridged ARC casts.
1400 InitBuiltinType(ARCUnbridgedCastTy, BuiltinType::ARCUnbridgedCast);
1401
1402 // Placeholder type for builtin functions.
1403 InitBuiltinType(BuiltinFnTy, BuiltinType::BuiltinFn);
1404
1405 // Placeholder type for OMP array sections.
1406 if (LangOpts.OpenMP) {
1407 InitBuiltinType(OMPArraySectionTy, BuiltinType::OMPArraySection);
1408 InitBuiltinType(OMPArrayShapingTy, BuiltinType::OMPArrayShaping);
1409 InitBuiltinType(OMPIteratorTy, BuiltinType::OMPIterator);
1410 }
1411 if (LangOpts.MatrixTypes)
1412 InitBuiltinType(IncompleteMatrixIdxTy, BuiltinType::IncompleteMatrixIdx);
1413
1414 // Builtin types for 'id', 'Class', and 'SEL'.
1415 InitBuiltinType(ObjCBuiltinIdTy, BuiltinType::ObjCId);
1416 InitBuiltinType(ObjCBuiltinClassTy, BuiltinType::ObjCClass);
1417 InitBuiltinType(ObjCBuiltinSelTy, BuiltinType::ObjCSel);
1418
1419 if (LangOpts.OpenCL) {
1420 #define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
1421 InitBuiltinType(SingletonId, BuiltinType::Id);
1422 #include "clang/Basic/OpenCLImageTypes.def"
1423
1424 InitBuiltinType(OCLSamplerTy, BuiltinType::OCLSampler);
1425 InitBuiltinType(OCLEventTy, BuiltinType::OCLEvent);
1426 InitBuiltinType(OCLClkEventTy, BuiltinType::OCLClkEvent);
1427 InitBuiltinType(OCLQueueTy, BuiltinType::OCLQueue);
1428 InitBuiltinType(OCLReserveIDTy, BuiltinType::OCLReserveID);
1429
1430 #define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
1431 InitBuiltinType(Id##Ty, BuiltinType::Id);
1432 #include "clang/Basic/OpenCLExtensionTypes.def"
1433 }
1434
1435 if (Target.hasAArch64SVETypes()) {
1436 #define SVE_TYPE(Name, Id, SingletonId) \
1437 InitBuiltinType(SingletonId, BuiltinType::Id);
1438 #include "clang/Basic/AArch64SVEACLETypes.def"
1439 }
1440
1441 if (Target.getTriple().isPPC64()) {
1442 #define PPC_VECTOR_MMA_TYPE(Name, Id, Size) \
1443 InitBuiltinType(Id##Ty, BuiltinType::Id);
1444 #include "clang/Basic/PPCTypes.def"
1445 #define PPC_VECTOR_VSX_TYPE(Name, Id, Size) \
1446 InitBuiltinType(Id##Ty, BuiltinType::Id);
1447 #include "clang/Basic/PPCTypes.def"
1448 }
1449
1450 if (Target.hasRISCVVTypes()) {
1451 #define RVV_TYPE(Name, Id, SingletonId) \
1452 InitBuiltinType(SingletonId, BuiltinType::Id);
1453 #include "clang/Basic/RISCVVTypes.def"
1454 }
1455
1456 // Builtin type for __objc_yes and __objc_no
1457 ObjCBuiltinBoolTy = (Target.useSignedCharForObjCBool() ?
1458 SignedCharTy : BoolTy);
1459
1460 ObjCConstantStringType = QualType();
1461
1462 ObjCSuperType = QualType();
1463
1464 // void * type
1465 if (LangOpts.OpenCLGenericAddressSpace) {
1466 auto Q = VoidTy.getQualifiers();
1467 Q.setAddressSpace(LangAS::opencl_generic);
1468 VoidPtrTy = getPointerType(getCanonicalType(
1469 getQualifiedType(VoidTy.getUnqualifiedType(), Q)));
1470 } else {
1471 VoidPtrTy = getPointerType(VoidTy);
1472 }
1473
1474 // nullptr type (C++0x 2.14.7)
1475 InitBuiltinType(NullPtrTy, BuiltinType::NullPtr);
1476
1477 // half type (OpenCL 6.1.1.1) / ARM NEON __fp16
1478 InitBuiltinType(HalfTy, BuiltinType::Half);
1479
1480 InitBuiltinType(BFloat16Ty, BuiltinType::BFloat16);
1481
1482 // Builtin type used to help define __builtin_va_list.
1483 VaListTagDecl = nullptr;
1484
1485 // MSVC predeclares struct _GUID, and we need it to create MSGuidDecls.
1486 if (LangOpts.MicrosoftExt || LangOpts.Borland) {
1487 MSGuidTagDecl = buildImplicitRecord("_GUID");
1488 getTranslationUnitDecl()->addDecl(MSGuidTagDecl);
1489 }
1490 }
1491
getDiagnostics() const1492 DiagnosticsEngine &ASTContext::getDiagnostics() const {
1493 return SourceMgr.getDiagnostics();
1494 }
1495
getDeclAttrs(const Decl * D)1496 AttrVec& ASTContext::getDeclAttrs(const Decl *D) {
1497 AttrVec *&Result = DeclAttrs[D];
1498 if (!Result) {
1499 void *Mem = Allocate(sizeof(AttrVec));
1500 Result = new (Mem) AttrVec;
1501 }
1502
1503 return *Result;
1504 }
1505
1506 /// Erase the attributes corresponding to the given declaration.
eraseDeclAttrs(const Decl * D)1507 void ASTContext::eraseDeclAttrs(const Decl *D) {
1508 llvm::DenseMap<const Decl*, AttrVec*>::iterator Pos = DeclAttrs.find(D);
1509 if (Pos != DeclAttrs.end()) {
1510 Pos->second->~AttrVec();
1511 DeclAttrs.erase(Pos);
1512 }
1513 }
1514
1515 // FIXME: Remove ?
1516 MemberSpecializationInfo *
getInstantiatedFromStaticDataMember(const VarDecl * Var)1517 ASTContext::getInstantiatedFromStaticDataMember(const VarDecl *Var) {
1518 assert(Var->isStaticDataMember() && "Not a static data member");
1519 return getTemplateOrSpecializationInfo(Var)
1520 .dyn_cast<MemberSpecializationInfo *>();
1521 }
1522
1523 ASTContext::TemplateOrSpecializationInfo
getTemplateOrSpecializationInfo(const VarDecl * Var)1524 ASTContext::getTemplateOrSpecializationInfo(const VarDecl *Var) {
1525 llvm::DenseMap<const VarDecl *, TemplateOrSpecializationInfo>::iterator Pos =
1526 TemplateOrInstantiation.find(Var);
1527 if (Pos == TemplateOrInstantiation.end())
1528 return {};
1529
1530 return Pos->second;
1531 }
1532
1533 void
setInstantiatedFromStaticDataMember(VarDecl * Inst,VarDecl * Tmpl,TemplateSpecializationKind TSK,SourceLocation PointOfInstantiation)1534 ASTContext::setInstantiatedFromStaticDataMember(VarDecl *Inst, VarDecl *Tmpl,
1535 TemplateSpecializationKind TSK,
1536 SourceLocation PointOfInstantiation) {
1537 assert(Inst->isStaticDataMember() && "Not a static data member");
1538 assert(Tmpl->isStaticDataMember() && "Not a static data member");
1539 setTemplateOrSpecializationInfo(Inst, new (*this) MemberSpecializationInfo(
1540 Tmpl, TSK, PointOfInstantiation));
1541 }
1542
1543 void
setTemplateOrSpecializationInfo(VarDecl * Inst,TemplateOrSpecializationInfo TSI)1544 ASTContext::setTemplateOrSpecializationInfo(VarDecl *Inst,
1545 TemplateOrSpecializationInfo TSI) {
1546 assert(!TemplateOrInstantiation[Inst] &&
1547 "Already noted what the variable was instantiated from");
1548 TemplateOrInstantiation[Inst] = TSI;
1549 }
1550
1551 NamedDecl *
getInstantiatedFromUsingDecl(NamedDecl * UUD)1552 ASTContext::getInstantiatedFromUsingDecl(NamedDecl *UUD) {
1553 auto Pos = InstantiatedFromUsingDecl.find(UUD);
1554 if (Pos == InstantiatedFromUsingDecl.end())
1555 return nullptr;
1556
1557 return Pos->second;
1558 }
1559
1560 void
setInstantiatedFromUsingDecl(NamedDecl * Inst,NamedDecl * Pattern)1561 ASTContext::setInstantiatedFromUsingDecl(NamedDecl *Inst, NamedDecl *Pattern) {
1562 assert((isa<UsingDecl>(Pattern) ||
1563 isa<UnresolvedUsingValueDecl>(Pattern) ||
1564 isa<UnresolvedUsingTypenameDecl>(Pattern)) &&
1565 "pattern decl is not a using decl");
1566 assert((isa<UsingDecl>(Inst) ||
1567 isa<UnresolvedUsingValueDecl>(Inst) ||
1568 isa<UnresolvedUsingTypenameDecl>(Inst)) &&
1569 "instantiation did not produce a using decl");
1570 assert(!InstantiatedFromUsingDecl[Inst] && "pattern already exists");
1571 InstantiatedFromUsingDecl[Inst] = Pattern;
1572 }
1573
1574 UsingEnumDecl *
getInstantiatedFromUsingEnumDecl(UsingEnumDecl * UUD)1575 ASTContext::getInstantiatedFromUsingEnumDecl(UsingEnumDecl *UUD) {
1576 auto Pos = InstantiatedFromUsingEnumDecl.find(UUD);
1577 if (Pos == InstantiatedFromUsingEnumDecl.end())
1578 return nullptr;
1579
1580 return Pos->second;
1581 }
1582
setInstantiatedFromUsingEnumDecl(UsingEnumDecl * Inst,UsingEnumDecl * Pattern)1583 void ASTContext::setInstantiatedFromUsingEnumDecl(UsingEnumDecl *Inst,
1584 UsingEnumDecl *Pattern) {
1585 assert(!InstantiatedFromUsingEnumDecl[Inst] && "pattern already exists");
1586 InstantiatedFromUsingEnumDecl[Inst] = Pattern;
1587 }
1588
1589 UsingShadowDecl *
getInstantiatedFromUsingShadowDecl(UsingShadowDecl * Inst)1590 ASTContext::getInstantiatedFromUsingShadowDecl(UsingShadowDecl *Inst) {
1591 llvm::DenseMap<UsingShadowDecl*, UsingShadowDecl*>::const_iterator Pos
1592 = InstantiatedFromUsingShadowDecl.find(Inst);
1593 if (Pos == InstantiatedFromUsingShadowDecl.end())
1594 return nullptr;
1595
1596 return Pos->second;
1597 }
1598
1599 void
setInstantiatedFromUsingShadowDecl(UsingShadowDecl * Inst,UsingShadowDecl * Pattern)1600 ASTContext::setInstantiatedFromUsingShadowDecl(UsingShadowDecl *Inst,
1601 UsingShadowDecl *Pattern) {
1602 assert(!InstantiatedFromUsingShadowDecl[Inst] && "pattern already exists");
1603 InstantiatedFromUsingShadowDecl[Inst] = Pattern;
1604 }
1605
getInstantiatedFromUnnamedFieldDecl(FieldDecl * Field)1606 FieldDecl *ASTContext::getInstantiatedFromUnnamedFieldDecl(FieldDecl *Field) {
1607 llvm::DenseMap<FieldDecl *, FieldDecl *>::iterator Pos
1608 = InstantiatedFromUnnamedFieldDecl.find(Field);
1609 if (Pos == InstantiatedFromUnnamedFieldDecl.end())
1610 return nullptr;
1611
1612 return Pos->second;
1613 }
1614
setInstantiatedFromUnnamedFieldDecl(FieldDecl * Inst,FieldDecl * Tmpl)1615 void ASTContext::setInstantiatedFromUnnamedFieldDecl(FieldDecl *Inst,
1616 FieldDecl *Tmpl) {
1617 assert(!Inst->getDeclName() && "Instantiated field decl is not unnamed");
1618 assert(!Tmpl->getDeclName() && "Template field decl is not unnamed");
1619 assert(!InstantiatedFromUnnamedFieldDecl[Inst] &&
1620 "Already noted what unnamed field was instantiated from");
1621
1622 InstantiatedFromUnnamedFieldDecl[Inst] = Tmpl;
1623 }
1624
1625 ASTContext::overridden_cxx_method_iterator
overridden_methods_begin(const CXXMethodDecl * Method) const1626 ASTContext::overridden_methods_begin(const CXXMethodDecl *Method) const {
1627 return overridden_methods(Method).begin();
1628 }
1629
1630 ASTContext::overridden_cxx_method_iterator
overridden_methods_end(const CXXMethodDecl * Method) const1631 ASTContext::overridden_methods_end(const CXXMethodDecl *Method) const {
1632 return overridden_methods(Method).end();
1633 }
1634
1635 unsigned
overridden_methods_size(const CXXMethodDecl * Method) const1636 ASTContext::overridden_methods_size(const CXXMethodDecl *Method) const {
1637 auto Range = overridden_methods(Method);
1638 return Range.end() - Range.begin();
1639 }
1640
1641 ASTContext::overridden_method_range
overridden_methods(const CXXMethodDecl * Method) const1642 ASTContext::overridden_methods(const CXXMethodDecl *Method) const {
1643 llvm::DenseMap<const CXXMethodDecl *, CXXMethodVector>::const_iterator Pos =
1644 OverriddenMethods.find(Method->getCanonicalDecl());
1645 if (Pos == OverriddenMethods.end())
1646 return overridden_method_range(nullptr, nullptr);
1647 return overridden_method_range(Pos->second.begin(), Pos->second.end());
1648 }
1649
addOverriddenMethod(const CXXMethodDecl * Method,const CXXMethodDecl * Overridden)1650 void ASTContext::addOverriddenMethod(const CXXMethodDecl *Method,
1651 const CXXMethodDecl *Overridden) {
1652 assert(Method->isCanonicalDecl() && Overridden->isCanonicalDecl());
1653 OverriddenMethods[Method].push_back(Overridden);
1654 }
1655
getOverriddenMethods(const NamedDecl * D,SmallVectorImpl<const NamedDecl * > & Overridden) const1656 void ASTContext::getOverriddenMethods(
1657 const NamedDecl *D,
1658 SmallVectorImpl<const NamedDecl *> &Overridden) const {
1659 assert(D);
1660
1661 if (const auto *CXXMethod = dyn_cast<CXXMethodDecl>(D)) {
1662 Overridden.append(overridden_methods_begin(CXXMethod),
1663 overridden_methods_end(CXXMethod));
1664 return;
1665 }
1666
1667 const auto *Method = dyn_cast<ObjCMethodDecl>(D);
1668 if (!Method)
1669 return;
1670
1671 SmallVector<const ObjCMethodDecl *, 8> OverDecls;
1672 Method->getOverriddenMethods(OverDecls);
1673 Overridden.append(OverDecls.begin(), OverDecls.end());
1674 }
1675
addedLocalImportDecl(ImportDecl * Import)1676 void ASTContext::addedLocalImportDecl(ImportDecl *Import) {
1677 assert(!Import->getNextLocalImport() &&
1678 "Import declaration already in the chain");
1679 assert(!Import->isFromASTFile() && "Non-local import declaration");
1680 if (!FirstLocalImport) {
1681 FirstLocalImport = Import;
1682 LastLocalImport = Import;
1683 return;
1684 }
1685
1686 LastLocalImport->setNextLocalImport(Import);
1687 LastLocalImport = Import;
1688 }
1689
1690 //===----------------------------------------------------------------------===//
1691 // Type Sizing and Analysis
1692 //===----------------------------------------------------------------------===//
1693
1694 /// getFloatTypeSemantics - Return the APFloat 'semantics' for the specified
1695 /// scalar floating point type.
getFloatTypeSemantics(QualType T) const1696 const llvm::fltSemantics &ASTContext::getFloatTypeSemantics(QualType T) const {
1697 switch (T->castAs<BuiltinType>()->getKind()) {
1698 default:
1699 llvm_unreachable("Not a floating point type!");
1700 case BuiltinType::BFloat16:
1701 return Target->getBFloat16Format();
1702 case BuiltinType::Float16:
1703 case BuiltinType::Half:
1704 return Target->getHalfFormat();
1705 case BuiltinType::Float: return Target->getFloatFormat();
1706 case BuiltinType::Double: return Target->getDoubleFormat();
1707 case BuiltinType::Ibm128:
1708 return Target->getIbm128Format();
1709 case BuiltinType::LongDouble:
1710 if (getLangOpts().OpenMP && getLangOpts().OpenMPIsDevice)
1711 return AuxTarget->getLongDoubleFormat();
1712 return Target->getLongDoubleFormat();
1713 case BuiltinType::Float128:
1714 if (getLangOpts().OpenMP && getLangOpts().OpenMPIsDevice)
1715 return AuxTarget->getFloat128Format();
1716 return Target->getFloat128Format();
1717 }
1718 }
1719
getDeclAlign(const Decl * D,bool ForAlignof) const1720 CharUnits ASTContext::getDeclAlign(const Decl *D, bool ForAlignof) const {
1721 unsigned Align = Target->getCharWidth();
1722
1723 bool UseAlignAttrOnly = false;
1724 if (unsigned AlignFromAttr = D->getMaxAlignment()) {
1725 Align = AlignFromAttr;
1726
1727 // __attribute__((aligned)) can increase or decrease alignment
1728 // *except* on a struct or struct member, where it only increases
1729 // alignment unless 'packed' is also specified.
1730 //
1731 // It is an error for alignas to decrease alignment, so we can
1732 // ignore that possibility; Sema should diagnose it.
1733 if (isa<FieldDecl>(D)) {
1734 UseAlignAttrOnly = D->hasAttr<PackedAttr>() ||
1735 cast<FieldDecl>(D)->getParent()->hasAttr<PackedAttr>();
1736 } else {
1737 UseAlignAttrOnly = true;
1738 }
1739 }
1740 else if (isa<FieldDecl>(D))
1741 UseAlignAttrOnly =
1742 D->hasAttr<PackedAttr>() ||
1743 cast<FieldDecl>(D)->getParent()->hasAttr<PackedAttr>();
1744
1745 // If we're using the align attribute only, just ignore everything
1746 // else about the declaration and its type.
1747 if (UseAlignAttrOnly) {
1748 // do nothing
1749 } else if (const auto *VD = dyn_cast<ValueDecl>(D)) {
1750 QualType T = VD->getType();
1751 if (const auto *RT = T->getAs<ReferenceType>()) {
1752 if (ForAlignof)
1753 T = RT->getPointeeType();
1754 else
1755 T = getPointerType(RT->getPointeeType());
1756 }
1757 QualType BaseT = getBaseElementType(T);
1758 if (T->isFunctionType())
1759 Align = getTypeInfoImpl(T.getTypePtr()).Align;
1760 else if (!BaseT->isIncompleteType()) {
1761 // Adjust alignments of declarations with array type by the
1762 // large-array alignment on the target.
1763 if (const ArrayType *arrayType = getAsArrayType(T)) {
1764 unsigned MinWidth = Target->getLargeArrayMinWidth();
1765 if (!ForAlignof && MinWidth) {
1766 if (isa<VariableArrayType>(arrayType))
1767 Align = std::max(Align, Target->getLargeArrayAlign());
1768 else if (isa<ConstantArrayType>(arrayType) &&
1769 MinWidth <= getTypeSize(cast<ConstantArrayType>(arrayType)))
1770 Align = std::max(Align, Target->getLargeArrayAlign());
1771 }
1772 }
1773 Align = std::max(Align, getPreferredTypeAlign(T.getTypePtr()));
1774 if (BaseT.getQualifiers().hasUnaligned())
1775 Align = Target->getCharWidth();
1776 if (const auto *VD = dyn_cast<VarDecl>(D)) {
1777 if (VD->hasGlobalStorage() && !ForAlignof) {
1778 uint64_t TypeSize = getTypeSize(T.getTypePtr());
1779 Align = std::max(Align, getTargetInfo().getMinGlobalAlign(TypeSize));
1780 }
1781 }
1782 }
1783
1784 // Fields can be subject to extra alignment constraints, like if
1785 // the field is packed, the struct is packed, or the struct has a
1786 // a max-field-alignment constraint (#pragma pack). So calculate
1787 // the actual alignment of the field within the struct, and then
1788 // (as we're expected to) constrain that by the alignment of the type.
1789 if (const auto *Field = dyn_cast<FieldDecl>(VD)) {
1790 const RecordDecl *Parent = Field->getParent();
1791 // We can only produce a sensible answer if the record is valid.
1792 if (!Parent->isInvalidDecl()) {
1793 const ASTRecordLayout &Layout = getASTRecordLayout(Parent);
1794
1795 // Start with the record's overall alignment.
1796 unsigned FieldAlign = toBits(Layout.getAlignment());
1797
1798 // Use the GCD of that and the offset within the record.
1799 uint64_t Offset = Layout.getFieldOffset(Field->getFieldIndex());
1800 if (Offset > 0) {
1801 // Alignment is always a power of 2, so the GCD will be a power of 2,
1802 // which means we get to do this crazy thing instead of Euclid's.
1803 uint64_t LowBitOfOffset = Offset & (~Offset + 1);
1804 if (LowBitOfOffset < FieldAlign)
1805 FieldAlign = static_cast<unsigned>(LowBitOfOffset);
1806 }
1807
1808 Align = std::min(Align, FieldAlign);
1809 }
1810 }
1811 }
1812
1813 // Some targets have hard limitation on the maximum requestable alignment in
1814 // aligned attribute for static variables.
1815 const unsigned MaxAlignedAttr = getTargetInfo().getMaxAlignedAttribute();
1816 const auto *VD = dyn_cast<VarDecl>(D);
1817 if (MaxAlignedAttr && VD && VD->getStorageClass() == SC_Static)
1818 Align = std::min(Align, MaxAlignedAttr);
1819
1820 return toCharUnitsFromBits(Align);
1821 }
1822
getExnObjectAlignment() const1823 CharUnits ASTContext::getExnObjectAlignment() const {
1824 return toCharUnitsFromBits(Target->getExnObjectAlignment());
1825 }
1826
1827 // getTypeInfoDataSizeInChars - Return the size of a type, in
1828 // chars. If the type is a record, its data size is returned. This is
1829 // the size of the memcpy that's performed when assigning this type
1830 // using a trivial copy/move assignment operator.
getTypeInfoDataSizeInChars(QualType T) const1831 TypeInfoChars ASTContext::getTypeInfoDataSizeInChars(QualType T) const {
1832 TypeInfoChars Info = getTypeInfoInChars(T);
1833
1834 // In C++, objects can sometimes be allocated into the tail padding
1835 // of a base-class subobject. We decide whether that's possible
1836 // during class layout, so here we can just trust the layout results.
1837 if (getLangOpts().CPlusPlus) {
1838 if (const auto *RT = T->getAs<RecordType>()) {
1839 const ASTRecordLayout &layout = getASTRecordLayout(RT->getDecl());
1840 Info.Width = layout.getDataSize();
1841 }
1842 }
1843
1844 return Info;
1845 }
1846
1847 /// getConstantArrayInfoInChars - Performing the computation in CharUnits
1848 /// instead of in bits prevents overflowing the uint64_t for some large arrays.
1849 TypeInfoChars
getConstantArrayInfoInChars(const ASTContext & Context,const ConstantArrayType * CAT)1850 static getConstantArrayInfoInChars(const ASTContext &Context,
1851 const ConstantArrayType *CAT) {
1852 TypeInfoChars EltInfo = Context.getTypeInfoInChars(CAT->getElementType());
1853 uint64_t Size = CAT->getSize().getZExtValue();
1854 assert((Size == 0 || static_cast<uint64_t>(EltInfo.Width.getQuantity()) <=
1855 (uint64_t)(-1)/Size) &&
1856 "Overflow in array type char size evaluation");
1857 uint64_t Width = EltInfo.Width.getQuantity() * Size;
1858 unsigned Align = EltInfo.Align.getQuantity();
1859 if (!Context.getTargetInfo().getCXXABI().isMicrosoft() ||
1860 Context.getTargetInfo().getPointerWidth(0) == 64)
1861 Width = llvm::alignTo(Width, Align);
1862 return TypeInfoChars(CharUnits::fromQuantity(Width),
1863 CharUnits::fromQuantity(Align),
1864 EltInfo.AlignRequirement);
1865 }
1866
getTypeInfoInChars(const Type * T) const1867 TypeInfoChars ASTContext::getTypeInfoInChars(const Type *T) const {
1868 if (const auto *CAT = dyn_cast<ConstantArrayType>(T))
1869 return getConstantArrayInfoInChars(*this, CAT);
1870 TypeInfo Info = getTypeInfo(T);
1871 return TypeInfoChars(toCharUnitsFromBits(Info.Width),
1872 toCharUnitsFromBits(Info.Align), Info.AlignRequirement);
1873 }
1874
getTypeInfoInChars(QualType T) const1875 TypeInfoChars ASTContext::getTypeInfoInChars(QualType T) const {
1876 return getTypeInfoInChars(T.getTypePtr());
1877 }
1878
isAlignmentRequired(const Type * T) const1879 bool ASTContext::isAlignmentRequired(const Type *T) const {
1880 return getTypeInfo(T).AlignRequirement != AlignRequirementKind::None;
1881 }
1882
isAlignmentRequired(QualType T) const1883 bool ASTContext::isAlignmentRequired(QualType T) const {
1884 return isAlignmentRequired(T.getTypePtr());
1885 }
1886
getTypeAlignIfKnown(QualType T,bool NeedsPreferredAlignment) const1887 unsigned ASTContext::getTypeAlignIfKnown(QualType T,
1888 bool NeedsPreferredAlignment) const {
1889 // An alignment on a typedef overrides anything else.
1890 if (const auto *TT = T->getAs<TypedefType>())
1891 if (unsigned Align = TT->getDecl()->getMaxAlignment())
1892 return Align;
1893
1894 // If we have an (array of) complete type, we're done.
1895 T = getBaseElementType(T);
1896 if (!T->isIncompleteType())
1897 return NeedsPreferredAlignment ? getPreferredTypeAlign(T) : getTypeAlign(T);
1898
1899 // If we had an array type, its element type might be a typedef
1900 // type with an alignment attribute.
1901 if (const auto *TT = T->getAs<TypedefType>())
1902 if (unsigned Align = TT->getDecl()->getMaxAlignment())
1903 return Align;
1904
1905 // Otherwise, see if the declaration of the type had an attribute.
1906 if (const auto *TT = T->getAs<TagType>())
1907 return TT->getDecl()->getMaxAlignment();
1908
1909 return 0;
1910 }
1911
getTypeInfo(const Type * T) const1912 TypeInfo ASTContext::getTypeInfo(const Type *T) const {
1913 TypeInfoMap::iterator I = MemoizedTypeInfo.find(T);
1914 if (I != MemoizedTypeInfo.end())
1915 return I->second;
1916
1917 // This call can invalidate MemoizedTypeInfo[T], so we need a second lookup.
1918 TypeInfo TI = getTypeInfoImpl(T);
1919 MemoizedTypeInfo[T] = TI;
1920 return TI;
1921 }
1922
1923 /// getTypeInfoImpl - Return the size of the specified type, in bits. This
1924 /// method does not work on incomplete types.
1925 ///
1926 /// FIXME: Pointers into different addr spaces could have different sizes and
1927 /// alignment requirements: getPointerInfo should take an AddrSpace, this
1928 /// should take a QualType, &c.
getTypeInfoImpl(const Type * T) const1929 TypeInfo ASTContext::getTypeInfoImpl(const Type *T) const {
1930 uint64_t Width = 0;
1931 unsigned Align = 8;
1932 AlignRequirementKind AlignRequirement = AlignRequirementKind::None;
1933 unsigned AS = 0;
1934 switch (T->getTypeClass()) {
1935 #define TYPE(Class, Base)
1936 #define ABSTRACT_TYPE(Class, Base)
1937 #define NON_CANONICAL_TYPE(Class, Base)
1938 #define DEPENDENT_TYPE(Class, Base) case Type::Class:
1939 #define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base) \
1940 case Type::Class: \
1941 assert(!T->isDependentType() && "should not see dependent types here"); \
1942 return getTypeInfo(cast<Class##Type>(T)->desugar().getTypePtr());
1943 #include "clang/AST/TypeNodes.inc"
1944 llvm_unreachable("Should not see dependent types");
1945
1946 case Type::FunctionNoProto:
1947 case Type::FunctionProto:
1948 // GCC extension: alignof(function) = 32 bits
1949 Width = 0;
1950 Align = 32;
1951 break;
1952
1953 case Type::IncompleteArray:
1954 case Type::VariableArray:
1955 case Type::ConstantArray: {
1956 // Model non-constant sized arrays as size zero, but track the alignment.
1957 uint64_t Size = 0;
1958 if (const auto *CAT = dyn_cast<ConstantArrayType>(T))
1959 Size = CAT->getSize().getZExtValue();
1960
1961 TypeInfo EltInfo = getTypeInfo(cast<ArrayType>(T)->getElementType());
1962 assert((Size == 0 || EltInfo.Width <= (uint64_t)(-1) / Size) &&
1963 "Overflow in array type bit size evaluation");
1964 Width = EltInfo.Width * Size;
1965 Align = EltInfo.Align;
1966 AlignRequirement = EltInfo.AlignRequirement;
1967 if (!getTargetInfo().getCXXABI().isMicrosoft() ||
1968 getTargetInfo().getPointerWidth(0) == 64)
1969 Width = llvm::alignTo(Width, Align);
1970 break;
1971 }
1972
1973 case Type::ExtVector:
1974 case Type::Vector: {
1975 const auto *VT = cast<VectorType>(T);
1976 TypeInfo EltInfo = getTypeInfo(VT->getElementType());
1977 Width = EltInfo.Width * VT->getNumElements();
1978 Align = Width;
1979 // If the alignment is not a power of 2, round up to the next power of 2.
1980 // This happens for non-power-of-2 length vectors.
1981 if (Align & (Align-1)) {
1982 Align = llvm::NextPowerOf2(Align);
1983 Width = llvm::alignTo(Width, Align);
1984 }
1985 // Adjust the alignment based on the target max.
1986 uint64_t TargetVectorAlign = Target->getMaxVectorAlign();
1987 if (TargetVectorAlign && TargetVectorAlign < Align)
1988 Align = TargetVectorAlign;
1989 if (VT->getVectorKind() == VectorType::SveFixedLengthDataVector)
1990 // Adjust the alignment for fixed-length SVE vectors. This is important
1991 // for non-power-of-2 vector lengths.
1992 Align = 128;
1993 else if (VT->getVectorKind() == VectorType::SveFixedLengthPredicateVector)
1994 // Adjust the alignment for fixed-length SVE predicates.
1995 Align = 16;
1996 break;
1997 }
1998
1999 case Type::ConstantMatrix: {
2000 const auto *MT = cast<ConstantMatrixType>(T);
2001 TypeInfo ElementInfo = getTypeInfo(MT->getElementType());
2002 // The internal layout of a matrix value is implementation defined.
2003 // Initially be ABI compatible with arrays with respect to alignment and
2004 // size.
2005 Width = ElementInfo.Width * MT->getNumRows() * MT->getNumColumns();
2006 Align = ElementInfo.Align;
2007 break;
2008 }
2009
2010 case Type::Builtin:
2011 switch (cast<BuiltinType>(T)->getKind()) {
2012 default: llvm_unreachable("Unknown builtin type!");
2013 case BuiltinType::Void:
2014 // GCC extension: alignof(void) = 8 bits.
2015 Width = 0;
2016 Align = 8;
2017 break;
2018 case BuiltinType::Bool:
2019 Width = Target->getBoolWidth();
2020 Align = Target->getBoolAlign();
2021 break;
2022 case BuiltinType::Char_S:
2023 case BuiltinType::Char_U:
2024 case BuiltinType::UChar:
2025 case BuiltinType::SChar:
2026 case BuiltinType::Char8:
2027 Width = Target->getCharWidth();
2028 Align = Target->getCharAlign();
2029 break;
2030 case BuiltinType::WChar_S:
2031 case BuiltinType::WChar_U:
2032 Width = Target->getWCharWidth();
2033 Align = Target->getWCharAlign();
2034 break;
2035 case BuiltinType::Char16:
2036 Width = Target->getChar16Width();
2037 Align = Target->getChar16Align();
2038 break;
2039 case BuiltinType::Char32:
2040 Width = Target->getChar32Width();
2041 Align = Target->getChar32Align();
2042 break;
2043 case BuiltinType::UShort:
2044 case BuiltinType::Short:
2045 Width = Target->getShortWidth();
2046 Align = Target->getShortAlign();
2047 break;
2048 case BuiltinType::UInt:
2049 case BuiltinType::Int:
2050 Width = Target->getIntWidth();
2051 Align = Target->getIntAlign();
2052 break;
2053 case BuiltinType::ULong:
2054 case BuiltinType::Long:
2055 Width = Target->getLongWidth();
2056 Align = Target->getLongAlign();
2057 break;
2058 case BuiltinType::ULongLong:
2059 case BuiltinType::LongLong:
2060 Width = Target->getLongLongWidth();
2061 Align = Target->getLongLongAlign();
2062 break;
2063 case BuiltinType::Int128:
2064 case BuiltinType::UInt128:
2065 Width = 128;
2066 Align = 128; // int128_t is 128-bit aligned on all targets.
2067 break;
2068 case BuiltinType::ShortAccum:
2069 case BuiltinType::UShortAccum:
2070 case BuiltinType::SatShortAccum:
2071 case BuiltinType::SatUShortAccum:
2072 Width = Target->getShortAccumWidth();
2073 Align = Target->getShortAccumAlign();
2074 break;
2075 case BuiltinType::Accum:
2076 case BuiltinType::UAccum:
2077 case BuiltinType::SatAccum:
2078 case BuiltinType::SatUAccum:
2079 Width = Target->getAccumWidth();
2080 Align = Target->getAccumAlign();
2081 break;
2082 case BuiltinType::LongAccum:
2083 case BuiltinType::ULongAccum:
2084 case BuiltinType::SatLongAccum:
2085 case BuiltinType::SatULongAccum:
2086 Width = Target->getLongAccumWidth();
2087 Align = Target->getLongAccumAlign();
2088 break;
2089 case BuiltinType::ShortFract:
2090 case BuiltinType::UShortFract:
2091 case BuiltinType::SatShortFract:
2092 case BuiltinType::SatUShortFract:
2093 Width = Target->getShortFractWidth();
2094 Align = Target->getShortFractAlign();
2095 break;
2096 case BuiltinType::Fract:
2097 case BuiltinType::UFract:
2098 case BuiltinType::SatFract:
2099 case BuiltinType::SatUFract:
2100 Width = Target->getFractWidth();
2101 Align = Target->getFractAlign();
2102 break;
2103 case BuiltinType::LongFract:
2104 case BuiltinType::ULongFract:
2105 case BuiltinType::SatLongFract:
2106 case BuiltinType::SatULongFract:
2107 Width = Target->getLongFractWidth();
2108 Align = Target->getLongFractAlign();
2109 break;
2110 case BuiltinType::BFloat16:
2111 Width = Target->getBFloat16Width();
2112 Align = Target->getBFloat16Align();
2113 break;
2114 case BuiltinType::Float16:
2115 case BuiltinType::Half:
2116 if (Target->hasFloat16Type() || !getLangOpts().OpenMP ||
2117 !getLangOpts().OpenMPIsDevice) {
2118 Width = Target->getHalfWidth();
2119 Align = Target->getHalfAlign();
2120 } else {
2121 assert(getLangOpts().OpenMP && getLangOpts().OpenMPIsDevice &&
2122 "Expected OpenMP device compilation.");
2123 Width = AuxTarget->getHalfWidth();
2124 Align = AuxTarget->getHalfAlign();
2125 }
2126 break;
2127 case BuiltinType::Float:
2128 Width = Target->getFloatWidth();
2129 Align = Target->getFloatAlign();
2130 break;
2131 case BuiltinType::Double:
2132 Width = Target->getDoubleWidth();
2133 Align = Target->getDoubleAlign();
2134 break;
2135 case BuiltinType::Ibm128:
2136 Width = Target->getIbm128Width();
2137 Align = Target->getIbm128Align();
2138 break;
2139 case BuiltinType::LongDouble:
2140 if (getLangOpts().OpenMP && getLangOpts().OpenMPIsDevice &&
2141 (Target->getLongDoubleWidth() != AuxTarget->getLongDoubleWidth() ||
2142 Target->getLongDoubleAlign() != AuxTarget->getLongDoubleAlign())) {
2143 Width = AuxTarget->getLongDoubleWidth();
2144 Align = AuxTarget->getLongDoubleAlign();
2145 } else {
2146 Width = Target->getLongDoubleWidth();
2147 Align = Target->getLongDoubleAlign();
2148 }
2149 break;
2150 case BuiltinType::Float128:
2151 if (Target->hasFloat128Type() || !getLangOpts().OpenMP ||
2152 !getLangOpts().OpenMPIsDevice) {
2153 Width = Target->getFloat128Width();
2154 Align = Target->getFloat128Align();
2155 } else {
2156 assert(getLangOpts().OpenMP && getLangOpts().OpenMPIsDevice &&
2157 "Expected OpenMP device compilation.");
2158 Width = AuxTarget->getFloat128Width();
2159 Align = AuxTarget->getFloat128Align();
2160 }
2161 break;
2162 case BuiltinType::NullPtr:
2163 Width = Target->getPointerWidth(0); // C++ 3.9.1p11: sizeof(nullptr_t)
2164 Align = Target->getPointerAlign(0); // == sizeof(void*)
2165 break;
2166 case BuiltinType::ObjCId:
2167 case BuiltinType::ObjCClass:
2168 case BuiltinType::ObjCSel:
2169 Width = Target->getPointerWidth(0);
2170 Align = Target->getPointerAlign(0);
2171 break;
2172 case BuiltinType::OCLSampler:
2173 case BuiltinType::OCLEvent:
2174 case BuiltinType::OCLClkEvent:
2175 case BuiltinType::OCLQueue:
2176 case BuiltinType::OCLReserveID:
2177 #define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
2178 case BuiltinType::Id:
2179 #include "clang/Basic/OpenCLImageTypes.def"
2180 #define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
2181 case BuiltinType::Id:
2182 #include "clang/Basic/OpenCLExtensionTypes.def"
2183 AS = getTargetAddressSpace(
2184 Target->getOpenCLTypeAddrSpace(getOpenCLTypeKind(T)));
2185 Width = Target->getPointerWidth(AS);
2186 Align = Target->getPointerAlign(AS);
2187 break;
2188 // The SVE types are effectively target-specific. The length of an
2189 // SVE_VECTOR_TYPE is only known at runtime, but it is always a multiple
2190 // of 128 bits. There is one predicate bit for each vector byte, so the
2191 // length of an SVE_PREDICATE_TYPE is always a multiple of 16 bits.
2192 //
2193 // Because the length is only known at runtime, we use a dummy value
2194 // of 0 for the static length. The alignment values are those defined
2195 // by the Procedure Call Standard for the Arm Architecture.
2196 #define SVE_VECTOR_TYPE(Name, MangledName, Id, SingletonId, NumEls, ElBits, \
2197 IsSigned, IsFP, IsBF) \
2198 case BuiltinType::Id: \
2199 Width = 0; \
2200 Align = 128; \
2201 break;
2202 #define SVE_PREDICATE_TYPE(Name, MangledName, Id, SingletonId, NumEls) \
2203 case BuiltinType::Id: \
2204 Width = 0; \
2205 Align = 16; \
2206 break;
2207 #include "clang/Basic/AArch64SVEACLETypes.def"
2208 #define PPC_VECTOR_TYPE(Name, Id, Size) \
2209 case BuiltinType::Id: \
2210 Width = Size; \
2211 Align = Size; \
2212 break;
2213 #include "clang/Basic/PPCTypes.def"
2214 #define RVV_VECTOR_TYPE(Name, Id, SingletonId, ElKind, ElBits, NF, IsSigned, \
2215 IsFP) \
2216 case BuiltinType::Id: \
2217 Width = 0; \
2218 Align = ElBits; \
2219 break;
2220 #define RVV_PREDICATE_TYPE(Name, Id, SingletonId, ElKind) \
2221 case BuiltinType::Id: \
2222 Width = 0; \
2223 Align = 8; \
2224 break;
2225 #include "clang/Basic/RISCVVTypes.def"
2226 }
2227 break;
2228 case Type::ObjCObjectPointer:
2229 Width = Target->getPointerWidth(0);
2230 Align = Target->getPointerAlign(0);
2231 break;
2232 case Type::BlockPointer:
2233 AS = getTargetAddressSpace(cast<BlockPointerType>(T)->getPointeeType());
2234 Width = Target->getPointerWidth(AS);
2235 Align = Target->getPointerAlign(AS);
2236 break;
2237 case Type::LValueReference:
2238 case Type::RValueReference:
2239 // alignof and sizeof should never enter this code path here, so we go
2240 // the pointer route.
2241 AS = getTargetAddressSpace(cast<ReferenceType>(T)->getPointeeType());
2242 Width = Target->getPointerWidth(AS);
2243 Align = Target->getPointerAlign(AS);
2244 break;
2245 case Type::Pointer:
2246 AS = getTargetAddressSpace(cast<PointerType>(T)->getPointeeType());
2247 Width = Target->getPointerWidth(AS);
2248 Align = Target->getPointerAlign(AS);
2249 break;
2250 case Type::MemberPointer: {
2251 const auto *MPT = cast<MemberPointerType>(T);
2252 CXXABI::MemberPointerInfo MPI = ABI->getMemberPointerInfo(MPT);
2253 Width = MPI.Width;
2254 Align = MPI.Align;
2255 break;
2256 }
2257 case Type::Complex: {
2258 // Complex types have the same alignment as their elements, but twice the
2259 // size.
2260 TypeInfo EltInfo = getTypeInfo(cast<ComplexType>(T)->getElementType());
2261 Width = EltInfo.Width * 2;
2262 Align = EltInfo.Align;
2263 break;
2264 }
2265 case Type::ObjCObject:
2266 return getTypeInfo(cast<ObjCObjectType>(T)->getBaseType().getTypePtr());
2267 case Type::Adjusted:
2268 case Type::Decayed:
2269 return getTypeInfo(cast<AdjustedType>(T)->getAdjustedType().getTypePtr());
2270 case Type::ObjCInterface: {
2271 const auto *ObjCI = cast<ObjCInterfaceType>(T);
2272 if (ObjCI->getDecl()->isInvalidDecl()) {
2273 Width = 8;
2274 Align = 8;
2275 break;
2276 }
2277 const ASTRecordLayout &Layout = getASTObjCInterfaceLayout(ObjCI->getDecl());
2278 Width = toBits(Layout.getSize());
2279 Align = toBits(Layout.getAlignment());
2280 break;
2281 }
2282 case Type::ExtInt: {
2283 const auto *EIT = cast<ExtIntType>(T);
2284 Align =
2285 std::min(static_cast<unsigned>(std::max(
2286 getCharWidth(), llvm::PowerOf2Ceil(EIT->getNumBits()))),
2287 Target->getLongLongAlign());
2288 Width = llvm::alignTo(EIT->getNumBits(), Align);
2289 break;
2290 }
2291 case Type::Record:
2292 case Type::Enum: {
2293 const auto *TT = cast<TagType>(T);
2294
2295 if (TT->getDecl()->isInvalidDecl()) {
2296 Width = 8;
2297 Align = 8;
2298 break;
2299 }
2300
2301 if (const auto *ET = dyn_cast<EnumType>(TT)) {
2302 const EnumDecl *ED = ET->getDecl();
2303 TypeInfo Info =
2304 getTypeInfo(ED->getIntegerType()->getUnqualifiedDesugaredType());
2305 if (unsigned AttrAlign = ED->getMaxAlignment()) {
2306 Info.Align = AttrAlign;
2307 Info.AlignRequirement = AlignRequirementKind::RequiredByEnum;
2308 }
2309 return Info;
2310 }
2311
2312 const auto *RT = cast<RecordType>(TT);
2313 const RecordDecl *RD = RT->getDecl();
2314 const ASTRecordLayout &Layout = getASTRecordLayout(RD);
2315 Width = toBits(Layout.getSize());
2316 Align = toBits(Layout.getAlignment());
2317 AlignRequirement = RD->hasAttr<AlignedAttr>()
2318 ? AlignRequirementKind::RequiredByRecord
2319 : AlignRequirementKind::None;
2320 break;
2321 }
2322
2323 case Type::SubstTemplateTypeParm:
2324 return getTypeInfo(cast<SubstTemplateTypeParmType>(T)->
2325 getReplacementType().getTypePtr());
2326
2327 case Type::Auto:
2328 case Type::DeducedTemplateSpecialization: {
2329 const auto *A = cast<DeducedType>(T);
2330 assert(!A->getDeducedType().isNull() &&
2331 "cannot request the size of an undeduced or dependent auto type");
2332 return getTypeInfo(A->getDeducedType().getTypePtr());
2333 }
2334
2335 case Type::Paren:
2336 return getTypeInfo(cast<ParenType>(T)->getInnerType().getTypePtr());
2337
2338 case Type::MacroQualified:
2339 return getTypeInfo(
2340 cast<MacroQualifiedType>(T)->getUnderlyingType().getTypePtr());
2341
2342 case Type::ObjCTypeParam:
2343 return getTypeInfo(cast<ObjCTypeParamType>(T)->desugar().getTypePtr());
2344
2345 case Type::Typedef: {
2346 const TypedefNameDecl *Typedef = cast<TypedefType>(T)->getDecl();
2347 TypeInfo Info = getTypeInfo(Typedef->getUnderlyingType().getTypePtr());
2348 // If the typedef has an aligned attribute on it, it overrides any computed
2349 // alignment we have. This violates the GCC documentation (which says that
2350 // attribute(aligned) can only round up) but matches its implementation.
2351 if (unsigned AttrAlign = Typedef->getMaxAlignment()) {
2352 Align = AttrAlign;
2353 AlignRequirement = AlignRequirementKind::RequiredByTypedef;
2354 } else {
2355 Align = Info.Align;
2356 AlignRequirement = Info.AlignRequirement;
2357 }
2358 Width = Info.Width;
2359 break;
2360 }
2361
2362 case Type::Elaborated:
2363 return getTypeInfo(cast<ElaboratedType>(T)->getNamedType().getTypePtr());
2364
2365 case Type::Attributed:
2366 return getTypeInfo(
2367 cast<AttributedType>(T)->getEquivalentType().getTypePtr());
2368
2369 case Type::Atomic: {
2370 // Start with the base type information.
2371 TypeInfo Info = getTypeInfo(cast<AtomicType>(T)->getValueType());
2372 Width = Info.Width;
2373 Align = Info.Align;
2374
2375 if (!Width) {
2376 // An otherwise zero-sized type should still generate an
2377 // atomic operation.
2378 Width = Target->getCharWidth();
2379 assert(Align);
2380 } else if (Width <= Target->getMaxAtomicPromoteWidth()) {
2381 // If the size of the type doesn't exceed the platform's max
2382 // atomic promotion width, make the size and alignment more
2383 // favorable to atomic operations:
2384
2385 // Round the size up to a power of 2.
2386 if (!llvm::isPowerOf2_64(Width))
2387 Width = llvm::NextPowerOf2(Width);
2388
2389 // Set the alignment equal to the size.
2390 Align = static_cast<unsigned>(Width);
2391 }
2392 }
2393 break;
2394
2395 case Type::Pipe:
2396 Width = Target->getPointerWidth(getTargetAddressSpace(LangAS::opencl_global));
2397 Align = Target->getPointerAlign(getTargetAddressSpace(LangAS::opencl_global));
2398 break;
2399 }
2400
2401 assert(llvm::isPowerOf2_32(Align) && "Alignment must be power of 2");
2402 return TypeInfo(Width, Align, AlignRequirement);
2403 }
2404
getTypeUnadjustedAlign(const Type * T) const2405 unsigned ASTContext::getTypeUnadjustedAlign(const Type *T) const {
2406 UnadjustedAlignMap::iterator I = MemoizedUnadjustedAlign.find(T);
2407 if (I != MemoizedUnadjustedAlign.end())
2408 return I->second;
2409
2410 unsigned UnadjustedAlign;
2411 if (const auto *RT = T->getAs<RecordType>()) {
2412 const RecordDecl *RD = RT->getDecl();
2413 const ASTRecordLayout &Layout = getASTRecordLayout(RD);
2414 UnadjustedAlign = toBits(Layout.getUnadjustedAlignment());
2415 } else if (const auto *ObjCI = T->getAs<ObjCInterfaceType>()) {
2416 const ASTRecordLayout &Layout = getASTObjCInterfaceLayout(ObjCI->getDecl());
2417 UnadjustedAlign = toBits(Layout.getUnadjustedAlignment());
2418 } else {
2419 UnadjustedAlign = getTypeAlign(T->getUnqualifiedDesugaredType());
2420 }
2421
2422 MemoizedUnadjustedAlign[T] = UnadjustedAlign;
2423 return UnadjustedAlign;
2424 }
2425
getOpenMPDefaultSimdAlign(QualType T) const2426 unsigned ASTContext::getOpenMPDefaultSimdAlign(QualType T) const {
2427 unsigned SimdAlign = getTargetInfo().getSimdDefaultAlign();
2428 return SimdAlign;
2429 }
2430
2431 /// toCharUnitsFromBits - Convert a size in bits to a size in characters.
toCharUnitsFromBits(int64_t BitSize) const2432 CharUnits ASTContext::toCharUnitsFromBits(int64_t BitSize) const {
2433 return CharUnits::fromQuantity(BitSize / getCharWidth());
2434 }
2435
2436 /// toBits - Convert a size in characters to a size in characters.
toBits(CharUnits CharSize) const2437 int64_t ASTContext::toBits(CharUnits CharSize) const {
2438 return CharSize.getQuantity() * getCharWidth();
2439 }
2440
2441 /// getTypeSizeInChars - Return the size of the specified type, in characters.
2442 /// This method does not work on incomplete types.
getTypeSizeInChars(QualType T) const2443 CharUnits ASTContext::getTypeSizeInChars(QualType T) const {
2444 return getTypeInfoInChars(T).Width;
2445 }
getTypeSizeInChars(const Type * T) const2446 CharUnits ASTContext::getTypeSizeInChars(const Type *T) const {
2447 return getTypeInfoInChars(T).Width;
2448 }
2449
2450 /// getTypeAlignInChars - Return the ABI-specified alignment of a type, in
2451 /// characters. This method does not work on incomplete types.
getTypeAlignInChars(QualType T) const2452 CharUnits ASTContext::getTypeAlignInChars(QualType T) const {
2453 return toCharUnitsFromBits(getTypeAlign(T));
2454 }
getTypeAlignInChars(const Type * T) const2455 CharUnits ASTContext::getTypeAlignInChars(const Type *T) const {
2456 return toCharUnitsFromBits(getTypeAlign(T));
2457 }
2458
2459 /// getTypeUnadjustedAlignInChars - Return the ABI-specified alignment of a
2460 /// type, in characters, before alignment adustments. This method does
2461 /// not work on incomplete types.
getTypeUnadjustedAlignInChars(QualType T) const2462 CharUnits ASTContext::getTypeUnadjustedAlignInChars(QualType T) const {
2463 return toCharUnitsFromBits(getTypeUnadjustedAlign(T));
2464 }
getTypeUnadjustedAlignInChars(const Type * T) const2465 CharUnits ASTContext::getTypeUnadjustedAlignInChars(const Type *T) const {
2466 return toCharUnitsFromBits(getTypeUnadjustedAlign(T));
2467 }
2468
2469 /// getPreferredTypeAlign - Return the "preferred" alignment of the specified
2470 /// type for the current target in bits. This can be different than the ABI
2471 /// alignment in cases where it is beneficial for performance or backwards
2472 /// compatibility preserving to overalign a data type. (Note: despite the name,
2473 /// the preferred alignment is ABI-impacting, and not an optimization.)
getPreferredTypeAlign(const Type * T) const2474 unsigned ASTContext::getPreferredTypeAlign(const Type *T) const {
2475 TypeInfo TI = getTypeInfo(T);
2476 unsigned ABIAlign = TI.Align;
2477
2478 T = T->getBaseElementTypeUnsafe();
2479
2480 // The preferred alignment of member pointers is that of a pointer.
2481 if (T->isMemberPointerType())
2482 return getPreferredTypeAlign(getPointerDiffType().getTypePtr());
2483
2484 if (!Target->allowsLargerPreferedTypeAlignment())
2485 return ABIAlign;
2486
2487 if (const auto *RT = T->getAs<RecordType>()) {
2488 const RecordDecl *RD = RT->getDecl();
2489
2490 // When used as part of a typedef, or together with a 'packed' attribute,
2491 // the 'aligned' attribute can be used to decrease alignment. Note that the
2492 // 'packed' case is already taken into consideration when computing the
2493 // alignment, we only need to handle the typedef case here.
2494 if (TI.AlignRequirement == AlignRequirementKind::RequiredByTypedef ||
2495 RD->isInvalidDecl())
2496 return ABIAlign;
2497
2498 unsigned PreferredAlign = static_cast<unsigned>(
2499 toBits(getASTRecordLayout(RD).PreferredAlignment));
2500 assert(PreferredAlign >= ABIAlign &&
2501 "PreferredAlign should be at least as large as ABIAlign.");
2502 return PreferredAlign;
2503 }
2504
2505 // Double (and, for targets supporting AIX `power` alignment, long double) and
2506 // long long should be naturally aligned (despite requiring less alignment) if
2507 // possible.
2508 if (const auto *CT = T->getAs<ComplexType>())
2509 T = CT->getElementType().getTypePtr();
2510 if (const auto *ET = T->getAs<EnumType>())
2511 T = ET->getDecl()->getIntegerType().getTypePtr();
2512 if (T->isSpecificBuiltinType(BuiltinType::Double) ||
2513 T->isSpecificBuiltinType(BuiltinType::LongLong) ||
2514 T->isSpecificBuiltinType(BuiltinType::ULongLong) ||
2515 (T->isSpecificBuiltinType(BuiltinType::LongDouble) &&
2516 Target->defaultsToAIXPowerAlignment()))
2517 // Don't increase the alignment if an alignment attribute was specified on a
2518 // typedef declaration.
2519 if (!TI.isAlignRequired())
2520 return std::max(ABIAlign, (unsigned)getTypeSize(T));
2521
2522 return ABIAlign;
2523 }
2524
2525 /// getTargetDefaultAlignForAttributeAligned - Return the default alignment
2526 /// for __attribute__((aligned)) on this target, to be used if no alignment
2527 /// value is specified.
getTargetDefaultAlignForAttributeAligned() const2528 unsigned ASTContext::getTargetDefaultAlignForAttributeAligned() const {
2529 return getTargetInfo().getDefaultAlignForAttributeAligned();
2530 }
2531
2532 /// getAlignOfGlobalVar - Return the alignment in bits that should be given
2533 /// to a global variable of the specified type.
getAlignOfGlobalVar(QualType T) const2534 unsigned ASTContext::getAlignOfGlobalVar(QualType T) const {
2535 uint64_t TypeSize = getTypeSize(T.getTypePtr());
2536 return std::max(getPreferredTypeAlign(T),
2537 getTargetInfo().getMinGlobalAlign(TypeSize));
2538 }
2539
2540 /// getAlignOfGlobalVarInChars - Return the alignment in characters that
2541 /// should be given to a global variable of the specified type.
getAlignOfGlobalVarInChars(QualType T) const2542 CharUnits ASTContext::getAlignOfGlobalVarInChars(QualType T) const {
2543 return toCharUnitsFromBits(getAlignOfGlobalVar(T));
2544 }
2545
getOffsetOfBaseWithVBPtr(const CXXRecordDecl * RD) const2546 CharUnits ASTContext::getOffsetOfBaseWithVBPtr(const CXXRecordDecl *RD) const {
2547 CharUnits Offset = CharUnits::Zero();
2548 const ASTRecordLayout *Layout = &getASTRecordLayout(RD);
2549 while (const CXXRecordDecl *Base = Layout->getBaseSharingVBPtr()) {
2550 Offset += Layout->getBaseClassOffset(Base);
2551 Layout = &getASTRecordLayout(Base);
2552 }
2553 return Offset;
2554 }
2555
getMemberPointerPathAdjustment(const APValue & MP) const2556 CharUnits ASTContext::getMemberPointerPathAdjustment(const APValue &MP) const {
2557 const ValueDecl *MPD = MP.getMemberPointerDecl();
2558 CharUnits ThisAdjustment = CharUnits::Zero();
2559 ArrayRef<const CXXRecordDecl*> Path = MP.getMemberPointerPath();
2560 bool DerivedMember = MP.isMemberPointerToDerivedMember();
2561 const CXXRecordDecl *RD = cast<CXXRecordDecl>(MPD->getDeclContext());
2562 for (unsigned I = 0, N = Path.size(); I != N; ++I) {
2563 const CXXRecordDecl *Base = RD;
2564 const CXXRecordDecl *Derived = Path[I];
2565 if (DerivedMember)
2566 std::swap(Base, Derived);
2567 ThisAdjustment += getASTRecordLayout(Derived).getBaseClassOffset(Base);
2568 RD = Path[I];
2569 }
2570 if (DerivedMember)
2571 ThisAdjustment = -ThisAdjustment;
2572 return ThisAdjustment;
2573 }
2574
2575 /// DeepCollectObjCIvars -
2576 /// This routine first collects all declared, but not synthesized, ivars in
2577 /// super class and then collects all ivars, including those synthesized for
2578 /// current class. This routine is used for implementation of current class
2579 /// when all ivars, declared and synthesized are known.
DeepCollectObjCIvars(const ObjCInterfaceDecl * OI,bool leafClass,SmallVectorImpl<const ObjCIvarDecl * > & Ivars) const2580 void ASTContext::DeepCollectObjCIvars(const ObjCInterfaceDecl *OI,
2581 bool leafClass,
2582 SmallVectorImpl<const ObjCIvarDecl*> &Ivars) const {
2583 if (const ObjCInterfaceDecl *SuperClass = OI->getSuperClass())
2584 DeepCollectObjCIvars(SuperClass, false, Ivars);
2585 if (!leafClass) {
2586 for (const auto *I : OI->ivars())
2587 Ivars.push_back(I);
2588 } else {
2589 auto *IDecl = const_cast<ObjCInterfaceDecl *>(OI);
2590 for (const ObjCIvarDecl *Iv = IDecl->all_declared_ivar_begin(); Iv;
2591 Iv= Iv->getNextIvar())
2592 Ivars.push_back(Iv);
2593 }
2594 }
2595
2596 /// CollectInheritedProtocols - Collect all protocols in current class and
2597 /// those inherited by it.
CollectInheritedProtocols(const Decl * CDecl,llvm::SmallPtrSet<ObjCProtocolDecl *,8> & Protocols)2598 void ASTContext::CollectInheritedProtocols(const Decl *CDecl,
2599 llvm::SmallPtrSet<ObjCProtocolDecl*, 8> &Protocols) {
2600 if (const auto *OI = dyn_cast<ObjCInterfaceDecl>(CDecl)) {
2601 // We can use protocol_iterator here instead of
2602 // all_referenced_protocol_iterator since we are walking all categories.
2603 for (auto *Proto : OI->all_referenced_protocols()) {
2604 CollectInheritedProtocols(Proto, Protocols);
2605 }
2606
2607 // Categories of this Interface.
2608 for (const auto *Cat : OI->visible_categories())
2609 CollectInheritedProtocols(Cat, Protocols);
2610
2611 if (ObjCInterfaceDecl *SD = OI->getSuperClass())
2612 while (SD) {
2613 CollectInheritedProtocols(SD, Protocols);
2614 SD = SD->getSuperClass();
2615 }
2616 } else if (const auto *OC = dyn_cast<ObjCCategoryDecl>(CDecl)) {
2617 for (auto *Proto : OC->protocols()) {
2618 CollectInheritedProtocols(Proto, Protocols);
2619 }
2620 } else if (const auto *OP = dyn_cast<ObjCProtocolDecl>(CDecl)) {
2621 // Insert the protocol.
2622 if (!Protocols.insert(
2623 const_cast<ObjCProtocolDecl *>(OP->getCanonicalDecl())).second)
2624 return;
2625
2626 for (auto *Proto : OP->protocols())
2627 CollectInheritedProtocols(Proto, Protocols);
2628 }
2629 }
2630
unionHasUniqueObjectRepresentations(const ASTContext & Context,const RecordDecl * RD)2631 static bool unionHasUniqueObjectRepresentations(const ASTContext &Context,
2632 const RecordDecl *RD) {
2633 assert(RD->isUnion() && "Must be union type");
2634 CharUnits UnionSize = Context.getTypeSizeInChars(RD->getTypeForDecl());
2635
2636 for (const auto *Field : RD->fields()) {
2637 if (!Context.hasUniqueObjectRepresentations(Field->getType()))
2638 return false;
2639 CharUnits FieldSize = Context.getTypeSizeInChars(Field->getType());
2640 if (FieldSize != UnionSize)
2641 return false;
2642 }
2643 return !RD->field_empty();
2644 }
2645
getSubobjectOffset(const FieldDecl * Field,const ASTContext & Context,const clang::ASTRecordLayout &)2646 static int64_t getSubobjectOffset(const FieldDecl *Field,
2647 const ASTContext &Context,
2648 const clang::ASTRecordLayout & /*Layout*/) {
2649 return Context.getFieldOffset(Field);
2650 }
2651
getSubobjectOffset(const CXXRecordDecl * RD,const ASTContext & Context,const clang::ASTRecordLayout & Layout)2652 static int64_t getSubobjectOffset(const CXXRecordDecl *RD,
2653 const ASTContext &Context,
2654 const clang::ASTRecordLayout &Layout) {
2655 return Context.toBits(Layout.getBaseClassOffset(RD));
2656 }
2657
2658 static llvm::Optional<int64_t>
2659 structHasUniqueObjectRepresentations(const ASTContext &Context,
2660 const RecordDecl *RD);
2661
2662 static llvm::Optional<int64_t>
getSubobjectSizeInBits(const FieldDecl * Field,const ASTContext & Context)2663 getSubobjectSizeInBits(const FieldDecl *Field, const ASTContext &Context) {
2664 if (Field->getType()->isRecordType()) {
2665 const RecordDecl *RD = Field->getType()->getAsRecordDecl();
2666 if (!RD->isUnion())
2667 return structHasUniqueObjectRepresentations(Context, RD);
2668 }
2669 if (!Field->getType()->isReferenceType() &&
2670 !Context.hasUniqueObjectRepresentations(Field->getType()))
2671 return llvm::None;
2672
2673 int64_t FieldSizeInBits =
2674 Context.toBits(Context.getTypeSizeInChars(Field->getType()));
2675 if (Field->isBitField()) {
2676 int64_t BitfieldSize = Field->getBitWidthValue(Context);
2677 if (BitfieldSize > FieldSizeInBits)
2678 return llvm::None;
2679 FieldSizeInBits = BitfieldSize;
2680 }
2681 return FieldSizeInBits;
2682 }
2683
2684 static llvm::Optional<int64_t>
getSubobjectSizeInBits(const CXXRecordDecl * RD,const ASTContext & Context)2685 getSubobjectSizeInBits(const CXXRecordDecl *RD, const ASTContext &Context) {
2686 return structHasUniqueObjectRepresentations(Context, RD);
2687 }
2688
2689 template <typename RangeT>
structSubobjectsHaveUniqueObjectRepresentations(const RangeT & Subobjects,int64_t CurOffsetInBits,const ASTContext & Context,const clang::ASTRecordLayout & Layout)2690 static llvm::Optional<int64_t> structSubobjectsHaveUniqueObjectRepresentations(
2691 const RangeT &Subobjects, int64_t CurOffsetInBits,
2692 const ASTContext &Context, const clang::ASTRecordLayout &Layout) {
2693 for (const auto *Subobject : Subobjects) {
2694 llvm::Optional<int64_t> SizeInBits =
2695 getSubobjectSizeInBits(Subobject, Context);
2696 if (!SizeInBits)
2697 return llvm::None;
2698 if (*SizeInBits != 0) {
2699 int64_t Offset = getSubobjectOffset(Subobject, Context, Layout);
2700 if (Offset != CurOffsetInBits)
2701 return llvm::None;
2702 CurOffsetInBits += *SizeInBits;
2703 }
2704 }
2705 return CurOffsetInBits;
2706 }
2707
2708 static llvm::Optional<int64_t>
structHasUniqueObjectRepresentations(const ASTContext & Context,const RecordDecl * RD)2709 structHasUniqueObjectRepresentations(const ASTContext &Context,
2710 const RecordDecl *RD) {
2711 assert(!RD->isUnion() && "Must be struct/class type");
2712 const auto &Layout = Context.getASTRecordLayout(RD);
2713
2714 int64_t CurOffsetInBits = 0;
2715 if (const auto *ClassDecl = dyn_cast<CXXRecordDecl>(RD)) {
2716 if (ClassDecl->isDynamicClass())
2717 return llvm::None;
2718
2719 SmallVector<CXXRecordDecl *, 4> Bases;
2720 for (const auto &Base : ClassDecl->bases()) {
2721 // Empty types can be inherited from, and non-empty types can potentially
2722 // have tail padding, so just make sure there isn't an error.
2723 Bases.emplace_back(Base.getType()->getAsCXXRecordDecl());
2724 }
2725
2726 llvm::sort(Bases, [&](const CXXRecordDecl *L, const CXXRecordDecl *R) {
2727 return Layout.getBaseClassOffset(L) < Layout.getBaseClassOffset(R);
2728 });
2729
2730 llvm::Optional<int64_t> OffsetAfterBases =
2731 structSubobjectsHaveUniqueObjectRepresentations(Bases, CurOffsetInBits,
2732 Context, Layout);
2733 if (!OffsetAfterBases)
2734 return llvm::None;
2735 CurOffsetInBits = *OffsetAfterBases;
2736 }
2737
2738 llvm::Optional<int64_t> OffsetAfterFields =
2739 structSubobjectsHaveUniqueObjectRepresentations(
2740 RD->fields(), CurOffsetInBits, Context, Layout);
2741 if (!OffsetAfterFields)
2742 return llvm::None;
2743 CurOffsetInBits = *OffsetAfterFields;
2744
2745 return CurOffsetInBits;
2746 }
2747
hasUniqueObjectRepresentations(QualType Ty) const2748 bool ASTContext::hasUniqueObjectRepresentations(QualType Ty) const {
2749 // C++17 [meta.unary.prop]:
2750 // The predicate condition for a template specialization
2751 // has_unique_object_representations<T> shall be
2752 // satisfied if and only if:
2753 // (9.1) - T is trivially copyable, and
2754 // (9.2) - any two objects of type T with the same value have the same
2755 // object representation, where two objects
2756 // of array or non-union class type are considered to have the same value
2757 // if their respective sequences of
2758 // direct subobjects have the same values, and two objects of union type
2759 // are considered to have the same
2760 // value if they have the same active member and the corresponding members
2761 // have the same value.
2762 // The set of scalar types for which this condition holds is
2763 // implementation-defined. [ Note: If a type has padding
2764 // bits, the condition does not hold; otherwise, the condition holds true
2765 // for unsigned integral types. -- end note ]
2766 assert(!Ty.isNull() && "Null QualType sent to unique object rep check");
2767
2768 // Arrays are unique only if their element type is unique.
2769 if (Ty->isArrayType())
2770 return hasUniqueObjectRepresentations(getBaseElementType(Ty));
2771
2772 // (9.1) - T is trivially copyable...
2773 if (!Ty.isTriviallyCopyableType(*this))
2774 return false;
2775
2776 // All integrals and enums are unique.
2777 if (Ty->isIntegralOrEnumerationType())
2778 return true;
2779
2780 // All other pointers are unique.
2781 if (Ty->isPointerType())
2782 return true;
2783
2784 if (Ty->isMemberPointerType()) {
2785 const auto *MPT = Ty->getAs<MemberPointerType>();
2786 return !ABI->getMemberPointerInfo(MPT).HasPadding;
2787 }
2788
2789 if (Ty->isRecordType()) {
2790 const RecordDecl *Record = Ty->castAs<RecordType>()->getDecl();
2791
2792 if (Record->isInvalidDecl())
2793 return false;
2794
2795 if (Record->isUnion())
2796 return unionHasUniqueObjectRepresentations(*this, Record);
2797
2798 Optional<int64_t> StructSize =
2799 structHasUniqueObjectRepresentations(*this, Record);
2800
2801 return StructSize &&
2802 StructSize.getValue() == static_cast<int64_t>(getTypeSize(Ty));
2803 }
2804
2805 // FIXME: More cases to handle here (list by rsmith):
2806 // vectors (careful about, eg, vector of 3 foo)
2807 // _Complex int and friends
2808 // _Atomic T
2809 // Obj-C block pointers
2810 // Obj-C object pointers
2811 // and perhaps OpenCL's various builtin types (pipe, sampler_t, event_t,
2812 // clk_event_t, queue_t, reserve_id_t)
2813 // There're also Obj-C class types and the Obj-C selector type, but I think it
2814 // makes sense for those to return false here.
2815
2816 return false;
2817 }
2818
CountNonClassIvars(const ObjCInterfaceDecl * OI) const2819 unsigned ASTContext::CountNonClassIvars(const ObjCInterfaceDecl *OI) const {
2820 unsigned count = 0;
2821 // Count ivars declared in class extension.
2822 for (const auto *Ext : OI->known_extensions())
2823 count += Ext->ivar_size();
2824
2825 // Count ivar defined in this class's implementation. This
2826 // includes synthesized ivars.
2827 if (ObjCImplementationDecl *ImplDecl = OI->getImplementation())
2828 count += ImplDecl->ivar_size();
2829
2830 return count;
2831 }
2832
isSentinelNullExpr(const Expr * E)2833 bool ASTContext::isSentinelNullExpr(const Expr *E) {
2834 if (!E)
2835 return false;
2836
2837 // nullptr_t is always treated as null.
2838 if (E->getType()->isNullPtrType()) return true;
2839
2840 if (E->getType()->isAnyPointerType() &&
2841 E->IgnoreParenCasts()->isNullPointerConstant(*this,
2842 Expr::NPC_ValueDependentIsNull))
2843 return true;
2844
2845 // Unfortunately, __null has type 'int'.
2846 if (isa<GNUNullExpr>(E)) return true;
2847
2848 return false;
2849 }
2850
2851 /// Get the implementation of ObjCInterfaceDecl, or nullptr if none
2852 /// exists.
getObjCImplementation(ObjCInterfaceDecl * D)2853 ObjCImplementationDecl *ASTContext::getObjCImplementation(ObjCInterfaceDecl *D) {
2854 llvm::DenseMap<ObjCContainerDecl*, ObjCImplDecl*>::iterator
2855 I = ObjCImpls.find(D);
2856 if (I != ObjCImpls.end())
2857 return cast<ObjCImplementationDecl>(I->second);
2858 return nullptr;
2859 }
2860
2861 /// Get the implementation of ObjCCategoryDecl, or nullptr if none
2862 /// exists.
getObjCImplementation(ObjCCategoryDecl * D)2863 ObjCCategoryImplDecl *ASTContext::getObjCImplementation(ObjCCategoryDecl *D) {
2864 llvm::DenseMap<ObjCContainerDecl*, ObjCImplDecl*>::iterator
2865 I = ObjCImpls.find(D);
2866 if (I != ObjCImpls.end())
2867 return cast<ObjCCategoryImplDecl>(I->second);
2868 return nullptr;
2869 }
2870
2871 /// Set the implementation of ObjCInterfaceDecl.
setObjCImplementation(ObjCInterfaceDecl * IFaceD,ObjCImplementationDecl * ImplD)2872 void ASTContext::setObjCImplementation(ObjCInterfaceDecl *IFaceD,
2873 ObjCImplementationDecl *ImplD) {
2874 assert(IFaceD && ImplD && "Passed null params");
2875 ObjCImpls[IFaceD] = ImplD;
2876 }
2877
2878 /// Set the implementation of ObjCCategoryDecl.
setObjCImplementation(ObjCCategoryDecl * CatD,ObjCCategoryImplDecl * ImplD)2879 void ASTContext::setObjCImplementation(ObjCCategoryDecl *CatD,
2880 ObjCCategoryImplDecl *ImplD) {
2881 assert(CatD && ImplD && "Passed null params");
2882 ObjCImpls[CatD] = ImplD;
2883 }
2884
2885 const ObjCMethodDecl *
getObjCMethodRedeclaration(const ObjCMethodDecl * MD) const2886 ASTContext::getObjCMethodRedeclaration(const ObjCMethodDecl *MD) const {
2887 return ObjCMethodRedecls.lookup(MD);
2888 }
2889
setObjCMethodRedeclaration(const ObjCMethodDecl * MD,const ObjCMethodDecl * Redecl)2890 void ASTContext::setObjCMethodRedeclaration(const ObjCMethodDecl *MD,
2891 const ObjCMethodDecl *Redecl) {
2892 assert(!getObjCMethodRedeclaration(MD) && "MD already has a redeclaration");
2893 ObjCMethodRedecls[MD] = Redecl;
2894 }
2895
getObjContainingInterface(const NamedDecl * ND) const2896 const ObjCInterfaceDecl *ASTContext::getObjContainingInterface(
2897 const NamedDecl *ND) const {
2898 if (const auto *ID = dyn_cast<ObjCInterfaceDecl>(ND->getDeclContext()))
2899 return ID;
2900 if (const auto *CD = dyn_cast<ObjCCategoryDecl>(ND->getDeclContext()))
2901 return CD->getClassInterface();
2902 if (const auto *IMD = dyn_cast<ObjCImplDecl>(ND->getDeclContext()))
2903 return IMD->getClassInterface();
2904
2905 return nullptr;
2906 }
2907
2908 /// Get the copy initialization expression of VarDecl, or nullptr if
2909 /// none exists.
getBlockVarCopyInit(const VarDecl * VD) const2910 BlockVarCopyInit ASTContext::getBlockVarCopyInit(const VarDecl *VD) const {
2911 assert(VD && "Passed null params");
2912 assert(VD->hasAttr<BlocksAttr>() &&
2913 "getBlockVarCopyInits - not __block var");
2914 auto I = BlockVarCopyInits.find(VD);
2915 if (I != BlockVarCopyInits.end())
2916 return I->second;
2917 return {nullptr, false};
2918 }
2919
2920 /// Set the copy initialization expression of a block var decl.
setBlockVarCopyInit(const VarDecl * VD,Expr * CopyExpr,bool CanThrow)2921 void ASTContext::setBlockVarCopyInit(const VarDecl*VD, Expr *CopyExpr,
2922 bool CanThrow) {
2923 assert(VD && CopyExpr && "Passed null params");
2924 assert(VD->hasAttr<BlocksAttr>() &&
2925 "setBlockVarCopyInits - not __block var");
2926 BlockVarCopyInits[VD].setExprAndFlag(CopyExpr, CanThrow);
2927 }
2928
CreateTypeSourceInfo(QualType T,unsigned DataSize) const2929 TypeSourceInfo *ASTContext::CreateTypeSourceInfo(QualType T,
2930 unsigned DataSize) const {
2931 if (!DataSize)
2932 DataSize = TypeLoc::getFullDataSizeForType(T);
2933 else
2934 assert(DataSize == TypeLoc::getFullDataSizeForType(T) &&
2935 "incorrect data size provided to CreateTypeSourceInfo!");
2936
2937 auto *TInfo =
2938 (TypeSourceInfo*)BumpAlloc.Allocate(sizeof(TypeSourceInfo) + DataSize, 8);
2939 new (TInfo) TypeSourceInfo(T);
2940 return TInfo;
2941 }
2942
getTrivialTypeSourceInfo(QualType T,SourceLocation L) const2943 TypeSourceInfo *ASTContext::getTrivialTypeSourceInfo(QualType T,
2944 SourceLocation L) const {
2945 TypeSourceInfo *DI = CreateTypeSourceInfo(T);
2946 DI->getTypeLoc().initialize(const_cast<ASTContext &>(*this), L);
2947 return DI;
2948 }
2949
2950 const ASTRecordLayout &
getASTObjCInterfaceLayout(const ObjCInterfaceDecl * D) const2951 ASTContext::getASTObjCInterfaceLayout(const ObjCInterfaceDecl *D) const {
2952 return getObjCLayout(D, nullptr);
2953 }
2954
2955 const ASTRecordLayout &
getASTObjCImplementationLayout(const ObjCImplementationDecl * D) const2956 ASTContext::getASTObjCImplementationLayout(
2957 const ObjCImplementationDecl *D) const {
2958 return getObjCLayout(D->getClassInterface(), D);
2959 }
2960
2961 //===----------------------------------------------------------------------===//
2962 // Type creation/memoization methods
2963 //===----------------------------------------------------------------------===//
2964
2965 QualType
getExtQualType(const Type * baseType,Qualifiers quals) const2966 ASTContext::getExtQualType(const Type *baseType, Qualifiers quals) const {
2967 unsigned fastQuals = quals.getFastQualifiers();
2968 quals.removeFastQualifiers();
2969
2970 // Check if we've already instantiated this type.
2971 llvm::FoldingSetNodeID ID;
2972 ExtQuals::Profile(ID, baseType, quals);
2973 void *insertPos = nullptr;
2974 if (ExtQuals *eq = ExtQualNodes.FindNodeOrInsertPos(ID, insertPos)) {
2975 assert(eq->getQualifiers() == quals);
2976 return QualType(eq, fastQuals);
2977 }
2978
2979 // If the base type is not canonical, make the appropriate canonical type.
2980 QualType canon;
2981 if (!baseType->isCanonicalUnqualified()) {
2982 SplitQualType canonSplit = baseType->getCanonicalTypeInternal().split();
2983 canonSplit.Quals.addConsistentQualifiers(quals);
2984 canon = getExtQualType(canonSplit.Ty, canonSplit.Quals);
2985
2986 // Re-find the insert position.
2987 (void) ExtQualNodes.FindNodeOrInsertPos(ID, insertPos);
2988 }
2989
2990 auto *eq = new (*this, TypeAlignment) ExtQuals(baseType, canon, quals);
2991 ExtQualNodes.InsertNode(eq, insertPos);
2992 return QualType(eq, fastQuals);
2993 }
2994
getAddrSpaceQualType(QualType T,LangAS AddressSpace) const2995 QualType ASTContext::getAddrSpaceQualType(QualType T,
2996 LangAS AddressSpace) const {
2997 QualType CanT = getCanonicalType(T);
2998 if (CanT.getAddressSpace() == AddressSpace)
2999 return T;
3000
3001 // If we are composing extended qualifiers together, merge together
3002 // into one ExtQuals node.
3003 QualifierCollector Quals;
3004 const Type *TypeNode = Quals.strip(T);
3005
3006 // If this type already has an address space specified, it cannot get
3007 // another one.
3008 assert(!Quals.hasAddressSpace() &&
3009 "Type cannot be in multiple addr spaces!");
3010 Quals.addAddressSpace(AddressSpace);
3011
3012 return getExtQualType(TypeNode, Quals);
3013 }
3014
removeAddrSpaceQualType(QualType T) const3015 QualType ASTContext::removeAddrSpaceQualType(QualType T) const {
3016 // If the type is not qualified with an address space, just return it
3017 // immediately.
3018 if (!T.hasAddressSpace())
3019 return T;
3020
3021 // If we are composing extended qualifiers together, merge together
3022 // into one ExtQuals node.
3023 QualifierCollector Quals;
3024 const Type *TypeNode;
3025
3026 while (T.hasAddressSpace()) {
3027 TypeNode = Quals.strip(T);
3028
3029 // If the type no longer has an address space after stripping qualifiers,
3030 // jump out.
3031 if (!QualType(TypeNode, 0).hasAddressSpace())
3032 break;
3033
3034 // There might be sugar in the way. Strip it and try again.
3035 T = T.getSingleStepDesugaredType(*this);
3036 }
3037
3038 Quals.removeAddressSpace();
3039
3040 // Removal of the address space can mean there are no longer any
3041 // non-fast qualifiers, so creating an ExtQualType isn't possible (asserts)
3042 // or required.
3043 if (Quals.hasNonFastQualifiers())
3044 return getExtQualType(TypeNode, Quals);
3045 else
3046 return QualType(TypeNode, Quals.getFastQualifiers());
3047 }
3048
getObjCGCQualType(QualType T,Qualifiers::GC GCAttr) const3049 QualType ASTContext::getObjCGCQualType(QualType T,
3050 Qualifiers::GC GCAttr) const {
3051 QualType CanT = getCanonicalType(T);
3052 if (CanT.getObjCGCAttr() == GCAttr)
3053 return T;
3054
3055 if (const auto *ptr = T->getAs<PointerType>()) {
3056 QualType Pointee = ptr->getPointeeType();
3057 if (Pointee->isAnyPointerType()) {
3058 QualType ResultType = getObjCGCQualType(Pointee, GCAttr);
3059 return getPointerType(ResultType);
3060 }
3061 }
3062
3063 // If we are composing extended qualifiers together, merge together
3064 // into one ExtQuals node.
3065 QualifierCollector Quals;
3066 const Type *TypeNode = Quals.strip(T);
3067
3068 // If this type already has an ObjCGC specified, it cannot get
3069 // another one.
3070 assert(!Quals.hasObjCGCAttr() &&
3071 "Type cannot have multiple ObjCGCs!");
3072 Quals.addObjCGCAttr(GCAttr);
3073
3074 return getExtQualType(TypeNode, Quals);
3075 }
3076
removePtrSizeAddrSpace(QualType T) const3077 QualType ASTContext::removePtrSizeAddrSpace(QualType T) const {
3078 if (const PointerType *Ptr = T->getAs<PointerType>()) {
3079 QualType Pointee = Ptr->getPointeeType();
3080 if (isPtrSizeAddressSpace(Pointee.getAddressSpace())) {
3081 return getPointerType(removeAddrSpaceQualType(Pointee));
3082 }
3083 }
3084 return T;
3085 }
3086
adjustFunctionType(const FunctionType * T,FunctionType::ExtInfo Info)3087 const FunctionType *ASTContext::adjustFunctionType(const FunctionType *T,
3088 FunctionType::ExtInfo Info) {
3089 if (T->getExtInfo() == Info)
3090 return T;
3091
3092 QualType Result;
3093 if (const auto *FNPT = dyn_cast<FunctionNoProtoType>(T)) {
3094 Result = getFunctionNoProtoType(FNPT->getReturnType(), Info);
3095 } else {
3096 const auto *FPT = cast<FunctionProtoType>(T);
3097 FunctionProtoType::ExtProtoInfo EPI = FPT->getExtProtoInfo();
3098 EPI.ExtInfo = Info;
3099 Result = getFunctionType(FPT->getReturnType(), FPT->getParamTypes(), EPI);
3100 }
3101
3102 return cast<FunctionType>(Result.getTypePtr());
3103 }
3104
adjustDeducedFunctionResultType(FunctionDecl * FD,QualType ResultType)3105 void ASTContext::adjustDeducedFunctionResultType(FunctionDecl *FD,
3106 QualType ResultType) {
3107 FD = FD->getMostRecentDecl();
3108 while (true) {
3109 const auto *FPT = FD->getType()->castAs<FunctionProtoType>();
3110 FunctionProtoType::ExtProtoInfo EPI = FPT->getExtProtoInfo();
3111 FD->setType(getFunctionType(ResultType, FPT->getParamTypes(), EPI));
3112 if (FunctionDecl *Next = FD->getPreviousDecl())
3113 FD = Next;
3114 else
3115 break;
3116 }
3117 if (ASTMutationListener *L = getASTMutationListener())
3118 L->DeducedReturnType(FD, ResultType);
3119 }
3120
3121 /// Get a function type and produce the equivalent function type with the
3122 /// specified exception specification. Type sugar that can be present on a
3123 /// declaration of a function with an exception specification is permitted
3124 /// and preserved. Other type sugar (for instance, typedefs) is not.
getFunctionTypeWithExceptionSpec(QualType Orig,const FunctionProtoType::ExceptionSpecInfo & ESI)3125 QualType ASTContext::getFunctionTypeWithExceptionSpec(
3126 QualType Orig, const FunctionProtoType::ExceptionSpecInfo &ESI) {
3127 // Might have some parens.
3128 if (const auto *PT = dyn_cast<ParenType>(Orig))
3129 return getParenType(
3130 getFunctionTypeWithExceptionSpec(PT->getInnerType(), ESI));
3131
3132 // Might be wrapped in a macro qualified type.
3133 if (const auto *MQT = dyn_cast<MacroQualifiedType>(Orig))
3134 return getMacroQualifiedType(
3135 getFunctionTypeWithExceptionSpec(MQT->getUnderlyingType(), ESI),
3136 MQT->getMacroIdentifier());
3137
3138 // Might have a calling-convention attribute.
3139 if (const auto *AT = dyn_cast<AttributedType>(Orig))
3140 return getAttributedType(
3141 AT->getAttrKind(),
3142 getFunctionTypeWithExceptionSpec(AT->getModifiedType(), ESI),
3143 getFunctionTypeWithExceptionSpec(AT->getEquivalentType(), ESI));
3144
3145 // Anything else must be a function type. Rebuild it with the new exception
3146 // specification.
3147 const auto *Proto = Orig->castAs<FunctionProtoType>();
3148 return getFunctionType(
3149 Proto->getReturnType(), Proto->getParamTypes(),
3150 Proto->getExtProtoInfo().withExceptionSpec(ESI));
3151 }
3152
hasSameFunctionTypeIgnoringExceptionSpec(QualType T,QualType U)3153 bool ASTContext::hasSameFunctionTypeIgnoringExceptionSpec(QualType T,
3154 QualType U) {
3155 return hasSameType(T, U) ||
3156 (getLangOpts().CPlusPlus17 &&
3157 hasSameType(getFunctionTypeWithExceptionSpec(T, EST_None),
3158 getFunctionTypeWithExceptionSpec(U, EST_None)));
3159 }
3160
getFunctionTypeWithoutPtrSizes(QualType T)3161 QualType ASTContext::getFunctionTypeWithoutPtrSizes(QualType T) {
3162 if (const auto *Proto = T->getAs<FunctionProtoType>()) {
3163 QualType RetTy = removePtrSizeAddrSpace(Proto->getReturnType());
3164 SmallVector<QualType, 16> Args(Proto->param_types());
3165 for (unsigned i = 0, n = Args.size(); i != n; ++i)
3166 Args[i] = removePtrSizeAddrSpace(Args[i]);
3167 return getFunctionType(RetTy, Args, Proto->getExtProtoInfo());
3168 }
3169
3170 if (const FunctionNoProtoType *Proto = T->getAs<FunctionNoProtoType>()) {
3171 QualType RetTy = removePtrSizeAddrSpace(Proto->getReturnType());
3172 return getFunctionNoProtoType(RetTy, Proto->getExtInfo());
3173 }
3174
3175 return T;
3176 }
3177
hasSameFunctionTypeIgnoringPtrSizes(QualType T,QualType U)3178 bool ASTContext::hasSameFunctionTypeIgnoringPtrSizes(QualType T, QualType U) {
3179 return hasSameType(T, U) ||
3180 hasSameType(getFunctionTypeWithoutPtrSizes(T),
3181 getFunctionTypeWithoutPtrSizes(U));
3182 }
3183
adjustExceptionSpec(FunctionDecl * FD,const FunctionProtoType::ExceptionSpecInfo & ESI,bool AsWritten)3184 void ASTContext::adjustExceptionSpec(
3185 FunctionDecl *FD, const FunctionProtoType::ExceptionSpecInfo &ESI,
3186 bool AsWritten) {
3187 // Update the type.
3188 QualType Updated =
3189 getFunctionTypeWithExceptionSpec(FD->getType(), ESI);
3190 FD->setType(Updated);
3191
3192 if (!AsWritten)
3193 return;
3194
3195 // Update the type in the type source information too.
3196 if (TypeSourceInfo *TSInfo = FD->getTypeSourceInfo()) {
3197 // If the type and the type-as-written differ, we may need to update
3198 // the type-as-written too.
3199 if (TSInfo->getType() != FD->getType())
3200 Updated = getFunctionTypeWithExceptionSpec(TSInfo->getType(), ESI);
3201
3202 // FIXME: When we get proper type location information for exceptions,
3203 // we'll also have to rebuild the TypeSourceInfo. For now, we just patch
3204 // up the TypeSourceInfo;
3205 assert(TypeLoc::getFullDataSizeForType(Updated) ==
3206 TypeLoc::getFullDataSizeForType(TSInfo->getType()) &&
3207 "TypeLoc size mismatch from updating exception specification");
3208 TSInfo->overrideType(Updated);
3209 }
3210 }
3211
3212 /// getComplexType - Return the uniqued reference to the type for a complex
3213 /// number with the specified element type.
getComplexType(QualType T) const3214 QualType ASTContext::getComplexType(QualType T) const {
3215 // Unique pointers, to guarantee there is only one pointer of a particular
3216 // structure.
3217 llvm::FoldingSetNodeID ID;
3218 ComplexType::Profile(ID, T);
3219
3220 void *InsertPos = nullptr;
3221 if (ComplexType *CT = ComplexTypes.FindNodeOrInsertPos(ID, InsertPos))
3222 return QualType(CT, 0);
3223
3224 // If the pointee type isn't canonical, this won't be a canonical type either,
3225 // so fill in the canonical type field.
3226 QualType Canonical;
3227 if (!T.isCanonical()) {
3228 Canonical = getComplexType(getCanonicalType(T));
3229
3230 // Get the new insert position for the node we care about.
3231 ComplexType *NewIP = ComplexTypes.FindNodeOrInsertPos(ID, InsertPos);
3232 assert(!NewIP && "Shouldn't be in the map!"); (void)NewIP;
3233 }
3234 auto *New = new (*this, TypeAlignment) ComplexType(T, Canonical);
3235 Types.push_back(New);
3236 ComplexTypes.InsertNode(New, InsertPos);
3237 return QualType(New, 0);
3238 }
3239
3240 /// getPointerType - Return the uniqued reference to the type for a pointer to
3241 /// the specified type.
getPointerType(QualType T) const3242 QualType ASTContext::getPointerType(QualType T) const {
3243 // Unique pointers, to guarantee there is only one pointer of a particular
3244 // structure.
3245 llvm::FoldingSetNodeID ID;
3246 PointerType::Profile(ID, T);
3247
3248 void *InsertPos = nullptr;
3249 if (PointerType *PT = PointerTypes.FindNodeOrInsertPos(ID, InsertPos))
3250 return QualType(PT, 0);
3251
3252 // If the pointee type isn't canonical, this won't be a canonical type either,
3253 // so fill in the canonical type field.
3254 QualType Canonical;
3255 if (!T.isCanonical()) {
3256 Canonical = getPointerType(getCanonicalType(T));
3257
3258 // Get the new insert position for the node we care about.
3259 PointerType *NewIP = PointerTypes.FindNodeOrInsertPos(ID, InsertPos);
3260 assert(!NewIP && "Shouldn't be in the map!"); (void)NewIP;
3261 }
3262 auto *New = new (*this, TypeAlignment) PointerType(T, Canonical);
3263 Types.push_back(New);
3264 PointerTypes.InsertNode(New, InsertPos);
3265 return QualType(New, 0);
3266 }
3267
getAdjustedType(QualType Orig,QualType New) const3268 QualType ASTContext::getAdjustedType(QualType Orig, QualType New) const {
3269 llvm::FoldingSetNodeID ID;
3270 AdjustedType::Profile(ID, Orig, New);
3271 void *InsertPos = nullptr;
3272 AdjustedType *AT = AdjustedTypes.FindNodeOrInsertPos(ID, InsertPos);
3273 if (AT)
3274 return QualType(AT, 0);
3275
3276 QualType Canonical = getCanonicalType(New);
3277
3278 // Get the new insert position for the node we care about.
3279 AT = AdjustedTypes.FindNodeOrInsertPos(ID, InsertPos);
3280 assert(!AT && "Shouldn't be in the map!");
3281
3282 AT = new (*this, TypeAlignment)
3283 AdjustedType(Type::Adjusted, Orig, New, Canonical);
3284 Types.push_back(AT);
3285 AdjustedTypes.InsertNode(AT, InsertPos);
3286 return QualType(AT, 0);
3287 }
3288
getDecayedType(QualType T) const3289 QualType ASTContext::getDecayedType(QualType T) const {
3290 assert((T->isArrayType() || T->isFunctionType()) && "T does not decay");
3291
3292 QualType Decayed;
3293
3294 // C99 6.7.5.3p7:
3295 // A declaration of a parameter as "array of type" shall be
3296 // adjusted to "qualified pointer to type", where the type
3297 // qualifiers (if any) are those specified within the [ and ] of
3298 // the array type derivation.
3299 if (T->isArrayType())
3300 Decayed = getArrayDecayedType(T);
3301
3302 // C99 6.7.5.3p8:
3303 // A declaration of a parameter as "function returning type"
3304 // shall be adjusted to "pointer to function returning type", as
3305 // in 6.3.2.1.
3306 if (T->isFunctionType())
3307 Decayed = getPointerType(T);
3308
3309 llvm::FoldingSetNodeID ID;
3310 AdjustedType::Profile(ID, T, Decayed);
3311 void *InsertPos = nullptr;
3312 AdjustedType *AT = AdjustedTypes.FindNodeOrInsertPos(ID, InsertPos);
3313 if (AT)
3314 return QualType(AT, 0);
3315
3316 QualType Canonical = getCanonicalType(Decayed);
3317
3318 // Get the new insert position for the node we care about.
3319 AT = AdjustedTypes.FindNodeOrInsertPos(ID, InsertPos);
3320 assert(!AT && "Shouldn't be in the map!");
3321
3322 AT = new (*this, TypeAlignment) DecayedType(T, Decayed, Canonical);
3323 Types.push_back(AT);
3324 AdjustedTypes.InsertNode(AT, InsertPos);
3325 return QualType(AT, 0);
3326 }
3327
3328 /// getBlockPointerType - Return the uniqued reference to the type for
3329 /// a pointer to the specified block.
getBlockPointerType(QualType T) const3330 QualType ASTContext::getBlockPointerType(QualType T) const {
3331 assert(T->isFunctionType() && "block of function types only");
3332 // Unique pointers, to guarantee there is only one block of a particular
3333 // structure.
3334 llvm::FoldingSetNodeID ID;
3335 BlockPointerType::Profile(ID, T);
3336
3337 void *InsertPos = nullptr;
3338 if (BlockPointerType *PT =
3339 BlockPointerTypes.FindNodeOrInsertPos(ID, InsertPos))
3340 return QualType(PT, 0);
3341
3342 // If the block pointee type isn't canonical, this won't be a canonical
3343 // type either so fill in the canonical type field.
3344 QualType Canonical;
3345 if (!T.isCanonical()) {
3346 Canonical = getBlockPointerType(getCanonicalType(T));
3347
3348 // Get the new insert position for the node we care about.
3349 BlockPointerType *NewIP =
3350 BlockPointerTypes.FindNodeOrInsertPos(ID, InsertPos);
3351 assert(!NewIP && "Shouldn't be in the map!"); (void)NewIP;
3352 }
3353 auto *New = new (*this, TypeAlignment) BlockPointerType(T, Canonical);
3354 Types.push_back(New);
3355 BlockPointerTypes.InsertNode(New, InsertPos);
3356 return QualType(New, 0);
3357 }
3358
3359 /// getLValueReferenceType - Return the uniqued reference to the type for an
3360 /// lvalue reference to the specified type.
3361 QualType
getLValueReferenceType(QualType T,bool SpelledAsLValue) const3362 ASTContext::getLValueReferenceType(QualType T, bool SpelledAsLValue) const {
3363 assert(getCanonicalType(T) != OverloadTy &&
3364 "Unresolved overloaded function type");
3365
3366 // Unique pointers, to guarantee there is only one pointer of a particular
3367 // structure.
3368 llvm::FoldingSetNodeID ID;
3369 ReferenceType::Profile(ID, T, SpelledAsLValue);
3370
3371 void *InsertPos = nullptr;
3372 if (LValueReferenceType *RT =
3373 LValueReferenceTypes.FindNodeOrInsertPos(ID, InsertPos))
3374 return QualType(RT, 0);
3375
3376 const auto *InnerRef = T->getAs<ReferenceType>();
3377
3378 // If the referencee type isn't canonical, this won't be a canonical type
3379 // either, so fill in the canonical type field.
3380 QualType Canonical;
3381 if (!SpelledAsLValue || InnerRef || !T.isCanonical()) {
3382 QualType PointeeType = (InnerRef ? InnerRef->getPointeeType() : T);
3383 Canonical = getLValueReferenceType(getCanonicalType(PointeeType));
3384
3385 // Get the new insert position for the node we care about.
3386 LValueReferenceType *NewIP =
3387 LValueReferenceTypes.FindNodeOrInsertPos(ID, InsertPos);
3388 assert(!NewIP && "Shouldn't be in the map!"); (void)NewIP;
3389 }
3390
3391 auto *New = new (*this, TypeAlignment) LValueReferenceType(T, Canonical,
3392 SpelledAsLValue);
3393 Types.push_back(New);
3394 LValueReferenceTypes.InsertNode(New, InsertPos);
3395
3396 return QualType(New, 0);
3397 }
3398
3399 /// getRValueReferenceType - Return the uniqued reference to the type for an
3400 /// rvalue reference to the specified type.
getRValueReferenceType(QualType T) const3401 QualType ASTContext::getRValueReferenceType(QualType T) const {
3402 // Unique pointers, to guarantee there is only one pointer of a particular
3403 // structure.
3404 llvm::FoldingSetNodeID ID;
3405 ReferenceType::Profile(ID, T, false);
3406
3407 void *InsertPos = nullptr;
3408 if (RValueReferenceType *RT =
3409 RValueReferenceTypes.FindNodeOrInsertPos(ID, InsertPos))
3410 return QualType(RT, 0);
3411
3412 const auto *InnerRef = T->getAs<ReferenceType>();
3413
3414 // If the referencee type isn't canonical, this won't be a canonical type
3415 // either, so fill in the canonical type field.
3416 QualType Canonical;
3417 if (InnerRef || !T.isCanonical()) {
3418 QualType PointeeType = (InnerRef ? InnerRef->getPointeeType() : T);
3419 Canonical = getRValueReferenceType(getCanonicalType(PointeeType));
3420
3421 // Get the new insert position for the node we care about.
3422 RValueReferenceType *NewIP =
3423 RValueReferenceTypes.FindNodeOrInsertPos(ID, InsertPos);
3424 assert(!NewIP && "Shouldn't be in the map!"); (void)NewIP;
3425 }
3426
3427 auto *New = new (*this, TypeAlignment) RValueReferenceType(T, Canonical);
3428 Types.push_back(New);
3429 RValueReferenceTypes.InsertNode(New, InsertPos);
3430 return QualType(New, 0);
3431 }
3432
3433 /// getMemberPointerType - Return the uniqued reference to the type for a
3434 /// member pointer to the specified type, in the specified class.
getMemberPointerType(QualType T,const Type * Cls) const3435 QualType ASTContext::getMemberPointerType(QualType T, const Type *Cls) const {
3436 // Unique pointers, to guarantee there is only one pointer of a particular
3437 // structure.
3438 llvm::FoldingSetNodeID ID;
3439 MemberPointerType::Profile(ID, T, Cls);
3440
3441 void *InsertPos = nullptr;
3442 if (MemberPointerType *PT =
3443 MemberPointerTypes.FindNodeOrInsertPos(ID, InsertPos))
3444 return QualType(PT, 0);
3445
3446 // If the pointee or class type isn't canonical, this won't be a canonical
3447 // type either, so fill in the canonical type field.
3448 QualType Canonical;
3449 if (!T.isCanonical() || !Cls->isCanonicalUnqualified()) {
3450 Canonical = getMemberPointerType(getCanonicalType(T),getCanonicalType(Cls));
3451
3452 // Get the new insert position for the node we care about.
3453 MemberPointerType *NewIP =
3454 MemberPointerTypes.FindNodeOrInsertPos(ID, InsertPos);
3455 assert(!NewIP && "Shouldn't be in the map!"); (void)NewIP;
3456 }
3457 auto *New = new (*this, TypeAlignment) MemberPointerType(T, Cls, Canonical);
3458 Types.push_back(New);
3459 MemberPointerTypes.InsertNode(New, InsertPos);
3460 return QualType(New, 0);
3461 }
3462
3463 /// getConstantArrayType - Return the unique reference to the type for an
3464 /// array of the specified element type.
getConstantArrayType(QualType EltTy,const llvm::APInt & ArySizeIn,const Expr * SizeExpr,ArrayType::ArraySizeModifier ASM,unsigned IndexTypeQuals) const3465 QualType ASTContext::getConstantArrayType(QualType EltTy,
3466 const llvm::APInt &ArySizeIn,
3467 const Expr *SizeExpr,
3468 ArrayType::ArraySizeModifier ASM,
3469 unsigned IndexTypeQuals) const {
3470 assert((EltTy->isDependentType() ||
3471 EltTy->isIncompleteType() || EltTy->isConstantSizeType()) &&
3472 "Constant array of VLAs is illegal!");
3473
3474 // We only need the size as part of the type if it's instantiation-dependent.
3475 if (SizeExpr && !SizeExpr->isInstantiationDependent())
3476 SizeExpr = nullptr;
3477
3478 // Convert the array size into a canonical width matching the pointer size for
3479 // the target.
3480 llvm::APInt ArySize(ArySizeIn);
3481 ArySize = ArySize.zextOrTrunc(Target->getMaxPointerWidth());
3482
3483 llvm::FoldingSetNodeID ID;
3484 ConstantArrayType::Profile(ID, *this, EltTy, ArySize, SizeExpr, ASM,
3485 IndexTypeQuals);
3486
3487 void *InsertPos = nullptr;
3488 if (ConstantArrayType *ATP =
3489 ConstantArrayTypes.FindNodeOrInsertPos(ID, InsertPos))
3490 return QualType(ATP, 0);
3491
3492 // If the element type isn't canonical or has qualifiers, or the array bound
3493 // is instantiation-dependent, this won't be a canonical type either, so fill
3494 // in the canonical type field.
3495 QualType Canon;
3496 if (!EltTy.isCanonical() || EltTy.hasLocalQualifiers() || SizeExpr) {
3497 SplitQualType canonSplit = getCanonicalType(EltTy).split();
3498 Canon = getConstantArrayType(QualType(canonSplit.Ty, 0), ArySize, nullptr,
3499 ASM, IndexTypeQuals);
3500 Canon = getQualifiedType(Canon, canonSplit.Quals);
3501
3502 // Get the new insert position for the node we care about.
3503 ConstantArrayType *NewIP =
3504 ConstantArrayTypes.FindNodeOrInsertPos(ID, InsertPos);
3505 assert(!NewIP && "Shouldn't be in the map!"); (void)NewIP;
3506 }
3507
3508 void *Mem = Allocate(
3509 ConstantArrayType::totalSizeToAlloc<const Expr *>(SizeExpr ? 1 : 0),
3510 TypeAlignment);
3511 auto *New = new (Mem)
3512 ConstantArrayType(EltTy, Canon, ArySize, SizeExpr, ASM, IndexTypeQuals);
3513 ConstantArrayTypes.InsertNode(New, InsertPos);
3514 Types.push_back(New);
3515 return QualType(New, 0);
3516 }
3517
3518 /// getVariableArrayDecayedType - Turns the given type, which may be
3519 /// variably-modified, into the corresponding type with all the known
3520 /// sizes replaced with [*].
getVariableArrayDecayedType(QualType type) const3521 QualType ASTContext::getVariableArrayDecayedType(QualType type) const {
3522 // Vastly most common case.
3523 if (!type->isVariablyModifiedType()) return type;
3524
3525 QualType result;
3526
3527 SplitQualType split = type.getSplitDesugaredType();
3528 const Type *ty = split.Ty;
3529 switch (ty->getTypeClass()) {
3530 #define TYPE(Class, Base)
3531 #define ABSTRACT_TYPE(Class, Base)
3532 #define NON_CANONICAL_TYPE(Class, Base) case Type::Class:
3533 #include "clang/AST/TypeNodes.inc"
3534 llvm_unreachable("didn't desugar past all non-canonical types?");
3535
3536 // These types should never be variably-modified.
3537 case Type::Builtin:
3538 case Type::Complex:
3539 case Type::Vector:
3540 case Type::DependentVector:
3541 case Type::ExtVector:
3542 case Type::DependentSizedExtVector:
3543 case Type::ConstantMatrix:
3544 case Type::DependentSizedMatrix:
3545 case Type::DependentAddressSpace:
3546 case Type::ObjCObject:
3547 case Type::ObjCInterface:
3548 case Type::ObjCObjectPointer:
3549 case Type::Record:
3550 case Type::Enum:
3551 case Type::UnresolvedUsing:
3552 case Type::TypeOfExpr:
3553 case Type::TypeOf:
3554 case Type::Decltype:
3555 case Type::UnaryTransform:
3556 case Type::DependentName:
3557 case Type::InjectedClassName:
3558 case Type::TemplateSpecialization:
3559 case Type::DependentTemplateSpecialization:
3560 case Type::TemplateTypeParm:
3561 case Type::SubstTemplateTypeParmPack:
3562 case Type::Auto:
3563 case Type::DeducedTemplateSpecialization:
3564 case Type::PackExpansion:
3565 case Type::ExtInt:
3566 case Type::DependentExtInt:
3567 llvm_unreachable("type should never be variably-modified");
3568
3569 // These types can be variably-modified but should never need to
3570 // further decay.
3571 case Type::FunctionNoProto:
3572 case Type::FunctionProto:
3573 case Type::BlockPointer:
3574 case Type::MemberPointer:
3575 case Type::Pipe:
3576 return type;
3577
3578 // These types can be variably-modified. All these modifications
3579 // preserve structure except as noted by comments.
3580 // TODO: if we ever care about optimizing VLAs, there are no-op
3581 // optimizations available here.
3582 case Type::Pointer:
3583 result = getPointerType(getVariableArrayDecayedType(
3584 cast<PointerType>(ty)->getPointeeType()));
3585 break;
3586
3587 case Type::LValueReference: {
3588 const auto *lv = cast<LValueReferenceType>(ty);
3589 result = getLValueReferenceType(
3590 getVariableArrayDecayedType(lv->getPointeeType()),
3591 lv->isSpelledAsLValue());
3592 break;
3593 }
3594
3595 case Type::RValueReference: {
3596 const auto *lv = cast<RValueReferenceType>(ty);
3597 result = getRValueReferenceType(
3598 getVariableArrayDecayedType(lv->getPointeeType()));
3599 break;
3600 }
3601
3602 case Type::Atomic: {
3603 const auto *at = cast<AtomicType>(ty);
3604 result = getAtomicType(getVariableArrayDecayedType(at->getValueType()));
3605 break;
3606 }
3607
3608 case Type::ConstantArray: {
3609 const auto *cat = cast<ConstantArrayType>(ty);
3610 result = getConstantArrayType(
3611 getVariableArrayDecayedType(cat->getElementType()),
3612 cat->getSize(),
3613 cat->getSizeExpr(),
3614 cat->getSizeModifier(),
3615 cat->getIndexTypeCVRQualifiers());
3616 break;
3617 }
3618
3619 case Type::DependentSizedArray: {
3620 const auto *dat = cast<DependentSizedArrayType>(ty);
3621 result = getDependentSizedArrayType(
3622 getVariableArrayDecayedType(dat->getElementType()),
3623 dat->getSizeExpr(),
3624 dat->getSizeModifier(),
3625 dat->getIndexTypeCVRQualifiers(),
3626 dat->getBracketsRange());
3627 break;
3628 }
3629
3630 // Turn incomplete types into [*] types.
3631 case Type::IncompleteArray: {
3632 const auto *iat = cast<IncompleteArrayType>(ty);
3633 result = getVariableArrayType(
3634 getVariableArrayDecayedType(iat->getElementType()),
3635 /*size*/ nullptr,
3636 ArrayType::Normal,
3637 iat->getIndexTypeCVRQualifiers(),
3638 SourceRange());
3639 break;
3640 }
3641
3642 // Turn VLA types into [*] types.
3643 case Type::VariableArray: {
3644 const auto *vat = cast<VariableArrayType>(ty);
3645 result = getVariableArrayType(
3646 getVariableArrayDecayedType(vat->getElementType()),
3647 /*size*/ nullptr,
3648 ArrayType::Star,
3649 vat->getIndexTypeCVRQualifiers(),
3650 vat->getBracketsRange());
3651 break;
3652 }
3653 }
3654
3655 // Apply the top-level qualifiers from the original.
3656 return getQualifiedType(result, split.Quals);
3657 }
3658
3659 /// getVariableArrayType - Returns a non-unique reference to the type for a
3660 /// variable array of the specified element type.
getVariableArrayType(QualType EltTy,Expr * NumElts,ArrayType::ArraySizeModifier ASM,unsigned IndexTypeQuals,SourceRange Brackets) const3661 QualType ASTContext::getVariableArrayType(QualType EltTy,
3662 Expr *NumElts,
3663 ArrayType::ArraySizeModifier ASM,
3664 unsigned IndexTypeQuals,
3665 SourceRange Brackets) const {
3666 // Since we don't unique expressions, it isn't possible to unique VLA's
3667 // that have an expression provided for their size.
3668 QualType Canon;
3669
3670 // Be sure to pull qualifiers off the element type.
3671 if (!EltTy.isCanonical() || EltTy.hasLocalQualifiers()) {
3672 SplitQualType canonSplit = getCanonicalType(EltTy).split();
3673 Canon = getVariableArrayType(QualType(canonSplit.Ty, 0), NumElts, ASM,
3674 IndexTypeQuals, Brackets);
3675 Canon = getQualifiedType(Canon, canonSplit.Quals);
3676 }
3677
3678 auto *New = new (*this, TypeAlignment)
3679 VariableArrayType(EltTy, Canon, NumElts, ASM, IndexTypeQuals, Brackets);
3680
3681 VariableArrayTypes.push_back(New);
3682 Types.push_back(New);
3683 return QualType(New, 0);
3684 }
3685
3686 /// getDependentSizedArrayType - Returns a non-unique reference to
3687 /// the type for a dependently-sized array of the specified element
3688 /// type.
getDependentSizedArrayType(QualType elementType,Expr * numElements,ArrayType::ArraySizeModifier ASM,unsigned elementTypeQuals,SourceRange brackets) const3689 QualType ASTContext::getDependentSizedArrayType(QualType elementType,
3690 Expr *numElements,
3691 ArrayType::ArraySizeModifier ASM,
3692 unsigned elementTypeQuals,
3693 SourceRange brackets) const {
3694 assert((!numElements || numElements->isTypeDependent() ||
3695 numElements->isValueDependent()) &&
3696 "Size must be type- or value-dependent!");
3697
3698 // Dependently-sized array types that do not have a specified number
3699 // of elements will have their sizes deduced from a dependent
3700 // initializer. We do no canonicalization here at all, which is okay
3701 // because they can't be used in most locations.
3702 if (!numElements) {
3703 auto *newType
3704 = new (*this, TypeAlignment)
3705 DependentSizedArrayType(*this, elementType, QualType(),
3706 numElements, ASM, elementTypeQuals,
3707 brackets);
3708 Types.push_back(newType);
3709 return QualType(newType, 0);
3710 }
3711
3712 // Otherwise, we actually build a new type every time, but we
3713 // also build a canonical type.
3714
3715 SplitQualType canonElementType = getCanonicalType(elementType).split();
3716
3717 void *insertPos = nullptr;
3718 llvm::FoldingSetNodeID ID;
3719 DependentSizedArrayType::Profile(ID, *this,
3720 QualType(canonElementType.Ty, 0),
3721 ASM, elementTypeQuals, numElements);
3722
3723 // Look for an existing type with these properties.
3724 DependentSizedArrayType *canonTy =
3725 DependentSizedArrayTypes.FindNodeOrInsertPos(ID, insertPos);
3726
3727 // If we don't have one, build one.
3728 if (!canonTy) {
3729 canonTy = new (*this, TypeAlignment)
3730 DependentSizedArrayType(*this, QualType(canonElementType.Ty, 0),
3731 QualType(), numElements, ASM, elementTypeQuals,
3732 brackets);
3733 DependentSizedArrayTypes.InsertNode(canonTy, insertPos);
3734 Types.push_back(canonTy);
3735 }
3736
3737 // Apply qualifiers from the element type to the array.
3738 QualType canon = getQualifiedType(QualType(canonTy,0),
3739 canonElementType.Quals);
3740
3741 // If we didn't need extra canonicalization for the element type or the size
3742 // expression, then just use that as our result.
3743 if (QualType(canonElementType.Ty, 0) == elementType &&
3744 canonTy->getSizeExpr() == numElements)
3745 return canon;
3746
3747 // Otherwise, we need to build a type which follows the spelling
3748 // of the element type.
3749 auto *sugaredType
3750 = new (*this, TypeAlignment)
3751 DependentSizedArrayType(*this, elementType, canon, numElements,
3752 ASM, elementTypeQuals, brackets);
3753 Types.push_back(sugaredType);
3754 return QualType(sugaredType, 0);
3755 }
3756
getIncompleteArrayType(QualType elementType,ArrayType::ArraySizeModifier ASM,unsigned elementTypeQuals) const3757 QualType ASTContext::getIncompleteArrayType(QualType elementType,
3758 ArrayType::ArraySizeModifier ASM,
3759 unsigned elementTypeQuals) const {
3760 llvm::FoldingSetNodeID ID;
3761 IncompleteArrayType::Profile(ID, elementType, ASM, elementTypeQuals);
3762
3763 void *insertPos = nullptr;
3764 if (IncompleteArrayType *iat =
3765 IncompleteArrayTypes.FindNodeOrInsertPos(ID, insertPos))
3766 return QualType(iat, 0);
3767
3768 // If the element type isn't canonical, this won't be a canonical type
3769 // either, so fill in the canonical type field. We also have to pull
3770 // qualifiers off the element type.
3771 QualType canon;
3772
3773 if (!elementType.isCanonical() || elementType.hasLocalQualifiers()) {
3774 SplitQualType canonSplit = getCanonicalType(elementType).split();
3775 canon = getIncompleteArrayType(QualType(canonSplit.Ty, 0),
3776 ASM, elementTypeQuals);
3777 canon = getQualifiedType(canon, canonSplit.Quals);
3778
3779 // Get the new insert position for the node we care about.
3780 IncompleteArrayType *existing =
3781 IncompleteArrayTypes.FindNodeOrInsertPos(ID, insertPos);
3782 assert(!existing && "Shouldn't be in the map!"); (void) existing;
3783 }
3784
3785 auto *newType = new (*this, TypeAlignment)
3786 IncompleteArrayType(elementType, canon, ASM, elementTypeQuals);
3787
3788 IncompleteArrayTypes.InsertNode(newType, insertPos);
3789 Types.push_back(newType);
3790 return QualType(newType, 0);
3791 }
3792
3793 ASTContext::BuiltinVectorTypeInfo
getBuiltinVectorTypeInfo(const BuiltinType * Ty) const3794 ASTContext::getBuiltinVectorTypeInfo(const BuiltinType *Ty) const {
3795 #define SVE_INT_ELTTY(BITS, ELTS, SIGNED, NUMVECTORS) \
3796 {getIntTypeForBitwidth(BITS, SIGNED), llvm::ElementCount::getScalable(ELTS), \
3797 NUMVECTORS};
3798
3799 #define SVE_ELTTY(ELTTY, ELTS, NUMVECTORS) \
3800 {ELTTY, llvm::ElementCount::getScalable(ELTS), NUMVECTORS};
3801
3802 switch (Ty->getKind()) {
3803 default:
3804 llvm_unreachable("Unsupported builtin vector type");
3805 case BuiltinType::SveInt8:
3806 return SVE_INT_ELTTY(8, 16, true, 1);
3807 case BuiltinType::SveUint8:
3808 return SVE_INT_ELTTY(8, 16, false, 1);
3809 case BuiltinType::SveInt8x2:
3810 return SVE_INT_ELTTY(8, 16, true, 2);
3811 case BuiltinType::SveUint8x2:
3812 return SVE_INT_ELTTY(8, 16, false, 2);
3813 case BuiltinType::SveInt8x3:
3814 return SVE_INT_ELTTY(8, 16, true, 3);
3815 case BuiltinType::SveUint8x3:
3816 return SVE_INT_ELTTY(8, 16, false, 3);
3817 case BuiltinType::SveInt8x4:
3818 return SVE_INT_ELTTY(8, 16, true, 4);
3819 case BuiltinType::SveUint8x4:
3820 return SVE_INT_ELTTY(8, 16, false, 4);
3821 case BuiltinType::SveInt16:
3822 return SVE_INT_ELTTY(16, 8, true, 1);
3823 case BuiltinType::SveUint16:
3824 return SVE_INT_ELTTY(16, 8, false, 1);
3825 case BuiltinType::SveInt16x2:
3826 return SVE_INT_ELTTY(16, 8, true, 2);
3827 case BuiltinType::SveUint16x2:
3828 return SVE_INT_ELTTY(16, 8, false, 2);
3829 case BuiltinType::SveInt16x3:
3830 return SVE_INT_ELTTY(16, 8, true, 3);
3831 case BuiltinType::SveUint16x3:
3832 return SVE_INT_ELTTY(16, 8, false, 3);
3833 case BuiltinType::SveInt16x4:
3834 return SVE_INT_ELTTY(16, 8, true, 4);
3835 case BuiltinType::SveUint16x4:
3836 return SVE_INT_ELTTY(16, 8, false, 4);
3837 case BuiltinType::SveInt32:
3838 return SVE_INT_ELTTY(32, 4, true, 1);
3839 case BuiltinType::SveUint32:
3840 return SVE_INT_ELTTY(32, 4, false, 1);
3841 case BuiltinType::SveInt32x2:
3842 return SVE_INT_ELTTY(32, 4, true, 2);
3843 case BuiltinType::SveUint32x2:
3844 return SVE_INT_ELTTY(32, 4, false, 2);
3845 case BuiltinType::SveInt32x3:
3846 return SVE_INT_ELTTY(32, 4, true, 3);
3847 case BuiltinType::SveUint32x3:
3848 return SVE_INT_ELTTY(32, 4, false, 3);
3849 case BuiltinType::SveInt32x4:
3850 return SVE_INT_ELTTY(32, 4, true, 4);
3851 case BuiltinType::SveUint32x4:
3852 return SVE_INT_ELTTY(32, 4, false, 4);
3853 case BuiltinType::SveInt64:
3854 return SVE_INT_ELTTY(64, 2, true, 1);
3855 case BuiltinType::SveUint64:
3856 return SVE_INT_ELTTY(64, 2, false, 1);
3857 case BuiltinType::SveInt64x2:
3858 return SVE_INT_ELTTY(64, 2, true, 2);
3859 case BuiltinType::SveUint64x2:
3860 return SVE_INT_ELTTY(64, 2, false, 2);
3861 case BuiltinType::SveInt64x3:
3862 return SVE_INT_ELTTY(64, 2, true, 3);
3863 case BuiltinType::SveUint64x3:
3864 return SVE_INT_ELTTY(64, 2, false, 3);
3865 case BuiltinType::SveInt64x4:
3866 return SVE_INT_ELTTY(64, 2, true, 4);
3867 case BuiltinType::SveUint64x4:
3868 return SVE_INT_ELTTY(64, 2, false, 4);
3869 case BuiltinType::SveBool:
3870 return SVE_ELTTY(BoolTy, 16, 1);
3871 case BuiltinType::SveFloat16:
3872 return SVE_ELTTY(HalfTy, 8, 1);
3873 case BuiltinType::SveFloat16x2:
3874 return SVE_ELTTY(HalfTy, 8, 2);
3875 case BuiltinType::SveFloat16x3:
3876 return SVE_ELTTY(HalfTy, 8, 3);
3877 case BuiltinType::SveFloat16x4:
3878 return SVE_ELTTY(HalfTy, 8, 4);
3879 case BuiltinType::SveFloat32:
3880 return SVE_ELTTY(FloatTy, 4, 1);
3881 case BuiltinType::SveFloat32x2:
3882 return SVE_ELTTY(FloatTy, 4, 2);
3883 case BuiltinType::SveFloat32x3:
3884 return SVE_ELTTY(FloatTy, 4, 3);
3885 case BuiltinType::SveFloat32x4:
3886 return SVE_ELTTY(FloatTy, 4, 4);
3887 case BuiltinType::SveFloat64:
3888 return SVE_ELTTY(DoubleTy, 2, 1);
3889 case BuiltinType::SveFloat64x2:
3890 return SVE_ELTTY(DoubleTy, 2, 2);
3891 case BuiltinType::SveFloat64x3:
3892 return SVE_ELTTY(DoubleTy, 2, 3);
3893 case BuiltinType::SveFloat64x4:
3894 return SVE_ELTTY(DoubleTy, 2, 4);
3895 case BuiltinType::SveBFloat16:
3896 return SVE_ELTTY(BFloat16Ty, 8, 1);
3897 case BuiltinType::SveBFloat16x2:
3898 return SVE_ELTTY(BFloat16Ty, 8, 2);
3899 case BuiltinType::SveBFloat16x3:
3900 return SVE_ELTTY(BFloat16Ty, 8, 3);
3901 case BuiltinType::SveBFloat16x4:
3902 return SVE_ELTTY(BFloat16Ty, 8, 4);
3903 #define RVV_VECTOR_TYPE_INT(Name, Id, SingletonId, NumEls, ElBits, NF, \
3904 IsSigned) \
3905 case BuiltinType::Id: \
3906 return {getIntTypeForBitwidth(ElBits, IsSigned), \
3907 llvm::ElementCount::getScalable(NumEls), NF};
3908 #define RVV_VECTOR_TYPE_FLOAT(Name, Id, SingletonId, NumEls, ElBits, NF) \
3909 case BuiltinType::Id: \
3910 return {ElBits == 16 ? Float16Ty : (ElBits == 32 ? FloatTy : DoubleTy), \
3911 llvm::ElementCount::getScalable(NumEls), NF};
3912 #define RVV_PREDICATE_TYPE(Name, Id, SingletonId, NumEls) \
3913 case BuiltinType::Id: \
3914 return {BoolTy, llvm::ElementCount::getScalable(NumEls), 1};
3915 #include "clang/Basic/RISCVVTypes.def"
3916 }
3917 }
3918
3919 /// getScalableVectorType - Return the unique reference to a scalable vector
3920 /// type of the specified element type and size. VectorType must be a built-in
3921 /// type.
getScalableVectorType(QualType EltTy,unsigned NumElts) const3922 QualType ASTContext::getScalableVectorType(QualType EltTy,
3923 unsigned NumElts) const {
3924 if (Target->hasAArch64SVETypes()) {
3925 uint64_t EltTySize = getTypeSize(EltTy);
3926 #define SVE_VECTOR_TYPE(Name, MangledName, Id, SingletonId, NumEls, ElBits, \
3927 IsSigned, IsFP, IsBF) \
3928 if (!EltTy->isBooleanType() && \
3929 ((EltTy->hasIntegerRepresentation() && \
3930 EltTy->hasSignedIntegerRepresentation() == IsSigned) || \
3931 (EltTy->hasFloatingRepresentation() && !EltTy->isBFloat16Type() && \
3932 IsFP && !IsBF) || \
3933 (EltTy->hasFloatingRepresentation() && EltTy->isBFloat16Type() && \
3934 IsBF && !IsFP)) && \
3935 EltTySize == ElBits && NumElts == NumEls) { \
3936 return SingletonId; \
3937 }
3938 #define SVE_PREDICATE_TYPE(Name, MangledName, Id, SingletonId, NumEls) \
3939 if (EltTy->isBooleanType() && NumElts == NumEls) \
3940 return SingletonId;
3941 #include "clang/Basic/AArch64SVEACLETypes.def"
3942 } else if (Target->hasRISCVVTypes()) {
3943 uint64_t EltTySize = getTypeSize(EltTy);
3944 #define RVV_VECTOR_TYPE(Name, Id, SingletonId, NumEls, ElBits, NF, IsSigned, \
3945 IsFP) \
3946 if (!EltTy->isBooleanType() && \
3947 ((EltTy->hasIntegerRepresentation() && \
3948 EltTy->hasSignedIntegerRepresentation() == IsSigned) || \
3949 (EltTy->hasFloatingRepresentation() && IsFP)) && \
3950 EltTySize == ElBits && NumElts == NumEls) \
3951 return SingletonId;
3952 #define RVV_PREDICATE_TYPE(Name, Id, SingletonId, NumEls) \
3953 if (EltTy->isBooleanType() && NumElts == NumEls) \
3954 return SingletonId;
3955 #include "clang/Basic/RISCVVTypes.def"
3956 }
3957 return QualType();
3958 }
3959
3960 /// getVectorType - Return the unique reference to a vector type of
3961 /// the specified element type and size. VectorType must be a built-in type.
getVectorType(QualType vecType,unsigned NumElts,VectorType::VectorKind VecKind) const3962 QualType ASTContext::getVectorType(QualType vecType, unsigned NumElts,
3963 VectorType::VectorKind VecKind) const {
3964 assert(vecType->isBuiltinType());
3965
3966 // Check if we've already instantiated a vector of this type.
3967 llvm::FoldingSetNodeID ID;
3968 VectorType::Profile(ID, vecType, NumElts, Type::Vector, VecKind);
3969
3970 void *InsertPos = nullptr;
3971 if (VectorType *VTP = VectorTypes.FindNodeOrInsertPos(ID, InsertPos))
3972 return QualType(VTP, 0);
3973
3974 // If the element type isn't canonical, this won't be a canonical type either,
3975 // so fill in the canonical type field.
3976 QualType Canonical;
3977 if (!vecType.isCanonical()) {
3978 Canonical = getVectorType(getCanonicalType(vecType), NumElts, VecKind);
3979
3980 // Get the new insert position for the node we care about.
3981 VectorType *NewIP = VectorTypes.FindNodeOrInsertPos(ID, InsertPos);
3982 assert(!NewIP && "Shouldn't be in the map!"); (void)NewIP;
3983 }
3984 auto *New = new (*this, TypeAlignment)
3985 VectorType(vecType, NumElts, Canonical, VecKind);
3986 VectorTypes.InsertNode(New, InsertPos);
3987 Types.push_back(New);
3988 return QualType(New, 0);
3989 }
3990
3991 QualType
getDependentVectorType(QualType VecType,Expr * SizeExpr,SourceLocation AttrLoc,VectorType::VectorKind VecKind) const3992 ASTContext::getDependentVectorType(QualType VecType, Expr *SizeExpr,
3993 SourceLocation AttrLoc,
3994 VectorType::VectorKind VecKind) const {
3995 llvm::FoldingSetNodeID ID;
3996 DependentVectorType::Profile(ID, *this, getCanonicalType(VecType), SizeExpr,
3997 VecKind);
3998 void *InsertPos = nullptr;
3999 DependentVectorType *Canon =
4000 DependentVectorTypes.FindNodeOrInsertPos(ID, InsertPos);
4001 DependentVectorType *New;
4002
4003 if (Canon) {
4004 New = new (*this, TypeAlignment) DependentVectorType(
4005 *this, VecType, QualType(Canon, 0), SizeExpr, AttrLoc, VecKind);
4006 } else {
4007 QualType CanonVecTy = getCanonicalType(VecType);
4008 if (CanonVecTy == VecType) {
4009 New = new (*this, TypeAlignment) DependentVectorType(
4010 *this, VecType, QualType(), SizeExpr, AttrLoc, VecKind);
4011
4012 DependentVectorType *CanonCheck =
4013 DependentVectorTypes.FindNodeOrInsertPos(ID, InsertPos);
4014 assert(!CanonCheck &&
4015 "Dependent-sized vector_size canonical type broken");
4016 (void)CanonCheck;
4017 DependentVectorTypes.InsertNode(New, InsertPos);
4018 } else {
4019 QualType CanonTy = getDependentVectorType(CanonVecTy, SizeExpr,
4020 SourceLocation(), VecKind);
4021 New = new (*this, TypeAlignment) DependentVectorType(
4022 *this, VecType, CanonTy, SizeExpr, AttrLoc, VecKind);
4023 }
4024 }
4025
4026 Types.push_back(New);
4027 return QualType(New, 0);
4028 }
4029
4030 /// getExtVectorType - Return the unique reference to an extended vector type of
4031 /// the specified element type and size. VectorType must be a built-in type.
4032 QualType
getExtVectorType(QualType vecType,unsigned NumElts) const4033 ASTContext::getExtVectorType(QualType vecType, unsigned NumElts) const {
4034 assert(vecType->isBuiltinType() || vecType->isDependentType());
4035
4036 // Check if we've already instantiated a vector of this type.
4037 llvm::FoldingSetNodeID ID;
4038 VectorType::Profile(ID, vecType, NumElts, Type::ExtVector,
4039 VectorType::GenericVector);
4040 void *InsertPos = nullptr;
4041 if (VectorType *VTP = VectorTypes.FindNodeOrInsertPos(ID, InsertPos))
4042 return QualType(VTP, 0);
4043
4044 // If the element type isn't canonical, this won't be a canonical type either,
4045 // so fill in the canonical type field.
4046 QualType Canonical;
4047 if (!vecType.isCanonical()) {
4048 Canonical = getExtVectorType(getCanonicalType(vecType), NumElts);
4049
4050 // Get the new insert position for the node we care about.
4051 VectorType *NewIP = VectorTypes.FindNodeOrInsertPos(ID, InsertPos);
4052 assert(!NewIP && "Shouldn't be in the map!"); (void)NewIP;
4053 }
4054 auto *New = new (*this, TypeAlignment)
4055 ExtVectorType(vecType, NumElts, Canonical);
4056 VectorTypes.InsertNode(New, InsertPos);
4057 Types.push_back(New);
4058 return QualType(New, 0);
4059 }
4060
4061 QualType
getDependentSizedExtVectorType(QualType vecType,Expr * SizeExpr,SourceLocation AttrLoc) const4062 ASTContext::getDependentSizedExtVectorType(QualType vecType,
4063 Expr *SizeExpr,
4064 SourceLocation AttrLoc) const {
4065 llvm::FoldingSetNodeID ID;
4066 DependentSizedExtVectorType::Profile(ID, *this, getCanonicalType(vecType),
4067 SizeExpr);
4068
4069 void *InsertPos = nullptr;
4070 DependentSizedExtVectorType *Canon
4071 = DependentSizedExtVectorTypes.FindNodeOrInsertPos(ID, InsertPos);
4072 DependentSizedExtVectorType *New;
4073 if (Canon) {
4074 // We already have a canonical version of this array type; use it as
4075 // the canonical type for a newly-built type.
4076 New = new (*this, TypeAlignment)
4077 DependentSizedExtVectorType(*this, vecType, QualType(Canon, 0),
4078 SizeExpr, AttrLoc);
4079 } else {
4080 QualType CanonVecTy = getCanonicalType(vecType);
4081 if (CanonVecTy == vecType) {
4082 New = new (*this, TypeAlignment)
4083 DependentSizedExtVectorType(*this, vecType, QualType(), SizeExpr,
4084 AttrLoc);
4085
4086 DependentSizedExtVectorType *CanonCheck
4087 = DependentSizedExtVectorTypes.FindNodeOrInsertPos(ID, InsertPos);
4088 assert(!CanonCheck && "Dependent-sized ext_vector canonical type broken");
4089 (void)CanonCheck;
4090 DependentSizedExtVectorTypes.InsertNode(New, InsertPos);
4091 } else {
4092 QualType CanonExtTy = getDependentSizedExtVectorType(CanonVecTy, SizeExpr,
4093 SourceLocation());
4094 New = new (*this, TypeAlignment) DependentSizedExtVectorType(
4095 *this, vecType, CanonExtTy, SizeExpr, AttrLoc);
4096 }
4097 }
4098
4099 Types.push_back(New);
4100 return QualType(New, 0);
4101 }
4102
getConstantMatrixType(QualType ElementTy,unsigned NumRows,unsigned NumColumns) const4103 QualType ASTContext::getConstantMatrixType(QualType ElementTy, unsigned NumRows,
4104 unsigned NumColumns) const {
4105 llvm::FoldingSetNodeID ID;
4106 ConstantMatrixType::Profile(ID, ElementTy, NumRows, NumColumns,
4107 Type::ConstantMatrix);
4108
4109 assert(MatrixType::isValidElementType(ElementTy) &&
4110 "need a valid element type");
4111 assert(ConstantMatrixType::isDimensionValid(NumRows) &&
4112 ConstantMatrixType::isDimensionValid(NumColumns) &&
4113 "need valid matrix dimensions");
4114 void *InsertPos = nullptr;
4115 if (ConstantMatrixType *MTP = MatrixTypes.FindNodeOrInsertPos(ID, InsertPos))
4116 return QualType(MTP, 0);
4117
4118 QualType Canonical;
4119 if (!ElementTy.isCanonical()) {
4120 Canonical =
4121 getConstantMatrixType(getCanonicalType(ElementTy), NumRows, NumColumns);
4122
4123 ConstantMatrixType *NewIP = MatrixTypes.FindNodeOrInsertPos(ID, InsertPos);
4124 assert(!NewIP && "Matrix type shouldn't already exist in the map");
4125 (void)NewIP;
4126 }
4127
4128 auto *New = new (*this, TypeAlignment)
4129 ConstantMatrixType(ElementTy, NumRows, NumColumns, Canonical);
4130 MatrixTypes.InsertNode(New, InsertPos);
4131 Types.push_back(New);
4132 return QualType(New, 0);
4133 }
4134
getDependentSizedMatrixType(QualType ElementTy,Expr * RowExpr,Expr * ColumnExpr,SourceLocation AttrLoc) const4135 QualType ASTContext::getDependentSizedMatrixType(QualType ElementTy,
4136 Expr *RowExpr,
4137 Expr *ColumnExpr,
4138 SourceLocation AttrLoc) const {
4139 QualType CanonElementTy = getCanonicalType(ElementTy);
4140 llvm::FoldingSetNodeID ID;
4141 DependentSizedMatrixType::Profile(ID, *this, CanonElementTy, RowExpr,
4142 ColumnExpr);
4143
4144 void *InsertPos = nullptr;
4145 DependentSizedMatrixType *Canon =
4146 DependentSizedMatrixTypes.FindNodeOrInsertPos(ID, InsertPos);
4147
4148 if (!Canon) {
4149 Canon = new (*this, TypeAlignment) DependentSizedMatrixType(
4150 *this, CanonElementTy, QualType(), RowExpr, ColumnExpr, AttrLoc);
4151 #ifndef NDEBUG
4152 DependentSizedMatrixType *CanonCheck =
4153 DependentSizedMatrixTypes.FindNodeOrInsertPos(ID, InsertPos);
4154 assert(!CanonCheck && "Dependent-sized matrix canonical type broken");
4155 #endif
4156 DependentSizedMatrixTypes.InsertNode(Canon, InsertPos);
4157 Types.push_back(Canon);
4158 }
4159
4160 // Already have a canonical version of the matrix type
4161 //
4162 // If it exactly matches the requested type, use it directly.
4163 if (Canon->getElementType() == ElementTy && Canon->getRowExpr() == RowExpr &&
4164 Canon->getRowExpr() == ColumnExpr)
4165 return QualType(Canon, 0);
4166
4167 // Use Canon as the canonical type for newly-built type.
4168 DependentSizedMatrixType *New = new (*this, TypeAlignment)
4169 DependentSizedMatrixType(*this, ElementTy, QualType(Canon, 0), RowExpr,
4170 ColumnExpr, AttrLoc);
4171 Types.push_back(New);
4172 return QualType(New, 0);
4173 }
4174
getDependentAddressSpaceType(QualType PointeeType,Expr * AddrSpaceExpr,SourceLocation AttrLoc) const4175 QualType ASTContext::getDependentAddressSpaceType(QualType PointeeType,
4176 Expr *AddrSpaceExpr,
4177 SourceLocation AttrLoc) const {
4178 assert(AddrSpaceExpr->isInstantiationDependent());
4179
4180 QualType canonPointeeType = getCanonicalType(PointeeType);
4181
4182 void *insertPos = nullptr;
4183 llvm::FoldingSetNodeID ID;
4184 DependentAddressSpaceType::Profile(ID, *this, canonPointeeType,
4185 AddrSpaceExpr);
4186
4187 DependentAddressSpaceType *canonTy =
4188 DependentAddressSpaceTypes.FindNodeOrInsertPos(ID, insertPos);
4189
4190 if (!canonTy) {
4191 canonTy = new (*this, TypeAlignment)
4192 DependentAddressSpaceType(*this, canonPointeeType,
4193 QualType(), AddrSpaceExpr, AttrLoc);
4194 DependentAddressSpaceTypes.InsertNode(canonTy, insertPos);
4195 Types.push_back(canonTy);
4196 }
4197
4198 if (canonPointeeType == PointeeType &&
4199 canonTy->getAddrSpaceExpr() == AddrSpaceExpr)
4200 return QualType(canonTy, 0);
4201
4202 auto *sugaredType
4203 = new (*this, TypeAlignment)
4204 DependentAddressSpaceType(*this, PointeeType, QualType(canonTy, 0),
4205 AddrSpaceExpr, AttrLoc);
4206 Types.push_back(sugaredType);
4207 return QualType(sugaredType, 0);
4208 }
4209
4210 /// Determine whether \p T is canonical as the result type of a function.
isCanonicalResultType(QualType T)4211 static bool isCanonicalResultType(QualType T) {
4212 return T.isCanonical() &&
4213 (T.getObjCLifetime() == Qualifiers::OCL_None ||
4214 T.getObjCLifetime() == Qualifiers::OCL_ExplicitNone);
4215 }
4216
4217 /// getFunctionNoProtoType - Return a K&R style C function type like 'int()'.
4218 QualType
getFunctionNoProtoType(QualType ResultTy,const FunctionType::ExtInfo & Info) const4219 ASTContext::getFunctionNoProtoType(QualType ResultTy,
4220 const FunctionType::ExtInfo &Info) const {
4221 // Unique functions, to guarantee there is only one function of a particular
4222 // structure.
4223 llvm::FoldingSetNodeID ID;
4224 FunctionNoProtoType::Profile(ID, ResultTy, Info);
4225
4226 void *InsertPos = nullptr;
4227 if (FunctionNoProtoType *FT =
4228 FunctionNoProtoTypes.FindNodeOrInsertPos(ID, InsertPos))
4229 return QualType(FT, 0);
4230
4231 QualType Canonical;
4232 if (!isCanonicalResultType(ResultTy)) {
4233 Canonical =
4234 getFunctionNoProtoType(getCanonicalFunctionResultType(ResultTy), Info);
4235
4236 // Get the new insert position for the node we care about.
4237 FunctionNoProtoType *NewIP =
4238 FunctionNoProtoTypes.FindNodeOrInsertPos(ID, InsertPos);
4239 assert(!NewIP && "Shouldn't be in the map!"); (void)NewIP;
4240 }
4241
4242 auto *New = new (*this, TypeAlignment)
4243 FunctionNoProtoType(ResultTy, Canonical, Info);
4244 Types.push_back(New);
4245 FunctionNoProtoTypes.InsertNode(New, InsertPos);
4246 return QualType(New, 0);
4247 }
4248
4249 CanQualType
getCanonicalFunctionResultType(QualType ResultType) const4250 ASTContext::getCanonicalFunctionResultType(QualType ResultType) const {
4251 CanQualType CanResultType = getCanonicalType(ResultType);
4252
4253 // Canonical result types do not have ARC lifetime qualifiers.
4254 if (CanResultType.getQualifiers().hasObjCLifetime()) {
4255 Qualifiers Qs = CanResultType.getQualifiers();
4256 Qs.removeObjCLifetime();
4257 return CanQualType::CreateUnsafe(
4258 getQualifiedType(CanResultType.getUnqualifiedType(), Qs));
4259 }
4260
4261 return CanResultType;
4262 }
4263
isCanonicalExceptionSpecification(const FunctionProtoType::ExceptionSpecInfo & ESI,bool NoexceptInType)4264 static bool isCanonicalExceptionSpecification(
4265 const FunctionProtoType::ExceptionSpecInfo &ESI, bool NoexceptInType) {
4266 if (ESI.Type == EST_None)
4267 return true;
4268 if (!NoexceptInType)
4269 return false;
4270
4271 // C++17 onwards: exception specification is part of the type, as a simple
4272 // boolean "can this function type throw".
4273 if (ESI.Type == EST_BasicNoexcept)
4274 return true;
4275
4276 // A noexcept(expr) specification is (possibly) canonical if expr is
4277 // value-dependent.
4278 if (ESI.Type == EST_DependentNoexcept)
4279 return true;
4280
4281 // A dynamic exception specification is canonical if it only contains pack
4282 // expansions (so we can't tell whether it's non-throwing) and all its
4283 // contained types are canonical.
4284 if (ESI.Type == EST_Dynamic) {
4285 bool AnyPackExpansions = false;
4286 for (QualType ET : ESI.Exceptions) {
4287 if (!ET.isCanonical())
4288 return false;
4289 if (ET->getAs<PackExpansionType>())
4290 AnyPackExpansions = true;
4291 }
4292 return AnyPackExpansions;
4293 }
4294
4295 return false;
4296 }
4297
getFunctionTypeInternal(QualType ResultTy,ArrayRef<QualType> ArgArray,const FunctionProtoType::ExtProtoInfo & EPI,bool OnlyWantCanonical) const4298 QualType ASTContext::getFunctionTypeInternal(
4299 QualType ResultTy, ArrayRef<QualType> ArgArray,
4300 const FunctionProtoType::ExtProtoInfo &EPI, bool OnlyWantCanonical) const {
4301 size_t NumArgs = ArgArray.size();
4302
4303 // Unique functions, to guarantee there is only one function of a particular
4304 // structure.
4305 llvm::FoldingSetNodeID ID;
4306 FunctionProtoType::Profile(ID, ResultTy, ArgArray.begin(), NumArgs, EPI,
4307 *this, true);
4308
4309 QualType Canonical;
4310 bool Unique = false;
4311
4312 void *InsertPos = nullptr;
4313 if (FunctionProtoType *FPT =
4314 FunctionProtoTypes.FindNodeOrInsertPos(ID, InsertPos)) {
4315 QualType Existing = QualType(FPT, 0);
4316
4317 // If we find a pre-existing equivalent FunctionProtoType, we can just reuse
4318 // it so long as our exception specification doesn't contain a dependent
4319 // noexcept expression, or we're just looking for a canonical type.
4320 // Otherwise, we're going to need to create a type
4321 // sugar node to hold the concrete expression.
4322 if (OnlyWantCanonical || !isComputedNoexcept(EPI.ExceptionSpec.Type) ||
4323 EPI.ExceptionSpec.NoexceptExpr == FPT->getNoexceptExpr())
4324 return Existing;
4325
4326 // We need a new type sugar node for this one, to hold the new noexcept
4327 // expression. We do no canonicalization here, but that's OK since we don't
4328 // expect to see the same noexcept expression much more than once.
4329 Canonical = getCanonicalType(Existing);
4330 Unique = true;
4331 }
4332
4333 bool NoexceptInType = getLangOpts().CPlusPlus17;
4334 bool IsCanonicalExceptionSpec =
4335 isCanonicalExceptionSpecification(EPI.ExceptionSpec, NoexceptInType);
4336
4337 // Determine whether the type being created is already canonical or not.
4338 bool isCanonical = !Unique && IsCanonicalExceptionSpec &&
4339 isCanonicalResultType(ResultTy) && !EPI.HasTrailingReturn;
4340 for (unsigned i = 0; i != NumArgs && isCanonical; ++i)
4341 if (!ArgArray[i].isCanonicalAsParam())
4342 isCanonical = false;
4343
4344 if (OnlyWantCanonical)
4345 assert(isCanonical &&
4346 "given non-canonical parameters constructing canonical type");
4347
4348 // If this type isn't canonical, get the canonical version of it if we don't
4349 // already have it. The exception spec is only partially part of the
4350 // canonical type, and only in C++17 onwards.
4351 if (!isCanonical && Canonical.isNull()) {
4352 SmallVector<QualType, 16> CanonicalArgs;
4353 CanonicalArgs.reserve(NumArgs);
4354 for (unsigned i = 0; i != NumArgs; ++i)
4355 CanonicalArgs.push_back(getCanonicalParamType(ArgArray[i]));
4356
4357 llvm::SmallVector<QualType, 8> ExceptionTypeStorage;
4358 FunctionProtoType::ExtProtoInfo CanonicalEPI = EPI;
4359 CanonicalEPI.HasTrailingReturn = false;
4360
4361 if (IsCanonicalExceptionSpec) {
4362 // Exception spec is already OK.
4363 } else if (NoexceptInType) {
4364 switch (EPI.ExceptionSpec.Type) {
4365 case EST_Unparsed: case EST_Unevaluated: case EST_Uninstantiated:
4366 // We don't know yet. It shouldn't matter what we pick here; no-one
4367 // should ever look at this.
4368 LLVM_FALLTHROUGH;
4369 case EST_None: case EST_MSAny: case EST_NoexceptFalse:
4370 CanonicalEPI.ExceptionSpec.Type = EST_None;
4371 break;
4372
4373 // A dynamic exception specification is almost always "not noexcept",
4374 // with the exception that a pack expansion might expand to no types.
4375 case EST_Dynamic: {
4376 bool AnyPacks = false;
4377 for (QualType ET : EPI.ExceptionSpec.Exceptions) {
4378 if (ET->getAs<PackExpansionType>())
4379 AnyPacks = true;
4380 ExceptionTypeStorage.push_back(getCanonicalType(ET));
4381 }
4382 if (!AnyPacks)
4383 CanonicalEPI.ExceptionSpec.Type = EST_None;
4384 else {
4385 CanonicalEPI.ExceptionSpec.Type = EST_Dynamic;
4386 CanonicalEPI.ExceptionSpec.Exceptions = ExceptionTypeStorage;
4387 }
4388 break;
4389 }
4390
4391 case EST_DynamicNone:
4392 case EST_BasicNoexcept:
4393 case EST_NoexceptTrue:
4394 case EST_NoThrow:
4395 CanonicalEPI.ExceptionSpec.Type = EST_BasicNoexcept;
4396 break;
4397
4398 case EST_DependentNoexcept:
4399 llvm_unreachable("dependent noexcept is already canonical");
4400 }
4401 } else {
4402 CanonicalEPI.ExceptionSpec = FunctionProtoType::ExceptionSpecInfo();
4403 }
4404
4405 // Adjust the canonical function result type.
4406 CanQualType CanResultTy = getCanonicalFunctionResultType(ResultTy);
4407 Canonical =
4408 getFunctionTypeInternal(CanResultTy, CanonicalArgs, CanonicalEPI, true);
4409
4410 // Get the new insert position for the node we care about.
4411 FunctionProtoType *NewIP =
4412 FunctionProtoTypes.FindNodeOrInsertPos(ID, InsertPos);
4413 assert(!NewIP && "Shouldn't be in the map!"); (void)NewIP;
4414 }
4415
4416 // Compute the needed size to hold this FunctionProtoType and the
4417 // various trailing objects.
4418 auto ESH = FunctionProtoType::getExceptionSpecSize(
4419 EPI.ExceptionSpec.Type, EPI.ExceptionSpec.Exceptions.size());
4420 size_t Size = FunctionProtoType::totalSizeToAlloc<
4421 QualType, SourceLocation, FunctionType::FunctionTypeExtraBitfields,
4422 FunctionType::ExceptionType, Expr *, FunctionDecl *,
4423 FunctionProtoType::ExtParameterInfo, Qualifiers>(
4424 NumArgs, EPI.Variadic,
4425 FunctionProtoType::hasExtraBitfields(EPI.ExceptionSpec.Type),
4426 ESH.NumExceptionType, ESH.NumExprPtr, ESH.NumFunctionDeclPtr,
4427 EPI.ExtParameterInfos ? NumArgs : 0,
4428 EPI.TypeQuals.hasNonFastQualifiers() ? 1 : 0);
4429
4430 auto *FTP = (FunctionProtoType *)Allocate(Size, TypeAlignment);
4431 FunctionProtoType::ExtProtoInfo newEPI = EPI;
4432 new (FTP) FunctionProtoType(ResultTy, ArgArray, Canonical, newEPI);
4433 Types.push_back(FTP);
4434 if (!Unique)
4435 FunctionProtoTypes.InsertNode(FTP, InsertPos);
4436 return QualType(FTP, 0);
4437 }
4438
getPipeType(QualType T,bool ReadOnly) const4439 QualType ASTContext::getPipeType(QualType T, bool ReadOnly) const {
4440 llvm::FoldingSetNodeID ID;
4441 PipeType::Profile(ID, T, ReadOnly);
4442
4443 void *InsertPos = nullptr;
4444 if (PipeType *PT = PipeTypes.FindNodeOrInsertPos(ID, InsertPos))
4445 return QualType(PT, 0);
4446
4447 // If the pipe element type isn't canonical, this won't be a canonical type
4448 // either, so fill in the canonical type field.
4449 QualType Canonical;
4450 if (!T.isCanonical()) {
4451 Canonical = getPipeType(getCanonicalType(T), ReadOnly);
4452
4453 // Get the new insert position for the node we care about.
4454 PipeType *NewIP = PipeTypes.FindNodeOrInsertPos(ID, InsertPos);
4455 assert(!NewIP && "Shouldn't be in the map!");
4456 (void)NewIP;
4457 }
4458 auto *New = new (*this, TypeAlignment) PipeType(T, Canonical, ReadOnly);
4459 Types.push_back(New);
4460 PipeTypes.InsertNode(New, InsertPos);
4461 return QualType(New, 0);
4462 }
4463
adjustStringLiteralBaseType(QualType Ty) const4464 QualType ASTContext::adjustStringLiteralBaseType(QualType Ty) const {
4465 // OpenCL v1.1 s6.5.3: a string literal is in the constant address space.
4466 return LangOpts.OpenCL ? getAddrSpaceQualType(Ty, LangAS::opencl_constant)
4467 : Ty;
4468 }
4469
getReadPipeType(QualType T) const4470 QualType ASTContext::getReadPipeType(QualType T) const {
4471 return getPipeType(T, true);
4472 }
4473
getWritePipeType(QualType T) const4474 QualType ASTContext::getWritePipeType(QualType T) const {
4475 return getPipeType(T, false);
4476 }
4477
getExtIntType(bool IsUnsigned,unsigned NumBits) const4478 QualType ASTContext::getExtIntType(bool IsUnsigned, unsigned NumBits) const {
4479 llvm::FoldingSetNodeID ID;
4480 ExtIntType::Profile(ID, IsUnsigned, NumBits);
4481
4482 void *InsertPos = nullptr;
4483 if (ExtIntType *EIT = ExtIntTypes.FindNodeOrInsertPos(ID, InsertPos))
4484 return QualType(EIT, 0);
4485
4486 auto *New = new (*this, TypeAlignment) ExtIntType(IsUnsigned, NumBits);
4487 ExtIntTypes.InsertNode(New, InsertPos);
4488 Types.push_back(New);
4489 return QualType(New, 0);
4490 }
4491
getDependentExtIntType(bool IsUnsigned,Expr * NumBitsExpr) const4492 QualType ASTContext::getDependentExtIntType(bool IsUnsigned,
4493 Expr *NumBitsExpr) const {
4494 assert(NumBitsExpr->isInstantiationDependent() && "Only good for dependent");
4495 llvm::FoldingSetNodeID ID;
4496 DependentExtIntType::Profile(ID, *this, IsUnsigned, NumBitsExpr);
4497
4498 void *InsertPos = nullptr;
4499 if (DependentExtIntType *Existing =
4500 DependentExtIntTypes.FindNodeOrInsertPos(ID, InsertPos))
4501 return QualType(Existing, 0);
4502
4503 auto *New = new (*this, TypeAlignment)
4504 DependentExtIntType(*this, IsUnsigned, NumBitsExpr);
4505 DependentExtIntTypes.InsertNode(New, InsertPos);
4506
4507 Types.push_back(New);
4508 return QualType(New, 0);
4509 }
4510
4511 #ifndef NDEBUG
NeedsInjectedClassNameType(const RecordDecl * D)4512 static bool NeedsInjectedClassNameType(const RecordDecl *D) {
4513 if (!isa<CXXRecordDecl>(D)) return false;
4514 const auto *RD = cast<CXXRecordDecl>(D);
4515 if (isa<ClassTemplatePartialSpecializationDecl>(RD))
4516 return true;
4517 if (RD->getDescribedClassTemplate() &&
4518 !isa<ClassTemplateSpecializationDecl>(RD))
4519 return true;
4520 return false;
4521 }
4522 #endif
4523
4524 /// getInjectedClassNameType - Return the unique reference to the
4525 /// injected class name type for the specified templated declaration.
getInjectedClassNameType(CXXRecordDecl * Decl,QualType TST) const4526 QualType ASTContext::getInjectedClassNameType(CXXRecordDecl *Decl,
4527 QualType TST) const {
4528 assert(NeedsInjectedClassNameType(Decl));
4529 if (Decl->TypeForDecl) {
4530 assert(isa<InjectedClassNameType>(Decl->TypeForDecl));
4531 } else if (CXXRecordDecl *PrevDecl = Decl->getPreviousDecl()) {
4532 assert(PrevDecl->TypeForDecl && "previous declaration has no type");
4533 Decl->TypeForDecl = PrevDecl->TypeForDecl;
4534 assert(isa<InjectedClassNameType>(Decl->TypeForDecl));
4535 } else {
4536 Type *newType =
4537 new (*this, TypeAlignment) InjectedClassNameType(Decl, TST);
4538 Decl->TypeForDecl = newType;
4539 Types.push_back(newType);
4540 }
4541 return QualType(Decl->TypeForDecl, 0);
4542 }
4543
4544 /// getTypeDeclType - Return the unique reference to the type for the
4545 /// specified type declaration.
getTypeDeclTypeSlow(const TypeDecl * Decl) const4546 QualType ASTContext::getTypeDeclTypeSlow(const TypeDecl *Decl) const {
4547 assert(Decl && "Passed null for Decl param");
4548 assert(!Decl->TypeForDecl && "TypeForDecl present in slow case");
4549
4550 if (const auto *Typedef = dyn_cast<TypedefNameDecl>(Decl))
4551 return getTypedefType(Typedef);
4552
4553 assert(!isa<TemplateTypeParmDecl>(Decl) &&
4554 "Template type parameter types are always available.");
4555
4556 if (const auto *Record = dyn_cast<RecordDecl>(Decl)) {
4557 assert(Record->isFirstDecl() && "struct/union has previous declaration");
4558 assert(!NeedsInjectedClassNameType(Record));
4559 return getRecordType(Record);
4560 } else if (const auto *Enum = dyn_cast<EnumDecl>(Decl)) {
4561 assert(Enum->isFirstDecl() && "enum has previous declaration");
4562 return getEnumType(Enum);
4563 } else if (const auto *Using = dyn_cast<UnresolvedUsingTypenameDecl>(Decl)) {
4564 Type *newType = new (*this, TypeAlignment) UnresolvedUsingType(Using);
4565 Decl->TypeForDecl = newType;
4566 Types.push_back(newType);
4567 } else
4568 llvm_unreachable("TypeDecl without a type?");
4569
4570 return QualType(Decl->TypeForDecl, 0);
4571 }
4572
4573 /// getTypedefType - Return the unique reference to the type for the
4574 /// specified typedef name decl.
getTypedefType(const TypedefNameDecl * Decl,QualType Underlying) const4575 QualType ASTContext::getTypedefType(const TypedefNameDecl *Decl,
4576 QualType Underlying) const {
4577 if (Decl->TypeForDecl) return QualType(Decl->TypeForDecl, 0);
4578
4579 if (Underlying.isNull())
4580 Underlying = Decl->getUnderlyingType();
4581 QualType Canonical = getCanonicalType(Underlying);
4582 auto *newType = new (*this, TypeAlignment)
4583 TypedefType(Type::Typedef, Decl, Underlying, Canonical);
4584 Decl->TypeForDecl = newType;
4585 Types.push_back(newType);
4586 return QualType(newType, 0);
4587 }
4588
getRecordType(const RecordDecl * Decl) const4589 QualType ASTContext::getRecordType(const RecordDecl *Decl) const {
4590 if (Decl->TypeForDecl) return QualType(Decl->TypeForDecl, 0);
4591
4592 if (const RecordDecl *PrevDecl = Decl->getPreviousDecl())
4593 if (PrevDecl->TypeForDecl)
4594 return QualType(Decl->TypeForDecl = PrevDecl->TypeForDecl, 0);
4595
4596 auto *newType = new (*this, TypeAlignment) RecordType(Decl);
4597 Decl->TypeForDecl = newType;
4598 Types.push_back(newType);
4599 return QualType(newType, 0);
4600 }
4601
getEnumType(const EnumDecl * Decl) const4602 QualType ASTContext::getEnumType(const EnumDecl *Decl) const {
4603 if (Decl->TypeForDecl) return QualType(Decl->TypeForDecl, 0);
4604
4605 if (const EnumDecl *PrevDecl = Decl->getPreviousDecl())
4606 if (PrevDecl->TypeForDecl)
4607 return QualType(Decl->TypeForDecl = PrevDecl->TypeForDecl, 0);
4608
4609 auto *newType = new (*this, TypeAlignment) EnumType(Decl);
4610 Decl->TypeForDecl = newType;
4611 Types.push_back(newType);
4612 return QualType(newType, 0);
4613 }
4614
getAttributedType(attr::Kind attrKind,QualType modifiedType,QualType equivalentType)4615 QualType ASTContext::getAttributedType(attr::Kind attrKind,
4616 QualType modifiedType,
4617 QualType equivalentType) {
4618 llvm::FoldingSetNodeID id;
4619 AttributedType::Profile(id, attrKind, modifiedType, equivalentType);
4620
4621 void *insertPos = nullptr;
4622 AttributedType *type = AttributedTypes.FindNodeOrInsertPos(id, insertPos);
4623 if (type) return QualType(type, 0);
4624
4625 QualType canon = getCanonicalType(equivalentType);
4626 type = new (*this, TypeAlignment)
4627 AttributedType(canon, attrKind, modifiedType, equivalentType);
4628
4629 Types.push_back(type);
4630 AttributedTypes.InsertNode(type, insertPos);
4631
4632 return QualType(type, 0);
4633 }
4634
4635 /// Retrieve a substitution-result type.
4636 QualType
getSubstTemplateTypeParmType(const TemplateTypeParmType * Parm,QualType Replacement) const4637 ASTContext::getSubstTemplateTypeParmType(const TemplateTypeParmType *Parm,
4638 QualType Replacement) const {
4639 assert(Replacement.isCanonical()
4640 && "replacement types must always be canonical");
4641
4642 llvm::FoldingSetNodeID ID;
4643 SubstTemplateTypeParmType::Profile(ID, Parm, Replacement);
4644 void *InsertPos = nullptr;
4645 SubstTemplateTypeParmType *SubstParm
4646 = SubstTemplateTypeParmTypes.FindNodeOrInsertPos(ID, InsertPos);
4647
4648 if (!SubstParm) {
4649 SubstParm = new (*this, TypeAlignment)
4650 SubstTemplateTypeParmType(Parm, Replacement);
4651 Types.push_back(SubstParm);
4652 SubstTemplateTypeParmTypes.InsertNode(SubstParm, InsertPos);
4653 }
4654
4655 return QualType(SubstParm, 0);
4656 }
4657
4658 /// Retrieve a
getSubstTemplateTypeParmPackType(const TemplateTypeParmType * Parm,const TemplateArgument & ArgPack)4659 QualType ASTContext::getSubstTemplateTypeParmPackType(
4660 const TemplateTypeParmType *Parm,
4661 const TemplateArgument &ArgPack) {
4662 #ifndef NDEBUG
4663 for (const auto &P : ArgPack.pack_elements()) {
4664 assert(P.getKind() == TemplateArgument::Type &&"Pack contains a non-type");
4665 assert(P.getAsType().isCanonical() && "Pack contains non-canonical type");
4666 }
4667 #endif
4668
4669 llvm::FoldingSetNodeID ID;
4670 SubstTemplateTypeParmPackType::Profile(ID, Parm, ArgPack);
4671 void *InsertPos = nullptr;
4672 if (SubstTemplateTypeParmPackType *SubstParm
4673 = SubstTemplateTypeParmPackTypes.FindNodeOrInsertPos(ID, InsertPos))
4674 return QualType(SubstParm, 0);
4675
4676 QualType Canon;
4677 if (!Parm->isCanonicalUnqualified()) {
4678 Canon = getCanonicalType(QualType(Parm, 0));
4679 Canon = getSubstTemplateTypeParmPackType(cast<TemplateTypeParmType>(Canon),
4680 ArgPack);
4681 SubstTemplateTypeParmPackTypes.FindNodeOrInsertPos(ID, InsertPos);
4682 }
4683
4684 auto *SubstParm
4685 = new (*this, TypeAlignment) SubstTemplateTypeParmPackType(Parm, Canon,
4686 ArgPack);
4687 Types.push_back(SubstParm);
4688 SubstTemplateTypeParmPackTypes.InsertNode(SubstParm, InsertPos);
4689 return QualType(SubstParm, 0);
4690 }
4691
4692 /// Retrieve the template type parameter type for a template
4693 /// parameter or parameter pack with the given depth, index, and (optionally)
4694 /// name.
getTemplateTypeParmType(unsigned Depth,unsigned Index,bool ParameterPack,TemplateTypeParmDecl * TTPDecl) const4695 QualType ASTContext::getTemplateTypeParmType(unsigned Depth, unsigned Index,
4696 bool ParameterPack,
4697 TemplateTypeParmDecl *TTPDecl) const {
4698 llvm::FoldingSetNodeID ID;
4699 TemplateTypeParmType::Profile(ID, Depth, Index, ParameterPack, TTPDecl);
4700 void *InsertPos = nullptr;
4701 TemplateTypeParmType *TypeParm
4702 = TemplateTypeParmTypes.FindNodeOrInsertPos(ID, InsertPos);
4703
4704 if (TypeParm)
4705 return QualType(TypeParm, 0);
4706
4707 if (TTPDecl) {
4708 QualType Canon = getTemplateTypeParmType(Depth, Index, ParameterPack);
4709 TypeParm = new (*this, TypeAlignment) TemplateTypeParmType(TTPDecl, Canon);
4710
4711 TemplateTypeParmType *TypeCheck
4712 = TemplateTypeParmTypes.FindNodeOrInsertPos(ID, InsertPos);
4713 assert(!TypeCheck && "Template type parameter canonical type broken");
4714 (void)TypeCheck;
4715 } else
4716 TypeParm = new (*this, TypeAlignment)
4717 TemplateTypeParmType(Depth, Index, ParameterPack);
4718
4719 Types.push_back(TypeParm);
4720 TemplateTypeParmTypes.InsertNode(TypeParm, InsertPos);
4721
4722 return QualType(TypeParm, 0);
4723 }
4724
4725 TypeSourceInfo *
getTemplateSpecializationTypeInfo(TemplateName Name,SourceLocation NameLoc,const TemplateArgumentListInfo & Args,QualType Underlying) const4726 ASTContext::getTemplateSpecializationTypeInfo(TemplateName Name,
4727 SourceLocation NameLoc,
4728 const TemplateArgumentListInfo &Args,
4729 QualType Underlying) const {
4730 assert(!Name.getAsDependentTemplateName() &&
4731 "No dependent template names here!");
4732 QualType TST = getTemplateSpecializationType(Name, Args, Underlying);
4733
4734 TypeSourceInfo *DI = CreateTypeSourceInfo(TST);
4735 TemplateSpecializationTypeLoc TL =
4736 DI->getTypeLoc().castAs<TemplateSpecializationTypeLoc>();
4737 TL.setTemplateKeywordLoc(SourceLocation());
4738 TL.setTemplateNameLoc(NameLoc);
4739 TL.setLAngleLoc(Args.getLAngleLoc());
4740 TL.setRAngleLoc(Args.getRAngleLoc());
4741 for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i)
4742 TL.setArgLocInfo(i, Args[i].getLocInfo());
4743 return DI;
4744 }
4745
4746 QualType
getTemplateSpecializationType(TemplateName Template,const TemplateArgumentListInfo & Args,QualType Underlying) const4747 ASTContext::getTemplateSpecializationType(TemplateName Template,
4748 const TemplateArgumentListInfo &Args,
4749 QualType Underlying) const {
4750 assert(!Template.getAsDependentTemplateName() &&
4751 "No dependent template names here!");
4752
4753 SmallVector<TemplateArgument, 4> ArgVec;
4754 ArgVec.reserve(Args.size());
4755 for (const TemplateArgumentLoc &Arg : Args.arguments())
4756 ArgVec.push_back(Arg.getArgument());
4757
4758 return getTemplateSpecializationType(Template, ArgVec, Underlying);
4759 }
4760
4761 #ifndef NDEBUG
hasAnyPackExpansions(ArrayRef<TemplateArgument> Args)4762 static bool hasAnyPackExpansions(ArrayRef<TemplateArgument> Args) {
4763 for (const TemplateArgument &Arg : Args)
4764 if (Arg.isPackExpansion())
4765 return true;
4766
4767 return true;
4768 }
4769 #endif
4770
4771 QualType
getTemplateSpecializationType(TemplateName Template,ArrayRef<TemplateArgument> Args,QualType Underlying) const4772 ASTContext::getTemplateSpecializationType(TemplateName Template,
4773 ArrayRef<TemplateArgument> Args,
4774 QualType Underlying) const {
4775 assert(!Template.getAsDependentTemplateName() &&
4776 "No dependent template names here!");
4777 // Look through qualified template names.
4778 if (QualifiedTemplateName *QTN = Template.getAsQualifiedTemplateName())
4779 Template = TemplateName(QTN->getTemplateDecl());
4780
4781 bool IsTypeAlias =
4782 Template.getAsTemplateDecl() &&
4783 isa<TypeAliasTemplateDecl>(Template.getAsTemplateDecl());
4784 QualType CanonType;
4785 if (!Underlying.isNull())
4786 CanonType = getCanonicalType(Underlying);
4787 else {
4788 // We can get here with an alias template when the specialization contains
4789 // a pack expansion that does not match up with a parameter pack.
4790 assert((!IsTypeAlias || hasAnyPackExpansions(Args)) &&
4791 "Caller must compute aliased type");
4792 IsTypeAlias = false;
4793 CanonType = getCanonicalTemplateSpecializationType(Template, Args);
4794 }
4795
4796 // Allocate the (non-canonical) template specialization type, but don't
4797 // try to unique it: these types typically have location information that
4798 // we don't unique and don't want to lose.
4799 void *Mem = Allocate(sizeof(TemplateSpecializationType) +
4800 sizeof(TemplateArgument) * Args.size() +
4801 (IsTypeAlias? sizeof(QualType) : 0),
4802 TypeAlignment);
4803 auto *Spec
4804 = new (Mem) TemplateSpecializationType(Template, Args, CanonType,
4805 IsTypeAlias ? Underlying : QualType());
4806
4807 Types.push_back(Spec);
4808 return QualType(Spec, 0);
4809 }
4810
getCanonicalTemplateSpecializationType(TemplateName Template,ArrayRef<TemplateArgument> Args) const4811 QualType ASTContext::getCanonicalTemplateSpecializationType(
4812 TemplateName Template, ArrayRef<TemplateArgument> Args) const {
4813 assert(!Template.getAsDependentTemplateName() &&
4814 "No dependent template names here!");
4815
4816 // Look through qualified template names.
4817 if (QualifiedTemplateName *QTN = Template.getAsQualifiedTemplateName())
4818 Template = TemplateName(QTN->getTemplateDecl());
4819
4820 // Build the canonical template specialization type.
4821 TemplateName CanonTemplate = getCanonicalTemplateName(Template);
4822 SmallVector<TemplateArgument, 4> CanonArgs;
4823 unsigned NumArgs = Args.size();
4824 CanonArgs.reserve(NumArgs);
4825 for (const TemplateArgument &Arg : Args)
4826 CanonArgs.push_back(getCanonicalTemplateArgument(Arg));
4827
4828 // Determine whether this canonical template specialization type already
4829 // exists.
4830 llvm::FoldingSetNodeID ID;
4831 TemplateSpecializationType::Profile(ID, CanonTemplate,
4832 CanonArgs, *this);
4833
4834 void *InsertPos = nullptr;
4835 TemplateSpecializationType *Spec
4836 = TemplateSpecializationTypes.FindNodeOrInsertPos(ID, InsertPos);
4837
4838 if (!Spec) {
4839 // Allocate a new canonical template specialization type.
4840 void *Mem = Allocate((sizeof(TemplateSpecializationType) +
4841 sizeof(TemplateArgument) * NumArgs),
4842 TypeAlignment);
4843 Spec = new (Mem) TemplateSpecializationType(CanonTemplate,
4844 CanonArgs,
4845 QualType(), QualType());
4846 Types.push_back(Spec);
4847 TemplateSpecializationTypes.InsertNode(Spec, InsertPos);
4848 }
4849
4850 assert(Spec->isDependentType() &&
4851 "Non-dependent template-id type must have a canonical type");
4852 return QualType(Spec, 0);
4853 }
4854
getElaboratedType(ElaboratedTypeKeyword Keyword,NestedNameSpecifier * NNS,QualType NamedType,TagDecl * OwnedTagDecl) const4855 QualType ASTContext::getElaboratedType(ElaboratedTypeKeyword Keyword,
4856 NestedNameSpecifier *NNS,
4857 QualType NamedType,
4858 TagDecl *OwnedTagDecl) const {
4859 llvm::FoldingSetNodeID ID;
4860 ElaboratedType::Profile(ID, Keyword, NNS, NamedType, OwnedTagDecl);
4861
4862 void *InsertPos = nullptr;
4863 ElaboratedType *T = ElaboratedTypes.FindNodeOrInsertPos(ID, InsertPos);
4864 if (T)
4865 return QualType(T, 0);
4866
4867 QualType Canon = NamedType;
4868 if (!Canon.isCanonical()) {
4869 Canon = getCanonicalType(NamedType);
4870 ElaboratedType *CheckT = ElaboratedTypes.FindNodeOrInsertPos(ID, InsertPos);
4871 assert(!CheckT && "Elaborated canonical type broken");
4872 (void)CheckT;
4873 }
4874
4875 void *Mem = Allocate(ElaboratedType::totalSizeToAlloc<TagDecl *>(!!OwnedTagDecl),
4876 TypeAlignment);
4877 T = new (Mem) ElaboratedType(Keyword, NNS, NamedType, Canon, OwnedTagDecl);
4878
4879 Types.push_back(T);
4880 ElaboratedTypes.InsertNode(T, InsertPos);
4881 return QualType(T, 0);
4882 }
4883
4884 QualType
getParenType(QualType InnerType) const4885 ASTContext::getParenType(QualType InnerType) const {
4886 llvm::FoldingSetNodeID ID;
4887 ParenType::Profile(ID, InnerType);
4888
4889 void *InsertPos = nullptr;
4890 ParenType *T = ParenTypes.FindNodeOrInsertPos(ID, InsertPos);
4891 if (T)
4892 return QualType(T, 0);
4893
4894 QualType Canon = InnerType;
4895 if (!Canon.isCanonical()) {
4896 Canon = getCanonicalType(InnerType);
4897 ParenType *CheckT = ParenTypes.FindNodeOrInsertPos(ID, InsertPos);
4898 assert(!CheckT && "Paren canonical type broken");
4899 (void)CheckT;
4900 }
4901
4902 T = new (*this, TypeAlignment) ParenType(InnerType, Canon);
4903 Types.push_back(T);
4904 ParenTypes.InsertNode(T, InsertPos);
4905 return QualType(T, 0);
4906 }
4907
4908 QualType
getMacroQualifiedType(QualType UnderlyingTy,const IdentifierInfo * MacroII) const4909 ASTContext::getMacroQualifiedType(QualType UnderlyingTy,
4910 const IdentifierInfo *MacroII) const {
4911 QualType Canon = UnderlyingTy;
4912 if (!Canon.isCanonical())
4913 Canon = getCanonicalType(UnderlyingTy);
4914
4915 auto *newType = new (*this, TypeAlignment)
4916 MacroQualifiedType(UnderlyingTy, Canon, MacroII);
4917 Types.push_back(newType);
4918 return QualType(newType, 0);
4919 }
4920
getDependentNameType(ElaboratedTypeKeyword Keyword,NestedNameSpecifier * NNS,const IdentifierInfo * Name,QualType Canon) const4921 QualType ASTContext::getDependentNameType(ElaboratedTypeKeyword Keyword,
4922 NestedNameSpecifier *NNS,
4923 const IdentifierInfo *Name,
4924 QualType Canon) const {
4925 if (Canon.isNull()) {
4926 NestedNameSpecifier *CanonNNS = getCanonicalNestedNameSpecifier(NNS);
4927 if (CanonNNS != NNS)
4928 Canon = getDependentNameType(Keyword, CanonNNS, Name);
4929 }
4930
4931 llvm::FoldingSetNodeID ID;
4932 DependentNameType::Profile(ID, Keyword, NNS, Name);
4933
4934 void *InsertPos = nullptr;
4935 DependentNameType *T
4936 = DependentNameTypes.FindNodeOrInsertPos(ID, InsertPos);
4937 if (T)
4938 return QualType(T, 0);
4939
4940 T = new (*this, TypeAlignment) DependentNameType(Keyword, NNS, Name, Canon);
4941 Types.push_back(T);
4942 DependentNameTypes.InsertNode(T, InsertPos);
4943 return QualType(T, 0);
4944 }
4945
4946 QualType
getDependentTemplateSpecializationType(ElaboratedTypeKeyword Keyword,NestedNameSpecifier * NNS,const IdentifierInfo * Name,const TemplateArgumentListInfo & Args) const4947 ASTContext::getDependentTemplateSpecializationType(
4948 ElaboratedTypeKeyword Keyword,
4949 NestedNameSpecifier *NNS,
4950 const IdentifierInfo *Name,
4951 const TemplateArgumentListInfo &Args) const {
4952 // TODO: avoid this copy
4953 SmallVector<TemplateArgument, 16> ArgCopy;
4954 for (unsigned I = 0, E = Args.size(); I != E; ++I)
4955 ArgCopy.push_back(Args[I].getArgument());
4956 return getDependentTemplateSpecializationType(Keyword, NNS, Name, ArgCopy);
4957 }
4958
4959 QualType
getDependentTemplateSpecializationType(ElaboratedTypeKeyword Keyword,NestedNameSpecifier * NNS,const IdentifierInfo * Name,ArrayRef<TemplateArgument> Args) const4960 ASTContext::getDependentTemplateSpecializationType(
4961 ElaboratedTypeKeyword Keyword,
4962 NestedNameSpecifier *NNS,
4963 const IdentifierInfo *Name,
4964 ArrayRef<TemplateArgument> Args) const {
4965 assert((!NNS || NNS->isDependent()) &&
4966 "nested-name-specifier must be dependent");
4967
4968 llvm::FoldingSetNodeID ID;
4969 DependentTemplateSpecializationType::Profile(ID, *this, Keyword, NNS,
4970 Name, Args);
4971
4972 void *InsertPos = nullptr;
4973 DependentTemplateSpecializationType *T
4974 = DependentTemplateSpecializationTypes.FindNodeOrInsertPos(ID, InsertPos);
4975 if (T)
4976 return QualType(T, 0);
4977
4978 NestedNameSpecifier *CanonNNS = getCanonicalNestedNameSpecifier(NNS);
4979
4980 ElaboratedTypeKeyword CanonKeyword = Keyword;
4981 if (Keyword == ETK_None) CanonKeyword = ETK_Typename;
4982
4983 bool AnyNonCanonArgs = false;
4984 unsigned NumArgs = Args.size();
4985 SmallVector<TemplateArgument, 16> CanonArgs(NumArgs);
4986 for (unsigned I = 0; I != NumArgs; ++I) {
4987 CanonArgs[I] = getCanonicalTemplateArgument(Args[I]);
4988 if (!CanonArgs[I].structurallyEquals(Args[I]))
4989 AnyNonCanonArgs = true;
4990 }
4991
4992 QualType Canon;
4993 if (AnyNonCanonArgs || CanonNNS != NNS || CanonKeyword != Keyword) {
4994 Canon = getDependentTemplateSpecializationType(CanonKeyword, CanonNNS,
4995 Name,
4996 CanonArgs);
4997
4998 // Find the insert position again.
4999 DependentTemplateSpecializationTypes.FindNodeOrInsertPos(ID, InsertPos);
5000 }
5001
5002 void *Mem = Allocate((sizeof(DependentTemplateSpecializationType) +
5003 sizeof(TemplateArgument) * NumArgs),
5004 TypeAlignment);
5005 T = new (Mem) DependentTemplateSpecializationType(Keyword, NNS,
5006 Name, Args, Canon);
5007 Types.push_back(T);
5008 DependentTemplateSpecializationTypes.InsertNode(T, InsertPos);
5009 return QualType(T, 0);
5010 }
5011
getInjectedTemplateArg(NamedDecl * Param)5012 TemplateArgument ASTContext::getInjectedTemplateArg(NamedDecl *Param) {
5013 TemplateArgument Arg;
5014 if (const auto *TTP = dyn_cast<TemplateTypeParmDecl>(Param)) {
5015 QualType ArgType = getTypeDeclType(TTP);
5016 if (TTP->isParameterPack())
5017 ArgType = getPackExpansionType(ArgType, None);
5018
5019 Arg = TemplateArgument(ArgType);
5020 } else if (auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(Param)) {
5021 QualType T =
5022 NTTP->getType().getNonPackExpansionType().getNonLValueExprType(*this);
5023 // For class NTTPs, ensure we include the 'const' so the type matches that
5024 // of a real template argument.
5025 // FIXME: It would be more faithful to model this as something like an
5026 // lvalue-to-rvalue conversion applied to a const-qualified lvalue.
5027 if (T->isRecordType())
5028 T.addConst();
5029 Expr *E = new (*this) DeclRefExpr(
5030 *this, NTTP, /*enclosing*/ false, T,
5031 Expr::getValueKindForType(NTTP->getType()), NTTP->getLocation());
5032
5033 if (NTTP->isParameterPack())
5034 E = new (*this) PackExpansionExpr(DependentTy, E, NTTP->getLocation(),
5035 None);
5036 Arg = TemplateArgument(E);
5037 } else {
5038 auto *TTP = cast<TemplateTemplateParmDecl>(Param);
5039 if (TTP->isParameterPack())
5040 Arg = TemplateArgument(TemplateName(TTP), Optional<unsigned>());
5041 else
5042 Arg = TemplateArgument(TemplateName(TTP));
5043 }
5044
5045 if (Param->isTemplateParameterPack())
5046 Arg = TemplateArgument::CreatePackCopy(*this, Arg);
5047
5048 return Arg;
5049 }
5050
5051 void
getInjectedTemplateArgs(const TemplateParameterList * Params,SmallVectorImpl<TemplateArgument> & Args)5052 ASTContext::getInjectedTemplateArgs(const TemplateParameterList *Params,
5053 SmallVectorImpl<TemplateArgument> &Args) {
5054 Args.reserve(Args.size() + Params->size());
5055
5056 for (NamedDecl *Param : *Params)
5057 Args.push_back(getInjectedTemplateArg(Param));
5058 }
5059
getPackExpansionType(QualType Pattern,Optional<unsigned> NumExpansions,bool ExpectPackInType)5060 QualType ASTContext::getPackExpansionType(QualType Pattern,
5061 Optional<unsigned> NumExpansions,
5062 bool ExpectPackInType) {
5063 assert((!ExpectPackInType || Pattern->containsUnexpandedParameterPack()) &&
5064 "Pack expansions must expand one or more parameter packs");
5065
5066 llvm::FoldingSetNodeID ID;
5067 PackExpansionType::Profile(ID, Pattern, NumExpansions);
5068
5069 void *InsertPos = nullptr;
5070 PackExpansionType *T = PackExpansionTypes.FindNodeOrInsertPos(ID, InsertPos);
5071 if (T)
5072 return QualType(T, 0);
5073
5074 QualType Canon;
5075 if (!Pattern.isCanonical()) {
5076 Canon = getPackExpansionType(getCanonicalType(Pattern), NumExpansions,
5077 /*ExpectPackInType=*/false);
5078
5079 // Find the insert position again, in case we inserted an element into
5080 // PackExpansionTypes and invalidated our insert position.
5081 PackExpansionTypes.FindNodeOrInsertPos(ID, InsertPos);
5082 }
5083
5084 T = new (*this, TypeAlignment)
5085 PackExpansionType(Pattern, Canon, NumExpansions);
5086 Types.push_back(T);
5087 PackExpansionTypes.InsertNode(T, InsertPos);
5088 return QualType(T, 0);
5089 }
5090
5091 /// CmpProtocolNames - Comparison predicate for sorting protocols
5092 /// alphabetically.
CmpProtocolNames(ObjCProtocolDecl * const * LHS,ObjCProtocolDecl * const * RHS)5093 static int CmpProtocolNames(ObjCProtocolDecl *const *LHS,
5094 ObjCProtocolDecl *const *RHS) {
5095 return DeclarationName::compare((*LHS)->getDeclName(), (*RHS)->getDeclName());
5096 }
5097
areSortedAndUniqued(ArrayRef<ObjCProtocolDecl * > Protocols)5098 static bool areSortedAndUniqued(ArrayRef<ObjCProtocolDecl *> Protocols) {
5099 if (Protocols.empty()) return true;
5100
5101 if (Protocols[0]->getCanonicalDecl() != Protocols[0])
5102 return false;
5103
5104 for (unsigned i = 1; i != Protocols.size(); ++i)
5105 if (CmpProtocolNames(&Protocols[i - 1], &Protocols[i]) >= 0 ||
5106 Protocols[i]->getCanonicalDecl() != Protocols[i])
5107 return false;
5108 return true;
5109 }
5110
5111 static void
SortAndUniqueProtocols(SmallVectorImpl<ObjCProtocolDecl * > & Protocols)5112 SortAndUniqueProtocols(SmallVectorImpl<ObjCProtocolDecl *> &Protocols) {
5113 // Sort protocols, keyed by name.
5114 llvm::array_pod_sort(Protocols.begin(), Protocols.end(), CmpProtocolNames);
5115
5116 // Canonicalize.
5117 for (ObjCProtocolDecl *&P : Protocols)
5118 P = P->getCanonicalDecl();
5119
5120 // Remove duplicates.
5121 auto ProtocolsEnd = std::unique(Protocols.begin(), Protocols.end());
5122 Protocols.erase(ProtocolsEnd, Protocols.end());
5123 }
5124
getObjCObjectType(QualType BaseType,ObjCProtocolDecl * const * Protocols,unsigned NumProtocols) const5125 QualType ASTContext::getObjCObjectType(QualType BaseType,
5126 ObjCProtocolDecl * const *Protocols,
5127 unsigned NumProtocols) const {
5128 return getObjCObjectType(BaseType, {},
5129 llvm::makeArrayRef(Protocols, NumProtocols),
5130 /*isKindOf=*/false);
5131 }
5132
getObjCObjectType(QualType baseType,ArrayRef<QualType> typeArgs,ArrayRef<ObjCProtocolDecl * > protocols,bool isKindOf) const5133 QualType ASTContext::getObjCObjectType(
5134 QualType baseType,
5135 ArrayRef<QualType> typeArgs,
5136 ArrayRef<ObjCProtocolDecl *> protocols,
5137 bool isKindOf) const {
5138 // If the base type is an interface and there aren't any protocols or
5139 // type arguments to add, then the interface type will do just fine.
5140 if (typeArgs.empty() && protocols.empty() && !isKindOf &&
5141 isa<ObjCInterfaceType>(baseType))
5142 return baseType;
5143
5144 // Look in the folding set for an existing type.
5145 llvm::FoldingSetNodeID ID;
5146 ObjCObjectTypeImpl::Profile(ID, baseType, typeArgs, protocols, isKindOf);
5147 void *InsertPos = nullptr;
5148 if (ObjCObjectType *QT = ObjCObjectTypes.FindNodeOrInsertPos(ID, InsertPos))
5149 return QualType(QT, 0);
5150
5151 // Determine the type arguments to be used for canonicalization,
5152 // which may be explicitly specified here or written on the base
5153 // type.
5154 ArrayRef<QualType> effectiveTypeArgs = typeArgs;
5155 if (effectiveTypeArgs.empty()) {
5156 if (const auto *baseObject = baseType->getAs<ObjCObjectType>())
5157 effectiveTypeArgs = baseObject->getTypeArgs();
5158 }
5159
5160 // Build the canonical type, which has the canonical base type and a
5161 // sorted-and-uniqued list of protocols and the type arguments
5162 // canonicalized.
5163 QualType canonical;
5164 bool typeArgsAreCanonical = std::all_of(effectiveTypeArgs.begin(),
5165 effectiveTypeArgs.end(),
5166 [&](QualType type) {
5167 return type.isCanonical();
5168 });
5169 bool protocolsSorted = areSortedAndUniqued(protocols);
5170 if (!typeArgsAreCanonical || !protocolsSorted || !baseType.isCanonical()) {
5171 // Determine the canonical type arguments.
5172 ArrayRef<QualType> canonTypeArgs;
5173 SmallVector<QualType, 4> canonTypeArgsVec;
5174 if (!typeArgsAreCanonical) {
5175 canonTypeArgsVec.reserve(effectiveTypeArgs.size());
5176 for (auto typeArg : effectiveTypeArgs)
5177 canonTypeArgsVec.push_back(getCanonicalType(typeArg));
5178 canonTypeArgs = canonTypeArgsVec;
5179 } else {
5180 canonTypeArgs = effectiveTypeArgs;
5181 }
5182
5183 ArrayRef<ObjCProtocolDecl *> canonProtocols;
5184 SmallVector<ObjCProtocolDecl*, 8> canonProtocolsVec;
5185 if (!protocolsSorted) {
5186 canonProtocolsVec.append(protocols.begin(), protocols.end());
5187 SortAndUniqueProtocols(canonProtocolsVec);
5188 canonProtocols = canonProtocolsVec;
5189 } else {
5190 canonProtocols = protocols;
5191 }
5192
5193 canonical = getObjCObjectType(getCanonicalType(baseType), canonTypeArgs,
5194 canonProtocols, isKindOf);
5195
5196 // Regenerate InsertPos.
5197 ObjCObjectTypes.FindNodeOrInsertPos(ID, InsertPos);
5198 }
5199
5200 unsigned size = sizeof(ObjCObjectTypeImpl);
5201 size += typeArgs.size() * sizeof(QualType);
5202 size += protocols.size() * sizeof(ObjCProtocolDecl *);
5203 void *mem = Allocate(size, TypeAlignment);
5204 auto *T =
5205 new (mem) ObjCObjectTypeImpl(canonical, baseType, typeArgs, protocols,
5206 isKindOf);
5207
5208 Types.push_back(T);
5209 ObjCObjectTypes.InsertNode(T, InsertPos);
5210 return QualType(T, 0);
5211 }
5212
5213 /// Apply Objective-C protocol qualifiers to the given type.
5214 /// If this is for the canonical type of a type parameter, we can apply
5215 /// protocol qualifiers on the ObjCObjectPointerType.
5216 QualType
applyObjCProtocolQualifiers(QualType type,ArrayRef<ObjCProtocolDecl * > protocols,bool & hasError,bool allowOnPointerType) const5217 ASTContext::applyObjCProtocolQualifiers(QualType type,
5218 ArrayRef<ObjCProtocolDecl *> protocols, bool &hasError,
5219 bool allowOnPointerType) const {
5220 hasError = false;
5221
5222 if (const auto *objT = dyn_cast<ObjCTypeParamType>(type.getTypePtr())) {
5223 return getObjCTypeParamType(objT->getDecl(), protocols);
5224 }
5225
5226 // Apply protocol qualifiers to ObjCObjectPointerType.
5227 if (allowOnPointerType) {
5228 if (const auto *objPtr =
5229 dyn_cast<ObjCObjectPointerType>(type.getTypePtr())) {
5230 const ObjCObjectType *objT = objPtr->getObjectType();
5231 // Merge protocol lists and construct ObjCObjectType.
5232 SmallVector<ObjCProtocolDecl*, 8> protocolsVec;
5233 protocolsVec.append(objT->qual_begin(),
5234 objT->qual_end());
5235 protocolsVec.append(protocols.begin(), protocols.end());
5236 ArrayRef<ObjCProtocolDecl *> protocols = protocolsVec;
5237 type = getObjCObjectType(
5238 objT->getBaseType(),
5239 objT->getTypeArgsAsWritten(),
5240 protocols,
5241 objT->isKindOfTypeAsWritten());
5242 return getObjCObjectPointerType(type);
5243 }
5244 }
5245
5246 // Apply protocol qualifiers to ObjCObjectType.
5247 if (const auto *objT = dyn_cast<ObjCObjectType>(type.getTypePtr())){
5248 // FIXME: Check for protocols to which the class type is already
5249 // known to conform.
5250
5251 return getObjCObjectType(objT->getBaseType(),
5252 objT->getTypeArgsAsWritten(),
5253 protocols,
5254 objT->isKindOfTypeAsWritten());
5255 }
5256
5257 // If the canonical type is ObjCObjectType, ...
5258 if (type->isObjCObjectType()) {
5259 // Silently overwrite any existing protocol qualifiers.
5260 // TODO: determine whether that's the right thing to do.
5261
5262 // FIXME: Check for protocols to which the class type is already
5263 // known to conform.
5264 return getObjCObjectType(type, {}, protocols, false);
5265 }
5266
5267 // id<protocol-list>
5268 if (type->isObjCIdType()) {
5269 const auto *objPtr = type->castAs<ObjCObjectPointerType>();
5270 type = getObjCObjectType(ObjCBuiltinIdTy, {}, protocols,
5271 objPtr->isKindOfType());
5272 return getObjCObjectPointerType(type);
5273 }
5274
5275 // Class<protocol-list>
5276 if (type->isObjCClassType()) {
5277 const auto *objPtr = type->castAs<ObjCObjectPointerType>();
5278 type = getObjCObjectType(ObjCBuiltinClassTy, {}, protocols,
5279 objPtr->isKindOfType());
5280 return getObjCObjectPointerType(type);
5281 }
5282
5283 hasError = true;
5284 return type;
5285 }
5286
5287 QualType
getObjCTypeParamType(const ObjCTypeParamDecl * Decl,ArrayRef<ObjCProtocolDecl * > protocols) const5288 ASTContext::getObjCTypeParamType(const ObjCTypeParamDecl *Decl,
5289 ArrayRef<ObjCProtocolDecl *> protocols) const {
5290 // Look in the folding set for an existing type.
5291 llvm::FoldingSetNodeID ID;
5292 ObjCTypeParamType::Profile(ID, Decl, Decl->getUnderlyingType(), protocols);
5293 void *InsertPos = nullptr;
5294 if (ObjCTypeParamType *TypeParam =
5295 ObjCTypeParamTypes.FindNodeOrInsertPos(ID, InsertPos))
5296 return QualType(TypeParam, 0);
5297
5298 // We canonicalize to the underlying type.
5299 QualType Canonical = getCanonicalType(Decl->getUnderlyingType());
5300 if (!protocols.empty()) {
5301 // Apply the protocol qualifers.
5302 bool hasError;
5303 Canonical = getCanonicalType(applyObjCProtocolQualifiers(
5304 Canonical, protocols, hasError, true /*allowOnPointerType*/));
5305 assert(!hasError && "Error when apply protocol qualifier to bound type");
5306 }
5307
5308 unsigned size = sizeof(ObjCTypeParamType);
5309 size += protocols.size() * sizeof(ObjCProtocolDecl *);
5310 void *mem = Allocate(size, TypeAlignment);
5311 auto *newType = new (mem) ObjCTypeParamType(Decl, Canonical, protocols);
5312
5313 Types.push_back(newType);
5314 ObjCTypeParamTypes.InsertNode(newType, InsertPos);
5315 return QualType(newType, 0);
5316 }
5317
adjustObjCTypeParamBoundType(const ObjCTypeParamDecl * Orig,ObjCTypeParamDecl * New) const5318 void ASTContext::adjustObjCTypeParamBoundType(const ObjCTypeParamDecl *Orig,
5319 ObjCTypeParamDecl *New) const {
5320 New->setTypeSourceInfo(getTrivialTypeSourceInfo(Orig->getUnderlyingType()));
5321 // Update TypeForDecl after updating TypeSourceInfo.
5322 auto NewTypeParamTy = cast<ObjCTypeParamType>(New->getTypeForDecl());
5323 SmallVector<ObjCProtocolDecl *, 8> protocols;
5324 protocols.append(NewTypeParamTy->qual_begin(), NewTypeParamTy->qual_end());
5325 QualType UpdatedTy = getObjCTypeParamType(New, protocols);
5326 New->setTypeForDecl(UpdatedTy.getTypePtr());
5327 }
5328
5329 /// ObjCObjectAdoptsQTypeProtocols - Checks that protocols in IC's
5330 /// protocol list adopt all protocols in QT's qualified-id protocol
5331 /// list.
ObjCObjectAdoptsQTypeProtocols(QualType QT,ObjCInterfaceDecl * IC)5332 bool ASTContext::ObjCObjectAdoptsQTypeProtocols(QualType QT,
5333 ObjCInterfaceDecl *IC) {
5334 if (!QT->isObjCQualifiedIdType())
5335 return false;
5336
5337 if (const auto *OPT = QT->getAs<ObjCObjectPointerType>()) {
5338 // If both the right and left sides have qualifiers.
5339 for (auto *Proto : OPT->quals()) {
5340 if (!IC->ClassImplementsProtocol(Proto, false))
5341 return false;
5342 }
5343 return true;
5344 }
5345 return false;
5346 }
5347
5348 /// QIdProtocolsAdoptObjCObjectProtocols - Checks that protocols in
5349 /// QT's qualified-id protocol list adopt all protocols in IDecl's list
5350 /// of protocols.
QIdProtocolsAdoptObjCObjectProtocols(QualType QT,ObjCInterfaceDecl * IDecl)5351 bool ASTContext::QIdProtocolsAdoptObjCObjectProtocols(QualType QT,
5352 ObjCInterfaceDecl *IDecl) {
5353 if (!QT->isObjCQualifiedIdType())
5354 return false;
5355 const auto *OPT = QT->getAs<ObjCObjectPointerType>();
5356 if (!OPT)
5357 return false;
5358 if (!IDecl->hasDefinition())
5359 return false;
5360 llvm::SmallPtrSet<ObjCProtocolDecl *, 8> InheritedProtocols;
5361 CollectInheritedProtocols(IDecl, InheritedProtocols);
5362 if (InheritedProtocols.empty())
5363 return false;
5364 // Check that if every protocol in list of id<plist> conforms to a protocol
5365 // of IDecl's, then bridge casting is ok.
5366 bool Conforms = false;
5367 for (auto *Proto : OPT->quals()) {
5368 Conforms = false;
5369 for (auto *PI : InheritedProtocols) {
5370 if (ProtocolCompatibleWithProtocol(Proto, PI)) {
5371 Conforms = true;
5372 break;
5373 }
5374 }
5375 if (!Conforms)
5376 break;
5377 }
5378 if (Conforms)
5379 return true;
5380
5381 for (auto *PI : InheritedProtocols) {
5382 // If both the right and left sides have qualifiers.
5383 bool Adopts = false;
5384 for (auto *Proto : OPT->quals()) {
5385 // return 'true' if 'PI' is in the inheritance hierarchy of Proto
5386 if ((Adopts = ProtocolCompatibleWithProtocol(PI, Proto)))
5387 break;
5388 }
5389 if (!Adopts)
5390 return false;
5391 }
5392 return true;
5393 }
5394
5395 /// getObjCObjectPointerType - Return a ObjCObjectPointerType type for
5396 /// the given object type.
getObjCObjectPointerType(QualType ObjectT) const5397 QualType ASTContext::getObjCObjectPointerType(QualType ObjectT) const {
5398 llvm::FoldingSetNodeID ID;
5399 ObjCObjectPointerType::Profile(ID, ObjectT);
5400
5401 void *InsertPos = nullptr;
5402 if (ObjCObjectPointerType *QT =
5403 ObjCObjectPointerTypes.FindNodeOrInsertPos(ID, InsertPos))
5404 return QualType(QT, 0);
5405
5406 // Find the canonical object type.
5407 QualType Canonical;
5408 if (!ObjectT.isCanonical()) {
5409 Canonical = getObjCObjectPointerType(getCanonicalType(ObjectT));
5410
5411 // Regenerate InsertPos.
5412 ObjCObjectPointerTypes.FindNodeOrInsertPos(ID, InsertPos);
5413 }
5414
5415 // No match.
5416 void *Mem = Allocate(sizeof(ObjCObjectPointerType), TypeAlignment);
5417 auto *QType =
5418 new (Mem) ObjCObjectPointerType(Canonical, ObjectT);
5419
5420 Types.push_back(QType);
5421 ObjCObjectPointerTypes.InsertNode(QType, InsertPos);
5422 return QualType(QType, 0);
5423 }
5424
5425 /// getObjCInterfaceType - Return the unique reference to the type for the
5426 /// specified ObjC interface decl. The list of protocols is optional.
getObjCInterfaceType(const ObjCInterfaceDecl * Decl,ObjCInterfaceDecl * PrevDecl) const5427 QualType ASTContext::getObjCInterfaceType(const ObjCInterfaceDecl *Decl,
5428 ObjCInterfaceDecl *PrevDecl) const {
5429 if (Decl->TypeForDecl)
5430 return QualType(Decl->TypeForDecl, 0);
5431
5432 if (PrevDecl) {
5433 assert(PrevDecl->TypeForDecl && "previous decl has no TypeForDecl");
5434 Decl->TypeForDecl = PrevDecl->TypeForDecl;
5435 return QualType(PrevDecl->TypeForDecl, 0);
5436 }
5437
5438 // Prefer the definition, if there is one.
5439 if (const ObjCInterfaceDecl *Def = Decl->getDefinition())
5440 Decl = Def;
5441
5442 void *Mem = Allocate(sizeof(ObjCInterfaceType), TypeAlignment);
5443 auto *T = new (Mem) ObjCInterfaceType(Decl);
5444 Decl->TypeForDecl = T;
5445 Types.push_back(T);
5446 return QualType(T, 0);
5447 }
5448
5449 /// getTypeOfExprType - Unlike many "get<Type>" functions, we can't unique
5450 /// TypeOfExprType AST's (since expression's are never shared). For example,
5451 /// multiple declarations that refer to "typeof(x)" all contain different
5452 /// DeclRefExpr's. This doesn't effect the type checker, since it operates
5453 /// on canonical type's (which are always unique).
getTypeOfExprType(Expr * tofExpr) const5454 QualType ASTContext::getTypeOfExprType(Expr *tofExpr) const {
5455 TypeOfExprType *toe;
5456 if (tofExpr->isTypeDependent()) {
5457 llvm::FoldingSetNodeID ID;
5458 DependentTypeOfExprType::Profile(ID, *this, tofExpr);
5459
5460 void *InsertPos = nullptr;
5461 DependentTypeOfExprType *Canon
5462 = DependentTypeOfExprTypes.FindNodeOrInsertPos(ID, InsertPos);
5463 if (Canon) {
5464 // We already have a "canonical" version of an identical, dependent
5465 // typeof(expr) type. Use that as our canonical type.
5466 toe = new (*this, TypeAlignment) TypeOfExprType(tofExpr,
5467 QualType((TypeOfExprType*)Canon, 0));
5468 } else {
5469 // Build a new, canonical typeof(expr) type.
5470 Canon
5471 = new (*this, TypeAlignment) DependentTypeOfExprType(*this, tofExpr);
5472 DependentTypeOfExprTypes.InsertNode(Canon, InsertPos);
5473 toe = Canon;
5474 }
5475 } else {
5476 QualType Canonical = getCanonicalType(tofExpr->getType());
5477 toe = new (*this, TypeAlignment) TypeOfExprType(tofExpr, Canonical);
5478 }
5479 Types.push_back(toe);
5480 return QualType(toe, 0);
5481 }
5482
5483 /// getTypeOfType - Unlike many "get<Type>" functions, we don't unique
5484 /// TypeOfType nodes. The only motivation to unique these nodes would be
5485 /// memory savings. Since typeof(t) is fairly uncommon, space shouldn't be
5486 /// an issue. This doesn't affect the type checker, since it operates
5487 /// on canonical types (which are always unique).
getTypeOfType(QualType tofType) const5488 QualType ASTContext::getTypeOfType(QualType tofType) const {
5489 QualType Canonical = getCanonicalType(tofType);
5490 auto *tot = new (*this, TypeAlignment) TypeOfType(tofType, Canonical);
5491 Types.push_back(tot);
5492 return QualType(tot, 0);
5493 }
5494
5495 /// getReferenceQualifiedType - Given an expr, will return the type for
5496 /// that expression, as in [dcl.type.simple]p4 but without taking id-expressions
5497 /// and class member access into account.
getReferenceQualifiedType(const Expr * E) const5498 QualType ASTContext::getReferenceQualifiedType(const Expr *E) const {
5499 // C++11 [dcl.type.simple]p4:
5500 // [...]
5501 QualType T = E->getType();
5502 switch (E->getValueKind()) {
5503 // - otherwise, if e is an xvalue, decltype(e) is T&&, where T is the
5504 // type of e;
5505 case VK_XValue:
5506 return getRValueReferenceType(T);
5507 // - otherwise, if e is an lvalue, decltype(e) is T&, where T is the
5508 // type of e;
5509 case VK_LValue:
5510 return getLValueReferenceType(T);
5511 // - otherwise, decltype(e) is the type of e.
5512 case VK_PRValue:
5513 return T;
5514 }
5515 llvm_unreachable("Unknown value kind");
5516 }
5517
5518 /// Unlike many "get<Type>" functions, we don't unique DecltypeType
5519 /// nodes. This would never be helpful, since each such type has its own
5520 /// expression, and would not give a significant memory saving, since there
5521 /// is an Expr tree under each such type.
getDecltypeType(Expr * e,QualType UnderlyingType) const5522 QualType ASTContext::getDecltypeType(Expr *e, QualType UnderlyingType) const {
5523 DecltypeType *dt;
5524
5525 // C++11 [temp.type]p2:
5526 // If an expression e involves a template parameter, decltype(e) denotes a
5527 // unique dependent type. Two such decltype-specifiers refer to the same
5528 // type only if their expressions are equivalent (14.5.6.1).
5529 if (e->isInstantiationDependent()) {
5530 llvm::FoldingSetNodeID ID;
5531 DependentDecltypeType::Profile(ID, *this, e);
5532
5533 void *InsertPos = nullptr;
5534 DependentDecltypeType *Canon
5535 = DependentDecltypeTypes.FindNodeOrInsertPos(ID, InsertPos);
5536 if (!Canon) {
5537 // Build a new, canonical decltype(expr) type.
5538 Canon = new (*this, TypeAlignment) DependentDecltypeType(*this, e);
5539 DependentDecltypeTypes.InsertNode(Canon, InsertPos);
5540 }
5541 dt = new (*this, TypeAlignment)
5542 DecltypeType(e, UnderlyingType, QualType((DecltypeType *)Canon, 0));
5543 } else {
5544 dt = new (*this, TypeAlignment)
5545 DecltypeType(e, UnderlyingType, getCanonicalType(UnderlyingType));
5546 }
5547 Types.push_back(dt);
5548 return QualType(dt, 0);
5549 }
5550
5551 /// getUnaryTransformationType - We don't unique these, since the memory
5552 /// savings are minimal and these are rare.
getUnaryTransformType(QualType BaseType,QualType UnderlyingType,UnaryTransformType::UTTKind Kind) const5553 QualType ASTContext::getUnaryTransformType(QualType BaseType,
5554 QualType UnderlyingType,
5555 UnaryTransformType::UTTKind Kind)
5556 const {
5557 UnaryTransformType *ut = nullptr;
5558
5559 if (BaseType->isDependentType()) {
5560 // Look in the folding set for an existing type.
5561 llvm::FoldingSetNodeID ID;
5562 DependentUnaryTransformType::Profile(ID, getCanonicalType(BaseType), Kind);
5563
5564 void *InsertPos = nullptr;
5565 DependentUnaryTransformType *Canon
5566 = DependentUnaryTransformTypes.FindNodeOrInsertPos(ID, InsertPos);
5567
5568 if (!Canon) {
5569 // Build a new, canonical __underlying_type(type) type.
5570 Canon = new (*this, TypeAlignment)
5571 DependentUnaryTransformType(*this, getCanonicalType(BaseType),
5572 Kind);
5573 DependentUnaryTransformTypes.InsertNode(Canon, InsertPos);
5574 }
5575 ut = new (*this, TypeAlignment) UnaryTransformType (BaseType,
5576 QualType(), Kind,
5577 QualType(Canon, 0));
5578 } else {
5579 QualType CanonType = getCanonicalType(UnderlyingType);
5580 ut = new (*this, TypeAlignment) UnaryTransformType (BaseType,
5581 UnderlyingType, Kind,
5582 CanonType);
5583 }
5584 Types.push_back(ut);
5585 return QualType(ut, 0);
5586 }
5587
5588 /// getAutoType - Return the uniqued reference to the 'auto' type which has been
5589 /// deduced to the given type, or to the canonical undeduced 'auto' type, or the
5590 /// canonical deduced-but-dependent 'auto' type.
5591 QualType
getAutoType(QualType DeducedType,AutoTypeKeyword Keyword,bool IsDependent,bool IsPack,ConceptDecl * TypeConstraintConcept,ArrayRef<TemplateArgument> TypeConstraintArgs) const5592 ASTContext::getAutoType(QualType DeducedType, AutoTypeKeyword Keyword,
5593 bool IsDependent, bool IsPack,
5594 ConceptDecl *TypeConstraintConcept,
5595 ArrayRef<TemplateArgument> TypeConstraintArgs) const {
5596 assert((!IsPack || IsDependent) && "only use IsPack for a dependent pack");
5597 if (DeducedType.isNull() && Keyword == AutoTypeKeyword::Auto &&
5598 !TypeConstraintConcept && !IsDependent)
5599 return getAutoDeductType();
5600
5601 // Look in the folding set for an existing type.
5602 void *InsertPos = nullptr;
5603 llvm::FoldingSetNodeID ID;
5604 AutoType::Profile(ID, *this, DeducedType, Keyword, IsDependent,
5605 TypeConstraintConcept, TypeConstraintArgs);
5606 if (AutoType *AT = AutoTypes.FindNodeOrInsertPos(ID, InsertPos))
5607 return QualType(AT, 0);
5608
5609 void *Mem = Allocate(sizeof(AutoType) +
5610 sizeof(TemplateArgument) * TypeConstraintArgs.size(),
5611 TypeAlignment);
5612 auto *AT = new (Mem) AutoType(
5613 DeducedType, Keyword,
5614 (IsDependent ? TypeDependence::DependentInstantiation
5615 : TypeDependence::None) |
5616 (IsPack ? TypeDependence::UnexpandedPack : TypeDependence::None),
5617 TypeConstraintConcept, TypeConstraintArgs);
5618 Types.push_back(AT);
5619 if (InsertPos)
5620 AutoTypes.InsertNode(AT, InsertPos);
5621 return QualType(AT, 0);
5622 }
5623
5624 /// Return the uniqued reference to the deduced template specialization type
5625 /// which has been deduced to the given type, or to the canonical undeduced
5626 /// such type, or the canonical deduced-but-dependent such type.
getDeducedTemplateSpecializationType(TemplateName Template,QualType DeducedType,bool IsDependent) const5627 QualType ASTContext::getDeducedTemplateSpecializationType(
5628 TemplateName Template, QualType DeducedType, bool IsDependent) const {
5629 // Look in the folding set for an existing type.
5630 void *InsertPos = nullptr;
5631 llvm::FoldingSetNodeID ID;
5632 DeducedTemplateSpecializationType::Profile(ID, Template, DeducedType,
5633 IsDependent);
5634 if (DeducedTemplateSpecializationType *DTST =
5635 DeducedTemplateSpecializationTypes.FindNodeOrInsertPos(ID, InsertPos))
5636 return QualType(DTST, 0);
5637
5638 auto *DTST = new (*this, TypeAlignment)
5639 DeducedTemplateSpecializationType(Template, DeducedType, IsDependent);
5640 Types.push_back(DTST);
5641 if (InsertPos)
5642 DeducedTemplateSpecializationTypes.InsertNode(DTST, InsertPos);
5643 return QualType(DTST, 0);
5644 }
5645
5646 /// getAtomicType - Return the uniqued reference to the atomic type for
5647 /// the given value type.
getAtomicType(QualType T) const5648 QualType ASTContext::getAtomicType(QualType T) const {
5649 // Unique pointers, to guarantee there is only one pointer of a particular
5650 // structure.
5651 llvm::FoldingSetNodeID ID;
5652 AtomicType::Profile(ID, T);
5653
5654 void *InsertPos = nullptr;
5655 if (AtomicType *AT = AtomicTypes.FindNodeOrInsertPos(ID, InsertPos))
5656 return QualType(AT, 0);
5657
5658 // If the atomic value type isn't canonical, this won't be a canonical type
5659 // either, so fill in the canonical type field.
5660 QualType Canonical;
5661 if (!T.isCanonical()) {
5662 Canonical = getAtomicType(getCanonicalType(T));
5663
5664 // Get the new insert position for the node we care about.
5665 AtomicType *NewIP = AtomicTypes.FindNodeOrInsertPos(ID, InsertPos);
5666 assert(!NewIP && "Shouldn't be in the map!"); (void)NewIP;
5667 }
5668 auto *New = new (*this, TypeAlignment) AtomicType(T, Canonical);
5669 Types.push_back(New);
5670 AtomicTypes.InsertNode(New, InsertPos);
5671 return QualType(New, 0);
5672 }
5673
5674 /// getAutoDeductType - Get type pattern for deducing against 'auto'.
getAutoDeductType() const5675 QualType ASTContext::getAutoDeductType() const {
5676 if (AutoDeductTy.isNull())
5677 AutoDeductTy = QualType(new (*this, TypeAlignment)
5678 AutoType(QualType(), AutoTypeKeyword::Auto,
5679 TypeDependence::None,
5680 /*concept*/ nullptr, /*args*/ {}),
5681 0);
5682 return AutoDeductTy;
5683 }
5684
5685 /// getAutoRRefDeductType - Get type pattern for deducing against 'auto &&'.
getAutoRRefDeductType() const5686 QualType ASTContext::getAutoRRefDeductType() const {
5687 if (AutoRRefDeductTy.isNull())
5688 AutoRRefDeductTy = getRValueReferenceType(getAutoDeductType());
5689 assert(!AutoRRefDeductTy.isNull() && "can't build 'auto &&' pattern");
5690 return AutoRRefDeductTy;
5691 }
5692
5693 /// getTagDeclType - Return the unique reference to the type for the
5694 /// specified TagDecl (struct/union/class/enum) decl.
getTagDeclType(const TagDecl * Decl) const5695 QualType ASTContext::getTagDeclType(const TagDecl *Decl) const {
5696 assert(Decl);
5697 // FIXME: What is the design on getTagDeclType when it requires casting
5698 // away const? mutable?
5699 return getTypeDeclType(const_cast<TagDecl*>(Decl));
5700 }
5701
5702 /// getSizeType - Return the unique type for "size_t" (C99 7.17), the result
5703 /// of the sizeof operator (C99 6.5.3.4p4). The value is target dependent and
5704 /// needs to agree with the definition in <stddef.h>.
getSizeType() const5705 CanQualType ASTContext::getSizeType() const {
5706 return getFromTargetType(Target->getSizeType());
5707 }
5708
5709 /// Return the unique signed counterpart of the integer type
5710 /// corresponding to size_t.
getSignedSizeType() const5711 CanQualType ASTContext::getSignedSizeType() const {
5712 return getFromTargetType(Target->getSignedSizeType());
5713 }
5714
5715 /// getIntMaxType - Return the unique type for "intmax_t" (C99 7.18.1.5).
getIntMaxType() const5716 CanQualType ASTContext::getIntMaxType() const {
5717 return getFromTargetType(Target->getIntMaxType());
5718 }
5719
5720 /// getUIntMaxType - Return the unique type for "uintmax_t" (C99 7.18.1.5).
getUIntMaxType() const5721 CanQualType ASTContext::getUIntMaxType() const {
5722 return getFromTargetType(Target->getUIntMaxType());
5723 }
5724
5725 /// getSignedWCharType - Return the type of "signed wchar_t".
5726 /// Used when in C++, as a GCC extension.
getSignedWCharType() const5727 QualType ASTContext::getSignedWCharType() const {
5728 // FIXME: derive from "Target" ?
5729 return WCharTy;
5730 }
5731
5732 /// getUnsignedWCharType - Return the type of "unsigned wchar_t".
5733 /// Used when in C++, as a GCC extension.
getUnsignedWCharType() const5734 QualType ASTContext::getUnsignedWCharType() const {
5735 // FIXME: derive from "Target" ?
5736 return UnsignedIntTy;
5737 }
5738
getIntPtrType() const5739 QualType ASTContext::getIntPtrType() const {
5740 return getFromTargetType(Target->getIntPtrType());
5741 }
5742
getUIntPtrType() const5743 QualType ASTContext::getUIntPtrType() const {
5744 return getCorrespondingUnsignedType(getIntPtrType());
5745 }
5746
5747 /// getPointerDiffType - Return the unique type for "ptrdiff_t" (C99 7.17)
5748 /// defined in <stddef.h>. Pointer - pointer requires this (C99 6.5.6p9).
getPointerDiffType() const5749 QualType ASTContext::getPointerDiffType() const {
5750 return getFromTargetType(Target->getPtrDiffType(0));
5751 }
5752
5753 /// Return the unique unsigned counterpart of "ptrdiff_t"
5754 /// integer type. The standard (C11 7.21.6.1p7) refers to this type
5755 /// in the definition of %tu format specifier.
getUnsignedPointerDiffType() const5756 QualType ASTContext::getUnsignedPointerDiffType() const {
5757 return getFromTargetType(Target->getUnsignedPtrDiffType(0));
5758 }
5759
5760 /// Return the unique type for "pid_t" defined in
5761 /// <sys/types.h>. We need this to compute the correct type for vfork().
getProcessIDType() const5762 QualType ASTContext::getProcessIDType() const {
5763 return getFromTargetType(Target->getProcessIDType());
5764 }
5765
5766 //===----------------------------------------------------------------------===//
5767 // Type Operators
5768 //===----------------------------------------------------------------------===//
5769
getCanonicalParamType(QualType T) const5770 CanQualType ASTContext::getCanonicalParamType(QualType T) const {
5771 // Push qualifiers into arrays, and then discard any remaining
5772 // qualifiers.
5773 T = getCanonicalType(T);
5774 T = getVariableArrayDecayedType(T);
5775 const Type *Ty = T.getTypePtr();
5776 QualType Result;
5777 if (isa<ArrayType>(Ty)) {
5778 Result = getArrayDecayedType(QualType(Ty,0));
5779 } else if (isa<FunctionType>(Ty)) {
5780 Result = getPointerType(QualType(Ty, 0));
5781 } else {
5782 Result = QualType(Ty, 0);
5783 }
5784
5785 return CanQualType::CreateUnsafe(Result);
5786 }
5787
getUnqualifiedArrayType(QualType type,Qualifiers & quals)5788 QualType ASTContext::getUnqualifiedArrayType(QualType type,
5789 Qualifiers &quals) {
5790 SplitQualType splitType = type.getSplitUnqualifiedType();
5791
5792 // FIXME: getSplitUnqualifiedType() actually walks all the way to
5793 // the unqualified desugared type and then drops it on the floor.
5794 // We then have to strip that sugar back off with
5795 // getUnqualifiedDesugaredType(), which is silly.
5796 const auto *AT =
5797 dyn_cast<ArrayType>(splitType.Ty->getUnqualifiedDesugaredType());
5798
5799 // If we don't have an array, just use the results in splitType.
5800 if (!AT) {
5801 quals = splitType.Quals;
5802 return QualType(splitType.Ty, 0);
5803 }
5804
5805 // Otherwise, recurse on the array's element type.
5806 QualType elementType = AT->getElementType();
5807 QualType unqualElementType = getUnqualifiedArrayType(elementType, quals);
5808
5809 // If that didn't change the element type, AT has no qualifiers, so we
5810 // can just use the results in splitType.
5811 if (elementType == unqualElementType) {
5812 assert(quals.empty()); // from the recursive call
5813 quals = splitType.Quals;
5814 return QualType(splitType.Ty, 0);
5815 }
5816
5817 // Otherwise, add in the qualifiers from the outermost type, then
5818 // build the type back up.
5819 quals.addConsistentQualifiers(splitType.Quals);
5820
5821 if (const auto *CAT = dyn_cast<ConstantArrayType>(AT)) {
5822 return getConstantArrayType(unqualElementType, CAT->getSize(),
5823 CAT->getSizeExpr(), CAT->getSizeModifier(), 0);
5824 }
5825
5826 if (const auto *IAT = dyn_cast<IncompleteArrayType>(AT)) {
5827 return getIncompleteArrayType(unqualElementType, IAT->getSizeModifier(), 0);
5828 }
5829
5830 if (const auto *VAT = dyn_cast<VariableArrayType>(AT)) {
5831 return getVariableArrayType(unqualElementType,
5832 VAT->getSizeExpr(),
5833 VAT->getSizeModifier(),
5834 VAT->getIndexTypeCVRQualifiers(),
5835 VAT->getBracketsRange());
5836 }
5837
5838 const auto *DSAT = cast<DependentSizedArrayType>(AT);
5839 return getDependentSizedArrayType(unqualElementType, DSAT->getSizeExpr(),
5840 DSAT->getSizeModifier(), 0,
5841 SourceRange());
5842 }
5843
5844 /// Attempt to unwrap two types that may both be array types with the same bound
5845 /// (or both be array types of unknown bound) for the purpose of comparing the
5846 /// cv-decomposition of two types per C++ [conv.qual].
5847 ///
5848 /// \param AllowPiMismatch Allow the Pi1 and Pi2 to differ as described in
5849 /// C++20 [conv.qual], if permitted by the current language mode.
UnwrapSimilarArrayTypes(QualType & T1,QualType & T2,bool AllowPiMismatch)5850 void ASTContext::UnwrapSimilarArrayTypes(QualType &T1, QualType &T2,
5851 bool AllowPiMismatch) {
5852 while (true) {
5853 auto *AT1 = getAsArrayType(T1);
5854 if (!AT1)
5855 return;
5856
5857 auto *AT2 = getAsArrayType(T2);
5858 if (!AT2)
5859 return;
5860
5861 // If we don't have two array types with the same constant bound nor two
5862 // incomplete array types, we've unwrapped everything we can.
5863 // C++20 also permits one type to be a constant array type and the other
5864 // to be an incomplete array type.
5865 // FIXME: Consider also unwrapping array of unknown bound and VLA.
5866 if (auto *CAT1 = dyn_cast<ConstantArrayType>(AT1)) {
5867 auto *CAT2 = dyn_cast<ConstantArrayType>(AT2);
5868 if (!((CAT2 && CAT1->getSize() == CAT2->getSize()) ||
5869 (AllowPiMismatch && getLangOpts().CPlusPlus20 &&
5870 isa<IncompleteArrayType>(AT2))))
5871 return;
5872 } else if (isa<IncompleteArrayType>(AT1)) {
5873 if (!(isa<IncompleteArrayType>(AT2) ||
5874 (AllowPiMismatch && getLangOpts().CPlusPlus20 &&
5875 isa<ConstantArrayType>(AT2))))
5876 return;
5877 } else {
5878 return;
5879 }
5880
5881 T1 = AT1->getElementType();
5882 T2 = AT2->getElementType();
5883 }
5884 }
5885
5886 /// Attempt to unwrap two types that may be similar (C++ [conv.qual]).
5887 ///
5888 /// If T1 and T2 are both pointer types of the same kind, or both array types
5889 /// with the same bound, unwraps layers from T1 and T2 until a pointer type is
5890 /// unwrapped. Top-level qualifiers on T1 and T2 are ignored.
5891 ///
5892 /// This function will typically be called in a loop that successively
5893 /// "unwraps" pointer and pointer-to-member types to compare them at each
5894 /// level.
5895 ///
5896 /// \param AllowPiMismatch Allow the Pi1 and Pi2 to differ as described in
5897 /// C++20 [conv.qual], if permitted by the current language mode.
5898 ///
5899 /// \return \c true if a pointer type was unwrapped, \c false if we reached a
5900 /// pair of types that can't be unwrapped further.
UnwrapSimilarTypes(QualType & T1,QualType & T2,bool AllowPiMismatch)5901 bool ASTContext::UnwrapSimilarTypes(QualType &T1, QualType &T2,
5902 bool AllowPiMismatch) {
5903 UnwrapSimilarArrayTypes(T1, T2, AllowPiMismatch);
5904
5905 const auto *T1PtrType = T1->getAs<PointerType>();
5906 const auto *T2PtrType = T2->getAs<PointerType>();
5907 if (T1PtrType && T2PtrType) {
5908 T1 = T1PtrType->getPointeeType();
5909 T2 = T2PtrType->getPointeeType();
5910 return true;
5911 }
5912
5913 const auto *T1MPType = T1->getAs<MemberPointerType>();
5914 const auto *T2MPType = T2->getAs<MemberPointerType>();
5915 if (T1MPType && T2MPType &&
5916 hasSameUnqualifiedType(QualType(T1MPType->getClass(), 0),
5917 QualType(T2MPType->getClass(), 0))) {
5918 T1 = T1MPType->getPointeeType();
5919 T2 = T2MPType->getPointeeType();
5920 return true;
5921 }
5922
5923 if (getLangOpts().ObjC) {
5924 const auto *T1OPType = T1->getAs<ObjCObjectPointerType>();
5925 const auto *T2OPType = T2->getAs<ObjCObjectPointerType>();
5926 if (T1OPType && T2OPType) {
5927 T1 = T1OPType->getPointeeType();
5928 T2 = T2OPType->getPointeeType();
5929 return true;
5930 }
5931 }
5932
5933 // FIXME: Block pointers, too?
5934
5935 return false;
5936 }
5937
hasSimilarType(QualType T1,QualType T2)5938 bool ASTContext::hasSimilarType(QualType T1, QualType T2) {
5939 while (true) {
5940 Qualifiers Quals;
5941 T1 = getUnqualifiedArrayType(T1, Quals);
5942 T2 = getUnqualifiedArrayType(T2, Quals);
5943 if (hasSameType(T1, T2))
5944 return true;
5945 if (!UnwrapSimilarTypes(T1, T2))
5946 return false;
5947 }
5948 }
5949
hasCvrSimilarType(QualType T1,QualType T2)5950 bool ASTContext::hasCvrSimilarType(QualType T1, QualType T2) {
5951 while (true) {
5952 Qualifiers Quals1, Quals2;
5953 T1 = getUnqualifiedArrayType(T1, Quals1);
5954 T2 = getUnqualifiedArrayType(T2, Quals2);
5955
5956 Quals1.removeCVRQualifiers();
5957 Quals2.removeCVRQualifiers();
5958 if (Quals1 != Quals2)
5959 return false;
5960
5961 if (hasSameType(T1, T2))
5962 return true;
5963
5964 if (!UnwrapSimilarTypes(T1, T2, /*AllowPiMismatch*/ false))
5965 return false;
5966 }
5967 }
5968
5969 DeclarationNameInfo
getNameForTemplate(TemplateName Name,SourceLocation NameLoc) const5970 ASTContext::getNameForTemplate(TemplateName Name,
5971 SourceLocation NameLoc) const {
5972 switch (Name.getKind()) {
5973 case TemplateName::QualifiedTemplate:
5974 case TemplateName::Template:
5975 // DNInfo work in progress: CHECKME: what about DNLoc?
5976 return DeclarationNameInfo(Name.getAsTemplateDecl()->getDeclName(),
5977 NameLoc);
5978
5979 case TemplateName::OverloadedTemplate: {
5980 OverloadedTemplateStorage *Storage = Name.getAsOverloadedTemplate();
5981 // DNInfo work in progress: CHECKME: what about DNLoc?
5982 return DeclarationNameInfo((*Storage->begin())->getDeclName(), NameLoc);
5983 }
5984
5985 case TemplateName::AssumedTemplate: {
5986 AssumedTemplateStorage *Storage = Name.getAsAssumedTemplateName();
5987 return DeclarationNameInfo(Storage->getDeclName(), NameLoc);
5988 }
5989
5990 case TemplateName::DependentTemplate: {
5991 DependentTemplateName *DTN = Name.getAsDependentTemplateName();
5992 DeclarationName DName;
5993 if (DTN->isIdentifier()) {
5994 DName = DeclarationNames.getIdentifier(DTN->getIdentifier());
5995 return DeclarationNameInfo(DName, NameLoc);
5996 } else {
5997 DName = DeclarationNames.getCXXOperatorName(DTN->getOperator());
5998 // DNInfo work in progress: FIXME: source locations?
5999 DeclarationNameLoc DNLoc =
6000 DeclarationNameLoc::makeCXXOperatorNameLoc(SourceRange());
6001 return DeclarationNameInfo(DName, NameLoc, DNLoc);
6002 }
6003 }
6004
6005 case TemplateName::SubstTemplateTemplateParm: {
6006 SubstTemplateTemplateParmStorage *subst
6007 = Name.getAsSubstTemplateTemplateParm();
6008 return DeclarationNameInfo(subst->getParameter()->getDeclName(),
6009 NameLoc);
6010 }
6011
6012 case TemplateName::SubstTemplateTemplateParmPack: {
6013 SubstTemplateTemplateParmPackStorage *subst
6014 = Name.getAsSubstTemplateTemplateParmPack();
6015 return DeclarationNameInfo(subst->getParameterPack()->getDeclName(),
6016 NameLoc);
6017 }
6018 }
6019
6020 llvm_unreachable("bad template name kind!");
6021 }
6022
getCanonicalTemplateName(TemplateName Name) const6023 TemplateName ASTContext::getCanonicalTemplateName(TemplateName Name) const {
6024 switch (Name.getKind()) {
6025 case TemplateName::QualifiedTemplate:
6026 case TemplateName::Template: {
6027 TemplateDecl *Template = Name.getAsTemplateDecl();
6028 if (auto *TTP = dyn_cast<TemplateTemplateParmDecl>(Template))
6029 Template = getCanonicalTemplateTemplateParmDecl(TTP);
6030
6031 // The canonical template name is the canonical template declaration.
6032 return TemplateName(cast<TemplateDecl>(Template->getCanonicalDecl()));
6033 }
6034
6035 case TemplateName::OverloadedTemplate:
6036 case TemplateName::AssumedTemplate:
6037 llvm_unreachable("cannot canonicalize unresolved template");
6038
6039 case TemplateName::DependentTemplate: {
6040 DependentTemplateName *DTN = Name.getAsDependentTemplateName();
6041 assert(DTN && "Non-dependent template names must refer to template decls.");
6042 return DTN->CanonicalTemplateName;
6043 }
6044
6045 case TemplateName::SubstTemplateTemplateParm: {
6046 SubstTemplateTemplateParmStorage *subst
6047 = Name.getAsSubstTemplateTemplateParm();
6048 return getCanonicalTemplateName(subst->getReplacement());
6049 }
6050
6051 case TemplateName::SubstTemplateTemplateParmPack: {
6052 SubstTemplateTemplateParmPackStorage *subst
6053 = Name.getAsSubstTemplateTemplateParmPack();
6054 TemplateTemplateParmDecl *canonParameter
6055 = getCanonicalTemplateTemplateParmDecl(subst->getParameterPack());
6056 TemplateArgument canonArgPack
6057 = getCanonicalTemplateArgument(subst->getArgumentPack());
6058 return getSubstTemplateTemplateParmPack(canonParameter, canonArgPack);
6059 }
6060 }
6061
6062 llvm_unreachable("bad template name!");
6063 }
6064
hasSameTemplateName(TemplateName X,TemplateName Y)6065 bool ASTContext::hasSameTemplateName(TemplateName X, TemplateName Y) {
6066 X = getCanonicalTemplateName(X);
6067 Y = getCanonicalTemplateName(Y);
6068 return X.getAsVoidPointer() == Y.getAsVoidPointer();
6069 }
6070
6071 TemplateArgument
getCanonicalTemplateArgument(const TemplateArgument & Arg) const6072 ASTContext::getCanonicalTemplateArgument(const TemplateArgument &Arg) const {
6073 switch (Arg.getKind()) {
6074 case TemplateArgument::Null:
6075 return Arg;
6076
6077 case TemplateArgument::Expression:
6078 return Arg;
6079
6080 case TemplateArgument::Declaration: {
6081 auto *D = cast<ValueDecl>(Arg.getAsDecl()->getCanonicalDecl());
6082 return TemplateArgument(D, Arg.getParamTypeForDecl());
6083 }
6084
6085 case TemplateArgument::NullPtr:
6086 return TemplateArgument(getCanonicalType(Arg.getNullPtrType()),
6087 /*isNullPtr*/true);
6088
6089 case TemplateArgument::Template:
6090 return TemplateArgument(getCanonicalTemplateName(Arg.getAsTemplate()));
6091
6092 case TemplateArgument::TemplateExpansion:
6093 return TemplateArgument(getCanonicalTemplateName(
6094 Arg.getAsTemplateOrTemplatePattern()),
6095 Arg.getNumTemplateExpansions());
6096
6097 case TemplateArgument::Integral:
6098 return TemplateArgument(Arg, getCanonicalType(Arg.getIntegralType()));
6099
6100 case TemplateArgument::Type:
6101 return TemplateArgument(getCanonicalType(Arg.getAsType()));
6102
6103 case TemplateArgument::Pack: {
6104 if (Arg.pack_size() == 0)
6105 return Arg;
6106
6107 auto *CanonArgs = new (*this) TemplateArgument[Arg.pack_size()];
6108 unsigned Idx = 0;
6109 for (TemplateArgument::pack_iterator A = Arg.pack_begin(),
6110 AEnd = Arg.pack_end();
6111 A != AEnd; (void)++A, ++Idx)
6112 CanonArgs[Idx] = getCanonicalTemplateArgument(*A);
6113
6114 return TemplateArgument(llvm::makeArrayRef(CanonArgs, Arg.pack_size()));
6115 }
6116 }
6117
6118 // Silence GCC warning
6119 llvm_unreachable("Unhandled template argument kind");
6120 }
6121
6122 NestedNameSpecifier *
getCanonicalNestedNameSpecifier(NestedNameSpecifier * NNS) const6123 ASTContext::getCanonicalNestedNameSpecifier(NestedNameSpecifier *NNS) const {
6124 if (!NNS)
6125 return nullptr;
6126
6127 switch (NNS->getKind()) {
6128 case NestedNameSpecifier::Identifier:
6129 // Canonicalize the prefix but keep the identifier the same.
6130 return NestedNameSpecifier::Create(*this,
6131 getCanonicalNestedNameSpecifier(NNS->getPrefix()),
6132 NNS->getAsIdentifier());
6133
6134 case NestedNameSpecifier::Namespace:
6135 // A namespace is canonical; build a nested-name-specifier with
6136 // this namespace and no prefix.
6137 return NestedNameSpecifier::Create(*this, nullptr,
6138 NNS->getAsNamespace()->getOriginalNamespace());
6139
6140 case NestedNameSpecifier::NamespaceAlias:
6141 // A namespace is canonical; build a nested-name-specifier with
6142 // this namespace and no prefix.
6143 return NestedNameSpecifier::Create(*this, nullptr,
6144 NNS->getAsNamespaceAlias()->getNamespace()
6145 ->getOriginalNamespace());
6146
6147 // The difference between TypeSpec and TypeSpecWithTemplate is that the
6148 // latter will have the 'template' keyword when printed.
6149 case NestedNameSpecifier::TypeSpec:
6150 case NestedNameSpecifier::TypeSpecWithTemplate: {
6151 const Type *T = getCanonicalType(NNS->getAsType());
6152
6153 // If we have some kind of dependent-named type (e.g., "typename T::type"),
6154 // break it apart into its prefix and identifier, then reconsititute those
6155 // as the canonical nested-name-specifier. This is required to canonicalize
6156 // a dependent nested-name-specifier involving typedefs of dependent-name
6157 // types, e.g.,
6158 // typedef typename T::type T1;
6159 // typedef typename T1::type T2;
6160 if (const auto *DNT = T->getAs<DependentNameType>())
6161 return NestedNameSpecifier::Create(
6162 *this, DNT->getQualifier(),
6163 const_cast<IdentifierInfo *>(DNT->getIdentifier()));
6164 if (const auto *DTST = T->getAs<DependentTemplateSpecializationType>())
6165 return NestedNameSpecifier::Create(*this, DTST->getQualifier(), true,
6166 const_cast<Type *>(T));
6167
6168 // TODO: Set 'Template' parameter to true for other template types.
6169 return NestedNameSpecifier::Create(*this, nullptr, false,
6170 const_cast<Type *>(T));
6171 }
6172
6173 case NestedNameSpecifier::Global:
6174 case NestedNameSpecifier::Super:
6175 // The global specifier and __super specifer are canonical and unique.
6176 return NNS;
6177 }
6178
6179 llvm_unreachable("Invalid NestedNameSpecifier::Kind!");
6180 }
6181
getAsArrayType(QualType T) const6182 const ArrayType *ASTContext::getAsArrayType(QualType T) const {
6183 // Handle the non-qualified case efficiently.
6184 if (!T.hasLocalQualifiers()) {
6185 // Handle the common positive case fast.
6186 if (const auto *AT = dyn_cast<ArrayType>(T))
6187 return AT;
6188 }
6189
6190 // Handle the common negative case fast.
6191 if (!isa<ArrayType>(T.getCanonicalType()))
6192 return nullptr;
6193
6194 // Apply any qualifiers from the array type to the element type. This
6195 // implements C99 6.7.3p8: "If the specification of an array type includes
6196 // any type qualifiers, the element type is so qualified, not the array type."
6197
6198 // If we get here, we either have type qualifiers on the type, or we have
6199 // sugar such as a typedef in the way. If we have type qualifiers on the type
6200 // we must propagate them down into the element type.
6201
6202 SplitQualType split = T.getSplitDesugaredType();
6203 Qualifiers qs = split.Quals;
6204
6205 // If we have a simple case, just return now.
6206 const auto *ATy = dyn_cast<ArrayType>(split.Ty);
6207 if (!ATy || qs.empty())
6208 return ATy;
6209
6210 // Otherwise, we have an array and we have qualifiers on it. Push the
6211 // qualifiers into the array element type and return a new array type.
6212 QualType NewEltTy = getQualifiedType(ATy->getElementType(), qs);
6213
6214 if (const auto *CAT = dyn_cast<ConstantArrayType>(ATy))
6215 return cast<ArrayType>(getConstantArrayType(NewEltTy, CAT->getSize(),
6216 CAT->getSizeExpr(),
6217 CAT->getSizeModifier(),
6218 CAT->getIndexTypeCVRQualifiers()));
6219 if (const auto *IAT = dyn_cast<IncompleteArrayType>(ATy))
6220 return cast<ArrayType>(getIncompleteArrayType(NewEltTy,
6221 IAT->getSizeModifier(),
6222 IAT->getIndexTypeCVRQualifiers()));
6223
6224 if (const auto *DSAT = dyn_cast<DependentSizedArrayType>(ATy))
6225 return cast<ArrayType>(
6226 getDependentSizedArrayType(NewEltTy,
6227 DSAT->getSizeExpr(),
6228 DSAT->getSizeModifier(),
6229 DSAT->getIndexTypeCVRQualifiers(),
6230 DSAT->getBracketsRange()));
6231
6232 const auto *VAT = cast<VariableArrayType>(ATy);
6233 return cast<ArrayType>(getVariableArrayType(NewEltTy,
6234 VAT->getSizeExpr(),
6235 VAT->getSizeModifier(),
6236 VAT->getIndexTypeCVRQualifiers(),
6237 VAT->getBracketsRange()));
6238 }
6239
getAdjustedParameterType(QualType T) const6240 QualType ASTContext::getAdjustedParameterType(QualType T) const {
6241 if (T->isArrayType() || T->isFunctionType())
6242 return getDecayedType(T);
6243 return T;
6244 }
6245
getSignatureParameterType(QualType T) const6246 QualType ASTContext::getSignatureParameterType(QualType T) const {
6247 T = getVariableArrayDecayedType(T);
6248 T = getAdjustedParameterType(T);
6249 return T.getUnqualifiedType();
6250 }
6251
getExceptionObjectType(QualType T) const6252 QualType ASTContext::getExceptionObjectType(QualType T) const {
6253 // C++ [except.throw]p3:
6254 // A throw-expression initializes a temporary object, called the exception
6255 // object, the type of which is determined by removing any top-level
6256 // cv-qualifiers from the static type of the operand of throw and adjusting
6257 // the type from "array of T" or "function returning T" to "pointer to T"
6258 // or "pointer to function returning T", [...]
6259 T = getVariableArrayDecayedType(T);
6260 if (T->isArrayType() || T->isFunctionType())
6261 T = getDecayedType(T);
6262 return T.getUnqualifiedType();
6263 }
6264
6265 /// getArrayDecayedType - Return the properly qualified result of decaying the
6266 /// specified array type to a pointer. This operation is non-trivial when
6267 /// handling typedefs etc. The canonical type of "T" must be an array type,
6268 /// this returns a pointer to a properly qualified element of the array.
6269 ///
6270 /// See C99 6.7.5.3p7 and C99 6.3.2.1p3.
getArrayDecayedType(QualType Ty) const6271 QualType ASTContext::getArrayDecayedType(QualType Ty) const {
6272 // Get the element type with 'getAsArrayType' so that we don't lose any
6273 // typedefs in the element type of the array. This also handles propagation
6274 // of type qualifiers from the array type into the element type if present
6275 // (C99 6.7.3p8).
6276 const ArrayType *PrettyArrayType = getAsArrayType(Ty);
6277 assert(PrettyArrayType && "Not an array type!");
6278
6279 QualType PtrTy = getPointerType(PrettyArrayType->getElementType());
6280
6281 // int x[restrict 4] -> int *restrict
6282 QualType Result = getQualifiedType(PtrTy,
6283 PrettyArrayType->getIndexTypeQualifiers());
6284
6285 // int x[_Nullable] -> int * _Nullable
6286 if (auto Nullability = Ty->getNullability(*this)) {
6287 Result = const_cast<ASTContext *>(this)->getAttributedType(
6288 AttributedType::getNullabilityAttrKind(*Nullability), Result, Result);
6289 }
6290 return Result;
6291 }
6292
getBaseElementType(const ArrayType * array) const6293 QualType ASTContext::getBaseElementType(const ArrayType *array) const {
6294 return getBaseElementType(array->getElementType());
6295 }
6296
getBaseElementType(QualType type) const6297 QualType ASTContext::getBaseElementType(QualType type) const {
6298 Qualifiers qs;
6299 while (true) {
6300 SplitQualType split = type.getSplitDesugaredType();
6301 const ArrayType *array = split.Ty->getAsArrayTypeUnsafe();
6302 if (!array) break;
6303
6304 type = array->getElementType();
6305 qs.addConsistentQualifiers(split.Quals);
6306 }
6307
6308 return getQualifiedType(type, qs);
6309 }
6310
6311 /// getConstantArrayElementCount - Returns number of constant array elements.
6312 uint64_t
getConstantArrayElementCount(const ConstantArrayType * CA) const6313 ASTContext::getConstantArrayElementCount(const ConstantArrayType *CA) const {
6314 uint64_t ElementCount = 1;
6315 do {
6316 ElementCount *= CA->getSize().getZExtValue();
6317 CA = dyn_cast_or_null<ConstantArrayType>(
6318 CA->getElementType()->getAsArrayTypeUnsafe());
6319 } while (CA);
6320 return ElementCount;
6321 }
6322
6323 /// getFloatingRank - Return a relative rank for floating point types.
6324 /// This routine will assert if passed a built-in type that isn't a float.
getFloatingRank(QualType T)6325 static FloatingRank getFloatingRank(QualType T) {
6326 if (const auto *CT = T->getAs<ComplexType>())
6327 return getFloatingRank(CT->getElementType());
6328
6329 switch (T->castAs<BuiltinType>()->getKind()) {
6330 default: llvm_unreachable("getFloatingRank(): not a floating type");
6331 case BuiltinType::Float16: return Float16Rank;
6332 case BuiltinType::Half: return HalfRank;
6333 case BuiltinType::Float: return FloatRank;
6334 case BuiltinType::Double: return DoubleRank;
6335 case BuiltinType::LongDouble: return LongDoubleRank;
6336 case BuiltinType::Float128: return Float128Rank;
6337 case BuiltinType::BFloat16: return BFloat16Rank;
6338 case BuiltinType::Ibm128: return Ibm128Rank;
6339 }
6340 }
6341
6342 /// getFloatingTypeOfSizeWithinDomain - Returns a real floating
6343 /// point or a complex type (based on typeDomain/typeSize).
6344 /// 'typeDomain' is a real floating point or complex type.
6345 /// 'typeSize' is a real floating point or complex type.
getFloatingTypeOfSizeWithinDomain(QualType Size,QualType Domain) const6346 QualType ASTContext::getFloatingTypeOfSizeWithinDomain(QualType Size,
6347 QualType Domain) const {
6348 FloatingRank EltRank = getFloatingRank(Size);
6349 if (Domain->isComplexType()) {
6350 switch (EltRank) {
6351 case BFloat16Rank: llvm_unreachable("Complex bfloat16 is not supported");
6352 case Float16Rank:
6353 case HalfRank: llvm_unreachable("Complex half is not supported");
6354 case Ibm128Rank: return getComplexType(Ibm128Ty);
6355 case FloatRank: return getComplexType(FloatTy);
6356 case DoubleRank: return getComplexType(DoubleTy);
6357 case LongDoubleRank: return getComplexType(LongDoubleTy);
6358 case Float128Rank: return getComplexType(Float128Ty);
6359 }
6360 }
6361
6362 assert(Domain->isRealFloatingType() && "Unknown domain!");
6363 switch (EltRank) {
6364 case Float16Rank: return HalfTy;
6365 case BFloat16Rank: return BFloat16Ty;
6366 case HalfRank: return HalfTy;
6367 case FloatRank: return FloatTy;
6368 case DoubleRank: return DoubleTy;
6369 case LongDoubleRank: return LongDoubleTy;
6370 case Float128Rank: return Float128Ty;
6371 case Ibm128Rank:
6372 return Ibm128Ty;
6373 }
6374 llvm_unreachable("getFloatingRank(): illegal value for rank");
6375 }
6376
6377 /// getFloatingTypeOrder - Compare the rank of the two specified floating
6378 /// point types, ignoring the domain of the type (i.e. 'double' ==
6379 /// '_Complex double'). If LHS > RHS, return 1. If LHS == RHS, return 0. If
6380 /// LHS < RHS, return -1.
getFloatingTypeOrder(QualType LHS,QualType RHS) const6381 int ASTContext::getFloatingTypeOrder(QualType LHS, QualType RHS) const {
6382 FloatingRank LHSR = getFloatingRank(LHS);
6383 FloatingRank RHSR = getFloatingRank(RHS);
6384
6385 if (LHSR == RHSR)
6386 return 0;
6387 if (LHSR > RHSR)
6388 return 1;
6389 return -1;
6390 }
6391
getFloatingTypeSemanticOrder(QualType LHS,QualType RHS) const6392 int ASTContext::getFloatingTypeSemanticOrder(QualType LHS, QualType RHS) const {
6393 if (&getFloatTypeSemantics(LHS) == &getFloatTypeSemantics(RHS))
6394 return 0;
6395 return getFloatingTypeOrder(LHS, RHS);
6396 }
6397
6398 /// getIntegerRank - Return an integer conversion rank (C99 6.3.1.1p1). This
6399 /// routine will assert if passed a built-in type that isn't an integer or enum,
6400 /// or if it is not canonicalized.
getIntegerRank(const Type * T) const6401 unsigned ASTContext::getIntegerRank(const Type *T) const {
6402 assert(T->isCanonicalUnqualified() && "T should be canonicalized");
6403
6404 // Results in this 'losing' to any type of the same size, but winning if
6405 // larger.
6406 if (const auto *EIT = dyn_cast<ExtIntType>(T))
6407 return 0 + (EIT->getNumBits() << 3);
6408
6409 switch (cast<BuiltinType>(T)->getKind()) {
6410 default: llvm_unreachable("getIntegerRank(): not a built-in integer");
6411 case BuiltinType::Bool:
6412 return 1 + (getIntWidth(BoolTy) << 3);
6413 case BuiltinType::Char_S:
6414 case BuiltinType::Char_U:
6415 case BuiltinType::SChar:
6416 case BuiltinType::UChar:
6417 return 2 + (getIntWidth(CharTy) << 3);
6418 case BuiltinType::Short:
6419 case BuiltinType::UShort:
6420 return 3 + (getIntWidth(ShortTy) << 3);
6421 case BuiltinType::Int:
6422 case BuiltinType::UInt:
6423 return 4 + (getIntWidth(IntTy) << 3);
6424 case BuiltinType::Long:
6425 case BuiltinType::ULong:
6426 return 5 + (getIntWidth(LongTy) << 3);
6427 case BuiltinType::LongLong:
6428 case BuiltinType::ULongLong:
6429 return 6 + (getIntWidth(LongLongTy) << 3);
6430 case BuiltinType::Int128:
6431 case BuiltinType::UInt128:
6432 return 7 + (getIntWidth(Int128Ty) << 3);
6433 }
6434 }
6435
6436 /// Whether this is a promotable bitfield reference according
6437 /// to C99 6.3.1.1p2, bullet 2 (and GCC extensions).
6438 ///
6439 /// \returns the type this bit-field will promote to, or NULL if no
6440 /// promotion occurs.
isPromotableBitField(Expr * E) const6441 QualType ASTContext::isPromotableBitField(Expr *E) const {
6442 if (E->isTypeDependent() || E->isValueDependent())
6443 return {};
6444
6445 // C++ [conv.prom]p5:
6446 // If the bit-field has an enumerated type, it is treated as any other
6447 // value of that type for promotion purposes.
6448 if (getLangOpts().CPlusPlus && E->getType()->isEnumeralType())
6449 return {};
6450
6451 // FIXME: We should not do this unless E->refersToBitField() is true. This
6452 // matters in C where getSourceBitField() will find bit-fields for various
6453 // cases where the source expression is not a bit-field designator.
6454
6455 FieldDecl *Field = E->getSourceBitField(); // FIXME: conditional bit-fields?
6456 if (!Field)
6457 return {};
6458
6459 QualType FT = Field->getType();
6460
6461 uint64_t BitWidth = Field->getBitWidthValue(*this);
6462 uint64_t IntSize = getTypeSize(IntTy);
6463 // C++ [conv.prom]p5:
6464 // A prvalue for an integral bit-field can be converted to a prvalue of type
6465 // int if int can represent all the values of the bit-field; otherwise, it
6466 // can be converted to unsigned int if unsigned int can represent all the
6467 // values of the bit-field. If the bit-field is larger yet, no integral
6468 // promotion applies to it.
6469 // C11 6.3.1.1/2:
6470 // [For a bit-field of type _Bool, int, signed int, or unsigned int:]
6471 // If an int can represent all values of the original type (as restricted by
6472 // the width, for a bit-field), the value is converted to an int; otherwise,
6473 // it is converted to an unsigned int.
6474 //
6475 // FIXME: C does not permit promotion of a 'long : 3' bitfield to int.
6476 // We perform that promotion here to match GCC and C++.
6477 // FIXME: C does not permit promotion of an enum bit-field whose rank is
6478 // greater than that of 'int'. We perform that promotion to match GCC.
6479 if (BitWidth < IntSize)
6480 return IntTy;
6481
6482 if (BitWidth == IntSize)
6483 return FT->isSignedIntegerType() ? IntTy : UnsignedIntTy;
6484
6485 // Bit-fields wider than int are not subject to promotions, and therefore act
6486 // like the base type. GCC has some weird bugs in this area that we
6487 // deliberately do not follow (GCC follows a pre-standard resolution to
6488 // C's DR315 which treats bit-width as being part of the type, and this leaks
6489 // into their semantics in some cases).
6490 return {};
6491 }
6492
6493 /// getPromotedIntegerType - Returns the type that Promotable will
6494 /// promote to: C99 6.3.1.1p2, assuming that Promotable is a promotable
6495 /// integer type.
getPromotedIntegerType(QualType Promotable) const6496 QualType ASTContext::getPromotedIntegerType(QualType Promotable) const {
6497 assert(!Promotable.isNull());
6498 assert(Promotable->isPromotableIntegerType());
6499 if (const auto *ET = Promotable->getAs<EnumType>())
6500 return ET->getDecl()->getPromotionType();
6501
6502 if (const auto *BT = Promotable->getAs<BuiltinType>()) {
6503 // C++ [conv.prom]: A prvalue of type char16_t, char32_t, or wchar_t
6504 // (3.9.1) can be converted to a prvalue of the first of the following
6505 // types that can represent all the values of its underlying type:
6506 // int, unsigned int, long int, unsigned long int, long long int, or
6507 // unsigned long long int [...]
6508 // FIXME: Is there some better way to compute this?
6509 if (BT->getKind() == BuiltinType::WChar_S ||
6510 BT->getKind() == BuiltinType::WChar_U ||
6511 BT->getKind() == BuiltinType::Char8 ||
6512 BT->getKind() == BuiltinType::Char16 ||
6513 BT->getKind() == BuiltinType::Char32) {
6514 bool FromIsSigned = BT->getKind() == BuiltinType::WChar_S;
6515 uint64_t FromSize = getTypeSize(BT);
6516 QualType PromoteTypes[] = { IntTy, UnsignedIntTy, LongTy, UnsignedLongTy,
6517 LongLongTy, UnsignedLongLongTy };
6518 for (size_t Idx = 0; Idx < llvm::array_lengthof(PromoteTypes); ++Idx) {
6519 uint64_t ToSize = getTypeSize(PromoteTypes[Idx]);
6520 if (FromSize < ToSize ||
6521 (FromSize == ToSize &&
6522 FromIsSigned == PromoteTypes[Idx]->isSignedIntegerType()))
6523 return PromoteTypes[Idx];
6524 }
6525 llvm_unreachable("char type should fit into long long");
6526 }
6527 }
6528
6529 // At this point, we should have a signed or unsigned integer type.
6530 if (Promotable->isSignedIntegerType())
6531 return IntTy;
6532 uint64_t PromotableSize = getIntWidth(Promotable);
6533 uint64_t IntSize = getIntWidth(IntTy);
6534 assert(Promotable->isUnsignedIntegerType() && PromotableSize <= IntSize);
6535 return (PromotableSize != IntSize) ? IntTy : UnsignedIntTy;
6536 }
6537
6538 /// Recurses in pointer/array types until it finds an objc retainable
6539 /// type and returns its ownership.
getInnerObjCOwnership(QualType T) const6540 Qualifiers::ObjCLifetime ASTContext::getInnerObjCOwnership(QualType T) const {
6541 while (!T.isNull()) {
6542 if (T.getObjCLifetime() != Qualifiers::OCL_None)
6543 return T.getObjCLifetime();
6544 if (T->isArrayType())
6545 T = getBaseElementType(T);
6546 else if (const auto *PT = T->getAs<PointerType>())
6547 T = PT->getPointeeType();
6548 else if (const auto *RT = T->getAs<ReferenceType>())
6549 T = RT->getPointeeType();
6550 else
6551 break;
6552 }
6553
6554 return Qualifiers::OCL_None;
6555 }
6556
getIntegerTypeForEnum(const EnumType * ET)6557 static const Type *getIntegerTypeForEnum(const EnumType *ET) {
6558 // Incomplete enum types are not treated as integer types.
6559 // FIXME: In C++, enum types are never integer types.
6560 if (ET->getDecl()->isComplete() && !ET->getDecl()->isScoped())
6561 return ET->getDecl()->getIntegerType().getTypePtr();
6562 return nullptr;
6563 }
6564
6565 /// getIntegerTypeOrder - Returns the highest ranked integer type:
6566 /// C99 6.3.1.8p1. If LHS > RHS, return 1. If LHS == RHS, return 0. If
6567 /// LHS < RHS, return -1.
getIntegerTypeOrder(QualType LHS,QualType RHS) const6568 int ASTContext::getIntegerTypeOrder(QualType LHS, QualType RHS) const {
6569 const Type *LHSC = getCanonicalType(LHS).getTypePtr();
6570 const Type *RHSC = getCanonicalType(RHS).getTypePtr();
6571
6572 // Unwrap enums to their underlying type.
6573 if (const auto *ET = dyn_cast<EnumType>(LHSC))
6574 LHSC = getIntegerTypeForEnum(ET);
6575 if (const auto *ET = dyn_cast<EnumType>(RHSC))
6576 RHSC = getIntegerTypeForEnum(ET);
6577
6578 if (LHSC == RHSC) return 0;
6579
6580 bool LHSUnsigned = LHSC->isUnsignedIntegerType();
6581 bool RHSUnsigned = RHSC->isUnsignedIntegerType();
6582
6583 unsigned LHSRank = getIntegerRank(LHSC);
6584 unsigned RHSRank = getIntegerRank(RHSC);
6585
6586 if (LHSUnsigned == RHSUnsigned) { // Both signed or both unsigned.
6587 if (LHSRank == RHSRank) return 0;
6588 return LHSRank > RHSRank ? 1 : -1;
6589 }
6590
6591 // Otherwise, the LHS is signed and the RHS is unsigned or visa versa.
6592 if (LHSUnsigned) {
6593 // If the unsigned [LHS] type is larger, return it.
6594 if (LHSRank >= RHSRank)
6595 return 1;
6596
6597 // If the signed type can represent all values of the unsigned type, it
6598 // wins. Because we are dealing with 2's complement and types that are
6599 // powers of two larger than each other, this is always safe.
6600 return -1;
6601 }
6602
6603 // If the unsigned [RHS] type is larger, return it.
6604 if (RHSRank >= LHSRank)
6605 return -1;
6606
6607 // If the signed type can represent all values of the unsigned type, it
6608 // wins. Because we are dealing with 2's complement and types that are
6609 // powers of two larger than each other, this is always safe.
6610 return 1;
6611 }
6612
getCFConstantStringDecl() const6613 TypedefDecl *ASTContext::getCFConstantStringDecl() const {
6614 if (CFConstantStringTypeDecl)
6615 return CFConstantStringTypeDecl;
6616
6617 assert(!CFConstantStringTagDecl &&
6618 "tag and typedef should be initialized together");
6619 CFConstantStringTagDecl = buildImplicitRecord("__NSConstantString_tag");
6620 CFConstantStringTagDecl->startDefinition();
6621
6622 struct {
6623 QualType Type;
6624 const char *Name;
6625 } Fields[5];
6626 unsigned Count = 0;
6627
6628 /// Objective-C ABI
6629 ///
6630 /// typedef struct __NSConstantString_tag {
6631 /// const int *isa;
6632 /// int flags;
6633 /// const char *str;
6634 /// long length;
6635 /// } __NSConstantString;
6636 ///
6637 /// Swift ABI (4.1, 4.2)
6638 ///
6639 /// typedef struct __NSConstantString_tag {
6640 /// uintptr_t _cfisa;
6641 /// uintptr_t _swift_rc;
6642 /// _Atomic(uint64_t) _cfinfoa;
6643 /// const char *_ptr;
6644 /// uint32_t _length;
6645 /// } __NSConstantString;
6646 ///
6647 /// Swift ABI (5.0)
6648 ///
6649 /// typedef struct __NSConstantString_tag {
6650 /// uintptr_t _cfisa;
6651 /// uintptr_t _swift_rc;
6652 /// _Atomic(uint64_t) _cfinfoa;
6653 /// const char *_ptr;
6654 /// uintptr_t _length;
6655 /// } __NSConstantString;
6656
6657 const auto CFRuntime = getLangOpts().CFRuntime;
6658 if (static_cast<unsigned>(CFRuntime) <
6659 static_cast<unsigned>(LangOptions::CoreFoundationABI::Swift)) {
6660 Fields[Count++] = { getPointerType(IntTy.withConst()), "isa" };
6661 Fields[Count++] = { IntTy, "flags" };
6662 Fields[Count++] = { getPointerType(CharTy.withConst()), "str" };
6663 Fields[Count++] = { LongTy, "length" };
6664 } else {
6665 Fields[Count++] = { getUIntPtrType(), "_cfisa" };
6666 Fields[Count++] = { getUIntPtrType(), "_swift_rc" };
6667 Fields[Count++] = { getFromTargetType(Target->getUInt64Type()), "_swift_rc" };
6668 Fields[Count++] = { getPointerType(CharTy.withConst()), "_ptr" };
6669 if (CFRuntime == LangOptions::CoreFoundationABI::Swift4_1 ||
6670 CFRuntime == LangOptions::CoreFoundationABI::Swift4_2)
6671 Fields[Count++] = { IntTy, "_ptr" };
6672 else
6673 Fields[Count++] = { getUIntPtrType(), "_ptr" };
6674 }
6675
6676 // Create fields
6677 for (unsigned i = 0; i < Count; ++i) {
6678 FieldDecl *Field =
6679 FieldDecl::Create(*this, CFConstantStringTagDecl, SourceLocation(),
6680 SourceLocation(), &Idents.get(Fields[i].Name),
6681 Fields[i].Type, /*TInfo=*/nullptr,
6682 /*BitWidth=*/nullptr, /*Mutable=*/false, ICIS_NoInit);
6683 Field->setAccess(AS_public);
6684 CFConstantStringTagDecl->addDecl(Field);
6685 }
6686
6687 CFConstantStringTagDecl->completeDefinition();
6688 // This type is designed to be compatible with NSConstantString, but cannot
6689 // use the same name, since NSConstantString is an interface.
6690 auto tagType = getTagDeclType(CFConstantStringTagDecl);
6691 CFConstantStringTypeDecl =
6692 buildImplicitTypedef(tagType, "__NSConstantString");
6693
6694 return CFConstantStringTypeDecl;
6695 }
6696
getCFConstantStringTagDecl() const6697 RecordDecl *ASTContext::getCFConstantStringTagDecl() const {
6698 if (!CFConstantStringTagDecl)
6699 getCFConstantStringDecl(); // Build the tag and the typedef.
6700 return CFConstantStringTagDecl;
6701 }
6702
6703 // getCFConstantStringType - Return the type used for constant CFStrings.
getCFConstantStringType() const6704 QualType ASTContext::getCFConstantStringType() const {
6705 return getTypedefType(getCFConstantStringDecl());
6706 }
6707
getObjCSuperType() const6708 QualType ASTContext::getObjCSuperType() const {
6709 if (ObjCSuperType.isNull()) {
6710 RecordDecl *ObjCSuperTypeDecl = buildImplicitRecord("objc_super");
6711 getTranslationUnitDecl()->addDecl(ObjCSuperTypeDecl);
6712 ObjCSuperType = getTagDeclType(ObjCSuperTypeDecl);
6713 }
6714 return ObjCSuperType;
6715 }
6716
setCFConstantStringType(QualType T)6717 void ASTContext::setCFConstantStringType(QualType T) {
6718 const auto *TD = T->castAs<TypedefType>();
6719 CFConstantStringTypeDecl = cast<TypedefDecl>(TD->getDecl());
6720 const auto *TagType =
6721 CFConstantStringTypeDecl->getUnderlyingType()->castAs<RecordType>();
6722 CFConstantStringTagDecl = TagType->getDecl();
6723 }
6724
getBlockDescriptorType() const6725 QualType ASTContext::getBlockDescriptorType() const {
6726 if (BlockDescriptorType)
6727 return getTagDeclType(BlockDescriptorType);
6728
6729 RecordDecl *RD;
6730 // FIXME: Needs the FlagAppleBlock bit.
6731 RD = buildImplicitRecord("__block_descriptor");
6732 RD->startDefinition();
6733
6734 QualType FieldTypes[] = {
6735 UnsignedLongTy,
6736 UnsignedLongTy,
6737 };
6738
6739 static const char *const FieldNames[] = {
6740 "reserved",
6741 "Size"
6742 };
6743
6744 for (size_t i = 0; i < 2; ++i) {
6745 FieldDecl *Field = FieldDecl::Create(
6746 *this, RD, SourceLocation(), SourceLocation(),
6747 &Idents.get(FieldNames[i]), FieldTypes[i], /*TInfo=*/nullptr,
6748 /*BitWidth=*/nullptr, /*Mutable=*/false, ICIS_NoInit);
6749 Field->setAccess(AS_public);
6750 RD->addDecl(Field);
6751 }
6752
6753 RD->completeDefinition();
6754
6755 BlockDescriptorType = RD;
6756
6757 return getTagDeclType(BlockDescriptorType);
6758 }
6759
getBlockDescriptorExtendedType() const6760 QualType ASTContext::getBlockDescriptorExtendedType() const {
6761 if (BlockDescriptorExtendedType)
6762 return getTagDeclType(BlockDescriptorExtendedType);
6763
6764 RecordDecl *RD;
6765 // FIXME: Needs the FlagAppleBlock bit.
6766 RD = buildImplicitRecord("__block_descriptor_withcopydispose");
6767 RD->startDefinition();
6768
6769 QualType FieldTypes[] = {
6770 UnsignedLongTy,
6771 UnsignedLongTy,
6772 getPointerType(VoidPtrTy),
6773 getPointerType(VoidPtrTy)
6774 };
6775
6776 static const char *const FieldNames[] = {
6777 "reserved",
6778 "Size",
6779 "CopyFuncPtr",
6780 "DestroyFuncPtr"
6781 };
6782
6783 for (size_t i = 0; i < 4; ++i) {
6784 FieldDecl *Field = FieldDecl::Create(
6785 *this, RD, SourceLocation(), SourceLocation(),
6786 &Idents.get(FieldNames[i]), FieldTypes[i], /*TInfo=*/nullptr,
6787 /*BitWidth=*/nullptr,
6788 /*Mutable=*/false, ICIS_NoInit);
6789 Field->setAccess(AS_public);
6790 RD->addDecl(Field);
6791 }
6792
6793 RD->completeDefinition();
6794
6795 BlockDescriptorExtendedType = RD;
6796 return getTagDeclType(BlockDescriptorExtendedType);
6797 }
6798
getOpenCLTypeKind(const Type * T) const6799 OpenCLTypeKind ASTContext::getOpenCLTypeKind(const Type *T) const {
6800 const auto *BT = dyn_cast<BuiltinType>(T);
6801
6802 if (!BT) {
6803 if (isa<PipeType>(T))
6804 return OCLTK_Pipe;
6805
6806 return OCLTK_Default;
6807 }
6808
6809 switch (BT->getKind()) {
6810 #define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
6811 case BuiltinType::Id: \
6812 return OCLTK_Image;
6813 #include "clang/Basic/OpenCLImageTypes.def"
6814
6815 case BuiltinType::OCLClkEvent:
6816 return OCLTK_ClkEvent;
6817
6818 case BuiltinType::OCLEvent:
6819 return OCLTK_Event;
6820
6821 case BuiltinType::OCLQueue:
6822 return OCLTK_Queue;
6823
6824 case BuiltinType::OCLReserveID:
6825 return OCLTK_ReserveID;
6826
6827 case BuiltinType::OCLSampler:
6828 return OCLTK_Sampler;
6829
6830 default:
6831 return OCLTK_Default;
6832 }
6833 }
6834
getOpenCLTypeAddrSpace(const Type * T) const6835 LangAS ASTContext::getOpenCLTypeAddrSpace(const Type *T) const {
6836 return Target->getOpenCLTypeAddrSpace(getOpenCLTypeKind(T));
6837 }
6838
6839 /// BlockRequiresCopying - Returns true if byref variable "D" of type "Ty"
6840 /// requires copy/dispose. Note that this must match the logic
6841 /// in buildByrefHelpers.
BlockRequiresCopying(QualType Ty,const VarDecl * D)6842 bool ASTContext::BlockRequiresCopying(QualType Ty,
6843 const VarDecl *D) {
6844 if (const CXXRecordDecl *record = Ty->getAsCXXRecordDecl()) {
6845 const Expr *copyExpr = getBlockVarCopyInit(D).getCopyExpr();
6846 if (!copyExpr && record->hasTrivialDestructor()) return false;
6847
6848 return true;
6849 }
6850
6851 // The block needs copy/destroy helpers if Ty is non-trivial to destructively
6852 // move or destroy.
6853 if (Ty.isNonTrivialToPrimitiveDestructiveMove() || Ty.isDestructedType())
6854 return true;
6855
6856 if (!Ty->isObjCRetainableType()) return false;
6857
6858 Qualifiers qs = Ty.getQualifiers();
6859
6860 // If we have lifetime, that dominates.
6861 if (Qualifiers::ObjCLifetime lifetime = qs.getObjCLifetime()) {
6862 switch (lifetime) {
6863 case Qualifiers::OCL_None: llvm_unreachable("impossible");
6864
6865 // These are just bits as far as the runtime is concerned.
6866 case Qualifiers::OCL_ExplicitNone:
6867 case Qualifiers::OCL_Autoreleasing:
6868 return false;
6869
6870 // These cases should have been taken care of when checking the type's
6871 // non-triviality.
6872 case Qualifiers::OCL_Weak:
6873 case Qualifiers::OCL_Strong:
6874 llvm_unreachable("impossible");
6875 }
6876 llvm_unreachable("fell out of lifetime switch!");
6877 }
6878 return (Ty->isBlockPointerType() || isObjCNSObjectType(Ty) ||
6879 Ty->isObjCObjectPointerType());
6880 }
6881
getByrefLifetime(QualType Ty,Qualifiers::ObjCLifetime & LifeTime,bool & HasByrefExtendedLayout) const6882 bool ASTContext::getByrefLifetime(QualType Ty,
6883 Qualifiers::ObjCLifetime &LifeTime,
6884 bool &HasByrefExtendedLayout) const {
6885 if (!getLangOpts().ObjC ||
6886 getLangOpts().getGC() != LangOptions::NonGC)
6887 return false;
6888
6889 HasByrefExtendedLayout = false;
6890 if (Ty->isRecordType()) {
6891 HasByrefExtendedLayout = true;
6892 LifeTime = Qualifiers::OCL_None;
6893 } else if ((LifeTime = Ty.getObjCLifetime())) {
6894 // Honor the ARC qualifiers.
6895 } else if (Ty->isObjCObjectPointerType() || Ty->isBlockPointerType()) {
6896 // The MRR rule.
6897 LifeTime = Qualifiers::OCL_ExplicitNone;
6898 } else {
6899 LifeTime = Qualifiers::OCL_None;
6900 }
6901 return true;
6902 }
6903
getNSUIntegerType() const6904 CanQualType ASTContext::getNSUIntegerType() const {
6905 assert(Target && "Expected target to be initialized");
6906 const llvm::Triple &T = Target->getTriple();
6907 // Windows is LLP64 rather than LP64
6908 if (T.isOSWindows() && T.isArch64Bit())
6909 return UnsignedLongLongTy;
6910 return UnsignedLongTy;
6911 }
6912
getNSIntegerType() const6913 CanQualType ASTContext::getNSIntegerType() const {
6914 assert(Target && "Expected target to be initialized");
6915 const llvm::Triple &T = Target->getTriple();
6916 // Windows is LLP64 rather than LP64
6917 if (T.isOSWindows() && T.isArch64Bit())
6918 return LongLongTy;
6919 return LongTy;
6920 }
6921
getObjCInstanceTypeDecl()6922 TypedefDecl *ASTContext::getObjCInstanceTypeDecl() {
6923 if (!ObjCInstanceTypeDecl)
6924 ObjCInstanceTypeDecl =
6925 buildImplicitTypedef(getObjCIdType(), "instancetype");
6926 return ObjCInstanceTypeDecl;
6927 }
6928
6929 // This returns true if a type has been typedefed to BOOL:
6930 // typedef <type> BOOL;
isTypeTypedefedAsBOOL(QualType T)6931 static bool isTypeTypedefedAsBOOL(QualType T) {
6932 if (const auto *TT = dyn_cast<TypedefType>(T))
6933 if (IdentifierInfo *II = TT->getDecl()->getIdentifier())
6934 return II->isStr("BOOL");
6935
6936 return false;
6937 }
6938
6939 /// getObjCEncodingTypeSize returns size of type for objective-c encoding
6940 /// purpose.
getObjCEncodingTypeSize(QualType type) const6941 CharUnits ASTContext::getObjCEncodingTypeSize(QualType type) const {
6942 if (!type->isIncompleteArrayType() && type->isIncompleteType())
6943 return CharUnits::Zero();
6944
6945 CharUnits sz = getTypeSizeInChars(type);
6946
6947 // Make all integer and enum types at least as large as an int
6948 if (sz.isPositive() && type->isIntegralOrEnumerationType())
6949 sz = std::max(sz, getTypeSizeInChars(IntTy));
6950 // Treat arrays as pointers, since that's how they're passed in.
6951 else if (type->isArrayType())
6952 sz = getTypeSizeInChars(VoidPtrTy);
6953 return sz;
6954 }
6955
isMSStaticDataMemberInlineDefinition(const VarDecl * VD) const6956 bool ASTContext::isMSStaticDataMemberInlineDefinition(const VarDecl *VD) const {
6957 return getTargetInfo().getCXXABI().isMicrosoft() &&
6958 VD->isStaticDataMember() &&
6959 VD->getType()->isIntegralOrEnumerationType() &&
6960 !VD->getFirstDecl()->isOutOfLine() && VD->getFirstDecl()->hasInit();
6961 }
6962
6963 ASTContext::InlineVariableDefinitionKind
getInlineVariableDefinitionKind(const VarDecl * VD) const6964 ASTContext::getInlineVariableDefinitionKind(const VarDecl *VD) const {
6965 if (!VD->isInline())
6966 return InlineVariableDefinitionKind::None;
6967
6968 // In almost all cases, it's a weak definition.
6969 auto *First = VD->getFirstDecl();
6970 if (First->isInlineSpecified() || !First->isStaticDataMember())
6971 return InlineVariableDefinitionKind::Weak;
6972
6973 // If there's a file-context declaration in this translation unit, it's a
6974 // non-discardable definition.
6975 for (auto *D : VD->redecls())
6976 if (D->getLexicalDeclContext()->isFileContext() &&
6977 !D->isInlineSpecified() && (D->isConstexpr() || First->isConstexpr()))
6978 return InlineVariableDefinitionKind::Strong;
6979
6980 // If we've not seen one yet, we don't know.
6981 return InlineVariableDefinitionKind::WeakUnknown;
6982 }
6983
charUnitsToString(const CharUnits & CU)6984 static std::string charUnitsToString(const CharUnits &CU) {
6985 return llvm::itostr(CU.getQuantity());
6986 }
6987
6988 /// getObjCEncodingForBlock - Return the encoded type for this block
6989 /// declaration.
getObjCEncodingForBlock(const BlockExpr * Expr) const6990 std::string ASTContext::getObjCEncodingForBlock(const BlockExpr *Expr) const {
6991 std::string S;
6992
6993 const BlockDecl *Decl = Expr->getBlockDecl();
6994 QualType BlockTy =
6995 Expr->getType()->castAs<BlockPointerType>()->getPointeeType();
6996 QualType BlockReturnTy = BlockTy->castAs<FunctionType>()->getReturnType();
6997 // Encode result type.
6998 if (getLangOpts().EncodeExtendedBlockSig)
6999 getObjCEncodingForMethodParameter(Decl::OBJC_TQ_None, BlockReturnTy, S,
7000 true /*Extended*/);
7001 else
7002 getObjCEncodingForType(BlockReturnTy, S);
7003 // Compute size of all parameters.
7004 // Start with computing size of a pointer in number of bytes.
7005 // FIXME: There might(should) be a better way of doing this computation!
7006 CharUnits PtrSize = getTypeSizeInChars(VoidPtrTy);
7007 CharUnits ParmOffset = PtrSize;
7008 for (auto PI : Decl->parameters()) {
7009 QualType PType = PI->getType();
7010 CharUnits sz = getObjCEncodingTypeSize(PType);
7011 if (sz.isZero())
7012 continue;
7013 assert(sz.isPositive() && "BlockExpr - Incomplete param type");
7014 ParmOffset += sz;
7015 }
7016 // Size of the argument frame
7017 S += charUnitsToString(ParmOffset);
7018 // Block pointer and offset.
7019 S += "@?0";
7020
7021 // Argument types.
7022 ParmOffset = PtrSize;
7023 for (auto PVDecl : Decl->parameters()) {
7024 QualType PType = PVDecl->getOriginalType();
7025 if (const auto *AT =
7026 dyn_cast<ArrayType>(PType->getCanonicalTypeInternal())) {
7027 // Use array's original type only if it has known number of
7028 // elements.
7029 if (!isa<ConstantArrayType>(AT))
7030 PType = PVDecl->getType();
7031 } else if (PType->isFunctionType())
7032 PType = PVDecl->getType();
7033 if (getLangOpts().EncodeExtendedBlockSig)
7034 getObjCEncodingForMethodParameter(Decl::OBJC_TQ_None, PType,
7035 S, true /*Extended*/);
7036 else
7037 getObjCEncodingForType(PType, S);
7038 S += charUnitsToString(ParmOffset);
7039 ParmOffset += getObjCEncodingTypeSize(PType);
7040 }
7041
7042 return S;
7043 }
7044
7045 std::string
getObjCEncodingForFunctionDecl(const FunctionDecl * Decl) const7046 ASTContext::getObjCEncodingForFunctionDecl(const FunctionDecl *Decl) const {
7047 std::string S;
7048 // Encode result type.
7049 getObjCEncodingForType(Decl->getReturnType(), S);
7050 CharUnits ParmOffset;
7051 // Compute size of all parameters.
7052 for (auto PI : Decl->parameters()) {
7053 QualType PType = PI->getType();
7054 CharUnits sz = getObjCEncodingTypeSize(PType);
7055 if (sz.isZero())
7056 continue;
7057
7058 assert(sz.isPositive() &&
7059 "getObjCEncodingForFunctionDecl - Incomplete param type");
7060 ParmOffset += sz;
7061 }
7062 S += charUnitsToString(ParmOffset);
7063 ParmOffset = CharUnits::Zero();
7064
7065 // Argument types.
7066 for (auto PVDecl : Decl->parameters()) {
7067 QualType PType = PVDecl->getOriginalType();
7068 if (const auto *AT =
7069 dyn_cast<ArrayType>(PType->getCanonicalTypeInternal())) {
7070 // Use array's original type only if it has known number of
7071 // elements.
7072 if (!isa<ConstantArrayType>(AT))
7073 PType = PVDecl->getType();
7074 } else if (PType->isFunctionType())
7075 PType = PVDecl->getType();
7076 getObjCEncodingForType(PType, S);
7077 S += charUnitsToString(ParmOffset);
7078 ParmOffset += getObjCEncodingTypeSize(PType);
7079 }
7080
7081 return S;
7082 }
7083
7084 /// getObjCEncodingForMethodParameter - Return the encoded type for a single
7085 /// method parameter or return type. If Extended, include class names and
7086 /// block object types.
getObjCEncodingForMethodParameter(Decl::ObjCDeclQualifier QT,QualType T,std::string & S,bool Extended) const7087 void ASTContext::getObjCEncodingForMethodParameter(Decl::ObjCDeclQualifier QT,
7088 QualType T, std::string& S,
7089 bool Extended) const {
7090 // Encode type qualifier, 'in', 'inout', etc. for the parameter.
7091 getObjCEncodingForTypeQualifier(QT, S);
7092 // Encode parameter type.
7093 ObjCEncOptions Options = ObjCEncOptions()
7094 .setExpandPointedToStructures()
7095 .setExpandStructures()
7096 .setIsOutermostType();
7097 if (Extended)
7098 Options.setEncodeBlockParameters().setEncodeClassNames();
7099 getObjCEncodingForTypeImpl(T, S, Options, /*Field=*/nullptr);
7100 }
7101
7102 /// getObjCEncodingForMethodDecl - Return the encoded type for this method
7103 /// declaration.
getObjCEncodingForMethodDecl(const ObjCMethodDecl * Decl,bool Extended) const7104 std::string ASTContext::getObjCEncodingForMethodDecl(const ObjCMethodDecl *Decl,
7105 bool Extended) const {
7106 // FIXME: This is not very efficient.
7107 // Encode return type.
7108 std::string S;
7109 getObjCEncodingForMethodParameter(Decl->getObjCDeclQualifier(),
7110 Decl->getReturnType(), S, Extended);
7111 // Compute size of all parameters.
7112 // Start with computing size of a pointer in number of bytes.
7113 // FIXME: There might(should) be a better way of doing this computation!
7114 CharUnits PtrSize = getTypeSizeInChars(VoidPtrTy);
7115 // The first two arguments (self and _cmd) are pointers; account for
7116 // their size.
7117 CharUnits ParmOffset = 2 * PtrSize;
7118 for (ObjCMethodDecl::param_const_iterator PI = Decl->param_begin(),
7119 E = Decl->sel_param_end(); PI != E; ++PI) {
7120 QualType PType = (*PI)->getType();
7121 CharUnits sz = getObjCEncodingTypeSize(PType);
7122 if (sz.isZero())
7123 continue;
7124
7125 assert(sz.isPositive() &&
7126 "getObjCEncodingForMethodDecl - Incomplete param type");
7127 ParmOffset += sz;
7128 }
7129 S += charUnitsToString(ParmOffset);
7130 S += "@0:";
7131 S += charUnitsToString(PtrSize);
7132
7133 // Argument types.
7134 ParmOffset = 2 * PtrSize;
7135 for (ObjCMethodDecl::param_const_iterator PI = Decl->param_begin(),
7136 E = Decl->sel_param_end(); PI != E; ++PI) {
7137 const ParmVarDecl *PVDecl = *PI;
7138 QualType PType = PVDecl->getOriginalType();
7139 if (const auto *AT =
7140 dyn_cast<ArrayType>(PType->getCanonicalTypeInternal())) {
7141 // Use array's original type only if it has known number of
7142 // elements.
7143 if (!isa<ConstantArrayType>(AT))
7144 PType = PVDecl->getType();
7145 } else if (PType->isFunctionType())
7146 PType = PVDecl->getType();
7147 getObjCEncodingForMethodParameter(PVDecl->getObjCDeclQualifier(),
7148 PType, S, Extended);
7149 S += charUnitsToString(ParmOffset);
7150 ParmOffset += getObjCEncodingTypeSize(PType);
7151 }
7152
7153 return S;
7154 }
7155
7156 ObjCPropertyImplDecl *
getObjCPropertyImplDeclForPropertyDecl(const ObjCPropertyDecl * PD,const Decl * Container) const7157 ASTContext::getObjCPropertyImplDeclForPropertyDecl(
7158 const ObjCPropertyDecl *PD,
7159 const Decl *Container) const {
7160 if (!Container)
7161 return nullptr;
7162 if (const auto *CID = dyn_cast<ObjCCategoryImplDecl>(Container)) {
7163 for (auto *PID : CID->property_impls())
7164 if (PID->getPropertyDecl() == PD)
7165 return PID;
7166 } else {
7167 const auto *OID = cast<ObjCImplementationDecl>(Container);
7168 for (auto *PID : OID->property_impls())
7169 if (PID->getPropertyDecl() == PD)
7170 return PID;
7171 }
7172 return nullptr;
7173 }
7174
7175 /// getObjCEncodingForPropertyDecl - Return the encoded type for this
7176 /// property declaration. If non-NULL, Container must be either an
7177 /// ObjCCategoryImplDecl or ObjCImplementationDecl; it should only be
7178 /// NULL when getting encodings for protocol properties.
7179 /// Property attributes are stored as a comma-delimited C string. The simple
7180 /// attributes readonly and bycopy are encoded as single characters. The
7181 /// parametrized attributes, getter=name, setter=name, and ivar=name, are
7182 /// encoded as single characters, followed by an identifier. Property types
7183 /// are also encoded as a parametrized attribute. The characters used to encode
7184 /// these attributes are defined by the following enumeration:
7185 /// @code
7186 /// enum PropertyAttributes {
7187 /// kPropertyReadOnly = 'R', // property is read-only.
7188 /// kPropertyBycopy = 'C', // property is a copy of the value last assigned
7189 /// kPropertyByref = '&', // property is a reference to the value last assigned
7190 /// kPropertyDynamic = 'D', // property is dynamic
7191 /// kPropertyGetter = 'G', // followed by getter selector name
7192 /// kPropertySetter = 'S', // followed by setter selector name
7193 /// kPropertyInstanceVariable = 'V' // followed by instance variable name
7194 /// kPropertyType = 'T' // followed by old-style type encoding.
7195 /// kPropertyWeak = 'W' // 'weak' property
7196 /// kPropertyStrong = 'P' // property GC'able
7197 /// kPropertyNonAtomic = 'N' // property non-atomic
7198 /// };
7199 /// @endcode
7200 std::string
getObjCEncodingForPropertyDecl(const ObjCPropertyDecl * PD,const Decl * Container) const7201 ASTContext::getObjCEncodingForPropertyDecl(const ObjCPropertyDecl *PD,
7202 const Decl *Container) const {
7203 // Collect information from the property implementation decl(s).
7204 bool Dynamic = false;
7205 ObjCPropertyImplDecl *SynthesizePID = nullptr;
7206
7207 if (ObjCPropertyImplDecl *PropertyImpDecl =
7208 getObjCPropertyImplDeclForPropertyDecl(PD, Container)) {
7209 if (PropertyImpDecl->getPropertyImplementation() == ObjCPropertyImplDecl::Dynamic)
7210 Dynamic = true;
7211 else
7212 SynthesizePID = PropertyImpDecl;
7213 }
7214
7215 // FIXME: This is not very efficient.
7216 std::string S = "T";
7217
7218 // Encode result type.
7219 // GCC has some special rules regarding encoding of properties which
7220 // closely resembles encoding of ivars.
7221 getObjCEncodingForPropertyType(PD->getType(), S);
7222
7223 if (PD->isReadOnly()) {
7224 S += ",R";
7225 if (PD->getPropertyAttributes() & ObjCPropertyAttribute::kind_copy)
7226 S += ",C";
7227 if (PD->getPropertyAttributes() & ObjCPropertyAttribute::kind_retain)
7228 S += ",&";
7229 if (PD->getPropertyAttributes() & ObjCPropertyAttribute::kind_weak)
7230 S += ",W";
7231 } else {
7232 switch (PD->getSetterKind()) {
7233 case ObjCPropertyDecl::Assign: break;
7234 case ObjCPropertyDecl::Copy: S += ",C"; break;
7235 case ObjCPropertyDecl::Retain: S += ",&"; break;
7236 case ObjCPropertyDecl::Weak: S += ",W"; break;
7237 }
7238 }
7239
7240 // It really isn't clear at all what this means, since properties
7241 // are "dynamic by default".
7242 if (Dynamic)
7243 S += ",D";
7244
7245 if (PD->getPropertyAttributes() & ObjCPropertyAttribute::kind_nonatomic)
7246 S += ",N";
7247
7248 if (PD->getPropertyAttributes() & ObjCPropertyAttribute::kind_getter) {
7249 S += ",G";
7250 S += PD->getGetterName().getAsString();
7251 }
7252
7253 if (PD->getPropertyAttributes() & ObjCPropertyAttribute::kind_setter) {
7254 S += ",S";
7255 S += PD->getSetterName().getAsString();
7256 }
7257
7258 if (SynthesizePID) {
7259 const ObjCIvarDecl *OID = SynthesizePID->getPropertyIvarDecl();
7260 S += ",V";
7261 S += OID->getNameAsString();
7262 }
7263
7264 // FIXME: OBJCGC: weak & strong
7265 return S;
7266 }
7267
7268 /// getLegacyIntegralTypeEncoding -
7269 /// Another legacy compatibility encoding: 32-bit longs are encoded as
7270 /// 'l' or 'L' , but not always. For typedefs, we need to use
7271 /// 'i' or 'I' instead if encoding a struct field, or a pointer!
getLegacyIntegralTypeEncoding(QualType & PointeeTy) const7272 void ASTContext::getLegacyIntegralTypeEncoding (QualType &PointeeTy) const {
7273 if (isa<TypedefType>(PointeeTy.getTypePtr())) {
7274 if (const auto *BT = PointeeTy->getAs<BuiltinType>()) {
7275 if (BT->getKind() == BuiltinType::ULong && getIntWidth(PointeeTy) == 32)
7276 PointeeTy = UnsignedIntTy;
7277 else
7278 if (BT->getKind() == BuiltinType::Long && getIntWidth(PointeeTy) == 32)
7279 PointeeTy = IntTy;
7280 }
7281 }
7282 }
7283
getObjCEncodingForType(QualType T,std::string & S,const FieldDecl * Field,QualType * NotEncodedT) const7284 void ASTContext::getObjCEncodingForType(QualType T, std::string& S,
7285 const FieldDecl *Field,
7286 QualType *NotEncodedT) const {
7287 // We follow the behavior of gcc, expanding structures which are
7288 // directly pointed to, and expanding embedded structures. Note that
7289 // these rules are sufficient to prevent recursive encoding of the
7290 // same type.
7291 getObjCEncodingForTypeImpl(T, S,
7292 ObjCEncOptions()
7293 .setExpandPointedToStructures()
7294 .setExpandStructures()
7295 .setIsOutermostType(),
7296 Field, NotEncodedT);
7297 }
7298
getObjCEncodingForPropertyType(QualType T,std::string & S) const7299 void ASTContext::getObjCEncodingForPropertyType(QualType T,
7300 std::string& S) const {
7301 // Encode result type.
7302 // GCC has some special rules regarding encoding of properties which
7303 // closely resembles encoding of ivars.
7304 getObjCEncodingForTypeImpl(T, S,
7305 ObjCEncOptions()
7306 .setExpandPointedToStructures()
7307 .setExpandStructures()
7308 .setIsOutermostType()
7309 .setEncodingProperty(),
7310 /*Field=*/nullptr);
7311 }
7312
getObjCEncodingForPrimitiveType(const ASTContext * C,const BuiltinType * BT)7313 static char getObjCEncodingForPrimitiveType(const ASTContext *C,
7314 const BuiltinType *BT) {
7315 BuiltinType::Kind kind = BT->getKind();
7316 switch (kind) {
7317 case BuiltinType::Void: return 'v';
7318 case BuiltinType::Bool: return 'B';
7319 case BuiltinType::Char8:
7320 case BuiltinType::Char_U:
7321 case BuiltinType::UChar: return 'C';
7322 case BuiltinType::Char16:
7323 case BuiltinType::UShort: return 'S';
7324 case BuiltinType::Char32:
7325 case BuiltinType::UInt: return 'I';
7326 case BuiltinType::ULong:
7327 return C->getTargetInfo().getLongWidth() == 32 ? 'L' : 'Q';
7328 case BuiltinType::UInt128: return 'T';
7329 case BuiltinType::ULongLong: return 'Q';
7330 case BuiltinType::Char_S:
7331 case BuiltinType::SChar: return 'c';
7332 case BuiltinType::Short: return 's';
7333 case BuiltinType::WChar_S:
7334 case BuiltinType::WChar_U:
7335 case BuiltinType::Int: return 'i';
7336 case BuiltinType::Long:
7337 return C->getTargetInfo().getLongWidth() == 32 ? 'l' : 'q';
7338 case BuiltinType::LongLong: return 'q';
7339 case BuiltinType::Int128: return 't';
7340 case BuiltinType::Float: return 'f';
7341 case BuiltinType::Double: return 'd';
7342 case BuiltinType::LongDouble: return 'D';
7343 case BuiltinType::NullPtr: return '*'; // like char*
7344
7345 case BuiltinType::BFloat16:
7346 case BuiltinType::Float16:
7347 case BuiltinType::Float128:
7348 case BuiltinType::Ibm128:
7349 case BuiltinType::Half:
7350 case BuiltinType::ShortAccum:
7351 case BuiltinType::Accum:
7352 case BuiltinType::LongAccum:
7353 case BuiltinType::UShortAccum:
7354 case BuiltinType::UAccum:
7355 case BuiltinType::ULongAccum:
7356 case BuiltinType::ShortFract:
7357 case BuiltinType::Fract:
7358 case BuiltinType::LongFract:
7359 case BuiltinType::UShortFract:
7360 case BuiltinType::UFract:
7361 case BuiltinType::ULongFract:
7362 case BuiltinType::SatShortAccum:
7363 case BuiltinType::SatAccum:
7364 case BuiltinType::SatLongAccum:
7365 case BuiltinType::SatUShortAccum:
7366 case BuiltinType::SatUAccum:
7367 case BuiltinType::SatULongAccum:
7368 case BuiltinType::SatShortFract:
7369 case BuiltinType::SatFract:
7370 case BuiltinType::SatLongFract:
7371 case BuiltinType::SatUShortFract:
7372 case BuiltinType::SatUFract:
7373 case BuiltinType::SatULongFract:
7374 // FIXME: potentially need @encodes for these!
7375 return ' ';
7376
7377 #define SVE_TYPE(Name, Id, SingletonId) \
7378 case BuiltinType::Id:
7379 #include "clang/Basic/AArch64SVEACLETypes.def"
7380 #define RVV_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
7381 #include "clang/Basic/RISCVVTypes.def"
7382 {
7383 DiagnosticsEngine &Diags = C->getDiagnostics();
7384 unsigned DiagID = Diags.getCustomDiagID(DiagnosticsEngine::Error,
7385 "cannot yet @encode type %0");
7386 Diags.Report(DiagID) << BT->getName(C->getPrintingPolicy());
7387 return ' ';
7388 }
7389
7390 case BuiltinType::ObjCId:
7391 case BuiltinType::ObjCClass:
7392 case BuiltinType::ObjCSel:
7393 llvm_unreachable("@encoding ObjC primitive type");
7394
7395 // OpenCL and placeholder types don't need @encodings.
7396 #define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
7397 case BuiltinType::Id:
7398 #include "clang/Basic/OpenCLImageTypes.def"
7399 #define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
7400 case BuiltinType::Id:
7401 #include "clang/Basic/OpenCLExtensionTypes.def"
7402 case BuiltinType::OCLEvent:
7403 case BuiltinType::OCLClkEvent:
7404 case BuiltinType::OCLQueue:
7405 case BuiltinType::OCLReserveID:
7406 case BuiltinType::OCLSampler:
7407 case BuiltinType::Dependent:
7408 #define PPC_VECTOR_TYPE(Name, Id, Size) \
7409 case BuiltinType::Id:
7410 #include "clang/Basic/PPCTypes.def"
7411 #define BUILTIN_TYPE(KIND, ID)
7412 #define PLACEHOLDER_TYPE(KIND, ID) \
7413 case BuiltinType::KIND:
7414 #include "clang/AST/BuiltinTypes.def"
7415 llvm_unreachable("invalid builtin type for @encode");
7416 }
7417 llvm_unreachable("invalid BuiltinType::Kind value");
7418 }
7419
ObjCEncodingForEnumType(const ASTContext * C,const EnumType * ET)7420 static char ObjCEncodingForEnumType(const ASTContext *C, const EnumType *ET) {
7421 EnumDecl *Enum = ET->getDecl();
7422
7423 // The encoding of an non-fixed enum type is always 'i', regardless of size.
7424 if (!Enum->isFixed())
7425 return 'i';
7426
7427 // The encoding of a fixed enum type matches its fixed underlying type.
7428 const auto *BT = Enum->getIntegerType()->castAs<BuiltinType>();
7429 return getObjCEncodingForPrimitiveType(C, BT);
7430 }
7431
EncodeBitField(const ASTContext * Ctx,std::string & S,QualType T,const FieldDecl * FD)7432 static void EncodeBitField(const ASTContext *Ctx, std::string& S,
7433 QualType T, const FieldDecl *FD) {
7434 assert(FD->isBitField() && "not a bitfield - getObjCEncodingForTypeImpl");
7435 S += 'b';
7436 // The NeXT runtime encodes bit fields as b followed by the number of bits.
7437 // The GNU runtime requires more information; bitfields are encoded as b,
7438 // then the offset (in bits) of the first element, then the type of the
7439 // bitfield, then the size in bits. For example, in this structure:
7440 //
7441 // struct
7442 // {
7443 // int integer;
7444 // int flags:2;
7445 // };
7446 // On a 32-bit system, the encoding for flags would be b2 for the NeXT
7447 // runtime, but b32i2 for the GNU runtime. The reason for this extra
7448 // information is not especially sensible, but we're stuck with it for
7449 // compatibility with GCC, although providing it breaks anything that
7450 // actually uses runtime introspection and wants to work on both runtimes...
7451 if (Ctx->getLangOpts().ObjCRuntime.isGNUFamily()) {
7452 uint64_t Offset;
7453
7454 if (const auto *IVD = dyn_cast<ObjCIvarDecl>(FD)) {
7455 Offset = Ctx->lookupFieldBitOffset(IVD->getContainingInterface(), nullptr,
7456 IVD);
7457 } else {
7458 const RecordDecl *RD = FD->getParent();
7459 const ASTRecordLayout &RL = Ctx->getASTRecordLayout(RD);
7460 Offset = RL.getFieldOffset(FD->getFieldIndex());
7461 }
7462
7463 S += llvm::utostr(Offset);
7464
7465 if (const auto *ET = T->getAs<EnumType>())
7466 S += ObjCEncodingForEnumType(Ctx, ET);
7467 else {
7468 const auto *BT = T->castAs<BuiltinType>();
7469 S += getObjCEncodingForPrimitiveType(Ctx, BT);
7470 }
7471 }
7472 S += llvm::utostr(FD->getBitWidthValue(*Ctx));
7473 }
7474
7475 // Helper function for determining whether the encoded type string would include
7476 // a template specialization type.
hasTemplateSpecializationInEncodedString(const Type * T,bool VisitBasesAndFields)7477 static bool hasTemplateSpecializationInEncodedString(const Type *T,
7478 bool VisitBasesAndFields) {
7479 T = T->getBaseElementTypeUnsafe();
7480
7481 if (auto *PT = T->getAs<PointerType>())
7482 return hasTemplateSpecializationInEncodedString(
7483 PT->getPointeeType().getTypePtr(), false);
7484
7485 auto *CXXRD = T->getAsCXXRecordDecl();
7486
7487 if (!CXXRD)
7488 return false;
7489
7490 if (isa<ClassTemplateSpecializationDecl>(CXXRD))
7491 return true;
7492
7493 if (!CXXRD->hasDefinition() || !VisitBasesAndFields)
7494 return false;
7495
7496 for (auto B : CXXRD->bases())
7497 if (hasTemplateSpecializationInEncodedString(B.getType().getTypePtr(),
7498 true))
7499 return true;
7500
7501 for (auto *FD : CXXRD->fields())
7502 if (hasTemplateSpecializationInEncodedString(FD->getType().getTypePtr(),
7503 true))
7504 return true;
7505
7506 return false;
7507 }
7508
7509 // FIXME: Use SmallString for accumulating string.
getObjCEncodingForTypeImpl(QualType T,std::string & S,const ObjCEncOptions Options,const FieldDecl * FD,QualType * NotEncodedT) const7510 void ASTContext::getObjCEncodingForTypeImpl(QualType T, std::string &S,
7511 const ObjCEncOptions Options,
7512 const FieldDecl *FD,
7513 QualType *NotEncodedT) const {
7514 CanQualType CT = getCanonicalType(T);
7515 switch (CT->getTypeClass()) {
7516 case Type::Builtin:
7517 case Type::Enum:
7518 if (FD && FD->isBitField())
7519 return EncodeBitField(this, S, T, FD);
7520 if (const auto *BT = dyn_cast<BuiltinType>(CT))
7521 S += getObjCEncodingForPrimitiveType(this, BT);
7522 else
7523 S += ObjCEncodingForEnumType(this, cast<EnumType>(CT));
7524 return;
7525
7526 case Type::Complex:
7527 S += 'j';
7528 getObjCEncodingForTypeImpl(T->castAs<ComplexType>()->getElementType(), S,
7529 ObjCEncOptions(),
7530 /*Field=*/nullptr);
7531 return;
7532
7533 case Type::Atomic:
7534 S += 'A';
7535 getObjCEncodingForTypeImpl(T->castAs<AtomicType>()->getValueType(), S,
7536 ObjCEncOptions(),
7537 /*Field=*/nullptr);
7538 return;
7539
7540 // encoding for pointer or reference types.
7541 case Type::Pointer:
7542 case Type::LValueReference:
7543 case Type::RValueReference: {
7544 QualType PointeeTy;
7545 if (isa<PointerType>(CT)) {
7546 const auto *PT = T->castAs<PointerType>();
7547 if (PT->isObjCSelType()) {
7548 S += ':';
7549 return;
7550 }
7551 PointeeTy = PT->getPointeeType();
7552 } else {
7553 PointeeTy = T->castAs<ReferenceType>()->getPointeeType();
7554 }
7555
7556 bool isReadOnly = false;
7557 // For historical/compatibility reasons, the read-only qualifier of the
7558 // pointee gets emitted _before_ the '^'. The read-only qualifier of
7559 // the pointer itself gets ignored, _unless_ we are looking at a typedef!
7560 // Also, do not emit the 'r' for anything but the outermost type!
7561 if (isa<TypedefType>(T.getTypePtr())) {
7562 if (Options.IsOutermostType() && T.isConstQualified()) {
7563 isReadOnly = true;
7564 S += 'r';
7565 }
7566 } else if (Options.IsOutermostType()) {
7567 QualType P = PointeeTy;
7568 while (auto PT = P->getAs<PointerType>())
7569 P = PT->getPointeeType();
7570 if (P.isConstQualified()) {
7571 isReadOnly = true;
7572 S += 'r';
7573 }
7574 }
7575 if (isReadOnly) {
7576 // Another legacy compatibility encoding. Some ObjC qualifier and type
7577 // combinations need to be rearranged.
7578 // Rewrite "in const" from "nr" to "rn"
7579 if (StringRef(S).endswith("nr"))
7580 S.replace(S.end()-2, S.end(), "rn");
7581 }
7582
7583 if (PointeeTy->isCharType()) {
7584 // char pointer types should be encoded as '*' unless it is a
7585 // type that has been typedef'd to 'BOOL'.
7586 if (!isTypeTypedefedAsBOOL(PointeeTy)) {
7587 S += '*';
7588 return;
7589 }
7590 } else if (const auto *RTy = PointeeTy->getAs<RecordType>()) {
7591 // GCC binary compat: Need to convert "struct objc_class *" to "#".
7592 if (RTy->getDecl()->getIdentifier() == &Idents.get("objc_class")) {
7593 S += '#';
7594 return;
7595 }
7596 // GCC binary compat: Need to convert "struct objc_object *" to "@".
7597 if (RTy->getDecl()->getIdentifier() == &Idents.get("objc_object")) {
7598 S += '@';
7599 return;
7600 }
7601 // If the encoded string for the class includes template names, just emit
7602 // "^v" for pointers to the class.
7603 if (getLangOpts().CPlusPlus &&
7604 (!getLangOpts().EncodeCXXClassTemplateSpec &&
7605 hasTemplateSpecializationInEncodedString(
7606 RTy, Options.ExpandPointedToStructures()))) {
7607 S += "^v";
7608 return;
7609 }
7610 // fall through...
7611 }
7612 S += '^';
7613 getLegacyIntegralTypeEncoding(PointeeTy);
7614
7615 ObjCEncOptions NewOptions;
7616 if (Options.ExpandPointedToStructures())
7617 NewOptions.setExpandStructures();
7618 getObjCEncodingForTypeImpl(PointeeTy, S, NewOptions,
7619 /*Field=*/nullptr, NotEncodedT);
7620 return;
7621 }
7622
7623 case Type::ConstantArray:
7624 case Type::IncompleteArray:
7625 case Type::VariableArray: {
7626 const auto *AT = cast<ArrayType>(CT);
7627
7628 if (isa<IncompleteArrayType>(AT) && !Options.IsStructField()) {
7629 // Incomplete arrays are encoded as a pointer to the array element.
7630 S += '^';
7631
7632 getObjCEncodingForTypeImpl(
7633 AT->getElementType(), S,
7634 Options.keepingOnly(ObjCEncOptions().setExpandStructures()), FD);
7635 } else {
7636 S += '[';
7637
7638 if (const auto *CAT = dyn_cast<ConstantArrayType>(AT))
7639 S += llvm::utostr(CAT->getSize().getZExtValue());
7640 else {
7641 //Variable length arrays are encoded as a regular array with 0 elements.
7642 assert((isa<VariableArrayType>(AT) || isa<IncompleteArrayType>(AT)) &&
7643 "Unknown array type!");
7644 S += '0';
7645 }
7646
7647 getObjCEncodingForTypeImpl(
7648 AT->getElementType(), S,
7649 Options.keepingOnly(ObjCEncOptions().setExpandStructures()), FD,
7650 NotEncodedT);
7651 S += ']';
7652 }
7653 return;
7654 }
7655
7656 case Type::FunctionNoProto:
7657 case Type::FunctionProto:
7658 S += '?';
7659 return;
7660
7661 case Type::Record: {
7662 RecordDecl *RDecl = cast<RecordType>(CT)->getDecl();
7663 S += RDecl->isUnion() ? '(' : '{';
7664 // Anonymous structures print as '?'
7665 if (const IdentifierInfo *II = RDecl->getIdentifier()) {
7666 S += II->getName();
7667 if (const auto *Spec = dyn_cast<ClassTemplateSpecializationDecl>(RDecl)) {
7668 const TemplateArgumentList &TemplateArgs = Spec->getTemplateArgs();
7669 llvm::raw_string_ostream OS(S);
7670 printTemplateArgumentList(OS, TemplateArgs.asArray(),
7671 getPrintingPolicy());
7672 }
7673 } else {
7674 S += '?';
7675 }
7676 if (Options.ExpandStructures()) {
7677 S += '=';
7678 if (!RDecl->isUnion()) {
7679 getObjCEncodingForStructureImpl(RDecl, S, FD, true, NotEncodedT);
7680 } else {
7681 for (const auto *Field : RDecl->fields()) {
7682 if (FD) {
7683 S += '"';
7684 S += Field->getNameAsString();
7685 S += '"';
7686 }
7687
7688 // Special case bit-fields.
7689 if (Field->isBitField()) {
7690 getObjCEncodingForTypeImpl(Field->getType(), S,
7691 ObjCEncOptions().setExpandStructures(),
7692 Field);
7693 } else {
7694 QualType qt = Field->getType();
7695 getLegacyIntegralTypeEncoding(qt);
7696 getObjCEncodingForTypeImpl(
7697 qt, S,
7698 ObjCEncOptions().setExpandStructures().setIsStructField(), FD,
7699 NotEncodedT);
7700 }
7701 }
7702 }
7703 }
7704 S += RDecl->isUnion() ? ')' : '}';
7705 return;
7706 }
7707
7708 case Type::BlockPointer: {
7709 const auto *BT = T->castAs<BlockPointerType>();
7710 S += "@?"; // Unlike a pointer-to-function, which is "^?".
7711 if (Options.EncodeBlockParameters()) {
7712 const auto *FT = BT->getPointeeType()->castAs<FunctionType>();
7713
7714 S += '<';
7715 // Block return type
7716 getObjCEncodingForTypeImpl(FT->getReturnType(), S,
7717 Options.forComponentType(), FD, NotEncodedT);
7718 // Block self
7719 S += "@?";
7720 // Block parameters
7721 if (const auto *FPT = dyn_cast<FunctionProtoType>(FT)) {
7722 for (const auto &I : FPT->param_types())
7723 getObjCEncodingForTypeImpl(I, S, Options.forComponentType(), FD,
7724 NotEncodedT);
7725 }
7726 S += '>';
7727 }
7728 return;
7729 }
7730
7731 case Type::ObjCObject: {
7732 // hack to match legacy encoding of *id and *Class
7733 QualType Ty = getObjCObjectPointerType(CT);
7734 if (Ty->isObjCIdType()) {
7735 S += "{objc_object=}";
7736 return;
7737 }
7738 else if (Ty->isObjCClassType()) {
7739 S += "{objc_class=}";
7740 return;
7741 }
7742 // TODO: Double check to make sure this intentionally falls through.
7743 LLVM_FALLTHROUGH;
7744 }
7745
7746 case Type::ObjCInterface: {
7747 // Ignore protocol qualifiers when mangling at this level.
7748 // @encode(class_name)
7749 ObjCInterfaceDecl *OI = T->castAs<ObjCObjectType>()->getInterface();
7750 S += '{';
7751 S += OI->getObjCRuntimeNameAsString();
7752 if (Options.ExpandStructures()) {
7753 S += '=';
7754 SmallVector<const ObjCIvarDecl*, 32> Ivars;
7755 DeepCollectObjCIvars(OI, true, Ivars);
7756 for (unsigned i = 0, e = Ivars.size(); i != e; ++i) {
7757 const FieldDecl *Field = Ivars[i];
7758 if (Field->isBitField())
7759 getObjCEncodingForTypeImpl(Field->getType(), S,
7760 ObjCEncOptions().setExpandStructures(),
7761 Field);
7762 else
7763 getObjCEncodingForTypeImpl(Field->getType(), S,
7764 ObjCEncOptions().setExpandStructures(), FD,
7765 NotEncodedT);
7766 }
7767 }
7768 S += '}';
7769 return;
7770 }
7771
7772 case Type::ObjCObjectPointer: {
7773 const auto *OPT = T->castAs<ObjCObjectPointerType>();
7774 if (OPT->isObjCIdType()) {
7775 S += '@';
7776 return;
7777 }
7778
7779 if (OPT->isObjCClassType() || OPT->isObjCQualifiedClassType()) {
7780 // FIXME: Consider if we need to output qualifiers for 'Class<p>'.
7781 // Since this is a binary compatibility issue, need to consult with
7782 // runtime folks. Fortunately, this is a *very* obscure construct.
7783 S += '#';
7784 return;
7785 }
7786
7787 if (OPT->isObjCQualifiedIdType()) {
7788 getObjCEncodingForTypeImpl(
7789 getObjCIdType(), S,
7790 Options.keepingOnly(ObjCEncOptions()
7791 .setExpandPointedToStructures()
7792 .setExpandStructures()),
7793 FD);
7794 if (FD || Options.EncodingProperty() || Options.EncodeClassNames()) {
7795 // Note that we do extended encoding of protocol qualifier list
7796 // Only when doing ivar or property encoding.
7797 S += '"';
7798 for (const auto *I : OPT->quals()) {
7799 S += '<';
7800 S += I->getObjCRuntimeNameAsString();
7801 S += '>';
7802 }
7803 S += '"';
7804 }
7805 return;
7806 }
7807
7808 S += '@';
7809 if (OPT->getInterfaceDecl() &&
7810 (FD || Options.EncodingProperty() || Options.EncodeClassNames())) {
7811 S += '"';
7812 S += OPT->getInterfaceDecl()->getObjCRuntimeNameAsString();
7813 for (const auto *I : OPT->quals()) {
7814 S += '<';
7815 S += I->getObjCRuntimeNameAsString();
7816 S += '>';
7817 }
7818 S += '"';
7819 }
7820 return;
7821 }
7822
7823 // gcc just blithely ignores member pointers.
7824 // FIXME: we should do better than that. 'M' is available.
7825 case Type::MemberPointer:
7826 // This matches gcc's encoding, even though technically it is insufficient.
7827 //FIXME. We should do a better job than gcc.
7828 case Type::Vector:
7829 case Type::ExtVector:
7830 // Until we have a coherent encoding of these three types, issue warning.
7831 if (NotEncodedT)
7832 *NotEncodedT = T;
7833 return;
7834
7835 case Type::ConstantMatrix:
7836 if (NotEncodedT)
7837 *NotEncodedT = T;
7838 return;
7839
7840 // We could see an undeduced auto type here during error recovery.
7841 // Just ignore it.
7842 case Type::Auto:
7843 case Type::DeducedTemplateSpecialization:
7844 return;
7845
7846 case Type::Pipe:
7847 case Type::ExtInt:
7848 #define ABSTRACT_TYPE(KIND, BASE)
7849 #define TYPE(KIND, BASE)
7850 #define DEPENDENT_TYPE(KIND, BASE) \
7851 case Type::KIND:
7852 #define NON_CANONICAL_TYPE(KIND, BASE) \
7853 case Type::KIND:
7854 #define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(KIND, BASE) \
7855 case Type::KIND:
7856 #include "clang/AST/TypeNodes.inc"
7857 llvm_unreachable("@encode for dependent type!");
7858 }
7859 llvm_unreachable("bad type kind!");
7860 }
7861
getObjCEncodingForStructureImpl(RecordDecl * RDecl,std::string & S,const FieldDecl * FD,bool includeVBases,QualType * NotEncodedT) const7862 void ASTContext::getObjCEncodingForStructureImpl(RecordDecl *RDecl,
7863 std::string &S,
7864 const FieldDecl *FD,
7865 bool includeVBases,
7866 QualType *NotEncodedT) const {
7867 assert(RDecl && "Expected non-null RecordDecl");
7868 assert(!RDecl->isUnion() && "Should not be called for unions");
7869 if (!RDecl->getDefinition() || RDecl->getDefinition()->isInvalidDecl())
7870 return;
7871
7872 const auto *CXXRec = dyn_cast<CXXRecordDecl>(RDecl);
7873 std::multimap<uint64_t, NamedDecl *> FieldOrBaseOffsets;
7874 const ASTRecordLayout &layout = getASTRecordLayout(RDecl);
7875
7876 if (CXXRec) {
7877 for (const auto &BI : CXXRec->bases()) {
7878 if (!BI.isVirtual()) {
7879 CXXRecordDecl *base = BI.getType()->getAsCXXRecordDecl();
7880 if (base->isEmpty())
7881 continue;
7882 uint64_t offs = toBits(layout.getBaseClassOffset(base));
7883 FieldOrBaseOffsets.insert(FieldOrBaseOffsets.upper_bound(offs),
7884 std::make_pair(offs, base));
7885 }
7886 }
7887 }
7888
7889 unsigned i = 0;
7890 for (FieldDecl *Field : RDecl->fields()) {
7891 if (!Field->isZeroLengthBitField(*this) && Field->isZeroSize(*this))
7892 continue;
7893 uint64_t offs = layout.getFieldOffset(i);
7894 FieldOrBaseOffsets.insert(FieldOrBaseOffsets.upper_bound(offs),
7895 std::make_pair(offs, Field));
7896 ++i;
7897 }
7898
7899 if (CXXRec && includeVBases) {
7900 for (const auto &BI : CXXRec->vbases()) {
7901 CXXRecordDecl *base = BI.getType()->getAsCXXRecordDecl();
7902 if (base->isEmpty())
7903 continue;
7904 uint64_t offs = toBits(layout.getVBaseClassOffset(base));
7905 if (offs >= uint64_t(toBits(layout.getNonVirtualSize())) &&
7906 FieldOrBaseOffsets.find(offs) == FieldOrBaseOffsets.end())
7907 FieldOrBaseOffsets.insert(FieldOrBaseOffsets.end(),
7908 std::make_pair(offs, base));
7909 }
7910 }
7911
7912 CharUnits size;
7913 if (CXXRec) {
7914 size = includeVBases ? layout.getSize() : layout.getNonVirtualSize();
7915 } else {
7916 size = layout.getSize();
7917 }
7918
7919 #ifndef NDEBUG
7920 uint64_t CurOffs = 0;
7921 #endif
7922 std::multimap<uint64_t, NamedDecl *>::iterator
7923 CurLayObj = FieldOrBaseOffsets.begin();
7924
7925 if (CXXRec && CXXRec->isDynamicClass() &&
7926 (CurLayObj == FieldOrBaseOffsets.end() || CurLayObj->first != 0)) {
7927 if (FD) {
7928 S += "\"_vptr$";
7929 std::string recname = CXXRec->getNameAsString();
7930 if (recname.empty()) recname = "?";
7931 S += recname;
7932 S += '"';
7933 }
7934 S += "^^?";
7935 #ifndef NDEBUG
7936 CurOffs += getTypeSize(VoidPtrTy);
7937 #endif
7938 }
7939
7940 if (!RDecl->hasFlexibleArrayMember()) {
7941 // Mark the end of the structure.
7942 uint64_t offs = toBits(size);
7943 FieldOrBaseOffsets.insert(FieldOrBaseOffsets.upper_bound(offs),
7944 std::make_pair(offs, nullptr));
7945 }
7946
7947 for (; CurLayObj != FieldOrBaseOffsets.end(); ++CurLayObj) {
7948 #ifndef NDEBUG
7949 assert(CurOffs <= CurLayObj->first);
7950 if (CurOffs < CurLayObj->first) {
7951 uint64_t padding = CurLayObj->first - CurOffs;
7952 // FIXME: There doesn't seem to be a way to indicate in the encoding that
7953 // packing/alignment of members is different that normal, in which case
7954 // the encoding will be out-of-sync with the real layout.
7955 // If the runtime switches to just consider the size of types without
7956 // taking into account alignment, we could make padding explicit in the
7957 // encoding (e.g. using arrays of chars). The encoding strings would be
7958 // longer then though.
7959 CurOffs += padding;
7960 }
7961 #endif
7962
7963 NamedDecl *dcl = CurLayObj->second;
7964 if (!dcl)
7965 break; // reached end of structure.
7966
7967 if (auto *base = dyn_cast<CXXRecordDecl>(dcl)) {
7968 // We expand the bases without their virtual bases since those are going
7969 // in the initial structure. Note that this differs from gcc which
7970 // expands virtual bases each time one is encountered in the hierarchy,
7971 // making the encoding type bigger than it really is.
7972 getObjCEncodingForStructureImpl(base, S, FD, /*includeVBases*/false,
7973 NotEncodedT);
7974 assert(!base->isEmpty());
7975 #ifndef NDEBUG
7976 CurOffs += toBits(getASTRecordLayout(base).getNonVirtualSize());
7977 #endif
7978 } else {
7979 const auto *field = cast<FieldDecl>(dcl);
7980 if (FD) {
7981 S += '"';
7982 S += field->getNameAsString();
7983 S += '"';
7984 }
7985
7986 if (field->isBitField()) {
7987 EncodeBitField(this, S, field->getType(), field);
7988 #ifndef NDEBUG
7989 CurOffs += field->getBitWidthValue(*this);
7990 #endif
7991 } else {
7992 QualType qt = field->getType();
7993 getLegacyIntegralTypeEncoding(qt);
7994 getObjCEncodingForTypeImpl(
7995 qt, S, ObjCEncOptions().setExpandStructures().setIsStructField(),
7996 FD, NotEncodedT);
7997 #ifndef NDEBUG
7998 CurOffs += getTypeSize(field->getType());
7999 #endif
8000 }
8001 }
8002 }
8003 }
8004
getObjCEncodingForTypeQualifier(Decl::ObjCDeclQualifier QT,std::string & S) const8005 void ASTContext::getObjCEncodingForTypeQualifier(Decl::ObjCDeclQualifier QT,
8006 std::string& S) const {
8007 if (QT & Decl::OBJC_TQ_In)
8008 S += 'n';
8009 if (QT & Decl::OBJC_TQ_Inout)
8010 S += 'N';
8011 if (QT & Decl::OBJC_TQ_Out)
8012 S += 'o';
8013 if (QT & Decl::OBJC_TQ_Bycopy)
8014 S += 'O';
8015 if (QT & Decl::OBJC_TQ_Byref)
8016 S += 'R';
8017 if (QT & Decl::OBJC_TQ_Oneway)
8018 S += 'V';
8019 }
8020
getObjCIdDecl() const8021 TypedefDecl *ASTContext::getObjCIdDecl() const {
8022 if (!ObjCIdDecl) {
8023 QualType T = getObjCObjectType(ObjCBuiltinIdTy, {}, {});
8024 T = getObjCObjectPointerType(T);
8025 ObjCIdDecl = buildImplicitTypedef(T, "id");
8026 }
8027 return ObjCIdDecl;
8028 }
8029
getObjCSelDecl() const8030 TypedefDecl *ASTContext::getObjCSelDecl() const {
8031 if (!ObjCSelDecl) {
8032 QualType T = getPointerType(ObjCBuiltinSelTy);
8033 ObjCSelDecl = buildImplicitTypedef(T, "SEL");
8034 }
8035 return ObjCSelDecl;
8036 }
8037
getObjCClassDecl() const8038 TypedefDecl *ASTContext::getObjCClassDecl() const {
8039 if (!ObjCClassDecl) {
8040 QualType T = getObjCObjectType(ObjCBuiltinClassTy, {}, {});
8041 T = getObjCObjectPointerType(T);
8042 ObjCClassDecl = buildImplicitTypedef(T, "Class");
8043 }
8044 return ObjCClassDecl;
8045 }
8046
getObjCProtocolDecl() const8047 ObjCInterfaceDecl *ASTContext::getObjCProtocolDecl() const {
8048 if (!ObjCProtocolClassDecl) {
8049 ObjCProtocolClassDecl
8050 = ObjCInterfaceDecl::Create(*this, getTranslationUnitDecl(),
8051 SourceLocation(),
8052 &Idents.get("Protocol"),
8053 /*typeParamList=*/nullptr,
8054 /*PrevDecl=*/nullptr,
8055 SourceLocation(), true);
8056 }
8057
8058 return ObjCProtocolClassDecl;
8059 }
8060
8061 //===----------------------------------------------------------------------===//
8062 // __builtin_va_list Construction Functions
8063 //===----------------------------------------------------------------------===//
8064
CreateCharPtrNamedVaListDecl(const ASTContext * Context,StringRef Name)8065 static TypedefDecl *CreateCharPtrNamedVaListDecl(const ASTContext *Context,
8066 StringRef Name) {
8067 // typedef char* __builtin[_ms]_va_list;
8068 QualType T = Context->getPointerType(Context->CharTy);
8069 return Context->buildImplicitTypedef(T, Name);
8070 }
8071
CreateMSVaListDecl(const ASTContext * Context)8072 static TypedefDecl *CreateMSVaListDecl(const ASTContext *Context) {
8073 return CreateCharPtrNamedVaListDecl(Context, "__builtin_ms_va_list");
8074 }
8075
CreateCharPtrBuiltinVaListDecl(const ASTContext * Context)8076 static TypedefDecl *CreateCharPtrBuiltinVaListDecl(const ASTContext *Context) {
8077 return CreateCharPtrNamedVaListDecl(Context, "__builtin_va_list");
8078 }
8079
CreateVoidPtrBuiltinVaListDecl(const ASTContext * Context)8080 static TypedefDecl *CreateVoidPtrBuiltinVaListDecl(const ASTContext *Context) {
8081 // typedef void* __builtin_va_list;
8082 QualType T = Context->getPointerType(Context->VoidTy);
8083 return Context->buildImplicitTypedef(T, "__builtin_va_list");
8084 }
8085
8086 static TypedefDecl *
CreateAArch64ABIBuiltinVaListDecl(const ASTContext * Context)8087 CreateAArch64ABIBuiltinVaListDecl(const ASTContext *Context) {
8088 RecordDecl *VaListTagDecl = Context->buildImplicitRecord("__va_list");
8089 // namespace std { struct __va_list {
8090 // Note that we create the namespace even in C. This is intentional so that
8091 // the type is consistent between C and C++, which is important in cases where
8092 // the types need to match between translation units (e.g. with
8093 // -fsanitize=cfi-icall). Ideally we wouldn't have created this namespace at
8094 // all, but it's now part of the ABI (e.g. in mangled names), so we can't
8095 // change it.
8096 auto *NS = NamespaceDecl::Create(
8097 const_cast<ASTContext &>(*Context), Context->getTranslationUnitDecl(),
8098 /*Inline*/ false, SourceLocation(), SourceLocation(),
8099 &Context->Idents.get("std"),
8100 /*PrevDecl*/ nullptr);
8101 NS->setImplicit();
8102 VaListTagDecl->setDeclContext(NS);
8103
8104 VaListTagDecl->startDefinition();
8105
8106 const size_t NumFields = 5;
8107 QualType FieldTypes[NumFields];
8108 const char *FieldNames[NumFields];
8109
8110 // void *__stack;
8111 FieldTypes[0] = Context->getPointerType(Context->VoidTy);
8112 FieldNames[0] = "__stack";
8113
8114 // void *__gr_top;
8115 FieldTypes[1] = Context->getPointerType(Context->VoidTy);
8116 FieldNames[1] = "__gr_top";
8117
8118 // void *__vr_top;
8119 FieldTypes[2] = Context->getPointerType(Context->VoidTy);
8120 FieldNames[2] = "__vr_top";
8121
8122 // int __gr_offs;
8123 FieldTypes[3] = Context->IntTy;
8124 FieldNames[3] = "__gr_offs";
8125
8126 // int __vr_offs;
8127 FieldTypes[4] = Context->IntTy;
8128 FieldNames[4] = "__vr_offs";
8129
8130 // Create fields
8131 for (unsigned i = 0; i < NumFields; ++i) {
8132 FieldDecl *Field = FieldDecl::Create(const_cast<ASTContext &>(*Context),
8133 VaListTagDecl,
8134 SourceLocation(),
8135 SourceLocation(),
8136 &Context->Idents.get(FieldNames[i]),
8137 FieldTypes[i], /*TInfo=*/nullptr,
8138 /*BitWidth=*/nullptr,
8139 /*Mutable=*/false,
8140 ICIS_NoInit);
8141 Field->setAccess(AS_public);
8142 VaListTagDecl->addDecl(Field);
8143 }
8144 VaListTagDecl->completeDefinition();
8145 Context->VaListTagDecl = VaListTagDecl;
8146 QualType VaListTagType = Context->getRecordType(VaListTagDecl);
8147
8148 // } __builtin_va_list;
8149 return Context->buildImplicitTypedef(VaListTagType, "__builtin_va_list");
8150 }
8151
CreatePowerABIBuiltinVaListDecl(const ASTContext * Context)8152 static TypedefDecl *CreatePowerABIBuiltinVaListDecl(const ASTContext *Context) {
8153 // typedef struct __va_list_tag {
8154 RecordDecl *VaListTagDecl;
8155
8156 VaListTagDecl = Context->buildImplicitRecord("__va_list_tag");
8157 VaListTagDecl->startDefinition();
8158
8159 const size_t NumFields = 5;
8160 QualType FieldTypes[NumFields];
8161 const char *FieldNames[NumFields];
8162
8163 // unsigned char gpr;
8164 FieldTypes[0] = Context->UnsignedCharTy;
8165 FieldNames[0] = "gpr";
8166
8167 // unsigned char fpr;
8168 FieldTypes[1] = Context->UnsignedCharTy;
8169 FieldNames[1] = "fpr";
8170
8171 // unsigned short reserved;
8172 FieldTypes[2] = Context->UnsignedShortTy;
8173 FieldNames[2] = "reserved";
8174
8175 // void* overflow_arg_area;
8176 FieldTypes[3] = Context->getPointerType(Context->VoidTy);
8177 FieldNames[3] = "overflow_arg_area";
8178
8179 // void* reg_save_area;
8180 FieldTypes[4] = Context->getPointerType(Context->VoidTy);
8181 FieldNames[4] = "reg_save_area";
8182
8183 // Create fields
8184 for (unsigned i = 0; i < NumFields; ++i) {
8185 FieldDecl *Field = FieldDecl::Create(*Context, VaListTagDecl,
8186 SourceLocation(),
8187 SourceLocation(),
8188 &Context->Idents.get(FieldNames[i]),
8189 FieldTypes[i], /*TInfo=*/nullptr,
8190 /*BitWidth=*/nullptr,
8191 /*Mutable=*/false,
8192 ICIS_NoInit);
8193 Field->setAccess(AS_public);
8194 VaListTagDecl->addDecl(Field);
8195 }
8196 VaListTagDecl->completeDefinition();
8197 Context->VaListTagDecl = VaListTagDecl;
8198 QualType VaListTagType = Context->getRecordType(VaListTagDecl);
8199
8200 // } __va_list_tag;
8201 TypedefDecl *VaListTagTypedefDecl =
8202 Context->buildImplicitTypedef(VaListTagType, "__va_list_tag");
8203
8204 QualType VaListTagTypedefType =
8205 Context->getTypedefType(VaListTagTypedefDecl);
8206
8207 // typedef __va_list_tag __builtin_va_list[1];
8208 llvm::APInt Size(Context->getTypeSize(Context->getSizeType()), 1);
8209 QualType VaListTagArrayType
8210 = Context->getConstantArrayType(VaListTagTypedefType,
8211 Size, nullptr, ArrayType::Normal, 0);
8212 return Context->buildImplicitTypedef(VaListTagArrayType, "__builtin_va_list");
8213 }
8214
8215 static TypedefDecl *
CreateX86_64ABIBuiltinVaListDecl(const ASTContext * Context)8216 CreateX86_64ABIBuiltinVaListDecl(const ASTContext *Context) {
8217 // struct __va_list_tag {
8218 RecordDecl *VaListTagDecl;
8219 VaListTagDecl = Context->buildImplicitRecord("__va_list_tag");
8220 VaListTagDecl->startDefinition();
8221
8222 const size_t NumFields = 4;
8223 QualType FieldTypes[NumFields];
8224 const char *FieldNames[NumFields];
8225
8226 // unsigned gp_offset;
8227 FieldTypes[0] = Context->UnsignedIntTy;
8228 FieldNames[0] = "gp_offset";
8229
8230 // unsigned fp_offset;
8231 FieldTypes[1] = Context->UnsignedIntTy;
8232 FieldNames[1] = "fp_offset";
8233
8234 // void* overflow_arg_area;
8235 FieldTypes[2] = Context->getPointerType(Context->VoidTy);
8236 FieldNames[2] = "overflow_arg_area";
8237
8238 // void* reg_save_area;
8239 FieldTypes[3] = Context->getPointerType(Context->VoidTy);
8240 FieldNames[3] = "reg_save_area";
8241
8242 // Create fields
8243 for (unsigned i = 0; i < NumFields; ++i) {
8244 FieldDecl *Field = FieldDecl::Create(const_cast<ASTContext &>(*Context),
8245 VaListTagDecl,
8246 SourceLocation(),
8247 SourceLocation(),
8248 &Context->Idents.get(FieldNames[i]),
8249 FieldTypes[i], /*TInfo=*/nullptr,
8250 /*BitWidth=*/nullptr,
8251 /*Mutable=*/false,
8252 ICIS_NoInit);
8253 Field->setAccess(AS_public);
8254 VaListTagDecl->addDecl(Field);
8255 }
8256 VaListTagDecl->completeDefinition();
8257 Context->VaListTagDecl = VaListTagDecl;
8258 QualType VaListTagType = Context->getRecordType(VaListTagDecl);
8259
8260 // };
8261
8262 // typedef struct __va_list_tag __builtin_va_list[1];
8263 llvm::APInt Size(Context->getTypeSize(Context->getSizeType()), 1);
8264 QualType VaListTagArrayType = Context->getConstantArrayType(
8265 VaListTagType, Size, nullptr, ArrayType::Normal, 0);
8266 return Context->buildImplicitTypedef(VaListTagArrayType, "__builtin_va_list");
8267 }
8268
CreatePNaClABIBuiltinVaListDecl(const ASTContext * Context)8269 static TypedefDecl *CreatePNaClABIBuiltinVaListDecl(const ASTContext *Context) {
8270 // typedef int __builtin_va_list[4];
8271 llvm::APInt Size(Context->getTypeSize(Context->getSizeType()), 4);
8272 QualType IntArrayType = Context->getConstantArrayType(
8273 Context->IntTy, Size, nullptr, ArrayType::Normal, 0);
8274 return Context->buildImplicitTypedef(IntArrayType, "__builtin_va_list");
8275 }
8276
8277 static TypedefDecl *
CreateAAPCSABIBuiltinVaListDecl(const ASTContext * Context)8278 CreateAAPCSABIBuiltinVaListDecl(const ASTContext *Context) {
8279 // struct __va_list
8280 RecordDecl *VaListDecl = Context->buildImplicitRecord("__va_list");
8281 if (Context->getLangOpts().CPlusPlus) {
8282 // namespace std { struct __va_list {
8283 NamespaceDecl *NS;
8284 NS = NamespaceDecl::Create(const_cast<ASTContext &>(*Context),
8285 Context->getTranslationUnitDecl(),
8286 /*Inline*/false, SourceLocation(),
8287 SourceLocation(), &Context->Idents.get("std"),
8288 /*PrevDecl*/ nullptr);
8289 NS->setImplicit();
8290 VaListDecl->setDeclContext(NS);
8291 }
8292
8293 VaListDecl->startDefinition();
8294
8295 // void * __ap;
8296 FieldDecl *Field = FieldDecl::Create(const_cast<ASTContext &>(*Context),
8297 VaListDecl,
8298 SourceLocation(),
8299 SourceLocation(),
8300 &Context->Idents.get("__ap"),
8301 Context->getPointerType(Context->VoidTy),
8302 /*TInfo=*/nullptr,
8303 /*BitWidth=*/nullptr,
8304 /*Mutable=*/false,
8305 ICIS_NoInit);
8306 Field->setAccess(AS_public);
8307 VaListDecl->addDecl(Field);
8308
8309 // };
8310 VaListDecl->completeDefinition();
8311 Context->VaListTagDecl = VaListDecl;
8312
8313 // typedef struct __va_list __builtin_va_list;
8314 QualType T = Context->getRecordType(VaListDecl);
8315 return Context->buildImplicitTypedef(T, "__builtin_va_list");
8316 }
8317
8318 static TypedefDecl *
CreateSystemZBuiltinVaListDecl(const ASTContext * Context)8319 CreateSystemZBuiltinVaListDecl(const ASTContext *Context) {
8320 // struct __va_list_tag {
8321 RecordDecl *VaListTagDecl;
8322 VaListTagDecl = Context->buildImplicitRecord("__va_list_tag");
8323 VaListTagDecl->startDefinition();
8324
8325 const size_t NumFields = 4;
8326 QualType FieldTypes[NumFields];
8327 const char *FieldNames[NumFields];
8328
8329 // long __gpr;
8330 FieldTypes[0] = Context->LongTy;
8331 FieldNames[0] = "__gpr";
8332
8333 // long __fpr;
8334 FieldTypes[1] = Context->LongTy;
8335 FieldNames[1] = "__fpr";
8336
8337 // void *__overflow_arg_area;
8338 FieldTypes[2] = Context->getPointerType(Context->VoidTy);
8339 FieldNames[2] = "__overflow_arg_area";
8340
8341 // void *__reg_save_area;
8342 FieldTypes[3] = Context->getPointerType(Context->VoidTy);
8343 FieldNames[3] = "__reg_save_area";
8344
8345 // Create fields
8346 for (unsigned i = 0; i < NumFields; ++i) {
8347 FieldDecl *Field = FieldDecl::Create(const_cast<ASTContext &>(*Context),
8348 VaListTagDecl,
8349 SourceLocation(),
8350 SourceLocation(),
8351 &Context->Idents.get(FieldNames[i]),
8352 FieldTypes[i], /*TInfo=*/nullptr,
8353 /*BitWidth=*/nullptr,
8354 /*Mutable=*/false,
8355 ICIS_NoInit);
8356 Field->setAccess(AS_public);
8357 VaListTagDecl->addDecl(Field);
8358 }
8359 VaListTagDecl->completeDefinition();
8360 Context->VaListTagDecl = VaListTagDecl;
8361 QualType VaListTagType = Context->getRecordType(VaListTagDecl);
8362
8363 // };
8364
8365 // typedef __va_list_tag __builtin_va_list[1];
8366 llvm::APInt Size(Context->getTypeSize(Context->getSizeType()), 1);
8367 QualType VaListTagArrayType = Context->getConstantArrayType(
8368 VaListTagType, Size, nullptr, ArrayType::Normal, 0);
8369
8370 return Context->buildImplicitTypedef(VaListTagArrayType, "__builtin_va_list");
8371 }
8372
CreateHexagonBuiltinVaListDecl(const ASTContext * Context)8373 static TypedefDecl *CreateHexagonBuiltinVaListDecl(const ASTContext *Context) {
8374 // typedef struct __va_list_tag {
8375 RecordDecl *VaListTagDecl;
8376 VaListTagDecl = Context->buildImplicitRecord("__va_list_tag");
8377 VaListTagDecl->startDefinition();
8378
8379 const size_t NumFields = 3;
8380 QualType FieldTypes[NumFields];
8381 const char *FieldNames[NumFields];
8382
8383 // void *CurrentSavedRegisterArea;
8384 FieldTypes[0] = Context->getPointerType(Context->VoidTy);
8385 FieldNames[0] = "__current_saved_reg_area_pointer";
8386
8387 // void *SavedRegAreaEnd;
8388 FieldTypes[1] = Context->getPointerType(Context->VoidTy);
8389 FieldNames[1] = "__saved_reg_area_end_pointer";
8390
8391 // void *OverflowArea;
8392 FieldTypes[2] = Context->getPointerType(Context->VoidTy);
8393 FieldNames[2] = "__overflow_area_pointer";
8394
8395 // Create fields
8396 for (unsigned i = 0; i < NumFields; ++i) {
8397 FieldDecl *Field = FieldDecl::Create(
8398 const_cast<ASTContext &>(*Context), VaListTagDecl, SourceLocation(),
8399 SourceLocation(), &Context->Idents.get(FieldNames[i]), FieldTypes[i],
8400 /*TInfo=*/0,
8401 /*BitWidth=*/0,
8402 /*Mutable=*/false, ICIS_NoInit);
8403 Field->setAccess(AS_public);
8404 VaListTagDecl->addDecl(Field);
8405 }
8406 VaListTagDecl->completeDefinition();
8407 Context->VaListTagDecl = VaListTagDecl;
8408 QualType VaListTagType = Context->getRecordType(VaListTagDecl);
8409
8410 // } __va_list_tag;
8411 TypedefDecl *VaListTagTypedefDecl =
8412 Context->buildImplicitTypedef(VaListTagType, "__va_list_tag");
8413
8414 QualType VaListTagTypedefType = Context->getTypedefType(VaListTagTypedefDecl);
8415
8416 // typedef __va_list_tag __builtin_va_list[1];
8417 llvm::APInt Size(Context->getTypeSize(Context->getSizeType()), 1);
8418 QualType VaListTagArrayType = Context->getConstantArrayType(
8419 VaListTagTypedefType, Size, nullptr, ArrayType::Normal, 0);
8420
8421 return Context->buildImplicitTypedef(VaListTagArrayType, "__builtin_va_list");
8422 }
8423
CreateVaListDecl(const ASTContext * Context,TargetInfo::BuiltinVaListKind Kind)8424 static TypedefDecl *CreateVaListDecl(const ASTContext *Context,
8425 TargetInfo::BuiltinVaListKind Kind) {
8426 switch (Kind) {
8427 case TargetInfo::CharPtrBuiltinVaList:
8428 return CreateCharPtrBuiltinVaListDecl(Context);
8429 case TargetInfo::VoidPtrBuiltinVaList:
8430 return CreateVoidPtrBuiltinVaListDecl(Context);
8431 case TargetInfo::AArch64ABIBuiltinVaList:
8432 return CreateAArch64ABIBuiltinVaListDecl(Context);
8433 case TargetInfo::PowerABIBuiltinVaList:
8434 return CreatePowerABIBuiltinVaListDecl(Context);
8435 case TargetInfo::X86_64ABIBuiltinVaList:
8436 return CreateX86_64ABIBuiltinVaListDecl(Context);
8437 case TargetInfo::PNaClABIBuiltinVaList:
8438 return CreatePNaClABIBuiltinVaListDecl(Context);
8439 case TargetInfo::AAPCSABIBuiltinVaList:
8440 return CreateAAPCSABIBuiltinVaListDecl(Context);
8441 case TargetInfo::SystemZBuiltinVaList:
8442 return CreateSystemZBuiltinVaListDecl(Context);
8443 case TargetInfo::HexagonBuiltinVaList:
8444 return CreateHexagonBuiltinVaListDecl(Context);
8445 }
8446
8447 llvm_unreachable("Unhandled __builtin_va_list type kind");
8448 }
8449
getBuiltinVaListDecl() const8450 TypedefDecl *ASTContext::getBuiltinVaListDecl() const {
8451 if (!BuiltinVaListDecl) {
8452 BuiltinVaListDecl = CreateVaListDecl(this, Target->getBuiltinVaListKind());
8453 assert(BuiltinVaListDecl->isImplicit());
8454 }
8455
8456 return BuiltinVaListDecl;
8457 }
8458
getVaListTagDecl() const8459 Decl *ASTContext::getVaListTagDecl() const {
8460 // Force the creation of VaListTagDecl by building the __builtin_va_list
8461 // declaration.
8462 if (!VaListTagDecl)
8463 (void)getBuiltinVaListDecl();
8464
8465 return VaListTagDecl;
8466 }
8467
getBuiltinMSVaListDecl() const8468 TypedefDecl *ASTContext::getBuiltinMSVaListDecl() const {
8469 if (!BuiltinMSVaListDecl)
8470 BuiltinMSVaListDecl = CreateMSVaListDecl(this);
8471
8472 return BuiltinMSVaListDecl;
8473 }
8474
canBuiltinBeRedeclared(const FunctionDecl * FD) const8475 bool ASTContext::canBuiltinBeRedeclared(const FunctionDecl *FD) const {
8476 return BuiltinInfo.canBeRedeclared(FD->getBuiltinID());
8477 }
8478
setObjCConstantStringInterface(ObjCInterfaceDecl * Decl)8479 void ASTContext::setObjCConstantStringInterface(ObjCInterfaceDecl *Decl) {
8480 assert(ObjCConstantStringType.isNull() &&
8481 "'NSConstantString' type already set!");
8482
8483 ObjCConstantStringType = getObjCInterfaceType(Decl);
8484 }
8485
8486 /// Retrieve the template name that corresponds to a non-empty
8487 /// lookup.
8488 TemplateName
getOverloadedTemplateName(UnresolvedSetIterator Begin,UnresolvedSetIterator End) const8489 ASTContext::getOverloadedTemplateName(UnresolvedSetIterator Begin,
8490 UnresolvedSetIterator End) const {
8491 unsigned size = End - Begin;
8492 assert(size > 1 && "set is not overloaded!");
8493
8494 void *memory = Allocate(sizeof(OverloadedTemplateStorage) +
8495 size * sizeof(FunctionTemplateDecl*));
8496 auto *OT = new (memory) OverloadedTemplateStorage(size);
8497
8498 NamedDecl **Storage = OT->getStorage();
8499 for (UnresolvedSetIterator I = Begin; I != End; ++I) {
8500 NamedDecl *D = *I;
8501 assert(isa<FunctionTemplateDecl>(D) ||
8502 isa<UnresolvedUsingValueDecl>(D) ||
8503 (isa<UsingShadowDecl>(D) &&
8504 isa<FunctionTemplateDecl>(D->getUnderlyingDecl())));
8505 *Storage++ = D;
8506 }
8507
8508 return TemplateName(OT);
8509 }
8510
8511 /// Retrieve a template name representing an unqualified-id that has been
8512 /// assumed to name a template for ADL purposes.
getAssumedTemplateName(DeclarationName Name) const8513 TemplateName ASTContext::getAssumedTemplateName(DeclarationName Name) const {
8514 auto *OT = new (*this) AssumedTemplateStorage(Name);
8515 return TemplateName(OT);
8516 }
8517
8518 /// Retrieve the template name that represents a qualified
8519 /// template name such as \c std::vector.
8520 TemplateName
getQualifiedTemplateName(NestedNameSpecifier * NNS,bool TemplateKeyword,TemplateDecl * Template) const8521 ASTContext::getQualifiedTemplateName(NestedNameSpecifier *NNS,
8522 bool TemplateKeyword,
8523 TemplateDecl *Template) const {
8524 assert(NNS && "Missing nested-name-specifier in qualified template name");
8525
8526 // FIXME: Canonicalization?
8527 llvm::FoldingSetNodeID ID;
8528 QualifiedTemplateName::Profile(ID, NNS, TemplateKeyword, Template);
8529
8530 void *InsertPos = nullptr;
8531 QualifiedTemplateName *QTN =
8532 QualifiedTemplateNames.FindNodeOrInsertPos(ID, InsertPos);
8533 if (!QTN) {
8534 QTN = new (*this, alignof(QualifiedTemplateName))
8535 QualifiedTemplateName(NNS, TemplateKeyword, Template);
8536 QualifiedTemplateNames.InsertNode(QTN, InsertPos);
8537 }
8538
8539 return TemplateName(QTN);
8540 }
8541
8542 /// Retrieve the template name that represents a dependent
8543 /// template name such as \c MetaFun::template apply.
8544 TemplateName
getDependentTemplateName(NestedNameSpecifier * NNS,const IdentifierInfo * Name) const8545 ASTContext::getDependentTemplateName(NestedNameSpecifier *NNS,
8546 const IdentifierInfo *Name) const {
8547 assert((!NNS || NNS->isDependent()) &&
8548 "Nested name specifier must be dependent");
8549
8550 llvm::FoldingSetNodeID ID;
8551 DependentTemplateName::Profile(ID, NNS, Name);
8552
8553 void *InsertPos = nullptr;
8554 DependentTemplateName *QTN =
8555 DependentTemplateNames.FindNodeOrInsertPos(ID, InsertPos);
8556
8557 if (QTN)
8558 return TemplateName(QTN);
8559
8560 NestedNameSpecifier *CanonNNS = getCanonicalNestedNameSpecifier(NNS);
8561 if (CanonNNS == NNS) {
8562 QTN = new (*this, alignof(DependentTemplateName))
8563 DependentTemplateName(NNS, Name);
8564 } else {
8565 TemplateName Canon = getDependentTemplateName(CanonNNS, Name);
8566 QTN = new (*this, alignof(DependentTemplateName))
8567 DependentTemplateName(NNS, Name, Canon);
8568 DependentTemplateName *CheckQTN =
8569 DependentTemplateNames.FindNodeOrInsertPos(ID, InsertPos);
8570 assert(!CheckQTN && "Dependent type name canonicalization broken");
8571 (void)CheckQTN;
8572 }
8573
8574 DependentTemplateNames.InsertNode(QTN, InsertPos);
8575 return TemplateName(QTN);
8576 }
8577
8578 /// Retrieve the template name that represents a dependent
8579 /// template name such as \c MetaFun::template operator+.
8580 TemplateName
getDependentTemplateName(NestedNameSpecifier * NNS,OverloadedOperatorKind Operator) const8581 ASTContext::getDependentTemplateName(NestedNameSpecifier *NNS,
8582 OverloadedOperatorKind Operator) const {
8583 assert((!NNS || NNS->isDependent()) &&
8584 "Nested name specifier must be dependent");
8585
8586 llvm::FoldingSetNodeID ID;
8587 DependentTemplateName::Profile(ID, NNS, Operator);
8588
8589 void *InsertPos = nullptr;
8590 DependentTemplateName *QTN
8591 = DependentTemplateNames.FindNodeOrInsertPos(ID, InsertPos);
8592
8593 if (QTN)
8594 return TemplateName(QTN);
8595
8596 NestedNameSpecifier *CanonNNS = getCanonicalNestedNameSpecifier(NNS);
8597 if (CanonNNS == NNS) {
8598 QTN = new (*this, alignof(DependentTemplateName))
8599 DependentTemplateName(NNS, Operator);
8600 } else {
8601 TemplateName Canon = getDependentTemplateName(CanonNNS, Operator);
8602 QTN = new (*this, alignof(DependentTemplateName))
8603 DependentTemplateName(NNS, Operator, Canon);
8604
8605 DependentTemplateName *CheckQTN
8606 = DependentTemplateNames.FindNodeOrInsertPos(ID, InsertPos);
8607 assert(!CheckQTN && "Dependent template name canonicalization broken");
8608 (void)CheckQTN;
8609 }
8610
8611 DependentTemplateNames.InsertNode(QTN, InsertPos);
8612 return TemplateName(QTN);
8613 }
8614
8615 TemplateName
getSubstTemplateTemplateParm(TemplateTemplateParmDecl * param,TemplateName replacement) const8616 ASTContext::getSubstTemplateTemplateParm(TemplateTemplateParmDecl *param,
8617 TemplateName replacement) const {
8618 llvm::FoldingSetNodeID ID;
8619 SubstTemplateTemplateParmStorage::Profile(ID, param, replacement);
8620
8621 void *insertPos = nullptr;
8622 SubstTemplateTemplateParmStorage *subst
8623 = SubstTemplateTemplateParms.FindNodeOrInsertPos(ID, insertPos);
8624
8625 if (!subst) {
8626 subst = new (*this) SubstTemplateTemplateParmStorage(param, replacement);
8627 SubstTemplateTemplateParms.InsertNode(subst, insertPos);
8628 }
8629
8630 return TemplateName(subst);
8631 }
8632
8633 TemplateName
getSubstTemplateTemplateParmPack(TemplateTemplateParmDecl * Param,const TemplateArgument & ArgPack) const8634 ASTContext::getSubstTemplateTemplateParmPack(TemplateTemplateParmDecl *Param,
8635 const TemplateArgument &ArgPack) const {
8636 auto &Self = const_cast<ASTContext &>(*this);
8637 llvm::FoldingSetNodeID ID;
8638 SubstTemplateTemplateParmPackStorage::Profile(ID, Self, Param, ArgPack);
8639
8640 void *InsertPos = nullptr;
8641 SubstTemplateTemplateParmPackStorage *Subst
8642 = SubstTemplateTemplateParmPacks.FindNodeOrInsertPos(ID, InsertPos);
8643
8644 if (!Subst) {
8645 Subst = new (*this) SubstTemplateTemplateParmPackStorage(Param,
8646 ArgPack.pack_size(),
8647 ArgPack.pack_begin());
8648 SubstTemplateTemplateParmPacks.InsertNode(Subst, InsertPos);
8649 }
8650
8651 return TemplateName(Subst);
8652 }
8653
8654 /// getFromTargetType - Given one of the integer types provided by
8655 /// TargetInfo, produce the corresponding type. The unsigned @p Type
8656 /// is actually a value of type @c TargetInfo::IntType.
getFromTargetType(unsigned Type) const8657 CanQualType ASTContext::getFromTargetType(unsigned Type) const {
8658 switch (Type) {
8659 case TargetInfo::NoInt: return {};
8660 case TargetInfo::SignedChar: return SignedCharTy;
8661 case TargetInfo::UnsignedChar: return UnsignedCharTy;
8662 case TargetInfo::SignedShort: return ShortTy;
8663 case TargetInfo::UnsignedShort: return UnsignedShortTy;
8664 case TargetInfo::SignedInt: return IntTy;
8665 case TargetInfo::UnsignedInt: return UnsignedIntTy;
8666 case TargetInfo::SignedLong: return LongTy;
8667 case TargetInfo::UnsignedLong: return UnsignedLongTy;
8668 case TargetInfo::SignedLongLong: return LongLongTy;
8669 case TargetInfo::UnsignedLongLong: return UnsignedLongLongTy;
8670 }
8671
8672 llvm_unreachable("Unhandled TargetInfo::IntType value");
8673 }
8674
8675 //===----------------------------------------------------------------------===//
8676 // Type Predicates.
8677 //===----------------------------------------------------------------------===//
8678
8679 /// getObjCGCAttr - Returns one of GCNone, Weak or Strong objc's
8680 /// garbage collection attribute.
8681 ///
getObjCGCAttrKind(QualType Ty) const8682 Qualifiers::GC ASTContext::getObjCGCAttrKind(QualType Ty) const {
8683 if (getLangOpts().getGC() == LangOptions::NonGC)
8684 return Qualifiers::GCNone;
8685
8686 assert(getLangOpts().ObjC);
8687 Qualifiers::GC GCAttrs = Ty.getObjCGCAttr();
8688
8689 // Default behaviour under objective-C's gc is for ObjC pointers
8690 // (or pointers to them) be treated as though they were declared
8691 // as __strong.
8692 if (GCAttrs == Qualifiers::GCNone) {
8693 if (Ty->isObjCObjectPointerType() || Ty->isBlockPointerType())
8694 return Qualifiers::Strong;
8695 else if (Ty->isPointerType())
8696 return getObjCGCAttrKind(Ty->castAs<PointerType>()->getPointeeType());
8697 } else {
8698 // It's not valid to set GC attributes on anything that isn't a
8699 // pointer.
8700 #ifndef NDEBUG
8701 QualType CT = Ty->getCanonicalTypeInternal();
8702 while (const auto *AT = dyn_cast<ArrayType>(CT))
8703 CT = AT->getElementType();
8704 assert(CT->isAnyPointerType() || CT->isBlockPointerType());
8705 #endif
8706 }
8707 return GCAttrs;
8708 }
8709
8710 //===----------------------------------------------------------------------===//
8711 // Type Compatibility Testing
8712 //===----------------------------------------------------------------------===//
8713
8714 /// areCompatVectorTypes - Return true if the two specified vector types are
8715 /// compatible.
areCompatVectorTypes(const VectorType * LHS,const VectorType * RHS)8716 static bool areCompatVectorTypes(const VectorType *LHS,
8717 const VectorType *RHS) {
8718 assert(LHS->isCanonicalUnqualified() && RHS->isCanonicalUnqualified());
8719 return LHS->getElementType() == RHS->getElementType() &&
8720 LHS->getNumElements() == RHS->getNumElements();
8721 }
8722
8723 /// areCompatMatrixTypes - Return true if the two specified matrix types are
8724 /// compatible.
areCompatMatrixTypes(const ConstantMatrixType * LHS,const ConstantMatrixType * RHS)8725 static bool areCompatMatrixTypes(const ConstantMatrixType *LHS,
8726 const ConstantMatrixType *RHS) {
8727 assert(LHS->isCanonicalUnqualified() && RHS->isCanonicalUnqualified());
8728 return LHS->getElementType() == RHS->getElementType() &&
8729 LHS->getNumRows() == RHS->getNumRows() &&
8730 LHS->getNumColumns() == RHS->getNumColumns();
8731 }
8732
areCompatibleVectorTypes(QualType FirstVec,QualType SecondVec)8733 bool ASTContext::areCompatibleVectorTypes(QualType FirstVec,
8734 QualType SecondVec) {
8735 assert(FirstVec->isVectorType() && "FirstVec should be a vector type");
8736 assert(SecondVec->isVectorType() && "SecondVec should be a vector type");
8737
8738 if (hasSameUnqualifiedType(FirstVec, SecondVec))
8739 return true;
8740
8741 // Treat Neon vector types and most AltiVec vector types as if they are the
8742 // equivalent GCC vector types.
8743 const auto *First = FirstVec->castAs<VectorType>();
8744 const auto *Second = SecondVec->castAs<VectorType>();
8745 if (First->getNumElements() == Second->getNumElements() &&
8746 hasSameType(First->getElementType(), Second->getElementType()) &&
8747 First->getVectorKind() != VectorType::AltiVecPixel &&
8748 First->getVectorKind() != VectorType::AltiVecBool &&
8749 Second->getVectorKind() != VectorType::AltiVecPixel &&
8750 Second->getVectorKind() != VectorType::AltiVecBool &&
8751 First->getVectorKind() != VectorType::SveFixedLengthDataVector &&
8752 First->getVectorKind() != VectorType::SveFixedLengthPredicateVector &&
8753 Second->getVectorKind() != VectorType::SveFixedLengthDataVector &&
8754 Second->getVectorKind() != VectorType::SveFixedLengthPredicateVector)
8755 return true;
8756
8757 return false;
8758 }
8759
8760 /// getSVETypeSize - Return SVE vector or predicate register size.
getSVETypeSize(ASTContext & Context,const BuiltinType * Ty)8761 static uint64_t getSVETypeSize(ASTContext &Context, const BuiltinType *Ty) {
8762 assert(Ty->isVLSTBuiltinType() && "Invalid SVE Type");
8763 return Ty->getKind() == BuiltinType::SveBool
8764 ? Context.getLangOpts().ArmSveVectorBits / Context.getCharWidth()
8765 : Context.getLangOpts().ArmSveVectorBits;
8766 }
8767
areCompatibleSveTypes(QualType FirstType,QualType SecondType)8768 bool ASTContext::areCompatibleSveTypes(QualType FirstType,
8769 QualType SecondType) {
8770 assert(((FirstType->isSizelessBuiltinType() && SecondType->isVectorType()) ||
8771 (FirstType->isVectorType() && SecondType->isSizelessBuiltinType())) &&
8772 "Expected SVE builtin type and vector type!");
8773
8774 auto IsValidCast = [this](QualType FirstType, QualType SecondType) {
8775 if (const auto *BT = FirstType->getAs<BuiltinType>()) {
8776 if (const auto *VT = SecondType->getAs<VectorType>()) {
8777 // Predicates have the same representation as uint8 so we also have to
8778 // check the kind to make these types incompatible.
8779 if (VT->getVectorKind() == VectorType::SveFixedLengthPredicateVector)
8780 return BT->getKind() == BuiltinType::SveBool;
8781 else if (VT->getVectorKind() == VectorType::SveFixedLengthDataVector)
8782 return VT->getElementType().getCanonicalType() ==
8783 FirstType->getSveEltType(*this);
8784 else if (VT->getVectorKind() == VectorType::GenericVector)
8785 return getTypeSize(SecondType) == getSVETypeSize(*this, BT) &&
8786 hasSameType(VT->getElementType(),
8787 getBuiltinVectorTypeInfo(BT).ElementType);
8788 }
8789 }
8790 return false;
8791 };
8792
8793 return IsValidCast(FirstType, SecondType) ||
8794 IsValidCast(SecondType, FirstType);
8795 }
8796
areLaxCompatibleSveTypes(QualType FirstType,QualType SecondType)8797 bool ASTContext::areLaxCompatibleSveTypes(QualType FirstType,
8798 QualType SecondType) {
8799 assert(((FirstType->isSizelessBuiltinType() && SecondType->isVectorType()) ||
8800 (FirstType->isVectorType() && SecondType->isSizelessBuiltinType())) &&
8801 "Expected SVE builtin type and vector type!");
8802
8803 auto IsLaxCompatible = [this](QualType FirstType, QualType SecondType) {
8804 const auto *BT = FirstType->getAs<BuiltinType>();
8805 if (!BT)
8806 return false;
8807
8808 const auto *VecTy = SecondType->getAs<VectorType>();
8809 if (VecTy &&
8810 (VecTy->getVectorKind() == VectorType::SveFixedLengthDataVector ||
8811 VecTy->getVectorKind() == VectorType::GenericVector)) {
8812 const LangOptions::LaxVectorConversionKind LVCKind =
8813 getLangOpts().getLaxVectorConversions();
8814
8815 // Can not convert between sve predicates and sve vectors because of
8816 // different size.
8817 if (BT->getKind() == BuiltinType::SveBool &&
8818 VecTy->getVectorKind() == VectorType::SveFixedLengthDataVector)
8819 return false;
8820
8821 // If __ARM_FEATURE_SVE_BITS != N do not allow GNU vector lax conversion.
8822 // "Whenever __ARM_FEATURE_SVE_BITS==N, GNUT implicitly
8823 // converts to VLAT and VLAT implicitly converts to GNUT."
8824 // ACLE Spec Version 00bet6, 3.7.3.2. Behavior common to vectors and
8825 // predicates.
8826 if (VecTy->getVectorKind() == VectorType::GenericVector &&
8827 getTypeSize(SecondType) != getSVETypeSize(*this, BT))
8828 return false;
8829
8830 // If -flax-vector-conversions=all is specified, the types are
8831 // certainly compatible.
8832 if (LVCKind == LangOptions::LaxVectorConversionKind::All)
8833 return true;
8834
8835 // If -flax-vector-conversions=integer is specified, the types are
8836 // compatible if the elements are integer types.
8837 if (LVCKind == LangOptions::LaxVectorConversionKind::Integer)
8838 return VecTy->getElementType().getCanonicalType()->isIntegerType() &&
8839 FirstType->getSveEltType(*this)->isIntegerType();
8840 }
8841
8842 return false;
8843 };
8844
8845 return IsLaxCompatible(FirstType, SecondType) ||
8846 IsLaxCompatible(SecondType, FirstType);
8847 }
8848
hasDirectOwnershipQualifier(QualType Ty) const8849 bool ASTContext::hasDirectOwnershipQualifier(QualType Ty) const {
8850 while (true) {
8851 // __strong id
8852 if (const AttributedType *Attr = dyn_cast<AttributedType>(Ty)) {
8853 if (Attr->getAttrKind() == attr::ObjCOwnership)
8854 return true;
8855
8856 Ty = Attr->getModifiedType();
8857
8858 // X *__strong (...)
8859 } else if (const ParenType *Paren = dyn_cast<ParenType>(Ty)) {
8860 Ty = Paren->getInnerType();
8861
8862 // We do not want to look through typedefs, typeof(expr),
8863 // typeof(type), or any other way that the type is somehow
8864 // abstracted.
8865 } else {
8866 return false;
8867 }
8868 }
8869 }
8870
8871 //===----------------------------------------------------------------------===//
8872 // ObjCQualifiedIdTypesAreCompatible - Compatibility testing for qualified id's.
8873 //===----------------------------------------------------------------------===//
8874
8875 /// ProtocolCompatibleWithProtocol - return 'true' if 'lProto' is in the
8876 /// inheritance hierarchy of 'rProto'.
8877 bool
ProtocolCompatibleWithProtocol(ObjCProtocolDecl * lProto,ObjCProtocolDecl * rProto) const8878 ASTContext::ProtocolCompatibleWithProtocol(ObjCProtocolDecl *lProto,
8879 ObjCProtocolDecl *rProto) const {
8880 if (declaresSameEntity(lProto, rProto))
8881 return true;
8882 for (auto *PI : rProto->protocols())
8883 if (ProtocolCompatibleWithProtocol(lProto, PI))
8884 return true;
8885 return false;
8886 }
8887
8888 /// ObjCQualifiedClassTypesAreCompatible - compare Class<pr,...> and
8889 /// Class<pr1, ...>.
ObjCQualifiedClassTypesAreCompatible(const ObjCObjectPointerType * lhs,const ObjCObjectPointerType * rhs)8890 bool ASTContext::ObjCQualifiedClassTypesAreCompatible(
8891 const ObjCObjectPointerType *lhs, const ObjCObjectPointerType *rhs) {
8892 for (auto *lhsProto : lhs->quals()) {
8893 bool match = false;
8894 for (auto *rhsProto : rhs->quals()) {
8895 if (ProtocolCompatibleWithProtocol(lhsProto, rhsProto)) {
8896 match = true;
8897 break;
8898 }
8899 }
8900 if (!match)
8901 return false;
8902 }
8903 return true;
8904 }
8905
8906 /// ObjCQualifiedIdTypesAreCompatible - We know that one of lhs/rhs is an
8907 /// ObjCQualifiedIDType.
ObjCQualifiedIdTypesAreCompatible(const ObjCObjectPointerType * lhs,const ObjCObjectPointerType * rhs,bool compare)8908 bool ASTContext::ObjCQualifiedIdTypesAreCompatible(
8909 const ObjCObjectPointerType *lhs, const ObjCObjectPointerType *rhs,
8910 bool compare) {
8911 // Allow id<P..> and an 'id' in all cases.
8912 if (lhs->isObjCIdType() || rhs->isObjCIdType())
8913 return true;
8914
8915 // Don't allow id<P..> to convert to Class or Class<P..> in either direction.
8916 if (lhs->isObjCClassType() || lhs->isObjCQualifiedClassType() ||
8917 rhs->isObjCClassType() || rhs->isObjCQualifiedClassType())
8918 return false;
8919
8920 if (lhs->isObjCQualifiedIdType()) {
8921 if (rhs->qual_empty()) {
8922 // If the RHS is a unqualified interface pointer "NSString*",
8923 // make sure we check the class hierarchy.
8924 if (ObjCInterfaceDecl *rhsID = rhs->getInterfaceDecl()) {
8925 for (auto *I : lhs->quals()) {
8926 // when comparing an id<P> on lhs with a static type on rhs,
8927 // see if static class implements all of id's protocols, directly or
8928 // through its super class and categories.
8929 if (!rhsID->ClassImplementsProtocol(I, true))
8930 return false;
8931 }
8932 }
8933 // If there are no qualifiers and no interface, we have an 'id'.
8934 return true;
8935 }
8936 // Both the right and left sides have qualifiers.
8937 for (auto *lhsProto : lhs->quals()) {
8938 bool match = false;
8939
8940 // when comparing an id<P> on lhs with a static type on rhs,
8941 // see if static class implements all of id's protocols, directly or
8942 // through its super class and categories.
8943 for (auto *rhsProto : rhs->quals()) {
8944 if (ProtocolCompatibleWithProtocol(lhsProto, rhsProto) ||
8945 (compare && ProtocolCompatibleWithProtocol(rhsProto, lhsProto))) {
8946 match = true;
8947 break;
8948 }
8949 }
8950 // If the RHS is a qualified interface pointer "NSString<P>*",
8951 // make sure we check the class hierarchy.
8952 if (ObjCInterfaceDecl *rhsID = rhs->getInterfaceDecl()) {
8953 for (auto *I : lhs->quals()) {
8954 // when comparing an id<P> on lhs with a static type on rhs,
8955 // see if static class implements all of id's protocols, directly or
8956 // through its super class and categories.
8957 if (rhsID->ClassImplementsProtocol(I, true)) {
8958 match = true;
8959 break;
8960 }
8961 }
8962 }
8963 if (!match)
8964 return false;
8965 }
8966
8967 return true;
8968 }
8969
8970 assert(rhs->isObjCQualifiedIdType() && "One of the LHS/RHS should be id<x>");
8971
8972 if (lhs->getInterfaceType()) {
8973 // If both the right and left sides have qualifiers.
8974 for (auto *lhsProto : lhs->quals()) {
8975 bool match = false;
8976
8977 // when comparing an id<P> on rhs with a static type on lhs,
8978 // see if static class implements all of id's protocols, directly or
8979 // through its super class and categories.
8980 // First, lhs protocols in the qualifier list must be found, direct
8981 // or indirect in rhs's qualifier list or it is a mismatch.
8982 for (auto *rhsProto : rhs->quals()) {
8983 if (ProtocolCompatibleWithProtocol(lhsProto, rhsProto) ||
8984 (compare && ProtocolCompatibleWithProtocol(rhsProto, lhsProto))) {
8985 match = true;
8986 break;
8987 }
8988 }
8989 if (!match)
8990 return false;
8991 }
8992
8993 // Static class's protocols, or its super class or category protocols
8994 // must be found, direct or indirect in rhs's qualifier list or it is a mismatch.
8995 if (ObjCInterfaceDecl *lhsID = lhs->getInterfaceDecl()) {
8996 llvm::SmallPtrSet<ObjCProtocolDecl *, 8> LHSInheritedProtocols;
8997 CollectInheritedProtocols(lhsID, LHSInheritedProtocols);
8998 // This is rather dubious but matches gcc's behavior. If lhs has
8999 // no type qualifier and its class has no static protocol(s)
9000 // assume that it is mismatch.
9001 if (LHSInheritedProtocols.empty() && lhs->qual_empty())
9002 return false;
9003 for (auto *lhsProto : LHSInheritedProtocols) {
9004 bool match = false;
9005 for (auto *rhsProto : rhs->quals()) {
9006 if (ProtocolCompatibleWithProtocol(lhsProto, rhsProto) ||
9007 (compare && ProtocolCompatibleWithProtocol(rhsProto, lhsProto))) {
9008 match = true;
9009 break;
9010 }
9011 }
9012 if (!match)
9013 return false;
9014 }
9015 }
9016 return true;
9017 }
9018 return false;
9019 }
9020
9021 /// canAssignObjCInterfaces - Return true if the two interface types are
9022 /// compatible for assignment from RHS to LHS. This handles validation of any
9023 /// protocol qualifiers on the LHS or RHS.
canAssignObjCInterfaces(const ObjCObjectPointerType * LHSOPT,const ObjCObjectPointerType * RHSOPT)9024 bool ASTContext::canAssignObjCInterfaces(const ObjCObjectPointerType *LHSOPT,
9025 const ObjCObjectPointerType *RHSOPT) {
9026 const ObjCObjectType* LHS = LHSOPT->getObjectType();
9027 const ObjCObjectType* RHS = RHSOPT->getObjectType();
9028
9029 // If either type represents the built-in 'id' type, return true.
9030 if (LHS->isObjCUnqualifiedId() || RHS->isObjCUnqualifiedId())
9031 return true;
9032
9033 // Function object that propagates a successful result or handles
9034 // __kindof types.
9035 auto finish = [&](bool succeeded) -> bool {
9036 if (succeeded)
9037 return true;
9038
9039 if (!RHS->isKindOfType())
9040 return false;
9041
9042 // Strip off __kindof and protocol qualifiers, then check whether
9043 // we can assign the other way.
9044 return canAssignObjCInterfaces(RHSOPT->stripObjCKindOfTypeAndQuals(*this),
9045 LHSOPT->stripObjCKindOfTypeAndQuals(*this));
9046 };
9047
9048 // Casts from or to id<P> are allowed when the other side has compatible
9049 // protocols.
9050 if (LHS->isObjCQualifiedId() || RHS->isObjCQualifiedId()) {
9051 return finish(ObjCQualifiedIdTypesAreCompatible(LHSOPT, RHSOPT, false));
9052 }
9053
9054 // Verify protocol compatibility for casts from Class<P1> to Class<P2>.
9055 if (LHS->isObjCQualifiedClass() && RHS->isObjCQualifiedClass()) {
9056 return finish(ObjCQualifiedClassTypesAreCompatible(LHSOPT, RHSOPT));
9057 }
9058
9059 // Casts from Class to Class<Foo>, or vice-versa, are allowed.
9060 if (LHS->isObjCClass() && RHS->isObjCClass()) {
9061 return true;
9062 }
9063
9064 // If we have 2 user-defined types, fall into that path.
9065 if (LHS->getInterface() && RHS->getInterface()) {
9066 return finish(canAssignObjCInterfaces(LHS, RHS));
9067 }
9068
9069 return false;
9070 }
9071
9072 /// canAssignObjCInterfacesInBlockPointer - This routine is specifically written
9073 /// for providing type-safety for objective-c pointers used to pass/return
9074 /// arguments in block literals. When passed as arguments, passing 'A*' where
9075 /// 'id' is expected is not OK. Passing 'Sub *" where 'Super *" is expected is
9076 /// not OK. For the return type, the opposite is not OK.
canAssignObjCInterfacesInBlockPointer(const ObjCObjectPointerType * LHSOPT,const ObjCObjectPointerType * RHSOPT,bool BlockReturnType)9077 bool ASTContext::canAssignObjCInterfacesInBlockPointer(
9078 const ObjCObjectPointerType *LHSOPT,
9079 const ObjCObjectPointerType *RHSOPT,
9080 bool BlockReturnType) {
9081
9082 // Function object that propagates a successful result or handles
9083 // __kindof types.
9084 auto finish = [&](bool succeeded) -> bool {
9085 if (succeeded)
9086 return true;
9087
9088 const ObjCObjectPointerType *Expected = BlockReturnType ? RHSOPT : LHSOPT;
9089 if (!Expected->isKindOfType())
9090 return false;
9091
9092 // Strip off __kindof and protocol qualifiers, then check whether
9093 // we can assign the other way.
9094 return canAssignObjCInterfacesInBlockPointer(
9095 RHSOPT->stripObjCKindOfTypeAndQuals(*this),
9096 LHSOPT->stripObjCKindOfTypeAndQuals(*this),
9097 BlockReturnType);
9098 };
9099
9100 if (RHSOPT->isObjCBuiltinType() || LHSOPT->isObjCIdType())
9101 return true;
9102
9103 if (LHSOPT->isObjCBuiltinType()) {
9104 return finish(RHSOPT->isObjCBuiltinType() ||
9105 RHSOPT->isObjCQualifiedIdType());
9106 }
9107
9108 if (LHSOPT->isObjCQualifiedIdType() || RHSOPT->isObjCQualifiedIdType()) {
9109 if (getLangOpts().CompatibilityQualifiedIdBlockParamTypeChecking)
9110 // Use for block parameters previous type checking for compatibility.
9111 return finish(ObjCQualifiedIdTypesAreCompatible(LHSOPT, RHSOPT, false) ||
9112 // Or corrected type checking as in non-compat mode.
9113 (!BlockReturnType &&
9114 ObjCQualifiedIdTypesAreCompatible(RHSOPT, LHSOPT, false)));
9115 else
9116 return finish(ObjCQualifiedIdTypesAreCompatible(
9117 (BlockReturnType ? LHSOPT : RHSOPT),
9118 (BlockReturnType ? RHSOPT : LHSOPT), false));
9119 }
9120
9121 const ObjCInterfaceType* LHS = LHSOPT->getInterfaceType();
9122 const ObjCInterfaceType* RHS = RHSOPT->getInterfaceType();
9123 if (LHS && RHS) { // We have 2 user-defined types.
9124 if (LHS != RHS) {
9125 if (LHS->getDecl()->isSuperClassOf(RHS->getDecl()))
9126 return finish(BlockReturnType);
9127 if (RHS->getDecl()->isSuperClassOf(LHS->getDecl()))
9128 return finish(!BlockReturnType);
9129 }
9130 else
9131 return true;
9132 }
9133 return false;
9134 }
9135
9136 /// Comparison routine for Objective-C protocols to be used with
9137 /// llvm::array_pod_sort.
compareObjCProtocolsByName(ObjCProtocolDecl * const * lhs,ObjCProtocolDecl * const * rhs)9138 static int compareObjCProtocolsByName(ObjCProtocolDecl * const *lhs,
9139 ObjCProtocolDecl * const *rhs) {
9140 return (*lhs)->getName().compare((*rhs)->getName());
9141 }
9142
9143 /// getIntersectionOfProtocols - This routine finds the intersection of set
9144 /// of protocols inherited from two distinct objective-c pointer objects with
9145 /// the given common base.
9146 /// It is used to build composite qualifier list of the composite type of
9147 /// the conditional expression involving two objective-c pointer objects.
9148 static
getIntersectionOfProtocols(ASTContext & Context,const ObjCInterfaceDecl * CommonBase,const ObjCObjectPointerType * LHSOPT,const ObjCObjectPointerType * RHSOPT,SmallVectorImpl<ObjCProtocolDecl * > & IntersectionSet)9149 void getIntersectionOfProtocols(ASTContext &Context,
9150 const ObjCInterfaceDecl *CommonBase,
9151 const ObjCObjectPointerType *LHSOPT,
9152 const ObjCObjectPointerType *RHSOPT,
9153 SmallVectorImpl<ObjCProtocolDecl *> &IntersectionSet) {
9154
9155 const ObjCObjectType* LHS = LHSOPT->getObjectType();
9156 const ObjCObjectType* RHS = RHSOPT->getObjectType();
9157 assert(LHS->getInterface() && "LHS must have an interface base");
9158 assert(RHS->getInterface() && "RHS must have an interface base");
9159
9160 // Add all of the protocols for the LHS.
9161 llvm::SmallPtrSet<ObjCProtocolDecl *, 8> LHSProtocolSet;
9162
9163 // Start with the protocol qualifiers.
9164 for (auto proto : LHS->quals()) {
9165 Context.CollectInheritedProtocols(proto, LHSProtocolSet);
9166 }
9167
9168 // Also add the protocols associated with the LHS interface.
9169 Context.CollectInheritedProtocols(LHS->getInterface(), LHSProtocolSet);
9170
9171 // Add all of the protocols for the RHS.
9172 llvm::SmallPtrSet<ObjCProtocolDecl *, 8> RHSProtocolSet;
9173
9174 // Start with the protocol qualifiers.
9175 for (auto proto : RHS->quals()) {
9176 Context.CollectInheritedProtocols(proto, RHSProtocolSet);
9177 }
9178
9179 // Also add the protocols associated with the RHS interface.
9180 Context.CollectInheritedProtocols(RHS->getInterface(), RHSProtocolSet);
9181
9182 // Compute the intersection of the collected protocol sets.
9183 for (auto proto : LHSProtocolSet) {
9184 if (RHSProtocolSet.count(proto))
9185 IntersectionSet.push_back(proto);
9186 }
9187
9188 // Compute the set of protocols that is implied by either the common type or
9189 // the protocols within the intersection.
9190 llvm::SmallPtrSet<ObjCProtocolDecl *, 8> ImpliedProtocols;
9191 Context.CollectInheritedProtocols(CommonBase, ImpliedProtocols);
9192
9193 // Remove any implied protocols from the list of inherited protocols.
9194 if (!ImpliedProtocols.empty()) {
9195 IntersectionSet.erase(
9196 std::remove_if(IntersectionSet.begin(),
9197 IntersectionSet.end(),
9198 [&](ObjCProtocolDecl *proto) -> bool {
9199 return ImpliedProtocols.count(proto) > 0;
9200 }),
9201 IntersectionSet.end());
9202 }
9203
9204 // Sort the remaining protocols by name.
9205 llvm::array_pod_sort(IntersectionSet.begin(), IntersectionSet.end(),
9206 compareObjCProtocolsByName);
9207 }
9208
9209 /// Determine whether the first type is a subtype of the second.
canAssignObjCObjectTypes(ASTContext & ctx,QualType lhs,QualType rhs)9210 static bool canAssignObjCObjectTypes(ASTContext &ctx, QualType lhs,
9211 QualType rhs) {
9212 // Common case: two object pointers.
9213 const auto *lhsOPT = lhs->getAs<ObjCObjectPointerType>();
9214 const auto *rhsOPT = rhs->getAs<ObjCObjectPointerType>();
9215 if (lhsOPT && rhsOPT)
9216 return ctx.canAssignObjCInterfaces(lhsOPT, rhsOPT);
9217
9218 // Two block pointers.
9219 const auto *lhsBlock = lhs->getAs<BlockPointerType>();
9220 const auto *rhsBlock = rhs->getAs<BlockPointerType>();
9221 if (lhsBlock && rhsBlock)
9222 return ctx.typesAreBlockPointerCompatible(lhs, rhs);
9223
9224 // If either is an unqualified 'id' and the other is a block, it's
9225 // acceptable.
9226 if ((lhsOPT && lhsOPT->isObjCIdType() && rhsBlock) ||
9227 (rhsOPT && rhsOPT->isObjCIdType() && lhsBlock))
9228 return true;
9229
9230 return false;
9231 }
9232
9233 // Check that the given Objective-C type argument lists are equivalent.
sameObjCTypeArgs(ASTContext & ctx,const ObjCInterfaceDecl * iface,ArrayRef<QualType> lhsArgs,ArrayRef<QualType> rhsArgs,bool stripKindOf)9234 static bool sameObjCTypeArgs(ASTContext &ctx,
9235 const ObjCInterfaceDecl *iface,
9236 ArrayRef<QualType> lhsArgs,
9237 ArrayRef<QualType> rhsArgs,
9238 bool stripKindOf) {
9239 if (lhsArgs.size() != rhsArgs.size())
9240 return false;
9241
9242 ObjCTypeParamList *typeParams = iface->getTypeParamList();
9243 for (unsigned i = 0, n = lhsArgs.size(); i != n; ++i) {
9244 if (ctx.hasSameType(lhsArgs[i], rhsArgs[i]))
9245 continue;
9246
9247 switch (typeParams->begin()[i]->getVariance()) {
9248 case ObjCTypeParamVariance::Invariant:
9249 if (!stripKindOf ||
9250 !ctx.hasSameType(lhsArgs[i].stripObjCKindOfType(ctx),
9251 rhsArgs[i].stripObjCKindOfType(ctx))) {
9252 return false;
9253 }
9254 break;
9255
9256 case ObjCTypeParamVariance::Covariant:
9257 if (!canAssignObjCObjectTypes(ctx, lhsArgs[i], rhsArgs[i]))
9258 return false;
9259 break;
9260
9261 case ObjCTypeParamVariance::Contravariant:
9262 if (!canAssignObjCObjectTypes(ctx, rhsArgs[i], lhsArgs[i]))
9263 return false;
9264 break;
9265 }
9266 }
9267
9268 return true;
9269 }
9270
areCommonBaseCompatible(const ObjCObjectPointerType * Lptr,const ObjCObjectPointerType * Rptr)9271 QualType ASTContext::areCommonBaseCompatible(
9272 const ObjCObjectPointerType *Lptr,
9273 const ObjCObjectPointerType *Rptr) {
9274 const ObjCObjectType *LHS = Lptr->getObjectType();
9275 const ObjCObjectType *RHS = Rptr->getObjectType();
9276 const ObjCInterfaceDecl* LDecl = LHS->getInterface();
9277 const ObjCInterfaceDecl* RDecl = RHS->getInterface();
9278
9279 if (!LDecl || !RDecl)
9280 return {};
9281
9282 // When either LHS or RHS is a kindof type, we should return a kindof type.
9283 // For example, for common base of kindof(ASub1) and kindof(ASub2), we return
9284 // kindof(A).
9285 bool anyKindOf = LHS->isKindOfType() || RHS->isKindOfType();
9286
9287 // Follow the left-hand side up the class hierarchy until we either hit a
9288 // root or find the RHS. Record the ancestors in case we don't find it.
9289 llvm::SmallDenseMap<const ObjCInterfaceDecl *, const ObjCObjectType *, 4>
9290 LHSAncestors;
9291 while (true) {
9292 // Record this ancestor. We'll need this if the common type isn't in the
9293 // path from the LHS to the root.
9294 LHSAncestors[LHS->getInterface()->getCanonicalDecl()] = LHS;
9295
9296 if (declaresSameEntity(LHS->getInterface(), RDecl)) {
9297 // Get the type arguments.
9298 ArrayRef<QualType> LHSTypeArgs = LHS->getTypeArgsAsWritten();
9299 bool anyChanges = false;
9300 if (LHS->isSpecialized() && RHS->isSpecialized()) {
9301 // Both have type arguments, compare them.
9302 if (!sameObjCTypeArgs(*this, LHS->getInterface(),
9303 LHS->getTypeArgs(), RHS->getTypeArgs(),
9304 /*stripKindOf=*/true))
9305 return {};
9306 } else if (LHS->isSpecialized() != RHS->isSpecialized()) {
9307 // If only one has type arguments, the result will not have type
9308 // arguments.
9309 LHSTypeArgs = {};
9310 anyChanges = true;
9311 }
9312
9313 // Compute the intersection of protocols.
9314 SmallVector<ObjCProtocolDecl *, 8> Protocols;
9315 getIntersectionOfProtocols(*this, LHS->getInterface(), Lptr, Rptr,
9316 Protocols);
9317 if (!Protocols.empty())
9318 anyChanges = true;
9319
9320 // If anything in the LHS will have changed, build a new result type.
9321 // If we need to return a kindof type but LHS is not a kindof type, we
9322 // build a new result type.
9323 if (anyChanges || LHS->isKindOfType() != anyKindOf) {
9324 QualType Result = getObjCInterfaceType(LHS->getInterface());
9325 Result = getObjCObjectType(Result, LHSTypeArgs, Protocols,
9326 anyKindOf || LHS->isKindOfType());
9327 return getObjCObjectPointerType(Result);
9328 }
9329
9330 return getObjCObjectPointerType(QualType(LHS, 0));
9331 }
9332
9333 // Find the superclass.
9334 QualType LHSSuperType = LHS->getSuperClassType();
9335 if (LHSSuperType.isNull())
9336 break;
9337
9338 LHS = LHSSuperType->castAs<ObjCObjectType>();
9339 }
9340
9341 // We didn't find anything by following the LHS to its root; now check
9342 // the RHS against the cached set of ancestors.
9343 while (true) {
9344 auto KnownLHS = LHSAncestors.find(RHS->getInterface()->getCanonicalDecl());
9345 if (KnownLHS != LHSAncestors.end()) {
9346 LHS = KnownLHS->second;
9347
9348 // Get the type arguments.
9349 ArrayRef<QualType> RHSTypeArgs = RHS->getTypeArgsAsWritten();
9350 bool anyChanges = false;
9351 if (LHS->isSpecialized() && RHS->isSpecialized()) {
9352 // Both have type arguments, compare them.
9353 if (!sameObjCTypeArgs(*this, LHS->getInterface(),
9354 LHS->getTypeArgs(), RHS->getTypeArgs(),
9355 /*stripKindOf=*/true))
9356 return {};
9357 } else if (LHS->isSpecialized() != RHS->isSpecialized()) {
9358 // If only one has type arguments, the result will not have type
9359 // arguments.
9360 RHSTypeArgs = {};
9361 anyChanges = true;
9362 }
9363
9364 // Compute the intersection of protocols.
9365 SmallVector<ObjCProtocolDecl *, 8> Protocols;
9366 getIntersectionOfProtocols(*this, RHS->getInterface(), Lptr, Rptr,
9367 Protocols);
9368 if (!Protocols.empty())
9369 anyChanges = true;
9370
9371 // If we need to return a kindof type but RHS is not a kindof type, we
9372 // build a new result type.
9373 if (anyChanges || RHS->isKindOfType() != anyKindOf) {
9374 QualType Result = getObjCInterfaceType(RHS->getInterface());
9375 Result = getObjCObjectType(Result, RHSTypeArgs, Protocols,
9376 anyKindOf || RHS->isKindOfType());
9377 return getObjCObjectPointerType(Result);
9378 }
9379
9380 return getObjCObjectPointerType(QualType(RHS, 0));
9381 }
9382
9383 // Find the superclass of the RHS.
9384 QualType RHSSuperType = RHS->getSuperClassType();
9385 if (RHSSuperType.isNull())
9386 break;
9387
9388 RHS = RHSSuperType->castAs<ObjCObjectType>();
9389 }
9390
9391 return {};
9392 }
9393
canAssignObjCInterfaces(const ObjCObjectType * LHS,const ObjCObjectType * RHS)9394 bool ASTContext::canAssignObjCInterfaces(const ObjCObjectType *LHS,
9395 const ObjCObjectType *RHS) {
9396 assert(LHS->getInterface() && "LHS is not an interface type");
9397 assert(RHS->getInterface() && "RHS is not an interface type");
9398
9399 // Verify that the base decls are compatible: the RHS must be a subclass of
9400 // the LHS.
9401 ObjCInterfaceDecl *LHSInterface = LHS->getInterface();
9402 bool IsSuperClass = LHSInterface->isSuperClassOf(RHS->getInterface());
9403 if (!IsSuperClass)
9404 return false;
9405
9406 // If the LHS has protocol qualifiers, determine whether all of them are
9407 // satisfied by the RHS (i.e., the RHS has a superset of the protocols in the
9408 // LHS).
9409 if (LHS->getNumProtocols() > 0) {
9410 // OK if conversion of LHS to SuperClass results in narrowing of types
9411 // ; i.e., SuperClass may implement at least one of the protocols
9412 // in LHS's protocol list. Example, SuperObj<P1> = lhs<P1,P2> is ok.
9413 // But not SuperObj<P1,P2,P3> = lhs<P1,P2>.
9414 llvm::SmallPtrSet<ObjCProtocolDecl *, 8> SuperClassInheritedProtocols;
9415 CollectInheritedProtocols(RHS->getInterface(), SuperClassInheritedProtocols);
9416 // Also, if RHS has explicit quelifiers, include them for comparing with LHS's
9417 // qualifiers.
9418 for (auto *RHSPI : RHS->quals())
9419 CollectInheritedProtocols(RHSPI, SuperClassInheritedProtocols);
9420 // If there is no protocols associated with RHS, it is not a match.
9421 if (SuperClassInheritedProtocols.empty())
9422 return false;
9423
9424 for (const auto *LHSProto : LHS->quals()) {
9425 bool SuperImplementsProtocol = false;
9426 for (auto *SuperClassProto : SuperClassInheritedProtocols)
9427 if (SuperClassProto->lookupProtocolNamed(LHSProto->getIdentifier())) {
9428 SuperImplementsProtocol = true;
9429 break;
9430 }
9431 if (!SuperImplementsProtocol)
9432 return false;
9433 }
9434 }
9435
9436 // If the LHS is specialized, we may need to check type arguments.
9437 if (LHS->isSpecialized()) {
9438 // Follow the superclass chain until we've matched the LHS class in the
9439 // hierarchy. This substitutes type arguments through.
9440 const ObjCObjectType *RHSSuper = RHS;
9441 while (!declaresSameEntity(RHSSuper->getInterface(), LHSInterface))
9442 RHSSuper = RHSSuper->getSuperClassType()->castAs<ObjCObjectType>();
9443
9444 // If the RHS is specializd, compare type arguments.
9445 if (RHSSuper->isSpecialized() &&
9446 !sameObjCTypeArgs(*this, LHS->getInterface(),
9447 LHS->getTypeArgs(), RHSSuper->getTypeArgs(),
9448 /*stripKindOf=*/true)) {
9449 return false;
9450 }
9451 }
9452
9453 return true;
9454 }
9455
areComparableObjCPointerTypes(QualType LHS,QualType RHS)9456 bool ASTContext::areComparableObjCPointerTypes(QualType LHS, QualType RHS) {
9457 // get the "pointed to" types
9458 const auto *LHSOPT = LHS->getAs<ObjCObjectPointerType>();
9459 const auto *RHSOPT = RHS->getAs<ObjCObjectPointerType>();
9460
9461 if (!LHSOPT || !RHSOPT)
9462 return false;
9463
9464 return canAssignObjCInterfaces(LHSOPT, RHSOPT) ||
9465 canAssignObjCInterfaces(RHSOPT, LHSOPT);
9466 }
9467
canBindObjCObjectType(QualType To,QualType From)9468 bool ASTContext::canBindObjCObjectType(QualType To, QualType From) {
9469 return canAssignObjCInterfaces(
9470 getObjCObjectPointerType(To)->castAs<ObjCObjectPointerType>(),
9471 getObjCObjectPointerType(From)->castAs<ObjCObjectPointerType>());
9472 }
9473
9474 /// typesAreCompatible - C99 6.7.3p9: For two qualified types to be compatible,
9475 /// both shall have the identically qualified version of a compatible type.
9476 /// C99 6.2.7p1: Two types have compatible types if their types are the
9477 /// same. See 6.7.[2,3,5] for additional rules.
typesAreCompatible(QualType LHS,QualType RHS,bool CompareUnqualified)9478 bool ASTContext::typesAreCompatible(QualType LHS, QualType RHS,
9479 bool CompareUnqualified) {
9480 if (getLangOpts().CPlusPlus)
9481 return hasSameType(LHS, RHS);
9482
9483 return !mergeTypes(LHS, RHS, false, CompareUnqualified).isNull();
9484 }
9485
propertyTypesAreCompatible(QualType LHS,QualType RHS)9486 bool ASTContext::propertyTypesAreCompatible(QualType LHS, QualType RHS) {
9487 return typesAreCompatible(LHS, RHS);
9488 }
9489
typesAreBlockPointerCompatible(QualType LHS,QualType RHS)9490 bool ASTContext::typesAreBlockPointerCompatible(QualType LHS, QualType RHS) {
9491 return !mergeTypes(LHS, RHS, true).isNull();
9492 }
9493
9494 /// mergeTransparentUnionType - if T is a transparent union type and a member
9495 /// of T is compatible with SubType, return the merged type, else return
9496 /// QualType()
mergeTransparentUnionType(QualType T,QualType SubType,bool OfBlockPointer,bool Unqualified)9497 QualType ASTContext::mergeTransparentUnionType(QualType T, QualType SubType,
9498 bool OfBlockPointer,
9499 bool Unqualified) {
9500 if (const RecordType *UT = T->getAsUnionType()) {
9501 RecordDecl *UD = UT->getDecl();
9502 if (UD->hasAttr<TransparentUnionAttr>()) {
9503 for (const auto *I : UD->fields()) {
9504 QualType ET = I->getType().getUnqualifiedType();
9505 QualType MT = mergeTypes(ET, SubType, OfBlockPointer, Unqualified);
9506 if (!MT.isNull())
9507 return MT;
9508 }
9509 }
9510 }
9511
9512 return {};
9513 }
9514
9515 /// mergeFunctionParameterTypes - merge two types which appear as function
9516 /// parameter types
mergeFunctionParameterTypes(QualType lhs,QualType rhs,bool OfBlockPointer,bool Unqualified)9517 QualType ASTContext::mergeFunctionParameterTypes(QualType lhs, QualType rhs,
9518 bool OfBlockPointer,
9519 bool Unqualified) {
9520 // GNU extension: two types are compatible if they appear as a function
9521 // argument, one of the types is a transparent union type and the other
9522 // type is compatible with a union member
9523 QualType lmerge = mergeTransparentUnionType(lhs, rhs, OfBlockPointer,
9524 Unqualified);
9525 if (!lmerge.isNull())
9526 return lmerge;
9527
9528 QualType rmerge = mergeTransparentUnionType(rhs, lhs, OfBlockPointer,
9529 Unqualified);
9530 if (!rmerge.isNull())
9531 return rmerge;
9532
9533 return mergeTypes(lhs, rhs, OfBlockPointer, Unqualified);
9534 }
9535
mergeFunctionTypes(QualType lhs,QualType rhs,bool OfBlockPointer,bool Unqualified,bool AllowCXX)9536 QualType ASTContext::mergeFunctionTypes(QualType lhs, QualType rhs,
9537 bool OfBlockPointer, bool Unqualified,
9538 bool AllowCXX) {
9539 const auto *lbase = lhs->castAs<FunctionType>();
9540 const auto *rbase = rhs->castAs<FunctionType>();
9541 const auto *lproto = dyn_cast<FunctionProtoType>(lbase);
9542 const auto *rproto = dyn_cast<FunctionProtoType>(rbase);
9543 bool allLTypes = true;
9544 bool allRTypes = true;
9545
9546 // Check return type
9547 QualType retType;
9548 if (OfBlockPointer) {
9549 QualType RHS = rbase->getReturnType();
9550 QualType LHS = lbase->getReturnType();
9551 bool UnqualifiedResult = Unqualified;
9552 if (!UnqualifiedResult)
9553 UnqualifiedResult = (!RHS.hasQualifiers() && LHS.hasQualifiers());
9554 retType = mergeTypes(LHS, RHS, true, UnqualifiedResult, true);
9555 }
9556 else
9557 retType = mergeTypes(lbase->getReturnType(), rbase->getReturnType(), false,
9558 Unqualified);
9559 if (retType.isNull())
9560 return {};
9561
9562 if (Unqualified)
9563 retType = retType.getUnqualifiedType();
9564
9565 CanQualType LRetType = getCanonicalType(lbase->getReturnType());
9566 CanQualType RRetType = getCanonicalType(rbase->getReturnType());
9567 if (Unqualified) {
9568 LRetType = LRetType.getUnqualifiedType();
9569 RRetType = RRetType.getUnqualifiedType();
9570 }
9571
9572 if (getCanonicalType(retType) != LRetType)
9573 allLTypes = false;
9574 if (getCanonicalType(retType) != RRetType)
9575 allRTypes = false;
9576
9577 // FIXME: double check this
9578 // FIXME: should we error if lbase->getRegParmAttr() != 0 &&
9579 // rbase->getRegParmAttr() != 0 &&
9580 // lbase->getRegParmAttr() != rbase->getRegParmAttr()?
9581 FunctionType::ExtInfo lbaseInfo = lbase->getExtInfo();
9582 FunctionType::ExtInfo rbaseInfo = rbase->getExtInfo();
9583
9584 // Compatible functions must have compatible calling conventions
9585 if (lbaseInfo.getCC() != rbaseInfo.getCC())
9586 return {};
9587
9588 // Regparm is part of the calling convention.
9589 if (lbaseInfo.getHasRegParm() != rbaseInfo.getHasRegParm())
9590 return {};
9591 if (lbaseInfo.getRegParm() != rbaseInfo.getRegParm())
9592 return {};
9593
9594 if (lbaseInfo.getProducesResult() != rbaseInfo.getProducesResult())
9595 return {};
9596 if (lbaseInfo.getNoCallerSavedRegs() != rbaseInfo.getNoCallerSavedRegs())
9597 return {};
9598 if (lbaseInfo.getNoCfCheck() != rbaseInfo.getNoCfCheck())
9599 return {};
9600
9601 // FIXME: some uses, e.g. conditional exprs, really want this to be 'both'.
9602 bool NoReturn = lbaseInfo.getNoReturn() || rbaseInfo.getNoReturn();
9603
9604 if (lbaseInfo.getNoReturn() != NoReturn)
9605 allLTypes = false;
9606 if (rbaseInfo.getNoReturn() != NoReturn)
9607 allRTypes = false;
9608
9609 FunctionType::ExtInfo einfo = lbaseInfo.withNoReturn(NoReturn);
9610
9611 if (lproto && rproto) { // two C99 style function prototypes
9612 assert((AllowCXX ||
9613 (!lproto->hasExceptionSpec() && !rproto->hasExceptionSpec())) &&
9614 "C++ shouldn't be here");
9615 // Compatible functions must have the same number of parameters
9616 if (lproto->getNumParams() != rproto->getNumParams())
9617 return {};
9618
9619 // Variadic and non-variadic functions aren't compatible
9620 if (lproto->isVariadic() != rproto->isVariadic())
9621 return {};
9622
9623 if (lproto->getMethodQuals() != rproto->getMethodQuals())
9624 return {};
9625
9626 SmallVector<FunctionProtoType::ExtParameterInfo, 4> newParamInfos;
9627 bool canUseLeft, canUseRight;
9628 if (!mergeExtParameterInfo(lproto, rproto, canUseLeft, canUseRight,
9629 newParamInfos))
9630 return {};
9631
9632 if (!canUseLeft)
9633 allLTypes = false;
9634 if (!canUseRight)
9635 allRTypes = false;
9636
9637 // Check parameter type compatibility
9638 SmallVector<QualType, 10> types;
9639 for (unsigned i = 0, n = lproto->getNumParams(); i < n; i++) {
9640 QualType lParamType = lproto->getParamType(i).getUnqualifiedType();
9641 QualType rParamType = rproto->getParamType(i).getUnqualifiedType();
9642 QualType paramType = mergeFunctionParameterTypes(
9643 lParamType, rParamType, OfBlockPointer, Unqualified);
9644 if (paramType.isNull())
9645 return {};
9646
9647 if (Unqualified)
9648 paramType = paramType.getUnqualifiedType();
9649
9650 types.push_back(paramType);
9651 if (Unqualified) {
9652 lParamType = lParamType.getUnqualifiedType();
9653 rParamType = rParamType.getUnqualifiedType();
9654 }
9655
9656 if (getCanonicalType(paramType) != getCanonicalType(lParamType))
9657 allLTypes = false;
9658 if (getCanonicalType(paramType) != getCanonicalType(rParamType))
9659 allRTypes = false;
9660 }
9661
9662 if (allLTypes) return lhs;
9663 if (allRTypes) return rhs;
9664
9665 FunctionProtoType::ExtProtoInfo EPI = lproto->getExtProtoInfo();
9666 EPI.ExtInfo = einfo;
9667 EPI.ExtParameterInfos =
9668 newParamInfos.empty() ? nullptr : newParamInfos.data();
9669 return getFunctionType(retType, types, EPI);
9670 }
9671
9672 if (lproto) allRTypes = false;
9673 if (rproto) allLTypes = false;
9674
9675 const FunctionProtoType *proto = lproto ? lproto : rproto;
9676 if (proto) {
9677 assert((AllowCXX || !proto->hasExceptionSpec()) && "C++ shouldn't be here");
9678 if (proto->isVariadic())
9679 return {};
9680 // Check that the types are compatible with the types that
9681 // would result from default argument promotions (C99 6.7.5.3p15).
9682 // The only types actually affected are promotable integer
9683 // types and floats, which would be passed as a different
9684 // type depending on whether the prototype is visible.
9685 for (unsigned i = 0, n = proto->getNumParams(); i < n; ++i) {
9686 QualType paramTy = proto->getParamType(i);
9687
9688 // Look at the converted type of enum types, since that is the type used
9689 // to pass enum values.
9690 if (const auto *Enum = paramTy->getAs<EnumType>()) {
9691 paramTy = Enum->getDecl()->getIntegerType();
9692 if (paramTy.isNull())
9693 return {};
9694 }
9695
9696 if (paramTy->isPromotableIntegerType() ||
9697 getCanonicalType(paramTy).getUnqualifiedType() == FloatTy)
9698 return {};
9699 }
9700
9701 if (allLTypes) return lhs;
9702 if (allRTypes) return rhs;
9703
9704 FunctionProtoType::ExtProtoInfo EPI = proto->getExtProtoInfo();
9705 EPI.ExtInfo = einfo;
9706 return getFunctionType(retType, proto->getParamTypes(), EPI);
9707 }
9708
9709 if (allLTypes) return lhs;
9710 if (allRTypes) return rhs;
9711 return getFunctionNoProtoType(retType, einfo);
9712 }
9713
9714 /// Given that we have an enum type and a non-enum type, try to merge them.
mergeEnumWithInteger(ASTContext & Context,const EnumType * ET,QualType other,bool isBlockReturnType)9715 static QualType mergeEnumWithInteger(ASTContext &Context, const EnumType *ET,
9716 QualType other, bool isBlockReturnType) {
9717 // C99 6.7.2.2p4: Each enumerated type shall be compatible with char,
9718 // a signed integer type, or an unsigned integer type.
9719 // Compatibility is based on the underlying type, not the promotion
9720 // type.
9721 QualType underlyingType = ET->getDecl()->getIntegerType();
9722 if (underlyingType.isNull())
9723 return {};
9724 if (Context.hasSameType(underlyingType, other))
9725 return other;
9726
9727 // In block return types, we're more permissive and accept any
9728 // integral type of the same size.
9729 if (isBlockReturnType && other->isIntegerType() &&
9730 Context.getTypeSize(underlyingType) == Context.getTypeSize(other))
9731 return other;
9732
9733 return {};
9734 }
9735
mergeTypes(QualType LHS,QualType RHS,bool OfBlockPointer,bool Unqualified,bool BlockReturnType)9736 QualType ASTContext::mergeTypes(QualType LHS, QualType RHS,
9737 bool OfBlockPointer,
9738 bool Unqualified, bool BlockReturnType) {
9739 // For C++ we will not reach this code with reference types (see below),
9740 // for OpenMP variant call overloading we might.
9741 //
9742 // C++ [expr]: If an expression initially has the type "reference to T", the
9743 // type is adjusted to "T" prior to any further analysis, the expression
9744 // designates the object or function denoted by the reference, and the
9745 // expression is an lvalue unless the reference is an rvalue reference and
9746 // the expression is a function call (possibly inside parentheses).
9747 if (LangOpts.OpenMP && LHS->getAs<ReferenceType>() &&
9748 RHS->getAs<ReferenceType>() && LHS->getTypeClass() == RHS->getTypeClass())
9749 return mergeTypes(LHS->getAs<ReferenceType>()->getPointeeType(),
9750 RHS->getAs<ReferenceType>()->getPointeeType(),
9751 OfBlockPointer, Unqualified, BlockReturnType);
9752 if (LHS->getAs<ReferenceType>() || RHS->getAs<ReferenceType>())
9753 return {};
9754
9755 if (Unqualified) {
9756 LHS = LHS.getUnqualifiedType();
9757 RHS = RHS.getUnqualifiedType();
9758 }
9759
9760 QualType LHSCan = getCanonicalType(LHS),
9761 RHSCan = getCanonicalType(RHS);
9762
9763 // If two types are identical, they are compatible.
9764 if (LHSCan == RHSCan)
9765 return LHS;
9766
9767 // If the qualifiers are different, the types aren't compatible... mostly.
9768 Qualifiers LQuals = LHSCan.getLocalQualifiers();
9769 Qualifiers RQuals = RHSCan.getLocalQualifiers();
9770 if (LQuals != RQuals) {
9771 // If any of these qualifiers are different, we have a type
9772 // mismatch.
9773 if (LQuals.getCVRQualifiers() != RQuals.getCVRQualifiers() ||
9774 LQuals.getAddressSpace() != RQuals.getAddressSpace() ||
9775 LQuals.getObjCLifetime() != RQuals.getObjCLifetime() ||
9776 LQuals.hasUnaligned() != RQuals.hasUnaligned())
9777 return {};
9778
9779 // Exactly one GC qualifier difference is allowed: __strong is
9780 // okay if the other type has no GC qualifier but is an Objective
9781 // C object pointer (i.e. implicitly strong by default). We fix
9782 // this by pretending that the unqualified type was actually
9783 // qualified __strong.
9784 Qualifiers::GC GC_L = LQuals.getObjCGCAttr();
9785 Qualifiers::GC GC_R = RQuals.getObjCGCAttr();
9786 assert((GC_L != GC_R) && "unequal qualifier sets had only equal elements");
9787
9788 if (GC_L == Qualifiers::Weak || GC_R == Qualifiers::Weak)
9789 return {};
9790
9791 if (GC_L == Qualifiers::Strong && RHSCan->isObjCObjectPointerType()) {
9792 return mergeTypes(LHS, getObjCGCQualType(RHS, Qualifiers::Strong));
9793 }
9794 if (GC_R == Qualifiers::Strong && LHSCan->isObjCObjectPointerType()) {
9795 return mergeTypes(getObjCGCQualType(LHS, Qualifiers::Strong), RHS);
9796 }
9797 return {};
9798 }
9799
9800 // Okay, qualifiers are equal.
9801
9802 Type::TypeClass LHSClass = LHSCan->getTypeClass();
9803 Type::TypeClass RHSClass = RHSCan->getTypeClass();
9804
9805 // We want to consider the two function types to be the same for these
9806 // comparisons, just force one to the other.
9807 if (LHSClass == Type::FunctionProto) LHSClass = Type::FunctionNoProto;
9808 if (RHSClass == Type::FunctionProto) RHSClass = Type::FunctionNoProto;
9809
9810 // Same as above for arrays
9811 if (LHSClass == Type::VariableArray || LHSClass == Type::IncompleteArray)
9812 LHSClass = Type::ConstantArray;
9813 if (RHSClass == Type::VariableArray || RHSClass == Type::IncompleteArray)
9814 RHSClass = Type::ConstantArray;
9815
9816 // ObjCInterfaces are just specialized ObjCObjects.
9817 if (LHSClass == Type::ObjCInterface) LHSClass = Type::ObjCObject;
9818 if (RHSClass == Type::ObjCInterface) RHSClass = Type::ObjCObject;
9819
9820 // Canonicalize ExtVector -> Vector.
9821 if (LHSClass == Type::ExtVector) LHSClass = Type::Vector;
9822 if (RHSClass == Type::ExtVector) RHSClass = Type::Vector;
9823
9824 // If the canonical type classes don't match.
9825 if (LHSClass != RHSClass) {
9826 // Note that we only have special rules for turning block enum
9827 // returns into block int returns, not vice-versa.
9828 if (const auto *ETy = LHS->getAs<EnumType>()) {
9829 return mergeEnumWithInteger(*this, ETy, RHS, false);
9830 }
9831 if (const EnumType* ETy = RHS->getAs<EnumType>()) {
9832 return mergeEnumWithInteger(*this, ETy, LHS, BlockReturnType);
9833 }
9834 // allow block pointer type to match an 'id' type.
9835 if (OfBlockPointer && !BlockReturnType) {
9836 if (LHS->isObjCIdType() && RHS->isBlockPointerType())
9837 return LHS;
9838 if (RHS->isObjCIdType() && LHS->isBlockPointerType())
9839 return RHS;
9840 }
9841
9842 return {};
9843 }
9844
9845 // The canonical type classes match.
9846 switch (LHSClass) {
9847 #define TYPE(Class, Base)
9848 #define ABSTRACT_TYPE(Class, Base)
9849 #define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base) case Type::Class:
9850 #define NON_CANONICAL_TYPE(Class, Base) case Type::Class:
9851 #define DEPENDENT_TYPE(Class, Base) case Type::Class:
9852 #include "clang/AST/TypeNodes.inc"
9853 llvm_unreachable("Non-canonical and dependent types shouldn't get here");
9854
9855 case Type::Auto:
9856 case Type::DeducedTemplateSpecialization:
9857 case Type::LValueReference:
9858 case Type::RValueReference:
9859 case Type::MemberPointer:
9860 llvm_unreachable("C++ should never be in mergeTypes");
9861
9862 case Type::ObjCInterface:
9863 case Type::IncompleteArray:
9864 case Type::VariableArray:
9865 case Type::FunctionProto:
9866 case Type::ExtVector:
9867 llvm_unreachable("Types are eliminated above");
9868
9869 case Type::Pointer:
9870 {
9871 // Merge two pointer types, while trying to preserve typedef info
9872 QualType LHSPointee = LHS->castAs<PointerType>()->getPointeeType();
9873 QualType RHSPointee = RHS->castAs<PointerType>()->getPointeeType();
9874 if (Unqualified) {
9875 LHSPointee = LHSPointee.getUnqualifiedType();
9876 RHSPointee = RHSPointee.getUnqualifiedType();
9877 }
9878 QualType ResultType = mergeTypes(LHSPointee, RHSPointee, false,
9879 Unqualified);
9880 if (ResultType.isNull())
9881 return {};
9882 if (getCanonicalType(LHSPointee) == getCanonicalType(ResultType))
9883 return LHS;
9884 if (getCanonicalType(RHSPointee) == getCanonicalType(ResultType))
9885 return RHS;
9886 return getPointerType(ResultType);
9887 }
9888 case Type::BlockPointer:
9889 {
9890 // Merge two block pointer types, while trying to preserve typedef info
9891 QualType LHSPointee = LHS->castAs<BlockPointerType>()->getPointeeType();
9892 QualType RHSPointee = RHS->castAs<BlockPointerType>()->getPointeeType();
9893 if (Unqualified) {
9894 LHSPointee = LHSPointee.getUnqualifiedType();
9895 RHSPointee = RHSPointee.getUnqualifiedType();
9896 }
9897 if (getLangOpts().OpenCL) {
9898 Qualifiers LHSPteeQual = LHSPointee.getQualifiers();
9899 Qualifiers RHSPteeQual = RHSPointee.getQualifiers();
9900 // Blocks can't be an expression in a ternary operator (OpenCL v2.0
9901 // 6.12.5) thus the following check is asymmetric.
9902 if (!LHSPteeQual.isAddressSpaceSupersetOf(RHSPteeQual))
9903 return {};
9904 LHSPteeQual.removeAddressSpace();
9905 RHSPteeQual.removeAddressSpace();
9906 LHSPointee =
9907 QualType(LHSPointee.getTypePtr(), LHSPteeQual.getAsOpaqueValue());
9908 RHSPointee =
9909 QualType(RHSPointee.getTypePtr(), RHSPteeQual.getAsOpaqueValue());
9910 }
9911 QualType ResultType = mergeTypes(LHSPointee, RHSPointee, OfBlockPointer,
9912 Unqualified);
9913 if (ResultType.isNull())
9914 return {};
9915 if (getCanonicalType(LHSPointee) == getCanonicalType(ResultType))
9916 return LHS;
9917 if (getCanonicalType(RHSPointee) == getCanonicalType(ResultType))
9918 return RHS;
9919 return getBlockPointerType(ResultType);
9920 }
9921 case Type::Atomic:
9922 {
9923 // Merge two pointer types, while trying to preserve typedef info
9924 QualType LHSValue = LHS->castAs<AtomicType>()->getValueType();
9925 QualType RHSValue = RHS->castAs<AtomicType>()->getValueType();
9926 if (Unqualified) {
9927 LHSValue = LHSValue.getUnqualifiedType();
9928 RHSValue = RHSValue.getUnqualifiedType();
9929 }
9930 QualType ResultType = mergeTypes(LHSValue, RHSValue, false,
9931 Unqualified);
9932 if (ResultType.isNull())
9933 return {};
9934 if (getCanonicalType(LHSValue) == getCanonicalType(ResultType))
9935 return LHS;
9936 if (getCanonicalType(RHSValue) == getCanonicalType(ResultType))
9937 return RHS;
9938 return getAtomicType(ResultType);
9939 }
9940 case Type::ConstantArray:
9941 {
9942 const ConstantArrayType* LCAT = getAsConstantArrayType(LHS);
9943 const ConstantArrayType* RCAT = getAsConstantArrayType(RHS);
9944 if (LCAT && RCAT && RCAT->getSize() != LCAT->getSize())
9945 return {};
9946
9947 QualType LHSElem = getAsArrayType(LHS)->getElementType();
9948 QualType RHSElem = getAsArrayType(RHS)->getElementType();
9949 if (Unqualified) {
9950 LHSElem = LHSElem.getUnqualifiedType();
9951 RHSElem = RHSElem.getUnqualifiedType();
9952 }
9953
9954 QualType ResultType = mergeTypes(LHSElem, RHSElem, false, Unqualified);
9955 if (ResultType.isNull())
9956 return {};
9957
9958 const VariableArrayType* LVAT = getAsVariableArrayType(LHS);
9959 const VariableArrayType* RVAT = getAsVariableArrayType(RHS);
9960
9961 // If either side is a variable array, and both are complete, check whether
9962 // the current dimension is definite.
9963 if (LVAT || RVAT) {
9964 auto SizeFetch = [this](const VariableArrayType* VAT,
9965 const ConstantArrayType* CAT)
9966 -> std::pair<bool,llvm::APInt> {
9967 if (VAT) {
9968 Optional<llvm::APSInt> TheInt;
9969 Expr *E = VAT->getSizeExpr();
9970 if (E && (TheInt = E->getIntegerConstantExpr(*this)))
9971 return std::make_pair(true, *TheInt);
9972 return std::make_pair(false, llvm::APSInt());
9973 }
9974 if (CAT)
9975 return std::make_pair(true, CAT->getSize());
9976 return std::make_pair(false, llvm::APInt());
9977 };
9978
9979 bool HaveLSize, HaveRSize;
9980 llvm::APInt LSize, RSize;
9981 std::tie(HaveLSize, LSize) = SizeFetch(LVAT, LCAT);
9982 std::tie(HaveRSize, RSize) = SizeFetch(RVAT, RCAT);
9983 if (HaveLSize && HaveRSize && !llvm::APInt::isSameValue(LSize, RSize))
9984 return {}; // Definite, but unequal, array dimension
9985 }
9986
9987 if (LCAT && getCanonicalType(LHSElem) == getCanonicalType(ResultType))
9988 return LHS;
9989 if (RCAT && getCanonicalType(RHSElem) == getCanonicalType(ResultType))
9990 return RHS;
9991 if (LCAT)
9992 return getConstantArrayType(ResultType, LCAT->getSize(),
9993 LCAT->getSizeExpr(),
9994 ArrayType::ArraySizeModifier(), 0);
9995 if (RCAT)
9996 return getConstantArrayType(ResultType, RCAT->getSize(),
9997 RCAT->getSizeExpr(),
9998 ArrayType::ArraySizeModifier(), 0);
9999 if (LVAT && getCanonicalType(LHSElem) == getCanonicalType(ResultType))
10000 return LHS;
10001 if (RVAT && getCanonicalType(RHSElem) == getCanonicalType(ResultType))
10002 return RHS;
10003 if (LVAT) {
10004 // FIXME: This isn't correct! But tricky to implement because
10005 // the array's size has to be the size of LHS, but the type
10006 // has to be different.
10007 return LHS;
10008 }
10009 if (RVAT) {
10010 // FIXME: This isn't correct! But tricky to implement because
10011 // the array's size has to be the size of RHS, but the type
10012 // has to be different.
10013 return RHS;
10014 }
10015 if (getCanonicalType(LHSElem) == getCanonicalType(ResultType)) return LHS;
10016 if (getCanonicalType(RHSElem) == getCanonicalType(ResultType)) return RHS;
10017 return getIncompleteArrayType(ResultType,
10018 ArrayType::ArraySizeModifier(), 0);
10019 }
10020 case Type::FunctionNoProto:
10021 return mergeFunctionTypes(LHS, RHS, OfBlockPointer, Unqualified);
10022 case Type::Record:
10023 case Type::Enum:
10024 return {};
10025 case Type::Builtin:
10026 // Only exactly equal builtin types are compatible, which is tested above.
10027 return {};
10028 case Type::Complex:
10029 // Distinct complex types are incompatible.
10030 return {};
10031 case Type::Vector:
10032 // FIXME: The merged type should be an ExtVector!
10033 if (areCompatVectorTypes(LHSCan->castAs<VectorType>(),
10034 RHSCan->castAs<VectorType>()))
10035 return LHS;
10036 return {};
10037 case Type::ConstantMatrix:
10038 if (areCompatMatrixTypes(LHSCan->castAs<ConstantMatrixType>(),
10039 RHSCan->castAs<ConstantMatrixType>()))
10040 return LHS;
10041 return {};
10042 case Type::ObjCObject: {
10043 // Check if the types are assignment compatible.
10044 // FIXME: This should be type compatibility, e.g. whether
10045 // "LHS x; RHS x;" at global scope is legal.
10046 if (canAssignObjCInterfaces(LHS->castAs<ObjCObjectType>(),
10047 RHS->castAs<ObjCObjectType>()))
10048 return LHS;
10049 return {};
10050 }
10051 case Type::ObjCObjectPointer:
10052 if (OfBlockPointer) {
10053 if (canAssignObjCInterfacesInBlockPointer(
10054 LHS->castAs<ObjCObjectPointerType>(),
10055 RHS->castAs<ObjCObjectPointerType>(), BlockReturnType))
10056 return LHS;
10057 return {};
10058 }
10059 if (canAssignObjCInterfaces(LHS->castAs<ObjCObjectPointerType>(),
10060 RHS->castAs<ObjCObjectPointerType>()))
10061 return LHS;
10062 return {};
10063 case Type::Pipe:
10064 assert(LHS != RHS &&
10065 "Equivalent pipe types should have already been handled!");
10066 return {};
10067 case Type::ExtInt: {
10068 // Merge two ext-int types, while trying to preserve typedef info.
10069 bool LHSUnsigned = LHS->castAs<ExtIntType>()->isUnsigned();
10070 bool RHSUnsigned = RHS->castAs<ExtIntType>()->isUnsigned();
10071 unsigned LHSBits = LHS->castAs<ExtIntType>()->getNumBits();
10072 unsigned RHSBits = RHS->castAs<ExtIntType>()->getNumBits();
10073
10074 // Like unsigned/int, shouldn't have a type if they don't match.
10075 if (LHSUnsigned != RHSUnsigned)
10076 return {};
10077
10078 if (LHSBits != RHSBits)
10079 return {};
10080 return LHS;
10081 }
10082 }
10083
10084 llvm_unreachable("Invalid Type::Class!");
10085 }
10086
mergeExtParameterInfo(const FunctionProtoType * FirstFnType,const FunctionProtoType * SecondFnType,bool & CanUseFirst,bool & CanUseSecond,SmallVectorImpl<FunctionProtoType::ExtParameterInfo> & NewParamInfos)10087 bool ASTContext::mergeExtParameterInfo(
10088 const FunctionProtoType *FirstFnType, const FunctionProtoType *SecondFnType,
10089 bool &CanUseFirst, bool &CanUseSecond,
10090 SmallVectorImpl<FunctionProtoType::ExtParameterInfo> &NewParamInfos) {
10091 assert(NewParamInfos.empty() && "param info list not empty");
10092 CanUseFirst = CanUseSecond = true;
10093 bool FirstHasInfo = FirstFnType->hasExtParameterInfos();
10094 bool SecondHasInfo = SecondFnType->hasExtParameterInfos();
10095
10096 // Fast path: if the first type doesn't have ext parameter infos,
10097 // we match if and only if the second type also doesn't have them.
10098 if (!FirstHasInfo && !SecondHasInfo)
10099 return true;
10100
10101 bool NeedParamInfo = false;
10102 size_t E = FirstHasInfo ? FirstFnType->getExtParameterInfos().size()
10103 : SecondFnType->getExtParameterInfos().size();
10104
10105 for (size_t I = 0; I < E; ++I) {
10106 FunctionProtoType::ExtParameterInfo FirstParam, SecondParam;
10107 if (FirstHasInfo)
10108 FirstParam = FirstFnType->getExtParameterInfo(I);
10109 if (SecondHasInfo)
10110 SecondParam = SecondFnType->getExtParameterInfo(I);
10111
10112 // Cannot merge unless everything except the noescape flag matches.
10113 if (FirstParam.withIsNoEscape(false) != SecondParam.withIsNoEscape(false))
10114 return false;
10115
10116 bool FirstNoEscape = FirstParam.isNoEscape();
10117 bool SecondNoEscape = SecondParam.isNoEscape();
10118 bool IsNoEscape = FirstNoEscape && SecondNoEscape;
10119 NewParamInfos.push_back(FirstParam.withIsNoEscape(IsNoEscape));
10120 if (NewParamInfos.back().getOpaqueValue())
10121 NeedParamInfo = true;
10122 if (FirstNoEscape != IsNoEscape)
10123 CanUseFirst = false;
10124 if (SecondNoEscape != IsNoEscape)
10125 CanUseSecond = false;
10126 }
10127
10128 if (!NeedParamInfo)
10129 NewParamInfos.clear();
10130
10131 return true;
10132 }
10133
ResetObjCLayout(const ObjCContainerDecl * CD)10134 void ASTContext::ResetObjCLayout(const ObjCContainerDecl *CD) {
10135 ObjCLayouts[CD] = nullptr;
10136 }
10137
10138 /// mergeObjCGCQualifiers - This routine merges ObjC's GC attribute of 'LHS' and
10139 /// 'RHS' attributes and returns the merged version; including for function
10140 /// return types.
mergeObjCGCQualifiers(QualType LHS,QualType RHS)10141 QualType ASTContext::mergeObjCGCQualifiers(QualType LHS, QualType RHS) {
10142 QualType LHSCan = getCanonicalType(LHS),
10143 RHSCan = getCanonicalType(RHS);
10144 // If two types are identical, they are compatible.
10145 if (LHSCan == RHSCan)
10146 return LHS;
10147 if (RHSCan->isFunctionType()) {
10148 if (!LHSCan->isFunctionType())
10149 return {};
10150 QualType OldReturnType =
10151 cast<FunctionType>(RHSCan.getTypePtr())->getReturnType();
10152 QualType NewReturnType =
10153 cast<FunctionType>(LHSCan.getTypePtr())->getReturnType();
10154 QualType ResReturnType =
10155 mergeObjCGCQualifiers(NewReturnType, OldReturnType);
10156 if (ResReturnType.isNull())
10157 return {};
10158 if (ResReturnType == NewReturnType || ResReturnType == OldReturnType) {
10159 // id foo(); ... __strong id foo(); or: __strong id foo(); ... id foo();
10160 // In either case, use OldReturnType to build the new function type.
10161 const auto *F = LHS->castAs<FunctionType>();
10162 if (const auto *FPT = cast<FunctionProtoType>(F)) {
10163 FunctionProtoType::ExtProtoInfo EPI = FPT->getExtProtoInfo();
10164 EPI.ExtInfo = getFunctionExtInfo(LHS);
10165 QualType ResultType =
10166 getFunctionType(OldReturnType, FPT->getParamTypes(), EPI);
10167 return ResultType;
10168 }
10169 }
10170 return {};
10171 }
10172
10173 // If the qualifiers are different, the types can still be merged.
10174 Qualifiers LQuals = LHSCan.getLocalQualifiers();
10175 Qualifiers RQuals = RHSCan.getLocalQualifiers();
10176 if (LQuals != RQuals) {
10177 // If any of these qualifiers are different, we have a type mismatch.
10178 if (LQuals.getCVRQualifiers() != RQuals.getCVRQualifiers() ||
10179 LQuals.getAddressSpace() != RQuals.getAddressSpace())
10180 return {};
10181
10182 // Exactly one GC qualifier difference is allowed: __strong is
10183 // okay if the other type has no GC qualifier but is an Objective
10184 // C object pointer (i.e. implicitly strong by default). We fix
10185 // this by pretending that the unqualified type was actually
10186 // qualified __strong.
10187 Qualifiers::GC GC_L = LQuals.getObjCGCAttr();
10188 Qualifiers::GC GC_R = RQuals.getObjCGCAttr();
10189 assert((GC_L != GC_R) && "unequal qualifier sets had only equal elements");
10190
10191 if (GC_L == Qualifiers::Weak || GC_R == Qualifiers::Weak)
10192 return {};
10193
10194 if (GC_L == Qualifiers::Strong)
10195 return LHS;
10196 if (GC_R == Qualifiers::Strong)
10197 return RHS;
10198 return {};
10199 }
10200
10201 if (LHSCan->isObjCObjectPointerType() && RHSCan->isObjCObjectPointerType()) {
10202 QualType LHSBaseQT = LHS->castAs<ObjCObjectPointerType>()->getPointeeType();
10203 QualType RHSBaseQT = RHS->castAs<ObjCObjectPointerType>()->getPointeeType();
10204 QualType ResQT = mergeObjCGCQualifiers(LHSBaseQT, RHSBaseQT);
10205 if (ResQT == LHSBaseQT)
10206 return LHS;
10207 if (ResQT == RHSBaseQT)
10208 return RHS;
10209 }
10210 return {};
10211 }
10212
10213 //===----------------------------------------------------------------------===//
10214 // Integer Predicates
10215 //===----------------------------------------------------------------------===//
10216
getIntWidth(QualType T) const10217 unsigned ASTContext::getIntWidth(QualType T) const {
10218 if (const auto *ET = T->getAs<EnumType>())
10219 T = ET->getDecl()->getIntegerType();
10220 if (T->isBooleanType())
10221 return 1;
10222 if(const auto *EIT = T->getAs<ExtIntType>())
10223 return EIT->getNumBits();
10224 // For builtin types, just use the standard type sizing method
10225 return (unsigned)getTypeSize(T);
10226 }
10227
getCorrespondingUnsignedType(QualType T) const10228 QualType ASTContext::getCorrespondingUnsignedType(QualType T) const {
10229 assert((T->hasSignedIntegerRepresentation() || T->isSignedFixedPointType()) &&
10230 "Unexpected type");
10231
10232 // Turn <4 x signed int> -> <4 x unsigned int>
10233 if (const auto *VTy = T->getAs<VectorType>())
10234 return getVectorType(getCorrespondingUnsignedType(VTy->getElementType()),
10235 VTy->getNumElements(), VTy->getVectorKind());
10236
10237 // For _ExtInt, return an unsigned _ExtInt with same width.
10238 if (const auto *EITy = T->getAs<ExtIntType>())
10239 return getExtIntType(/*IsUnsigned=*/true, EITy->getNumBits());
10240
10241 // For enums, get the underlying integer type of the enum, and let the general
10242 // integer type signchanging code handle it.
10243 if (const auto *ETy = T->getAs<EnumType>())
10244 T = ETy->getDecl()->getIntegerType();
10245
10246 switch (T->castAs<BuiltinType>()->getKind()) {
10247 case BuiltinType::Char_S:
10248 case BuiltinType::SChar:
10249 return UnsignedCharTy;
10250 case BuiltinType::Short:
10251 return UnsignedShortTy;
10252 case BuiltinType::Int:
10253 return UnsignedIntTy;
10254 case BuiltinType::Long:
10255 return UnsignedLongTy;
10256 case BuiltinType::LongLong:
10257 return UnsignedLongLongTy;
10258 case BuiltinType::Int128:
10259 return UnsignedInt128Ty;
10260 // wchar_t is special. It is either signed or not, but when it's signed,
10261 // there's no matching "unsigned wchar_t". Therefore we return the unsigned
10262 // version of it's underlying type instead.
10263 case BuiltinType::WChar_S:
10264 return getUnsignedWCharType();
10265
10266 case BuiltinType::ShortAccum:
10267 return UnsignedShortAccumTy;
10268 case BuiltinType::Accum:
10269 return UnsignedAccumTy;
10270 case BuiltinType::LongAccum:
10271 return UnsignedLongAccumTy;
10272 case BuiltinType::SatShortAccum:
10273 return SatUnsignedShortAccumTy;
10274 case BuiltinType::SatAccum:
10275 return SatUnsignedAccumTy;
10276 case BuiltinType::SatLongAccum:
10277 return SatUnsignedLongAccumTy;
10278 case BuiltinType::ShortFract:
10279 return UnsignedShortFractTy;
10280 case BuiltinType::Fract:
10281 return UnsignedFractTy;
10282 case BuiltinType::LongFract:
10283 return UnsignedLongFractTy;
10284 case BuiltinType::SatShortFract:
10285 return SatUnsignedShortFractTy;
10286 case BuiltinType::SatFract:
10287 return SatUnsignedFractTy;
10288 case BuiltinType::SatLongFract:
10289 return SatUnsignedLongFractTy;
10290 default:
10291 llvm_unreachable("Unexpected signed integer or fixed point type");
10292 }
10293 }
10294
getCorrespondingSignedType(QualType T) const10295 QualType ASTContext::getCorrespondingSignedType(QualType T) const {
10296 assert((T->hasUnsignedIntegerRepresentation() ||
10297 T->isUnsignedFixedPointType()) &&
10298 "Unexpected type");
10299
10300 // Turn <4 x unsigned int> -> <4 x signed int>
10301 if (const auto *VTy = T->getAs<VectorType>())
10302 return getVectorType(getCorrespondingSignedType(VTy->getElementType()),
10303 VTy->getNumElements(), VTy->getVectorKind());
10304
10305 // For _ExtInt, return a signed _ExtInt with same width.
10306 if (const auto *EITy = T->getAs<ExtIntType>())
10307 return getExtIntType(/*IsUnsigned=*/false, EITy->getNumBits());
10308
10309 // For enums, get the underlying integer type of the enum, and let the general
10310 // integer type signchanging code handle it.
10311 if (const auto *ETy = T->getAs<EnumType>())
10312 T = ETy->getDecl()->getIntegerType();
10313
10314 switch (T->castAs<BuiltinType>()->getKind()) {
10315 case BuiltinType::Char_U:
10316 case BuiltinType::UChar:
10317 return SignedCharTy;
10318 case BuiltinType::UShort:
10319 return ShortTy;
10320 case BuiltinType::UInt:
10321 return IntTy;
10322 case BuiltinType::ULong:
10323 return LongTy;
10324 case BuiltinType::ULongLong:
10325 return LongLongTy;
10326 case BuiltinType::UInt128:
10327 return Int128Ty;
10328 // wchar_t is special. It is either unsigned or not, but when it's unsigned,
10329 // there's no matching "signed wchar_t". Therefore we return the signed
10330 // version of it's underlying type instead.
10331 case BuiltinType::WChar_U:
10332 return getSignedWCharType();
10333
10334 case BuiltinType::UShortAccum:
10335 return ShortAccumTy;
10336 case BuiltinType::UAccum:
10337 return AccumTy;
10338 case BuiltinType::ULongAccum:
10339 return LongAccumTy;
10340 case BuiltinType::SatUShortAccum:
10341 return SatShortAccumTy;
10342 case BuiltinType::SatUAccum:
10343 return SatAccumTy;
10344 case BuiltinType::SatULongAccum:
10345 return SatLongAccumTy;
10346 case BuiltinType::UShortFract:
10347 return ShortFractTy;
10348 case BuiltinType::UFract:
10349 return FractTy;
10350 case BuiltinType::ULongFract:
10351 return LongFractTy;
10352 case BuiltinType::SatUShortFract:
10353 return SatShortFractTy;
10354 case BuiltinType::SatUFract:
10355 return SatFractTy;
10356 case BuiltinType::SatULongFract:
10357 return SatLongFractTy;
10358 default:
10359 llvm_unreachable("Unexpected unsigned integer or fixed point type");
10360 }
10361 }
10362
10363 ASTMutationListener::~ASTMutationListener() = default;
10364
DeducedReturnType(const FunctionDecl * FD,QualType ReturnType)10365 void ASTMutationListener::DeducedReturnType(const FunctionDecl *FD,
10366 QualType ReturnType) {}
10367
10368 //===----------------------------------------------------------------------===//
10369 // Builtin Type Computation
10370 //===----------------------------------------------------------------------===//
10371
10372 /// DecodeTypeFromStr - This decodes one type descriptor from Str, advancing the
10373 /// pointer over the consumed characters. This returns the resultant type. If
10374 /// AllowTypeModifiers is false then modifier like * are not parsed, just basic
10375 /// types. This allows "v2i*" to be parsed as a pointer to a v2i instead of
10376 /// a vector of "i*".
10377 ///
10378 /// RequiresICE is filled in on return to indicate whether the value is required
10379 /// to be an Integer Constant Expression.
DecodeTypeFromStr(const char * & Str,const ASTContext & Context,ASTContext::GetBuiltinTypeError & Error,bool & RequiresICE,bool AllowTypeModifiers)10380 static QualType DecodeTypeFromStr(const char *&Str, const ASTContext &Context,
10381 ASTContext::GetBuiltinTypeError &Error,
10382 bool &RequiresICE,
10383 bool AllowTypeModifiers) {
10384 // Modifiers.
10385 int HowLong = 0;
10386 bool Signed = false, Unsigned = false;
10387 RequiresICE = false;
10388
10389 // Read the prefixed modifiers first.
10390 bool Done = false;
10391 #ifndef NDEBUG
10392 bool IsSpecial = false;
10393 #endif
10394 while (!Done) {
10395 switch (*Str++) {
10396 default: Done = true; --Str; break;
10397 case 'I':
10398 RequiresICE = true;
10399 break;
10400 case 'S':
10401 assert(!Unsigned && "Can't use both 'S' and 'U' modifiers!");
10402 assert(!Signed && "Can't use 'S' modifier multiple times!");
10403 Signed = true;
10404 break;
10405 case 'U':
10406 assert(!Signed && "Can't use both 'S' and 'U' modifiers!");
10407 assert(!Unsigned && "Can't use 'U' modifier multiple times!");
10408 Unsigned = true;
10409 break;
10410 case 'L':
10411 assert(!IsSpecial && "Can't use 'L' with 'W', 'N', 'Z' or 'O' modifiers");
10412 assert(HowLong <= 2 && "Can't have LLLL modifier");
10413 ++HowLong;
10414 break;
10415 case 'N':
10416 // 'N' behaves like 'L' for all non LP64 targets and 'int' otherwise.
10417 assert(!IsSpecial && "Can't use two 'N', 'W', 'Z' or 'O' modifiers!");
10418 assert(HowLong == 0 && "Can't use both 'L' and 'N' modifiers!");
10419 #ifndef NDEBUG
10420 IsSpecial = true;
10421 #endif
10422 if (Context.getTargetInfo().getLongWidth() == 32)
10423 ++HowLong;
10424 break;
10425 case 'W':
10426 // This modifier represents int64 type.
10427 assert(!IsSpecial && "Can't use two 'N', 'W', 'Z' or 'O' modifiers!");
10428 assert(HowLong == 0 && "Can't use both 'L' and 'W' modifiers!");
10429 #ifndef NDEBUG
10430 IsSpecial = true;
10431 #endif
10432 switch (Context.getTargetInfo().getInt64Type()) {
10433 default:
10434 llvm_unreachable("Unexpected integer type");
10435 case TargetInfo::SignedLong:
10436 HowLong = 1;
10437 break;
10438 case TargetInfo::SignedLongLong:
10439 HowLong = 2;
10440 break;
10441 }
10442 break;
10443 case 'Z':
10444 // This modifier represents int32 type.
10445 assert(!IsSpecial && "Can't use two 'N', 'W', 'Z' or 'O' modifiers!");
10446 assert(HowLong == 0 && "Can't use both 'L' and 'Z' modifiers!");
10447 #ifndef NDEBUG
10448 IsSpecial = true;
10449 #endif
10450 switch (Context.getTargetInfo().getIntTypeByWidth(32, true)) {
10451 default:
10452 llvm_unreachable("Unexpected integer type");
10453 case TargetInfo::SignedInt:
10454 HowLong = 0;
10455 break;
10456 case TargetInfo::SignedLong:
10457 HowLong = 1;
10458 break;
10459 case TargetInfo::SignedLongLong:
10460 HowLong = 2;
10461 break;
10462 }
10463 break;
10464 case 'O':
10465 assert(!IsSpecial && "Can't use two 'N', 'W', 'Z' or 'O' modifiers!");
10466 assert(HowLong == 0 && "Can't use both 'L' and 'O' modifiers!");
10467 #ifndef NDEBUG
10468 IsSpecial = true;
10469 #endif
10470 if (Context.getLangOpts().OpenCL)
10471 HowLong = 1;
10472 else
10473 HowLong = 2;
10474 break;
10475 }
10476 }
10477
10478 QualType Type;
10479
10480 // Read the base type.
10481 switch (*Str++) {
10482 default: llvm_unreachable("Unknown builtin type letter!");
10483 case 'x':
10484 assert(HowLong == 0 && !Signed && !Unsigned &&
10485 "Bad modifiers used with 'x'!");
10486 Type = Context.Float16Ty;
10487 break;
10488 case 'y':
10489 assert(HowLong == 0 && !Signed && !Unsigned &&
10490 "Bad modifiers used with 'y'!");
10491 Type = Context.BFloat16Ty;
10492 break;
10493 case 'v':
10494 assert(HowLong == 0 && !Signed && !Unsigned &&
10495 "Bad modifiers used with 'v'!");
10496 Type = Context.VoidTy;
10497 break;
10498 case 'h':
10499 assert(HowLong == 0 && !Signed && !Unsigned &&
10500 "Bad modifiers used with 'h'!");
10501 Type = Context.HalfTy;
10502 break;
10503 case 'f':
10504 assert(HowLong == 0 && !Signed && !Unsigned &&
10505 "Bad modifiers used with 'f'!");
10506 Type = Context.FloatTy;
10507 break;
10508 case 'd':
10509 assert(HowLong < 3 && !Signed && !Unsigned &&
10510 "Bad modifiers used with 'd'!");
10511 if (HowLong == 1)
10512 Type = Context.LongDoubleTy;
10513 else if (HowLong == 2)
10514 Type = Context.Float128Ty;
10515 else
10516 Type = Context.DoubleTy;
10517 break;
10518 case 's':
10519 assert(HowLong == 0 && "Bad modifiers used with 's'!");
10520 if (Unsigned)
10521 Type = Context.UnsignedShortTy;
10522 else
10523 Type = Context.ShortTy;
10524 break;
10525 case 'i':
10526 if (HowLong == 3)
10527 Type = Unsigned ? Context.UnsignedInt128Ty : Context.Int128Ty;
10528 else if (HowLong == 2)
10529 Type = Unsigned ? Context.UnsignedLongLongTy : Context.LongLongTy;
10530 else if (HowLong == 1)
10531 Type = Unsigned ? Context.UnsignedLongTy : Context.LongTy;
10532 else
10533 Type = Unsigned ? Context.UnsignedIntTy : Context.IntTy;
10534 break;
10535 case 'c':
10536 assert(HowLong == 0 && "Bad modifiers used with 'c'!");
10537 if (Signed)
10538 Type = Context.SignedCharTy;
10539 else if (Unsigned)
10540 Type = Context.UnsignedCharTy;
10541 else
10542 Type = Context.CharTy;
10543 break;
10544 case 'b': // boolean
10545 assert(HowLong == 0 && !Signed && !Unsigned && "Bad modifiers for 'b'!");
10546 Type = Context.BoolTy;
10547 break;
10548 case 'z': // size_t.
10549 assert(HowLong == 0 && !Signed && !Unsigned && "Bad modifiers for 'z'!");
10550 Type = Context.getSizeType();
10551 break;
10552 case 'w': // wchar_t.
10553 assert(HowLong == 0 && !Signed && !Unsigned && "Bad modifiers for 'w'!");
10554 Type = Context.getWideCharType();
10555 break;
10556 case 'F':
10557 Type = Context.getCFConstantStringType();
10558 break;
10559 case 'G':
10560 Type = Context.getObjCIdType();
10561 break;
10562 case 'H':
10563 Type = Context.getObjCSelType();
10564 break;
10565 case 'M':
10566 Type = Context.getObjCSuperType();
10567 break;
10568 case 'a':
10569 Type = Context.getBuiltinVaListType();
10570 assert(!Type.isNull() && "builtin va list type not initialized!");
10571 break;
10572 case 'A':
10573 // This is a "reference" to a va_list; however, what exactly
10574 // this means depends on how va_list is defined. There are two
10575 // different kinds of va_list: ones passed by value, and ones
10576 // passed by reference. An example of a by-value va_list is
10577 // x86, where va_list is a char*. An example of by-ref va_list
10578 // is x86-64, where va_list is a __va_list_tag[1]. For x86,
10579 // we want this argument to be a char*&; for x86-64, we want
10580 // it to be a __va_list_tag*.
10581 Type = Context.getBuiltinVaListType();
10582 assert(!Type.isNull() && "builtin va list type not initialized!");
10583 if (Type->isArrayType())
10584 Type = Context.getArrayDecayedType(Type);
10585 else
10586 Type = Context.getLValueReferenceType(Type);
10587 break;
10588 case 'q': {
10589 char *End;
10590 unsigned NumElements = strtoul(Str, &End, 10);
10591 assert(End != Str && "Missing vector size");
10592 Str = End;
10593
10594 QualType ElementType = DecodeTypeFromStr(Str, Context, Error,
10595 RequiresICE, false);
10596 assert(!RequiresICE && "Can't require vector ICE");
10597
10598 Type = Context.getScalableVectorType(ElementType, NumElements);
10599 break;
10600 }
10601 case 'V': {
10602 char *End;
10603 unsigned NumElements = strtoul(Str, &End, 10);
10604 assert(End != Str && "Missing vector size");
10605 Str = End;
10606
10607 QualType ElementType = DecodeTypeFromStr(Str, Context, Error,
10608 RequiresICE, false);
10609 assert(!RequiresICE && "Can't require vector ICE");
10610
10611 // TODO: No way to make AltiVec vectors in builtins yet.
10612 Type = Context.getVectorType(ElementType, NumElements,
10613 VectorType::GenericVector);
10614 break;
10615 }
10616 case 'E': {
10617 char *End;
10618
10619 unsigned NumElements = strtoul(Str, &End, 10);
10620 assert(End != Str && "Missing vector size");
10621
10622 Str = End;
10623
10624 QualType ElementType = DecodeTypeFromStr(Str, Context, Error, RequiresICE,
10625 false);
10626 Type = Context.getExtVectorType(ElementType, NumElements);
10627 break;
10628 }
10629 case 'X': {
10630 QualType ElementType = DecodeTypeFromStr(Str, Context, Error, RequiresICE,
10631 false);
10632 assert(!RequiresICE && "Can't require complex ICE");
10633 Type = Context.getComplexType(ElementType);
10634 break;
10635 }
10636 case 'Y':
10637 Type = Context.getPointerDiffType();
10638 break;
10639 case 'P':
10640 Type = Context.getFILEType();
10641 if (Type.isNull()) {
10642 Error = ASTContext::GE_Missing_stdio;
10643 return {};
10644 }
10645 break;
10646 case 'J':
10647 if (Signed)
10648 Type = Context.getsigjmp_bufType();
10649 else
10650 Type = Context.getjmp_bufType();
10651
10652 if (Type.isNull()) {
10653 Error = ASTContext::GE_Missing_setjmp;
10654 return {};
10655 }
10656 break;
10657 case 'K':
10658 assert(HowLong == 0 && !Signed && !Unsigned && "Bad modifiers for 'K'!");
10659 Type = Context.getucontext_tType();
10660
10661 if (Type.isNull()) {
10662 Error = ASTContext::GE_Missing_ucontext;
10663 return {};
10664 }
10665 break;
10666 case 'p':
10667 Type = Context.getProcessIDType();
10668 break;
10669 }
10670
10671 // If there are modifiers and if we're allowed to parse them, go for it.
10672 Done = !AllowTypeModifiers;
10673 while (!Done) {
10674 switch (char c = *Str++) {
10675 default: Done = true; --Str; break;
10676 case '*':
10677 case '&': {
10678 // Both pointers and references can have their pointee types
10679 // qualified with an address space.
10680 char *End;
10681 unsigned AddrSpace = strtoul(Str, &End, 10);
10682 if (End != Str) {
10683 // Note AddrSpace == 0 is not the same as an unspecified address space.
10684 Type = Context.getAddrSpaceQualType(
10685 Type,
10686 Context.getLangASForBuiltinAddressSpace(AddrSpace));
10687 Str = End;
10688 }
10689 if (c == '*')
10690 Type = Context.getPointerType(Type);
10691 else
10692 Type = Context.getLValueReferenceType(Type);
10693 break;
10694 }
10695 // FIXME: There's no way to have a built-in with an rvalue ref arg.
10696 case 'C':
10697 Type = Type.withConst();
10698 break;
10699 case 'D':
10700 Type = Context.getVolatileType(Type);
10701 break;
10702 case 'R':
10703 Type = Type.withRestrict();
10704 break;
10705 }
10706 }
10707
10708 assert((!RequiresICE || Type->isIntegralOrEnumerationType()) &&
10709 "Integer constant 'I' type must be an integer");
10710
10711 return Type;
10712 }
10713
10714 // On some targets such as PowerPC, some of the builtins are defined with custom
10715 // type descriptors for target-dependent types. These descriptors are decoded in
10716 // other functions, but it may be useful to be able to fall back to default
10717 // descriptor decoding to define builtins mixing target-dependent and target-
10718 // independent types. This function allows decoding one type descriptor with
10719 // default decoding.
DecodeTypeStr(const char * & Str,const ASTContext & Context,GetBuiltinTypeError & Error,bool & RequireICE,bool AllowTypeModifiers) const10720 QualType ASTContext::DecodeTypeStr(const char *&Str, const ASTContext &Context,
10721 GetBuiltinTypeError &Error, bool &RequireICE,
10722 bool AllowTypeModifiers) const {
10723 return DecodeTypeFromStr(Str, Context, Error, RequireICE, AllowTypeModifiers);
10724 }
10725
10726 /// GetBuiltinType - Return the type for the specified builtin.
GetBuiltinType(unsigned Id,GetBuiltinTypeError & Error,unsigned * IntegerConstantArgs) const10727 QualType ASTContext::GetBuiltinType(unsigned Id,
10728 GetBuiltinTypeError &Error,
10729 unsigned *IntegerConstantArgs) const {
10730 const char *TypeStr = BuiltinInfo.getTypeString(Id);
10731 if (TypeStr[0] == '\0') {
10732 Error = GE_Missing_type;
10733 return {};
10734 }
10735
10736 SmallVector<QualType, 8> ArgTypes;
10737
10738 bool RequiresICE = false;
10739 Error = GE_None;
10740 QualType ResType = DecodeTypeFromStr(TypeStr, *this, Error,
10741 RequiresICE, true);
10742 if (Error != GE_None)
10743 return {};
10744
10745 assert(!RequiresICE && "Result of intrinsic cannot be required to be an ICE");
10746
10747 while (TypeStr[0] && TypeStr[0] != '.') {
10748 QualType Ty = DecodeTypeFromStr(TypeStr, *this, Error, RequiresICE, true);
10749 if (Error != GE_None)
10750 return {};
10751
10752 // If this argument is required to be an IntegerConstantExpression and the
10753 // caller cares, fill in the bitmask we return.
10754 if (RequiresICE && IntegerConstantArgs)
10755 *IntegerConstantArgs |= 1 << ArgTypes.size();
10756
10757 // Do array -> pointer decay. The builtin should use the decayed type.
10758 if (Ty->isArrayType())
10759 Ty = getArrayDecayedType(Ty);
10760
10761 ArgTypes.push_back(Ty);
10762 }
10763
10764 if (Id == Builtin::BI__GetExceptionInfo)
10765 return {};
10766
10767 assert((TypeStr[0] != '.' || TypeStr[1] == 0) &&
10768 "'.' should only occur at end of builtin type list!");
10769
10770 bool Variadic = (TypeStr[0] == '.');
10771
10772 FunctionType::ExtInfo EI(getDefaultCallingConvention(
10773 Variadic, /*IsCXXMethod=*/false, /*IsBuiltin=*/true));
10774 if (BuiltinInfo.isNoReturn(Id)) EI = EI.withNoReturn(true);
10775
10776
10777 // We really shouldn't be making a no-proto type here.
10778 if (ArgTypes.empty() && Variadic && !getLangOpts().CPlusPlus)
10779 return getFunctionNoProtoType(ResType, EI);
10780
10781 FunctionProtoType::ExtProtoInfo EPI;
10782 EPI.ExtInfo = EI;
10783 EPI.Variadic = Variadic;
10784 if (getLangOpts().CPlusPlus && BuiltinInfo.isNoThrow(Id))
10785 EPI.ExceptionSpec.Type =
10786 getLangOpts().CPlusPlus11 ? EST_BasicNoexcept : EST_DynamicNone;
10787
10788 return getFunctionType(ResType, ArgTypes, EPI);
10789 }
10790
basicGVALinkageForFunction(const ASTContext & Context,const FunctionDecl * FD)10791 static GVALinkage basicGVALinkageForFunction(const ASTContext &Context,
10792 const FunctionDecl *FD) {
10793 if (!FD->isExternallyVisible())
10794 return GVA_Internal;
10795
10796 // Non-user-provided functions get emitted as weak definitions with every
10797 // use, no matter whether they've been explicitly instantiated etc.
10798 if (const auto *MD = dyn_cast<CXXMethodDecl>(FD))
10799 if (!MD->isUserProvided())
10800 return GVA_DiscardableODR;
10801
10802 GVALinkage External;
10803 switch (FD->getTemplateSpecializationKind()) {
10804 case TSK_Undeclared:
10805 case TSK_ExplicitSpecialization:
10806 External = GVA_StrongExternal;
10807 break;
10808
10809 case TSK_ExplicitInstantiationDefinition:
10810 return GVA_StrongODR;
10811
10812 // C++11 [temp.explicit]p10:
10813 // [ Note: The intent is that an inline function that is the subject of
10814 // an explicit instantiation declaration will still be implicitly
10815 // instantiated when used so that the body can be considered for
10816 // inlining, but that no out-of-line copy of the inline function would be
10817 // generated in the translation unit. -- end note ]
10818 case TSK_ExplicitInstantiationDeclaration:
10819 return GVA_AvailableExternally;
10820
10821 case TSK_ImplicitInstantiation:
10822 External = GVA_DiscardableODR;
10823 break;
10824 }
10825
10826 if (!FD->isInlined())
10827 return External;
10828
10829 if ((!Context.getLangOpts().CPlusPlus &&
10830 !Context.getTargetInfo().getCXXABI().isMicrosoft() &&
10831 !FD->hasAttr<DLLExportAttr>()) ||
10832 FD->hasAttr<GNUInlineAttr>()) {
10833 // FIXME: This doesn't match gcc's behavior for dllexport inline functions.
10834
10835 // GNU or C99 inline semantics. Determine whether this symbol should be
10836 // externally visible.
10837 if (FD->isInlineDefinitionExternallyVisible())
10838 return External;
10839
10840 // C99 inline semantics, where the symbol is not externally visible.
10841 return GVA_AvailableExternally;
10842 }
10843
10844 // Functions specified with extern and inline in -fms-compatibility mode
10845 // forcibly get emitted. While the body of the function cannot be later
10846 // replaced, the function definition cannot be discarded.
10847 if (FD->isMSExternInline())
10848 return GVA_StrongODR;
10849
10850 return GVA_DiscardableODR;
10851 }
10852
adjustGVALinkageForAttributes(const ASTContext & Context,const Decl * D,GVALinkage L)10853 static GVALinkage adjustGVALinkageForAttributes(const ASTContext &Context,
10854 const Decl *D, GVALinkage L) {
10855 // See http://msdn.microsoft.com/en-us/library/xa0d9ste.aspx
10856 // dllexport/dllimport on inline functions.
10857 if (D->hasAttr<DLLImportAttr>()) {
10858 if (L == GVA_DiscardableODR || L == GVA_StrongODR)
10859 return GVA_AvailableExternally;
10860 } else if (D->hasAttr<DLLExportAttr>()) {
10861 if (L == GVA_DiscardableODR)
10862 return GVA_StrongODR;
10863 } else if (Context.getLangOpts().CUDA && Context.getLangOpts().CUDAIsDevice) {
10864 // Device-side functions with __global__ attribute must always be
10865 // visible externally so they can be launched from host.
10866 if (D->hasAttr<CUDAGlobalAttr>() &&
10867 (L == GVA_DiscardableODR || L == GVA_Internal))
10868 return GVA_StrongODR;
10869 // Single source offloading languages like CUDA/HIP need to be able to
10870 // access static device variables from host code of the same compilation
10871 // unit. This is done by externalizing the static variable with a shared
10872 // name between the host and device compilation which is the same for the
10873 // same compilation unit whereas different among different compilation
10874 // units.
10875 if (Context.shouldExternalizeStaticVar(D))
10876 return GVA_StrongExternal;
10877 }
10878 return L;
10879 }
10880
10881 /// Adjust the GVALinkage for a declaration based on what an external AST source
10882 /// knows about whether there can be other definitions of this declaration.
10883 static GVALinkage
adjustGVALinkageForExternalDefinitionKind(const ASTContext & Ctx,const Decl * D,GVALinkage L)10884 adjustGVALinkageForExternalDefinitionKind(const ASTContext &Ctx, const Decl *D,
10885 GVALinkage L) {
10886 ExternalASTSource *Source = Ctx.getExternalSource();
10887 if (!Source)
10888 return L;
10889
10890 switch (Source->hasExternalDefinitions(D)) {
10891 case ExternalASTSource::EK_Never:
10892 // Other translation units rely on us to provide the definition.
10893 if (L == GVA_DiscardableODR)
10894 return GVA_StrongODR;
10895 break;
10896
10897 case ExternalASTSource::EK_Always:
10898 return GVA_AvailableExternally;
10899
10900 case ExternalASTSource::EK_ReplyHazy:
10901 break;
10902 }
10903 return L;
10904 }
10905
GetGVALinkageForFunction(const FunctionDecl * FD) const10906 GVALinkage ASTContext::GetGVALinkageForFunction(const FunctionDecl *FD) const {
10907 return adjustGVALinkageForExternalDefinitionKind(*this, FD,
10908 adjustGVALinkageForAttributes(*this, FD,
10909 basicGVALinkageForFunction(*this, FD)));
10910 }
10911
basicGVALinkageForVariable(const ASTContext & Context,const VarDecl * VD)10912 static GVALinkage basicGVALinkageForVariable(const ASTContext &Context,
10913 const VarDecl *VD) {
10914 if (!VD->isExternallyVisible())
10915 return GVA_Internal;
10916
10917 if (VD->isStaticLocal()) {
10918 const DeclContext *LexicalContext = VD->getParentFunctionOrMethod();
10919 while (LexicalContext && !isa<FunctionDecl>(LexicalContext))
10920 LexicalContext = LexicalContext->getLexicalParent();
10921
10922 // ObjC Blocks can create local variables that don't have a FunctionDecl
10923 // LexicalContext.
10924 if (!LexicalContext)
10925 return GVA_DiscardableODR;
10926
10927 // Otherwise, let the static local variable inherit its linkage from the
10928 // nearest enclosing function.
10929 auto StaticLocalLinkage =
10930 Context.GetGVALinkageForFunction(cast<FunctionDecl>(LexicalContext));
10931
10932 // Itanium ABI 5.2.2: "Each COMDAT group [for a static local variable] must
10933 // be emitted in any object with references to the symbol for the object it
10934 // contains, whether inline or out-of-line."
10935 // Similar behavior is observed with MSVC. An alternative ABI could use
10936 // StrongODR/AvailableExternally to match the function, but none are
10937 // known/supported currently.
10938 if (StaticLocalLinkage == GVA_StrongODR ||
10939 StaticLocalLinkage == GVA_AvailableExternally)
10940 return GVA_DiscardableODR;
10941 return StaticLocalLinkage;
10942 }
10943
10944 // MSVC treats in-class initialized static data members as definitions.
10945 // By giving them non-strong linkage, out-of-line definitions won't
10946 // cause link errors.
10947 if (Context.isMSStaticDataMemberInlineDefinition(VD))
10948 return GVA_DiscardableODR;
10949
10950 // Most non-template variables have strong linkage; inline variables are
10951 // linkonce_odr or (occasionally, for compatibility) weak_odr.
10952 GVALinkage StrongLinkage;
10953 switch (Context.getInlineVariableDefinitionKind(VD)) {
10954 case ASTContext::InlineVariableDefinitionKind::None:
10955 StrongLinkage = GVA_StrongExternal;
10956 break;
10957 case ASTContext::InlineVariableDefinitionKind::Weak:
10958 case ASTContext::InlineVariableDefinitionKind::WeakUnknown:
10959 StrongLinkage = GVA_DiscardableODR;
10960 break;
10961 case ASTContext::InlineVariableDefinitionKind::Strong:
10962 StrongLinkage = GVA_StrongODR;
10963 break;
10964 }
10965
10966 switch (VD->getTemplateSpecializationKind()) {
10967 case TSK_Undeclared:
10968 return StrongLinkage;
10969
10970 case TSK_ExplicitSpecialization:
10971 return Context.getTargetInfo().getCXXABI().isMicrosoft() &&
10972 VD->isStaticDataMember()
10973 ? GVA_StrongODR
10974 : StrongLinkage;
10975
10976 case TSK_ExplicitInstantiationDefinition:
10977 return GVA_StrongODR;
10978
10979 case TSK_ExplicitInstantiationDeclaration:
10980 return GVA_AvailableExternally;
10981
10982 case TSK_ImplicitInstantiation:
10983 return GVA_DiscardableODR;
10984 }
10985
10986 llvm_unreachable("Invalid Linkage!");
10987 }
10988
GetGVALinkageForVariable(const VarDecl * VD)10989 GVALinkage ASTContext::GetGVALinkageForVariable(const VarDecl *VD) {
10990 return adjustGVALinkageForExternalDefinitionKind(*this, VD,
10991 adjustGVALinkageForAttributes(*this, VD,
10992 basicGVALinkageForVariable(*this, VD)));
10993 }
10994
DeclMustBeEmitted(const Decl * D)10995 bool ASTContext::DeclMustBeEmitted(const Decl *D) {
10996 if (const auto *VD = dyn_cast<VarDecl>(D)) {
10997 if (!VD->isFileVarDecl())
10998 return false;
10999 // Global named register variables (GNU extension) are never emitted.
11000 if (VD->getStorageClass() == SC_Register)
11001 return false;
11002 if (VD->getDescribedVarTemplate() ||
11003 isa<VarTemplatePartialSpecializationDecl>(VD))
11004 return false;
11005 } else if (const auto *FD = dyn_cast<FunctionDecl>(D)) {
11006 // We never need to emit an uninstantiated function template.
11007 if (FD->getTemplatedKind() == FunctionDecl::TK_FunctionTemplate)
11008 return false;
11009 } else if (isa<PragmaCommentDecl>(D))
11010 return true;
11011 else if (isa<PragmaDetectMismatchDecl>(D))
11012 return true;
11013 else if (isa<OMPRequiresDecl>(D))
11014 return true;
11015 else if (isa<OMPThreadPrivateDecl>(D))
11016 return !D->getDeclContext()->isDependentContext();
11017 else if (isa<OMPAllocateDecl>(D))
11018 return !D->getDeclContext()->isDependentContext();
11019 else if (isa<OMPDeclareReductionDecl>(D) || isa<OMPDeclareMapperDecl>(D))
11020 return !D->getDeclContext()->isDependentContext();
11021 else if (isa<ImportDecl>(D))
11022 return true;
11023 else
11024 return false;
11025
11026 // If this is a member of a class template, we do not need to emit it.
11027 if (D->getDeclContext()->isDependentContext())
11028 return false;
11029
11030 // Weak references don't produce any output by themselves.
11031 if (D->hasAttr<WeakRefAttr>())
11032 return false;
11033
11034 // Aliases and used decls are required.
11035 if (D->hasAttr<AliasAttr>() || D->hasAttr<UsedAttr>())
11036 return true;
11037
11038 if (const auto *FD = dyn_cast<FunctionDecl>(D)) {
11039 // Forward declarations aren't required.
11040 if (!FD->doesThisDeclarationHaveABody())
11041 return FD->doesDeclarationForceExternallyVisibleDefinition();
11042
11043 // Constructors and destructors are required.
11044 if (FD->hasAttr<ConstructorAttr>() || FD->hasAttr<DestructorAttr>())
11045 return true;
11046
11047 // The key function for a class is required. This rule only comes
11048 // into play when inline functions can be key functions, though.
11049 if (getTargetInfo().getCXXABI().canKeyFunctionBeInline()) {
11050 if (const auto *MD = dyn_cast<CXXMethodDecl>(FD)) {
11051 const CXXRecordDecl *RD = MD->getParent();
11052 if (MD->isOutOfLine() && RD->isDynamicClass()) {
11053 const CXXMethodDecl *KeyFunc = getCurrentKeyFunction(RD);
11054 if (KeyFunc && KeyFunc->getCanonicalDecl() == MD->getCanonicalDecl())
11055 return true;
11056 }
11057 }
11058 }
11059
11060 GVALinkage Linkage = GetGVALinkageForFunction(FD);
11061
11062 // static, static inline, always_inline, and extern inline functions can
11063 // always be deferred. Normal inline functions can be deferred in C99/C++.
11064 // Implicit template instantiations can also be deferred in C++.
11065 return !isDiscardableGVALinkage(Linkage);
11066 }
11067
11068 const auto *VD = cast<VarDecl>(D);
11069 assert(VD->isFileVarDecl() && "Expected file scoped var");
11070
11071 // If the decl is marked as `declare target to`, it should be emitted for the
11072 // host and for the device.
11073 if (LangOpts.OpenMP &&
11074 OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(VD))
11075 return true;
11076
11077 if (VD->isThisDeclarationADefinition() == VarDecl::DeclarationOnly &&
11078 !isMSStaticDataMemberInlineDefinition(VD))
11079 return false;
11080
11081 // Variables that can be needed in other TUs are required.
11082 auto Linkage = GetGVALinkageForVariable(VD);
11083 if (!isDiscardableGVALinkage(Linkage))
11084 return true;
11085
11086 // We never need to emit a variable that is available in another TU.
11087 if (Linkage == GVA_AvailableExternally)
11088 return false;
11089
11090 // Variables that have destruction with side-effects are required.
11091 if (VD->needsDestruction(*this))
11092 return true;
11093
11094 // Variables that have initialization with side-effects are required.
11095 if (VD->getInit() && VD->getInit()->HasSideEffects(*this) &&
11096 // We can get a value-dependent initializer during error recovery.
11097 (VD->getInit()->isValueDependent() || !VD->evaluateValue()))
11098 return true;
11099
11100 // Likewise, variables with tuple-like bindings are required if their
11101 // bindings have side-effects.
11102 if (const auto *DD = dyn_cast<DecompositionDecl>(VD))
11103 for (const auto *BD : DD->bindings())
11104 if (const auto *BindingVD = BD->getHoldingVar())
11105 if (DeclMustBeEmitted(BindingVD))
11106 return true;
11107
11108 return false;
11109 }
11110
forEachMultiversionedFunctionVersion(const FunctionDecl * FD,llvm::function_ref<void (FunctionDecl *)> Pred) const11111 void ASTContext::forEachMultiversionedFunctionVersion(
11112 const FunctionDecl *FD,
11113 llvm::function_ref<void(FunctionDecl *)> Pred) const {
11114 assert(FD->isMultiVersion() && "Only valid for multiversioned functions");
11115 llvm::SmallDenseSet<const FunctionDecl*, 4> SeenDecls;
11116 FD = FD->getMostRecentDecl();
11117 // FIXME: The order of traversal here matters and depends on the order of
11118 // lookup results, which happens to be (mostly) oldest-to-newest, but we
11119 // shouldn't rely on that.
11120 for (auto *CurDecl :
11121 FD->getDeclContext()->getRedeclContext()->lookup(FD->getDeclName())) {
11122 FunctionDecl *CurFD = CurDecl->getAsFunction()->getMostRecentDecl();
11123 if (CurFD && hasSameType(CurFD->getType(), FD->getType()) &&
11124 std::end(SeenDecls) == llvm::find(SeenDecls, CurFD)) {
11125 SeenDecls.insert(CurFD);
11126 Pred(CurFD);
11127 }
11128 }
11129 }
11130
getDefaultCallingConvention(bool IsVariadic,bool IsCXXMethod,bool IsBuiltin) const11131 CallingConv ASTContext::getDefaultCallingConvention(bool IsVariadic,
11132 bool IsCXXMethod,
11133 bool IsBuiltin) const {
11134 // Pass through to the C++ ABI object
11135 if (IsCXXMethod)
11136 return ABI->getDefaultMethodCallConv(IsVariadic);
11137
11138 // Builtins ignore user-specified default calling convention and remain the
11139 // Target's default calling convention.
11140 if (!IsBuiltin) {
11141 switch (LangOpts.getDefaultCallingConv()) {
11142 case LangOptions::DCC_None:
11143 break;
11144 case LangOptions::DCC_CDecl:
11145 return CC_C;
11146 case LangOptions::DCC_FastCall:
11147 if (getTargetInfo().hasFeature("sse2") && !IsVariadic)
11148 return CC_X86FastCall;
11149 break;
11150 case LangOptions::DCC_StdCall:
11151 if (!IsVariadic)
11152 return CC_X86StdCall;
11153 break;
11154 case LangOptions::DCC_VectorCall:
11155 // __vectorcall cannot be applied to variadic functions.
11156 if (!IsVariadic)
11157 return CC_X86VectorCall;
11158 break;
11159 case LangOptions::DCC_RegCall:
11160 // __regcall cannot be applied to variadic functions.
11161 if (!IsVariadic)
11162 return CC_X86RegCall;
11163 break;
11164 }
11165 }
11166 return Target->getDefaultCallingConv();
11167 }
11168
isNearlyEmpty(const CXXRecordDecl * RD) const11169 bool ASTContext::isNearlyEmpty(const CXXRecordDecl *RD) const {
11170 // Pass through to the C++ ABI object
11171 return ABI->isNearlyEmpty(RD);
11172 }
11173
getVTableContext()11174 VTableContextBase *ASTContext::getVTableContext() {
11175 if (!VTContext.get()) {
11176 auto ABI = Target->getCXXABI();
11177 if (ABI.isMicrosoft())
11178 VTContext.reset(new MicrosoftVTableContext(*this));
11179 else {
11180 auto ComponentLayout = getLangOpts().RelativeCXXABIVTables
11181 ? ItaniumVTableContext::Relative
11182 : ItaniumVTableContext::Pointer;
11183 VTContext.reset(new ItaniumVTableContext(*this, ComponentLayout));
11184 }
11185 }
11186 return VTContext.get();
11187 }
11188
createMangleContext(const TargetInfo * T)11189 MangleContext *ASTContext::createMangleContext(const TargetInfo *T) {
11190 if (!T)
11191 T = Target;
11192 switch (T->getCXXABI().getKind()) {
11193 case TargetCXXABI::AppleARM64:
11194 case TargetCXXABI::Fuchsia:
11195 case TargetCXXABI::GenericAArch64:
11196 case TargetCXXABI::GenericItanium:
11197 case TargetCXXABI::GenericARM:
11198 case TargetCXXABI::GenericMIPS:
11199 case TargetCXXABI::iOS:
11200 case TargetCXXABI::WebAssembly:
11201 case TargetCXXABI::WatchOS:
11202 case TargetCXXABI::XL:
11203 return ItaniumMangleContext::create(*this, getDiagnostics());
11204 case TargetCXXABI::Microsoft:
11205 return MicrosoftMangleContext::create(*this, getDiagnostics());
11206 }
11207 llvm_unreachable("Unsupported ABI");
11208 }
11209
createDeviceMangleContext(const TargetInfo & T)11210 MangleContext *ASTContext::createDeviceMangleContext(const TargetInfo &T) {
11211 assert(T.getCXXABI().getKind() != TargetCXXABI::Microsoft &&
11212 "Device mangle context does not support Microsoft mangling.");
11213 switch (T.getCXXABI().getKind()) {
11214 case TargetCXXABI::AppleARM64:
11215 case TargetCXXABI::Fuchsia:
11216 case TargetCXXABI::GenericAArch64:
11217 case TargetCXXABI::GenericItanium:
11218 case TargetCXXABI::GenericARM:
11219 case TargetCXXABI::GenericMIPS:
11220 case TargetCXXABI::iOS:
11221 case TargetCXXABI::WebAssembly:
11222 case TargetCXXABI::WatchOS:
11223 case TargetCXXABI::XL:
11224 return ItaniumMangleContext::create(
11225 *this, getDiagnostics(),
11226 [](ASTContext &, const NamedDecl *ND) -> llvm::Optional<unsigned> {
11227 if (const auto *RD = dyn_cast<CXXRecordDecl>(ND))
11228 return RD->getDeviceLambdaManglingNumber();
11229 return llvm::None;
11230 });
11231 case TargetCXXABI::Microsoft:
11232 return MicrosoftMangleContext::create(*this, getDiagnostics());
11233 }
11234 llvm_unreachable("Unsupported ABI");
11235 }
11236
11237 CXXABI::~CXXABI() = default;
11238
getSideTableAllocatedMemory() const11239 size_t ASTContext::getSideTableAllocatedMemory() const {
11240 return ASTRecordLayouts.getMemorySize() +
11241 llvm::capacity_in_bytes(ObjCLayouts) +
11242 llvm::capacity_in_bytes(KeyFunctions) +
11243 llvm::capacity_in_bytes(ObjCImpls) +
11244 llvm::capacity_in_bytes(BlockVarCopyInits) +
11245 llvm::capacity_in_bytes(DeclAttrs) +
11246 llvm::capacity_in_bytes(TemplateOrInstantiation) +
11247 llvm::capacity_in_bytes(InstantiatedFromUsingDecl) +
11248 llvm::capacity_in_bytes(InstantiatedFromUsingShadowDecl) +
11249 llvm::capacity_in_bytes(InstantiatedFromUnnamedFieldDecl) +
11250 llvm::capacity_in_bytes(OverriddenMethods) +
11251 llvm::capacity_in_bytes(Types) +
11252 llvm::capacity_in_bytes(VariableArrayTypes);
11253 }
11254
11255 /// getIntTypeForBitwidth -
11256 /// sets integer QualTy according to specified details:
11257 /// bitwidth, signed/unsigned.
11258 /// Returns empty type if there is no appropriate target types.
getIntTypeForBitwidth(unsigned DestWidth,unsigned Signed) const11259 QualType ASTContext::getIntTypeForBitwidth(unsigned DestWidth,
11260 unsigned Signed) const {
11261 TargetInfo::IntType Ty = getTargetInfo().getIntTypeByWidth(DestWidth, Signed);
11262 CanQualType QualTy = getFromTargetType(Ty);
11263 if (!QualTy && DestWidth == 128)
11264 return Signed ? Int128Ty : UnsignedInt128Ty;
11265 return QualTy;
11266 }
11267
11268 /// getRealTypeForBitwidth -
11269 /// sets floating point QualTy according to specified bitwidth.
11270 /// Returns empty type if there is no appropriate target types.
getRealTypeForBitwidth(unsigned DestWidth,FloatModeKind ExplicitType) const11271 QualType ASTContext::getRealTypeForBitwidth(unsigned DestWidth,
11272 FloatModeKind ExplicitType) const {
11273 FloatModeKind Ty =
11274 getTargetInfo().getRealTypeByWidth(DestWidth, ExplicitType);
11275 switch (Ty) {
11276 case FloatModeKind::Float:
11277 return FloatTy;
11278 case FloatModeKind::Double:
11279 return DoubleTy;
11280 case FloatModeKind::LongDouble:
11281 return LongDoubleTy;
11282 case FloatModeKind::Float128:
11283 return Float128Ty;
11284 case FloatModeKind::Ibm128:
11285 return Ibm128Ty;
11286 case FloatModeKind::NoFloat:
11287 return {};
11288 }
11289
11290 llvm_unreachable("Unhandled TargetInfo::RealType value");
11291 }
11292
setManglingNumber(const NamedDecl * ND,unsigned Number)11293 void ASTContext::setManglingNumber(const NamedDecl *ND, unsigned Number) {
11294 if (Number > 1)
11295 MangleNumbers[ND] = Number;
11296 }
11297
getManglingNumber(const NamedDecl * ND) const11298 unsigned ASTContext::getManglingNumber(const NamedDecl *ND) const {
11299 auto I = MangleNumbers.find(ND);
11300 return I != MangleNumbers.end() ? I->second : 1;
11301 }
11302
setStaticLocalNumber(const VarDecl * VD,unsigned Number)11303 void ASTContext::setStaticLocalNumber(const VarDecl *VD, unsigned Number) {
11304 if (Number > 1)
11305 StaticLocalNumbers[VD] = Number;
11306 }
11307
getStaticLocalNumber(const VarDecl * VD) const11308 unsigned ASTContext::getStaticLocalNumber(const VarDecl *VD) const {
11309 auto I = StaticLocalNumbers.find(VD);
11310 return I != StaticLocalNumbers.end() ? I->second : 1;
11311 }
11312
11313 MangleNumberingContext &
getManglingNumberContext(const DeclContext * DC)11314 ASTContext::getManglingNumberContext(const DeclContext *DC) {
11315 assert(LangOpts.CPlusPlus); // We don't need mangling numbers for plain C.
11316 std::unique_ptr<MangleNumberingContext> &MCtx = MangleNumberingContexts[DC];
11317 if (!MCtx)
11318 MCtx = createMangleNumberingContext();
11319 return *MCtx;
11320 }
11321
11322 MangleNumberingContext &
getManglingNumberContext(NeedExtraManglingDecl_t,const Decl * D)11323 ASTContext::getManglingNumberContext(NeedExtraManglingDecl_t, const Decl *D) {
11324 assert(LangOpts.CPlusPlus); // We don't need mangling numbers for plain C.
11325 std::unique_ptr<MangleNumberingContext> &MCtx =
11326 ExtraMangleNumberingContexts[D];
11327 if (!MCtx)
11328 MCtx = createMangleNumberingContext();
11329 return *MCtx;
11330 }
11331
11332 std::unique_ptr<MangleNumberingContext>
createMangleNumberingContext() const11333 ASTContext::createMangleNumberingContext() const {
11334 return ABI->createMangleNumberingContext();
11335 }
11336
11337 const CXXConstructorDecl *
getCopyConstructorForExceptionObject(CXXRecordDecl * RD)11338 ASTContext::getCopyConstructorForExceptionObject(CXXRecordDecl *RD) {
11339 return ABI->getCopyConstructorForExceptionObject(
11340 cast<CXXRecordDecl>(RD->getFirstDecl()));
11341 }
11342
addCopyConstructorForExceptionObject(CXXRecordDecl * RD,CXXConstructorDecl * CD)11343 void ASTContext::addCopyConstructorForExceptionObject(CXXRecordDecl *RD,
11344 CXXConstructorDecl *CD) {
11345 return ABI->addCopyConstructorForExceptionObject(
11346 cast<CXXRecordDecl>(RD->getFirstDecl()),
11347 cast<CXXConstructorDecl>(CD->getFirstDecl()));
11348 }
11349
addTypedefNameForUnnamedTagDecl(TagDecl * TD,TypedefNameDecl * DD)11350 void ASTContext::addTypedefNameForUnnamedTagDecl(TagDecl *TD,
11351 TypedefNameDecl *DD) {
11352 return ABI->addTypedefNameForUnnamedTagDecl(TD, DD);
11353 }
11354
11355 TypedefNameDecl *
getTypedefNameForUnnamedTagDecl(const TagDecl * TD)11356 ASTContext::getTypedefNameForUnnamedTagDecl(const TagDecl *TD) {
11357 return ABI->getTypedefNameForUnnamedTagDecl(TD);
11358 }
11359
addDeclaratorForUnnamedTagDecl(TagDecl * TD,DeclaratorDecl * DD)11360 void ASTContext::addDeclaratorForUnnamedTagDecl(TagDecl *TD,
11361 DeclaratorDecl *DD) {
11362 return ABI->addDeclaratorForUnnamedTagDecl(TD, DD);
11363 }
11364
getDeclaratorForUnnamedTagDecl(const TagDecl * TD)11365 DeclaratorDecl *ASTContext::getDeclaratorForUnnamedTagDecl(const TagDecl *TD) {
11366 return ABI->getDeclaratorForUnnamedTagDecl(TD);
11367 }
11368
setParameterIndex(const ParmVarDecl * D,unsigned int index)11369 void ASTContext::setParameterIndex(const ParmVarDecl *D, unsigned int index) {
11370 ParamIndices[D] = index;
11371 }
11372
getParameterIndex(const ParmVarDecl * D) const11373 unsigned ASTContext::getParameterIndex(const ParmVarDecl *D) const {
11374 ParameterIndexTable::const_iterator I = ParamIndices.find(D);
11375 assert(I != ParamIndices.end() &&
11376 "ParmIndices lacks entry set by ParmVarDecl");
11377 return I->second;
11378 }
11379
getStringLiteralArrayType(QualType EltTy,unsigned Length) const11380 QualType ASTContext::getStringLiteralArrayType(QualType EltTy,
11381 unsigned Length) const {
11382 // A C++ string literal has a const-qualified element type (C++ 2.13.4p1).
11383 if (getLangOpts().CPlusPlus || getLangOpts().ConstStrings)
11384 EltTy = EltTy.withConst();
11385
11386 EltTy = adjustStringLiteralBaseType(EltTy);
11387
11388 // Get an array type for the string, according to C99 6.4.5. This includes
11389 // the null terminator character.
11390 return getConstantArrayType(EltTy, llvm::APInt(32, Length + 1), nullptr,
11391 ArrayType::Normal, /*IndexTypeQuals*/ 0);
11392 }
11393
11394 StringLiteral *
getPredefinedStringLiteralFromCache(StringRef Key) const11395 ASTContext::getPredefinedStringLiteralFromCache(StringRef Key) const {
11396 StringLiteral *&Result = StringLiteralCache[Key];
11397 if (!Result)
11398 Result = StringLiteral::Create(
11399 *this, Key, StringLiteral::Ascii,
11400 /*Pascal*/ false, getStringLiteralArrayType(CharTy, Key.size()),
11401 SourceLocation());
11402 return Result;
11403 }
11404
11405 MSGuidDecl *
getMSGuidDecl(MSGuidDecl::Parts Parts) const11406 ASTContext::getMSGuidDecl(MSGuidDecl::Parts Parts) const {
11407 assert(MSGuidTagDecl && "building MS GUID without MS extensions?");
11408
11409 llvm::FoldingSetNodeID ID;
11410 MSGuidDecl::Profile(ID, Parts);
11411
11412 void *InsertPos;
11413 if (MSGuidDecl *Existing = MSGuidDecls.FindNodeOrInsertPos(ID, InsertPos))
11414 return Existing;
11415
11416 QualType GUIDType = getMSGuidType().withConst();
11417 MSGuidDecl *New = MSGuidDecl::Create(*this, GUIDType, Parts);
11418 MSGuidDecls.InsertNode(New, InsertPos);
11419 return New;
11420 }
11421
11422 TemplateParamObjectDecl *
getTemplateParamObjectDecl(QualType T,const APValue & V) const11423 ASTContext::getTemplateParamObjectDecl(QualType T, const APValue &V) const {
11424 assert(T->isRecordType() && "template param object of unexpected type");
11425
11426 // C++ [temp.param]p8:
11427 // [...] a static storage duration object of type 'const T' [...]
11428 T.addConst();
11429
11430 llvm::FoldingSetNodeID ID;
11431 TemplateParamObjectDecl::Profile(ID, T, V);
11432
11433 void *InsertPos;
11434 if (TemplateParamObjectDecl *Existing =
11435 TemplateParamObjectDecls.FindNodeOrInsertPos(ID, InsertPos))
11436 return Existing;
11437
11438 TemplateParamObjectDecl *New = TemplateParamObjectDecl::Create(*this, T, V);
11439 TemplateParamObjectDecls.InsertNode(New, InsertPos);
11440 return New;
11441 }
11442
AtomicUsesUnsupportedLibcall(const AtomicExpr * E) const11443 bool ASTContext::AtomicUsesUnsupportedLibcall(const AtomicExpr *E) const {
11444 const llvm::Triple &T = getTargetInfo().getTriple();
11445 if (!T.isOSDarwin())
11446 return false;
11447
11448 if (!(T.isiOS() && T.isOSVersionLT(7)) &&
11449 !(T.isMacOSX() && T.isOSVersionLT(10, 9)))
11450 return false;
11451
11452 QualType AtomicTy = E->getPtr()->getType()->getPointeeType();
11453 CharUnits sizeChars = getTypeSizeInChars(AtomicTy);
11454 uint64_t Size = sizeChars.getQuantity();
11455 CharUnits alignChars = getTypeAlignInChars(AtomicTy);
11456 unsigned Align = alignChars.getQuantity();
11457 unsigned MaxInlineWidthInBits = getTargetInfo().getMaxAtomicInlineWidth();
11458 return (Size != Align || toBits(sizeChars) > MaxInlineWidthInBits);
11459 }
11460
11461 bool
ObjCMethodsAreEqual(const ObjCMethodDecl * MethodDecl,const ObjCMethodDecl * MethodImpl)11462 ASTContext::ObjCMethodsAreEqual(const ObjCMethodDecl *MethodDecl,
11463 const ObjCMethodDecl *MethodImpl) {
11464 // No point trying to match an unavailable/deprecated mothod.
11465 if (MethodDecl->hasAttr<UnavailableAttr>()
11466 || MethodDecl->hasAttr<DeprecatedAttr>())
11467 return false;
11468 if (MethodDecl->getObjCDeclQualifier() !=
11469 MethodImpl->getObjCDeclQualifier())
11470 return false;
11471 if (!hasSameType(MethodDecl->getReturnType(), MethodImpl->getReturnType()))
11472 return false;
11473
11474 if (MethodDecl->param_size() != MethodImpl->param_size())
11475 return false;
11476
11477 for (ObjCMethodDecl::param_const_iterator IM = MethodImpl->param_begin(),
11478 IF = MethodDecl->param_begin(), EM = MethodImpl->param_end(),
11479 EF = MethodDecl->param_end();
11480 IM != EM && IF != EF; ++IM, ++IF) {
11481 const ParmVarDecl *DeclVar = (*IF);
11482 const ParmVarDecl *ImplVar = (*IM);
11483 if (ImplVar->getObjCDeclQualifier() != DeclVar->getObjCDeclQualifier())
11484 return false;
11485 if (!hasSameType(DeclVar->getType(), ImplVar->getType()))
11486 return false;
11487 }
11488
11489 return (MethodDecl->isVariadic() == MethodImpl->isVariadic());
11490 }
11491
getTargetNullPointerValue(QualType QT) const11492 uint64_t ASTContext::getTargetNullPointerValue(QualType QT) const {
11493 LangAS AS;
11494 if (QT->getUnqualifiedDesugaredType()->isNullPtrType())
11495 AS = LangAS::Default;
11496 else
11497 AS = QT->getPointeeType().getAddressSpace();
11498
11499 return getTargetInfo().getNullPointerValue(AS);
11500 }
11501
getTargetAddressSpace(LangAS AS) const11502 unsigned ASTContext::getTargetAddressSpace(LangAS AS) const {
11503 if (isTargetAddressSpace(AS))
11504 return toTargetAddressSpace(AS);
11505 else
11506 return (*AddrSpaceMap)[(unsigned)AS];
11507 }
11508
getCorrespondingSaturatedType(QualType Ty) const11509 QualType ASTContext::getCorrespondingSaturatedType(QualType Ty) const {
11510 assert(Ty->isFixedPointType());
11511
11512 if (Ty->isSaturatedFixedPointType()) return Ty;
11513
11514 switch (Ty->castAs<BuiltinType>()->getKind()) {
11515 default:
11516 llvm_unreachable("Not a fixed point type!");
11517 case BuiltinType::ShortAccum:
11518 return SatShortAccumTy;
11519 case BuiltinType::Accum:
11520 return SatAccumTy;
11521 case BuiltinType::LongAccum:
11522 return SatLongAccumTy;
11523 case BuiltinType::UShortAccum:
11524 return SatUnsignedShortAccumTy;
11525 case BuiltinType::UAccum:
11526 return SatUnsignedAccumTy;
11527 case BuiltinType::ULongAccum:
11528 return SatUnsignedLongAccumTy;
11529 case BuiltinType::ShortFract:
11530 return SatShortFractTy;
11531 case BuiltinType::Fract:
11532 return SatFractTy;
11533 case BuiltinType::LongFract:
11534 return SatLongFractTy;
11535 case BuiltinType::UShortFract:
11536 return SatUnsignedShortFractTy;
11537 case BuiltinType::UFract:
11538 return SatUnsignedFractTy;
11539 case BuiltinType::ULongFract:
11540 return SatUnsignedLongFractTy;
11541 }
11542 }
11543
getLangASForBuiltinAddressSpace(unsigned AS) const11544 LangAS ASTContext::getLangASForBuiltinAddressSpace(unsigned AS) const {
11545 if (LangOpts.OpenCL)
11546 return getTargetInfo().getOpenCLBuiltinAddressSpace(AS);
11547
11548 if (LangOpts.CUDA)
11549 return getTargetInfo().getCUDABuiltinAddressSpace(AS);
11550
11551 return getLangASFromTargetAS(AS);
11552 }
11553
11554 // Explicitly instantiate this in case a Redeclarable<T> is used from a TU that
11555 // doesn't include ASTContext.h
11556 template
11557 clang::LazyGenerationalUpdatePtr<
11558 const Decl *, Decl *, &ExternalASTSource::CompleteRedeclChain>::ValueType
11559 clang::LazyGenerationalUpdatePtr<
11560 const Decl *, Decl *, &ExternalASTSource::CompleteRedeclChain>::makeValue(
11561 const clang::ASTContext &Ctx, Decl *Value);
11562
getFixedPointScale(QualType Ty) const11563 unsigned char ASTContext::getFixedPointScale(QualType Ty) const {
11564 assert(Ty->isFixedPointType());
11565
11566 const TargetInfo &Target = getTargetInfo();
11567 switch (Ty->castAs<BuiltinType>()->getKind()) {
11568 default:
11569 llvm_unreachable("Not a fixed point type!");
11570 case BuiltinType::ShortAccum:
11571 case BuiltinType::SatShortAccum:
11572 return Target.getShortAccumScale();
11573 case BuiltinType::Accum:
11574 case BuiltinType::SatAccum:
11575 return Target.getAccumScale();
11576 case BuiltinType::LongAccum:
11577 case BuiltinType::SatLongAccum:
11578 return Target.getLongAccumScale();
11579 case BuiltinType::UShortAccum:
11580 case BuiltinType::SatUShortAccum:
11581 return Target.getUnsignedShortAccumScale();
11582 case BuiltinType::UAccum:
11583 case BuiltinType::SatUAccum:
11584 return Target.getUnsignedAccumScale();
11585 case BuiltinType::ULongAccum:
11586 case BuiltinType::SatULongAccum:
11587 return Target.getUnsignedLongAccumScale();
11588 case BuiltinType::ShortFract:
11589 case BuiltinType::SatShortFract:
11590 return Target.getShortFractScale();
11591 case BuiltinType::Fract:
11592 case BuiltinType::SatFract:
11593 return Target.getFractScale();
11594 case BuiltinType::LongFract:
11595 case BuiltinType::SatLongFract:
11596 return Target.getLongFractScale();
11597 case BuiltinType::UShortFract:
11598 case BuiltinType::SatUShortFract:
11599 return Target.getUnsignedShortFractScale();
11600 case BuiltinType::UFract:
11601 case BuiltinType::SatUFract:
11602 return Target.getUnsignedFractScale();
11603 case BuiltinType::ULongFract:
11604 case BuiltinType::SatULongFract:
11605 return Target.getUnsignedLongFractScale();
11606 }
11607 }
11608
getFixedPointIBits(QualType Ty) const11609 unsigned char ASTContext::getFixedPointIBits(QualType Ty) const {
11610 assert(Ty->isFixedPointType());
11611
11612 const TargetInfo &Target = getTargetInfo();
11613 switch (Ty->castAs<BuiltinType>()->getKind()) {
11614 default:
11615 llvm_unreachable("Not a fixed point type!");
11616 case BuiltinType::ShortAccum:
11617 case BuiltinType::SatShortAccum:
11618 return Target.getShortAccumIBits();
11619 case BuiltinType::Accum:
11620 case BuiltinType::SatAccum:
11621 return Target.getAccumIBits();
11622 case BuiltinType::LongAccum:
11623 case BuiltinType::SatLongAccum:
11624 return Target.getLongAccumIBits();
11625 case BuiltinType::UShortAccum:
11626 case BuiltinType::SatUShortAccum:
11627 return Target.getUnsignedShortAccumIBits();
11628 case BuiltinType::UAccum:
11629 case BuiltinType::SatUAccum:
11630 return Target.getUnsignedAccumIBits();
11631 case BuiltinType::ULongAccum:
11632 case BuiltinType::SatULongAccum:
11633 return Target.getUnsignedLongAccumIBits();
11634 case BuiltinType::ShortFract:
11635 case BuiltinType::SatShortFract:
11636 case BuiltinType::Fract:
11637 case BuiltinType::SatFract:
11638 case BuiltinType::LongFract:
11639 case BuiltinType::SatLongFract:
11640 case BuiltinType::UShortFract:
11641 case BuiltinType::SatUShortFract:
11642 case BuiltinType::UFract:
11643 case BuiltinType::SatUFract:
11644 case BuiltinType::ULongFract:
11645 case BuiltinType::SatULongFract:
11646 return 0;
11647 }
11648 }
11649
11650 llvm::FixedPointSemantics
getFixedPointSemantics(QualType Ty) const11651 ASTContext::getFixedPointSemantics(QualType Ty) const {
11652 assert((Ty->isFixedPointType() || Ty->isIntegerType()) &&
11653 "Can only get the fixed point semantics for a "
11654 "fixed point or integer type.");
11655 if (Ty->isIntegerType())
11656 return llvm::FixedPointSemantics::GetIntegerSemantics(
11657 getIntWidth(Ty), Ty->isSignedIntegerType());
11658
11659 bool isSigned = Ty->isSignedFixedPointType();
11660 return llvm::FixedPointSemantics(
11661 static_cast<unsigned>(getTypeSize(Ty)), getFixedPointScale(Ty), isSigned,
11662 Ty->isSaturatedFixedPointType(),
11663 !isSigned && getTargetInfo().doUnsignedFixedPointTypesHavePadding());
11664 }
11665
getFixedPointMax(QualType Ty) const11666 llvm::APFixedPoint ASTContext::getFixedPointMax(QualType Ty) const {
11667 assert(Ty->isFixedPointType());
11668 return llvm::APFixedPoint::getMax(getFixedPointSemantics(Ty));
11669 }
11670
getFixedPointMin(QualType Ty) const11671 llvm::APFixedPoint ASTContext::getFixedPointMin(QualType Ty) const {
11672 assert(Ty->isFixedPointType());
11673 return llvm::APFixedPoint::getMin(getFixedPointSemantics(Ty));
11674 }
11675
getCorrespondingSignedFixedPointType(QualType Ty) const11676 QualType ASTContext::getCorrespondingSignedFixedPointType(QualType Ty) const {
11677 assert(Ty->isUnsignedFixedPointType() &&
11678 "Expected unsigned fixed point type");
11679
11680 switch (Ty->castAs<BuiltinType>()->getKind()) {
11681 case BuiltinType::UShortAccum:
11682 return ShortAccumTy;
11683 case BuiltinType::UAccum:
11684 return AccumTy;
11685 case BuiltinType::ULongAccum:
11686 return LongAccumTy;
11687 case BuiltinType::SatUShortAccum:
11688 return SatShortAccumTy;
11689 case BuiltinType::SatUAccum:
11690 return SatAccumTy;
11691 case BuiltinType::SatULongAccum:
11692 return SatLongAccumTy;
11693 case BuiltinType::UShortFract:
11694 return ShortFractTy;
11695 case BuiltinType::UFract:
11696 return FractTy;
11697 case BuiltinType::ULongFract:
11698 return LongFractTy;
11699 case BuiltinType::SatUShortFract:
11700 return SatShortFractTy;
11701 case BuiltinType::SatUFract:
11702 return SatFractTy;
11703 case BuiltinType::SatULongFract:
11704 return SatLongFractTy;
11705 default:
11706 llvm_unreachable("Unexpected unsigned fixed point type");
11707 }
11708 }
11709
11710 ParsedTargetAttr
filterFunctionTargetAttrs(const TargetAttr * TD) const11711 ASTContext::filterFunctionTargetAttrs(const TargetAttr *TD) const {
11712 assert(TD != nullptr);
11713 ParsedTargetAttr ParsedAttr = TD->parse();
11714
11715 ParsedAttr.Features.erase(
11716 llvm::remove_if(ParsedAttr.Features,
11717 [&](const std::string &Feat) {
11718 return !Target->isValidFeatureName(
11719 StringRef{Feat}.substr(1));
11720 }),
11721 ParsedAttr.Features.end());
11722 return ParsedAttr;
11723 }
11724
getFunctionFeatureMap(llvm::StringMap<bool> & FeatureMap,const FunctionDecl * FD) const11725 void ASTContext::getFunctionFeatureMap(llvm::StringMap<bool> &FeatureMap,
11726 const FunctionDecl *FD) const {
11727 if (FD)
11728 getFunctionFeatureMap(FeatureMap, GlobalDecl().getWithDecl(FD));
11729 else
11730 Target->initFeatureMap(FeatureMap, getDiagnostics(),
11731 Target->getTargetOpts().CPU,
11732 Target->getTargetOpts().Features);
11733 }
11734
11735 // Fills in the supplied string map with the set of target features for the
11736 // passed in function.
getFunctionFeatureMap(llvm::StringMap<bool> & FeatureMap,GlobalDecl GD) const11737 void ASTContext::getFunctionFeatureMap(llvm::StringMap<bool> &FeatureMap,
11738 GlobalDecl GD) const {
11739 StringRef TargetCPU = Target->getTargetOpts().CPU;
11740 const FunctionDecl *FD = GD.getDecl()->getAsFunction();
11741 if (const auto *TD = FD->getAttr<TargetAttr>()) {
11742 ParsedTargetAttr ParsedAttr = filterFunctionTargetAttrs(TD);
11743
11744 // Make a copy of the features as passed on the command line into the
11745 // beginning of the additional features from the function to override.
11746 ParsedAttr.Features.insert(
11747 ParsedAttr.Features.begin(),
11748 Target->getTargetOpts().FeaturesAsWritten.begin(),
11749 Target->getTargetOpts().FeaturesAsWritten.end());
11750
11751 if (ParsedAttr.Architecture != "" &&
11752 Target->isValidCPUName(ParsedAttr.Architecture))
11753 TargetCPU = ParsedAttr.Architecture;
11754
11755 // Now populate the feature map, first with the TargetCPU which is either
11756 // the default or a new one from the target attribute string. Then we'll use
11757 // the passed in features (FeaturesAsWritten) along with the new ones from
11758 // the attribute.
11759 Target->initFeatureMap(FeatureMap, getDiagnostics(), TargetCPU,
11760 ParsedAttr.Features);
11761 } else if (const auto *SD = FD->getAttr<CPUSpecificAttr>()) {
11762 llvm::SmallVector<StringRef, 32> FeaturesTmp;
11763 Target->getCPUSpecificCPUDispatchFeatures(
11764 SD->getCPUName(GD.getMultiVersionIndex())->getName(), FeaturesTmp);
11765 std::vector<std::string> Features(FeaturesTmp.begin(), FeaturesTmp.end());
11766 Target->initFeatureMap(FeatureMap, getDiagnostics(), TargetCPU, Features);
11767 } else {
11768 FeatureMap = Target->getTargetOpts().FeatureMap;
11769 }
11770 }
11771
getNewOMPTraitInfo()11772 OMPTraitInfo &ASTContext::getNewOMPTraitInfo() {
11773 OMPTraitInfoVector.emplace_back(new OMPTraitInfo());
11774 return *OMPTraitInfoVector.back();
11775 }
11776
11777 const StreamingDiagnostic &clang::
operator <<(const StreamingDiagnostic & DB,const ASTContext::SectionInfo & Section)11778 operator<<(const StreamingDiagnostic &DB,
11779 const ASTContext::SectionInfo &Section) {
11780 if (Section.Decl)
11781 return DB << Section.Decl;
11782 return DB << "a prior #pragma section";
11783 }
11784
mayExternalizeStaticVar(const Decl * D) const11785 bool ASTContext::mayExternalizeStaticVar(const Decl *D) const {
11786 bool IsStaticVar =
11787 isa<VarDecl>(D) && cast<VarDecl>(D)->getStorageClass() == SC_Static;
11788 bool IsExplicitDeviceVar = (D->hasAttr<CUDADeviceAttr>() &&
11789 !D->getAttr<CUDADeviceAttr>()->isImplicit()) ||
11790 (D->hasAttr<CUDAConstantAttr>() &&
11791 !D->getAttr<CUDAConstantAttr>()->isImplicit());
11792 // CUDA/HIP: static managed variables need to be externalized since it is
11793 // a declaration in IR, therefore cannot have internal linkage.
11794 return IsStaticVar &&
11795 (D->hasAttr<HIPManagedAttr>() || IsExplicitDeviceVar);
11796 }
11797
shouldExternalizeStaticVar(const Decl * D) const11798 bool ASTContext::shouldExternalizeStaticVar(const Decl *D) const {
11799 return mayExternalizeStaticVar(D) &&
11800 (D->hasAttr<HIPManagedAttr>() ||
11801 CUDADeviceVarODRUsedByHost.count(cast<VarDecl>(D)));
11802 }
11803
getCUIDHash() const11804 StringRef ASTContext::getCUIDHash() const {
11805 if (!CUIDHash.empty())
11806 return CUIDHash;
11807 if (LangOpts.CUID.empty())
11808 return StringRef();
11809 CUIDHash = llvm::utohexstr(llvm::MD5Hash(LangOpts.CUID), /*LowerCase=*/true);
11810 return CUIDHash;
11811 }
11812