68#include "llvm/ADT/APFixedPoint.h"
69#include "llvm/ADT/APInt.h"
70#include "llvm/ADT/APSInt.h"
71#include "llvm/ADT/ArrayRef.h"
72#include "llvm/ADT/DenseMap.h"
73#include "llvm/ADT/DenseSet.h"
74#include "llvm/ADT/FoldingSet.h"
75#include "llvm/ADT/PointerUnion.h"
76#include "llvm/ADT/STLExtras.h"
77#include "llvm/ADT/SmallPtrSet.h"
78#include "llvm/ADT/SmallVector.h"
79#include "llvm/ADT/StringExtras.h"
80#include "llvm/ADT/StringRef.h"
81#include "llvm/Frontend/OpenMP/OMPIRBuilder.h"
82#include "llvm/Support/Capacity.h"
83#include "llvm/Support/Casting.h"
84#include "llvm/Support/Compiler.h"
85#include "llvm/Support/ErrorHandling.h"
86#include "llvm/Support/MD5.h"
87#include "llvm/Support/MathExtras.h"
88#include "llvm/Support/SipHash.h"
89#include "llvm/Support/raw_ostream.h"
90#include "llvm/TargetParser/AArch64TargetParser.h"
91#include "llvm/TargetParser/Triple.h"
104using namespace clang;
128 if (
const auto *FD = dyn_cast<FunctionDecl>(D)) {
133 if (
const auto *VD = dyn_cast<VarDecl>(D)) {
134 if (VD->isStaticDataMember() &&
139 if (
const auto *CRD = dyn_cast<CXXRecordDecl>(D)) {
144 if (
const auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(D)) {
151 if (
const auto *ED = dyn_cast<EnumDecl>(D)) {
155 if (
const auto *TD = dyn_cast<TagDecl>(D)) {
158 if (TD->isEmbeddedInDeclarator() && !TD->isCompleteDefinition())
190 Locations.emplace_back(BaseLocation);
203 Locations.emplace_back(SourceMgr.getExpansionLoc(BaseLocation));
210 Locations.emplace_back(SourceMgr.getSpellingLoc(D->
getBeginLoc()));
218 const std::map<unsigned, RawComment *> &CommentsInTheFile)
const {
221 if (RepresentativeLocForDecl.
isInvalid() ||
222 !RepresentativeLocForDecl.
isFileID())
226 if (CommentsInTheFile.empty())
232 SourceMgr.getDecomposedLoc(RepresentativeLocForDecl);
235 auto OffsetCommentBehindDecl =
236 CommentsInTheFile.lower_bound(DeclLocDecomp.second);
239 if (OffsetCommentBehindDecl != CommentsInTheFile.end()) {
240 RawComment *CommentBehindDecl = OffsetCommentBehindDecl->second;
242 LangOpts.CommentOpts.ParseAllComments) &&
249 if (SourceMgr.getLineNumber(DeclLocDecomp.first, DeclLocDecomp.second) ==
250 Comments.getCommentBeginLine(CommentBehindDecl, DeclLocDecomp.first,
251 OffsetCommentBehindDecl->first)) {
252 return CommentBehindDecl;
259 if (OffsetCommentBehindDecl == CommentsInTheFile.begin())
262 auto OffsetCommentBeforeDecl = --OffsetCommentBehindDecl;
263 RawComment *CommentBeforeDecl = OffsetCommentBeforeDecl->second;
267 LangOpts.CommentOpts.ParseAllComments) ||
272 const unsigned CommentEndOffset =
273 Comments.getCommentEndOffset(CommentBeforeDecl);
277 const char *Buffer = SourceMgr.getBufferData(DeclLocDecomp.first,
283 StringRef
Text(Buffer + CommentEndOffset,
284 DeclLocDecomp.second - CommentEndOffset);
288 if (
Text.find_last_of(
";{}#@") != StringRef::npos)
291 return CommentBeforeDecl;
297 for (
const auto DeclLoc : DeclLocs) {
300 if (DeclLoc.isInvalid() || !DeclLoc.isFileID())
311 const FileID File = SourceMgr.getDecomposedLoc(DeclLoc).first;
315 const auto CommentsInThisFile =
Comments.getCommentsInFile(
File);
316 if (!CommentsInThisFile || CommentsInThisFile->empty())
328 assert(LangOpts.RetainCommentsFromSystemHeaders ||
330 Comments.addComment(RC, LangOpts.CommentOpts, BumpAlloc);
335 const Decl **OriginalDecl)
const {
338 OriginalDecl =
nullptr;
350 return DeclComment->second;
363 *OriginalDecl = RedeclComment->second;
366 "This decl is supposed to have comment attached.");
367 return CommentAtRedecl->second;
372 const Decl *LastCheckedRedecl = [&]() {
374 bool CanUseCommentlessCache =
false;
376 for (
auto *Redecl : CanonicalD->
redecls()) {
378 CanUseCommentlessCache =
true;
381 if (Redecl == LastChecked)
388 return CanUseCommentlessCache ? LastChecked :
nullptr;
394 if (LastCheckedRedecl) {
395 if (LastCheckedRedecl == Redecl) {
396 LastCheckedRedecl =
nullptr;
404 *OriginalDecl = Redecl;
405 return RedeclComment;
411 *OriginalDecl =
nullptr;
417 assert(Comment.
isDocumentation() || LangOpts.CommentOpts.ParseAllComments);
427 if (
const auto *IMD = dyn_cast<ObjCImplDecl>(DC)) {
432 for (
const auto *Ext : ID->known_extensions()) {
436 Redeclared.push_back(RedeclaredMethod);
443 if (
Comments.empty() || Decls.empty())
447 for (
const Decl *D : Decls) {
448 if (D->isInvalidDecl())
456 File = SourceMgr.getDecomposedLoc(Loc).first;
461 if (
File.isInvalid())
464 auto CommentsInThisFile =
Comments.getCommentsInFile(
File);
465 if (!CommentsInThisFile || CommentsInThisFile->empty() ||
466 CommentsInThisFile->rbegin()->second->isAttached())
476 for (
const Decl *D : Decls) {
478 if (D->isInvalidDecl())
488 for (
const auto DeclLoc : DeclLocs) {
489 if (DeclLoc.isInvalid() || !DeclLoc.isFileID())
493 D, DeclLoc, *CommentsInThisFile)) {
504 const Decl *D)
const {
507 ThisDeclInfo->IsFilled =
false;
508 ThisDeclInfo->fill();
509 ThisDeclInfo->CommentDecl = FC->
getDecl();
510 if (!ThisDeclInfo->TemplateParameters)
520 return RC ? RC->
parse(*
this,
nullptr, D) :
nullptr;
531 llvm::DenseMap<const Decl *, comments::FullComment *>::iterator Pos =
535 if (Canonical != D) {
543 const Decl *OriginalDecl =
nullptr;
549 const auto *OMD = dyn_cast<ObjCMethodDecl>(D);
550 if (OMD && OMD->isPropertyAccessor())
557 for (
unsigned i = 0, e = Overridden.size(); i < e; i++)
561 else if (
const auto *TD = dyn_cast<TypedefNameDecl>(D)) {
564 QualType QT = TD->getUnderlyingType();
565 if (
const auto *TT = QT->
getAs<TagType>())
569 else if (
const auto *IC = dyn_cast<ObjCInterfaceDecl>(D)) {
570 while (IC->getSuperClass()) {
571 IC = IC->getSuperClass();
576 else if (
const auto *CD = dyn_cast<ObjCCategoryDecl>(D)) {
581 else if (
const auto *RD = dyn_cast<CXXRecordDecl>(D)) {
582 if (!(RD = RD->getDefinition()))
585 for (
const auto &I : RD->bases()) {
586 if (I.isVirtual() || (I.getAccessSpecifier() !=
AS_public))
600 for (
const auto &I : RD->vbases()) {
621 if (D != OriginalDecl && OriginalDecl)
629void ASTContext::CanonicalTemplateTemplateParm::Profile(
638 ID.AddInteger(Params->
size());
640 PEnd = Params->
end();
642 if (
const auto *TTP = dyn_cast<TemplateTypeParmDecl>(*P)) {
644 ID.AddBoolean(TTP->isParameterPack());
646 TTP->getNumExpansionParameters().toInternalRepresentation());
650 if (
const auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(*P)) {
652 ID.AddBoolean(NTTP->isParameterPack());
653 ID.AddPointer(
C.getUnconstrainedType(
C.getCanonicalType(NTTP->getType()))
655 if (NTTP->isExpandedParameterPack()) {
657 ID.AddInteger(NTTP->getNumExpansionTypes());
658 for (
unsigned I = 0, N = NTTP->getNumExpansionTypes(); I != N; ++I) {
660 ID.AddPointer(
T.getCanonicalType().getAsOpaquePtr());
663 ID.AddBoolean(
false);
673TemplateTemplateParmDecl *
677 llvm::FoldingSetNodeID ID;
678 CanonicalTemplateTemplateParm::Profile(ID, *
this, TTP);
679 void *InsertPos =
nullptr;
680 CanonicalTemplateTemplateParm *Canonical
681 = CanonTemplateTemplateParms.FindNodeOrInsertPos(ID, InsertPos);
683 return Canonical->getParam();
688 CanonParams.reserve(Params->
size());
690 PEnd = Params->
end();
694 if (
const auto *TTP = dyn_cast<TemplateTypeParmDecl>(*P)) {
699 TTP->getNumExpansionParameters());
700 CanonParams.push_back(NewTTP);
701 }
else if (
const auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(*P)) {
705 if (NTTP->isExpandedParameterPack()) {
708 for (
unsigned I = 0, N = NTTP->getNumExpansionTypes(); I != N; ++I) {
710 ExpandedTInfos.push_back(
718 NTTP->getPosition(),
nullptr,
728 NTTP->getPosition(),
nullptr,
730 NTTP->isParameterPack(),
733 CanonParams.push_back(Param);
749 Canonical = CanonTemplateTemplateParms.FindNodeOrInsertPos(ID, InsertPos);
750 assert(!Canonical &&
"Shouldn't be in the map!");
754 Canonical =
new (*this) CanonicalTemplateTemplateParm(CanonTTP);
755 CanonTemplateTemplateParms.InsertNode(Canonical, InsertPos);
762 llvm::FoldingSetNodeID ID;
763 CanonicalTemplateTemplateParm::Profile(ID, *
this, TTP);
764 void *InsertPos =
nullptr;
765 CanonicalTemplateTemplateParm *Canonical =
766 CanonTemplateTemplateParms.FindNodeOrInsertPos(ID, InsertPos);
767 return Canonical ? Canonical->getParam() :
nullptr;
773 llvm::FoldingSetNodeID ID;
774 CanonicalTemplateTemplateParm::Profile(ID, *
this, CanonTTP);
775 void *InsertPos =
nullptr;
777 CanonTemplateTemplateParms.FindNodeOrInsertPos(ID, InsertPos))
778 return Existing->getParam();
779 CanonTemplateTemplateParms.InsertNode(
780 new (*
this) CanonicalTemplateTemplateParm(CanonTTP), InsertPos);
789 return NoSanitizeL->containsType(Mask, TyName);
798 if (!LangOpts.CPlusPlus)
return nullptr;
801 case TargetCXXABI::AppleARM64:
802 case TargetCXXABI::Fuchsia:
803 case TargetCXXABI::GenericARM:
804 case TargetCXXABI::iOS:
805 case TargetCXXABI::WatchOS:
806 case TargetCXXABI::GenericAArch64:
807 case TargetCXXABI::GenericMIPS:
808 case TargetCXXABI::GenericItanium:
809 case TargetCXXABI::WebAssembly:
810 case TargetCXXABI::XL:
812 case TargetCXXABI::Microsoft:
815 llvm_unreachable(
"Invalid CXXABI type!");
819 if (!InterpContext) {
822 return *InterpContext;
828 return *ParentMapCtx;
833 switch (LangOpts.getAddressSpaceMapMangling()) {
841 llvm_unreachable(
"getAddressSpaceMapMangling() doesn't cover anything.");
847 : ConstantArrayTypes(this_(), ConstantArrayTypesLog2InitSize),
848 DependentSizedArrayTypes(this_()), DependentSizedExtVectorTypes(this_()),
849 DependentAddressSpaceTypes(this_()), DependentVectorTypes(this_()),
850 DependentSizedMatrixTypes(this_()),
851 FunctionProtoTypes(this_(), FunctionProtoTypesLog2InitSize),
852 DependentTypeOfExprTypes(this_()), DependentDecltypeTypes(this_()),
853 DependentPackIndexingTypes(this_()), TemplateSpecializationTypes(this_()),
854 DependentBitIntTypes(this_()), SubstTemplateTemplateParmPacks(this_()),
855 DeducedTemplates(this_()), ArrayParameterTypes(this_()),
856 CanonTemplateTemplateParms(this_()), SourceMgr(
SM), LangOpts(LOpts),
859 LangOpts.XRayNeverInstrumentFiles,
860 LangOpts.XRayAttrListFiles,
SM)),
864 Comments(
SM), CommentCommandTraits(BumpAlloc, LOpts.CommentOpts),
872 ReleaseDeclContextMaps();
875 for (
auto &Pair : Deallocations)
876 (Pair.first)(Pair.second);
877 Deallocations.clear();
883 I = ObjCLayouts.begin(),
884 E = ObjCLayouts.end();
891 for (llvm::DenseMap<const RecordDecl*, const ASTRecordLayout*>::iterator
892 I = ASTRecordLayouts.begin(), E = ASTRecordLayouts.end(); I != E; ) {
897 ASTRecordLayouts.clear();
899 for (llvm::DenseMap<const Decl*, AttrVec*>::iterator A = DeclAttrs.begin(),
900 AEnd = DeclAttrs.end();
902 A->second->~AttrVec();
905 for (
const auto &
Value : ModuleInitializers)
906 Value.second->~PerModuleInitializers();
907 ModuleInitializers.
clear();
916 TraversalScope = TopLevelDecls;
921 Deallocations.push_back({Callback,
Data});
930 llvm::errs() <<
"\n*** AST Context Stats:\n";
931 llvm::errs() <<
" " << Types.size() <<
" types total.\n";
933 unsigned counts[] = {
934#define TYPE(Name, Parent) 0,
935#define ABSTRACT_TYPE(Name, Parent)
936#include "clang/AST/TypeNodes.inc"
940 for (
unsigned i = 0, e = Types.size(); i != e; ++i) {
946 unsigned TotalBytes = 0;
947#define TYPE(Name, Parent) \
949 llvm::errs() << " " << counts[Idx] << " " << #Name \
950 << " types, " << sizeof(Name##Type) << " each " \
951 << "(" << counts[Idx] * sizeof(Name##Type) \
953 TotalBytes += counts[Idx] * sizeof(Name##Type); \
955#define ABSTRACT_TYPE(Name, Parent)
956#include "clang/AST/TypeNodes.inc"
958 llvm::errs() <<
"Total bytes = " << TotalBytes <<
"\n";
963 <<
" implicit default constructors created\n";
966 <<
" implicit copy constructors created\n";
970 <<
" implicit move constructors created\n";
973 <<
" implicit copy assignment operators created\n";
977 <<
" implicit move assignment operators created\n";
980 <<
" implicit destructors created\n";
983 llvm::errs() <<
"\n";
987 BumpAlloc.PrintStats();
991 bool NotifyListeners) {
995 Listener->RedefinedHiddenDefinition(ND, M);
1002 if (It == MergedDefModules.end())
1005 auto &Merged = It->second;
1006 llvm::DenseSet<Module*>
Found;
1007 for (
Module *&M : Merged)
1008 if (!
Found.insert(M).second)
1010 llvm::erase(Merged,
nullptr);
1017 if (MergedIt == MergedDefModules.end())
1019 return MergedIt->second;
1022void ASTContext::PerModuleInitializers::resolve(
ASTContext &Ctx) {
1023 if (LazyInitializers.empty())
1027 assert(Source &&
"lazy initializers but no external source");
1029 auto LazyInits = std::move(LazyInitializers);
1030 LazyInitializers.clear();
1032 for (
auto ID : LazyInits)
1033 Initializers.push_back(Source->GetExternalDecl(ID));
1035 assert(LazyInitializers.empty() &&
1036 "GetExternalDecl for lazy module initializer added more inits");
1042 if (
const auto *ID = dyn_cast<ImportDecl>(D)) {
1043 auto It = ModuleInitializers.find(ID->getImportedModule());
1046 if (It == ModuleInitializers.end())
1050 auto &Imported = *It->second;
1051 if (Imported.Initializers.size() + Imported.LazyInitializers.size() == 1) {
1052 Imported.resolve(*
this);
1053 auto *OnlyDecl = Imported.Initializers.front();
1059 auto *&Inits = ModuleInitializers[M];
1061 Inits =
new (*this) PerModuleInitializers;
1062 Inits->Initializers.push_back(D);
1067 auto *&Inits = ModuleInitializers[M];
1069 Inits =
new (*this) PerModuleInitializers;
1070 Inits->LazyInitializers.insert(Inits->LazyInitializers.end(),
1071 IDs.begin(), IDs.end());
1075 auto It = ModuleInitializers.find(M);
1076 if (It == ModuleInitializers.end())
1079 auto *Inits = It->second;
1080 Inits->resolve(*
this);
1081 return Inits->Initializers;
1086 assert(!CurrentCXXNamedModule &&
1087 "We should set named module for ASTContext for only once");
1088 CurrentCXXNamedModule = M;
1100 auto GetRepresentativeModule = [
this](
const Module *M) {
1101 auto Iter = SameModuleLookupSet.find(M);
1102 if (Iter != SameModuleLookupSet.end())
1103 return Iter->second;
1105 const Module *RepresentativeModule =
1106 PrimaryModuleNameMap.try_emplace(M->getPrimaryModuleInterfaceName(), M)
1108 SameModuleLookupSet[M] = RepresentativeModule;
1109 return RepresentativeModule;
1112 assert(M1 &&
"Shouldn't call `isInSameModule` if both M1 and M2 are none.");
1113 return GetRepresentativeModule(M1) == GetRepresentativeModule(M2);
1117 if (!ExternCContext)
1120 return ExternCContext;
1134#define BuiltinTemplate(BTName) \
1135 BuiltinTemplateDecl *ASTContext::get##BTName##Decl() const { \
1136 if (!Decl##BTName) \
1138 buildBuiltinTemplateDecl(BTK##BTName, get##BTName##Name()); \
1139 return Decl##BTName; \
1141#include "clang/Basic/BuiltinTemplates.inc"
1154 NewDecl->
addAttr(TypeVisibilityAttr::CreateImplicit(
1155 const_cast<ASTContext &
>(*
this), TypeVisibilityAttr::Default));
1160 StringRef Name)
const {
1184 Types.push_back(Ty);
1189 assert((!this->Target || this->Target == &Target) &&
1190 "Incorrect target reinitialization");
1191 assert(
VoidTy.isNull() &&
"Context reinitialized?");
1193 this->Target = &Target;
1194 this->AuxTarget = AuxTarget;
1196 ABI.reset(createCXXABI(Target));
1200 InitBuiltinType(
VoidTy, BuiltinType::Void);
1203 InitBuiltinType(
BoolTy, BuiltinType::Bool);
1205 if (LangOpts.CharIsSigned)
1206 InitBuiltinType(
CharTy, BuiltinType::Char_S);
1208 InitBuiltinType(
CharTy, BuiltinType::Char_U);
1211 InitBuiltinType(
ShortTy, BuiltinType::Short);
1212 InitBuiltinType(
IntTy, BuiltinType::Int);
1213 InitBuiltinType(
LongTy, BuiltinType::Long);
1214 InitBuiltinType(
LongLongTy, BuiltinType::LongLong);
1224 InitBuiltinType(
FloatTy, BuiltinType::Float);
1225 InitBuiltinType(
DoubleTy, BuiltinType::Double);
1226 InitBuiltinType(
LongDoubleTy, BuiltinType::LongDouble);
1229 InitBuiltinType(
Float128Ty, BuiltinType::Float128);
1232 InitBuiltinType(
Ibm128Ty, BuiltinType::Ibm128);
1235 InitBuiltinType(
Float16Ty, BuiltinType::Float16);
1238 InitBuiltinType(
ShortAccumTy, BuiltinType::ShortAccum);
1239 InitBuiltinType(
AccumTy, BuiltinType::Accum);
1240 InitBuiltinType(
LongAccumTy, BuiltinType::LongAccum);
1244 InitBuiltinType(
ShortFractTy, BuiltinType::ShortFract);
1245 InitBuiltinType(
FractTy, BuiltinType::Fract);
1246 InitBuiltinType(
LongFractTy, BuiltinType::LongFract);
1251 InitBuiltinType(
SatAccumTy, BuiltinType::SatAccum);
1257 InitBuiltinType(
SatFractTy, BuiltinType::SatFract);
1264 InitBuiltinType(
Int128Ty, BuiltinType::Int128);
1269 InitBuiltinType(
WCharTy, BuiltinType::WChar_S);
1271 InitBuiltinType(
WCharTy, BuiltinType::WChar_U);
1272 if (LangOpts.CPlusPlus && LangOpts.WChar)
1276 WideCharTy = getFromTargetType(Target.getWCharType());
1279 WIntTy = getFromTargetType(Target.getWIntType());
1282 InitBuiltinType(
Char8Ty, BuiltinType::Char8);
1284 if (LangOpts.CPlusPlus)
1285 InitBuiltinType(
Char16Ty, BuiltinType::Char16);
1287 Char16Ty = getFromTargetType(Target.getChar16Type());
1289 if (LangOpts.CPlusPlus)
1290 InitBuiltinType(
Char32Ty, BuiltinType::Char32);
1292 Char32Ty = getFromTargetType(Target.getChar32Type());
1299 InitBuiltinType(
DependentTy, BuiltinType::Dependent);
1302 InitBuiltinType(
OverloadTy, BuiltinType::Overload);
1314 InitBuiltinType(
UnknownAnyTy, BuiltinType::UnknownAny);
1320 InitBuiltinType(
BuiltinFnTy, BuiltinType::BuiltinFn);
1323 if (LangOpts.OpenMP) {
1330 if (LangOpts.OpenACC && !LangOpts.OpenMP) {
1333 if (LangOpts.MatrixTypes)
1341 if (LangOpts.OpenCL) {
1342#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
1343 InitBuiltinType(SingletonId, BuiltinType::Id);
1344#include "clang/Basic/OpenCLImageTypes.def"
1346 InitBuiltinType(
OCLSamplerTy, BuiltinType::OCLSampler);
1347 InitBuiltinType(
OCLEventTy, BuiltinType::OCLEvent);
1349 InitBuiltinType(
OCLQueueTy, BuiltinType::OCLQueue);
1352#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
1353 InitBuiltinType(Id##Ty, BuiltinType::Id);
1354#include "clang/Basic/OpenCLExtensionTypes.def"
1357 if (LangOpts.HLSL) {
1358#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) \
1359 InitBuiltinType(SingletonId, BuiltinType::Id);
1360#include "clang/Basic/HLSLIntangibleTypes.def"
1363 if (Target.hasAArch64ACLETypes() ||
1364 (AuxTarget && AuxTarget->hasAArch64ACLETypes())) {
1365#define SVE_TYPE(Name, Id, SingletonId) \
1366 InitBuiltinType(SingletonId, BuiltinType::Id);
1367#include "clang/Basic/AArch64ACLETypes.def"
1370 if (Target.getTriple().isPPC64()) {
1371#define PPC_VECTOR_MMA_TYPE(Name, Id, Size) \
1372 InitBuiltinType(Id##Ty, BuiltinType::Id);
1373#include "clang/Basic/PPCTypes.def"
1374#define PPC_VECTOR_VSX_TYPE(Name, Id, Size) \
1375 InitBuiltinType(Id##Ty, BuiltinType::Id);
1376#include "clang/Basic/PPCTypes.def"
1379 if (Target.hasRISCVVTypes()) {
1380#define RVV_TYPE(Name, Id, SingletonId) \
1381 InitBuiltinType(SingletonId, BuiltinType::Id);
1382#include "clang/Basic/RISCVVTypes.def"
1385 if (Target.getTriple().isWasm() && Target.hasFeature(
"reference-types")) {
1386#define WASM_TYPE(Name, Id, SingletonId) \
1387 InitBuiltinType(SingletonId, BuiltinType::Id);
1388#include "clang/Basic/WebAssemblyReferenceTypes.def"
1391 if (Target.getTriple().isAMDGPU() ||
1392 (AuxTarget && AuxTarget->getTriple().isAMDGPU())) {
1393#define AMDGPU_TYPE(Name, Id, SingletonId, Width, Align) \
1394 InitBuiltinType(SingletonId, BuiltinType::Id);
1395#include "clang/Basic/AMDGPUTypes.def"
1402 ObjCConstantStringType =
QualType();
1407 if (LangOpts.OpenCLGenericAddressSpace) {
1408 auto Q =
VoidTy.getQualifiers();
1417 InitBuiltinType(
NullPtrTy, BuiltinType::NullPtr);
1420 InitBuiltinType(
HalfTy, BuiltinType::Half);
1422 InitBuiltinType(
BFloat16Ty, BuiltinType::BFloat16);
1428 if (LangOpts.MicrosoftExt || LangOpts.Borland) {
1435 return SourceMgr.getDiagnostics();
1450 llvm::DenseMap<const Decl*, AttrVec*>::iterator Pos = DeclAttrs.find(D);
1451 if (Pos != DeclAttrs.end()) {
1452 Pos->second->~AttrVec();
1453 DeclAttrs.erase(Pos);
1467 llvm::DenseMap<const VarDecl *, TemplateOrSpecializationInfo>::iterator Pos =
1468 TemplateOrInstantiation.find(Var);
1469 if (Pos == TemplateOrInstantiation.end())
1482 Tmpl, TSK, PointOfInstantiation));
1488 assert(!TemplateOrInstantiation[Inst] &&
1489 "Already noted what the variable was instantiated from");
1490 TemplateOrInstantiation[Inst] = TSI;
1495 return InstantiatedFromUsingDecl.lookup(UUD);
1503 "pattern decl is not a using decl");
1507 "instantiation did not produce a using decl");
1508 assert(!InstantiatedFromUsingDecl[Inst] &&
"pattern already exists");
1509 InstantiatedFromUsingDecl[Inst] = Pattern;
1514 return InstantiatedFromUsingEnumDecl.lookup(UUD);
1519 assert(!InstantiatedFromUsingEnumDecl[Inst] &&
"pattern already exists");
1520 InstantiatedFromUsingEnumDecl[Inst] = Pattern;
1525 return InstantiatedFromUsingShadowDecl.lookup(Inst);
1531 assert(!InstantiatedFromUsingShadowDecl[Inst] &&
"pattern already exists");
1532 InstantiatedFromUsingShadowDecl[Inst] = Pattern;
1537 return InstantiatedFromUnnamedFieldDecl.lookup(Field);
1543 "Instantiated field decl is not unnamed");
1545 "Template field decl is not unnamed");
1546 assert(!InstantiatedFromUnnamedFieldDecl[Inst] &&
1547 "Already noted what unnamed field was instantiated from");
1549 InstantiatedFromUnnamedFieldDecl[Inst] = Tmpl;
1565 return Range.end() - Range.begin();
1570 llvm::DenseMap<const CXXMethodDecl *, CXXMethodVector>::const_iterator Pos =
1571 OverriddenMethods.find(
Method->getCanonicalDecl());
1572 if (Pos == OverriddenMethods.end())
1580 OverriddenMethods[
Method].push_back(Overridden);
1588 if (
const auto *CXXMethod = dyn_cast<CXXMethodDecl>(D)) {
1594 const auto *
Method = dyn_cast<ObjCMethodDecl>(D);
1599 Method->getOverriddenMethods(OverDecls);
1600 Overridden.append(OverDecls.begin(), OverDecls.end());
1603std::optional<ASTContext::CXXRecordDeclRelocationInfo>
1607 auto it = RelocatableClasses.find(D);
1608 if (it != RelocatableClasses.end())
1609 return it->getSecond();
1610 return std::nullopt;
1617 assert(RelocatableClasses.find(D) == RelocatableClasses.end());
1618 RelocatableClasses.insert({D, Info});
1623 if (!Class->isPolymorphic())
1625 const CXXRecordDecl *BaseType = Context.baseForVTableAuthentication(Class);
1626 using AuthAttr = VTablePointerAuthenticationAttr;
1627 const AuthAttr *ExplicitAuth = BaseType->
getAttr<AuthAttr>();
1629 return Context.getLangOpts().PointerAuthVTPtrAddressDiscrimination;
1630 AuthAttr::AddressDiscriminationMode AddressDiscrimination =
1631 ExplicitAuth->getAddressDiscrimination();
1632 if (AddressDiscrimination == AuthAttr::DefaultAddressDiscrimination)
1633 return Context.getLangOpts().PointerAuthVTPtrAddressDiscrimination;
1634 return AddressDiscrimination == AuthAttr::AddressDiscrimination;
1637ASTContext::PointerAuthContent
1638ASTContext::findPointerAuthContent(QualType
T)
const {
1639 assert(isPointerAuthenticationAvailable());
1641 T =
T.getCanonicalType();
1643 return PointerAuthContent::None;
1645 if (
T.hasAddressDiscriminatedPointerAuth())
1646 return PointerAuthContent::AddressDiscriminatedData;
1649 return PointerAuthContent::None;
1652 return PointerAuthContent::None;
1654 if (
auto Existing = RecordContainsAddressDiscriminatedPointerAuth.find(RD);
1655 Existing != RecordContainsAddressDiscriminatedPointerAuth.end())
1656 return Existing->second;
1658 PointerAuthContent
Result = PointerAuthContent::None;
1660 auto SaveResultAndReturn = [&]() -> PointerAuthContent {
1661 auto [ResultIter, DidAdd] =
1662 RecordContainsAddressDiscriminatedPointerAuth.try_emplace(RD,
Result);
1668 auto ShouldContinueAfterUpdate = [&](PointerAuthContent NewResult) {
1669 static_assert(PointerAuthContent::None <
1670 PointerAuthContent::AddressDiscriminatedVTable);
1671 static_assert(PointerAuthContent::AddressDiscriminatedVTable <
1672 PointerAuthContent::AddressDiscriminatedData);
1675 return Result != PointerAuthContent::AddressDiscriminatedData;
1677 if (
const CXXRecordDecl *CXXRD = dyn_cast<CXXRecordDecl>(RD)) {
1679 !ShouldContinueAfterUpdate(
1680 PointerAuthContent::AddressDiscriminatedVTable))
1681 return SaveResultAndReturn();
1682 for (
auto Base : CXXRD->bases()) {
1683 if (!ShouldContinueAfterUpdate(findPointerAuthContent(
Base.getType())))
1684 return SaveResultAndReturn();
1687 for (
auto *FieldDecl : RD->
fields()) {
1688 if (!ShouldContinueAfterUpdate(
1689 findPointerAuthContent(FieldDecl->getType())))
1690 return SaveResultAndReturn();
1692 return SaveResultAndReturn();
1696 assert(!Import->getNextLocalImport() &&
1697 "Import declaration already in the chain");
1698 assert(!Import->isFromASTFile() &&
"Non-local import declaration");
1699 if (!FirstLocalImport) {
1700 FirstLocalImport = Import;
1701 LastLocalImport = Import;
1705 LastLocalImport->setNextLocalImport(Import);
1706 LastLocalImport = Import;
1718 llvm_unreachable(
"Not a floating point type!");
1719 case BuiltinType::BFloat16:
1720 return Target->getBFloat16Format();
1721 case BuiltinType::Float16:
1722 return Target->getHalfFormat();
1723 case BuiltinType::Half:
1724 return Target->getHalfFormat();
1725 case BuiltinType::Float:
return Target->getFloatFormat();
1726 case BuiltinType::Double:
return Target->getDoubleFormat();
1727 case BuiltinType::Ibm128:
1728 return Target->getIbm128Format();
1729 case BuiltinType::LongDouble:
1731 return AuxTarget->getLongDoubleFormat();
1732 return Target->getLongDoubleFormat();
1733 case BuiltinType::Float128:
1735 return AuxTarget->getFloat128Format();
1736 return Target->getFloat128Format();
1741 unsigned Align = Target->getCharWidth();
1745 Align = AlignFromAttr;
1753 bool UseAlignAttrOnly;
1754 if (
const FieldDecl *FD = dyn_cast<FieldDecl>(D))
1756 FD->hasAttr<PackedAttr>() || FD->getParent()->hasAttr<PackedAttr>();
1758 UseAlignAttrOnly = AlignFromAttr != 0;
1761 if (UseAlignAttrOnly) {
1763 }
else if (
const auto *VD = dyn_cast<ValueDecl>(D)) {
1767 T = RT->getPointeeType();
1772 if (
T->isFunctionType())
1773 Align = getTypeInfoImpl(
T.getTypePtr()).Align;
1778 unsigned MinWidth = Target->getLargeArrayMinWidth();
1779 if (!ForAlignof && MinWidth) {
1781 Align = std::max(Align, Target->getLargeArrayAlign());
1784 Align = std::max(Align, Target->getLargeArrayAlign());
1789 Align = Target->getCharWidth();
1793 if (
const auto *VD = dyn_cast<VarDecl>(D))
1794 if (VD->hasGlobalStorage() && !ForAlignof) {
1805 if (
const auto *Field = dyn_cast<FieldDecl>(VD)) {
1819 uint64_t LowBitOfOffset = Offset & (~Offset + 1);
1820 if (LowBitOfOffset < FieldAlign)
1821 FieldAlign =
static_cast<unsigned>(LowBitOfOffset);
1824 Align = std::min(Align, FieldAlign);
1832 const auto *VD = dyn_cast<VarDecl>(D);
1833 if (MaxAlignedAttr && VD && VD->getStorageClass() ==
SC_Static)
1834 Align = std::min(Align, MaxAlignedAttr);
1854 if (
const auto *RD =
T->getAsCXXRecordDecl(); RD && !RD->
isInvalidDecl()) {
1871 (uint64_t)(-1)/Size) &&
1872 "Overflow in array type char size evaluation");
1875 if (!Context.getTargetInfo().getCXXABI().isMicrosoft() ||
1877 Width = llvm::alignTo(Width, Align);
1884 if (
const auto *CAT = dyn_cast<ConstantArrayType>(
T))
1902 switch (BT->getKind()) {
1903 case BuiltinType::Bool:
1904 case BuiltinType::Char_S:
1905 case BuiltinType::Char_U:
1906 case BuiltinType::SChar:
1907 case BuiltinType::UChar:
1908 case BuiltinType::Short:
1909 case BuiltinType::UShort:
1910 case BuiltinType::WChar_S:
1911 case BuiltinType::WChar_U:
1912 case BuiltinType::Char8:
1913 case BuiltinType::Char16:
1914 case BuiltinType::Char32:
1922 if (
const auto *ED =
T->getAsEnumDecl()) {
1923 if (
T->isDependentType() || ED->getPromotionType().isNull() ||
1942 bool NeedsPreferredAlignment)
const {
1945 if (
unsigned Align = TT->getDecl()->getMaxAlignment())
1950 if (!
T->isIncompleteType())
1956 if (
unsigned Align = TT->getDecl()->getMaxAlignment())
1960 if (
const auto *TD =
T->getAsTagDecl())
1961 return TD->getMaxAlignment();
1967 TypeInfoMap::iterator I = MemoizedTypeInfo.find(
T);
1968 if (I != MemoizedTypeInfo.end())
1973 MemoizedTypeInfo[
T] = TI;
1988 switch (
T->getTypeClass()) {
1989#define TYPE(Class, Base)
1990#define ABSTRACT_TYPE(Class, Base)
1991#define NON_CANONICAL_TYPE(Class, Base)
1992#define DEPENDENT_TYPE(Class, Base) case Type::Class:
1993#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base) \
1995 assert(!T->isDependentType() && "should not see dependent types here"); \
1996 return getTypeInfo(cast<Class##Type>(T)->desugar().getTypePtr());
1997#include "clang/AST/TypeNodes.inc"
1998 llvm_unreachable(
"Should not see dependent types");
2000 case Type::FunctionNoProto:
2001 case Type::FunctionProto:
2007 case Type::IncompleteArray:
2008 case Type::VariableArray:
2009 case Type::ConstantArray:
2010 case Type::ArrayParameter: {
2013 if (
const auto *CAT = dyn_cast<ConstantArrayType>(
T))
2014 Size = CAT->getZExtSize();
2017 assert((Size == 0 || EltInfo.
Width <= (uint64_t)(-1) / Size) &&
2018 "Overflow in array type bit size evaluation");
2019 Width = EltInfo.
Width * Size;
2020 Align = EltInfo.
Align;
2024 Width = llvm::alignTo(Width, Align);
2028 case Type::ExtVector:
2029 case Type::Vector: {
2032 Width = VT->isPackedVectorBoolType(*
this)
2033 ? VT->getNumElements()
2034 : EltInfo.
Width * VT->getNumElements();
2036 Width = std::max<unsigned>(8, Width);
2037 Align = std::max<unsigned>(8, Width);
2041 if (Align & (Align-1)) {
2042 Align = llvm::bit_ceil(Align);
2043 Width = llvm::alignTo(Width, Align);
2046 uint64_t TargetVectorAlign = Target->getMaxVectorAlign();
2047 if (TargetVectorAlign && TargetVectorAlign < Align)
2048 Align = TargetVectorAlign;
2062 Align = std::min<unsigned>(64, Width);
2066 case Type::ConstantMatrix: {
2068 TypeInfo ElementInfo =
getTypeInfo(MT->getElementType());
2072 Width = ElementInfo.
Width * MT->getNumRows() * MT->getNumColumns();
2073 Align = ElementInfo.
Align;
2079 default: llvm_unreachable(
"Unknown builtin type!");
2080 case BuiltinType::Void:
2085 case BuiltinType::Bool:
2086 Width = Target->getBoolWidth();
2087 Align = Target->getBoolAlign();
2089 case BuiltinType::Char_S:
2090 case BuiltinType::Char_U:
2091 case BuiltinType::UChar:
2092 case BuiltinType::SChar:
2093 case BuiltinType::Char8:
2094 Width = Target->getCharWidth();
2095 Align = Target->getCharAlign();
2097 case BuiltinType::WChar_S:
2098 case BuiltinType::WChar_U:
2099 Width = Target->getWCharWidth();
2100 Align = Target->getWCharAlign();
2102 case BuiltinType::Char16:
2103 Width = Target->getChar16Width();
2104 Align = Target->getChar16Align();
2106 case BuiltinType::Char32:
2107 Width = Target->getChar32Width();
2108 Align = Target->getChar32Align();
2110 case BuiltinType::UShort:
2111 case BuiltinType::Short:
2112 Width = Target->getShortWidth();
2113 Align = Target->getShortAlign();
2115 case BuiltinType::UInt:
2116 case BuiltinType::Int:
2117 Width = Target->getIntWidth();
2118 Align = Target->getIntAlign();
2120 case BuiltinType::ULong:
2121 case BuiltinType::Long:
2122 Width = Target->getLongWidth();
2123 Align = Target->getLongAlign();
2125 case BuiltinType::ULongLong:
2126 case BuiltinType::LongLong:
2127 Width = Target->getLongLongWidth();
2128 Align = Target->getLongLongAlign();
2130 case BuiltinType::Int128:
2131 case BuiltinType::UInt128:
2133 Align = Target->getInt128Align();
2135 case BuiltinType::ShortAccum:
2136 case BuiltinType::UShortAccum:
2137 case BuiltinType::SatShortAccum:
2138 case BuiltinType::SatUShortAccum:
2139 Width = Target->getShortAccumWidth();
2140 Align = Target->getShortAccumAlign();
2142 case BuiltinType::Accum:
2143 case BuiltinType::UAccum:
2144 case BuiltinType::SatAccum:
2145 case BuiltinType::SatUAccum:
2146 Width = Target->getAccumWidth();
2147 Align = Target->getAccumAlign();
2149 case BuiltinType::LongAccum:
2150 case BuiltinType::ULongAccum:
2151 case BuiltinType::SatLongAccum:
2152 case BuiltinType::SatULongAccum:
2153 Width = Target->getLongAccumWidth();
2154 Align = Target->getLongAccumAlign();
2156 case BuiltinType::ShortFract:
2157 case BuiltinType::UShortFract:
2158 case BuiltinType::SatShortFract:
2159 case BuiltinType::SatUShortFract:
2160 Width = Target->getShortFractWidth();
2161 Align = Target->getShortFractAlign();
2163 case BuiltinType::Fract:
2164 case BuiltinType::UFract:
2165 case BuiltinType::SatFract:
2166 case BuiltinType::SatUFract:
2167 Width = Target->getFractWidth();
2168 Align = Target->getFractAlign();
2170 case BuiltinType::LongFract:
2171 case BuiltinType::ULongFract:
2172 case BuiltinType::SatLongFract:
2173 case BuiltinType::SatULongFract:
2174 Width = Target->getLongFractWidth();
2175 Align = Target->getLongFractAlign();
2177 case BuiltinType::BFloat16:
2178 if (Target->hasBFloat16Type()) {
2179 Width = Target->getBFloat16Width();
2180 Align = Target->getBFloat16Align();
2184 AuxTarget->hasBFloat16Type()) {
2185 Width = AuxTarget->getBFloat16Width();
2186 Align = AuxTarget->getBFloat16Align();
2189 case BuiltinType::Float16:
2190 case BuiltinType::Half:
2191 if (Target->hasFloat16Type() || !
getLangOpts().OpenMP ||
2193 Width = Target->getHalfWidth();
2194 Align = Target->getHalfAlign();
2197 "Expected OpenMP device compilation.");
2198 Width = AuxTarget->getHalfWidth();
2199 Align = AuxTarget->getHalfAlign();
2202 case BuiltinType::Float:
2203 Width = Target->getFloatWidth();
2204 Align = Target->getFloatAlign();
2206 case BuiltinType::Double:
2207 Width = Target->getDoubleWidth();
2208 Align = Target->getDoubleAlign();
2210 case BuiltinType::Ibm128:
2211 Width = Target->getIbm128Width();
2212 Align = Target->getIbm128Align();
2214 case BuiltinType::LongDouble:
2216 (Target->getLongDoubleWidth() != AuxTarget->getLongDoubleWidth() ||
2217 Target->getLongDoubleAlign() != AuxTarget->getLongDoubleAlign())) {
2218 Width = AuxTarget->getLongDoubleWidth();
2219 Align = AuxTarget->getLongDoubleAlign();
2221 Width = Target->getLongDoubleWidth();
2222 Align = Target->getLongDoubleAlign();
2225 case BuiltinType::Float128:
2226 if (Target->hasFloat128Type() || !
getLangOpts().OpenMP ||
2228 Width = Target->getFloat128Width();
2229 Align = Target->getFloat128Align();
2232 "Expected OpenMP device compilation.");
2233 Width = AuxTarget->getFloat128Width();
2234 Align = AuxTarget->getFloat128Align();
2237 case BuiltinType::NullPtr:
2242 case BuiltinType::ObjCId:
2243 case BuiltinType::ObjCClass:
2244 case BuiltinType::ObjCSel:
2248 case BuiltinType::OCLSampler:
2249 case BuiltinType::OCLEvent:
2250 case BuiltinType::OCLClkEvent:
2251 case BuiltinType::OCLQueue:
2252 case BuiltinType::OCLReserveID:
2253#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
2254 case BuiltinType::Id:
2255#include "clang/Basic/OpenCLImageTypes.def"
2256#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
2257 case BuiltinType::Id:
2258#include "clang/Basic/OpenCLExtensionTypes.def"
2260 Width = Target->getPointerWidth(AS);
2261 Align = Target->getPointerAlign(AS);
2271#define SVE_VECTOR_TYPE(Name, MangledName, Id, SingletonId) \
2272 case BuiltinType::Id: \
2276#define SVE_PREDICATE_TYPE(Name, MangledName, Id, SingletonId) \
2277 case BuiltinType::Id: \
2281#define SVE_OPAQUE_TYPE(Name, MangledName, Id, SingletonId) \
2282 case BuiltinType::Id: \
2286#define SVE_SCALAR_TYPE(Name, MangledName, Id, SingletonId, Bits) \
2287 case BuiltinType::Id: \
2291#include "clang/Basic/AArch64ACLETypes.def"
2292#define PPC_VECTOR_TYPE(Name, Id, Size) \
2293 case BuiltinType::Id: \
2297#include "clang/Basic/PPCTypes.def"
2298#define RVV_VECTOR_TYPE(Name, Id, SingletonId, ElKind, ElBits, NF, IsSigned, \
2300 case BuiltinType::Id: \
2304#define RVV_PREDICATE_TYPE(Name, Id, SingletonId, ElKind) \
2305 case BuiltinType::Id: \
2309#include "clang/Basic/RISCVVTypes.def"
2310#define WASM_TYPE(Name, Id, SingletonId) \
2311 case BuiltinType::Id: \
2315#include "clang/Basic/WebAssemblyReferenceTypes.def"
2316#define AMDGPU_TYPE(NAME, ID, SINGLETONID, WIDTH, ALIGN) \
2317 case BuiltinType::ID: \
2321#include "clang/Basic/AMDGPUTypes.def"
2322#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
2323#include "clang/Basic/HLSLIntangibleTypes.def"
2329 case Type::ObjCObjectPointer:
2333 case Type::BlockPointer:
2335 Width = Target->getPointerWidth(AS);
2336 Align = Target->getPointerAlign(AS);
2338 case Type::LValueReference:
2339 case Type::RValueReference:
2343 Width = Target->getPointerWidth(AS);
2344 Align = Target->getPointerAlign(AS);
2348 Width = Target->getPointerWidth(AS);
2349 Align = Target->getPointerAlign(AS);
2351 case Type::MemberPointer: {
2353 CXXABI::MemberPointerInfo MPI = ABI->getMemberPointerInfo(MPT);
2358 case Type::Complex: {
2362 Width = EltInfo.
Width * 2;
2363 Align = EltInfo.
Align;
2366 case Type::ObjCObject:
2368 case Type::Adjusted:
2371 case Type::ObjCInterface: {
2373 if (ObjCI->getDecl()->isInvalidDecl()) {
2383 case Type::BitInt: {
2385 Align = Target->getBitIntAlign(EIT->getNumBits());
2386 Width = Target->getBitIntWidth(EIT->getNumBits());
2392 const TagDecl *TD = TT->getDecl()->getDefinitionOrSelf();
2405 Info.
Align = AttrAlign;
2415 AlignRequirement = RD->
hasAttr<AlignedAttr>()
2421 case Type::SubstTemplateTypeParm:
2423 getReplacementType().getTypePtr());
2426 case Type::DeducedTemplateSpecialization: {
2428 assert(!A->getDeducedType().isNull() &&
2429 "cannot request the size of an undeduced or dependent auto type");
2430 return getTypeInfo(A->getDeducedType().getTypePtr());
2436 case Type::MacroQualified:
2440 case Type::ObjCTypeParam:
2446 case Type::Typedef: {
2448 TypeInfo Info =
getTypeInfo(TT->desugar().getTypePtr());
2452 if (
unsigned AttrAlign = TT->getDecl()->getMaxAlignment()) {
2463 case Type::Attributed:
2467 case Type::CountAttributed:
2470 case Type::BTFTagAttributed:
2474 case Type::HLSLAttributedResource:
2478 case Type::HLSLInlineSpirv: {
2481 Width = ST->getSize() * 8;
2482 Align = ST->getAlignment();
2483 if (Width == 0 && Align == 0) {
2491 case Type::Atomic: {
2500 Width = Target->getCharWidth();
2502 }
else if (Width <= Target->getMaxAtomicPromoteWidth()) {
2508 Width = llvm::bit_ceil(Width);
2511 Align =
static_cast<unsigned>(Width);
2516 case Type::PredefinedSugar:
2525 assert(llvm::isPowerOf2_32(Align) &&
"Alignment must be power of 2");
2526 return TypeInfo(Width, Align, AlignRequirement);
2530 UnadjustedAlignMap::iterator I = MemoizedUnadjustedAlign.find(
T);
2531 if (I != MemoizedUnadjustedAlign.end())
2534 unsigned UnadjustedAlign;
2535 if (
const auto *RT =
T->getAsCanonical<RecordType>()) {
2542 UnadjustedAlign =
getTypeAlign(
T->getUnqualifiedDesugaredType());
2545 MemoizedUnadjustedAlign[
T] = UnadjustedAlign;
2546 return UnadjustedAlign;
2550 unsigned SimdAlign = llvm::OpenMPIRBuilder::getOpenMPDefaultSimdAlign(
2600 unsigned ABIAlign = TI.
Align;
2602 T =
T->getBaseElementTypeUnsafe();
2605 if (
T->isMemberPointerType())
2608 if (!Target->allowsLargerPreferedTypeAlignment())
2611 if (
const auto *RD =
T->getAsRecordDecl()) {
2620 unsigned PreferredAlign =
static_cast<unsigned>(
2622 assert(PreferredAlign >= ABIAlign &&
2623 "PreferredAlign should be at least as large as ABIAlign.");
2624 return PreferredAlign;
2631 T = CT->getElementType().getTypePtr();
2632 if (
const auto *ED =
T->getAsEnumDecl())
2633 T = ED->getIntegerType().getTypePtr();
2634 if (
T->isSpecificBuiltinType(BuiltinType::Double) ||
2635 T->isSpecificBuiltinType(BuiltinType::LongLong) ||
2636 T->isSpecificBuiltinType(BuiltinType::ULongLong) ||
2637 (
T->isSpecificBuiltinType(BuiltinType::LongDouble) &&
2638 Target->defaultsToAIXPowerAlignment()))
2693 for (
unsigned I = 0, N = Path.size(); I != N; ++I) {
2697 std::swap(
Base, Derived);
2717 llvm::append_range(Ivars, OI->
ivars());
2720 for (
const ObjCIvarDecl *Iv = IDecl->all_declared_ivar_begin(); Iv;
2722 Ivars.push_back(Iv);
2730 if (
const auto *OI = dyn_cast<ObjCInterfaceDecl>(CDecl)) {
2733 for (
auto *Proto : OI->all_referenced_protocols()) {
2738 for (
const auto *Cat : OI->visible_categories())
2744 SD = SD->getSuperClass();
2746 }
else if (
const auto *OC = dyn_cast<ObjCCategoryDecl>(CDecl)) {
2747 for (
auto *Proto : OC->protocols()) {
2750 }
else if (
const auto *OP = dyn_cast<ObjCProtocolDecl>(CDecl)) {
2752 if (!Protocols.insert(
2756 for (
auto *Proto : OP->protocols())
2763 bool CheckIfTriviallyCopyable) {
2764 assert(RD->
isUnion() &&
"Must be union type");
2766 Context.getTypeSizeInChars(Context.getCanonicalTagType(RD));
2768 for (
const auto *Field : RD->
fields()) {
2769 if (!Context.hasUniqueObjectRepresentations(Field->getType(),
2770 CheckIfTriviallyCopyable))
2772 CharUnits FieldSize = Context.getTypeSizeInChars(Field->getType());
2773 if (FieldSize != UnionSize)
2782 return Context.getFieldOffset(Field);
2791static std::optional<int64_t>
2793 const RecordDecl *RD,
2794 bool CheckIfTriviallyCopyable);
2796static std::optional<int64_t>
2798 bool CheckIfTriviallyCopyable) {
2799 if (
const auto *RD = Field->getType()->getAsRecordDecl();
2802 CheckIfTriviallyCopyable);
2806 bool IsBitIntType = Field->getType()->isBitIntType();
2807 if (!Field->getType()->isReferenceType() && !IsBitIntType &&
2808 !Context.hasUniqueObjectRepresentations(Field->getType(),
2809 CheckIfTriviallyCopyable))
2810 return std::nullopt;
2812 int64_t FieldSizeInBits =
2813 Context.toBits(Context.getTypeSizeInChars(Field->getType()));
2814 if (Field->isBitField()) {
2817 if (Field->isUnnamedBitField())
2820 int64_t BitfieldSize = Field->getBitWidthValue();
2822 if ((
unsigned)BitfieldSize >
2824 return std::nullopt;
2825 }
else if (BitfieldSize > FieldSizeInBits) {
2826 return std::nullopt;
2828 FieldSizeInBits = BitfieldSize;
2829 }
else if (IsBitIntType && !Context.hasUniqueObjectRepresentations(
2830 Field->getType(), CheckIfTriviallyCopyable)) {
2831 return std::nullopt;
2833 return FieldSizeInBits;
2836static std::optional<int64_t>
2838 bool CheckIfTriviallyCopyable) {
2840 CheckIfTriviallyCopyable);
2843template <
typename RangeT>
2845 const RangeT &Subobjects, int64_t CurOffsetInBits,
2847 bool CheckIfTriviallyCopyable) {
2848 for (
const auto *Subobject : Subobjects) {
2849 std::optional<int64_t> SizeInBits =
2852 return std::nullopt;
2853 if (*SizeInBits != 0) {
2855 if (Offset != CurOffsetInBits)
2856 return std::nullopt;
2857 CurOffsetInBits += *SizeInBits;
2860 return CurOffsetInBits;
2863static std::optional<int64_t>
2866 bool CheckIfTriviallyCopyable) {
2867 assert(!RD->
isUnion() &&
"Must be struct/class type");
2868 const auto &Layout = Context.getASTRecordLayout(RD);
2870 int64_t CurOffsetInBits = 0;
2871 if (
const auto *ClassDecl = dyn_cast<CXXRecordDecl>(RD)) {
2872 if (ClassDecl->isDynamicClass())
2873 return std::nullopt;
2876 for (
const auto &
Base : ClassDecl->bases()) {
2879 Bases.emplace_back(
Base.getType()->getAsCXXRecordDecl());
2883 return Layout.getBaseClassOffset(L) < Layout.getBaseClassOffset(R);
2886 std::optional<int64_t> OffsetAfterBases =
2888 Bases, CurOffsetInBits, Context, Layout, CheckIfTriviallyCopyable);
2889 if (!OffsetAfterBases)
2890 return std::nullopt;
2891 CurOffsetInBits = *OffsetAfterBases;
2894 std::optional<int64_t> OffsetAfterFields =
2896 RD->
fields(), CurOffsetInBits, Context, Layout,
2897 CheckIfTriviallyCopyable);
2898 if (!OffsetAfterFields)
2899 return std::nullopt;
2900 CurOffsetInBits = *OffsetAfterFields;
2902 return CurOffsetInBits;
2906 QualType Ty,
bool CheckIfTriviallyCopyable)
const {
2923 assert(!Ty.
isNull() &&
"Null QualType sent to unique object rep check");
2928 CheckIfTriviallyCopyable);
2931 "hasUniqueObjectRepresentations should not be called with an "
2955 return !ABI->getMemberPointerInfo(MPT).HasPadding;
2958 if (
Record->isInvalidDecl())
2963 CheckIfTriviallyCopyable);
2966 *
this,
Record, CheckIfTriviallyCopyable);
2968 return StructSize && *StructSize ==
static_cast<int64_t
>(
getTypeSize(Ty));
2989 count += Ext->ivar_size();
2994 count += ImplDecl->ivar_size();
3020 llvm::DenseMap<ObjCContainerDecl*, ObjCImplDecl*>::iterator
3021 I = ObjCImpls.find(D);
3022 if (I != ObjCImpls.end())
3030 llvm::DenseMap<ObjCContainerDecl*, ObjCImplDecl*>::iterator
3031 I = ObjCImpls.find(D);
3032 if (I != ObjCImpls.end())
3040 assert(IFaceD && ImplD &&
"Passed null params");
3041 ObjCImpls[IFaceD] = ImplD;
3047 assert(CatD && ImplD &&
"Passed null params");
3048 ObjCImpls[CatD] = ImplD;
3053 return ObjCMethodRedecls.
lookup(MD);
3059 ObjCMethodRedecls[MD] = Redecl;
3064 if (
const auto *ID = dyn_cast<ObjCInterfaceDecl>(ND->
getDeclContext()))
3066 if (
const auto *CD = dyn_cast<ObjCCategoryDecl>(ND->
getDeclContext()))
3067 return CD->getClassInterface();
3068 if (
const auto *IMD = dyn_cast<ObjCImplDecl>(ND->
getDeclContext()))
3069 return IMD->getClassInterface();
3077 assert(VD &&
"Passed null params");
3078 assert(VD->
hasAttr<BlocksAttr>() &&
3079 "getBlockVarCopyInits - not __block var");
3080 auto I = BlockVarCopyInits.find(VD);
3081 if (I != BlockVarCopyInits.end())
3083 return {
nullptr,
false};
3089 assert(VD && CopyExpr &&
"Passed null params");
3090 assert(VD->
hasAttr<BlocksAttr>() &&
3091 "setBlockVarCopyInits - not __block var");
3092 BlockVarCopyInits[VD].setExprAndFlag(CopyExpr,
CanThrow);
3096 unsigned DataSize)
const {
3101 "incorrect data size provided to CreateTypeSourceInfo!");
3118 return getObjCLayout(D);
3123 bool &AnyNonCanonArgs) {
3125 AnyNonCanonArgs |=
C.canonicalizeTemplateArguments(CanonArgs);
3131 bool AnyNonCanonArgs =
false;
3132 for (
auto &Arg : Args) {
3135 AnyNonCanonArgs |= !Arg.structurallyEquals(OrigArg);
3137 return AnyNonCanonArgs;
3145ASTContext::getExtQualType(
const Type *baseType,
Qualifiers quals)
const {
3150 llvm::FoldingSetNodeID ID;
3152 void *insertPos =
nullptr;
3153 if (
ExtQuals *eq = ExtQualNodes.FindNodeOrInsertPos(ID, insertPos)) {
3154 assert(eq->getQualifiers() == quals);
3163 canon = getExtQualType(canonSplit.
Ty, canonSplit.
Quals);
3166 (void) ExtQualNodes.FindNodeOrInsertPos(ID, insertPos);
3169 auto *eq =
new (*
this,
alignof(ExtQuals)) ExtQuals(baseType, canon, quals);
3170 ExtQualNodes.InsertNode(eq, insertPos);
3171 return QualType(eq, fastQuals);
3175 LangAS AddressSpace)
const {
3188 "Type cannot be in multiple addr spaces!");
3191 return getExtQualType(TypeNode, Quals);
3197 if (!
T.hasAddressSpace())
3201 const Type *TypeNode;
3204 if (
T.getTypePtr()->isArrayType()) {
3206 TypeNode =
T.getTypePtr();
3210 while (
T.hasAddressSpace()) {
3211 TypeNode = Quals.
strip(
T);
3215 if (!
QualType(TypeNode, 0).hasAddressSpace())
3219 T =
T.getSingleStepDesugaredType(*
this);
3229 return getExtQualType(TypeNode, Quals);
3237 "Attempted to get vtable pointer discriminator on a monomorphic type");
3240 llvm::raw_svector_ostream Out(Str);
3241 MC->mangleCXXVTable(RD, Out);
3242 return llvm::getPointerAuthStableSipHash(Str);
3268 switch (
T->getTypeClass()) {
3273 case Type::LValueReference:
3278 case Type::RValueReference:
3292 case Type::ObjCObjectPointer:
3293 case Type::BlockPointer:
3302 case Type::VariableArray:
3303 case Type::ConstantArray:
3304 case Type::IncompleteArray:
3305 case Type::ArrayParameter:
3318 case Type::ObjCInterface:
3319 case Type::ObjCObject:
3320 OS <<
"<objc_object>";
3329 QualType UnderlyingType =
T->castAsEnumDecl()->getIntegerType();
3331 Ctx, OS, UnderlyingType.
isNull() ? Ctx.
IntTy : UnderlyingType);
3334 case Type::FunctionNoProto:
3335 case Type::FunctionProto: {
3351 if (
const auto *FPT = dyn_cast<FunctionProtoType>(FuncType)) {
3352 for (
QualType Param : FPT->param_types()) {
3356 if (FPT->isVariadic())
3363 case Type::MemberPointer: {
3367 Ctx, OS,
QualType(MPT->getQualifier().getAsType(), 0));
3371 case Type::ExtVector:
3379 case Type::ConstantMatrix:
3383 case Type::Builtin: {
3385 switch (BTy->getKind()) {
3386#define SIGNED_TYPE(Id, SingletonId) \
3387 case BuiltinType::Id: \
3390#define UNSIGNED_TYPE(Id, SingletonId) \
3391 case BuiltinType::Id: \
3394#define PLACEHOLDER_TYPE(Id, SingletonId) case BuiltinType::Id:
3395#define BUILTIN_TYPE(Id, SingletonId)
3396#include "clang/AST/BuiltinTypes.def"
3397 llvm_unreachable(
"placeholder types should not appear here.");
3399 case BuiltinType::Half:
3402 case BuiltinType::Float:
3405 case BuiltinType::Double:
3408 case BuiltinType::LongDouble:
3411 case BuiltinType::Float16:
3414 case BuiltinType::Float128:
3418 case BuiltinType::Void:
3422 case BuiltinType::ObjCId:
3423 case BuiltinType::ObjCClass:
3424 case BuiltinType::ObjCSel:
3425 case BuiltinType::NullPtr:
3430 case BuiltinType::OCLSampler:
3431 case BuiltinType::OCLEvent:
3432 case BuiltinType::OCLClkEvent:
3433 case BuiltinType::OCLQueue:
3434 case BuiltinType::OCLReserveID:
3435 case BuiltinType::BFloat16:
3436 case BuiltinType::VectorQuad:
3437 case BuiltinType::VectorPair:
3438 case BuiltinType::DMR1024:
3439 case BuiltinType::DMR2048:
3444 case BuiltinType::Ibm128:
3446#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
3447 case BuiltinType::Id: \
3449#include "clang/Basic/OpenCLImageTypes.def"
3450#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
3451 case BuiltinType::Id: \
3453#include "clang/Basic/OpenCLExtensionTypes.def"
3454#define SVE_TYPE(Name, Id, SingletonId) \
3455 case BuiltinType::Id: \
3457#include "clang/Basic/AArch64ACLETypes.def"
3458#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) \
3459 case BuiltinType::Id: \
3461#include "clang/Basic/HLSLIntangibleTypes.def"
3462 case BuiltinType::Dependent:
3463 llvm_unreachable(
"should never get here");
3464#define AMDGPU_TYPE(Name, Id, SingletonId, Width, Align) case BuiltinType::Id:
3465#include "clang/Basic/AMDGPUTypes.def"
3466 case BuiltinType::WasmExternRef:
3467#define RVV_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
3468#include "clang/Basic/RISCVVTypes.def"
3469 llvm_unreachable(
"not yet implemented");
3471 llvm_unreachable(
"should never get here");
3473 case Type::Record: {
3474 const RecordDecl *RD =
T->castAsCanonical<RecordType>()->getDecl();
3494 II = Typedef->getDeclName().getAsIdentifierInfo();
3497 OS <<
"<anonymous_record>";
3503 case Type::HLSLAttributedResource:
3504 case Type::HLSLInlineSpirv:
3505 llvm_unreachable(
"should never get here");
3507 case Type::DeducedTemplateSpecialization:
3509#define NON_CANONICAL_TYPE(Class, Base) case Type::Class:
3510#define DEPENDENT_TYPE(Class, Base) case Type::Class:
3511#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base) case Type::Class:
3512#define ABSTRACT_TYPE(Class, Base)
3513#define TYPE(Class, Base)
3514#include "clang/AST/TypeNodes.inc"
3515 llvm_unreachable(
"unexpected non-canonical or dependent type!");
3521 assert(!
T->isDependentType() &&
3522 "cannot compute type discriminator of a dependent type");
3524 llvm::raw_svector_ostream Out(Str);
3526 if (
T->isFunctionPointerType() ||
T->isFunctionReferenceType())
3527 T =
T->getPointeeType();
3529 if (
T->isFunctionType()) {
3532 T =
T.getUnqualifiedType();
3553 if (MPT->isMemberFunctionPointer()) {
3559 MPT->getMostRecentCXXRecordDecl());
3563 MC->mangleCanonicalTypeName(
T, Out);
3566 return llvm::getPointerAuthStableSipHash(Str);
3591 "Type cannot have multiple ObjCGCs!");
3594 return getExtQualType(TypeNode, Quals);
3608 QualType WrappedTy,
Expr *CountExpr,
bool CountInBytes,
bool OrNull,
3612 llvm::FoldingSetNodeID ID;
3615 void *InsertPos =
nullptr;
3617 CountAttributedTypes.FindNodeOrInsertPos(ID, InsertPos);
3622 size_t Size = CountAttributedType::totalSizeToAlloc<TypeCoupledDeclRefInfo>(
3623 DependentDecls.size());
3626 OrNull, DependentDecls);
3627 Types.push_back(CATy);
3628 CountAttributedTypes.InsertNode(CATy, InsertPos);
3637 case Type::Attributed: {
3645 case Type::BTFTagAttributed: {
3646 const auto *BTFT = dyn_cast<BTFTagAttributedType>(Orig);
3655 case Type::Adjusted: {
3661 case Type::MacroQualified: {
3664 MQT->getMacroIdentifier());
3668 return Adjust(Orig);
3674 if (
T->getExtInfo() == Info)
3678 if (
const auto *FNPT = dyn_cast<FunctionNoProtoType>(
T)) {
3698 FPT->getExtProtoInfo());
3713 L->DeducedReturnType(FD, ResultType);
3724 return getFunctionType(Proto->getReturnType(), Proto->getParamTypes(),
3725 Proto->getExtProtoInfo().withExceptionSpec(ESI));
3741 for (
unsigned i = 0, n = Args.size(); i != n; ++i)
3764 return getFunctionType(Proto->getReturnType(), Proto->param_types(), EPI);
3790 if (TSInfo->getType() != FD->
getType())
3798 "TypeLoc size mismatch from updating exception specification");
3799 TSInfo->overrideType(Updated);
3808 llvm::FoldingSetNodeID ID;
3811 void *InsertPos =
nullptr;
3812 if (
ComplexType *CT = ComplexTypes.FindNodeOrInsertPos(ID, InsertPos))
3818 if (!
T.isCanonical()) {
3822 ComplexType *NewIP = ComplexTypes.FindNodeOrInsertPos(ID, InsertPos);
3823 assert(!NewIP &&
"Shouldn't be in the map!"); (void)NewIP;
3826 Types.push_back(
New);
3827 ComplexTypes.InsertNode(
New, InsertPos);
3836 llvm::FoldingSetNodeID ID;
3839 void *InsertPos =
nullptr;
3840 if (
PointerType *PT = PointerTypes.FindNodeOrInsertPos(ID, InsertPos))
3846 if (!
T.isCanonical()) {
3850 PointerType *NewIP = PointerTypes.FindNodeOrInsertPos(ID, InsertPos);
3851 assert(!NewIP &&
"Shouldn't be in the map!"); (void)NewIP;
3854 Types.push_back(
New);
3855 PointerTypes.InsertNode(
New, InsertPos);
3860 llvm::FoldingSetNodeID ID;
3862 void *InsertPos =
nullptr;
3863 AdjustedType *AT = AdjustedTypes.FindNodeOrInsertPos(ID, InsertPos);
3870 AT = AdjustedTypes.FindNodeOrInsertPos(ID, InsertPos);
3871 assert(!AT &&
"Shouldn't be in the map!");
3875 Types.push_back(AT);
3876 AdjustedTypes.InsertNode(AT, InsertPos);
3881 llvm::FoldingSetNodeID ID;
3883 void *InsertPos =
nullptr;
3884 AdjustedType *AT = AdjustedTypes.FindNodeOrInsertPos(ID, InsertPos);
3891 AT = AdjustedTypes.FindNodeOrInsertPos(ID, InsertPos);
3892 assert(!AT &&
"Shouldn't be in the map!");
3895 Types.push_back(AT);
3896 AdjustedTypes.InsertNode(AT, InsertPos);
3901 assert((
T->isArrayType() ||
T->isFunctionType()) &&
"T does not decay");
3910 if (
T->isArrayType())
3917 if (
T->isFunctionType())
3929 llvm::FoldingSetNodeID ID;
3930 ATy->Profile(ID, *
this, ATy->getElementType(), ATy->getZExtSize(),
3931 ATy->getSizeExpr(), ATy->getSizeModifier(),
3932 ATy->getIndexTypeQualifiers().getAsOpaqueValue());
3933 void *InsertPos =
nullptr;
3935 ArrayParameterTypes.FindNodeOrInsertPos(ID, InsertPos);
3944 AT = ArrayParameterTypes.FindNodeOrInsertPos(ID, InsertPos);
3945 assert(!AT &&
"Shouldn't be in the map!");
3950 Types.push_back(AT);
3951 ArrayParameterTypes.InsertNode(AT, InsertPos);
3958 assert(
T->isFunctionType() &&
"block of function types only");
3961 llvm::FoldingSetNodeID ID;
3964 void *InsertPos =
nullptr;
3966 BlockPointerTypes.FindNodeOrInsertPos(ID, InsertPos))
3972 if (!
T.isCanonical()) {
3977 BlockPointerTypes.FindNodeOrInsertPos(ID, InsertPos);
3978 assert(!NewIP &&
"Shouldn't be in the map!"); (void)NewIP;
3982 Types.push_back(
New);
3983 BlockPointerTypes.InsertNode(
New, InsertPos);
3991 assert((!
T->isPlaceholderType() ||
3992 T->isSpecificPlaceholderType(BuiltinType::UnknownAny)) &&
3993 "Unresolved placeholder type");
3997 llvm::FoldingSetNodeID ID;
4000 void *InsertPos =
nullptr;
4002 LValueReferenceTypes.FindNodeOrInsertPos(ID, InsertPos))
4010 if (!SpelledAsLValue || InnerRef || !
T.isCanonical()) {
4011 QualType PointeeType = (InnerRef ? InnerRef->getPointeeType() :
T);
4016 LValueReferenceTypes.FindNodeOrInsertPos(ID, InsertPos);
4017 assert(!NewIP &&
"Shouldn't be in the map!"); (void)NewIP;
4022 Types.push_back(
New);
4023 LValueReferenceTypes.InsertNode(
New, InsertPos);
4031 assert((!
T->isPlaceholderType() ||
4032 T->isSpecificPlaceholderType(BuiltinType::UnknownAny)) &&
4033 "Unresolved placeholder type");
4037 llvm::FoldingSetNodeID ID;
4040 void *InsertPos =
nullptr;
4042 RValueReferenceTypes.FindNodeOrInsertPos(ID, InsertPos))
4050 if (InnerRef || !
T.isCanonical()) {
4051 QualType PointeeType = (InnerRef ? InnerRef->getPointeeType() :
T);
4056 RValueReferenceTypes.FindNodeOrInsertPos(ID, InsertPos);
4057 assert(!NewIP &&
"Shouldn't be in the map!"); (void)NewIP;
4062 Types.push_back(
New);
4063 RValueReferenceTypes.InsertNode(
New, InsertPos);
4071 assert(Cls &&
"At least one of Qualifier or Cls must be provided");
4074 Cls = Qualifier.getAsRecordDecl();
4078 llvm::FoldingSetNodeID ID;
4081 void *InsertPos =
nullptr;
4083 MemberPointerTypes.FindNodeOrInsertPos(ID, InsertPos))
4088 return Qualifier.getCanonical();
4096 if (!
T.isCanonical() || Qualifier != CanonicalQualifier) {
4102 MemberPointerTypes.FindNodeOrInsertPos(ID, InsertPos);
4103 assert(!NewIP &&
"Shouldn't be in the map!");
4107 Types.push_back(
New);
4108 MemberPointerTypes.InsertNode(
New, InsertPos);
4115 const llvm::APInt &ArySizeIn,
4116 const Expr *SizeExpr,
4118 unsigned IndexTypeQuals)
const {
4121 "Constant array of VLAs is illegal!");
4129 llvm::APInt ArySize(ArySizeIn);
4130 ArySize = ArySize.zextOrTrunc(Target->getMaxPointerWidth());
4132 llvm::FoldingSetNodeID ID;
4134 ASM, IndexTypeQuals);
4136 void *InsertPos =
nullptr;
4138 ConstantArrayTypes.FindNodeOrInsertPos(ID, InsertPos))
4149 ASM, IndexTypeQuals);
4154 ConstantArrayTypes.FindNodeOrInsertPos(ID, InsertPos);
4155 assert(!NewIP &&
"Shouldn't be in the map!"); (void)NewIP;
4158 auto *
New = ConstantArrayType::Create(*
this, EltTy, Canon, ArySize, SizeExpr,
4159 ASM, IndexTypeQuals);
4160 ConstantArrayTypes.InsertNode(
New, InsertPos);
4161 Types.push_back(
New);
4170 if (!
type->isVariablyModifiedType())
return type;
4175 const Type *ty = split.
Ty;
4177#define TYPE(Class, Base)
4178#define ABSTRACT_TYPE(Class, Base)
4179#define NON_CANONICAL_TYPE(Class, Base) case Type::Class:
4180#include "clang/AST/TypeNodes.inc"
4181 llvm_unreachable(
"didn't desugar past all non-canonical types?");
4187 case Type::DependentVector:
4188 case Type::ExtVector:
4189 case Type::DependentSizedExtVector:
4190 case Type::ConstantMatrix:
4191 case Type::DependentSizedMatrix:
4192 case Type::DependentAddressSpace:
4193 case Type::ObjCObject:
4194 case Type::ObjCInterface:
4195 case Type::ObjCObjectPointer:
4198 case Type::UnresolvedUsing:
4199 case Type::TypeOfExpr:
4201 case Type::Decltype:
4202 case Type::UnaryTransform:
4203 case Type::DependentName:
4204 case Type::InjectedClassName:
4205 case Type::TemplateSpecialization:
4206 case Type::TemplateTypeParm:
4207 case Type::SubstTemplateTypeParmPack:
4208 case Type::SubstBuiltinTemplatePack:
4210 case Type::DeducedTemplateSpecialization:
4211 case Type::PackExpansion:
4212 case Type::PackIndexing:
4214 case Type::DependentBitInt:
4215 case Type::ArrayParameter:
4216 case Type::HLSLAttributedResource:
4217 case Type::HLSLInlineSpirv:
4218 llvm_unreachable(
"type should never be variably-modified");
4222 case Type::FunctionNoProto:
4223 case Type::FunctionProto:
4224 case Type::BlockPointer:
4225 case Type::MemberPointer:
4238 case Type::LValueReference: {
4242 lv->isSpelledAsLValue());
4246 case Type::RValueReference: {
4253 case Type::Atomic: {
4259 case Type::ConstantArray: {
4265 cat->getSizeModifier(),
4266 cat->getIndexTypeCVRQualifiers());
4270 case Type::DependentSizedArray: {
4274 dat->getSizeModifier(), dat->getIndexTypeCVRQualifiers());
4279 case Type::IncompleteArray: {
4284 iat->getIndexTypeCVRQualifiers());
4289 case Type::VariableArray: {
4294 vat->getIndexTypeCVRQualifiers());
4307 unsigned IndexTypeQuals)
const {
4324 VariableArrayTypes.push_back(
New);
4325 Types.push_back(
New);
4335 unsigned elementTypeQuals)
const {
4338 "Size must be type- or value-dependent!");
4342 void *insertPos =
nullptr;
4343 llvm::FoldingSetNodeID ID;
4345 ID, *
this, numElements ?
QualType(canonElementType.
Ty, 0) : elementType,
4346 ASM, elementTypeQuals, numElements);
4350 DependentSizedArrayTypes.FindNodeOrInsertPos(ID, insertPos);
4362 DependentSizedArrayTypes.InsertNode(newType, insertPos);
4363 Types.push_back(newType);
4371 numElements, ASM, elementTypeQuals);
4372 DependentSizedArrayTypes.InsertNode(canonTy, insertPos);
4373 Types.push_back(canonTy);
4378 canonElementType.
Quals);
4382 if (
QualType(canonElementType.
Ty, 0) == elementType &&
4391 Types.push_back(sugaredType);
4397 unsigned elementTypeQuals)
const {
4398 llvm::FoldingSetNodeID ID;
4401 void *insertPos =
nullptr;
4403 IncompleteArrayTypes.FindNodeOrInsertPos(ID, insertPos))
4415 ASM, elementTypeQuals);
4420 IncompleteArrayTypes.FindNodeOrInsertPos(ID, insertPos);
4421 assert(!existing &&
"Shouldn't be in the map!"); (void) existing;
4427 IncompleteArrayTypes.InsertNode(newType, insertPos);
4428 Types.push_back(newType);
4434#define SVE_INT_ELTTY(BITS, ELTS, SIGNED, NUMVECTORS) \
4435 {getIntTypeForBitwidth(BITS, SIGNED), llvm::ElementCount::getScalable(ELTS), \
4438#define SVE_ELTTY(ELTTY, ELTS, NUMVECTORS) \
4439 {ELTTY, llvm::ElementCount::getScalable(ELTS), NUMVECTORS};
4443 llvm_unreachable(
"Unsupported builtin vector type");
4445#define SVE_VECTOR_TYPE_INT(Name, MangledName, Id, SingletonId, NumEls, \
4446 ElBits, NF, IsSigned) \
4447 case BuiltinType::Id: \
4448 return {getIntTypeForBitwidth(ElBits, IsSigned), \
4449 llvm::ElementCount::getScalable(NumEls), NF};
4450#define SVE_VECTOR_TYPE_FLOAT(Name, MangledName, Id, SingletonId, NumEls, \
4452 case BuiltinType::Id: \
4453 return {ElBits == 16 ? HalfTy : (ElBits == 32 ? FloatTy : DoubleTy), \
4454 llvm::ElementCount::getScalable(NumEls), NF};
4455#define SVE_VECTOR_TYPE_BFLOAT(Name, MangledName, Id, SingletonId, NumEls, \
4457 case BuiltinType::Id: \
4458 return {BFloat16Ty, llvm::ElementCount::getScalable(NumEls), NF};
4459#define SVE_VECTOR_TYPE_MFLOAT(Name, MangledName, Id, SingletonId, NumEls, \
4461 case BuiltinType::Id: \
4462 return {MFloat8Ty, llvm::ElementCount::getScalable(NumEls), NF};
4463#define SVE_PREDICATE_TYPE_ALL(Name, MangledName, Id, SingletonId, NumEls, NF) \
4464 case BuiltinType::Id: \
4465 return {BoolTy, llvm::ElementCount::getScalable(NumEls), NF};
4466#include "clang/Basic/AArch64ACLETypes.def"
4468#define RVV_VECTOR_TYPE_INT(Name, Id, SingletonId, NumEls, ElBits, NF, \
4470 case BuiltinType::Id: \
4471 return {getIntTypeForBitwidth(ElBits, IsSigned), \
4472 llvm::ElementCount::getScalable(NumEls), NF};
4473#define RVV_VECTOR_TYPE_FLOAT(Name, Id, SingletonId, NumEls, ElBits, NF) \
4474 case BuiltinType::Id: \
4475 return {ElBits == 16 ? Float16Ty : (ElBits == 32 ? FloatTy : DoubleTy), \
4476 llvm::ElementCount::getScalable(NumEls), NF};
4477#define RVV_VECTOR_TYPE_BFLOAT(Name, Id, SingletonId, NumEls, ElBits, NF) \
4478 case BuiltinType::Id: \
4479 return {BFloat16Ty, llvm::ElementCount::getScalable(NumEls), NF};
4480#define RVV_PREDICATE_TYPE(Name, Id, SingletonId, NumEls) \
4481 case BuiltinType::Id: \
4482 return {BoolTy, llvm::ElementCount::getScalable(NumEls), 1};
4483#include "clang/Basic/RISCVVTypes.def"
4490 if (Target->getTriple().isWasm() && Target->hasFeature(
"reference-types")) {
4491#define WASM_REF_TYPE(Name, MangledName, Id, SingletonId, AS) \
4492 if (BuiltinType::Id == BuiltinType::WasmExternRef) \
4494#include "clang/Basic/WebAssemblyReferenceTypes.def"
4497 "shouldn't try to generate type externref outside WebAssembly target");
4504 unsigned NumFields)
const {
4506 if (
auto It = ScalableVecTyMap.find(K); It != ScalableVecTyMap.end())
4509 if (Target->hasAArch64ACLETypes()) {
4512#define SVE_VECTOR_TYPE_INT(Name, MangledName, Id, SingletonId, NumEls, \
4513 ElBits, NF, IsSigned) \
4514 if (EltTy->hasIntegerRepresentation() && !EltTy->isBooleanType() && \
4515 EltTy->hasSignedIntegerRepresentation() == IsSigned && \
4516 EltTySize == ElBits && NumElts == (NumEls * NF) && NumFields == 1) { \
4517 return ScalableVecTyMap[K] = SingletonId; \
4519#define SVE_VECTOR_TYPE_FLOAT(Name, MangledName, Id, SingletonId, NumEls, \
4521 if (EltTy->hasFloatingRepresentation() && !EltTy->isBFloat16Type() && \
4522 EltTySize == ElBits && NumElts == (NumEls * NF) && NumFields == 1) { \
4523 return ScalableVecTyMap[K] = SingletonId; \
4525#define SVE_VECTOR_TYPE_BFLOAT(Name, MangledName, Id, SingletonId, NumEls, \
4527 if (EltTy->hasFloatingRepresentation() && EltTy->isBFloat16Type() && \
4528 EltTySize == ElBits && NumElts == (NumEls * NF) && NumFields == 1) { \
4529 return ScalableVecTyMap[K] = SingletonId; \
4531#define SVE_VECTOR_TYPE_MFLOAT(Name, MangledName, Id, SingletonId, NumEls, \
4533 if (EltTy->isMFloat8Type() && EltTySize == ElBits && \
4534 NumElts == (NumEls * NF) && NumFields == 1) { \
4535 return ScalableVecTyMap[K] = SingletonId; \
4537#define SVE_PREDICATE_TYPE_ALL(Name, MangledName, Id, SingletonId, NumEls, NF) \
4538 if (EltTy->isBooleanType() && NumElts == (NumEls * NF) && NumFields == 1) \
4539 return ScalableVecTyMap[K] = SingletonId;
4540#include "clang/Basic/AArch64ACLETypes.def"
4541 }
else if (Target->hasRISCVVTypes()) {
4543#define RVV_VECTOR_TYPE(Name, Id, SingletonId, NumEls, ElBits, NF, IsSigned, \
4545 if (!EltTy->isBooleanType() && \
4546 ((EltTy->hasIntegerRepresentation() && \
4547 EltTy->hasSignedIntegerRepresentation() == IsSigned) || \
4548 (EltTy->hasFloatingRepresentation() && !EltTy->isBFloat16Type() && \
4550 (EltTy->hasFloatingRepresentation() && EltTy->isBFloat16Type() && \
4551 IsBF && !IsFP)) && \
4552 EltTySize == ElBits && NumElts == NumEls && NumFields == NF) \
4553 return ScalableVecTyMap[K] = SingletonId;
4554#define RVV_PREDICATE_TYPE(Name, Id, SingletonId, NumEls) \
4555 if (EltTy->isBooleanType() && NumElts == NumEls) \
4556 return ScalableVecTyMap[K] = SingletonId;
4557#include "clang/Basic/RISCVVTypes.def"
4572 llvm::FoldingSetNodeID ID;
4575 void *InsertPos =
nullptr;
4576 if (
VectorType *VTP = VectorTypes.FindNodeOrInsertPos(ID, InsertPos))
4586 VectorType *NewIP = VectorTypes.FindNodeOrInsertPos(ID, InsertPos);
4587 assert(!NewIP &&
"Shouldn't be in the map!"); (void)NewIP;
4590 VectorType(vecType, NumElts, Canonical, VecKind);
4591 VectorTypes.InsertNode(
New, InsertPos);
4592 Types.push_back(
New);
4599 llvm::FoldingSetNodeID ID;
4602 void *InsertPos =
nullptr;
4604 DependentVectorTypes.FindNodeOrInsertPos(ID, InsertPos);
4609 VecType,
QualType(Canon, 0), SizeExpr, AttrLoc, VecKind);
4612 if (CanonVecTy == VecType) {
4617 DependentVectorTypes.FindNodeOrInsertPos(ID, InsertPos);
4618 assert(!CanonCheck &&
4619 "Dependent-sized vector_size canonical type broken");
4621 DependentVectorTypes.InsertNode(
New, InsertPos);
4630 Types.push_back(
New);
4637 unsigned NumElts)
const {
4644 llvm::FoldingSetNodeID ID;
4647 void *InsertPos =
nullptr;
4648 if (
VectorType *VTP = VectorTypes.FindNodeOrInsertPos(ID, InsertPos))
4658 VectorType *NewIP = VectorTypes.FindNodeOrInsertPos(ID, InsertPos);
4659 assert(!NewIP &&
"Shouldn't be in the map!"); (void)NewIP;
4663 VectorTypes.InsertNode(
New, InsertPos);
4664 Types.push_back(
New);
4672 llvm::FoldingSetNodeID ID;
4676 void *InsertPos =
nullptr;
4678 = DependentSizedExtVectorTypes.FindNodeOrInsertPos(ID, InsertPos);
4688 if (CanonVecTy == vecType) {
4693 = DependentSizedExtVectorTypes.FindNodeOrInsertPos(ID, InsertPos);
4694 assert(!CanonCheck &&
"Dependent-sized ext_vector canonical type broken");
4696 DependentSizedExtVectorTypes.InsertNode(
New, InsertPos);
4705 Types.push_back(
New);
4710 unsigned NumColumns)
const {
4711 llvm::FoldingSetNodeID ID;
4713 Type::ConstantMatrix);
4716 "need a valid element type");
4717 assert(NumRows > 0 && NumRows <= LangOpts.MaxMatrixDimension &&
4718 NumColumns > 0 && NumColumns <= LangOpts.MaxMatrixDimension &&
4719 "need valid matrix dimensions");
4720 void *InsertPos =
nullptr;
4730 assert(!NewIP &&
"Matrix type shouldn't already exist in the map");
4736 MatrixTypes.InsertNode(
New, InsertPos);
4737 Types.push_back(
New);
4746 llvm::FoldingSetNodeID ID;
4750 void *InsertPos =
nullptr;
4752 DependentSizedMatrixTypes.FindNodeOrInsertPos(ID, InsertPos);
4757 ColumnExpr, AttrLoc);
4760 DependentSizedMatrixTypes.FindNodeOrInsertPos(ID, InsertPos);
4761 assert(!CanonCheck &&
"Dependent-sized matrix canonical type broken");
4763 DependentSizedMatrixTypes.InsertNode(Canon, InsertPos);
4764 Types.push_back(Canon);
4777 ColumnExpr, AttrLoc);
4778 Types.push_back(
New);
4783 Expr *AddrSpaceExpr,
4789 void *insertPos =
nullptr;
4790 llvm::FoldingSetNodeID ID;
4795 DependentAddressSpaceTypes.FindNodeOrInsertPos(ID, insertPos);
4801 DependentAddressSpaceTypes.InsertNode(canonTy, insertPos);
4802 Types.push_back(canonTy);
4805 if (canonPointeeType == PointeeType &&
4811 AddrSpaceExpr, AttrLoc);
4812 Types.push_back(sugaredType);
4818 return T.isCanonical() &&
4836 llvm::FoldingSetNodeID ID;
4839 void *InsertPos =
nullptr;
4841 FunctionNoProtoTypes.FindNodeOrInsertPos(ID, InsertPos))
4851 FunctionNoProtoTypes.FindNodeOrInsertPos(ID, InsertPos);
4852 assert(!NewIP &&
"Shouldn't be in the map!"); (void)NewIP;
4857 Types.push_back(
New);
4858 FunctionNoProtoTypes.InsertNode(
New, InsertPos);
4874 return CanResultType;
4881 if (!NoexceptInType)
4898 bool AnyPackExpansions =
false;
4902 if (ET->
getAs<PackExpansionType>())
4903 AnyPackExpansions =
true;
4905 return AnyPackExpansions;
4911QualType ASTContext::getFunctionTypeInternal(
4912 QualType ResultTy, ArrayRef<QualType> ArgArray,
4913 const FunctionProtoType::ExtProtoInfo &EPI,
bool OnlyWantCanonical)
const {
4914 size_t NumArgs = ArgArray.size();
4918 llvm::FoldingSetNodeID
ID;
4923 bool Unique =
false;
4925 void *InsertPos =
nullptr;
4926 if (FunctionProtoType *FPT =
4927 FunctionProtoTypes.FindNodeOrInsertPos(ID, InsertPos)) {
4928 QualType Existing = QualType(FPT, 0);
4947 bool IsCanonicalExceptionSpec =
4951 bool isCanonical = !Unique && IsCanonicalExceptionSpec &&
4953 for (
unsigned i = 0; i != NumArgs && isCanonical; ++i)
4954 if (!ArgArray[i].isCanonicalAsParam())
4955 isCanonical =
false;
4957 if (OnlyWantCanonical)
4958 assert(isCanonical &&
4959 "given non-canonical parameters constructing canonical type");
4964 if (!isCanonical && Canonical.
isNull()) {
4965 SmallVector<QualType, 16> CanonicalArgs;
4966 CanonicalArgs.reserve(NumArgs);
4967 for (
unsigned i = 0; i != NumArgs; ++i)
4970 llvm::SmallVector<QualType, 8> ExceptionTypeStorage;
4971 FunctionProtoType::ExtProtoInfo CanonicalEPI = EPI;
4974 if (IsCanonicalExceptionSpec) {
4976 }
else if (NoexceptInType) {
4989 bool AnyPacks =
false;
4991 if (ET->
getAs<PackExpansionType>())
5012 llvm_unreachable(
"dependent noexcept is already canonical");
5015 CanonicalEPI.
ExceptionSpec = FunctionProtoType::ExceptionSpecInfo();
5021 getFunctionTypeInternal(CanResultTy, CanonicalArgs, CanonicalEPI,
true);
5024 FunctionProtoType *NewIP =
5025 FunctionProtoTypes.FindNodeOrInsertPos(ID, InsertPos);
5026 assert(!NewIP &&
"Shouldn't be in the map!"); (void)NewIP;
5031 auto ESH = FunctionProtoType::getExceptionSpecSize(
5033 size_t Size = FunctionProtoType::totalSizeToAlloc<
5034 QualType, SourceLocation, FunctionType::FunctionTypeExtraBitfields,
5035 FunctionType::FunctionTypeExtraAttributeInfo,
5036 FunctionType::FunctionTypeArmAttributes, FunctionType::ExceptionType,
5037 Expr *, FunctionDecl *, FunctionProtoType::ExtParameterInfo, Qualifiers,
5038 FunctionEffect, EffectConditionExpr>(
5042 ESH.NumExprPtr, ESH.NumFunctionDeclPtr,
5047 auto *FTP = (FunctionProtoType *)
Allocate(Size,
alignof(FunctionProtoType));
5048 FunctionProtoType::ExtProtoInfo newEPI = EPI;
5049 new (FTP) FunctionProtoType(ResultTy, ArgArray, Canonical, newEPI);
5050 Types.push_back(FTP);
5052 FunctionProtoTypes.InsertNode(FTP, InsertPos);
5054 AnyFunctionEffects =
true;
5055 return QualType(FTP, 0);
5058QualType ASTContext::getPipeType(QualType
T,
bool ReadOnly)
const {
5059 llvm::FoldingSetNodeID
ID;
5062 void *InsertPos =
nullptr;
5063 if (PipeType *PT = PipeTypes.FindNodeOrInsertPos(ID, InsertPos))
5064 return QualType(PT, 0);
5069 if (!
T.isCanonical()) {
5073 PipeType *NewIP = PipeTypes.FindNodeOrInsertPos(ID, InsertPos);
5074 assert(!NewIP &&
"Shouldn't be in the map!");
5077 auto *
New =
new (*
this,
alignof(PipeType)) PipeType(
T, Canonical, ReadOnly);
5078 Types.push_back(
New);
5079 PipeTypes.InsertNode(
New, InsertPos);
5080 return QualType(
New, 0);
5090 return getPipeType(
T,
true);
5094 return getPipeType(
T,
false);
5098 llvm::FoldingSetNodeID ID;
5101 void *InsertPos =
nullptr;
5102 if (
BitIntType *EIT = BitIntTypes.FindNodeOrInsertPos(ID, InsertPos))
5106 BitIntTypes.InsertNode(
New, InsertPos);
5107 Types.push_back(
New);
5112 Expr *NumBitsExpr)
const {
5114 llvm::FoldingSetNodeID ID;
5117 void *InsertPos =
nullptr;
5119 DependentBitIntTypes.FindNodeOrInsertPos(ID, InsertPos))
5124 DependentBitIntTypes.InsertNode(
New, InsertPos);
5126 Types.push_back(
New);
5134 if (
auto *Target = PredefinedSugarTypes[llvm::to_underlying(KD)];
5146 return Ctx.getFromTargetType(Ctx.Target->
getSizeType());
5147 case Kind::SignedSizeT:
5149 case Kind::PtrdiffT:
5152 llvm_unreachable(
"unexpected kind");
5157 Types.push_back(
New);
5158 PredefinedSugarTypes[llvm::to_underlying(KD)] =
New;
5165 if (
auto *Tag = dyn_cast<TagDecl>(
Decl))
5168 if (
auto *
Typedef = dyn_cast<TypedefNameDecl>(
Decl))
5170 if (
auto *UD = dyn_cast<UnresolvedUsingTypenameDecl>(
Decl))
5179 if (
auto *Tag = dyn_cast<TagDecl>(TD))
5181 if (
auto *TN = dyn_cast<TypedefNameDecl>(TD))
5183 if (
const auto *UD = dyn_cast<UnresolvedUsingTypenameDecl>(TD))
5185 assert(TD->TypeForDecl);
5190 if (
const auto *TD = dyn_cast<TagDecl>(
Decl))
5192 if (
const auto *TD = dyn_cast<TypedefNameDecl>(
Decl);
5193 isa_and_nonnull<TypedefDecl, TypeAliasDecl>(TD))
5196 if (
const auto *Using = dyn_cast<UnresolvedUsingTypenameDecl>(
Decl))
5199 assert(
Decl->TypeForDecl);
5209 std::optional<bool> TypeMatchesDeclOrNone)
const {
5210 if (!TypeMatchesDeclOrNone) {
5211 QualType DeclUnderlyingType =
Decl->getUnderlyingType();
5212 assert(!DeclUnderlyingType.
isNull());
5213 if (UnderlyingType.
isNull())
5214 UnderlyingType = DeclUnderlyingType;
5216 assert(
hasSameType(UnderlyingType, DeclUnderlyingType));
5217 TypeMatchesDeclOrNone = UnderlyingType == DeclUnderlyingType;
5221 assert(!UnderlyingType.
isNull());
5225 *TypeMatchesDeclOrNone) {
5226 if (
Decl->TypeForDecl)
5231 !*TypeMatchesDeclOrNone);
5233 Types.push_back(NewType);
5234 Decl->TypeForDecl = NewType;
5238 llvm::FoldingSetNodeID ID;
5240 *TypeMatchesDeclOrNone ?
QualType() : UnderlyingType);
5242 void *InsertPos =
nullptr;
5244 TypedefTypes.FindNodeOrInsertPos(ID, InsertPos))
5245 return QualType(Placeholder->getType(), 0);
5250 1, !!Qualifier, !*TypeMatchesDeclOrNone),
5254 UnderlyingType, !*TypeMatchesDeclOrNone);
5255 auto *Placeholder =
new (NewType->getFoldingSetPlaceholder())
5257 TypedefTypes.InsertNode(Placeholder, InsertPos);
5258 Types.push_back(NewType);
5267 if (UnderlyingType.
isNull()) {
5275 llvm::FoldingSetNodeID ID;
5278 void *InsertPos =
nullptr;
5279 if (
const UsingType *
T = UsingTypes.FindNodeOrInsertPos(ID, InsertPos))
5289 Allocate(UsingType::totalSizeToAlloc<NestedNameSpecifier>(!!Qualifier),
5293 UsingTypes.InsertNode(
T, InsertPos);
5299 const TagDecl *TD,
bool OwnsTag,
5301 const Type *CanonicalType,
5302 bool WithFoldingSetNode)
const {
5303 auto [TC, Size] = [&] {
5306 static_assert(
alignof(EnumType) ==
alignof(TagType));
5307 return std::make_tuple(Type::Enum,
sizeof(EnumType));
5308 case Decl::ClassTemplatePartialSpecialization:
5309 case Decl::ClassTemplateSpecialization:
5310 case Decl::CXXRecord:
5311 static_assert(
alignof(RecordType) ==
alignof(TagType));
5312 static_assert(
alignof(InjectedClassNameType) ==
alignof(TagType));
5314 return std::make_tuple(Type::InjectedClassName,
5315 sizeof(InjectedClassNameType));
5318 return std::make_tuple(Type::Record,
sizeof(RecordType));
5320 llvm_unreachable(
"unexpected decl kind");
5330 if (WithFoldingSetNode) {
5338 sizeof(TagTypeFoldingSetPlaceholder) +
5339 TagTypeFoldingSetPlaceholder::getOffset() + Size,
5340 std::max(
alignof(TagTypeFoldingSetPlaceholder),
alignof(TagType)));
5341 auto *
T =
new (Mem) TagTypeFoldingSetPlaceholder();
5342 Mem =
T->getTagType();
5344 Mem =
Allocate(Size,
alignof(TagType));
5347 auto *
T = [&, TC = TC]() -> TagType * {
5351 auto *
T =
new (Mem) EnumType(TC,
Keyword, Qualifier, TD, OwnsTag,
5352 IsInjected, CanonicalType);
5353 assert(
reinterpret_cast<void *
>(
T) ==
5354 reinterpret_cast<void *
>(
static_cast<TagType *
>(
T)) &&
5355 "TagType must be the first base of EnumType");
5358 case Type::Record: {
5360 auto *
T =
new (Mem) RecordType(TC,
Keyword, Qualifier, TD, OwnsTag,
5361 IsInjected, CanonicalType);
5362 assert(
reinterpret_cast<void *
>(
T) ==
5363 reinterpret_cast<void *
>(
static_cast<TagType *
>(
T)) &&
5364 "TagType must be the first base of RecordType");
5367 case Type::InjectedClassName: {
5368 auto *
T =
new (Mem) InjectedClassNameType(
Keyword, Qualifier, TD,
5369 IsInjected, CanonicalType);
5370 assert(
reinterpret_cast<void *
>(
T) ==
5371 reinterpret_cast<void *
>(
static_cast<TagType *
>(
T)) &&
5372 "TagType must be the first base of InjectedClassNameType");
5376 llvm_unreachable(
"unexpected type class");
5379 assert(
T->getKeyword() ==
Keyword);
5380 assert(
T->getQualifier() == Qualifier);
5381 assert(
T->getDecl() == TD);
5382 assert(
T->isInjected() == IsInjected);
5383 assert(
T->isTagOwned() == OwnsTag);
5392 if (
const auto *RD = dyn_cast<CXXRecordDecl>(TD);
5393 RD && RD->isInjectedClassName())
5400 if (TD->TypeForDecl)
5401 return TD->TypeForDecl->getCanonicalTypeUnqualified();
5403 const Type *CanonicalType = getTagTypeInternal(
5406 false,
false,
nullptr,
5408 TD->TypeForDecl = CanonicalType;
5414 const TagDecl *TD,
bool OwnsTag)
const {
5417 bool IsInjected = TD != NonInjectedTD;
5424 if (
Keyword == PreferredKeyword && !Qualifier && !OwnsTag) {
5425 if (
const Type *
T = TD->TypeForDecl;
T && !
T->isCanonicalUnqualified())
5431 std::nullopt, NonInjectedTD,
5432 false, IsInjected, CanonicalType,
5434 TD->TypeForDecl =
T;
5438 llvm::FoldingSetNodeID ID;
5439 TagTypeFoldingSetPlaceholder::Profile(ID,
Keyword, Qualifier, NonInjectedTD,
5440 OwnsTag, IsInjected);
5442 void *InsertPos =
nullptr;
5443 if (TagTypeFoldingSetPlaceholder *
T =
5444 TagTypes.FindNodeOrInsertPos(ID, InsertPos))
5449 getTagTypeInternal(
Keyword, Qualifier, NonInjectedTD, OwnsTag, IsInjected,
5450 CanonicalType,
true);
5451 TagTypes.InsertNode(TagTypeFoldingSetPlaceholder::fromTagType(
T), InsertPos);
5456 unsigned NumPositiveBits,
5459 unsigned IntWidth = Target->getIntWidth();
5460 unsigned CharWidth = Target->getCharWidth();
5461 unsigned ShortWidth = Target->getShortWidth();
5462 bool EnumTooLarge =
false;
5464 if (NumNegativeBits) {
5468 if (IsPacked && NumNegativeBits <= CharWidth &&
5469 NumPositiveBits < CharWidth) {
5471 BestWidth = CharWidth;
5472 }
else if (IsPacked && NumNegativeBits <= ShortWidth &&
5473 NumPositiveBits < ShortWidth) {
5475 BestWidth = ShortWidth;
5476 }
else if (NumNegativeBits <= IntWidth && NumPositiveBits < IntWidth) {
5478 BestWidth = IntWidth;
5480 BestWidth = Target->getLongWidth();
5482 if (NumNegativeBits <= BestWidth && NumPositiveBits < BestWidth) {
5485 BestWidth = Target->getLongLongWidth();
5487 if (NumNegativeBits > BestWidth || NumPositiveBits >= BestWidth)
5488 EnumTooLarge =
true;
5492 BestPromotionType = (BestWidth <= IntWidth ?
IntTy : BestType);
5497 if (IsPacked && NumPositiveBits <= CharWidth) {
5499 BestPromotionType =
IntTy;
5500 BestWidth = CharWidth;
5501 }
else if (IsPacked && NumPositiveBits <= ShortWidth) {
5503 BestPromotionType =
IntTy;
5504 BestWidth = ShortWidth;
5505 }
else if (NumPositiveBits <= IntWidth) {
5507 BestWidth = IntWidth;
5508 BestPromotionType = (NumPositiveBits == BestWidth || !LangOpts.CPlusPlus)
5511 }
else if (NumPositiveBits <= (BestWidth = Target->getLongWidth())) {
5513 BestPromotionType = (NumPositiveBits == BestWidth || !LangOpts.CPlusPlus)
5517 BestWidth = Target->getLongLongWidth();
5518 if (NumPositiveBits > BestWidth) {
5523 EnumTooLarge =
true;
5526 BestPromotionType = (NumPositiveBits == BestWidth || !LangOpts.CPlusPlus)
5531 return EnumTooLarge;
5535 assert((
T->isIntegralType(*
this) ||
T->isEnumeralType()) &&
5536 "Integral type required!");
5539 if (
Value.isUnsigned() ||
Value.isNonNegative()) {
5540 if (
T->isSignedIntegerOrEnumerationType())
5542 return Value.getActiveBits() <= BitWidth;
5544 return Value.getSignificantBits() <= BitWidth;
5550 const Type *CanonicalType)
const {
5552 UnresolvedUsingType::totalSizeToAlloc<
5554 !!InsertPos, !!Qualifier),
5558 auto *Placeholder =
new (
T->getFoldingSetPlaceholder())
5560 TypedefTypes.InsertNode(Placeholder, InsertPos);
5570 return D->TypeForDecl->getCanonicalTypeUnqualified();
5572 const Type *CanonicalType = getUnresolvedUsingTypeInternal(
5576 D->TypeForDecl = CanonicalType;
5585 if (
const Type *
T = D->TypeForDecl;
T && !
T->isCanonicalUnqualified())
5592 nullptr, CanonicalType);
5597 llvm::FoldingSetNodeID ID;
5600 void *InsertPos =
nullptr;
5602 UnresolvedUsingTypes.FindNodeOrInsertPos(ID, InsertPos))
5603 return QualType(Placeholder->getType(), 0);
5607 const Type *
T = getUnresolvedUsingTypeInternal(
Keyword, Qualifier, D,
5608 InsertPos, CanonicalType);
5616 llvm::FoldingSetNodeID id;
5617 AttributedType::Profile(
id, attrKind, modifiedType, equivalentType,
attr);
5619 void *insertPos =
nullptr;
5620 AttributedType *
type = AttributedTypes.FindNodeOrInsertPos(
id, insertPos);
5623 assert(!
attr ||
attr->getKind() == attrKind);
5626 type =
new (*
this,
alignof(AttributedType))
5627 AttributedType(canon, attrKind,
attr, modifiedType, equivalentType);
5629 Types.push_back(
type);
5630 AttributedTypes.InsertNode(
type, insertPos);
5643 switch (nullability) {
5659 llvm_unreachable(
"Unknown nullability kind");
5664 llvm::FoldingSetNodeID ID;
5665 BTFTagAttributedType::Profile(ID, Wrapped, BTFAttr);
5667 void *InsertPos =
nullptr;
5668 BTFTagAttributedType *Ty =
5669 BTFTagAttributedTypes.FindNodeOrInsertPos(ID, InsertPos);
5674 Ty =
new (*
this,
alignof(BTFTagAttributedType))
5675 BTFTagAttributedType(Canon, Wrapped, BTFAttr);
5677 Types.push_back(Ty);
5678 BTFTagAttributedTypes.InsertNode(Ty, InsertPos);
5685 const HLSLAttributedResourceType::Attributes &Attrs) {
5687 llvm::FoldingSetNodeID ID;
5688 HLSLAttributedResourceType::Profile(ID, Wrapped, Contained, Attrs);
5690 void *InsertPos =
nullptr;
5691 HLSLAttributedResourceType *Ty =
5692 HLSLAttributedResourceTypes.FindNodeOrInsertPos(ID, InsertPos);
5696 Ty =
new (*
this,
alignof(HLSLAttributedResourceType))
5697 HLSLAttributedResourceType(Wrapped, Contained, Attrs);
5699 Types.push_back(Ty);
5700 HLSLAttributedResourceTypes.InsertNode(Ty, InsertPos);
5708 llvm::FoldingSetNodeID ID;
5709 HLSLInlineSpirvType::Profile(ID, Opcode, Size, Alignment, Operands);
5711 void *InsertPos =
nullptr;
5712 HLSLInlineSpirvType *Ty =
5713 HLSLInlineSpirvTypes.FindNodeOrInsertPos(ID, InsertPos);
5718 HLSLInlineSpirvType::totalSizeToAlloc<SpirvOperand>(Operands.size()),
5719 alignof(HLSLInlineSpirvType));
5721 Ty =
new (Mem) HLSLInlineSpirvType(Opcode, Size, Alignment, Operands);
5723 Types.push_back(Ty);
5724 HLSLInlineSpirvTypes.InsertNode(Ty, InsertPos);
5731 Decl *AssociatedDecl,
5735 llvm::FoldingSetNodeID ID;
5736 SubstTemplateTypeParmType::Profile(ID, Replacement, AssociatedDecl, Index,
5738 void *InsertPos =
nullptr;
5739 SubstTemplateTypeParmType *SubstParm =
5740 SubstTemplateTypeParmTypes.FindNodeOrInsertPos(ID, InsertPos);
5743 void *Mem =
Allocate(SubstTemplateTypeParmType::totalSizeToAlloc<QualType>(
5744 !Replacement.isCanonical()),
5745 alignof(SubstTemplateTypeParmType));
5746 SubstParm =
new (Mem) SubstTemplateTypeParmType(Replacement, AssociatedDecl,
5747 Index, PackIndex, Final);
5748 Types.push_back(SubstParm);
5749 SubstTemplateTypeParmTypes.InsertNode(SubstParm, InsertPos);
5757 unsigned Index,
bool Final,
5764 llvm::FoldingSetNodeID ID;
5765 SubstTemplateTypeParmPackType::Profile(ID, AssociatedDecl, Index, Final,
5767 void *InsertPos =
nullptr;
5768 if (SubstTemplateTypeParmPackType *SubstParm =
5769 SubstTemplateTypeParmPackTypes.FindNodeOrInsertPos(ID, InsertPos))
5779 [[maybe_unused]]
const auto *Nothing =
5780 SubstTemplateTypeParmPackTypes.FindNodeOrInsertPos(ID, InsertPos);
5785 auto *SubstParm =
new (*
this,
alignof(SubstTemplateTypeParmPackType))
5786 SubstTemplateTypeParmPackType(Canon, AssociatedDecl, Index, Final,
5788 Types.push_back(SubstParm);
5789 SubstTemplateTypeParmPackTypes.InsertNode(SubstParm, InsertPos);
5797 return P.getKind() == TemplateArgument::Type;
5799 "Pack contains a non-type");
5801 llvm::FoldingSetNodeID ID;
5802 SubstBuiltinTemplatePackType::Profile(ID, ArgPack);
5804 void *InsertPos =
nullptr;
5806 SubstBuiltinTemplatePackTypes.FindNodeOrInsertPos(ID, InsertPos))
5815 [[maybe_unused]]
const auto *Nothing =
5816 SubstBuiltinTemplatePackTypes.FindNodeOrInsertPos(ID, InsertPos);
5820 auto *PackType =
new (*
this,
alignof(SubstBuiltinTemplatePackType))
5821 SubstBuiltinTemplatePackType(Canon, ArgPack);
5822 Types.push_back(PackType);
5823 SubstBuiltinTemplatePackTypes.InsertNode(PackType, InsertPos);
5833 llvm::FoldingSetNodeID ID;
5834 TemplateTypeParmType::Profile(ID, Depth, Index, ParameterPack, TTPDecl);
5835 void *InsertPos =
nullptr;
5836 TemplateTypeParmType *TypeParm
5837 = TemplateTypeParmTypes.FindNodeOrInsertPos(ID, InsertPos);
5844 TypeParm =
new (*
this,
alignof(TemplateTypeParmType))
5845 TemplateTypeParmType(Depth, Index, ParameterPack, TTPDecl, Canon);
5847 TemplateTypeParmType *TypeCheck
5848 = TemplateTypeParmTypes.FindNodeOrInsertPos(ID, InsertPos);
5849 assert(!TypeCheck &&
"Template type parameter canonical type broken");
5852 TypeParm =
new (*
this,
alignof(TemplateTypeParmType)) TemplateTypeParmType(
5853 Depth, Index, ParameterPack,
nullptr,
QualType());
5855 Types.push_back(TypeParm);
5856 TemplateTypeParmTypes.InsertNode(TypeParm, InsertPos);
5882 llvm_unreachable(
"unexpected keyword kind");
5896 ElaboratedKeywordLoc, QualifierLoc, TemplateKeywordLoc, NameLoc,
5906 SpecifiedArgVec.reserve(SpecifiedArgs.size());
5908 SpecifiedArgVec.push_back(Arg.getArgument());
5911 CanonicalArgs, Underlying);
5914[[maybe_unused]]
static bool
5917 if (Arg.isPackExpansion())
5928 Template.getAsDependentTemplateName()));
5930 for (
const auto &Arg : Args)
5934 llvm::FoldingSetNodeID ID;
5937 void *InsertPos =
nullptr;
5938 if (
auto *
T = TemplateSpecializationTypes.FindNodeOrInsertPos(ID, InsertPos))
5941 void *Mem =
Allocate(
sizeof(TemplateSpecializationType) +
5943 alignof(TemplateSpecializationType));
5947 assert(Spec->isDependentType() &&
5948 "canonical template specialization must be dependent");
5949 Types.push_back(Spec);
5950 TemplateSpecializationTypes.InsertNode(Spec, InsertPos);
5958 const auto *TD =
Template.getAsTemplateDecl(
true);
5959 bool IsTypeAlias = TD && TD->isTypeAlias();
5960 if (Underlying.
isNull()) {
5967 bool NonCanonical =
Template != CanonTemplate ||
Keyword != CanonKeyword;
5969 if (CanonicalArgs.empty()) {
5972 CanonicalArgs = CanonArgsVec;
5974 NonCanonical |= !llvm::equal(
5975 SpecifiedArgs, CanonicalArgs,
5984 assert((!isa_and_nonnull<TypeAliasTemplateDecl>(TD) ||
5986 "Caller must compute aliased type");
5987 IsTypeAlias =
false;
5990 CanonKeyword, CanonTemplate, CanonicalArgs);
5994 void *Mem =
Allocate(
sizeof(TemplateSpecializationType) +
5996 (IsTypeAlias ?
sizeof(
QualType) : 0),
5997 alignof(TemplateSpecializationType));
5998 auto *Spec =
new (Mem) TemplateSpecializationType(
6000 Types.push_back(Spec);
6006 llvm::FoldingSetNodeID ID;
6009 void *InsertPos =
nullptr;
6010 ParenType *
T = ParenTypes.FindNodeOrInsertPos(ID, InsertPos);
6017 ParenType *CheckT = ParenTypes.FindNodeOrInsertPos(ID, InsertPos);
6018 assert(!CheckT &&
"Paren canonical type broken");
6024 ParenTypes.InsertNode(
T, InsertPos);
6037 Types.push_back(newType);
6044 llvm::FoldingSetNodeID ID;
6045 DependentNameType::Profile(ID,
Keyword, NNS, Name);
6047 void *InsertPos =
nullptr;
6048 if (DependentNameType *
T =
6049 DependentNameTypes.FindNodeOrInsertPos(ID, InsertPos))
6057 if (CanonKeyword !=
Keyword || CanonNNS != NNS) {
6059 [[maybe_unused]] DependentNameType *
T =
6060 DependentNameTypes.FindNodeOrInsertPos(ID, InsertPos);
6061 assert(!
T &&
"broken canonicalization");
6065 DependentNameType *
T =
new (*
this,
alignof(DependentNameType))
6066 DependentNameType(
Keyword, NNS, Name, Canon);
6068 DependentNameTypes.InsertNode(
T, InsertPos);
6074 if (
const auto *TTP = dyn_cast<TemplateTypeParmDecl>(Param)) {
6076 if (TTP->isParameterPack())
6080 }
else if (
auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(Param)) {
6082 NTTP->getType().getNonPackExpansionType().getNonLValueExprType(*
this);
6088 if (
T->isRecordType()) {
6097 Expr *E =
new (*this)
6099 T,
VK, NTTP->getLocation());
6101 if (NTTP->isParameterPack())
6107 std::nullopt,
false,
6109 if (TTP->isParameterPack())
6115 if (Param->isTemplateParameterPack())
6124 bool ExpectPackInType)
const {
6126 "Pack expansions must expand one or more parameter packs");
6128 llvm::FoldingSetNodeID ID;
6129 PackExpansionType::Profile(ID, Pattern, NumExpansions);
6131 void *InsertPos =
nullptr;
6132 PackExpansionType *
T = PackExpansionTypes.FindNodeOrInsertPos(ID, InsertPos);
6143 PackExpansionTypes.FindNodeOrInsertPos(ID, InsertPos);
6146 T =
new (*
this,
alignof(PackExpansionType))
6147 PackExpansionType(Pattern, Canon, NumExpansions);
6149 PackExpansionTypes.InsertNode(
T, InsertPos);
6161 if (Protocols.empty())
return true;
6166 for (
unsigned i = 1; i != Protocols.size(); ++i)
6176 llvm::array_pod_sort(Protocols.begin(), Protocols.end(),
CmpProtocolNames);
6180 P = P->getCanonicalDecl();
6183 auto ProtocolsEnd = llvm::unique(Protocols);
6184 Protocols.erase(ProtocolsEnd, Protocols.end());
6189 unsigned NumProtocols)
const {
6198 bool isKindOf)
const {
6201 if (typeArgs.empty() && protocols.empty() && !isKindOf &&
6206 llvm::FoldingSetNodeID ID;
6207 ObjCObjectTypeImpl::Profile(ID, baseType, typeArgs, protocols, isKindOf);
6208 void *InsertPos =
nullptr;
6209 if (
ObjCObjectType *QT = ObjCObjectTypes.FindNodeOrInsertPos(ID, InsertPos))
6216 if (effectiveTypeArgs.empty()) {
6218 effectiveTypeArgs = baseObject->getTypeArgs();
6225 bool typeArgsAreCanonical = llvm::all_of(
6228 if (!typeArgsAreCanonical || !protocolsSorted || !baseType.
isCanonical()) {
6232 if (!typeArgsAreCanonical) {
6233 canonTypeArgsVec.reserve(effectiveTypeArgs.size());
6234 for (
auto typeArg : effectiveTypeArgs)
6236 canonTypeArgs = canonTypeArgsVec;
6238 canonTypeArgs = effectiveTypeArgs;
6243 if (!protocolsSorted) {
6244 canonProtocolsVec.append(protocols.begin(), protocols.end());
6246 canonProtocols = canonProtocolsVec;
6248 canonProtocols = protocols;
6252 canonProtocols, isKindOf);
6255 ObjCObjectTypes.FindNodeOrInsertPos(ID, InsertPos);
6258 unsigned size =
sizeof(ObjCObjectTypeImpl);
6259 size += typeArgs.size() *
sizeof(
QualType);
6261 void *mem =
Allocate(size,
alignof(ObjCObjectTypeImpl));
6263 new (mem) ObjCObjectTypeImpl(canonical, baseType, typeArgs, protocols,
6267 ObjCObjectTypes.InsertNode(
T, InsertPos);
6277 bool allowOnPointerType)
const {
6280 if (
const auto *objT = dyn_cast<ObjCTypeParamType>(
type.getTypePtr())) {
6285 if (allowOnPointerType) {
6286 if (
const auto *objPtr =
6287 dyn_cast<ObjCObjectPointerType>(
type.getTypePtr())) {
6291 protocolsVec.append(objT->qual_begin(),
6293 protocolsVec.append(protocols.begin(), protocols.end());
6296 objT->getBaseType(),
6297 objT->getTypeArgsAsWritten(),
6299 objT->isKindOfTypeAsWritten());
6305 if (
const auto *objT = dyn_cast<ObjCObjectType>(
type.getTypePtr())){
6310 objT->getTypeArgsAsWritten(),
6312 objT->isKindOfTypeAsWritten());
6316 if (
type->isObjCObjectType()) {
6326 if (
type->isObjCIdType()) {
6329 objPtr->isKindOfType());
6334 if (
type->isObjCClassType()) {
6337 objPtr->isKindOfType());
6349 llvm::FoldingSetNodeID ID;
6350 ObjCTypeParamType::Profile(ID,
Decl,
Decl->getUnderlyingType(), protocols);
6351 void *InsertPos =
nullptr;
6352 if (ObjCTypeParamType *TypeParam =
6353 ObjCTypeParamTypes.FindNodeOrInsertPos(ID, InsertPos))
6358 if (!protocols.empty()) {
6362 Canonical, protocols, hasError,
true ));
6363 assert(!hasError &&
"Error when apply protocol qualifier to bound type");
6366 unsigned size =
sizeof(ObjCTypeParamType);
6368 void *mem =
Allocate(size,
alignof(ObjCTypeParamType));
6369 auto *newType =
new (mem) ObjCTypeParamType(
Decl, Canonical, protocols);
6371 Types.push_back(newType);
6372 ObjCTypeParamTypes.InsertNode(newType, InsertPos);
6382 protocols.append(NewTypeParamTy->qual_begin(), NewTypeParamTy->qual_end());
6397 for (
auto *Proto : OPT->quals()) {
6420 if (InheritedProtocols.empty())
6424 bool Conforms =
false;
6425 for (
auto *Proto : OPT->quals()) {
6427 for (
auto *PI : InheritedProtocols) {
6439 for (
auto *PI : InheritedProtocols) {
6441 bool Adopts =
false;
6442 for (
auto *Proto : OPT->quals()) {
6456 llvm::FoldingSetNodeID ID;
6459 void *InsertPos =
nullptr;
6461 ObjCObjectPointerTypes.FindNodeOrInsertPos(ID, InsertPos))
6470 ObjCObjectPointerTypes.FindNodeOrInsertPos(ID, InsertPos);
6479 Types.push_back(QType);
6480 ObjCObjectPointerTypes.InsertNode(QType, InsertPos);
6488 if (
Decl->TypeForDecl)
6492 assert(PrevDecl->TypeForDecl &&
"previous decl has no TypeForDecl");
6493 Decl->TypeForDecl = PrevDecl->TypeForDecl;
6494 return QualType(PrevDecl->TypeForDecl, 0);
6503 Decl->TypeForDecl =
T;
6516 llvm::FoldingSetNodeID ID;
6520 void *InsertPos =
nullptr;
6522 DependentTypeOfExprTypes.FindNodeOrInsertPos(ID, InsertPos);
6532 DependentTypeOfExprTypes.InsertNode(Canon, InsertPos);
6540 Types.push_back(toe);
6551 auto *tot =
new (*
this,
alignof(TypeOfType))
6552 TypeOfType(*
this, tofType, Canonical, Kind);
6553 Types.push_back(tot);
6577 llvm_unreachable(
"Unknown value kind");
6592 }
else if (!UnderlyingType.
isNull()) {
6595 llvm::FoldingSetNodeID ID;
6596 DependentDecltypeType::Profile(ID, *
this, E);
6598 void *InsertPos =
nullptr;
6599 if (DependentDecltypeType *Canon =
6600 DependentDecltypeTypes.FindNodeOrInsertPos(ID, InsertPos))
6605 new (*
this,
alignof(DependentDecltypeType)) DependentDecltypeType(E);
6606 DependentDecltypeTypes.InsertNode(DT, InsertPos);
6607 Types.push_back(DT);
6610 auto *DT =
new (*
this,
alignof(DecltypeType))
6611 DecltypeType(E, UnderlyingType, CanonType);
6612 Types.push_back(DT);
6617 bool FullySubstituted,
6621 if (FullySubstituted && Index) {
6624 llvm::FoldingSetNodeID ID;
6625 PackIndexingType::Profile(ID, *
this, Pattern.
getCanonicalType(), IndexExpr,
6626 FullySubstituted, Expansions);
6627 void *InsertPos =
nullptr;
6628 PackIndexingType *Canon =
6629 DependentPackIndexingTypes.FindNodeOrInsertPos(ID, InsertPos);
6632 PackIndexingType::totalSizeToAlloc<QualType>(Expansions.size()),
6636 IndexExpr, FullySubstituted, Expansions);
6637 DependentPackIndexingTypes.InsertNode(Canon, InsertPos);
6643 Allocate(PackIndexingType::totalSizeToAlloc<QualType>(Expansions.size()),
6645 auto *
T =
new (Mem) PackIndexingType(Canonical, Pattern, IndexExpr,
6646 FullySubstituted, Expansions);
6655 UnaryTransformType::UTTKind Kind)
const {
6657 llvm::FoldingSetNodeID ID;
6658 UnaryTransformType::Profile(ID, BaseType, UnderlyingType, Kind);
6660 void *InsertPos =
nullptr;
6661 if (UnaryTransformType *UT =
6662 UnaryTransformTypes.FindNodeOrInsertPos(ID, InsertPos))
6666 if (!BaseType->isDependentType()) {
6669 assert(UnderlyingType.
isNull() || BaseType == UnderlyingType);
6672 BaseType != CanonBase) {
6677 [[maybe_unused]] UnaryTransformType *UT =
6678 UnaryTransformTypes.FindNodeOrInsertPos(ID, InsertPos);
6679 assert(!UT &&
"broken canonicalization");
6683 auto *UT =
new (*
this,
alignof(UnaryTransformType))
6684 UnaryTransformType(BaseType, UnderlyingType, Kind, CanonType);
6685 UnaryTransformTypes.InsertNode(UT, InsertPos);
6686 Types.push_back(UT);
6690QualType ASTContext::getAutoTypeInternal(
6695 !TypeConstraintConcept && !IsDependent)
6699 llvm::FoldingSetNodeID ID;
6700 bool IsDeducedDependent =
6701 isa_and_nonnull<TemplateTemplateParmDecl>(TypeConstraintConcept) ||
6703 AutoType::Profile(ID, *
this, DeducedType,
Keyword,
6704 IsDependent || IsDeducedDependent, TypeConstraintConcept,
6705 TypeConstraintArgs);
6706 if (
auto const AT_iter = AutoTypes.find(ID); AT_iter != AutoTypes.end())
6707 return QualType(AT_iter->getSecond(), 0);
6711 if (!DeducedType.
isNull()) {
6713 }
else if (TypeConstraintConcept) {
6714 bool AnyNonCanonArgs =
false;
6715 auto *CanonicalConcept =
6718 *
this, TypeConstraintArgs, AnyNonCanonArgs);
6719 if (CanonicalConcept != TypeConstraintConcept || AnyNonCanonArgs) {
6721 CanonicalConcept, CanonicalConceptArgs,
6727 void *Mem =
Allocate(
sizeof(AutoType) +
6728 sizeof(TemplateArgument) * TypeConstraintArgs.size(),
6730 auto *AT =
new (Mem) AutoType(
6732 (IsDependent ? TypeDependence::DependentInstantiation
6733 : TypeDependence::None) |
6734 (IsPack ? TypeDependence::UnexpandedPack : TypeDependence::None),
6735 Canon, TypeConstraintConcept, TypeConstraintArgs);
6737 llvm::FoldingSetNodeID InsertedID;
6738 AT->Profile(InsertedID, *
this);
6739 assert(InsertedID == ID &&
"ID does not match");
6741 Types.push_back(AT);
6742 AutoTypes.try_emplace(ID, AT);
6743 return QualType(AT, 0);
6751 bool IsDependent,
bool IsPack,
6754 assert((!IsPack || IsDependent) &&
"only use IsPack for a dependent pack");
6755 assert((!IsDependent || DeducedType.
isNull()) &&
6756 "A dependent auto should be undeduced");
6757 return getAutoTypeInternal(DeducedType,
Keyword, IsDependent, IsPack,
6758 TypeConstraintConcept, TypeConstraintArgs);
6762 QualType CanonT =
T.getNonPackExpansionType().getCanonicalType();
6765 if (
auto *AT = CanonT->
getAs<AutoType>()) {
6766 if (!AT->isConstrained())
6770 AT->containsUnexpandedParameterPack()),
6782QualType ASTContext::getDeducedTemplateSpecializationTypeInternal(
6784 bool IsDependent,
QualType Canon)
const {
6786 void *InsertPos =
nullptr;
6787 llvm::FoldingSetNodeID ID;
6788 DeducedTemplateSpecializationType::Profile(ID,
Keyword,
Template, DeducedType,
6790 if (DeducedTemplateSpecializationType *DTST =
6791 DeducedTemplateSpecializationTypes.FindNodeOrInsertPos(ID, InsertPos))
6794 auto *DTST =
new (*
this,
alignof(DeducedTemplateSpecializationType))
6796 IsDependent, Canon);
6799 llvm::FoldingSetNodeID TempID;
6800 DTST->Profile(TempID);
6801 assert(ID == TempID &&
"ID does not match");
6803 Types.push_back(DTST);
6804 DeducedTemplateSpecializationTypes.InsertNode(DTST, InsertPos);
6813 bool IsDependent)
const {
6820 ? getDeducedTemplateSpecializationTypeInternal(
6824 return getDeducedTemplateSpecializationTypeInternal(
6833 llvm::FoldingSetNodeID ID;
6836 void *InsertPos =
nullptr;
6837 if (
AtomicType *AT = AtomicTypes.FindNodeOrInsertPos(ID, InsertPos))
6843 if (!
T.isCanonical()) {
6847 AtomicType *NewIP = AtomicTypes.FindNodeOrInsertPos(ID, InsertPos);
6848 assert(!NewIP &&
"Shouldn't be in the map!"); (void)NewIP;
6851 Types.push_back(
New);
6852 AtomicTypes.InsertNode(
New, InsertPos);
6883 return getFromTargetType(Target->getSizeType());
6902 return getFromTargetType(Target->getUnsignedPtrDiffType(
LangAS::Default));
6907 return getFromTargetType(Target->getIntMaxType());
6912 return getFromTargetType(Target->getUIntMaxType());
6930 return getFromTargetType(Target->getIntPtrType());
6940 return getFromTargetType(Target->getProcessIDType());
6952 const Type *Ty =
T.getTypePtr();
6980 quals = splitType.
Quals;
6985 QualType elementType = AT->getElementType();
6990 if (elementType == unqualElementType) {
6991 assert(quals.
empty());
6992 quals = splitType.
Quals;
7000 if (
const auto *CAT = dyn_cast<ConstantArrayType>(AT)) {
7002 CAT->getSizeExpr(), CAT->getSizeModifier(), 0);
7005 if (
const auto *IAT = dyn_cast<IncompleteArrayType>(AT)) {
7009 if (
const auto *VAT = dyn_cast<VariableArrayType>(AT)) {
7011 VAT->getSizeModifier(),
7012 VAT->getIndexTypeCVRQualifiers());
7017 DSAT->getSizeModifier(), 0);
7027 bool AllowPiMismatch)
const {
7042 if (
auto *CAT1 = dyn_cast<ConstantArrayType>(AT1)) {
7043 auto *CAT2 = dyn_cast<ConstantArrayType>(AT2);
7044 if (!((CAT2 && CAT1->getSize() == CAT2->getSize()) ||
7057 T1 = AT1->getElementType();
7058 T2 = AT2->getElementType();
7078 bool AllowPiMismatch)
const {
7083 if (T1PtrType && T2PtrType) {
7091 T1MPType && T2MPType) {
7092 if (
auto *RD1 = T1MPType->getMostRecentCXXRecordDecl(),
7093 *RD2 = T2MPType->getMostRecentCXXRecordDecl();
7094 RD1 != RD2 && RD1->getCanonicalDecl() != RD2->getCanonicalDecl())
7096 if (T1MPType->getQualifier().getCanonical() !=
7097 T2MPType->getQualifier().getCanonical())
7107 if (T1OPType && T2OPType) {
7139 if (Quals1 != Quals2)
7209 llvm_unreachable(
"bad template name kind!");
7215 if (!TP->hasDefaultArgument())
7217 return &TP->getDefaultArgument().getArgument();
7220 case NamedDecl::TemplateTypeParm:
7222 case NamedDecl::NonTypeTemplateParm:
7224 case NamedDecl::TemplateTemplateParm:
7227 llvm_unreachable(
"Unexpected template parameter kind");
7232 bool IgnoreDeduced)
const {
7233 while (std::optional<TemplateName> UnderlyingOrNone =
7235 Name = *UnderlyingOrNone;
7240 if (
auto *TTP = dyn_cast<TemplateTemplateParmDecl>(
Template))
7249 llvm_unreachable(
"cannot canonicalize unresolved template");
7253 assert(DTN &&
"Non-dependent template names must refer to template decls.");
7272 assert(IgnoreDeduced ==
false);
7279 bool NonCanonical = CanonUnderlying != Underlying;
7285 assert(CanonArgs.size() <= Params.size());
7291 for (
int I = CanonArgs.size() - 1; I >= 0; --I) {
7300 if (I ==
int(CanonArgs.size() - 1))
7301 CanonArgs.pop_back();
7302 NonCanonical =
true;
7312 llvm_unreachable(
"always sugar node");
7315 llvm_unreachable(
"bad template name!");
7320 bool IgnoreDeduced)
const {
7341 llvm::FoldingSetNodeID XCEID, YCEID;
7342 XCE->
Profile(XCEID, *
this,
true,
true);
7343 YCE->
Profile(YCEID, *
this,
true,
true);
7344 return XCEID == YCEID;
7393 if (
auto *TX = dyn_cast<TemplateTypeParmDecl>(
X)) {
7395 if (TX->isParameterPack() != TY->isParameterPack())
7397 if (TX->hasTypeConstraint() != TY->hasTypeConstraint())
7400 TY->getTypeConstraint());
7403 if (
auto *TX = dyn_cast<NonTypeTemplateParmDecl>(
X)) {
7405 return TX->isParameterPack() == TY->isParameterPack() &&
7406 TX->getASTContext().hasSameType(TX->getType(), TY->getType()) &&
7408 TY->getPlaceholderTypeConstraint());
7413 return TX->isParameterPack() == TY->isParameterPack() &&
7415 TY->getTemplateParameters());
7420 if (
X->size() != Y->
size())
7423 for (
unsigned I = 0, N =
X->size(); I != N; ++I)
7437 if (
auto *TTPX = dyn_cast<TemplateTypeParmDecl>(
X)) {
7439 if (!TTPX->hasDefaultArgument() || !TTPY->hasDefaultArgument())
7442 return hasSameType(TTPX->getDefaultArgument().getArgument().getAsType(),
7443 TTPY->getDefaultArgument().getArgument().getAsType());
7446 if (
auto *NTTPX = dyn_cast<NonTypeTemplateParmDecl>(
X)) {
7448 if (!NTTPX->hasDefaultArgument() || !NTTPY->hasDefaultArgument())
7451 Expr *DefaultArgumentX =
7452 NTTPX->getDefaultArgument().getArgument().getAsExpr()->
IgnoreImpCasts();
7453 Expr *DefaultArgumentY =
7454 NTTPY->getDefaultArgument().getArgument().getAsExpr()->
IgnoreImpCasts();
7455 llvm::FoldingSetNodeID XID, YID;
7456 DefaultArgumentX->
Profile(XID, *
this,
true);
7457 DefaultArgumentY->
Profile(YID, *
this,
true);
7464 if (!TTPX->hasDefaultArgument() || !TTPY->hasDefaultArgument())
7479 auto Kind =
X.getKind();
7487 auto [NamespaceX, PrefixX] =
X.getAsNamespaceAndPrefix();
7490 NamespaceY->getNamespace()))
7495 const auto *TX =
X.getAsType(), *TY = Y.
getAsType();
7496 if (TX->getCanonicalTypeInternal() != TY->getCanonicalTypeInternal())
7505 llvm_unreachable(
"unhandled qualifier kind");
7511 if (A->
hasAttr<CUDADeviceAttr>() != B->
hasAttr<CUDADeviceAttr>())
7513 if (A->
hasAttr<CUDADeviceAttr>() && B->
hasAttr<CUDADeviceAttr>())
7525 llvm::FoldingSetNodeID Cand1ID, Cand2ID;
7529 for (
auto Pair : zip_longest(AEnableIfAttrs, BEnableIfAttrs)) {
7530 std::optional<EnableIfAttr *> Cand1A = std::get<0>(Pair);
7531 std::optional<EnableIfAttr *> Cand2A = std::get<1>(Pair);
7534 if (!Cand1A || !Cand2A)
7540 (*Cand1A)->getCond()->Profile(Cand1ID, A->
getASTContext(),
true);
7541 (*Cand2A)->getCond()->Profile(Cand2ID, B->
getASTContext(),
true);
7545 if (Cand1ID != Cand2ID)
7579 if (
const auto *TypedefX = dyn_cast<TypedefNameDecl>(
X))
7580 if (
const auto *TypedefY = dyn_cast<TypedefNameDecl>(Y))
7582 TypedefY->getUnderlyingType());
7599 if (
const auto *TagX = dyn_cast<TagDecl>(
X)) {
7601 return (TagX->getTagKind() == TagY->getTagKind()) ||
7613 if (
const auto *FuncX = dyn_cast<FunctionDecl>(
X)) {
7615 if (
const auto *CtorX = dyn_cast<CXXConstructorDecl>(
X)) {
7617 if (CtorX->getInheritedConstructor() &&
7618 !
isSameEntity(CtorX->getInheritedConstructor().getConstructor(),
7619 CtorY->getInheritedConstructor().getConstructor()))
7623 if (FuncX->isMultiVersion() != FuncY->isMultiVersion())
7628 if (FuncX->isMultiVersion()) {
7629 const auto *TAX = FuncX->getAttr<TargetAttr>();
7630 const auto *TAY = FuncY->getAttr<TargetAttr>();
7631 assert(TAX && TAY &&
"Multiversion Function without target attribute");
7633 if (TAX->getFeaturesStr() != TAY->getFeaturesStr())
7639 if ((FuncX->isMemberLikeConstrainedFriend() ||
7640 FuncY->isMemberLikeConstrainedFriend()) &&
7641 !FuncX->getLexicalDeclContext()->Equals(
7642 FuncY->getLexicalDeclContext())) {
7647 FuncY->getTrailingRequiresClause()))
7655 FD = FD->getCanonicalDecl();
7656 return FD->getTypeSourceInfo() ? FD->getTypeSourceInfo()->getType()
7659 QualType XT = GetTypeAsWritten(FuncX), YT = GetTypeAsWritten(FuncY);
7674 return FuncX->getLinkageInternal() == FuncY->getLinkageInternal() &&
7679 if (
const auto *VarX = dyn_cast<VarDecl>(
X)) {
7681 if (VarX->getLinkageInternal() == VarY->getLinkageInternal()) {
7684 if (VarX->getType().isNull() || VarY->getType().isNull())
7687 if (
hasSameType(VarX->getType(), VarY->getType()))
7697 if (!VarXTy || !VarYTy)
7706 if (
const auto *NamespaceX = dyn_cast<NamespaceDecl>(
X)) {
7708 return NamespaceX->isInline() == NamespaceY->isInline();
7713 if (
const auto *TemplateX = dyn_cast<TemplateDecl>(
X)) {
7717 if (
const auto *ConceptX = dyn_cast<ConceptDecl>(
X)) {
7720 ConceptY->getConstraintExpr()))
7725 TemplateY->getTemplatedDecl()) &&
7727 TemplateY->getTemplateParameters());
7731 if (
const auto *FDX = dyn_cast<FieldDecl>(
X)) {
7734 return hasSameType(FDX->getType(), FDY->getType());
7738 if (
const auto *IFDX = dyn_cast<IndirectFieldDecl>(
X)) {
7740 return IFDX->getAnonField()->getCanonicalDecl() ==
7741 IFDY->getAnonField()->getCanonicalDecl();
7750 if (
const auto *USX = dyn_cast<UsingShadowDecl>(
X)) {
7757 if (
const auto *UX = dyn_cast<UsingDecl>(
X)) {
7760 UX->hasTypename() == UY->hasTypename() &&
7761 UX->isAccessDeclaration() == UY->isAccessDeclaration();
7763 if (
const auto *UX = dyn_cast<UnresolvedUsingValueDecl>(
X)) {
7766 UX->isAccessDeclaration() == UY->isAccessDeclaration();
7768 if (
const auto *UX = dyn_cast<UnresolvedUsingTypenameDecl>(
X)) {
7776 if (
const auto *UX = dyn_cast<UsingPackDecl>(
X)) {
7778 UX->getInstantiatedFromUsingDecl(),
7783 if (
const auto *NAX = dyn_cast<NamespaceAliasDecl>(
X)) {
7785 return NAX->getNamespace()->Equals(NAY->getNamespace());
7833 bool AnyNonCanonArgs =
false;
7836 if (!AnyNonCanonArgs)
7846 llvm_unreachable(
"Unhandled template argument kind");
7856 llvm_unreachable(
"Comparing NULL template argument");
7881 llvm::FoldingSetNodeID ID1, ID2;
7891 return isSameTemplateArgument(Arg1, Arg2);
7895 llvm_unreachable(
"Unhandled template argument kind");
7900 if (!
T.hasLocalQualifiers()) {
7902 if (
const auto *AT = dyn_cast<ArrayType>(
T))
7922 const auto *ATy = dyn_cast<ArrayType>(split.
Ty);
7923 if (!ATy || qs.
empty())
7930 if (
const auto *CAT = dyn_cast<ConstantArrayType>(ATy))
7933 CAT->getSizeModifier(),
7934 CAT->getIndexTypeCVRQualifiers()));
7935 if (
const auto *IAT = dyn_cast<IncompleteArrayType>(ATy))
7937 IAT->getSizeModifier(),
7938 IAT->getIndexTypeCVRQualifiers()));
7940 if (
const auto *DSAT = dyn_cast<DependentSizedArrayType>(ATy))
7942 NewEltTy, DSAT->getSizeExpr(), DSAT->getSizeModifier(),
7943 DSAT->getIndexTypeCVRQualifiers()));
7948 VAT->getIndexTypeCVRQualifiers()));
7954 if (
T->isArrayType() ||
T->isFunctionType())
7962 return T.getUnqualifiedType();
7973 if (
T->isArrayType() ||
T->isFunctionType())
7975 return T.getUnqualifiedType();
7990 assert(PrettyArrayType &&
"Not an array type!");
8027 uint64_t ElementCount = 1;
8030 CA = dyn_cast_or_null<ConstantArrayType>(
8033 return ElementCount;
8041 uint64_t ElementCount = 1;
8045 AILE = dyn_cast<ArrayInitLoopExpr>(AILE->
getSubExpr());
8048 return ElementCount;
8058 default: llvm_unreachable(
"getFloatingRank(): not a floating type");
8060 case BuiltinType::Half:
return HalfRank;
8061 case BuiltinType::Float:
return FloatRank;
8094unsigned ASTContext::getIntegerRank(
const Type *
T)
const {
8095 assert(
T->isCanonicalUnqualified() &&
"T should be canonicalized");
8099 if (
const auto *EIT = dyn_cast<BitIntType>(
T))
8100 return 0 + (EIT->getNumBits() << 3);
8103 default: llvm_unreachable(
"getIntegerRank(): not a built-in integer");
8104 case BuiltinType::Bool:
8106 case BuiltinType::Char_S:
8107 case BuiltinType::Char_U:
8108 case BuiltinType::SChar:
8109 case BuiltinType::UChar:
8111 case BuiltinType::Short:
8112 case BuiltinType::UShort:
8114 case BuiltinType::Int:
8115 case BuiltinType::UInt:
8117 case BuiltinType::Long:
8118 case BuiltinType::ULong:
8120 case BuiltinType::LongLong:
8121 case BuiltinType::ULongLong:
8123 case BuiltinType::Int128:
8124 case BuiltinType::UInt128:
8129 case BuiltinType::Char8:
8131 case BuiltinType::Char16:
8132 return getIntegerRank(
8134 case BuiltinType::Char32:
8135 return getIntegerRank(
8137 case BuiltinType::WChar_S:
8138 case BuiltinType::WChar_U:
8139 return getIntegerRank(
8169 uint64_t BitWidth = Field->getBitWidthValue();
8195 if (BitWidth < IntSize)
8198 if (BitWidth == IntSize)
8213 assert(!Promotable.
isNull());
8216 return ED->getPromotionType();
8225 if (BT->getKind() == BuiltinType::WChar_S ||
8226 BT->getKind() == BuiltinType::WChar_U ||
8227 BT->getKind() == BuiltinType::Char8 ||
8228 BT->getKind() == BuiltinType::Char16 ||
8229 BT->getKind() == BuiltinType::Char32) {
8230 bool FromIsSigned = BT->getKind() == BuiltinType::WChar_S;
8234 for (
const auto &PT : PromoteTypes) {
8236 if (FromSize < ToSize ||
8237 (FromSize == ToSize && FromIsSigned == PT->isSignedIntegerType()))
8240 llvm_unreachable(
"char type should fit into long long");
8247 uint64_t PromotableSize =
getIntWidth(Promotable);
8256 while (!
T.isNull()) {
8258 return T.getObjCLifetime();
8259 if (
T->isArrayType())
8262 T = PT->getPointeeType();
8264 T = RT->getPointeeType();
8289 if (
const auto *ET = dyn_cast<EnumType>(LHSC))
8291 if (
const auto *ET = dyn_cast<EnumType>(RHSC))
8294 if (LHSC == RHSC)
return 0;
8299 unsigned LHSRank = getIntegerRank(LHSC);
8300 unsigned RHSRank = getIntegerRank(RHSC);
8302 if (LHSUnsigned == RHSUnsigned) {
8303 if (LHSRank == RHSRank)
return 0;
8304 return LHSRank > RHSRank ? 1 : -1;
8310 if (LHSRank >= RHSRank)
8320 if (RHSRank >= LHSRank)
8330 if (CFConstantStringTypeDecl)
8331 return CFConstantStringTypeDecl;
8333 assert(!CFConstantStringTagDecl &&
8334 "tag and typedef should be initialized together");
8336 CFConstantStringTagDecl->startDefinition();
8374 if (
static_cast<unsigned>(CFRuntime) <
8377 Fields[Count++] = {
IntTy,
"flags" };
8379 Fields[Count++] = {
LongTy,
"length" };
8383 Fields[Count++] = { getFromTargetType(Target->getUInt64Type()),
"_swift_rc" };
8387 Fields[Count++] = {
IntTy,
"_ptr" };
8393 for (
unsigned i = 0; i < Count; ++i) {
8397 Fields[i].Type,
nullptr,
8400 CFConstantStringTagDecl->addDecl(Field);
8403 CFConstantStringTagDecl->completeDefinition();
8407 CFConstantStringTypeDecl =
8410 return CFConstantStringTypeDecl;
8414 if (!CFConstantStringTagDecl)
8416 return CFConstantStringTagDecl;
8426 if (ObjCSuperType.isNull()) {
8431 return ObjCSuperType;
8437 CFConstantStringTagDecl = TT->castAsRecordDecl();
8441 if (BlockDescriptorType)
8454 static const char *
const FieldNames[] = {
8459 for (
size_t i = 0; i < 2; ++i) {
8462 &
Idents.get(FieldNames[i]), FieldTypes[i],
nullptr,
8470 BlockDescriptorType = RD;
8476 if (BlockDescriptorExtendedType)
8491 static const char *
const FieldNames[] = {
8498 for (
size_t i = 0; i < 4; ++i) {
8501 &
Idents.get(FieldNames[i]), FieldTypes[i],
nullptr,
8510 BlockDescriptorExtendedType = RD;
8515 const auto *BT = dyn_cast<BuiltinType>(
T);
8524 switch (BT->getKind()) {
8525#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
8526 case BuiltinType::Id: \
8528#include "clang/Basic/OpenCLImageTypes.def"
8530 case BuiltinType::OCLClkEvent:
8533 case BuiltinType::OCLEvent:
8536 case BuiltinType::OCLQueue:
8539 case BuiltinType::OCLReserveID:
8542 case BuiltinType::OCLSampler:
8561 if (!copyExpr && record->hasTrivialDestructor())
return false;
8592 llvm_unreachable(
"impossible");
8594 llvm_unreachable(
"fell out of lifetime switch!");
8602 bool &HasByrefExtendedLayout)
const {
8607 HasByrefExtendedLayout =
false;
8609 HasByrefExtendedLayout =
true;
8623 assert(Target &&
"Expected target to be initialized");
8624 const llvm::Triple &
T = Target->getTriple();
8626 if (
T.isOSWindows() &&
T.isArch64Bit())
8632 assert(Target &&
"Expected target to be initialized");
8633 const llvm::Triple &
T = Target->getTriple();
8635 if (
T.isOSWindows() &&
T.isArch64Bit())
8641 if (!ObjCInstanceTypeDecl)
8642 ObjCInstanceTypeDecl =
8644 return ObjCInstanceTypeDecl;
8650 if (
const auto *TT = dyn_cast<TypedefType>(
T))
8652 return II->isStr(
"BOOL");
8660 if (!
type->isIncompleteArrayType() &&
type->isIncompleteType())
8669 else if (
type->isArrayType())
8688 if (
First->isInlineSpecified() || !
First->isStaticDataMember())
8695 !D->isInlineSpecified() && (D->isConstexpr() ||
First->isConstexpr()))
8726 for (
auto *PI :
Decl->parameters()) {
8731 assert(sz.
isPositive() &&
"BlockExpr - Incomplete param type");
8740 ParmOffset = PtrSize;
8741 for (
auto *PVDecl :
Decl->parameters()) {
8742 QualType PType = PVDecl->getOriginalType();
8743 if (
const auto *AT =
8748 PType = PVDecl->getType();
8750 PType = PVDecl->getType();
8770 for (
auto *PI :
Decl->parameters()) {
8777 "getObjCEncodingForFunctionDecl - Incomplete param type");
8784 for (
auto *PVDecl :
Decl->parameters()) {
8785 QualType PType = PVDecl->getOriginalType();
8786 if (
const auto *AT =
8791 PType = PVDecl->getType();
8793 PType = PVDecl->getType();
8807 bool Extended)
const {
8811 ObjCEncOptions Options = ObjCEncOptions()
8812 .setExpandPointedToStructures()
8813 .setExpandStructures()
8814 .setIsOutermostType();
8816 Options.setEncodeBlockParameters().setEncodeClassNames();
8817 getObjCEncodingForTypeImpl(
T, S, Options,
nullptr);
8823 bool Extended)
const {
8828 Decl->getReturnType(), S, Extended);
8837 E =
Decl->sel_param_end(); PI != E; ++PI) {
8844 "getObjCEncodingForMethodDecl - Incomplete param type");
8852 ParmOffset = 2 * PtrSize;
8854 E =
Decl->sel_param_end(); PI != E; ++PI) {
8857 if (
const auto *AT =
8866 PType, S, Extended);
8877 const Decl *Container)
const {
8880 if (
const auto *CID = dyn_cast<ObjCCategoryImplDecl>(Container)) {
8881 for (
auto *PID : CID->property_impls())
8882 if (PID->getPropertyDecl() == PD)
8886 for (
auto *PID : OID->property_impls())
8887 if (PID->getPropertyDecl() == PD)
8921 const Decl *Container)
const {
8923 bool Dynamic =
false;
8931 SynthesizePID = PropertyImpDecl;
8935 std::string S =
"T";
8980 if (SynthesizePID) {
8997 if (BT->getKind() == BuiltinType::ULong &&
getIntWidth(PointeeTy) == 32)
9000 if (BT->getKind() == BuiltinType::Long &&
getIntWidth(PointeeTy) == 32)
9013 getObjCEncodingForTypeImpl(
T, S,
9015 .setExpandPointedToStructures()
9016 .setExpandStructures()
9017 .setIsOutermostType(),
9018 Field, NotEncodedT);
9022 std::string& S)
const {
9026 getObjCEncodingForTypeImpl(
T, S,
9028 .setExpandPointedToStructures()
9029 .setExpandStructures()
9030 .setIsOutermostType()
9031 .setEncodingProperty(),
9039 case BuiltinType::Void:
return 'v';
9040 case BuiltinType::Bool:
return 'B';
9041 case BuiltinType::Char8:
9042 case BuiltinType::Char_U:
9043 case BuiltinType::UChar:
return 'C';
9044 case BuiltinType::Char16:
9045 case BuiltinType::UShort:
return 'S';
9046 case BuiltinType::Char32:
9047 case BuiltinType::UInt:
return 'I';
9048 case BuiltinType::ULong:
9049 return C->getTargetInfo().getLongWidth() == 32 ?
'L' :
'Q';
9050 case BuiltinType::UInt128:
return 'T';
9051 case BuiltinType::ULongLong:
return 'Q';
9052 case BuiltinType::Char_S:
9053 case BuiltinType::SChar:
return 'c';
9054 case BuiltinType::Short:
return 's';
9055 case BuiltinType::WChar_S:
9056 case BuiltinType::WChar_U:
9057 case BuiltinType::Int:
return 'i';
9058 case BuiltinType::Long:
9059 return C->getTargetInfo().getLongWidth() == 32 ?
'l' :
'q';
9060 case BuiltinType::LongLong:
return 'q';
9061 case BuiltinType::Int128:
return 't';
9062 case BuiltinType::Float:
return 'f';
9063 case BuiltinType::Double:
return 'd';
9064 case BuiltinType::LongDouble:
return 'D';
9065 case BuiltinType::NullPtr:
return '*';
9067 case BuiltinType::BFloat16:
9068 case BuiltinType::Float16:
9069 case BuiltinType::Float128:
9070 case BuiltinType::Ibm128:
9071 case BuiltinType::Half:
9072 case BuiltinType::ShortAccum:
9073 case BuiltinType::Accum:
9074 case BuiltinType::LongAccum:
9075 case BuiltinType::UShortAccum:
9076 case BuiltinType::UAccum:
9077 case BuiltinType::ULongAccum:
9078 case BuiltinType::ShortFract:
9079 case BuiltinType::Fract:
9080 case BuiltinType::LongFract:
9081 case BuiltinType::UShortFract:
9082 case BuiltinType::UFract:
9083 case BuiltinType::ULongFract:
9084 case BuiltinType::SatShortAccum:
9085 case BuiltinType::SatAccum:
9086 case BuiltinType::SatLongAccum:
9087 case BuiltinType::SatUShortAccum:
9088 case BuiltinType::SatUAccum:
9089 case BuiltinType::SatULongAccum:
9090 case BuiltinType::SatShortFract:
9091 case BuiltinType::SatFract:
9092 case BuiltinType::SatLongFract:
9093 case BuiltinType::SatUShortFract:
9094 case BuiltinType::SatUFract:
9095 case BuiltinType::SatULongFract:
9099#define SVE_TYPE(Name, Id, SingletonId) \
9100 case BuiltinType::Id:
9101#include "clang/Basic/AArch64ACLETypes.def"
9102#define RVV_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
9103#include "clang/Basic/RISCVVTypes.def"
9104#define WASM_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
9105#include "clang/Basic/WebAssemblyReferenceTypes.def"
9106#define AMDGPU_TYPE(Name, Id, SingletonId, Width, Align) case BuiltinType::Id:
9107#include "clang/Basic/AMDGPUTypes.def"
9111 "cannot yet @encode type %0");
9116 case BuiltinType::ObjCId:
9117 case BuiltinType::ObjCClass:
9118 case BuiltinType::ObjCSel:
9119 llvm_unreachable(
"@encoding ObjC primitive type");
9122#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
9123 case BuiltinType::Id:
9124#include "clang/Basic/OpenCLImageTypes.def"
9125#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
9126 case BuiltinType::Id:
9127#include "clang/Basic/OpenCLExtensionTypes.def"
9128 case BuiltinType::OCLEvent:
9129 case BuiltinType::OCLClkEvent:
9130 case BuiltinType::OCLQueue:
9131 case BuiltinType::OCLReserveID:
9132 case BuiltinType::OCLSampler:
9133 case BuiltinType::Dependent:
9134#define PPC_VECTOR_TYPE(Name, Id, Size) \
9135 case BuiltinType::Id:
9136#include "clang/Basic/PPCTypes.def"
9137#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
9138#include "clang/Basic/HLSLIntangibleTypes.def"
9139#define BUILTIN_TYPE(KIND, ID)
9140#define PLACEHOLDER_TYPE(KIND, ID) \
9141 case BuiltinType::KIND:
9142#include "clang/AST/BuiltinTypes.def"
9143 llvm_unreachable(
"invalid builtin type for @encode");
9145 llvm_unreachable(
"invalid BuiltinType::Kind value");
9152 if (!
Enum->isFixed())
9162 assert(FD->
isBitField() &&
"not a bitfield - getObjCEncodingForTypeImpl");
9182 if (
const auto *IVD = dyn_cast<ObjCIvarDecl>(FD)) {
9190 S += llvm::utostr(Offset);
9192 if (
const auto *ET =
T->getAsCanonical<EnumType>())
9205 bool VisitBasesAndFields) {
9206 T =
T->getBaseElementTypeUnsafe();
9210 PT->getPointeeType().getTypePtr(),
false);
9212 auto *CXXRD =
T->getAsCXXRecordDecl();
9220 if (!CXXRD->hasDefinition() || !VisitBasesAndFields)
9223 for (
const auto &B : CXXRD->bases())
9228 for (
auto *FD : CXXRD->fields())
9237void ASTContext::getObjCEncodingForTypeImpl(QualType
T, std::string &S,
9238 const ObjCEncOptions Options,
9239 const FieldDecl *FD,
9240 QualType *NotEncodedT)
const {
9242 switch (CT->getTypeClass()) {
9247 if (
const auto *BT = dyn_cast<BuiltinType>(CT))
9255 getObjCEncodingForTypeImpl(
T->
castAs<ComplexType>()->getElementType(), S,
9262 getObjCEncodingForTypeImpl(
T->
castAs<AtomicType>()->getValueType(), S,
9269 case Type::LValueReference:
9270 case Type::RValueReference: {
9273 const auto *PT =
T->
castAs<PointerType>();
9274 if (PT->isObjCSelType()) {
9283 bool isReadOnly =
false;
9288 if (
T->
getAs<TypedefType>()) {
9289 if (Options.IsOutermostType() &&
T.isConstQualified()) {
9293 }
else if (Options.IsOutermostType()) {
9294 QualType P = PointeeTy;
9295 while (
auto PT = P->
getAs<PointerType>())
9306 if (StringRef(S).ends_with(
"nr"))
9307 S.replace(S.end()-2, S.end(),
"rn");
9317 }
else if (
const auto *RTy = PointeeTy->
getAsCanonical<RecordType>()) {
9318 const IdentifierInfo *II = RTy->getDecl()->getIdentifier();
9320 if (II == &
Idents.get(
"objc_class")) {
9325 if (II == &
Idents.get(
"objc_object")) {
9334 RTy, Options.ExpandPointedToStructures()))) {
9343 ObjCEncOptions NewOptions;
9344 if (Options.ExpandPointedToStructures())
9345 NewOptions.setExpandStructures();
9346 getObjCEncodingForTypeImpl(PointeeTy, S, NewOptions,
9347 nullptr, NotEncodedT);
9351 case Type::ConstantArray:
9352 case Type::IncompleteArray:
9353 case Type::VariableArray: {
9360 getObjCEncodingForTypeImpl(
9361 AT->getElementType(), S,
9362 Options.keepingOnly(ObjCEncOptions().setExpandStructures()), FD);
9366 if (
const auto *CAT = dyn_cast<ConstantArrayType>(AT))
9367 S += llvm::utostr(CAT->getZExtSize());
9371 "Unknown array type!");
9375 getObjCEncodingForTypeImpl(
9376 AT->getElementType(), S,
9377 Options.keepingOnly(ObjCEncOptions().setExpandStructures()), FD,
9384 case Type::FunctionNoProto:
9385 case Type::FunctionProto:
9389 case Type::Record: {
9391 S += RDecl->
isUnion() ?
'(' :
'{';
9395 if (
const auto *Spec = dyn_cast<ClassTemplateSpecializationDecl>(RDecl)) {
9396 const TemplateArgumentList &TemplateArgs = Spec->getTemplateArgs();
9397 llvm::raw_string_ostream
OS(S);
9398 printTemplateArgumentList(OS, TemplateArgs.
asArray(),
9404 if (Options.ExpandStructures()) {
9407 getObjCEncodingForStructureImpl(RDecl, S, FD,
true, NotEncodedT);
9409 for (
const auto *Field : RDecl->
fields()) {
9412 S +=
Field->getNameAsString();
9417 if (
Field->isBitField()) {
9418 getObjCEncodingForTypeImpl(
Field->getType(), S,
9419 ObjCEncOptions().setExpandStructures(),
9422 QualType qt =
Field->getType();
9424 getObjCEncodingForTypeImpl(
9426 ObjCEncOptions().setExpandStructures().setIsStructField(), FD,
9432 S += RDecl->
isUnion() ?
')' :
'}';
9436 case Type::BlockPointer: {
9437 const auto *BT =
T->
castAs<BlockPointerType>();
9439 if (Options.EncodeBlockParameters()) {
9440 const auto *FT = BT->getPointeeType()->castAs<FunctionType>();
9444 getObjCEncodingForTypeImpl(FT->getReturnType(), S,
9445 Options.forComponentType(), FD, NotEncodedT);
9449 if (
const auto *FPT = dyn_cast<FunctionProtoType>(FT)) {
9450 for (
const auto &I : FPT->param_types())
9451 getObjCEncodingForTypeImpl(I, S, Options.forComponentType(), FD,
9459 case Type::ObjCObject: {
9463 S +=
"{objc_object=}";
9467 S +=
"{objc_class=}";
9474 case Type::ObjCInterface: {
9477 ObjCInterfaceDecl *OI =
T->
castAs<ObjCObjectType>()->getInterface();
9480 if (Options.ExpandStructures()) {
9482 SmallVector<const ObjCIvarDecl*, 32> Ivars;
9484 for (
unsigned i = 0, e = Ivars.size(); i != e; ++i) {
9485 const FieldDecl *
Field = Ivars[i];
9486 if (
Field->isBitField())
9487 getObjCEncodingForTypeImpl(
Field->getType(), S,
9488 ObjCEncOptions().setExpandStructures(),
9491 getObjCEncodingForTypeImpl(
Field->getType(), S,
9492 ObjCEncOptions().setExpandStructures(), FD,
9500 case Type::ObjCObjectPointer: {
9501 const auto *OPT =
T->
castAs<ObjCObjectPointerType>();
9502 if (OPT->isObjCIdType()) {
9507 if (OPT->isObjCClassType() || OPT->isObjCQualifiedClassType()) {
9515 if (OPT->isObjCQualifiedIdType()) {
9516 getObjCEncodingForTypeImpl(
9518 Options.keepingOnly(ObjCEncOptions()
9519 .setExpandPointedToStructures()
9520 .setExpandStructures()),
9522 if (FD || Options.EncodingProperty() || Options.EncodeClassNames()) {
9526 for (
const auto *I : OPT->quals()) {
9528 S += I->getObjCRuntimeNameAsString();
9537 if (OPT->getInterfaceDecl() &&
9538 (FD || Options.EncodingProperty() || Options.EncodeClassNames())) {
9540 S += OPT->getInterfaceDecl()->getObjCRuntimeNameAsString();
9541 for (
const auto *I : OPT->quals()) {
9543 S += I->getObjCRuntimeNameAsString();
9553 case Type::MemberPointer:
9557 case Type::ExtVector:
9563 case Type::ConstantMatrix:
9576 case Type::DeducedTemplateSpecialization:
9579 case Type::HLSLAttributedResource:
9580 case Type::HLSLInlineSpirv:
9581 llvm_unreachable(
"unexpected type");
9583 case Type::ArrayParameter:
9585#define ABSTRACT_TYPE(KIND, BASE)
9586#define TYPE(KIND, BASE)
9587#define DEPENDENT_TYPE(KIND, BASE) \
9589#define NON_CANONICAL_TYPE(KIND, BASE) \
9591#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(KIND, BASE) \
9593#include "clang/AST/TypeNodes.inc"
9594 llvm_unreachable(
"@encode for dependent type!");
9596 llvm_unreachable(
"bad type kind!");
9599void ASTContext::getObjCEncodingForStructureImpl(RecordDecl *RDecl,
9601 const FieldDecl *FD,
9603 QualType *NotEncodedT)
const {
9604 assert(RDecl &&
"Expected non-null RecordDecl");
9605 assert(!RDecl->
isUnion() &&
"Should not be called for unions");
9609 const auto *CXXRec = dyn_cast<CXXRecordDecl>(RDecl);
9610 std::multimap<uint64_t, NamedDecl *> FieldOrBaseOffsets;
9614 for (
const auto &BI : CXXRec->bases()) {
9615 if (!BI.isVirtual()) {
9620 FieldOrBaseOffsets.insert(FieldOrBaseOffsets.upper_bound(offs),
9621 std::make_pair(offs, base));
9626 for (FieldDecl *Field : RDecl->
fields()) {
9627 if (!
Field->isZeroLengthBitField() &&
Field->isZeroSize(*
this))
9630 FieldOrBaseOffsets.insert(FieldOrBaseOffsets.upper_bound(offs),
9631 std::make_pair(offs, Field));
9634 if (CXXRec && includeVBases) {
9635 for (
const auto &BI : CXXRec->vbases()) {
9641 FieldOrBaseOffsets.find(offs) == FieldOrBaseOffsets.end())
9642 FieldOrBaseOffsets.insert(FieldOrBaseOffsets.end(),
9643 std::make_pair(offs, base));
9657 std::multimap<uint64_t, NamedDecl *>::iterator
9658 CurLayObj = FieldOrBaseOffsets.begin();
9660 if (CXXRec && CXXRec->isDynamicClass() &&
9661 (CurLayObj == FieldOrBaseOffsets.end() || CurLayObj->first != 0)) {
9664 std::string recname = CXXRec->getNameAsString();
9665 if (recname.empty()) recname =
"?";
9678 FieldOrBaseOffsets.insert(FieldOrBaseOffsets.upper_bound(offs),
9679 std::make_pair(offs,
nullptr));
9682 for (; CurLayObj != FieldOrBaseOffsets.end(); ++CurLayObj) {
9684 assert(CurOffs <= CurLayObj->first);
9685 if (CurOffs < CurLayObj->first) {
9686 uint64_t padding = CurLayObj->first - CurOffs;
9698 NamedDecl *dcl = CurLayObj->second;
9702 if (
auto *base = dyn_cast<CXXRecordDecl>(dcl)) {
9707 getObjCEncodingForStructureImpl(base, S, FD,
false,
9717 S += field->getNameAsString();
9721 if (field->isBitField()) {
9724 CurOffs += field->getBitWidthValue();
9727 QualType qt = field->getType();
9729 getObjCEncodingForTypeImpl(
9730 qt, S, ObjCEncOptions().setExpandStructures().setIsStructField(),
9741 std::string& S)
const {
9774 if (!ObjCClassDecl) {
9779 return ObjCClassDecl;
9783 if (!ObjCProtocolClassDecl) {
9784 ObjCProtocolClassDecl
9793 return ObjCProtocolClassDecl;
9814 QualType T = Context->getPointerType(Context->CharTy);
9815 return Context->buildImplicitTypedef(
T, Name);
9828 QualType T = Context->getPointerType(Context->VoidTy);
9829 return Context->buildImplicitTypedef(
T,
"__builtin_va_list");
9836 if (Context->getLangOpts().CPlusPlus) {
9841 &Context->Idents.get(
"std"),
9849 const size_t NumFields = 5;
9851 const char *FieldNames[NumFields];
9854 FieldTypes[0] = Context->getPointerType(Context->VoidTy);
9855 FieldNames[0] =
"__stack";
9858 FieldTypes[1] = Context->getPointerType(Context->VoidTy);
9859 FieldNames[1] =
"__gr_top";
9862 FieldTypes[2] = Context->getPointerType(Context->VoidTy);
9863 FieldNames[2] =
"__vr_top";
9866 FieldTypes[3] = Context->IntTy;
9867 FieldNames[3] =
"__gr_offs";
9870 FieldTypes[4] = Context->IntTy;
9871 FieldNames[4] =
"__vr_offs";
9874 for (
unsigned i = 0; i < NumFields; ++i) {
9879 &Context->Idents.get(FieldNames[i]),
9880 FieldTypes[i],
nullptr,
9892 return Context->buildImplicitTypedef(VaListTagType,
"__builtin_va_list");
9899 VaListTagDecl = Context->buildImplicitRecord(
"__va_list_tag");
9902 const size_t NumFields = 5;
9904 const char *FieldNames[NumFields];
9907 FieldTypes[0] = Context->UnsignedCharTy;
9908 FieldNames[0] =
"gpr";
9911 FieldTypes[1] = Context->UnsignedCharTy;
9912 FieldNames[1] =
"fpr";
9915 FieldTypes[2] = Context->UnsignedShortTy;
9916 FieldNames[2] =
"reserved";
9919 FieldTypes[3] = Context->getPointerType(Context->VoidTy);
9920 FieldNames[3] =
"overflow_arg_area";
9923 FieldTypes[4] = Context->getPointerType(Context->VoidTy);
9924 FieldNames[4] =
"reg_save_area";
9927 for (
unsigned i = 0; i < NumFields; ++i) {
9931 &Context->Idents.get(FieldNames[i]),
9932 FieldTypes[i],
nullptr,
9945 Context->buildImplicitTypedef(VaListTagType,
"__va_list_tag");
9949 std::nullopt, VaListTagTypedefDecl);
9952 llvm::APInt Size(Context->getTypeSize(Context->getSizeType()), 1);
9953 QualType VaListTagArrayType = Context->getConstantArrayType(
9955 return Context->buildImplicitTypedef(VaListTagArrayType,
"__builtin_va_list");
9962 VaListTagDecl = Context->buildImplicitRecord(
"__va_list_tag");
9965 const size_t NumFields = 4;
9967 const char *FieldNames[NumFields];
9970 FieldTypes[0] = Context->UnsignedIntTy;
9971 FieldNames[0] =
"gp_offset";
9974 FieldTypes[1] = Context->UnsignedIntTy;
9975 FieldNames[1] =
"fp_offset";
9978 FieldTypes[2] = Context->getPointerType(Context->VoidTy);
9979 FieldNames[2] =
"overflow_arg_area";
9982 FieldTypes[3] = Context->getPointerType(Context->VoidTy);
9983 FieldNames[3] =
"reg_save_area";
9986 for (
unsigned i = 0; i < NumFields; ++i) {
9991 &Context->Idents.get(FieldNames[i]),
9992 FieldTypes[i],
nullptr,
10006 llvm::APInt Size(Context->getTypeSize(Context->getSizeType()), 1);
10007 QualType VaListTagArrayType = Context->getConstantArrayType(
10009 return Context->buildImplicitTypedef(VaListTagArrayType,
"__builtin_va_list");
10012static TypedefDecl *