xref: /freebsd/contrib/llvm-project/clang/lib/AST/ASTContext.cpp (revision 6c4b055cfb6bf549e9145dde6454cc6b178c35e4)
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/StmtOpenACC.h"
45 #include "clang/AST/TemplateBase.h"
46 #include "clang/AST/TemplateName.h"
47 #include "clang/AST/Type.h"
48 #include "clang/AST/TypeLoc.h"
49 #include "clang/AST/UnresolvedSet.h"
50 #include "clang/AST/VTableBuilder.h"
51 #include "clang/Basic/AddressSpaces.h"
52 #include "clang/Basic/Builtins.h"
53 #include "clang/Basic/CommentOptions.h"
54 #include "clang/Basic/ExceptionSpecificationType.h"
55 #include "clang/Basic/IdentifierTable.h"
56 #include "clang/Basic/LLVM.h"
57 #include "clang/Basic/LangOptions.h"
58 #include "clang/Basic/Linkage.h"
59 #include "clang/Basic/Module.h"
60 #include "clang/Basic/NoSanitizeList.h"
61 #include "clang/Basic/ObjCRuntime.h"
62 #include "clang/Basic/ProfileList.h"
63 #include "clang/Basic/SourceLocation.h"
64 #include "clang/Basic/SourceManager.h"
65 #include "clang/Basic/Specifiers.h"
66 #include "clang/Basic/TargetCXXABI.h"
67 #include "clang/Basic/TargetInfo.h"
68 #include "clang/Basic/XRayLists.h"
69 #include "llvm/ADT/APFixedPoint.h"
70 #include "llvm/ADT/APInt.h"
71 #include "llvm/ADT/APSInt.h"
72 #include "llvm/ADT/ArrayRef.h"
73 #include "llvm/ADT/DenseMap.h"
74 #include "llvm/ADT/DenseSet.h"
75 #include "llvm/ADT/FoldingSet.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/Frontend/OpenMP/OMPIRBuilder.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/SipHash.h"
90 #include "llvm/Support/raw_ostream.h"
91 #include "llvm/TargetParser/AArch64TargetParser.h"
92 #include "llvm/TargetParser/Triple.h"
93 #include <algorithm>
94 #include <cassert>
95 #include <cstddef>
96 #include <cstdint>
97 #include <cstdlib>
98 #include <map>
99 #include <memory>
100 #include <optional>
101 #include <string>
102 #include <tuple>
103 #include <utility>
104 
105 using namespace clang;
106 
107 enum FloatingRank {
108   BFloat16Rank,
109   Float16Rank,
110   HalfRank,
111   FloatRank,
112   DoubleRank,
113   LongDoubleRank,
114   Float128Rank,
115   Ibm128Rank
116 };
117 
118 /// \returns The locations that are relevant when searching for Doc comments
119 /// related to \p D.
120 static SmallVector<SourceLocation, 2>
getDeclLocsForCommentSearch(const Decl * D,SourceManager & SourceMgr)121 getDeclLocsForCommentSearch(const Decl *D, SourceManager &SourceMgr) {
122   assert(D);
123 
124   // User can not attach documentation to implicit declarations.
125   if (D->isImplicit())
126     return {};
127 
128   // User can not attach documentation to implicit instantiations.
129   if (const auto *FD = dyn_cast<FunctionDecl>(D)) {
130     if (FD->getTemplateSpecializationKind() == TSK_ImplicitInstantiation)
131       return {};
132   }
133 
134   if (const auto *VD = dyn_cast<VarDecl>(D)) {
135     if (VD->isStaticDataMember() &&
136         VD->getTemplateSpecializationKind() == TSK_ImplicitInstantiation)
137       return {};
138   }
139 
140   if (const auto *CRD = dyn_cast<CXXRecordDecl>(D)) {
141     if (CRD->getTemplateSpecializationKind() == TSK_ImplicitInstantiation)
142       return {};
143   }
144 
145   if (const auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(D)) {
146     TemplateSpecializationKind TSK = CTSD->getSpecializationKind();
147     if (TSK == TSK_ImplicitInstantiation ||
148         TSK == TSK_Undeclared)
149       return {};
150   }
151 
152   if (const auto *ED = dyn_cast<EnumDecl>(D)) {
153     if (ED->getTemplateSpecializationKind() == TSK_ImplicitInstantiation)
154       return {};
155   }
156   if (const auto *TD = dyn_cast<TagDecl>(D)) {
157     // When tag declaration (but not definition!) is part of the
158     // decl-specifier-seq of some other declaration, it doesn't get comment
159     if (TD->isEmbeddedInDeclarator() && !TD->isCompleteDefinition())
160       return {};
161   }
162   // TODO: handle comments for function parameters properly.
163   if (isa<ParmVarDecl>(D))
164     return {};
165 
166   // TODO: we could look up template parameter documentation in the template
167   // documentation.
168   if (isa<TemplateTypeParmDecl>(D) ||
169       isa<NonTypeTemplateParmDecl>(D) ||
170       isa<TemplateTemplateParmDecl>(D))
171     return {};
172 
173   SmallVector<SourceLocation, 2> Locations;
174   // Find declaration location.
175   // For Objective-C declarations we generally don't expect to have multiple
176   // declarators, thus use declaration starting location as the "declaration
177   // location".
178   // For all other declarations multiple declarators are used quite frequently,
179   // so we use the location of the identifier as the "declaration location".
180   SourceLocation BaseLocation;
181   if (isa<ObjCMethodDecl>(D) || isa<ObjCContainerDecl>(D) ||
182       isa<ObjCPropertyDecl>(D) || isa<RedeclarableTemplateDecl>(D) ||
183       isa<ClassTemplateSpecializationDecl>(D) ||
184       // Allow association with Y across {} in `typedef struct X {} Y`.
185       isa<TypedefDecl>(D))
186     BaseLocation = D->getBeginLoc();
187   else
188     BaseLocation = D->getLocation();
189 
190   if (!D->getLocation().isMacroID()) {
191     Locations.emplace_back(BaseLocation);
192   } else {
193     const auto *DeclCtx = D->getDeclContext();
194 
195     // When encountering definitions generated from a macro (that are not
196     // contained by another declaration in the macro) we need to try and find
197     // the comment at the location of the expansion but if there is no comment
198     // there we should retry to see if there is a comment inside the macro as
199     // well. To this end we return first BaseLocation to first look at the
200     // expansion site, the second value is the spelling location of the
201     // beginning of the declaration defined inside the macro.
202     if (!(DeclCtx &&
203           Decl::castFromDeclContext(DeclCtx)->getLocation().isMacroID())) {
204       Locations.emplace_back(SourceMgr.getExpansionLoc(BaseLocation));
205     }
206 
207     // We use Decl::getBeginLoc() and not just BaseLocation here to ensure that
208     // we don't refer to the macro argument location at the expansion site (this
209     // can happen if the name's spelling is provided via macro argument), and
210     // always to the declaration itself.
211     Locations.emplace_back(SourceMgr.getSpellingLoc(D->getBeginLoc()));
212   }
213 
214   return Locations;
215 }
216 
getRawCommentForDeclNoCacheImpl(const Decl * D,const SourceLocation RepresentativeLocForDecl,const std::map<unsigned,RawComment * > & CommentsInTheFile) const217 RawComment *ASTContext::getRawCommentForDeclNoCacheImpl(
218     const Decl *D, const SourceLocation RepresentativeLocForDecl,
219     const std::map<unsigned, RawComment *> &CommentsInTheFile) const {
220   // If the declaration doesn't map directly to a location in a file, we
221   // can't find the comment.
222   if (RepresentativeLocForDecl.isInvalid() ||
223       !RepresentativeLocForDecl.isFileID())
224     return nullptr;
225 
226   // If there are no comments anywhere, we won't find anything.
227   if (CommentsInTheFile.empty())
228     return nullptr;
229 
230   // Decompose the location for the declaration and find the beginning of the
231   // file buffer.
232   const std::pair<FileID, unsigned> DeclLocDecomp =
233       SourceMgr.getDecomposedLoc(RepresentativeLocForDecl);
234 
235   // Slow path.
236   auto OffsetCommentBehindDecl =
237       CommentsInTheFile.lower_bound(DeclLocDecomp.second);
238 
239   // First check whether we have a trailing comment.
240   if (OffsetCommentBehindDecl != CommentsInTheFile.end()) {
241     RawComment *CommentBehindDecl = OffsetCommentBehindDecl->second;
242     if ((CommentBehindDecl->isDocumentation() ||
243          LangOpts.CommentOpts.ParseAllComments) &&
244         CommentBehindDecl->isTrailingComment() &&
245         (isa<FieldDecl>(D) || isa<EnumConstantDecl>(D) || isa<VarDecl>(D) ||
246          isa<ObjCMethodDecl>(D) || isa<ObjCPropertyDecl>(D))) {
247 
248       // Check that Doxygen trailing comment comes after the declaration, starts
249       // on the same line and in the same file as the declaration.
250       if (SourceMgr.getLineNumber(DeclLocDecomp.first, DeclLocDecomp.second) ==
251           Comments.getCommentBeginLine(CommentBehindDecl, DeclLocDecomp.first,
252                                        OffsetCommentBehindDecl->first)) {
253         return CommentBehindDecl;
254       }
255     }
256   }
257 
258   // The comment just after the declaration was not a trailing comment.
259   // Let's look at the previous comment.
260   if (OffsetCommentBehindDecl == CommentsInTheFile.begin())
261     return nullptr;
262 
263   auto OffsetCommentBeforeDecl = --OffsetCommentBehindDecl;
264   RawComment *CommentBeforeDecl = OffsetCommentBeforeDecl->second;
265 
266   // Check that we actually have a non-member Doxygen comment.
267   if (!(CommentBeforeDecl->isDocumentation() ||
268         LangOpts.CommentOpts.ParseAllComments) ||
269       CommentBeforeDecl->isTrailingComment())
270     return nullptr;
271 
272   // Decompose the end of the comment.
273   const unsigned CommentEndOffset =
274       Comments.getCommentEndOffset(CommentBeforeDecl);
275 
276   // Get the corresponding buffer.
277   bool Invalid = false;
278   const char *Buffer = SourceMgr.getBufferData(DeclLocDecomp.first,
279                                                &Invalid).data();
280   if (Invalid)
281     return nullptr;
282 
283   // Extract text between the comment and declaration.
284   StringRef Text(Buffer + CommentEndOffset,
285                  DeclLocDecomp.second - CommentEndOffset);
286 
287   // There should be no other declarations or preprocessor directives between
288   // comment and declaration.
289   if (Text.find_last_of(";{}#@") != StringRef::npos)
290     return nullptr;
291 
292   return CommentBeforeDecl;
293 }
294 
getRawCommentForDeclNoCache(const Decl * D) const295 RawComment *ASTContext::getRawCommentForDeclNoCache(const Decl *D) const {
296   const auto DeclLocs = getDeclLocsForCommentSearch(D, SourceMgr);
297 
298   for (const auto DeclLoc : DeclLocs) {
299     // If the declaration doesn't map directly to a location in a file, we
300     // can't find the comment.
301     if (DeclLoc.isInvalid() || !DeclLoc.isFileID())
302       continue;
303 
304     if (ExternalSource && !CommentsLoaded) {
305       ExternalSource->ReadComments();
306       CommentsLoaded = true;
307     }
308 
309     if (Comments.empty())
310       continue;
311 
312     const FileID File = SourceMgr.getDecomposedLoc(DeclLoc).first;
313     if (!File.isValid())
314       continue;
315 
316     const auto CommentsInThisFile = Comments.getCommentsInFile(File);
317     if (!CommentsInThisFile || CommentsInThisFile->empty())
318       continue;
319 
320     if (RawComment *Comment =
321             getRawCommentForDeclNoCacheImpl(D, DeclLoc, *CommentsInThisFile))
322       return Comment;
323   }
324 
325   return nullptr;
326 }
327 
addComment(const RawComment & RC)328 void ASTContext::addComment(const RawComment &RC) {
329   assert(LangOpts.RetainCommentsFromSystemHeaders ||
330          !SourceMgr.isInSystemHeader(RC.getSourceRange().getBegin()));
331   Comments.addComment(RC, LangOpts.CommentOpts, BumpAlloc);
332 }
333 
334 /// If we have a 'templated' declaration for a template, adjust 'D' to
335 /// refer to the actual template.
336 /// If we have an implicit instantiation, adjust 'D' to refer to template.
adjustDeclToTemplate(const Decl & D)337 static const Decl &adjustDeclToTemplate(const Decl &D) {
338   if (const auto *FD = dyn_cast<FunctionDecl>(&D)) {
339     // Is this function declaration part of a function template?
340     if (const FunctionTemplateDecl *FTD = FD->getDescribedFunctionTemplate())
341       return *FTD;
342 
343     // Nothing to do if function is not an implicit instantiation.
344     if (FD->getTemplateSpecializationKind() != TSK_ImplicitInstantiation)
345       return D;
346 
347     // Function is an implicit instantiation of a function template?
348     if (const FunctionTemplateDecl *FTD = FD->getPrimaryTemplate())
349       return *FTD;
350 
351     // Function is instantiated from a member definition of a class template?
352     if (const FunctionDecl *MemberDecl =
353             FD->getInstantiatedFromMemberFunction())
354       return *MemberDecl;
355 
356     return D;
357   }
358   if (const auto *VD = dyn_cast<VarDecl>(&D)) {
359     // Static data member is instantiated from a member definition of a class
360     // template?
361     if (VD->isStaticDataMember())
362       if (const VarDecl *MemberDecl = VD->getInstantiatedFromStaticDataMember())
363         return *MemberDecl;
364 
365     return D;
366   }
367   if (const auto *CRD = dyn_cast<CXXRecordDecl>(&D)) {
368     // Is this class declaration part of a class template?
369     if (const ClassTemplateDecl *CTD = CRD->getDescribedClassTemplate())
370       return *CTD;
371 
372     // Class is an implicit instantiation of a class template or partial
373     // specialization?
374     if (const auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(CRD)) {
375       if (CTSD->getSpecializationKind() != TSK_ImplicitInstantiation)
376         return D;
377       llvm::PointerUnion<ClassTemplateDecl *,
378                          ClassTemplatePartialSpecializationDecl *>
379           PU = CTSD->getSpecializedTemplateOrPartial();
380       return PU.is<ClassTemplateDecl *>()
381                  ? *static_cast<const Decl *>(PU.get<ClassTemplateDecl *>())
382                  : *static_cast<const Decl *>(
383                        PU.get<ClassTemplatePartialSpecializationDecl *>());
384     }
385 
386     // Class is instantiated from a member definition of a class template?
387     if (const MemberSpecializationInfo *Info =
388             CRD->getMemberSpecializationInfo())
389       return *Info->getInstantiatedFrom();
390 
391     return D;
392   }
393   if (const auto *ED = dyn_cast<EnumDecl>(&D)) {
394     // Enum is instantiated from a member definition of a class template?
395     if (const EnumDecl *MemberDecl = ED->getInstantiatedFromMemberEnum())
396       return *MemberDecl;
397 
398     return D;
399   }
400   // FIXME: Adjust alias templates?
401   return D;
402 }
403 
getRawCommentForAnyRedecl(const Decl * D,const Decl ** OriginalDecl) const404 const RawComment *ASTContext::getRawCommentForAnyRedecl(
405                                                 const Decl *D,
406                                                 const Decl **OriginalDecl) const {
407   if (!D) {
408     if (OriginalDecl)
409       OriginalDecl = nullptr;
410     return nullptr;
411   }
412 
413   D = &adjustDeclToTemplate(*D);
414 
415   // Any comment directly attached to D?
416   {
417     auto DeclComment = DeclRawComments.find(D);
418     if (DeclComment != DeclRawComments.end()) {
419       if (OriginalDecl)
420         *OriginalDecl = D;
421       return DeclComment->second;
422     }
423   }
424 
425   // Any comment attached to any redeclaration of D?
426   const Decl *CanonicalD = D->getCanonicalDecl();
427   if (!CanonicalD)
428     return nullptr;
429 
430   {
431     auto RedeclComment = RedeclChainComments.find(CanonicalD);
432     if (RedeclComment != RedeclChainComments.end()) {
433       if (OriginalDecl)
434         *OriginalDecl = RedeclComment->second;
435       auto CommentAtRedecl = DeclRawComments.find(RedeclComment->second);
436       assert(CommentAtRedecl != DeclRawComments.end() &&
437              "This decl is supposed to have comment attached.");
438       return CommentAtRedecl->second;
439     }
440   }
441 
442   // Any redeclarations of D that we haven't checked for comments yet?
443   // We can't use DenseMap::iterator directly since it'd get invalid.
444   auto LastCheckedRedecl = [this, CanonicalD]() -> const Decl * {
445     return CommentlessRedeclChains.lookup(CanonicalD);
446   }();
447 
448   for (const auto Redecl : D->redecls()) {
449     assert(Redecl);
450     // Skip all redeclarations that have been checked previously.
451     if (LastCheckedRedecl) {
452       if (LastCheckedRedecl == Redecl) {
453         LastCheckedRedecl = nullptr;
454       }
455       continue;
456     }
457     const RawComment *RedeclComment = getRawCommentForDeclNoCache(Redecl);
458     if (RedeclComment) {
459       cacheRawCommentForDecl(*Redecl, *RedeclComment);
460       if (OriginalDecl)
461         *OriginalDecl = Redecl;
462       return RedeclComment;
463     }
464     CommentlessRedeclChains[CanonicalD] = Redecl;
465   }
466 
467   if (OriginalDecl)
468     *OriginalDecl = nullptr;
469   return nullptr;
470 }
471 
cacheRawCommentForDecl(const Decl & OriginalD,const RawComment & Comment) const472 void ASTContext::cacheRawCommentForDecl(const Decl &OriginalD,
473                                         const RawComment &Comment) const {
474   assert(Comment.isDocumentation() || LangOpts.CommentOpts.ParseAllComments);
475   DeclRawComments.try_emplace(&OriginalD, &Comment);
476   const Decl *const CanonicalDecl = OriginalD.getCanonicalDecl();
477   RedeclChainComments.try_emplace(CanonicalDecl, &OriginalD);
478   CommentlessRedeclChains.erase(CanonicalDecl);
479 }
480 
addRedeclaredMethods(const ObjCMethodDecl * ObjCMethod,SmallVectorImpl<const NamedDecl * > & Redeclared)481 static void addRedeclaredMethods(const ObjCMethodDecl *ObjCMethod,
482                    SmallVectorImpl<const NamedDecl *> &Redeclared) {
483   const DeclContext *DC = ObjCMethod->getDeclContext();
484   if (const auto *IMD = dyn_cast<ObjCImplDecl>(DC)) {
485     const ObjCInterfaceDecl *ID = IMD->getClassInterface();
486     if (!ID)
487       return;
488     // Add redeclared method here.
489     for (const auto *Ext : ID->known_extensions()) {
490       if (ObjCMethodDecl *RedeclaredMethod =
491             Ext->getMethod(ObjCMethod->getSelector(),
492                                   ObjCMethod->isInstanceMethod()))
493         Redeclared.push_back(RedeclaredMethod);
494     }
495   }
496 }
497 
attachCommentsToJustParsedDecls(ArrayRef<Decl * > Decls,const Preprocessor * PP)498 void ASTContext::attachCommentsToJustParsedDecls(ArrayRef<Decl *> Decls,
499                                                  const Preprocessor *PP) {
500   if (Comments.empty() || Decls.empty())
501     return;
502 
503   FileID File;
504   for (const Decl *D : Decls) {
505     if (D->isInvalidDecl())
506       continue;
507 
508     D = &adjustDeclToTemplate(*D);
509     SourceLocation Loc = D->getLocation();
510     if (Loc.isValid()) {
511       // See if there are any new comments that are not attached to a decl.
512       // The location doesn't have to be precise - we care only about the file.
513       File = SourceMgr.getDecomposedLoc(Loc).first;
514       break;
515     }
516   }
517 
518   if (File.isInvalid())
519     return;
520 
521   auto CommentsInThisFile = Comments.getCommentsInFile(File);
522   if (!CommentsInThisFile || CommentsInThisFile->empty() ||
523       CommentsInThisFile->rbegin()->second->isAttached())
524     return;
525 
526   // There is at least one comment not attached to a decl.
527   // Maybe it should be attached to one of Decls?
528   //
529   // Note that this way we pick up not only comments that precede the
530   // declaration, but also comments that *follow* the declaration -- thanks to
531   // the lookahead in the lexer: we've consumed the semicolon and looked
532   // ahead through comments.
533   for (const Decl *D : Decls) {
534     assert(D);
535     if (D->isInvalidDecl())
536       continue;
537 
538     D = &adjustDeclToTemplate(*D);
539 
540     if (DeclRawComments.count(D) > 0)
541       continue;
542 
543     const auto DeclLocs = getDeclLocsForCommentSearch(D, SourceMgr);
544 
545     for (const auto DeclLoc : DeclLocs) {
546       if (DeclLoc.isInvalid() || !DeclLoc.isFileID())
547         continue;
548 
549       if (RawComment *const DocComment = getRawCommentForDeclNoCacheImpl(
550               D, DeclLoc, *CommentsInThisFile)) {
551         cacheRawCommentForDecl(*D, *DocComment);
552         comments::FullComment *FC = DocComment->parse(*this, PP, D);
553         ParsedComments[D->getCanonicalDecl()] = FC;
554         break;
555       }
556     }
557   }
558 }
559 
cloneFullComment(comments::FullComment * FC,const Decl * D) const560 comments::FullComment *ASTContext::cloneFullComment(comments::FullComment *FC,
561                                                     const Decl *D) const {
562   auto *ThisDeclInfo = new (*this) comments::DeclInfo;
563   ThisDeclInfo->CommentDecl = D;
564   ThisDeclInfo->IsFilled = false;
565   ThisDeclInfo->fill();
566   ThisDeclInfo->CommentDecl = FC->getDecl();
567   if (!ThisDeclInfo->TemplateParameters)
568     ThisDeclInfo->TemplateParameters = FC->getDeclInfo()->TemplateParameters;
569   comments::FullComment *CFC =
570     new (*this) comments::FullComment(FC->getBlocks(),
571                                       ThisDeclInfo);
572   return CFC;
573 }
574 
getLocalCommentForDeclUncached(const Decl * D) const575 comments::FullComment *ASTContext::getLocalCommentForDeclUncached(const Decl *D) const {
576   const RawComment *RC = getRawCommentForDeclNoCache(D);
577   return RC ? RC->parse(*this, nullptr, D) : nullptr;
578 }
579 
getCommentForDecl(const Decl * D,const Preprocessor * PP) const580 comments::FullComment *ASTContext::getCommentForDecl(
581                                               const Decl *D,
582                                               const Preprocessor *PP) const {
583   if (!D || D->isInvalidDecl())
584     return nullptr;
585   D = &adjustDeclToTemplate(*D);
586 
587   const Decl *Canonical = D->getCanonicalDecl();
588   llvm::DenseMap<const Decl *, comments::FullComment *>::iterator Pos =
589       ParsedComments.find(Canonical);
590 
591   if (Pos != ParsedComments.end()) {
592     if (Canonical != D) {
593       comments::FullComment *FC = Pos->second;
594       comments::FullComment *CFC = cloneFullComment(FC, D);
595       return CFC;
596     }
597     return Pos->second;
598   }
599 
600   const Decl *OriginalDecl = nullptr;
601 
602   const RawComment *RC = getRawCommentForAnyRedecl(D, &OriginalDecl);
603   if (!RC) {
604     if (isa<ObjCMethodDecl>(D) || isa<FunctionDecl>(D)) {
605       SmallVector<const NamedDecl*, 8> Overridden;
606       const auto *OMD = dyn_cast<ObjCMethodDecl>(D);
607       if (OMD && OMD->isPropertyAccessor())
608         if (const ObjCPropertyDecl *PDecl = OMD->findPropertyDecl())
609           if (comments::FullComment *FC = getCommentForDecl(PDecl, PP))
610             return cloneFullComment(FC, D);
611       if (OMD)
612         addRedeclaredMethods(OMD, Overridden);
613       getOverriddenMethods(dyn_cast<NamedDecl>(D), Overridden);
614       for (unsigned i = 0, e = Overridden.size(); i < e; i++)
615         if (comments::FullComment *FC = getCommentForDecl(Overridden[i], PP))
616           return cloneFullComment(FC, D);
617     }
618     else if (const auto *TD = dyn_cast<TypedefNameDecl>(D)) {
619       // Attach any tag type's documentation to its typedef if latter
620       // does not have one of its own.
621       QualType QT = TD->getUnderlyingType();
622       if (const auto *TT = QT->getAs<TagType>())
623         if (const Decl *TD = TT->getDecl())
624           if (comments::FullComment *FC = getCommentForDecl(TD, PP))
625             return cloneFullComment(FC, D);
626     }
627     else if (const auto *IC = dyn_cast<ObjCInterfaceDecl>(D)) {
628       while (IC->getSuperClass()) {
629         IC = IC->getSuperClass();
630         if (comments::FullComment *FC = getCommentForDecl(IC, PP))
631           return cloneFullComment(FC, D);
632       }
633     }
634     else if (const auto *CD = dyn_cast<ObjCCategoryDecl>(D)) {
635       if (const ObjCInterfaceDecl *IC = CD->getClassInterface())
636         if (comments::FullComment *FC = getCommentForDecl(IC, PP))
637           return cloneFullComment(FC, D);
638     }
639     else if (const auto *RD = dyn_cast<CXXRecordDecl>(D)) {
640       if (!(RD = RD->getDefinition()))
641         return nullptr;
642       // Check non-virtual bases.
643       for (const auto &I : RD->bases()) {
644         if (I.isVirtual() || (I.getAccessSpecifier() != AS_public))
645           continue;
646         QualType Ty = I.getType();
647         if (Ty.isNull())
648           continue;
649         if (const CXXRecordDecl *NonVirtualBase = Ty->getAsCXXRecordDecl()) {
650           if (!(NonVirtualBase= NonVirtualBase->getDefinition()))
651             continue;
652 
653           if (comments::FullComment *FC = getCommentForDecl((NonVirtualBase), PP))
654             return cloneFullComment(FC, D);
655         }
656       }
657       // Check virtual bases.
658       for (const auto &I : RD->vbases()) {
659         if (I.getAccessSpecifier() != AS_public)
660           continue;
661         QualType Ty = I.getType();
662         if (Ty.isNull())
663           continue;
664         if (const CXXRecordDecl *VirtualBase = Ty->getAsCXXRecordDecl()) {
665           if (!(VirtualBase= VirtualBase->getDefinition()))
666             continue;
667           if (comments::FullComment *FC = getCommentForDecl((VirtualBase), PP))
668             return cloneFullComment(FC, D);
669         }
670       }
671     }
672     return nullptr;
673   }
674 
675   // If the RawComment was attached to other redeclaration of this Decl, we
676   // should parse the comment in context of that other Decl.  This is important
677   // because comments can contain references to parameter names which can be
678   // different across redeclarations.
679   if (D != OriginalDecl && OriginalDecl)
680     return getCommentForDecl(OriginalDecl, PP);
681 
682   comments::FullComment *FC = RC->parse(*this, PP, D);
683   ParsedComments[Canonical] = FC;
684   return FC;
685 }
686 
687 void
Profile(llvm::FoldingSetNodeID & ID,const ASTContext & C,TemplateTemplateParmDecl * Parm)688 ASTContext::CanonicalTemplateTemplateParm::Profile(llvm::FoldingSetNodeID &ID,
689                                                    const ASTContext &C,
690                                                TemplateTemplateParmDecl *Parm) {
691   ID.AddInteger(Parm->getDepth());
692   ID.AddInteger(Parm->getPosition());
693   ID.AddBoolean(Parm->isParameterPack());
694 
695   TemplateParameterList *Params = Parm->getTemplateParameters();
696   ID.AddInteger(Params->size());
697   for (TemplateParameterList::const_iterator P = Params->begin(),
698                                           PEnd = Params->end();
699        P != PEnd; ++P) {
700     if (const auto *TTP = dyn_cast<TemplateTypeParmDecl>(*P)) {
701       ID.AddInteger(0);
702       ID.AddBoolean(TTP->isParameterPack());
703       if (TTP->isExpandedParameterPack()) {
704         ID.AddBoolean(true);
705         ID.AddInteger(TTP->getNumExpansionParameters());
706       } else
707         ID.AddBoolean(false);
708       continue;
709     }
710 
711     if (const auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(*P)) {
712       ID.AddInteger(1);
713       ID.AddBoolean(NTTP->isParameterPack());
714       ID.AddPointer(C.getUnconstrainedType(C.getCanonicalType(NTTP->getType()))
715                         .getAsOpaquePtr());
716       if (NTTP->isExpandedParameterPack()) {
717         ID.AddBoolean(true);
718         ID.AddInteger(NTTP->getNumExpansionTypes());
719         for (unsigned I = 0, N = NTTP->getNumExpansionTypes(); I != N; ++I) {
720           QualType T = NTTP->getExpansionType(I);
721           ID.AddPointer(T.getCanonicalType().getAsOpaquePtr());
722         }
723       } else
724         ID.AddBoolean(false);
725       continue;
726     }
727 
728     auto *TTP = cast<TemplateTemplateParmDecl>(*P);
729     ID.AddInteger(2);
730     Profile(ID, C, TTP);
731   }
732 }
733 
734 TemplateTemplateParmDecl *
getCanonicalTemplateTemplateParmDecl(TemplateTemplateParmDecl * TTP) const735 ASTContext::getCanonicalTemplateTemplateParmDecl(
736                                           TemplateTemplateParmDecl *TTP) const {
737   // Check if we already have a canonical template template parameter.
738   llvm::FoldingSetNodeID ID;
739   CanonicalTemplateTemplateParm::Profile(ID, *this, TTP);
740   void *InsertPos = nullptr;
741   CanonicalTemplateTemplateParm *Canonical
742     = CanonTemplateTemplateParms.FindNodeOrInsertPos(ID, InsertPos);
743   if (Canonical)
744     return Canonical->getParam();
745 
746   // Build a canonical template parameter list.
747   TemplateParameterList *Params = TTP->getTemplateParameters();
748   SmallVector<NamedDecl *, 4> CanonParams;
749   CanonParams.reserve(Params->size());
750   for (TemplateParameterList::const_iterator P = Params->begin(),
751                                           PEnd = Params->end();
752        P != PEnd; ++P) {
753     // Note that, per C++20 [temp.over.link]/6, when determining whether
754     // template-parameters are equivalent, constraints are ignored.
755     if (const auto *TTP = dyn_cast<TemplateTypeParmDecl>(*P)) {
756       TemplateTypeParmDecl *NewTTP = TemplateTypeParmDecl::Create(
757           *this, getTranslationUnitDecl(), SourceLocation(), SourceLocation(),
758           TTP->getDepth(), TTP->getIndex(), nullptr, false,
759           TTP->isParameterPack(), /*HasTypeConstraint=*/false,
760           TTP->isExpandedParameterPack()
761               ? std::optional<unsigned>(TTP->getNumExpansionParameters())
762               : std::nullopt);
763       CanonParams.push_back(NewTTP);
764     } else if (const auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(*P)) {
765       QualType T = getUnconstrainedType(getCanonicalType(NTTP->getType()));
766       TypeSourceInfo *TInfo = getTrivialTypeSourceInfo(T);
767       NonTypeTemplateParmDecl *Param;
768       if (NTTP->isExpandedParameterPack()) {
769         SmallVector<QualType, 2> ExpandedTypes;
770         SmallVector<TypeSourceInfo *, 2> ExpandedTInfos;
771         for (unsigned I = 0, N = NTTP->getNumExpansionTypes(); I != N; ++I) {
772           ExpandedTypes.push_back(getCanonicalType(NTTP->getExpansionType(I)));
773           ExpandedTInfos.push_back(
774                                 getTrivialTypeSourceInfo(ExpandedTypes.back()));
775         }
776 
777         Param = NonTypeTemplateParmDecl::Create(*this, getTranslationUnitDecl(),
778                                                 SourceLocation(),
779                                                 SourceLocation(),
780                                                 NTTP->getDepth(),
781                                                 NTTP->getPosition(), nullptr,
782                                                 T,
783                                                 TInfo,
784                                                 ExpandedTypes,
785                                                 ExpandedTInfos);
786       } else {
787         Param = NonTypeTemplateParmDecl::Create(*this, getTranslationUnitDecl(),
788                                                 SourceLocation(),
789                                                 SourceLocation(),
790                                                 NTTP->getDepth(),
791                                                 NTTP->getPosition(), nullptr,
792                                                 T,
793                                                 NTTP->isParameterPack(),
794                                                 TInfo);
795       }
796       CanonParams.push_back(Param);
797     } else
798       CanonParams.push_back(getCanonicalTemplateTemplateParmDecl(
799                                            cast<TemplateTemplateParmDecl>(*P)));
800   }
801 
802   TemplateTemplateParmDecl *CanonTTP = TemplateTemplateParmDecl::Create(
803       *this, getTranslationUnitDecl(), SourceLocation(), TTP->getDepth(),
804       TTP->getPosition(), TTP->isParameterPack(), nullptr, /*Typename=*/false,
805       TemplateParameterList::Create(*this, SourceLocation(), SourceLocation(),
806                                     CanonParams, SourceLocation(),
807                                     /*RequiresClause=*/nullptr));
808 
809   // Get the new insert position for the node we care about.
810   Canonical = CanonTemplateTemplateParms.FindNodeOrInsertPos(ID, InsertPos);
811   assert(!Canonical && "Shouldn't be in the map!");
812   (void)Canonical;
813 
814   // Create the canonical template template parameter entry.
815   Canonical = new (*this) CanonicalTemplateTemplateParm(CanonTTP);
816   CanonTemplateTemplateParms.InsertNode(Canonical, InsertPos);
817   return CanonTTP;
818 }
819 
getCXXABIKind() const820 TargetCXXABI::Kind ASTContext::getCXXABIKind() const {
821   auto Kind = getTargetInfo().getCXXABI().getKind();
822   return getLangOpts().CXXABI.value_or(Kind);
823 }
824 
createCXXABI(const TargetInfo & T)825 CXXABI *ASTContext::createCXXABI(const TargetInfo &T) {
826   if (!LangOpts.CPlusPlus) return nullptr;
827 
828   switch (getCXXABIKind()) {
829   case TargetCXXABI::AppleARM64:
830   case TargetCXXABI::Fuchsia:
831   case TargetCXXABI::GenericARM: // Same as Itanium at this level
832   case TargetCXXABI::iOS:
833   case TargetCXXABI::WatchOS:
834   case TargetCXXABI::GenericAArch64:
835   case TargetCXXABI::GenericMIPS:
836   case TargetCXXABI::GenericItanium:
837   case TargetCXXABI::WebAssembly:
838   case TargetCXXABI::XL:
839     return CreateItaniumCXXABI(*this);
840   case TargetCXXABI::Microsoft:
841     return CreateMicrosoftCXXABI(*this);
842   }
843   llvm_unreachable("Invalid CXXABI type!");
844 }
845 
getInterpContext()846 interp::Context &ASTContext::getInterpContext() {
847   if (!InterpContext) {
848     InterpContext.reset(new interp::Context(*this));
849   }
850   return *InterpContext.get();
851 }
852 
getParentMapContext()853 ParentMapContext &ASTContext::getParentMapContext() {
854   if (!ParentMapCtx)
855     ParentMapCtx.reset(new ParentMapContext(*this));
856   return *ParentMapCtx.get();
857 }
858 
isAddrSpaceMapManglingEnabled(const TargetInfo & TI,const LangOptions & LangOpts)859 static bool isAddrSpaceMapManglingEnabled(const TargetInfo &TI,
860                                           const LangOptions &LangOpts) {
861   switch (LangOpts.getAddressSpaceMapMangling()) {
862   case LangOptions::ASMM_Target:
863     return TI.useAddressSpaceMapMangling();
864   case LangOptions::ASMM_On:
865     return true;
866   case LangOptions::ASMM_Off:
867     return false;
868   }
869   llvm_unreachable("getAddressSpaceMapMangling() doesn't cover anything.");
870 }
871 
ASTContext(LangOptions & LOpts,SourceManager & SM,IdentifierTable & idents,SelectorTable & sels,Builtin::Context & builtins,TranslationUnitKind TUKind)872 ASTContext::ASTContext(LangOptions &LOpts, SourceManager &SM,
873                        IdentifierTable &idents, SelectorTable &sels,
874                        Builtin::Context &builtins, TranslationUnitKind TUKind)
875     : ConstantArrayTypes(this_(), ConstantArrayTypesLog2InitSize),
876       DependentSizedArrayTypes(this_()), DependentSizedExtVectorTypes(this_()),
877       DependentAddressSpaceTypes(this_()), DependentVectorTypes(this_()),
878       DependentSizedMatrixTypes(this_()),
879       FunctionProtoTypes(this_(), FunctionProtoTypesLog2InitSize),
880       DependentTypeOfExprTypes(this_()), DependentDecltypeTypes(this_()),
881       TemplateSpecializationTypes(this_()),
882       DependentTemplateSpecializationTypes(this_()), AutoTypes(this_()),
883       DependentBitIntTypes(this_()), SubstTemplateTemplateParmPacks(this_()),
884       ArrayParameterTypes(this_()), CanonTemplateTemplateParms(this_()),
885       SourceMgr(SM), LangOpts(LOpts),
886       NoSanitizeL(new NoSanitizeList(LangOpts.NoSanitizeFiles, SM)),
887       XRayFilter(new XRayFunctionFilter(LangOpts.XRayAlwaysInstrumentFiles,
888                                         LangOpts.XRayNeverInstrumentFiles,
889                                         LangOpts.XRayAttrListFiles, SM)),
890       ProfList(new ProfileList(LangOpts.ProfileListFiles, SM)),
891       PrintingPolicy(LOpts), Idents(idents), Selectors(sels),
892       BuiltinInfo(builtins), TUKind(TUKind), DeclarationNames(*this),
893       Comments(SM), CommentCommandTraits(BumpAlloc, LOpts.CommentOpts),
894       CompCategories(this_()), LastSDM(nullptr, 0) {
895   addTranslationUnitDecl();
896 }
897 
cleanup()898 void ASTContext::cleanup() {
899   // Release the DenseMaps associated with DeclContext objects.
900   // FIXME: Is this the ideal solution?
901   ReleaseDeclContextMaps();
902 
903   // Call all of the deallocation functions on all of their targets.
904   for (auto &Pair : Deallocations)
905     (Pair.first)(Pair.second);
906   Deallocations.clear();
907 
908   // ASTRecordLayout objects in ASTRecordLayouts must always be destroyed
909   // because they can contain DenseMaps.
910   for (llvm::DenseMap<const ObjCContainerDecl*,
911        const ASTRecordLayout*>::iterator
912        I = ObjCLayouts.begin(), E = ObjCLayouts.end(); I != E; )
913     // Increment in loop to prevent using deallocated memory.
914     if (auto *R = const_cast<ASTRecordLayout *>((I++)->second))
915       R->Destroy(*this);
916   ObjCLayouts.clear();
917 
918   for (llvm::DenseMap<const RecordDecl*, const ASTRecordLayout*>::iterator
919        I = ASTRecordLayouts.begin(), E = ASTRecordLayouts.end(); I != E; ) {
920     // Increment in loop to prevent using deallocated memory.
921     if (auto *R = const_cast<ASTRecordLayout *>((I++)->second))
922       R->Destroy(*this);
923   }
924   ASTRecordLayouts.clear();
925 
926   for (llvm::DenseMap<const Decl*, AttrVec*>::iterator A = DeclAttrs.begin(),
927                                                     AEnd = DeclAttrs.end();
928        A != AEnd; ++A)
929     A->second->~AttrVec();
930   DeclAttrs.clear();
931 
932   for (const auto &Value : ModuleInitializers)
933     Value.second->~PerModuleInitializers();
934   ModuleInitializers.clear();
935 }
936 
~ASTContext()937 ASTContext::~ASTContext() { cleanup(); }
938 
setTraversalScope(const std::vector<Decl * > & TopLevelDecls)939 void ASTContext::setTraversalScope(const std::vector<Decl *> &TopLevelDecls) {
940   TraversalScope = TopLevelDecls;
941   getParentMapContext().clear();
942 }
943 
AddDeallocation(void (* Callback)(void *),void * Data) const944 void ASTContext::AddDeallocation(void (*Callback)(void *), void *Data) const {
945   Deallocations.push_back({Callback, Data});
946 }
947 
948 void
setExternalSource(IntrusiveRefCntPtr<ExternalASTSource> Source)949 ASTContext::setExternalSource(IntrusiveRefCntPtr<ExternalASTSource> Source) {
950   ExternalSource = std::move(Source);
951 }
952 
PrintStats() const953 void ASTContext::PrintStats() const {
954   llvm::errs() << "\n*** AST Context Stats:\n";
955   llvm::errs() << "  " << Types.size() << " types total.\n";
956 
957   unsigned counts[] = {
958 #define TYPE(Name, Parent) 0,
959 #define ABSTRACT_TYPE(Name, Parent)
960 #include "clang/AST/TypeNodes.inc"
961     0 // Extra
962   };
963 
964   for (unsigned i = 0, e = Types.size(); i != e; ++i) {
965     Type *T = Types[i];
966     counts[(unsigned)T->getTypeClass()]++;
967   }
968 
969   unsigned Idx = 0;
970   unsigned TotalBytes = 0;
971 #define TYPE(Name, Parent)                                              \
972   if (counts[Idx])                                                      \
973     llvm::errs() << "    " << counts[Idx] << " " << #Name               \
974                  << " types, " << sizeof(Name##Type) << " each "        \
975                  << "(" << counts[Idx] * sizeof(Name##Type)             \
976                  << " bytes)\n";                                        \
977   TotalBytes += counts[Idx] * sizeof(Name##Type);                       \
978   ++Idx;
979 #define ABSTRACT_TYPE(Name, Parent)
980 #include "clang/AST/TypeNodes.inc"
981 
982   llvm::errs() << "Total bytes = " << TotalBytes << "\n";
983 
984   // Implicit special member functions.
985   llvm::errs() << NumImplicitDefaultConstructorsDeclared << "/"
986                << NumImplicitDefaultConstructors
987                << " implicit default constructors created\n";
988   llvm::errs() << NumImplicitCopyConstructorsDeclared << "/"
989                << NumImplicitCopyConstructors
990                << " implicit copy constructors created\n";
991   if (getLangOpts().CPlusPlus)
992     llvm::errs() << NumImplicitMoveConstructorsDeclared << "/"
993                  << NumImplicitMoveConstructors
994                  << " implicit move constructors created\n";
995   llvm::errs() << NumImplicitCopyAssignmentOperatorsDeclared << "/"
996                << NumImplicitCopyAssignmentOperators
997                << " implicit copy assignment operators created\n";
998   if (getLangOpts().CPlusPlus)
999     llvm::errs() << NumImplicitMoveAssignmentOperatorsDeclared << "/"
1000                  << NumImplicitMoveAssignmentOperators
1001                  << " implicit move assignment operators created\n";
1002   llvm::errs() << NumImplicitDestructorsDeclared << "/"
1003                << NumImplicitDestructors
1004                << " implicit destructors created\n";
1005 
1006   if (ExternalSource) {
1007     llvm::errs() << "\n";
1008     ExternalSource->PrintStats();
1009   }
1010 
1011   BumpAlloc.PrintStats();
1012 }
1013 
mergeDefinitionIntoModule(NamedDecl * ND,Module * M,bool NotifyListeners)1014 void ASTContext::mergeDefinitionIntoModule(NamedDecl *ND, Module *M,
1015                                            bool NotifyListeners) {
1016   if (NotifyListeners)
1017     if (auto *Listener = getASTMutationListener())
1018       Listener->RedefinedHiddenDefinition(ND, M);
1019 
1020   MergedDefModules[cast<NamedDecl>(ND->getCanonicalDecl())].push_back(M);
1021 }
1022 
deduplicateMergedDefinitonsFor(NamedDecl * ND)1023 void ASTContext::deduplicateMergedDefinitonsFor(NamedDecl *ND) {
1024   auto It = MergedDefModules.find(cast<NamedDecl>(ND->getCanonicalDecl()));
1025   if (It == MergedDefModules.end())
1026     return;
1027 
1028   auto &Merged = It->second;
1029   llvm::DenseSet<Module*> Found;
1030   for (Module *&M : Merged)
1031     if (!Found.insert(M).second)
1032       M = nullptr;
1033   llvm::erase(Merged, nullptr);
1034 }
1035 
1036 ArrayRef<Module *>
getModulesWithMergedDefinition(const NamedDecl * Def)1037 ASTContext::getModulesWithMergedDefinition(const NamedDecl *Def) {
1038   auto MergedIt =
1039       MergedDefModules.find(cast<NamedDecl>(Def->getCanonicalDecl()));
1040   if (MergedIt == MergedDefModules.end())
1041     return std::nullopt;
1042   return MergedIt->second;
1043 }
1044 
resolve(ASTContext & Ctx)1045 void ASTContext::PerModuleInitializers::resolve(ASTContext &Ctx) {
1046   if (LazyInitializers.empty())
1047     return;
1048 
1049   auto *Source = Ctx.getExternalSource();
1050   assert(Source && "lazy initializers but no external source");
1051 
1052   auto LazyInits = std::move(LazyInitializers);
1053   LazyInitializers.clear();
1054 
1055   for (auto ID : LazyInits)
1056     Initializers.push_back(Source->GetExternalDecl(ID));
1057 
1058   assert(LazyInitializers.empty() &&
1059          "GetExternalDecl for lazy module initializer added more inits");
1060 }
1061 
addModuleInitializer(Module * M,Decl * D)1062 void ASTContext::addModuleInitializer(Module *M, Decl *D) {
1063   // One special case: if we add a module initializer that imports another
1064   // module, and that module's only initializer is an ImportDecl, simplify.
1065   if (const auto *ID = dyn_cast<ImportDecl>(D)) {
1066     auto It = ModuleInitializers.find(ID->getImportedModule());
1067 
1068     // Maybe the ImportDecl does nothing at all. (Common case.)
1069     if (It == ModuleInitializers.end())
1070       return;
1071 
1072     // Maybe the ImportDecl only imports another ImportDecl.
1073     auto &Imported = *It->second;
1074     if (Imported.Initializers.size() + Imported.LazyInitializers.size() == 1) {
1075       Imported.resolve(*this);
1076       auto *OnlyDecl = Imported.Initializers.front();
1077       if (isa<ImportDecl>(OnlyDecl))
1078         D = OnlyDecl;
1079     }
1080   }
1081 
1082   auto *&Inits = ModuleInitializers[M];
1083   if (!Inits)
1084     Inits = new (*this) PerModuleInitializers;
1085   Inits->Initializers.push_back(D);
1086 }
1087 
addLazyModuleInitializers(Module * M,ArrayRef<GlobalDeclID> IDs)1088 void ASTContext::addLazyModuleInitializers(Module *M,
1089                                            ArrayRef<GlobalDeclID> IDs) {
1090   auto *&Inits = ModuleInitializers[M];
1091   if (!Inits)
1092     Inits = new (*this) PerModuleInitializers;
1093   Inits->LazyInitializers.insert(Inits->LazyInitializers.end(),
1094                                  IDs.begin(), IDs.end());
1095 }
1096 
getModuleInitializers(Module * M)1097 ArrayRef<Decl *> ASTContext::getModuleInitializers(Module *M) {
1098   auto It = ModuleInitializers.find(M);
1099   if (It == ModuleInitializers.end())
1100     return std::nullopt;
1101 
1102   auto *Inits = It->second;
1103   Inits->resolve(*this);
1104   return Inits->Initializers;
1105 }
1106 
setCurrentNamedModule(Module * M)1107 void ASTContext::setCurrentNamedModule(Module *M) {
1108   assert(M->isNamedModule());
1109   assert(!CurrentCXXNamedModule &&
1110          "We should set named module for ASTContext for only once");
1111   CurrentCXXNamedModule = M;
1112 }
1113 
isInSameModule(const Module * M1,const Module * M2)1114 bool ASTContext::isInSameModule(const Module *M1, const Module *M2) {
1115   if (!M1 != !M2)
1116     return false;
1117 
1118   /// Get the representative module for M. The representative module is the
1119   /// first module unit for a specific primary module name. So that the module
1120   /// units have the same representative module belongs to the same module.
1121   ///
1122   /// The process is helpful to reduce the expensive string operations.
1123   auto GetRepresentativeModule = [this](const Module *M) {
1124     auto Iter = SameModuleLookupSet.find(M);
1125     if (Iter != SameModuleLookupSet.end())
1126       return Iter->second;
1127 
1128     const Module *RepresentativeModule =
1129         PrimaryModuleNameMap.try_emplace(M->getPrimaryModuleInterfaceName(), M)
1130             .first->second;
1131     SameModuleLookupSet[M] = RepresentativeModule;
1132     return RepresentativeModule;
1133   };
1134 
1135   assert(M1 && "Shouldn't call `isInSameModule` if both M1 and M2 are none.");
1136   return GetRepresentativeModule(M1) == GetRepresentativeModule(M2);
1137 }
1138 
getExternCContextDecl() const1139 ExternCContextDecl *ASTContext::getExternCContextDecl() const {
1140   if (!ExternCContext)
1141     ExternCContext = ExternCContextDecl::Create(*this, getTranslationUnitDecl());
1142 
1143   return ExternCContext;
1144 }
1145 
1146 BuiltinTemplateDecl *
buildBuiltinTemplateDecl(BuiltinTemplateKind BTK,const IdentifierInfo * II) const1147 ASTContext::buildBuiltinTemplateDecl(BuiltinTemplateKind BTK,
1148                                      const IdentifierInfo *II) const {
1149   auto *BuiltinTemplate =
1150       BuiltinTemplateDecl::Create(*this, getTranslationUnitDecl(), II, BTK);
1151   BuiltinTemplate->setImplicit();
1152   getTranslationUnitDecl()->addDecl(BuiltinTemplate);
1153 
1154   return BuiltinTemplate;
1155 }
1156 
1157 BuiltinTemplateDecl *
getMakeIntegerSeqDecl() const1158 ASTContext::getMakeIntegerSeqDecl() const {
1159   if (!MakeIntegerSeqDecl)
1160     MakeIntegerSeqDecl = buildBuiltinTemplateDecl(BTK__make_integer_seq,
1161                                                   getMakeIntegerSeqName());
1162   return MakeIntegerSeqDecl;
1163 }
1164 
1165 BuiltinTemplateDecl *
getTypePackElementDecl() const1166 ASTContext::getTypePackElementDecl() const {
1167   if (!TypePackElementDecl)
1168     TypePackElementDecl = buildBuiltinTemplateDecl(BTK__type_pack_element,
1169                                                    getTypePackElementName());
1170   return TypePackElementDecl;
1171 }
1172 
buildImplicitRecord(StringRef Name,RecordDecl::TagKind TK) const1173 RecordDecl *ASTContext::buildImplicitRecord(StringRef Name,
1174                                             RecordDecl::TagKind TK) const {
1175   SourceLocation Loc;
1176   RecordDecl *NewDecl;
1177   if (getLangOpts().CPlusPlus)
1178     NewDecl = CXXRecordDecl::Create(*this, TK, getTranslationUnitDecl(), Loc,
1179                                     Loc, &Idents.get(Name));
1180   else
1181     NewDecl = RecordDecl::Create(*this, TK, getTranslationUnitDecl(), Loc, Loc,
1182                                  &Idents.get(Name));
1183   NewDecl->setImplicit();
1184   NewDecl->addAttr(TypeVisibilityAttr::CreateImplicit(
1185       const_cast<ASTContext &>(*this), TypeVisibilityAttr::Default));
1186   return NewDecl;
1187 }
1188 
buildImplicitTypedef(QualType T,StringRef Name) const1189 TypedefDecl *ASTContext::buildImplicitTypedef(QualType T,
1190                                               StringRef Name) const {
1191   TypeSourceInfo *TInfo = getTrivialTypeSourceInfo(T);
1192   TypedefDecl *NewDecl = TypedefDecl::Create(
1193       const_cast<ASTContext &>(*this), getTranslationUnitDecl(),
1194       SourceLocation(), SourceLocation(), &Idents.get(Name), TInfo);
1195   NewDecl->setImplicit();
1196   return NewDecl;
1197 }
1198 
getInt128Decl() const1199 TypedefDecl *ASTContext::getInt128Decl() const {
1200   if (!Int128Decl)
1201     Int128Decl = buildImplicitTypedef(Int128Ty, "__int128_t");
1202   return Int128Decl;
1203 }
1204 
getUInt128Decl() const1205 TypedefDecl *ASTContext::getUInt128Decl() const {
1206   if (!UInt128Decl)
1207     UInt128Decl = buildImplicitTypedef(UnsignedInt128Ty, "__uint128_t");
1208   return UInt128Decl;
1209 }
1210 
InitBuiltinType(CanQualType & R,BuiltinType::Kind K)1211 void ASTContext::InitBuiltinType(CanQualType &R, BuiltinType::Kind K) {
1212   auto *Ty = new (*this, alignof(BuiltinType)) BuiltinType(K);
1213   R = CanQualType::CreateUnsafe(QualType(Ty, 0));
1214   Types.push_back(Ty);
1215 }
1216 
InitBuiltinTypes(const TargetInfo & Target,const TargetInfo * AuxTarget)1217 void ASTContext::InitBuiltinTypes(const TargetInfo &Target,
1218                                   const TargetInfo *AuxTarget) {
1219   assert((!this->Target || this->Target == &Target) &&
1220          "Incorrect target reinitialization");
1221   assert(VoidTy.isNull() && "Context reinitialized?");
1222 
1223   this->Target = &Target;
1224   this->AuxTarget = AuxTarget;
1225 
1226   ABI.reset(createCXXABI(Target));
1227   AddrSpaceMapMangling = isAddrSpaceMapManglingEnabled(Target, LangOpts);
1228 
1229   // C99 6.2.5p19.
1230   InitBuiltinType(VoidTy,              BuiltinType::Void);
1231 
1232   // C99 6.2.5p2.
1233   InitBuiltinType(BoolTy,              BuiltinType::Bool);
1234   // C99 6.2.5p3.
1235   if (LangOpts.CharIsSigned)
1236     InitBuiltinType(CharTy,            BuiltinType::Char_S);
1237   else
1238     InitBuiltinType(CharTy,            BuiltinType::Char_U);
1239   // C99 6.2.5p4.
1240   InitBuiltinType(SignedCharTy,        BuiltinType::SChar);
1241   InitBuiltinType(ShortTy,             BuiltinType::Short);
1242   InitBuiltinType(IntTy,               BuiltinType::Int);
1243   InitBuiltinType(LongTy,              BuiltinType::Long);
1244   InitBuiltinType(LongLongTy,          BuiltinType::LongLong);
1245 
1246   // C99 6.2.5p6.
1247   InitBuiltinType(UnsignedCharTy,      BuiltinType::UChar);
1248   InitBuiltinType(UnsignedShortTy,     BuiltinType::UShort);
1249   InitBuiltinType(UnsignedIntTy,       BuiltinType::UInt);
1250   InitBuiltinType(UnsignedLongTy,      BuiltinType::ULong);
1251   InitBuiltinType(UnsignedLongLongTy,  BuiltinType::ULongLong);
1252 
1253   // C99 6.2.5p10.
1254   InitBuiltinType(FloatTy,             BuiltinType::Float);
1255   InitBuiltinType(DoubleTy,            BuiltinType::Double);
1256   InitBuiltinType(LongDoubleTy,        BuiltinType::LongDouble);
1257 
1258   // GNU extension, __float128 for IEEE quadruple precision
1259   InitBuiltinType(Float128Ty,          BuiltinType::Float128);
1260 
1261   // __ibm128 for IBM extended precision
1262   InitBuiltinType(Ibm128Ty, BuiltinType::Ibm128);
1263 
1264   // C11 extension ISO/IEC TS 18661-3
1265   InitBuiltinType(Float16Ty,           BuiltinType::Float16);
1266 
1267   // ISO/IEC JTC1 SC22 WG14 N1169 Extension
1268   InitBuiltinType(ShortAccumTy,            BuiltinType::ShortAccum);
1269   InitBuiltinType(AccumTy,                 BuiltinType::Accum);
1270   InitBuiltinType(LongAccumTy,             BuiltinType::LongAccum);
1271   InitBuiltinType(UnsignedShortAccumTy,    BuiltinType::UShortAccum);
1272   InitBuiltinType(UnsignedAccumTy,         BuiltinType::UAccum);
1273   InitBuiltinType(UnsignedLongAccumTy,     BuiltinType::ULongAccum);
1274   InitBuiltinType(ShortFractTy,            BuiltinType::ShortFract);
1275   InitBuiltinType(FractTy,                 BuiltinType::Fract);
1276   InitBuiltinType(LongFractTy,             BuiltinType::LongFract);
1277   InitBuiltinType(UnsignedShortFractTy,    BuiltinType::UShortFract);
1278   InitBuiltinType(UnsignedFractTy,         BuiltinType::UFract);
1279   InitBuiltinType(UnsignedLongFractTy,     BuiltinType::ULongFract);
1280   InitBuiltinType(SatShortAccumTy,         BuiltinType::SatShortAccum);
1281   InitBuiltinType(SatAccumTy,              BuiltinType::SatAccum);
1282   InitBuiltinType(SatLongAccumTy,          BuiltinType::SatLongAccum);
1283   InitBuiltinType(SatUnsignedShortAccumTy, BuiltinType::SatUShortAccum);
1284   InitBuiltinType(SatUnsignedAccumTy,      BuiltinType::SatUAccum);
1285   InitBuiltinType(SatUnsignedLongAccumTy,  BuiltinType::SatULongAccum);
1286   InitBuiltinType(SatShortFractTy,         BuiltinType::SatShortFract);
1287   InitBuiltinType(SatFractTy,              BuiltinType::SatFract);
1288   InitBuiltinType(SatLongFractTy,          BuiltinType::SatLongFract);
1289   InitBuiltinType(SatUnsignedShortFractTy, BuiltinType::SatUShortFract);
1290   InitBuiltinType(SatUnsignedFractTy,      BuiltinType::SatUFract);
1291   InitBuiltinType(SatUnsignedLongFractTy,  BuiltinType::SatULongFract);
1292 
1293   // GNU extension, 128-bit integers.
1294   InitBuiltinType(Int128Ty,            BuiltinType::Int128);
1295   InitBuiltinType(UnsignedInt128Ty,    BuiltinType::UInt128);
1296 
1297   // C++ 3.9.1p5
1298   if (TargetInfo::isTypeSigned(Target.getWCharType()))
1299     InitBuiltinType(WCharTy,           BuiltinType::WChar_S);
1300   else  // -fshort-wchar makes wchar_t be unsigned.
1301     InitBuiltinType(WCharTy,           BuiltinType::WChar_U);
1302   if (LangOpts.CPlusPlus && LangOpts.WChar)
1303     WideCharTy = WCharTy;
1304   else {
1305     // C99 (or C++ using -fno-wchar).
1306     WideCharTy = getFromTargetType(Target.getWCharType());
1307   }
1308 
1309   WIntTy = getFromTargetType(Target.getWIntType());
1310 
1311   // C++20 (proposed)
1312   InitBuiltinType(Char8Ty,              BuiltinType::Char8);
1313 
1314   if (LangOpts.CPlusPlus) // C++0x 3.9.1p5, extension for C++
1315     InitBuiltinType(Char16Ty,           BuiltinType::Char16);
1316   else // C99
1317     Char16Ty = getFromTargetType(Target.getChar16Type());
1318 
1319   if (LangOpts.CPlusPlus) // C++0x 3.9.1p5, extension for C++
1320     InitBuiltinType(Char32Ty,           BuiltinType::Char32);
1321   else // C99
1322     Char32Ty = getFromTargetType(Target.getChar32Type());
1323 
1324   // Placeholder type for type-dependent expressions whose type is
1325   // completely unknown. No code should ever check a type against
1326   // DependentTy and users should never see it; however, it is here to
1327   // help diagnose failures to properly check for type-dependent
1328   // expressions.
1329   InitBuiltinType(DependentTy,         BuiltinType::Dependent);
1330 
1331   // Placeholder type for functions.
1332   InitBuiltinType(OverloadTy,          BuiltinType::Overload);
1333 
1334   // Placeholder type for bound members.
1335   InitBuiltinType(BoundMemberTy,       BuiltinType::BoundMember);
1336 
1337   // Placeholder type for unresolved templates.
1338   InitBuiltinType(UnresolvedTemplateTy, BuiltinType::UnresolvedTemplate);
1339 
1340   // Placeholder type for pseudo-objects.
1341   InitBuiltinType(PseudoObjectTy,      BuiltinType::PseudoObject);
1342 
1343   // "any" type; useful for debugger-like clients.
1344   InitBuiltinType(UnknownAnyTy,        BuiltinType::UnknownAny);
1345 
1346   // Placeholder type for unbridged ARC casts.
1347   InitBuiltinType(ARCUnbridgedCastTy,  BuiltinType::ARCUnbridgedCast);
1348 
1349   // Placeholder type for builtin functions.
1350   InitBuiltinType(BuiltinFnTy,  BuiltinType::BuiltinFn);
1351 
1352   // Placeholder type for OMP array sections.
1353   if (LangOpts.OpenMP) {
1354     InitBuiltinType(ArraySectionTy, BuiltinType::ArraySection);
1355     InitBuiltinType(OMPArrayShapingTy, BuiltinType::OMPArrayShaping);
1356     InitBuiltinType(OMPIteratorTy, BuiltinType::OMPIterator);
1357   }
1358   // Placeholder type for OpenACC array sections, if we are ALSO in OMP mode,
1359   // don't bother, as we're just using the same type as OMP.
1360   if (LangOpts.OpenACC && !LangOpts.OpenMP) {
1361     InitBuiltinType(ArraySectionTy, BuiltinType::ArraySection);
1362   }
1363   if (LangOpts.MatrixTypes)
1364     InitBuiltinType(IncompleteMatrixIdxTy, BuiltinType::IncompleteMatrixIdx);
1365 
1366   // Builtin types for 'id', 'Class', and 'SEL'.
1367   InitBuiltinType(ObjCBuiltinIdTy, BuiltinType::ObjCId);
1368   InitBuiltinType(ObjCBuiltinClassTy, BuiltinType::ObjCClass);
1369   InitBuiltinType(ObjCBuiltinSelTy, BuiltinType::ObjCSel);
1370 
1371   if (LangOpts.OpenCL) {
1372 #define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
1373     InitBuiltinType(SingletonId, BuiltinType::Id);
1374 #include "clang/Basic/OpenCLImageTypes.def"
1375 
1376     InitBuiltinType(OCLSamplerTy, BuiltinType::OCLSampler);
1377     InitBuiltinType(OCLEventTy, BuiltinType::OCLEvent);
1378     InitBuiltinType(OCLClkEventTy, BuiltinType::OCLClkEvent);
1379     InitBuiltinType(OCLQueueTy, BuiltinType::OCLQueue);
1380     InitBuiltinType(OCLReserveIDTy, BuiltinType::OCLReserveID);
1381 
1382 #define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
1383     InitBuiltinType(Id##Ty, BuiltinType::Id);
1384 #include "clang/Basic/OpenCLExtensionTypes.def"
1385   }
1386 
1387   if (Target.hasAArch64SVETypes() ||
1388       (AuxTarget && AuxTarget->hasAArch64SVETypes())) {
1389 #define SVE_TYPE(Name, Id, SingletonId) \
1390     InitBuiltinType(SingletonId, BuiltinType::Id);
1391 #include "clang/Basic/AArch64SVEACLETypes.def"
1392   }
1393 
1394   if (Target.getTriple().isPPC64()) {
1395 #define PPC_VECTOR_MMA_TYPE(Name, Id, Size) \
1396       InitBuiltinType(Id##Ty, BuiltinType::Id);
1397 #include "clang/Basic/PPCTypes.def"
1398 #define PPC_VECTOR_VSX_TYPE(Name, Id, Size) \
1399     InitBuiltinType(Id##Ty, BuiltinType::Id);
1400 #include "clang/Basic/PPCTypes.def"
1401   }
1402 
1403   if (Target.hasRISCVVTypes()) {
1404 #define RVV_TYPE(Name, Id, SingletonId)                                        \
1405   InitBuiltinType(SingletonId, BuiltinType::Id);
1406 #include "clang/Basic/RISCVVTypes.def"
1407   }
1408 
1409   if (Target.getTriple().isWasm() && Target.hasFeature("reference-types")) {
1410 #define WASM_TYPE(Name, Id, SingletonId)                                       \
1411   InitBuiltinType(SingletonId, BuiltinType::Id);
1412 #include "clang/Basic/WebAssemblyReferenceTypes.def"
1413   }
1414 
1415   if (Target.getTriple().isAMDGPU() ||
1416       (AuxTarget && AuxTarget->getTriple().isAMDGPU())) {
1417 #define AMDGPU_TYPE(Name, Id, SingletonId)                                     \
1418   InitBuiltinType(SingletonId, BuiltinType::Id);
1419 #include "clang/Basic/AMDGPUTypes.def"
1420   }
1421 
1422   // Builtin type for __objc_yes and __objc_no
1423   ObjCBuiltinBoolTy = (Target.useSignedCharForObjCBool() ?
1424                        SignedCharTy : BoolTy);
1425 
1426   ObjCConstantStringType = QualType();
1427 
1428   ObjCSuperType = QualType();
1429 
1430   // void * type
1431   if (LangOpts.OpenCLGenericAddressSpace) {
1432     auto Q = VoidTy.getQualifiers();
1433     Q.setAddressSpace(LangAS::opencl_generic);
1434     VoidPtrTy = getPointerType(getCanonicalType(
1435         getQualifiedType(VoidTy.getUnqualifiedType(), Q)));
1436   } else {
1437     VoidPtrTy = getPointerType(VoidTy);
1438   }
1439 
1440   // nullptr type (C++0x 2.14.7)
1441   InitBuiltinType(NullPtrTy,           BuiltinType::NullPtr);
1442 
1443   // half type (OpenCL 6.1.1.1) / ARM NEON __fp16
1444   InitBuiltinType(HalfTy, BuiltinType::Half);
1445 
1446   InitBuiltinType(BFloat16Ty, BuiltinType::BFloat16);
1447 
1448   // Builtin type used to help define __builtin_va_list.
1449   VaListTagDecl = nullptr;
1450 
1451   // MSVC predeclares struct _GUID, and we need it to create MSGuidDecls.
1452   if (LangOpts.MicrosoftExt || LangOpts.Borland) {
1453     MSGuidTagDecl = buildImplicitRecord("_GUID");
1454     getTranslationUnitDecl()->addDecl(MSGuidTagDecl);
1455   }
1456 }
1457 
getDiagnostics() const1458 DiagnosticsEngine &ASTContext::getDiagnostics() const {
1459   return SourceMgr.getDiagnostics();
1460 }
1461 
getDeclAttrs(const Decl * D)1462 AttrVec& ASTContext::getDeclAttrs(const Decl *D) {
1463   AttrVec *&Result = DeclAttrs[D];
1464   if (!Result) {
1465     void *Mem = Allocate(sizeof(AttrVec));
1466     Result = new (Mem) AttrVec;
1467   }
1468 
1469   return *Result;
1470 }
1471 
1472 /// Erase the attributes corresponding to the given declaration.
eraseDeclAttrs(const Decl * D)1473 void ASTContext::eraseDeclAttrs(const Decl *D) {
1474   llvm::DenseMap<const Decl*, AttrVec*>::iterator Pos = DeclAttrs.find(D);
1475   if (Pos != DeclAttrs.end()) {
1476     Pos->second->~AttrVec();
1477     DeclAttrs.erase(Pos);
1478   }
1479 }
1480 
1481 // FIXME: Remove ?
1482 MemberSpecializationInfo *
getInstantiatedFromStaticDataMember(const VarDecl * Var)1483 ASTContext::getInstantiatedFromStaticDataMember(const VarDecl *Var) {
1484   assert(Var->isStaticDataMember() && "Not a static data member");
1485   return getTemplateOrSpecializationInfo(Var)
1486       .dyn_cast<MemberSpecializationInfo *>();
1487 }
1488 
1489 ASTContext::TemplateOrSpecializationInfo
getTemplateOrSpecializationInfo(const VarDecl * Var)1490 ASTContext::getTemplateOrSpecializationInfo(const VarDecl *Var) {
1491   llvm::DenseMap<const VarDecl *, TemplateOrSpecializationInfo>::iterator Pos =
1492       TemplateOrInstantiation.find(Var);
1493   if (Pos == TemplateOrInstantiation.end())
1494     return {};
1495 
1496   return Pos->second;
1497 }
1498 
1499 void
setInstantiatedFromStaticDataMember(VarDecl * Inst,VarDecl * Tmpl,TemplateSpecializationKind TSK,SourceLocation PointOfInstantiation)1500 ASTContext::setInstantiatedFromStaticDataMember(VarDecl *Inst, VarDecl *Tmpl,
1501                                                 TemplateSpecializationKind TSK,
1502                                           SourceLocation PointOfInstantiation) {
1503   assert(Inst->isStaticDataMember() && "Not a static data member");
1504   assert(Tmpl->isStaticDataMember() && "Not a static data member");
1505   setTemplateOrSpecializationInfo(Inst, new (*this) MemberSpecializationInfo(
1506                                             Tmpl, TSK, PointOfInstantiation));
1507 }
1508 
1509 void
setTemplateOrSpecializationInfo(VarDecl * Inst,TemplateOrSpecializationInfo TSI)1510 ASTContext::setTemplateOrSpecializationInfo(VarDecl *Inst,
1511                                             TemplateOrSpecializationInfo TSI) {
1512   assert(!TemplateOrInstantiation[Inst] &&
1513          "Already noted what the variable was instantiated from");
1514   TemplateOrInstantiation[Inst] = TSI;
1515 }
1516 
1517 NamedDecl *
getInstantiatedFromUsingDecl(NamedDecl * UUD)1518 ASTContext::getInstantiatedFromUsingDecl(NamedDecl *UUD) {
1519   return InstantiatedFromUsingDecl.lookup(UUD);
1520 }
1521 
1522 void
setInstantiatedFromUsingDecl(NamedDecl * Inst,NamedDecl * Pattern)1523 ASTContext::setInstantiatedFromUsingDecl(NamedDecl *Inst, NamedDecl *Pattern) {
1524   assert((isa<UsingDecl>(Pattern) ||
1525           isa<UnresolvedUsingValueDecl>(Pattern) ||
1526           isa<UnresolvedUsingTypenameDecl>(Pattern)) &&
1527          "pattern decl is not a using decl");
1528   assert((isa<UsingDecl>(Inst) ||
1529           isa<UnresolvedUsingValueDecl>(Inst) ||
1530           isa<UnresolvedUsingTypenameDecl>(Inst)) &&
1531          "instantiation did not produce a using decl");
1532   assert(!InstantiatedFromUsingDecl[Inst] && "pattern already exists");
1533   InstantiatedFromUsingDecl[Inst] = Pattern;
1534 }
1535 
1536 UsingEnumDecl *
getInstantiatedFromUsingEnumDecl(UsingEnumDecl * UUD)1537 ASTContext::getInstantiatedFromUsingEnumDecl(UsingEnumDecl *UUD) {
1538   return InstantiatedFromUsingEnumDecl.lookup(UUD);
1539 }
1540 
setInstantiatedFromUsingEnumDecl(UsingEnumDecl * Inst,UsingEnumDecl * Pattern)1541 void ASTContext::setInstantiatedFromUsingEnumDecl(UsingEnumDecl *Inst,
1542                                                   UsingEnumDecl *Pattern) {
1543   assert(!InstantiatedFromUsingEnumDecl[Inst] && "pattern already exists");
1544   InstantiatedFromUsingEnumDecl[Inst] = Pattern;
1545 }
1546 
1547 UsingShadowDecl *
getInstantiatedFromUsingShadowDecl(UsingShadowDecl * Inst)1548 ASTContext::getInstantiatedFromUsingShadowDecl(UsingShadowDecl *Inst) {
1549   return InstantiatedFromUsingShadowDecl.lookup(Inst);
1550 }
1551 
1552 void
setInstantiatedFromUsingShadowDecl(UsingShadowDecl * Inst,UsingShadowDecl * Pattern)1553 ASTContext::setInstantiatedFromUsingShadowDecl(UsingShadowDecl *Inst,
1554                                                UsingShadowDecl *Pattern) {
1555   assert(!InstantiatedFromUsingShadowDecl[Inst] && "pattern already exists");
1556   InstantiatedFromUsingShadowDecl[Inst] = Pattern;
1557 }
1558 
getInstantiatedFromUnnamedFieldDecl(FieldDecl * Field)1559 FieldDecl *ASTContext::getInstantiatedFromUnnamedFieldDecl(FieldDecl *Field) {
1560   return InstantiatedFromUnnamedFieldDecl.lookup(Field);
1561 }
1562 
setInstantiatedFromUnnamedFieldDecl(FieldDecl * Inst,FieldDecl * Tmpl)1563 void ASTContext::setInstantiatedFromUnnamedFieldDecl(FieldDecl *Inst,
1564                                                      FieldDecl *Tmpl) {
1565   assert(!Inst->getDeclName() && "Instantiated field decl is not unnamed");
1566   assert(!Tmpl->getDeclName() && "Template field decl is not unnamed");
1567   assert(!InstantiatedFromUnnamedFieldDecl[Inst] &&
1568          "Already noted what unnamed field was instantiated from");
1569 
1570   InstantiatedFromUnnamedFieldDecl[Inst] = Tmpl;
1571 }
1572 
1573 ASTContext::overridden_cxx_method_iterator
overridden_methods_begin(const CXXMethodDecl * Method) const1574 ASTContext::overridden_methods_begin(const CXXMethodDecl *Method) const {
1575   return overridden_methods(Method).begin();
1576 }
1577 
1578 ASTContext::overridden_cxx_method_iterator
overridden_methods_end(const CXXMethodDecl * Method) const1579 ASTContext::overridden_methods_end(const CXXMethodDecl *Method) const {
1580   return overridden_methods(Method).end();
1581 }
1582 
1583 unsigned
overridden_methods_size(const CXXMethodDecl * Method) const1584 ASTContext::overridden_methods_size(const CXXMethodDecl *Method) const {
1585   auto Range = overridden_methods(Method);
1586   return Range.end() - Range.begin();
1587 }
1588 
1589 ASTContext::overridden_method_range
overridden_methods(const CXXMethodDecl * Method) const1590 ASTContext::overridden_methods(const CXXMethodDecl *Method) const {
1591   llvm::DenseMap<const CXXMethodDecl *, CXXMethodVector>::const_iterator Pos =
1592       OverriddenMethods.find(Method->getCanonicalDecl());
1593   if (Pos == OverriddenMethods.end())
1594     return overridden_method_range(nullptr, nullptr);
1595   return overridden_method_range(Pos->second.begin(), Pos->second.end());
1596 }
1597 
addOverriddenMethod(const CXXMethodDecl * Method,const CXXMethodDecl * Overridden)1598 void ASTContext::addOverriddenMethod(const CXXMethodDecl *Method,
1599                                      const CXXMethodDecl *Overridden) {
1600   assert(Method->isCanonicalDecl() && Overridden->isCanonicalDecl());
1601   OverriddenMethods[Method].push_back(Overridden);
1602 }
1603 
getOverriddenMethods(const NamedDecl * D,SmallVectorImpl<const NamedDecl * > & Overridden) const1604 void ASTContext::getOverriddenMethods(
1605                       const NamedDecl *D,
1606                       SmallVectorImpl<const NamedDecl *> &Overridden) const {
1607   assert(D);
1608 
1609   if (const auto *CXXMethod = dyn_cast<CXXMethodDecl>(D)) {
1610     Overridden.append(overridden_methods_begin(CXXMethod),
1611                       overridden_methods_end(CXXMethod));
1612     return;
1613   }
1614 
1615   const auto *Method = dyn_cast<ObjCMethodDecl>(D);
1616   if (!Method)
1617     return;
1618 
1619   SmallVector<const ObjCMethodDecl *, 8> OverDecls;
1620   Method->getOverriddenMethods(OverDecls);
1621   Overridden.append(OverDecls.begin(), OverDecls.end());
1622 }
1623 
addedLocalImportDecl(ImportDecl * Import)1624 void ASTContext::addedLocalImportDecl(ImportDecl *Import) {
1625   assert(!Import->getNextLocalImport() &&
1626          "Import declaration already in the chain");
1627   assert(!Import->isFromASTFile() && "Non-local import declaration");
1628   if (!FirstLocalImport) {
1629     FirstLocalImport = Import;
1630     LastLocalImport = Import;
1631     return;
1632   }
1633 
1634   LastLocalImport->setNextLocalImport(Import);
1635   LastLocalImport = Import;
1636 }
1637 
1638 //===----------------------------------------------------------------------===//
1639 //                         Type Sizing and Analysis
1640 //===----------------------------------------------------------------------===//
1641 
1642 /// getFloatTypeSemantics - Return the APFloat 'semantics' for the specified
1643 /// scalar floating point type.
getFloatTypeSemantics(QualType T) const1644 const llvm::fltSemantics &ASTContext::getFloatTypeSemantics(QualType T) const {
1645   switch (T->castAs<BuiltinType>()->getKind()) {
1646   default:
1647     llvm_unreachable("Not a floating point type!");
1648   case BuiltinType::BFloat16:
1649     return Target->getBFloat16Format();
1650   case BuiltinType::Float16:
1651     return Target->getHalfFormat();
1652   case BuiltinType::Half:
1653     return Target->getHalfFormat();
1654   case BuiltinType::Float:      return Target->getFloatFormat();
1655   case BuiltinType::Double:     return Target->getDoubleFormat();
1656   case BuiltinType::Ibm128:
1657     return Target->getIbm128Format();
1658   case BuiltinType::LongDouble:
1659     if (getLangOpts().OpenMP && getLangOpts().OpenMPIsTargetDevice)
1660       return AuxTarget->getLongDoubleFormat();
1661     return Target->getLongDoubleFormat();
1662   case BuiltinType::Float128:
1663     if (getLangOpts().OpenMP && getLangOpts().OpenMPIsTargetDevice)
1664       return AuxTarget->getFloat128Format();
1665     return Target->getFloat128Format();
1666   }
1667 }
1668 
getDeclAlign(const Decl * D,bool ForAlignof) const1669 CharUnits ASTContext::getDeclAlign(const Decl *D, bool ForAlignof) const {
1670   unsigned Align = Target->getCharWidth();
1671 
1672   const unsigned AlignFromAttr = D->getMaxAlignment();
1673   if (AlignFromAttr)
1674     Align = AlignFromAttr;
1675 
1676   // __attribute__((aligned)) can increase or decrease alignment
1677   // *except* on a struct or struct member, where it only increases
1678   // alignment unless 'packed' is also specified.
1679   //
1680   // It is an error for alignas to decrease alignment, so we can
1681   // ignore that possibility;  Sema should diagnose it.
1682   bool UseAlignAttrOnly;
1683   if (const FieldDecl *FD = dyn_cast<FieldDecl>(D))
1684     UseAlignAttrOnly =
1685         FD->hasAttr<PackedAttr>() || FD->getParent()->hasAttr<PackedAttr>();
1686   else
1687     UseAlignAttrOnly = AlignFromAttr != 0;
1688   // If we're using the align attribute only, just ignore everything
1689   // else about the declaration and its type.
1690   if (UseAlignAttrOnly) {
1691     // do nothing
1692   } else if (const auto *VD = dyn_cast<ValueDecl>(D)) {
1693     QualType T = VD->getType();
1694     if (const auto *RT = T->getAs<ReferenceType>()) {
1695       if (ForAlignof)
1696         T = RT->getPointeeType();
1697       else
1698         T = getPointerType(RT->getPointeeType());
1699     }
1700     QualType BaseT = getBaseElementType(T);
1701     if (T->isFunctionType())
1702       Align = getTypeInfoImpl(T.getTypePtr()).Align;
1703     else if (!BaseT->isIncompleteType()) {
1704       // Adjust alignments of declarations with array type by the
1705       // large-array alignment on the target.
1706       if (const ArrayType *arrayType = getAsArrayType(T)) {
1707         unsigned MinWidth = Target->getLargeArrayMinWidth();
1708         if (!ForAlignof && MinWidth) {
1709           if (isa<VariableArrayType>(arrayType))
1710             Align = std::max(Align, Target->getLargeArrayAlign());
1711           else if (isa<ConstantArrayType>(arrayType) &&
1712                    MinWidth <= getTypeSize(cast<ConstantArrayType>(arrayType)))
1713             Align = std::max(Align, Target->getLargeArrayAlign());
1714         }
1715       }
1716       Align = std::max(Align, getPreferredTypeAlign(T.getTypePtr()));
1717       if (BaseT.getQualifiers().hasUnaligned())
1718         Align = Target->getCharWidth();
1719     }
1720 
1721     // Ensure miminum alignment for global variables.
1722     if (const auto *VD = dyn_cast<VarDecl>(D))
1723       if (VD->hasGlobalStorage() && !ForAlignof) {
1724         uint64_t TypeSize =
1725             !BaseT->isIncompleteType() ? getTypeSize(T.getTypePtr()) : 0;
1726         Align = std::max(Align, getMinGlobalAlignOfVar(TypeSize, VD));
1727       }
1728 
1729     // Fields can be subject to extra alignment constraints, like if
1730     // the field is packed, the struct is packed, or the struct has a
1731     // a max-field-alignment constraint (#pragma pack).  So calculate
1732     // the actual alignment of the field within the struct, and then
1733     // (as we're expected to) constrain that by the alignment of the type.
1734     if (const auto *Field = dyn_cast<FieldDecl>(VD)) {
1735       const RecordDecl *Parent = Field->getParent();
1736       // We can only produce a sensible answer if the record is valid.
1737       if (!Parent->isInvalidDecl()) {
1738         const ASTRecordLayout &Layout = getASTRecordLayout(Parent);
1739 
1740         // Start with the record's overall alignment.
1741         unsigned FieldAlign = toBits(Layout.getAlignment());
1742 
1743         // Use the GCD of that and the offset within the record.
1744         uint64_t Offset = Layout.getFieldOffset(Field->getFieldIndex());
1745         if (Offset > 0) {
1746           // Alignment is always a power of 2, so the GCD will be a power of 2,
1747           // which means we get to do this crazy thing instead of Euclid's.
1748           uint64_t LowBitOfOffset = Offset & (~Offset + 1);
1749           if (LowBitOfOffset < FieldAlign)
1750             FieldAlign = static_cast<unsigned>(LowBitOfOffset);
1751         }
1752 
1753         Align = std::min(Align, FieldAlign);
1754       }
1755     }
1756   }
1757 
1758   // Some targets have hard limitation on the maximum requestable alignment in
1759   // aligned attribute for static variables.
1760   const unsigned MaxAlignedAttr = getTargetInfo().getMaxAlignedAttribute();
1761   const auto *VD = dyn_cast<VarDecl>(D);
1762   if (MaxAlignedAttr && VD && VD->getStorageClass() == SC_Static)
1763     Align = std::min(Align, MaxAlignedAttr);
1764 
1765   return toCharUnitsFromBits(Align);
1766 }
1767 
getExnObjectAlignment() const1768 CharUnits ASTContext::getExnObjectAlignment() const {
1769   return toCharUnitsFromBits(Target->getExnObjectAlignment());
1770 }
1771 
1772 // getTypeInfoDataSizeInChars - Return the size of a type, in
1773 // chars. If the type is a record, its data size is returned.  This is
1774 // the size of the memcpy that's performed when assigning this type
1775 // using a trivial copy/move assignment operator.
getTypeInfoDataSizeInChars(QualType T) const1776 TypeInfoChars ASTContext::getTypeInfoDataSizeInChars(QualType T) const {
1777   TypeInfoChars Info = getTypeInfoInChars(T);
1778 
1779   // In C++, objects can sometimes be allocated into the tail padding
1780   // of a base-class subobject.  We decide whether that's possible
1781   // during class layout, so here we can just trust the layout results.
1782   if (getLangOpts().CPlusPlus) {
1783     if (const auto *RT = T->getAs<RecordType>();
1784         RT && !RT->getDecl()->isInvalidDecl()) {
1785       const ASTRecordLayout &layout = getASTRecordLayout(RT->getDecl());
1786       Info.Width = layout.getDataSize();
1787     }
1788   }
1789 
1790   return Info;
1791 }
1792 
1793 /// getConstantArrayInfoInChars - Performing the computation in CharUnits
1794 /// instead of in bits prevents overflowing the uint64_t for some large arrays.
1795 TypeInfoChars
getConstantArrayInfoInChars(const ASTContext & Context,const ConstantArrayType * CAT)1796 static getConstantArrayInfoInChars(const ASTContext &Context,
1797                                    const ConstantArrayType *CAT) {
1798   TypeInfoChars EltInfo = Context.getTypeInfoInChars(CAT->getElementType());
1799   uint64_t Size = CAT->getZExtSize();
1800   assert((Size == 0 || static_cast<uint64_t>(EltInfo.Width.getQuantity()) <=
1801               (uint64_t)(-1)/Size) &&
1802          "Overflow in array type char size evaluation");
1803   uint64_t Width = EltInfo.Width.getQuantity() * Size;
1804   unsigned Align = EltInfo.Align.getQuantity();
1805   if (!Context.getTargetInfo().getCXXABI().isMicrosoft() ||
1806       Context.getTargetInfo().getPointerWidth(LangAS::Default) == 64)
1807     Width = llvm::alignTo(Width, Align);
1808   return TypeInfoChars(CharUnits::fromQuantity(Width),
1809                        CharUnits::fromQuantity(Align),
1810                        EltInfo.AlignRequirement);
1811 }
1812 
getTypeInfoInChars(const Type * T) const1813 TypeInfoChars ASTContext::getTypeInfoInChars(const Type *T) const {
1814   if (const auto *CAT = dyn_cast<ConstantArrayType>(T))
1815     return getConstantArrayInfoInChars(*this, CAT);
1816   TypeInfo Info = getTypeInfo(T);
1817   return TypeInfoChars(toCharUnitsFromBits(Info.Width),
1818                        toCharUnitsFromBits(Info.Align), Info.AlignRequirement);
1819 }
1820 
getTypeInfoInChars(QualType T) const1821 TypeInfoChars ASTContext::getTypeInfoInChars(QualType T) const {
1822   return getTypeInfoInChars(T.getTypePtr());
1823 }
1824 
isPromotableIntegerType(QualType T) const1825 bool ASTContext::isPromotableIntegerType(QualType T) const {
1826   // HLSL doesn't promote all small integer types to int, it
1827   // just uses the rank-based promotion rules for all types.
1828   if (getLangOpts().HLSL)
1829     return false;
1830 
1831   if (const auto *BT = T->getAs<BuiltinType>())
1832     switch (BT->getKind()) {
1833     case BuiltinType::Bool:
1834     case BuiltinType::Char_S:
1835     case BuiltinType::Char_U:
1836     case BuiltinType::SChar:
1837     case BuiltinType::UChar:
1838     case BuiltinType::Short:
1839     case BuiltinType::UShort:
1840     case BuiltinType::WChar_S:
1841     case BuiltinType::WChar_U:
1842     case BuiltinType::Char8:
1843     case BuiltinType::Char16:
1844     case BuiltinType::Char32:
1845       return true;
1846     default:
1847       return false;
1848     }
1849 
1850   // Enumerated types are promotable to their compatible integer types
1851   // (C99 6.3.1.1) a.k.a. its underlying type (C++ [conv.prom]p2).
1852   if (const auto *ET = T->getAs<EnumType>()) {
1853     if (T->isDependentType() || ET->getDecl()->getPromotionType().isNull() ||
1854         ET->getDecl()->isScoped())
1855       return false;
1856 
1857     return true;
1858   }
1859 
1860   return false;
1861 }
1862 
isAlignmentRequired(const Type * T) const1863 bool ASTContext::isAlignmentRequired(const Type *T) const {
1864   return getTypeInfo(T).AlignRequirement != AlignRequirementKind::None;
1865 }
1866 
isAlignmentRequired(QualType T) const1867 bool ASTContext::isAlignmentRequired(QualType T) const {
1868   return isAlignmentRequired(T.getTypePtr());
1869 }
1870 
getTypeAlignIfKnown(QualType T,bool NeedsPreferredAlignment) const1871 unsigned ASTContext::getTypeAlignIfKnown(QualType T,
1872                                          bool NeedsPreferredAlignment) const {
1873   // An alignment on a typedef overrides anything else.
1874   if (const auto *TT = T->getAs<TypedefType>())
1875     if (unsigned Align = TT->getDecl()->getMaxAlignment())
1876       return Align;
1877 
1878   // If we have an (array of) complete type, we're done.
1879   T = getBaseElementType(T);
1880   if (!T->isIncompleteType())
1881     return NeedsPreferredAlignment ? getPreferredTypeAlign(T) : getTypeAlign(T);
1882 
1883   // If we had an array type, its element type might be a typedef
1884   // type with an alignment attribute.
1885   if (const auto *TT = T->getAs<TypedefType>())
1886     if (unsigned Align = TT->getDecl()->getMaxAlignment())
1887       return Align;
1888 
1889   // Otherwise, see if the declaration of the type had an attribute.
1890   if (const auto *TT = T->getAs<TagType>())
1891     return TT->getDecl()->getMaxAlignment();
1892 
1893   return 0;
1894 }
1895 
getTypeInfo(const Type * T) const1896 TypeInfo ASTContext::getTypeInfo(const Type *T) const {
1897   TypeInfoMap::iterator I = MemoizedTypeInfo.find(T);
1898   if (I != MemoizedTypeInfo.end())
1899     return I->second;
1900 
1901   // This call can invalidate MemoizedTypeInfo[T], so we need a second lookup.
1902   TypeInfo TI = getTypeInfoImpl(T);
1903   MemoizedTypeInfo[T] = TI;
1904   return TI;
1905 }
1906 
1907 /// getTypeInfoImpl - Return the size of the specified type, in bits.  This
1908 /// method does not work on incomplete types.
1909 ///
1910 /// FIXME: Pointers into different addr spaces could have different sizes and
1911 /// alignment requirements: getPointerInfo should take an AddrSpace, this
1912 /// should take a QualType, &c.
getTypeInfoImpl(const Type * T) const1913 TypeInfo ASTContext::getTypeInfoImpl(const Type *T) const {
1914   uint64_t Width = 0;
1915   unsigned Align = 8;
1916   AlignRequirementKind AlignRequirement = AlignRequirementKind::None;
1917   LangAS AS = LangAS::Default;
1918   switch (T->getTypeClass()) {
1919 #define TYPE(Class, Base)
1920 #define ABSTRACT_TYPE(Class, Base)
1921 #define NON_CANONICAL_TYPE(Class, Base)
1922 #define DEPENDENT_TYPE(Class, Base) case Type::Class:
1923 #define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base)                       \
1924   case Type::Class:                                                            \
1925   assert(!T->isDependentType() && "should not see dependent types here");      \
1926   return getTypeInfo(cast<Class##Type>(T)->desugar().getTypePtr());
1927 #include "clang/AST/TypeNodes.inc"
1928     llvm_unreachable("Should not see dependent types");
1929 
1930   case Type::FunctionNoProto:
1931   case Type::FunctionProto:
1932     // GCC extension: alignof(function) = 32 bits
1933     Width = 0;
1934     Align = 32;
1935     break;
1936 
1937   case Type::IncompleteArray:
1938   case Type::VariableArray:
1939   case Type::ConstantArray:
1940   case Type::ArrayParameter: {
1941     // Model non-constant sized arrays as size zero, but track the alignment.
1942     uint64_t Size = 0;
1943     if (const auto *CAT = dyn_cast<ConstantArrayType>(T))
1944       Size = CAT->getZExtSize();
1945 
1946     TypeInfo EltInfo = getTypeInfo(cast<ArrayType>(T)->getElementType());
1947     assert((Size == 0 || EltInfo.Width <= (uint64_t)(-1) / Size) &&
1948            "Overflow in array type bit size evaluation");
1949     Width = EltInfo.Width * Size;
1950     Align = EltInfo.Align;
1951     AlignRequirement = EltInfo.AlignRequirement;
1952     if (!getTargetInfo().getCXXABI().isMicrosoft() ||
1953         getTargetInfo().getPointerWidth(LangAS::Default) == 64)
1954       Width = llvm::alignTo(Width, Align);
1955     break;
1956   }
1957 
1958   case Type::ExtVector:
1959   case Type::Vector: {
1960     const auto *VT = cast<VectorType>(T);
1961     TypeInfo EltInfo = getTypeInfo(VT->getElementType());
1962     Width = VT->isExtVectorBoolType() ? VT->getNumElements()
1963                                       : EltInfo.Width * VT->getNumElements();
1964     // Enforce at least byte size and alignment.
1965     Width = std::max<unsigned>(8, Width);
1966     Align = std::max<unsigned>(8, Width);
1967 
1968     // If the alignment is not a power of 2, round up to the next power of 2.
1969     // This happens for non-power-of-2 length vectors.
1970     if (Align & (Align-1)) {
1971       Align = llvm::bit_ceil(Align);
1972       Width = llvm::alignTo(Width, Align);
1973     }
1974     // Adjust the alignment based on the target max.
1975     uint64_t TargetVectorAlign = Target->getMaxVectorAlign();
1976     if (TargetVectorAlign && TargetVectorAlign < Align)
1977       Align = TargetVectorAlign;
1978     if (VT->getVectorKind() == VectorKind::SveFixedLengthData)
1979       // Adjust the alignment for fixed-length SVE vectors. This is important
1980       // for non-power-of-2 vector lengths.
1981       Align = 128;
1982     else if (VT->getVectorKind() == VectorKind::SveFixedLengthPredicate)
1983       // Adjust the alignment for fixed-length SVE predicates.
1984       Align = 16;
1985     else if (VT->getVectorKind() == VectorKind::RVVFixedLengthData ||
1986              VT->getVectorKind() == VectorKind::RVVFixedLengthMask)
1987       // Adjust the alignment for fixed-length RVV vectors.
1988       Align = std::min<unsigned>(64, Width);
1989     break;
1990   }
1991 
1992   case Type::ConstantMatrix: {
1993     const auto *MT = cast<ConstantMatrixType>(T);
1994     TypeInfo ElementInfo = getTypeInfo(MT->getElementType());
1995     // The internal layout of a matrix value is implementation defined.
1996     // Initially be ABI compatible with arrays with respect to alignment and
1997     // size.
1998     Width = ElementInfo.Width * MT->getNumRows() * MT->getNumColumns();
1999     Align = ElementInfo.Align;
2000     break;
2001   }
2002 
2003   case Type::Builtin:
2004     switch (cast<BuiltinType>(T)->getKind()) {
2005     default: llvm_unreachable("Unknown builtin type!");
2006     case BuiltinType::Void:
2007       // GCC extension: alignof(void) = 8 bits.
2008       Width = 0;
2009       Align = 8;
2010       break;
2011     case BuiltinType::Bool:
2012       Width = Target->getBoolWidth();
2013       Align = Target->getBoolAlign();
2014       break;
2015     case BuiltinType::Char_S:
2016     case BuiltinType::Char_U:
2017     case BuiltinType::UChar:
2018     case BuiltinType::SChar:
2019     case BuiltinType::Char8:
2020       Width = Target->getCharWidth();
2021       Align = Target->getCharAlign();
2022       break;
2023     case BuiltinType::WChar_S:
2024     case BuiltinType::WChar_U:
2025       Width = Target->getWCharWidth();
2026       Align = Target->getWCharAlign();
2027       break;
2028     case BuiltinType::Char16:
2029       Width = Target->getChar16Width();
2030       Align = Target->getChar16Align();
2031       break;
2032     case BuiltinType::Char32:
2033       Width = Target->getChar32Width();
2034       Align = Target->getChar32Align();
2035       break;
2036     case BuiltinType::UShort:
2037     case BuiltinType::Short:
2038       Width = Target->getShortWidth();
2039       Align = Target->getShortAlign();
2040       break;
2041     case BuiltinType::UInt:
2042     case BuiltinType::Int:
2043       Width = Target->getIntWidth();
2044       Align = Target->getIntAlign();
2045       break;
2046     case BuiltinType::ULong:
2047     case BuiltinType::Long:
2048       Width = Target->getLongWidth();
2049       Align = Target->getLongAlign();
2050       break;
2051     case BuiltinType::ULongLong:
2052     case BuiltinType::LongLong:
2053       Width = Target->getLongLongWidth();
2054       Align = Target->getLongLongAlign();
2055       break;
2056     case BuiltinType::Int128:
2057     case BuiltinType::UInt128:
2058       Width = 128;
2059       Align = Target->getInt128Align();
2060       break;
2061     case BuiltinType::ShortAccum:
2062     case BuiltinType::UShortAccum:
2063     case BuiltinType::SatShortAccum:
2064     case BuiltinType::SatUShortAccum:
2065       Width = Target->getShortAccumWidth();
2066       Align = Target->getShortAccumAlign();
2067       break;
2068     case BuiltinType::Accum:
2069     case BuiltinType::UAccum:
2070     case BuiltinType::SatAccum:
2071     case BuiltinType::SatUAccum:
2072       Width = Target->getAccumWidth();
2073       Align = Target->getAccumAlign();
2074       break;
2075     case BuiltinType::LongAccum:
2076     case BuiltinType::ULongAccum:
2077     case BuiltinType::SatLongAccum:
2078     case BuiltinType::SatULongAccum:
2079       Width = Target->getLongAccumWidth();
2080       Align = Target->getLongAccumAlign();
2081       break;
2082     case BuiltinType::ShortFract:
2083     case BuiltinType::UShortFract:
2084     case BuiltinType::SatShortFract:
2085     case BuiltinType::SatUShortFract:
2086       Width = Target->getShortFractWidth();
2087       Align = Target->getShortFractAlign();
2088       break;
2089     case BuiltinType::Fract:
2090     case BuiltinType::UFract:
2091     case BuiltinType::SatFract:
2092     case BuiltinType::SatUFract:
2093       Width = Target->getFractWidth();
2094       Align = Target->getFractAlign();
2095       break;
2096     case BuiltinType::LongFract:
2097     case BuiltinType::ULongFract:
2098     case BuiltinType::SatLongFract:
2099     case BuiltinType::SatULongFract:
2100       Width = Target->getLongFractWidth();
2101       Align = Target->getLongFractAlign();
2102       break;
2103     case BuiltinType::BFloat16:
2104       if (Target->hasBFloat16Type()) {
2105         Width = Target->getBFloat16Width();
2106         Align = Target->getBFloat16Align();
2107       } else if ((getLangOpts().SYCLIsDevice ||
2108                   (getLangOpts().OpenMP &&
2109                    getLangOpts().OpenMPIsTargetDevice)) &&
2110                  AuxTarget->hasBFloat16Type()) {
2111         Width = AuxTarget->getBFloat16Width();
2112         Align = AuxTarget->getBFloat16Align();
2113       }
2114       break;
2115     case BuiltinType::Float16:
2116     case BuiltinType::Half:
2117       if (Target->hasFloat16Type() || !getLangOpts().OpenMP ||
2118           !getLangOpts().OpenMPIsTargetDevice) {
2119         Width = Target->getHalfWidth();
2120         Align = Target->getHalfAlign();
2121       } else {
2122         assert(getLangOpts().OpenMP && getLangOpts().OpenMPIsTargetDevice &&
2123                "Expected OpenMP device compilation.");
2124         Width = AuxTarget->getHalfWidth();
2125         Align = AuxTarget->getHalfAlign();
2126       }
2127       break;
2128     case BuiltinType::Float:
2129       Width = Target->getFloatWidth();
2130       Align = Target->getFloatAlign();
2131       break;
2132     case BuiltinType::Double:
2133       Width = Target->getDoubleWidth();
2134       Align = Target->getDoubleAlign();
2135       break;
2136     case BuiltinType::Ibm128:
2137       Width = Target->getIbm128Width();
2138       Align = Target->getIbm128Align();
2139       break;
2140     case BuiltinType::LongDouble:
2141       if (getLangOpts().OpenMP && getLangOpts().OpenMPIsTargetDevice &&
2142           (Target->getLongDoubleWidth() != AuxTarget->getLongDoubleWidth() ||
2143            Target->getLongDoubleAlign() != AuxTarget->getLongDoubleAlign())) {
2144         Width = AuxTarget->getLongDoubleWidth();
2145         Align = AuxTarget->getLongDoubleAlign();
2146       } else {
2147         Width = Target->getLongDoubleWidth();
2148         Align = Target->getLongDoubleAlign();
2149       }
2150       break;
2151     case BuiltinType::Float128:
2152       if (Target->hasFloat128Type() || !getLangOpts().OpenMP ||
2153           !getLangOpts().OpenMPIsTargetDevice) {
2154         Width = Target->getFloat128Width();
2155         Align = Target->getFloat128Align();
2156       } else {
2157         assert(getLangOpts().OpenMP && getLangOpts().OpenMPIsTargetDevice &&
2158                "Expected OpenMP device compilation.");
2159         Width = AuxTarget->getFloat128Width();
2160         Align = AuxTarget->getFloat128Align();
2161       }
2162       break;
2163     case BuiltinType::NullPtr:
2164       // C++ 3.9.1p11: sizeof(nullptr_t) == sizeof(void*)
2165       Width = Target->getPointerWidth(LangAS::Default);
2166       Align = Target->getPointerAlign(LangAS::Default);
2167       break;
2168     case BuiltinType::ObjCId:
2169     case BuiltinType::ObjCClass:
2170     case BuiltinType::ObjCSel:
2171       Width = Target->getPointerWidth(LangAS::Default);
2172       Align = Target->getPointerAlign(LangAS::Default);
2173       break;
2174     case BuiltinType::OCLSampler:
2175     case BuiltinType::OCLEvent:
2176     case BuiltinType::OCLClkEvent:
2177     case BuiltinType::OCLQueue:
2178     case BuiltinType::OCLReserveID:
2179 #define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
2180     case BuiltinType::Id:
2181 #include "clang/Basic/OpenCLImageTypes.def"
2182 #define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
2183   case BuiltinType::Id:
2184 #include "clang/Basic/OpenCLExtensionTypes.def"
2185       AS = Target->getOpenCLTypeAddrSpace(getOpenCLTypeKind(T));
2186       Width = Target->getPointerWidth(AS);
2187       Align = Target->getPointerAlign(AS);
2188       break;
2189     // The SVE types are effectively target-specific.  The length of an
2190     // SVE_VECTOR_TYPE is only known at runtime, but it is always a multiple
2191     // of 128 bits.  There is one predicate bit for each vector byte, so the
2192     // length of an SVE_PREDICATE_TYPE is always a multiple of 16 bits.
2193     //
2194     // Because the length is only known at runtime, we use a dummy value
2195     // of 0 for the static length.  The alignment values are those defined
2196     // by the Procedure Call Standard for the Arm Architecture.
2197 #define SVE_VECTOR_TYPE(Name, MangledName, Id, SingletonId, NumEls, ElBits,    \
2198                         IsSigned, IsFP, IsBF)                                  \
2199   case BuiltinType::Id:                                                        \
2200     Width = 0;                                                                 \
2201     Align = 128;                                                               \
2202     break;
2203 #define SVE_PREDICATE_TYPE(Name, MangledName, Id, SingletonId, NumEls)         \
2204   case BuiltinType::Id:                                                        \
2205     Width = 0;                                                                 \
2206     Align = 16;                                                                \
2207     break;
2208 #define SVE_OPAQUE_TYPE(Name, MangledName, Id, SingletonId)                    \
2209   case BuiltinType::Id:                                                        \
2210     Width = 0;                                                                 \
2211     Align = 16;                                                                \
2212     break;
2213 #include "clang/Basic/AArch64SVEACLETypes.def"
2214 #define PPC_VECTOR_TYPE(Name, Id, Size)                                        \
2215   case BuiltinType::Id:                                                        \
2216     Width = Size;                                                              \
2217     Align = Size;                                                              \
2218     break;
2219 #include "clang/Basic/PPCTypes.def"
2220 #define RVV_VECTOR_TYPE(Name, Id, SingletonId, ElKind, ElBits, NF, IsSigned,   \
2221                         IsFP, IsBF)                                            \
2222   case BuiltinType::Id:                                                        \
2223     Width = 0;                                                                 \
2224     Align = ElBits;                                                            \
2225     break;
2226 #define RVV_PREDICATE_TYPE(Name, Id, SingletonId, ElKind)                      \
2227   case BuiltinType::Id:                                                        \
2228     Width = 0;                                                                 \
2229     Align = 8;                                                                 \
2230     break;
2231 #include "clang/Basic/RISCVVTypes.def"
2232 #define WASM_TYPE(Name, Id, SingletonId)                                       \
2233   case BuiltinType::Id:                                                        \
2234     Width = 0;                                                                 \
2235     Align = 8;                                                                 \
2236     break;
2237 #include "clang/Basic/WebAssemblyReferenceTypes.def"
2238 #define AMDGPU_OPAQUE_PTR_TYPE(NAME, MANGLEDNAME, AS, WIDTH, ALIGN, ID,        \
2239                                SINGLETONID)                                    \
2240   case BuiltinType::ID:                                                        \
2241     Width = WIDTH;                                                             \
2242     Align = ALIGN;                                                             \
2243     break;
2244 #include "clang/Basic/AMDGPUTypes.def"
2245     }
2246     break;
2247   case Type::ObjCObjectPointer:
2248     Width = Target->getPointerWidth(LangAS::Default);
2249     Align = Target->getPointerAlign(LangAS::Default);
2250     break;
2251   case Type::BlockPointer:
2252     AS = cast<BlockPointerType>(T)->getPointeeType().getAddressSpace();
2253     Width = Target->getPointerWidth(AS);
2254     Align = Target->getPointerAlign(AS);
2255     break;
2256   case Type::LValueReference:
2257   case Type::RValueReference:
2258     // alignof and sizeof should never enter this code path here, so we go
2259     // the pointer route.
2260     AS = cast<ReferenceType>(T)->getPointeeType().getAddressSpace();
2261     Width = Target->getPointerWidth(AS);
2262     Align = Target->getPointerAlign(AS);
2263     break;
2264   case Type::Pointer:
2265     AS = cast<PointerType>(T)->getPointeeType().getAddressSpace();
2266     Width = Target->getPointerWidth(AS);
2267     Align = Target->getPointerAlign(AS);
2268     break;
2269   case Type::MemberPointer: {
2270     const auto *MPT = cast<MemberPointerType>(T);
2271     CXXABI::MemberPointerInfo MPI = ABI->getMemberPointerInfo(MPT);
2272     Width = MPI.Width;
2273     Align = MPI.Align;
2274     break;
2275   }
2276   case Type::Complex: {
2277     // Complex types have the same alignment as their elements, but twice the
2278     // size.
2279     TypeInfo EltInfo = getTypeInfo(cast<ComplexType>(T)->getElementType());
2280     Width = EltInfo.Width * 2;
2281     Align = EltInfo.Align;
2282     break;
2283   }
2284   case Type::ObjCObject:
2285     return getTypeInfo(cast<ObjCObjectType>(T)->getBaseType().getTypePtr());
2286   case Type::Adjusted:
2287   case Type::Decayed:
2288     return getTypeInfo(cast<AdjustedType>(T)->getAdjustedType().getTypePtr());
2289   case Type::ObjCInterface: {
2290     const auto *ObjCI = cast<ObjCInterfaceType>(T);
2291     if (ObjCI->getDecl()->isInvalidDecl()) {
2292       Width = 8;
2293       Align = 8;
2294       break;
2295     }
2296     const ASTRecordLayout &Layout = getASTObjCInterfaceLayout(ObjCI->getDecl());
2297     Width = toBits(Layout.getSize());
2298     Align = toBits(Layout.getAlignment());
2299     break;
2300   }
2301   case Type::BitInt: {
2302     const auto *EIT = cast<BitIntType>(T);
2303     Align = Target->getBitIntAlign(EIT->getNumBits());
2304     Width = Target->getBitIntWidth(EIT->getNumBits());
2305     break;
2306   }
2307   case Type::Record:
2308   case Type::Enum: {
2309     const auto *TT = cast<TagType>(T);
2310 
2311     if (TT->getDecl()->isInvalidDecl()) {
2312       Width = 8;
2313       Align = 8;
2314       break;
2315     }
2316 
2317     if (const auto *ET = dyn_cast<EnumType>(TT)) {
2318       const EnumDecl *ED = ET->getDecl();
2319       TypeInfo Info =
2320           getTypeInfo(ED->getIntegerType()->getUnqualifiedDesugaredType());
2321       if (unsigned AttrAlign = ED->getMaxAlignment()) {
2322         Info.Align = AttrAlign;
2323         Info.AlignRequirement = AlignRequirementKind::RequiredByEnum;
2324       }
2325       return Info;
2326     }
2327 
2328     const auto *RT = cast<RecordType>(TT);
2329     const RecordDecl *RD = RT->getDecl();
2330     const ASTRecordLayout &Layout = getASTRecordLayout(RD);
2331     Width = toBits(Layout.getSize());
2332     Align = toBits(Layout.getAlignment());
2333     AlignRequirement = RD->hasAttr<AlignedAttr>()
2334                            ? AlignRequirementKind::RequiredByRecord
2335                            : AlignRequirementKind::None;
2336     break;
2337   }
2338 
2339   case Type::SubstTemplateTypeParm:
2340     return getTypeInfo(cast<SubstTemplateTypeParmType>(T)->
2341                        getReplacementType().getTypePtr());
2342 
2343   case Type::Auto:
2344   case Type::DeducedTemplateSpecialization: {
2345     const auto *A = cast<DeducedType>(T);
2346     assert(!A->getDeducedType().isNull() &&
2347            "cannot request the size of an undeduced or dependent auto type");
2348     return getTypeInfo(A->getDeducedType().getTypePtr());
2349   }
2350 
2351   case Type::Paren:
2352     return getTypeInfo(cast<ParenType>(T)->getInnerType().getTypePtr());
2353 
2354   case Type::MacroQualified:
2355     return getTypeInfo(
2356         cast<MacroQualifiedType>(T)->getUnderlyingType().getTypePtr());
2357 
2358   case Type::ObjCTypeParam:
2359     return getTypeInfo(cast<ObjCTypeParamType>(T)->desugar().getTypePtr());
2360 
2361   case Type::Using:
2362     return getTypeInfo(cast<UsingType>(T)->desugar().getTypePtr());
2363 
2364   case Type::Typedef: {
2365     const auto *TT = cast<TypedefType>(T);
2366     TypeInfo Info = getTypeInfo(TT->desugar().getTypePtr());
2367     // If the typedef has an aligned attribute on it, it overrides any computed
2368     // alignment we have.  This violates the GCC documentation (which says that
2369     // attribute(aligned) can only round up) but matches its implementation.
2370     if (unsigned AttrAlign = TT->getDecl()->getMaxAlignment()) {
2371       Align = AttrAlign;
2372       AlignRequirement = AlignRequirementKind::RequiredByTypedef;
2373     } else {
2374       Align = Info.Align;
2375       AlignRequirement = Info.AlignRequirement;
2376     }
2377     Width = Info.Width;
2378     break;
2379   }
2380 
2381   case Type::Elaborated:
2382     return getTypeInfo(cast<ElaboratedType>(T)->getNamedType().getTypePtr());
2383 
2384   case Type::Attributed:
2385     return getTypeInfo(
2386                   cast<AttributedType>(T)->getEquivalentType().getTypePtr());
2387 
2388   case Type::CountAttributed:
2389     return getTypeInfo(cast<CountAttributedType>(T)->desugar().getTypePtr());
2390 
2391   case Type::BTFTagAttributed:
2392     return getTypeInfo(
2393         cast<BTFTagAttributedType>(T)->getWrappedType().getTypePtr());
2394 
2395   case Type::Atomic: {
2396     // Start with the base type information.
2397     TypeInfo Info = getTypeInfo(cast<AtomicType>(T)->getValueType());
2398     Width = Info.Width;
2399     Align = Info.Align;
2400 
2401     if (!Width) {
2402       // An otherwise zero-sized type should still generate an
2403       // atomic operation.
2404       Width = Target->getCharWidth();
2405       assert(Align);
2406     } else if (Width <= Target->getMaxAtomicPromoteWidth()) {
2407       // If the size of the type doesn't exceed the platform's max
2408       // atomic promotion width, make the size and alignment more
2409       // favorable to atomic operations:
2410 
2411       // Round the size up to a power of 2.
2412       Width = llvm::bit_ceil(Width);
2413 
2414       // Set the alignment equal to the size.
2415       Align = static_cast<unsigned>(Width);
2416     }
2417   }
2418   break;
2419 
2420   case Type::Pipe:
2421     Width = Target->getPointerWidth(LangAS::opencl_global);
2422     Align = Target->getPointerAlign(LangAS::opencl_global);
2423     break;
2424   }
2425 
2426   assert(llvm::isPowerOf2_32(Align) && "Alignment must be power of 2");
2427   return TypeInfo(Width, Align, AlignRequirement);
2428 }
2429 
getTypeUnadjustedAlign(const Type * T) const2430 unsigned ASTContext::getTypeUnadjustedAlign(const Type *T) const {
2431   UnadjustedAlignMap::iterator I = MemoizedUnadjustedAlign.find(T);
2432   if (I != MemoizedUnadjustedAlign.end())
2433     return I->second;
2434 
2435   unsigned UnadjustedAlign;
2436   if (const auto *RT = T->getAs<RecordType>()) {
2437     const RecordDecl *RD = RT->getDecl();
2438     const ASTRecordLayout &Layout = getASTRecordLayout(RD);
2439     UnadjustedAlign = toBits(Layout.getUnadjustedAlignment());
2440   } else if (const auto *ObjCI = T->getAs<ObjCInterfaceType>()) {
2441     const ASTRecordLayout &Layout = getASTObjCInterfaceLayout(ObjCI->getDecl());
2442     UnadjustedAlign = toBits(Layout.getUnadjustedAlignment());
2443   } else {
2444     UnadjustedAlign = getTypeAlign(T->getUnqualifiedDesugaredType());
2445   }
2446 
2447   MemoizedUnadjustedAlign[T] = UnadjustedAlign;
2448   return UnadjustedAlign;
2449 }
2450 
getOpenMPDefaultSimdAlign(QualType T) const2451 unsigned ASTContext::getOpenMPDefaultSimdAlign(QualType T) const {
2452   unsigned SimdAlign = llvm::OpenMPIRBuilder::getOpenMPDefaultSimdAlign(
2453       getTargetInfo().getTriple(), Target->getTargetOpts().FeatureMap);
2454   return SimdAlign;
2455 }
2456 
2457 /// toCharUnitsFromBits - Convert a size in bits to a size in characters.
toCharUnitsFromBits(int64_t BitSize) const2458 CharUnits ASTContext::toCharUnitsFromBits(int64_t BitSize) const {
2459   return CharUnits::fromQuantity(BitSize / getCharWidth());
2460 }
2461 
2462 /// toBits - Convert a size in characters to a size in characters.
toBits(CharUnits CharSize) const2463 int64_t ASTContext::toBits(CharUnits CharSize) const {
2464   return CharSize.getQuantity() * getCharWidth();
2465 }
2466 
2467 /// getTypeSizeInChars - Return the size of the specified type, in characters.
2468 /// This method does not work on incomplete types.
getTypeSizeInChars(QualType T) const2469 CharUnits ASTContext::getTypeSizeInChars(QualType T) const {
2470   return getTypeInfoInChars(T).Width;
2471 }
getTypeSizeInChars(const Type * T) const2472 CharUnits ASTContext::getTypeSizeInChars(const Type *T) const {
2473   return getTypeInfoInChars(T).Width;
2474 }
2475 
2476 /// getTypeAlignInChars - Return the ABI-specified alignment of a type, in
2477 /// characters. This method does not work on incomplete types.
getTypeAlignInChars(QualType T) const2478 CharUnits ASTContext::getTypeAlignInChars(QualType T) const {
2479   return toCharUnitsFromBits(getTypeAlign(T));
2480 }
getTypeAlignInChars(const Type * T) const2481 CharUnits ASTContext::getTypeAlignInChars(const Type *T) const {
2482   return toCharUnitsFromBits(getTypeAlign(T));
2483 }
2484 
2485 /// getTypeUnadjustedAlignInChars - Return the ABI-specified alignment of a
2486 /// type, in characters, before alignment adjustments. This method does
2487 /// not work on incomplete types.
getTypeUnadjustedAlignInChars(QualType T) const2488 CharUnits ASTContext::getTypeUnadjustedAlignInChars(QualType T) const {
2489   return toCharUnitsFromBits(getTypeUnadjustedAlign(T));
2490 }
getTypeUnadjustedAlignInChars(const Type * T) const2491 CharUnits ASTContext::getTypeUnadjustedAlignInChars(const Type *T) const {
2492   return toCharUnitsFromBits(getTypeUnadjustedAlign(T));
2493 }
2494 
2495 /// getPreferredTypeAlign - Return the "preferred" alignment of the specified
2496 /// type for the current target in bits.  This can be different than the ABI
2497 /// alignment in cases where it is beneficial for performance or backwards
2498 /// compatibility preserving to overalign a data type. (Note: despite the name,
2499 /// the preferred alignment is ABI-impacting, and not an optimization.)
getPreferredTypeAlign(const Type * T) const2500 unsigned ASTContext::getPreferredTypeAlign(const Type *T) const {
2501   TypeInfo TI = getTypeInfo(T);
2502   unsigned ABIAlign = TI.Align;
2503 
2504   T = T->getBaseElementTypeUnsafe();
2505 
2506   // The preferred alignment of member pointers is that of a pointer.
2507   if (T->isMemberPointerType())
2508     return getPreferredTypeAlign(getPointerDiffType().getTypePtr());
2509 
2510   if (!Target->allowsLargerPreferedTypeAlignment())
2511     return ABIAlign;
2512 
2513   if (const auto *RT = T->getAs<RecordType>()) {
2514     const RecordDecl *RD = RT->getDecl();
2515 
2516     // When used as part of a typedef, or together with a 'packed' attribute,
2517     // the 'aligned' attribute can be used to decrease alignment. Note that the
2518     // 'packed' case is already taken into consideration when computing the
2519     // alignment, we only need to handle the typedef case here.
2520     if (TI.AlignRequirement == AlignRequirementKind::RequiredByTypedef ||
2521         RD->isInvalidDecl())
2522       return ABIAlign;
2523 
2524     unsigned PreferredAlign = static_cast<unsigned>(
2525         toBits(getASTRecordLayout(RD).PreferredAlignment));
2526     assert(PreferredAlign >= ABIAlign &&
2527            "PreferredAlign should be at least as large as ABIAlign.");
2528     return PreferredAlign;
2529   }
2530 
2531   // Double (and, for targets supporting AIX `power` alignment, long double) and
2532   // long long should be naturally aligned (despite requiring less alignment) if
2533   // possible.
2534   if (const auto *CT = T->getAs<ComplexType>())
2535     T = CT->getElementType().getTypePtr();
2536   if (const auto *ET = T->getAs<EnumType>())
2537     T = ET->getDecl()->getIntegerType().getTypePtr();
2538   if (T->isSpecificBuiltinType(BuiltinType::Double) ||
2539       T->isSpecificBuiltinType(BuiltinType::LongLong) ||
2540       T->isSpecificBuiltinType(BuiltinType::ULongLong) ||
2541       (T->isSpecificBuiltinType(BuiltinType::LongDouble) &&
2542        Target->defaultsToAIXPowerAlignment()))
2543     // Don't increase the alignment if an alignment attribute was specified on a
2544     // typedef declaration.
2545     if (!TI.isAlignRequired())
2546       return std::max(ABIAlign, (unsigned)getTypeSize(T));
2547 
2548   return ABIAlign;
2549 }
2550 
2551 /// getTargetDefaultAlignForAttributeAligned - Return the default alignment
2552 /// for __attribute__((aligned)) on this target, to be used if no alignment
2553 /// value is specified.
getTargetDefaultAlignForAttributeAligned() const2554 unsigned ASTContext::getTargetDefaultAlignForAttributeAligned() const {
2555   return getTargetInfo().getDefaultAlignForAttributeAligned();
2556 }
2557 
2558 /// getAlignOfGlobalVar - Return the alignment in bits that should be given
2559 /// to a global variable of the specified type.
getAlignOfGlobalVar(QualType T,const VarDecl * VD) const2560 unsigned ASTContext::getAlignOfGlobalVar(QualType T, const VarDecl *VD) const {
2561   uint64_t TypeSize = getTypeSize(T.getTypePtr());
2562   return std::max(getPreferredTypeAlign(T),
2563                   getMinGlobalAlignOfVar(TypeSize, VD));
2564 }
2565 
2566 /// getAlignOfGlobalVarInChars - Return the alignment in characters that
2567 /// should be given to a global variable of the specified type.
getAlignOfGlobalVarInChars(QualType T,const VarDecl * VD) const2568 CharUnits ASTContext::getAlignOfGlobalVarInChars(QualType T,
2569                                                  const VarDecl *VD) const {
2570   return toCharUnitsFromBits(getAlignOfGlobalVar(T, VD));
2571 }
2572 
getMinGlobalAlignOfVar(uint64_t Size,const VarDecl * VD) const2573 unsigned ASTContext::getMinGlobalAlignOfVar(uint64_t Size,
2574                                             const VarDecl *VD) const {
2575   // Make the default handling as that of a non-weak definition in the
2576   // current translation unit.
2577   bool HasNonWeakDef = !VD || (VD->hasDefinition() && !VD->isWeak());
2578   return getTargetInfo().getMinGlobalAlign(Size, HasNonWeakDef);
2579 }
2580 
getOffsetOfBaseWithVBPtr(const CXXRecordDecl * RD) const2581 CharUnits ASTContext::getOffsetOfBaseWithVBPtr(const CXXRecordDecl *RD) const {
2582   CharUnits Offset = CharUnits::Zero();
2583   const ASTRecordLayout *Layout = &getASTRecordLayout(RD);
2584   while (const CXXRecordDecl *Base = Layout->getBaseSharingVBPtr()) {
2585     Offset += Layout->getBaseClassOffset(Base);
2586     Layout = &getASTRecordLayout(Base);
2587   }
2588   return Offset;
2589 }
2590 
getMemberPointerPathAdjustment(const APValue & MP) const2591 CharUnits ASTContext::getMemberPointerPathAdjustment(const APValue &MP) const {
2592   const ValueDecl *MPD = MP.getMemberPointerDecl();
2593   CharUnits ThisAdjustment = CharUnits::Zero();
2594   ArrayRef<const CXXRecordDecl*> Path = MP.getMemberPointerPath();
2595   bool DerivedMember = MP.isMemberPointerToDerivedMember();
2596   const CXXRecordDecl *RD = cast<CXXRecordDecl>(MPD->getDeclContext());
2597   for (unsigned I = 0, N = Path.size(); I != N; ++I) {
2598     const CXXRecordDecl *Base = RD;
2599     const CXXRecordDecl *Derived = Path[I];
2600     if (DerivedMember)
2601       std::swap(Base, Derived);
2602     ThisAdjustment += getASTRecordLayout(Derived).getBaseClassOffset(Base);
2603     RD = Path[I];
2604   }
2605   if (DerivedMember)
2606     ThisAdjustment = -ThisAdjustment;
2607   return ThisAdjustment;
2608 }
2609 
2610 /// DeepCollectObjCIvars -
2611 /// This routine first collects all declared, but not synthesized, ivars in
2612 /// super class and then collects all ivars, including those synthesized for
2613 /// current class. This routine is used for implementation of current class
2614 /// when all ivars, declared and synthesized are known.
DeepCollectObjCIvars(const ObjCInterfaceDecl * OI,bool leafClass,SmallVectorImpl<const ObjCIvarDecl * > & Ivars) const2615 void ASTContext::DeepCollectObjCIvars(const ObjCInterfaceDecl *OI,
2616                                       bool leafClass,
2617                             SmallVectorImpl<const ObjCIvarDecl*> &Ivars) const {
2618   if (const ObjCInterfaceDecl *SuperClass = OI->getSuperClass())
2619     DeepCollectObjCIvars(SuperClass, false, Ivars);
2620   if (!leafClass) {
2621     llvm::append_range(Ivars, OI->ivars());
2622   } else {
2623     auto *IDecl = const_cast<ObjCInterfaceDecl *>(OI);
2624     for (const ObjCIvarDecl *Iv = IDecl->all_declared_ivar_begin(); Iv;
2625          Iv= Iv->getNextIvar())
2626       Ivars.push_back(Iv);
2627   }
2628 }
2629 
2630 /// CollectInheritedProtocols - Collect all protocols in current class and
2631 /// those inherited by it.
CollectInheritedProtocols(const Decl * CDecl,llvm::SmallPtrSet<ObjCProtocolDecl *,8> & Protocols)2632 void ASTContext::CollectInheritedProtocols(const Decl *CDecl,
2633                           llvm::SmallPtrSet<ObjCProtocolDecl*, 8> &Protocols) {
2634   if (const auto *OI = dyn_cast<ObjCInterfaceDecl>(CDecl)) {
2635     // We can use protocol_iterator here instead of
2636     // all_referenced_protocol_iterator since we are walking all categories.
2637     for (auto *Proto : OI->all_referenced_protocols()) {
2638       CollectInheritedProtocols(Proto, Protocols);
2639     }
2640 
2641     // Categories of this Interface.
2642     for (const auto *Cat : OI->visible_categories())
2643       CollectInheritedProtocols(Cat, Protocols);
2644 
2645     if (ObjCInterfaceDecl *SD = OI->getSuperClass())
2646       while (SD) {
2647         CollectInheritedProtocols(SD, Protocols);
2648         SD = SD->getSuperClass();
2649       }
2650   } else if (const auto *OC = dyn_cast<ObjCCategoryDecl>(CDecl)) {
2651     for (auto *Proto : OC->protocols()) {
2652       CollectInheritedProtocols(Proto, Protocols);
2653     }
2654   } else if (const auto *OP = dyn_cast<ObjCProtocolDecl>(CDecl)) {
2655     // Insert the protocol.
2656     if (!Protocols.insert(
2657           const_cast<ObjCProtocolDecl *>(OP->getCanonicalDecl())).second)
2658       return;
2659 
2660     for (auto *Proto : OP->protocols())
2661       CollectInheritedProtocols(Proto, Protocols);
2662   }
2663 }
2664 
unionHasUniqueObjectRepresentations(const ASTContext & Context,const RecordDecl * RD,bool CheckIfTriviallyCopyable)2665 static bool unionHasUniqueObjectRepresentations(const ASTContext &Context,
2666                                                 const RecordDecl *RD,
2667                                                 bool CheckIfTriviallyCopyable) {
2668   assert(RD->isUnion() && "Must be union type");
2669   CharUnits UnionSize = Context.getTypeSizeInChars(RD->getTypeForDecl());
2670 
2671   for (const auto *Field : RD->fields()) {
2672     if (!Context.hasUniqueObjectRepresentations(Field->getType(),
2673                                                 CheckIfTriviallyCopyable))
2674       return false;
2675     CharUnits FieldSize = Context.getTypeSizeInChars(Field->getType());
2676     if (FieldSize != UnionSize)
2677       return false;
2678   }
2679   return !RD->field_empty();
2680 }
2681 
getSubobjectOffset(const FieldDecl * Field,const ASTContext & Context,const clang::ASTRecordLayout &)2682 static int64_t getSubobjectOffset(const FieldDecl *Field,
2683                                   const ASTContext &Context,
2684                                   const clang::ASTRecordLayout & /*Layout*/) {
2685   return Context.getFieldOffset(Field);
2686 }
2687 
getSubobjectOffset(const CXXRecordDecl * RD,const ASTContext & Context,const clang::ASTRecordLayout & Layout)2688 static int64_t getSubobjectOffset(const CXXRecordDecl *RD,
2689                                   const ASTContext &Context,
2690                                   const clang::ASTRecordLayout &Layout) {
2691   return Context.toBits(Layout.getBaseClassOffset(RD));
2692 }
2693 
2694 static std::optional<int64_t>
2695 structHasUniqueObjectRepresentations(const ASTContext &Context,
2696                                      const RecordDecl *RD,
2697                                      bool CheckIfTriviallyCopyable);
2698 
2699 static std::optional<int64_t>
getSubobjectSizeInBits(const FieldDecl * Field,const ASTContext & Context,bool CheckIfTriviallyCopyable)2700 getSubobjectSizeInBits(const FieldDecl *Field, const ASTContext &Context,
2701                        bool CheckIfTriviallyCopyable) {
2702   if (Field->getType()->isRecordType()) {
2703     const RecordDecl *RD = Field->getType()->getAsRecordDecl();
2704     if (!RD->isUnion())
2705       return structHasUniqueObjectRepresentations(Context, RD,
2706                                                   CheckIfTriviallyCopyable);
2707   }
2708 
2709   // A _BitInt type may not be unique if it has padding bits
2710   // but if it is a bitfield the padding bits are not used.
2711   bool IsBitIntType = Field->getType()->isBitIntType();
2712   if (!Field->getType()->isReferenceType() && !IsBitIntType &&
2713       !Context.hasUniqueObjectRepresentations(Field->getType(),
2714                                               CheckIfTriviallyCopyable))
2715     return std::nullopt;
2716 
2717   int64_t FieldSizeInBits =
2718       Context.toBits(Context.getTypeSizeInChars(Field->getType()));
2719   if (Field->isBitField()) {
2720     // If we have explicit padding bits, they don't contribute bits
2721     // to the actual object representation, so return 0.
2722     if (Field->isUnnamedBitField())
2723       return 0;
2724 
2725     int64_t BitfieldSize = Field->getBitWidthValue(Context);
2726     if (IsBitIntType) {
2727       if ((unsigned)BitfieldSize >
2728           cast<BitIntType>(Field->getType())->getNumBits())
2729         return std::nullopt;
2730     } else if (BitfieldSize > FieldSizeInBits) {
2731       return std::nullopt;
2732     }
2733     FieldSizeInBits = BitfieldSize;
2734   } else if (IsBitIntType && !Context.hasUniqueObjectRepresentations(
2735                                  Field->getType(), CheckIfTriviallyCopyable)) {
2736     return std::nullopt;
2737   }
2738   return FieldSizeInBits;
2739 }
2740 
2741 static std::optional<int64_t>
getSubobjectSizeInBits(const CXXRecordDecl * RD,const ASTContext & Context,bool CheckIfTriviallyCopyable)2742 getSubobjectSizeInBits(const CXXRecordDecl *RD, const ASTContext &Context,
2743                        bool CheckIfTriviallyCopyable) {
2744   return structHasUniqueObjectRepresentations(Context, RD,
2745                                               CheckIfTriviallyCopyable);
2746 }
2747 
2748 template <typename RangeT>
structSubobjectsHaveUniqueObjectRepresentations(const RangeT & Subobjects,int64_t CurOffsetInBits,const ASTContext & Context,const clang::ASTRecordLayout & Layout,bool CheckIfTriviallyCopyable)2749 static std::optional<int64_t> structSubobjectsHaveUniqueObjectRepresentations(
2750     const RangeT &Subobjects, int64_t CurOffsetInBits,
2751     const ASTContext &Context, const clang::ASTRecordLayout &Layout,
2752     bool CheckIfTriviallyCopyable) {
2753   for (const auto *Subobject : Subobjects) {
2754     std::optional<int64_t> SizeInBits =
2755         getSubobjectSizeInBits(Subobject, Context, CheckIfTriviallyCopyable);
2756     if (!SizeInBits)
2757       return std::nullopt;
2758     if (*SizeInBits != 0) {
2759       int64_t Offset = getSubobjectOffset(Subobject, Context, Layout);
2760       if (Offset != CurOffsetInBits)
2761         return std::nullopt;
2762       CurOffsetInBits += *SizeInBits;
2763     }
2764   }
2765   return CurOffsetInBits;
2766 }
2767 
2768 static std::optional<int64_t>
structHasUniqueObjectRepresentations(const ASTContext & Context,const RecordDecl * RD,bool CheckIfTriviallyCopyable)2769 structHasUniqueObjectRepresentations(const ASTContext &Context,
2770                                      const RecordDecl *RD,
2771                                      bool CheckIfTriviallyCopyable) {
2772   assert(!RD->isUnion() && "Must be struct/class type");
2773   const auto &Layout = Context.getASTRecordLayout(RD);
2774 
2775   int64_t CurOffsetInBits = 0;
2776   if (const auto *ClassDecl = dyn_cast<CXXRecordDecl>(RD)) {
2777     if (ClassDecl->isDynamicClass())
2778       return std::nullopt;
2779 
2780     SmallVector<CXXRecordDecl *, 4> Bases;
2781     for (const auto &Base : ClassDecl->bases()) {
2782       // Empty types can be inherited from, and non-empty types can potentially
2783       // have tail padding, so just make sure there isn't an error.
2784       Bases.emplace_back(Base.getType()->getAsCXXRecordDecl());
2785     }
2786 
2787     llvm::sort(Bases, [&](const CXXRecordDecl *L, const CXXRecordDecl *R) {
2788       return Layout.getBaseClassOffset(L) < Layout.getBaseClassOffset(R);
2789     });
2790 
2791     std::optional<int64_t> OffsetAfterBases =
2792         structSubobjectsHaveUniqueObjectRepresentations(
2793             Bases, CurOffsetInBits, Context, Layout, CheckIfTriviallyCopyable);
2794     if (!OffsetAfterBases)
2795       return std::nullopt;
2796     CurOffsetInBits = *OffsetAfterBases;
2797   }
2798 
2799   std::optional<int64_t> OffsetAfterFields =
2800       structSubobjectsHaveUniqueObjectRepresentations(
2801           RD->fields(), CurOffsetInBits, Context, Layout,
2802           CheckIfTriviallyCopyable);
2803   if (!OffsetAfterFields)
2804     return std::nullopt;
2805   CurOffsetInBits = *OffsetAfterFields;
2806 
2807   return CurOffsetInBits;
2808 }
2809 
hasUniqueObjectRepresentations(QualType Ty,bool CheckIfTriviallyCopyable) const2810 bool ASTContext::hasUniqueObjectRepresentations(
2811     QualType Ty, bool CheckIfTriviallyCopyable) const {
2812   // C++17 [meta.unary.prop]:
2813   //   The predicate condition for a template specialization
2814   //   has_unique_object_representations<T> shall be satisfied if and only if:
2815   //     (9.1) - T is trivially copyable, and
2816   //     (9.2) - any two objects of type T with the same value have the same
2817   //     object representation, where:
2818   //     - two objects of array or non-union class type are considered to have
2819   //       the same value if their respective sequences of direct subobjects
2820   //       have the same values, and
2821   //     - two objects of union type are considered to have the same value if
2822   //       they have the same active member and the corresponding members have
2823   //       the same value.
2824   //   The set of scalar types for which this condition holds is
2825   //   implementation-defined. [ Note: If a type has padding bits, the condition
2826   //   does not hold; otherwise, the condition holds true for unsigned integral
2827   //   types. -- end note ]
2828   assert(!Ty.isNull() && "Null QualType sent to unique object rep check");
2829 
2830   // Arrays are unique only if their element type is unique.
2831   if (Ty->isArrayType())
2832     return hasUniqueObjectRepresentations(getBaseElementType(Ty),
2833                                           CheckIfTriviallyCopyable);
2834 
2835   assert((Ty->isVoidType() || !Ty->isIncompleteType()) &&
2836          "hasUniqueObjectRepresentations should not be called with an "
2837          "incomplete type");
2838 
2839   // (9.1) - T is trivially copyable...
2840   if (CheckIfTriviallyCopyable && !Ty.isTriviallyCopyableType(*this))
2841     return false;
2842 
2843   // All integrals and enums are unique.
2844   if (Ty->isIntegralOrEnumerationType()) {
2845     // Except _BitInt types that have padding bits.
2846     if (const auto *BIT = Ty->getAs<BitIntType>())
2847       return getTypeSize(BIT) == BIT->getNumBits();
2848 
2849     return true;
2850   }
2851 
2852   // All other pointers are unique.
2853   if (Ty->isPointerType())
2854     return true;
2855 
2856   if (const auto *MPT = Ty->getAs<MemberPointerType>())
2857     return !ABI->getMemberPointerInfo(MPT).HasPadding;
2858 
2859   if (Ty->isRecordType()) {
2860     const RecordDecl *Record = Ty->castAs<RecordType>()->getDecl();
2861 
2862     if (Record->isInvalidDecl())
2863       return false;
2864 
2865     if (Record->isUnion())
2866       return unionHasUniqueObjectRepresentations(*this, Record,
2867                                                  CheckIfTriviallyCopyable);
2868 
2869     std::optional<int64_t> StructSize = structHasUniqueObjectRepresentations(
2870         *this, Record, CheckIfTriviallyCopyable);
2871 
2872     return StructSize && *StructSize == static_cast<int64_t>(getTypeSize(Ty));
2873   }
2874 
2875   // FIXME: More cases to handle here (list by rsmith):
2876   // vectors (careful about, eg, vector of 3 foo)
2877   // _Complex int and friends
2878   // _Atomic T
2879   // Obj-C block pointers
2880   // Obj-C object pointers
2881   // and perhaps OpenCL's various builtin types (pipe, sampler_t, event_t,
2882   // clk_event_t, queue_t, reserve_id_t)
2883   // There're also Obj-C class types and the Obj-C selector type, but I think it
2884   // makes sense for those to return false here.
2885 
2886   return false;
2887 }
2888 
CountNonClassIvars(const ObjCInterfaceDecl * OI) const2889 unsigned ASTContext::CountNonClassIvars(const ObjCInterfaceDecl *OI) const {
2890   unsigned count = 0;
2891   // Count ivars declared in class extension.
2892   for (const auto *Ext : OI->known_extensions())
2893     count += Ext->ivar_size();
2894 
2895   // Count ivar defined in this class's implementation.  This
2896   // includes synthesized ivars.
2897   if (ObjCImplementationDecl *ImplDecl = OI->getImplementation())
2898     count += ImplDecl->ivar_size();
2899 
2900   return count;
2901 }
2902 
isSentinelNullExpr(const Expr * E)2903 bool ASTContext::isSentinelNullExpr(const Expr *E) {
2904   if (!E)
2905     return false;
2906 
2907   // nullptr_t is always treated as null.
2908   if (E->getType()->isNullPtrType()) return true;
2909 
2910   if (E->getType()->isAnyPointerType() &&
2911       E->IgnoreParenCasts()->isNullPointerConstant(*this,
2912                                                 Expr::NPC_ValueDependentIsNull))
2913     return true;
2914 
2915   // Unfortunately, __null has type 'int'.
2916   if (isa<GNUNullExpr>(E)) return true;
2917 
2918   return false;
2919 }
2920 
2921 /// Get the implementation of ObjCInterfaceDecl, or nullptr if none
2922 /// exists.
getObjCImplementation(ObjCInterfaceDecl * D)2923 ObjCImplementationDecl *ASTContext::getObjCImplementation(ObjCInterfaceDecl *D) {
2924   llvm::DenseMap<ObjCContainerDecl*, ObjCImplDecl*>::iterator
2925     I = ObjCImpls.find(D);
2926   if (I != ObjCImpls.end())
2927     return cast<ObjCImplementationDecl>(I->second);
2928   return nullptr;
2929 }
2930 
2931 /// Get the implementation of ObjCCategoryDecl, or nullptr if none
2932 /// exists.
getObjCImplementation(ObjCCategoryDecl * D)2933 ObjCCategoryImplDecl *ASTContext::getObjCImplementation(ObjCCategoryDecl *D) {
2934   llvm::DenseMap<ObjCContainerDecl*, ObjCImplDecl*>::iterator
2935     I = ObjCImpls.find(D);
2936   if (I != ObjCImpls.end())
2937     return cast<ObjCCategoryImplDecl>(I->second);
2938   return nullptr;
2939 }
2940 
2941 /// Set the implementation of ObjCInterfaceDecl.
setObjCImplementation(ObjCInterfaceDecl * IFaceD,ObjCImplementationDecl * ImplD)2942 void ASTContext::setObjCImplementation(ObjCInterfaceDecl *IFaceD,
2943                            ObjCImplementationDecl *ImplD) {
2944   assert(IFaceD && ImplD && "Passed null params");
2945   ObjCImpls[IFaceD] = ImplD;
2946 }
2947 
2948 /// Set the implementation of ObjCCategoryDecl.
setObjCImplementation(ObjCCategoryDecl * CatD,ObjCCategoryImplDecl * ImplD)2949 void ASTContext::setObjCImplementation(ObjCCategoryDecl *CatD,
2950                            ObjCCategoryImplDecl *ImplD) {
2951   assert(CatD && ImplD && "Passed null params");
2952   ObjCImpls[CatD] = ImplD;
2953 }
2954 
2955 const ObjCMethodDecl *
getObjCMethodRedeclaration(const ObjCMethodDecl * MD) const2956 ASTContext::getObjCMethodRedeclaration(const ObjCMethodDecl *MD) const {
2957   return ObjCMethodRedecls.lookup(MD);
2958 }
2959 
setObjCMethodRedeclaration(const ObjCMethodDecl * MD,const ObjCMethodDecl * Redecl)2960 void ASTContext::setObjCMethodRedeclaration(const ObjCMethodDecl *MD,
2961                                             const ObjCMethodDecl *Redecl) {
2962   assert(!getObjCMethodRedeclaration(MD) && "MD already has a redeclaration");
2963   ObjCMethodRedecls[MD] = Redecl;
2964 }
2965 
getObjContainingInterface(const NamedDecl * ND) const2966 const ObjCInterfaceDecl *ASTContext::getObjContainingInterface(
2967                                               const NamedDecl *ND) const {
2968   if (const auto *ID = dyn_cast<ObjCInterfaceDecl>(ND->getDeclContext()))
2969     return ID;
2970   if (const auto *CD = dyn_cast<ObjCCategoryDecl>(ND->getDeclContext()))
2971     return CD->getClassInterface();
2972   if (const auto *IMD = dyn_cast<ObjCImplDecl>(ND->getDeclContext()))
2973     return IMD->getClassInterface();
2974 
2975   return nullptr;
2976 }
2977 
2978 /// Get the copy initialization expression of VarDecl, or nullptr if
2979 /// none exists.
getBlockVarCopyInit(const VarDecl * VD) const2980 BlockVarCopyInit ASTContext::getBlockVarCopyInit(const VarDecl *VD) const {
2981   assert(VD && "Passed null params");
2982   assert(VD->hasAttr<BlocksAttr>() &&
2983          "getBlockVarCopyInits - not __block var");
2984   auto I = BlockVarCopyInits.find(VD);
2985   if (I != BlockVarCopyInits.end())
2986     return I->second;
2987   return {nullptr, false};
2988 }
2989 
2990 /// Set the copy initialization expression of a block var decl.
setBlockVarCopyInit(const VarDecl * VD,Expr * CopyExpr,bool CanThrow)2991 void ASTContext::setBlockVarCopyInit(const VarDecl*VD, Expr *CopyExpr,
2992                                      bool CanThrow) {
2993   assert(VD && CopyExpr && "Passed null params");
2994   assert(VD->hasAttr<BlocksAttr>() &&
2995          "setBlockVarCopyInits - not __block var");
2996   BlockVarCopyInits[VD].setExprAndFlag(CopyExpr, CanThrow);
2997 }
2998 
CreateTypeSourceInfo(QualType T,unsigned DataSize) const2999 TypeSourceInfo *ASTContext::CreateTypeSourceInfo(QualType T,
3000                                                  unsigned DataSize) const {
3001   if (!DataSize)
3002     DataSize = TypeLoc::getFullDataSizeForType(T);
3003   else
3004     assert(DataSize == TypeLoc::getFullDataSizeForType(T) &&
3005            "incorrect data size provided to CreateTypeSourceInfo!");
3006 
3007   auto *TInfo =
3008     (TypeSourceInfo*)BumpAlloc.Allocate(sizeof(TypeSourceInfo) + DataSize, 8);
3009   new (TInfo) TypeSourceInfo(T, DataSize);
3010   return TInfo;
3011 }
3012 
getTrivialTypeSourceInfo(QualType T,SourceLocation L) const3013 TypeSourceInfo *ASTContext::getTrivialTypeSourceInfo(QualType T,
3014                                                      SourceLocation L) const {
3015   TypeSourceInfo *DI = CreateTypeSourceInfo(T);
3016   DI->getTypeLoc().initialize(const_cast<ASTContext &>(*this), L);
3017   return DI;
3018 }
3019 
3020 const ASTRecordLayout &
getASTObjCInterfaceLayout(const ObjCInterfaceDecl * D) const3021 ASTContext::getASTObjCInterfaceLayout(const ObjCInterfaceDecl *D) const {
3022   return getObjCLayout(D, nullptr);
3023 }
3024 
3025 const ASTRecordLayout &
getASTObjCImplementationLayout(const ObjCImplementationDecl * D) const3026 ASTContext::getASTObjCImplementationLayout(
3027                                         const ObjCImplementationDecl *D) const {
3028   return getObjCLayout(D->getClassInterface(), D);
3029 }
3030 
getCanonicalTemplateArguments(const ASTContext & C,ArrayRef<TemplateArgument> Args,bool & AnyNonCanonArgs)3031 static auto getCanonicalTemplateArguments(const ASTContext &C,
3032                                           ArrayRef<TemplateArgument> Args,
3033                                           bool &AnyNonCanonArgs) {
3034   SmallVector<TemplateArgument, 16> CanonArgs(Args);
3035   for (auto &Arg : CanonArgs) {
3036     TemplateArgument OrigArg = Arg;
3037     Arg = C.getCanonicalTemplateArgument(Arg);
3038     AnyNonCanonArgs |= !Arg.structurallyEquals(OrigArg);
3039   }
3040   return CanonArgs;
3041 }
3042 
3043 //===----------------------------------------------------------------------===//
3044 //                   Type creation/memoization methods
3045 //===----------------------------------------------------------------------===//
3046 
3047 QualType
getExtQualType(const Type * baseType,Qualifiers quals) const3048 ASTContext::getExtQualType(const Type *baseType, Qualifiers quals) const {
3049   unsigned fastQuals = quals.getFastQualifiers();
3050   quals.removeFastQualifiers();
3051 
3052   // Check if we've already instantiated this type.
3053   llvm::FoldingSetNodeID ID;
3054   ExtQuals::Profile(ID, baseType, quals);
3055   void *insertPos = nullptr;
3056   if (ExtQuals *eq = ExtQualNodes.FindNodeOrInsertPos(ID, insertPos)) {
3057     assert(eq->getQualifiers() == quals);
3058     return QualType(eq, fastQuals);
3059   }
3060 
3061   // If the base type is not canonical, make the appropriate canonical type.
3062   QualType canon;
3063   if (!baseType->isCanonicalUnqualified()) {
3064     SplitQualType canonSplit = baseType->getCanonicalTypeInternal().split();
3065     canonSplit.Quals.addConsistentQualifiers(quals);
3066     canon = getExtQualType(canonSplit.Ty, canonSplit.Quals);
3067 
3068     // Re-find the insert position.
3069     (void) ExtQualNodes.FindNodeOrInsertPos(ID, insertPos);
3070   }
3071 
3072   auto *eq = new (*this, alignof(ExtQuals)) ExtQuals(baseType, canon, quals);
3073   ExtQualNodes.InsertNode(eq, insertPos);
3074   return QualType(eq, fastQuals);
3075 }
3076 
getAddrSpaceQualType(QualType T,LangAS AddressSpace) const3077 QualType ASTContext::getAddrSpaceQualType(QualType T,
3078                                           LangAS AddressSpace) const {
3079   QualType CanT = getCanonicalType(T);
3080   if (CanT.getAddressSpace() == AddressSpace)
3081     return T;
3082 
3083   // If we are composing extended qualifiers together, merge together
3084   // into one ExtQuals node.
3085   QualifierCollector Quals;
3086   const Type *TypeNode = Quals.strip(T);
3087 
3088   // If this type already has an address space specified, it cannot get
3089   // another one.
3090   assert(!Quals.hasAddressSpace() &&
3091          "Type cannot be in multiple addr spaces!");
3092   Quals.addAddressSpace(AddressSpace);
3093 
3094   return getExtQualType(TypeNode, Quals);
3095 }
3096 
removeAddrSpaceQualType(QualType T) const3097 QualType ASTContext::removeAddrSpaceQualType(QualType T) const {
3098   // If the type is not qualified with an address space, just return it
3099   // immediately.
3100   if (!T.hasAddressSpace())
3101     return T;
3102 
3103   QualifierCollector Quals;
3104   const Type *TypeNode;
3105   // For arrays, strip the qualifier off the element type, then reconstruct the
3106   // array type
3107   if (T.getTypePtr()->isArrayType()) {
3108     T = getUnqualifiedArrayType(T, Quals);
3109     TypeNode = T.getTypePtr();
3110   } else {
3111     // If we are composing extended qualifiers together, merge together
3112     // into one ExtQuals node.
3113     while (T.hasAddressSpace()) {
3114       TypeNode = Quals.strip(T);
3115 
3116       // If the type no longer has an address space after stripping qualifiers,
3117       // jump out.
3118       if (!QualType(TypeNode, 0).hasAddressSpace())
3119         break;
3120 
3121       // There might be sugar in the way. Strip it and try again.
3122       T = T.getSingleStepDesugaredType(*this);
3123     }
3124   }
3125 
3126   Quals.removeAddressSpace();
3127 
3128   // Removal of the address space can mean there are no longer any
3129   // non-fast qualifiers, so creating an ExtQualType isn't possible (asserts)
3130   // or required.
3131   if (Quals.hasNonFastQualifiers())
3132     return getExtQualType(TypeNode, Quals);
3133   else
3134     return QualType(TypeNode, Quals.getFastQualifiers());
3135 }
3136 
3137 uint16_t
getPointerAuthVTablePointerDiscriminator(const CXXRecordDecl * RD)3138 ASTContext::getPointerAuthVTablePointerDiscriminator(const CXXRecordDecl *RD) {
3139   assert(RD->isPolymorphic() &&
3140          "Attempted to get vtable pointer discriminator on a monomorphic type");
3141   std::unique_ptr<MangleContext> MC(createMangleContext());
3142   SmallString<256> Str;
3143   llvm::raw_svector_ostream Out(Str);
3144   MC->mangleCXXVTable(RD, Out);
3145   return llvm::getPointerAuthStableSipHash(Str);
3146 }
3147 
3148 /// Encode a function type for use in the discriminator of a function pointer
3149 /// type. We can't use the itanium scheme for this since C has quite permissive
3150 /// rules for type compatibility that we need to be compatible with.
3151 ///
3152 /// Formally, this function associates every function pointer type T with an
3153 /// encoded string E(T). Let the equivalence relation T1 ~ T2 be defined as
3154 /// E(T1) == E(T2). E(T) is part of the ABI of values of type T. C type
3155 /// compatibility requires equivalent treatment under the ABI, so
3156 /// CCompatible(T1, T2) must imply E(T1) == E(T2), that is, CCompatible must be
3157 /// a subset of ~. Crucially, however, it must be a proper subset because
3158 /// CCompatible is not an equivalence relation: for example, int[] is compatible
3159 /// with both int[1] and int[2], but the latter are not compatible with each
3160 /// other. Therefore this encoding function must be careful to only distinguish
3161 /// types if there is no third type with which they are both required to be
3162 /// compatible.
encodeTypeForFunctionPointerAuth(const ASTContext & Ctx,raw_ostream & OS,QualType QT)3163 static void encodeTypeForFunctionPointerAuth(const ASTContext &Ctx,
3164                                              raw_ostream &OS, QualType QT) {
3165   // FIXME: Consider address space qualifiers.
3166   const Type *T = QT.getCanonicalType().getTypePtr();
3167 
3168   // FIXME: Consider using the C++ type mangling when we encounter a construct
3169   // that is incompatible with C.
3170 
3171   switch (T->getTypeClass()) {
3172   case Type::Atomic:
3173     return encodeTypeForFunctionPointerAuth(
3174         Ctx, OS, cast<AtomicType>(T)->getValueType());
3175 
3176   case Type::LValueReference:
3177     OS << "R";
3178     encodeTypeForFunctionPointerAuth(Ctx, OS,
3179                                      cast<ReferenceType>(T)->getPointeeType());
3180     return;
3181   case Type::RValueReference:
3182     OS << "O";
3183     encodeTypeForFunctionPointerAuth(Ctx, OS,
3184                                      cast<ReferenceType>(T)->getPointeeType());
3185     return;
3186 
3187   case Type::Pointer:
3188     // C11 6.7.6.1p2:
3189     //   For two pointer types to be compatible, both shall be identically
3190     //   qualified and both shall be pointers to compatible types.
3191     // FIXME: we should also consider pointee types.
3192     OS << "P";
3193     return;
3194 
3195   case Type::ObjCObjectPointer:
3196   case Type::BlockPointer:
3197     OS << "P";
3198     return;
3199 
3200   case Type::Complex:
3201     OS << "C";
3202     return encodeTypeForFunctionPointerAuth(
3203         Ctx, OS, cast<ComplexType>(T)->getElementType());
3204 
3205   case Type::VariableArray:
3206   case Type::ConstantArray:
3207   case Type::IncompleteArray:
3208   case Type::ArrayParameter:
3209     // C11 6.7.6.2p6:
3210     //   For two array types to be compatible, both shall have compatible
3211     //   element types, and if both size specifiers are present, and are integer
3212     //   constant expressions, then both size specifiers shall have the same
3213     //   constant value [...]
3214     //
3215     // So since ElemType[N] has to be compatible ElemType[], we can't encode the
3216     // width of the array.
3217     OS << "A";
3218     return encodeTypeForFunctionPointerAuth(
3219         Ctx, OS, cast<ArrayType>(T)->getElementType());
3220 
3221   case Type::ObjCInterface:
3222   case Type::ObjCObject:
3223     OS << "<objc_object>";
3224     return;
3225 
3226   case Type::Enum: {
3227     // C11 6.7.2.2p4:
3228     //   Each enumerated type shall be compatible with char, a signed integer
3229     //   type, or an unsigned integer type.
3230     //
3231     // So we have to treat enum types as integers.
3232     QualType UnderlyingType = cast<EnumType>(T)->getDecl()->getIntegerType();
3233     return encodeTypeForFunctionPointerAuth(
3234         Ctx, OS, UnderlyingType.isNull() ? Ctx.IntTy : UnderlyingType);
3235   }
3236 
3237   case Type::FunctionNoProto:
3238   case Type::FunctionProto: {
3239     // C11 6.7.6.3p15:
3240     //   For two function types to be compatible, both shall specify compatible
3241     //   return types. Moreover, the parameter type lists, if both are present,
3242     //   shall agree in the number of parameters and in the use of the ellipsis
3243     //   terminator; corresponding parameters shall have compatible types.
3244     //
3245     // That paragraph goes on to describe how unprototyped functions are to be
3246     // handled, which we ignore here. Unprototyped function pointers are hashed
3247     // as though they were prototyped nullary functions since thats probably
3248     // what the user meant. This behavior is non-conforming.
3249     // FIXME: If we add a "custom discriminator" function type attribute we
3250     // should encode functions as their discriminators.
3251     OS << "F";
3252     const auto *FuncType = cast<FunctionType>(T);
3253     encodeTypeForFunctionPointerAuth(Ctx, OS, FuncType->getReturnType());
3254     if (const auto *FPT = dyn_cast<FunctionProtoType>(FuncType)) {
3255       for (QualType Param : FPT->param_types()) {
3256         Param = Ctx.getSignatureParameterType(Param);
3257         encodeTypeForFunctionPointerAuth(Ctx, OS, Param);
3258       }
3259       if (FPT->isVariadic())
3260         OS << "z";
3261     }
3262     OS << "E";
3263     return;
3264   }
3265 
3266   case Type::MemberPointer: {
3267     OS << "M";
3268     const auto *MPT = T->getAs<MemberPointerType>();
3269     encodeTypeForFunctionPointerAuth(Ctx, OS, QualType(MPT->getClass(), 0));
3270     encodeTypeForFunctionPointerAuth(Ctx, OS, MPT->getPointeeType());
3271     return;
3272   }
3273   case Type::ExtVector:
3274   case Type::Vector:
3275     OS << "Dv" << Ctx.getTypeSizeInChars(T).getQuantity();
3276     break;
3277 
3278   // Don't bother discriminating based on these types.
3279   case Type::Pipe:
3280   case Type::BitInt:
3281   case Type::ConstantMatrix:
3282     OS << "?";
3283     return;
3284 
3285   case Type::Builtin: {
3286     const auto *BTy = T->getAs<BuiltinType>();
3287     switch (BTy->getKind()) {
3288 #define SIGNED_TYPE(Id, SingletonId)                                           \
3289   case BuiltinType::Id:                                                        \
3290     OS << "i";                                                                 \
3291     return;
3292 #define UNSIGNED_TYPE(Id, SingletonId)                                         \
3293   case BuiltinType::Id:                                                        \
3294     OS << "i";                                                                 \
3295     return;
3296 #define PLACEHOLDER_TYPE(Id, SingletonId) case BuiltinType::Id:
3297 #define BUILTIN_TYPE(Id, SingletonId)
3298 #include "clang/AST/BuiltinTypes.def"
3299       llvm_unreachable("placeholder types should not appear here.");
3300 
3301     case BuiltinType::Half:
3302       OS << "Dh";
3303       return;
3304     case BuiltinType::Float:
3305       OS << "f";
3306       return;
3307     case BuiltinType::Double:
3308       OS << "d";
3309       return;
3310     case BuiltinType::LongDouble:
3311       OS << "e";
3312       return;
3313     case BuiltinType::Float16:
3314       OS << "DF16_";
3315       return;
3316     case BuiltinType::Float128:
3317       OS << "g";
3318       return;
3319 
3320     case BuiltinType::Void:
3321       OS << "v";
3322       return;
3323 
3324     case BuiltinType::ObjCId:
3325     case BuiltinType::ObjCClass:
3326     case BuiltinType::ObjCSel:
3327     case BuiltinType::NullPtr:
3328       OS << "P";
3329       return;
3330 
3331     // Don't bother discriminating based on OpenCL types.
3332     case BuiltinType::OCLSampler:
3333     case BuiltinType::OCLEvent:
3334     case BuiltinType::OCLClkEvent:
3335     case BuiltinType::OCLQueue:
3336     case BuiltinType::OCLReserveID:
3337     case BuiltinType::BFloat16:
3338     case BuiltinType::VectorQuad:
3339     case BuiltinType::VectorPair:
3340       OS << "?";
3341       return;
3342 
3343     // Don't bother discriminating based on these seldom-used types.
3344     case BuiltinType::Ibm128:
3345       return;
3346 #define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix)                   \
3347   case BuiltinType::Id:                                                        \
3348     return;
3349 #include "clang/Basic/OpenCLImageTypes.def"
3350 #define EXT_OPAQUE_TYPE(ExtType, Id, Ext)                                      \
3351   case BuiltinType::Id:                                                        \
3352     return;
3353 #include "clang/Basic/OpenCLExtensionTypes.def"
3354 #define SVE_TYPE(Name, Id, SingletonId)                                        \
3355   case BuiltinType::Id:                                                        \
3356     return;
3357 #include "clang/Basic/AArch64SVEACLETypes.def"
3358     case BuiltinType::Dependent:
3359       llvm_unreachable("should never get here");
3360     case BuiltinType::AMDGPUBufferRsrc:
3361     case BuiltinType::WasmExternRef:
3362 #define RVV_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
3363 #include "clang/Basic/RISCVVTypes.def"
3364       llvm_unreachable("not yet implemented");
3365     }
3366   }
3367   case Type::Record: {
3368     const RecordDecl *RD = T->getAs<RecordType>()->getDecl();
3369     const IdentifierInfo *II = RD->getIdentifier();
3370 
3371     // In C++, an immediate typedef of an anonymous struct or union
3372     // is considered to name it for ODR purposes, but C's specification
3373     // of type compatibility does not have a similar rule.  Using the typedef
3374     // name in function type discriminators anyway, as we do here,
3375     // therefore technically violates the C standard: two function pointer
3376     // types defined in terms of two typedef'd anonymous structs with
3377     // different names are formally still compatible, but we are assigning
3378     // them different discriminators and therefore incompatible ABIs.
3379     //
3380     // This is a relatively minor violation that significantly improves
3381     // discrimination in some cases and has not caused problems in
3382     // practice.  Regardless, it is now part of the ABI in places where
3383     // function type discrimination is used, and it can no longer be
3384     // changed except on new platforms.
3385 
3386     if (!II)
3387       if (const TypedefNameDecl *Typedef = RD->getTypedefNameForAnonDecl())
3388         II = Typedef->getDeclName().getAsIdentifierInfo();
3389 
3390     if (!II) {
3391       OS << "<anonymous_record>";
3392       return;
3393     }
3394     OS << II->getLength() << II->getName();
3395     return;
3396   }
3397   case Type::DeducedTemplateSpecialization:
3398   case Type::Auto:
3399 #define NON_CANONICAL_TYPE(Class, Base) case Type::Class:
3400 #define DEPENDENT_TYPE(Class, Base) case Type::Class:
3401 #define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base) case Type::Class:
3402 #define ABSTRACT_TYPE(Class, Base)
3403 #define TYPE(Class, Base)
3404 #include "clang/AST/TypeNodes.inc"
3405     llvm_unreachable("unexpected non-canonical or dependent type!");
3406     return;
3407   }
3408 }
3409 
getPointerAuthTypeDiscriminator(QualType T)3410 uint16_t ASTContext::getPointerAuthTypeDiscriminator(QualType T) {
3411   assert(!T->isDependentType() &&
3412          "cannot compute type discriminator of a dependent type");
3413 
3414   SmallString<256> Str;
3415   llvm::raw_svector_ostream Out(Str);
3416 
3417   if (T->isFunctionPointerType() || T->isFunctionReferenceType())
3418     T = T->getPointeeType();
3419 
3420   if (T->isFunctionType()) {
3421     encodeTypeForFunctionPointerAuth(*this, Out, T);
3422   } else {
3423     T = T.getUnqualifiedType();
3424     std::unique_ptr<MangleContext> MC(createMangleContext());
3425     MC->mangleCanonicalTypeName(T, Out);
3426   }
3427 
3428   return llvm::getPointerAuthStableSipHash(Str);
3429 }
3430 
getObjCGCQualType(QualType T,Qualifiers::GC GCAttr) const3431 QualType ASTContext::getObjCGCQualType(QualType T,
3432                                        Qualifiers::GC GCAttr) const {
3433   QualType CanT = getCanonicalType(T);
3434   if (CanT.getObjCGCAttr() == GCAttr)
3435     return T;
3436 
3437   if (const auto *ptr = T->getAs<PointerType>()) {
3438     QualType Pointee = ptr->getPointeeType();
3439     if (Pointee->isAnyPointerType()) {
3440       QualType ResultType = getObjCGCQualType(Pointee, GCAttr);
3441       return getPointerType(ResultType);
3442     }
3443   }
3444 
3445   // If we are composing extended qualifiers together, merge together
3446   // into one ExtQuals node.
3447   QualifierCollector Quals;
3448   const Type *TypeNode = Quals.strip(T);
3449 
3450   // If this type already has an ObjCGC specified, it cannot get
3451   // another one.
3452   assert(!Quals.hasObjCGCAttr() &&
3453          "Type cannot have multiple ObjCGCs!");
3454   Quals.addObjCGCAttr(GCAttr);
3455 
3456   return getExtQualType(TypeNode, Quals);
3457 }
3458 
removePtrSizeAddrSpace(QualType T) const3459 QualType ASTContext::removePtrSizeAddrSpace(QualType T) const {
3460   if (const PointerType *Ptr = T->getAs<PointerType>()) {
3461     QualType Pointee = Ptr->getPointeeType();
3462     if (isPtrSizeAddressSpace(Pointee.getAddressSpace())) {
3463       return getPointerType(removeAddrSpaceQualType(Pointee));
3464     }
3465   }
3466   return T;
3467 }
3468 
getCountAttributedType(QualType WrappedTy,Expr * CountExpr,bool CountInBytes,bool OrNull,ArrayRef<TypeCoupledDeclRefInfo> DependentDecls) const3469 QualType ASTContext::getCountAttributedType(
3470     QualType WrappedTy, Expr *CountExpr, bool CountInBytes, bool OrNull,
3471     ArrayRef<TypeCoupledDeclRefInfo> DependentDecls) const {
3472   assert(WrappedTy->isPointerType() || WrappedTy->isArrayType());
3473 
3474   llvm::FoldingSetNodeID ID;
3475   CountAttributedType::Profile(ID, WrappedTy, CountExpr, CountInBytes, OrNull);
3476 
3477   void *InsertPos = nullptr;
3478   CountAttributedType *CATy =
3479       CountAttributedTypes.FindNodeOrInsertPos(ID, InsertPos);
3480   if (CATy)
3481     return QualType(CATy, 0);
3482 
3483   QualType CanonTy = getCanonicalType(WrappedTy);
3484   size_t Size = CountAttributedType::totalSizeToAlloc<TypeCoupledDeclRefInfo>(
3485       DependentDecls.size());
3486   CATy = (CountAttributedType *)Allocate(Size, TypeAlignment);
3487   new (CATy) CountAttributedType(WrappedTy, CanonTy, CountExpr, CountInBytes,
3488                                  OrNull, DependentDecls);
3489   Types.push_back(CATy);
3490   CountAttributedTypes.InsertNode(CATy, InsertPos);
3491 
3492   return QualType(CATy, 0);
3493 }
3494 
adjustFunctionType(const FunctionType * T,FunctionType::ExtInfo Info)3495 const FunctionType *ASTContext::adjustFunctionType(const FunctionType *T,
3496                                                    FunctionType::ExtInfo Info) {
3497   if (T->getExtInfo() == Info)
3498     return T;
3499 
3500   QualType Result;
3501   if (const auto *FNPT = dyn_cast<FunctionNoProtoType>(T)) {
3502     Result = getFunctionNoProtoType(FNPT->getReturnType(), Info);
3503   } else {
3504     const auto *FPT = cast<FunctionProtoType>(T);
3505     FunctionProtoType::ExtProtoInfo EPI = FPT->getExtProtoInfo();
3506     EPI.ExtInfo = Info;
3507     Result = getFunctionType(FPT->getReturnType(), FPT->getParamTypes(), EPI);
3508   }
3509 
3510   return cast<FunctionType>(Result.getTypePtr());
3511 }
3512 
adjustDeducedFunctionResultType(FunctionDecl * FD,QualType ResultType)3513 void ASTContext::adjustDeducedFunctionResultType(FunctionDecl *FD,
3514                                                  QualType ResultType) {
3515   FD = FD->getMostRecentDecl();
3516   while (true) {
3517     const auto *FPT = FD->getType()->castAs<FunctionProtoType>();
3518     FunctionProtoType::ExtProtoInfo EPI = FPT->getExtProtoInfo();
3519     FD->setType(getFunctionType(ResultType, FPT->getParamTypes(), EPI));
3520     if (FunctionDecl *Next = FD->getPreviousDecl())
3521       FD = Next;
3522     else
3523       break;
3524   }
3525   if (ASTMutationListener *L = getASTMutationListener())
3526     L->DeducedReturnType(FD, ResultType);
3527 }
3528 
3529 /// Get a function type and produce the equivalent function type with the
3530 /// specified exception specification. Type sugar that can be present on a
3531 /// declaration of a function with an exception specification is permitted
3532 /// and preserved. Other type sugar (for instance, typedefs) is not.
getFunctionTypeWithExceptionSpec(QualType Orig,const FunctionProtoType::ExceptionSpecInfo & ESI) const3533 QualType ASTContext::getFunctionTypeWithExceptionSpec(
3534     QualType Orig, const FunctionProtoType::ExceptionSpecInfo &ESI) const {
3535   // Might have some parens.
3536   if (const auto *PT = dyn_cast<ParenType>(Orig))
3537     return getParenType(
3538         getFunctionTypeWithExceptionSpec(PT->getInnerType(), ESI));
3539 
3540   // Might be wrapped in a macro qualified type.
3541   if (const auto *MQT = dyn_cast<MacroQualifiedType>(Orig))
3542     return getMacroQualifiedType(
3543         getFunctionTypeWithExceptionSpec(MQT->getUnderlyingType(), ESI),
3544         MQT->getMacroIdentifier());
3545 
3546   // Might have a calling-convention attribute.
3547   if (const auto *AT = dyn_cast<AttributedType>(Orig))
3548     return getAttributedType(
3549         AT->getAttrKind(),
3550         getFunctionTypeWithExceptionSpec(AT->getModifiedType(), ESI),
3551         getFunctionTypeWithExceptionSpec(AT->getEquivalentType(), ESI));
3552 
3553   // Anything else must be a function type. Rebuild it with the new exception
3554   // specification.
3555   const auto *Proto = Orig->castAs<FunctionProtoType>();
3556   return getFunctionType(
3557       Proto->getReturnType(), Proto->getParamTypes(),
3558       Proto->getExtProtoInfo().withExceptionSpec(ESI));
3559 }
3560 
hasSameFunctionTypeIgnoringExceptionSpec(QualType T,QualType U) const3561 bool ASTContext::hasSameFunctionTypeIgnoringExceptionSpec(QualType T,
3562                                                           QualType U) const {
3563   return hasSameType(T, U) ||
3564          (getLangOpts().CPlusPlus17 &&
3565           hasSameType(getFunctionTypeWithExceptionSpec(T, EST_None),
3566                       getFunctionTypeWithExceptionSpec(U, EST_None)));
3567 }
3568 
getFunctionTypeWithoutPtrSizes(QualType T)3569 QualType ASTContext::getFunctionTypeWithoutPtrSizes(QualType T) {
3570   if (const auto *Proto = T->getAs<FunctionProtoType>()) {
3571     QualType RetTy = removePtrSizeAddrSpace(Proto->getReturnType());
3572     SmallVector<QualType, 16> Args(Proto->param_types().size());
3573     for (unsigned i = 0, n = Args.size(); i != n; ++i)
3574       Args[i] = removePtrSizeAddrSpace(Proto->param_types()[i]);
3575     return getFunctionType(RetTy, Args, Proto->getExtProtoInfo());
3576   }
3577 
3578   if (const FunctionNoProtoType *Proto = T->getAs<FunctionNoProtoType>()) {
3579     QualType RetTy = removePtrSizeAddrSpace(Proto->getReturnType());
3580     return getFunctionNoProtoType(RetTy, Proto->getExtInfo());
3581   }
3582 
3583   return T;
3584 }
3585 
hasSameFunctionTypeIgnoringPtrSizes(QualType T,QualType U)3586 bool ASTContext::hasSameFunctionTypeIgnoringPtrSizes(QualType T, QualType U) {
3587   return hasSameType(T, U) ||
3588          hasSameType(getFunctionTypeWithoutPtrSizes(T),
3589                      getFunctionTypeWithoutPtrSizes(U));
3590 }
3591 
adjustExceptionSpec(FunctionDecl * FD,const FunctionProtoType::ExceptionSpecInfo & ESI,bool AsWritten)3592 void ASTContext::adjustExceptionSpec(
3593     FunctionDecl *FD, const FunctionProtoType::ExceptionSpecInfo &ESI,
3594     bool AsWritten) {
3595   // Update the type.
3596   QualType Updated =
3597       getFunctionTypeWithExceptionSpec(FD->getType(), ESI);
3598   FD->setType(Updated);
3599 
3600   if (!AsWritten)
3601     return;
3602 
3603   // Update the type in the type source information too.
3604   if (TypeSourceInfo *TSInfo = FD->getTypeSourceInfo()) {
3605     // If the type and the type-as-written differ, we may need to update
3606     // the type-as-written too.
3607     if (TSInfo->getType() != FD->getType())
3608       Updated = getFunctionTypeWithExceptionSpec(TSInfo->getType(), ESI);
3609 
3610     // FIXME: When we get proper type location information for exceptions,
3611     // we'll also have to rebuild the TypeSourceInfo. For now, we just patch
3612     // up the TypeSourceInfo;
3613     assert(TypeLoc::getFullDataSizeForType(Updated) ==
3614                TypeLoc::getFullDataSizeForType(TSInfo->getType()) &&
3615            "TypeLoc size mismatch from updating exception specification");
3616     TSInfo->overrideType(Updated);
3617   }
3618 }
3619 
3620 /// getComplexType - Return the uniqued reference to the type for a complex
3621 /// number with the specified element type.
getComplexType(QualType T) const3622 QualType ASTContext::getComplexType(QualType T) const {
3623   // Unique pointers, to guarantee there is only one pointer of a particular
3624   // structure.
3625   llvm::FoldingSetNodeID ID;
3626   ComplexType::Profile(ID, T);
3627 
3628   void *InsertPos = nullptr;
3629   if (ComplexType *CT = ComplexTypes.FindNodeOrInsertPos(ID, InsertPos))
3630     return QualType(CT, 0);
3631 
3632   // If the pointee type isn't canonical, this won't be a canonical type either,
3633   // so fill in the canonical type field.
3634   QualType Canonical;
3635   if (!T.isCanonical()) {
3636     Canonical = getComplexType(getCanonicalType(T));
3637 
3638     // Get the new insert position for the node we care about.
3639     ComplexType *NewIP = ComplexTypes.FindNodeOrInsertPos(ID, InsertPos);
3640     assert(!NewIP && "Shouldn't be in the map!"); (void)NewIP;
3641   }
3642   auto *New = new (*this, alignof(ComplexType)) ComplexType(T, Canonical);
3643   Types.push_back(New);
3644   ComplexTypes.InsertNode(New, InsertPos);
3645   return QualType(New, 0);
3646 }
3647 
3648 /// getPointerType - Return the uniqued reference to the type for a pointer to
3649 /// the specified type.
getPointerType(QualType T) const3650 QualType ASTContext::getPointerType(QualType T) const {
3651   // Unique pointers, to guarantee there is only one pointer of a particular
3652   // structure.
3653   llvm::FoldingSetNodeID ID;
3654   PointerType::Profile(ID, T);
3655 
3656   void *InsertPos = nullptr;
3657   if (PointerType *PT = PointerTypes.FindNodeOrInsertPos(ID, InsertPos))
3658     return QualType(PT, 0);
3659 
3660   // If the pointee type isn't canonical, this won't be a canonical type either,
3661   // so fill in the canonical type field.
3662   QualType Canonical;
3663   if (!T.isCanonical()) {
3664     Canonical = getPointerType(getCanonicalType(T));
3665 
3666     // Get the new insert position for the node we care about.
3667     PointerType *NewIP = PointerTypes.FindNodeOrInsertPos(ID, InsertPos);
3668     assert(!NewIP && "Shouldn't be in the map!"); (void)NewIP;
3669   }
3670   auto *New = new (*this, alignof(PointerType)) PointerType(T, Canonical);
3671   Types.push_back(New);
3672   PointerTypes.InsertNode(New, InsertPos);
3673   return QualType(New, 0);
3674 }
3675 
getAdjustedType(QualType Orig,QualType New) const3676 QualType ASTContext::getAdjustedType(QualType Orig, QualType New) const {
3677   llvm::FoldingSetNodeID ID;
3678   AdjustedType::Profile(ID, Orig, New);
3679   void *InsertPos = nullptr;
3680   AdjustedType *AT = AdjustedTypes.FindNodeOrInsertPos(ID, InsertPos);
3681   if (AT)
3682     return QualType(AT, 0);
3683 
3684   QualType Canonical = getCanonicalType(New);
3685 
3686   // Get the new insert position for the node we care about.
3687   AT = AdjustedTypes.FindNodeOrInsertPos(ID, InsertPos);
3688   assert(!AT && "Shouldn't be in the map!");
3689 
3690   AT = new (*this, alignof(AdjustedType))
3691       AdjustedType(Type::Adjusted, Orig, New, Canonical);
3692   Types.push_back(AT);
3693   AdjustedTypes.InsertNode(AT, InsertPos);
3694   return QualType(AT, 0);
3695 }
3696 
getDecayedType(QualType Orig,QualType Decayed) const3697 QualType ASTContext::getDecayedType(QualType Orig, QualType Decayed) const {
3698   llvm::FoldingSetNodeID ID;
3699   AdjustedType::Profile(ID, Orig, Decayed);
3700   void *InsertPos = nullptr;
3701   AdjustedType *AT = AdjustedTypes.FindNodeOrInsertPos(ID, InsertPos);
3702   if (AT)
3703     return QualType(AT, 0);
3704 
3705   QualType Canonical = getCanonicalType(Decayed);
3706 
3707   // Get the new insert position for the node we care about.
3708   AT = AdjustedTypes.FindNodeOrInsertPos(ID, InsertPos);
3709   assert(!AT && "Shouldn't be in the map!");
3710 
3711   AT = new (*this, alignof(DecayedType)) DecayedType(Orig, Decayed, Canonical);
3712   Types.push_back(AT);
3713   AdjustedTypes.InsertNode(AT, InsertPos);
3714   return QualType(AT, 0);
3715 }
3716 
getDecayedType(QualType T) const3717 QualType ASTContext::getDecayedType(QualType T) const {
3718   assert((T->isArrayType() || T->isFunctionType()) && "T does not decay");
3719 
3720   QualType Decayed;
3721 
3722   // C99 6.7.5.3p7:
3723   //   A declaration of a parameter as "array of type" shall be
3724   //   adjusted to "qualified pointer to type", where the type
3725   //   qualifiers (if any) are those specified within the [ and ] of
3726   //   the array type derivation.
3727   if (T->isArrayType())
3728     Decayed = getArrayDecayedType(T);
3729 
3730   // C99 6.7.5.3p8:
3731   //   A declaration of a parameter as "function returning type"
3732   //   shall be adjusted to "pointer to function returning type", as
3733   //   in 6.3.2.1.
3734   if (T->isFunctionType())
3735     Decayed = getPointerType(T);
3736 
3737   return getDecayedType(T, Decayed);
3738 }
3739 
getArrayParameterType(QualType Ty) const3740 QualType ASTContext::getArrayParameterType(QualType Ty) const {
3741   if (Ty->isArrayParameterType())
3742     return Ty;
3743   assert(Ty->isConstantArrayType() && "Ty must be an array type.");
3744   const auto *ATy = cast<ConstantArrayType>(Ty);
3745   llvm::FoldingSetNodeID ID;
3746   ATy->Profile(ID, *this, ATy->getElementType(), ATy->getZExtSize(),
3747                ATy->getSizeExpr(), ATy->getSizeModifier(),
3748                ATy->getIndexTypeQualifiers().getAsOpaqueValue());
3749   void *InsertPos = nullptr;
3750   ArrayParameterType *AT =
3751       ArrayParameterTypes.FindNodeOrInsertPos(ID, InsertPos);
3752   if (AT)
3753     return QualType(AT, 0);
3754 
3755   QualType Canonical;
3756   if (!Ty.isCanonical()) {
3757     Canonical = getArrayParameterType(getCanonicalType(Ty));
3758 
3759     // Get the new insert position for the node we care about.
3760     AT = ArrayParameterTypes.FindNodeOrInsertPos(ID, InsertPos);
3761     assert(!AT && "Shouldn't be in the map!");
3762   }
3763 
3764   AT = new (*this, alignof(ArrayParameterType))
3765       ArrayParameterType(ATy, Canonical);
3766   Types.push_back(AT);
3767   ArrayParameterTypes.InsertNode(AT, InsertPos);
3768   return QualType(AT, 0);
3769 }
3770 
3771 /// getBlockPointerType - Return the uniqued reference to the type for
3772 /// a pointer to the specified block.
getBlockPointerType(QualType T) const3773 QualType ASTContext::getBlockPointerType(QualType T) const {
3774   assert(T->isFunctionType() && "block of function types only");
3775   // Unique pointers, to guarantee there is only one block of a particular
3776   // structure.
3777   llvm::FoldingSetNodeID ID;
3778   BlockPointerType::Profile(ID, T);
3779 
3780   void *InsertPos = nullptr;
3781   if (BlockPointerType *PT =
3782         BlockPointerTypes.FindNodeOrInsertPos(ID, InsertPos))
3783     return QualType(PT, 0);
3784 
3785   // If the block pointee type isn't canonical, this won't be a canonical
3786   // type either so fill in the canonical type field.
3787   QualType Canonical;
3788   if (!T.isCanonical()) {
3789     Canonical = getBlockPointerType(getCanonicalType(T));
3790 
3791     // Get the new insert position for the node we care about.
3792     BlockPointerType *NewIP =
3793       BlockPointerTypes.FindNodeOrInsertPos(ID, InsertPos);
3794     assert(!NewIP && "Shouldn't be in the map!"); (void)NewIP;
3795   }
3796   auto *New =
3797       new (*this, alignof(BlockPointerType)) BlockPointerType(T, Canonical);
3798   Types.push_back(New);
3799   BlockPointerTypes.InsertNode(New, InsertPos);
3800   return QualType(New, 0);
3801 }
3802 
3803 /// getLValueReferenceType - Return the uniqued reference to the type for an
3804 /// lvalue reference to the specified type.
3805 QualType
getLValueReferenceType(QualType T,bool SpelledAsLValue) const3806 ASTContext::getLValueReferenceType(QualType T, bool SpelledAsLValue) const {
3807   assert((!T->isPlaceholderType() ||
3808           T->isSpecificPlaceholderType(BuiltinType::UnknownAny)) &&
3809          "Unresolved placeholder type");
3810 
3811   // Unique pointers, to guarantee there is only one pointer of a particular
3812   // structure.
3813   llvm::FoldingSetNodeID ID;
3814   ReferenceType::Profile(ID, T, SpelledAsLValue);
3815 
3816   void *InsertPos = nullptr;
3817   if (LValueReferenceType *RT =
3818         LValueReferenceTypes.FindNodeOrInsertPos(ID, InsertPos))
3819     return QualType(RT, 0);
3820 
3821   const auto *InnerRef = T->getAs<ReferenceType>();
3822 
3823   // If the referencee type isn't canonical, this won't be a canonical type
3824   // either, so fill in the canonical type field.
3825   QualType Canonical;
3826   if (!SpelledAsLValue || InnerRef || !T.isCanonical()) {
3827     QualType PointeeType = (InnerRef ? InnerRef->getPointeeType() : T);
3828     Canonical = getLValueReferenceType(getCanonicalType(PointeeType));
3829 
3830     // Get the new insert position for the node we care about.
3831     LValueReferenceType *NewIP =
3832       LValueReferenceTypes.FindNodeOrInsertPos(ID, InsertPos);
3833     assert(!NewIP && "Shouldn't be in the map!"); (void)NewIP;
3834   }
3835 
3836   auto *New = new (*this, alignof(LValueReferenceType))
3837       LValueReferenceType(T, Canonical, SpelledAsLValue);
3838   Types.push_back(New);
3839   LValueReferenceTypes.InsertNode(New, InsertPos);
3840 
3841   return QualType(New, 0);
3842 }
3843 
3844 /// getRValueReferenceType - Return the uniqued reference to the type for an
3845 /// rvalue reference to the specified type.
getRValueReferenceType(QualType T) const3846 QualType ASTContext::getRValueReferenceType(QualType T) const {
3847   assert((!T->isPlaceholderType() ||
3848           T->isSpecificPlaceholderType(BuiltinType::UnknownAny)) &&
3849          "Unresolved placeholder type");
3850 
3851   // Unique pointers, to guarantee there is only one pointer of a particular
3852   // structure.
3853   llvm::FoldingSetNodeID ID;
3854   ReferenceType::Profile(ID, T, false);
3855 
3856   void *InsertPos = nullptr;
3857   if (RValueReferenceType *RT =
3858         RValueReferenceTypes.FindNodeOrInsertPos(ID, InsertPos))
3859     return QualType(RT, 0);
3860 
3861   const auto *InnerRef = T->getAs<ReferenceType>();
3862 
3863   // If the referencee type isn't canonical, this won't be a canonical type
3864   // either, so fill in the canonical type field.
3865   QualType Canonical;
3866   if (InnerRef || !T.isCanonical()) {
3867     QualType PointeeType = (InnerRef ? InnerRef->getPointeeType() : T);
3868     Canonical = getRValueReferenceType(getCanonicalType(PointeeType));
3869 
3870     // Get the new insert position for the node we care about.
3871     RValueReferenceType *NewIP =
3872       RValueReferenceTypes.FindNodeOrInsertPos(ID, InsertPos);
3873     assert(!NewIP && "Shouldn't be in the map!"); (void)NewIP;
3874   }
3875 
3876   auto *New = new (*this, alignof(RValueReferenceType))
3877       RValueReferenceType(T, Canonical);
3878   Types.push_back(New);
3879   RValueReferenceTypes.InsertNode(New, InsertPos);
3880   return QualType(New, 0);
3881 }
3882 
3883 /// getMemberPointerType - Return the uniqued reference to the type for a
3884 /// member pointer to the specified type, in the specified class.
getMemberPointerType(QualType T,const Type * Cls) const3885 QualType ASTContext::getMemberPointerType(QualType T, const Type *Cls) const {
3886   // Unique pointers, to guarantee there is only one pointer of a particular
3887   // structure.
3888   llvm::FoldingSetNodeID ID;
3889   MemberPointerType::Profile(ID, T, Cls);
3890 
3891   void *InsertPos = nullptr;
3892   if (MemberPointerType *PT =
3893       MemberPointerTypes.FindNodeOrInsertPos(ID, InsertPos))
3894     return QualType(PT, 0);
3895 
3896   // If the pointee or class type isn't canonical, this won't be a canonical
3897   // type either, so fill in the canonical type field.
3898   QualType Canonical;
3899   if (!T.isCanonical() || !Cls->isCanonicalUnqualified()) {
3900     Canonical = getMemberPointerType(getCanonicalType(T),getCanonicalType(Cls));
3901 
3902     // Get the new insert position for the node we care about.
3903     MemberPointerType *NewIP =
3904       MemberPointerTypes.FindNodeOrInsertPos(ID, InsertPos);
3905     assert(!NewIP && "Shouldn't be in the map!"); (void)NewIP;
3906   }
3907   auto *New = new (*this, alignof(MemberPointerType))
3908       MemberPointerType(T, Cls, Canonical);
3909   Types.push_back(New);
3910   MemberPointerTypes.InsertNode(New, InsertPos);
3911   return QualType(New, 0);
3912 }
3913 
3914 /// getConstantArrayType - Return the unique reference to the type for an
3915 /// array of the specified element type.
getConstantArrayType(QualType EltTy,const llvm::APInt & ArySizeIn,const Expr * SizeExpr,ArraySizeModifier ASM,unsigned IndexTypeQuals) const3916 QualType ASTContext::getConstantArrayType(QualType EltTy,
3917                                           const llvm::APInt &ArySizeIn,
3918                                           const Expr *SizeExpr,
3919                                           ArraySizeModifier ASM,
3920                                           unsigned IndexTypeQuals) const {
3921   assert((EltTy->isDependentType() ||
3922           EltTy->isIncompleteType() || EltTy->isConstantSizeType()) &&
3923          "Constant array of VLAs is illegal!");
3924 
3925   // We only need the size as part of the type if it's instantiation-dependent.
3926   if (SizeExpr && !SizeExpr->isInstantiationDependent())
3927     SizeExpr = nullptr;
3928 
3929   // Convert the array size into a canonical width matching the pointer size for
3930   // the target.
3931   llvm::APInt ArySize(ArySizeIn);
3932   ArySize = ArySize.zextOrTrunc(Target->getMaxPointerWidth());
3933 
3934   llvm::FoldingSetNodeID ID;
3935   ConstantArrayType::Profile(ID, *this, EltTy, ArySize.getZExtValue(), SizeExpr,
3936                              ASM, IndexTypeQuals);
3937 
3938   void *InsertPos = nullptr;
3939   if (ConstantArrayType *ATP =
3940       ConstantArrayTypes.FindNodeOrInsertPos(ID, InsertPos))
3941     return QualType(ATP, 0);
3942 
3943   // If the element type isn't canonical or has qualifiers, or the array bound
3944   // is instantiation-dependent, this won't be a canonical type either, so fill
3945   // in the canonical type field.
3946   QualType Canon;
3947   // FIXME: Check below should look for qualifiers behind sugar.
3948   if (!EltTy.isCanonical() || EltTy.hasLocalQualifiers() || SizeExpr) {
3949     SplitQualType canonSplit = getCanonicalType(EltTy).split();
3950     Canon = getConstantArrayType(QualType(canonSplit.Ty, 0), ArySize, nullptr,
3951                                  ASM, IndexTypeQuals);
3952     Canon = getQualifiedType(Canon, canonSplit.Quals);
3953 
3954     // Get the new insert position for the node we care about.
3955     ConstantArrayType *NewIP =
3956       ConstantArrayTypes.FindNodeOrInsertPos(ID, InsertPos);
3957     assert(!NewIP && "Shouldn't be in the map!"); (void)NewIP;
3958   }
3959 
3960   auto *New = ConstantArrayType::Create(*this, EltTy, Canon, ArySize, SizeExpr,
3961                                         ASM, IndexTypeQuals);
3962   ConstantArrayTypes.InsertNode(New, InsertPos);
3963   Types.push_back(New);
3964   return QualType(New, 0);
3965 }
3966 
3967 /// getVariableArrayDecayedType - Turns the given type, which may be
3968 /// variably-modified, into the corresponding type with all the known
3969 /// sizes replaced with [*].
getVariableArrayDecayedType(QualType type) const3970 QualType ASTContext::getVariableArrayDecayedType(QualType type) const {
3971   // Vastly most common case.
3972   if (!type->isVariablyModifiedType()) return type;
3973 
3974   QualType result;
3975 
3976   SplitQualType split = type.getSplitDesugaredType();
3977   const Type *ty = split.Ty;
3978   switch (ty->getTypeClass()) {
3979 #define TYPE(Class, Base)
3980 #define ABSTRACT_TYPE(Class, Base)
3981 #define NON_CANONICAL_TYPE(Class, Base) case Type::Class:
3982 #include "clang/AST/TypeNodes.inc"
3983     llvm_unreachable("didn't desugar past all non-canonical types?");
3984 
3985   // These types should never be variably-modified.
3986   case Type::Builtin:
3987   case Type::Complex:
3988   case Type::Vector:
3989   case Type::DependentVector:
3990   case Type::ExtVector:
3991   case Type::DependentSizedExtVector:
3992   case Type::ConstantMatrix:
3993   case Type::DependentSizedMatrix:
3994   case Type::DependentAddressSpace:
3995   case Type::ObjCObject:
3996   case Type::ObjCInterface:
3997   case Type::ObjCObjectPointer:
3998   case Type::Record:
3999   case Type::Enum:
4000   case Type::UnresolvedUsing:
4001   case Type::TypeOfExpr:
4002   case Type::TypeOf:
4003   case Type::Decltype:
4004   case Type::UnaryTransform:
4005   case Type::DependentName:
4006   case Type::InjectedClassName:
4007   case Type::TemplateSpecialization:
4008   case Type::DependentTemplateSpecialization:
4009   case Type::TemplateTypeParm:
4010   case Type::SubstTemplateTypeParmPack:
4011   case Type::Auto:
4012   case Type::DeducedTemplateSpecialization:
4013   case Type::PackExpansion:
4014   case Type::PackIndexing:
4015   case Type::BitInt:
4016   case Type::DependentBitInt:
4017   case Type::ArrayParameter:
4018     llvm_unreachable("type should never be variably-modified");
4019 
4020   // These types can be variably-modified but should never need to
4021   // further decay.
4022   case Type::FunctionNoProto:
4023   case Type::FunctionProto:
4024   case Type::BlockPointer:
4025   case Type::MemberPointer:
4026   case Type::Pipe:
4027     return type;
4028 
4029   // These types can be variably-modified.  All these modifications
4030   // preserve structure except as noted by comments.
4031   // TODO: if we ever care about optimizing VLAs, there are no-op
4032   // optimizations available here.
4033   case Type::Pointer:
4034     result = getPointerType(getVariableArrayDecayedType(
4035                               cast<PointerType>(ty)->getPointeeType()));
4036     break;
4037 
4038   case Type::LValueReference: {
4039     const auto *lv = cast<LValueReferenceType>(ty);
4040     result = getLValueReferenceType(
4041                  getVariableArrayDecayedType(lv->getPointeeType()),
4042                                     lv->isSpelledAsLValue());
4043     break;
4044   }
4045 
4046   case Type::RValueReference: {
4047     const auto *lv = cast<RValueReferenceType>(ty);
4048     result = getRValueReferenceType(
4049                  getVariableArrayDecayedType(lv->getPointeeType()));
4050     break;
4051   }
4052 
4053   case Type::Atomic: {
4054     const auto *at = cast<AtomicType>(ty);
4055     result = getAtomicType(getVariableArrayDecayedType(at->getValueType()));
4056     break;
4057   }
4058 
4059   case Type::ConstantArray: {
4060     const auto *cat = cast<ConstantArrayType>(ty);
4061     result = getConstantArrayType(
4062                  getVariableArrayDecayedType(cat->getElementType()),
4063                                   cat->getSize(),
4064                                   cat->getSizeExpr(),
4065                                   cat->getSizeModifier(),
4066                                   cat->getIndexTypeCVRQualifiers());
4067     break;
4068   }
4069 
4070   case Type::DependentSizedArray: {
4071     const auto *dat = cast<DependentSizedArrayType>(ty);
4072     result = getDependentSizedArrayType(
4073                  getVariableArrayDecayedType(dat->getElementType()),
4074                                         dat->getSizeExpr(),
4075                                         dat->getSizeModifier(),
4076                                         dat->getIndexTypeCVRQualifiers(),
4077                                         dat->getBracketsRange());
4078     break;
4079   }
4080 
4081   // Turn incomplete types into [*] types.
4082   case Type::IncompleteArray: {
4083     const auto *iat = cast<IncompleteArrayType>(ty);
4084     result =
4085         getVariableArrayType(getVariableArrayDecayedType(iat->getElementType()),
4086                              /*size*/ nullptr, ArraySizeModifier::Normal,
4087                              iat->getIndexTypeCVRQualifiers(), SourceRange());
4088     break;
4089   }
4090 
4091   // Turn VLA types into [*] types.
4092   case Type::VariableArray: {
4093     const auto *vat = cast<VariableArrayType>(ty);
4094     result = getVariableArrayType(
4095         getVariableArrayDecayedType(vat->getElementType()),
4096         /*size*/ nullptr, ArraySizeModifier::Star,
4097         vat->getIndexTypeCVRQualifiers(), vat->getBracketsRange());
4098     break;
4099   }
4100   }
4101 
4102   // Apply the top-level qualifiers from the original.
4103   return getQualifiedType(result, split.Quals);
4104 }
4105 
4106 /// getVariableArrayType - Returns a non-unique reference to the type for a
4107 /// variable array of the specified element type.
getVariableArrayType(QualType EltTy,Expr * NumElts,ArraySizeModifier ASM,unsigned IndexTypeQuals,SourceRange Brackets) const4108 QualType ASTContext::getVariableArrayType(QualType EltTy, Expr *NumElts,
4109                                           ArraySizeModifier ASM,
4110                                           unsigned IndexTypeQuals,
4111                                           SourceRange Brackets) const {
4112   // Since we don't unique expressions, it isn't possible to unique VLA's
4113   // that have an expression provided for their size.
4114   QualType Canon;
4115 
4116   // Be sure to pull qualifiers off the element type.
4117   // FIXME: Check below should look for qualifiers behind sugar.
4118   if (!EltTy.isCanonical() || EltTy.hasLocalQualifiers()) {
4119     SplitQualType canonSplit = getCanonicalType(EltTy).split();
4120     Canon = getVariableArrayType(QualType(canonSplit.Ty, 0), NumElts, ASM,
4121                                  IndexTypeQuals, Brackets);
4122     Canon = getQualifiedType(Canon, canonSplit.Quals);
4123   }
4124 
4125   auto *New = new (*this, alignof(VariableArrayType))
4126       VariableArrayType(EltTy, Canon, NumElts, ASM, IndexTypeQuals, Brackets);
4127 
4128   VariableArrayTypes.push_back(New);
4129   Types.push_back(New);
4130   return QualType(New, 0);
4131 }
4132 
4133 /// getDependentSizedArrayType - Returns a non-unique reference to
4134 /// the type for a dependently-sized array of the specified element
4135 /// type.
getDependentSizedArrayType(QualType elementType,Expr * numElements,ArraySizeModifier ASM,unsigned elementTypeQuals,SourceRange brackets) const4136 QualType ASTContext::getDependentSizedArrayType(QualType elementType,
4137                                                 Expr *numElements,
4138                                                 ArraySizeModifier ASM,
4139                                                 unsigned elementTypeQuals,
4140                                                 SourceRange brackets) const {
4141   assert((!numElements || numElements->isTypeDependent() ||
4142           numElements->isValueDependent()) &&
4143          "Size must be type- or value-dependent!");
4144 
4145   SplitQualType canonElementType = getCanonicalType(elementType).split();
4146 
4147   void *insertPos = nullptr;
4148   llvm::FoldingSetNodeID ID;
4149   DependentSizedArrayType::Profile(
4150       ID, *this, numElements ? QualType(canonElementType.Ty, 0) : elementType,
4151       ASM, elementTypeQuals, numElements);
4152 
4153   // Look for an existing type with these properties.
4154   DependentSizedArrayType *canonTy =
4155     DependentSizedArrayTypes.FindNodeOrInsertPos(ID, insertPos);
4156 
4157   // Dependently-sized array types that do not have a specified number
4158   // of elements will have their sizes deduced from a dependent
4159   // initializer.
4160   if (!numElements) {
4161     if (canonTy)
4162       return QualType(canonTy, 0);
4163 
4164     auto *newType = new (*this, alignof(DependentSizedArrayType))
4165         DependentSizedArrayType(elementType, QualType(), numElements, ASM,
4166                                 elementTypeQuals, brackets);
4167     DependentSizedArrayTypes.InsertNode(newType, insertPos);
4168     Types.push_back(newType);
4169     return QualType(newType, 0);
4170   }
4171 
4172   // If we don't have one, build one.
4173   if (!canonTy) {
4174     canonTy = new (*this, alignof(DependentSizedArrayType))
4175         DependentSizedArrayType(QualType(canonElementType.Ty, 0), QualType(),
4176                                 numElements, ASM, elementTypeQuals, brackets);
4177     DependentSizedArrayTypes.InsertNode(canonTy, insertPos);
4178     Types.push_back(canonTy);
4179   }
4180 
4181   // Apply qualifiers from the element type to the array.
4182   QualType canon = getQualifiedType(QualType(canonTy,0),
4183                                     canonElementType.Quals);
4184 
4185   // If we didn't need extra canonicalization for the element type or the size
4186   // expression, then just use that as our result.
4187   if (QualType(canonElementType.Ty, 0) == elementType &&
4188       canonTy->getSizeExpr() == numElements)
4189     return canon;
4190 
4191   // Otherwise, we need to build a type which follows the spelling
4192   // of the element type.
4193   auto *sugaredType = new (*this, alignof(DependentSizedArrayType))
4194       DependentSizedArrayType(elementType, canon, numElements, ASM,
4195                               elementTypeQuals, brackets);
4196   Types.push_back(sugaredType);
4197   return QualType(sugaredType, 0);
4198 }
4199 
getIncompleteArrayType(QualType elementType,ArraySizeModifier ASM,unsigned elementTypeQuals) const4200 QualType ASTContext::getIncompleteArrayType(QualType elementType,
4201                                             ArraySizeModifier ASM,
4202                                             unsigned elementTypeQuals) const {
4203   llvm::FoldingSetNodeID ID;
4204   IncompleteArrayType::Profile(ID, elementType, ASM, elementTypeQuals);
4205 
4206   void *insertPos = nullptr;
4207   if (IncompleteArrayType *iat =
4208        IncompleteArrayTypes.FindNodeOrInsertPos(ID, insertPos))
4209     return QualType(iat, 0);
4210 
4211   // If the element type isn't canonical, this won't be a canonical type
4212   // either, so fill in the canonical type field.  We also have to pull
4213   // qualifiers off the element type.
4214   QualType canon;
4215 
4216   // FIXME: Check below should look for qualifiers behind sugar.
4217   if (!elementType.isCanonical() || elementType.hasLocalQualifiers()) {
4218     SplitQualType canonSplit = getCanonicalType(elementType).split();
4219     canon = getIncompleteArrayType(QualType(canonSplit.Ty, 0),
4220                                    ASM, elementTypeQuals);
4221     canon = getQualifiedType(canon, canonSplit.Quals);
4222 
4223     // Get the new insert position for the node we care about.
4224     IncompleteArrayType *existing =
4225       IncompleteArrayTypes.FindNodeOrInsertPos(ID, insertPos);
4226     assert(!existing && "Shouldn't be in the map!"); (void) existing;
4227   }
4228 
4229   auto *newType = new (*this, alignof(IncompleteArrayType))
4230       IncompleteArrayType(elementType, canon, ASM, elementTypeQuals);
4231 
4232   IncompleteArrayTypes.InsertNode(newType, insertPos);
4233   Types.push_back(newType);
4234   return QualType(newType, 0);
4235 }
4236 
4237 ASTContext::BuiltinVectorTypeInfo
getBuiltinVectorTypeInfo(const BuiltinType * Ty) const4238 ASTContext::getBuiltinVectorTypeInfo(const BuiltinType *Ty) const {
4239 #define SVE_INT_ELTTY(BITS, ELTS, SIGNED, NUMVECTORS)                          \
4240   {getIntTypeForBitwidth(BITS, SIGNED), llvm::ElementCount::getScalable(ELTS), \
4241    NUMVECTORS};
4242 
4243 #define SVE_ELTTY(ELTTY, ELTS, NUMVECTORS)                                     \
4244   {ELTTY, llvm::ElementCount::getScalable(ELTS), NUMVECTORS};
4245 
4246   switch (Ty->getKind()) {
4247   default:
4248     llvm_unreachable("Unsupported builtin vector type");
4249   case BuiltinType::SveInt8:
4250     return SVE_INT_ELTTY(8, 16, true, 1);
4251   case BuiltinType::SveUint8:
4252     return SVE_INT_ELTTY(8, 16, false, 1);
4253   case BuiltinType::SveInt8x2:
4254     return SVE_INT_ELTTY(8, 16, true, 2);
4255   case BuiltinType::SveUint8x2:
4256     return SVE_INT_ELTTY(8, 16, false, 2);
4257   case BuiltinType::SveInt8x3:
4258     return SVE_INT_ELTTY(8, 16, true, 3);
4259   case BuiltinType::SveUint8x3:
4260     return SVE_INT_ELTTY(8, 16, false, 3);
4261   case BuiltinType::SveInt8x4:
4262     return SVE_INT_ELTTY(8, 16, true, 4);
4263   case BuiltinType::SveUint8x4:
4264     return SVE_INT_ELTTY(8, 16, false, 4);
4265   case BuiltinType::SveInt16:
4266     return SVE_INT_ELTTY(16, 8, true, 1);
4267   case BuiltinType::SveUint16:
4268     return SVE_INT_ELTTY(16, 8, false, 1);
4269   case BuiltinType::SveInt16x2:
4270     return SVE_INT_ELTTY(16, 8, true, 2);
4271   case BuiltinType::SveUint16x2:
4272     return SVE_INT_ELTTY(16, 8, false, 2);
4273   case BuiltinType::SveInt16x3:
4274     return SVE_INT_ELTTY(16, 8, true, 3);
4275   case BuiltinType::SveUint16x3:
4276     return SVE_INT_ELTTY(16, 8, false, 3);
4277   case BuiltinType::SveInt16x4:
4278     return SVE_INT_ELTTY(16, 8, true, 4);
4279   case BuiltinType::SveUint16x4:
4280     return SVE_INT_ELTTY(16, 8, false, 4);
4281   case BuiltinType::SveInt32:
4282     return SVE_INT_ELTTY(32, 4, true, 1);
4283   case BuiltinType::SveUint32:
4284     return SVE_INT_ELTTY(32, 4, false, 1);
4285   case BuiltinType::SveInt32x2:
4286     return SVE_INT_ELTTY(32, 4, true, 2);
4287   case BuiltinType::SveUint32x2:
4288     return SVE_INT_ELTTY(32, 4, false, 2);
4289   case BuiltinType::SveInt32x3:
4290     return SVE_INT_ELTTY(32, 4, true, 3);
4291   case BuiltinType::SveUint32x3:
4292     return SVE_INT_ELTTY(32, 4, false, 3);
4293   case BuiltinType::SveInt32x4:
4294     return SVE_INT_ELTTY(32, 4, true, 4);
4295   case BuiltinType::SveUint32x4:
4296     return SVE_INT_ELTTY(32, 4, false, 4);
4297   case BuiltinType::SveInt64:
4298     return SVE_INT_ELTTY(64, 2, true, 1);
4299   case BuiltinType::SveUint64:
4300     return SVE_INT_ELTTY(64, 2, false, 1);
4301   case BuiltinType::SveInt64x2:
4302     return SVE_INT_ELTTY(64, 2, true, 2);
4303   case BuiltinType::SveUint64x2:
4304     return SVE_INT_ELTTY(64, 2, false, 2);
4305   case BuiltinType::SveInt64x3:
4306     return SVE_INT_ELTTY(64, 2, true, 3);
4307   case BuiltinType::SveUint64x3:
4308     return SVE_INT_ELTTY(64, 2, false, 3);
4309   case BuiltinType::SveInt64x4:
4310     return SVE_INT_ELTTY(64, 2, true, 4);
4311   case BuiltinType::SveUint64x4:
4312     return SVE_INT_ELTTY(64, 2, false, 4);
4313   case BuiltinType::SveBool:
4314     return SVE_ELTTY(BoolTy, 16, 1);
4315   case BuiltinType::SveBoolx2:
4316     return SVE_ELTTY(BoolTy, 16, 2);
4317   case BuiltinType::SveBoolx4:
4318     return SVE_ELTTY(BoolTy, 16, 4);
4319   case BuiltinType::SveFloat16:
4320     return SVE_ELTTY(HalfTy, 8, 1);
4321   case BuiltinType::SveFloat16x2:
4322     return SVE_ELTTY(HalfTy, 8, 2);
4323   case BuiltinType::SveFloat16x3:
4324     return SVE_ELTTY(HalfTy, 8, 3);
4325   case BuiltinType::SveFloat16x4:
4326     return SVE_ELTTY(HalfTy, 8, 4);
4327   case BuiltinType::SveFloat32:
4328     return SVE_ELTTY(FloatTy, 4, 1);
4329   case BuiltinType::SveFloat32x2:
4330     return SVE_ELTTY(FloatTy, 4, 2);
4331   case BuiltinType::SveFloat32x3:
4332     return SVE_ELTTY(FloatTy, 4, 3);
4333   case BuiltinType::SveFloat32x4:
4334     return SVE_ELTTY(FloatTy, 4, 4);
4335   case BuiltinType::SveFloat64:
4336     return SVE_ELTTY(DoubleTy, 2, 1);
4337   case BuiltinType::SveFloat64x2:
4338     return SVE_ELTTY(DoubleTy, 2, 2);
4339   case BuiltinType::SveFloat64x3:
4340     return SVE_ELTTY(DoubleTy, 2, 3);
4341   case BuiltinType::SveFloat64x4:
4342     return SVE_ELTTY(DoubleTy, 2, 4);
4343   case BuiltinType::SveBFloat16:
4344     return SVE_ELTTY(BFloat16Ty, 8, 1);
4345   case BuiltinType::SveBFloat16x2:
4346     return SVE_ELTTY(BFloat16Ty, 8, 2);
4347   case BuiltinType::SveBFloat16x3:
4348     return SVE_ELTTY(BFloat16Ty, 8, 3);
4349   case BuiltinType::SveBFloat16x4:
4350     return SVE_ELTTY(BFloat16Ty, 8, 4);
4351 #define RVV_VECTOR_TYPE_INT(Name, Id, SingletonId, NumEls, ElBits, NF,         \
4352                             IsSigned)                                          \
4353   case BuiltinType::Id:                                                        \
4354     return {getIntTypeForBitwidth(ElBits, IsSigned),                           \
4355             llvm::ElementCount::getScalable(NumEls), NF};
4356 #define RVV_VECTOR_TYPE_FLOAT(Name, Id, SingletonId, NumEls, ElBits, NF)       \
4357   case BuiltinType::Id:                                                        \
4358     return {ElBits == 16 ? Float16Ty : (ElBits == 32 ? FloatTy : DoubleTy),    \
4359             llvm::ElementCount::getScalable(NumEls), NF};
4360 #define RVV_VECTOR_TYPE_BFLOAT(Name, Id, SingletonId, NumEls, ElBits, NF)      \
4361   case BuiltinType::Id:                                                        \
4362     return {BFloat16Ty, llvm::ElementCount::getScalable(NumEls), NF};
4363 #define RVV_PREDICATE_TYPE(Name, Id, SingletonId, NumEls)                      \
4364   case BuiltinType::Id:                                                        \
4365     return {BoolTy, llvm::ElementCount::getScalable(NumEls), 1};
4366 #include "clang/Basic/RISCVVTypes.def"
4367   }
4368 }
4369 
4370 /// getExternrefType - Return a WebAssembly externref type, which represents an
4371 /// opaque reference to a host value.
getWebAssemblyExternrefType() const4372 QualType ASTContext::getWebAssemblyExternrefType() const {
4373   if (Target->getTriple().isWasm() && Target->hasFeature("reference-types")) {
4374 #define WASM_REF_TYPE(Name, MangledName, Id, SingletonId, AS)                  \
4375   if (BuiltinType::Id == BuiltinType::WasmExternRef)                           \
4376     return SingletonId;
4377 #include "clang/Basic/WebAssemblyReferenceTypes.def"
4378   }
4379   llvm_unreachable(
4380       "shouldn't try to generate type externref outside WebAssembly target");
4381 }
4382 
4383 /// getScalableVectorType - Return the unique reference to a scalable vector
4384 /// type of the specified element type and size. VectorType must be a built-in
4385 /// type.
getScalableVectorType(QualType EltTy,unsigned NumElts,unsigned NumFields) const4386 QualType ASTContext::getScalableVectorType(QualType EltTy, unsigned NumElts,
4387                                            unsigned NumFields) const {
4388   if (Target->hasAArch64SVETypes()) {
4389     uint64_t EltTySize = getTypeSize(EltTy);
4390 #define SVE_VECTOR_TYPE(Name, MangledName, Id, SingletonId, NumEls, ElBits,    \
4391                         IsSigned, IsFP, IsBF)                                  \
4392   if (!EltTy->isBooleanType() &&                                               \
4393       ((EltTy->hasIntegerRepresentation() &&                                   \
4394         EltTy->hasSignedIntegerRepresentation() == IsSigned) ||                \
4395        (EltTy->hasFloatingRepresentation() && !EltTy->isBFloat16Type() &&      \
4396         IsFP && !IsBF) ||                                                      \
4397        (EltTy->hasFloatingRepresentation() && EltTy->isBFloat16Type() &&       \
4398         IsBF && !IsFP)) &&                                                     \
4399       EltTySize == ElBits && NumElts == NumEls) {                              \
4400     return SingletonId;                                                        \
4401   }
4402 #define SVE_PREDICATE_TYPE(Name, MangledName, Id, SingletonId, NumEls)         \
4403   if (EltTy->isBooleanType() && NumElts == NumEls)                             \
4404     return SingletonId;
4405 #define SVE_OPAQUE_TYPE(Name, MangledName, Id, SingleTonId)
4406 #include "clang/Basic/AArch64SVEACLETypes.def"
4407   } else if (Target->hasRISCVVTypes()) {
4408     uint64_t EltTySize = getTypeSize(EltTy);
4409 #define RVV_VECTOR_TYPE(Name, Id, SingletonId, NumEls, ElBits, NF, IsSigned,   \
4410                         IsFP, IsBF)                                            \
4411   if (!EltTy->isBooleanType() &&                                               \
4412       ((EltTy->hasIntegerRepresentation() &&                                   \
4413         EltTy->hasSignedIntegerRepresentation() == IsSigned) ||                \
4414        (EltTy->hasFloatingRepresentation() && !EltTy->isBFloat16Type() &&      \
4415         IsFP && !IsBF) ||                                                      \
4416        (EltTy->hasFloatingRepresentation() && EltTy->isBFloat16Type() &&       \
4417         IsBF && !IsFP)) &&                                                     \
4418       EltTySize == ElBits && NumElts == NumEls && NumFields == NF)             \
4419     return SingletonId;
4420 #define RVV_PREDICATE_TYPE(Name, Id, SingletonId, NumEls)                      \
4421   if (EltTy->isBooleanType() && NumElts == NumEls)                             \
4422     return SingletonId;
4423 #include "clang/Basic/RISCVVTypes.def"
4424   }
4425   return QualType();
4426 }
4427 
4428 /// getVectorType - Return the unique reference to a vector type of
4429 /// the specified element type and size. VectorType must be a built-in type.
getVectorType(QualType vecType,unsigned NumElts,VectorKind VecKind) const4430 QualType ASTContext::getVectorType(QualType vecType, unsigned NumElts,
4431                                    VectorKind VecKind) const {
4432   assert(vecType->isBuiltinType() ||
4433          (vecType->isBitIntType() &&
4434           // Only support _BitInt elements with byte-sized power of 2 NumBits.
4435           llvm::isPowerOf2_32(vecType->castAs<BitIntType>()->getNumBits()) &&
4436           vecType->castAs<BitIntType>()->getNumBits() >= 8));
4437 
4438   // Check if we've already instantiated a vector of this type.
4439   llvm::FoldingSetNodeID ID;
4440   VectorType::Profile(ID, vecType, NumElts, Type::Vector, VecKind);
4441 
4442   void *InsertPos = nullptr;
4443   if (VectorType *VTP = VectorTypes.FindNodeOrInsertPos(ID, InsertPos))
4444     return QualType(VTP, 0);
4445 
4446   // If the element type isn't canonical, this won't be a canonical type either,
4447   // so fill in the canonical type field.
4448   QualType Canonical;
4449   if (!vecType.isCanonical()) {
4450     Canonical = getVectorType(getCanonicalType(vecType), NumElts, VecKind);
4451 
4452     // Get the new insert position for the node we care about.
4453     VectorType *NewIP = VectorTypes.FindNodeOrInsertPos(ID, InsertPos);
4454     assert(!NewIP && "Shouldn't be in the map!"); (void)NewIP;
4455   }
4456   auto *New = new (*this, alignof(VectorType))
4457       VectorType(vecType, NumElts, Canonical, VecKind);
4458   VectorTypes.InsertNode(New, InsertPos);
4459   Types.push_back(New);
4460   return QualType(New, 0);
4461 }
4462 
getDependentVectorType(QualType VecType,Expr * SizeExpr,SourceLocation AttrLoc,VectorKind VecKind) const4463 QualType ASTContext::getDependentVectorType(QualType VecType, Expr *SizeExpr,
4464                                             SourceLocation AttrLoc,
4465                                             VectorKind VecKind) const {
4466   llvm::FoldingSetNodeID ID;
4467   DependentVectorType::Profile(ID, *this, getCanonicalType(VecType), SizeExpr,
4468                                VecKind);
4469   void *InsertPos = nullptr;
4470   DependentVectorType *Canon =
4471       DependentVectorTypes.FindNodeOrInsertPos(ID, InsertPos);
4472   DependentVectorType *New;
4473 
4474   if (Canon) {
4475     New = new (*this, alignof(DependentVectorType)) DependentVectorType(
4476         VecType, QualType(Canon, 0), SizeExpr, AttrLoc, VecKind);
4477   } else {
4478     QualType CanonVecTy = getCanonicalType(VecType);
4479     if (CanonVecTy == VecType) {
4480       New = new (*this, alignof(DependentVectorType))
4481           DependentVectorType(VecType, QualType(), SizeExpr, AttrLoc, VecKind);
4482 
4483       DependentVectorType *CanonCheck =
4484           DependentVectorTypes.FindNodeOrInsertPos(ID, InsertPos);
4485       assert(!CanonCheck &&
4486              "Dependent-sized vector_size canonical type broken");
4487       (void)CanonCheck;
4488       DependentVectorTypes.InsertNode(New, InsertPos);
4489     } else {
4490       QualType CanonTy = getDependentVectorType(CanonVecTy, SizeExpr,
4491                                                 SourceLocation(), VecKind);
4492       New = new (*this, alignof(DependentVectorType))
4493           DependentVectorType(VecType, CanonTy, SizeExpr, AttrLoc, VecKind);
4494     }
4495   }
4496 
4497   Types.push_back(New);
4498   return QualType(New, 0);
4499 }
4500 
4501 /// getExtVectorType - Return the unique reference to an extended vector type of
4502 /// the specified element type and size. VectorType must be a built-in type.
getExtVectorType(QualType vecType,unsigned NumElts) const4503 QualType ASTContext::getExtVectorType(QualType vecType,
4504                                       unsigned NumElts) const {
4505   assert(vecType->isBuiltinType() || vecType->isDependentType() ||
4506          (vecType->isBitIntType() &&
4507           // Only support _BitInt elements with byte-sized power of 2 NumBits.
4508           llvm::isPowerOf2_32(vecType->castAs<BitIntType>()->getNumBits()) &&
4509           vecType->castAs<BitIntType>()->getNumBits() >= 8));
4510 
4511   // Check if we've already instantiated a vector of this type.
4512   llvm::FoldingSetNodeID ID;
4513   VectorType::Profile(ID, vecType, NumElts, Type::ExtVector,
4514                       VectorKind::Generic);
4515   void *InsertPos = nullptr;
4516   if (VectorType *VTP = VectorTypes.FindNodeOrInsertPos(ID, InsertPos))
4517     return QualType(VTP, 0);
4518 
4519   // If the element type isn't canonical, this won't be a canonical type either,
4520   // so fill in the canonical type field.
4521   QualType Canonical;
4522   if (!vecType.isCanonical()) {
4523     Canonical = getExtVectorType(getCanonicalType(vecType), NumElts);
4524 
4525     // Get the new insert position for the node we care about.
4526     VectorType *NewIP = VectorTypes.FindNodeOrInsertPos(ID, InsertPos);
4527     assert(!NewIP && "Shouldn't be in the map!"); (void)NewIP;
4528   }
4529   auto *New = new (*this, alignof(ExtVectorType))
4530       ExtVectorType(vecType, NumElts, Canonical);
4531   VectorTypes.InsertNode(New, InsertPos);
4532   Types.push_back(New);
4533   return QualType(New, 0);
4534 }
4535 
4536 QualType
getDependentSizedExtVectorType(QualType vecType,Expr * SizeExpr,SourceLocation AttrLoc) const4537 ASTContext::getDependentSizedExtVectorType(QualType vecType,
4538                                            Expr *SizeExpr,
4539                                            SourceLocation AttrLoc) const {
4540   llvm::FoldingSetNodeID ID;
4541   DependentSizedExtVectorType::Profile(ID, *this, getCanonicalType(vecType),
4542                                        SizeExpr);
4543 
4544   void *InsertPos = nullptr;
4545   DependentSizedExtVectorType *Canon
4546     = DependentSizedExtVectorTypes.FindNodeOrInsertPos(ID, InsertPos);
4547   DependentSizedExtVectorType *New;
4548   if (Canon) {
4549     // We already have a canonical version of this array type; use it as
4550     // the canonical type for a newly-built type.
4551     New = new (*this, alignof(DependentSizedExtVectorType))
4552         DependentSizedExtVectorType(vecType, QualType(Canon, 0), SizeExpr,
4553                                     AttrLoc);
4554   } else {
4555     QualType CanonVecTy = getCanonicalType(vecType);
4556     if (CanonVecTy == vecType) {
4557       New = new (*this, alignof(DependentSizedExtVectorType))
4558           DependentSizedExtVectorType(vecType, QualType(), SizeExpr, AttrLoc);
4559 
4560       DependentSizedExtVectorType *CanonCheck
4561         = DependentSizedExtVectorTypes.FindNodeOrInsertPos(ID, InsertPos);
4562       assert(!CanonCheck && "Dependent-sized ext_vector canonical type broken");
4563       (void)CanonCheck;
4564       DependentSizedExtVectorTypes.InsertNode(New, InsertPos);
4565     } else {
4566       QualType CanonExtTy = getDependentSizedExtVectorType(CanonVecTy, SizeExpr,
4567                                                            SourceLocation());
4568       New = new (*this, alignof(DependentSizedExtVectorType))
4569           DependentSizedExtVectorType(vecType, CanonExtTy, SizeExpr, AttrLoc);
4570     }
4571   }
4572 
4573   Types.push_back(New);
4574   return QualType(New, 0);
4575 }
4576 
getConstantMatrixType(QualType ElementTy,unsigned NumRows,unsigned NumColumns) const4577 QualType ASTContext::getConstantMatrixType(QualType ElementTy, unsigned NumRows,
4578                                            unsigned NumColumns) const {
4579   llvm::FoldingSetNodeID ID;
4580   ConstantMatrixType::Profile(ID, ElementTy, NumRows, NumColumns,
4581                               Type::ConstantMatrix);
4582 
4583   assert(MatrixType::isValidElementType(ElementTy) &&
4584          "need a valid element type");
4585   assert(ConstantMatrixType::isDimensionValid(NumRows) &&
4586          ConstantMatrixType::isDimensionValid(NumColumns) &&
4587          "need valid matrix dimensions");
4588   void *InsertPos = nullptr;
4589   if (ConstantMatrixType *MTP = MatrixTypes.FindNodeOrInsertPos(ID, InsertPos))
4590     return QualType(MTP, 0);
4591 
4592   QualType Canonical;
4593   if (!ElementTy.isCanonical()) {
4594     Canonical =
4595         getConstantMatrixType(getCanonicalType(ElementTy), NumRows, NumColumns);
4596 
4597     ConstantMatrixType *NewIP = MatrixTypes.FindNodeOrInsertPos(ID, InsertPos);
4598     assert(!NewIP && "Matrix type shouldn't already exist in the map");
4599     (void)NewIP;
4600   }
4601 
4602   auto *New = new (*this, alignof(ConstantMatrixType))
4603       ConstantMatrixType(ElementTy, NumRows, NumColumns, Canonical);
4604   MatrixTypes.InsertNode(New, InsertPos);
4605   Types.push_back(New);
4606   return QualType(New, 0);
4607 }
4608 
getDependentSizedMatrixType(QualType ElementTy,Expr * RowExpr,Expr * ColumnExpr,SourceLocation AttrLoc) const4609 QualType ASTContext::getDependentSizedMatrixType(QualType ElementTy,
4610                                                  Expr *RowExpr,
4611                                                  Expr *ColumnExpr,
4612                                                  SourceLocation AttrLoc) const {
4613   QualType CanonElementTy = getCanonicalType(ElementTy);
4614   llvm::FoldingSetNodeID ID;
4615   DependentSizedMatrixType::Profile(ID, *this, CanonElementTy, RowExpr,
4616                                     ColumnExpr);
4617 
4618   void *InsertPos = nullptr;
4619   DependentSizedMatrixType *Canon =
4620       DependentSizedMatrixTypes.FindNodeOrInsertPos(ID, InsertPos);
4621 
4622   if (!Canon) {
4623     Canon = new (*this, alignof(DependentSizedMatrixType))
4624         DependentSizedMatrixType(CanonElementTy, QualType(), RowExpr,
4625                                  ColumnExpr, AttrLoc);
4626 #ifndef NDEBUG
4627     DependentSizedMatrixType *CanonCheck =
4628         DependentSizedMatrixTypes.FindNodeOrInsertPos(ID, InsertPos);
4629     assert(!CanonCheck && "Dependent-sized matrix canonical type broken");
4630 #endif
4631     DependentSizedMatrixTypes.InsertNode(Canon, InsertPos);
4632     Types.push_back(Canon);
4633   }
4634 
4635   // Already have a canonical version of the matrix type
4636   //
4637   // If it exactly matches the requested type, use it directly.
4638   if (Canon->getElementType() == ElementTy && Canon->getRowExpr() == RowExpr &&
4639       Canon->getRowExpr() == ColumnExpr)
4640     return QualType(Canon, 0);
4641 
4642   // Use Canon as the canonical type for newly-built type.
4643   DependentSizedMatrixType *New = new (*this, alignof(DependentSizedMatrixType))
4644       DependentSizedMatrixType(ElementTy, QualType(Canon, 0), RowExpr,
4645                                ColumnExpr, AttrLoc);
4646   Types.push_back(New);
4647   return QualType(New, 0);
4648 }
4649 
getDependentAddressSpaceType(QualType PointeeType,Expr * AddrSpaceExpr,SourceLocation AttrLoc) const4650 QualType ASTContext::getDependentAddressSpaceType(QualType PointeeType,
4651                                                   Expr *AddrSpaceExpr,
4652                                                   SourceLocation AttrLoc) const {
4653   assert(AddrSpaceExpr->isInstantiationDependent());
4654 
4655   QualType canonPointeeType = getCanonicalType(PointeeType);
4656 
4657   void *insertPos = nullptr;
4658   llvm::FoldingSetNodeID ID;
4659   DependentAddressSpaceType::Profile(ID, *this, canonPointeeType,
4660                                      AddrSpaceExpr);
4661 
4662   DependentAddressSpaceType *canonTy =
4663     DependentAddressSpaceTypes.FindNodeOrInsertPos(ID, insertPos);
4664 
4665   if (!canonTy) {
4666     canonTy = new (*this, alignof(DependentAddressSpaceType))
4667         DependentAddressSpaceType(canonPointeeType, QualType(), AddrSpaceExpr,
4668                                   AttrLoc);
4669     DependentAddressSpaceTypes.InsertNode(canonTy, insertPos);
4670     Types.push_back(canonTy);
4671   }
4672 
4673   if (canonPointeeType == PointeeType &&
4674       canonTy->getAddrSpaceExpr() == AddrSpaceExpr)
4675     return QualType(canonTy, 0);
4676 
4677   auto *sugaredType = new (*this, alignof(DependentAddressSpaceType))
4678       DependentAddressSpaceType(PointeeType, QualType(canonTy, 0),
4679                                 AddrSpaceExpr, AttrLoc);
4680   Types.push_back(sugaredType);
4681   return QualType(sugaredType, 0);
4682 }
4683 
4684 /// Determine whether \p T is canonical as the result type of a function.
isCanonicalResultType(QualType T)4685 static bool isCanonicalResultType(QualType T) {
4686   return T.isCanonical() &&
4687          (T.getObjCLifetime() == Qualifiers::OCL_None ||
4688           T.getObjCLifetime() == Qualifiers::OCL_ExplicitNone);
4689 }
4690 
4691 /// getFunctionNoProtoType - Return a K&R style C function type like 'int()'.
4692 QualType
getFunctionNoProtoType(QualType ResultTy,const FunctionType::ExtInfo & Info) const4693 ASTContext::getFunctionNoProtoType(QualType ResultTy,
4694                                    const FunctionType::ExtInfo &Info) const {
4695   // FIXME: This assertion cannot be enabled (yet) because the ObjC rewriter
4696   // functionality creates a function without a prototype regardless of
4697   // language mode (so it makes them even in C++). Once the rewriter has been
4698   // fixed, this assertion can be enabled again.
4699   //assert(!LangOpts.requiresStrictPrototypes() &&
4700   //       "strict prototypes are disabled");
4701 
4702   // Unique functions, to guarantee there is only one function of a particular
4703   // structure.
4704   llvm::FoldingSetNodeID ID;
4705   FunctionNoProtoType::Profile(ID, ResultTy, Info);
4706 
4707   void *InsertPos = nullptr;
4708   if (FunctionNoProtoType *FT =
4709         FunctionNoProtoTypes.FindNodeOrInsertPos(ID, InsertPos))
4710     return QualType(FT, 0);
4711 
4712   QualType Canonical;
4713   if (!isCanonicalResultType(ResultTy)) {
4714     Canonical =
4715       getFunctionNoProtoType(getCanonicalFunctionResultType(ResultTy), Info);
4716 
4717     // Get the new insert position for the node we care about.
4718     FunctionNoProtoType *NewIP =
4719       FunctionNoProtoTypes.FindNodeOrInsertPos(ID, InsertPos);
4720     assert(!NewIP && "Shouldn't be in the map!"); (void)NewIP;
4721   }
4722 
4723   auto *New = new (*this, alignof(FunctionNoProtoType))
4724       FunctionNoProtoType(ResultTy, Canonical, Info);
4725   Types.push_back(New);
4726   FunctionNoProtoTypes.InsertNode(New, InsertPos);
4727   return QualType(New, 0);
4728 }
4729 
4730 CanQualType
getCanonicalFunctionResultType(QualType ResultType) const4731 ASTContext::getCanonicalFunctionResultType(QualType ResultType) const {
4732   CanQualType CanResultType = getCanonicalType(ResultType);
4733 
4734   // Canonical result types do not have ARC lifetime qualifiers.
4735   if (CanResultType.getQualifiers().hasObjCLifetime()) {
4736     Qualifiers Qs = CanResultType.getQualifiers();
4737     Qs.removeObjCLifetime();
4738     return CanQualType::CreateUnsafe(
4739              getQualifiedType(CanResultType.getUnqualifiedType(), Qs));
4740   }
4741 
4742   return CanResultType;
4743 }
4744 
isCanonicalExceptionSpecification(const FunctionProtoType::ExceptionSpecInfo & ESI,bool NoexceptInType)4745 static bool isCanonicalExceptionSpecification(
4746     const FunctionProtoType::ExceptionSpecInfo &ESI, bool NoexceptInType) {
4747   if (ESI.Type == EST_None)
4748     return true;
4749   if (!NoexceptInType)
4750     return false;
4751 
4752   // C++17 onwards: exception specification is part of the type, as a simple
4753   // boolean "can this function type throw".
4754   if (ESI.Type == EST_BasicNoexcept)
4755     return true;
4756 
4757   // A noexcept(expr) specification is (possibly) canonical if expr is
4758   // value-dependent.
4759   if (ESI.Type == EST_DependentNoexcept)
4760     return true;
4761 
4762   // A dynamic exception specification is canonical if it only contains pack
4763   // expansions (so we can't tell whether it's non-throwing) and all its
4764   // contained types are canonical.
4765   if (ESI.Type == EST_Dynamic) {
4766     bool AnyPackExpansions = false;
4767     for (QualType ET : ESI.Exceptions) {
4768       if (!ET.isCanonical())
4769         return false;
4770       if (ET->getAs<PackExpansionType>())
4771         AnyPackExpansions = true;
4772     }
4773     return AnyPackExpansions;
4774   }
4775 
4776   return false;
4777 }
4778 
getFunctionTypeInternal(QualType ResultTy,ArrayRef<QualType> ArgArray,const FunctionProtoType::ExtProtoInfo & EPI,bool OnlyWantCanonical) const4779 QualType ASTContext::getFunctionTypeInternal(
4780     QualType ResultTy, ArrayRef<QualType> ArgArray,
4781     const FunctionProtoType::ExtProtoInfo &EPI, bool OnlyWantCanonical) const {
4782   size_t NumArgs = ArgArray.size();
4783 
4784   // Unique functions, to guarantee there is only one function of a particular
4785   // structure.
4786   llvm::FoldingSetNodeID ID;
4787   FunctionProtoType::Profile(ID, ResultTy, ArgArray.begin(), NumArgs, EPI,
4788                              *this, true);
4789 
4790   QualType Canonical;
4791   bool Unique = false;
4792 
4793   void *InsertPos = nullptr;
4794   if (FunctionProtoType *FPT =
4795         FunctionProtoTypes.FindNodeOrInsertPos(ID, InsertPos)) {
4796     QualType Existing = QualType(FPT, 0);
4797 
4798     // If we find a pre-existing equivalent FunctionProtoType, we can just reuse
4799     // it so long as our exception specification doesn't contain a dependent
4800     // noexcept expression, or we're just looking for a canonical type.
4801     // Otherwise, we're going to need to create a type
4802     // sugar node to hold the concrete expression.
4803     if (OnlyWantCanonical || !isComputedNoexcept(EPI.ExceptionSpec.Type) ||
4804         EPI.ExceptionSpec.NoexceptExpr == FPT->getNoexceptExpr())
4805       return Existing;
4806 
4807     // We need a new type sugar node for this one, to hold the new noexcept
4808     // expression. We do no canonicalization here, but that's OK since we don't
4809     // expect to see the same noexcept expression much more than once.
4810     Canonical = getCanonicalType(Existing);
4811     Unique = true;
4812   }
4813 
4814   bool NoexceptInType = getLangOpts().CPlusPlus17;
4815   bool IsCanonicalExceptionSpec =
4816       isCanonicalExceptionSpecification(EPI.ExceptionSpec, NoexceptInType);
4817 
4818   // Determine whether the type being created is already canonical or not.
4819   bool isCanonical = !Unique && IsCanonicalExceptionSpec &&
4820                      isCanonicalResultType(ResultTy) && !EPI.HasTrailingReturn;
4821   for (unsigned i = 0; i != NumArgs && isCanonical; ++i)
4822     if (!ArgArray[i].isCanonicalAsParam())
4823       isCanonical = false;
4824 
4825   if (OnlyWantCanonical)
4826     assert(isCanonical &&
4827            "given non-canonical parameters constructing canonical type");
4828 
4829   // If this type isn't canonical, get the canonical version of it if we don't
4830   // already have it. The exception spec is only partially part of the
4831   // canonical type, and only in C++17 onwards.
4832   if (!isCanonical && Canonical.isNull()) {
4833     SmallVector<QualType, 16> CanonicalArgs;
4834     CanonicalArgs.reserve(NumArgs);
4835     for (unsigned i = 0; i != NumArgs; ++i)
4836       CanonicalArgs.push_back(getCanonicalParamType(ArgArray[i]));
4837 
4838     llvm::SmallVector<QualType, 8> ExceptionTypeStorage;
4839     FunctionProtoType::ExtProtoInfo CanonicalEPI = EPI;
4840     CanonicalEPI.HasTrailingReturn = false;
4841 
4842     if (IsCanonicalExceptionSpec) {
4843       // Exception spec is already OK.
4844     } else if (NoexceptInType) {
4845       switch (EPI.ExceptionSpec.Type) {
4846       case EST_Unparsed: case EST_Unevaluated: case EST_Uninstantiated:
4847         // We don't know yet. It shouldn't matter what we pick here; no-one
4848         // should ever look at this.
4849         [[fallthrough]];
4850       case EST_None: case EST_MSAny: case EST_NoexceptFalse:
4851         CanonicalEPI.ExceptionSpec.Type = EST_None;
4852         break;
4853 
4854         // A dynamic exception specification is almost always "not noexcept",
4855         // with the exception that a pack expansion might expand to no types.
4856       case EST_Dynamic: {
4857         bool AnyPacks = false;
4858         for (QualType ET : EPI.ExceptionSpec.Exceptions) {
4859           if (ET->getAs<PackExpansionType>())
4860             AnyPacks = true;
4861           ExceptionTypeStorage.push_back(getCanonicalType(ET));
4862         }
4863         if (!AnyPacks)
4864           CanonicalEPI.ExceptionSpec.Type = EST_None;
4865         else {
4866           CanonicalEPI.ExceptionSpec.Type = EST_Dynamic;
4867           CanonicalEPI.ExceptionSpec.Exceptions = ExceptionTypeStorage;
4868         }
4869         break;
4870       }
4871 
4872       case EST_DynamicNone:
4873       case EST_BasicNoexcept:
4874       case EST_NoexceptTrue:
4875       case EST_NoThrow:
4876         CanonicalEPI.ExceptionSpec.Type = EST_BasicNoexcept;
4877         break;
4878 
4879       case EST_DependentNoexcept:
4880         llvm_unreachable("dependent noexcept is already canonical");
4881       }
4882     } else {
4883       CanonicalEPI.ExceptionSpec = FunctionProtoType::ExceptionSpecInfo();
4884     }
4885 
4886     // Adjust the canonical function result type.
4887     CanQualType CanResultTy = getCanonicalFunctionResultType(ResultTy);
4888     Canonical =
4889         getFunctionTypeInternal(CanResultTy, CanonicalArgs, CanonicalEPI, true);
4890 
4891     // Get the new insert position for the node we care about.
4892     FunctionProtoType *NewIP =
4893       FunctionProtoTypes.FindNodeOrInsertPos(ID, InsertPos);
4894     assert(!NewIP && "Shouldn't be in the map!"); (void)NewIP;
4895   }
4896 
4897   // Compute the needed size to hold this FunctionProtoType and the
4898   // various trailing objects.
4899   auto ESH = FunctionProtoType::getExceptionSpecSize(
4900       EPI.ExceptionSpec.Type, EPI.ExceptionSpec.Exceptions.size());
4901   size_t Size = FunctionProtoType::totalSizeToAlloc<
4902       QualType, SourceLocation, FunctionType::FunctionTypeExtraBitfields,
4903       FunctionType::FunctionTypeArmAttributes, FunctionType::ExceptionType,
4904       Expr *, FunctionDecl *, FunctionProtoType::ExtParameterInfo, Qualifiers,
4905       FunctionEffect, EffectConditionExpr>(
4906       NumArgs, EPI.Variadic, EPI.requiresFunctionProtoTypeExtraBitfields(),
4907       EPI.requiresFunctionProtoTypeArmAttributes(), ESH.NumExceptionType,
4908       ESH.NumExprPtr, ESH.NumFunctionDeclPtr,
4909       EPI.ExtParameterInfos ? NumArgs : 0,
4910       EPI.TypeQuals.hasNonFastQualifiers() ? 1 : 0, EPI.FunctionEffects.size(),
4911       EPI.FunctionEffects.conditions().size());
4912 
4913   auto *FTP = (FunctionProtoType *)Allocate(Size, alignof(FunctionProtoType));
4914   FunctionProtoType::ExtProtoInfo newEPI = EPI;
4915   new (FTP) FunctionProtoType(ResultTy, ArgArray, Canonical, newEPI);
4916   Types.push_back(FTP);
4917   if (!Unique)
4918     FunctionProtoTypes.InsertNode(FTP, InsertPos);
4919   if (!EPI.FunctionEffects.empty())
4920     AnyFunctionEffects = true;
4921   return QualType(FTP, 0);
4922 }
4923 
getPipeType(QualType T,bool ReadOnly) const4924 QualType ASTContext::getPipeType(QualType T, bool ReadOnly) const {
4925   llvm::FoldingSetNodeID ID;
4926   PipeType::Profile(ID, T, ReadOnly);
4927 
4928   void *InsertPos = nullptr;
4929   if (PipeType *PT = PipeTypes.FindNodeOrInsertPos(ID, InsertPos))
4930     return QualType(PT, 0);
4931 
4932   // If the pipe element type isn't canonical, this won't be a canonical type
4933   // either, so fill in the canonical type field.
4934   QualType Canonical;
4935   if (!T.isCanonical()) {
4936     Canonical = getPipeType(getCanonicalType(T), ReadOnly);
4937 
4938     // Get the new insert position for the node we care about.
4939     PipeType *NewIP = PipeTypes.FindNodeOrInsertPos(ID, InsertPos);
4940     assert(!NewIP && "Shouldn't be in the map!");
4941     (void)NewIP;
4942   }
4943   auto *New = new (*this, alignof(PipeType)) PipeType(T, Canonical, ReadOnly);
4944   Types.push_back(New);
4945   PipeTypes.InsertNode(New, InsertPos);
4946   return QualType(New, 0);
4947 }
4948 
adjustStringLiteralBaseType(QualType Ty) const4949 QualType ASTContext::adjustStringLiteralBaseType(QualType Ty) const {
4950   // OpenCL v1.1 s6.5.3: a string literal is in the constant address space.
4951   return LangOpts.OpenCL ? getAddrSpaceQualType(Ty, LangAS::opencl_constant)
4952                          : Ty;
4953 }
4954 
getReadPipeType(QualType T) const4955 QualType ASTContext::getReadPipeType(QualType T) const {
4956   return getPipeType(T, true);
4957 }
4958 
getWritePipeType(QualType T) const4959 QualType ASTContext::getWritePipeType(QualType T) const {
4960   return getPipeType(T, false);
4961 }
4962 
getBitIntType(bool IsUnsigned,unsigned NumBits) const4963 QualType ASTContext::getBitIntType(bool IsUnsigned, unsigned NumBits) const {
4964   llvm::FoldingSetNodeID ID;
4965   BitIntType::Profile(ID, IsUnsigned, NumBits);
4966 
4967   void *InsertPos = nullptr;
4968   if (BitIntType *EIT = BitIntTypes.FindNodeOrInsertPos(ID, InsertPos))
4969     return QualType(EIT, 0);
4970 
4971   auto *New = new (*this, alignof(BitIntType)) BitIntType(IsUnsigned, NumBits);
4972   BitIntTypes.InsertNode(New, InsertPos);
4973   Types.push_back(New);
4974   return QualType(New, 0);
4975 }
4976 
getDependentBitIntType(bool IsUnsigned,Expr * NumBitsExpr) const4977 QualType ASTContext::getDependentBitIntType(bool IsUnsigned,
4978                                             Expr *NumBitsExpr) const {
4979   assert(NumBitsExpr->isInstantiationDependent() && "Only good for dependent");
4980   llvm::FoldingSetNodeID ID;
4981   DependentBitIntType::Profile(ID, *this, IsUnsigned, NumBitsExpr);
4982 
4983   void *InsertPos = nullptr;
4984   if (DependentBitIntType *Existing =
4985           DependentBitIntTypes.FindNodeOrInsertPos(ID, InsertPos))
4986     return QualType(Existing, 0);
4987 
4988   auto *New = new (*this, alignof(DependentBitIntType))
4989       DependentBitIntType(IsUnsigned, NumBitsExpr);
4990   DependentBitIntTypes.InsertNode(New, InsertPos);
4991 
4992   Types.push_back(New);
4993   return QualType(New, 0);
4994 }
4995 
4996 #ifndef NDEBUG
NeedsInjectedClassNameType(const RecordDecl * D)4997 static bool NeedsInjectedClassNameType(const RecordDecl *D) {
4998   if (!isa<CXXRecordDecl>(D)) return false;
4999   const auto *RD = cast<CXXRecordDecl>(D);
5000   if (isa<ClassTemplatePartialSpecializationDecl>(RD))
5001     return true;
5002   if (RD->getDescribedClassTemplate() &&
5003       !isa<ClassTemplateSpecializationDecl>(RD))
5004     return true;
5005   return false;
5006 }
5007 #endif
5008 
5009 /// getInjectedClassNameType - Return the unique reference to the
5010 /// injected class name type for the specified templated declaration.
getInjectedClassNameType(CXXRecordDecl * Decl,QualType TST) const5011 QualType ASTContext::getInjectedClassNameType(CXXRecordDecl *Decl,
5012                                               QualType TST) const {
5013   assert(NeedsInjectedClassNameType(Decl));
5014   if (Decl->TypeForDecl) {
5015     assert(isa<InjectedClassNameType>(Decl->TypeForDecl));
5016   } else if (CXXRecordDecl *PrevDecl = Decl->getPreviousDecl()) {
5017     assert(PrevDecl->TypeForDecl && "previous declaration has no type");
5018     Decl->TypeForDecl = PrevDecl->TypeForDecl;
5019     assert(isa<InjectedClassNameType>(Decl->TypeForDecl));
5020   } else {
5021     Type *newType = new (*this, alignof(InjectedClassNameType))
5022         InjectedClassNameType(Decl, TST);
5023     Decl->TypeForDecl = newType;
5024     Types.push_back(newType);
5025   }
5026   return QualType(Decl->TypeForDecl, 0);
5027 }
5028 
5029 /// getTypeDeclType - Return the unique reference to the type for the
5030 /// specified type declaration.
getTypeDeclTypeSlow(const TypeDecl * Decl) const5031 QualType ASTContext::getTypeDeclTypeSlow(const TypeDecl *Decl) const {
5032   assert(Decl && "Passed null for Decl param");
5033   assert(!Decl->TypeForDecl && "TypeForDecl present in slow case");
5034 
5035   if (const auto *Typedef = dyn_cast<TypedefNameDecl>(Decl))
5036     return getTypedefType(Typedef);
5037 
5038   assert(!isa<TemplateTypeParmDecl>(Decl) &&
5039          "Template type parameter types are always available.");
5040 
5041   if (const auto *Record = dyn_cast<RecordDecl>(Decl)) {
5042     assert(Record->isFirstDecl() && "struct/union has previous declaration");
5043     assert(!NeedsInjectedClassNameType(Record));
5044     return getRecordType(Record);
5045   } else if (const auto *Enum = dyn_cast<EnumDecl>(Decl)) {
5046     assert(Enum->isFirstDecl() && "enum has previous declaration");
5047     return getEnumType(Enum);
5048   } else if (const auto *Using = dyn_cast<UnresolvedUsingTypenameDecl>(Decl)) {
5049     return getUnresolvedUsingType(Using);
5050   } else
5051     llvm_unreachable("TypeDecl without a type?");
5052 
5053   return QualType(Decl->TypeForDecl, 0);
5054 }
5055 
5056 /// getTypedefType - Return the unique reference to the type for the
5057 /// specified typedef name decl.
getTypedefType(const TypedefNameDecl * Decl,QualType Underlying) const5058 QualType ASTContext::getTypedefType(const TypedefNameDecl *Decl,
5059                                     QualType Underlying) const {
5060   if (!Decl->TypeForDecl) {
5061     if (Underlying.isNull())
5062       Underlying = Decl->getUnderlyingType();
5063     auto *NewType = new (*this, alignof(TypedefType)) TypedefType(
5064         Type::Typedef, Decl, QualType(), getCanonicalType(Underlying));
5065     Decl->TypeForDecl = NewType;
5066     Types.push_back(NewType);
5067     return QualType(NewType, 0);
5068   }
5069   if (Underlying.isNull() || Decl->getUnderlyingType() == Underlying)
5070     return QualType(Decl->TypeForDecl, 0);
5071   assert(hasSameType(Decl->getUnderlyingType(), Underlying));
5072 
5073   llvm::FoldingSetNodeID ID;
5074   TypedefType::Profile(ID, Decl, Underlying);
5075 
5076   void *InsertPos = nullptr;
5077   if (TypedefType *T = TypedefTypes.FindNodeOrInsertPos(ID, InsertPos)) {
5078     assert(!T->typeMatchesDecl() &&
5079            "non-divergent case should be handled with TypeDecl");
5080     return QualType(T, 0);
5081   }
5082 
5083   void *Mem = Allocate(TypedefType::totalSizeToAlloc<QualType>(true),
5084                        alignof(TypedefType));
5085   auto *NewType = new (Mem) TypedefType(Type::Typedef, Decl, Underlying,
5086                                         getCanonicalType(Underlying));
5087   TypedefTypes.InsertNode(NewType, InsertPos);
5088   Types.push_back(NewType);
5089   return QualType(NewType, 0);
5090 }
5091 
getUsingType(const UsingShadowDecl * Found,QualType Underlying) const5092 QualType ASTContext::getUsingType(const UsingShadowDecl *Found,
5093                                   QualType Underlying) const {
5094   llvm::FoldingSetNodeID ID;
5095   UsingType::Profile(ID, Found, Underlying);
5096 
5097   void *InsertPos = nullptr;
5098   if (UsingType *T = UsingTypes.FindNodeOrInsertPos(ID, InsertPos))
5099     return QualType(T, 0);
5100 
5101   const Type *TypeForDecl =
5102       cast<TypeDecl>(Found->getTargetDecl())->getTypeForDecl();
5103 
5104   assert(!Underlying.hasLocalQualifiers());
5105   QualType Canon = Underlying->getCanonicalTypeInternal();
5106   assert(TypeForDecl->getCanonicalTypeInternal() == Canon);
5107 
5108   if (Underlying.getTypePtr() == TypeForDecl)
5109     Underlying = QualType();
5110   void *Mem =
5111       Allocate(UsingType::totalSizeToAlloc<QualType>(!Underlying.isNull()),
5112                alignof(UsingType));
5113   UsingType *NewType = new (Mem) UsingType(Found, Underlying, Canon);
5114   Types.push_back(NewType);
5115   UsingTypes.InsertNode(NewType, InsertPos);
5116   return QualType(NewType, 0);
5117 }
5118 
getRecordType(const RecordDecl * Decl) const5119 QualType ASTContext::getRecordType(const RecordDecl *Decl) const {
5120   if (Decl->TypeForDecl) return QualType(Decl->TypeForDecl, 0);
5121 
5122   if (const RecordDecl *PrevDecl = Decl->getPreviousDecl())
5123     if (PrevDecl->TypeForDecl)
5124       return QualType(Decl->TypeForDecl = PrevDecl->TypeForDecl, 0);
5125 
5126   auto *newType = new (*this, alignof(RecordType)) RecordType(Decl);
5127   Decl->TypeForDecl = newType;
5128   Types.push_back(newType);
5129   return QualType(newType, 0);
5130 }
5131 
getEnumType(const EnumDecl * Decl) const5132 QualType ASTContext::getEnumType(const EnumDecl *Decl) const {
5133   if (Decl->TypeForDecl) return QualType(Decl->TypeForDecl, 0);
5134 
5135   if (const EnumDecl *PrevDecl = Decl->getPreviousDecl())
5136     if (PrevDecl->TypeForDecl)
5137       return QualType(Decl->TypeForDecl = PrevDecl->TypeForDecl, 0);
5138 
5139   auto *newType = new (*this, alignof(EnumType)) EnumType(Decl);
5140   Decl->TypeForDecl = newType;
5141   Types.push_back(newType);
5142   return QualType(newType, 0);
5143 }
5144 
getUnresolvedUsingType(const UnresolvedUsingTypenameDecl * Decl) const5145 QualType ASTContext::getUnresolvedUsingType(
5146     const UnresolvedUsingTypenameDecl *Decl) const {
5147   if (Decl->TypeForDecl)
5148     return QualType(Decl->TypeForDecl, 0);
5149 
5150   if (const UnresolvedUsingTypenameDecl *CanonicalDecl =
5151           Decl->getCanonicalDecl())
5152     if (CanonicalDecl->TypeForDecl)
5153       return QualType(Decl->TypeForDecl = CanonicalDecl->TypeForDecl, 0);
5154 
5155   Type *newType =
5156       new (*this, alignof(UnresolvedUsingType)) UnresolvedUsingType(Decl);
5157   Decl->TypeForDecl = newType;
5158   Types.push_back(newType);
5159   return QualType(newType, 0);
5160 }
5161 
getAttributedType(attr::Kind attrKind,QualType modifiedType,QualType equivalentType) const5162 QualType ASTContext::getAttributedType(attr::Kind attrKind,
5163                                        QualType modifiedType,
5164                                        QualType equivalentType) const {
5165   llvm::FoldingSetNodeID id;
5166   AttributedType::Profile(id, attrKind, modifiedType, equivalentType);
5167 
5168   void *insertPos = nullptr;
5169   AttributedType *type = AttributedTypes.FindNodeOrInsertPos(id, insertPos);
5170   if (type) return QualType(type, 0);
5171 
5172   QualType canon = getCanonicalType(equivalentType);
5173   type = new (*this, alignof(AttributedType))
5174       AttributedType(canon, attrKind, modifiedType, equivalentType);
5175 
5176   Types.push_back(type);
5177   AttributedTypes.InsertNode(type, insertPos);
5178 
5179   return QualType(type, 0);
5180 }
5181 
getBTFTagAttributedType(const BTFTypeTagAttr * BTFAttr,QualType Wrapped)5182 QualType ASTContext::getBTFTagAttributedType(const BTFTypeTagAttr *BTFAttr,
5183                                              QualType Wrapped) {
5184   llvm::FoldingSetNodeID ID;
5185   BTFTagAttributedType::Profile(ID, Wrapped, BTFAttr);
5186 
5187   void *InsertPos = nullptr;
5188   BTFTagAttributedType *Ty =
5189       BTFTagAttributedTypes.FindNodeOrInsertPos(ID, InsertPos);
5190   if (Ty)
5191     return QualType(Ty, 0);
5192 
5193   QualType Canon = getCanonicalType(Wrapped);
5194   Ty = new (*this, alignof(BTFTagAttributedType))
5195       BTFTagAttributedType(Canon, Wrapped, BTFAttr);
5196 
5197   Types.push_back(Ty);
5198   BTFTagAttributedTypes.InsertNode(Ty, InsertPos);
5199 
5200   return QualType(Ty, 0);
5201 }
5202 
5203 /// Retrieve a substitution-result type.
getSubstTemplateTypeParmType(QualType Replacement,Decl * AssociatedDecl,unsigned Index,std::optional<unsigned> PackIndex) const5204 QualType ASTContext::getSubstTemplateTypeParmType(
5205     QualType Replacement, Decl *AssociatedDecl, unsigned Index,
5206     std::optional<unsigned> PackIndex) const {
5207   llvm::FoldingSetNodeID ID;
5208   SubstTemplateTypeParmType::Profile(ID, Replacement, AssociatedDecl, Index,
5209                                      PackIndex);
5210   void *InsertPos = nullptr;
5211   SubstTemplateTypeParmType *SubstParm =
5212       SubstTemplateTypeParmTypes.FindNodeOrInsertPos(ID, InsertPos);
5213 
5214   if (!SubstParm) {
5215     void *Mem = Allocate(SubstTemplateTypeParmType::totalSizeToAlloc<QualType>(
5216                              !Replacement.isCanonical()),
5217                          alignof(SubstTemplateTypeParmType));
5218     SubstParm = new (Mem) SubstTemplateTypeParmType(Replacement, AssociatedDecl,
5219                                                     Index, PackIndex);
5220     Types.push_back(SubstParm);
5221     SubstTemplateTypeParmTypes.InsertNode(SubstParm, InsertPos);
5222   }
5223 
5224   return QualType(SubstParm, 0);
5225 }
5226 
5227 /// Retrieve a
5228 QualType
getSubstTemplateTypeParmPackType(Decl * AssociatedDecl,unsigned Index,bool Final,const TemplateArgument & ArgPack)5229 ASTContext::getSubstTemplateTypeParmPackType(Decl *AssociatedDecl,
5230                                              unsigned Index, bool Final,
5231                                              const TemplateArgument &ArgPack) {
5232 #ifndef NDEBUG
5233   for (const auto &P : ArgPack.pack_elements())
5234     assert(P.getKind() == TemplateArgument::Type && "Pack contains a non-type");
5235 #endif
5236 
5237   llvm::FoldingSetNodeID ID;
5238   SubstTemplateTypeParmPackType::Profile(ID, AssociatedDecl, Index, Final,
5239                                          ArgPack);
5240   void *InsertPos = nullptr;
5241   if (SubstTemplateTypeParmPackType *SubstParm =
5242           SubstTemplateTypeParmPackTypes.FindNodeOrInsertPos(ID, InsertPos))
5243     return QualType(SubstParm, 0);
5244 
5245   QualType Canon;
5246   {
5247     TemplateArgument CanonArgPack = getCanonicalTemplateArgument(ArgPack);
5248     if (!AssociatedDecl->isCanonicalDecl() ||
5249         !CanonArgPack.structurallyEquals(ArgPack)) {
5250       Canon = getSubstTemplateTypeParmPackType(
5251           AssociatedDecl->getCanonicalDecl(), Index, Final, CanonArgPack);
5252       [[maybe_unused]] const auto *Nothing =
5253           SubstTemplateTypeParmPackTypes.FindNodeOrInsertPos(ID, InsertPos);
5254       assert(!Nothing);
5255     }
5256   }
5257 
5258   auto *SubstParm = new (*this, alignof(SubstTemplateTypeParmPackType))
5259       SubstTemplateTypeParmPackType(Canon, AssociatedDecl, Index, Final,
5260                                     ArgPack);
5261   Types.push_back(SubstParm);
5262   SubstTemplateTypeParmPackTypes.InsertNode(SubstParm, InsertPos);
5263   return QualType(SubstParm, 0);
5264 }
5265 
5266 /// Retrieve the template type parameter type for a template
5267 /// parameter or parameter pack with the given depth, index, and (optionally)
5268 /// name.
getTemplateTypeParmType(unsigned Depth,unsigned Index,bool ParameterPack,TemplateTypeParmDecl * TTPDecl) const5269 QualType ASTContext::getTemplateTypeParmType(unsigned Depth, unsigned Index,
5270                                              bool ParameterPack,
5271                                              TemplateTypeParmDecl *TTPDecl) const {
5272   llvm::FoldingSetNodeID ID;
5273   TemplateTypeParmType::Profile(ID, Depth, Index, ParameterPack, TTPDecl);
5274   void *InsertPos = nullptr;
5275   TemplateTypeParmType *TypeParm
5276     = TemplateTypeParmTypes.FindNodeOrInsertPos(ID, InsertPos);
5277 
5278   if (TypeParm)
5279     return QualType(TypeParm, 0);
5280 
5281   if (TTPDecl) {
5282     QualType Canon = getTemplateTypeParmType(Depth, Index, ParameterPack);
5283     TypeParm = new (*this, alignof(TemplateTypeParmType))
5284         TemplateTypeParmType(TTPDecl, Canon);
5285 
5286     TemplateTypeParmType *TypeCheck
5287       = TemplateTypeParmTypes.FindNodeOrInsertPos(ID, InsertPos);
5288     assert(!TypeCheck && "Template type parameter canonical type broken");
5289     (void)TypeCheck;
5290   } else
5291     TypeParm = new (*this, alignof(TemplateTypeParmType))
5292         TemplateTypeParmType(Depth, Index, ParameterPack);
5293 
5294   Types.push_back(TypeParm);
5295   TemplateTypeParmTypes.InsertNode(TypeParm, InsertPos);
5296 
5297   return QualType(TypeParm, 0);
5298 }
5299 
5300 TypeSourceInfo *
getTemplateSpecializationTypeInfo(TemplateName Name,SourceLocation NameLoc,const TemplateArgumentListInfo & Args,QualType Underlying) const5301 ASTContext::getTemplateSpecializationTypeInfo(TemplateName Name,
5302                                               SourceLocation NameLoc,
5303                                         const TemplateArgumentListInfo &Args,
5304                                               QualType Underlying) const {
5305   assert(!Name.getAsDependentTemplateName() &&
5306          "No dependent template names here!");
5307   QualType TST =
5308       getTemplateSpecializationType(Name, Args.arguments(), Underlying);
5309 
5310   TypeSourceInfo *DI = CreateTypeSourceInfo(TST);
5311   TemplateSpecializationTypeLoc TL =
5312       DI->getTypeLoc().castAs<TemplateSpecializationTypeLoc>();
5313   TL.setTemplateKeywordLoc(SourceLocation());
5314   TL.setTemplateNameLoc(NameLoc);
5315   TL.setLAngleLoc(Args.getLAngleLoc());
5316   TL.setRAngleLoc(Args.getRAngleLoc());
5317   for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i)
5318     TL.setArgLocInfo(i, Args[i].getLocInfo());
5319   return DI;
5320 }
5321 
5322 QualType
getTemplateSpecializationType(TemplateName Template,ArrayRef<TemplateArgumentLoc> Args,QualType Underlying) const5323 ASTContext::getTemplateSpecializationType(TemplateName Template,
5324                                           ArrayRef<TemplateArgumentLoc> Args,
5325                                           QualType Underlying) const {
5326   assert(!Template.getAsDependentTemplateName() &&
5327          "No dependent template names here!");
5328 
5329   SmallVector<TemplateArgument, 4> ArgVec;
5330   ArgVec.reserve(Args.size());
5331   for (const TemplateArgumentLoc &Arg : Args)
5332     ArgVec.push_back(Arg.getArgument());
5333 
5334   return getTemplateSpecializationType(Template, ArgVec, Underlying);
5335 }
5336 
5337 #ifndef NDEBUG
hasAnyPackExpansions(ArrayRef<TemplateArgument> Args)5338 static bool hasAnyPackExpansions(ArrayRef<TemplateArgument> Args) {
5339   for (const TemplateArgument &Arg : Args)
5340     if (Arg.isPackExpansion())
5341       return true;
5342 
5343   return true;
5344 }
5345 #endif
5346 
5347 QualType
getTemplateSpecializationType(TemplateName Template,ArrayRef<TemplateArgument> Args,QualType Underlying) const5348 ASTContext::getTemplateSpecializationType(TemplateName Template,
5349                                           ArrayRef<TemplateArgument> Args,
5350                                           QualType Underlying) const {
5351   assert(!Template.getAsDependentTemplateName() &&
5352          "No dependent template names here!");
5353 
5354   const auto *TD = Template.getAsTemplateDecl();
5355   bool IsTypeAlias = TD && TD->isTypeAlias();
5356   QualType CanonType;
5357   if (!Underlying.isNull())
5358     CanonType = getCanonicalType(Underlying);
5359   else {
5360     // We can get here with an alias template when the specialization contains
5361     // a pack expansion that does not match up with a parameter pack.
5362     assert((!IsTypeAlias || hasAnyPackExpansions(Args)) &&
5363            "Caller must compute aliased type");
5364     IsTypeAlias = false;
5365     CanonType = getCanonicalTemplateSpecializationType(Template, Args);
5366   }
5367 
5368   // Allocate the (non-canonical) template specialization type, but don't
5369   // try to unique it: these types typically have location information that
5370   // we don't unique and don't want to lose.
5371   void *Mem = Allocate(sizeof(TemplateSpecializationType) +
5372                            sizeof(TemplateArgument) * Args.size() +
5373                            (IsTypeAlias ? sizeof(QualType) : 0),
5374                        alignof(TemplateSpecializationType));
5375   auto *Spec
5376     = new (Mem) TemplateSpecializationType(Template, Args, CanonType,
5377                                          IsTypeAlias ? Underlying : QualType());
5378 
5379   Types.push_back(Spec);
5380   return QualType(Spec, 0);
5381 }
5382 
getCanonicalTemplateSpecializationType(TemplateName Template,ArrayRef<TemplateArgument> Args) const5383 QualType ASTContext::getCanonicalTemplateSpecializationType(
5384     TemplateName Template, ArrayRef<TemplateArgument> Args) const {
5385   assert(!Template.getAsDependentTemplateName() &&
5386          "No dependent template names here!");
5387 
5388   // Build the canonical template specialization type.
5389   TemplateName CanonTemplate = getCanonicalTemplateName(Template);
5390   bool AnyNonCanonArgs = false;
5391   auto CanonArgs =
5392       ::getCanonicalTemplateArguments(*this, Args, AnyNonCanonArgs);
5393 
5394   // Determine whether this canonical template specialization type already
5395   // exists.
5396   llvm::FoldingSetNodeID ID;
5397   TemplateSpecializationType::Profile(ID, CanonTemplate,
5398                                       CanonArgs, *this);
5399 
5400   void *InsertPos = nullptr;
5401   TemplateSpecializationType *Spec
5402     = TemplateSpecializationTypes.FindNodeOrInsertPos(ID, InsertPos);
5403 
5404   if (!Spec) {
5405     // Allocate a new canonical template specialization type.
5406     void *Mem = Allocate((sizeof(TemplateSpecializationType) +
5407                           sizeof(TemplateArgument) * CanonArgs.size()),
5408                          alignof(TemplateSpecializationType));
5409     Spec = new (Mem) TemplateSpecializationType(CanonTemplate,
5410                                                 CanonArgs,
5411                                                 QualType(), QualType());
5412     Types.push_back(Spec);
5413     TemplateSpecializationTypes.InsertNode(Spec, InsertPos);
5414   }
5415 
5416   assert(Spec->isDependentType() &&
5417          "Non-dependent template-id type must have a canonical type");
5418   return QualType(Spec, 0);
5419 }
5420 
getElaboratedType(ElaboratedTypeKeyword Keyword,NestedNameSpecifier * NNS,QualType NamedType,TagDecl * OwnedTagDecl) const5421 QualType ASTContext::getElaboratedType(ElaboratedTypeKeyword Keyword,
5422                                        NestedNameSpecifier *NNS,
5423                                        QualType NamedType,
5424                                        TagDecl *OwnedTagDecl) const {
5425   llvm::FoldingSetNodeID ID;
5426   ElaboratedType::Profile(ID, Keyword, NNS, NamedType, OwnedTagDecl);
5427 
5428   void *InsertPos = nullptr;
5429   ElaboratedType *T = ElaboratedTypes.FindNodeOrInsertPos(ID, InsertPos);
5430   if (T)
5431     return QualType(T, 0);
5432 
5433   QualType Canon = NamedType;
5434   if (!Canon.isCanonical()) {
5435     Canon = getCanonicalType(NamedType);
5436     ElaboratedType *CheckT = ElaboratedTypes.FindNodeOrInsertPos(ID, InsertPos);
5437     assert(!CheckT && "Elaborated canonical type broken");
5438     (void)CheckT;
5439   }
5440 
5441   void *Mem =
5442       Allocate(ElaboratedType::totalSizeToAlloc<TagDecl *>(!!OwnedTagDecl),
5443                alignof(ElaboratedType));
5444   T = new (Mem) ElaboratedType(Keyword, NNS, NamedType, Canon, OwnedTagDecl);
5445 
5446   Types.push_back(T);
5447   ElaboratedTypes.InsertNode(T, InsertPos);
5448   return QualType(T, 0);
5449 }
5450 
5451 QualType
getParenType(QualType InnerType) const5452 ASTContext::getParenType(QualType InnerType) const {
5453   llvm::FoldingSetNodeID ID;
5454   ParenType::Profile(ID, InnerType);
5455 
5456   void *InsertPos = nullptr;
5457   ParenType *T = ParenTypes.FindNodeOrInsertPos(ID, InsertPos);
5458   if (T)
5459     return QualType(T, 0);
5460 
5461   QualType Canon = InnerType;
5462   if (!Canon.isCanonical()) {
5463     Canon = getCanonicalType(InnerType);
5464     ParenType *CheckT = ParenTypes.FindNodeOrInsertPos(ID, InsertPos);
5465     assert(!CheckT && "Paren canonical type broken");
5466     (void)CheckT;
5467   }
5468 
5469   T = new (*this, alignof(ParenType)) ParenType(InnerType, Canon);
5470   Types.push_back(T);
5471   ParenTypes.InsertNode(T, InsertPos);
5472   return QualType(T, 0);
5473 }
5474 
5475 QualType
getMacroQualifiedType(QualType UnderlyingTy,const IdentifierInfo * MacroII) const5476 ASTContext::getMacroQualifiedType(QualType UnderlyingTy,
5477                                   const IdentifierInfo *MacroII) const {
5478   QualType Canon = UnderlyingTy;
5479   if (!Canon.isCanonical())
5480     Canon = getCanonicalType(UnderlyingTy);
5481 
5482   auto *newType = new (*this, alignof(MacroQualifiedType))
5483       MacroQualifiedType(UnderlyingTy, Canon, MacroII);
5484   Types.push_back(newType);
5485   return QualType(newType, 0);
5486 }
5487 
getDependentNameType(ElaboratedTypeKeyword Keyword,NestedNameSpecifier * NNS,const IdentifierInfo * Name,QualType Canon) const5488 QualType ASTContext::getDependentNameType(ElaboratedTypeKeyword Keyword,
5489                                           NestedNameSpecifier *NNS,
5490                                           const IdentifierInfo *Name,
5491                                           QualType Canon) const {
5492   if (Canon.isNull()) {
5493     NestedNameSpecifier *CanonNNS = getCanonicalNestedNameSpecifier(NNS);
5494     if (CanonNNS != NNS)
5495       Canon = getDependentNameType(Keyword, CanonNNS, Name);
5496   }
5497 
5498   llvm::FoldingSetNodeID ID;
5499   DependentNameType::Profile(ID, Keyword, NNS, Name);
5500 
5501   void *InsertPos = nullptr;
5502   DependentNameType *T
5503     = DependentNameTypes.FindNodeOrInsertPos(ID, InsertPos);
5504   if (T)
5505     return QualType(T, 0);
5506 
5507   T = new (*this, alignof(DependentNameType))
5508       DependentNameType(Keyword, NNS, Name, Canon);
5509   Types.push_back(T);
5510   DependentNameTypes.InsertNode(T, InsertPos);
5511   return QualType(T, 0);
5512 }
5513 
getDependentTemplateSpecializationType(ElaboratedTypeKeyword Keyword,NestedNameSpecifier * NNS,const IdentifierInfo * Name,ArrayRef<TemplateArgumentLoc> Args) const5514 QualType ASTContext::getDependentTemplateSpecializationType(
5515     ElaboratedTypeKeyword Keyword, NestedNameSpecifier *NNS,
5516     const IdentifierInfo *Name, ArrayRef<TemplateArgumentLoc> Args) const {
5517   // TODO: avoid this copy
5518   SmallVector<TemplateArgument, 16> ArgCopy;
5519   for (unsigned I = 0, E = Args.size(); I != E; ++I)
5520     ArgCopy.push_back(Args[I].getArgument());
5521   return getDependentTemplateSpecializationType(Keyword, NNS, Name, ArgCopy);
5522 }
5523 
5524 QualType
getDependentTemplateSpecializationType(ElaboratedTypeKeyword Keyword,NestedNameSpecifier * NNS,const IdentifierInfo * Name,ArrayRef<TemplateArgument> Args) const5525 ASTContext::getDependentTemplateSpecializationType(
5526                                  ElaboratedTypeKeyword Keyword,
5527                                  NestedNameSpecifier *NNS,
5528                                  const IdentifierInfo *Name,
5529                                  ArrayRef<TemplateArgument> Args) const {
5530   assert((!NNS || NNS->isDependent()) &&
5531          "nested-name-specifier must be dependent");
5532 
5533   llvm::FoldingSetNodeID ID;
5534   DependentTemplateSpecializationType::Profile(ID, *this, Keyword, NNS,
5535                                                Name, Args);
5536 
5537   void *InsertPos = nullptr;
5538   DependentTemplateSpecializationType *T
5539     = DependentTemplateSpecializationTypes.FindNodeOrInsertPos(ID, InsertPos);
5540   if (T)
5541     return QualType(T, 0);
5542 
5543   NestedNameSpecifier *CanonNNS = getCanonicalNestedNameSpecifier(NNS);
5544 
5545   ElaboratedTypeKeyword CanonKeyword = Keyword;
5546   if (Keyword == ElaboratedTypeKeyword::None)
5547     CanonKeyword = ElaboratedTypeKeyword::Typename;
5548 
5549   bool AnyNonCanonArgs = false;
5550   auto CanonArgs =
5551       ::getCanonicalTemplateArguments(*this, Args, AnyNonCanonArgs);
5552 
5553   QualType Canon;
5554   if (AnyNonCanonArgs || CanonNNS != NNS || CanonKeyword != Keyword) {
5555     Canon = getDependentTemplateSpecializationType(CanonKeyword, CanonNNS,
5556                                                    Name,
5557                                                    CanonArgs);
5558 
5559     // Find the insert position again.
5560     [[maybe_unused]] auto *Nothing =
5561         DependentTemplateSpecializationTypes.FindNodeOrInsertPos(ID, InsertPos);
5562     assert(!Nothing && "canonical type broken");
5563   }
5564 
5565   void *Mem = Allocate((sizeof(DependentTemplateSpecializationType) +
5566                         sizeof(TemplateArgument) * Args.size()),
5567                        alignof(DependentTemplateSpecializationType));
5568   T = new (Mem) DependentTemplateSpecializationType(Keyword, NNS,
5569                                                     Name, Args, Canon);
5570   Types.push_back(T);
5571   DependentTemplateSpecializationTypes.InsertNode(T, InsertPos);
5572   return QualType(T, 0);
5573 }
5574 
getInjectedTemplateArg(NamedDecl * Param)5575 TemplateArgument ASTContext::getInjectedTemplateArg(NamedDecl *Param) {
5576   TemplateArgument Arg;
5577   if (const auto *TTP = dyn_cast<TemplateTypeParmDecl>(Param)) {
5578     QualType ArgType = getTypeDeclType(TTP);
5579     if (TTP->isParameterPack())
5580       ArgType = getPackExpansionType(ArgType, std::nullopt);
5581 
5582     Arg = TemplateArgument(ArgType);
5583   } else if (auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(Param)) {
5584     QualType T =
5585         NTTP->getType().getNonPackExpansionType().getNonLValueExprType(*this);
5586     // For class NTTPs, ensure we include the 'const' so the type matches that
5587     // of a real template argument.
5588     // FIXME: It would be more faithful to model this as something like an
5589     // lvalue-to-rvalue conversion applied to a const-qualified lvalue.
5590     if (T->isRecordType())
5591       T.addConst();
5592     Expr *E = new (*this) DeclRefExpr(
5593         *this, NTTP, /*RefersToEnclosingVariableOrCapture*/ false, T,
5594         Expr::getValueKindForType(NTTP->getType()), NTTP->getLocation());
5595 
5596     if (NTTP->isParameterPack())
5597       E = new (*this)
5598           PackExpansionExpr(DependentTy, E, NTTP->getLocation(), std::nullopt);
5599     Arg = TemplateArgument(E);
5600   } else {
5601     auto *TTP = cast<TemplateTemplateParmDecl>(Param);
5602     TemplateName Name = getQualifiedTemplateName(
5603         nullptr, /*TemplateKeyword=*/false, TemplateName(TTP));
5604     if (TTP->isParameterPack())
5605       Arg = TemplateArgument(Name, std::optional<unsigned>());
5606     else
5607       Arg = TemplateArgument(Name);
5608   }
5609 
5610   if (Param->isTemplateParameterPack())
5611     Arg = TemplateArgument::CreatePackCopy(*this, Arg);
5612 
5613   return Arg;
5614 }
5615 
5616 void
getInjectedTemplateArgs(const TemplateParameterList * Params,SmallVectorImpl<TemplateArgument> & Args)5617 ASTContext::getInjectedTemplateArgs(const TemplateParameterList *Params,
5618                                     SmallVectorImpl<TemplateArgument> &Args) {
5619   Args.reserve(Args.size() + Params->size());
5620 
5621   for (NamedDecl *Param : *Params)
5622     Args.push_back(getInjectedTemplateArg(Param));
5623 }
5624 
getPackExpansionType(QualType Pattern,std::optional<unsigned> NumExpansions,bool ExpectPackInType)5625 QualType ASTContext::getPackExpansionType(QualType Pattern,
5626                                           std::optional<unsigned> NumExpansions,
5627                                           bool ExpectPackInType) {
5628   assert((!ExpectPackInType || Pattern->containsUnexpandedParameterPack()) &&
5629          "Pack expansions must expand one or more parameter packs");
5630 
5631   llvm::FoldingSetNodeID ID;
5632   PackExpansionType::Profile(ID, Pattern, NumExpansions);
5633 
5634   void *InsertPos = nullptr;
5635   PackExpansionType *T = PackExpansionTypes.FindNodeOrInsertPos(ID, InsertPos);
5636   if (T)
5637     return QualType(T, 0);
5638 
5639   QualType Canon;
5640   if (!Pattern.isCanonical()) {
5641     Canon = getPackExpansionType(getCanonicalType(Pattern), NumExpansions,
5642                                  /*ExpectPackInType=*/false);
5643 
5644     // Find the insert position again, in case we inserted an element into
5645     // PackExpansionTypes and invalidated our insert position.
5646     PackExpansionTypes.FindNodeOrInsertPos(ID, InsertPos);
5647   }
5648 
5649   T = new (*this, alignof(PackExpansionType))
5650       PackExpansionType(Pattern, Canon, NumExpansions);
5651   Types.push_back(T);
5652   PackExpansionTypes.InsertNode(T, InsertPos);
5653   return QualType(T, 0);
5654 }
5655 
5656 /// CmpProtocolNames - Comparison predicate for sorting protocols
5657 /// alphabetically.
CmpProtocolNames(ObjCProtocolDecl * const * LHS,ObjCProtocolDecl * const * RHS)5658 static int CmpProtocolNames(ObjCProtocolDecl *const *LHS,
5659                             ObjCProtocolDecl *const *RHS) {
5660   return DeclarationName::compare((*LHS)->getDeclName(), (*RHS)->getDeclName());
5661 }
5662 
areSortedAndUniqued(ArrayRef<ObjCProtocolDecl * > Protocols)5663 static bool areSortedAndUniqued(ArrayRef<ObjCProtocolDecl *> Protocols) {
5664   if (Protocols.empty()) return true;
5665 
5666   if (Protocols[0]->getCanonicalDecl() != Protocols[0])
5667     return false;
5668 
5669   for (unsigned i = 1; i != Protocols.size(); ++i)
5670     if (CmpProtocolNames(&Protocols[i - 1], &Protocols[i]) >= 0 ||
5671         Protocols[i]->getCanonicalDecl() != Protocols[i])
5672       return false;
5673   return true;
5674 }
5675 
5676 static void
SortAndUniqueProtocols(SmallVectorImpl<ObjCProtocolDecl * > & Protocols)5677 SortAndUniqueProtocols(SmallVectorImpl<ObjCProtocolDecl *> &Protocols) {
5678   // Sort protocols, keyed by name.
5679   llvm::array_pod_sort(Protocols.begin(), Protocols.end(), CmpProtocolNames);
5680 
5681   // Canonicalize.
5682   for (ObjCProtocolDecl *&P : Protocols)
5683     P = P->getCanonicalDecl();
5684 
5685   // Remove duplicates.
5686   auto ProtocolsEnd = std::unique(Protocols.begin(), Protocols.end());
5687   Protocols.erase(ProtocolsEnd, Protocols.end());
5688 }
5689 
getObjCObjectType(QualType BaseType,ObjCProtocolDecl * const * Protocols,unsigned NumProtocols) const5690 QualType ASTContext::getObjCObjectType(QualType BaseType,
5691                                        ObjCProtocolDecl * const *Protocols,
5692                                        unsigned NumProtocols) const {
5693   return getObjCObjectType(BaseType, {},
5694                            llvm::ArrayRef(Protocols, NumProtocols),
5695                            /*isKindOf=*/false);
5696 }
5697 
getObjCObjectType(QualType baseType,ArrayRef<QualType> typeArgs,ArrayRef<ObjCProtocolDecl * > protocols,bool isKindOf) const5698 QualType ASTContext::getObjCObjectType(
5699            QualType baseType,
5700            ArrayRef<QualType> typeArgs,
5701            ArrayRef<ObjCProtocolDecl *> protocols,
5702            bool isKindOf) const {
5703   // If the base type is an interface and there aren't any protocols or
5704   // type arguments to add, then the interface type will do just fine.
5705   if (typeArgs.empty() && protocols.empty() && !isKindOf &&
5706       isa<ObjCInterfaceType>(baseType))
5707     return baseType;
5708 
5709   // Look in the folding set for an existing type.
5710   llvm::FoldingSetNodeID ID;
5711   ObjCObjectTypeImpl::Profile(ID, baseType, typeArgs, protocols, isKindOf);
5712   void *InsertPos = nullptr;
5713   if (ObjCObjectType *QT = ObjCObjectTypes.FindNodeOrInsertPos(ID, InsertPos))
5714     return QualType(QT, 0);
5715 
5716   // Determine the type arguments to be used for canonicalization,
5717   // which may be explicitly specified here or written on the base
5718   // type.
5719   ArrayRef<QualType> effectiveTypeArgs = typeArgs;
5720   if (effectiveTypeArgs.empty()) {
5721     if (const auto *baseObject = baseType->getAs<ObjCObjectType>())
5722       effectiveTypeArgs = baseObject->getTypeArgs();
5723   }
5724 
5725   // Build the canonical type, which has the canonical base type and a
5726   // sorted-and-uniqued list of protocols and the type arguments
5727   // canonicalized.
5728   QualType canonical;
5729   bool typeArgsAreCanonical = llvm::all_of(
5730       effectiveTypeArgs, [&](QualType type) { return type.isCanonical(); });
5731   bool protocolsSorted = areSortedAndUniqued(protocols);
5732   if (!typeArgsAreCanonical || !protocolsSorted || !baseType.isCanonical()) {
5733     // Determine the canonical type arguments.
5734     ArrayRef<QualType> canonTypeArgs;
5735     SmallVector<QualType, 4> canonTypeArgsVec;
5736     if (!typeArgsAreCanonical) {
5737       canonTypeArgsVec.reserve(effectiveTypeArgs.size());
5738       for (auto typeArg : effectiveTypeArgs)
5739         canonTypeArgsVec.push_back(getCanonicalType(typeArg));
5740       canonTypeArgs = canonTypeArgsVec;
5741     } else {
5742       canonTypeArgs = effectiveTypeArgs;
5743     }
5744 
5745     ArrayRef<ObjCProtocolDecl *> canonProtocols;
5746     SmallVector<ObjCProtocolDecl*, 8> canonProtocolsVec;
5747     if (!protocolsSorted) {
5748       canonProtocolsVec.append(protocols.begin(), protocols.end());
5749       SortAndUniqueProtocols(canonProtocolsVec);
5750       canonProtocols = canonProtocolsVec;
5751     } else {
5752       canonProtocols = protocols;
5753     }
5754 
5755     canonical = getObjCObjectType(getCanonicalType(baseType), canonTypeArgs,
5756                                   canonProtocols, isKindOf);
5757 
5758     // Regenerate InsertPos.
5759     ObjCObjectTypes.FindNodeOrInsertPos(ID, InsertPos);
5760   }
5761 
5762   unsigned size = sizeof(ObjCObjectTypeImpl);
5763   size += typeArgs.size() * sizeof(QualType);
5764   size += protocols.size() * sizeof(ObjCProtocolDecl *);
5765   void *mem = Allocate(size, alignof(ObjCObjectTypeImpl));
5766   auto *T =
5767     new (mem) ObjCObjectTypeImpl(canonical, baseType, typeArgs, protocols,
5768                                  isKindOf);
5769 
5770   Types.push_back(T);
5771   ObjCObjectTypes.InsertNode(T, InsertPos);
5772   return QualType(T, 0);
5773 }
5774 
5775 /// Apply Objective-C protocol qualifiers to the given type.
5776 /// If this is for the canonical type of a type parameter, we can apply
5777 /// protocol qualifiers on the ObjCObjectPointerType.
5778 QualType
applyObjCProtocolQualifiers(QualType type,ArrayRef<ObjCProtocolDecl * > protocols,bool & hasError,bool allowOnPointerType) const5779 ASTContext::applyObjCProtocolQualifiers(QualType type,
5780                   ArrayRef<ObjCProtocolDecl *> protocols, bool &hasError,
5781                   bool allowOnPointerType) const {
5782   hasError = false;
5783 
5784   if (const auto *objT = dyn_cast<ObjCTypeParamType>(type.getTypePtr())) {
5785     return getObjCTypeParamType(objT->getDecl(), protocols);
5786   }
5787 
5788   // Apply protocol qualifiers to ObjCObjectPointerType.
5789   if (allowOnPointerType) {
5790     if (const auto *objPtr =
5791             dyn_cast<ObjCObjectPointerType>(type.getTypePtr())) {
5792       const ObjCObjectType *objT = objPtr->getObjectType();
5793       // Merge protocol lists and construct ObjCObjectType.
5794       SmallVector<ObjCProtocolDecl*, 8> protocolsVec;
5795       protocolsVec.append(objT->qual_begin(),
5796                           objT->qual_end());
5797       protocolsVec.append(protocols.begin(), protocols.end());
5798       ArrayRef<ObjCProtocolDecl *> protocols = protocolsVec;
5799       type = getObjCObjectType(
5800              objT->getBaseType(),
5801              objT->getTypeArgsAsWritten(),
5802              protocols,
5803              objT->isKindOfTypeAsWritten());
5804       return getObjCObjectPointerType(type);
5805     }
5806   }
5807 
5808   // Apply protocol qualifiers to ObjCObjectType.
5809   if (const auto *objT = dyn_cast<ObjCObjectType>(type.getTypePtr())){
5810     // FIXME: Check for protocols to which the class type is already
5811     // known to conform.
5812 
5813     return getObjCObjectType(objT->getBaseType(),
5814                              objT->getTypeArgsAsWritten(),
5815                              protocols,
5816                              objT->isKindOfTypeAsWritten());
5817   }
5818 
5819   // If the canonical type is ObjCObjectType, ...
5820   if (type->isObjCObjectType()) {
5821     // Silently overwrite any existing protocol qualifiers.
5822     // TODO: determine whether that's the right thing to do.
5823 
5824     // FIXME: Check for protocols to which the class type is already
5825     // known to conform.
5826     return getObjCObjectType(type, {}, protocols, false);
5827   }
5828 
5829   // id<protocol-list>
5830   if (type->isObjCIdType()) {
5831     const auto *objPtr = type->castAs<ObjCObjectPointerType>();
5832     type = getObjCObjectType(ObjCBuiltinIdTy, {}, protocols,
5833                                  objPtr->isKindOfType());
5834     return getObjCObjectPointerType(type);
5835   }
5836 
5837   // Class<protocol-list>
5838   if (type->isObjCClassType()) {
5839     const auto *objPtr = type->castAs<ObjCObjectPointerType>();
5840     type = getObjCObjectType(ObjCBuiltinClassTy, {}, protocols,
5841                                  objPtr->isKindOfType());
5842     return getObjCObjectPointerType(type);
5843   }
5844 
5845   hasError = true;
5846   return type;
5847 }
5848 
5849 QualType
getObjCTypeParamType(const ObjCTypeParamDecl * Decl,ArrayRef<ObjCProtocolDecl * > protocols) const5850 ASTContext::getObjCTypeParamType(const ObjCTypeParamDecl *Decl,
5851                                  ArrayRef<ObjCProtocolDecl *> protocols) const {
5852   // Look in the folding set for an existing type.
5853   llvm::FoldingSetNodeID ID;
5854   ObjCTypeParamType::Profile(ID, Decl, Decl->getUnderlyingType(), protocols);
5855   void *InsertPos = nullptr;
5856   if (ObjCTypeParamType *TypeParam =
5857       ObjCTypeParamTypes.FindNodeOrInsertPos(ID, InsertPos))
5858     return QualType(TypeParam, 0);
5859 
5860   // We canonicalize to the underlying type.
5861   QualType Canonical = getCanonicalType(Decl->getUnderlyingType());
5862   if (!protocols.empty()) {
5863     // Apply the protocol qualifers.
5864     bool hasError;
5865     Canonical = getCanonicalType(applyObjCProtocolQualifiers(
5866         Canonical, protocols, hasError, true /*allowOnPointerType*/));
5867     assert(!hasError && "Error when apply protocol qualifier to bound type");
5868   }
5869 
5870   unsigned size = sizeof(ObjCTypeParamType);
5871   size += protocols.size() * sizeof(ObjCProtocolDecl *);
5872   void *mem = Allocate(size, alignof(ObjCTypeParamType));
5873   auto *newType = new (mem) ObjCTypeParamType(Decl, Canonical, protocols);
5874 
5875   Types.push_back(newType);
5876   ObjCTypeParamTypes.InsertNode(newType, InsertPos);
5877   return QualType(newType, 0);
5878 }
5879 
adjustObjCTypeParamBoundType(const ObjCTypeParamDecl * Orig,ObjCTypeParamDecl * New) const5880 void ASTContext::adjustObjCTypeParamBoundType(const ObjCTypeParamDecl *Orig,
5881                                               ObjCTypeParamDecl *New) const {
5882   New->setTypeSourceInfo(getTrivialTypeSourceInfo(Orig->getUnderlyingType()));
5883   // Update TypeForDecl after updating TypeSourceInfo.
5884   auto NewTypeParamTy = cast<ObjCTypeParamType>(New->getTypeForDecl());
5885   SmallVector<ObjCProtocolDecl *, 8> protocols;
5886   protocols.append(NewTypeParamTy->qual_begin(), NewTypeParamTy->qual_end());
5887   QualType UpdatedTy = getObjCTypeParamType(New, protocols);
5888   New->setTypeForDecl(UpdatedTy.getTypePtr());
5889 }
5890 
5891 /// ObjCObjectAdoptsQTypeProtocols - Checks that protocols in IC's
5892 /// protocol list adopt all protocols in QT's qualified-id protocol
5893 /// list.
ObjCObjectAdoptsQTypeProtocols(QualType QT,ObjCInterfaceDecl * IC)5894 bool ASTContext::ObjCObjectAdoptsQTypeProtocols(QualType QT,
5895                                                 ObjCInterfaceDecl *IC) {
5896   if (!QT->isObjCQualifiedIdType())
5897     return false;
5898 
5899   if (const auto *OPT = QT->getAs<ObjCObjectPointerType>()) {
5900     // If both the right and left sides have qualifiers.
5901     for (auto *Proto : OPT->quals()) {
5902       if (!IC->ClassImplementsProtocol(Proto, false))
5903         return false;
5904     }
5905     return true;
5906   }
5907   return false;
5908 }
5909 
5910 /// QIdProtocolsAdoptObjCObjectProtocols - Checks that protocols in
5911 /// QT's qualified-id protocol list adopt all protocols in IDecl's list
5912 /// of protocols.
QIdProtocolsAdoptObjCObjectProtocols(QualType QT,ObjCInterfaceDecl * IDecl)5913 bool ASTContext::QIdProtocolsAdoptObjCObjectProtocols(QualType QT,
5914                                                 ObjCInterfaceDecl *IDecl) {
5915   if (!QT->isObjCQualifiedIdType())
5916     return false;
5917   const auto *OPT = QT->getAs<ObjCObjectPointerType>();
5918   if (!OPT)
5919     return false;
5920   if (!IDecl->hasDefinition())
5921     return false;
5922   llvm::SmallPtrSet<ObjCProtocolDecl *, 8> InheritedProtocols;
5923   CollectInheritedProtocols(IDecl, InheritedProtocols);
5924   if (InheritedProtocols.empty())
5925     return false;
5926   // Check that if every protocol in list of id<plist> conforms to a protocol
5927   // of IDecl's, then bridge casting is ok.
5928   bool Conforms = false;
5929   for (auto *Proto : OPT->quals()) {
5930     Conforms = false;
5931     for (auto *PI : InheritedProtocols) {
5932       if (ProtocolCompatibleWithProtocol(Proto, PI)) {
5933         Conforms = true;
5934         break;
5935       }
5936     }
5937     if (!Conforms)
5938       break;
5939   }
5940   if (Conforms)
5941     return true;
5942 
5943   for (auto *PI : InheritedProtocols) {
5944     // If both the right and left sides have qualifiers.
5945     bool Adopts = false;
5946     for (auto *Proto : OPT->quals()) {
5947       // return 'true' if 'PI' is in the inheritance hierarchy of Proto
5948       if ((Adopts = ProtocolCompatibleWithProtocol(PI, Proto)))
5949         break;
5950     }
5951     if (!Adopts)
5952       return false;
5953   }
5954   return true;
5955 }
5956 
5957 /// getObjCObjectPointerType - Return a ObjCObjectPointerType type for
5958 /// the given object type.
getObjCObjectPointerType(QualType ObjectT) const5959 QualType ASTContext::getObjCObjectPointerType(QualType ObjectT) const {
5960   llvm::FoldingSetNodeID ID;
5961   ObjCObjectPointerType::Profile(ID, ObjectT);
5962 
5963   void *InsertPos = nullptr;
5964   if (ObjCObjectPointerType *QT =
5965               ObjCObjectPointerTypes.FindNodeOrInsertPos(ID, InsertPos))
5966     return QualType(QT, 0);
5967 
5968   // Find the canonical object type.
5969   QualType Canonical;
5970   if (!ObjectT.isCanonical()) {
5971     Canonical = getObjCObjectPointerType(getCanonicalType(ObjectT));
5972 
5973     // Regenerate InsertPos.
5974     ObjCObjectPointerTypes.FindNodeOrInsertPos(ID, InsertPos);
5975   }
5976 
5977   // No match.
5978   void *Mem =
5979       Allocate(sizeof(ObjCObjectPointerType), alignof(ObjCObjectPointerType));
5980   auto *QType =
5981     new (Mem) ObjCObjectPointerType(Canonical, ObjectT);
5982 
5983   Types.push_back(QType);
5984   ObjCObjectPointerTypes.InsertNode(QType, InsertPos);
5985   return QualType(QType, 0);
5986 }
5987 
5988 /// getObjCInterfaceType - Return the unique reference to the type for the
5989 /// specified ObjC interface decl. The list of protocols is optional.
getObjCInterfaceType(const ObjCInterfaceDecl * Decl,ObjCInterfaceDecl * PrevDecl) const5990 QualType ASTContext::getObjCInterfaceType(const ObjCInterfaceDecl *Decl,
5991                                           ObjCInterfaceDecl *PrevDecl) const {
5992   if (Decl->TypeForDecl)
5993     return QualType(Decl->TypeForDecl, 0);
5994 
5995   if (PrevDecl) {
5996     assert(PrevDecl->TypeForDecl && "previous decl has no TypeForDecl");
5997     Decl->TypeForDecl = PrevDecl->TypeForDecl;
5998     return QualType(PrevDecl->TypeForDecl, 0);
5999   }
6000 
6001   // Prefer the definition, if there is one.
6002   if (const ObjCInterfaceDecl *Def = Decl->getDefinition())
6003     Decl = Def;
6004 
6005   void *Mem = Allocate(sizeof(ObjCInterfaceType), alignof(ObjCInterfaceType));
6006   auto *T = new (Mem) ObjCInterfaceType(Decl);
6007   Decl->TypeForDecl = T;
6008   Types.push_back(T);
6009   return QualType(T, 0);
6010 }
6011 
6012 /// getTypeOfExprType - Unlike many "get<Type>" functions, we can't unique
6013 /// TypeOfExprType AST's (since expression's are never shared). For example,
6014 /// multiple declarations that refer to "typeof(x)" all contain different
6015 /// DeclRefExpr's. This doesn't effect the type checker, since it operates
6016 /// on canonical type's (which are always unique).
getTypeOfExprType(Expr * tofExpr,TypeOfKind Kind) const6017 QualType ASTContext::getTypeOfExprType(Expr *tofExpr, TypeOfKind Kind) const {
6018   TypeOfExprType *toe;
6019   if (tofExpr->isTypeDependent()) {
6020     llvm::FoldingSetNodeID ID;
6021     DependentTypeOfExprType::Profile(ID, *this, tofExpr,
6022                                      Kind == TypeOfKind::Unqualified);
6023 
6024     void *InsertPos = nullptr;
6025     DependentTypeOfExprType *Canon =
6026         DependentTypeOfExprTypes.FindNodeOrInsertPos(ID, InsertPos);
6027     if (Canon) {
6028       // We already have a "canonical" version of an identical, dependent
6029       // typeof(expr) type. Use that as our canonical type.
6030       toe = new (*this, alignof(TypeOfExprType)) TypeOfExprType(
6031           *this, tofExpr, Kind, QualType((TypeOfExprType *)Canon, 0));
6032     } else {
6033       // Build a new, canonical typeof(expr) type.
6034       Canon = new (*this, alignof(DependentTypeOfExprType))
6035           DependentTypeOfExprType(*this, tofExpr, Kind);
6036       DependentTypeOfExprTypes.InsertNode(Canon, InsertPos);
6037       toe = Canon;
6038     }
6039   } else {
6040     QualType Canonical = getCanonicalType(tofExpr->getType());
6041     toe = new (*this, alignof(TypeOfExprType))
6042         TypeOfExprType(*this, tofExpr, Kind, Canonical);
6043   }
6044   Types.push_back(toe);
6045   return QualType(toe, 0);
6046 }
6047 
6048 /// getTypeOfType -  Unlike many "get<Type>" functions, we don't unique
6049 /// TypeOfType nodes. The only motivation to unique these nodes would be
6050 /// memory savings. Since typeof(t) is fairly uncommon, space shouldn't be
6051 /// an issue. This doesn't affect the type checker, since it operates
6052 /// on canonical types (which are always unique).
getTypeOfType(QualType tofType,TypeOfKind Kind) const6053 QualType ASTContext::getTypeOfType(QualType tofType, TypeOfKind Kind) const {
6054   QualType Canonical = getCanonicalType(tofType);
6055   auto *tot = new (*this, alignof(TypeOfType))
6056       TypeOfType(*this, tofType, Canonical, Kind);
6057   Types.push_back(tot);
6058   return QualType(tot, 0);
6059 }
6060 
6061 /// getReferenceQualifiedType - Given an expr, will return the type for
6062 /// that expression, as in [dcl.type.simple]p4 but without taking id-expressions
6063 /// and class member access into account.
getReferenceQualifiedType(const Expr * E) const6064 QualType ASTContext::getReferenceQualifiedType(const Expr *E) const {
6065   // C++11 [dcl.type.simple]p4:
6066   //   [...]
6067   QualType T = E->getType();
6068   switch (E->getValueKind()) {
6069   //     - otherwise, if e is an xvalue, decltype(e) is T&&, where T is the
6070   //       type of e;
6071   case VK_XValue:
6072     return getRValueReferenceType(T);
6073   //     - otherwise, if e is an lvalue, decltype(e) is T&, where T is the
6074   //       type of e;
6075   case VK_LValue:
6076     return getLValueReferenceType(T);
6077   //  - otherwise, decltype(e) is the type of e.
6078   case VK_PRValue:
6079     return T;
6080   }
6081   llvm_unreachable("Unknown value kind");
6082 }
6083 
6084 /// Unlike many "get<Type>" functions, we don't unique DecltypeType
6085 /// nodes. This would never be helpful, since each such type has its own
6086 /// expression, and would not give a significant memory saving, since there
6087 /// is an Expr tree under each such type.
getDecltypeType(Expr * e,QualType UnderlyingType) const6088 QualType ASTContext::getDecltypeType(Expr *e, QualType UnderlyingType) const {
6089   DecltypeType *dt;
6090 
6091   // C++11 [temp.type]p2:
6092   //   If an expression e involves a template parameter, decltype(e) denotes a
6093   //   unique dependent type. Two such decltype-specifiers refer to the same
6094   //   type only if their expressions are equivalent (14.5.6.1).
6095   if (e->isInstantiationDependent()) {
6096     llvm::FoldingSetNodeID ID;
6097     DependentDecltypeType::Profile(ID, *this, e);
6098 
6099     void *InsertPos = nullptr;
6100     DependentDecltypeType *Canon
6101       = DependentDecltypeTypes.FindNodeOrInsertPos(ID, InsertPos);
6102     if (!Canon) {
6103       // Build a new, canonical decltype(expr) type.
6104       Canon = new (*this, alignof(DependentDecltypeType))
6105           DependentDecltypeType(e, DependentTy);
6106       DependentDecltypeTypes.InsertNode(Canon, InsertPos);
6107     }
6108     dt = new (*this, alignof(DecltypeType))
6109         DecltypeType(e, UnderlyingType, QualType((DecltypeType *)Canon, 0));
6110   } else {
6111     dt = new (*this, alignof(DecltypeType))
6112         DecltypeType(e, UnderlyingType, getCanonicalType(UnderlyingType));
6113   }
6114   Types.push_back(dt);
6115   return QualType(dt, 0);
6116 }
6117 
getPackIndexingType(QualType Pattern,Expr * IndexExpr,bool FullySubstituted,ArrayRef<QualType> Expansions,int Index) const6118 QualType ASTContext::getPackIndexingType(QualType Pattern, Expr *IndexExpr,
6119                                          bool FullySubstituted,
6120                                          ArrayRef<QualType> Expansions,
6121                                          int Index) const {
6122   QualType Canonical;
6123   if (FullySubstituted && Index != -1) {
6124     Canonical = getCanonicalType(Expansions[Index]);
6125   } else {
6126     llvm::FoldingSetNodeID ID;
6127     PackIndexingType::Profile(ID, *this, Pattern, IndexExpr);
6128     void *InsertPos = nullptr;
6129     PackIndexingType *Canon =
6130         DependentPackIndexingTypes.FindNodeOrInsertPos(ID, InsertPos);
6131     if (!Canon) {
6132       void *Mem = Allocate(
6133           PackIndexingType::totalSizeToAlloc<QualType>(Expansions.size()),
6134           TypeAlignment);
6135       Canon = new (Mem)
6136           PackIndexingType(*this, QualType(), Pattern, IndexExpr, Expansions);
6137       DependentPackIndexingTypes.InsertNode(Canon, InsertPos);
6138     }
6139     Canonical = QualType(Canon, 0);
6140   }
6141 
6142   void *Mem =
6143       Allocate(PackIndexingType::totalSizeToAlloc<QualType>(Expansions.size()),
6144                TypeAlignment);
6145   auto *T = new (Mem)
6146       PackIndexingType(*this, Canonical, Pattern, IndexExpr, Expansions);
6147   Types.push_back(T);
6148   return QualType(T, 0);
6149 }
6150 
6151 /// getUnaryTransformationType - We don't unique these, since the memory
6152 /// savings are minimal and these are rare.
getUnaryTransformType(QualType BaseType,QualType UnderlyingType,UnaryTransformType::UTTKind Kind) const6153 QualType ASTContext::getUnaryTransformType(QualType BaseType,
6154                                            QualType UnderlyingType,
6155                                            UnaryTransformType::UTTKind Kind)
6156     const {
6157   UnaryTransformType *ut = nullptr;
6158 
6159   if (BaseType->isDependentType()) {
6160     // Look in the folding set for an existing type.
6161     llvm::FoldingSetNodeID ID;
6162     DependentUnaryTransformType::Profile(ID, getCanonicalType(BaseType), Kind);
6163 
6164     void *InsertPos = nullptr;
6165     DependentUnaryTransformType *Canon
6166       = DependentUnaryTransformTypes.FindNodeOrInsertPos(ID, InsertPos);
6167 
6168     if (!Canon) {
6169       // Build a new, canonical __underlying_type(type) type.
6170       Canon = new (*this, alignof(DependentUnaryTransformType))
6171           DependentUnaryTransformType(*this, getCanonicalType(BaseType), Kind);
6172       DependentUnaryTransformTypes.InsertNode(Canon, InsertPos);
6173     }
6174     ut = new (*this, alignof(UnaryTransformType))
6175         UnaryTransformType(BaseType, QualType(), Kind, QualType(Canon, 0));
6176   } else {
6177     QualType CanonType = getCanonicalType(UnderlyingType);
6178     ut = new (*this, alignof(UnaryTransformType))
6179         UnaryTransformType(BaseType, UnderlyingType, Kind, CanonType);
6180   }
6181   Types.push_back(ut);
6182   return QualType(ut, 0);
6183 }
6184 
getAutoTypeInternal(QualType DeducedType,AutoTypeKeyword Keyword,bool IsDependent,bool IsPack,ConceptDecl * TypeConstraintConcept,ArrayRef<TemplateArgument> TypeConstraintArgs,bool IsCanon) const6185 QualType ASTContext::getAutoTypeInternal(
6186     QualType DeducedType, AutoTypeKeyword Keyword, bool IsDependent,
6187     bool IsPack, ConceptDecl *TypeConstraintConcept,
6188     ArrayRef<TemplateArgument> TypeConstraintArgs, bool IsCanon) const {
6189   if (DeducedType.isNull() && Keyword == AutoTypeKeyword::Auto &&
6190       !TypeConstraintConcept && !IsDependent)
6191     return getAutoDeductType();
6192 
6193   // Look in the folding set for an existing type.
6194   void *InsertPos = nullptr;
6195   llvm::FoldingSetNodeID ID;
6196   AutoType::Profile(ID, *this, DeducedType, Keyword, IsDependent,
6197                     TypeConstraintConcept, TypeConstraintArgs);
6198   if (AutoType *AT = AutoTypes.FindNodeOrInsertPos(ID, InsertPos))
6199     return QualType(AT, 0);
6200 
6201   QualType Canon;
6202   if (!IsCanon) {
6203     if (!DeducedType.isNull()) {
6204       Canon = DeducedType.getCanonicalType();
6205     } else if (TypeConstraintConcept) {
6206       bool AnyNonCanonArgs = false;
6207       ConceptDecl *CanonicalConcept = TypeConstraintConcept->getCanonicalDecl();
6208       auto CanonicalConceptArgs = ::getCanonicalTemplateArguments(
6209           *this, TypeConstraintArgs, AnyNonCanonArgs);
6210       if (CanonicalConcept != TypeConstraintConcept || AnyNonCanonArgs) {
6211         Canon =
6212             getAutoTypeInternal(QualType(), Keyword, IsDependent, IsPack,
6213                                 CanonicalConcept, CanonicalConceptArgs, true);
6214         // Find the insert position again.
6215         [[maybe_unused]] auto *Nothing =
6216             AutoTypes.FindNodeOrInsertPos(ID, InsertPos);
6217         assert(!Nothing && "canonical type broken");
6218       }
6219     }
6220   }
6221 
6222   void *Mem = Allocate(sizeof(AutoType) +
6223                            sizeof(TemplateArgument) * TypeConstraintArgs.size(),
6224                        alignof(AutoType));
6225   auto *AT = new (Mem) AutoType(
6226       DeducedType, Keyword,
6227       (IsDependent ? TypeDependence::DependentInstantiation
6228                    : TypeDependence::None) |
6229           (IsPack ? TypeDependence::UnexpandedPack : TypeDependence::None),
6230       Canon, TypeConstraintConcept, TypeConstraintArgs);
6231   Types.push_back(AT);
6232   AutoTypes.InsertNode(AT, InsertPos);
6233   return QualType(AT, 0);
6234 }
6235 
6236 /// getAutoType - Return the uniqued reference to the 'auto' type which has been
6237 /// deduced to the given type, or to the canonical undeduced 'auto' type, or the
6238 /// canonical deduced-but-dependent 'auto' type.
6239 QualType
getAutoType(QualType DeducedType,AutoTypeKeyword Keyword,bool IsDependent,bool IsPack,ConceptDecl * TypeConstraintConcept,ArrayRef<TemplateArgument> TypeConstraintArgs) const6240 ASTContext::getAutoType(QualType DeducedType, AutoTypeKeyword Keyword,
6241                         bool IsDependent, bool IsPack,
6242                         ConceptDecl *TypeConstraintConcept,
6243                         ArrayRef<TemplateArgument> TypeConstraintArgs) const {
6244   assert((!IsPack || IsDependent) && "only use IsPack for a dependent pack");
6245   assert((!IsDependent || DeducedType.isNull()) &&
6246          "A dependent auto should be undeduced");
6247   return getAutoTypeInternal(DeducedType, Keyword, IsDependent, IsPack,
6248                              TypeConstraintConcept, TypeConstraintArgs);
6249 }
6250 
getUnconstrainedType(QualType T) const6251 QualType ASTContext::getUnconstrainedType(QualType T) const {
6252   QualType CanonT = T.getCanonicalType();
6253 
6254   // Remove a type-constraint from a top-level auto or decltype(auto).
6255   if (auto *AT = CanonT->getAs<AutoType>()) {
6256     if (!AT->isConstrained())
6257       return T;
6258     return getQualifiedType(getAutoType(QualType(), AT->getKeyword(),
6259                                         AT->isDependentType(),
6260                                         AT->containsUnexpandedParameterPack()),
6261                             T.getQualifiers());
6262   }
6263 
6264   // FIXME: We only support constrained auto at the top level in the type of a
6265   // non-type template parameter at the moment. Once we lift that restriction,
6266   // we'll need to recursively build types containing auto here.
6267   assert(!CanonT->getContainedAutoType() ||
6268          !CanonT->getContainedAutoType()->isConstrained());
6269   return T;
6270 }
6271 
6272 /// Return the uniqued reference to the deduced template specialization type
6273 /// which has been deduced to the given type, or to the canonical undeduced
6274 /// such type, or the canonical deduced-but-dependent such type.
getDeducedTemplateSpecializationType(TemplateName Template,QualType DeducedType,bool IsDependent) const6275 QualType ASTContext::getDeducedTemplateSpecializationType(
6276     TemplateName Template, QualType DeducedType, bool IsDependent) const {
6277   // Look in the folding set for an existing type.
6278   void *InsertPos = nullptr;
6279   llvm::FoldingSetNodeID ID;
6280   DeducedTemplateSpecializationType::Profile(ID, Template, DeducedType,
6281                                              IsDependent);
6282   if (DeducedTemplateSpecializationType *DTST =
6283           DeducedTemplateSpecializationTypes.FindNodeOrInsertPos(ID, InsertPos))
6284     return QualType(DTST, 0);
6285 
6286   auto *DTST = new (*this, alignof(DeducedTemplateSpecializationType))
6287       DeducedTemplateSpecializationType(Template, DeducedType, IsDependent);
6288   llvm::FoldingSetNodeID TempID;
6289   DTST->Profile(TempID);
6290   assert(ID == TempID && "ID does not match");
6291   Types.push_back(DTST);
6292   DeducedTemplateSpecializationTypes.InsertNode(DTST, InsertPos);
6293   return QualType(DTST, 0);
6294 }
6295 
6296 /// getAtomicType - Return the uniqued reference to the atomic type for
6297 /// the given value type.
getAtomicType(QualType T) const6298 QualType ASTContext::getAtomicType(QualType T) const {
6299   // Unique pointers, to guarantee there is only one pointer of a particular
6300   // structure.
6301   llvm::FoldingSetNodeID ID;
6302   AtomicType::Profile(ID, T);
6303 
6304   void *InsertPos = nullptr;
6305   if (AtomicType *AT = AtomicTypes.FindNodeOrInsertPos(ID, InsertPos))
6306     return QualType(AT, 0);
6307 
6308   // If the atomic value type isn't canonical, this won't be a canonical type
6309   // either, so fill in the canonical type field.
6310   QualType Canonical;
6311   if (!T.isCanonical()) {
6312     Canonical = getAtomicType(getCanonicalType(T));
6313 
6314     // Get the new insert position for the node we care about.
6315     AtomicType *NewIP = AtomicTypes.FindNodeOrInsertPos(ID, InsertPos);
6316     assert(!NewIP && "Shouldn't be in the map!"); (void)NewIP;
6317   }
6318   auto *New = new (*this, alignof(AtomicType)) AtomicType(T, Canonical);
6319   Types.push_back(New);
6320   AtomicTypes.InsertNode(New, InsertPos);
6321   return QualType(New, 0);
6322 }
6323 
6324 /// getAutoDeductType - Get type pattern for deducing against 'auto'.
getAutoDeductType() const6325 QualType ASTContext::getAutoDeductType() const {
6326   if (AutoDeductTy.isNull())
6327     AutoDeductTy = QualType(new (*this, alignof(AutoType))
6328                                 AutoType(QualType(), AutoTypeKeyword::Auto,
6329                                          TypeDependence::None, QualType(),
6330                                          /*concept*/ nullptr, /*args*/ {}),
6331                             0);
6332   return AutoDeductTy;
6333 }
6334 
6335 /// getAutoRRefDeductType - Get type pattern for deducing against 'auto &&'.
getAutoRRefDeductType() const6336 QualType ASTContext::getAutoRRefDeductType() const {
6337   if (AutoRRefDeductTy.isNull())
6338     AutoRRefDeductTy = getRValueReferenceType(getAutoDeductType());
6339   assert(!AutoRRefDeductTy.isNull() && "can't build 'auto &&' pattern");
6340   return AutoRRefDeductTy;
6341 }
6342 
6343 /// getTagDeclType - Return the unique reference to the type for the
6344 /// specified TagDecl (struct/union/class/enum) decl.
getTagDeclType(const TagDecl * Decl) const6345 QualType ASTContext::getTagDeclType(const TagDecl *Decl) const {
6346   assert(Decl);
6347   // FIXME: What is the design on getTagDeclType when it requires casting
6348   // away const?  mutable?
6349   return getTypeDeclType(const_cast<TagDecl*>(Decl));
6350 }
6351 
6352 /// getSizeType - Return the unique type for "size_t" (C99 7.17), the result
6353 /// of the sizeof operator (C99 6.5.3.4p4). The value is target dependent and
6354 /// needs to agree with the definition in <stddef.h>.
getSizeType() const6355 CanQualType ASTContext::getSizeType() const {
6356   return getFromTargetType(Target->getSizeType());
6357 }
6358 
6359 /// Return the unique signed counterpart of the integer type
6360 /// corresponding to size_t.
getSignedSizeType() const6361 CanQualType ASTContext::getSignedSizeType() const {
6362   return getFromTargetType(Target->getSignedSizeType());
6363 }
6364 
6365 /// getIntMaxType - Return the unique type for "intmax_t" (C99 7.18.1.5).
getIntMaxType() const6366 CanQualType ASTContext::getIntMaxType() const {
6367   return getFromTargetType(Target->getIntMaxType());
6368 }
6369 
6370 /// getUIntMaxType - Return the unique type for "uintmax_t" (C99 7.18.1.5).
getUIntMaxType() const6371 CanQualType ASTContext::getUIntMaxType() const {
6372   return getFromTargetType(Target->getUIntMaxType());
6373 }
6374 
6375 /// getSignedWCharType - Return the type of "signed wchar_t".
6376 /// Used when in C++, as a GCC extension.
getSignedWCharType() const6377 QualType ASTContext::getSignedWCharType() const {
6378   // FIXME: derive from "Target" ?
6379   return WCharTy;
6380 }
6381 
6382 /// getUnsignedWCharType - Return the type of "unsigned wchar_t".
6383 /// Used when in C++, as a GCC extension.
getUnsignedWCharType() const6384 QualType ASTContext::getUnsignedWCharType() const {
6385   // FIXME: derive from "Target" ?
6386   return UnsignedIntTy;
6387 }
6388 
getIntPtrType() const6389 QualType ASTContext::getIntPtrType() const {
6390   return getFromTargetType(Target->getIntPtrType());
6391 }
6392 
getUIntPtrType() const6393 QualType ASTContext::getUIntPtrType() const {
6394   return getCorrespondingUnsignedType(getIntPtrType());
6395 }
6396 
6397 /// getPointerDiffType - Return the unique type for "ptrdiff_t" (C99 7.17)
6398 /// defined in <stddef.h>. Pointer - pointer requires this (C99 6.5.6p9).
getPointerDiffType() const6399 QualType ASTContext::getPointerDiffType() const {
6400   return getFromTargetType(Target->getPtrDiffType(LangAS::Default));
6401 }
6402 
6403 /// Return the unique unsigned counterpart of "ptrdiff_t"
6404 /// integer type. The standard (C11 7.21.6.1p7) refers to this type
6405 /// in the definition of %tu format specifier.
getUnsignedPointerDiffType() const6406 QualType ASTContext::getUnsignedPointerDiffType() const {
6407   return getFromTargetType(Target->getUnsignedPtrDiffType(LangAS::Default));
6408 }
6409 
6410 /// Return the unique type for "pid_t" defined in
6411 /// <sys/types.h>. We need this to compute the correct type for vfork().
getProcessIDType() const6412 QualType ASTContext::getProcessIDType() const {
6413   return getFromTargetType(Target->getProcessIDType());
6414 }
6415 
6416 //===----------------------------------------------------------------------===//
6417 //                              Type Operators
6418 //===----------------------------------------------------------------------===//
6419 
getCanonicalParamType(QualType T) const6420 CanQualType ASTContext::getCanonicalParamType(QualType T) const {
6421   // Push qualifiers into arrays, and then discard any remaining
6422   // qualifiers.
6423   T = getCanonicalType(T);
6424   T = getVariableArrayDecayedType(T);
6425   const Type *Ty = T.getTypePtr();
6426   QualType Result;
6427   if (getLangOpts().HLSL && isa<ConstantArrayType>(Ty)) {
6428     Result = getArrayParameterType(QualType(Ty, 0));
6429   } else if (isa<ArrayType>(Ty)) {
6430     Result = getArrayDecayedType(QualType(Ty,0));
6431   } else if (isa<FunctionType>(Ty)) {
6432     Result = getPointerType(QualType(Ty, 0));
6433   } else {
6434     Result = QualType(Ty, 0);
6435   }
6436 
6437   return CanQualType::CreateUnsafe(Result);
6438 }
6439 
getUnqualifiedArrayType(QualType type,Qualifiers & quals) const6440 QualType ASTContext::getUnqualifiedArrayType(QualType type,
6441                                              Qualifiers &quals) const {
6442   SplitQualType splitType = type.getSplitUnqualifiedType();
6443 
6444   // FIXME: getSplitUnqualifiedType() actually walks all the way to
6445   // the unqualified desugared type and then drops it on the floor.
6446   // We then have to strip that sugar back off with
6447   // getUnqualifiedDesugaredType(), which is silly.
6448   const auto *AT =
6449       dyn_cast<ArrayType>(splitType.Ty->getUnqualifiedDesugaredType());
6450 
6451   // If we don't have an array, just use the results in splitType.
6452   if (!AT) {
6453     quals = splitType.Quals;
6454     return QualType(splitType.Ty, 0);
6455   }
6456 
6457   // Otherwise, recurse on the array's element type.
6458   QualType elementType = AT->getElementType();
6459   QualType unqualElementType = getUnqualifiedArrayType(elementType, quals);
6460 
6461   // If that didn't change the element type, AT has no qualifiers, so we
6462   // can just use the results in splitType.
6463   if (elementType == unqualElementType) {
6464     assert(quals.empty()); // from the recursive call
6465     quals = splitType.Quals;
6466     return QualType(splitType.Ty, 0);
6467   }
6468 
6469   // Otherwise, add in the qualifiers from the outermost type, then
6470   // build the type back up.
6471   quals.addConsistentQualifiers(splitType.Quals);
6472 
6473   if (const auto *CAT = dyn_cast<ConstantArrayType>(AT)) {
6474     return getConstantArrayType(unqualElementType, CAT->getSize(),
6475                                 CAT->getSizeExpr(), CAT->getSizeModifier(), 0);
6476   }
6477 
6478   if (const auto *IAT = dyn_cast<IncompleteArrayType>(AT)) {
6479     return getIncompleteArrayType(unqualElementType, IAT->getSizeModifier(), 0);
6480   }
6481 
6482   if (const auto *VAT = dyn_cast<VariableArrayType>(AT)) {
6483     return getVariableArrayType(unqualElementType,
6484                                 VAT->getSizeExpr(),
6485                                 VAT->getSizeModifier(),
6486                                 VAT->getIndexTypeCVRQualifiers(),
6487                                 VAT->getBracketsRange());
6488   }
6489 
6490   const auto *DSAT = cast<DependentSizedArrayType>(AT);
6491   return getDependentSizedArrayType(unqualElementType, DSAT->getSizeExpr(),
6492                                     DSAT->getSizeModifier(), 0,
6493                                     SourceRange());
6494 }
6495 
6496 /// Attempt to unwrap two types that may both be array types with the same bound
6497 /// (or both be array types of unknown bound) for the purpose of comparing the
6498 /// cv-decomposition of two types per C++ [conv.qual].
6499 ///
6500 /// \param AllowPiMismatch Allow the Pi1 and Pi2 to differ as described in
6501 ///        C++20 [conv.qual], if permitted by the current language mode.
UnwrapSimilarArrayTypes(QualType & T1,QualType & T2,bool AllowPiMismatch)6502 void ASTContext::UnwrapSimilarArrayTypes(QualType &T1, QualType &T2,
6503                                          bool AllowPiMismatch) {
6504   while (true) {
6505     auto *AT1 = getAsArrayType(T1);
6506     if (!AT1)
6507       return;
6508 
6509     auto *AT2 = getAsArrayType(T2);
6510     if (!AT2)
6511       return;
6512 
6513     // If we don't have two array types with the same constant bound nor two
6514     // incomplete array types, we've unwrapped everything we can.
6515     // C++20 also permits one type to be a constant array type and the other
6516     // to be an incomplete array type.
6517     // FIXME: Consider also unwrapping array of unknown bound and VLA.
6518     if (auto *CAT1 = dyn_cast<ConstantArrayType>(AT1)) {
6519       auto *CAT2 = dyn_cast<ConstantArrayType>(AT2);
6520       if (!((CAT2 && CAT1->getSize() == CAT2->getSize()) ||
6521             (AllowPiMismatch && getLangOpts().CPlusPlus20 &&
6522              isa<IncompleteArrayType>(AT2))))
6523         return;
6524     } else if (isa<IncompleteArrayType>(AT1)) {
6525       if (!(isa<IncompleteArrayType>(AT2) ||
6526             (AllowPiMismatch && getLangOpts().CPlusPlus20 &&
6527              isa<ConstantArrayType>(AT2))))
6528         return;
6529     } else {
6530       return;
6531     }
6532 
6533     T1 = AT1->getElementType();
6534     T2 = AT2->getElementType();
6535   }
6536 }
6537 
6538 /// Attempt to unwrap two types that may be similar (C++ [conv.qual]).
6539 ///
6540 /// If T1 and T2 are both pointer types of the same kind, or both array types
6541 /// with the same bound, unwraps layers from T1 and T2 until a pointer type is
6542 /// unwrapped. Top-level qualifiers on T1 and T2 are ignored.
6543 ///
6544 /// This function will typically be called in a loop that successively
6545 /// "unwraps" pointer and pointer-to-member types to compare them at each
6546 /// level.
6547 ///
6548 /// \param AllowPiMismatch Allow the Pi1 and Pi2 to differ as described in
6549 ///        C++20 [conv.qual], if permitted by the current language mode.
6550 ///
6551 /// \return \c true if a pointer type was unwrapped, \c false if we reached a
6552 /// pair of types that can't be unwrapped further.
UnwrapSimilarTypes(QualType & T1,QualType & T2,bool AllowPiMismatch)6553 bool ASTContext::UnwrapSimilarTypes(QualType &T1, QualType &T2,
6554                                     bool AllowPiMismatch) {
6555   UnwrapSimilarArrayTypes(T1, T2, AllowPiMismatch);
6556 
6557   const auto *T1PtrType = T1->getAs<PointerType>();
6558   const auto *T2PtrType = T2->getAs<PointerType>();
6559   if (T1PtrType && T2PtrType) {
6560     T1 = T1PtrType->getPointeeType();
6561     T2 = T2PtrType->getPointeeType();
6562     return true;
6563   }
6564 
6565   const auto *T1MPType = T1->getAs<MemberPointerType>();
6566   const auto *T2MPType = T2->getAs<MemberPointerType>();
6567   if (T1MPType && T2MPType &&
6568       hasSameUnqualifiedType(QualType(T1MPType->getClass(), 0),
6569                              QualType(T2MPType->getClass(), 0))) {
6570     T1 = T1MPType->getPointeeType();
6571     T2 = T2MPType->getPointeeType();
6572     return true;
6573   }
6574 
6575   if (getLangOpts().ObjC) {
6576     const auto *T1OPType = T1->getAs<ObjCObjectPointerType>();
6577     const auto *T2OPType = T2->getAs<ObjCObjectPointerType>();
6578     if (T1OPType && T2OPType) {
6579       T1 = T1OPType->getPointeeType();
6580       T2 = T2OPType->getPointeeType();
6581       return true;
6582     }
6583   }
6584 
6585   // FIXME: Block pointers, too?
6586 
6587   return false;
6588 }
6589 
hasSimilarType(QualType T1,QualType T2)6590 bool ASTContext::hasSimilarType(QualType T1, QualType T2) {
6591   while (true) {
6592     Qualifiers Quals;
6593     T1 = getUnqualifiedArrayType(T1, Quals);
6594     T2 = getUnqualifiedArrayType(T2, Quals);
6595     if (hasSameType(T1, T2))
6596       return true;
6597     if (!UnwrapSimilarTypes(T1, T2))
6598       return false;
6599   }
6600 }
6601 
hasCvrSimilarType(QualType T1,QualType T2)6602 bool ASTContext::hasCvrSimilarType(QualType T1, QualType T2) {
6603   while (true) {
6604     Qualifiers Quals1, Quals2;
6605     T1 = getUnqualifiedArrayType(T1, Quals1);
6606     T2 = getUnqualifiedArrayType(T2, Quals2);
6607 
6608     Quals1.removeCVRQualifiers();
6609     Quals2.removeCVRQualifiers();
6610     if (Quals1 != Quals2)
6611       return false;
6612 
6613     if (hasSameType(T1, T2))
6614       return true;
6615 
6616     if (!UnwrapSimilarTypes(T1, T2, /*AllowPiMismatch*/ false))
6617       return false;
6618   }
6619 }
6620 
6621 DeclarationNameInfo
getNameForTemplate(TemplateName Name,SourceLocation NameLoc) const6622 ASTContext::getNameForTemplate(TemplateName Name,
6623                                SourceLocation NameLoc) const {
6624   switch (Name.getKind()) {
6625   case TemplateName::QualifiedTemplate:
6626   case TemplateName::Template:
6627     // DNInfo work in progress: CHECKME: what about DNLoc?
6628     return DeclarationNameInfo(Name.getAsTemplateDecl()->getDeclName(),
6629                                NameLoc);
6630 
6631   case TemplateName::OverloadedTemplate: {
6632     OverloadedTemplateStorage *Storage = Name.getAsOverloadedTemplate();
6633     // DNInfo work in progress: CHECKME: what about DNLoc?
6634     return DeclarationNameInfo((*Storage->begin())->getDeclName(), NameLoc);
6635   }
6636 
6637   case TemplateName::AssumedTemplate: {
6638     AssumedTemplateStorage *Storage = Name.getAsAssumedTemplateName();
6639     return DeclarationNameInfo(Storage->getDeclName(), NameLoc);
6640   }
6641 
6642   case TemplateName::DependentTemplate: {
6643     DependentTemplateName *DTN = Name.getAsDependentTemplateName();
6644     DeclarationName DName;
6645     if (DTN->isIdentifier()) {
6646       DName = DeclarationNames.getIdentifier(DTN->getIdentifier());
6647       return DeclarationNameInfo(DName, NameLoc);
6648     } else {
6649       DName = DeclarationNames.getCXXOperatorName(DTN->getOperator());
6650       // DNInfo work in progress: FIXME: source locations?
6651       DeclarationNameLoc DNLoc =
6652           DeclarationNameLoc::makeCXXOperatorNameLoc(SourceRange());
6653       return DeclarationNameInfo(DName, NameLoc, DNLoc);
6654     }
6655   }
6656 
6657   case TemplateName::SubstTemplateTemplateParm: {
6658     SubstTemplateTemplateParmStorage *subst
6659       = Name.getAsSubstTemplateTemplateParm();
6660     return DeclarationNameInfo(subst->getParameter()->getDeclName(),
6661                                NameLoc);
6662   }
6663 
6664   case TemplateName::SubstTemplateTemplateParmPack: {
6665     SubstTemplateTemplateParmPackStorage *subst
6666       = Name.getAsSubstTemplateTemplateParmPack();
6667     return DeclarationNameInfo(subst->getParameterPack()->getDeclName(),
6668                                NameLoc);
6669   }
6670   case TemplateName::UsingTemplate:
6671     return DeclarationNameInfo(Name.getAsUsingShadowDecl()->getDeclName(),
6672                                NameLoc);
6673   }
6674 
6675   llvm_unreachable("bad template name kind!");
6676 }
6677 
6678 TemplateName
getCanonicalTemplateName(const TemplateName & Name) const6679 ASTContext::getCanonicalTemplateName(const TemplateName &Name) const {
6680   switch (Name.getKind()) {
6681   case TemplateName::UsingTemplate:
6682   case TemplateName::QualifiedTemplate:
6683   case TemplateName::Template: {
6684     TemplateDecl *Template = Name.getAsTemplateDecl();
6685     if (auto *TTP  = dyn_cast<TemplateTemplateParmDecl>(Template))
6686       Template = getCanonicalTemplateTemplateParmDecl(TTP);
6687 
6688     // The canonical template name is the canonical template declaration.
6689     return TemplateName(cast<TemplateDecl>(Template->getCanonicalDecl()));
6690   }
6691 
6692   case TemplateName::OverloadedTemplate:
6693   case TemplateName::AssumedTemplate:
6694     llvm_unreachable("cannot canonicalize unresolved template");
6695 
6696   case TemplateName::DependentTemplate: {
6697     DependentTemplateName *DTN = Name.getAsDependentTemplateName();
6698     assert(DTN && "Non-dependent template names must refer to template decls.");
6699     return DTN->CanonicalTemplateName;
6700   }
6701 
6702   case TemplateName::SubstTemplateTemplateParm: {
6703     SubstTemplateTemplateParmStorage *subst
6704       = Name.getAsSubstTemplateTemplateParm();
6705     return getCanonicalTemplateName(subst->getReplacement());
6706   }
6707 
6708   case TemplateName::SubstTemplateTemplateParmPack: {
6709     SubstTemplateTemplateParmPackStorage *subst =
6710         Name.getAsSubstTemplateTemplateParmPack();
6711     TemplateArgument canonArgPack =
6712         getCanonicalTemplateArgument(subst->getArgumentPack());
6713     return getSubstTemplateTemplateParmPack(
6714         canonArgPack, subst->getAssociatedDecl()->getCanonicalDecl(),
6715         subst->getFinal(), subst->getIndex());
6716   }
6717   }
6718 
6719   llvm_unreachable("bad template name!");
6720 }
6721 
hasSameTemplateName(const TemplateName & X,const TemplateName & Y) const6722 bool ASTContext::hasSameTemplateName(const TemplateName &X,
6723                                      const TemplateName &Y) const {
6724   return getCanonicalTemplateName(X).getAsVoidPointer() ==
6725          getCanonicalTemplateName(Y).getAsVoidPointer();
6726 }
6727 
isSameConstraintExpr(const Expr * XCE,const Expr * YCE) const6728 bool ASTContext::isSameConstraintExpr(const Expr *XCE, const Expr *YCE) const {
6729   if (!XCE != !YCE)
6730     return false;
6731 
6732   if (!XCE)
6733     return true;
6734 
6735   llvm::FoldingSetNodeID XCEID, YCEID;
6736   XCE->Profile(XCEID, *this, /*Canonical=*/true, /*ProfileLambdaExpr=*/true);
6737   YCE->Profile(YCEID, *this, /*Canonical=*/true, /*ProfileLambdaExpr=*/true);
6738   return XCEID == YCEID;
6739 }
6740 
isSameTypeConstraint(const TypeConstraint * XTC,const TypeConstraint * YTC) const6741 bool ASTContext::isSameTypeConstraint(const TypeConstraint *XTC,
6742                                       const TypeConstraint *YTC) const {
6743   if (!XTC != !YTC)
6744     return false;
6745 
6746   if (!XTC)
6747     return true;
6748 
6749   auto *NCX = XTC->getNamedConcept();
6750   auto *NCY = YTC->getNamedConcept();
6751   if (!NCX || !NCY || !isSameEntity(NCX, NCY))
6752     return false;
6753   if (XTC->getConceptReference()->hasExplicitTemplateArgs() !=
6754       YTC->getConceptReference()->hasExplicitTemplateArgs())
6755     return false;
6756   if (XTC->getConceptReference()->hasExplicitTemplateArgs())
6757     if (XTC->getConceptReference()
6758             ->getTemplateArgsAsWritten()
6759             ->NumTemplateArgs !=
6760         YTC->getConceptReference()->getTemplateArgsAsWritten()->NumTemplateArgs)
6761       return false;
6762 
6763   // Compare slowly by profiling.
6764   //
6765   // We couldn't compare the profiling result for the template
6766   // args here. Consider the following example in different modules:
6767   //
6768   // template <__integer_like _Tp, C<_Tp> Sentinel>
6769   // constexpr _Tp operator()(_Tp &&__t, Sentinel &&last) const {
6770   //   return __t;
6771   // }
6772   //
6773   // When we compare the profiling result for `C<_Tp>` in different
6774   // modules, it will compare the type of `_Tp` in different modules.
6775   // However, the type of `_Tp` in different modules refer to different
6776   // types here naturally. So we couldn't compare the profiling result
6777   // for the template args directly.
6778   return isSameConstraintExpr(XTC->getImmediatelyDeclaredConstraint(),
6779                               YTC->getImmediatelyDeclaredConstraint());
6780 }
6781 
isSameTemplateParameter(const NamedDecl * X,const NamedDecl * Y) const6782 bool ASTContext::isSameTemplateParameter(const NamedDecl *X,
6783                                          const NamedDecl *Y) const {
6784   if (X->getKind() != Y->getKind())
6785     return false;
6786 
6787   if (auto *TX = dyn_cast<TemplateTypeParmDecl>(X)) {
6788     auto *TY = cast<TemplateTypeParmDecl>(Y);
6789     if (TX->isParameterPack() != TY->isParameterPack())
6790       return false;
6791     if (TX->hasTypeConstraint() != TY->hasTypeConstraint())
6792       return false;
6793     return isSameTypeConstraint(TX->getTypeConstraint(),
6794                                 TY->getTypeConstraint());
6795   }
6796 
6797   if (auto *TX = dyn_cast<NonTypeTemplateParmDecl>(X)) {
6798     auto *TY = cast<NonTypeTemplateParmDecl>(Y);
6799     return TX->isParameterPack() == TY->isParameterPack() &&
6800            TX->getASTContext().hasSameType(TX->getType(), TY->getType()) &&
6801            isSameConstraintExpr(TX->getPlaceholderTypeConstraint(),
6802                                 TY->getPlaceholderTypeConstraint());
6803   }
6804 
6805   auto *TX = cast<TemplateTemplateParmDecl>(X);
6806   auto *TY = cast<TemplateTemplateParmDecl>(Y);
6807   return TX->isParameterPack() == TY->isParameterPack() &&
6808          isSameTemplateParameterList(TX->getTemplateParameters(),
6809                                      TY->getTemplateParameters());
6810 }
6811 
isSameTemplateParameterList(const TemplateParameterList * X,const TemplateParameterList * Y) const6812 bool ASTContext::isSameTemplateParameterList(
6813     const TemplateParameterList *X, const TemplateParameterList *Y) const {
6814   if (X->size() != Y->size())
6815     return false;
6816 
6817   for (unsigned I = 0, N = X->size(); I != N; ++I)
6818     if (!isSameTemplateParameter(X->getParam(I), Y->getParam(I)))
6819       return false;
6820 
6821   return isSameConstraintExpr(X->getRequiresClause(), Y->getRequiresClause());
6822 }
6823 
isSameDefaultTemplateArgument(const NamedDecl * X,const NamedDecl * Y) const6824 bool ASTContext::isSameDefaultTemplateArgument(const NamedDecl *X,
6825                                                const NamedDecl *Y) const {
6826   // If the type parameter isn't the same already, we don't need to check the
6827   // default argument further.
6828   if (!isSameTemplateParameter(X, Y))
6829     return false;
6830 
6831   if (auto *TTPX = dyn_cast<TemplateTypeParmDecl>(X)) {
6832     auto *TTPY = cast<TemplateTypeParmDecl>(Y);
6833     if (!TTPX->hasDefaultArgument() || !TTPY->hasDefaultArgument())
6834       return false;
6835 
6836     return hasSameType(TTPX->getDefaultArgument().getArgument().getAsType(),
6837                        TTPY->getDefaultArgument().getArgument().getAsType());
6838   }
6839 
6840   if (auto *NTTPX = dyn_cast<NonTypeTemplateParmDecl>(X)) {
6841     auto *NTTPY = cast<NonTypeTemplateParmDecl>(Y);
6842     if (!NTTPX->hasDefaultArgument() || !NTTPY->hasDefaultArgument())
6843       return false;
6844 
6845     Expr *DefaultArgumentX =
6846         NTTPX->getDefaultArgument().getArgument().getAsExpr()->IgnoreImpCasts();
6847     Expr *DefaultArgumentY =
6848         NTTPY->getDefaultArgument().getArgument().getAsExpr()->IgnoreImpCasts();
6849     llvm::FoldingSetNodeID XID, YID;
6850     DefaultArgumentX->Profile(XID, *this, /*Canonical=*/true);
6851     DefaultArgumentY->Profile(YID, *this, /*Canonical=*/true);
6852     return XID == YID;
6853   }
6854 
6855   auto *TTPX = cast<TemplateTemplateParmDecl>(X);
6856   auto *TTPY = cast<TemplateTemplateParmDecl>(Y);
6857 
6858   if (!TTPX->hasDefaultArgument() || !TTPY->hasDefaultArgument())
6859     return false;
6860 
6861   const TemplateArgument &TAX = TTPX->getDefaultArgument().getArgument();
6862   const TemplateArgument &TAY = TTPY->getDefaultArgument().getArgument();
6863   return hasSameTemplateName(TAX.getAsTemplate(), TAY.getAsTemplate());
6864 }
6865 
getNamespace(const NestedNameSpecifier * X)6866 static NamespaceDecl *getNamespace(const NestedNameSpecifier *X) {
6867   if (auto *NS = X->getAsNamespace())
6868     return NS;
6869   if (auto *NAS = X->getAsNamespaceAlias())
6870     return NAS->getNamespace();
6871   return nullptr;
6872 }
6873 
isSameQualifier(const NestedNameSpecifier * X,const NestedNameSpecifier * Y)6874 static bool isSameQualifier(const NestedNameSpecifier *X,
6875                             const NestedNameSpecifier *Y) {
6876   if (auto *NSX = getNamespace(X)) {
6877     auto *NSY = getNamespace(Y);
6878     if (!NSY || NSX->getCanonicalDecl() != NSY->getCanonicalDecl())
6879       return false;
6880   } else if (X->getKind() != Y->getKind())
6881     return false;
6882 
6883   // FIXME: For namespaces and types, we're permitted to check that the entity
6884   // is named via the same tokens. We should probably do so.
6885   switch (X->getKind()) {
6886   case NestedNameSpecifier::Identifier:
6887     if (X->getAsIdentifier() != Y->getAsIdentifier())
6888       return false;
6889     break;
6890   case NestedNameSpecifier::Namespace:
6891   case NestedNameSpecifier::NamespaceAlias:
6892     // We've already checked that we named the same namespace.
6893     break;
6894   case NestedNameSpecifier::TypeSpec:
6895   case NestedNameSpecifier::TypeSpecWithTemplate:
6896     if (X->getAsType()->getCanonicalTypeInternal() !=
6897         Y->getAsType()->getCanonicalTypeInternal())
6898       return false;
6899     break;
6900   case NestedNameSpecifier::Global:
6901   case NestedNameSpecifier::Super:
6902     return true;
6903   }
6904 
6905   // Recurse into earlier portion of NNS, if any.
6906   auto *PX = X->getPrefix();
6907   auto *PY = Y->getPrefix();
6908   if (PX && PY)
6909     return isSameQualifier(PX, PY);
6910   return !PX && !PY;
6911 }
6912 
6913 /// Determine whether the attributes we can overload on are identical for A and
6914 /// B. Will ignore any overloadable attrs represented in the type of A and B.
hasSameOverloadableAttrs(const FunctionDecl * A,const FunctionDecl * B)6915 static bool hasSameOverloadableAttrs(const FunctionDecl *A,
6916                                      const FunctionDecl *B) {
6917   // Note that pass_object_size attributes are represented in the function's
6918   // ExtParameterInfo, so we don't need to check them here.
6919 
6920   llvm::FoldingSetNodeID Cand1ID, Cand2ID;
6921   auto AEnableIfAttrs = A->specific_attrs<EnableIfAttr>();
6922   auto BEnableIfAttrs = B->specific_attrs<EnableIfAttr>();
6923 
6924   for (auto Pair : zip_longest(AEnableIfAttrs, BEnableIfAttrs)) {
6925     std::optional<EnableIfAttr *> Cand1A = std::get<0>(Pair);
6926     std::optional<EnableIfAttr *> Cand2A = std::get<1>(Pair);
6927 
6928     // Return false if the number of enable_if attributes is different.
6929     if (!Cand1A || !Cand2A)
6930       return false;
6931 
6932     Cand1ID.clear();
6933     Cand2ID.clear();
6934 
6935     (*Cand1A)->getCond()->Profile(Cand1ID, A->getASTContext(), true);
6936     (*Cand2A)->getCond()->Profile(Cand2ID, B->getASTContext(), true);
6937 
6938     // Return false if any of the enable_if expressions of A and B are
6939     // different.
6940     if (Cand1ID != Cand2ID)
6941       return false;
6942   }
6943   return true;
6944 }
6945 
isSameEntity(const NamedDecl * X,const NamedDecl * Y) const6946 bool ASTContext::isSameEntity(const NamedDecl *X, const NamedDecl *Y) const {
6947   // Caution: this function is called by the AST reader during deserialization,
6948   // so it cannot rely on AST invariants being met. Non-trivial accessors
6949   // should be avoided, along with any traversal of redeclaration chains.
6950 
6951   if (X == Y)
6952     return true;
6953 
6954   if (X->getDeclName() != Y->getDeclName())
6955     return false;
6956 
6957   // Must be in the same context.
6958   //
6959   // Note that we can't use DeclContext::Equals here, because the DeclContexts
6960   // could be two different declarations of the same function. (We will fix the
6961   // semantic DC to refer to the primary definition after merging.)
6962   if (!declaresSameEntity(cast<Decl>(X->getDeclContext()->getRedeclContext()),
6963                           cast<Decl>(Y->getDeclContext()->getRedeclContext())))
6964     return false;
6965 
6966   // Two typedefs refer to the same entity if they have the same underlying
6967   // type.
6968   if (const auto *TypedefX = dyn_cast<TypedefNameDecl>(X))
6969     if (const auto *TypedefY = dyn_cast<TypedefNameDecl>(Y))
6970       return hasSameType(TypedefX->getUnderlyingType(),
6971                          TypedefY->getUnderlyingType());
6972 
6973   // Must have the same kind.
6974   if (X->getKind() != Y->getKind())
6975     return false;
6976 
6977   // Objective-C classes and protocols with the same name always match.
6978   if (isa<ObjCInterfaceDecl>(X) || isa<ObjCProtocolDecl>(X))
6979     return true;
6980 
6981   if (isa<ClassTemplateSpecializationDecl>(X)) {
6982     // No need to handle these here: we merge them when adding them to the
6983     // template.
6984     return false;
6985   }
6986 
6987   // Compatible tags match.
6988   if (const auto *TagX = dyn_cast<TagDecl>(X)) {
6989     const auto *TagY = cast<TagDecl>(Y);
6990     return (TagX->getTagKind() == TagY->getTagKind()) ||
6991            ((TagX->getTagKind() == TagTypeKind::Struct ||
6992              TagX->getTagKind() == TagTypeKind::Class ||
6993              TagX->getTagKind() == TagTypeKind::Interface) &&
6994             (TagY->getTagKind() == TagTypeKind::Struct ||
6995              TagY->getTagKind() == TagTypeKind::Class ||
6996              TagY->getTagKind() == TagTypeKind::Interface));
6997   }
6998 
6999   // Functions with the same type and linkage match.
7000   // FIXME: This needs to cope with merging of prototyped/non-prototyped
7001   // functions, etc.
7002   if (const auto *FuncX = dyn_cast<FunctionDecl>(X)) {
7003     const auto *FuncY = cast<FunctionDecl>(Y);
7004     if (const auto *CtorX = dyn_cast<CXXConstructorDecl>(X)) {
7005       const auto *CtorY = cast<CXXConstructorDecl>(Y);
7006       if (CtorX->getInheritedConstructor() &&
7007           !isSameEntity(CtorX->getInheritedConstructor().getConstructor(),
7008                         CtorY->getInheritedConstructor().getConstructor()))
7009         return false;
7010     }
7011 
7012     if (FuncX->isMultiVersion() != FuncY->isMultiVersion())
7013       return false;
7014 
7015     // Multiversioned functions with different feature strings are represented
7016     // as separate declarations.
7017     if (FuncX->isMultiVersion()) {
7018       const auto *TAX = FuncX->getAttr<TargetAttr>();
7019       const auto *TAY = FuncY->getAttr<TargetAttr>();
7020       assert(TAX && TAY && "Multiversion Function without target attribute");
7021 
7022       if (TAX->getFeaturesStr() != TAY->getFeaturesStr())
7023         return false;
7024     }
7025 
7026     // Per C++20 [temp.over.link]/4, friends in different classes are sometimes
7027     // not the same entity if they are constrained.
7028     if ((FuncX->isMemberLikeConstrainedFriend() ||
7029          FuncY->isMemberLikeConstrainedFriend()) &&
7030         !FuncX->getLexicalDeclContext()->Equals(
7031             FuncY->getLexicalDeclContext())) {
7032       return false;
7033     }
7034 
7035     if (!isSameConstraintExpr(FuncX->getTrailingRequiresClause(),
7036                               FuncY->getTrailingRequiresClause()))
7037       return false;
7038 
7039     auto GetTypeAsWritten = [](const FunctionDecl *FD) {
7040       // Map to the first declaration that we've already merged into this one.
7041       // The TSI of redeclarations might not match (due to calling conventions
7042       // being inherited onto the type but not the TSI), but the TSI type of
7043       // the first declaration of the function should match across modules.
7044       FD = FD->getCanonicalDecl();
7045       return FD->getTypeSourceInfo() ? FD->getTypeSourceInfo()->getType()
7046                                      : FD->getType();
7047     };
7048     QualType XT = GetTypeAsWritten(FuncX), YT = GetTypeAsWritten(FuncY);
7049     if (!hasSameType(XT, YT)) {
7050       // We can get functions with different types on the redecl chain in C++17
7051       // if they have differing exception specifications and at least one of
7052       // the excpetion specs is unresolved.
7053       auto *XFPT = XT->getAs<FunctionProtoType>();
7054       auto *YFPT = YT->getAs<FunctionProtoType>();
7055       if (getLangOpts().CPlusPlus17 && XFPT && YFPT &&
7056           (isUnresolvedExceptionSpec(XFPT->getExceptionSpecType()) ||
7057            isUnresolvedExceptionSpec(YFPT->getExceptionSpecType())) &&
7058           hasSameFunctionTypeIgnoringExceptionSpec(XT, YT))
7059         return true;
7060       return false;
7061     }
7062 
7063     return FuncX->getLinkageInternal() == FuncY->getLinkageInternal() &&
7064            hasSameOverloadableAttrs(FuncX, FuncY);
7065   }
7066 
7067   // Variables with the same type and linkage match.
7068   if (const auto *VarX = dyn_cast<VarDecl>(X)) {
7069     const auto *VarY = cast<VarDecl>(Y);
7070     if (VarX->getLinkageInternal() == VarY->getLinkageInternal()) {
7071       // During deserialization, we might compare variables before we load
7072       // their types. Assume the types will end up being the same.
7073       if (VarX->getType().isNull() || VarY->getType().isNull())
7074         return true;
7075 
7076       if (hasSameType(VarX->getType(), VarY->getType()))
7077         return true;
7078 
7079       // We can get decls with different types on the redecl chain. Eg.
7080       // template <typename T> struct S { static T Var[]; }; // #1
7081       // template <typename T> T S<T>::Var[sizeof(T)]; // #2
7082       // Only? happens when completing an incomplete array type. In this case
7083       // when comparing #1 and #2 we should go through their element type.
7084       const ArrayType *VarXTy = getAsArrayType(VarX->getType());
7085       const ArrayType *VarYTy = getAsArrayType(VarY->getType());
7086       if (!VarXTy || !VarYTy)
7087         return false;
7088       if (VarXTy->isIncompleteArrayType() || VarYTy->isIncompleteArrayType())
7089         return hasSameType(VarXTy->getElementType(), VarYTy->getElementType());
7090     }
7091     return false;
7092   }
7093 
7094   // Namespaces with the same name and inlinedness match.
7095   if (const auto *NamespaceX = dyn_cast<NamespaceDecl>(X)) {
7096     const auto *NamespaceY = cast<NamespaceDecl>(Y);
7097     return NamespaceX->isInline() == NamespaceY->isInline();
7098   }
7099 
7100   // Identical template names and kinds match if their template parameter lists
7101   // and patterns match.
7102   if (const auto *TemplateX = dyn_cast<TemplateDecl>(X)) {
7103     const auto *TemplateY = cast<TemplateDecl>(Y);
7104 
7105     // ConceptDecl wouldn't be the same if their constraint expression differs.
7106     if (const auto *ConceptX = dyn_cast<ConceptDecl>(X)) {
7107       const auto *ConceptY = cast<ConceptDecl>(Y);
7108       if (!isSameConstraintExpr(ConceptX->getConstraintExpr(),
7109                                 ConceptY->getConstraintExpr()))
7110         return false;
7111     }
7112 
7113     return isSameEntity(TemplateX->getTemplatedDecl(),
7114                         TemplateY->getTemplatedDecl()) &&
7115            isSameTemplateParameterList(TemplateX->getTemplateParameters(),
7116                                        TemplateY->getTemplateParameters());
7117   }
7118 
7119   // Fields with the same name and the same type match.
7120   if (const auto *FDX = dyn_cast<FieldDecl>(X)) {
7121     const auto *FDY = cast<FieldDecl>(Y);
7122     // FIXME: Also check the bitwidth is odr-equivalent, if any.
7123     return hasSameType(FDX->getType(), FDY->getType());
7124   }
7125 
7126   // Indirect fields with the same target field match.
7127   if (const auto *IFDX = dyn_cast<IndirectFieldDecl>(X)) {
7128     const auto *IFDY = cast<IndirectFieldDecl>(Y);
7129     return IFDX->getAnonField()->getCanonicalDecl() ==
7130            IFDY->getAnonField()->getCanonicalDecl();
7131   }
7132 
7133   // Enumerators with the same name match.
7134   if (isa<EnumConstantDecl>(X))
7135     // FIXME: Also check the value is odr-equivalent.
7136     return true;
7137 
7138   // Using shadow declarations with the same target match.
7139   if (const auto *USX = dyn_cast<UsingShadowDecl>(X)) {
7140     const auto *USY = cast<UsingShadowDecl>(Y);
7141     return declaresSameEntity(USX->getTargetDecl(), USY->getTargetDecl());
7142   }
7143 
7144   // Using declarations with the same qualifier match. (We already know that
7145   // the name matches.)
7146   if (const auto *UX = dyn_cast<UsingDecl>(X)) {
7147     const auto *UY = cast<UsingDecl>(Y);
7148     return isSameQualifier(UX->getQualifier(), UY->getQualifier()) &&
7149            UX->hasTypename() == UY->hasTypename() &&
7150            UX->isAccessDeclaration() == UY->isAccessDeclaration();
7151   }
7152   if (const auto *UX = dyn_cast<UnresolvedUsingValueDecl>(X)) {
7153     const auto *UY = cast<UnresolvedUsingValueDecl>(Y);
7154     return isSameQualifier(UX->getQualifier(), UY->getQualifier()) &&
7155            UX->isAccessDeclaration() == UY->isAccessDeclaration();
7156   }
7157   if (const auto *UX = dyn_cast<UnresolvedUsingTypenameDecl>(X)) {
7158     return isSameQualifier(
7159         UX->getQualifier(),
7160         cast<UnresolvedUsingTypenameDecl>(Y)->getQualifier());
7161   }
7162 
7163   // Using-pack declarations are only created by instantiation, and match if
7164   // they're instantiated from matching UnresolvedUsing...Decls.
7165   if (const auto *UX = dyn_cast<UsingPackDecl>(X)) {
7166     return declaresSameEntity(
7167         UX->getInstantiatedFromUsingDecl(),
7168         cast<UsingPackDecl>(Y)->getInstantiatedFromUsingDecl());
7169   }
7170 
7171   // Namespace alias definitions with the same target match.
7172   if (const auto *NAX = dyn_cast<NamespaceAliasDecl>(X)) {
7173     const auto *NAY = cast<NamespaceAliasDecl>(Y);
7174     return NAX->getNamespace()->Equals(NAY->getNamespace());
7175   }
7176 
7177   return false;
7178 }
7179 
7180 TemplateArgument
getCanonicalTemplateArgument(const TemplateArgument & Arg) const7181 ASTContext::getCanonicalTemplateArgument(const TemplateArgument &Arg) const {
7182   switch (Arg.getKind()) {
7183     case TemplateArgument::Null:
7184       return Arg;
7185 
7186     case TemplateArgument::Expression:
7187       return Arg;
7188 
7189     case TemplateArgument::Declaration: {
7190       auto *D = cast<ValueDecl>(Arg.getAsDecl()->getCanonicalDecl());
7191       return TemplateArgument(D, getCanonicalType(Arg.getParamTypeForDecl()),
7192                               Arg.getIsDefaulted());
7193     }
7194 
7195     case TemplateArgument::NullPtr:
7196       return TemplateArgument(getCanonicalType(Arg.getNullPtrType()),
7197                               /*isNullPtr*/ true, Arg.getIsDefaulted());
7198 
7199     case TemplateArgument::Template:
7200       return TemplateArgument(getCanonicalTemplateName(Arg.getAsTemplate()),
7201                               Arg.getIsDefaulted());
7202 
7203     case TemplateArgument::TemplateExpansion:
7204       return TemplateArgument(
7205           getCanonicalTemplateName(Arg.getAsTemplateOrTemplatePattern()),
7206           Arg.getNumTemplateExpansions(), Arg.getIsDefaulted());
7207 
7208     case TemplateArgument::Integral:
7209       return TemplateArgument(Arg, getCanonicalType(Arg.getIntegralType()));
7210 
7211     case TemplateArgument::StructuralValue:
7212       return TemplateArgument(*this,
7213                               getCanonicalType(Arg.getStructuralValueType()),
7214                               Arg.getAsStructuralValue());
7215 
7216     case TemplateArgument::Type:
7217       return TemplateArgument(getCanonicalType(Arg.getAsType()),
7218                               /*isNullPtr*/ false, Arg.getIsDefaulted());
7219 
7220     case TemplateArgument::Pack: {
7221       bool AnyNonCanonArgs = false;
7222       auto CanonArgs = ::getCanonicalTemplateArguments(
7223           *this, Arg.pack_elements(), AnyNonCanonArgs);
7224       if (!AnyNonCanonArgs)
7225         return Arg;
7226       return TemplateArgument::CreatePackCopy(const_cast<ASTContext &>(*this),
7227                                               CanonArgs);
7228     }
7229   }
7230 
7231   // Silence GCC warning
7232   llvm_unreachable("Unhandled template argument kind");
7233 }
7234 
7235 NestedNameSpecifier *
getCanonicalNestedNameSpecifier(NestedNameSpecifier * NNS) const7236 ASTContext::getCanonicalNestedNameSpecifier(NestedNameSpecifier *NNS) const {
7237   if (!NNS)
7238     return nullptr;
7239 
7240   switch (NNS->getKind()) {
7241   case NestedNameSpecifier::Identifier:
7242     // Canonicalize the prefix but keep the identifier the same.
7243     return NestedNameSpecifier::Create(*this,
7244                          getCanonicalNestedNameSpecifier(NNS->getPrefix()),
7245                                        NNS->getAsIdentifier());
7246 
7247   case NestedNameSpecifier::Namespace:
7248     // A namespace is canonical; build a nested-name-specifier with
7249     // this namespace and no prefix.
7250     return NestedNameSpecifier::Create(*this, nullptr,
7251                                        NNS->getAsNamespace()->getFirstDecl());
7252 
7253   case NestedNameSpecifier::NamespaceAlias:
7254     // A namespace is canonical; build a nested-name-specifier with
7255     // this namespace and no prefix.
7256     return NestedNameSpecifier::Create(
7257         *this, nullptr,
7258         NNS->getAsNamespaceAlias()->getNamespace()->getFirstDecl());
7259 
7260   // The difference between TypeSpec and TypeSpecWithTemplate is that the
7261   // latter will have the 'template' keyword when printed.
7262   case NestedNameSpecifier::TypeSpec:
7263   case NestedNameSpecifier::TypeSpecWithTemplate: {
7264     const Type *T = getCanonicalType(NNS->getAsType());
7265 
7266     // If we have some kind of dependent-named type (e.g., "typename T::type"),
7267     // break it apart into its prefix and identifier, then reconsititute those
7268     // as the canonical nested-name-specifier. This is required to canonicalize
7269     // a dependent nested-name-specifier involving typedefs of dependent-name
7270     // types, e.g.,
7271     //   typedef typename T::type T1;
7272     //   typedef typename T1::type T2;
7273     if (const auto *DNT = T->getAs<DependentNameType>())
7274       return NestedNameSpecifier::Create(*this, DNT->getQualifier(),
7275                                          DNT->getIdentifier());
7276     if (const auto *DTST = T->getAs<DependentTemplateSpecializationType>())
7277       return NestedNameSpecifier::Create(*this, DTST->getQualifier(), true, T);
7278 
7279     // TODO: Set 'Template' parameter to true for other template types.
7280     return NestedNameSpecifier::Create(*this, nullptr, false, T);
7281   }
7282 
7283   case NestedNameSpecifier::Global:
7284   case NestedNameSpecifier::Super:
7285     // The global specifier and __super specifer are canonical and unique.
7286     return NNS;
7287   }
7288 
7289   llvm_unreachable("Invalid NestedNameSpecifier::Kind!");
7290 }
7291 
getAsArrayType(QualType T) const7292 const ArrayType *ASTContext::getAsArrayType(QualType T) const {
7293   // Handle the non-qualified case efficiently.
7294   if (!T.hasLocalQualifiers()) {
7295     // Handle the common positive case fast.
7296     if (const auto *AT = dyn_cast<ArrayType>(T))
7297       return AT;
7298   }
7299 
7300   // Handle the common negative case fast.
7301   if (!isa<ArrayType>(T.getCanonicalType()))
7302     return nullptr;
7303 
7304   // Apply any qualifiers from the array type to the element type.  This
7305   // implements C99 6.7.3p8: "If the specification of an array type includes
7306   // any type qualifiers, the element type is so qualified, not the array type."
7307 
7308   // If we get here, we either have type qualifiers on the type, or we have
7309   // sugar such as a typedef in the way.  If we have type qualifiers on the type
7310   // we must propagate them down into the element type.
7311 
7312   SplitQualType split = T.getSplitDesugaredType();
7313   Qualifiers qs = split.Quals;
7314 
7315   // If we have a simple case, just return now.
7316   const auto *ATy = dyn_cast<ArrayType>(split.Ty);
7317   if (!ATy || qs.empty())
7318     return ATy;
7319 
7320   // Otherwise, we have an array and we have qualifiers on it.  Push the
7321   // qualifiers into the array element type and return a new array type.
7322   QualType NewEltTy = getQualifiedType(ATy->getElementType(), qs);
7323 
7324   if (const auto *CAT = dyn_cast<ConstantArrayType>(ATy))
7325     return cast<ArrayType>(getConstantArrayType(NewEltTy, CAT->getSize(),
7326                                                 CAT->getSizeExpr(),
7327                                                 CAT->getSizeModifier(),
7328                                            CAT->getIndexTypeCVRQualifiers()));
7329   if (const auto *IAT = dyn_cast<IncompleteArrayType>(ATy))
7330     return cast<ArrayType>(getIncompleteArrayType(NewEltTy,
7331                                                   IAT->getSizeModifier(),
7332                                            IAT->getIndexTypeCVRQualifiers()));
7333 
7334   if (const auto *DSAT = dyn_cast<DependentSizedArrayType>(ATy))
7335     return cast<ArrayType>(
7336                      getDependentSizedArrayType(NewEltTy,
7337                                                 DSAT->getSizeExpr(),
7338                                                 DSAT->getSizeModifier(),
7339                                               DSAT->getIndexTypeCVRQualifiers(),
7340                                                 DSAT->getBracketsRange()));
7341 
7342   const auto *VAT = cast<VariableArrayType>(ATy);
7343   return cast<ArrayType>(getVariableArrayType(NewEltTy,
7344                                               VAT->getSizeExpr(),
7345                                               VAT->getSizeModifier(),
7346                                               VAT->getIndexTypeCVRQualifiers(),
7347                                               VAT->getBracketsRange()));
7348 }
7349 
getAdjustedParameterType(QualType T) const7350 QualType ASTContext::getAdjustedParameterType(QualType T) const {
7351   if (getLangOpts().HLSL && T->isConstantArrayType())
7352     return getArrayParameterType(T);
7353   if (T->isArrayType() || T->isFunctionType())
7354     return getDecayedType(T);
7355   return T;
7356 }
7357 
getSignatureParameterType(QualType T) const7358 QualType ASTContext::getSignatureParameterType(QualType T) const {
7359   T = getVariableArrayDecayedType(T);
7360   T = getAdjustedParameterType(T);
7361   return T.getUnqualifiedType();
7362 }
7363 
getExceptionObjectType(QualType T) const7364 QualType ASTContext::getExceptionObjectType(QualType T) const {
7365   // C++ [except.throw]p3:
7366   //   A throw-expression initializes a temporary object, called the exception
7367   //   object, the type of which is determined by removing any top-level
7368   //   cv-qualifiers from the static type of the operand of throw and adjusting
7369   //   the type from "array of T" or "function returning T" to "pointer to T"
7370   //   or "pointer to function returning T", [...]
7371   T = getVariableArrayDecayedType(T);
7372   if (T->isArrayType() || T->isFunctionType())
7373     T = getDecayedType(T);
7374   return T.getUnqualifiedType();
7375 }
7376 
7377 /// getArrayDecayedType - Return the properly qualified result of decaying the
7378 /// specified array type to a pointer.  This operation is non-trivial when
7379 /// handling typedefs etc.  The canonical type of "T" must be an array type,
7380 /// this returns a pointer to a properly qualified element of the array.
7381 ///
7382 /// See C99 6.7.5.3p7 and C99 6.3.2.1p3.
getArrayDecayedType(QualType Ty) const7383 QualType ASTContext::getArrayDecayedType(QualType Ty) const {
7384   // Get the element type with 'getAsArrayType' so that we don't lose any
7385   // typedefs in the element type of the array.  This also handles propagation
7386   // of type qualifiers from the array type into the element type if present
7387   // (C99 6.7.3p8).
7388   const ArrayType *PrettyArrayType = getAsArrayType(Ty);
7389   assert(PrettyArrayType && "Not an array type!");
7390 
7391   QualType PtrTy = getPointerType(PrettyArrayType->getElementType());
7392 
7393   // int x[restrict 4] ->  int *restrict
7394   QualType Result = getQualifiedType(PtrTy,
7395                                      PrettyArrayType->getIndexTypeQualifiers());
7396 
7397   // int x[_Nullable] -> int * _Nullable
7398   if (auto Nullability = Ty->getNullability()) {
7399     Result = const_cast<ASTContext *>(this)->getAttributedType(
7400         AttributedType::getNullabilityAttrKind(*Nullability), Result, Result);
7401   }
7402   return Result;
7403 }
7404 
getBaseElementType(const ArrayType * array) const7405 QualType ASTContext::getBaseElementType(const ArrayType *array) const {
7406   return getBaseElementType(array->getElementType());
7407 }
7408 
getBaseElementType(QualType type) const7409 QualType ASTContext::getBaseElementType(QualType type) const {
7410   Qualifiers qs;
7411   while (true) {
7412     SplitQualType split = type.getSplitDesugaredType();
7413     const ArrayType *array = split.Ty->getAsArrayTypeUnsafe();
7414     if (!array) break;
7415 
7416     type = array->getElementType();
7417     qs.addConsistentQualifiers(split.Quals);
7418   }
7419 
7420   return getQualifiedType(type, qs);
7421 }
7422 
7423 /// getConstantArrayElementCount - Returns number of constant array elements.
7424 uint64_t
getConstantArrayElementCount(const ConstantArrayType * CA) const7425 ASTContext::getConstantArrayElementCount(const ConstantArrayType *CA)  const {
7426   uint64_t ElementCount = 1;
7427   do {
7428     ElementCount *= CA->getZExtSize();
7429     CA = dyn_cast_or_null<ConstantArrayType>(
7430       CA->getElementType()->getAsArrayTypeUnsafe());
7431   } while (CA);
7432   return ElementCount;
7433 }
7434 
getArrayInitLoopExprElementCount(const ArrayInitLoopExpr * AILE) const7435 uint64_t ASTContext::getArrayInitLoopExprElementCount(
7436     const ArrayInitLoopExpr *AILE) const {
7437   if (!AILE)
7438     return 0;
7439 
7440   uint64_t ElementCount = 1;
7441 
7442   do {
7443     ElementCount *= AILE->getArraySize().getZExtValue();
7444     AILE = dyn_cast<ArrayInitLoopExpr>(AILE->getSubExpr());
7445   } while (AILE);
7446 
7447   return ElementCount;
7448 }
7449 
7450 /// getFloatingRank - Return a relative rank for floating point types.
7451 /// This routine will assert if passed a built-in type that isn't a float.
getFloatingRank(QualType T)7452 static FloatingRank getFloatingRank(QualType T) {
7453   if (const auto *CT = T->getAs<ComplexType>())
7454     return getFloatingRank(CT->getElementType());
7455 
7456   switch (T->castAs<BuiltinType>()->getKind()) {
7457   default: llvm_unreachable("getFloatingRank(): not a floating type");
7458   case BuiltinType::Float16:    return Float16Rank;
7459   case BuiltinType::Half:       return HalfRank;
7460   case BuiltinType::Float:      return FloatRank;
7461   case BuiltinType::Double:     return DoubleRank;
7462   case BuiltinType::LongDouble: return LongDoubleRank;
7463   case BuiltinType::Float128:   return Float128Rank;
7464   case BuiltinType::BFloat16:   return BFloat16Rank;
7465   case BuiltinType::Ibm128:     return Ibm128Rank;
7466   }
7467 }
7468 
7469 /// getFloatingTypeOrder - Compare the rank of the two specified floating
7470 /// point types, ignoring the domain of the type (i.e. 'double' ==
7471 /// '_Complex double').  If LHS > RHS, return 1.  If LHS == RHS, return 0. If
7472 /// LHS < RHS, return -1.
getFloatingTypeOrder(QualType LHS,QualType RHS) const7473 int ASTContext::getFloatingTypeOrder(QualType LHS, QualType RHS) const {
7474   FloatingRank LHSR = getFloatingRank(LHS);
7475   FloatingRank RHSR = getFloatingRank(RHS);
7476 
7477   if (LHSR == RHSR)
7478     return 0;
7479   if (LHSR > RHSR)
7480     return 1;
7481   return -1;
7482 }
7483 
getFloatingTypeSemanticOrder(QualType LHS,QualType RHS) const7484 int ASTContext::getFloatingTypeSemanticOrder(QualType LHS, QualType RHS) const {
7485   if (&getFloatTypeSemantics(LHS) == &getFloatTypeSemantics(RHS))
7486     return 0;
7487   return getFloatingTypeOrder(LHS, RHS);
7488 }
7489 
7490 /// getIntegerRank - Return an integer conversion rank (C99 6.3.1.1p1). This
7491 /// routine will assert if passed a built-in type that isn't an integer or enum,
7492 /// or if it is not canonicalized.
getIntegerRank(const Type * T) const7493 unsigned ASTContext::getIntegerRank(const Type *T) const {
7494   assert(T->isCanonicalUnqualified() && "T should be canonicalized");
7495 
7496   // Results in this 'losing' to any type of the same size, but winning if
7497   // larger.
7498   if (const auto *EIT = dyn_cast<BitIntType>(T))
7499     return 0 + (EIT->getNumBits() << 3);
7500 
7501   switch (cast<BuiltinType>(T)->getKind()) {
7502   default: llvm_unreachable("getIntegerRank(): not a built-in integer");
7503   case BuiltinType::Bool:
7504     return 1 + (getIntWidth(BoolTy) << 3);
7505   case BuiltinType::Char_S:
7506   case BuiltinType::Char_U:
7507   case BuiltinType::SChar:
7508   case BuiltinType::UChar:
7509     return 2 + (getIntWidth(CharTy) << 3);
7510   case BuiltinType::Short:
7511   case BuiltinType::UShort:
7512     return 3 + (getIntWidth(ShortTy) << 3);
7513   case BuiltinType::Int:
7514   case BuiltinType::UInt:
7515     return 4 + (getIntWidth(IntTy) << 3);
7516   case BuiltinType::Long:
7517   case BuiltinType::ULong:
7518     return 5 + (getIntWidth(LongTy) << 3);
7519   case BuiltinType::LongLong:
7520   case BuiltinType::ULongLong:
7521     return 6 + (getIntWidth(LongLongTy) << 3);
7522   case BuiltinType::Int128:
7523   case BuiltinType::UInt128:
7524     return 7 + (getIntWidth(Int128Ty) << 3);
7525 
7526   // "The ranks of char8_t, char16_t, char32_t, and wchar_t equal the ranks of
7527   // their underlying types" [c++20 conv.rank]
7528   case BuiltinType::Char8:
7529     return getIntegerRank(UnsignedCharTy.getTypePtr());
7530   case BuiltinType::Char16:
7531     return getIntegerRank(
7532         getFromTargetType(Target->getChar16Type()).getTypePtr());
7533   case BuiltinType::Char32:
7534     return getIntegerRank(
7535         getFromTargetType(Target->getChar32Type()).getTypePtr());
7536   case BuiltinType::WChar_S:
7537   case BuiltinType::WChar_U:
7538     return getIntegerRank(
7539         getFromTargetType(Target->getWCharType()).getTypePtr());
7540   }
7541 }
7542 
7543 /// Whether this is a promotable bitfield reference according
7544 /// to C99 6.3.1.1p2, bullet 2 (and GCC extensions).
7545 ///
7546 /// \returns the type this bit-field will promote to, or NULL if no
7547 /// promotion occurs.
isPromotableBitField(Expr * E) const7548 QualType ASTContext::isPromotableBitField(Expr *E) const {
7549   if (E->isTypeDependent() || E->isValueDependent())
7550     return {};
7551 
7552   // C++ [conv.prom]p5:
7553   //    If the bit-field has an enumerated type, it is treated as any other
7554   //    value of that type for promotion purposes.
7555   if (getLangOpts().CPlusPlus && E->getType()->isEnumeralType())
7556     return {};
7557 
7558   // FIXME: We should not do this unless E->refersToBitField() is true. This
7559   // matters in C where getSourceBitField() will find bit-fields for various
7560   // cases where the source expression is not a bit-field designator.
7561 
7562   FieldDecl *Field = E->getSourceBitField(); // FIXME: conditional bit-fields?
7563   if (!Field)
7564     return {};
7565 
7566   QualType FT = Field->getType();
7567 
7568   uint64_t BitWidth = Field->getBitWidthValue(*this);
7569   uint64_t IntSize = getTypeSize(IntTy);
7570   // C++ [conv.prom]p5:
7571   //   A prvalue for an integral bit-field can be converted to a prvalue of type
7572   //   int if int can represent all the values of the bit-field; otherwise, it
7573   //   can be converted to unsigned int if unsigned int can represent all the
7574   //   values of the bit-field. If the bit-field is larger yet, no integral
7575   //   promotion applies to it.
7576   // C11 6.3.1.1/2:
7577   //   [For a bit-field of type _Bool, int, signed int, or unsigned int:]
7578   //   If an int can represent all values of the original type (as restricted by
7579   //   the width, for a bit-field), the value is converted to an int; otherwise,
7580   //   it is converted to an unsigned int.
7581   //
7582   // FIXME: C does not permit promotion of a 'long : 3' bitfield to int.
7583   //        We perform that promotion here to match GCC and C++.
7584   // FIXME: C does not permit promotion of an enum bit-field whose rank is
7585   //        greater than that of 'int'. We perform that promotion to match GCC.
7586   //
7587   // C23 6.3.1.1p2:
7588   //   The value from a bit-field of a bit-precise integer type is converted to
7589   //   the corresponding bit-precise integer type. (The rest is the same as in
7590   //   C11.)
7591   if (QualType QT = Field->getType(); QT->isBitIntType())
7592     return QT;
7593 
7594   if (BitWidth < IntSize)
7595     return IntTy;
7596 
7597   if (BitWidth == IntSize)
7598     return FT->isSignedIntegerType() ? IntTy : UnsignedIntTy;
7599 
7600   // Bit-fields wider than int are not subject to promotions, and therefore act
7601   // like the base type. GCC has some weird bugs in this area that we
7602   // deliberately do not follow (GCC follows a pre-standard resolution to
7603   // C's DR315 which treats bit-width as being part of the type, and this leaks
7604   // into their semantics in some cases).
7605   return {};
7606 }
7607 
7608 /// getPromotedIntegerType - Returns the type that Promotable will
7609 /// promote to: C99 6.3.1.1p2, assuming that Promotable is a promotable
7610 /// integer type.
getPromotedIntegerType(QualType Promotable) const7611 QualType ASTContext::getPromotedIntegerType(QualType Promotable) const {
7612   assert(!Promotable.isNull());
7613   assert(isPromotableIntegerType(Promotable));
7614   if (const auto *ET = Promotable->getAs<EnumType>())
7615     return ET->getDecl()->getPromotionType();
7616 
7617   if (const auto *BT = Promotable->getAs<BuiltinType>()) {
7618     // C++ [conv.prom]: A prvalue of type char16_t, char32_t, or wchar_t
7619     // (3.9.1) can be converted to a prvalue of the first of the following
7620     // types that can represent all the values of its underlying type:
7621     // int, unsigned int, long int, unsigned long int, long long int, or
7622     // unsigned long long int [...]
7623     // FIXME: Is there some better way to compute this?
7624     if (BT->getKind() == BuiltinType::WChar_S ||
7625         BT->getKind() == BuiltinType::WChar_U ||
7626         BT->getKind() == BuiltinType::Char8 ||
7627         BT->getKind() == BuiltinType::Char16 ||
7628         BT->getKind() == BuiltinType::Char32) {
7629       bool FromIsSigned = BT->getKind() == BuiltinType::WChar_S;
7630       uint64_t FromSize = getTypeSize(BT);
7631       QualType PromoteTypes[] = { IntTy, UnsignedIntTy, LongTy, UnsignedLongTy,
7632                                   LongLongTy, UnsignedLongLongTy };
7633       for (const auto &PT : PromoteTypes) {
7634         uint64_t ToSize = getTypeSize(PT);
7635         if (FromSize < ToSize ||
7636             (FromSize == ToSize && FromIsSigned == PT->isSignedIntegerType()))
7637           return PT;
7638       }
7639       llvm_unreachable("char type should fit into long long");
7640     }
7641   }
7642 
7643   // At this point, we should have a signed or unsigned integer type.
7644   if (Promotable->isSignedIntegerType())
7645     return IntTy;
7646   uint64_t PromotableSize = getIntWidth(Promotable);
7647   uint64_t IntSize = getIntWidth(IntTy);
7648   assert(Promotable->isUnsignedIntegerType() && PromotableSize <= IntSize);
7649   return (PromotableSize != IntSize) ? IntTy : UnsignedIntTy;
7650 }
7651 
7652 /// Recurses in pointer/array types until it finds an objc retainable
7653 /// type and returns its ownership.
getInnerObjCOwnership(QualType T) const7654 Qualifiers::ObjCLifetime ASTContext::getInnerObjCOwnership(QualType T) const {
7655   while (!T.isNull()) {
7656     if (T.getObjCLifetime() != Qualifiers::OCL_None)
7657       return T.getObjCLifetime();
7658     if (T->isArrayType())
7659       T = getBaseElementType(T);
7660     else if (const auto *PT = T->getAs<PointerType>())
7661       T = PT->getPointeeType();
7662     else if (const auto *RT = T->getAs<ReferenceType>())
7663       T = RT->getPointeeType();
7664     else
7665       break;
7666   }
7667 
7668   return Qualifiers::OCL_None;
7669 }
7670 
getIntegerTypeForEnum(const EnumType * ET)7671 static const Type *getIntegerTypeForEnum(const EnumType *ET) {
7672   // Incomplete enum types are not treated as integer types.
7673   // FIXME: In C++, enum types are never integer types.
7674   if (ET->getDecl()->isComplete() && !ET->getDecl()->isScoped())
7675     return ET->getDecl()->getIntegerType().getTypePtr();
7676   return nullptr;
7677 }
7678 
7679 /// getIntegerTypeOrder - Returns the highest ranked integer type:
7680 /// C99 6.3.1.8p1.  If LHS > RHS, return 1.  If LHS == RHS, return 0. If
7681 /// LHS < RHS, return -1.
getIntegerTypeOrder(QualType LHS,QualType RHS) const7682 int ASTContext::getIntegerTypeOrder(QualType LHS, QualType RHS) const {
7683   const Type *LHSC = getCanonicalType(LHS).getTypePtr();
7684   const Type *RHSC = getCanonicalType(RHS).getTypePtr();
7685 
7686   // Unwrap enums to their underlying type.
7687   if (const auto *ET = dyn_cast<EnumType>(LHSC))
7688     LHSC = getIntegerTypeForEnum(ET);
7689   if (const auto *ET = dyn_cast<EnumType>(RHSC))
7690     RHSC = getIntegerTypeForEnum(ET);
7691 
7692   if (LHSC == RHSC) return 0;
7693 
7694   bool LHSUnsigned = LHSC->isUnsignedIntegerType();
7695   bool RHSUnsigned = RHSC->isUnsignedIntegerType();
7696 
7697   unsigned LHSRank = getIntegerRank(LHSC);
7698   unsigned RHSRank = getIntegerRank(RHSC);
7699 
7700   if (LHSUnsigned == RHSUnsigned) {  // Both signed or both unsigned.
7701     if (LHSRank == RHSRank) return 0;
7702     return LHSRank > RHSRank ? 1 : -1;
7703   }
7704 
7705   // Otherwise, the LHS is signed and the RHS is unsigned or visa versa.
7706   if (LHSUnsigned) {
7707     // If the unsigned [LHS] type is larger, return it.
7708     if (LHSRank >= RHSRank)
7709       return 1;
7710 
7711     // If the signed type can represent all values of the unsigned type, it
7712     // wins.  Because we are dealing with 2's complement and types that are
7713     // powers of two larger than each other, this is always safe.
7714     return -1;
7715   }
7716 
7717   // If the unsigned [RHS] type is larger, return it.
7718   if (RHSRank >= LHSRank)
7719     return -1;
7720 
7721   // If the signed type can represent all values of the unsigned type, it
7722   // wins.  Because we are dealing with 2's complement and types that are
7723   // powers of two larger than each other, this is always safe.
7724   return 1;
7725 }
7726 
getCFConstantStringDecl() const7727 TypedefDecl *ASTContext::getCFConstantStringDecl() const {
7728   if (CFConstantStringTypeDecl)
7729     return CFConstantStringTypeDecl;
7730 
7731   assert(!CFConstantStringTagDecl &&
7732          "tag and typedef should be initialized together");
7733   CFConstantStringTagDecl = buildImplicitRecord("__NSConstantString_tag");
7734   CFConstantStringTagDecl->startDefinition();
7735 
7736   struct {
7737     QualType Type;
7738     const char *Name;
7739   } Fields[5];
7740   unsigned Count = 0;
7741 
7742   /// Objective-C ABI
7743   ///
7744   ///    typedef struct __NSConstantString_tag {
7745   ///      const int *isa;
7746   ///      int flags;
7747   ///      const char *str;
7748   ///      long length;
7749   ///    } __NSConstantString;
7750   ///
7751   /// Swift ABI (4.1, 4.2)
7752   ///
7753   ///    typedef struct __NSConstantString_tag {
7754   ///      uintptr_t _cfisa;
7755   ///      uintptr_t _swift_rc;
7756   ///      _Atomic(uint64_t) _cfinfoa;
7757   ///      const char *_ptr;
7758   ///      uint32_t _length;
7759   ///    } __NSConstantString;
7760   ///
7761   /// Swift ABI (5.0)
7762   ///
7763   ///    typedef struct __NSConstantString_tag {
7764   ///      uintptr_t _cfisa;
7765   ///      uintptr_t _swift_rc;
7766   ///      _Atomic(uint64_t) _cfinfoa;
7767   ///      const char *_ptr;
7768   ///      uintptr_t _length;
7769   ///    } __NSConstantString;
7770 
7771   const auto CFRuntime = getLangOpts().CFRuntime;
7772   if (static_cast<unsigned>(CFRuntime) <
7773       static_cast<unsigned>(LangOptions::CoreFoundationABI::Swift)) {
7774     Fields[Count++] = { getPointerType(IntTy.withConst()), "isa" };
7775     Fields[Count++] = { IntTy, "flags" };
7776     Fields[Count++] = { getPointerType(CharTy.withConst()), "str" };
7777     Fields[Count++] = { LongTy, "length" };
7778   } else {
7779     Fields[Count++] = { getUIntPtrType(), "_cfisa" };
7780     Fields[Count++] = { getUIntPtrType(), "_swift_rc" };
7781     Fields[Count++] = { getFromTargetType(Target->getUInt64Type()), "_swift_rc" };
7782     Fields[Count++] = { getPointerType(CharTy.withConst()), "_ptr" };
7783     if (CFRuntime == LangOptions::CoreFoundationABI::Swift4_1 ||
7784         CFRuntime == LangOptions::CoreFoundationABI::Swift4_2)
7785       Fields[Count++] = { IntTy, "_ptr" };
7786     else
7787       Fields[Count++] = { getUIntPtrType(), "_ptr" };
7788   }
7789 
7790   // Create fields
7791   for (unsigned i = 0; i < Count; ++i) {
7792     FieldDecl *Field =
7793         FieldDecl::Create(*this, CFConstantStringTagDecl, SourceLocation(),
7794                           SourceLocation(), &Idents.get(Fields[i].Name),
7795                           Fields[i].Type, /*TInfo=*/nullptr,
7796                           /*BitWidth=*/nullptr, /*Mutable=*/false, ICIS_NoInit);
7797     Field->setAccess(AS_public);
7798     CFConstantStringTagDecl->addDecl(Field);
7799   }
7800 
7801   CFConstantStringTagDecl->completeDefinition();
7802   // This type is designed to be compatible with NSConstantString, but cannot
7803   // use the same name, since NSConstantString is an interface.
7804   auto tagType = getTagDeclType(CFConstantStringTagDecl);
7805   CFConstantStringTypeDecl =
7806       buildImplicitTypedef(tagType, "__NSConstantString");
7807 
7808   return CFConstantStringTypeDecl;
7809 }
7810 
getCFConstantStringTagDecl() const7811 RecordDecl *ASTContext::getCFConstantStringTagDecl() const {
7812   if (!CFConstantStringTagDecl)
7813     getCFConstantStringDecl(); // Build the tag and the typedef.
7814   return CFConstantStringTagDecl;
7815 }
7816 
7817 // getCFConstantStringType - Return the type used for constant CFStrings.
getCFConstantStringType() const7818 QualType ASTContext::getCFConstantStringType() const {
7819   return getTypedefType(getCFConstantStringDecl());
7820 }
7821 
getObjCSuperType() const7822 QualType ASTContext::getObjCSuperType() const {
7823   if (ObjCSuperType.isNull()) {
7824     RecordDecl *ObjCSuperTypeDecl = buildImplicitRecord("objc_super");
7825     getTranslationUnitDecl()->addDecl(ObjCSuperTypeDecl);
7826     ObjCSuperType = getTagDeclType(ObjCSuperTypeDecl);
7827   }
7828   return ObjCSuperType;
7829 }
7830 
setCFConstantStringType(QualType T)7831 void ASTContext::setCFConstantStringType(QualType T) {
7832   const auto *TD = T->castAs<TypedefType>();
7833   CFConstantStringTypeDecl = cast<TypedefDecl>(TD->getDecl());
7834   const auto *TagType =
7835       CFConstantStringTypeDecl->getUnderlyingType()->castAs<RecordType>();
7836   CFConstantStringTagDecl = TagType->getDecl();
7837 }
7838 
getBlockDescriptorType() const7839 QualType ASTContext::getBlockDescriptorType() const {
7840   if (BlockDescriptorType)
7841     return getTagDeclType(BlockDescriptorType);
7842 
7843   RecordDecl *RD;
7844   // FIXME: Needs the FlagAppleBlock bit.
7845   RD = buildImplicitRecord("__block_descriptor");
7846   RD->startDefinition();
7847 
7848   QualType FieldTypes[] = {
7849     UnsignedLongTy,
7850     UnsignedLongTy,
7851   };
7852 
7853   static const char *const FieldNames[] = {
7854     "reserved",
7855     "Size"
7856   };
7857 
7858   for (size_t i = 0; i < 2; ++i) {
7859     FieldDecl *Field = FieldDecl::Create(
7860         *this, RD, SourceLocation(), SourceLocation(),
7861         &Idents.get(FieldNames[i]), FieldTypes[i], /*TInfo=*/nullptr,
7862         /*BitWidth=*/nullptr, /*Mutable=*/false, ICIS_NoInit);
7863     Field->setAccess(AS_public);
7864     RD->addDecl(Field);
7865   }
7866 
7867   RD->completeDefinition();
7868 
7869   BlockDescriptorType = RD;
7870 
7871   return getTagDeclType(BlockDescriptorType);
7872 }
7873 
getBlockDescriptorExtendedType() const7874 QualType ASTContext::getBlockDescriptorExtendedType() const {
7875   if (BlockDescriptorExtendedType)
7876     return getTagDeclType(BlockDescriptorExtendedType);
7877 
7878   RecordDecl *RD;
7879   // FIXME: Needs the FlagAppleBlock bit.
7880   RD = buildImplicitRecord("__block_descriptor_withcopydispose");
7881   RD->startDefinition();
7882 
7883   QualType FieldTypes[] = {
7884     UnsignedLongTy,
7885     UnsignedLongTy,
7886     getPointerType(VoidPtrTy),
7887     getPointerType(VoidPtrTy)
7888   };
7889 
7890   static const char *const FieldNames[] = {
7891     "reserved",
7892     "Size",
7893     "CopyFuncPtr",
7894     "DestroyFuncPtr"
7895   };
7896 
7897   for (size_t i = 0; i < 4; ++i) {
7898     FieldDecl *Field = FieldDecl::Create(
7899         *this, RD, SourceLocation(), SourceLocation(),
7900         &Idents.get(FieldNames[i]), FieldTypes[i], /*TInfo=*/nullptr,
7901         /*BitWidth=*/nullptr,
7902         /*Mutable=*/false, ICIS_NoInit);
7903     Field->setAccess(AS_public);
7904     RD->addDecl(Field);
7905   }
7906 
7907   RD->completeDefinition();
7908 
7909   BlockDescriptorExtendedType = RD;
7910   return getTagDeclType(BlockDescriptorExtendedType);
7911 }
7912 
getOpenCLTypeKind(const Type * T) const7913 OpenCLTypeKind ASTContext::getOpenCLTypeKind(const Type *T) const {
7914   const auto *BT = dyn_cast<BuiltinType>(T);
7915 
7916   if (!BT) {
7917     if (isa<PipeType>(T))
7918       return OCLTK_Pipe;
7919 
7920     return OCLTK_Default;
7921   }
7922 
7923   switch (BT->getKind()) {
7924 #define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix)                   \
7925   case BuiltinType::Id:                                                        \
7926     return OCLTK_Image;
7927 #include "clang/Basic/OpenCLImageTypes.def"
7928 
7929   case BuiltinType::OCLClkEvent:
7930     return OCLTK_ClkEvent;
7931 
7932   case BuiltinType::OCLEvent:
7933     return OCLTK_Event;
7934 
7935   case BuiltinType::OCLQueue:
7936     return OCLTK_Queue;
7937 
7938   case BuiltinType::OCLReserveID:
7939     return OCLTK_ReserveID;
7940 
7941   case BuiltinType::OCLSampler:
7942     return OCLTK_Sampler;
7943 
7944   default:
7945     return OCLTK_Default;
7946   }
7947 }
7948 
getOpenCLTypeAddrSpace(const Type * T) const7949 LangAS ASTContext::getOpenCLTypeAddrSpace(const Type *T) const {
7950   return Target->getOpenCLTypeAddrSpace(getOpenCLTypeKind(T));
7951 }
7952 
7953 /// BlockRequiresCopying - Returns true if byref variable "D" of type "Ty"
7954 /// requires copy/dispose. Note that this must match the logic
7955 /// in buildByrefHelpers.
BlockRequiresCopying(QualType Ty,const VarDecl * D)7956 bool ASTContext::BlockRequiresCopying(QualType Ty,
7957                                       const VarDecl *D) {
7958   if (const CXXRecordDecl *record = Ty->getAsCXXRecordDecl()) {
7959     const Expr *copyExpr = getBlockVarCopyInit(D).getCopyExpr();
7960     if (!copyExpr && record->hasTrivialDestructor()) return false;
7961 
7962     return true;
7963   }
7964 
7965   // The block needs copy/destroy helpers if Ty is non-trivial to destructively
7966   // move or destroy.
7967   if (Ty.isNonTrivialToPrimitiveDestructiveMove() || Ty.isDestructedType())
7968     return true;
7969 
7970   if (!Ty->isObjCRetainableType()) return false;
7971 
7972   Qualifiers qs = Ty.getQualifiers();
7973 
7974   // If we have lifetime, that dominates.
7975   if (Qualifiers::ObjCLifetime lifetime = qs.getObjCLifetime()) {
7976     switch (lifetime) {
7977       case Qualifiers::OCL_None: llvm_unreachable("impossible");
7978 
7979       // These are just bits as far as the runtime is concerned.
7980       case Qualifiers::OCL_ExplicitNone:
7981       case Qualifiers::OCL_Autoreleasing:
7982         return false;
7983 
7984       // These cases should have been taken care of when checking the type's
7985       // non-triviality.
7986       case Qualifiers::OCL_Weak:
7987       case Qualifiers::OCL_Strong:
7988         llvm_unreachable("impossible");
7989     }
7990     llvm_unreachable("fell out of lifetime switch!");
7991   }
7992   return (Ty->isBlockPointerType() || isObjCNSObjectType(Ty) ||
7993           Ty->isObjCObjectPointerType());
7994 }
7995 
getByrefLifetime(QualType Ty,Qualifiers::ObjCLifetime & LifeTime,bool & HasByrefExtendedLayout) const7996 bool ASTContext::getByrefLifetime(QualType Ty,
7997                               Qualifiers::ObjCLifetime &LifeTime,
7998                               bool &HasByrefExtendedLayout) const {
7999   if (!getLangOpts().ObjC ||
8000       getLangOpts().getGC() != LangOptions::NonGC)
8001     return false;
8002 
8003   HasByrefExtendedLayout = false;
8004   if (Ty->isRecordType()) {
8005     HasByrefExtendedLayout = true;
8006     LifeTime = Qualifiers::OCL_None;
8007   } else if ((LifeTime = Ty.getObjCLifetime())) {
8008     // Honor the ARC qualifiers.
8009   } else if (Ty->isObjCObjectPointerType() || Ty->isBlockPointerType()) {
8010     // The MRR rule.
8011     LifeTime = Qualifiers::OCL_ExplicitNone;
8012   } else {
8013     LifeTime = Qualifiers::OCL_None;
8014   }
8015   return true;
8016 }
8017 
getNSUIntegerType() const8018 CanQualType ASTContext::getNSUIntegerType() const {
8019   assert(Target && "Expected target to be initialized");
8020   const llvm::Triple &T = Target->getTriple();
8021   // Windows is LLP64 rather than LP64
8022   if (T.isOSWindows() && T.isArch64Bit())
8023     return UnsignedLongLongTy;
8024   return UnsignedLongTy;
8025 }
8026 
getNSIntegerType() const8027 CanQualType ASTContext::getNSIntegerType() const {
8028   assert(Target && "Expected target to be initialized");
8029   const llvm::Triple &T = Target->getTriple();
8030   // Windows is LLP64 rather than LP64
8031   if (T.isOSWindows() && T.isArch64Bit())
8032     return LongLongTy;
8033   return LongTy;
8034 }
8035 
getObjCInstanceTypeDecl()8036 TypedefDecl *ASTContext::getObjCInstanceTypeDecl() {
8037   if (!ObjCInstanceTypeDecl)
8038     ObjCInstanceTypeDecl =
8039         buildImplicitTypedef(getObjCIdType(), "instancetype");
8040   return ObjCInstanceTypeDecl;
8041 }
8042 
8043 // This returns true if a type has been typedefed to BOOL:
8044 // typedef <type> BOOL;
isTypeTypedefedAsBOOL(QualType T)8045 static bool isTypeTypedefedAsBOOL(QualType T) {
8046   if (const auto *TT = dyn_cast<TypedefType>(T))
8047     if (IdentifierInfo *II = TT->getDecl()->getIdentifier())
8048       return II->isStr("BOOL");
8049 
8050   return false;
8051 }
8052 
8053 /// getObjCEncodingTypeSize returns size of type for objective-c encoding
8054 /// purpose.
getObjCEncodingTypeSize(QualType type) const8055 CharUnits ASTContext::getObjCEncodingTypeSize(QualType type) const {
8056   if (!type->isIncompleteArrayType() && type->isIncompleteType())
8057     return CharUnits::Zero();
8058 
8059   CharUnits sz = getTypeSizeInChars(type);
8060 
8061   // Make all integer and enum types at least as large as an int
8062   if (sz.isPositive() && type->isIntegralOrEnumerationType())
8063     sz = std::max(sz, getTypeSizeInChars(IntTy));
8064   // Treat arrays as pointers, since that's how they're passed in.
8065   else if (type->isArrayType())
8066     sz = getTypeSizeInChars(VoidPtrTy);
8067   return sz;
8068 }
8069 
isMSStaticDataMemberInlineDefinition(const VarDecl * VD) const8070 bool ASTContext::isMSStaticDataMemberInlineDefinition(const VarDecl *VD) const {
8071   return getTargetInfo().getCXXABI().isMicrosoft() &&
8072          VD->isStaticDataMember() &&
8073          VD->getType()->isIntegralOrEnumerationType() &&
8074          !VD->getFirstDecl()->isOutOfLine() && VD->getFirstDecl()->hasInit();
8075 }
8076 
8077 ASTContext::InlineVariableDefinitionKind
getInlineVariableDefinitionKind(const VarDecl * VD) const8078 ASTContext::getInlineVariableDefinitionKind(const VarDecl *VD) const {
8079   if (!VD->isInline())
8080     return InlineVariableDefinitionKind::None;
8081 
8082   // In almost all cases, it's a weak definition.
8083   auto *First = VD->getFirstDecl();
8084   if (First->isInlineSpecified() || !First->isStaticDataMember())
8085     return InlineVariableDefinitionKind::Weak;
8086 
8087   // If there's a file-context declaration in this translation unit, it's a
8088   // non-discardable definition.
8089   for (auto *D : VD->redecls())
8090     if (D->getLexicalDeclContext()->isFileContext() &&
8091         !D->isInlineSpecified() && (D->isConstexpr() || First->isConstexpr()))
8092       return InlineVariableDefinitionKind::Strong;
8093 
8094   // If we've not seen one yet, we don't know.
8095   return InlineVariableDefinitionKind::WeakUnknown;
8096 }
8097 
charUnitsToString(const CharUnits & CU)8098 static std::string charUnitsToString(const CharUnits &CU) {
8099   return llvm::itostr(CU.getQuantity());
8100 }
8101 
8102 /// getObjCEncodingForBlock - Return the encoded type for this block
8103 /// declaration.
getObjCEncodingForBlock(const BlockExpr * Expr) const8104 std::string ASTContext::getObjCEncodingForBlock(const BlockExpr *Expr) const {
8105   std::string S;
8106 
8107   const BlockDecl *Decl = Expr->getBlockDecl();
8108   QualType BlockTy =
8109       Expr->getType()->castAs<BlockPointerType>()->getPointeeType();
8110   QualType BlockReturnTy = BlockTy->castAs<FunctionType>()->getReturnType();
8111   // Encode result type.
8112   if (getLangOpts().EncodeExtendedBlockSig)
8113     getObjCEncodingForMethodParameter(Decl::OBJC_TQ_None, BlockReturnTy, S,
8114                                       true /*Extended*/);
8115   else
8116     getObjCEncodingForType(BlockReturnTy, S);
8117   // Compute size of all parameters.
8118   // Start with computing size of a pointer in number of bytes.
8119   // FIXME: There might(should) be a better way of doing this computation!
8120   CharUnits PtrSize = getTypeSizeInChars(VoidPtrTy);
8121   CharUnits ParmOffset = PtrSize;
8122   for (auto *PI : Decl->parameters()) {
8123     QualType PType = PI->getType();
8124     CharUnits sz = getObjCEncodingTypeSize(PType);
8125     if (sz.isZero())
8126       continue;
8127     assert(sz.isPositive() && "BlockExpr - Incomplete param type");
8128     ParmOffset += sz;
8129   }
8130   // Size of the argument frame
8131   S += charUnitsToString(ParmOffset);
8132   // Block pointer and offset.
8133   S += "@?0";
8134 
8135   // Argument types.
8136   ParmOffset = PtrSize;
8137   for (auto *PVDecl : Decl->parameters()) {
8138     QualType PType = PVDecl->getOriginalType();
8139     if (const auto *AT =
8140             dyn_cast<ArrayType>(PType->getCanonicalTypeInternal())) {
8141       // Use array's original type only if it has known number of
8142       // elements.
8143       if (!isa<ConstantArrayType>(AT))
8144         PType = PVDecl->getType();
8145     } else if (PType->isFunctionType())
8146       PType = PVDecl->getType();
8147     if (getLangOpts().EncodeExtendedBlockSig)
8148       getObjCEncodingForMethodParameter(Decl::OBJC_TQ_None, PType,
8149                                       S, true /*Extended*/);
8150     else
8151       getObjCEncodingForType(PType, S);
8152     S += charUnitsToString(ParmOffset);
8153     ParmOffset += getObjCEncodingTypeSize(PType);
8154   }
8155 
8156   return S;
8157 }
8158 
8159 std::string
getObjCEncodingForFunctionDecl(const FunctionDecl * Decl) const8160 ASTContext::getObjCEncodingForFunctionDecl(const FunctionDecl *Decl) const {
8161   std::string S;
8162   // Encode result type.
8163   getObjCEncodingForType(Decl->getReturnType(), S);
8164   CharUnits ParmOffset;
8165   // Compute size of all parameters.
8166   for (auto *PI : Decl->parameters()) {
8167     QualType PType = PI->getType();
8168     CharUnits sz = getObjCEncodingTypeSize(PType);
8169     if (sz.isZero())
8170       continue;
8171 
8172     assert(sz.isPositive() &&
8173            "getObjCEncodingForFunctionDecl - Incomplete param type");
8174     ParmOffset += sz;
8175   }
8176   S += charUnitsToString(ParmOffset);
8177   ParmOffset = CharUnits::Zero();
8178 
8179   // Argument types.
8180   for (auto *PVDecl : Decl->parameters()) {
8181     QualType PType = PVDecl->getOriginalType();
8182     if (const auto *AT =
8183             dyn_cast<ArrayType>(PType->getCanonicalTypeInternal())) {
8184       // Use array's original type only if it has known number of
8185       // elements.
8186       if (!isa<ConstantArrayType>(AT))
8187         PType = PVDecl->getType();
8188     } else if (PType->isFunctionType())
8189       PType = PVDecl->getType();
8190     getObjCEncodingForType(PType, S);
8191     S += charUnitsToString(ParmOffset);
8192     ParmOffset += getObjCEncodingTypeSize(PType);
8193   }
8194 
8195   return S;
8196 }
8197 
8198 /// getObjCEncodingForMethodParameter - Return the encoded type for a single
8199 /// method parameter or return type. If Extended, include class names and
8200 /// block object types.
getObjCEncodingForMethodParameter(Decl::ObjCDeclQualifier QT,QualType T,std::string & S,bool Extended) const8201 void ASTContext::getObjCEncodingForMethodParameter(Decl::ObjCDeclQualifier QT,
8202                                                    QualType T, std::string& S,
8203                                                    bool Extended) const {
8204   // Encode type qualifier, 'in', 'inout', etc. for the parameter.
8205   getObjCEncodingForTypeQualifier(QT, S);
8206   // Encode parameter type.
8207   ObjCEncOptions Options = ObjCEncOptions()
8208                                .setExpandPointedToStructures()
8209                                .setExpandStructures()
8210                                .setIsOutermostType();
8211   if (Extended)
8212     Options.setEncodeBlockParameters().setEncodeClassNames();
8213   getObjCEncodingForTypeImpl(T, S, Options, /*Field=*/nullptr);
8214 }
8215 
8216 /// getObjCEncodingForMethodDecl - Return the encoded type for this method
8217 /// declaration.
getObjCEncodingForMethodDecl(const ObjCMethodDecl * Decl,bool Extended) const8218 std::string ASTContext::getObjCEncodingForMethodDecl(const ObjCMethodDecl *Decl,
8219                                                      bool Extended) const {
8220   // FIXME: This is not very efficient.
8221   // Encode return type.
8222   std::string S;
8223   getObjCEncodingForMethodParameter(Decl->getObjCDeclQualifier(),
8224                                     Decl->getReturnType(), S, Extended);
8225   // Compute size of all parameters.
8226   // Start with computing size of a pointer in number of bytes.
8227   // FIXME: There might(should) be a better way of doing this computation!
8228   CharUnits PtrSize = getTypeSizeInChars(VoidPtrTy);
8229   // The first two arguments (self and _cmd) are pointers; account for
8230   // their size.
8231   CharUnits ParmOffset = 2 * PtrSize;
8232   for (ObjCMethodDecl::param_const_iterator PI = Decl->param_begin(),
8233        E = Decl->sel_param_end(); PI != E; ++PI) {
8234     QualType PType = (*PI)->getType();
8235     CharUnits sz = getObjCEncodingTypeSize(PType);
8236     if (sz.isZero())
8237       continue;
8238 
8239     assert(sz.isPositive() &&
8240            "getObjCEncodingForMethodDecl - Incomplete param type");
8241     ParmOffset += sz;
8242   }
8243   S += charUnitsToString(ParmOffset);
8244   S += "@0:";
8245   S += charUnitsToString(PtrSize);
8246 
8247   // Argument types.
8248   ParmOffset = 2 * PtrSize;
8249   for (ObjCMethodDecl::param_const_iterator PI = Decl->param_begin(),
8250        E = Decl->sel_param_end(); PI != E; ++PI) {
8251     const ParmVarDecl *PVDecl = *PI;
8252     QualType PType = PVDecl->getOriginalType();
8253     if (const auto *AT =
8254             dyn_cast<ArrayType>(PType->getCanonicalTypeInternal())) {
8255       // Use array's original type only if it has known number of
8256       // elements.
8257       if (!isa<ConstantArrayType>(AT))
8258         PType = PVDecl->getType();
8259     } else if (PType->isFunctionType())
8260       PType = PVDecl->getType();
8261     getObjCEncodingForMethodParameter(PVDecl->getObjCDeclQualifier(),
8262                                       PType, S, Extended);
8263     S += charUnitsToString(ParmOffset);
8264     ParmOffset += getObjCEncodingTypeSize(PType);
8265   }
8266 
8267   return S;
8268 }
8269 
8270 ObjCPropertyImplDecl *
getObjCPropertyImplDeclForPropertyDecl(const ObjCPropertyDecl * PD,const Decl * Container) const8271 ASTContext::getObjCPropertyImplDeclForPropertyDecl(
8272                                       const ObjCPropertyDecl *PD,
8273                                       const Decl *Container) const {
8274   if (!Container)
8275     return nullptr;
8276   if (const auto *CID = dyn_cast<ObjCCategoryImplDecl>(Container)) {
8277     for (auto *PID : CID->property_impls())
8278       if (PID->getPropertyDecl() == PD)
8279         return PID;
8280   } else {
8281     const auto *OID = cast<ObjCImplementationDecl>(Container);
8282     for (auto *PID : OID->property_impls())
8283       if (PID->getPropertyDecl() == PD)
8284         return PID;
8285   }
8286   return nullptr;
8287 }
8288 
8289 /// getObjCEncodingForPropertyDecl - Return the encoded type for this
8290 /// property declaration. If non-NULL, Container must be either an
8291 /// ObjCCategoryImplDecl or ObjCImplementationDecl; it should only be
8292 /// NULL when getting encodings for protocol properties.
8293 /// Property attributes are stored as a comma-delimited C string. The simple
8294 /// attributes readonly and bycopy are encoded as single characters. The
8295 /// parametrized attributes, getter=name, setter=name, and ivar=name, are
8296 /// encoded as single characters, followed by an identifier. Property types
8297 /// are also encoded as a parametrized attribute. The characters used to encode
8298 /// these attributes are defined by the following enumeration:
8299 /// @code
8300 /// enum PropertyAttributes {
8301 /// kPropertyReadOnly = 'R',   // property is read-only.
8302 /// kPropertyBycopy = 'C',     // property is a copy of the value last assigned
8303 /// kPropertyByref = '&',  // property is a reference to the value last assigned
8304 /// kPropertyDynamic = 'D',    // property is dynamic
8305 /// kPropertyGetter = 'G',     // followed by getter selector name
8306 /// kPropertySetter = 'S',     // followed by setter selector name
8307 /// kPropertyInstanceVariable = 'V'  // followed by instance variable  name
8308 /// kPropertyType = 'T'              // followed by old-style type encoding.
8309 /// kPropertyWeak = 'W'              // 'weak' property
8310 /// kPropertyStrong = 'P'            // property GC'able
8311 /// kPropertyNonAtomic = 'N'         // property non-atomic
8312 /// kPropertyOptional = '?'          // property optional
8313 /// };
8314 /// @endcode
8315 std::string
getObjCEncodingForPropertyDecl(const ObjCPropertyDecl * PD,const Decl * Container) const8316 ASTContext::getObjCEncodingForPropertyDecl(const ObjCPropertyDecl *PD,
8317                                            const Decl *Container) const {
8318   // Collect information from the property implementation decl(s).
8319   bool Dynamic = false;
8320   ObjCPropertyImplDecl *SynthesizePID = nullptr;
8321 
8322   if (ObjCPropertyImplDecl *PropertyImpDecl =
8323       getObjCPropertyImplDeclForPropertyDecl(PD, Container)) {
8324     if (PropertyImpDecl->getPropertyImplementation() == ObjCPropertyImplDecl::Dynamic)
8325       Dynamic = true;
8326     else
8327       SynthesizePID = PropertyImpDecl;
8328   }
8329 
8330   // FIXME: This is not very efficient.
8331   std::string S = "T";
8332 
8333   // Encode result type.
8334   // GCC has some special rules regarding encoding of properties which
8335   // closely resembles encoding of ivars.
8336   getObjCEncodingForPropertyType(PD->getType(), S);
8337 
8338   if (PD->isOptional())
8339     S += ",?";
8340 
8341   if (PD->isReadOnly()) {
8342     S += ",R";
8343     if (PD->getPropertyAttributes() & ObjCPropertyAttribute::kind_copy)
8344       S += ",C";
8345     if (PD->getPropertyAttributes() & ObjCPropertyAttribute::kind_retain)
8346       S += ",&";
8347     if (PD->getPropertyAttributes() & ObjCPropertyAttribute::kind_weak)
8348       S += ",W";
8349   } else {
8350     switch (PD->getSetterKind()) {
8351     case ObjCPropertyDecl::Assign: break;
8352     case ObjCPropertyDecl::Copy:   S += ",C"; break;
8353     case ObjCPropertyDecl::Retain: S += ",&"; break;
8354     case ObjCPropertyDecl::Weak:   S += ",W"; break;
8355     }
8356   }
8357 
8358   // It really isn't clear at all what this means, since properties
8359   // are "dynamic by default".
8360   if (Dynamic)
8361     S += ",D";
8362 
8363   if (PD->getPropertyAttributes() & ObjCPropertyAttribute::kind_nonatomic)
8364     S += ",N";
8365 
8366   if (PD->getPropertyAttributes() & ObjCPropertyAttribute::kind_getter) {
8367     S += ",G";
8368     S += PD->getGetterName().getAsString();
8369   }
8370 
8371   if (PD->getPropertyAttributes() & ObjCPropertyAttribute::kind_setter) {
8372     S += ",S";
8373     S += PD->getSetterName().getAsString();
8374   }
8375 
8376   if (SynthesizePID) {
8377     const ObjCIvarDecl *OID = SynthesizePID->getPropertyIvarDecl();
8378     S += ",V";
8379     S += OID->getNameAsString();
8380   }
8381 
8382   // FIXME: OBJCGC: weak & strong
8383   return S;
8384 }
8385 
8386 /// getLegacyIntegralTypeEncoding -
8387 /// Another legacy compatibility encoding: 32-bit longs are encoded as
8388 /// 'l' or 'L' , but not always.  For typedefs, we need to use
8389 /// 'i' or 'I' instead if encoding a struct field, or a pointer!
getLegacyIntegralTypeEncoding(QualType & PointeeTy) const8390 void ASTContext::getLegacyIntegralTypeEncoding (QualType &PointeeTy) const {
8391   if (PointeeTy->getAs<TypedefType>()) {
8392     if (const auto *BT = PointeeTy->getAs<BuiltinType>()) {
8393       if (BT->getKind() == BuiltinType::ULong && getIntWidth(PointeeTy) == 32)
8394         PointeeTy = UnsignedIntTy;
8395       else
8396         if (BT->getKind() == BuiltinType::Long && getIntWidth(PointeeTy) == 32)
8397           PointeeTy = IntTy;
8398     }
8399   }
8400 }
8401 
getObjCEncodingForType(QualType T,std::string & S,const FieldDecl * Field,QualType * NotEncodedT) const8402 void ASTContext::getObjCEncodingForType(QualType T, std::string& S,
8403                                         const FieldDecl *Field,
8404                                         QualType *NotEncodedT) const {
8405   // We follow the behavior of gcc, expanding structures which are
8406   // directly pointed to, and expanding embedded structures. Note that
8407   // these rules are sufficient to prevent recursive encoding of the
8408   // same type.
8409   getObjCEncodingForTypeImpl(T, S,
8410                              ObjCEncOptions()
8411                                  .setExpandPointedToStructures()
8412                                  .setExpandStructures()
8413                                  .setIsOutermostType(),
8414                              Field, NotEncodedT);
8415 }
8416 
getObjCEncodingForPropertyType(QualType T,std::string & S) const8417 void ASTContext::getObjCEncodingForPropertyType(QualType T,
8418                                                 std::string& S) const {
8419   // Encode result type.
8420   // GCC has some special rules regarding encoding of properties which
8421   // closely resembles encoding of ivars.
8422   getObjCEncodingForTypeImpl(T, S,
8423                              ObjCEncOptions()
8424                                  .setExpandPointedToStructures()
8425                                  .setExpandStructures()
8426                                  .setIsOutermostType()
8427                                  .setEncodingProperty(),
8428                              /*Field=*/nullptr);
8429 }
8430 
getObjCEncodingForPrimitiveType(const ASTContext * C,const BuiltinType * BT)8431 static char getObjCEncodingForPrimitiveType(const ASTContext *C,
8432                                             const BuiltinType *BT) {
8433     BuiltinType::Kind kind = BT->getKind();
8434     switch (kind) {
8435     case BuiltinType::Void:       return 'v';
8436     case BuiltinType::Bool:       return 'B';
8437     case BuiltinType::Char8:
8438     case BuiltinType::Char_U:
8439     case BuiltinType::UChar:      return 'C';
8440     case BuiltinType::Char16:
8441     case BuiltinType::UShort:     return 'S';
8442     case BuiltinType::Char32:
8443     case BuiltinType::UInt:       return 'I';
8444     case BuiltinType::ULong:
8445         return C->getTargetInfo().getLongWidth() == 32 ? 'L' : 'Q';
8446     case BuiltinType::UInt128:    return 'T';
8447     case BuiltinType::ULongLong:  return 'Q';
8448     case BuiltinType::Char_S:
8449     case BuiltinType::SChar:      return 'c';
8450     case BuiltinType::Short:      return 's';
8451     case BuiltinType::WChar_S:
8452     case BuiltinType::WChar_U:
8453     case BuiltinType::Int:        return 'i';
8454     case BuiltinType::Long:
8455       return C->getTargetInfo().getLongWidth() == 32 ? 'l' : 'q';
8456     case BuiltinType::LongLong:   return 'q';
8457     case BuiltinType::Int128:     return 't';
8458     case BuiltinType::Float:      return 'f';
8459     case BuiltinType::Double:     return 'd';
8460     case BuiltinType::LongDouble: return 'D';
8461     case BuiltinType::NullPtr:    return '*'; // like char*
8462 
8463     case BuiltinType::BFloat16:
8464     case BuiltinType::Float16:
8465     case BuiltinType::Float128:
8466     case BuiltinType::Ibm128:
8467     case BuiltinType::Half:
8468     case BuiltinType::ShortAccum:
8469     case BuiltinType::Accum:
8470     case BuiltinType::LongAccum:
8471     case BuiltinType::UShortAccum:
8472     case BuiltinType::UAccum:
8473     case BuiltinType::ULongAccum:
8474     case BuiltinType::ShortFract:
8475     case BuiltinType::Fract:
8476     case BuiltinType::LongFract:
8477     case BuiltinType::UShortFract:
8478     case BuiltinType::UFract:
8479     case BuiltinType::ULongFract:
8480     case BuiltinType::SatShortAccum:
8481     case BuiltinType::SatAccum:
8482     case BuiltinType::SatLongAccum:
8483     case BuiltinType::SatUShortAccum:
8484     case BuiltinType::SatUAccum:
8485     case BuiltinType::SatULongAccum:
8486     case BuiltinType::SatShortFract:
8487     case BuiltinType::SatFract:
8488     case BuiltinType::SatLongFract:
8489     case BuiltinType::SatUShortFract:
8490     case BuiltinType::SatUFract:
8491     case BuiltinType::SatULongFract:
8492       // FIXME: potentially need @encodes for these!
8493       return ' ';
8494 
8495 #define SVE_TYPE(Name, Id, SingletonId) \
8496     case BuiltinType::Id:
8497 #include "clang/Basic/AArch64SVEACLETypes.def"
8498 #define RVV_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
8499 #include "clang/Basic/RISCVVTypes.def"
8500 #define WASM_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
8501 #include "clang/Basic/WebAssemblyReferenceTypes.def"
8502 #define AMDGPU_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
8503 #include "clang/Basic/AMDGPUTypes.def"
8504       {
8505         DiagnosticsEngine &Diags = C->getDiagnostics();
8506         unsigned DiagID = Diags.getCustomDiagID(DiagnosticsEngine::Error,
8507                                                 "cannot yet @encode type %0");
8508         Diags.Report(DiagID) << BT->getName(C->getPrintingPolicy());
8509         return ' ';
8510       }
8511 
8512     case BuiltinType::ObjCId:
8513     case BuiltinType::ObjCClass:
8514     case BuiltinType::ObjCSel:
8515       llvm_unreachable("@encoding ObjC primitive type");
8516 
8517     // OpenCL and placeholder types don't need @encodings.
8518 #define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
8519     case BuiltinType::Id:
8520 #include "clang/Basic/OpenCLImageTypes.def"
8521 #define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
8522     case BuiltinType::Id:
8523 #include "clang/Basic/OpenCLExtensionTypes.def"
8524     case BuiltinType::OCLEvent:
8525     case BuiltinType::OCLClkEvent:
8526     case BuiltinType::OCLQueue:
8527     case BuiltinType::OCLReserveID:
8528     case BuiltinType::OCLSampler:
8529     case BuiltinType::Dependent:
8530 #define PPC_VECTOR_TYPE(Name, Id, Size) \
8531     case BuiltinType::Id:
8532 #include "clang/Basic/PPCTypes.def"
8533 #define BUILTIN_TYPE(KIND, ID)
8534 #define PLACEHOLDER_TYPE(KIND, ID) \
8535     case BuiltinType::KIND:
8536 #include "clang/AST/BuiltinTypes.def"
8537       llvm_unreachable("invalid builtin type for @encode");
8538     }
8539     llvm_unreachable("invalid BuiltinType::Kind value");
8540 }
8541 
ObjCEncodingForEnumType(const ASTContext * C,const EnumType * ET)8542 static char ObjCEncodingForEnumType(const ASTContext *C, const EnumType *ET) {
8543   EnumDecl *Enum = ET->getDecl();
8544 
8545   // The encoding of an non-fixed enum type is always 'i', regardless of size.
8546   if (!Enum->isFixed())
8547     return 'i';
8548 
8549   // The encoding of a fixed enum type matches its fixed underlying type.
8550   const auto *BT = Enum->getIntegerType()->castAs<BuiltinType>();
8551   return getObjCEncodingForPrimitiveType(C, BT);
8552 }
8553 
EncodeBitField(const ASTContext * Ctx,std::string & S,QualType T,const FieldDecl * FD)8554 static void EncodeBitField(const ASTContext *Ctx, std::string& S,
8555                            QualType T, const FieldDecl *FD) {
8556   assert(FD->isBitField() && "not a bitfield - getObjCEncodingForTypeImpl");
8557   S += 'b';
8558   // The NeXT runtime encodes bit fields as b followed by the number of bits.
8559   // The GNU runtime requires more information; bitfields are encoded as b,
8560   // then the offset (in bits) of the first element, then the type of the
8561   // bitfield, then the size in bits.  For example, in this structure:
8562   //
8563   // struct
8564   // {
8565   //    int integer;
8566   //    int flags:2;
8567   // };
8568   // On a 32-bit system, the encoding for flags would be b2 for the NeXT
8569   // runtime, but b32i2 for the GNU runtime.  The reason for this extra
8570   // information is not especially sensible, but we're stuck with it for
8571   // compatibility with GCC, although providing it breaks anything that
8572   // actually uses runtime introspection and wants to work on both runtimes...
8573   if (Ctx->getLangOpts().ObjCRuntime.isGNUFamily()) {
8574     uint64_t Offset;
8575 
8576     if (const auto *IVD = dyn_cast<ObjCIvarDecl>(FD)) {
8577       Offset = Ctx->lookupFieldBitOffset(IVD->getContainingInterface(), nullptr,
8578                                          IVD);
8579     } else {
8580       const RecordDecl *RD = FD->getParent();
8581       const ASTRecordLayout &RL = Ctx->getASTRecordLayout(RD);
8582       Offset = RL.getFieldOffset(FD->getFieldIndex());
8583     }
8584 
8585     S += llvm::utostr(Offset);
8586 
8587     if (const auto *ET = T->getAs<EnumType>())
8588       S += ObjCEncodingForEnumType(Ctx, ET);
8589     else {
8590       const auto *BT = T->castAs<BuiltinType>();
8591       S += getObjCEncodingForPrimitiveType(Ctx, BT);
8592     }
8593   }
8594   S += llvm::utostr(FD->getBitWidthValue(*Ctx));
8595 }
8596 
8597 // Helper function for determining whether the encoded type string would include
8598 // a template specialization type.
hasTemplateSpecializationInEncodedString(const Type * T,bool VisitBasesAndFields)8599 static bool hasTemplateSpecializationInEncodedString(const Type *T,
8600                                                      bool VisitBasesAndFields) {
8601   T = T->getBaseElementTypeUnsafe();
8602 
8603   if (auto *PT = T->getAs<PointerType>())
8604     return hasTemplateSpecializationInEncodedString(
8605         PT->getPointeeType().getTypePtr(), false);
8606 
8607   auto *CXXRD = T->getAsCXXRecordDecl();
8608 
8609   if (!CXXRD)
8610     return false;
8611 
8612   if (isa<ClassTemplateSpecializationDecl>(CXXRD))
8613     return true;
8614 
8615   if (!CXXRD->hasDefinition() || !VisitBasesAndFields)
8616     return false;
8617 
8618   for (const auto &B : CXXRD->bases())
8619     if (hasTemplateSpecializationInEncodedString(B.getType().getTypePtr(),
8620                                                  true))
8621       return true;
8622 
8623   for (auto *FD : CXXRD->fields())
8624     if (hasTemplateSpecializationInEncodedString(FD->getType().getTypePtr(),
8625                                                  true))
8626       return true;
8627 
8628   return false;
8629 }
8630 
8631 // FIXME: Use SmallString for accumulating string.
getObjCEncodingForTypeImpl(QualType T,std::string & S,const ObjCEncOptions Options,const FieldDecl * FD,QualType * NotEncodedT) const8632 void ASTContext::getObjCEncodingForTypeImpl(QualType T, std::string &S,
8633                                             const ObjCEncOptions Options,
8634                                             const FieldDecl *FD,
8635                                             QualType *NotEncodedT) const {
8636   CanQualType CT = getCanonicalType(T);
8637   switch (CT->getTypeClass()) {
8638   case Type::Builtin:
8639   case Type::Enum:
8640     if (FD && FD->isBitField())
8641       return EncodeBitField(this, S, T, FD);
8642     if (const auto *BT = dyn_cast<BuiltinType>(CT))
8643       S += getObjCEncodingForPrimitiveType(this, BT);
8644     else
8645       S += ObjCEncodingForEnumType(this, cast<EnumType>(CT));
8646     return;
8647 
8648   case Type::Complex:
8649     S += 'j';
8650     getObjCEncodingForTypeImpl(T->castAs<ComplexType>()->getElementType(), S,
8651                                ObjCEncOptions(),
8652                                /*Field=*/nullptr);
8653     return;
8654 
8655   case Type::Atomic:
8656     S += 'A';
8657     getObjCEncodingForTypeImpl(T->castAs<AtomicType>()->getValueType(), S,
8658                                ObjCEncOptions(),
8659                                /*Field=*/nullptr);
8660     return;
8661 
8662   // encoding for pointer or reference types.
8663   case Type::Pointer:
8664   case Type::LValueReference:
8665   case Type::RValueReference: {
8666     QualType PointeeTy;
8667     if (isa<PointerType>(CT)) {
8668       const auto *PT = T->castAs<PointerType>();
8669       if (PT->isObjCSelType()) {
8670         S += ':';
8671         return;
8672       }
8673       PointeeTy = PT->getPointeeType();
8674     } else {
8675       PointeeTy = T->castAs<ReferenceType>()->getPointeeType();
8676     }
8677 
8678     bool isReadOnly = false;
8679     // For historical/compatibility reasons, the read-only qualifier of the
8680     // pointee gets emitted _before_ the '^'.  The read-only qualifier of
8681     // the pointer itself gets ignored, _unless_ we are looking at a typedef!
8682     // Also, do not emit the 'r' for anything but the outermost type!
8683     if (T->getAs<TypedefType>()) {
8684       if (Options.IsOutermostType() && T.isConstQualified()) {
8685         isReadOnly = true;
8686         S += 'r';
8687       }
8688     } else if (Options.IsOutermostType()) {
8689       QualType P = PointeeTy;
8690       while (auto PT = P->getAs<PointerType>())
8691         P = PT->getPointeeType();
8692       if (P.isConstQualified()) {
8693         isReadOnly = true;
8694         S += 'r';
8695       }
8696     }
8697     if (isReadOnly) {
8698       // Another legacy compatibility encoding. Some ObjC qualifier and type
8699       // combinations need to be rearranged.
8700       // Rewrite "in const" from "nr" to "rn"
8701       if (StringRef(S).ends_with("nr"))
8702         S.replace(S.end()-2, S.end(), "rn");
8703     }
8704 
8705     if (PointeeTy->isCharType()) {
8706       // char pointer types should be encoded as '*' unless it is a
8707       // type that has been typedef'd to 'BOOL'.
8708       if (!isTypeTypedefedAsBOOL(PointeeTy)) {
8709         S += '*';
8710         return;
8711       }
8712     } else if (const auto *RTy = PointeeTy->getAs<RecordType>()) {
8713       // GCC binary compat: Need to convert "struct objc_class *" to "#".
8714       if (RTy->getDecl()->getIdentifier() == &Idents.get("objc_class")) {
8715         S += '#';
8716         return;
8717       }
8718       // GCC binary compat: Need to convert "struct objc_object *" to "@".
8719       if (RTy->getDecl()->getIdentifier() == &Idents.get("objc_object")) {
8720         S += '@';
8721         return;
8722       }
8723       // If the encoded string for the class includes template names, just emit
8724       // "^v" for pointers to the class.
8725       if (getLangOpts().CPlusPlus &&
8726           (!getLangOpts().EncodeCXXClassTemplateSpec &&
8727            hasTemplateSpecializationInEncodedString(
8728                RTy, Options.ExpandPointedToStructures()))) {
8729         S += "^v";
8730         return;
8731       }
8732       // fall through...
8733     }
8734     S += '^';
8735     getLegacyIntegralTypeEncoding(PointeeTy);
8736 
8737     ObjCEncOptions NewOptions;
8738     if (Options.ExpandPointedToStructures())
8739       NewOptions.setExpandStructures();
8740     getObjCEncodingForTypeImpl(PointeeTy, S, NewOptions,
8741                                /*Field=*/nullptr, NotEncodedT);
8742     return;
8743   }
8744 
8745   case Type::ConstantArray:
8746   case Type::IncompleteArray:
8747   case Type::VariableArray: {
8748     const auto *AT = cast<ArrayType>(CT);
8749 
8750     if (isa<IncompleteArrayType>(AT) && !Options.IsStructField()) {
8751       // Incomplete arrays are encoded as a pointer to the array element.
8752       S += '^';
8753 
8754       getObjCEncodingForTypeImpl(
8755           AT->getElementType(), S,
8756           Options.keepingOnly(ObjCEncOptions().setExpandStructures()), FD);
8757     } else {
8758       S += '[';
8759 
8760       if (const auto *CAT = dyn_cast<ConstantArrayType>(AT))
8761         S += llvm::utostr(CAT->getZExtSize());
8762       else {
8763         //Variable length arrays are encoded as a regular array with 0 elements.
8764         assert((isa<VariableArrayType>(AT) || isa<IncompleteArrayType>(AT)) &&
8765                "Unknown array type!");
8766         S += '0';
8767       }
8768 
8769       getObjCEncodingForTypeImpl(
8770           AT->getElementType(), S,
8771           Options.keepingOnly(ObjCEncOptions().setExpandStructures()), FD,
8772           NotEncodedT);
8773       S += ']';
8774     }
8775     return;
8776   }
8777 
8778   case Type::FunctionNoProto:
8779   case Type::FunctionProto:
8780     S += '?';
8781     return;
8782 
8783   case Type::Record: {
8784     RecordDecl *RDecl = cast<RecordType>(CT)->getDecl();
8785     S += RDecl->isUnion() ? '(' : '{';
8786     // Anonymous structures print as '?'
8787     if (const IdentifierInfo *II = RDecl->getIdentifier()) {
8788       S += II->getName();
8789       if (const auto *Spec = dyn_cast<ClassTemplateSpecializationDecl>(RDecl)) {
8790         const TemplateArgumentList &TemplateArgs = Spec->getTemplateArgs();
8791         llvm::raw_string_ostream OS(S);
8792         printTemplateArgumentList(OS, TemplateArgs.asArray(),
8793                                   getPrintingPolicy());
8794       }
8795     } else {
8796       S += '?';
8797     }
8798     if (Options.ExpandStructures()) {
8799       S += '=';
8800       if (!RDecl->isUnion()) {
8801         getObjCEncodingForStructureImpl(RDecl, S, FD, true, NotEncodedT);
8802       } else {
8803         for (const auto *Field : RDecl->fields()) {
8804           if (FD) {
8805             S += '"';
8806             S += Field->getNameAsString();
8807             S += '"';
8808           }
8809 
8810           // Special case bit-fields.
8811           if (Field->isBitField()) {
8812             getObjCEncodingForTypeImpl(Field->getType(), S,
8813                                        ObjCEncOptions().setExpandStructures(),
8814                                        Field);
8815           } else {
8816             QualType qt = Field->getType();
8817             getLegacyIntegralTypeEncoding(qt);
8818             getObjCEncodingForTypeImpl(
8819                 qt, S,
8820                 ObjCEncOptions().setExpandStructures().setIsStructField(), FD,
8821                 NotEncodedT);
8822           }
8823         }
8824       }
8825     }
8826     S += RDecl->isUnion() ? ')' : '}';
8827     return;
8828   }
8829 
8830   case Type::BlockPointer: {
8831     const auto *BT = T->castAs<BlockPointerType>();
8832     S += "@?"; // Unlike a pointer-to-function, which is "^?".
8833     if (Options.EncodeBlockParameters()) {
8834       const auto *FT = BT->getPointeeType()->castAs<FunctionType>();
8835 
8836       S += '<';
8837       // Block return type
8838       getObjCEncodingForTypeImpl(FT->getReturnType(), S,
8839                                  Options.forComponentType(), FD, NotEncodedT);
8840       // Block self
8841       S += "@?";
8842       // Block parameters
8843       if (const auto *FPT = dyn_cast<FunctionProtoType>(FT)) {
8844         for (const auto &I : FPT->param_types())
8845           getObjCEncodingForTypeImpl(I, S, Options.forComponentType(), FD,
8846                                      NotEncodedT);
8847       }
8848       S += '>';
8849     }
8850     return;
8851   }
8852 
8853   case Type::ObjCObject: {
8854     // hack to match legacy encoding of *id and *Class
8855     QualType Ty = getObjCObjectPointerType(CT);
8856     if (Ty->isObjCIdType()) {
8857       S += "{objc_object=}";
8858       return;
8859     }
8860     else if (Ty->isObjCClassType()) {
8861       S += "{objc_class=}";
8862       return;
8863     }
8864     // TODO: Double check to make sure this intentionally falls through.
8865     [[fallthrough]];
8866   }
8867 
8868   case Type::ObjCInterface: {
8869     // Ignore protocol qualifiers when mangling at this level.
8870     // @encode(class_name)
8871     ObjCInterfaceDecl *OI = T->castAs<ObjCObjectType>()->getInterface();
8872     S += '{';
8873     S += OI->getObjCRuntimeNameAsString();
8874     if (Options.ExpandStructures()) {
8875       S += '=';
8876       SmallVector<const ObjCIvarDecl*, 32> Ivars;
8877       DeepCollectObjCIvars(OI, true, Ivars);
8878       for (unsigned i = 0, e = Ivars.size(); i != e; ++i) {
8879         const FieldDecl *Field = Ivars[i];
8880         if (Field->isBitField())
8881           getObjCEncodingForTypeImpl(Field->getType(), S,
8882                                      ObjCEncOptions().setExpandStructures(),
8883                                      Field);
8884         else
8885           getObjCEncodingForTypeImpl(Field->getType(), S,
8886                                      ObjCEncOptions().setExpandStructures(), FD,
8887                                      NotEncodedT);
8888       }
8889     }
8890     S += '}';
8891     return;
8892   }
8893 
8894   case Type::ObjCObjectPointer: {
8895     const auto *OPT = T->castAs<ObjCObjectPointerType>();
8896     if (OPT->isObjCIdType()) {
8897       S += '@';
8898       return;
8899     }
8900 
8901     if (OPT->isObjCClassType() || OPT->isObjCQualifiedClassType()) {
8902       // FIXME: Consider if we need to output qualifiers for 'Class<p>'.
8903       // Since this is a binary compatibility issue, need to consult with
8904       // runtime folks. Fortunately, this is a *very* obscure construct.
8905       S += '#';
8906       return;
8907     }
8908 
8909     if (OPT->isObjCQualifiedIdType()) {
8910       getObjCEncodingForTypeImpl(
8911           getObjCIdType(), S,
8912           Options.keepingOnly(ObjCEncOptions()
8913                                   .setExpandPointedToStructures()
8914                                   .setExpandStructures()),
8915           FD);
8916       if (FD || Options.EncodingProperty() || Options.EncodeClassNames()) {
8917         // Note that we do extended encoding of protocol qualifier list
8918         // Only when doing ivar or property encoding.
8919         S += '"';
8920         for (const auto *I : OPT->quals()) {
8921           S += '<';
8922           S += I->getObjCRuntimeNameAsString();
8923           S += '>';
8924         }
8925         S += '"';
8926       }
8927       return;
8928     }
8929 
8930     S += '@';
8931     if (OPT->getInterfaceDecl() &&
8932         (FD || Options.EncodingProperty() || Options.EncodeClassNames())) {
8933       S += '"';
8934       S += OPT->getInterfaceDecl()->getObjCRuntimeNameAsString();
8935       for (const auto *I : OPT->quals()) {
8936         S += '<';
8937         S += I->getObjCRuntimeNameAsString();
8938         S += '>';
8939       }
8940       S += '"';
8941     }
8942     return;
8943   }
8944 
8945   // gcc just blithely ignores member pointers.
8946   // FIXME: we should do better than that.  'M' is available.
8947   case Type::MemberPointer:
8948   // This matches gcc's encoding, even though technically it is insufficient.
8949   //FIXME. We should do a better job than gcc.
8950   case Type::Vector:
8951   case Type::ExtVector:
8952   // Until we have a coherent encoding of these three types, issue warning.
8953     if (NotEncodedT)
8954       *NotEncodedT = T;
8955     return;
8956 
8957   case Type::ConstantMatrix:
8958     if (NotEncodedT)
8959       *NotEncodedT = T;
8960     return;
8961 
8962   case Type::BitInt:
8963     if (NotEncodedT)
8964       *NotEncodedT = T;
8965     return;
8966 
8967   // We could see an undeduced auto type here during error recovery.
8968   // Just ignore it.
8969   case Type::Auto:
8970   case Type::DeducedTemplateSpecialization:
8971     return;
8972 
8973   case Type::ArrayParameter:
8974   case Type::Pipe:
8975 #define ABSTRACT_TYPE(KIND, BASE)
8976 #define TYPE(KIND, BASE)
8977 #define DEPENDENT_TYPE(KIND, BASE) \
8978   case Type::KIND:
8979 #define NON_CANONICAL_TYPE(KIND, BASE) \
8980   case Type::KIND:
8981 #define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(KIND, BASE) \
8982   case Type::KIND:
8983 #include "clang/AST/TypeNodes.inc"
8984     llvm_unreachable("@encode for dependent type!");
8985   }
8986   llvm_unreachable("bad type kind!");
8987 }
8988 
getObjCEncodingForStructureImpl(RecordDecl * RDecl,std::string & S,const FieldDecl * FD,bool includeVBases,QualType * NotEncodedT) const8989 void ASTContext::getObjCEncodingForStructureImpl(RecordDecl *RDecl,
8990                                                  std::string &S,
8991                                                  const FieldDecl *FD,
8992                                                  bool includeVBases,
8993                                                  QualType *NotEncodedT) const {
8994   assert(RDecl && "Expected non-null RecordDecl");
8995   assert(!RDecl->isUnion() && "Should not be called for unions");
8996   if (!RDecl->getDefinition() || RDecl->getDefinition()->isInvalidDecl())
8997     return;
8998 
8999   const auto *CXXRec = dyn_cast<CXXRecordDecl>(RDecl);
9000   std::multimap<uint64_t, NamedDecl *> FieldOrBaseOffsets;
9001   const ASTRecordLayout &layout = getASTRecordLayout(RDecl);
9002 
9003   if (CXXRec) {
9004     for (const auto &BI : CXXRec->bases()) {
9005       if (!BI.isVirtual()) {
9006         CXXRecordDecl *base = BI.getType()->getAsCXXRecordDecl();
9007         if (base->isEmpty())
9008           continue;
9009         uint64_t offs = toBits(layout.getBaseClassOffset(base));
9010         FieldOrBaseOffsets.insert(FieldOrBaseOffsets.upper_bound(offs),
9011                                   std::make_pair(offs, base));
9012       }
9013     }
9014   }
9015 
9016   for (FieldDecl *Field : RDecl->fields()) {
9017     if (!Field->isZeroLengthBitField(*this) && Field->isZeroSize(*this))
9018       continue;
9019     uint64_t offs = layout.getFieldOffset(Field->getFieldIndex());
9020     FieldOrBaseOffsets.insert(FieldOrBaseOffsets.upper_bound(offs),
9021                               std::make_pair(offs, Field));
9022   }
9023 
9024   if (CXXRec && includeVBases) {
9025     for (const auto &BI : CXXRec->vbases()) {
9026       CXXRecordDecl *base = BI.getType()->getAsCXXRecordDecl();
9027       if (base->isEmpty())
9028         continue;
9029       uint64_t offs = toBits(layout.getVBaseClassOffset(base));
9030       if (offs >= uint64_t(toBits(layout.getNonVirtualSize())) &&
9031           FieldOrBaseOffsets.find(offs) == FieldOrBaseOffsets.end())
9032         FieldOrBaseOffsets.insert(FieldOrBaseOffsets.end(),
9033                                   std::make_pair(offs, base));
9034     }
9035   }
9036 
9037   CharUnits size;
9038   if (CXXRec) {
9039     size = includeVBases ? layout.getSize() : layout.getNonVirtualSize();
9040   } else {
9041     size = layout.getSize();
9042   }
9043 
9044 #ifndef NDEBUG
9045   uint64_t CurOffs = 0;
9046 #endif
9047   std::multimap<uint64_t, NamedDecl *>::iterator
9048     CurLayObj = FieldOrBaseOffsets.begin();
9049 
9050   if (CXXRec && CXXRec->isDynamicClass() &&
9051       (CurLayObj == FieldOrBaseOffsets.end() || CurLayObj->first != 0)) {
9052     if (FD) {
9053       S += "\"_vptr$";
9054       std::string recname = CXXRec->getNameAsString();
9055       if (recname.empty()) recname = "?";
9056       S += recname;
9057       S += '"';
9058     }
9059     S += "^^?";
9060 #ifndef NDEBUG
9061     CurOffs += getTypeSize(VoidPtrTy);
9062 #endif
9063   }
9064 
9065   if (!RDecl->hasFlexibleArrayMember()) {
9066     // Mark the end of the structure.
9067     uint64_t offs = toBits(size);
9068     FieldOrBaseOffsets.insert(FieldOrBaseOffsets.upper_bound(offs),
9069                               std::make_pair(offs, nullptr));
9070   }
9071 
9072   for (; CurLayObj != FieldOrBaseOffsets.end(); ++CurLayObj) {
9073 #ifndef NDEBUG
9074     assert(CurOffs <= CurLayObj->first);
9075     if (CurOffs < CurLayObj->first) {
9076       uint64_t padding = CurLayObj->first - CurOffs;
9077       // FIXME: There doesn't seem to be a way to indicate in the encoding that
9078       // packing/alignment of members is different that normal, in which case
9079       // the encoding will be out-of-sync with the real layout.
9080       // If the runtime switches to just consider the size of types without
9081       // taking into account alignment, we could make padding explicit in the
9082       // encoding (e.g. using arrays of chars). The encoding strings would be
9083       // longer then though.
9084       CurOffs += padding;
9085     }
9086 #endif
9087 
9088     NamedDecl *dcl = CurLayObj->second;
9089     if (!dcl)
9090       break; // reached end of structure.
9091 
9092     if (auto *base = dyn_cast<CXXRecordDecl>(dcl)) {
9093       // We expand the bases without their virtual bases since those are going
9094       // in the initial structure. Note that this differs from gcc which
9095       // expands virtual bases each time one is encountered in the hierarchy,
9096       // making the encoding type bigger than it really is.
9097       getObjCEncodingForStructureImpl(base, S, FD, /*includeVBases*/false,
9098                                       NotEncodedT);
9099       assert(!base->isEmpty());
9100 #ifndef NDEBUG
9101       CurOffs += toBits(getASTRecordLayout(base).getNonVirtualSize());
9102 #endif
9103     } else {
9104       const auto *field = cast<FieldDecl>(dcl);
9105       if (FD) {
9106         S += '"';
9107         S += field->getNameAsString();
9108         S += '"';
9109       }
9110 
9111       if (field->isBitField()) {
9112         EncodeBitField(this, S, field->getType(), field);
9113 #ifndef NDEBUG
9114         CurOffs += field->getBitWidthValue(*this);
9115 #endif
9116       } else {
9117         QualType qt = field->getType();
9118         getLegacyIntegralTypeEncoding(qt);
9119         getObjCEncodingForTypeImpl(
9120             qt, S, ObjCEncOptions().setExpandStructures().setIsStructField(),
9121             FD, NotEncodedT);
9122 #ifndef NDEBUG
9123         CurOffs += getTypeSize(field->getType());
9124 #endif
9125       }
9126     }
9127   }
9128 }
9129 
getObjCEncodingForTypeQualifier(Decl::ObjCDeclQualifier QT,std::string & S) const9130 void ASTContext::getObjCEncodingForTypeQualifier(Decl::ObjCDeclQualifier QT,
9131                                                  std::string& S) const {
9132   if (QT & Decl::OBJC_TQ_In)
9133     S += 'n';
9134   if (QT & Decl::OBJC_TQ_Inout)
9135     S += 'N';
9136   if (QT & Decl::OBJC_TQ_Out)
9137     S += 'o';
9138   if (QT & Decl::OBJC_TQ_Bycopy)
9139     S += 'O';
9140   if (QT & Decl::OBJC_TQ_Byref)
9141     S += 'R';
9142   if (QT & Decl::OBJC_TQ_Oneway)
9143     S += 'V';
9144 }
9145 
getObjCIdDecl() const9146 TypedefDecl *ASTContext::getObjCIdDecl() const {
9147   if (!ObjCIdDecl) {
9148     QualType T = getObjCObjectType(ObjCBuiltinIdTy, {}, {});
9149     T = getObjCObjectPointerType(T);
9150     ObjCIdDecl = buildImplicitTypedef(T, "id");
9151   }
9152   return ObjCIdDecl;
9153 }
9154 
getObjCSelDecl() const9155 TypedefDecl *ASTContext::getObjCSelDecl() const {
9156   if (!ObjCSelDecl) {
9157     QualType T = getPointerType(ObjCBuiltinSelTy);
9158     ObjCSelDecl = buildImplicitTypedef(T, "SEL");
9159   }
9160   return ObjCSelDecl;
9161 }
9162 
getObjCClassDecl() const9163 TypedefDecl *ASTContext::getObjCClassDecl() const {
9164   if (!ObjCClassDecl) {
9165     QualType T = getObjCObjectType(ObjCBuiltinClassTy, {}, {});
9166     T = getObjCObjectPointerType(T);
9167     ObjCClassDecl = buildImplicitTypedef(T, "Class");
9168   }
9169   return ObjCClassDecl;
9170 }
9171 
getObjCProtocolDecl() const9172 ObjCInterfaceDecl *ASTContext::getObjCProtocolDecl() const {
9173   if (!ObjCProtocolClassDecl) {
9174     ObjCProtocolClassDecl
9175       = ObjCInterfaceDecl::Create(*this, getTranslationUnitDecl(),
9176                                   SourceLocation(),
9177                                   &Idents.get("Protocol"),
9178                                   /*typeParamList=*/nullptr,
9179                                   /*PrevDecl=*/nullptr,
9180                                   SourceLocation(), true);
9181   }
9182 
9183   return ObjCProtocolClassDecl;
9184 }
9185 
9186 //===----------------------------------------------------------------------===//
9187 // __builtin_va_list Construction Functions
9188 //===----------------------------------------------------------------------===//
9189 
CreateCharPtrNamedVaListDecl(const ASTContext * Context,StringRef Name)9190 static TypedefDecl *CreateCharPtrNamedVaListDecl(const ASTContext *Context,
9191                                                  StringRef Name) {
9192   // typedef char* __builtin[_ms]_va_list;
9193   QualType T = Context->getPointerType(Context->CharTy);
9194   return Context->buildImplicitTypedef(T, Name);
9195 }
9196 
CreateMSVaListDecl(const ASTContext * Context)9197 static TypedefDecl *CreateMSVaListDecl(const ASTContext *Context) {
9198   return CreateCharPtrNamedVaListDecl(Context, "__builtin_ms_va_list");
9199 }
9200 
CreateCharPtrBuiltinVaListDecl(const ASTContext * Context)9201 static TypedefDecl *CreateCharPtrBuiltinVaListDecl(const ASTContext *Context) {
9202   return CreateCharPtrNamedVaListDecl(Context, "__builtin_va_list");
9203 }
9204 
CreateVoidPtrBuiltinVaListDecl(const ASTContext * Context)9205 static TypedefDecl *CreateVoidPtrBuiltinVaListDecl(const ASTContext *Context) {
9206   // typedef void* __builtin_va_list;
9207   QualType T = Context->getPointerType(Context->VoidTy);
9208   return Context->buildImplicitTypedef(T, "__builtin_va_list");
9209 }
9210 
9211 static TypedefDecl *
CreateAArch64ABIBuiltinVaListDecl(const ASTContext * Context)9212 CreateAArch64ABIBuiltinVaListDecl(const ASTContext *Context) {
9213   // struct __va_list
9214   RecordDecl *VaListTagDecl = Context->buildImplicitRecord("__va_list");
9215   if (Context->getLangOpts().CPlusPlus) {
9216     // namespace std { struct __va_list {
9217     auto *NS = NamespaceDecl::Create(
9218         const_cast<ASTContext &>(*Context), Context->getTranslationUnitDecl(),
9219         /*Inline=*/false, SourceLocation(), SourceLocation(),
9220         &Context->Idents.get("std"),
9221         /*PrevDecl=*/nullptr, /*Nested=*/false);
9222     NS->setImplicit();
9223     VaListTagDecl->setDeclContext(NS);
9224   }
9225 
9226   VaListTagDecl->startDefinition();
9227 
9228   const size_t NumFields = 5;
9229   QualType FieldTypes[NumFields];
9230   const char *FieldNames[NumFields];
9231 
9232   // void *__stack;
9233   FieldTypes[0] = Context->getPointerType(Context->VoidTy);
9234   FieldNames[0] = "__stack";
9235 
9236   // void *__gr_top;
9237   FieldTypes[1] = Context->getPointerType(Context->VoidTy);
9238   FieldNames[1] = "__gr_top";
9239 
9240   // void *__vr_top;
9241   FieldTypes[2] = Context->getPointerType(Context->VoidTy);
9242   FieldNames[2] = "__vr_top";
9243 
9244   // int __gr_offs;
9245   FieldTypes[3] = Context->IntTy;
9246   FieldNames[3] = "__gr_offs";
9247 
9248   // int __vr_offs;
9249   FieldTypes[4] = Context->IntTy;
9250   FieldNames[4] = "__vr_offs";
9251 
9252   // Create fields
9253   for (unsigned i = 0; i < NumFields; ++i) {
9254     FieldDecl *Field = FieldDecl::Create(const_cast<ASTContext &>(*Context),
9255                                          VaListTagDecl,
9256                                          SourceLocation(),
9257                                          SourceLocation(),
9258                                          &Context->Idents.get(FieldNames[i]),
9259                                          FieldTypes[i], /*TInfo=*/nullptr,
9260                                          /*BitWidth=*/nullptr,
9261                                          /*Mutable=*/false,
9262                                          ICIS_NoInit);
9263     Field->setAccess(AS_public);
9264     VaListTagDecl->addDecl(Field);
9265   }
9266   VaListTagDecl->completeDefinition();
9267   Context->VaListTagDecl = VaListTagDecl;
9268   QualType VaListTagType = Context->getRecordType(VaListTagDecl);
9269 
9270   // } __builtin_va_list;
9271   return Context->buildImplicitTypedef(VaListTagType, "__builtin_va_list");
9272 }
9273 
CreatePowerABIBuiltinVaListDecl(const ASTContext * Context)9274 static TypedefDecl *CreatePowerABIBuiltinVaListDecl(const ASTContext *Context) {
9275   // typedef struct __va_list_tag {
9276   RecordDecl *VaListTagDecl;
9277 
9278   VaListTagDecl = Context->buildImplicitRecord("__va_list_tag");
9279   VaListTagDecl->startDefinition();
9280 
9281   const size_t NumFields = 5;
9282   QualType FieldTypes[NumFields];
9283   const char *FieldNames[NumFields];
9284 
9285   //   unsigned char gpr;
9286   FieldTypes[0] = Context->UnsignedCharTy;
9287   FieldNames[0] = "gpr";
9288 
9289   //   unsigned char fpr;
9290   FieldTypes[1] = Context->UnsignedCharTy;
9291   FieldNames[1] = "fpr";
9292 
9293   //   unsigned short reserved;
9294   FieldTypes[2] = Context->UnsignedShortTy;
9295   FieldNames[2] = "reserved";
9296 
9297   //   void* overflow_arg_area;
9298   FieldTypes[3] = Context->getPointerType(Context->VoidTy);
9299   FieldNames[3] = "overflow_arg_area";
9300 
9301   //   void* reg_save_area;
9302   FieldTypes[4] = Context->getPointerType(Context->VoidTy);
9303   FieldNames[4] = "reg_save_area";
9304 
9305   // Create fields
9306   for (unsigned i = 0; i < NumFields; ++i) {
9307     FieldDecl *Field = FieldDecl::Create(*Context, VaListTagDecl,
9308                                          SourceLocation(),
9309                                          SourceLocation(),
9310                                          &Context->Idents.get(FieldNames[i]),
9311                                          FieldTypes[i], /*TInfo=*/nullptr,
9312                                          /*BitWidth=*/nullptr,
9313                                          /*Mutable=*/false,
9314                                          ICIS_NoInit);
9315     Field->setAccess(AS_public);
9316     VaListTagDecl->addDecl(Field);
9317   }
9318   VaListTagDecl->completeDefinition();
9319   Context->VaListTagDecl = VaListTagDecl;
9320   QualType VaListTagType = Context->getRecordType(VaListTagDecl);
9321 
9322   // } __va_list_tag;
9323   TypedefDecl *VaListTagTypedefDecl =
9324       Context->buildImplicitTypedef(VaListTagType, "__va_list_tag");
9325 
9326   QualType VaListTagTypedefType =
9327     Context->getTypedefType(VaListTagTypedefDecl);
9328 
9329   // typedef __va_list_tag __builtin_va_list[1];
9330   llvm::APInt Size(Context->getTypeSize(Context->getSizeType()), 1);
9331   QualType VaListTagArrayType = Context->getConstantArrayType(
9332       VaListTagTypedefType, Size, nullptr, ArraySizeModifier::Normal, 0);
9333   return Context->buildImplicitTypedef(VaListTagArrayType, "__builtin_va_list");
9334 }
9335 
9336 static TypedefDecl *
CreateX86_64ABIBuiltinVaListDecl(const ASTContext * Context)9337 CreateX86_64ABIBuiltinVaListDecl(const ASTContext *Context) {
9338   // struct __va_list_tag {
9339   RecordDecl *VaListTagDecl;
9340   VaListTagDecl = Context->buildImplicitRecord("__va_list_tag");
9341   VaListTagDecl->startDefinition();
9342 
9343   const size_t NumFields = 4;
9344   QualType FieldTypes[NumFields];
9345   const char *FieldNames[NumFields];
9346 
9347   //   unsigned gp_offset;
9348   FieldTypes[0] = Context->UnsignedIntTy;
9349   FieldNames[0] = "gp_offset";
9350 
9351   //   unsigned fp_offset;
9352   FieldTypes[1] = Context->UnsignedIntTy;
9353   FieldNames[1] = "fp_offset";
9354 
9355   //   void* overflow_arg_area;
9356   FieldTypes[2] = Context->getPointerType(Context->VoidTy);
9357   FieldNames[2] = "overflow_arg_area";
9358 
9359   //   void* reg_save_area;
9360   FieldTypes[3] = Context->getPointerType(Context->VoidTy);
9361   FieldNames[3] = "reg_save_area";
9362 
9363   // Create fields
9364   for (unsigned i = 0; i < NumFields; ++i) {
9365     FieldDecl *Field = FieldDecl::Create(const_cast<ASTContext &>(*Context),
9366                                          VaListTagDecl,
9367                                          SourceLocation(),
9368                                          SourceLocation(),
9369                                          &Context->Idents.get(FieldNames[i]),
9370                                          FieldTypes[i], /*TInfo=*/nullptr,
9371                                          /*BitWidth=*/nullptr,
9372                                          /*Mutable=*/false,
9373                                          ICIS_NoInit);
9374     Field->setAccess(AS_public);
9375     VaListTagDecl->addDecl(Field);
9376   }
9377   VaListTagDecl->completeDefinition();
9378   Context->VaListTagDecl = VaListTagDecl;
9379   QualType VaListTagType = Context->getRecordType(VaListTagDecl);
9380 
9381   // };
9382 
9383   // typedef struct __va_list_tag __builtin_va_list[1];
9384   llvm::APInt Size(Context->getTypeSize(Context->getSizeType()), 1);
9385   QualType VaListTagArrayType = Context->getConstantArrayType(
9386       VaListTagType, Size, nullptr, ArraySizeModifier::Normal, 0);
9387   return Context->buildImplicitTypedef(VaListTagArrayType, "__builtin_va_list");
9388 }
9389 
CreatePNaClABIBuiltinVaListDecl(const ASTContext * Context)9390 static TypedefDecl *CreatePNaClABIBuiltinVaListDecl(const ASTContext *Context) {
9391   // typedef int __builtin_va_list[4];
9392   llvm::APInt Size(Context->getTypeSize(Context->getSizeType()), 4);
9393   QualType IntArrayType = Context->getConstantArrayType(
9394       Context->IntTy, Size, nullptr, ArraySizeModifier::Normal, 0);
9395   return Context->buildImplicitTypedef(IntArrayType, "__builtin_va_list");
9396 }
9397 
9398 static TypedefDecl *
CreateAAPCSABIBuiltinVaListDecl(const ASTContext * Context)9399 CreateAAPCSABIBuiltinVaListDecl(const ASTContext *Context) {
9400   // struct __va_list
9401   RecordDecl *VaListDecl = Context->buildImplicitRecord("__va_list");
9402   if (Context->getLangOpts().CPlusPlus) {
9403     // namespace std { struct __va_list {
9404     NamespaceDecl *NS;
9405     NS = NamespaceDecl::Create(const_cast<ASTContext &>(*Context),
9406                                Context->getTranslationUnitDecl(),
9407                                /*Inline=*/false, SourceLocation(),
9408                                SourceLocation(), &Context->Idents.get("std"),
9409                                /*PrevDecl=*/nullptr, /*Nested=*/false);
9410     NS->setImplicit();
9411     VaListDecl->setDeclContext(NS);
9412   }
9413 
9414   VaListDecl->startDefinition();
9415 
9416   // void * __ap;
9417   FieldDecl *Field = FieldDecl::Create(const_cast<ASTContext &>(*Context),
9418                                        VaListDecl,
9419                                        SourceLocation(),
9420                                        SourceLocation(),
9421                                        &Context->Idents.get("__ap"),
9422                                        Context->getPointerType(Context->VoidTy),
9423                                        /*TInfo=*/nullptr,
9424                                        /*BitWidth=*/nullptr,
9425                                        /*Mutable=*/false,
9426                                        ICIS_NoInit);
9427   Field->setAccess(AS_public);
9428   VaListDecl->addDecl(Field);
9429 
9430   // };
9431   VaListDecl->completeDefinition();
9432   Context->VaListTagDecl = VaListDecl;
9433 
9434   // typedef struct __va_list __builtin_va_list;
9435   QualType T = Context->getRecordType(VaListDecl);
9436   return Context->buildImplicitTypedef(T, "__builtin_va_list");
9437 }
9438 
9439 static TypedefDecl *
CreateSystemZBuiltinVaListDecl(const ASTContext * Context)9440 CreateSystemZBuiltinVaListDecl(const ASTContext *Context) {
9441   // struct __va_list_tag {
9442   RecordDecl *VaListTagDecl;
9443   VaListTagDecl = Context->buildImplicitRecord("__va_list_tag");
9444   VaListTagDecl->startDefinition();
9445 
9446   const size_t NumFields = 4;
9447   QualType FieldTypes[NumFields];
9448   const char *FieldNames[NumFields];
9449 
9450   //   long __gpr;
9451   FieldTypes[0] = Context->LongTy;
9452   FieldNames[0] = "__gpr";
9453 
9454   //   long __fpr;
9455   FieldTypes[1] = Context->LongTy;
9456   FieldNames[1] = "__fpr";
9457 
9458   //   void *__overflow_arg_area;
9459   FieldTypes[2] = Context->getPointerType(Context->VoidTy);
9460   FieldNames[2] = "__overflow_arg_area";
9461 
9462   //   void *__reg_save_area;
9463   FieldTypes[3] = Context->getPointerType(Context->VoidTy);
9464   FieldNames[3] = "__reg_save_area";
9465 
9466   // Create fields
9467   for (unsigned i = 0; i < NumFields; ++i) {
9468     FieldDecl *Field = FieldDecl::Create(const_cast<ASTContext &>(*Context),
9469                                          VaListTagDecl,
9470                                          SourceLocation(),
9471                                          SourceLocation(),
9472                                          &Context->Idents.get(FieldNames[i]),
9473                                          FieldTypes[i], /*TInfo=*/nullptr,
9474                                          /*BitWidth=*/nullptr,
9475                                          /*Mutable=*/false,
9476                                          ICIS_NoInit);
9477     Field->setAccess(AS_public);
9478     VaListTagDecl->addDecl(Field);
9479   }
9480   VaListTagDecl->completeDefinition();
9481   Context->VaListTagDecl = VaListTagDecl;
9482   QualType VaListTagType = Context->getRecordType(VaListTagDecl);
9483 
9484   // };
9485 
9486   // typedef __va_list_tag __builtin_va_list[1];
9487   llvm::APInt Size(Context->getTypeSize(Context->getSizeType()), 1);
9488   QualType VaListTagArrayType = Context->getConstantArrayType(
9489       VaListTagType, Size, nullptr, ArraySizeModifier::Normal, 0);
9490 
9491   return Context->buildImplicitTypedef(VaListTagArrayType, "__builtin_va_list");
9492 }
9493 
CreateHexagonBuiltinVaListDecl(const ASTContext * Context)9494 static TypedefDecl *CreateHexagonBuiltinVaListDecl(const ASTContext *Context) {
9495   // typedef struct __va_list_tag {
9496   RecordDecl *VaListTagDecl;
9497   VaListTagDecl = Context->buildImplicitRecord("__va_list_tag");
9498   VaListTagDecl->startDefinition();
9499 
9500   const size_t NumFields = 3;
9501   QualType FieldTypes[NumFields];
9502   const char *FieldNames[NumFields];
9503 
9504   //   void *CurrentSavedRegisterArea;
9505   FieldTypes[0] = Context->getPointerType(Context->VoidTy);
9506   FieldNames[0] = "__current_saved_reg_area_pointer";
9507 
9508   //   void *SavedRegAreaEnd;
9509   FieldTypes[1] = Context->getPointerType(Context->VoidTy);
9510   FieldNames[1] = "__saved_reg_area_end_pointer";
9511 
9512   //   void *OverflowArea;
9513   FieldTypes[2] = Context->getPointerType(Context->VoidTy);
9514   FieldNames[2] = "__overflow_area_pointer";
9515 
9516   // Create fields
9517   for (unsigned i = 0; i < NumFields; ++i) {
9518     FieldDecl *Field = FieldDecl::Create(
9519         const_cast<ASTContext &>(*Context), VaListTagDecl, SourceLocation(),
9520         SourceLocation(), &Context->Idents.get(FieldNames[i]), FieldTypes[i],
9521         /*TInfo=*/nullptr,
9522         /*BitWidth=*/nullptr,
9523         /*Mutable=*/false, ICIS_NoInit);
9524     Field->setAccess(AS_public);
9525     VaListTagDecl->addDecl(Field);
9526   }
9527   VaListTagDecl->completeDefinition();
9528   Context->VaListTagDecl = VaListTagDecl;
9529   QualType VaListTagType = Context->getRecordType(VaListTagDecl);
9530 
9531   // } __va_list_tag;
9532   TypedefDecl *VaListTagTypedefDecl =
9533       Context->buildImplicitTypedef(VaListTagType, "__va_list_tag");
9534 
9535   QualType VaListTagTypedefType = Context->getTypedefType(VaListTagTypedefDecl);
9536 
9537   // typedef __va_list_tag __builtin_va_list[1];
9538   llvm::APInt Size(Context->getTypeSize(Context->getSizeType()), 1);
9539   QualType VaListTagArrayType = Context->getConstantArrayType(
9540       VaListTagTypedefType, Size, nullptr, ArraySizeModifier::Normal, 0);
9541 
9542   return Context->buildImplicitTypedef(VaListTagArrayType, "__builtin_va_list");
9543 }
9544 
CreateVaListDecl(const ASTContext * Context,TargetInfo::BuiltinVaListKind Kind)9545 static TypedefDecl *CreateVaListDecl(const ASTContext *Context,
9546                                      TargetInfo::BuiltinVaListKind Kind) {
9547   switch (Kind) {
9548   case TargetInfo::CharPtrBuiltinVaList:
9549     return CreateCharPtrBuiltinVaListDecl(Context);
9550   case TargetInfo::VoidPtrBuiltinVaList:
9551     return CreateVoidPtrBuiltinVaListDecl(Context);
9552   case TargetInfo::AArch64ABIBuiltinVaList:
9553     return CreateAArch64ABIBuiltinVaListDecl(Context);
9554   case TargetInfo::PowerABIBuiltinVaList:
9555     return CreatePowerABIBuiltinVaListDecl(Context);
9556   case TargetInfo::X86_64ABIBuiltinVaList:
9557     return CreateX86_64ABIBuiltinVaListDecl(Context);
9558   case TargetInfo::PNaClABIBuiltinVaList:
9559     return CreatePNaClABIBuiltinVaListDecl(Context);
9560   case TargetInfo::AAPCSABIBuiltinVaList:
9561     return CreateAAPCSABIBuiltinVaListDecl(Context);
9562   case TargetInfo::SystemZBuiltinVaList:
9563     return CreateSystemZBuiltinVaListDecl(Context);
9564   case TargetInfo::HexagonBuiltinVaList:
9565     return CreateHexagonBuiltinVaListDecl(Context);
9566   }
9567 
9568   llvm_unreachable("Unhandled __builtin_va_list type kind");
9569 }
9570 
getBuiltinVaListDecl() const9571 TypedefDecl *ASTContext::getBuiltinVaListDecl() const {
9572   if (!BuiltinVaListDecl) {
9573     BuiltinVaListDecl = CreateVaListDecl(this, Target->getBuiltinVaListKind());
9574     assert(BuiltinVaListDecl->isImplicit());
9575   }
9576 
9577   return BuiltinVaListDecl;
9578 }
9579 
getVaListTagDecl() const9580 Decl *ASTContext::getVaListTagDecl() const {
9581   // Force the creation of VaListTagDecl by building the __builtin_va_list
9582   // declaration.
9583   if (!VaListTagDecl)
9584     (void)getBuiltinVaListDecl();
9585 
9586   return VaListTagDecl;
9587 }
9588 
getBuiltinMSVaListDecl() const9589 TypedefDecl *ASTContext::getBuiltinMSVaListDecl() const {
9590   if (!BuiltinMSVaListDecl)
9591     BuiltinMSVaListDecl = CreateMSVaListDecl(this);
9592 
9593   return BuiltinMSVaListDecl;
9594 }
9595 
canBuiltinBeRedeclared(const FunctionDecl * FD) const9596 bool ASTContext::canBuiltinBeRedeclared(const FunctionDecl *FD) const {
9597   // Allow redecl custom type checking builtin for HLSL.
9598   if (LangOpts.HLSL && FD->getBuiltinID() != Builtin::NotBuiltin &&
9599       BuiltinInfo.hasCustomTypechecking(FD->getBuiltinID()))
9600     return true;
9601   return BuiltinInfo.canBeRedeclared(FD->getBuiltinID());
9602 }
9603 
setObjCConstantStringInterface(ObjCInterfaceDecl * Decl)9604 void ASTContext::setObjCConstantStringInterface(ObjCInterfaceDecl *Decl) {
9605   assert(ObjCConstantStringType.isNull() &&
9606          "'NSConstantString' type already set!");
9607 
9608   ObjCConstantStringType = getObjCInterfaceType(Decl);
9609 }
9610 
9611 /// Retrieve the template name that corresponds to a non-empty
9612 /// lookup.
9613 TemplateName
getOverloadedTemplateName(UnresolvedSetIterator Begin,UnresolvedSetIterator End) const9614 ASTContext::getOverloadedTemplateName(UnresolvedSetIterator Begin,
9615                                       UnresolvedSetIterator End) const {
9616   unsigned size = End - Begin;
9617   assert(size > 1 && "set is not overloaded!");
9618 
9619   void *memory = Allocate(sizeof(OverloadedTemplateStorage) +
9620                           size * sizeof(FunctionTemplateDecl*));
9621   auto *OT = new (memory) OverloadedTemplateStorage(size);
9622 
9623   NamedDecl **Storage = OT->getStorage();
9624   for (UnresolvedSetIterator I = Begin; I != End; ++I) {
9625     NamedDecl *D = *I;
9626     assert(isa<FunctionTemplateDecl>(D) ||
9627            isa<UnresolvedUsingValueDecl>(D) ||
9628            (isa<UsingShadowDecl>(D) &&
9629             isa<FunctionTemplateDecl>(D->getUnderlyingDecl())));
9630     *Storage++ = D;
9631   }
9632 
9633   return TemplateName(OT);
9634 }
9635 
9636 /// Retrieve a template name representing an unqualified-id that has been
9637 /// assumed to name a template for ADL purposes.
getAssumedTemplateName(DeclarationName Name) const9638 TemplateName ASTContext::getAssumedTemplateName(DeclarationName Name) const {
9639   auto *OT = new (*this) AssumedTemplateStorage(Name);
9640   return TemplateName(OT);
9641 }
9642 
9643 /// Retrieve the template name that represents a qualified
9644 /// template name such as \c std::vector.
getQualifiedTemplateName(NestedNameSpecifier * NNS,bool TemplateKeyword,TemplateName Template) const9645 TemplateName ASTContext::getQualifiedTemplateName(NestedNameSpecifier *NNS,
9646                                                   bool TemplateKeyword,
9647                                                   TemplateName Template) const {
9648   assert(Template.getKind() == TemplateName::Template ||
9649          Template.getKind() == TemplateName::UsingTemplate);
9650 
9651   // FIXME: Canonicalization?
9652   llvm::FoldingSetNodeID ID;
9653   QualifiedTemplateName::Profile(ID, NNS, TemplateKeyword, Template);
9654 
9655   void *InsertPos = nullptr;
9656   QualifiedTemplateName *QTN =
9657     QualifiedTemplateNames.FindNodeOrInsertPos(ID, InsertPos);
9658   if (!QTN) {
9659     QTN = new (*this, alignof(QualifiedTemplateName))
9660         QualifiedTemplateName(NNS, TemplateKeyword, Template);
9661     QualifiedTemplateNames.InsertNode(QTN, InsertPos);
9662   }
9663 
9664   return TemplateName(QTN);
9665 }
9666 
9667 /// Retrieve the template name that represents a dependent
9668 /// template name such as \c MetaFun::template apply.
9669 TemplateName
getDependentTemplateName(NestedNameSpecifier * NNS,const IdentifierInfo * Name) const9670 ASTContext::getDependentTemplateName(NestedNameSpecifier *NNS,
9671                                      const IdentifierInfo *Name) const {
9672   assert((!NNS || NNS->isDependent()) &&
9673          "Nested name specifier must be dependent");
9674 
9675   llvm::FoldingSetNodeID ID;
9676   DependentTemplateName::Profile(ID, NNS, Name);
9677 
9678   void *InsertPos = nullptr;
9679   DependentTemplateName *QTN =
9680     DependentTemplateNames.FindNodeOrInsertPos(ID, InsertPos);
9681 
9682   if (QTN)
9683     return TemplateName(QTN);
9684 
9685   NestedNameSpecifier *CanonNNS = getCanonicalNestedNameSpecifier(NNS);
9686   if (CanonNNS == NNS) {
9687     QTN = new (*this, alignof(DependentTemplateName))
9688         DependentTemplateName(NNS, Name);
9689   } else {
9690     TemplateName Canon = getDependentTemplateName(CanonNNS, Name);
9691     QTN = new (*this, alignof(DependentTemplateName))
9692         DependentTemplateName(NNS, Name, Canon);
9693     DependentTemplateName *CheckQTN =
9694       DependentTemplateNames.FindNodeOrInsertPos(ID, InsertPos);
9695     assert(!CheckQTN && "Dependent type name canonicalization broken");
9696     (void)CheckQTN;
9697   }
9698 
9699   DependentTemplateNames.InsertNode(QTN, InsertPos);
9700   return TemplateName(QTN);
9701 }
9702 
9703 /// Retrieve the template name that represents a dependent
9704 /// template name such as \c MetaFun::template operator+.
9705 TemplateName
getDependentTemplateName(NestedNameSpecifier * NNS,OverloadedOperatorKind Operator) const9706 ASTContext::getDependentTemplateName(NestedNameSpecifier *NNS,
9707                                      OverloadedOperatorKind Operator) const {
9708   assert((!NNS || NNS->isDependent()) &&
9709          "Nested name specifier must be dependent");
9710 
9711   llvm::FoldingSetNodeID ID;
9712   DependentTemplateName::Profile(ID, NNS, Operator);
9713 
9714   void *InsertPos = nullptr;
9715   DependentTemplateName *QTN
9716     = DependentTemplateNames.FindNodeOrInsertPos(ID, InsertPos);
9717 
9718   if (QTN)
9719     return TemplateName(QTN);
9720 
9721   NestedNameSpecifier *CanonNNS = getCanonicalNestedNameSpecifier(NNS);
9722   if (CanonNNS == NNS) {
9723     QTN = new (*this, alignof(DependentTemplateName))
9724         DependentTemplateName(NNS, Operator);
9725   } else {
9726     TemplateName Canon = getDependentTemplateName(CanonNNS, Operator);
9727     QTN = new (*this, alignof(DependentTemplateName))
9728         DependentTemplateName(NNS, Operator, Canon);
9729 
9730     DependentTemplateName *CheckQTN
9731       = DependentTemplateNames.FindNodeOrInsertPos(ID, InsertPos);
9732     assert(!CheckQTN && "Dependent template name canonicalization broken");
9733     (void)CheckQTN;
9734   }
9735 
9736   DependentTemplateNames.InsertNode(QTN, InsertPos);
9737   return TemplateName(QTN);
9738 }
9739 
getSubstTemplateTemplateParm(TemplateName Replacement,Decl * AssociatedDecl,unsigned Index,std::optional<unsigned> PackIndex) const9740 TemplateName ASTContext::getSubstTemplateTemplateParm(
9741     TemplateName Replacement, Decl *AssociatedDecl, unsigned Index,
9742     std::optional<unsigned> PackIndex) const {
9743   llvm::FoldingSetNodeID ID;
9744   SubstTemplateTemplateParmStorage::Profile(ID, Replacement, AssociatedDecl,
9745                                             Index, PackIndex);
9746 
9747   void *insertPos = nullptr;
9748   SubstTemplateTemplateParmStorage *subst
9749     = SubstTemplateTemplateParms.FindNodeOrInsertPos(ID, insertPos);
9750 
9751   if (!subst) {
9752     subst = new (*this) SubstTemplateTemplateParmStorage(
9753         Replacement, AssociatedDecl, Index, PackIndex);
9754     SubstTemplateTemplateParms.InsertNode(subst, insertPos);
9755   }
9756 
9757   return TemplateName(subst);
9758 }
9759 
9760 TemplateName
getSubstTemplateTemplateParmPack(const TemplateArgument & ArgPack,Decl * AssociatedDecl,unsigned Index,bool Final) const9761 ASTContext::getSubstTemplateTemplateParmPack(const TemplateArgument &ArgPack,
9762                                              Decl *AssociatedDecl,
9763                                              unsigned Index, bool Final) const {
9764   auto &Self = const_cast<ASTContext &>(*this);
9765   llvm::FoldingSetNodeID ID;
9766   SubstTemplateTemplateParmPackStorage::Profile(ID, Self, ArgPack,
9767                                                 AssociatedDecl, Index, Final);
9768 
9769   void *InsertPos = nullptr;
9770   SubstTemplateTemplateParmPackStorage *Subst
9771     = SubstTemplateTemplateParmPacks.FindNodeOrInsertPos(ID, InsertPos);
9772 
9773   if (!Subst) {
9774     Subst = new (*this) SubstTemplateTemplateParmPackStorage(
9775         ArgPack.pack_elements(), AssociatedDecl, Index, Final);
9776     SubstTemplateTemplateParmPacks.InsertNode(Subst, InsertPos);
9777   }
9778 
9779   return TemplateName(Subst);
9780 }
9781 
9782 /// getFromTargetType - Given one of the integer types provided by
9783 /// TargetInfo, produce the corresponding type. The unsigned @p Type
9784 /// is actually a value of type @c TargetInfo::IntType.
getFromTargetType(unsigned Type) const9785 CanQualType ASTContext::getFromTargetType(unsigned Type) const {
9786   switch (Type) {
9787   case TargetInfo::NoInt: return {};
9788   case TargetInfo::SignedChar: return SignedCharTy;
9789   case TargetInfo::UnsignedChar: return UnsignedCharTy;
9790   case TargetInfo::SignedShort: return ShortTy;
9791   case TargetInfo::UnsignedShort: return UnsignedShortTy;
9792   case TargetInfo::SignedInt: return IntTy;
9793   case TargetInfo::UnsignedInt: return UnsignedIntTy;
9794   case TargetInfo::SignedLong: return LongTy;
9795   case TargetInfo::UnsignedLong: return UnsignedLongTy;
9796   case TargetInfo::SignedLongLong: return LongLongTy;
9797   case TargetInfo::UnsignedLongLong: return UnsignedLongLongTy;
9798   }
9799 
9800   llvm_unreachable("Unhandled TargetInfo::IntType value");
9801 }
9802 
9803 //===----------------------------------------------------------------------===//
9804 //                        Type Predicates.
9805 //===----------------------------------------------------------------------===//
9806 
9807 /// getObjCGCAttr - Returns one of GCNone, Weak or Strong objc's
9808 /// garbage collection attribute.
9809 ///
getObjCGCAttrKind(QualType Ty) const9810 Qualifiers::GC ASTContext::getObjCGCAttrKind(QualType Ty) const {
9811   if (getLangOpts().getGC() == LangOptions::NonGC)
9812     return Qualifiers::GCNone;
9813 
9814   assert(getLangOpts().ObjC);
9815   Qualifiers::GC GCAttrs = Ty.getObjCGCAttr();
9816 
9817   // Default behaviour under objective-C's gc is for ObjC pointers
9818   // (or pointers to them) be treated as though they were declared
9819   // as __strong.
9820   if (GCAttrs == Qualifiers::GCNone) {
9821     if (Ty->isObjCObjectPointerType() || Ty->isBlockPointerType())
9822       return Qualifiers::Strong;
9823     else if (Ty->isPointerType())
9824       return getObjCGCAttrKind(Ty->castAs<PointerType>()->getPointeeType());
9825   } else {
9826     // It's not valid to set GC attributes on anything that isn't a
9827     // pointer.
9828 #ifndef NDEBUG
9829     QualType CT = Ty->getCanonicalTypeInternal();
9830     while (const auto *AT = dyn_cast<ArrayType>(CT))
9831       CT = AT->getElementType();
9832     assert(CT->isAnyPointerType() || CT->isBlockPointerType());
9833 #endif
9834   }
9835   return GCAttrs;
9836 }
9837 
9838 //===----------------------------------------------------------------------===//
9839 //                        Type Compatibility Testing
9840 //===----------------------------------------------------------------------===//
9841 
9842 /// areCompatVectorTypes - Return true if the two specified vector types are
9843 /// compatible.
areCompatVectorTypes(const VectorType * LHS,const VectorType * RHS)9844 static bool areCompatVectorTypes(const VectorType *LHS,
9845                                  const VectorType *RHS) {
9846   assert(LHS->isCanonicalUnqualified() && RHS->isCanonicalUnqualified());
9847   return LHS->getElementType() == RHS->getElementType() &&
9848          LHS->getNumElements() == RHS->getNumElements();
9849 }
9850 
9851 /// areCompatMatrixTypes - Return true if the two specified matrix types are
9852 /// compatible.
areCompatMatrixTypes(const ConstantMatrixType * LHS,const ConstantMatrixType * RHS)9853 static bool areCompatMatrixTypes(const ConstantMatrixType *LHS,
9854                                  const ConstantMatrixType *RHS) {
9855   assert(LHS->isCanonicalUnqualified() && RHS->isCanonicalUnqualified());
9856   return LHS->getElementType() == RHS->getElementType() &&
9857          LHS->getNumRows() == RHS->getNumRows() &&
9858          LHS->getNumColumns() == RHS->getNumColumns();
9859 }
9860 
areCompatibleVectorTypes(QualType FirstVec,QualType SecondVec)9861 bool ASTContext::areCompatibleVectorTypes(QualType FirstVec,
9862                                           QualType SecondVec) {
9863   assert(FirstVec->isVectorType() && "FirstVec should be a vector type");
9864   assert(SecondVec->isVectorType() && "SecondVec should be a vector type");
9865 
9866   if (hasSameUnqualifiedType(FirstVec, SecondVec))
9867     return true;
9868 
9869   // Treat Neon vector types and most AltiVec vector types as if they are the
9870   // equivalent GCC vector types.
9871   const auto *First = FirstVec->castAs<VectorType>();
9872   const auto *Second = SecondVec->castAs<VectorType>();
9873   if (First->getNumElements() == Second->getNumElements() &&
9874       hasSameType(First->getElementType(), Second->getElementType()) &&
9875       First->getVectorKind() != VectorKind::AltiVecPixel &&
9876       First->getVectorKind() != VectorKind::AltiVecBool &&
9877       Second->getVectorKind() != VectorKind::AltiVecPixel &&
9878       Second->getVectorKind() != VectorKind::AltiVecBool &&
9879       First->getVectorKind() != VectorKind::SveFixedLengthData &&
9880       First->getVectorKind() != VectorKind::SveFixedLengthPredicate &&
9881       Second->getVectorKind() != VectorKind::SveFixedLengthData &&
9882       Second->getVectorKind() != VectorKind::SveFixedLengthPredicate &&
9883       First->getVectorKind() != VectorKind::RVVFixedLengthData &&
9884       Second->getVectorKind() != VectorKind::RVVFixedLengthData &&
9885       First->getVectorKind() != VectorKind::RVVFixedLengthMask &&
9886       Second->getVectorKind() != VectorKind::RVVFixedLengthMask)
9887     return true;
9888 
9889   return false;
9890 }
9891 
9892 /// getSVETypeSize - Return SVE vector or predicate register size.
getSVETypeSize(ASTContext & Context,const BuiltinType * Ty)9893 static uint64_t getSVETypeSize(ASTContext &Context, const BuiltinType *Ty) {
9894   assert(Ty->isSveVLSBuiltinType() && "Invalid SVE Type");
9895   if (Ty->getKind() == BuiltinType::SveBool ||
9896       Ty->getKind() == BuiltinType::SveCount)
9897     return (Context.getLangOpts().VScaleMin * 128) / Context.getCharWidth();
9898   return Context.getLangOpts().VScaleMin * 128;
9899 }
9900 
areCompatibleSveTypes(QualType FirstType,QualType SecondType)9901 bool ASTContext::areCompatibleSveTypes(QualType FirstType,
9902                                        QualType SecondType) {
9903   auto IsValidCast = [this](QualType FirstType, QualType SecondType) {
9904     if (const auto *BT = FirstType->getAs<BuiltinType>()) {
9905       if (const auto *VT = SecondType->getAs<VectorType>()) {
9906         // Predicates have the same representation as uint8 so we also have to
9907         // check the kind to make these types incompatible.
9908         if (VT->getVectorKind() == VectorKind::SveFixedLengthPredicate)
9909           return BT->getKind() == BuiltinType::SveBool;
9910         else if (VT->getVectorKind() == VectorKind::SveFixedLengthData)
9911           return VT->getElementType().getCanonicalType() ==
9912                  FirstType->getSveEltType(*this);
9913         else if (VT->getVectorKind() == VectorKind::Generic)
9914           return getTypeSize(SecondType) == getSVETypeSize(*this, BT) &&
9915                  hasSameType(VT->getElementType(),
9916                              getBuiltinVectorTypeInfo(BT).ElementType);
9917       }
9918     }
9919     return false;
9920   };
9921 
9922   return IsValidCast(FirstType, SecondType) ||
9923          IsValidCast(SecondType, FirstType);
9924 }
9925 
areLaxCompatibleSveTypes(QualType FirstType,QualType SecondType)9926 bool ASTContext::areLaxCompatibleSveTypes(QualType FirstType,
9927                                           QualType SecondType) {
9928   auto IsLaxCompatible = [this](QualType FirstType, QualType SecondType) {
9929     const auto *BT = FirstType->getAs<BuiltinType>();
9930     if (!BT)
9931       return false;
9932 
9933     const auto *VecTy = SecondType->getAs<VectorType>();
9934     if (VecTy && (VecTy->getVectorKind() == VectorKind::SveFixedLengthData ||
9935                   VecTy->getVectorKind() == VectorKind::Generic)) {
9936       const LangOptions::LaxVectorConversionKind LVCKind =
9937           getLangOpts().getLaxVectorConversions();
9938 
9939       // Can not convert between sve predicates and sve vectors because of
9940       // different size.
9941       if (BT->getKind() == BuiltinType::SveBool &&
9942           VecTy->getVectorKind() == VectorKind::SveFixedLengthData)
9943         return false;
9944 
9945       // If __ARM_FEATURE_SVE_BITS != N do not allow GNU vector lax conversion.
9946       // "Whenever __ARM_FEATURE_SVE_BITS==N, GNUT implicitly
9947       // converts to VLAT and VLAT implicitly converts to GNUT."
9948       // ACLE Spec Version 00bet6, 3.7.3.2. Behavior common to vectors and
9949       // predicates.
9950       if (VecTy->getVectorKind() == VectorKind::Generic &&
9951           getTypeSize(SecondType) != getSVETypeSize(*this, BT))
9952         return false;
9953 
9954       // If -flax-vector-conversions=all is specified, the types are
9955       // certainly compatible.
9956       if (LVCKind == LangOptions::LaxVectorConversionKind::All)
9957         return true;
9958 
9959       // If -flax-vector-conversions=integer is specified, the types are
9960       // compatible if the elements are integer types.
9961       if (LVCKind == LangOptions::LaxVectorConversionKind::Integer)
9962         return VecTy->getElementType().getCanonicalType()->isIntegerType() &&
9963                FirstType->getSveEltType(*this)->isIntegerType();
9964     }
9965 
9966     return false;
9967   };
9968 
9969   return IsLaxCompatible(FirstType, SecondType) ||
9970          IsLaxCompatible(SecondType, FirstType);
9971 }
9972 
9973 /// getRVVTypeSize - Return RVV vector register size.
getRVVTypeSize(ASTContext & Context,const BuiltinType * Ty)9974 static uint64_t getRVVTypeSize(ASTContext &Context, const BuiltinType *Ty) {
9975   assert(Ty->isRVVVLSBuiltinType() && "Invalid RVV Type");
9976   auto VScale = Context.getTargetInfo().getVScaleRange(Context.getLangOpts());
9977   if (!VScale)
9978     return 0;
9979 
9980   ASTContext::BuiltinVectorTypeInfo Info = Context.getBuiltinVectorTypeInfo(Ty);
9981 
9982   uint64_t EltSize = Context.getTypeSize(Info.ElementType);
9983   if (Info.ElementType == Context.BoolTy)
9984     EltSize = 1;
9985 
9986   uint64_t MinElts = Info.EC.getKnownMinValue();
9987   return VScale->first * MinElts * EltSize;
9988 }
9989 
areCompatibleRVVTypes(QualType FirstType,QualType SecondType)9990 bool ASTContext::areCompatibleRVVTypes(QualType FirstType,
9991                                        QualType SecondType) {
9992   assert(
9993       ((FirstType->isRVVSizelessBuiltinType() && SecondType->isVectorType()) ||
9994        (FirstType->isVectorType() && SecondType->isRVVSizelessBuiltinType())) &&
9995       "Expected RVV builtin type and vector type!");
9996 
9997   auto IsValidCast = [this](QualType FirstType, QualType SecondType) {
9998     if (const auto *BT = FirstType->getAs<BuiltinType>()) {
9999       if (const auto *VT = SecondType->getAs<VectorType>()) {
10000         if (VT->getVectorKind() == VectorKind::RVVFixedLengthMask) {
10001           BuiltinVectorTypeInfo Info = getBuiltinVectorTypeInfo(BT);
10002           return FirstType->isRVVVLSBuiltinType() &&
10003                  Info.ElementType == BoolTy &&
10004                  getTypeSize(SecondType) == getRVVTypeSize(*this, BT);
10005         }
10006         if (VT->getVectorKind() == VectorKind::RVVFixedLengthData ||
10007             VT->getVectorKind() == VectorKind::Generic)
10008           return FirstType->isRVVVLSBuiltinType() &&
10009                  getTypeSize(SecondType) == getRVVTypeSize(*this, BT) &&
10010                  hasSameType(VT->getElementType(),
10011                              getBuiltinVectorTypeInfo(BT).ElementType);
10012       }
10013     }
10014     return false;
10015   };
10016 
10017   return IsValidCast(FirstType, SecondType) ||
10018          IsValidCast(SecondType, FirstType);
10019 }
10020 
areLaxCompatibleRVVTypes(QualType FirstType,QualType SecondType)10021 bool ASTContext::areLaxCompatibleRVVTypes(QualType FirstType,
10022                                           QualType SecondType) {
10023   assert(
10024       ((FirstType->isRVVSizelessBuiltinType() && SecondType->isVectorType()) ||
10025        (FirstType->isVectorType() && SecondType->isRVVSizelessBuiltinType())) &&
10026       "Expected RVV builtin type and vector type!");
10027 
10028   auto IsLaxCompatible = [this](QualType FirstType, QualType SecondType) {
10029     const auto *BT = FirstType->getAs<BuiltinType>();
10030     if (!BT)
10031       return false;
10032 
10033     if (!BT->isRVVVLSBuiltinType())
10034       return false;
10035 
10036     const auto *VecTy = SecondType->getAs<VectorType>();
10037     if (VecTy && VecTy->getVectorKind() == VectorKind::Generic) {
10038       const LangOptions::LaxVectorConversionKind LVCKind =
10039           getLangOpts().getLaxVectorConversions();
10040 
10041       // If __riscv_v_fixed_vlen != N do not allow vector lax conversion.
10042       if (getTypeSize(SecondType) != getRVVTypeSize(*this, BT))
10043         return false;
10044 
10045       // If -flax-vector-conversions=all is specified, the types are
10046       // certainly compatible.
10047       if (LVCKind == LangOptions::LaxVectorConversionKind::All)
10048         return true;
10049 
10050       // If -flax-vector-conversions=integer is specified, the types are
10051       // compatible if the elements are integer types.
10052       if (LVCKind == LangOptions::LaxVectorConversionKind::Integer)
10053         return VecTy->getElementType().getCanonicalType()->isIntegerType() &&
10054                FirstType->getRVVEltType(*this)->isIntegerType();
10055     }
10056 
10057     return false;
10058   };
10059 
10060   return IsLaxCompatible(FirstType, SecondType) ||
10061          IsLaxCompatible(SecondType, FirstType);
10062 }
10063 
hasDirectOwnershipQualifier(QualType Ty) const10064 bool ASTContext::hasDirectOwnershipQualifier(QualType Ty) const {
10065   while (true) {
10066     // __strong id
10067     if (const AttributedType *Attr = dyn_cast<AttributedType>(Ty)) {
10068       if (Attr->getAttrKind() == attr::ObjCOwnership)
10069         return true;
10070 
10071       Ty = Attr->getModifiedType();
10072 
10073     // X *__strong (...)
10074     } else if (const ParenType *Paren = dyn_cast<ParenType>(Ty)) {
10075       Ty = Paren->getInnerType();
10076 
10077     // We do not want to look through typedefs, typeof(expr),
10078     // typeof(type), or any other way that the type is somehow
10079     // abstracted.
10080     } else {
10081       return false;
10082     }
10083   }
10084 }
10085 
10086 //===----------------------------------------------------------------------===//
10087 // ObjCQualifiedIdTypesAreCompatible - Compatibility testing for qualified id's.
10088 //===----------------------------------------------------------------------===//
10089 
10090 /// ProtocolCompatibleWithProtocol - return 'true' if 'lProto' is in the
10091 /// inheritance hierarchy of 'rProto'.
10092 bool
ProtocolCompatibleWithProtocol(ObjCProtocolDecl * lProto,ObjCProtocolDecl * rProto) const10093 ASTContext::ProtocolCompatibleWithProtocol(ObjCProtocolDecl *lProto,
10094                                            ObjCProtocolDecl *rProto) const {
10095   if (declaresSameEntity(lProto, rProto))
10096     return true;
10097   for (auto *PI : rProto->protocols())
10098     if (ProtocolCompatibleWithProtocol(lProto, PI))
10099       return true;
10100   return false;
10101 }
10102 
10103 /// ObjCQualifiedClassTypesAreCompatible - compare  Class<pr,...> and
10104 /// Class<pr1, ...>.
ObjCQualifiedClassTypesAreCompatible(const ObjCObjectPointerType * lhs,const ObjCObjectPointerType * rhs)10105 bool ASTContext::ObjCQualifiedClassTypesAreCompatible(
10106     const ObjCObjectPointerType *lhs, const ObjCObjectPointerType *rhs) {
10107   for (auto *lhsProto : lhs->quals()) {
10108     bool match = false;
10109     for (auto *rhsProto : rhs->quals()) {
10110       if (ProtocolCompatibleWithProtocol(lhsProto, rhsProto)) {
10111         match = true;
10112         break;
10113       }
10114     }
10115     if (!match)
10116       return false;
10117   }
10118   return true;
10119 }
10120 
10121 /// ObjCQualifiedIdTypesAreCompatible - We know that one of lhs/rhs is an
10122 /// ObjCQualifiedIDType.
ObjCQualifiedIdTypesAreCompatible(const ObjCObjectPointerType * lhs,const ObjCObjectPointerType * rhs,bool compare)10123 bool ASTContext::ObjCQualifiedIdTypesAreCompatible(
10124     const ObjCObjectPointerType *lhs, const ObjCObjectPointerType *rhs,
10125     bool compare) {
10126   // Allow id<P..> and an 'id' in all cases.
10127   if (lhs->isObjCIdType() || rhs->isObjCIdType())
10128     return true;
10129 
10130   // Don't allow id<P..> to convert to Class or Class<P..> in either direction.
10131   if (lhs->isObjCClassType() || lhs->isObjCQualifiedClassType() ||
10132       rhs->isObjCClassType() || rhs->isObjCQualifiedClassType())
10133     return false;
10134 
10135   if (lhs->isObjCQualifiedIdType()) {
10136     if (rhs->qual_empty()) {
10137       // If the RHS is a unqualified interface pointer "NSString*",
10138       // make sure we check the class hierarchy.
10139       if (ObjCInterfaceDecl *rhsID = rhs->getInterfaceDecl()) {
10140         for (auto *I : lhs->quals()) {
10141           // when comparing an id<P> on lhs with a static type on rhs,
10142           // see if static class implements all of id's protocols, directly or
10143           // through its super class and categories.
10144           if (!rhsID->ClassImplementsProtocol(I, true))
10145             return false;
10146         }
10147       }
10148       // If there are no qualifiers and no interface, we have an 'id'.
10149       return true;
10150     }
10151     // Both the right and left sides have qualifiers.
10152     for (auto *lhsProto : lhs->quals()) {
10153       bool match = false;
10154 
10155       // when comparing an id<P> on lhs with a static type on rhs,
10156       // see if static class implements all of id's protocols, directly or
10157       // through its super class and categories.
10158       for (auto *rhsProto : rhs->quals()) {
10159         if (ProtocolCompatibleWithProtocol(lhsProto, rhsProto) ||
10160             (compare && ProtocolCompatibleWithProtocol(rhsProto, lhsProto))) {
10161           match = true;
10162           break;
10163         }
10164       }
10165       // If the RHS is a qualified interface pointer "NSString<P>*",
10166       // make sure we check the class hierarchy.
10167       if (ObjCInterfaceDecl *rhsID = rhs->getInterfaceDecl()) {
10168         for (auto *I : lhs->quals()) {
10169           // when comparing an id<P> on lhs with a static type on rhs,
10170           // see if static class implements all of id's protocols, directly or
10171           // through its super class and categories.
10172           if (rhsID->ClassImplementsProtocol(I, true)) {
10173             match = true;
10174             break;
10175           }
10176         }
10177       }
10178       if (!match)
10179         return false;
10180     }
10181 
10182     return true;
10183   }
10184 
10185   assert(rhs->isObjCQualifiedIdType() && "One of the LHS/RHS should be id<x>");
10186 
10187   if (lhs->getInterfaceType()) {
10188     // If both the right and left sides have qualifiers.
10189     for (auto *lhsProto : lhs->quals()) {
10190       bool match = false;
10191 
10192       // when comparing an id<P> on rhs with a static type on lhs,
10193       // see if static class implements all of id's protocols, directly or
10194       // through its super class and categories.
10195       // First, lhs protocols in the qualifier list must be found, direct
10196       // or indirect in rhs's qualifier list or it is a mismatch.
10197       for (auto *rhsProto : rhs->quals()) {
10198         if (ProtocolCompatibleWithProtocol(lhsProto, rhsProto) ||
10199             (compare && ProtocolCompatibleWithProtocol(rhsProto, lhsProto))) {
10200           match = true;
10201           break;
10202         }
10203       }
10204       if (!match)
10205         return false;
10206     }
10207 
10208     // Static class's protocols, or its super class or category protocols
10209     // must be found, direct or indirect in rhs's qualifier list or it is a mismatch.
10210     if (ObjCInterfaceDecl *lhsID = lhs->getInterfaceDecl()) {
10211       llvm::SmallPtrSet<ObjCProtocolDecl *, 8> LHSInheritedProtocols;
10212       CollectInheritedProtocols(lhsID, LHSInheritedProtocols);
10213       // This is rather dubious but matches gcc's behavior. If lhs has
10214       // no type qualifier and its class has no static protocol(s)
10215       // assume that it is mismatch.
10216       if (LHSInheritedProtocols.empty() && lhs->qual_empty())
10217         return false;
10218       for (auto *lhsProto : LHSInheritedProtocols) {
10219         bool match = false;
10220         for (auto *rhsProto : rhs->quals()) {
10221           if (ProtocolCompatibleWithProtocol(lhsProto, rhsProto) ||
10222               (compare && ProtocolCompatibleWithProtocol(rhsProto, lhsProto))) {
10223             match = true;
10224             break;
10225           }
10226         }
10227         if (!match)
10228           return false;
10229       }
10230     }
10231     return true;
10232   }
10233   return false;
10234 }
10235 
10236 /// canAssignObjCInterfaces - Return true if the two interface types are
10237 /// compatible for assignment from RHS to LHS.  This handles validation of any
10238 /// protocol qualifiers on the LHS or RHS.
canAssignObjCInterfaces(const ObjCObjectPointerType * LHSOPT,const ObjCObjectPointerType * RHSOPT)10239 bool ASTContext::canAssignObjCInterfaces(const ObjCObjectPointerType *LHSOPT,
10240                                          const ObjCObjectPointerType *RHSOPT) {
10241   const ObjCObjectType* LHS = LHSOPT->getObjectType();
10242   const ObjCObjectType* RHS = RHSOPT->getObjectType();
10243 
10244   // If either type represents the built-in 'id' type, return true.
10245   if (LHS->isObjCUnqualifiedId() || RHS->isObjCUnqualifiedId())
10246     return true;
10247 
10248   // Function object that propagates a successful result or handles
10249   // __kindof types.
10250   auto finish = [&](bool succeeded) -> bool {
10251     if (succeeded)
10252       return true;
10253 
10254     if (!RHS->isKindOfType())
10255       return false;
10256 
10257     // Strip off __kindof and protocol qualifiers, then check whether
10258     // we can assign the other way.
10259     return canAssignObjCInterfaces(RHSOPT->stripObjCKindOfTypeAndQuals(*this),
10260                                    LHSOPT->stripObjCKindOfTypeAndQuals(*this));
10261   };
10262 
10263   // Casts from or to id<P> are allowed when the other side has compatible
10264   // protocols.
10265   if (LHS->isObjCQualifiedId() || RHS->isObjCQualifiedId()) {
10266     return finish(ObjCQualifiedIdTypesAreCompatible(LHSOPT, RHSOPT, false));
10267   }
10268 
10269   // Verify protocol compatibility for casts from Class<P1> to Class<P2>.
10270   if (LHS->isObjCQualifiedClass() && RHS->isObjCQualifiedClass()) {
10271     return finish(ObjCQualifiedClassTypesAreCompatible(LHSOPT, RHSOPT));
10272   }
10273 
10274   // Casts from Class to Class<Foo>, or vice-versa, are allowed.
10275   if (LHS->isObjCClass() && RHS->isObjCClass()) {
10276     return true;
10277   }
10278 
10279   // If we have 2 user-defined types, fall into that path.
10280   if (LHS->getInterface() && RHS->getInterface()) {
10281     return finish(canAssignObjCInterfaces(LHS, RHS));
10282   }
10283 
10284   return false;
10285 }
10286 
10287 /// canAssignObjCInterfacesInBlockPointer - This routine is specifically written
10288 /// for providing type-safety for objective-c pointers used to pass/return
10289 /// arguments in block literals. When passed as arguments, passing 'A*' where
10290 /// 'id' is expected is not OK. Passing 'Sub *" where 'Super *" is expected is
10291 /// not OK. For the return type, the opposite is not OK.
canAssignObjCInterfacesInBlockPointer(const ObjCObjectPointerType * LHSOPT,const ObjCObjectPointerType * RHSOPT,bool BlockReturnType)10292 bool ASTContext::canAssignObjCInterfacesInBlockPointer(
10293                                          const ObjCObjectPointerType *LHSOPT,
10294                                          const ObjCObjectPointerType *RHSOPT,
10295                                          bool BlockReturnType) {
10296 
10297   // Function object that propagates a successful result or handles
10298   // __kindof types.
10299   auto finish = [&](bool succeeded) -> bool {
10300     if (succeeded)
10301       return true;
10302 
10303     const ObjCObjectPointerType *Expected = BlockReturnType ? RHSOPT : LHSOPT;
10304     if (!Expected->isKindOfType())
10305       return false;
10306 
10307     // Strip off __kindof and protocol qualifiers, then check whether
10308     // we can assign the other way.
10309     return canAssignObjCInterfacesInBlockPointer(
10310              RHSOPT->stripObjCKindOfTypeAndQuals(*this),
10311              LHSOPT->stripObjCKindOfTypeAndQuals(*this),
10312              BlockReturnType);
10313   };
10314 
10315   if (RHSOPT->isObjCBuiltinType() || LHSOPT->isObjCIdType())
10316     return true;
10317 
10318   if (LHSOPT->isObjCBuiltinType()) {
10319     return finish(RHSOPT->isObjCBuiltinType() ||
10320                   RHSOPT->isObjCQualifiedIdType());
10321   }
10322 
10323   if (LHSOPT->isObjCQualifiedIdType() || RHSOPT->isObjCQualifiedIdType()) {
10324     if (getLangOpts().CompatibilityQualifiedIdBlockParamTypeChecking)
10325       // Use for block parameters previous type checking for compatibility.
10326       return finish(ObjCQualifiedIdTypesAreCompatible(LHSOPT, RHSOPT, false) ||
10327                     // Or corrected type checking as in non-compat mode.
10328                     (!BlockReturnType &&
10329                      ObjCQualifiedIdTypesAreCompatible(RHSOPT, LHSOPT, false)));
10330     else
10331       return finish(ObjCQualifiedIdTypesAreCompatible(
10332           (BlockReturnType ? LHSOPT : RHSOPT),
10333           (BlockReturnType ? RHSOPT : LHSOPT), false));
10334   }
10335 
10336   const ObjCInterfaceType* LHS = LHSOPT->getInterfaceType();
10337   const ObjCInterfaceType* RHS = RHSOPT->getInterfaceType();
10338   if (LHS && RHS)  { // We have 2 user-defined types.
10339     if (LHS != RHS) {
10340       if (LHS->getDecl()->isSuperClassOf(RHS->getDecl()))
10341         return finish(BlockReturnType);
10342       if (RHS->getDecl()->isSuperClassOf(LHS->getDecl()))
10343         return finish(!BlockReturnType);
10344     }
10345     else
10346       return true;
10347   }
10348   return false;
10349 }
10350 
10351 /// Comparison routine for Objective-C protocols to be used with
10352 /// llvm::array_pod_sort.
compareObjCProtocolsByName(ObjCProtocolDecl * const * lhs,ObjCProtocolDecl * const * rhs)10353 static int compareObjCProtocolsByName(ObjCProtocolDecl * const *lhs,
10354                                       ObjCProtocolDecl * const *rhs) {
10355   return (*lhs)->getName().compare((*rhs)->getName());
10356 }
10357 
10358 /// getIntersectionOfProtocols - This routine finds the intersection of set
10359 /// of protocols inherited from two distinct objective-c pointer objects with
10360 /// the given common base.
10361 /// It is used to build composite qualifier list of the composite type of
10362 /// the conditional expression involving two objective-c pointer objects.
10363 static
getIntersectionOfProtocols(ASTContext & Context,const ObjCInterfaceDecl * CommonBase,const ObjCObjectPointerType * LHSOPT,const ObjCObjectPointerType * RHSOPT,SmallVectorImpl<ObjCProtocolDecl * > & IntersectionSet)10364 void getIntersectionOfProtocols(ASTContext &Context,
10365                                 const ObjCInterfaceDecl *CommonBase,
10366                                 const ObjCObjectPointerType *LHSOPT,
10367                                 const ObjCObjectPointerType *RHSOPT,
10368       SmallVectorImpl<ObjCProtocolDecl *> &IntersectionSet) {
10369 
10370   const ObjCObjectType* LHS = LHSOPT->getObjectType();
10371   const ObjCObjectType* RHS = RHSOPT->getObjectType();
10372   assert(LHS->getInterface() && "LHS must have an interface base");
10373   assert(RHS->getInterface() && "RHS must have an interface base");
10374 
10375   // Add all of the protocols for the LHS.
10376   llvm::SmallPtrSet<ObjCProtocolDecl *, 8> LHSProtocolSet;
10377 
10378   // Start with the protocol qualifiers.
10379   for (auto *proto : LHS->quals()) {
10380     Context.CollectInheritedProtocols(proto, LHSProtocolSet);
10381   }
10382 
10383   // Also add the protocols associated with the LHS interface.
10384   Context.CollectInheritedProtocols(LHS->getInterface(), LHSProtocolSet);
10385 
10386   // Add all of the protocols for the RHS.
10387   llvm::SmallPtrSet<ObjCProtocolDecl *, 8> RHSProtocolSet;
10388 
10389   // Start with the protocol qualifiers.
10390   for (auto *proto : RHS->quals()) {
10391     Context.CollectInheritedProtocols(proto, RHSProtocolSet);
10392   }
10393 
10394   // Also add the protocols associated with the RHS interface.
10395   Context.CollectInheritedProtocols(RHS->getInterface(), RHSProtocolSet);
10396 
10397   // Compute the intersection of the collected protocol sets.
10398   for (auto *proto : LHSProtocolSet) {
10399     if (RHSProtocolSet.count(proto))
10400       IntersectionSet.push_back(proto);
10401   }
10402 
10403   // Compute the set of protocols that is implied by either the common type or
10404   // the protocols within the intersection.
10405   llvm::SmallPtrSet<ObjCProtocolDecl *, 8> ImpliedProtocols;
10406   Context.CollectInheritedProtocols(CommonBase, ImpliedProtocols);
10407 
10408   // Remove any implied protocols from the list of inherited protocols.
10409   if (!ImpliedProtocols.empty()) {
10410     llvm::erase_if(IntersectionSet, [&](ObjCProtocolDecl *proto) -> bool {
10411       return ImpliedProtocols.contains(proto);
10412     });
10413   }
10414 
10415   // Sort the remaining protocols by name.
10416   llvm::array_pod_sort(IntersectionSet.begin(), IntersectionSet.end(),
10417                        compareObjCProtocolsByName);
10418 }
10419 
10420 /// Determine whether the first type is a subtype of the second.
canAssignObjCObjectTypes(ASTContext & ctx,QualType lhs,QualType rhs)10421 static bool canAssignObjCObjectTypes(ASTContext &ctx, QualType lhs,
10422                                      QualType rhs) {
10423   // Common case: two object pointers.
10424   const auto *lhsOPT = lhs->getAs<ObjCObjectPointerType>();
10425   const auto *rhsOPT = rhs->getAs<ObjCObjectPointerType>();
10426   if (lhsOPT && rhsOPT)
10427     return ctx.canAssignObjCInterfaces(lhsOPT, rhsOPT);
10428 
10429   // Two block pointers.
10430   const auto *lhsBlock = lhs->getAs<BlockPointerType>();
10431   const auto *rhsBlock = rhs->getAs<BlockPointerType>();
10432   if (lhsBlock && rhsBlock)
10433     return ctx.typesAreBlockPointerCompatible(lhs, rhs);
10434 
10435   // If either is an unqualified 'id' and the other is a block, it's
10436   // acceptable.
10437   if ((lhsOPT && lhsOPT->isObjCIdType() && rhsBlock) ||
10438       (rhsOPT && rhsOPT->isObjCIdType() && lhsBlock))
10439     return true;
10440 
10441   return false;
10442 }
10443 
10444 // 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)10445 static bool sameObjCTypeArgs(ASTContext &ctx,
10446                              const ObjCInterfaceDecl *iface,
10447                              ArrayRef<QualType> lhsArgs,
10448                              ArrayRef<QualType> rhsArgs,
10449                              bool stripKindOf) {
10450   if (lhsArgs.size() != rhsArgs.size())
10451     return false;
10452 
10453   ObjCTypeParamList *typeParams = iface->getTypeParamList();
10454   if (!typeParams)
10455     return false;
10456 
10457   for (unsigned i = 0, n = lhsArgs.size(); i != n; ++i) {
10458     if (ctx.hasSameType(lhsArgs[i], rhsArgs[i]))
10459       continue;
10460 
10461     switch (typeParams->begin()[i]->getVariance()) {
10462     case ObjCTypeParamVariance::Invariant:
10463       if (!stripKindOf ||
10464           !ctx.hasSameType(lhsArgs[i].stripObjCKindOfType(ctx),
10465                            rhsArgs[i].stripObjCKindOfType(ctx))) {
10466         return false;
10467       }
10468       break;
10469 
10470     case ObjCTypeParamVariance::Covariant:
10471       if (!canAssignObjCObjectTypes(ctx, lhsArgs[i], rhsArgs[i]))
10472         return false;
10473       break;
10474 
10475     case ObjCTypeParamVariance::Contravariant:
10476       if (!canAssignObjCObjectTypes(ctx, rhsArgs[i], lhsArgs[i]))
10477         return false;
10478       break;
10479     }
10480   }
10481 
10482   return true;
10483 }
10484 
areCommonBaseCompatible(const ObjCObjectPointerType * Lptr,const ObjCObjectPointerType * Rptr)10485 QualType ASTContext::areCommonBaseCompatible(
10486            const ObjCObjectPointerType *Lptr,
10487            const ObjCObjectPointerType *Rptr) {
10488   const ObjCObjectType *LHS = Lptr->getObjectType();
10489   const ObjCObjectType *RHS = Rptr->getObjectType();
10490   const ObjCInterfaceDecl* LDecl = LHS->getInterface();
10491   const ObjCInterfaceDecl* RDecl = RHS->getInterface();
10492 
10493   if (!LDecl || !RDecl)
10494     return {};
10495 
10496   // When either LHS or RHS is a kindof type, we should return a kindof type.
10497   // For example, for common base of kindof(ASub1) and kindof(ASub2), we return
10498   // kindof(A).
10499   bool anyKindOf = LHS->isKindOfType() || RHS->isKindOfType();
10500 
10501   // Follow the left-hand side up the class hierarchy until we either hit a
10502   // root or find the RHS. Record the ancestors in case we don't find it.
10503   llvm::SmallDenseMap<const ObjCInterfaceDecl *, const ObjCObjectType *, 4>
10504     LHSAncestors;
10505   while (true) {
10506     // Record this ancestor. We'll need this if the common type isn't in the
10507     // path from the LHS to the root.
10508     LHSAncestors[LHS->getInterface()->getCanonicalDecl()] = LHS;
10509 
10510     if (declaresSameEntity(LHS->getInterface(), RDecl)) {
10511       // Get the type arguments.
10512       ArrayRef<QualType> LHSTypeArgs = LHS->getTypeArgsAsWritten();
10513       bool anyChanges = false;
10514       if (LHS->isSpecialized() && RHS->isSpecialized()) {
10515         // Both have type arguments, compare them.
10516         if (!sameObjCTypeArgs(*this, LHS->getInterface(),
10517                               LHS->getTypeArgs(), RHS->getTypeArgs(),
10518                               /*stripKindOf=*/true))
10519           return {};
10520       } else if (LHS->isSpecialized() != RHS->isSpecialized()) {
10521         // If only one has type arguments, the result will not have type
10522         // arguments.
10523         LHSTypeArgs = {};
10524         anyChanges = true;
10525       }
10526 
10527       // Compute the intersection of protocols.
10528       SmallVector<ObjCProtocolDecl *, 8> Protocols;
10529       getIntersectionOfProtocols(*this, LHS->getInterface(), Lptr, Rptr,
10530                                  Protocols);
10531       if (!Protocols.empty())
10532         anyChanges = true;
10533 
10534       // If anything in the LHS will have changed, build a new result type.
10535       // If we need to return a kindof type but LHS is not a kindof type, we
10536       // build a new result type.
10537       if (anyChanges || LHS->isKindOfType() != anyKindOf) {
10538         QualType Result = getObjCInterfaceType(LHS->getInterface());
10539         Result = getObjCObjectType(Result, LHSTypeArgs, Protocols,
10540                                    anyKindOf || LHS->isKindOfType());
10541         return getObjCObjectPointerType(Result);
10542       }
10543 
10544       return getObjCObjectPointerType(QualType(LHS, 0));
10545     }
10546 
10547     // Find the superclass.
10548     QualType LHSSuperType = LHS->getSuperClassType();
10549     if (LHSSuperType.isNull())
10550       break;
10551 
10552     LHS = LHSSuperType->castAs<ObjCObjectType>();
10553   }
10554 
10555   // We didn't find anything by following the LHS to its root; now check
10556   // the RHS against the cached set of ancestors.
10557   while (true) {
10558     auto KnownLHS = LHSAncestors.find(RHS->getInterface()->getCanonicalDecl());
10559     if (KnownLHS != LHSAncestors.end()) {
10560       LHS = KnownLHS->second;
10561 
10562       // Get the type arguments.
10563       ArrayRef<QualType> RHSTypeArgs = RHS->getTypeArgsAsWritten();
10564       bool anyChanges = false;
10565       if (LHS->isSpecialized() && RHS->isSpecialized()) {
10566         // Both have type arguments, compare them.
10567         if (!sameObjCTypeArgs(*this, LHS->getInterface(),
10568                               LHS->getTypeArgs(), RHS->getTypeArgs(),
10569                               /*stripKindOf=*/true))
10570           return {};
10571       } else if (LHS->isSpecialized() != RHS->isSpecialized()) {
10572         // If only one has type arguments, the result will not have type
10573         // arguments.
10574         RHSTypeArgs = {};
10575         anyChanges = true;
10576       }
10577 
10578       // Compute the intersection of protocols.
10579       SmallVector<ObjCProtocolDecl *, 8> Protocols;
10580       getIntersectionOfProtocols(*this, RHS->getInterface(), Lptr, Rptr,
10581                                  Protocols);
10582       if (!Protocols.empty())
10583         anyChanges = true;
10584 
10585       // If we need to return a kindof type but RHS is not a kindof type, we
10586       // build a new result type.
10587       if (anyChanges || RHS->isKindOfType() != anyKindOf) {
10588         QualType Result = getObjCInterfaceType(RHS->getInterface());
10589         Result = getObjCObjectType(Result, RHSTypeArgs, Protocols,
10590                                    anyKindOf || RHS->isKindOfType());
10591         return getObjCObjectPointerType(Result);
10592       }
10593 
10594       return getObjCObjectPointerType(QualType(RHS, 0));
10595     }
10596 
10597     // Find the superclass of the RHS.
10598     QualType RHSSuperType = RHS->getSuperClassType();
10599     if (RHSSuperType.isNull())
10600       break;
10601 
10602     RHS = RHSSuperType->castAs<ObjCObjectType>();
10603   }
10604 
10605   return {};
10606 }
10607 
canAssignObjCInterfaces(const ObjCObjectType * LHS,const ObjCObjectType * RHS)10608 bool ASTContext::canAssignObjCInterfaces(const ObjCObjectType *LHS,
10609                                          const ObjCObjectType *RHS) {
10610   assert(LHS->getInterface() && "LHS is not an interface type");
10611   assert(RHS->getInterface() && "RHS is not an interface type");
10612 
10613   // Verify that the base decls are compatible: the RHS must be a subclass of
10614   // the LHS.
10615   ObjCInterfaceDecl *LHSInterface = LHS->getInterface();
10616   bool IsSuperClass = LHSInterface->isSuperClassOf(RHS->getInterface());
10617   if (!IsSuperClass)
10618     return false;
10619 
10620   // If the LHS has protocol qualifiers, determine whether all of them are
10621   // satisfied by the RHS (i.e., the RHS has a superset of the protocols in the
10622   // LHS).
10623   if (LHS->getNumProtocols() > 0) {
10624     // OK if conversion of LHS to SuperClass results in narrowing of types
10625     // ; i.e., SuperClass may implement at least one of the protocols
10626     // in LHS's protocol list. Example, SuperObj<P1> = lhs<P1,P2> is ok.
10627     // But not SuperObj<P1,P2,P3> = lhs<P1,P2>.
10628     llvm::SmallPtrSet<ObjCProtocolDecl *, 8> SuperClassInheritedProtocols;
10629     CollectInheritedProtocols(RHS->getInterface(), SuperClassInheritedProtocols);
10630     // Also, if RHS has explicit quelifiers, include them for comparing with LHS's
10631     // qualifiers.
10632     for (auto *RHSPI : RHS->quals())
10633       CollectInheritedProtocols(RHSPI, SuperClassInheritedProtocols);
10634     // If there is no protocols associated with RHS, it is not a match.
10635     if (SuperClassInheritedProtocols.empty())
10636       return false;
10637 
10638     for (const auto *LHSProto : LHS->quals()) {
10639       bool SuperImplementsProtocol = false;
10640       for (auto *SuperClassProto : SuperClassInheritedProtocols)
10641         if (SuperClassProto->lookupProtocolNamed(LHSProto->getIdentifier())) {
10642           SuperImplementsProtocol = true;
10643           break;
10644         }
10645       if (!SuperImplementsProtocol)
10646         return false;
10647     }
10648   }
10649 
10650   // If the LHS is specialized, we may need to check type arguments.
10651   if (LHS->isSpecialized()) {
10652     // Follow the superclass chain until we've matched the LHS class in the
10653     // hierarchy. This substitutes type arguments through.
10654     const ObjCObjectType *RHSSuper = RHS;
10655     while (!declaresSameEntity(RHSSuper->getInterface(), LHSInterface))
10656       RHSSuper = RHSSuper->getSuperClassType()->castAs<ObjCObjectType>();
10657 
10658     // If the RHS is specializd, compare type arguments.
10659     if (RHSSuper->isSpecialized() &&
10660         !sameObjCTypeArgs(*this, LHS->getInterface(),
10661                           LHS->getTypeArgs(), RHSSuper->getTypeArgs(),
10662                           /*stripKindOf=*/true)) {
10663       return false;
10664     }
10665   }
10666 
10667   return true;
10668 }
10669 
areComparableObjCPointerTypes(QualType LHS,QualType RHS)10670 bool ASTContext::areComparableObjCPointerTypes(QualType LHS, QualType RHS) {
10671   // get the "pointed to" types
10672   const auto *LHSOPT = LHS->getAs<ObjCObjectPointerType>();
10673   const auto *RHSOPT = RHS->getAs<ObjCObjectPointerType>();
10674 
10675   if (!LHSOPT || !RHSOPT)
10676     return false;
10677 
10678   return canAssignObjCInterfaces(LHSOPT, RHSOPT) ||
10679          canAssignObjCInterfaces(RHSOPT, LHSOPT);
10680 }
10681 
canBindObjCObjectType(QualType To,QualType From)10682 bool ASTContext::canBindObjCObjectType(QualType To, QualType From) {
10683   return canAssignObjCInterfaces(
10684       getObjCObjectPointerType(To)->castAs<ObjCObjectPointerType>(),
10685       getObjCObjectPointerType(From)->castAs<ObjCObjectPointerType>());
10686 }
10687 
10688 /// typesAreCompatible - C99 6.7.3p9: For two qualified types to be compatible,
10689 /// both shall have the identically qualified version of a compatible type.
10690 /// C99 6.2.7p1: Two types have compatible types if their types are the
10691 /// same. See 6.7.[2,3,5] for additional rules.
typesAreCompatible(QualType LHS,QualType RHS,bool CompareUnqualified)10692 bool ASTContext::typesAreCompatible(QualType LHS, QualType RHS,
10693                                     bool CompareUnqualified) {
10694   if (getLangOpts().CPlusPlus)
10695     return hasSameType(LHS, RHS);
10696 
10697   return !mergeTypes(LHS, RHS, false, CompareUnqualified).isNull();
10698 }
10699 
propertyTypesAreCompatible(QualType LHS,QualType RHS)10700 bool ASTContext::propertyTypesAreCompatible(QualType LHS, QualType RHS) {
10701   return typesAreCompatible(LHS, RHS);
10702 }
10703 
typesAreBlockPointerCompatible(QualType LHS,QualType RHS)10704 bool ASTContext::typesAreBlockPointerCompatible(QualType LHS, QualType RHS) {
10705   return !mergeTypes(LHS, RHS, true).isNull();
10706 }
10707 
10708 /// mergeTransparentUnionType - if T is a transparent union type and a member
10709 /// of T is compatible with SubType, return the merged type, else return
10710 /// QualType()
mergeTransparentUnionType(QualType T,QualType SubType,bool OfBlockPointer,bool Unqualified)10711 QualType ASTContext::mergeTransparentUnionType(QualType T, QualType SubType,
10712                                                bool OfBlockPointer,
10713                                                bool Unqualified) {
10714   if (const RecordType *UT = T->getAsUnionType()) {
10715     RecordDecl *UD = UT->getDecl();
10716     if (UD->hasAttr<TransparentUnionAttr>()) {
10717       for (const auto *I : UD->fields()) {
10718         QualType ET = I->getType().getUnqualifiedType();
10719         QualType MT = mergeTypes(ET, SubType, OfBlockPointer, Unqualified);
10720         if (!MT.isNull())
10721           return MT;
10722       }
10723     }
10724   }
10725 
10726   return {};
10727 }
10728 
10729 /// mergeFunctionParameterTypes - merge two types which appear as function
10730 /// parameter types
mergeFunctionParameterTypes(QualType lhs,QualType rhs,bool OfBlockPointer,bool Unqualified)10731 QualType ASTContext::mergeFunctionParameterTypes(QualType lhs, QualType rhs,
10732                                                  bool OfBlockPointer,
10733                                                  bool Unqualified) {
10734   // GNU extension: two types are compatible if they appear as a function
10735   // argument, one of the types is a transparent union type and the other
10736   // type is compatible with a union member
10737   QualType lmerge = mergeTransparentUnionType(lhs, rhs, OfBlockPointer,
10738                                               Unqualified);
10739   if (!lmerge.isNull())
10740     return lmerge;
10741 
10742   QualType rmerge = mergeTransparentUnionType(rhs, lhs, OfBlockPointer,
10743                                               Unqualified);
10744   if (!rmerge.isNull())
10745     return rmerge;
10746 
10747   return mergeTypes(lhs, rhs, OfBlockPointer, Unqualified);
10748 }
10749 
mergeFunctionTypes(QualType lhs,QualType rhs,bool OfBlockPointer,bool Unqualified,bool AllowCXX,bool IsConditionalOperator)10750 QualType ASTContext::mergeFunctionTypes(QualType lhs, QualType rhs,
10751                                         bool OfBlockPointer, bool Unqualified,
10752                                         bool AllowCXX,
10753                                         bool IsConditionalOperator) {
10754   const auto *lbase = lhs->castAs<FunctionType>();
10755   const auto *rbase = rhs->castAs<FunctionType>();
10756   const auto *lproto = dyn_cast<FunctionProtoType>(lbase);
10757   const auto *rproto = dyn_cast<FunctionProtoType>(rbase);
10758   bool allLTypes = true;
10759   bool allRTypes = true;
10760 
10761   // Check return type
10762   QualType retType;
10763   if (OfBlockPointer) {
10764     QualType RHS = rbase->getReturnType();
10765     QualType LHS = lbase->getReturnType();
10766     bool UnqualifiedResult = Unqualified;
10767     if (!UnqualifiedResult)
10768       UnqualifiedResult = (!RHS.hasQualifiers() && LHS.hasQualifiers());
10769     retType = mergeTypes(LHS, RHS, true, UnqualifiedResult, true);
10770   }
10771   else
10772     retType = mergeTypes(lbase->getReturnType(), rbase->getReturnType(), false,
10773                          Unqualified);
10774   if (retType.isNull())
10775     return {};
10776 
10777   if (Unqualified)
10778     retType = retType.getUnqualifiedType();
10779 
10780   CanQualType LRetType = getCanonicalType(lbase->getReturnType());
10781   CanQualType RRetType = getCanonicalType(rbase->getReturnType());
10782   if (Unqualified) {
10783     LRetType = LRetType.getUnqualifiedType();
10784     RRetType = RRetType.getUnqualifiedType();
10785   }
10786 
10787   if (getCanonicalType(retType) != LRetType)
10788     allLTypes = false;
10789   if (getCanonicalType(retType) != RRetType)
10790     allRTypes = false;
10791 
10792   // FIXME: double check this
10793   // FIXME: should we error if lbase->getRegParmAttr() != 0 &&
10794   //                           rbase->getRegParmAttr() != 0 &&
10795   //                           lbase->getRegParmAttr() != rbase->getRegParmAttr()?
10796   FunctionType::ExtInfo lbaseInfo = lbase->getExtInfo();
10797   FunctionType::ExtInfo rbaseInfo = rbase->getExtInfo();
10798 
10799   // Compatible functions must have compatible calling conventions
10800   if (lbaseInfo.getCC() != rbaseInfo.getCC())
10801     return {};
10802 
10803   // Regparm is part of the calling convention.
10804   if (lbaseInfo.getHasRegParm() != rbaseInfo.getHasRegParm())
10805     return {};
10806   if (lbaseInfo.getRegParm() != rbaseInfo.getRegParm())
10807     return {};
10808 
10809   if (lbaseInfo.getProducesResult() != rbaseInfo.getProducesResult())
10810     return {};
10811   if (lbaseInfo.getNoCallerSavedRegs() != rbaseInfo.getNoCallerSavedRegs())
10812     return {};
10813   if (lbaseInfo.getNoCfCheck() != rbaseInfo.getNoCfCheck())
10814     return {};
10815 
10816   // When merging declarations, it's common for supplemental information like
10817   // attributes to only be present in one of the declarations, and we generally
10818   // want type merging to preserve the union of information.  So a merged
10819   // function type should be noreturn if it was noreturn in *either* operand
10820   // type.
10821   //
10822   // But for the conditional operator, this is backwards.  The result of the
10823   // operator could be either operand, and its type should conservatively
10824   // reflect that.  So a function type in a composite type is noreturn only
10825   // if it's noreturn in *both* operand types.
10826   //
10827   // Arguably, noreturn is a kind of subtype, and the conditional operator
10828   // ought to produce the most specific common supertype of its operand types.
10829   // That would differ from this rule in contravariant positions.  However,
10830   // neither C nor C++ generally uses this kind of subtype reasoning.  Also,
10831   // as a practical matter, it would only affect C code that does abstraction of
10832   // higher-order functions (taking noreturn callbacks!), which is uncommon to
10833   // say the least.  So we use the simpler rule.
10834   bool NoReturn = IsConditionalOperator
10835                       ? lbaseInfo.getNoReturn() && rbaseInfo.getNoReturn()
10836                       : lbaseInfo.getNoReturn() || rbaseInfo.getNoReturn();
10837   if (lbaseInfo.getNoReturn() != NoReturn)
10838     allLTypes = false;
10839   if (rbaseInfo.getNoReturn() != NoReturn)
10840     allRTypes = false;
10841 
10842   FunctionType::ExtInfo einfo = lbaseInfo.withNoReturn(NoReturn);
10843 
10844   std::optional<FunctionEffectSet> MergedFX;
10845 
10846   if (lproto && rproto) { // two C99 style function prototypes
10847     assert((AllowCXX ||
10848             (!lproto->hasExceptionSpec() && !rproto->hasExceptionSpec())) &&
10849            "C++ shouldn't be here");
10850     // Compatible functions must have the same number of parameters
10851     if (lproto->getNumParams() != rproto->getNumParams())
10852       return {};
10853 
10854     // Variadic and non-variadic functions aren't compatible
10855     if (lproto->isVariadic() != rproto->isVariadic())
10856       return {};
10857 
10858     if (lproto->getMethodQuals() != rproto->getMethodQuals())
10859       return {};
10860 
10861     // Function effects are handled similarly to noreturn, see above.
10862     FunctionEffectsRef LHSFX = lproto->getFunctionEffects();
10863     FunctionEffectsRef RHSFX = rproto->getFunctionEffects();
10864     if (LHSFX != RHSFX) {
10865       if (IsConditionalOperator)
10866         MergedFX = FunctionEffectSet::getIntersection(LHSFX, RHSFX);
10867       else {
10868         FunctionEffectSet::Conflicts Errs;
10869         MergedFX = FunctionEffectSet::getUnion(LHSFX, RHSFX, Errs);
10870         // Here we're discarding a possible error due to conflicts in the effect
10871         // sets. But we're not in a context where we can report it. The
10872         // operation does however guarantee maintenance of invariants.
10873       }
10874       if (*MergedFX != LHSFX)
10875         allLTypes = false;
10876       if (*MergedFX != RHSFX)
10877         allRTypes = false;
10878     }
10879 
10880     SmallVector<FunctionProtoType::ExtParameterInfo, 4> newParamInfos;
10881     bool canUseLeft, canUseRight;
10882     if (!mergeExtParameterInfo(lproto, rproto, canUseLeft, canUseRight,
10883                                newParamInfos))
10884       return {};
10885 
10886     if (!canUseLeft)
10887       allLTypes = false;
10888     if (!canUseRight)
10889       allRTypes = false;
10890 
10891     // Check parameter type compatibility
10892     SmallVector<QualType, 10> types;
10893     for (unsigned i = 0, n = lproto->getNumParams(); i < n; i++) {
10894       QualType lParamType = lproto->getParamType(i).getUnqualifiedType();
10895       QualType rParamType = rproto->getParamType(i).getUnqualifiedType();
10896       QualType paramType = mergeFunctionParameterTypes(
10897           lParamType, rParamType, OfBlockPointer, Unqualified);
10898       if (paramType.isNull())
10899         return {};
10900 
10901       if (Unqualified)
10902         paramType = paramType.getUnqualifiedType();
10903 
10904       types.push_back(paramType);
10905       if (Unqualified) {
10906         lParamType = lParamType.getUnqualifiedType();
10907         rParamType = rParamType.getUnqualifiedType();
10908       }
10909 
10910       if (getCanonicalType(paramType) != getCanonicalType(lParamType))
10911         allLTypes = false;
10912       if (getCanonicalType(paramType) != getCanonicalType(rParamType))
10913         allRTypes = false;
10914     }
10915 
10916     if (allLTypes) return lhs;
10917     if (allRTypes) return rhs;
10918 
10919     FunctionProtoType::ExtProtoInfo EPI = lproto->getExtProtoInfo();
10920     EPI.ExtInfo = einfo;
10921     EPI.ExtParameterInfos =
10922         newParamInfos.empty() ? nullptr : newParamInfos.data();
10923     if (MergedFX)
10924       EPI.FunctionEffects = *MergedFX;
10925     return getFunctionType(retType, types, EPI);
10926   }
10927 
10928   if (lproto) allRTypes = false;
10929   if (rproto) allLTypes = false;
10930 
10931   const FunctionProtoType *proto = lproto ? lproto : rproto;
10932   if (proto) {
10933     assert((AllowCXX || !proto->hasExceptionSpec()) && "C++ shouldn't be here");
10934     if (proto->isVariadic())
10935       return {};
10936     // Check that the types are compatible with the types that
10937     // would result from default argument promotions (C99 6.7.5.3p15).
10938     // The only types actually affected are promotable integer
10939     // types and floats, which would be passed as a different
10940     // type depending on whether the prototype is visible.
10941     for (unsigned i = 0, n = proto->getNumParams(); i < n; ++i) {
10942       QualType paramTy = proto->getParamType(i);
10943 
10944       // Look at the converted type of enum types, since that is the type used
10945       // to pass enum values.
10946       if (const auto *Enum = paramTy->getAs<EnumType>()) {
10947         paramTy = Enum->getDecl()->getIntegerType();
10948         if (paramTy.isNull())
10949           return {};
10950       }
10951 
10952       if (isPromotableIntegerType(paramTy) ||
10953           getCanonicalType(paramTy).getUnqualifiedType() == FloatTy)
10954         return {};
10955     }
10956 
10957     if (allLTypes) return lhs;
10958     if (allRTypes) return rhs;
10959 
10960     FunctionProtoType::ExtProtoInfo EPI = proto->getExtProtoInfo();
10961     EPI.ExtInfo = einfo;
10962     if (MergedFX)
10963       EPI.FunctionEffects = *MergedFX;
10964     return getFunctionType(retType, proto->getParamTypes(), EPI);
10965   }
10966 
10967   if (allLTypes) return lhs;
10968   if (allRTypes) return rhs;
10969   return getFunctionNoProtoType(retType, einfo);
10970 }
10971 
10972 /// 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)10973 static QualType mergeEnumWithInteger(ASTContext &Context, const EnumType *ET,
10974                                      QualType other, bool isBlockReturnType) {
10975   // C99 6.7.2.2p4: Each enumerated type shall be compatible with char,
10976   // a signed integer type, or an unsigned integer type.
10977   // Compatibility is based on the underlying type, not the promotion
10978   // type.
10979   QualType underlyingType = ET->getDecl()->getIntegerType();
10980   if (underlyingType.isNull())
10981     return {};
10982   if (Context.hasSameType(underlyingType, other))
10983     return other;
10984 
10985   // In block return types, we're more permissive and accept any
10986   // integral type of the same size.
10987   if (isBlockReturnType && other->isIntegerType() &&
10988       Context.getTypeSize(underlyingType) == Context.getTypeSize(other))
10989     return other;
10990 
10991   return {};
10992 }
10993 
mergeTypes(QualType LHS,QualType RHS,bool OfBlockPointer,bool Unqualified,bool BlockReturnType,bool IsConditionalOperator)10994 QualType ASTContext::mergeTypes(QualType LHS, QualType RHS, bool OfBlockPointer,
10995                                 bool Unqualified, bool BlockReturnType,
10996                                 bool IsConditionalOperator) {
10997   // For C++ we will not reach this code with reference types (see below),
10998   // for OpenMP variant call overloading we might.
10999   //
11000   // C++ [expr]: If an expression initially has the type "reference to T", the
11001   // type is adjusted to "T" prior to any further analysis, the expression
11002   // designates the object or function denoted by the reference, and the
11003   // expression is an lvalue unless the reference is an rvalue reference and
11004   // the expression is a function call (possibly inside parentheses).
11005   auto *LHSRefTy = LHS->getAs<ReferenceType>();
11006   auto *RHSRefTy = RHS->getAs<ReferenceType>();
11007   if (LangOpts.OpenMP && LHSRefTy && RHSRefTy &&
11008       LHS->getTypeClass() == RHS->getTypeClass())
11009     return mergeTypes(LHSRefTy->getPointeeType(), RHSRefTy->getPointeeType(),
11010                       OfBlockPointer, Unqualified, BlockReturnType);
11011   if (LHSRefTy || RHSRefTy)
11012     return {};
11013 
11014   if (Unqualified) {
11015     LHS = LHS.getUnqualifiedType();
11016     RHS = RHS.getUnqualifiedType();
11017   }
11018 
11019   QualType LHSCan = getCanonicalType(LHS),
11020            RHSCan = getCanonicalType(RHS);
11021 
11022   // If two types are identical, they are compatible.
11023   if (LHSCan == RHSCan)
11024     return LHS;
11025 
11026   // If the qualifiers are different, the types aren't compatible... mostly.
11027   Qualifiers LQuals = LHSCan.getLocalQualifiers();
11028   Qualifiers RQuals = RHSCan.getLocalQualifiers();
11029   if (LQuals != RQuals) {
11030     // If any of these qualifiers are different, we have a type
11031     // mismatch.
11032     if (LQuals.getCVRQualifiers() != RQuals.getCVRQualifiers() ||
11033         LQuals.getAddressSpace() != RQuals.getAddressSpace() ||
11034         LQuals.getObjCLifetime() != RQuals.getObjCLifetime() ||
11035         LQuals.hasUnaligned() != RQuals.hasUnaligned())
11036       return {};
11037 
11038     // Exactly one GC qualifier difference is allowed: __strong is
11039     // okay if the other type has no GC qualifier but is an Objective
11040     // C object pointer (i.e. implicitly strong by default).  We fix
11041     // this by pretending that the unqualified type was actually
11042     // qualified __strong.
11043     Qualifiers::GC GC_L = LQuals.getObjCGCAttr();
11044     Qualifiers::GC GC_R = RQuals.getObjCGCAttr();
11045     assert((GC_L != GC_R) && "unequal qualifier sets had only equal elements");
11046 
11047     if (GC_L == Qualifiers::Weak || GC_R == Qualifiers::Weak)
11048       return {};
11049 
11050     if (GC_L == Qualifiers::Strong && RHSCan->isObjCObjectPointerType()) {
11051       return mergeTypes(LHS, getObjCGCQualType(RHS, Qualifiers::Strong));
11052     }
11053     if (GC_R == Qualifiers::Strong && LHSCan->isObjCObjectPointerType()) {
11054       return mergeTypes(getObjCGCQualType(LHS, Qualifiers::Strong), RHS);
11055     }
11056     return {};
11057   }
11058 
11059   // Okay, qualifiers are equal.
11060 
11061   Type::TypeClass LHSClass = LHSCan->getTypeClass();
11062   Type::TypeClass RHSClass = RHSCan->getTypeClass();
11063 
11064   // We want to consider the two function types to be the same for these
11065   // comparisons, just force one to the other.
11066   if (LHSClass == Type::FunctionProto) LHSClass = Type::FunctionNoProto;
11067   if (RHSClass == Type::FunctionProto) RHSClass = Type::FunctionNoProto;
11068 
11069   // Same as above for arrays
11070   if (LHSClass == Type::VariableArray || LHSClass == Type::IncompleteArray)
11071     LHSClass = Type::ConstantArray;
11072   if (RHSClass == Type::VariableArray || RHSClass == Type::IncompleteArray)
11073     RHSClass = Type::ConstantArray;
11074 
11075   // ObjCInterfaces are just specialized ObjCObjects.
11076   if (LHSClass == Type::ObjCInterface) LHSClass = Type::ObjCObject;
11077   if (RHSClass == Type::ObjCInterface) RHSClass = Type::ObjCObject;
11078 
11079   // Canonicalize ExtVector -> Vector.
11080   if (LHSClass == Type::ExtVector) LHSClass = Type::Vector;
11081   if (RHSClass == Type::ExtVector) RHSClass = Type::Vector;
11082 
11083   // If the canonical type classes don't match.
11084   if (LHSClass != RHSClass) {
11085     // Note that we only have special rules for turning block enum
11086     // returns into block int returns, not vice-versa.
11087     if (const auto *ETy = LHS->getAs<EnumType>()) {
11088       return mergeEnumWithInteger(*this, ETy, RHS, false);
11089     }
11090     if (const EnumType* ETy = RHS->getAs<EnumType>()) {
11091       return mergeEnumWithInteger(*this, ETy, LHS, BlockReturnType);
11092     }
11093     // allow block pointer type to match an 'id' type.
11094     if (OfBlockPointer && !BlockReturnType) {
11095        if (LHS->isObjCIdType() && RHS->isBlockPointerType())
11096          return LHS;
11097       if (RHS->isObjCIdType() && LHS->isBlockPointerType())
11098         return RHS;
11099     }
11100     // Allow __auto_type to match anything; it merges to the type with more
11101     // information.
11102     if (const auto *AT = LHS->getAs<AutoType>()) {
11103       if (!AT->isDeduced() && AT->isGNUAutoType())
11104         return RHS;
11105     }
11106     if (const auto *AT = RHS->getAs<AutoType>()) {
11107       if (!AT->isDeduced() && AT->isGNUAutoType())
11108         return LHS;
11109     }
11110     return {};
11111   }
11112 
11113   // The canonical type classes match.
11114   switch (LHSClass) {
11115 #define TYPE(Class, Base)
11116 #define ABSTRACT_TYPE(Class, Base)
11117 #define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base) case Type::Class:
11118 #define NON_CANONICAL_TYPE(Class, Base) case Type::Class:
11119 #define DEPENDENT_TYPE(Class, Base) case Type::Class:
11120 #include "clang/AST/TypeNodes.inc"
11121     llvm_unreachable("Non-canonical and dependent types shouldn't get here");
11122 
11123   case Type::Auto:
11124   case Type::DeducedTemplateSpecialization:
11125   case Type::LValueReference:
11126   case Type::RValueReference:
11127   case Type::MemberPointer:
11128     llvm_unreachable("C++ should never be in mergeTypes");
11129 
11130   case Type::ObjCInterface:
11131   case Type::IncompleteArray:
11132   case Type::VariableArray:
11133   case Type::FunctionProto:
11134   case Type::ExtVector:
11135     llvm_unreachable("Types are eliminated above");
11136 
11137   case Type::Pointer:
11138   {
11139     // Merge two pointer types, while trying to preserve typedef info
11140     QualType LHSPointee = LHS->castAs<PointerType>()->getPointeeType();
11141     QualType RHSPointee = RHS->castAs<PointerType>()->getPointeeType();
11142     if (Unqualified) {
11143       LHSPointee = LHSPointee.getUnqualifiedType();
11144       RHSPointee = RHSPointee.getUnqualifiedType();
11145     }
11146     QualType ResultType = mergeTypes(LHSPointee, RHSPointee, false,
11147                                      Unqualified);
11148     if (ResultType.isNull())
11149       return {};
11150     if (getCanonicalType(LHSPointee) == getCanonicalType(ResultType))
11151       return LHS;
11152     if (getCanonicalType(RHSPointee) == getCanonicalType(ResultType))
11153       return RHS;
11154     return getPointerType(ResultType);
11155   }
11156   case Type::BlockPointer:
11157   {
11158     // Merge two block pointer types, while trying to preserve typedef info
11159     QualType LHSPointee = LHS->castAs<BlockPointerType>()->getPointeeType();
11160     QualType RHSPointee = RHS->castAs<BlockPointerType>()->getPointeeType();
11161     if (Unqualified) {
11162       LHSPointee = LHSPointee.getUnqualifiedType();
11163       RHSPointee = RHSPointee.getUnqualifiedType();
11164     }
11165     if (getLangOpts().OpenCL) {
11166       Qualifiers LHSPteeQual = LHSPointee.getQualifiers();
11167       Qualifiers RHSPteeQual = RHSPointee.getQualifiers();
11168       // Blocks can't be an expression in a ternary operator (OpenCL v2.0
11169       // 6.12.5) thus the following check is asymmetric.
11170       if (!LHSPteeQual.isAddressSpaceSupersetOf(RHSPteeQual))
11171         return {};
11172       LHSPteeQual.removeAddressSpace();
11173       RHSPteeQual.removeAddressSpace();
11174       LHSPointee =
11175           QualType(LHSPointee.getTypePtr(), LHSPteeQual.getAsOpaqueValue());
11176       RHSPointee =
11177           QualType(RHSPointee.getTypePtr(), RHSPteeQual.getAsOpaqueValue());
11178     }
11179     QualType ResultType = mergeTypes(LHSPointee, RHSPointee, OfBlockPointer,
11180                                      Unqualified);
11181     if (ResultType.isNull())
11182       return {};
11183     if (getCanonicalType(LHSPointee) == getCanonicalType(ResultType))
11184       return LHS;
11185     if (getCanonicalType(RHSPointee) == getCanonicalType(ResultType))
11186       return RHS;
11187     return getBlockPointerType(ResultType);
11188   }
11189   case Type::Atomic:
11190   {
11191     // Merge two pointer types, while trying to preserve typedef info
11192     QualType LHSValue = LHS->castAs<AtomicType>()->getValueType();
11193     QualType RHSValue = RHS->castAs<AtomicType>()->getValueType();
11194     if (Unqualified) {
11195       LHSValue = LHSValue.getUnqualifiedType();
11196       RHSValue = RHSValue.getUnqualifiedType();
11197     }
11198     QualType ResultType = mergeTypes(LHSValue, RHSValue, false,
11199                                      Unqualified);
11200     if (ResultType.isNull())
11201       return {};
11202     if (getCanonicalType(LHSValue) == getCanonicalType(ResultType))
11203       return LHS;
11204     if (getCanonicalType(RHSValue) == getCanonicalType(ResultType))
11205       return RHS;
11206     return getAtomicType(ResultType);
11207   }
11208   case Type::ConstantArray:
11209   {
11210     const ConstantArrayType* LCAT = getAsConstantArrayType(LHS);
11211     const ConstantArrayType* RCAT = getAsConstantArrayType(RHS);
11212     if (LCAT && RCAT && RCAT->getZExtSize() != LCAT->getZExtSize())
11213       return {};
11214 
11215     QualType LHSElem = getAsArrayType(LHS)->getElementType();
11216     QualType RHSElem = getAsArrayType(RHS)->getElementType();
11217     if (Unqualified) {
11218       LHSElem = LHSElem.getUnqualifiedType();
11219       RHSElem = RHSElem.getUnqualifiedType();
11220     }
11221 
11222     QualType ResultType = mergeTypes(LHSElem, RHSElem, false, Unqualified);
11223     if (ResultType.isNull())
11224       return {};
11225 
11226     const VariableArrayType* LVAT = getAsVariableArrayType(LHS);
11227     const VariableArrayType* RVAT = getAsVariableArrayType(RHS);
11228 
11229     // If either side is a variable array, and both are complete, check whether
11230     // the current dimension is definite.
11231     if (LVAT || RVAT) {
11232       auto SizeFetch = [this](const VariableArrayType* VAT,
11233           const ConstantArrayType* CAT)
11234           -> std::pair<bool,llvm::APInt> {
11235         if (VAT) {
11236           std::optional<llvm::APSInt> TheInt;
11237           Expr *E = VAT->getSizeExpr();
11238           if (E && (TheInt = E->getIntegerConstantExpr(*this)))
11239             return std::make_pair(true, *TheInt);
11240           return std::make_pair(false, llvm::APSInt());
11241         }
11242         if (CAT)
11243           return std::make_pair(true, CAT->getSize());
11244         return std::make_pair(false, llvm::APInt());
11245       };
11246 
11247       bool HaveLSize, HaveRSize;
11248       llvm::APInt LSize, RSize;
11249       std::tie(HaveLSize, LSize) = SizeFetch(LVAT, LCAT);
11250       std::tie(HaveRSize, RSize) = SizeFetch(RVAT, RCAT);
11251       if (HaveLSize && HaveRSize && !llvm::APInt::isSameValue(LSize, RSize))
11252         return {}; // Definite, but unequal, array dimension
11253     }
11254 
11255     if (LCAT && getCanonicalType(LHSElem) == getCanonicalType(ResultType))
11256       return LHS;
11257     if (RCAT && getCanonicalType(RHSElem) == getCanonicalType(ResultType))
11258       return RHS;
11259     if (LCAT)
11260       return getConstantArrayType(ResultType, LCAT->getSize(),
11261                                   LCAT->getSizeExpr(), ArraySizeModifier(), 0);
11262     if (RCAT)
11263       return getConstantArrayType(ResultType, RCAT->getSize(),
11264                                   RCAT->getSizeExpr(), ArraySizeModifier(), 0);
11265     if (LVAT && getCanonicalType(LHSElem) == getCanonicalType(ResultType))
11266       return LHS;
11267     if (RVAT && getCanonicalType(RHSElem) == getCanonicalType(ResultType))
11268       return RHS;
11269     if (LVAT) {
11270       // FIXME: This isn't correct! But tricky to implement because
11271       // the array's size has to be the size of LHS, but the type
11272       // has to be different.
11273       return LHS;
11274     }
11275     if (RVAT) {
11276       // FIXME: This isn't correct! But tricky to implement because
11277       // the array's size has to be the size of RHS, but the type
11278       // has to be different.
11279       return RHS;
11280     }
11281     if (getCanonicalType(LHSElem) == getCanonicalType(ResultType)) return LHS;
11282     if (getCanonicalType(RHSElem) == getCanonicalType(ResultType)) return RHS;
11283     return getIncompleteArrayType(ResultType, ArraySizeModifier(), 0);
11284   }
11285   case Type::FunctionNoProto:
11286     return mergeFunctionTypes(LHS, RHS, OfBlockPointer, Unqualified,
11287                               /*AllowCXX=*/false, IsConditionalOperator);
11288   case Type::Record:
11289   case Type::Enum:
11290     return {};
11291   case Type::Builtin:
11292     // Only exactly equal builtin types are compatible, which is tested above.
11293     return {};
11294   case Type::Complex:
11295     // Distinct complex types are incompatible.
11296     return {};
11297   case Type::Vector:
11298     // FIXME: The merged type should be an ExtVector!
11299     if (areCompatVectorTypes(LHSCan->castAs<VectorType>(),
11300                              RHSCan->castAs<VectorType>()))
11301       return LHS;
11302     return {};
11303   case Type::ConstantMatrix:
11304     if (areCompatMatrixTypes(LHSCan->castAs<ConstantMatrixType>(),
11305                              RHSCan->castAs<ConstantMatrixType>()))
11306       return LHS;
11307     return {};
11308   case Type::ObjCObject: {
11309     // Check if the types are assignment compatible.
11310     // FIXME: This should be type compatibility, e.g. whether
11311     // "LHS x; RHS x;" at global scope is legal.
11312     if (canAssignObjCInterfaces(LHS->castAs<ObjCObjectType>(),
11313                                 RHS->castAs<ObjCObjectType>()))
11314       return LHS;
11315     return {};
11316   }
11317   case Type::ObjCObjectPointer:
11318     if (OfBlockPointer) {
11319       if (canAssignObjCInterfacesInBlockPointer(
11320               LHS->castAs<ObjCObjectPointerType>(),
11321               RHS->castAs<ObjCObjectPointerType>(), BlockReturnType))
11322         return LHS;
11323       return {};
11324     }
11325     if (canAssignObjCInterfaces(LHS->castAs<ObjCObjectPointerType>(),
11326                                 RHS->castAs<ObjCObjectPointerType>()))
11327       return LHS;
11328     return {};
11329   case Type::Pipe:
11330     assert(LHS != RHS &&
11331            "Equivalent pipe types should have already been handled!");
11332     return {};
11333   case Type::ArrayParameter:
11334     assert(LHS != RHS &&
11335            "Equivalent ArrayParameter types should have already been handled!");
11336     return {};
11337   case Type::BitInt: {
11338     // Merge two bit-precise int types, while trying to preserve typedef info.
11339     bool LHSUnsigned = LHS->castAs<BitIntType>()->isUnsigned();
11340     bool RHSUnsigned = RHS->castAs<BitIntType>()->isUnsigned();
11341     unsigned LHSBits = LHS->castAs<BitIntType>()->getNumBits();
11342     unsigned RHSBits = RHS->castAs<BitIntType>()->getNumBits();
11343 
11344     // Like unsigned/int, shouldn't have a type if they don't match.
11345     if (LHSUnsigned != RHSUnsigned)
11346       return {};
11347 
11348     if (LHSBits != RHSBits)
11349       return {};
11350     return LHS;
11351   }
11352   }
11353 
11354   llvm_unreachable("Invalid Type::Class!");
11355 }
11356 
mergeExtParameterInfo(const FunctionProtoType * FirstFnType,const FunctionProtoType * SecondFnType,bool & CanUseFirst,bool & CanUseSecond,SmallVectorImpl<FunctionProtoType::ExtParameterInfo> & NewParamInfos)11357 bool ASTContext::mergeExtParameterInfo(
11358     const FunctionProtoType *FirstFnType, const FunctionProtoType *SecondFnType,
11359     bool &CanUseFirst, bool &CanUseSecond,
11360     SmallVectorImpl<FunctionProtoType::ExtParameterInfo> &NewParamInfos) {
11361   assert(NewParamInfos.empty() && "param info list not empty");
11362   CanUseFirst = CanUseSecond = true;
11363   bool FirstHasInfo = FirstFnType->hasExtParameterInfos();
11364   bool SecondHasInfo = SecondFnType->hasExtParameterInfos();
11365 
11366   // Fast path: if the first type doesn't have ext parameter infos,
11367   // we match if and only if the second type also doesn't have them.
11368   if (!FirstHasInfo && !SecondHasInfo)
11369     return true;
11370 
11371   bool NeedParamInfo = false;
11372   size_t E = FirstHasInfo ? FirstFnType->getExtParameterInfos().size()
11373                           : SecondFnType->getExtParameterInfos().size();
11374 
11375   for (size_t I = 0; I < E; ++I) {
11376     FunctionProtoType::ExtParameterInfo FirstParam, SecondParam;
11377     if (FirstHasInfo)
11378       FirstParam = FirstFnType->getExtParameterInfo(I);
11379     if (SecondHasInfo)
11380       SecondParam = SecondFnType->getExtParameterInfo(I);
11381 
11382     // Cannot merge unless everything except the noescape flag matches.
11383     if (FirstParam.withIsNoEscape(false) != SecondParam.withIsNoEscape(false))
11384       return false;
11385 
11386     bool FirstNoEscape = FirstParam.isNoEscape();
11387     bool SecondNoEscape = SecondParam.isNoEscape();
11388     bool IsNoEscape = FirstNoEscape && SecondNoEscape;
11389     NewParamInfos.push_back(FirstParam.withIsNoEscape(IsNoEscape));
11390     if (NewParamInfos.back().getOpaqueValue())
11391       NeedParamInfo = true;
11392     if (FirstNoEscape != IsNoEscape)
11393       CanUseFirst = false;
11394     if (SecondNoEscape != IsNoEscape)
11395       CanUseSecond = false;
11396   }
11397 
11398   if (!NeedParamInfo)
11399     NewParamInfos.clear();
11400 
11401   return true;
11402 }
11403 
ResetObjCLayout(const ObjCContainerDecl * CD)11404 void ASTContext::ResetObjCLayout(const ObjCContainerDecl *CD) {
11405   ObjCLayouts[CD] = nullptr;
11406 }
11407 
11408 /// mergeObjCGCQualifiers - This routine merges ObjC's GC attribute of 'LHS' and
11409 /// 'RHS' attributes and returns the merged version; including for function
11410 /// return types.
mergeObjCGCQualifiers(QualType LHS,QualType RHS)11411 QualType ASTContext::mergeObjCGCQualifiers(QualType LHS, QualType RHS) {
11412   QualType LHSCan = getCanonicalType(LHS),
11413   RHSCan = getCanonicalType(RHS);
11414   // If two types are identical, they are compatible.
11415   if (LHSCan == RHSCan)
11416     return LHS;
11417   if (RHSCan->isFunctionType()) {
11418     if (!LHSCan->isFunctionType())
11419       return {};
11420     QualType OldReturnType =
11421         cast<FunctionType>(RHSCan.getTypePtr())->getReturnType();
11422     QualType NewReturnType =
11423         cast<FunctionType>(LHSCan.getTypePtr())->getReturnType();
11424     QualType ResReturnType =
11425       mergeObjCGCQualifiers(NewReturnType, OldReturnType);
11426     if (ResReturnType.isNull())
11427       return {};
11428     if (ResReturnType == NewReturnType || ResReturnType == OldReturnType) {
11429       // id foo(); ... __strong id foo(); or: __strong id foo(); ... id foo();
11430       // In either case, use OldReturnType to build the new function type.
11431       const auto *F = LHS->castAs<FunctionType>();
11432       if (const auto *FPT = cast<FunctionProtoType>(F)) {
11433         FunctionProtoType::ExtProtoInfo EPI = FPT->getExtProtoInfo();
11434         EPI.ExtInfo = getFunctionExtInfo(LHS);
11435         QualType ResultType =
11436             getFunctionType(OldReturnType, FPT->getParamTypes(), EPI);
11437         return ResultType;
11438       }
11439     }
11440     return {};
11441   }
11442 
11443   // If the qualifiers are different, the types can still be merged.
11444   Qualifiers LQuals = LHSCan.getLocalQualifiers();
11445   Qualifiers RQuals = RHSCan.getLocalQualifiers();
11446   if (LQuals != RQuals) {
11447     // If any of these qualifiers are different, we have a type mismatch.
11448     if (LQuals.getCVRQualifiers() != RQuals.getCVRQualifiers() ||
11449         LQuals.getAddressSpace() != RQuals.getAddressSpace())
11450       return {};
11451 
11452     // Exactly one GC qualifier difference is allowed: __strong is
11453     // okay if the other type has no GC qualifier but is an Objective
11454     // C object pointer (i.e. implicitly strong by default).  We fix
11455     // this by pretending that the unqualified type was actually
11456     // qualified __strong.
11457     Qualifiers::GC GC_L = LQuals.getObjCGCAttr();
11458     Qualifiers::GC GC_R = RQuals.getObjCGCAttr();
11459     assert((GC_L != GC_R) && "unequal qualifier sets had only equal elements");
11460 
11461     if (GC_L == Qualifiers::Weak || GC_R == Qualifiers::Weak)
11462       return {};
11463 
11464     if (GC_L == Qualifiers::Strong)
11465       return LHS;
11466     if (GC_R == Qualifiers::Strong)
11467       return RHS;
11468     return {};
11469   }
11470 
11471   if (LHSCan->isObjCObjectPointerType() && RHSCan->isObjCObjectPointerType()) {
11472     QualType LHSBaseQT = LHS->castAs<ObjCObjectPointerType>()->getPointeeType();
11473     QualType RHSBaseQT = RHS->castAs<ObjCObjectPointerType>()->getPointeeType();
11474     QualType ResQT = mergeObjCGCQualifiers(LHSBaseQT, RHSBaseQT);
11475     if (ResQT == LHSBaseQT)
11476       return LHS;
11477     if (ResQT == RHSBaseQT)
11478       return RHS;
11479   }
11480   return {};
11481 }
11482 
11483 //===----------------------------------------------------------------------===//
11484 //                         Integer Predicates
11485 //===----------------------------------------------------------------------===//
11486 
getIntWidth(QualType T) const11487 unsigned ASTContext::getIntWidth(QualType T) const {
11488   if (const auto *ET = T->getAs<EnumType>())
11489     T = ET->getDecl()->getIntegerType();
11490   if (T->isBooleanType())
11491     return 1;
11492   if (const auto *EIT = T->getAs<BitIntType>())
11493     return EIT->getNumBits();
11494   // For builtin types, just use the standard type sizing method
11495   return (unsigned)getTypeSize(T);
11496 }
11497 
getCorrespondingUnsignedType(QualType T) const11498 QualType ASTContext::getCorrespondingUnsignedType(QualType T) const {
11499   assert((T->hasIntegerRepresentation() || T->isEnumeralType() ||
11500           T->isFixedPointType()) &&
11501          "Unexpected type");
11502 
11503   // Turn <4 x signed int> -> <4 x unsigned int>
11504   if (const auto *VTy = T->getAs<VectorType>())
11505     return getVectorType(getCorrespondingUnsignedType(VTy->getElementType()),
11506                          VTy->getNumElements(), VTy->getVectorKind());
11507 
11508   // For _BitInt, return an unsigned _BitInt with same width.
11509   if (const auto *EITy = T->getAs<BitIntType>())
11510     return getBitIntType(/*Unsigned=*/true, EITy->getNumBits());
11511 
11512   // For enums, get the underlying integer type of the enum, and let the general
11513   // integer type signchanging code handle it.
11514   if (const auto *ETy = T->getAs<EnumType>())
11515     T = ETy->getDecl()->getIntegerType();
11516 
11517   switch (T->castAs<BuiltinType>()->getKind()) {
11518   case BuiltinType::Char_U:
11519     // Plain `char` is mapped to `unsigned char` even if it's already unsigned
11520   case BuiltinType::Char_S:
11521   case BuiltinType::SChar:
11522   case BuiltinType::Char8:
11523     return UnsignedCharTy;
11524   case BuiltinType::Short:
11525     return UnsignedShortTy;
11526   case BuiltinType::Int:
11527     return UnsignedIntTy;
11528   case BuiltinType::Long:
11529     return UnsignedLongTy;
11530   case BuiltinType::LongLong:
11531     return UnsignedLongLongTy;
11532   case BuiltinType::Int128:
11533     return UnsignedInt128Ty;
11534   // wchar_t is special. It is either signed or not, but when it's signed,
11535   // there's no matching "unsigned wchar_t". Therefore we return the unsigned
11536   // version of its underlying type instead.
11537   case BuiltinType::WChar_S:
11538     return getUnsignedWCharType();
11539 
11540   case BuiltinType::ShortAccum:
11541     return UnsignedShortAccumTy;
11542   case BuiltinType::Accum:
11543     return UnsignedAccumTy;
11544   case BuiltinType::LongAccum:
11545     return UnsignedLongAccumTy;
11546   case BuiltinType::SatShortAccum:
11547     return SatUnsignedShortAccumTy;
11548   case BuiltinType::SatAccum:
11549     return SatUnsignedAccumTy;
11550   case BuiltinType::SatLongAccum:
11551     return SatUnsignedLongAccumTy;
11552   case BuiltinType::ShortFract:
11553     return UnsignedShortFractTy;
11554   case BuiltinType::Fract:
11555     return UnsignedFractTy;
11556   case BuiltinType::LongFract:
11557     return UnsignedLongFractTy;
11558   case BuiltinType::SatShortFract:
11559     return SatUnsignedShortFractTy;
11560   case BuiltinType::SatFract:
11561     return SatUnsignedFractTy;
11562   case BuiltinType::SatLongFract:
11563     return SatUnsignedLongFractTy;
11564   default:
11565     assert((T->hasUnsignedIntegerRepresentation() ||
11566             T->isUnsignedFixedPointType()) &&
11567            "Unexpected signed integer or fixed point type");
11568     return T;
11569   }
11570 }
11571 
getCorrespondingSignedType(QualType T) const11572 QualType ASTContext::getCorrespondingSignedType(QualType T) const {
11573   assert((T->hasIntegerRepresentation() || T->isEnumeralType() ||
11574           T->isFixedPointType()) &&
11575          "Unexpected type");
11576 
11577   // Turn <4 x unsigned int> -> <4 x signed int>
11578   if (const auto *VTy = T->getAs<VectorType>())
11579     return getVectorType(getCorrespondingSignedType(VTy->getElementType()),
11580                          VTy->getNumElements(), VTy->getVectorKind());
11581 
11582   // For _BitInt, return a signed _BitInt with same width.
11583   if (const auto *EITy = T->getAs<BitIntType>())
11584     return getBitIntType(/*Unsigned=*/false, EITy->getNumBits());
11585 
11586   // For enums, get the underlying integer type of the enum, and let the general
11587   // integer type signchanging code handle it.
11588   if (const auto *ETy = T->getAs<EnumType>())
11589     T = ETy->getDecl()->getIntegerType();
11590 
11591   switch (T->castAs<BuiltinType>()->getKind()) {
11592   case BuiltinType::Char_S:
11593     // Plain `char` is mapped to `signed char` even if it's already signed
11594   case BuiltinType::Char_U:
11595   case BuiltinType::UChar:
11596   case BuiltinType::Char8:
11597     return SignedCharTy;
11598   case BuiltinType::UShort:
11599     return ShortTy;
11600   case BuiltinType::UInt:
11601     return IntTy;
11602   case BuiltinType::ULong:
11603     return LongTy;
11604   case BuiltinType::ULongLong:
11605     return LongLongTy;
11606   case BuiltinType::UInt128:
11607     return Int128Ty;
11608   // wchar_t is special. It is either unsigned or not, but when it's unsigned,
11609   // there's no matching "signed wchar_t". Therefore we return the signed
11610   // version of its underlying type instead.
11611   case BuiltinType::WChar_U:
11612     return getSignedWCharType();
11613 
11614   case BuiltinType::UShortAccum:
11615     return ShortAccumTy;
11616   case BuiltinType::UAccum:
11617     return AccumTy;
11618   case BuiltinType::ULongAccum:
11619     return LongAccumTy;
11620   case BuiltinType::SatUShortAccum:
11621     return SatShortAccumTy;
11622   case BuiltinType::SatUAccum:
11623     return SatAccumTy;
11624   case BuiltinType::SatULongAccum:
11625     return SatLongAccumTy;
11626   case BuiltinType::UShortFract:
11627     return ShortFractTy;
11628   case BuiltinType::UFract:
11629     return FractTy;
11630   case BuiltinType::ULongFract:
11631     return LongFractTy;
11632   case BuiltinType::SatUShortFract:
11633     return SatShortFractTy;
11634   case BuiltinType::SatUFract:
11635     return SatFractTy;
11636   case BuiltinType::SatULongFract:
11637     return SatLongFractTy;
11638   default:
11639     assert(
11640         (T->hasSignedIntegerRepresentation() || T->isSignedFixedPointType()) &&
11641         "Unexpected signed integer or fixed point type");
11642     return T;
11643   }
11644 }
11645 
11646 ASTMutationListener::~ASTMutationListener() = default;
11647 
DeducedReturnType(const FunctionDecl * FD,QualType ReturnType)11648 void ASTMutationListener::DeducedReturnType(const FunctionDecl *FD,
11649                                             QualType ReturnType) {}
11650 
11651 //===----------------------------------------------------------------------===//
11652 //                          Builtin Type Computation
11653 //===----------------------------------------------------------------------===//
11654 
11655 /// DecodeTypeFromStr - This decodes one type descriptor from Str, advancing the
11656 /// pointer over the consumed characters.  This returns the resultant type.  If
11657 /// AllowTypeModifiers is false then modifier like * are not parsed, just basic
11658 /// types.  This allows "v2i*" to be parsed as a pointer to a v2i instead of
11659 /// a vector of "i*".
11660 ///
11661 /// RequiresICE is filled in on return to indicate whether the value is required
11662 /// to be an Integer Constant Expression.
DecodeTypeFromStr(const char * & Str,const ASTContext & Context,ASTContext::GetBuiltinTypeError & Error,bool & RequiresICE,bool AllowTypeModifiers)11663 static QualType DecodeTypeFromStr(const char *&Str, const ASTContext &Context,
11664                                   ASTContext::GetBuiltinTypeError &Error,
11665                                   bool &RequiresICE,
11666                                   bool AllowTypeModifiers) {
11667   // Modifiers.
11668   int HowLong = 0;
11669   bool Signed = false, Unsigned = false;
11670   RequiresICE = false;
11671 
11672   // Read the prefixed modifiers first.
11673   bool Done = false;
11674   #ifndef NDEBUG
11675   bool IsSpecial = false;
11676   #endif
11677   while (!Done) {
11678     switch (*Str++) {
11679     default: Done = true; --Str; break;
11680     case 'I':
11681       RequiresICE = true;
11682       break;
11683     case 'S':
11684       assert(!Unsigned && "Can't use both 'S' and 'U' modifiers!");
11685       assert(!Signed && "Can't use 'S' modifier multiple times!");
11686       Signed = true;
11687       break;
11688     case 'U':
11689       assert(!Signed && "Can't use both 'S' and 'U' modifiers!");
11690       assert(!Unsigned && "Can't use 'U' modifier multiple times!");
11691       Unsigned = true;
11692       break;
11693     case 'L':
11694       assert(!IsSpecial && "Can't use 'L' with 'W', 'N', 'Z' or 'O' modifiers");
11695       assert(HowLong <= 2 && "Can't have LLLL modifier");
11696       ++HowLong;
11697       break;
11698     case 'N':
11699       // 'N' behaves like 'L' for all non LP64 targets and 'int' otherwise.
11700       assert(!IsSpecial && "Can't use two 'N', 'W', 'Z' or 'O' modifiers!");
11701       assert(HowLong == 0 && "Can't use both 'L' and 'N' modifiers!");
11702       #ifndef NDEBUG
11703       IsSpecial = true;
11704       #endif
11705       if (Context.getTargetInfo().getLongWidth() == 32)
11706         ++HowLong;
11707       break;
11708     case 'W':
11709       // This modifier represents int64 type.
11710       assert(!IsSpecial && "Can't use two 'N', 'W', 'Z' or 'O' modifiers!");
11711       assert(HowLong == 0 && "Can't use both 'L' and 'W' modifiers!");
11712       #ifndef NDEBUG
11713       IsSpecial = true;
11714       #endif
11715       switch (Context.getTargetInfo().getInt64Type()) {
11716       default:
11717         llvm_unreachable("Unexpected integer type");
11718       case TargetInfo::SignedLong:
11719         HowLong = 1;
11720         break;
11721       case TargetInfo::SignedLongLong:
11722         HowLong = 2;
11723         break;
11724       }
11725       break;
11726     case 'Z':
11727       // This modifier represents int32 type.
11728       assert(!IsSpecial && "Can't use two 'N', 'W', 'Z' or 'O' modifiers!");
11729       assert(HowLong == 0 && "Can't use both 'L' and 'Z' modifiers!");
11730       #ifndef NDEBUG
11731       IsSpecial = true;
11732       #endif
11733       switch (Context.getTargetInfo().getIntTypeByWidth(32, true)) {
11734       default:
11735         llvm_unreachable("Unexpected integer type");
11736       case TargetInfo::SignedInt:
11737         HowLong = 0;
11738         break;
11739       case TargetInfo::SignedLong:
11740         HowLong = 1;
11741         break;
11742       case TargetInfo::SignedLongLong:
11743         HowLong = 2;
11744         break;
11745       }
11746       break;
11747     case 'O':
11748       assert(!IsSpecial && "Can't use two 'N', 'W', 'Z' or 'O' modifiers!");
11749       assert(HowLong == 0 && "Can't use both 'L' and 'O' modifiers!");
11750       #ifndef NDEBUG
11751       IsSpecial = true;
11752       #endif
11753       if (Context.getLangOpts().OpenCL)
11754         HowLong = 1;
11755       else
11756         HowLong = 2;
11757       break;
11758     }
11759   }
11760 
11761   QualType Type;
11762 
11763   // Read the base type.
11764   switch (*Str++) {
11765   default: llvm_unreachable("Unknown builtin type letter!");
11766   case 'x':
11767     assert(HowLong == 0 && !Signed && !Unsigned &&
11768            "Bad modifiers used with 'x'!");
11769     Type = Context.Float16Ty;
11770     break;
11771   case 'y':
11772     assert(HowLong == 0 && !Signed && !Unsigned &&
11773            "Bad modifiers used with 'y'!");
11774     Type = Context.BFloat16Ty;
11775     break;
11776   case 'v':
11777     assert(HowLong == 0 && !Signed && !Unsigned &&
11778            "Bad modifiers used with 'v'!");
11779     Type = Context.VoidTy;
11780     break;
11781   case 'h':
11782     assert(HowLong == 0 && !Signed && !Unsigned &&
11783            "Bad modifiers used with 'h'!");
11784     Type = Context.HalfTy;
11785     break;
11786   case 'f':
11787     assert(HowLong == 0 && !Signed && !Unsigned &&
11788            "Bad modifiers used with 'f'!");
11789     Type = Context.FloatTy;
11790     break;
11791   case 'd':
11792     assert(HowLong < 3 && !Signed && !Unsigned &&
11793            "Bad modifiers used with 'd'!");
11794     if (HowLong == 1)
11795       Type = Context.LongDoubleTy;
11796     else if (HowLong == 2)
11797       Type = Context.Float128Ty;
11798     else
11799       Type = Context.DoubleTy;
11800     break;
11801   case 's':
11802     assert(HowLong == 0 && "Bad modifiers used with 's'!");
11803     if (Unsigned)
11804       Type = Context.UnsignedShortTy;
11805     else
11806       Type = Context.ShortTy;
11807     break;
11808   case 'i':
11809     if (HowLong == 3)
11810       Type = Unsigned ? Context.UnsignedInt128Ty : Context.Int128Ty;
11811     else if (HowLong == 2)
11812       Type = Unsigned ? Context.UnsignedLongLongTy : Context.LongLongTy;
11813     else if (HowLong == 1)
11814       Type = Unsigned ? Context.UnsignedLongTy : Context.LongTy;
11815     else
11816       Type = Unsigned ? Context.UnsignedIntTy : Context.IntTy;
11817     break;
11818   case 'c':
11819     assert(HowLong == 0 && "Bad modifiers used with 'c'!");
11820     if (Signed)
11821       Type = Context.SignedCharTy;
11822     else if (Unsigned)
11823       Type = Context.UnsignedCharTy;
11824     else
11825       Type = Context.CharTy;
11826     break;
11827   case 'b': // boolean
11828     assert(HowLong == 0 && !Signed && !Unsigned && "Bad modifiers for 'b'!");
11829     Type = Context.BoolTy;
11830     break;
11831   case 'z':  // size_t.
11832     assert(HowLong == 0 && !Signed && !Unsigned && "Bad modifiers for 'z'!");
11833     Type = Context.getSizeType();
11834     break;
11835   case 'w':  // wchar_t.
11836     assert(HowLong == 0 && !Signed && !Unsigned && "Bad modifiers for 'w'!");
11837     Type = Context.getWideCharType();
11838     break;
11839   case 'F':
11840     Type = Context.getCFConstantStringType();
11841     break;
11842   case 'G':
11843     Type = Context.getObjCIdType();
11844     break;
11845   case 'H':
11846     Type = Context.getObjCSelType();
11847     break;
11848   case 'M':
11849     Type = Context.getObjCSuperType();
11850     break;
11851   case 'a':
11852     Type = Context.getBuiltinVaListType();
11853     assert(!Type.isNull() && "builtin va list type not initialized!");
11854     break;
11855   case 'A':
11856     // This is a "reference" to a va_list; however, what exactly
11857     // this means depends on how va_list is defined. There are two
11858     // different kinds of va_list: ones passed by value, and ones
11859     // passed by reference.  An example of a by-value va_list is
11860     // x86, where va_list is a char*. An example of by-ref va_list
11861     // is x86-64, where va_list is a __va_list_tag[1]. For x86,
11862     // we want this argument to be a char*&; for x86-64, we want
11863     // it to be a __va_list_tag*.
11864     Type = Context.getBuiltinVaListType();
11865     assert(!Type.isNull() && "builtin va list type not initialized!");
11866     if (Type->isArrayType())
11867       Type = Context.getArrayDecayedType(Type);
11868     else
11869       Type = Context.getLValueReferenceType(Type);
11870     break;
11871   case 'q': {
11872     char *End;
11873     unsigned NumElements = strtoul(Str, &End, 10);
11874     assert(End != Str && "Missing vector size");
11875     Str = End;
11876 
11877     QualType ElementType = DecodeTypeFromStr(Str, Context, Error,
11878                                              RequiresICE, false);
11879     assert(!RequiresICE && "Can't require vector ICE");
11880 
11881     Type = Context.getScalableVectorType(ElementType, NumElements);
11882     break;
11883   }
11884   case 'Q': {
11885     switch (*Str++) {
11886     case 'a': {
11887       Type = Context.SveCountTy;
11888       break;
11889     }
11890     case 'b': {
11891       Type = Context.AMDGPUBufferRsrcTy;
11892       break;
11893     }
11894     default:
11895       llvm_unreachable("Unexpected target builtin type");
11896     }
11897     break;
11898   }
11899   case 'V': {
11900     char *End;
11901     unsigned NumElements = strtoul(Str, &End, 10);
11902     assert(End != Str && "Missing vector size");
11903     Str = End;
11904 
11905     QualType ElementType = DecodeTypeFromStr(Str, Context, Error,
11906                                              RequiresICE, false);
11907     assert(!RequiresICE && "Can't require vector ICE");
11908 
11909     // TODO: No way to make AltiVec vectors in builtins yet.
11910     Type = Context.getVectorType(ElementType, NumElements, VectorKind::Generic);
11911     break;
11912   }
11913   case 'E': {
11914     char *End;
11915 
11916     unsigned NumElements = strtoul(Str, &End, 10);
11917     assert(End != Str && "Missing vector size");
11918 
11919     Str = End;
11920 
11921     QualType ElementType = DecodeTypeFromStr(Str, Context, Error, RequiresICE,
11922                                              false);
11923     Type = Context.getExtVectorType(ElementType, NumElements);
11924     break;
11925   }
11926   case 'X': {
11927     QualType ElementType = DecodeTypeFromStr(Str, Context, Error, RequiresICE,
11928                                              false);
11929     assert(!RequiresICE && "Can't require complex ICE");
11930     Type = Context.getComplexType(ElementType);
11931     break;
11932   }
11933   case 'Y':
11934     Type = Context.getPointerDiffType();
11935     break;
11936   case 'P':
11937     Type = Context.getFILEType();
11938     if (Type.isNull()) {
11939       Error = ASTContext::GE_Missing_stdio;
11940       return {};
11941     }
11942     break;
11943   case 'J':
11944     if (Signed)
11945       Type = Context.getsigjmp_bufType();
11946     else
11947       Type = Context.getjmp_bufType();
11948 
11949     if (Type.isNull()) {
11950       Error = ASTContext::GE_Missing_setjmp;
11951       return {};
11952     }
11953     break;
11954   case 'K':
11955     assert(HowLong == 0 && !Signed && !Unsigned && "Bad modifiers for 'K'!");
11956     Type = Context.getucontext_tType();
11957 
11958     if (Type.isNull()) {
11959       Error = ASTContext::GE_Missing_ucontext;
11960       return {};
11961     }
11962     break;
11963   case 'p':
11964     Type = Context.getProcessIDType();
11965     break;
11966   }
11967 
11968   // If there are modifiers and if we're allowed to parse them, go for it.
11969   Done = !AllowTypeModifiers;
11970   while (!Done) {
11971     switch (char c = *Str++) {
11972     default: Done = true; --Str; break;
11973     case '*':
11974     case '&': {
11975       // Both pointers and references can have their pointee types
11976       // qualified with an address space.
11977       char *End;
11978       unsigned AddrSpace = strtoul(Str, &End, 10);
11979       if (End != Str) {
11980         // Note AddrSpace == 0 is not the same as an unspecified address space.
11981         Type = Context.getAddrSpaceQualType(
11982           Type,
11983           Context.getLangASForBuiltinAddressSpace(AddrSpace));
11984         Str = End;
11985       }
11986       if (c == '*')
11987         Type = Context.getPointerType(Type);
11988       else
11989         Type = Context.getLValueReferenceType(Type);
11990       break;
11991     }
11992     // FIXME: There's no way to have a built-in with an rvalue ref arg.
11993     case 'C':
11994       Type = Type.withConst();
11995       break;
11996     case 'D':
11997       Type = Context.getVolatileType(Type);
11998       break;
11999     case 'R':
12000       Type = Type.withRestrict();
12001       break;
12002     }
12003   }
12004 
12005   assert((!RequiresICE || Type->isIntegralOrEnumerationType()) &&
12006          "Integer constant 'I' type must be an integer");
12007 
12008   return Type;
12009 }
12010 
12011 // On some targets such as PowerPC, some of the builtins are defined with custom
12012 // type descriptors for target-dependent types. These descriptors are decoded in
12013 // other functions, but it may be useful to be able to fall back to default
12014 // descriptor decoding to define builtins mixing target-dependent and target-
12015 // independent types. This function allows decoding one type descriptor with
12016 // default decoding.
DecodeTypeStr(const char * & Str,const ASTContext & Context,GetBuiltinTypeError & Error,bool & RequireICE,bool AllowTypeModifiers) const12017 QualType ASTContext::DecodeTypeStr(const char *&Str, const ASTContext &Context,
12018                                    GetBuiltinTypeError &Error, bool &RequireICE,
12019                                    bool AllowTypeModifiers) const {
12020   return DecodeTypeFromStr(Str, Context, Error, RequireICE, AllowTypeModifiers);
12021 }
12022 
12023 /// GetBuiltinType - Return the type for the specified builtin.
GetBuiltinType(unsigned Id,GetBuiltinTypeError & Error,unsigned * IntegerConstantArgs) const12024 QualType ASTContext::GetBuiltinType(unsigned Id,
12025                                     GetBuiltinTypeError &Error,
12026                                     unsigned *IntegerConstantArgs) const {
12027   const char *TypeStr = BuiltinInfo.getTypeString(Id);
12028   if (TypeStr[0] == '\0') {
12029     Error = GE_Missing_type;
12030     return {};
12031   }
12032 
12033   SmallVector<QualType, 8> ArgTypes;
12034 
12035   bool RequiresICE = false;
12036   Error = GE_None;
12037   QualType ResType = DecodeTypeFromStr(TypeStr, *this, Error,
12038                                        RequiresICE, true);
12039   if (Error != GE_None)
12040     return {};
12041 
12042   assert(!RequiresICE && "Result of intrinsic cannot be required to be an ICE");
12043 
12044   while (TypeStr[0] && TypeStr[0] != '.') {
12045     QualType Ty = DecodeTypeFromStr(TypeStr, *this, Error, RequiresICE, true);
12046     if (Error != GE_None)
12047       return {};
12048 
12049     // If this argument is required to be an IntegerConstantExpression and the
12050     // caller cares, fill in the bitmask we return.
12051     if (RequiresICE && IntegerConstantArgs)
12052       *IntegerConstantArgs |= 1 << ArgTypes.size();
12053 
12054     // Do array -> pointer decay.  The builtin should use the decayed type.
12055     if (Ty->isArrayType())
12056       Ty = getArrayDecayedType(Ty);
12057 
12058     ArgTypes.push_back(Ty);
12059   }
12060 
12061   if (Id == Builtin::BI__GetExceptionInfo)
12062     return {};
12063 
12064   assert((TypeStr[0] != '.' || TypeStr[1] == 0) &&
12065          "'.' should only occur at end of builtin type list!");
12066 
12067   bool Variadic = (TypeStr[0] == '.');
12068 
12069   FunctionType::ExtInfo EI(getDefaultCallingConvention(
12070       Variadic, /*IsCXXMethod=*/false, /*IsBuiltin=*/true));
12071   if (BuiltinInfo.isNoReturn(Id)) EI = EI.withNoReturn(true);
12072 
12073 
12074   // We really shouldn't be making a no-proto type here.
12075   if (ArgTypes.empty() && Variadic && !getLangOpts().requiresStrictPrototypes())
12076     return getFunctionNoProtoType(ResType, EI);
12077 
12078   FunctionProtoType::ExtProtoInfo EPI;
12079   EPI.ExtInfo = EI;
12080   EPI.Variadic = Variadic;
12081   if (getLangOpts().CPlusPlus && BuiltinInfo.isNoThrow(Id))
12082     EPI.ExceptionSpec.Type =
12083         getLangOpts().CPlusPlus11 ? EST_BasicNoexcept : EST_DynamicNone;
12084 
12085   return getFunctionType(ResType, ArgTypes, EPI);
12086 }
12087 
basicGVALinkageForFunction(const ASTContext & Context,const FunctionDecl * FD)12088 static GVALinkage basicGVALinkageForFunction(const ASTContext &Context,
12089                                              const FunctionDecl *FD) {
12090   if (!FD->isExternallyVisible())
12091     return GVA_Internal;
12092 
12093   // Non-user-provided functions get emitted as weak definitions with every
12094   // use, no matter whether they've been explicitly instantiated etc.
12095   if (!FD->isUserProvided())
12096     return GVA_DiscardableODR;
12097 
12098   GVALinkage External;
12099   switch (FD->getTemplateSpecializationKind()) {
12100   case TSK_Undeclared:
12101   case TSK_ExplicitSpecialization:
12102     External = GVA_StrongExternal;
12103     break;
12104 
12105   case TSK_ExplicitInstantiationDefinition:
12106     return GVA_StrongODR;
12107 
12108   // C++11 [temp.explicit]p10:
12109   //   [ Note: The intent is that an inline function that is the subject of
12110   //   an explicit instantiation declaration will still be implicitly
12111   //   instantiated when used so that the body can be considered for
12112   //   inlining, but that no out-of-line copy of the inline function would be
12113   //   generated in the translation unit. -- end note ]
12114   case TSK_ExplicitInstantiationDeclaration:
12115     return GVA_AvailableExternally;
12116 
12117   case TSK_ImplicitInstantiation:
12118     External = GVA_DiscardableODR;
12119     break;
12120   }
12121 
12122   if (!FD->isInlined())
12123     return External;
12124 
12125   if ((!Context.getLangOpts().CPlusPlus &&
12126        !Context.getTargetInfo().getCXXABI().isMicrosoft() &&
12127        !FD->hasAttr<DLLExportAttr>()) ||
12128       FD->hasAttr<GNUInlineAttr>()) {
12129     // FIXME: This doesn't match gcc's behavior for dllexport inline functions.
12130 
12131     // GNU or C99 inline semantics. Determine whether this symbol should be
12132     // externally visible.
12133     if (FD->isInlineDefinitionExternallyVisible())
12134       return External;
12135 
12136     // C99 inline semantics, where the symbol is not externally visible.
12137     return GVA_AvailableExternally;
12138   }
12139 
12140   // Functions specified with extern and inline in -fms-compatibility mode
12141   // forcibly get emitted.  While the body of the function cannot be later
12142   // replaced, the function definition cannot be discarded.
12143   if (FD->isMSExternInline())
12144     return GVA_StrongODR;
12145 
12146   if (Context.getTargetInfo().getCXXABI().isMicrosoft() &&
12147       isa<CXXConstructorDecl>(FD) &&
12148       cast<CXXConstructorDecl>(FD)->isInheritingConstructor())
12149     // Our approach to inheriting constructors is fundamentally different from
12150     // that used by the MS ABI, so keep our inheriting constructor thunks
12151     // internal rather than trying to pick an unambiguous mangling for them.
12152     return GVA_Internal;
12153 
12154   return GVA_DiscardableODR;
12155 }
12156 
adjustGVALinkageForAttributes(const ASTContext & Context,const Decl * D,GVALinkage L)12157 static GVALinkage adjustGVALinkageForAttributes(const ASTContext &Context,
12158                                                 const Decl *D, GVALinkage L) {
12159   // See http://msdn.microsoft.com/en-us/library/xa0d9ste.aspx
12160   // dllexport/dllimport on inline functions.
12161   if (D->hasAttr<DLLImportAttr>()) {
12162     if (L == GVA_DiscardableODR || L == GVA_StrongODR)
12163       return GVA_AvailableExternally;
12164   } else if (D->hasAttr<DLLExportAttr>()) {
12165     if (L == GVA_DiscardableODR)
12166       return GVA_StrongODR;
12167   } else if (Context.getLangOpts().CUDA && Context.getLangOpts().CUDAIsDevice) {
12168     // Device-side functions with __global__ attribute must always be
12169     // visible externally so they can be launched from host.
12170     if (D->hasAttr<CUDAGlobalAttr>() &&
12171         (L == GVA_DiscardableODR || L == GVA_Internal))
12172       return GVA_StrongODR;
12173     // Single source offloading languages like CUDA/HIP need to be able to
12174     // access static device variables from host code of the same compilation
12175     // unit. This is done by externalizing the static variable with a shared
12176     // name between the host and device compilation which is the same for the
12177     // same compilation unit whereas different among different compilation
12178     // units.
12179     if (Context.shouldExternalize(D))
12180       return GVA_StrongExternal;
12181   }
12182   return L;
12183 }
12184 
12185 /// Adjust the GVALinkage for a declaration based on what an external AST source
12186 /// knows about whether there can be other definitions of this declaration.
12187 static GVALinkage
adjustGVALinkageForExternalDefinitionKind(const ASTContext & Ctx,const Decl * D,GVALinkage L)12188 adjustGVALinkageForExternalDefinitionKind(const ASTContext &Ctx, const Decl *D,
12189                                           GVALinkage L) {
12190   ExternalASTSource *Source = Ctx.getExternalSource();
12191   if (!Source)
12192     return L;
12193 
12194   switch (Source->hasExternalDefinitions(D)) {
12195   case ExternalASTSource::EK_Never:
12196     // Other translation units rely on us to provide the definition.
12197     if (L == GVA_DiscardableODR)
12198       return GVA_StrongODR;
12199     break;
12200 
12201   case ExternalASTSource::EK_Always:
12202     return GVA_AvailableExternally;
12203 
12204   case ExternalASTSource::EK_ReplyHazy:
12205     break;
12206   }
12207   return L;
12208 }
12209 
GetGVALinkageForFunction(const FunctionDecl * FD) const12210 GVALinkage ASTContext::GetGVALinkageForFunction(const FunctionDecl *FD) const {
12211   return adjustGVALinkageForExternalDefinitionKind(*this, FD,
12212            adjustGVALinkageForAttributes(*this, FD,
12213              basicGVALinkageForFunction(*this, FD)));
12214 }
12215 
basicGVALinkageForVariable(const ASTContext & Context,const VarDecl * VD)12216 static GVALinkage basicGVALinkageForVariable(const ASTContext &Context,
12217                                              const VarDecl *VD) {
12218   // As an extension for interactive REPLs, make sure constant variables are
12219   // only emitted once instead of LinkageComputer::getLVForNamespaceScopeDecl
12220   // marking them as internal.
12221   if (Context.getLangOpts().CPlusPlus &&
12222       Context.getLangOpts().IncrementalExtensions &&
12223       VD->getType().isConstQualified() &&
12224       !VD->getType().isVolatileQualified() && !VD->isInline() &&
12225       !isa<VarTemplateSpecializationDecl>(VD) && !VD->getDescribedVarTemplate())
12226     return GVA_DiscardableODR;
12227 
12228   if (!VD->isExternallyVisible())
12229     return GVA_Internal;
12230 
12231   if (VD->isStaticLocal()) {
12232     const DeclContext *LexicalContext = VD->getParentFunctionOrMethod();
12233     while (LexicalContext && !isa<FunctionDecl>(LexicalContext))
12234       LexicalContext = LexicalContext->getLexicalParent();
12235 
12236     // ObjC Blocks can create local variables that don't have a FunctionDecl
12237     // LexicalContext.
12238     if (!LexicalContext)
12239       return GVA_DiscardableODR;
12240 
12241     // Otherwise, let the static local variable inherit its linkage from the
12242     // nearest enclosing function.
12243     auto StaticLocalLinkage =
12244         Context.GetGVALinkageForFunction(cast<FunctionDecl>(LexicalContext));
12245 
12246     // Itanium ABI 5.2.2: "Each COMDAT group [for a static local variable] must
12247     // be emitted in any object with references to the symbol for the object it
12248     // contains, whether inline or out-of-line."
12249     // Similar behavior is observed with MSVC. An alternative ABI could use
12250     // StrongODR/AvailableExternally to match the function, but none are
12251     // known/supported currently.
12252     if (StaticLocalLinkage == GVA_StrongODR ||
12253         StaticLocalLinkage == GVA_AvailableExternally)
12254       return GVA_DiscardableODR;
12255     return StaticLocalLinkage;
12256   }
12257 
12258   // MSVC treats in-class initialized static data members as definitions.
12259   // By giving them non-strong linkage, out-of-line definitions won't
12260   // cause link errors.
12261   if (Context.isMSStaticDataMemberInlineDefinition(VD))
12262     return GVA_DiscardableODR;
12263 
12264   // Most non-template variables have strong linkage; inline variables are
12265   // linkonce_odr or (occasionally, for compatibility) weak_odr.
12266   GVALinkage StrongLinkage;
12267   switch (Context.getInlineVariableDefinitionKind(VD)) {
12268   case ASTContext::InlineVariableDefinitionKind::None:
12269     StrongLinkage = GVA_StrongExternal;
12270     break;
12271   case ASTContext::InlineVariableDefinitionKind::Weak:
12272   case ASTContext::InlineVariableDefinitionKind::WeakUnknown:
12273     StrongLinkage = GVA_DiscardableODR;
12274     break;
12275   case ASTContext::InlineVariableDefinitionKind::Strong:
12276     StrongLinkage = GVA_StrongODR;
12277     break;
12278   }
12279 
12280   switch (VD->getTemplateSpecializationKind()) {
12281   case TSK_Undeclared:
12282     return StrongLinkage;
12283 
12284   case TSK_ExplicitSpecialization:
12285     return Context.getTargetInfo().getCXXABI().isMicrosoft() &&
12286                    VD->isStaticDataMember()
12287                ? GVA_StrongODR
12288                : StrongLinkage;
12289 
12290   case TSK_ExplicitInstantiationDefinition:
12291     return GVA_StrongODR;
12292 
12293   case TSK_ExplicitInstantiationDeclaration:
12294     return GVA_AvailableExternally;
12295 
12296   case TSK_ImplicitInstantiation:
12297     return GVA_DiscardableODR;
12298   }
12299 
12300   llvm_unreachable("Invalid Linkage!");
12301 }
12302 
GetGVALinkageForVariable(const VarDecl * VD) const12303 GVALinkage ASTContext::GetGVALinkageForVariable(const VarDecl *VD) const {
12304   return adjustGVALinkageForExternalDefinitionKind(*this, VD,
12305            adjustGVALinkageForAttributes(*this, VD,
12306              basicGVALinkageForVariable(*this, VD)));
12307 }
12308 
DeclMustBeEmitted(const Decl * D)12309 bool ASTContext::DeclMustBeEmitted(const Decl *D) {
12310   if (const auto *VD = dyn_cast<VarDecl>(D)) {
12311     if (!VD->isFileVarDecl())
12312       return false;
12313     // Global named register variables (GNU extension) are never emitted.
12314     if (VD->getStorageClass() == SC_Register)
12315       return false;
12316     if (VD->getDescribedVarTemplate() ||
12317         isa<VarTemplatePartialSpecializationDecl>(VD))
12318       return false;
12319   } else if (const auto *FD = dyn_cast<FunctionDecl>(D)) {
12320     // We never need to emit an uninstantiated function template.
12321     if (FD->getTemplatedKind() == FunctionDecl::TK_FunctionTemplate)
12322       return false;
12323   } else if (isa<PragmaCommentDecl>(D))
12324     return true;
12325   else if (isa<PragmaDetectMismatchDecl>(D))
12326     return true;
12327   else if (isa<OMPRequiresDecl>(D))
12328     return true;
12329   else if (isa<OMPThreadPrivateDecl>(D))
12330     return !D->getDeclContext()->isDependentContext();
12331   else if (isa<OMPAllocateDecl>(D))
12332     return !D->getDeclContext()->isDependentContext();
12333   else if (isa<OMPDeclareReductionDecl>(D) || isa<OMPDeclareMapperDecl>(D))
12334     return !D->getDeclContext()->isDependentContext();
12335   else if (isa<ImportDecl>(D))
12336     return true;
12337   else
12338     return false;
12339 
12340   // If this is a member of a class template, we do not need to emit it.
12341   if (D->getDeclContext()->isDependentContext())
12342     return false;
12343 
12344   // Weak references don't produce any output by themselves.
12345   if (D->hasAttr<WeakRefAttr>())
12346     return false;
12347 
12348   // Aliases and used decls are required.
12349   if (D->hasAttr<AliasAttr>() || D->hasAttr<UsedAttr>())
12350     return true;
12351 
12352   if (const auto *FD = dyn_cast<FunctionDecl>(D)) {
12353     // Forward declarations aren't required.
12354     if (!FD->doesThisDeclarationHaveABody())
12355       return FD->doesDeclarationForceExternallyVisibleDefinition();
12356 
12357     // Constructors and destructors are required.
12358     if (FD->hasAttr<ConstructorAttr>() || FD->hasAttr<DestructorAttr>())
12359       return true;
12360 
12361     // The key function for a class is required.  This rule only comes
12362     // into play when inline functions can be key functions, though.
12363     if (getTargetInfo().getCXXABI().canKeyFunctionBeInline()) {
12364       if (const auto *MD = dyn_cast<CXXMethodDecl>(FD)) {
12365         const CXXRecordDecl *RD = MD->getParent();
12366         if (MD->isOutOfLine() && RD->isDynamicClass()) {
12367           const CXXMethodDecl *KeyFunc = getCurrentKeyFunction(RD);
12368           if (KeyFunc && KeyFunc->getCanonicalDecl() == MD->getCanonicalDecl())
12369             return true;
12370         }
12371       }
12372     }
12373 
12374     GVALinkage Linkage = GetGVALinkageForFunction(FD);
12375 
12376     // static, static inline, always_inline, and extern inline functions can
12377     // always be deferred.  Normal inline functions can be deferred in C99/C++.
12378     // Implicit template instantiations can also be deferred in C++.
12379     return !isDiscardableGVALinkage(Linkage);
12380   }
12381 
12382   const auto *VD = cast<VarDecl>(D);
12383   assert(VD->isFileVarDecl() && "Expected file scoped var");
12384 
12385   // If the decl is marked as `declare target to`, it should be emitted for the
12386   // host and for the device.
12387   if (LangOpts.OpenMP &&
12388       OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(VD))
12389     return true;
12390 
12391   if (VD->isThisDeclarationADefinition() == VarDecl::DeclarationOnly &&
12392       !isMSStaticDataMemberInlineDefinition(VD))
12393     return false;
12394 
12395   if (VD->shouldEmitInExternalSource())
12396     return false;
12397 
12398   // Variables that can be needed in other TUs are required.
12399   auto Linkage = GetGVALinkageForVariable(VD);
12400   if (!isDiscardableGVALinkage(Linkage))
12401     return true;
12402 
12403   // We never need to emit a variable that is available in another TU.
12404   if (Linkage == GVA_AvailableExternally)
12405     return false;
12406 
12407   // Variables that have destruction with side-effects are required.
12408   if (VD->needsDestruction(*this))
12409     return true;
12410 
12411   // Variables that have initialization with side-effects are required.
12412   if (VD->getInit() && VD->getInit()->HasSideEffects(*this) &&
12413       // We can get a value-dependent initializer during error recovery.
12414       (VD->getInit()->isValueDependent() || !VD->evaluateValue()))
12415     return true;
12416 
12417   // Likewise, variables with tuple-like bindings are required if their
12418   // bindings have side-effects.
12419   if (const auto *DD = dyn_cast<DecompositionDecl>(VD))
12420     for (const auto *BD : DD->bindings())
12421       if (const auto *BindingVD = BD->getHoldingVar())
12422         if (DeclMustBeEmitted(BindingVD))
12423           return true;
12424 
12425   return false;
12426 }
12427 
forEachMultiversionedFunctionVersion(const FunctionDecl * FD,llvm::function_ref<void (FunctionDecl *)> Pred) const12428 void ASTContext::forEachMultiversionedFunctionVersion(
12429     const FunctionDecl *FD,
12430     llvm::function_ref<void(FunctionDecl *)> Pred) const {
12431   assert(FD->isMultiVersion() && "Only valid for multiversioned functions");
12432   llvm::SmallDenseSet<const FunctionDecl*, 4> SeenDecls;
12433   FD = FD->getMostRecentDecl();
12434   // FIXME: The order of traversal here matters and depends on the order of
12435   // lookup results, which happens to be (mostly) oldest-to-newest, but we
12436   // shouldn't rely on that.
12437   for (auto *CurDecl :
12438        FD->getDeclContext()->getRedeclContext()->lookup(FD->getDeclName())) {
12439     FunctionDecl *CurFD = CurDecl->getAsFunction()->getMostRecentDecl();
12440     if (CurFD && hasSameType(CurFD->getType(), FD->getType()) &&
12441         !SeenDecls.contains(CurFD)) {
12442       SeenDecls.insert(CurFD);
12443       Pred(CurFD);
12444     }
12445   }
12446 }
12447 
getDefaultCallingConvention(bool IsVariadic,bool IsCXXMethod,bool IsBuiltin) const12448 CallingConv ASTContext::getDefaultCallingConvention(bool IsVariadic,
12449                                                     bool IsCXXMethod,
12450                                                     bool IsBuiltin) const {
12451   // Pass through to the C++ ABI object
12452   if (IsCXXMethod)
12453     return ABI->getDefaultMethodCallConv(IsVariadic);
12454 
12455   // Builtins ignore user-specified default calling convention and remain the
12456   // Target's default calling convention.
12457   if (!IsBuiltin) {
12458     switch (LangOpts.getDefaultCallingConv()) {
12459     case LangOptions::DCC_None:
12460       break;
12461     case LangOptions::DCC_CDecl:
12462       return CC_C;
12463     case LangOptions::DCC_FastCall:
12464       if (getTargetInfo().hasFeature("sse2") && !IsVariadic)
12465         return CC_X86FastCall;
12466       break;
12467     case LangOptions::DCC_StdCall:
12468       if (!IsVariadic)
12469         return CC_X86StdCall;
12470       break;
12471     case LangOptions::DCC_VectorCall:
12472       // __vectorcall cannot be applied to variadic functions.
12473       if (!IsVariadic)
12474         return CC_X86VectorCall;
12475       break;
12476     case LangOptions::DCC_RegCall:
12477       // __regcall cannot be applied to variadic functions.
12478       if (!IsVariadic)
12479         return CC_X86RegCall;
12480       break;
12481     case LangOptions::DCC_RtdCall:
12482       if (!IsVariadic)
12483         return CC_M68kRTD;
12484       break;
12485     }
12486   }
12487   return Target->getDefaultCallingConv();
12488 }
12489 
isNearlyEmpty(const CXXRecordDecl * RD) const12490 bool ASTContext::isNearlyEmpty(const CXXRecordDecl *RD) const {
12491   // Pass through to the C++ ABI object
12492   return ABI->isNearlyEmpty(RD);
12493 }
12494 
getVTableContext()12495 VTableContextBase *ASTContext::getVTableContext() {
12496   if (!VTContext.get()) {
12497     auto ABI = Target->getCXXABI();
12498     if (ABI.isMicrosoft())
12499       VTContext.reset(new MicrosoftVTableContext(*this));
12500     else {
12501       auto ComponentLayout = getLangOpts().RelativeCXXABIVTables
12502                                  ? ItaniumVTableContext::Relative
12503                                  : ItaniumVTableContext::Pointer;
12504       VTContext.reset(new ItaniumVTableContext(*this, ComponentLayout));
12505     }
12506   }
12507   return VTContext.get();
12508 }
12509 
createMangleContext(const TargetInfo * T)12510 MangleContext *ASTContext::createMangleContext(const TargetInfo *T) {
12511   if (!T)
12512     T = Target;
12513   switch (T->getCXXABI().getKind()) {
12514   case TargetCXXABI::AppleARM64:
12515   case TargetCXXABI::Fuchsia:
12516   case TargetCXXABI::GenericAArch64:
12517   case TargetCXXABI::GenericItanium:
12518   case TargetCXXABI::GenericARM:
12519   case TargetCXXABI::GenericMIPS:
12520   case TargetCXXABI::iOS:
12521   case TargetCXXABI::WebAssembly:
12522   case TargetCXXABI::WatchOS:
12523   case TargetCXXABI::XL:
12524     return ItaniumMangleContext::create(*this, getDiagnostics());
12525   case TargetCXXABI::Microsoft:
12526     return MicrosoftMangleContext::create(*this, getDiagnostics());
12527   }
12528   llvm_unreachable("Unsupported ABI");
12529 }
12530 
createDeviceMangleContext(const TargetInfo & T)12531 MangleContext *ASTContext::createDeviceMangleContext(const TargetInfo &T) {
12532   assert(T.getCXXABI().getKind() != TargetCXXABI::Microsoft &&
12533          "Device mangle context does not support Microsoft mangling.");
12534   switch (T.getCXXABI().getKind()) {
12535   case TargetCXXABI::AppleARM64:
12536   case TargetCXXABI::Fuchsia:
12537   case TargetCXXABI::GenericAArch64:
12538   case TargetCXXABI::GenericItanium:
12539   case TargetCXXABI::GenericARM:
12540   case TargetCXXABI::GenericMIPS:
12541   case TargetCXXABI::iOS:
12542   case TargetCXXABI::WebAssembly:
12543   case TargetCXXABI::WatchOS:
12544   case TargetCXXABI::XL:
12545     return ItaniumMangleContext::create(
12546         *this, getDiagnostics(),
12547         [](ASTContext &, const NamedDecl *ND) -> std::optional<unsigned> {
12548           if (const auto *RD = dyn_cast<CXXRecordDecl>(ND))
12549             return RD->getDeviceLambdaManglingNumber();
12550           return std::nullopt;
12551         },
12552         /*IsAux=*/true);
12553   case TargetCXXABI::Microsoft:
12554     return MicrosoftMangleContext::create(*this, getDiagnostics(),
12555                                           /*IsAux=*/true);
12556   }
12557   llvm_unreachable("Unsupported ABI");
12558 }
12559 
12560 CXXABI::~CXXABI() = default;
12561 
getSideTableAllocatedMemory() const12562 size_t ASTContext::getSideTableAllocatedMemory() const {
12563   return ASTRecordLayouts.getMemorySize() +
12564          llvm::capacity_in_bytes(ObjCLayouts) +
12565          llvm::capacity_in_bytes(KeyFunctions) +
12566          llvm::capacity_in_bytes(ObjCImpls) +
12567          llvm::capacity_in_bytes(BlockVarCopyInits) +
12568          llvm::capacity_in_bytes(DeclAttrs) +
12569          llvm::capacity_in_bytes(TemplateOrInstantiation) +
12570          llvm::capacity_in_bytes(InstantiatedFromUsingDecl) +
12571          llvm::capacity_in_bytes(InstantiatedFromUsingShadowDecl) +
12572          llvm::capacity_in_bytes(InstantiatedFromUnnamedFieldDecl) +
12573          llvm::capacity_in_bytes(OverriddenMethods) +
12574          llvm::capacity_in_bytes(Types) +
12575          llvm::capacity_in_bytes(VariableArrayTypes);
12576 }
12577 
12578 /// getIntTypeForBitwidth -
12579 /// sets integer QualTy according to specified details:
12580 /// bitwidth, signed/unsigned.
12581 /// Returns empty type if there is no appropriate target types.
getIntTypeForBitwidth(unsigned DestWidth,unsigned Signed) const12582 QualType ASTContext::getIntTypeForBitwidth(unsigned DestWidth,
12583                                            unsigned Signed) const {
12584   TargetInfo::IntType Ty = getTargetInfo().getIntTypeByWidth(DestWidth, Signed);
12585   CanQualType QualTy = getFromTargetType(Ty);
12586   if (!QualTy && DestWidth == 128)
12587     return Signed ? Int128Ty : UnsignedInt128Ty;
12588   return QualTy;
12589 }
12590 
12591 /// getRealTypeForBitwidth -
12592 /// sets floating point QualTy according to specified bitwidth.
12593 /// Returns empty type if there is no appropriate target types.
getRealTypeForBitwidth(unsigned DestWidth,FloatModeKind ExplicitType) const12594 QualType ASTContext::getRealTypeForBitwidth(unsigned DestWidth,
12595                                             FloatModeKind ExplicitType) const {
12596   FloatModeKind Ty =
12597       getTargetInfo().getRealTypeByWidth(DestWidth, ExplicitType);
12598   switch (Ty) {
12599   case FloatModeKind::Half:
12600     return HalfTy;
12601   case FloatModeKind::Float:
12602     return FloatTy;
12603   case FloatModeKind::Double:
12604     return DoubleTy;
12605   case FloatModeKind::LongDouble:
12606     return LongDoubleTy;
12607   case FloatModeKind::Float128:
12608     return Float128Ty;
12609   case FloatModeKind::Ibm128:
12610     return Ibm128Ty;
12611   case FloatModeKind::NoFloat:
12612     return {};
12613   }
12614 
12615   llvm_unreachable("Unhandled TargetInfo::RealType value");
12616 }
12617 
setManglingNumber(const NamedDecl * ND,unsigned Number)12618 void ASTContext::setManglingNumber(const NamedDecl *ND, unsigned Number) {
12619   if (Number <= 1)
12620     return;
12621 
12622   MangleNumbers[ND] = Number;
12623 
12624   if (Listener)
12625     Listener->AddedManglingNumber(ND, Number);
12626 }
12627 
getManglingNumber(const NamedDecl * ND,bool ForAuxTarget) const12628 unsigned ASTContext::getManglingNumber(const NamedDecl *ND,
12629                                        bool ForAuxTarget) const {
12630   auto I = MangleNumbers.find(ND);
12631   unsigned Res = I != MangleNumbers.end() ? I->second : 1;
12632   // CUDA/HIP host compilation encodes host and device mangling numbers
12633   // as lower and upper half of 32 bit integer.
12634   if (LangOpts.CUDA && !LangOpts.CUDAIsDevice) {
12635     Res = ForAuxTarget ? Res >> 16 : Res & 0xFFFF;
12636   } else {
12637     assert(!ForAuxTarget && "Only CUDA/HIP host compilation supports mangling "
12638                             "number for aux target");
12639   }
12640   return Res > 1 ? Res : 1;
12641 }
12642 
setStaticLocalNumber(const VarDecl * VD,unsigned Number)12643 void ASTContext::setStaticLocalNumber(const VarDecl *VD, unsigned Number) {
12644   if (Number <= 1)
12645     return;
12646 
12647   StaticLocalNumbers[VD] = Number;
12648 
12649   if (Listener)
12650     Listener->AddedStaticLocalNumbers(VD, Number);
12651 }
12652 
getStaticLocalNumber(const VarDecl * VD) const12653 unsigned ASTContext::getStaticLocalNumber(const VarDecl *VD) const {
12654   auto I = StaticLocalNumbers.find(VD);
12655   return I != StaticLocalNumbers.end() ? I->second : 1;
12656 }
12657 
12658 MangleNumberingContext &
getManglingNumberContext(const DeclContext * DC)12659 ASTContext::getManglingNumberContext(const DeclContext *DC) {
12660   assert(LangOpts.CPlusPlus);  // We don't need mangling numbers for plain C.
12661   std::unique_ptr<MangleNumberingContext> &MCtx = MangleNumberingContexts[DC];
12662   if (!MCtx)
12663     MCtx = createMangleNumberingContext();
12664   return *MCtx;
12665 }
12666 
12667 MangleNumberingContext &
getManglingNumberContext(NeedExtraManglingDecl_t,const Decl * D)12668 ASTContext::getManglingNumberContext(NeedExtraManglingDecl_t, const Decl *D) {
12669   assert(LangOpts.CPlusPlus); // We don't need mangling numbers for plain C.
12670   std::unique_ptr<MangleNumberingContext> &MCtx =
12671       ExtraMangleNumberingContexts[D];
12672   if (!MCtx)
12673     MCtx = createMangleNumberingContext();
12674   return *MCtx;
12675 }
12676 
12677 std::unique_ptr<MangleNumberingContext>
createMangleNumberingContext() const12678 ASTContext::createMangleNumberingContext() const {
12679   return ABI->createMangleNumberingContext();
12680 }
12681 
12682 const CXXConstructorDecl *
getCopyConstructorForExceptionObject(CXXRecordDecl * RD)12683 ASTContext::getCopyConstructorForExceptionObject(CXXRecordDecl *RD) {
12684   return ABI->getCopyConstructorForExceptionObject(
12685       cast<CXXRecordDecl>(RD->getFirstDecl()));
12686 }
12687 
addCopyConstructorForExceptionObject(CXXRecordDecl * RD,CXXConstructorDecl * CD)12688 void ASTContext::addCopyConstructorForExceptionObject(CXXRecordDecl *RD,
12689                                                       CXXConstructorDecl *CD) {
12690   return ABI->addCopyConstructorForExceptionObject(
12691       cast<CXXRecordDecl>(RD->getFirstDecl()),
12692       cast<CXXConstructorDecl>(CD->getFirstDecl()));
12693 }
12694 
addTypedefNameForUnnamedTagDecl(TagDecl * TD,TypedefNameDecl * DD)12695 void ASTContext::addTypedefNameForUnnamedTagDecl(TagDecl *TD,
12696                                                  TypedefNameDecl *DD) {
12697   return ABI->addTypedefNameForUnnamedTagDecl(TD, DD);
12698 }
12699 
12700 TypedefNameDecl *
getTypedefNameForUnnamedTagDecl(const TagDecl * TD)12701 ASTContext::getTypedefNameForUnnamedTagDecl(const TagDecl *TD) {
12702   return ABI->getTypedefNameForUnnamedTagDecl(TD);
12703 }
12704 
addDeclaratorForUnnamedTagDecl(TagDecl * TD,DeclaratorDecl * DD)12705 void ASTContext::addDeclaratorForUnnamedTagDecl(TagDecl *TD,
12706                                                 DeclaratorDecl *DD) {
12707   return ABI->addDeclaratorForUnnamedTagDecl(TD, DD);
12708 }
12709 
getDeclaratorForUnnamedTagDecl(const TagDecl * TD)12710 DeclaratorDecl *ASTContext::getDeclaratorForUnnamedTagDecl(const TagDecl *TD) {
12711   return ABI->getDeclaratorForUnnamedTagDecl(TD);
12712 }
12713 
setParameterIndex(const ParmVarDecl * D,unsigned int index)12714 void ASTContext::setParameterIndex(const ParmVarDecl *D, unsigned int index) {
12715   ParamIndices[D] = index;
12716 }
12717 
getParameterIndex(const ParmVarDecl * D) const12718 unsigned ASTContext::getParameterIndex(const ParmVarDecl *D) const {
12719   ParameterIndexTable::const_iterator I = ParamIndices.find(D);
12720   assert(I != ParamIndices.end() &&
12721          "ParmIndices lacks entry set by ParmVarDecl");
12722   return I->second;
12723 }
12724 
getStringLiteralArrayType(QualType EltTy,unsigned Length) const12725 QualType ASTContext::getStringLiteralArrayType(QualType EltTy,
12726                                                unsigned Length) const {
12727   // A C++ string literal has a const-qualified element type (C++ 2.13.4p1).
12728   if (getLangOpts().CPlusPlus || getLangOpts().ConstStrings)
12729     EltTy = EltTy.withConst();
12730 
12731   EltTy = adjustStringLiteralBaseType(EltTy);
12732 
12733   // Get an array type for the string, according to C99 6.4.5. This includes
12734   // the null terminator character.
12735   return getConstantArrayType(EltTy, llvm::APInt(32, Length + 1), nullptr,
12736                               ArraySizeModifier::Normal, /*IndexTypeQuals*/ 0);
12737 }
12738 
12739 StringLiteral *
getPredefinedStringLiteralFromCache(StringRef Key) const12740 ASTContext::getPredefinedStringLiteralFromCache(StringRef Key) const {
12741   StringLiteral *&Result = StringLiteralCache[Key];
12742   if (!Result)
12743     Result = StringLiteral::Create(
12744         *this, Key, StringLiteralKind::Ordinary,
12745         /*Pascal*/ false, getStringLiteralArrayType(CharTy, Key.size()),
12746         SourceLocation());
12747   return Result;
12748 }
12749 
12750 MSGuidDecl *
getMSGuidDecl(MSGuidDecl::Parts Parts) const12751 ASTContext::getMSGuidDecl(MSGuidDecl::Parts Parts) const {
12752   assert(MSGuidTagDecl && "building MS GUID without MS extensions?");
12753 
12754   llvm::FoldingSetNodeID ID;
12755   MSGuidDecl::Profile(ID, Parts);
12756 
12757   void *InsertPos;
12758   if (MSGuidDecl *Existing = MSGuidDecls.FindNodeOrInsertPos(ID, InsertPos))
12759     return Existing;
12760 
12761   QualType GUIDType = getMSGuidType().withConst();
12762   MSGuidDecl *New = MSGuidDecl::Create(*this, GUIDType, Parts);
12763   MSGuidDecls.InsertNode(New, InsertPos);
12764   return New;
12765 }
12766 
12767 UnnamedGlobalConstantDecl *
getUnnamedGlobalConstantDecl(QualType Ty,const APValue & APVal) const12768 ASTContext::getUnnamedGlobalConstantDecl(QualType Ty,
12769                                          const APValue &APVal) const {
12770   llvm::FoldingSetNodeID ID;
12771   UnnamedGlobalConstantDecl::Profile(ID, Ty, APVal);
12772 
12773   void *InsertPos;
12774   if (UnnamedGlobalConstantDecl *Existing =
12775           UnnamedGlobalConstantDecls.FindNodeOrInsertPos(ID, InsertPos))
12776     return Existing;
12777 
12778   UnnamedGlobalConstantDecl *New =
12779       UnnamedGlobalConstantDecl::Create(*this, Ty, APVal);
12780   UnnamedGlobalConstantDecls.InsertNode(New, InsertPos);
12781   return New;
12782 }
12783 
12784 TemplateParamObjectDecl *
getTemplateParamObjectDecl(QualType T,const APValue & V) const12785 ASTContext::getTemplateParamObjectDecl(QualType T, const APValue &V) const {
12786   assert(T->isRecordType() && "template param object of unexpected type");
12787 
12788   // C++ [temp.param]p8:
12789   //   [...] a static storage duration object of type 'const T' [...]
12790   T.addConst();
12791 
12792   llvm::FoldingSetNodeID ID;
12793   TemplateParamObjectDecl::Profile(ID, T, V);
12794 
12795   void *InsertPos;
12796   if (TemplateParamObjectDecl *Existing =
12797           TemplateParamObjectDecls.FindNodeOrInsertPos(ID, InsertPos))
12798     return Existing;
12799 
12800   TemplateParamObjectDecl *New = TemplateParamObjectDecl::Create(*this, T, V);
12801   TemplateParamObjectDecls.InsertNode(New, InsertPos);
12802   return New;
12803 }
12804 
AtomicUsesUnsupportedLibcall(const AtomicExpr * E) const12805 bool ASTContext::AtomicUsesUnsupportedLibcall(const AtomicExpr *E) const {
12806   const llvm::Triple &T = getTargetInfo().getTriple();
12807   if (!T.isOSDarwin())
12808     return false;
12809 
12810   if (!(T.isiOS() && T.isOSVersionLT(7)) &&
12811       !(T.isMacOSX() && T.isOSVersionLT(10, 9)))
12812     return false;
12813 
12814   QualType AtomicTy = E->getPtr()->getType()->getPointeeType();
12815   CharUnits sizeChars = getTypeSizeInChars(AtomicTy);
12816   uint64_t Size = sizeChars.getQuantity();
12817   CharUnits alignChars = getTypeAlignInChars(AtomicTy);
12818   unsigned Align = alignChars.getQuantity();
12819   unsigned MaxInlineWidthInBits = getTargetInfo().getMaxAtomicInlineWidth();
12820   return (Size != Align || toBits(sizeChars) > MaxInlineWidthInBits);
12821 }
12822 
12823 bool
ObjCMethodsAreEqual(const ObjCMethodDecl * MethodDecl,const ObjCMethodDecl * MethodImpl)12824 ASTContext::ObjCMethodsAreEqual(const ObjCMethodDecl *MethodDecl,
12825                                 const ObjCMethodDecl *MethodImpl) {
12826   // No point trying to match an unavailable/deprecated mothod.
12827   if (MethodDecl->hasAttr<UnavailableAttr>()
12828       || MethodDecl->hasAttr<DeprecatedAttr>())
12829     return false;
12830   if (MethodDecl->getObjCDeclQualifier() !=
12831       MethodImpl->getObjCDeclQualifier())
12832     return false;
12833   if (!hasSameType(MethodDecl->getReturnType(), MethodImpl->getReturnType()))
12834     return false;
12835 
12836   if (MethodDecl->param_size() != MethodImpl->param_size())
12837     return false;
12838 
12839   for (ObjCMethodDecl::param_const_iterator IM = MethodImpl->param_begin(),
12840        IF = MethodDecl->param_begin(), EM = MethodImpl->param_end(),
12841        EF = MethodDecl->param_end();
12842        IM != EM && IF != EF; ++IM, ++IF) {
12843     const ParmVarDecl *DeclVar = (*IF);
12844     const ParmVarDecl *ImplVar = (*IM);
12845     if (ImplVar->getObjCDeclQualifier() != DeclVar->getObjCDeclQualifier())
12846       return false;
12847     if (!hasSameType(DeclVar->getType(), ImplVar->getType()))
12848       return false;
12849   }
12850 
12851   return (MethodDecl->isVariadic() == MethodImpl->isVariadic());
12852 }
12853 
getTargetNullPointerValue(QualType QT) const12854 uint64_t ASTContext::getTargetNullPointerValue(QualType QT) const {
12855   LangAS AS;
12856   if (QT->getUnqualifiedDesugaredType()->isNullPtrType())
12857     AS = LangAS::Default;
12858   else
12859     AS = QT->getPointeeType().getAddressSpace();
12860 
12861   return getTargetInfo().getNullPointerValue(AS);
12862 }
12863 
getTargetAddressSpace(LangAS AS) const12864 unsigned ASTContext::getTargetAddressSpace(LangAS AS) const {
12865   return getTargetInfo().getTargetAddressSpace(AS);
12866 }
12867 
hasSameExpr(const Expr * X,const Expr * Y) const12868 bool ASTContext::hasSameExpr(const Expr *X, const Expr *Y) const {
12869   if (X == Y)
12870     return true;
12871   if (!X || !Y)
12872     return false;
12873   llvm::FoldingSetNodeID IDX, IDY;
12874   X->Profile(IDX, *this, /*Canonical=*/true);
12875   Y->Profile(IDY, *this, /*Canonical=*/true);
12876   return IDX == IDY;
12877 }
12878 
12879 // The getCommon* helpers return, for given 'same' X and Y entities given as
12880 // inputs, another entity which is also the 'same' as the inputs, but which
12881 // is closer to the canonical form of the inputs, each according to a given
12882 // criteria.
12883 // The getCommon*Checked variants are 'null inputs not-allowed' equivalents of
12884 // the regular ones.
12885 
getCommonDecl(Decl * X,Decl * Y)12886 static Decl *getCommonDecl(Decl *X, Decl *Y) {
12887   if (!declaresSameEntity(X, Y))
12888     return nullptr;
12889   for (const Decl *DX : X->redecls()) {
12890     // If we reach Y before reaching the first decl, that means X is older.
12891     if (DX == Y)
12892       return X;
12893     // If we reach the first decl, then Y is older.
12894     if (DX->isFirstDecl())
12895       return Y;
12896   }
12897   llvm_unreachable("Corrupt redecls chain");
12898 }
12899 
12900 template <class T, std::enable_if_t<std::is_base_of_v<Decl, T>, bool> = true>
getCommonDecl(T * X,T * Y)12901 static T *getCommonDecl(T *X, T *Y) {
12902   return cast_or_null<T>(
12903       getCommonDecl(const_cast<Decl *>(cast_or_null<Decl>(X)),
12904                     const_cast<Decl *>(cast_or_null<Decl>(Y))));
12905 }
12906 
12907 template <class T, std::enable_if_t<std::is_base_of_v<Decl, T>, bool> = true>
getCommonDeclChecked(T * X,T * Y)12908 static T *getCommonDeclChecked(T *X, T *Y) {
12909   return cast<T>(getCommonDecl(const_cast<Decl *>(cast<Decl>(X)),
12910                                const_cast<Decl *>(cast<Decl>(Y))));
12911 }
12912 
getCommonTemplateName(ASTContext & Ctx,TemplateName X,TemplateName Y)12913 static TemplateName getCommonTemplateName(ASTContext &Ctx, TemplateName X,
12914                                           TemplateName Y) {
12915   if (X.getAsVoidPointer() == Y.getAsVoidPointer())
12916     return X;
12917   // FIXME: There are cases here where we could find a common template name
12918   //        with more sugar. For example one could be a SubstTemplateTemplate*
12919   //        replacing the other.
12920   TemplateName CX = Ctx.getCanonicalTemplateName(X);
12921   if (CX.getAsVoidPointer() !=
12922       Ctx.getCanonicalTemplateName(Y).getAsVoidPointer())
12923     return TemplateName();
12924   return CX;
12925 }
12926 
12927 static TemplateName
getCommonTemplateNameChecked(ASTContext & Ctx,TemplateName X,TemplateName Y)12928 getCommonTemplateNameChecked(ASTContext &Ctx, TemplateName X, TemplateName Y) {
12929   TemplateName R = getCommonTemplateName(Ctx, X, Y);
12930   assert(R.getAsVoidPointer() != nullptr);
12931   return R;
12932 }
12933 
getCommonTypes(ASTContext & Ctx,ArrayRef<QualType> Xs,ArrayRef<QualType> Ys,bool Unqualified=false)12934 static auto getCommonTypes(ASTContext &Ctx, ArrayRef<QualType> Xs,
12935                            ArrayRef<QualType> Ys, bool Unqualified = false) {
12936   assert(Xs.size() == Ys.size());
12937   SmallVector<QualType, 8> Rs(Xs.size());
12938   for (size_t I = 0; I < Rs.size(); ++I)
12939     Rs[I] = Ctx.getCommonSugaredType(Xs[I], Ys[I], Unqualified);
12940   return Rs;
12941 }
12942 
12943 template <class T>
getCommonAttrLoc(const T * X,const T * Y)12944 static SourceLocation getCommonAttrLoc(const T *X, const T *Y) {
12945   return X->getAttributeLoc() == Y->getAttributeLoc() ? X->getAttributeLoc()
12946                                                       : SourceLocation();
12947 }
12948 
getCommonTemplateArgument(ASTContext & Ctx,const TemplateArgument & X,const TemplateArgument & Y)12949 static TemplateArgument getCommonTemplateArgument(ASTContext &Ctx,
12950                                                   const TemplateArgument &X,
12951                                                   const TemplateArgument &Y) {
12952   if (X.getKind() != Y.getKind())
12953     return TemplateArgument();
12954 
12955   switch (X.getKind()) {
12956   case TemplateArgument::ArgKind::Type:
12957     if (!Ctx.hasSameType(X.getAsType(), Y.getAsType()))
12958       return TemplateArgument();
12959     return TemplateArgument(
12960         Ctx.getCommonSugaredType(X.getAsType(), Y.getAsType()));
12961   case TemplateArgument::ArgKind::NullPtr:
12962     if (!Ctx.hasSameType(X.getNullPtrType(), Y.getNullPtrType()))
12963       return TemplateArgument();
12964     return TemplateArgument(
12965         Ctx.getCommonSugaredType(X.getNullPtrType(), Y.getNullPtrType()),
12966         /*Unqualified=*/true);
12967   case TemplateArgument::ArgKind::Expression:
12968     if (!Ctx.hasSameType(X.getAsExpr()->getType(), Y.getAsExpr()->getType()))
12969       return TemplateArgument();
12970     // FIXME: Try to keep the common sugar.
12971     return X;
12972   case TemplateArgument::ArgKind::Template: {
12973     TemplateName TX = X.getAsTemplate(), TY = Y.getAsTemplate();
12974     TemplateName CTN = ::getCommonTemplateName(Ctx, TX, TY);
12975     if (!CTN.getAsVoidPointer())
12976       return TemplateArgument();
12977     return TemplateArgument(CTN);
12978   }
12979   case TemplateArgument::ArgKind::TemplateExpansion: {
12980     TemplateName TX = X.getAsTemplateOrTemplatePattern(),
12981                  TY = Y.getAsTemplateOrTemplatePattern();
12982     TemplateName CTN = ::getCommonTemplateName(Ctx, TX, TY);
12983     if (!CTN.getAsVoidPointer())
12984       return TemplateName();
12985     auto NExpX = X.getNumTemplateExpansions();
12986     assert(NExpX == Y.getNumTemplateExpansions());
12987     return TemplateArgument(CTN, NExpX);
12988   }
12989   default:
12990     // FIXME: Handle the other argument kinds.
12991     return X;
12992   }
12993 }
12994 
getCommonTemplateArguments(ASTContext & Ctx,SmallVectorImpl<TemplateArgument> & R,ArrayRef<TemplateArgument> Xs,ArrayRef<TemplateArgument> Ys)12995 static bool getCommonTemplateArguments(ASTContext &Ctx,
12996                                        SmallVectorImpl<TemplateArgument> &R,
12997                                        ArrayRef<TemplateArgument> Xs,
12998                                        ArrayRef<TemplateArgument> Ys) {
12999   if (Xs.size() != Ys.size())
13000     return true;
13001   R.resize(Xs.size());
13002   for (size_t I = 0; I < R.size(); ++I) {
13003     R[I] = getCommonTemplateArgument(Ctx, Xs[I], Ys[I]);
13004     if (R[I].isNull())
13005       return true;
13006   }
13007   return false;
13008 }
13009 
getCommonTemplateArguments(ASTContext & Ctx,ArrayRef<TemplateArgument> Xs,ArrayRef<TemplateArgument> Ys)13010 static auto getCommonTemplateArguments(ASTContext &Ctx,
13011                                        ArrayRef<TemplateArgument> Xs,
13012                                        ArrayRef<TemplateArgument> Ys) {
13013   SmallVector<TemplateArgument, 8> R;
13014   bool Different = getCommonTemplateArguments(Ctx, R, Xs, Ys);
13015   assert(!Different);
13016   (void)Different;
13017   return R;
13018 }
13019 
13020 template <class T>
getCommonTypeKeyword(const T * X,const T * Y)13021 static ElaboratedTypeKeyword getCommonTypeKeyword(const T *X, const T *Y) {
13022   return X->getKeyword() == Y->getKeyword() ? X->getKeyword()
13023                                             : ElaboratedTypeKeyword::None;
13024 }
13025 
13026 template <class T>
getCommonNNS(ASTContext & Ctx,const T * X,const T * Y)13027 static NestedNameSpecifier *getCommonNNS(ASTContext &Ctx, const T *X,
13028                                          const T *Y) {
13029   // FIXME: Try to keep the common NNS sugar.
13030   return X->getQualifier() == Y->getQualifier()
13031              ? X->getQualifier()
13032              : Ctx.getCanonicalNestedNameSpecifier(X->getQualifier());
13033 }
13034 
13035 template <class T>
getCommonElementType(ASTContext & Ctx,const T * X,const T * Y)13036 static QualType getCommonElementType(ASTContext &Ctx, const T *X, const T *Y) {
13037   return Ctx.getCommonSugaredType(X->getElementType(), Y->getElementType());
13038 }
13039 
13040 template <class T>
getCommonArrayElementType(ASTContext & Ctx,const T * X,Qualifiers & QX,const T * Y,Qualifiers & QY)13041 static QualType getCommonArrayElementType(ASTContext &Ctx, const T *X,
13042                                           Qualifiers &QX, const T *Y,
13043                                           Qualifiers &QY) {
13044   QualType EX = X->getElementType(), EY = Y->getElementType();
13045   QualType R = Ctx.getCommonSugaredType(EX, EY,
13046                                         /*Unqualified=*/true);
13047   Qualifiers RQ = R.getQualifiers();
13048   QX += EX.getQualifiers() - RQ;
13049   QY += EY.getQualifiers() - RQ;
13050   return R;
13051 }
13052 
13053 template <class T>
getCommonPointeeType(ASTContext & Ctx,const T * X,const T * Y)13054 static QualType getCommonPointeeType(ASTContext &Ctx, const T *X, const T *Y) {
13055   return Ctx.getCommonSugaredType(X->getPointeeType(), Y->getPointeeType());
13056 }
13057 
getCommonSizeExpr(ASTContext & Ctx,T * X,T * Y)13058 template <class T> static auto *getCommonSizeExpr(ASTContext &Ctx, T *X, T *Y) {
13059   assert(Ctx.hasSameExpr(X->getSizeExpr(), Y->getSizeExpr()));
13060   return X->getSizeExpr();
13061 }
13062 
getCommonSizeModifier(const ArrayType * X,const ArrayType * Y)13063 static auto getCommonSizeModifier(const ArrayType *X, const ArrayType *Y) {
13064   assert(X->getSizeModifier() == Y->getSizeModifier());
13065   return X->getSizeModifier();
13066 }
13067 
getCommonIndexTypeCVRQualifiers(const ArrayType * X,const ArrayType * Y)13068 static auto getCommonIndexTypeCVRQualifiers(const ArrayType *X,
13069                                             const ArrayType *Y) {
13070   assert(X->getIndexTypeCVRQualifiers() == Y->getIndexTypeCVRQualifiers());
13071   return X->getIndexTypeCVRQualifiers();
13072 }
13073 
13074 // Merges two type lists such that the resulting vector will contain
13075 // each type (in a canonical sense) only once, in the order they appear
13076 // from X to Y. If they occur in both X and Y, the result will contain
13077 // the common sugared type between them.
mergeTypeLists(ASTContext & Ctx,SmallVectorImpl<QualType> & Out,ArrayRef<QualType> X,ArrayRef<QualType> Y)13078 static void mergeTypeLists(ASTContext &Ctx, SmallVectorImpl<QualType> &Out,
13079                            ArrayRef<QualType> X, ArrayRef<QualType> Y) {
13080   llvm::DenseMap<QualType, unsigned> Found;
13081   for (auto Ts : {X, Y}) {
13082     for (QualType T : Ts) {
13083       auto Res = Found.try_emplace(Ctx.getCanonicalType(T), Out.size());
13084       if (!Res.second) {
13085         QualType &U = Out[Res.first->second];
13086         U = Ctx.getCommonSugaredType(U, T);
13087       } else {
13088         Out.emplace_back(T);
13089       }
13090     }
13091   }
13092 }
13093 
13094 FunctionProtoType::ExceptionSpecInfo
mergeExceptionSpecs(FunctionProtoType::ExceptionSpecInfo ESI1,FunctionProtoType::ExceptionSpecInfo ESI2,SmallVectorImpl<QualType> & ExceptionTypeStorage,bool AcceptDependent)13095 ASTContext::mergeExceptionSpecs(FunctionProtoType::ExceptionSpecInfo ESI1,
13096                                 FunctionProtoType::ExceptionSpecInfo ESI2,
13097                                 SmallVectorImpl<QualType> &ExceptionTypeStorage,
13098                                 bool AcceptDependent) {
13099   ExceptionSpecificationType EST1 = ESI1.Type, EST2 = ESI2.Type;
13100 
13101   // If either of them can throw anything, that is the result.
13102   for (auto I : {EST_None, EST_MSAny, EST_NoexceptFalse}) {
13103     if (EST1 == I)
13104       return ESI1;
13105     if (EST2 == I)
13106       return ESI2;
13107   }
13108 
13109   // If either of them is non-throwing, the result is the other.
13110   for (auto I :
13111        {EST_NoThrow, EST_DynamicNone, EST_BasicNoexcept, EST_NoexceptTrue}) {
13112     if (EST1 == I)
13113       return ESI2;
13114     if (EST2 == I)
13115       return ESI1;
13116   }
13117 
13118   // If we're left with value-dependent computed noexcept expressions, we're
13119   // stuck. Before C++17, we can just drop the exception specification entirely,
13120   // since it's not actually part of the canonical type. And this should never
13121   // happen in C++17, because it would mean we were computing the composite
13122   // pointer type of dependent types, which should never happen.
13123   if (EST1 == EST_DependentNoexcept || EST2 == EST_DependentNoexcept) {
13124     assert(AcceptDependent &&
13125            "computing composite pointer type of dependent types");
13126     return FunctionProtoType::ExceptionSpecInfo();
13127   }
13128 
13129   // Switch over the possibilities so that people adding new values know to
13130   // update this function.
13131   switch (EST1) {
13132   case EST_None:
13133   case EST_DynamicNone:
13134   case EST_MSAny:
13135   case EST_BasicNoexcept:
13136   case EST_DependentNoexcept:
13137   case EST_NoexceptFalse:
13138   case EST_NoexceptTrue:
13139   case EST_NoThrow:
13140     llvm_unreachable("These ESTs should be handled above");
13141 
13142   case EST_Dynamic: {
13143     // This is the fun case: both exception specifications are dynamic. Form
13144     // the union of the two lists.
13145     assert(EST2 == EST_Dynamic && "other cases should already be handled");
13146     mergeTypeLists(*this, ExceptionTypeStorage, ESI1.Exceptions,
13147                    ESI2.Exceptions);
13148     FunctionProtoType::ExceptionSpecInfo Result(EST_Dynamic);
13149     Result.Exceptions = ExceptionTypeStorage;
13150     return Result;
13151   }
13152 
13153   case EST_Unevaluated:
13154   case EST_Uninstantiated:
13155   case EST_Unparsed:
13156     llvm_unreachable("shouldn't see unresolved exception specifications here");
13157   }
13158 
13159   llvm_unreachable("invalid ExceptionSpecificationType");
13160 }
13161 
getCommonNonSugarTypeNode(ASTContext & Ctx,const Type * X,Qualifiers & QX,const Type * Y,Qualifiers & QY)13162 static QualType getCommonNonSugarTypeNode(ASTContext &Ctx, const Type *X,
13163                                           Qualifiers &QX, const Type *Y,
13164                                           Qualifiers &QY) {
13165   Type::TypeClass TC = X->getTypeClass();
13166   assert(TC == Y->getTypeClass());
13167   switch (TC) {
13168 #define UNEXPECTED_TYPE(Class, Kind)                                           \
13169   case Type::Class:                                                            \
13170     llvm_unreachable("Unexpected " Kind ": " #Class);
13171 
13172 #define NON_CANONICAL_TYPE(Class, Base) UNEXPECTED_TYPE(Class, "non-canonical")
13173 #define TYPE(Class, Base)
13174 #include "clang/AST/TypeNodes.inc"
13175 
13176 #define SUGAR_FREE_TYPE(Class) UNEXPECTED_TYPE(Class, "sugar-free")
13177     SUGAR_FREE_TYPE(Builtin)
13178     SUGAR_FREE_TYPE(DeducedTemplateSpecialization)
13179     SUGAR_FREE_TYPE(DependentBitInt)
13180     SUGAR_FREE_TYPE(Enum)
13181     SUGAR_FREE_TYPE(BitInt)
13182     SUGAR_FREE_TYPE(ObjCInterface)
13183     SUGAR_FREE_TYPE(Record)
13184     SUGAR_FREE_TYPE(SubstTemplateTypeParmPack)
13185     SUGAR_FREE_TYPE(UnresolvedUsing)
13186 #undef SUGAR_FREE_TYPE
13187 #define NON_UNIQUE_TYPE(Class) UNEXPECTED_TYPE(Class, "non-unique")
13188     NON_UNIQUE_TYPE(TypeOfExpr)
13189     NON_UNIQUE_TYPE(VariableArray)
13190 #undef NON_UNIQUE_TYPE
13191 
13192     UNEXPECTED_TYPE(TypeOf, "sugar")
13193 
13194 #undef UNEXPECTED_TYPE
13195 
13196   case Type::Auto: {
13197     const auto *AX = cast<AutoType>(X), *AY = cast<AutoType>(Y);
13198     assert(AX->getDeducedType().isNull());
13199     assert(AY->getDeducedType().isNull());
13200     assert(AX->getKeyword() == AY->getKeyword());
13201     assert(AX->isInstantiationDependentType() ==
13202            AY->isInstantiationDependentType());
13203     auto As = getCommonTemplateArguments(Ctx, AX->getTypeConstraintArguments(),
13204                                          AY->getTypeConstraintArguments());
13205     return Ctx.getAutoType(QualType(), AX->getKeyword(),
13206                            AX->isInstantiationDependentType(),
13207                            AX->containsUnexpandedParameterPack(),
13208                            getCommonDeclChecked(AX->getTypeConstraintConcept(),
13209                                                 AY->getTypeConstraintConcept()),
13210                            As);
13211   }
13212   case Type::IncompleteArray: {
13213     const auto *AX = cast<IncompleteArrayType>(X),
13214                *AY = cast<IncompleteArrayType>(Y);
13215     return Ctx.getIncompleteArrayType(
13216         getCommonArrayElementType(Ctx, AX, QX, AY, QY),
13217         getCommonSizeModifier(AX, AY), getCommonIndexTypeCVRQualifiers(AX, AY));
13218   }
13219   case Type::DependentSizedArray: {
13220     const auto *AX = cast<DependentSizedArrayType>(X),
13221                *AY = cast<DependentSizedArrayType>(Y);
13222     return Ctx.getDependentSizedArrayType(
13223         getCommonArrayElementType(Ctx, AX, QX, AY, QY),
13224         getCommonSizeExpr(Ctx, AX, AY), getCommonSizeModifier(AX, AY),
13225         getCommonIndexTypeCVRQualifiers(AX, AY),
13226         AX->getBracketsRange() == AY->getBracketsRange()
13227             ? AX->getBracketsRange()
13228             : SourceRange());
13229   }
13230   case Type::ConstantArray: {
13231     const auto *AX = cast<ConstantArrayType>(X),
13232                *AY = cast<ConstantArrayType>(Y);
13233     assert(AX->getSize() == AY->getSize());
13234     const Expr *SizeExpr = Ctx.hasSameExpr(AX->getSizeExpr(), AY->getSizeExpr())
13235                                ? AX->getSizeExpr()
13236                                : nullptr;
13237     return Ctx.getConstantArrayType(
13238         getCommonArrayElementType(Ctx, AX, QX, AY, QY), AX->getSize(), SizeExpr,
13239         getCommonSizeModifier(AX, AY), getCommonIndexTypeCVRQualifiers(AX, AY));
13240   }
13241   case Type::ArrayParameter: {
13242     const auto *AX = cast<ArrayParameterType>(X),
13243                *AY = cast<ArrayParameterType>(Y);
13244     assert(AX->getSize() == AY->getSize());
13245     const Expr *SizeExpr = Ctx.hasSameExpr(AX->getSizeExpr(), AY->getSizeExpr())
13246                                ? AX->getSizeExpr()
13247                                : nullptr;
13248     auto ArrayTy = Ctx.getConstantArrayType(
13249         getCommonArrayElementType(Ctx, AX, QX, AY, QY), AX->getSize(), SizeExpr,
13250         getCommonSizeModifier(AX, AY), getCommonIndexTypeCVRQualifiers(AX, AY));
13251     return Ctx.getArrayParameterType(ArrayTy);
13252   }
13253   case Type::Atomic: {
13254     const auto *AX = cast<AtomicType>(X), *AY = cast<AtomicType>(Y);
13255     return Ctx.getAtomicType(
13256         Ctx.getCommonSugaredType(AX->getValueType(), AY->getValueType()));
13257   }
13258   case Type::Complex: {
13259     const auto *CX = cast<ComplexType>(X), *CY = cast<ComplexType>(Y);
13260     return Ctx.getComplexType(getCommonArrayElementType(Ctx, CX, QX, CY, QY));
13261   }
13262   case Type::Pointer: {
13263     const auto *PX = cast<PointerType>(X), *PY = cast<PointerType>(Y);
13264     return Ctx.getPointerType(getCommonPointeeType(Ctx, PX, PY));
13265   }
13266   case Type::BlockPointer: {
13267     const auto *PX = cast<BlockPointerType>(X), *PY = cast<BlockPointerType>(Y);
13268     return Ctx.getBlockPointerType(getCommonPointeeType(Ctx, PX, PY));
13269   }
13270   case Type::ObjCObjectPointer: {
13271     const auto *PX = cast<ObjCObjectPointerType>(X),
13272                *PY = cast<ObjCObjectPointerType>(Y);
13273     return Ctx.getObjCObjectPointerType(getCommonPointeeType(Ctx, PX, PY));
13274   }
13275   case Type::MemberPointer: {
13276     const auto *PX = cast<MemberPointerType>(X),
13277                *PY = cast<MemberPointerType>(Y);
13278     return Ctx.getMemberPointerType(
13279         getCommonPointeeType(Ctx, PX, PY),
13280         Ctx.getCommonSugaredType(QualType(PX->getClass(), 0),
13281                                  QualType(PY->getClass(), 0))
13282             .getTypePtr());
13283   }
13284   case Type::LValueReference: {
13285     const auto *PX = cast<LValueReferenceType>(X),
13286                *PY = cast<LValueReferenceType>(Y);
13287     // FIXME: Preserve PointeeTypeAsWritten.
13288     return Ctx.getLValueReferenceType(getCommonPointeeType(Ctx, PX, PY),
13289                                       PX->isSpelledAsLValue() ||
13290                                           PY->isSpelledAsLValue());
13291   }
13292   case Type::RValueReference: {
13293     const auto *PX = cast<RValueReferenceType>(X),
13294                *PY = cast<RValueReferenceType>(Y);
13295     // FIXME: Preserve PointeeTypeAsWritten.
13296     return Ctx.getRValueReferenceType(getCommonPointeeType(Ctx, PX, PY));
13297   }
13298   case Type::DependentAddressSpace: {
13299     const auto *PX = cast<DependentAddressSpaceType>(X),
13300                *PY = cast<DependentAddressSpaceType>(Y);
13301     assert(Ctx.hasSameExpr(PX->getAddrSpaceExpr(), PY->getAddrSpaceExpr()));
13302     return Ctx.getDependentAddressSpaceType(getCommonPointeeType(Ctx, PX, PY),
13303                                             PX->getAddrSpaceExpr(),
13304                                             getCommonAttrLoc(PX, PY));
13305   }
13306   case Type::FunctionNoProto: {
13307     const auto *FX = cast<FunctionNoProtoType>(X),
13308                *FY = cast<FunctionNoProtoType>(Y);
13309     assert(FX->getExtInfo() == FY->getExtInfo());
13310     return Ctx.getFunctionNoProtoType(
13311         Ctx.getCommonSugaredType(FX->getReturnType(), FY->getReturnType()),
13312         FX->getExtInfo());
13313   }
13314   case Type::FunctionProto: {
13315     const auto *FX = cast<FunctionProtoType>(X),
13316                *FY = cast<FunctionProtoType>(Y);
13317     FunctionProtoType::ExtProtoInfo EPIX = FX->getExtProtoInfo(),
13318                                     EPIY = FY->getExtProtoInfo();
13319     assert(EPIX.ExtInfo == EPIY.ExtInfo);
13320     assert(EPIX.ExtParameterInfos == EPIY.ExtParameterInfos);
13321     assert(EPIX.RefQualifier == EPIY.RefQualifier);
13322     assert(EPIX.TypeQuals == EPIY.TypeQuals);
13323     assert(EPIX.Variadic == EPIY.Variadic);
13324 
13325     // FIXME: Can we handle an empty EllipsisLoc?
13326     //        Use emtpy EllipsisLoc if X and Y differ.
13327 
13328     EPIX.HasTrailingReturn = EPIX.HasTrailingReturn && EPIY.HasTrailingReturn;
13329 
13330     QualType R =
13331         Ctx.getCommonSugaredType(FX->getReturnType(), FY->getReturnType());
13332     auto P = getCommonTypes(Ctx, FX->param_types(), FY->param_types(),
13333                             /*Unqualified=*/true);
13334 
13335     SmallVector<QualType, 8> Exceptions;
13336     EPIX.ExceptionSpec = Ctx.mergeExceptionSpecs(
13337         EPIX.ExceptionSpec, EPIY.ExceptionSpec, Exceptions, true);
13338     return Ctx.getFunctionType(R, P, EPIX);
13339   }
13340   case Type::ObjCObject: {
13341     const auto *OX = cast<ObjCObjectType>(X), *OY = cast<ObjCObjectType>(Y);
13342     assert(
13343         std::equal(OX->getProtocols().begin(), OX->getProtocols().end(),
13344                    OY->getProtocols().begin(), OY->getProtocols().end(),
13345                    [](const ObjCProtocolDecl *P0, const ObjCProtocolDecl *P1) {
13346                      return P0->getCanonicalDecl() == P1->getCanonicalDecl();
13347                    }) &&
13348         "protocol lists must be the same");
13349     auto TAs = getCommonTypes(Ctx, OX->getTypeArgsAsWritten(),
13350                               OY->getTypeArgsAsWritten());
13351     return Ctx.getObjCObjectType(
13352         Ctx.getCommonSugaredType(OX->getBaseType(), OY->getBaseType()), TAs,
13353         OX->getProtocols(),
13354         OX->isKindOfTypeAsWritten() && OY->isKindOfTypeAsWritten());
13355   }
13356   case Type::ConstantMatrix: {
13357     const auto *MX = cast<ConstantMatrixType>(X),
13358                *MY = cast<ConstantMatrixType>(Y);
13359     assert(MX->getNumRows() == MY->getNumRows());
13360     assert(MX->getNumColumns() == MY->getNumColumns());
13361     return Ctx.getConstantMatrixType(getCommonElementType(Ctx, MX, MY),
13362                                      MX->getNumRows(), MX->getNumColumns());
13363   }
13364   case Type::DependentSizedMatrix: {
13365     const auto *MX = cast<DependentSizedMatrixType>(X),
13366                *MY = cast<DependentSizedMatrixType>(Y);
13367     assert(Ctx.hasSameExpr(MX->getRowExpr(), MY->getRowExpr()));
13368     assert(Ctx.hasSameExpr(MX->getColumnExpr(), MY->getColumnExpr()));
13369     return Ctx.getDependentSizedMatrixType(
13370         getCommonElementType(Ctx, MX, MY), MX->getRowExpr(),
13371         MX->getColumnExpr(), getCommonAttrLoc(MX, MY));
13372   }
13373   case Type::Vector: {
13374     const auto *VX = cast<VectorType>(X), *VY = cast<VectorType>(Y);
13375     assert(VX->getNumElements() == VY->getNumElements());
13376     assert(VX->getVectorKind() == VY->getVectorKind());
13377     return Ctx.getVectorType(getCommonElementType(Ctx, VX, VY),
13378                              VX->getNumElements(), VX->getVectorKind());
13379   }
13380   case Type::ExtVector: {
13381     const auto *VX = cast<ExtVectorType>(X), *VY = cast<ExtVectorType>(Y);
13382     assert(VX->getNumElements() == VY->getNumElements());
13383     return Ctx.getExtVectorType(getCommonElementType(Ctx, VX, VY),
13384                                 VX->getNumElements());
13385   }
13386   case Type::DependentSizedExtVector: {
13387     const auto *VX = cast<DependentSizedExtVectorType>(X),
13388                *VY = cast<DependentSizedExtVectorType>(Y);
13389     return Ctx.getDependentSizedExtVectorType(getCommonElementType(Ctx, VX, VY),
13390                                               getCommonSizeExpr(Ctx, VX, VY),
13391                                               getCommonAttrLoc(VX, VY));
13392   }
13393   case Type::DependentVector: {
13394     const auto *VX = cast<DependentVectorType>(X),
13395                *VY = cast<DependentVectorType>(Y);
13396     assert(VX->getVectorKind() == VY->getVectorKind());
13397     return Ctx.getDependentVectorType(
13398         getCommonElementType(Ctx, VX, VY), getCommonSizeExpr(Ctx, VX, VY),
13399         getCommonAttrLoc(VX, VY), VX->getVectorKind());
13400   }
13401   case Type::InjectedClassName: {
13402     const auto *IX = cast<InjectedClassNameType>(X),
13403                *IY = cast<InjectedClassNameType>(Y);
13404     return Ctx.getInjectedClassNameType(
13405         getCommonDeclChecked(IX->getDecl(), IY->getDecl()),
13406         Ctx.getCommonSugaredType(IX->getInjectedSpecializationType(),
13407                                  IY->getInjectedSpecializationType()));
13408   }
13409   case Type::TemplateSpecialization: {
13410     const auto *TX = cast<TemplateSpecializationType>(X),
13411                *TY = cast<TemplateSpecializationType>(Y);
13412     auto As = getCommonTemplateArguments(Ctx, TX->template_arguments(),
13413                                          TY->template_arguments());
13414     return Ctx.getTemplateSpecializationType(
13415         ::getCommonTemplateNameChecked(Ctx, TX->getTemplateName(),
13416                                        TY->getTemplateName()),
13417         As, X->getCanonicalTypeInternal());
13418   }
13419   case Type::Decltype: {
13420     const auto *DX = cast<DecltypeType>(X);
13421     [[maybe_unused]] const auto *DY = cast<DecltypeType>(Y);
13422     assert(DX->isDependentType());
13423     assert(DY->isDependentType());
13424     assert(Ctx.hasSameExpr(DX->getUnderlyingExpr(), DY->getUnderlyingExpr()));
13425     // As Decltype is not uniqued, building a common type would be wasteful.
13426     return QualType(DX, 0);
13427   }
13428   case Type::PackIndexing: {
13429     const auto *DX = cast<PackIndexingType>(X);
13430     [[maybe_unused]] const auto *DY = cast<PackIndexingType>(Y);
13431     assert(DX->isDependentType());
13432     assert(DY->isDependentType());
13433     assert(Ctx.hasSameExpr(DX->getIndexExpr(), DY->getIndexExpr()));
13434     return QualType(DX, 0);
13435   }
13436   case Type::DependentName: {
13437     const auto *NX = cast<DependentNameType>(X),
13438                *NY = cast<DependentNameType>(Y);
13439     assert(NX->getIdentifier() == NY->getIdentifier());
13440     return Ctx.getDependentNameType(
13441         getCommonTypeKeyword(NX, NY), getCommonNNS(Ctx, NX, NY),
13442         NX->getIdentifier(), NX->getCanonicalTypeInternal());
13443   }
13444   case Type::DependentTemplateSpecialization: {
13445     const auto *TX = cast<DependentTemplateSpecializationType>(X),
13446                *TY = cast<DependentTemplateSpecializationType>(Y);
13447     assert(TX->getIdentifier() == TY->getIdentifier());
13448     auto As = getCommonTemplateArguments(Ctx, TX->template_arguments(),
13449                                          TY->template_arguments());
13450     return Ctx.getDependentTemplateSpecializationType(
13451         getCommonTypeKeyword(TX, TY), getCommonNNS(Ctx, TX, TY),
13452         TX->getIdentifier(), As);
13453   }
13454   case Type::UnaryTransform: {
13455     const auto *TX = cast<UnaryTransformType>(X),
13456                *TY = cast<UnaryTransformType>(Y);
13457     assert(TX->getUTTKind() == TY->getUTTKind());
13458     return Ctx.getUnaryTransformType(
13459         Ctx.getCommonSugaredType(TX->getBaseType(), TY->getBaseType()),
13460         Ctx.getCommonSugaredType(TX->getUnderlyingType(),
13461                                  TY->getUnderlyingType()),
13462         TX->getUTTKind());
13463   }
13464   case Type::PackExpansion: {
13465     const auto *PX = cast<PackExpansionType>(X),
13466                *PY = cast<PackExpansionType>(Y);
13467     assert(PX->getNumExpansions() == PY->getNumExpansions());
13468     return Ctx.getPackExpansionType(
13469         Ctx.getCommonSugaredType(PX->getPattern(), PY->getPattern()),
13470         PX->getNumExpansions(), false);
13471   }
13472   case Type::Pipe: {
13473     const auto *PX = cast<PipeType>(X), *PY = cast<PipeType>(Y);
13474     assert(PX->isReadOnly() == PY->isReadOnly());
13475     auto MP = PX->isReadOnly() ? &ASTContext::getReadPipeType
13476                                : &ASTContext::getWritePipeType;
13477     return (Ctx.*MP)(getCommonElementType(Ctx, PX, PY));
13478   }
13479   case Type::TemplateTypeParm: {
13480     const auto *TX = cast<TemplateTypeParmType>(X),
13481                *TY = cast<TemplateTypeParmType>(Y);
13482     assert(TX->getDepth() == TY->getDepth());
13483     assert(TX->getIndex() == TY->getIndex());
13484     assert(TX->isParameterPack() == TY->isParameterPack());
13485     return Ctx.getTemplateTypeParmType(
13486         TX->getDepth(), TX->getIndex(), TX->isParameterPack(),
13487         getCommonDecl(TX->getDecl(), TY->getDecl()));
13488   }
13489   }
13490   llvm_unreachable("Unknown Type Class");
13491 }
13492 
getCommonSugarTypeNode(ASTContext & Ctx,const Type * X,const Type * Y,SplitQualType Underlying)13493 static QualType getCommonSugarTypeNode(ASTContext &Ctx, const Type *X,
13494                                        const Type *Y,
13495                                        SplitQualType Underlying) {
13496   Type::TypeClass TC = X->getTypeClass();
13497   if (TC != Y->getTypeClass())
13498     return QualType();
13499   switch (TC) {
13500 #define UNEXPECTED_TYPE(Class, Kind)                                           \
13501   case Type::Class:                                                            \
13502     llvm_unreachable("Unexpected " Kind ": " #Class);
13503 #define TYPE(Class, Base)
13504 #define DEPENDENT_TYPE(Class, Base) UNEXPECTED_TYPE(Class, "dependent")
13505 #include "clang/AST/TypeNodes.inc"
13506 
13507 #define CANONICAL_TYPE(Class) UNEXPECTED_TYPE(Class, "canonical")
13508     CANONICAL_TYPE(Atomic)
13509     CANONICAL_TYPE(BitInt)
13510     CANONICAL_TYPE(BlockPointer)
13511     CANONICAL_TYPE(Builtin)
13512     CANONICAL_TYPE(Complex)
13513     CANONICAL_TYPE(ConstantArray)
13514     CANONICAL_TYPE(ArrayParameter)
13515     CANONICAL_TYPE(ConstantMatrix)
13516     CANONICAL_TYPE(Enum)
13517     CANONICAL_TYPE(ExtVector)
13518     CANONICAL_TYPE(FunctionNoProto)
13519     CANONICAL_TYPE(FunctionProto)
13520     CANONICAL_TYPE(IncompleteArray)
13521     CANONICAL_TYPE(LValueReference)
13522     CANONICAL_TYPE(MemberPointer)
13523     CANONICAL_TYPE(ObjCInterface)
13524     CANONICAL_TYPE(ObjCObject)
13525     CANONICAL_TYPE(ObjCObjectPointer)
13526     CANONICAL_TYPE(Pipe)
13527     CANONICAL_TYPE(Pointer)
13528     CANONICAL_TYPE(Record)
13529     CANONICAL_TYPE(RValueReference)
13530     CANONICAL_TYPE(VariableArray)
13531     CANONICAL_TYPE(Vector)
13532 #undef CANONICAL_TYPE
13533 
13534 #undef UNEXPECTED_TYPE
13535 
13536   case Type::Adjusted: {
13537     const auto *AX = cast<AdjustedType>(X), *AY = cast<AdjustedType>(Y);
13538     QualType OX = AX->getOriginalType(), OY = AY->getOriginalType();
13539     if (!Ctx.hasSameType(OX, OY))
13540       return QualType();
13541     // FIXME: It's inefficient to have to unify the original types.
13542     return Ctx.getAdjustedType(Ctx.getCommonSugaredType(OX, OY),
13543                                Ctx.getQualifiedType(Underlying));
13544   }
13545   case Type::Decayed: {
13546     const auto *DX = cast<DecayedType>(X), *DY = cast<DecayedType>(Y);
13547     QualType OX = DX->getOriginalType(), OY = DY->getOriginalType();
13548     if (!Ctx.hasSameType(OX, OY))
13549       return QualType();
13550     // FIXME: It's inefficient to have to unify the original types.
13551     return Ctx.getDecayedType(Ctx.getCommonSugaredType(OX, OY),
13552                               Ctx.getQualifiedType(Underlying));
13553   }
13554   case Type::Attributed: {
13555     const auto *AX = cast<AttributedType>(X), *AY = cast<AttributedType>(Y);
13556     AttributedType::Kind Kind = AX->getAttrKind();
13557     if (Kind != AY->getAttrKind())
13558       return QualType();
13559     QualType MX = AX->getModifiedType(), MY = AY->getModifiedType();
13560     if (!Ctx.hasSameType(MX, MY))
13561       return QualType();
13562     // FIXME: It's inefficient to have to unify the modified types.
13563     return Ctx.getAttributedType(Kind, Ctx.getCommonSugaredType(MX, MY),
13564                                  Ctx.getQualifiedType(Underlying));
13565   }
13566   case Type::BTFTagAttributed: {
13567     const auto *BX = cast<BTFTagAttributedType>(X);
13568     const BTFTypeTagAttr *AX = BX->getAttr();
13569     // The attribute is not uniqued, so just compare the tag.
13570     if (AX->getBTFTypeTag() !=
13571         cast<BTFTagAttributedType>(Y)->getAttr()->getBTFTypeTag())
13572       return QualType();
13573     return Ctx.getBTFTagAttributedType(AX, Ctx.getQualifiedType(Underlying));
13574   }
13575   case Type::Auto: {
13576     const auto *AX = cast<AutoType>(X), *AY = cast<AutoType>(Y);
13577 
13578     AutoTypeKeyword KW = AX->getKeyword();
13579     if (KW != AY->getKeyword())
13580       return QualType();
13581 
13582     ConceptDecl *CD = ::getCommonDecl(AX->getTypeConstraintConcept(),
13583                                       AY->getTypeConstraintConcept());
13584     SmallVector<TemplateArgument, 8> As;
13585     if (CD &&
13586         getCommonTemplateArguments(Ctx, As, AX->getTypeConstraintArguments(),
13587                                    AY->getTypeConstraintArguments())) {
13588       CD = nullptr; // The arguments differ, so make it unconstrained.
13589       As.clear();
13590     }
13591 
13592     // Both auto types can't be dependent, otherwise they wouldn't have been
13593     // sugar. This implies they can't contain unexpanded packs either.
13594     return Ctx.getAutoType(Ctx.getQualifiedType(Underlying), AX->getKeyword(),
13595                            /*IsDependent=*/false, /*IsPack=*/false, CD, As);
13596   }
13597   case Type::PackIndexing:
13598   case Type::Decltype:
13599     return QualType();
13600   case Type::DeducedTemplateSpecialization:
13601     // FIXME: Try to merge these.
13602     return QualType();
13603 
13604   case Type::Elaborated: {
13605     const auto *EX = cast<ElaboratedType>(X), *EY = cast<ElaboratedType>(Y);
13606     return Ctx.getElaboratedType(
13607         ::getCommonTypeKeyword(EX, EY), ::getCommonNNS(Ctx, EX, EY),
13608         Ctx.getQualifiedType(Underlying),
13609         ::getCommonDecl(EX->getOwnedTagDecl(), EY->getOwnedTagDecl()));
13610   }
13611   case Type::MacroQualified: {
13612     const auto *MX = cast<MacroQualifiedType>(X),
13613                *MY = cast<MacroQualifiedType>(Y);
13614     const IdentifierInfo *IX = MX->getMacroIdentifier();
13615     if (IX != MY->getMacroIdentifier())
13616       return QualType();
13617     return Ctx.getMacroQualifiedType(Ctx.getQualifiedType(Underlying), IX);
13618   }
13619   case Type::SubstTemplateTypeParm: {
13620     const auto *SX = cast<SubstTemplateTypeParmType>(X),
13621                *SY = cast<SubstTemplateTypeParmType>(Y);
13622     Decl *CD =
13623         ::getCommonDecl(SX->getAssociatedDecl(), SY->getAssociatedDecl());
13624     if (!CD)
13625       return QualType();
13626     unsigned Index = SX->getIndex();
13627     if (Index != SY->getIndex())
13628       return QualType();
13629     auto PackIndex = SX->getPackIndex();
13630     if (PackIndex != SY->getPackIndex())
13631       return QualType();
13632     return Ctx.getSubstTemplateTypeParmType(Ctx.getQualifiedType(Underlying),
13633                                             CD, Index, PackIndex);
13634   }
13635   case Type::ObjCTypeParam:
13636     // FIXME: Try to merge these.
13637     return QualType();
13638   case Type::Paren:
13639     return Ctx.getParenType(Ctx.getQualifiedType(Underlying));
13640 
13641   case Type::TemplateSpecialization: {
13642     const auto *TX = cast<TemplateSpecializationType>(X),
13643                *TY = cast<TemplateSpecializationType>(Y);
13644     TemplateName CTN = ::getCommonTemplateName(Ctx, TX->getTemplateName(),
13645                                                TY->getTemplateName());
13646     if (!CTN.getAsVoidPointer())
13647       return QualType();
13648     SmallVector<TemplateArgument, 8> Args;
13649     if (getCommonTemplateArguments(Ctx, Args, TX->template_arguments(),
13650                                    TY->template_arguments()))
13651       return QualType();
13652     return Ctx.getTemplateSpecializationType(CTN, Args,
13653                                              Ctx.getQualifiedType(Underlying));
13654   }
13655   case Type::Typedef: {
13656     const auto *TX = cast<TypedefType>(X), *TY = cast<TypedefType>(Y);
13657     const TypedefNameDecl *CD = ::getCommonDecl(TX->getDecl(), TY->getDecl());
13658     if (!CD)
13659       return QualType();
13660     return Ctx.getTypedefType(CD, Ctx.getQualifiedType(Underlying));
13661   }
13662   case Type::TypeOf: {
13663     // The common sugar between two typeof expressions, where one is
13664     // potentially a typeof_unqual and the other is not, we unify to the
13665     // qualified type as that retains the most information along with the type.
13666     // We only return a typeof_unqual type when both types are unqual types.
13667     TypeOfKind Kind = TypeOfKind::Qualified;
13668     if (cast<TypeOfType>(X)->getKind() == cast<TypeOfType>(Y)->getKind() &&
13669         cast<TypeOfType>(X)->getKind() == TypeOfKind::Unqualified)
13670       Kind = TypeOfKind::Unqualified;
13671     return Ctx.getTypeOfType(Ctx.getQualifiedType(Underlying), Kind);
13672   }
13673   case Type::TypeOfExpr:
13674     return QualType();
13675 
13676   case Type::UnaryTransform: {
13677     const auto *UX = cast<UnaryTransformType>(X),
13678                *UY = cast<UnaryTransformType>(Y);
13679     UnaryTransformType::UTTKind KX = UX->getUTTKind();
13680     if (KX != UY->getUTTKind())
13681       return QualType();
13682     QualType BX = UX->getBaseType(), BY = UY->getBaseType();
13683     if (!Ctx.hasSameType(BX, BY))
13684       return QualType();
13685     // FIXME: It's inefficient to have to unify the base types.
13686     return Ctx.getUnaryTransformType(Ctx.getCommonSugaredType(BX, BY),
13687                                      Ctx.getQualifiedType(Underlying), KX);
13688   }
13689   case Type::Using: {
13690     const auto *UX = cast<UsingType>(X), *UY = cast<UsingType>(Y);
13691     const UsingShadowDecl *CD =
13692         ::getCommonDecl(UX->getFoundDecl(), UY->getFoundDecl());
13693     if (!CD)
13694       return QualType();
13695     return Ctx.getUsingType(CD, Ctx.getQualifiedType(Underlying));
13696   }
13697   case Type::CountAttributed: {
13698     const auto *DX = cast<CountAttributedType>(X),
13699                *DY = cast<CountAttributedType>(Y);
13700     if (DX->isCountInBytes() != DY->isCountInBytes())
13701       return QualType();
13702     if (DX->isOrNull() != DY->isOrNull())
13703       return QualType();
13704     Expr *CEX = DX->getCountExpr();
13705     Expr *CEY = DY->getCountExpr();
13706     llvm::ArrayRef<clang::TypeCoupledDeclRefInfo> CDX = DX->getCoupledDecls();
13707     if (Ctx.hasSameExpr(CEX, CEY))
13708       return Ctx.getCountAttributedType(Ctx.getQualifiedType(Underlying), CEX,
13709                                         DX->isCountInBytes(), DX->isOrNull(),
13710                                         CDX);
13711     if (!CEX->isIntegerConstantExpr(Ctx) || !CEY->isIntegerConstantExpr(Ctx))
13712       return QualType();
13713     // Two declarations with the same integer constant may still differ in their
13714     // expression pointers, so we need to evaluate them.
13715     llvm::APSInt VX = *CEX->getIntegerConstantExpr(Ctx);
13716     llvm::APSInt VY = *CEY->getIntegerConstantExpr(Ctx);
13717     if (VX != VY)
13718       return QualType();
13719     return Ctx.getCountAttributedType(Ctx.getQualifiedType(Underlying), CEX,
13720                                       DX->isCountInBytes(), DX->isOrNull(),
13721                                       CDX);
13722   }
13723   }
13724   llvm_unreachable("Unhandled Type Class");
13725 }
13726 
unwrapSugar(SplitQualType & T,Qualifiers & QTotal)13727 static auto unwrapSugar(SplitQualType &T, Qualifiers &QTotal) {
13728   SmallVector<SplitQualType, 8> R;
13729   while (true) {
13730     QTotal.addConsistentQualifiers(T.Quals);
13731     QualType NT = T.Ty->getLocallyUnqualifiedSingleStepDesugaredType();
13732     if (NT == QualType(T.Ty, 0))
13733       break;
13734     R.push_back(T);
13735     T = NT.split();
13736   }
13737   return R;
13738 }
13739 
getCommonSugaredType(QualType X,QualType Y,bool Unqualified)13740 QualType ASTContext::getCommonSugaredType(QualType X, QualType Y,
13741                                           bool Unqualified) {
13742   assert(Unqualified ? hasSameUnqualifiedType(X, Y) : hasSameType(X, Y));
13743   if (X == Y)
13744     return X;
13745   if (!Unqualified) {
13746     if (X.isCanonical())
13747       return X;
13748     if (Y.isCanonical())
13749       return Y;
13750   }
13751 
13752   SplitQualType SX = X.split(), SY = Y.split();
13753   Qualifiers QX, QY;
13754   // Desugar SX and SY, setting the sugar and qualifiers aside into Xs and Ys,
13755   // until we reach their underlying "canonical nodes". Note these are not
13756   // necessarily canonical types, as they may still have sugared properties.
13757   // QX and QY will store the sum of all qualifiers in Xs and Ys respectively.
13758   auto Xs = ::unwrapSugar(SX, QX), Ys = ::unwrapSugar(SY, QY);
13759   if (SX.Ty != SY.Ty) {
13760     // The canonical nodes differ. Build a common canonical node out of the two,
13761     // unifying their sugar. This may recurse back here.
13762     SX.Ty =
13763         ::getCommonNonSugarTypeNode(*this, SX.Ty, QX, SY.Ty, QY).getTypePtr();
13764   } else {
13765     // The canonical nodes were identical: We may have desugared too much.
13766     // Add any common sugar back in.
13767     while (!Xs.empty() && !Ys.empty() && Xs.back().Ty == Ys.back().Ty) {
13768       QX -= SX.Quals;
13769       QY -= SY.Quals;
13770       SX = Xs.pop_back_val();
13771       SY = Ys.pop_back_val();
13772     }
13773   }
13774   if (Unqualified)
13775     QX = Qualifiers::removeCommonQualifiers(QX, QY);
13776   else
13777     assert(QX == QY);
13778 
13779   // Even though the remaining sugar nodes in Xs and Ys differ, some may be
13780   // related. Walk up these nodes, unifying them and adding the result.
13781   while (!Xs.empty() && !Ys.empty()) {
13782     auto Underlying = SplitQualType(
13783         SX.Ty, Qualifiers::removeCommonQualifiers(SX.Quals, SY.Quals));
13784     SX = Xs.pop_back_val();
13785     SY = Ys.pop_back_val();
13786     SX.Ty = ::getCommonSugarTypeNode(*this, SX.Ty, SY.Ty, Underlying)
13787                 .getTypePtrOrNull();
13788     // Stop at the first pair which is unrelated.
13789     if (!SX.Ty) {
13790       SX.Ty = Underlying.Ty;
13791       break;
13792     }
13793     QX -= Underlying.Quals;
13794   };
13795 
13796   // Add back the missing accumulated qualifiers, which were stripped off
13797   // with the sugar nodes we could not unify.
13798   QualType R = getQualifiedType(SX.Ty, QX);
13799   assert(Unqualified ? hasSameUnqualifiedType(R, X) : hasSameType(R, X));
13800   return R;
13801 }
13802 
getCorrespondingUnsaturatedType(QualType Ty) const13803 QualType ASTContext::getCorrespondingUnsaturatedType(QualType Ty) const {
13804   assert(Ty->isFixedPointType());
13805 
13806   if (Ty->isUnsaturatedFixedPointType())
13807     return Ty;
13808 
13809   switch (Ty->castAs<BuiltinType>()->getKind()) {
13810   default:
13811     llvm_unreachable("Not a saturated fixed point type!");
13812   case BuiltinType::SatShortAccum:
13813     return ShortAccumTy;
13814   case BuiltinType::SatAccum:
13815     return AccumTy;
13816   case BuiltinType::SatLongAccum:
13817     return LongAccumTy;
13818   case BuiltinType::SatUShortAccum:
13819     return UnsignedShortAccumTy;
13820   case BuiltinType::SatUAccum:
13821     return UnsignedAccumTy;
13822   case BuiltinType::SatULongAccum:
13823     return UnsignedLongAccumTy;
13824   case BuiltinType::SatShortFract:
13825     return ShortFractTy;
13826   case BuiltinType::SatFract:
13827     return FractTy;
13828   case BuiltinType::SatLongFract:
13829     return LongFractTy;
13830   case BuiltinType::SatUShortFract:
13831     return UnsignedShortFractTy;
13832   case BuiltinType::SatUFract:
13833     return UnsignedFractTy;
13834   case BuiltinType::SatULongFract:
13835     return UnsignedLongFractTy;
13836   }
13837 }
13838 
getCorrespondingSaturatedType(QualType Ty) const13839 QualType ASTContext::getCorrespondingSaturatedType(QualType Ty) const {
13840   assert(Ty->isFixedPointType());
13841 
13842   if (Ty->isSaturatedFixedPointType()) return Ty;
13843 
13844   switch (Ty->castAs<BuiltinType>()->getKind()) {
13845     default:
13846       llvm_unreachable("Not a fixed point type!");
13847     case BuiltinType::ShortAccum:
13848       return SatShortAccumTy;
13849     case BuiltinType::Accum:
13850       return SatAccumTy;
13851     case BuiltinType::LongAccum:
13852       return SatLongAccumTy;
13853     case BuiltinType::UShortAccum:
13854       return SatUnsignedShortAccumTy;
13855     case BuiltinType::UAccum:
13856       return SatUnsignedAccumTy;
13857     case BuiltinType::ULongAccum:
13858       return SatUnsignedLongAccumTy;
13859     case BuiltinType::ShortFract:
13860       return SatShortFractTy;
13861     case BuiltinType::Fract:
13862       return SatFractTy;
13863     case BuiltinType::LongFract:
13864       return SatLongFractTy;
13865     case BuiltinType::UShortFract:
13866       return SatUnsignedShortFractTy;
13867     case BuiltinType::UFract:
13868       return SatUnsignedFractTy;
13869     case BuiltinType::ULongFract:
13870       return SatUnsignedLongFractTy;
13871   }
13872 }
13873 
getLangASForBuiltinAddressSpace(unsigned AS) const13874 LangAS ASTContext::getLangASForBuiltinAddressSpace(unsigned AS) const {
13875   if (LangOpts.OpenCL)
13876     return getTargetInfo().getOpenCLBuiltinAddressSpace(AS);
13877 
13878   if (LangOpts.CUDA)
13879     return getTargetInfo().getCUDABuiltinAddressSpace(AS);
13880 
13881   return getLangASFromTargetAS(AS);
13882 }
13883 
13884 // Explicitly instantiate this in case a Redeclarable<T> is used from a TU that
13885 // doesn't include ASTContext.h
13886 template
13887 clang::LazyGenerationalUpdatePtr<
13888     const Decl *, Decl *, &ExternalASTSource::CompleteRedeclChain>::ValueType
13889 clang::LazyGenerationalUpdatePtr<
13890     const Decl *, Decl *, &ExternalASTSource::CompleteRedeclChain>::makeValue(
13891         const clang::ASTContext &Ctx, Decl *Value);
13892 
getFixedPointScale(QualType Ty) const13893 unsigned char ASTContext::getFixedPointScale(QualType Ty) const {
13894   assert(Ty->isFixedPointType());
13895 
13896   const TargetInfo &Target = getTargetInfo();
13897   switch (Ty->castAs<BuiltinType>()->getKind()) {
13898     default:
13899       llvm_unreachable("Not a fixed point type!");
13900     case BuiltinType::ShortAccum:
13901     case BuiltinType::SatShortAccum:
13902       return Target.getShortAccumScale();
13903     case BuiltinType::Accum:
13904     case BuiltinType::SatAccum:
13905       return Target.getAccumScale();
13906     case BuiltinType::LongAccum:
13907     case BuiltinType::SatLongAccum:
13908       return Target.getLongAccumScale();
13909     case BuiltinType::UShortAccum:
13910     case BuiltinType::SatUShortAccum:
13911       return Target.getUnsignedShortAccumScale();
13912     case BuiltinType::UAccum:
13913     case BuiltinType::SatUAccum:
13914       return Target.getUnsignedAccumScale();
13915     case BuiltinType::ULongAccum:
13916     case BuiltinType::SatULongAccum:
13917       return Target.getUnsignedLongAccumScale();
13918     case BuiltinType::ShortFract:
13919     case BuiltinType::SatShortFract:
13920       return Target.getShortFractScale();
13921     case BuiltinType::Fract:
13922     case BuiltinType::SatFract:
13923       return Target.getFractScale();
13924     case BuiltinType::LongFract:
13925     case BuiltinType::SatLongFract:
13926       return Target.getLongFractScale();
13927     case BuiltinType::UShortFract:
13928     case BuiltinType::SatUShortFract:
13929       return Target.getUnsignedShortFractScale();
13930     case BuiltinType::UFract:
13931     case BuiltinType::SatUFract:
13932       return Target.getUnsignedFractScale();
13933     case BuiltinType::ULongFract:
13934     case BuiltinType::SatULongFract:
13935       return Target.getUnsignedLongFractScale();
13936   }
13937 }
13938 
getFixedPointIBits(QualType Ty) const13939 unsigned char ASTContext::getFixedPointIBits(QualType Ty) const {
13940   assert(Ty->isFixedPointType());
13941 
13942   const TargetInfo &Target = getTargetInfo();
13943   switch (Ty->castAs<BuiltinType>()->getKind()) {
13944     default:
13945       llvm_unreachable("Not a fixed point type!");
13946     case BuiltinType::ShortAccum:
13947     case BuiltinType::SatShortAccum:
13948       return Target.getShortAccumIBits();
13949     case BuiltinType::Accum:
13950     case BuiltinType::SatAccum:
13951       return Target.getAccumIBits();
13952     case BuiltinType::LongAccum:
13953     case BuiltinType::SatLongAccum:
13954       return Target.getLongAccumIBits();
13955     case BuiltinType::UShortAccum:
13956     case BuiltinType::SatUShortAccum:
13957       return Target.getUnsignedShortAccumIBits();
13958     case BuiltinType::UAccum:
13959     case BuiltinType::SatUAccum:
13960       return Target.getUnsignedAccumIBits();
13961     case BuiltinType::ULongAccum:
13962     case BuiltinType::SatULongAccum:
13963       return Target.getUnsignedLongAccumIBits();
13964     case BuiltinType::ShortFract:
13965     case BuiltinType::SatShortFract:
13966     case BuiltinType::Fract:
13967     case BuiltinType::SatFract:
13968     case BuiltinType::LongFract:
13969     case BuiltinType::SatLongFract:
13970     case BuiltinType::UShortFract:
13971     case BuiltinType::SatUShortFract:
13972     case BuiltinType::UFract:
13973     case BuiltinType::SatUFract:
13974     case BuiltinType::ULongFract:
13975     case BuiltinType::SatULongFract:
13976       return 0;
13977   }
13978 }
13979 
13980 llvm::FixedPointSemantics
getFixedPointSemantics(QualType Ty) const13981 ASTContext::getFixedPointSemantics(QualType Ty) const {
13982   assert((Ty->isFixedPointType() || Ty->isIntegerType()) &&
13983          "Can only get the fixed point semantics for a "
13984          "fixed point or integer type.");
13985   if (Ty->isIntegerType())
13986     return llvm::FixedPointSemantics::GetIntegerSemantics(
13987         getIntWidth(Ty), Ty->isSignedIntegerType());
13988 
13989   bool isSigned = Ty->isSignedFixedPointType();
13990   return llvm::FixedPointSemantics(
13991       static_cast<unsigned>(getTypeSize(Ty)), getFixedPointScale(Ty), isSigned,
13992       Ty->isSaturatedFixedPointType(),
13993       !isSigned && getTargetInfo().doUnsignedFixedPointTypesHavePadding());
13994 }
13995 
getFixedPointMax(QualType Ty) const13996 llvm::APFixedPoint ASTContext::getFixedPointMax(QualType Ty) const {
13997   assert(Ty->isFixedPointType());
13998   return llvm::APFixedPoint::getMax(getFixedPointSemantics(Ty));
13999 }
14000 
getFixedPointMin(QualType Ty) const14001 llvm::APFixedPoint ASTContext::getFixedPointMin(QualType Ty) const {
14002   assert(Ty->isFixedPointType());
14003   return llvm::APFixedPoint::getMin(getFixedPointSemantics(Ty));
14004 }
14005 
getCorrespondingSignedFixedPointType(QualType Ty) const14006 QualType ASTContext::getCorrespondingSignedFixedPointType(QualType Ty) const {
14007   assert(Ty->isUnsignedFixedPointType() &&
14008          "Expected unsigned fixed point type");
14009 
14010   switch (Ty->castAs<BuiltinType>()->getKind()) {
14011   case BuiltinType::UShortAccum:
14012     return ShortAccumTy;
14013   case BuiltinType::UAccum:
14014     return AccumTy;
14015   case BuiltinType::ULongAccum:
14016     return LongAccumTy;
14017   case BuiltinType::SatUShortAccum:
14018     return SatShortAccumTy;
14019   case BuiltinType::SatUAccum:
14020     return SatAccumTy;
14021   case BuiltinType::SatULongAccum:
14022     return SatLongAccumTy;
14023   case BuiltinType::UShortFract:
14024     return ShortFractTy;
14025   case BuiltinType::UFract:
14026     return FractTy;
14027   case BuiltinType::ULongFract:
14028     return LongFractTy;
14029   case BuiltinType::SatUShortFract:
14030     return SatShortFractTy;
14031   case BuiltinType::SatUFract:
14032     return SatFractTy;
14033   case BuiltinType::SatULongFract:
14034     return SatLongFractTy;
14035   default:
14036     llvm_unreachable("Unexpected unsigned fixed point type");
14037   }
14038 }
14039 
14040 // Given a list of FMV features, return a concatenated list of the
14041 // corresponding backend features (which may contain duplicates).
getFMVBackendFeaturesFor(const llvm::SmallVectorImpl<StringRef> & FMVFeatStrings)14042 static std::vector<std::string> getFMVBackendFeaturesFor(
14043     const llvm::SmallVectorImpl<StringRef> &FMVFeatStrings) {
14044   std::vector<std::string> BackendFeats;
14045   for (StringRef F : FMVFeatStrings)
14046     if (auto FMVExt = llvm::AArch64::parseFMVExtension(F))
14047       for (StringRef F : FMVExt->getImpliedFeatures())
14048         BackendFeats.push_back(F.str());
14049   return BackendFeats;
14050 }
14051 
14052 ParsedTargetAttr
filterFunctionTargetAttrs(const TargetAttr * TD) const14053 ASTContext::filterFunctionTargetAttrs(const TargetAttr *TD) const {
14054   assert(TD != nullptr);
14055   ParsedTargetAttr ParsedAttr = Target->parseTargetAttr(TD->getFeaturesStr());
14056 
14057   llvm::erase_if(ParsedAttr.Features, [&](const std::string &Feat) {
14058     return !Target->isValidFeatureName(StringRef{Feat}.substr(1));
14059   });
14060   return ParsedAttr;
14061 }
14062 
getFunctionFeatureMap(llvm::StringMap<bool> & FeatureMap,const FunctionDecl * FD) const14063 void ASTContext::getFunctionFeatureMap(llvm::StringMap<bool> &FeatureMap,
14064                                        const FunctionDecl *FD) const {
14065   if (FD)
14066     getFunctionFeatureMap(FeatureMap, GlobalDecl().getWithDecl(FD));
14067   else
14068     Target->initFeatureMap(FeatureMap, getDiagnostics(),
14069                            Target->getTargetOpts().CPU,
14070                            Target->getTargetOpts().Features);
14071 }
14072 
14073 // Fills in the supplied string map with the set of target features for the
14074 // passed in function.
getFunctionFeatureMap(llvm::StringMap<bool> & FeatureMap,GlobalDecl GD) const14075 void ASTContext::getFunctionFeatureMap(llvm::StringMap<bool> &FeatureMap,
14076                                        GlobalDecl GD) const {
14077   StringRef TargetCPU = Target->getTargetOpts().CPU;
14078   const FunctionDecl *FD = GD.getDecl()->getAsFunction();
14079   if (const auto *TD = FD->getAttr<TargetAttr>()) {
14080     ParsedTargetAttr ParsedAttr = filterFunctionTargetAttrs(TD);
14081 
14082     // Make a copy of the features as passed on the command line into the
14083     // beginning of the additional features from the function to override.
14084     // AArch64 handles command line option features in parseTargetAttr().
14085     if (!Target->getTriple().isAArch64())
14086       ParsedAttr.Features.insert(
14087           ParsedAttr.Features.begin(),
14088           Target->getTargetOpts().FeaturesAsWritten.begin(),
14089           Target->getTargetOpts().FeaturesAsWritten.end());
14090 
14091     if (ParsedAttr.CPU != "" && Target->isValidCPUName(ParsedAttr.CPU))
14092       TargetCPU = ParsedAttr.CPU;
14093 
14094     // Now populate the feature map, first with the TargetCPU which is either
14095     // the default or a new one from the target attribute string. Then we'll use
14096     // the passed in features (FeaturesAsWritten) along with the new ones from
14097     // the attribute.
14098     Target->initFeatureMap(FeatureMap, getDiagnostics(), TargetCPU,
14099                            ParsedAttr.Features);
14100   } else if (const auto *SD = FD->getAttr<CPUSpecificAttr>()) {
14101     llvm::SmallVector<StringRef, 32> FeaturesTmp;
14102     Target->getCPUSpecificCPUDispatchFeatures(
14103         SD->getCPUName(GD.getMultiVersionIndex())->getName(), FeaturesTmp);
14104     std::vector<std::string> Features(FeaturesTmp.begin(), FeaturesTmp.end());
14105     Features.insert(Features.begin(),
14106                     Target->getTargetOpts().FeaturesAsWritten.begin(),
14107                     Target->getTargetOpts().FeaturesAsWritten.end());
14108     Target->initFeatureMap(FeatureMap, getDiagnostics(), TargetCPU, Features);
14109   } else if (const auto *TC = FD->getAttr<TargetClonesAttr>()) {
14110     if (Target->getTriple().isAArch64()) {
14111       llvm::SmallVector<StringRef, 8> Feats;
14112       TC->getFeatures(Feats, GD.getMultiVersionIndex());
14113       std::vector<std::string> Features = getFMVBackendFeaturesFor(Feats);
14114       Features.insert(Features.begin(),
14115                       Target->getTargetOpts().FeaturesAsWritten.begin(),
14116                       Target->getTargetOpts().FeaturesAsWritten.end());
14117       Target->initFeatureMap(FeatureMap, getDiagnostics(), TargetCPU, Features);
14118     } else {
14119       std::vector<std::string> Features;
14120       StringRef VersionStr = TC->getFeatureStr(GD.getMultiVersionIndex());
14121       if (VersionStr.starts_with("arch="))
14122         TargetCPU = VersionStr.drop_front(sizeof("arch=") - 1);
14123       else if (VersionStr != "default")
14124         Features.push_back((StringRef{"+"} + VersionStr).str());
14125       Target->initFeatureMap(FeatureMap, getDiagnostics(), TargetCPU, Features);
14126     }
14127   } else if (const auto *TV = FD->getAttr<TargetVersionAttr>()) {
14128     llvm::SmallVector<StringRef, 8> Feats;
14129     TV->getFeatures(Feats);
14130     std::vector<std::string> Features = getFMVBackendFeaturesFor(Feats);
14131     Features.insert(Features.begin(),
14132                     Target->getTargetOpts().FeaturesAsWritten.begin(),
14133                     Target->getTargetOpts().FeaturesAsWritten.end());
14134     Target->initFeatureMap(FeatureMap, getDiagnostics(), TargetCPU, Features);
14135   } else {
14136     FeatureMap = Target->getTargetOpts().FeatureMap;
14137   }
14138 }
14139 
getNewOMPTraitInfo()14140 OMPTraitInfo &ASTContext::getNewOMPTraitInfo() {
14141   OMPTraitInfoVector.emplace_back(new OMPTraitInfo());
14142   return *OMPTraitInfoVector.back();
14143 }
14144 
14145 const StreamingDiagnostic &clang::
operator <<(const StreamingDiagnostic & DB,const ASTContext::SectionInfo & Section)14146 operator<<(const StreamingDiagnostic &DB,
14147            const ASTContext::SectionInfo &Section) {
14148   if (Section.Decl)
14149     return DB << Section.Decl;
14150   return DB << "a prior #pragma section";
14151 }
14152 
mayExternalize(const Decl * D) const14153 bool ASTContext::mayExternalize(const Decl *D) const {
14154   bool IsInternalVar =
14155       isa<VarDecl>(D) &&
14156       basicGVALinkageForVariable(*this, cast<VarDecl>(D)) == GVA_Internal;
14157   bool IsExplicitDeviceVar = (D->hasAttr<CUDADeviceAttr>() &&
14158                               !D->getAttr<CUDADeviceAttr>()->isImplicit()) ||
14159                              (D->hasAttr<CUDAConstantAttr>() &&
14160                               !D->getAttr<CUDAConstantAttr>()->isImplicit());
14161   // CUDA/HIP: managed variables need to be externalized since it is
14162   // a declaration in IR, therefore cannot have internal linkage. Kernels in
14163   // anonymous name space needs to be externalized to avoid duplicate symbols.
14164   return (IsInternalVar &&
14165           (D->hasAttr<HIPManagedAttr>() || IsExplicitDeviceVar)) ||
14166          (D->hasAttr<CUDAGlobalAttr>() &&
14167           basicGVALinkageForFunction(*this, cast<FunctionDecl>(D)) ==
14168               GVA_Internal);
14169 }
14170 
shouldExternalize(const Decl * D) const14171 bool ASTContext::shouldExternalize(const Decl *D) const {
14172   return mayExternalize(D) &&
14173          (D->hasAttr<HIPManagedAttr>() || D->hasAttr<CUDAGlobalAttr>() ||
14174           CUDADeviceVarODRUsedByHost.count(cast<VarDecl>(D)));
14175 }
14176 
getCUIDHash() const14177 StringRef ASTContext::getCUIDHash() const {
14178   if (!CUIDHash.empty())
14179     return CUIDHash;
14180   if (LangOpts.CUID.empty())
14181     return StringRef();
14182   CUIDHash = llvm::utohexstr(llvm::MD5Hash(LangOpts.CUID), /*LowerCase=*/true);
14183   return CUIDHash;
14184 }
14185 
14186 const CXXRecordDecl *
baseForVTableAuthentication(const CXXRecordDecl * ThisClass)14187 ASTContext::baseForVTableAuthentication(const CXXRecordDecl *ThisClass) {
14188   assert(ThisClass);
14189   assert(ThisClass->isPolymorphic());
14190   const CXXRecordDecl *PrimaryBase = ThisClass;
14191   while (1) {
14192     assert(PrimaryBase);
14193     assert(PrimaryBase->isPolymorphic());
14194     auto &Layout = getASTRecordLayout(PrimaryBase);
14195     auto Base = Layout.getPrimaryBase();
14196     if (!Base || Base == PrimaryBase || !Base->isPolymorphic())
14197       break;
14198     PrimaryBase = Base;
14199   }
14200   return PrimaryBase;
14201 }
14202 
useAbbreviatedThunkName(GlobalDecl VirtualMethodDecl,StringRef MangledName)14203 bool ASTContext::useAbbreviatedThunkName(GlobalDecl VirtualMethodDecl,
14204                                          StringRef MangledName) {
14205   auto *Method = cast<CXXMethodDecl>(VirtualMethodDecl.getDecl());
14206   assert(Method->isVirtual());
14207   bool DefaultIncludesPointerAuth =
14208       LangOpts.PointerAuthCalls || LangOpts.PointerAuthIntrinsics;
14209 
14210   if (!DefaultIncludesPointerAuth)
14211     return true;
14212 
14213   auto Existing = ThunksToBeAbbreviated.find(VirtualMethodDecl);
14214   if (Existing != ThunksToBeAbbreviated.end())
14215     return Existing->second.contains(MangledName.str());
14216 
14217   std::unique_ptr<MangleContext> Mangler(createMangleContext());
14218   llvm::StringMap<llvm::SmallVector<std::string, 2>> Thunks;
14219   auto VtableContext = getVTableContext();
14220   if (const auto *ThunkInfos = VtableContext->getThunkInfo(VirtualMethodDecl)) {
14221     auto *Destructor = dyn_cast<CXXDestructorDecl>(Method);
14222     for (const auto &Thunk : *ThunkInfos) {
14223       SmallString<256> ElidedName;
14224       llvm::raw_svector_ostream ElidedNameStream(ElidedName);
14225       if (Destructor)
14226         Mangler->mangleCXXDtorThunk(Destructor, VirtualMethodDecl.getDtorType(),
14227                                     Thunk, /* elideOverrideInfo */ true,
14228                                     ElidedNameStream);
14229       else
14230         Mangler->mangleThunk(Method, Thunk, /* elideOverrideInfo */ true,
14231                              ElidedNameStream);
14232       SmallString<256> MangledName;
14233       llvm::raw_svector_ostream mangledNameStream(MangledName);
14234       if (Destructor)
14235         Mangler->mangleCXXDtorThunk(Destructor, VirtualMethodDecl.getDtorType(),
14236                                     Thunk, /* elideOverrideInfo */ false,
14237                                     mangledNameStream);
14238       else
14239         Mangler->mangleThunk(Method, Thunk, /* elideOverrideInfo */ false,
14240                              mangledNameStream);
14241 
14242       if (Thunks.find(ElidedName) == Thunks.end())
14243         Thunks[ElidedName] = {};
14244       Thunks[ElidedName].push_back(std::string(MangledName));
14245     }
14246   }
14247   llvm::StringSet<> SimplifiedThunkNames;
14248   for (auto &ThunkList : Thunks) {
14249     llvm::sort(ThunkList.second);
14250     SimplifiedThunkNames.insert(ThunkList.second[0]);
14251   }
14252   bool Result = SimplifiedThunkNames.contains(MangledName);
14253   ThunksToBeAbbreviated[VirtualMethodDecl] = std::move(SimplifiedThunkNames);
14254   return Result;
14255 }
14256