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);
337 if (
const auto *FD = dyn_cast<FunctionDecl>(&D)) {
357 if (
const auto *VD = dyn_cast<VarDecl>(&D)) {
360 if (VD->isStaticDataMember())
366 if (
const auto *CRD = dyn_cast<CXXRecordDecl>(&D)) {
373 if (
const auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(CRD)) {
381 : *
static_cast<const Decl *
>(
387 CRD->getMemberSpecializationInfo())
388 return *Info->getInstantiatedFrom();
392 if (
const auto *ED = dyn_cast<EnumDecl>(&D)) {
405 const Decl **OriginalDecl)
const {
408 OriginalDecl =
nullptr;
420 return DeclComment->second;
433 *OriginalDecl = RedeclComment->second;
436 "This decl is supposed to have comment attached.");
437 return CommentAtRedecl->second;
442 const Decl *LastCheckedRedecl = [&]() {
444 bool CanUseCommentlessCache =
false;
446 for (
auto *Redecl : CanonicalD->
redecls()) {
448 CanUseCommentlessCache =
true;
451 if (Redecl == LastChecked)
458 return CanUseCommentlessCache ? LastChecked :
nullptr;
464 if (LastCheckedRedecl) {
465 if (LastCheckedRedecl == Redecl) {
466 LastCheckedRedecl =
nullptr;
474 *OriginalDecl = Redecl;
475 return RedeclComment;
481 *OriginalDecl =
nullptr;
487 assert(Comment.
isDocumentation() || LangOpts.CommentOpts.ParseAllComments);
497 if (
const auto *IMD = dyn_cast<ObjCImplDecl>(DC)) {
502 for (
const auto *Ext : ID->known_extensions()) {
506 Redeclared.push_back(RedeclaredMethod);
513 if (
Comments.empty() || Decls.empty())
517 for (
const Decl *D : Decls) {
518 if (D->isInvalidDecl())
526 File = SourceMgr.getDecomposedLoc(Loc).first;
531 if (
File.isInvalid())
534 auto CommentsInThisFile =
Comments.getCommentsInFile(
File);
535 if (!CommentsInThisFile || CommentsInThisFile->empty() ||
536 CommentsInThisFile->rbegin()->second->isAttached())
546 for (
const Decl *D : Decls) {
548 if (D->isInvalidDecl())
558 for (
const auto DeclLoc : DeclLocs) {
559 if (DeclLoc.isInvalid() || !DeclLoc.isFileID())
563 D, DeclLoc, *CommentsInThisFile)) {
574 const Decl *D)
const {
577 ThisDeclInfo->IsFilled =
false;
578 ThisDeclInfo->fill();
579 ThisDeclInfo->CommentDecl = FC->
getDecl();
580 if (!ThisDeclInfo->TemplateParameters)
590 return RC ? RC->
parse(*
this,
nullptr, D) :
nullptr;
601 llvm::DenseMap<const Decl *, comments::FullComment *>::iterator Pos =
605 if (Canonical != D) {
613 const Decl *OriginalDecl =
nullptr;
619 const auto *OMD = dyn_cast<ObjCMethodDecl>(D);
620 if (OMD && OMD->isPropertyAccessor())
627 for (
unsigned i = 0, e = Overridden.size(); i < e; i++)
631 else if (
const auto *TD = dyn_cast<TypedefNameDecl>(D)) {
634 QualType QT = TD->getUnderlyingType();
635 if (
const auto *TT = QT->
getAs<TagType>())
640 else if (
const auto *IC = dyn_cast<ObjCInterfaceDecl>(D)) {
641 while (IC->getSuperClass()) {
642 IC = IC->getSuperClass();
647 else if (
const auto *CD = dyn_cast<ObjCCategoryDecl>(D)) {
652 else if (
const auto *RD = dyn_cast<CXXRecordDecl>(D)) {
653 if (!(RD = RD->getDefinition()))
656 for (
const auto &I : RD->bases()) {
657 if (I.isVirtual() || (I.getAccessSpecifier() !=
AS_public))
671 for (
const auto &I : RD->vbases()) {
692 if (D != OriginalDecl && OriginalDecl)
700void ASTContext::CanonicalTemplateTemplateParm::Profile(
709 ID.AddInteger(Params->
size());
711 PEnd = Params->
end();
713 if (
const auto *TTP = dyn_cast<TemplateTypeParmDecl>(*P)) {
715 ID.AddBoolean(TTP->isParameterPack());
717 TTP->getNumExpansionParameters().toInternalRepresentation());
721 if (
const auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(*P)) {
723 ID.AddBoolean(NTTP->isParameterPack());
724 ID.AddPointer(
C.getUnconstrainedType(
C.getCanonicalType(NTTP->getType()))
726 if (NTTP->isExpandedParameterPack()) {
728 ID.AddInteger(NTTP->getNumExpansionTypes());
729 for (
unsigned I = 0, N = NTTP->getNumExpansionTypes(); I != N; ++I) {
731 ID.AddPointer(
T.getCanonicalType().getAsOpaquePtr());
734 ID.AddBoolean(
false);
744TemplateTemplateParmDecl *
748 llvm::FoldingSetNodeID ID;
749 CanonicalTemplateTemplateParm::Profile(ID, *
this, TTP);
750 void *InsertPos =
nullptr;
751 CanonicalTemplateTemplateParm *Canonical
752 = CanonTemplateTemplateParms.FindNodeOrInsertPos(ID, InsertPos);
754 return Canonical->getParam();
759 CanonParams.reserve(Params->
size());
761 PEnd = Params->
end();
765 if (
const auto *TTP = dyn_cast<TemplateTypeParmDecl>(*P)) {
770 TTP->getNumExpansionParameters());
771 CanonParams.push_back(NewTTP);
772 }
else if (
const auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(*P)) {
776 if (NTTP->isExpandedParameterPack()) {
779 for (
unsigned I = 0, N = NTTP->getNumExpansionTypes(); I != N; ++I) {
781 ExpandedTInfos.push_back(
789 NTTP->getPosition(),
nullptr,
799 NTTP->getPosition(),
nullptr,
801 NTTP->isParameterPack(),
804 CanonParams.push_back(Param);
820 Canonical = CanonTemplateTemplateParms.FindNodeOrInsertPos(ID, InsertPos);
821 assert(!Canonical &&
"Shouldn't be in the map!");
825 Canonical =
new (*this) CanonicalTemplateTemplateParm(CanonTTP);
826 CanonTemplateTemplateParms.InsertNode(Canonical, InsertPos);
833 llvm::FoldingSetNodeID ID;
834 CanonicalTemplateTemplateParm::Profile(ID, *
this, TTP);
835 void *InsertPos =
nullptr;
836 CanonicalTemplateTemplateParm *Canonical =
837 CanonTemplateTemplateParms.FindNodeOrInsertPos(ID, InsertPos);
838 return Canonical ? Canonical->getParam() :
nullptr;
844 llvm::FoldingSetNodeID ID;
845 CanonicalTemplateTemplateParm::Profile(ID, *
this, CanonTTP);
846 void *InsertPos =
nullptr;
848 CanonTemplateTemplateParms.FindNodeOrInsertPos(ID, InsertPos))
849 return Existing->getParam();
850 CanonTemplateTemplateParms.InsertNode(
851 new (*
this) CanonicalTemplateTemplateParm(CanonTTP), InsertPos);
860 return NoSanitizeL->containsType(Mask, TyName);
869 if (!LangOpts.CPlusPlus)
return nullptr;
872 case TargetCXXABI::AppleARM64:
873 case TargetCXXABI::Fuchsia:
874 case TargetCXXABI::GenericARM:
875 case TargetCXXABI::iOS:
876 case TargetCXXABI::WatchOS:
877 case TargetCXXABI::GenericAArch64:
878 case TargetCXXABI::GenericMIPS:
879 case TargetCXXABI::GenericItanium:
880 case TargetCXXABI::WebAssembly:
881 case TargetCXXABI::XL:
883 case TargetCXXABI::Microsoft:
886 llvm_unreachable(
"Invalid CXXABI type!");
890 if (!InterpContext) {
893 return *InterpContext;
899 return *ParentMapCtx;
904 switch (LangOpts.getAddressSpaceMapMangling()) {
912 llvm_unreachable(
"getAddressSpaceMapMangling() doesn't cover anything.");
918 : ConstantArrayTypes(this_(), ConstantArrayTypesLog2InitSize),
919 DependentSizedArrayTypes(this_()), DependentSizedExtVectorTypes(this_()),
920 DependentAddressSpaceTypes(this_()), DependentVectorTypes(this_()),
921 DependentSizedMatrixTypes(this_()),
922 FunctionProtoTypes(this_(), FunctionProtoTypesLog2InitSize),
923 DependentTypeOfExprTypes(this_()), DependentDecltypeTypes(this_()),
924 DependentPackIndexingTypes(this_()), TemplateSpecializationTypes(this_()),
925 DependentBitIntTypes(this_()), SubstTemplateTemplateParmPacks(this_()),
926 DeducedTemplates(this_()), ArrayParameterTypes(this_()),
927 CanonTemplateTemplateParms(this_()), SourceMgr(
SM), LangOpts(LOpts),
930 LangOpts.XRayNeverInstrumentFiles,
931 LangOpts.XRayAttrListFiles,
SM)),
935 Comments(
SM), CommentCommandTraits(BumpAlloc, LOpts.CommentOpts),
943 ReleaseDeclContextMaps();
946 for (
auto &Pair : Deallocations)
947 (Pair.first)(Pair.second);
948 Deallocations.clear();
954 I = ObjCLayouts.begin(),
955 E = ObjCLayouts.end();
962 for (llvm::DenseMap<const RecordDecl*, const ASTRecordLayout*>::iterator
963 I = ASTRecordLayouts.begin(), E = ASTRecordLayouts.end(); I != E; ) {
968 ASTRecordLayouts.clear();
970 for (llvm::DenseMap<const Decl*, AttrVec*>::iterator A = DeclAttrs.begin(),
971 AEnd = DeclAttrs.end();
973 A->second->~AttrVec();
976 for (
const auto &
Value : ModuleInitializers)
977 Value.second->~PerModuleInitializers();
978 ModuleInitializers.
clear();
984 TraversalScope = TopLevelDecls;
989 Deallocations.push_back({Callback,
Data});
998 llvm::errs() <<
"\n*** AST Context Stats:\n";
999 llvm::errs() <<
" " << Types.size() <<
" types total.\n";
1001 unsigned counts[] = {
1002#define TYPE(Name, Parent) 0,
1003#define ABSTRACT_TYPE(Name, Parent)
1004#include "clang/AST/TypeNodes.inc"
1008 for (
unsigned i = 0, e = Types.size(); i != e; ++i) {
1014 unsigned TotalBytes = 0;
1015#define TYPE(Name, Parent) \
1017 llvm::errs() << " " << counts[Idx] << " " << #Name \
1018 << " types, " << sizeof(Name##Type) << " each " \
1019 << "(" << counts[Idx] * sizeof(Name##Type) \
1021 TotalBytes += counts[Idx] * sizeof(Name##Type); \
1023#define ABSTRACT_TYPE(Name, Parent)
1024#include "clang/AST/TypeNodes.inc"
1026 llvm::errs() <<
"Total bytes = " << TotalBytes <<
"\n";
1031 <<
" implicit default constructors created\n";
1034 <<
" implicit copy constructors created\n";
1038 <<
" implicit move constructors created\n";
1041 <<
" implicit copy assignment operators created\n";
1045 <<
" implicit move assignment operators created\n";
1048 <<
" implicit destructors created\n";
1051 llvm::errs() <<
"\n";
1055 BumpAlloc.PrintStats();
1059 bool NotifyListeners) {
1060 if (NotifyListeners)
1063 Listener->RedefinedHiddenDefinition(ND, M);
1070 if (It == MergedDefModules.end())
1073 auto &Merged = It->second;
1074 llvm::DenseSet<Module*>
Found;
1075 for (
Module *&M : Merged)
1076 if (!
Found.insert(M).second)
1078 llvm::erase(Merged,
nullptr);
1085 if (MergedIt == MergedDefModules.end())
1087 return MergedIt->second;
1090void ASTContext::PerModuleInitializers::resolve(
ASTContext &Ctx) {
1091 if (LazyInitializers.empty())
1095 assert(Source &&
"lazy initializers but no external source");
1097 auto LazyInits = std::move(LazyInitializers);
1098 LazyInitializers.clear();
1100 for (
auto ID : LazyInits)
1101 Initializers.push_back(Source->GetExternalDecl(ID));
1103 assert(LazyInitializers.empty() &&
1104 "GetExternalDecl for lazy module initializer added more inits");
1110 if (
const auto *ID = dyn_cast<ImportDecl>(D)) {
1111 auto It = ModuleInitializers.find(ID->getImportedModule());
1114 if (It == ModuleInitializers.end())
1118 auto &Imported = *It->second;
1119 if (Imported.Initializers.size() + Imported.LazyInitializers.size() == 1) {
1120 Imported.resolve(*
this);
1121 auto *OnlyDecl = Imported.Initializers.front();
1127 auto *&Inits = ModuleInitializers[M];
1129 Inits =
new (*this) PerModuleInitializers;
1130 Inits->Initializers.push_back(D);
1135 auto *&Inits = ModuleInitializers[M];
1137 Inits =
new (*this) PerModuleInitializers;
1138 Inits->LazyInitializers.insert(Inits->LazyInitializers.end(),
1139 IDs.begin(), IDs.end());
1143 auto It = ModuleInitializers.find(M);
1144 if (It == ModuleInitializers.end())
1147 auto *Inits = It->second;
1148 Inits->resolve(*
this);
1149 return Inits->Initializers;
1154 assert(!CurrentCXXNamedModule &&
1155 "We should set named module for ASTContext for only once");
1156 CurrentCXXNamedModule = M;
1168 auto GetRepresentativeModule = [
this](
const Module *M) {
1169 auto Iter = SameModuleLookupSet.find(M);
1170 if (Iter != SameModuleLookupSet.end())
1171 return Iter->second;
1173 const Module *RepresentativeModule =
1174 PrimaryModuleNameMap.try_emplace(M->getPrimaryModuleInterfaceName(), M)
1176 SameModuleLookupSet[M] = RepresentativeModule;
1177 return RepresentativeModule;
1180 assert(M1 &&
"Shouldn't call `isInSameModule` if both M1 and M2 are none.");
1181 return GetRepresentativeModule(M1) == GetRepresentativeModule(M2);
1185 if (!ExternCContext)
1188 return ExternCContext;
1202#define BuiltinTemplate(BTName) \
1203 BuiltinTemplateDecl *ASTContext::get##BTName##Decl() const { \
1204 if (!Decl##BTName) \
1206 buildBuiltinTemplateDecl(BTK##BTName, get##BTName##Name()); \
1207 return Decl##BTName; \
1209#include "clang/Basic/BuiltinTemplates.inc"
1222 NewDecl->
addAttr(TypeVisibilityAttr::CreateImplicit(
1223 const_cast<ASTContext &
>(*
this), TypeVisibilityAttr::Default));
1228 StringRef Name)
const {
1252 Types.push_back(Ty);
1257 assert((!this->Target || this->Target == &Target) &&
1258 "Incorrect target reinitialization");
1259 assert(
VoidTy.isNull() &&
"Context reinitialized?");
1261 this->Target = &Target;
1262 this->AuxTarget = AuxTarget;
1264 ABI.reset(createCXXABI(Target));
1268 InitBuiltinType(
VoidTy, BuiltinType::Void);
1271 InitBuiltinType(
BoolTy, BuiltinType::Bool);
1273 if (LangOpts.CharIsSigned)
1274 InitBuiltinType(
CharTy, BuiltinType::Char_S);
1276 InitBuiltinType(
CharTy, BuiltinType::Char_U);
1279 InitBuiltinType(
ShortTy, BuiltinType::Short);
1280 InitBuiltinType(
IntTy, BuiltinType::Int);
1281 InitBuiltinType(
LongTy, BuiltinType::Long);
1282 InitBuiltinType(
LongLongTy, BuiltinType::LongLong);
1292 InitBuiltinType(
FloatTy, BuiltinType::Float);
1293 InitBuiltinType(
DoubleTy, BuiltinType::Double);
1294 InitBuiltinType(
LongDoubleTy, BuiltinType::LongDouble);
1297 InitBuiltinType(
Float128Ty, BuiltinType::Float128);
1300 InitBuiltinType(
Ibm128Ty, BuiltinType::Ibm128);
1303 InitBuiltinType(
Float16Ty, BuiltinType::Float16);
1306 InitBuiltinType(
ShortAccumTy, BuiltinType::ShortAccum);
1307 InitBuiltinType(
AccumTy, BuiltinType::Accum);
1308 InitBuiltinType(
LongAccumTy, BuiltinType::LongAccum);
1312 InitBuiltinType(
ShortFractTy, BuiltinType::ShortFract);
1313 InitBuiltinType(
FractTy, BuiltinType::Fract);
1314 InitBuiltinType(
LongFractTy, BuiltinType::LongFract);
1319 InitBuiltinType(
SatAccumTy, BuiltinType::SatAccum);
1325 InitBuiltinType(
SatFractTy, BuiltinType::SatFract);
1332 InitBuiltinType(
Int128Ty, BuiltinType::Int128);
1337 InitBuiltinType(
WCharTy, BuiltinType::WChar_S);
1339 InitBuiltinType(
WCharTy, BuiltinType::WChar_U);
1340 if (LangOpts.CPlusPlus && LangOpts.WChar)
1344 WideCharTy = getFromTargetType(Target.getWCharType());
1347 WIntTy = getFromTargetType(Target.getWIntType());
1350 InitBuiltinType(
Char8Ty, BuiltinType::Char8);
1352 if (LangOpts.CPlusPlus)
1353 InitBuiltinType(
Char16Ty, BuiltinType::Char16);
1355 Char16Ty = getFromTargetType(Target.getChar16Type());
1357 if (LangOpts.CPlusPlus)
1358 InitBuiltinType(
Char32Ty, BuiltinType::Char32);
1360 Char32Ty = getFromTargetType(Target.getChar32Type());
1367 InitBuiltinType(
DependentTy, BuiltinType::Dependent);
1370 InitBuiltinType(
OverloadTy, BuiltinType::Overload);
1382 InitBuiltinType(
UnknownAnyTy, BuiltinType::UnknownAny);
1388 InitBuiltinType(
BuiltinFnTy, BuiltinType::BuiltinFn);
1391 if (LangOpts.OpenMP) {
1398 if (LangOpts.OpenACC && !LangOpts.OpenMP) {
1401 if (LangOpts.MatrixTypes)
1409 if (LangOpts.OpenCL) {
1410#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
1411 InitBuiltinType(SingletonId, BuiltinType::Id);
1412#include "clang/Basic/OpenCLImageTypes.def"
1414 InitBuiltinType(
OCLSamplerTy, BuiltinType::OCLSampler);
1415 InitBuiltinType(
OCLEventTy, BuiltinType::OCLEvent);
1417 InitBuiltinType(
OCLQueueTy, BuiltinType::OCLQueue);
1420#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
1421 InitBuiltinType(Id##Ty, BuiltinType::Id);
1422#include "clang/Basic/OpenCLExtensionTypes.def"
1425 if (LangOpts.HLSL) {
1426#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) \
1427 InitBuiltinType(SingletonId, BuiltinType::Id);
1428#include "clang/Basic/HLSLIntangibleTypes.def"
1431 if (Target.hasAArch64ACLETypes() ||
1432 (AuxTarget && AuxTarget->hasAArch64ACLETypes())) {
1433#define SVE_TYPE(Name, Id, SingletonId) \
1434 InitBuiltinType(SingletonId, BuiltinType::Id);
1435#include "clang/Basic/AArch64ACLETypes.def"
1438 if (Target.getTriple().isPPC64()) {
1439#define PPC_VECTOR_MMA_TYPE(Name, Id, Size) \
1440 InitBuiltinType(Id##Ty, BuiltinType::Id);
1441#include "clang/Basic/PPCTypes.def"
1442#define PPC_VECTOR_VSX_TYPE(Name, Id, Size) \
1443 InitBuiltinType(Id##Ty, BuiltinType::Id);
1444#include "clang/Basic/PPCTypes.def"
1447 if (Target.hasRISCVVTypes()) {
1448#define RVV_TYPE(Name, Id, SingletonId) \
1449 InitBuiltinType(SingletonId, BuiltinType::Id);
1450#include "clang/Basic/RISCVVTypes.def"
1453 if (Target.getTriple().isWasm() && Target.hasFeature(
"reference-types")) {
1454#define WASM_TYPE(Name, Id, SingletonId) \
1455 InitBuiltinType(SingletonId, BuiltinType::Id);
1456#include "clang/Basic/WebAssemblyReferenceTypes.def"
1459 if (Target.getTriple().isAMDGPU() ||
1460 (AuxTarget && AuxTarget->getTriple().isAMDGPU())) {
1461#define AMDGPU_TYPE(Name, Id, SingletonId, Width, Align) \
1462 InitBuiltinType(SingletonId, BuiltinType::Id);
1463#include "clang/Basic/AMDGPUTypes.def"
1470 ObjCConstantStringType =
QualType();
1475 if (LangOpts.OpenCLGenericAddressSpace) {
1476 auto Q =
VoidTy.getQualifiers();
1485 InitBuiltinType(
NullPtrTy, BuiltinType::NullPtr);
1488 InitBuiltinType(
HalfTy, BuiltinType::Half);
1490 InitBuiltinType(
BFloat16Ty, BuiltinType::BFloat16);
1496 if (LangOpts.MicrosoftExt || LangOpts.Borland) {
1503 return SourceMgr.getDiagnostics();
1518 llvm::DenseMap<const Decl*, AttrVec*>::iterator Pos = DeclAttrs.find(D);
1519 if (Pos != DeclAttrs.end()) {
1520 Pos->second->~AttrVec();
1521 DeclAttrs.erase(Pos);
1535 llvm::DenseMap<const VarDecl *, TemplateOrSpecializationInfo>::iterator Pos =
1536 TemplateOrInstantiation.find(Var);
1537 if (Pos == TemplateOrInstantiation.end())
1550 Tmpl, TSK, PointOfInstantiation));
1556 assert(!TemplateOrInstantiation[Inst] &&
1557 "Already noted what the variable was instantiated from");
1558 TemplateOrInstantiation[Inst] = TSI;
1563 return InstantiatedFromUsingDecl.lookup(UUD);
1571 "pattern decl is not a using decl");
1575 "instantiation did not produce a using decl");
1576 assert(!InstantiatedFromUsingDecl[Inst] &&
"pattern already exists");
1577 InstantiatedFromUsingDecl[Inst] = Pattern;
1582 return InstantiatedFromUsingEnumDecl.lookup(UUD);
1587 assert(!InstantiatedFromUsingEnumDecl[Inst] &&
"pattern already exists");
1588 InstantiatedFromUsingEnumDecl[Inst] = Pattern;
1593 return InstantiatedFromUsingShadowDecl.lookup(Inst);
1599 assert(!InstantiatedFromUsingShadowDecl[Inst] &&
"pattern already exists");
1600 InstantiatedFromUsingShadowDecl[Inst] = Pattern;
1605 return InstantiatedFromUnnamedFieldDecl.lookup(Field);
1611 "Instantiated field decl is not unnamed");
1613 "Template field decl is not unnamed");
1614 assert(!InstantiatedFromUnnamedFieldDecl[Inst] &&
1615 "Already noted what unnamed field was instantiated from");
1617 InstantiatedFromUnnamedFieldDecl[Inst] = Tmpl;
1633 return Range.end() - Range.begin();
1638 llvm::DenseMap<const CXXMethodDecl *, CXXMethodVector>::const_iterator Pos =
1639 OverriddenMethods.find(
Method->getCanonicalDecl());
1640 if (Pos == OverriddenMethods.end())
1648 OverriddenMethods[
Method].push_back(Overridden);
1656 if (
const auto *CXXMethod = dyn_cast<CXXMethodDecl>(D)) {
1662 const auto *
Method = dyn_cast<ObjCMethodDecl>(D);
1667 Method->getOverriddenMethods(OverDecls);
1668 Overridden.append(OverDecls.begin(), OverDecls.end());
1671std::optional<ASTContext::CXXRecordDeclRelocationInfo>
1675 auto it = RelocatableClasses.find(D);
1676 if (it != RelocatableClasses.end())
1677 return it->getSecond();
1678 return std::nullopt;
1685 assert(RelocatableClasses.find(D) == RelocatableClasses.end());
1686 RelocatableClasses.insert({D, Info});
1691 if (!Class->isPolymorphic())
1693 const CXXRecordDecl *BaseType = Context.baseForVTableAuthentication(Class);
1694 using AuthAttr = VTablePointerAuthenticationAttr;
1695 const AuthAttr *ExplicitAuth = BaseType->
getAttr<AuthAttr>();
1697 return Context.getLangOpts().PointerAuthVTPtrAddressDiscrimination;
1698 AuthAttr::AddressDiscriminationMode AddressDiscrimination =
1699 ExplicitAuth->getAddressDiscrimination();
1700 if (AddressDiscrimination == AuthAttr::DefaultAddressDiscrimination)
1701 return Context.getLangOpts().PointerAuthVTPtrAddressDiscrimination;
1702 return AddressDiscrimination == AuthAttr::AddressDiscrimination;
1705ASTContext::PointerAuthContent
1706ASTContext::findPointerAuthContent(QualType
T)
const {
1707 assert(isPointerAuthenticationAvailable());
1709 T =
T.getCanonicalType();
1711 return PointerAuthContent::None;
1713 if (
T.hasAddressDiscriminatedPointerAuth())
1714 return PointerAuthContent::AddressDiscriminatedData;
1717 return PointerAuthContent::None;
1719 if (
auto Existing = RecordContainsAddressDiscriminatedPointerAuth.find(RD);
1720 Existing != RecordContainsAddressDiscriminatedPointerAuth.end())
1721 return Existing->second;
1723 PointerAuthContent
Result = PointerAuthContent::None;
1725 auto SaveResultAndReturn = [&]() -> PointerAuthContent {
1726 auto [ResultIter, DidAdd] =
1727 RecordContainsAddressDiscriminatedPointerAuth.try_emplace(RD,
Result);
1733 auto ShouldContinueAfterUpdate = [&](PointerAuthContent NewResult) {
1734 static_assert(PointerAuthContent::None <
1735 PointerAuthContent::AddressDiscriminatedVTable);
1736 static_assert(PointerAuthContent::AddressDiscriminatedVTable <
1737 PointerAuthContent::AddressDiscriminatedData);
1740 return Result != PointerAuthContent::AddressDiscriminatedData;
1742 if (
const CXXRecordDecl *CXXRD = dyn_cast<CXXRecordDecl>(RD)) {
1744 !ShouldContinueAfterUpdate(
1745 PointerAuthContent::AddressDiscriminatedVTable))
1746 return SaveResultAndReturn();
1747 for (
auto Base : CXXRD->bases()) {
1748 if (!ShouldContinueAfterUpdate(findPointerAuthContent(
Base.getType())))
1749 return SaveResultAndReturn();
1752 for (
auto *FieldDecl : RD->
fields()) {
1753 if (!ShouldContinueAfterUpdate(
1754 findPointerAuthContent(FieldDecl->getType())))
1755 return SaveResultAndReturn();
1757 return SaveResultAndReturn();
1761 assert(!Import->getNextLocalImport() &&
1762 "Import declaration already in the chain");
1763 assert(!Import->isFromASTFile() &&
"Non-local import declaration");
1764 if (!FirstLocalImport) {
1765 FirstLocalImport = Import;
1766 LastLocalImport = Import;
1770 LastLocalImport->setNextLocalImport(Import);
1771 LastLocalImport = Import;
1783 llvm_unreachable(
"Not a floating point type!");
1784 case BuiltinType::BFloat16:
1785 return Target->getBFloat16Format();
1786 case BuiltinType::Float16:
1787 return Target->getHalfFormat();
1788 case BuiltinType::Half:
1789 return Target->getHalfFormat();
1790 case BuiltinType::Float:
return Target->getFloatFormat();
1791 case BuiltinType::Double:
return Target->getDoubleFormat();
1792 case BuiltinType::Ibm128:
1793 return Target->getIbm128Format();
1794 case BuiltinType::LongDouble:
1796 return AuxTarget->getLongDoubleFormat();
1797 return Target->getLongDoubleFormat();
1798 case BuiltinType::Float128:
1800 return AuxTarget->getFloat128Format();
1801 return Target->getFloat128Format();
1806 unsigned Align = Target->getCharWidth();
1810 Align = AlignFromAttr;
1818 bool UseAlignAttrOnly;
1819 if (
const FieldDecl *FD = dyn_cast<FieldDecl>(D))
1821 FD->hasAttr<PackedAttr>() || FD->getParent()->hasAttr<PackedAttr>();
1823 UseAlignAttrOnly = AlignFromAttr != 0;
1826 if (UseAlignAttrOnly) {
1828 }
else if (
const auto *VD = dyn_cast<ValueDecl>(D)) {
1832 T = RT->getPointeeType();
1837 if (
T->isFunctionType())
1838 Align = getTypeInfoImpl(
T.getTypePtr()).Align;
1843 unsigned MinWidth = Target->getLargeArrayMinWidth();
1844 if (!ForAlignof && MinWidth) {
1846 Align = std::max(Align, Target->getLargeArrayAlign());
1849 Align = std::max(Align, Target->getLargeArrayAlign());
1854 Align = Target->getCharWidth();
1858 if (
const auto *VD = dyn_cast<VarDecl>(D))
1859 if (VD->hasGlobalStorage() && !ForAlignof) {
1870 if (
const auto *Field = dyn_cast<FieldDecl>(VD)) {
1884 uint64_t LowBitOfOffset = Offset & (~Offset + 1);
1885 if (LowBitOfOffset < FieldAlign)
1886 FieldAlign =
static_cast<unsigned>(LowBitOfOffset);
1889 Align = std::min(Align, FieldAlign);
1897 const auto *VD = dyn_cast<VarDecl>(D);
1898 if (MaxAlignedAttr && VD && VD->getStorageClass() ==
SC_Static)
1899 Align = std::min(Align, MaxAlignedAttr);
1919 if (
const auto *RD =
T->getAsCXXRecordDecl(); RD && !RD->
isInvalidDecl()) {
1936 (uint64_t)(-1)/Size) &&
1937 "Overflow in array type char size evaluation");
1940 if (!Context.getTargetInfo().getCXXABI().isMicrosoft() ||
1942 Width = llvm::alignTo(Width, Align);
1949 if (
const auto *CAT = dyn_cast<ConstantArrayType>(
T))
1967 switch (BT->getKind()) {
1968 case BuiltinType::Bool:
1969 case BuiltinType::Char_S:
1970 case BuiltinType::Char_U:
1971 case BuiltinType::SChar:
1972 case BuiltinType::UChar:
1973 case BuiltinType::Short:
1974 case BuiltinType::UShort:
1975 case BuiltinType::WChar_S:
1976 case BuiltinType::WChar_U:
1977 case BuiltinType::Char8:
1978 case BuiltinType::Char16:
1979 case BuiltinType::Char32:
1987 if (
const auto *ED =
T->getAsEnumDecl()) {
1988 if (
T->isDependentType() || ED->getPromotionType().isNull() ||
2007 bool NeedsPreferredAlignment)
const {
2010 if (
unsigned Align = TT->getDecl()->getMaxAlignment())
2015 if (!
T->isIncompleteType())
2021 if (
unsigned Align = TT->getDecl()->getMaxAlignment())
2025 if (
const auto *TD =
T->getAsTagDecl())
2026 return TD->getMaxAlignment();
2032 TypeInfoMap::iterator I = MemoizedTypeInfo.find(
T);
2033 if (I != MemoizedTypeInfo.end())
2038 MemoizedTypeInfo[
T] = TI;
2053 switch (
T->getTypeClass()) {
2054#define TYPE(Class, Base)
2055#define ABSTRACT_TYPE(Class, Base)
2056#define NON_CANONICAL_TYPE(Class, Base)
2057#define DEPENDENT_TYPE(Class, Base) case Type::Class:
2058#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base) \
2060 assert(!T->isDependentType() && "should not see dependent types here"); \
2061 return getTypeInfo(cast<Class##Type>(T)->desugar().getTypePtr());
2062#include "clang/AST/TypeNodes.inc"
2063 llvm_unreachable(
"Should not see dependent types");
2065 case Type::FunctionNoProto:
2066 case Type::FunctionProto:
2072 case Type::IncompleteArray:
2073 case Type::VariableArray:
2074 case Type::ConstantArray:
2075 case Type::ArrayParameter: {
2078 if (
const auto *CAT = dyn_cast<ConstantArrayType>(
T))
2079 Size = CAT->getZExtSize();
2082 assert((Size == 0 || EltInfo.
Width <= (uint64_t)(-1) / Size) &&
2083 "Overflow in array type bit size evaluation");
2084 Width = EltInfo.
Width * Size;
2085 Align = EltInfo.
Align;
2089 Width = llvm::alignTo(Width, Align);
2093 case Type::ExtVector:
2094 case Type::Vector: {
2097 Width = VT->isPackedVectorBoolType(*
this)
2098 ? VT->getNumElements()
2099 : EltInfo.
Width * VT->getNumElements();
2101 Width = std::max<unsigned>(8, Width);
2102 Align = std::max<unsigned>(8, Width);
2106 if (Align & (Align-1)) {
2107 Align = llvm::bit_ceil(Align);
2108 Width = llvm::alignTo(Width, Align);
2111 uint64_t TargetVectorAlign = Target->getMaxVectorAlign();
2112 if (TargetVectorAlign && TargetVectorAlign < Align)
2113 Align = TargetVectorAlign;
2127 Align = std::min<unsigned>(64, Width);
2131 case Type::ConstantMatrix: {
2133 TypeInfo ElementInfo =
getTypeInfo(MT->getElementType());
2137 Width = ElementInfo.
Width * MT->getNumRows() * MT->getNumColumns();
2138 Align = ElementInfo.
Align;
2144 default: llvm_unreachable(
"Unknown builtin type!");
2145 case BuiltinType::Void:
2150 case BuiltinType::Bool:
2151 Width = Target->getBoolWidth();
2152 Align = Target->getBoolAlign();
2154 case BuiltinType::Char_S:
2155 case BuiltinType::Char_U:
2156 case BuiltinType::UChar:
2157 case BuiltinType::SChar:
2158 case BuiltinType::Char8:
2159 Width = Target->getCharWidth();
2160 Align = Target->getCharAlign();
2162 case BuiltinType::WChar_S:
2163 case BuiltinType::WChar_U:
2164 Width = Target->getWCharWidth();
2165 Align = Target->getWCharAlign();
2167 case BuiltinType::Char16:
2168 Width = Target->getChar16Width();
2169 Align = Target->getChar16Align();
2171 case BuiltinType::Char32:
2172 Width = Target->getChar32Width();
2173 Align = Target->getChar32Align();
2175 case BuiltinType::UShort:
2176 case BuiltinType::Short:
2177 Width = Target->getShortWidth();
2178 Align = Target->getShortAlign();
2180 case BuiltinType::UInt:
2181 case BuiltinType::Int:
2182 Width = Target->getIntWidth();
2183 Align = Target->getIntAlign();
2185 case BuiltinType::ULong:
2186 case BuiltinType::Long:
2187 Width = Target->getLongWidth();
2188 Align = Target->getLongAlign();
2190 case BuiltinType::ULongLong:
2191 case BuiltinType::LongLong:
2192 Width = Target->getLongLongWidth();
2193 Align = Target->getLongLongAlign();
2195 case BuiltinType::Int128:
2196 case BuiltinType::UInt128:
2198 Align = Target->getInt128Align();
2200 case BuiltinType::ShortAccum:
2201 case BuiltinType::UShortAccum:
2202 case BuiltinType::SatShortAccum:
2203 case BuiltinType::SatUShortAccum:
2204 Width = Target->getShortAccumWidth();
2205 Align = Target->getShortAccumAlign();
2207 case BuiltinType::Accum:
2208 case BuiltinType::UAccum:
2209 case BuiltinType::SatAccum:
2210 case BuiltinType::SatUAccum:
2211 Width = Target->getAccumWidth();
2212 Align = Target->getAccumAlign();
2214 case BuiltinType::LongAccum:
2215 case BuiltinType::ULongAccum:
2216 case BuiltinType::SatLongAccum:
2217 case BuiltinType::SatULongAccum:
2218 Width = Target->getLongAccumWidth();
2219 Align = Target->getLongAccumAlign();
2221 case BuiltinType::ShortFract:
2222 case BuiltinType::UShortFract:
2223 case BuiltinType::SatShortFract:
2224 case BuiltinType::SatUShortFract:
2225 Width = Target->getShortFractWidth();
2226 Align = Target->getShortFractAlign();
2228 case BuiltinType::Fract:
2229 case BuiltinType::UFract:
2230 case BuiltinType::SatFract:
2231 case BuiltinType::SatUFract:
2232 Width = Target->getFractWidth();
2233 Align = Target->getFractAlign();
2235 case BuiltinType::LongFract:
2236 case BuiltinType::ULongFract:
2237 case BuiltinType::SatLongFract:
2238 case BuiltinType::SatULongFract:
2239 Width = Target->getLongFractWidth();
2240 Align = Target->getLongFractAlign();
2242 case BuiltinType::BFloat16:
2243 if (Target->hasBFloat16Type()) {
2244 Width = Target->getBFloat16Width();
2245 Align = Target->getBFloat16Align();
2249 AuxTarget->hasBFloat16Type()) {
2250 Width = AuxTarget->getBFloat16Width();
2251 Align = AuxTarget->getBFloat16Align();
2254 case BuiltinType::Float16:
2255 case BuiltinType::Half:
2256 if (Target->hasFloat16Type() || !
getLangOpts().OpenMP ||
2258 Width = Target->getHalfWidth();
2259 Align = Target->getHalfAlign();
2262 "Expected OpenMP device compilation.");
2263 Width = AuxTarget->getHalfWidth();
2264 Align = AuxTarget->getHalfAlign();
2267 case BuiltinType::Float:
2268 Width = Target->getFloatWidth();
2269 Align = Target->getFloatAlign();
2271 case BuiltinType::Double:
2272 Width = Target->getDoubleWidth();
2273 Align = Target->getDoubleAlign();
2275 case BuiltinType::Ibm128:
2276 Width = Target->getIbm128Width();
2277 Align = Target->getIbm128Align();
2279 case BuiltinType::LongDouble:
2281 (Target->getLongDoubleWidth() != AuxTarget->getLongDoubleWidth() ||
2282 Target->getLongDoubleAlign() != AuxTarget->getLongDoubleAlign())) {
2283 Width = AuxTarget->getLongDoubleWidth();
2284 Align = AuxTarget->getLongDoubleAlign();
2286 Width = Target->getLongDoubleWidth();
2287 Align = Target->getLongDoubleAlign();
2290 case BuiltinType::Float128:
2291 if (Target->hasFloat128Type() || !
getLangOpts().OpenMP ||
2293 Width = Target->getFloat128Width();
2294 Align = Target->getFloat128Align();
2297 "Expected OpenMP device compilation.");
2298 Width = AuxTarget->getFloat128Width();
2299 Align = AuxTarget->getFloat128Align();
2302 case BuiltinType::NullPtr:
2307 case BuiltinType::ObjCId:
2308 case BuiltinType::ObjCClass:
2309 case BuiltinType::ObjCSel:
2313 case BuiltinType::OCLSampler:
2314 case BuiltinType::OCLEvent:
2315 case BuiltinType::OCLClkEvent:
2316 case BuiltinType::OCLQueue:
2317 case BuiltinType::OCLReserveID:
2318#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
2319 case BuiltinType::Id:
2320#include "clang/Basic/OpenCLImageTypes.def"
2321#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
2322 case BuiltinType::Id:
2323#include "clang/Basic/OpenCLExtensionTypes.def"
2325 Width = Target->getPointerWidth(AS);
2326 Align = Target->getPointerAlign(AS);
2336#define SVE_VECTOR_TYPE(Name, MangledName, Id, SingletonId) \
2337 case BuiltinType::Id: \
2341#define SVE_PREDICATE_TYPE(Name, MangledName, Id, SingletonId) \
2342 case BuiltinType::Id: \
2346#define SVE_OPAQUE_TYPE(Name, MangledName, Id, SingletonId) \
2347 case BuiltinType::Id: \
2351#define SVE_SCALAR_TYPE(Name, MangledName, Id, SingletonId, Bits) \
2352 case BuiltinType::Id: \
2356#include "clang/Basic/AArch64ACLETypes.def"
2357#define PPC_VECTOR_TYPE(Name, Id, Size) \
2358 case BuiltinType::Id: \
2362#include "clang/Basic/PPCTypes.def"
2363#define RVV_VECTOR_TYPE(Name, Id, SingletonId, ElKind, ElBits, NF, IsSigned, \
2365 case BuiltinType::Id: \
2369#define RVV_PREDICATE_TYPE(Name, Id, SingletonId, ElKind) \
2370 case BuiltinType::Id: \
2374#include "clang/Basic/RISCVVTypes.def"
2375#define WASM_TYPE(Name, Id, SingletonId) \
2376 case BuiltinType::Id: \
2380#include "clang/Basic/WebAssemblyReferenceTypes.def"
2381#define AMDGPU_TYPE(NAME, ID, SINGLETONID, WIDTH, ALIGN) \
2382 case BuiltinType::ID: \
2386#include "clang/Basic/AMDGPUTypes.def"
2387#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
2388#include "clang/Basic/HLSLIntangibleTypes.def"
2394 case Type::ObjCObjectPointer:
2398 case Type::BlockPointer:
2400 Width = Target->getPointerWidth(AS);
2401 Align = Target->getPointerAlign(AS);
2403 case Type::LValueReference:
2404 case Type::RValueReference:
2408 Width = Target->getPointerWidth(AS);
2409 Align = Target->getPointerAlign(AS);
2413 Width = Target->getPointerWidth(AS);
2414 Align = Target->getPointerAlign(AS);
2416 case Type::MemberPointer: {
2418 CXXABI::MemberPointerInfo MPI = ABI->getMemberPointerInfo(MPT);
2423 case Type::Complex: {
2427 Width = EltInfo.
Width * 2;
2428 Align = EltInfo.
Align;
2431 case Type::ObjCObject:
2433 case Type::Adjusted:
2436 case Type::ObjCInterface: {
2438 if (ObjCI->getDecl()->isInvalidDecl()) {
2448 case Type::BitInt: {
2450 Align = Target->getBitIntAlign(EIT->getNumBits());
2451 Width = Target->getBitIntWidth(EIT->getNumBits());
2457 const TagDecl *TD = TT->getOriginalDecl()->getDefinitionOrSelf();
2470 Info.
Align = AttrAlign;
2480 AlignRequirement = RD->
hasAttr<AlignedAttr>()
2486 case Type::SubstTemplateTypeParm:
2488 getReplacementType().getTypePtr());
2491 case Type::DeducedTemplateSpecialization: {
2493 assert(!A->getDeducedType().isNull() &&
2494 "cannot request the size of an undeduced or dependent auto type");
2495 return getTypeInfo(A->getDeducedType().getTypePtr());
2501 case Type::MacroQualified:
2505 case Type::ObjCTypeParam:
2511 case Type::Typedef: {
2513 TypeInfo Info =
getTypeInfo(TT->desugar().getTypePtr());
2517 if (
unsigned AttrAlign = TT->getDecl()->getMaxAlignment()) {
2528 case Type::Attributed:
2532 case Type::CountAttributed:
2535 case Type::BTFTagAttributed:
2539 case Type::HLSLAttributedResource:
2543 case Type::HLSLInlineSpirv: {
2546 Width = ST->getSize() * 8;
2547 Align = ST->getAlignment();
2548 if (Width == 0 && Align == 0) {
2556 case Type::Atomic: {
2565 Width = Target->getCharWidth();
2567 }
else if (Width <= Target->getMaxAtomicPromoteWidth()) {
2573 Width = llvm::bit_ceil(Width);
2576 Align =
static_cast<unsigned>(Width);
2581 case Type::PredefinedSugar:
2590 assert(llvm::isPowerOf2_32(Align) &&
"Alignment must be power of 2");
2591 return TypeInfo(Width, Align, AlignRequirement);
2595 UnadjustedAlignMap::iterator I = MemoizedUnadjustedAlign.find(
T);
2596 if (I != MemoizedUnadjustedAlign.end())
2599 unsigned UnadjustedAlign;
2600 if (
const auto *RT =
T->getAsCanonical<RecordType>()) {
2607 UnadjustedAlign =
getTypeAlign(
T->getUnqualifiedDesugaredType());
2610 MemoizedUnadjustedAlign[
T] = UnadjustedAlign;
2611 return UnadjustedAlign;
2615 unsigned SimdAlign = llvm::OpenMPIRBuilder::getOpenMPDefaultSimdAlign(
2665 unsigned ABIAlign = TI.
Align;
2667 T =
T->getBaseElementTypeUnsafe();
2670 if (
T->isMemberPointerType())
2673 if (!Target->allowsLargerPreferedTypeAlignment())
2676 if (
const auto *RD =
T->getAsRecordDecl()) {
2685 unsigned PreferredAlign =
static_cast<unsigned>(
2687 assert(PreferredAlign >= ABIAlign &&
2688 "PreferredAlign should be at least as large as ABIAlign.");
2689 return PreferredAlign;
2696 T = CT->getElementType().getTypePtr();
2697 if (
const auto *ED =
T->getAsEnumDecl())
2698 T = ED->getIntegerType().getTypePtr();
2699 if (
T->isSpecificBuiltinType(BuiltinType::Double) ||
2700 T->isSpecificBuiltinType(BuiltinType::LongLong) ||
2701 T->isSpecificBuiltinType(BuiltinType::ULongLong) ||
2702 (
T->isSpecificBuiltinType(BuiltinType::LongDouble) &&
2703 Target->defaultsToAIXPowerAlignment()))
2758 for (
unsigned I = 0, N = Path.size(); I != N; ++I) {
2762 std::swap(
Base, Derived);
2782 llvm::append_range(Ivars, OI->
ivars());
2785 for (
const ObjCIvarDecl *Iv = IDecl->all_declared_ivar_begin(); Iv;
2787 Ivars.push_back(Iv);
2795 if (
const auto *OI = dyn_cast<ObjCInterfaceDecl>(CDecl)) {
2798 for (
auto *Proto : OI->all_referenced_protocols()) {
2803 for (
const auto *Cat : OI->visible_categories())
2809 SD = SD->getSuperClass();
2811 }
else if (
const auto *OC = dyn_cast<ObjCCategoryDecl>(CDecl)) {
2812 for (
auto *Proto : OC->protocols()) {
2815 }
else if (
const auto *OP = dyn_cast<ObjCProtocolDecl>(CDecl)) {
2817 if (!Protocols.insert(
2821 for (
auto *Proto : OP->protocols())
2828 bool CheckIfTriviallyCopyable) {
2829 assert(RD->
isUnion() &&
"Must be union type");
2831 Context.getTypeSizeInChars(Context.getCanonicalTagType(RD));
2833 for (
const auto *Field : RD->
fields()) {
2834 if (!Context.hasUniqueObjectRepresentations(Field->getType(),
2835 CheckIfTriviallyCopyable))
2837 CharUnits FieldSize = Context.getTypeSizeInChars(Field->getType());
2838 if (FieldSize != UnionSize)
2847 return Context.getFieldOffset(Field);
2856static std::optional<int64_t>
2858 const RecordDecl *RD,
2859 bool CheckIfTriviallyCopyable);
2861static std::optional<int64_t>
2863 bool CheckIfTriviallyCopyable) {
2864 if (
const auto *RD = Field->getType()->getAsRecordDecl();
2867 CheckIfTriviallyCopyable);
2871 bool IsBitIntType = Field->getType()->isBitIntType();
2872 if (!Field->getType()->isReferenceType() && !IsBitIntType &&
2873 !Context.hasUniqueObjectRepresentations(Field->getType(),
2874 CheckIfTriviallyCopyable))
2875 return std::nullopt;
2877 int64_t FieldSizeInBits =
2878 Context.toBits(Context.getTypeSizeInChars(Field->getType()));
2879 if (Field->isBitField()) {
2882 if (Field->isUnnamedBitField())
2885 int64_t BitfieldSize = Field->getBitWidthValue();
2887 if ((
unsigned)BitfieldSize >
2889 return std::nullopt;
2890 }
else if (BitfieldSize > FieldSizeInBits) {
2891 return std::nullopt;
2893 FieldSizeInBits = BitfieldSize;
2894 }
else if (IsBitIntType && !Context.hasUniqueObjectRepresentations(
2895 Field->getType(), CheckIfTriviallyCopyable)) {
2896 return std::nullopt;
2898 return FieldSizeInBits;
2901static std::optional<int64_t>
2903 bool CheckIfTriviallyCopyable) {
2905 CheckIfTriviallyCopyable);
2908template <
typename RangeT>
2910 const RangeT &Subobjects, int64_t CurOffsetInBits,
2912 bool CheckIfTriviallyCopyable) {
2913 for (
const auto *Subobject : Subobjects) {
2914 std::optional<int64_t> SizeInBits =
2917 return std::nullopt;
2918 if (*SizeInBits != 0) {
2920 if (Offset != CurOffsetInBits)
2921 return std::nullopt;
2922 CurOffsetInBits += *SizeInBits;
2925 return CurOffsetInBits;
2928static std::optional<int64_t>
2931 bool CheckIfTriviallyCopyable) {
2932 assert(!RD->
isUnion() &&
"Must be struct/class type");
2933 const auto &Layout = Context.getASTRecordLayout(RD);
2935 int64_t CurOffsetInBits = 0;
2936 if (
const auto *ClassDecl = dyn_cast<CXXRecordDecl>(RD)) {
2937 if (ClassDecl->isDynamicClass())
2938 return std::nullopt;
2941 for (
const auto &
Base : ClassDecl->bases()) {
2944 Bases.emplace_back(
Base.getType()->getAsCXXRecordDecl());
2948 return Layout.getBaseClassOffset(L) < Layout.getBaseClassOffset(R);
2951 std::optional<int64_t> OffsetAfterBases =
2953 Bases, CurOffsetInBits, Context, Layout, CheckIfTriviallyCopyable);
2954 if (!OffsetAfterBases)
2955 return std::nullopt;
2956 CurOffsetInBits = *OffsetAfterBases;
2959 std::optional<int64_t> OffsetAfterFields =
2961 RD->
fields(), CurOffsetInBits, Context, Layout,
2962 CheckIfTriviallyCopyable);
2963 if (!OffsetAfterFields)
2964 return std::nullopt;
2965 CurOffsetInBits = *OffsetAfterFields;
2967 return CurOffsetInBits;
2971 QualType Ty,
bool CheckIfTriviallyCopyable)
const {
2988 assert(!Ty.
isNull() &&
"Null QualType sent to unique object rep check");
2993 CheckIfTriviallyCopyable);
2996 "hasUniqueObjectRepresentations should not be called with an "
3020 return !ABI->getMemberPointerInfo(MPT).HasPadding;
3023 if (
Record->isInvalidDecl())
3028 CheckIfTriviallyCopyable);
3031 *
this,
Record, CheckIfTriviallyCopyable);
3033 return StructSize && *StructSize ==
static_cast<int64_t
>(
getTypeSize(Ty));
3054 count += Ext->ivar_size();
3059 count += ImplDecl->ivar_size();
3085 llvm::DenseMap<ObjCContainerDecl*, ObjCImplDecl*>::iterator
3086 I = ObjCImpls.find(D);
3087 if (I != ObjCImpls.end())
3095 llvm::DenseMap<ObjCContainerDecl*, ObjCImplDecl*>::iterator
3096 I = ObjCImpls.find(D);
3097 if (I != ObjCImpls.end())
3105 assert(IFaceD && ImplD &&
"Passed null params");
3106 ObjCImpls[IFaceD] = ImplD;
3112 assert(CatD && ImplD &&
"Passed null params");
3113 ObjCImpls[CatD] = ImplD;
3118 return ObjCMethodRedecls.
lookup(MD);
3124 ObjCMethodRedecls[MD] = Redecl;
3129 if (
const auto *ID = dyn_cast<ObjCInterfaceDecl>(ND->
getDeclContext()))
3131 if (
const auto *CD = dyn_cast<ObjCCategoryDecl>(ND->
getDeclContext()))
3132 return CD->getClassInterface();
3133 if (
const auto *IMD = dyn_cast<ObjCImplDecl>(ND->
getDeclContext()))
3134 return IMD->getClassInterface();
3142 assert(VD &&
"Passed null params");
3143 assert(VD->
hasAttr<BlocksAttr>() &&
3144 "getBlockVarCopyInits - not __block var");
3145 auto I = BlockVarCopyInits.find(VD);
3146 if (I != BlockVarCopyInits.end())
3148 return {
nullptr,
false};
3154 assert(VD && CopyExpr &&
"Passed null params");
3155 assert(VD->
hasAttr<BlocksAttr>() &&
3156 "setBlockVarCopyInits - not __block var");
3157 BlockVarCopyInits[VD].setExprAndFlag(CopyExpr,
CanThrow);
3161 unsigned DataSize)
const {
3166 "incorrect data size provided to CreateTypeSourceInfo!");
3183 return getObjCLayout(D);
3188 bool &AnyNonCanonArgs) {
3190 AnyNonCanonArgs |=
C.canonicalizeTemplateArguments(CanonArgs);
3196 bool AnyNonCanonArgs =
false;
3197 for (
auto &Arg : Args) {
3200 AnyNonCanonArgs |= !Arg.structurallyEquals(OrigArg);
3202 return AnyNonCanonArgs;
3210ASTContext::getExtQualType(
const Type *baseType,
Qualifiers quals)
const {
3215 llvm::FoldingSetNodeID ID;
3217 void *insertPos =
nullptr;
3218 if (
ExtQuals *eq = ExtQualNodes.FindNodeOrInsertPos(ID, insertPos)) {
3219 assert(eq->getQualifiers() == quals);
3228 canon = getExtQualType(canonSplit.
Ty, canonSplit.
Quals);
3231 (void) ExtQualNodes.FindNodeOrInsertPos(ID, insertPos);
3234 auto *eq =
new (*
this,
alignof(ExtQuals)) ExtQuals(baseType, canon, quals);
3235 ExtQualNodes.InsertNode(eq, insertPos);
3236 return QualType(eq, fastQuals);
3240 LangAS AddressSpace)
const {
3253 "Type cannot be in multiple addr spaces!");
3256 return getExtQualType(TypeNode, Quals);
3262 if (!
T.hasAddressSpace())
3266 const Type *TypeNode;
3269 if (
T.getTypePtr()->isArrayType()) {
3271 TypeNode =
T.getTypePtr();
3275 while (
T.hasAddressSpace()) {
3276 TypeNode = Quals.
strip(
T);
3280 if (!
QualType(TypeNode, 0).hasAddressSpace())
3284 T =
T.getSingleStepDesugaredType(*
this);
3294 return getExtQualType(TypeNode, Quals);
3302 "Attempted to get vtable pointer discriminator on a monomorphic type");
3305 llvm::raw_svector_ostream Out(Str);
3306 MC->mangleCXXVTable(RD, Out);
3307 return llvm::getPointerAuthStableSipHash(Str);
3333 switch (
T->getTypeClass()) {
3338 case Type::LValueReference:
3343 case Type::RValueReference:
3357 case Type::ObjCObjectPointer:
3358 case Type::BlockPointer:
3367 case Type::VariableArray:
3368 case Type::ConstantArray:
3369 case Type::IncompleteArray:
3370 case Type::ArrayParameter:
3383 case Type::ObjCInterface:
3384 case Type::ObjCObject:
3385 OS <<
"<objc_object>";
3394 QualType UnderlyingType =
T->castAsEnumDecl()->getIntegerType();
3396 Ctx, OS, UnderlyingType.
isNull() ? Ctx.
IntTy : UnderlyingType);
3399 case Type::FunctionNoProto:
3400 case Type::FunctionProto: {
3416 if (
const auto *FPT = dyn_cast<FunctionProtoType>(FuncType)) {
3417 for (
QualType Param : FPT->param_types()) {
3421 if (FPT->isVariadic())
3428 case Type::MemberPointer: {
3432 Ctx, OS,
QualType(MPT->getQualifier().getAsType(), 0));
3436 case Type::ExtVector:
3444 case Type::ConstantMatrix:
3448 case Type::Builtin: {
3450 switch (BTy->getKind()) {
3451#define SIGNED_TYPE(Id, SingletonId) \
3452 case BuiltinType::Id: \
3455#define UNSIGNED_TYPE(Id, SingletonId) \
3456 case BuiltinType::Id: \
3459#define PLACEHOLDER_TYPE(Id, SingletonId) case BuiltinType::Id:
3460#define BUILTIN_TYPE(Id, SingletonId)
3461#include "clang/AST/BuiltinTypes.def"
3462 llvm_unreachable(
"placeholder types should not appear here.");
3464 case BuiltinType::Half:
3467 case BuiltinType::Float:
3470 case BuiltinType::Double:
3473 case BuiltinType::LongDouble:
3476 case BuiltinType::Float16:
3479 case BuiltinType::Float128:
3483 case BuiltinType::Void:
3487 case BuiltinType::ObjCId:
3488 case BuiltinType::ObjCClass:
3489 case BuiltinType::ObjCSel:
3490 case BuiltinType::NullPtr:
3495 case BuiltinType::OCLSampler:
3496 case BuiltinType::OCLEvent:
3497 case BuiltinType::OCLClkEvent:
3498 case BuiltinType::OCLQueue:
3499 case BuiltinType::OCLReserveID:
3500 case BuiltinType::BFloat16:
3501 case BuiltinType::VectorQuad:
3502 case BuiltinType::VectorPair:
3503 case BuiltinType::DMR1024:
3504 case BuiltinType::DMR2048:
3509 case BuiltinType::Ibm128:
3511#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
3512 case BuiltinType::Id: \
3514#include "clang/Basic/OpenCLImageTypes.def"
3515#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
3516 case BuiltinType::Id: \
3518#include "clang/Basic/OpenCLExtensionTypes.def"
3519#define SVE_TYPE(Name, Id, SingletonId) \
3520 case BuiltinType::Id: \
3522#include "clang/Basic/AArch64ACLETypes.def"
3523#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) \
3524 case BuiltinType::Id: \
3526#include "clang/Basic/HLSLIntangibleTypes.def"
3527 case BuiltinType::Dependent:
3528 llvm_unreachable(
"should never get here");
3529#define AMDGPU_TYPE(Name, Id, SingletonId, Width, Align) case BuiltinType::Id:
3530#include "clang/Basic/AMDGPUTypes.def"
3531 case BuiltinType::WasmExternRef:
3532#define RVV_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
3533#include "clang/Basic/RISCVVTypes.def"
3534 llvm_unreachable(
"not yet implemented");
3536 llvm_unreachable(
"should never get here");
3538 case Type::Record: {
3539 const RecordDecl *RD =
T->castAsCanonical<RecordType>()->getOriginalDecl();
3559 II = Typedef->getDeclName().getAsIdentifierInfo();
3562 OS <<
"<anonymous_record>";
3568 case Type::HLSLAttributedResource:
3569 case Type::HLSLInlineSpirv:
3570 llvm_unreachable(
"should never get here");
3572 case Type::DeducedTemplateSpecialization:
3574#define NON_CANONICAL_TYPE(Class, Base) case Type::Class:
3575#define DEPENDENT_TYPE(Class, Base) case Type::Class:
3576#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base) case Type::Class:
3577#define ABSTRACT_TYPE(Class, Base)
3578#define TYPE(Class, Base)
3579#include "clang/AST/TypeNodes.inc"
3580 llvm_unreachable(
"unexpected non-canonical or dependent type!");
3586 assert(!
T->isDependentType() &&
3587 "cannot compute type discriminator of a dependent type");
3590 llvm::raw_svector_ostream Out(Str);
3592 if (
T->isFunctionPointerType() ||
T->isFunctionReferenceType())
3593 T =
T->getPointeeType();
3595 if (
T->isFunctionType()) {
3598 T =
T.getUnqualifiedType();
3619 if (MPT->isMemberFunctionPointer()) {
3625 MPT->getMostRecentCXXRecordDecl());
3629 MC->mangleCanonicalTypeName(
T, Out);
3632 return llvm::getPointerAuthStableSipHash(Str);
3657 "Type cannot have multiple ObjCGCs!");
3660 return getExtQualType(TypeNode, Quals);
3674 QualType WrappedTy,
Expr *CountExpr,
bool CountInBytes,
bool OrNull,
3678 llvm::FoldingSetNodeID ID;
3681 void *InsertPos =
nullptr;
3683 CountAttributedTypes.FindNodeOrInsertPos(ID, InsertPos);
3688 size_t Size = CountAttributedType::totalSizeToAlloc<TypeCoupledDeclRefInfo>(
3689 DependentDecls.size());
3692 OrNull, DependentDecls);
3693 Types.push_back(CATy);
3694 CountAttributedTypes.InsertNode(CATy, InsertPos);
3703 case Type::Attributed: {
3711 case Type::BTFTagAttributed: {
3712 const auto *BTFT = dyn_cast<BTFTagAttributedType>(Orig);
3721 case Type::Adjusted: {
3727 case Type::MacroQualified: {
3730 MQT->getMacroIdentifier());
3734 return Adjust(Orig);
3740 if (
T->getExtInfo() == Info)
3744 if (
const auto *FNPT = dyn_cast<FunctionNoProtoType>(
T)) {
3764 FPT->getExtProtoInfo());
3779 L->DeducedReturnType(FD, ResultType);
3790 return getFunctionType(Proto->getReturnType(), Proto->getParamTypes(),
3791 Proto->getExtProtoInfo().withExceptionSpec(ESI));
3807 for (
unsigned i = 0, n = Args.size(); i != n; ++i)
3830 return getFunctionType(Proto->getReturnType(), Proto->param_types(), EPI);
3856 if (TSInfo->getType() != FD->
getType())
3864 "TypeLoc size mismatch from updating exception specification");
3865 TSInfo->overrideType(Updated);
3874 llvm::FoldingSetNodeID ID;
3877 void *InsertPos =
nullptr;
3878 if (
ComplexType *CT = ComplexTypes.FindNodeOrInsertPos(ID, InsertPos))
3884 if (!
T.isCanonical()) {
3888 ComplexType *NewIP = ComplexTypes.FindNodeOrInsertPos(ID, InsertPos);
3889 assert(!NewIP &&
"Shouldn't be in the map!"); (void)NewIP;
3892 Types.push_back(
New);
3893 ComplexTypes.InsertNode(
New, InsertPos);
3902 llvm::FoldingSetNodeID ID;
3905 void *InsertPos =
nullptr;
3906 if (
PointerType *PT = PointerTypes.FindNodeOrInsertPos(ID, InsertPos))
3912 if (!
T.isCanonical()) {
3916 PointerType *NewIP = PointerTypes.FindNodeOrInsertPos(ID, InsertPos);
3917 assert(!NewIP &&
"Shouldn't be in the map!"); (void)NewIP;
3920 Types.push_back(
New);
3921 PointerTypes.InsertNode(
New, InsertPos);
3926 llvm::FoldingSetNodeID ID;
3928 void *InsertPos =
nullptr;
3929 AdjustedType *AT = AdjustedTypes.FindNodeOrInsertPos(ID, InsertPos);
3936 AT = AdjustedTypes.FindNodeOrInsertPos(ID, InsertPos);
3937 assert(!AT &&
"Shouldn't be in the map!");
3941 Types.push_back(AT);
3942 AdjustedTypes.InsertNode(AT, InsertPos);
3947 llvm::FoldingSetNodeID ID;
3949 void *InsertPos =
nullptr;
3950 AdjustedType *AT = AdjustedTypes.FindNodeOrInsertPos(ID, InsertPos);
3957 AT = AdjustedTypes.FindNodeOrInsertPos(ID, InsertPos);
3958 assert(!AT &&
"Shouldn't be in the map!");
3961 Types.push_back(AT);
3962 AdjustedTypes.InsertNode(AT, InsertPos);
3967 assert((
T->isArrayType() ||
T->isFunctionType()) &&
"T does not decay");
3976 if (
T->isArrayType())
3983 if (
T->isFunctionType())
3995 llvm::FoldingSetNodeID ID;
3996 ATy->Profile(ID, *
this, ATy->getElementType(), ATy->getZExtSize(),
3997 ATy->getSizeExpr(), ATy->getSizeModifier(),
3998 ATy->getIndexTypeQualifiers().getAsOpaqueValue());
3999 void *InsertPos =
nullptr;
4001 ArrayParameterTypes.FindNodeOrInsertPos(ID, InsertPos);
4010 AT = ArrayParameterTypes.FindNodeOrInsertPos(ID, InsertPos);
4011 assert(!AT &&
"Shouldn't be in the map!");
4016 Types.push_back(AT);
4017 ArrayParameterTypes.InsertNode(AT, InsertPos);
4024 assert(
T->isFunctionType() &&
"block of function types only");
4027 llvm::FoldingSetNodeID ID;
4030 void *InsertPos =
nullptr;
4032 BlockPointerTypes.FindNodeOrInsertPos(ID, InsertPos))
4038 if (!
T.isCanonical()) {
4043 BlockPointerTypes.FindNodeOrInsertPos(ID, InsertPos);
4044 assert(!NewIP &&
"Shouldn't be in the map!"); (void)NewIP;
4048 Types.push_back(
New);
4049 BlockPointerTypes.InsertNode(
New, InsertPos);
4057 assert((!
T->isPlaceholderType() ||
4058 T->isSpecificPlaceholderType(BuiltinType::UnknownAny)) &&
4059 "Unresolved placeholder type");
4063 llvm::FoldingSetNodeID ID;
4066 void *InsertPos =
nullptr;
4068 LValueReferenceTypes.FindNodeOrInsertPos(ID, InsertPos))
4076 if (!SpelledAsLValue || InnerRef || !
T.isCanonical()) {
4077 QualType PointeeType = (InnerRef ? InnerRef->getPointeeType() :
T);
4082 LValueReferenceTypes.FindNodeOrInsertPos(ID, InsertPos);
4083 assert(!NewIP &&
"Shouldn't be in the map!"); (void)NewIP;
4088 Types.push_back(
New);
4089 LValueReferenceTypes.InsertNode(
New, InsertPos);
4097 assert((!
T->isPlaceholderType() ||
4098 T->isSpecificPlaceholderType(BuiltinType::UnknownAny)) &&
4099 "Unresolved placeholder type");
4103 llvm::FoldingSetNodeID ID;
4106 void *InsertPos =
nullptr;
4108 RValueReferenceTypes.FindNodeOrInsertPos(ID, InsertPos))
4116 if (InnerRef || !
T.isCanonical()) {
4117 QualType PointeeType = (InnerRef ? InnerRef->getPointeeType() :
T);
4122 RValueReferenceTypes.FindNodeOrInsertPos(ID, InsertPos);
4123 assert(!NewIP &&
"Shouldn't be in the map!"); (void)NewIP;
4128 Types.push_back(
New);
4129 RValueReferenceTypes.InsertNode(
New, InsertPos);
4137 assert(Cls &&
"At least one of Qualifier or Cls must be provided");
4140 Cls = Qualifier.getAsRecordDecl();
4144 llvm::FoldingSetNodeID ID;
4147 void *InsertPos =
nullptr;
4149 MemberPointerTypes.FindNodeOrInsertPos(ID, InsertPos))
4154 return Qualifier.getCanonical();
4162 if (!
T.isCanonical() || Qualifier != CanonicalQualifier) {
4168 MemberPointerTypes.FindNodeOrInsertPos(ID, InsertPos);
4169 assert(!NewIP &&
"Shouldn't be in the map!");
4173 Types.push_back(
New);
4174 MemberPointerTypes.InsertNode(
New, InsertPos);
4181 const llvm::APInt &ArySizeIn,
4182 const Expr *SizeExpr,
4184 unsigned IndexTypeQuals)
const {
4187 "Constant array of VLAs is illegal!");
4195 llvm::APInt ArySize(ArySizeIn);
4196 ArySize = ArySize.zextOrTrunc(Target->getMaxPointerWidth());
4198 llvm::FoldingSetNodeID ID;
4200 ASM, IndexTypeQuals);
4202 void *InsertPos =
nullptr;
4204 ConstantArrayTypes.FindNodeOrInsertPos(ID, InsertPos))
4215 ASM, IndexTypeQuals);
4220 ConstantArrayTypes.FindNodeOrInsertPos(ID, InsertPos);
4221 assert(!NewIP &&
"Shouldn't be in the map!"); (void)NewIP;
4224 auto *
New = ConstantArrayType::Create(*
this, EltTy, Canon, ArySize, SizeExpr,
4225 ASM, IndexTypeQuals);
4226 ConstantArrayTypes.InsertNode(
New, InsertPos);
4227 Types.push_back(
New);
4236 if (!
type->isVariablyModifiedType())
return type;
4241 const Type *ty = split.
Ty;
4243#define TYPE(Class, Base)
4244#define ABSTRACT_TYPE(Class, Base)
4245#define NON_CANONICAL_TYPE(Class, Base) case Type::Class:
4246#include "clang/AST/TypeNodes.inc"
4247 llvm_unreachable(
"didn't desugar past all non-canonical types?");
4253 case Type::DependentVector:
4254 case Type::ExtVector:
4255 case Type::DependentSizedExtVector:
4256 case Type::ConstantMatrix:
4257 case Type::DependentSizedMatrix:
4258 case Type::DependentAddressSpace:
4259 case Type::ObjCObject:
4260 case Type::ObjCInterface:
4261 case Type::ObjCObjectPointer:
4264 case Type::UnresolvedUsing:
4265 case Type::TypeOfExpr:
4267 case Type::Decltype:
4268 case Type::UnaryTransform:
4269 case Type::DependentName:
4270 case Type::InjectedClassName:
4271 case Type::TemplateSpecialization:
4272 case Type::TemplateTypeParm:
4273 case Type::SubstTemplateTypeParmPack:
4274 case Type::SubstBuiltinTemplatePack:
4276 case Type::DeducedTemplateSpecialization:
4277 case Type::PackExpansion:
4278 case Type::PackIndexing:
4280 case Type::DependentBitInt:
4281 case Type::ArrayParameter:
4282 case Type::HLSLAttributedResource:
4283 case Type::HLSLInlineSpirv:
4284 llvm_unreachable(
"type should never be variably-modified");
4288 case Type::FunctionNoProto:
4289 case Type::FunctionProto:
4290 case Type::BlockPointer:
4291 case Type::MemberPointer:
4304 case Type::LValueReference: {
4308 lv->isSpelledAsLValue());
4312 case Type::RValueReference: {
4319 case Type::Atomic: {
4325 case Type::ConstantArray: {
4331 cat->getSizeModifier(),
4332 cat->getIndexTypeCVRQualifiers());
4336 case Type::DependentSizedArray: {
4340 dat->getSizeModifier(), dat->getIndexTypeCVRQualifiers());
4345 case Type::IncompleteArray: {
4350 iat->getIndexTypeCVRQualifiers());
4355 case Type::VariableArray: {
4360 vat->getIndexTypeCVRQualifiers());
4373 unsigned IndexTypeQuals)
const {
4390 VariableArrayTypes.push_back(
New);
4391 Types.push_back(
New);
4401 unsigned elementTypeQuals)
const {
4404 "Size must be type- or value-dependent!");
4408 void *insertPos =
nullptr;
4409 llvm::FoldingSetNodeID ID;
4411 ID, *
this, numElements ?
QualType(canonElementType.
Ty, 0) : elementType,
4412 ASM, elementTypeQuals, numElements);
4416 DependentSizedArrayTypes.FindNodeOrInsertPos(ID, insertPos);
4428 DependentSizedArrayTypes.InsertNode(newType, insertPos);
4429 Types.push_back(newType);
4437 numElements, ASM, elementTypeQuals);
4438 DependentSizedArrayTypes.InsertNode(canonTy, insertPos);
4439 Types.push_back(canonTy);
4444 canonElementType.
Quals);
4448 if (
QualType(canonElementType.
Ty, 0) == elementType &&
4457 Types.push_back(sugaredType);
4463 unsigned elementTypeQuals)
const {
4464 llvm::FoldingSetNodeID ID;
4467 void *insertPos =
nullptr;
4469 IncompleteArrayTypes.FindNodeOrInsertPos(ID, insertPos))
4481 ASM, elementTypeQuals);
4486 IncompleteArrayTypes.FindNodeOrInsertPos(ID, insertPos);
4487 assert(!existing &&
"Shouldn't be in the map!"); (void) existing;
4493 IncompleteArrayTypes.InsertNode(newType, insertPos);
4494 Types.push_back(newType);
4500#define SVE_INT_ELTTY(BITS, ELTS, SIGNED, NUMVECTORS) \
4501 {getIntTypeForBitwidth(BITS, SIGNED), llvm::ElementCount::getScalable(ELTS), \
4504#define SVE_ELTTY(ELTTY, ELTS, NUMVECTORS) \
4505 {ELTTY, llvm::ElementCount::getScalable(ELTS), NUMVECTORS};
4509 llvm_unreachable(
"Unsupported builtin vector type");
4511#define SVE_VECTOR_TYPE_INT(Name, MangledName, Id, SingletonId, NumEls, \
4512 ElBits, NF, IsSigned) \
4513 case BuiltinType::Id: \
4514 return {getIntTypeForBitwidth(ElBits, IsSigned), \
4515 llvm::ElementCount::getScalable(NumEls), NF};
4516#define SVE_VECTOR_TYPE_FLOAT(Name, MangledName, Id, SingletonId, NumEls, \
4518 case BuiltinType::Id: \
4519 return {ElBits == 16 ? HalfTy : (ElBits == 32 ? FloatTy : DoubleTy), \
4520 llvm::ElementCount::getScalable(NumEls), NF};
4521#define SVE_VECTOR_TYPE_BFLOAT(Name, MangledName, Id, SingletonId, NumEls, \
4523 case BuiltinType::Id: \
4524 return {BFloat16Ty, llvm::ElementCount::getScalable(NumEls), NF};
4525#define SVE_VECTOR_TYPE_MFLOAT(Name, MangledName, Id, SingletonId, NumEls, \
4527 case BuiltinType::Id: \
4528 return {MFloat8Ty, llvm::ElementCount::getScalable(NumEls), NF};
4529#define SVE_PREDICATE_TYPE_ALL(Name, MangledName, Id, SingletonId, NumEls, NF) \
4530 case BuiltinType::Id: \
4531 return {BoolTy, llvm::ElementCount::getScalable(NumEls), NF};
4532#include "clang/Basic/AArch64ACLETypes.def"
4534#define RVV_VECTOR_TYPE_INT(Name, Id, SingletonId, NumEls, ElBits, NF, \
4536 case BuiltinType::Id: \
4537 return {getIntTypeForBitwidth(ElBits, IsSigned), \
4538 llvm::ElementCount::getScalable(NumEls), NF};
4539#define RVV_VECTOR_TYPE_FLOAT(Name, Id, SingletonId, NumEls, ElBits, NF) \
4540 case BuiltinType::Id: \
4541 return {ElBits == 16 ? Float16Ty : (ElBits == 32 ? FloatTy : DoubleTy), \
4542 llvm::ElementCount::getScalable(NumEls), NF};
4543#define RVV_VECTOR_TYPE_BFLOAT(Name, Id, SingletonId, NumEls, ElBits, NF) \
4544 case BuiltinType::Id: \
4545 return {BFloat16Ty, llvm::ElementCount::getScalable(NumEls), NF};
4546#define RVV_PREDICATE_TYPE(Name, Id, SingletonId, NumEls) \
4547 case BuiltinType::Id: \
4548 return {BoolTy, llvm::ElementCount::getScalable(NumEls), 1};
4549#include "clang/Basic/RISCVVTypes.def"
4556 if (Target->getTriple().isWasm() && Target->hasFeature(
"reference-types")) {
4557#define WASM_REF_TYPE(Name, MangledName, Id, SingletonId, AS) \
4558 if (BuiltinType::Id == BuiltinType::WasmExternRef) \
4560#include "clang/Basic/WebAssemblyReferenceTypes.def"
4563 "shouldn't try to generate type externref outside WebAssembly target");
4570 unsigned NumFields)
const {
4572 if (
auto It = ScalableVecTyMap.find(K); It != ScalableVecTyMap.end())
4575 if (Target->hasAArch64ACLETypes()) {
4578#define SVE_VECTOR_TYPE_INT(Name, MangledName, Id, SingletonId, NumEls, \
4579 ElBits, NF, IsSigned) \
4580 if (EltTy->hasIntegerRepresentation() && !EltTy->isBooleanType() && \
4581 EltTy->hasSignedIntegerRepresentation() == IsSigned && \
4582 EltTySize == ElBits && NumElts == (NumEls * NF) && NumFields == 1) { \
4583 return ScalableVecTyMap[K] = SingletonId; \
4585#define SVE_VECTOR_TYPE_FLOAT(Name, MangledName, Id, SingletonId, NumEls, \
4587 if (EltTy->hasFloatingRepresentation() && !EltTy->isBFloat16Type() && \
4588 EltTySize == ElBits && NumElts == (NumEls * NF) && NumFields == 1) { \
4589 return ScalableVecTyMap[K] = SingletonId; \
4591#define SVE_VECTOR_TYPE_BFLOAT(Name, MangledName, Id, SingletonId, NumEls, \
4593 if (EltTy->hasFloatingRepresentation() && EltTy->isBFloat16Type() && \
4594 EltTySize == ElBits && NumElts == (NumEls * NF) && NumFields == 1) { \
4595 return ScalableVecTyMap[K] = SingletonId; \
4597#define SVE_VECTOR_TYPE_MFLOAT(Name, MangledName, Id, SingletonId, NumEls, \
4599 if (EltTy->isMFloat8Type() && EltTySize == ElBits && \
4600 NumElts == (NumEls * NF) && NumFields == 1) { \
4601 return ScalableVecTyMap[K] = SingletonId; \
4603#define SVE_PREDICATE_TYPE_ALL(Name, MangledName, Id, SingletonId, NumEls, NF) \
4604 if (EltTy->isBooleanType() && NumElts == (NumEls * NF) && NumFields == 1) \
4605 return ScalableVecTyMap[K] = SingletonId;
4606#include "clang/Basic/AArch64ACLETypes.def"
4607 }
else if (Target->hasRISCVVTypes()) {
4609#define RVV_VECTOR_TYPE(Name, Id, SingletonId, NumEls, ElBits, NF, IsSigned, \
4611 if (!EltTy->isBooleanType() && \
4612 ((EltTy->hasIntegerRepresentation() && \
4613 EltTy->hasSignedIntegerRepresentation() == IsSigned) || \
4614 (EltTy->hasFloatingRepresentation() && !EltTy->isBFloat16Type() && \
4616 (EltTy->hasFloatingRepresentation() && EltTy->isBFloat16Type() && \
4617 IsBF && !IsFP)) && \
4618 EltTySize == ElBits && NumElts == NumEls && NumFields == NF) \
4619 return ScalableVecTyMap[K] = SingletonId;
4620#define RVV_PREDICATE_TYPE(Name, Id, SingletonId, NumEls) \
4621 if (EltTy->isBooleanType() && NumElts == NumEls) \
4622 return ScalableVecTyMap[K] = SingletonId;
4623#include "clang/Basic/RISCVVTypes.def"
4638 llvm::FoldingSetNodeID ID;
4641 void *InsertPos =
nullptr;
4642 if (
VectorType *VTP = VectorTypes.FindNodeOrInsertPos(ID, InsertPos))
4652 VectorType *NewIP = VectorTypes.FindNodeOrInsertPos(ID, InsertPos);
4653 assert(!NewIP &&
"Shouldn't be in the map!"); (void)NewIP;
4656 VectorType(vecType, NumElts, Canonical, VecKind);
4657 VectorTypes.InsertNode(
New, InsertPos);
4658 Types.push_back(
New);
4665 llvm::FoldingSetNodeID ID;
4668 void *InsertPos =
nullptr;
4670 DependentVectorTypes.FindNodeOrInsertPos(ID, InsertPos);
4675 VecType,
QualType(Canon, 0), SizeExpr, AttrLoc, VecKind);
4678 if (CanonVecTy == VecType) {
4683 DependentVectorTypes.FindNodeOrInsertPos(ID, InsertPos);
4684 assert(!CanonCheck &&
4685 "Dependent-sized vector_size canonical type broken");
4687 DependentVectorTypes.InsertNode(
New, InsertPos);
4696 Types.push_back(
New);
4703 unsigned NumElts)
const {
4710 llvm::FoldingSetNodeID ID;
4713 void *InsertPos =
nullptr;
4714 if (
VectorType *VTP = VectorTypes.FindNodeOrInsertPos(ID, InsertPos))
4724 VectorType *NewIP = VectorTypes.FindNodeOrInsertPos(ID, InsertPos);
4725 assert(!NewIP &&
"Shouldn't be in the map!"); (void)NewIP;
4729 VectorTypes.InsertNode(
New, InsertPos);
4730 Types.push_back(
New);
4738 llvm::FoldingSetNodeID ID;
4742 void *InsertPos =
nullptr;
4744 = DependentSizedExtVectorTypes.FindNodeOrInsertPos(ID, InsertPos);
4754 if (CanonVecTy == vecType) {
4759 = DependentSizedExtVectorTypes.FindNodeOrInsertPos(ID, InsertPos);
4760 assert(!CanonCheck &&
"Dependent-sized ext_vector canonical type broken");
4762 DependentSizedExtVectorTypes.InsertNode(
New, InsertPos);
4771 Types.push_back(
New);
4776 unsigned NumColumns)
const {
4777 llvm::FoldingSetNodeID ID;
4779 Type::ConstantMatrix);
4782 "need a valid element type");
4785 "need valid matrix dimensions");
4786 void *InsertPos =
nullptr;
4796 assert(!NewIP &&
"Matrix type shouldn't already exist in the map");
4802 MatrixTypes.InsertNode(
New, InsertPos);
4803 Types.push_back(
New);
4812 llvm::FoldingSetNodeID ID;
4816 void *InsertPos =
nullptr;
4818 DependentSizedMatrixTypes.FindNodeOrInsertPos(ID, InsertPos);
4823 ColumnExpr, AttrLoc);
4826 DependentSizedMatrixTypes.FindNodeOrInsertPos(ID, InsertPos);
4827 assert(!CanonCheck &&
"Dependent-sized matrix canonical type broken");
4829 DependentSizedMatrixTypes.InsertNode(Canon, InsertPos);
4830 Types.push_back(Canon);
4843 ColumnExpr, AttrLoc);
4844 Types.push_back(
New);
4849 Expr *AddrSpaceExpr,
4855 void *insertPos =
nullptr;
4856 llvm::FoldingSetNodeID ID;
4861 DependentAddressSpaceTypes.FindNodeOrInsertPos(ID, insertPos);
4867 DependentAddressSpaceTypes.InsertNode(canonTy, insertPos);
4868 Types.push_back(canonTy);
4871 if (canonPointeeType == PointeeType &&
4877 AddrSpaceExpr, AttrLoc);
4878 Types.push_back(sugaredType);
4884 return T.isCanonical() &&
4902 llvm::FoldingSetNodeID ID;
4905 void *InsertPos =
nullptr;
4907 FunctionNoProtoTypes.FindNodeOrInsertPos(ID, InsertPos))
4917 FunctionNoProtoTypes.FindNodeOrInsertPos(ID, InsertPos);
4918 assert(!NewIP &&
"Shouldn't be in the map!"); (void)NewIP;
4923 Types.push_back(
New);
4924 FunctionNoProtoTypes.InsertNode(
New, InsertPos);
4940 return CanResultType;
4947 if (!NoexceptInType)
4964 bool AnyPackExpansions =
false;
4968 if (ET->
getAs<PackExpansionType>())
4969 AnyPackExpansions =
true;
4971 return AnyPackExpansions;
4977QualType ASTContext::getFunctionTypeInternal(
4978 QualType ResultTy, ArrayRef<QualType> ArgArray,
4979 const FunctionProtoType::ExtProtoInfo &EPI,
bool OnlyWantCanonical)
const {
4980 size_t NumArgs = ArgArray.size();
4984 llvm::FoldingSetNodeID
ID;
4989 bool Unique =
false;
4991 void *InsertPos =
nullptr;
4992 if (FunctionProtoType *FPT =
4993 FunctionProtoTypes.FindNodeOrInsertPos(ID, InsertPos)) {
4994 QualType Existing = QualType(FPT, 0);
5013 bool IsCanonicalExceptionSpec =
5017 bool isCanonical = !Unique && IsCanonicalExceptionSpec &&
5019 for (
unsigned i = 0; i != NumArgs && isCanonical; ++i)
5020 if (!ArgArray[i].isCanonicalAsParam())
5021 isCanonical =
false;
5023 if (OnlyWantCanonical)
5024 assert(isCanonical &&
5025 "given non-canonical parameters constructing canonical type");
5030 if (!isCanonical && Canonical.
isNull()) {
5031 SmallVector<QualType, 16> CanonicalArgs;
5032 CanonicalArgs.reserve(NumArgs);
5033 for (
unsigned i = 0; i != NumArgs; ++i)
5036 llvm::SmallVector<QualType, 8> ExceptionTypeStorage;
5037 FunctionProtoType::ExtProtoInfo CanonicalEPI = EPI;
5040 if (IsCanonicalExceptionSpec) {
5042 }
else if (NoexceptInType) {
5055 bool AnyPacks =
false;
5057 if (ET->
getAs<PackExpansionType>())
5078 llvm_unreachable(
"dependent noexcept is already canonical");
5081 CanonicalEPI.
ExceptionSpec = FunctionProtoType::ExceptionSpecInfo();
5087 getFunctionTypeInternal(CanResultTy, CanonicalArgs, CanonicalEPI,
true);
5090 FunctionProtoType *NewIP =
5091 FunctionProtoTypes.FindNodeOrInsertPos(ID, InsertPos);
5092 assert(!NewIP &&
"Shouldn't be in the map!"); (void)NewIP;
5097 auto ESH = FunctionProtoType::getExceptionSpecSize(
5099 size_t Size = FunctionProtoType::totalSizeToAlloc<
5100 QualType, SourceLocation, FunctionType::FunctionTypeExtraBitfields,
5101 FunctionType::FunctionTypeExtraAttributeInfo,
5102 FunctionType::FunctionTypeArmAttributes, FunctionType::ExceptionType,
5103 Expr *, FunctionDecl *, FunctionProtoType::ExtParameterInfo, Qualifiers,
5104 FunctionEffect, EffectConditionExpr>(
5108 ESH.NumExprPtr, ESH.NumFunctionDeclPtr,
5113 auto *FTP = (FunctionProtoType *)
Allocate(Size,
alignof(FunctionProtoType));
5114 FunctionProtoType::ExtProtoInfo newEPI = EPI;
5115 new (FTP) FunctionProtoType(ResultTy, ArgArray, Canonical, newEPI);
5116 Types.push_back(FTP);
5118 FunctionProtoTypes.InsertNode(FTP, InsertPos);
5120 AnyFunctionEffects =
true;
5121 return QualType(FTP, 0);
5124QualType ASTContext::getPipeType(QualType
T,
bool ReadOnly)
const {
5125 llvm::FoldingSetNodeID
ID;
5128 void *InsertPos =
nullptr;
5129 if (PipeType *PT = PipeTypes.FindNodeOrInsertPos(ID, InsertPos))
5130 return QualType(PT, 0);
5135 if (!
T.isCanonical()) {
5139 PipeType *NewIP = PipeTypes.FindNodeOrInsertPos(ID, InsertPos);
5140 assert(!NewIP &&
"Shouldn't be in the map!");
5143 auto *
New =
new (*
this,
alignof(PipeType)) PipeType(
T, Canonical, ReadOnly);
5144 Types.push_back(
New);
5145 PipeTypes.InsertNode(
New, InsertPos);
5146 return QualType(
New, 0);
5156 return getPipeType(
T,
true);
5160 return getPipeType(
T,
false);
5164 llvm::FoldingSetNodeID ID;
5167 void *InsertPos =
nullptr;
5168 if (
BitIntType *EIT = BitIntTypes.FindNodeOrInsertPos(ID, InsertPos))
5172 BitIntTypes.InsertNode(
New, InsertPos);
5173 Types.push_back(
New);
5178 Expr *NumBitsExpr)
const {
5180 llvm::FoldingSetNodeID ID;
5183 void *InsertPos =
nullptr;
5185 DependentBitIntTypes.FindNodeOrInsertPos(ID, InsertPos))
5190 DependentBitIntTypes.InsertNode(
New, InsertPos);
5192 Types.push_back(
New);
5200 if (
auto *Target = PredefinedSugarTypes[llvm::to_underlying(KD)];
5212 return Ctx.getFromTargetType(Ctx.Target->
getSizeType());
5213 case Kind::SignedSizeT:
5215 case Kind::PtrdiffT:
5218 llvm_unreachable(
"unexpected kind");
5223 Types.push_back(
New);
5224 PredefinedSugarTypes[llvm::to_underlying(KD)] =
New;
5231 if (
auto *Tag = dyn_cast<TagDecl>(
Decl))
5234 if (
auto *
Typedef = dyn_cast<TypedefNameDecl>(
Decl))
5236 if (
auto *UD = dyn_cast<UnresolvedUsingTypenameDecl>(
Decl))
5245 if (
auto *Tag = dyn_cast<TagDecl>(TD))
5247 if (
auto *TN = dyn_cast<TypedefNameDecl>(TD))
5249 if (
const auto *UD = dyn_cast<UnresolvedUsingTypenameDecl>(TD))
5251 assert(TD->TypeForDecl);
5256 if (
const auto *TD = dyn_cast<TagDecl>(
Decl))
5258 if (
const auto *TD = dyn_cast<TypedefNameDecl>(
Decl);
5259 isa_and_nonnull<TypedefDecl, TypeAliasDecl>(TD))
5262 if (
const auto *Using = dyn_cast<UnresolvedUsingTypenameDecl>(
Decl))
5265 assert(
Decl->TypeForDecl);
5275 std::optional<bool> TypeMatchesDeclOrNone)
const {
5276 if (!TypeMatchesDeclOrNone) {
5277 QualType DeclUnderlyingType =
Decl->getUnderlyingType();
5278 assert(!DeclUnderlyingType.
isNull());
5279 if (UnderlyingType.
isNull())
5280 UnderlyingType = DeclUnderlyingType;
5282 assert(
hasSameType(UnderlyingType, DeclUnderlyingType));
5283 TypeMatchesDeclOrNone = UnderlyingType == DeclUnderlyingType;
5287 assert(!UnderlyingType.
isNull());
5291 *TypeMatchesDeclOrNone) {
5292 if (
Decl->TypeForDecl)
5297 !*TypeMatchesDeclOrNone);
5299 Types.push_back(NewType);
5300 Decl->TypeForDecl = NewType;
5304 llvm::FoldingSetNodeID ID;
5306 *TypeMatchesDeclOrNone ?
QualType() : UnderlyingType);
5308 void *InsertPos =
nullptr;
5310 TypedefTypes.FindNodeOrInsertPos(ID, InsertPos))
5311 return QualType(Placeholder->getType(), 0);
5316 1, !!Qualifier, !*TypeMatchesDeclOrNone),
5320 UnderlyingType, !*TypeMatchesDeclOrNone);
5321 auto *Placeholder =
new (NewType->getFoldingSetPlaceholder())
5323 TypedefTypes.InsertNode(Placeholder, InsertPos);
5324 Types.push_back(NewType);
5333 if (UnderlyingType.
isNull()) {
5341 llvm::FoldingSetNodeID ID;
5344 void *InsertPos =
nullptr;
5345 if (
const UsingType *
T = UsingTypes.FindNodeOrInsertPos(ID, InsertPos))
5355 Allocate(UsingType::totalSizeToAlloc<NestedNameSpecifier>(!!Qualifier),
5359 UsingTypes.InsertNode(
T, InsertPos);
5365 const TagDecl *TD,
bool OwnsTag,
5367 const Type *CanonicalType,
5368 bool WithFoldingSetNode)
const {
5369 auto [TC, Size] = [&] {
5372 static_assert(
alignof(EnumType) ==
alignof(TagType));
5373 return std::make_tuple(Type::Enum,
sizeof(EnumType));
5374 case Decl::ClassTemplatePartialSpecialization:
5375 case Decl::ClassTemplateSpecialization:
5376 case Decl::CXXRecord:
5377 static_assert(
alignof(RecordType) ==
alignof(TagType));
5378 static_assert(
alignof(InjectedClassNameType) ==
alignof(TagType));
5380 return std::make_tuple(Type::InjectedClassName,
5381 sizeof(InjectedClassNameType));
5384 return std::make_tuple(Type::Record,
sizeof(RecordType));
5386 llvm_unreachable(
"unexpected decl kind");
5396 if (WithFoldingSetNode) {
5404 sizeof(TagTypeFoldingSetPlaceholder) +
5405 TagTypeFoldingSetPlaceholder::getOffset() + Size,
5406 std::max(
alignof(TagTypeFoldingSetPlaceholder),
alignof(TagType)));
5407 auto *
T =
new (Mem) TagTypeFoldingSetPlaceholder();
5408 Mem =
T->getTagType();
5410 Mem =
Allocate(Size,
alignof(TagType));
5413 auto *
T = [&, TC = TC]() -> TagType * {
5417 auto *
T =
new (Mem) EnumType(TC,
Keyword, Qualifier, TD, OwnsTag,
5418 IsInjected, CanonicalType);
5419 assert(
reinterpret_cast<void *
>(
T) ==
5420 reinterpret_cast<void *
>(
static_cast<TagType *
>(
T)) &&
5421 "TagType must be the first base of EnumType");
5424 case Type::Record: {
5426 auto *
T =
new (Mem) RecordType(TC,
Keyword, Qualifier, TD, OwnsTag,
5427 IsInjected, CanonicalType);
5428 assert(
reinterpret_cast<void *
>(
T) ==
5429 reinterpret_cast<void *
>(
static_cast<TagType *
>(
T)) &&
5430 "TagType must be the first base of RecordType");
5433 case Type::InjectedClassName: {
5434 auto *
T =
new (Mem) InjectedClassNameType(
Keyword, Qualifier, TD,
5435 IsInjected, CanonicalType);
5436 assert(
reinterpret_cast<void *
>(
T) ==
5437 reinterpret_cast<void *
>(
static_cast<TagType *
>(
T)) &&
5438 "TagType must be the first base of InjectedClassNameType");
5442 llvm_unreachable(
"unexpected type class");
5445 assert(
T->getKeyword() ==
Keyword);
5446 assert(
T->getQualifier() == Qualifier);
5447 assert(
T->getOriginalDecl() == TD);
5448 assert(
T->isInjected() == IsInjected);
5449 assert(
T->isTagOwned() == OwnsTag);
5458 if (
const auto *RD = dyn_cast<CXXRecordDecl>(TD);
5459 RD && RD->isInjectedClassName())
5466 if (TD->TypeForDecl)
5467 return TD->TypeForDecl->getCanonicalTypeUnqualified();
5469 const Type *CanonicalType = getTagTypeInternal(
5472 false,
false,
nullptr,
5474 TD->TypeForDecl = CanonicalType;
5480 const TagDecl *TD,
bool OwnsTag)
const {
5483 bool IsInjected = TD != NonInjectedTD;
5490 if (
Keyword == PreferredKeyword && !Qualifier && !OwnsTag) {
5491 if (
const Type *
T = TD->TypeForDecl;
T && !
T->isCanonicalUnqualified())
5497 std::nullopt, NonInjectedTD,
5498 false, IsInjected, CanonicalType,
5500 TD->TypeForDecl =
T;
5504 llvm::FoldingSetNodeID ID;
5505 TagTypeFoldingSetPlaceholder::Profile(ID,
Keyword, Qualifier, NonInjectedTD,
5506 OwnsTag, IsInjected);
5508 void *InsertPos =
nullptr;
5509 if (TagTypeFoldingSetPlaceholder *
T =
5510 TagTypes.FindNodeOrInsertPos(ID, InsertPos))
5515 getTagTypeInternal(
Keyword, Qualifier, NonInjectedTD, OwnsTag, IsInjected,
5516 CanonicalType,
true);
5517 TagTypes.InsertNode(TagTypeFoldingSetPlaceholder::fromTagType(
T), InsertPos);
5522 unsigned NumPositiveBits,
5525 unsigned IntWidth = Target->getIntWidth();
5526 unsigned CharWidth = Target->getCharWidth();
5527 unsigned ShortWidth = Target->getShortWidth();
5528 bool EnumTooLarge =
false;
5530 if (NumNegativeBits) {
5534 if (IsPacked && NumNegativeBits <= CharWidth &&
5535 NumPositiveBits < CharWidth) {
5537 BestWidth = CharWidth;
5538 }
else if (IsPacked && NumNegativeBits <= ShortWidth &&
5539 NumPositiveBits < ShortWidth) {
5541 BestWidth = ShortWidth;
5542 }
else if (NumNegativeBits <= IntWidth && NumPositiveBits < IntWidth) {
5544 BestWidth = IntWidth;
5546 BestWidth = Target->getLongWidth();
5548 if (NumNegativeBits <= BestWidth && NumPositiveBits < BestWidth) {
5551 BestWidth = Target->getLongLongWidth();
5553 if (NumNegativeBits > BestWidth || NumPositiveBits >= BestWidth)
5554 EnumTooLarge =
true;
5558 BestPromotionType = (BestWidth <= IntWidth ?
IntTy : BestType);
5563 if (IsPacked && NumPositiveBits <= CharWidth) {
5565 BestPromotionType =
IntTy;
5566 BestWidth = CharWidth;
5567 }
else if (IsPacked && NumPositiveBits <= ShortWidth) {
5569 BestPromotionType =
IntTy;
5570 BestWidth = ShortWidth;
5571 }
else if (NumPositiveBits <= IntWidth) {
5573 BestWidth = IntWidth;
5574 BestPromotionType = (NumPositiveBits == BestWidth || !LangOpts.CPlusPlus)
5577 }
else if (NumPositiveBits <= (BestWidth = Target->getLongWidth())) {
5579 BestPromotionType = (NumPositiveBits == BestWidth || !LangOpts.CPlusPlus)
5583 BestWidth = Target->getLongLongWidth();
5584 if (NumPositiveBits > BestWidth) {
5589 EnumTooLarge =
true;
5592 BestPromotionType = (NumPositiveBits == BestWidth || !LangOpts.CPlusPlus)
5597 return EnumTooLarge;
5601 assert((
T->isIntegralType(*
this) ||
T->isEnumeralType()) &&
5602 "Integral type required!");
5605 if (
Value.isUnsigned() ||
Value.isNonNegative()) {
5606 if (
T->isSignedIntegerOrEnumerationType())
5608 return Value.getActiveBits() <= BitWidth;
5610 return Value.getSignificantBits() <= BitWidth;
5616 const Type *CanonicalType)
const {
5618 UnresolvedUsingType::totalSizeToAlloc<
5620 !!InsertPos, !!Qualifier),
5624 auto *Placeholder =
new (
T->getFoldingSetPlaceholder())
5626 TypedefTypes.InsertNode(Placeholder, InsertPos);
5636 return D->TypeForDecl->getCanonicalTypeUnqualified();
5638 const Type *CanonicalType = getUnresolvedUsingTypeInternal(
5642 D->TypeForDecl = CanonicalType;
5651 if (
const Type *
T = D->TypeForDecl;
T && !
T->isCanonicalUnqualified())
5658 nullptr, CanonicalType);
5663 llvm::FoldingSetNodeID ID;
5666 void *InsertPos =
nullptr;
5668 UnresolvedUsingTypes.FindNodeOrInsertPos(ID, InsertPos))
5669 return QualType(Placeholder->getType(), 0);
5673 const Type *
T = getUnresolvedUsingTypeInternal(
Keyword, Qualifier, D,
5674 InsertPos, CanonicalType);
5682 llvm::FoldingSetNodeID id;
5683 AttributedType::Profile(
id, attrKind, modifiedType, equivalentType,
attr);
5685 void *insertPos =
nullptr;
5686 AttributedType *
type = AttributedTypes.FindNodeOrInsertPos(
id, insertPos);
5689 assert(!
attr ||
attr->getKind() == attrKind);
5692 type =
new (*
this,
alignof(AttributedType))
5693 AttributedType(canon, attrKind,
attr, modifiedType, equivalentType);
5695 Types.push_back(
type);
5696 AttributedTypes.InsertNode(
type, insertPos);
5709 switch (nullability) {
5725 llvm_unreachable(
"Unknown nullability kind");
5730 llvm::FoldingSetNodeID ID;
5731 BTFTagAttributedType::Profile(ID, Wrapped, BTFAttr);
5733 void *InsertPos =
nullptr;
5734 BTFTagAttributedType *Ty =
5735 BTFTagAttributedTypes.FindNodeOrInsertPos(ID, InsertPos);
5740 Ty =
new (*
this,
alignof(BTFTagAttributedType))
5741 BTFTagAttributedType(Canon, Wrapped, BTFAttr);
5743 Types.push_back(Ty);
5744 BTFTagAttributedTypes.InsertNode(Ty, InsertPos);
5751 const HLSLAttributedResourceType::Attributes &Attrs) {
5753 llvm::FoldingSetNodeID ID;
5754 HLSLAttributedResourceType::Profile(ID, Wrapped, Contained, Attrs);
5756 void *InsertPos =
nullptr;
5757 HLSLAttributedResourceType *Ty =
5758 HLSLAttributedResourceTypes.FindNodeOrInsertPos(ID, InsertPos);
5762 Ty =
new (*
this,
alignof(HLSLAttributedResourceType))
5763 HLSLAttributedResourceType(Wrapped, Contained, Attrs);
5765 Types.push_back(Ty);
5766 HLSLAttributedResourceTypes.InsertNode(Ty, InsertPos);
5774 llvm::FoldingSetNodeID ID;
5775 HLSLInlineSpirvType::Profile(ID, Opcode, Size, Alignment, Operands);
5777 void *InsertPos =
nullptr;
5778 HLSLInlineSpirvType *Ty =
5779 HLSLInlineSpirvTypes.FindNodeOrInsertPos(ID, InsertPos);
5784 HLSLInlineSpirvType::totalSizeToAlloc<SpirvOperand>(Operands.size()),
5785 alignof(HLSLInlineSpirvType));
5787 Ty =
new (Mem) HLSLInlineSpirvType(Opcode, Size, Alignment, Operands);
5789 Types.push_back(Ty);
5790 HLSLInlineSpirvTypes.InsertNode(Ty, InsertPos);
5797 Decl *AssociatedDecl,
5801 llvm::FoldingSetNodeID ID;
5802 SubstTemplateTypeParmType::Profile(ID, Replacement, AssociatedDecl, Index,
5804 void *InsertPos =
nullptr;
5805 SubstTemplateTypeParmType *SubstParm =
5806 SubstTemplateTypeParmTypes.FindNodeOrInsertPos(ID, InsertPos);
5809 void *Mem =
Allocate(SubstTemplateTypeParmType::totalSizeToAlloc<QualType>(
5810 !Replacement.isCanonical()),
5811 alignof(SubstTemplateTypeParmType));
5812 SubstParm =
new (Mem) SubstTemplateTypeParmType(Replacement, AssociatedDecl,
5813 Index, PackIndex, Final);
5814 Types.push_back(SubstParm);
5815 SubstTemplateTypeParmTypes.InsertNode(SubstParm, InsertPos);
5823 unsigned Index,
bool Final,
5830 llvm::FoldingSetNodeID ID;
5831 SubstTemplateTypeParmPackType::Profile(ID, AssociatedDecl, Index, Final,
5833 void *InsertPos =
nullptr;
5834 if (SubstTemplateTypeParmPackType *SubstParm =
5835 SubstTemplateTypeParmPackTypes.FindNodeOrInsertPos(ID, InsertPos))
5845 [[maybe_unused]]
const auto *Nothing =
5846 SubstTemplateTypeParmPackTypes.FindNodeOrInsertPos(ID, InsertPos);
5851 auto *SubstParm =
new (*
this,
alignof(SubstTemplateTypeParmPackType))
5852 SubstTemplateTypeParmPackType(Canon, AssociatedDecl, Index, Final,
5854 Types.push_back(SubstParm);
5855 SubstTemplateTypeParmPackTypes.InsertNode(SubstParm, InsertPos);
5863 return P.getKind() == TemplateArgument::Type;
5865 "Pack contains a non-type");
5867 llvm::FoldingSetNodeID ID;
5868 SubstBuiltinTemplatePackType::Profile(ID, ArgPack);
5870 void *InsertPos =
nullptr;
5872 SubstBuiltinTemplatePackTypes.FindNodeOrInsertPos(ID, InsertPos))
5881 [[maybe_unused]]
const auto *Nothing =
5882 SubstBuiltinTemplatePackTypes.FindNodeOrInsertPos(ID, InsertPos);
5886 auto *PackType =
new (*
this,
alignof(SubstBuiltinTemplatePackType))
5887 SubstBuiltinTemplatePackType(Canon, ArgPack);
5888 Types.push_back(PackType);
5889 SubstBuiltinTemplatePackTypes.InsertNode(PackType, InsertPos);
5899 llvm::FoldingSetNodeID ID;
5900 TemplateTypeParmType::Profile(ID, Depth, Index, ParameterPack, TTPDecl);
5901 void *InsertPos =
nullptr;
5902 TemplateTypeParmType *TypeParm
5903 = TemplateTypeParmTypes.FindNodeOrInsertPos(ID, InsertPos);
5910 TypeParm =
new (*
this,
alignof(TemplateTypeParmType))
5911 TemplateTypeParmType(Depth, Index, ParameterPack, TTPDecl, Canon);
5913 TemplateTypeParmType *TypeCheck
5914 = TemplateTypeParmTypes.FindNodeOrInsertPos(ID, InsertPos);
5915 assert(!TypeCheck &&
"Template type parameter canonical type broken");
5918 TypeParm =
new (*
this,
alignof(TemplateTypeParmType)) TemplateTypeParmType(
5919 Depth, Index, ParameterPack,
nullptr,
QualType());
5921 Types.push_back(TypeParm);
5922 TemplateTypeParmTypes.InsertNode(TypeParm, InsertPos);
5948 llvm_unreachable(
"unexpected keyword kind");
5962 ElaboratedKeywordLoc, QualifierLoc, TemplateKeywordLoc, NameLoc,
5972 SpecifiedArgVec.reserve(SpecifiedArgs.size());
5974 SpecifiedArgVec.push_back(Arg.getArgument());
5977 CanonicalArgs, Underlying);
5980[[maybe_unused]]
static bool
5983 if (Arg.isPackExpansion())
5994 Template.getAsDependentTemplateName()));
5996 for (
const auto &Arg : Args)
6000 llvm::FoldingSetNodeID ID;
6003 void *InsertPos =
nullptr;
6004 if (
auto *
T = TemplateSpecializationTypes.FindNodeOrInsertPos(ID, InsertPos))
6007 void *Mem =
Allocate(
sizeof(TemplateSpecializationType) +
6009 alignof(TemplateSpecializationType));
6013 assert(Spec->isDependentType() &&
6014 "canonical template specialization must be dependent");
6015 Types.push_back(Spec);
6016 TemplateSpecializationTypes.InsertNode(Spec, InsertPos);
6024 const auto *TD =
Template.getAsTemplateDecl(
true);
6025 bool IsTypeAlias = TD && TD->isTypeAlias();
6026 if (Underlying.
isNull()) {
6033 bool NonCanonical =
Template != CanonTemplate ||
Keyword != CanonKeyword;
6035 if (CanonicalArgs.empty()) {
6038 CanonicalArgs = CanonArgsVec;
6040 NonCanonical |= !llvm::equal(
6041 SpecifiedArgs, CanonicalArgs,
6050 assert((!isa_and_nonnull<TypeAliasTemplateDecl>(TD) ||
6052 "Caller must compute aliased type");
6053 IsTypeAlias =
false;
6056 CanonKeyword, CanonTemplate, CanonicalArgs);
6060 void *Mem =
Allocate(
sizeof(TemplateSpecializationType) +
6062 (IsTypeAlias ?
sizeof(
QualType) : 0),
6063 alignof(TemplateSpecializationType));
6064 auto *Spec =
new (Mem) TemplateSpecializationType(
6066 Types.push_back(Spec);
6072 llvm::FoldingSetNodeID ID;
6075 void *InsertPos =
nullptr;
6076 ParenType *
T = ParenTypes.FindNodeOrInsertPos(ID, InsertPos);
6083 ParenType *CheckT = ParenTypes.FindNodeOrInsertPos(ID, InsertPos);
6084 assert(!CheckT &&
"Paren canonical type broken");
6090 ParenTypes.InsertNode(
T, InsertPos);
6103 Types.push_back(newType);
6110 llvm::FoldingSetNodeID ID;
6111 DependentNameType::Profile(ID,
Keyword, NNS, Name);
6113 void *InsertPos =
nullptr;
6114 if (DependentNameType *
T =
6115 DependentNameTypes.FindNodeOrInsertPos(ID, InsertPos))
6123 if (CanonKeyword !=
Keyword || CanonNNS != NNS) {
6125 [[maybe_unused]] DependentNameType *
T =
6126 DependentNameTypes.FindNodeOrInsertPos(ID, InsertPos);
6127 assert(!
T &&
"broken canonicalization");
6131 DependentNameType *
T =
new (*
this,
alignof(DependentNameType))
6132 DependentNameType(
Keyword, NNS, Name, Canon);
6134 DependentNameTypes.InsertNode(
T, InsertPos);
6140 if (
const auto *TTP = dyn_cast<TemplateTypeParmDecl>(Param)) {
6142 if (TTP->isParameterPack())
6146 }
else if (
auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(Param)) {
6148 NTTP->getType().getNonPackExpansionType().getNonLValueExprType(*
this);
6154 if (
T->isRecordType()) {
6163 Expr *E =
new (*this)
6165 T,
VK, NTTP->getLocation());
6167 if (NTTP->isParameterPack())
6173 std::nullopt,
false,
6175 if (TTP->isParameterPack())
6181 if (Param->isTemplateParameterPack())
6190 bool ExpectPackInType)
const {
6192 "Pack expansions must expand one or more parameter packs");
6194 llvm::FoldingSetNodeID ID;
6195 PackExpansionType::Profile(ID, Pattern, NumExpansions);
6197 void *InsertPos =
nullptr;
6198 PackExpansionType *
T = PackExpansionTypes.FindNodeOrInsertPos(ID, InsertPos);
6209 PackExpansionTypes.FindNodeOrInsertPos(ID, InsertPos);
6212 T =
new (*
this,
alignof(PackExpansionType))
6213 PackExpansionType(Pattern, Canon, NumExpansions);
6215 PackExpansionTypes.InsertNode(
T, InsertPos);
6227 if (Protocols.empty())
return true;
6232 for (
unsigned i = 1; i != Protocols.size(); ++i)
6242 llvm::array_pod_sort(Protocols.begin(), Protocols.end(),
CmpProtocolNames);
6246 P = P->getCanonicalDecl();
6249 auto ProtocolsEnd = llvm::unique(Protocols);
6250 Protocols.erase(ProtocolsEnd, Protocols.end());
6255 unsigned NumProtocols)
const {
6264 bool isKindOf)
const {
6267 if (typeArgs.empty() && protocols.empty() && !isKindOf &&
6272 llvm::FoldingSetNodeID ID;
6273 ObjCObjectTypeImpl::Profile(ID, baseType, typeArgs, protocols, isKindOf);
6274 void *InsertPos =
nullptr;
6275 if (
ObjCObjectType *QT = ObjCObjectTypes.FindNodeOrInsertPos(ID, InsertPos))
6282 if (effectiveTypeArgs.empty()) {
6284 effectiveTypeArgs = baseObject->getTypeArgs();
6291 bool typeArgsAreCanonical = llvm::all_of(
6294 if (!typeArgsAreCanonical || !protocolsSorted || !baseType.
isCanonical()) {
6298 if (!typeArgsAreCanonical) {
6299 canonTypeArgsVec.reserve(effectiveTypeArgs.size());
6300 for (
auto typeArg : effectiveTypeArgs)
6302 canonTypeArgs = canonTypeArgsVec;
6304 canonTypeArgs = effectiveTypeArgs;
6309 if (!protocolsSorted) {
6310 canonProtocolsVec.append(protocols.begin(), protocols.end());
6312 canonProtocols = canonProtocolsVec;
6314 canonProtocols = protocols;
6318 canonProtocols, isKindOf);
6321 ObjCObjectTypes.FindNodeOrInsertPos(ID, InsertPos);
6324 unsigned size =
sizeof(ObjCObjectTypeImpl);
6325 size += typeArgs.size() *
sizeof(
QualType);
6327 void *mem =
Allocate(size,
alignof(ObjCObjectTypeImpl));
6329 new (mem) ObjCObjectTypeImpl(canonical, baseType, typeArgs, protocols,
6333 ObjCObjectTypes.InsertNode(
T, InsertPos);
6343 bool allowOnPointerType)
const {
6346 if (
const auto *objT = dyn_cast<ObjCTypeParamType>(
type.getTypePtr())) {
6351 if (allowOnPointerType) {
6352 if (
const auto *objPtr =
6353 dyn_cast<ObjCObjectPointerType>(
type.getTypePtr())) {
6357 protocolsVec.append(objT->qual_begin(),
6359 protocolsVec.append(protocols.begin(), protocols.end());
6362 objT->getBaseType(),
6363 objT->getTypeArgsAsWritten(),
6365 objT->isKindOfTypeAsWritten());
6371 if (
const auto *objT = dyn_cast<ObjCObjectType>(
type.getTypePtr())){
6376 objT->getTypeArgsAsWritten(),
6378 objT->isKindOfTypeAsWritten());
6382 if (
type->isObjCObjectType()) {
6392 if (
type->isObjCIdType()) {
6395 objPtr->isKindOfType());
6400 if (
type->isObjCClassType()) {
6403 objPtr->isKindOfType());
6415 llvm::FoldingSetNodeID ID;
6416 ObjCTypeParamType::Profile(ID,
Decl,
Decl->getUnderlyingType(), protocols);
6417 void *InsertPos =
nullptr;
6418 if (ObjCTypeParamType *TypeParam =
6419 ObjCTypeParamTypes.FindNodeOrInsertPos(ID, InsertPos))
6424 if (!protocols.empty()) {
6428 Canonical, protocols, hasError,
true ));
6429 assert(!hasError &&
"Error when apply protocol qualifier to bound type");
6432 unsigned size =
sizeof(ObjCTypeParamType);
6434 void *mem =
Allocate(size,
alignof(ObjCTypeParamType));
6435 auto *newType =
new (mem) ObjCTypeParamType(
Decl, Canonical, protocols);
6437 Types.push_back(newType);
6438 ObjCTypeParamTypes.InsertNode(newType, InsertPos);
6448 protocols.append(NewTypeParamTy->qual_begin(), NewTypeParamTy->qual_end());
6463 for (
auto *Proto : OPT->quals()) {
6486 if (InheritedProtocols.empty())
6490 bool Conforms =
false;
6491 for (
auto *Proto : OPT->quals()) {
6493 for (
auto *PI : InheritedProtocols) {
6505 for (
auto *PI : InheritedProtocols) {
6507 bool Adopts =
false;
6508 for (
auto *Proto : OPT->quals()) {
6522 llvm::FoldingSetNodeID ID;
6525 void *InsertPos =
nullptr;
6527 ObjCObjectPointerTypes.FindNodeOrInsertPos(ID, InsertPos))
6536 ObjCObjectPointerTypes.FindNodeOrInsertPos(ID, InsertPos);
6545 Types.push_back(QType);
6546 ObjCObjectPointerTypes.InsertNode(QType, InsertPos);
6554 if (
Decl->TypeForDecl)
6558 assert(PrevDecl->TypeForDecl &&
"previous decl has no TypeForDecl");
6559 Decl->TypeForDecl = PrevDecl->TypeForDecl;
6560 return QualType(PrevDecl->TypeForDecl, 0);
6569 Decl->TypeForDecl =
T;
6582 llvm::FoldingSetNodeID ID;
6586 void *InsertPos =
nullptr;
6588 DependentTypeOfExprTypes.FindNodeOrInsertPos(ID, InsertPos);
6598 DependentTypeOfExprTypes.InsertNode(Canon, InsertPos);
6606 Types.push_back(toe);
6617 auto *tot =
new (*
this,
alignof(TypeOfType))
6618 TypeOfType(*
this, tofType, Canonical, Kind);
6619 Types.push_back(tot);
6643 llvm_unreachable(
"Unknown value kind");
6658 }
else if (!UnderlyingType.
isNull()) {
6661 llvm::FoldingSetNodeID ID;
6662 DependentDecltypeType::Profile(ID, *
this, E);
6664 void *InsertPos =
nullptr;
6665 if (DependentDecltypeType *Canon =
6666 DependentDecltypeTypes.FindNodeOrInsertPos(ID, InsertPos))
6671 new (*
this,
alignof(DependentDecltypeType)) DependentDecltypeType(E);
6672 DependentDecltypeTypes.InsertNode(DT, InsertPos);
6673 Types.push_back(DT);
6676 auto *DT =
new (*
this,
alignof(DecltypeType))
6677 DecltypeType(E, UnderlyingType, CanonType);
6678 Types.push_back(DT);
6683 bool FullySubstituted,
6687 if (FullySubstituted && Index) {
6690 llvm::FoldingSetNodeID ID;
6691 PackIndexingType::Profile(ID, *
this, Pattern.
getCanonicalType(), IndexExpr,
6692 FullySubstituted, Expansions);
6693 void *InsertPos =
nullptr;
6694 PackIndexingType *Canon =
6695 DependentPackIndexingTypes.FindNodeOrInsertPos(ID, InsertPos);
6698 PackIndexingType::totalSizeToAlloc<QualType>(Expansions.size()),
6702 IndexExpr, FullySubstituted, Expansions);
6703 DependentPackIndexingTypes.InsertNode(Canon, InsertPos);
6709 Allocate(PackIndexingType::totalSizeToAlloc<QualType>(Expansions.size()),
6711 auto *
T =
new (Mem) PackIndexingType(Canonical, Pattern, IndexExpr,
6712 FullySubstituted, Expansions);
6721 UnaryTransformType::UTTKind Kind)
const {
6723 llvm::FoldingSetNodeID ID;
6724 UnaryTransformType::Profile(ID, BaseType, UnderlyingType, Kind);
6726 void *InsertPos =
nullptr;
6727 if (UnaryTransformType *UT =
6728 UnaryTransformTypes.FindNodeOrInsertPos(ID, InsertPos))
6732 if (!BaseType->isDependentType()) {
6735 assert(UnderlyingType.
isNull() || BaseType == UnderlyingType);
6738 BaseType != CanonBase) {
6743 [[maybe_unused]] UnaryTransformType *UT =
6744 UnaryTransformTypes.FindNodeOrInsertPos(ID, InsertPos);
6745 assert(!UT &&
"broken canonicalization");
6749 auto *UT =
new (*
this,
alignof(UnaryTransformType))
6750 UnaryTransformType(BaseType, UnderlyingType, Kind, CanonType);
6751 UnaryTransformTypes.InsertNode(UT, InsertPos);
6752 Types.push_back(UT);
6756QualType ASTContext::getAutoTypeInternal(
6761 !TypeConstraintConcept && !IsDependent)
6765 llvm::FoldingSetNodeID ID;
6766 bool IsDeducedDependent =
6767 isa_and_nonnull<TemplateTemplateParmDecl>(TypeConstraintConcept) ||
6769 AutoType::Profile(ID, *
this, DeducedType,
Keyword,
6770 IsDependent || IsDeducedDependent, TypeConstraintConcept,
6771 TypeConstraintArgs);
6772 if (
auto const AT_iter = AutoTypes.find(ID); AT_iter != AutoTypes.end())
6773 return QualType(AT_iter->getSecond(), 0);
6777 if (!DeducedType.
isNull()) {
6779 }
else if (TypeConstraintConcept) {
6780 bool AnyNonCanonArgs =
false;
6781 auto *CanonicalConcept =
6784 *
this, TypeConstraintArgs, AnyNonCanonArgs);
6785 if (CanonicalConcept != TypeConstraintConcept || AnyNonCanonArgs) {
6787 CanonicalConcept, CanonicalConceptArgs,
6793 void *Mem =
Allocate(
sizeof(AutoType) +
6794 sizeof(TemplateArgument) * TypeConstraintArgs.size(),
6796 auto *AT =
new (Mem) AutoType(
6798 (IsDependent ? TypeDependence::DependentInstantiation
6799 : TypeDependence::None) |
6800 (IsPack ? TypeDependence::UnexpandedPack : TypeDependence::None),
6801 Canon, TypeConstraintConcept, TypeConstraintArgs);
6803 llvm::FoldingSetNodeID InsertedID;
6804 AT->Profile(InsertedID, *
this);
6805 assert(InsertedID == ID &&
"ID does not match");
6807 Types.push_back(AT);
6808 AutoTypes.try_emplace(ID, AT);
6809 return QualType(AT, 0);
6817 bool IsDependent,
bool IsPack,
6820 assert((!IsPack || IsDependent) &&
"only use IsPack for a dependent pack");
6821 assert((!IsDependent || DeducedType.
isNull()) &&
6822 "A dependent auto should be undeduced");
6823 return getAutoTypeInternal(DeducedType,
Keyword, IsDependent, IsPack,
6824 TypeConstraintConcept, TypeConstraintArgs);
6828 QualType CanonT =
T.getNonPackExpansionType().getCanonicalType();
6831 if (
auto *AT = CanonT->
getAs<AutoType>()) {
6832 if (!AT->isConstrained())
6836 AT->containsUnexpandedParameterPack()),
6848QualType ASTContext::getDeducedTemplateSpecializationTypeInternal(
6850 bool IsDependent,
QualType Canon)
const {
6852 void *InsertPos =
nullptr;
6853 llvm::FoldingSetNodeID ID;
6854 DeducedTemplateSpecializationType::Profile(ID,
Keyword,
Template, DeducedType,
6856 if (DeducedTemplateSpecializationType *DTST =
6857 DeducedTemplateSpecializationTypes.FindNodeOrInsertPos(ID, InsertPos))
6860 auto *DTST =
new (*
this,
alignof(DeducedTemplateSpecializationType))
6862 IsDependent, Canon);
6865 llvm::FoldingSetNodeID TempID;
6866 DTST->Profile(TempID);
6867 assert(ID == TempID &&
"ID does not match");
6869 Types.push_back(DTST);
6870 DeducedTemplateSpecializationTypes.InsertNode(DTST, InsertPos);
6879 bool IsDependent)
const {
6886 ? getDeducedTemplateSpecializationTypeInternal(
6890 return getDeducedTemplateSpecializationTypeInternal(
6899 llvm::FoldingSetNodeID ID;
6902 void *InsertPos =
nullptr;
6903 if (
AtomicType *AT = AtomicTypes.FindNodeOrInsertPos(ID, InsertPos))
6909 if (!
T.isCanonical()) {
6913 AtomicType *NewIP = AtomicTypes.FindNodeOrInsertPos(ID, InsertPos);
6914 assert(!NewIP &&
"Shouldn't be in the map!"); (void)NewIP;
6917 Types.push_back(
New);
6918 AtomicTypes.InsertNode(
New, InsertPos);
6949 return getFromTargetType(Target->getSizeType());
6968 return getFromTargetType(Target->getUnsignedPtrDiffType(
LangAS::Default));
6973 return getFromTargetType(Target->getIntMaxType());
6978 return getFromTargetType(Target->getUIntMaxType());
6996 return getFromTargetType(Target->getIntPtrType());
7006 return getFromTargetType(Target->getProcessIDType());
7018 const Type *Ty =
T.getTypePtr();
7046 quals = splitType.
Quals;
7051 QualType elementType = AT->getElementType();
7056 if (elementType == unqualElementType) {
7057 assert(quals.
empty());
7058 quals = splitType.
Quals;
7066 if (
const auto *CAT = dyn_cast<ConstantArrayType>(AT)) {
7068 CAT->getSizeExpr(), CAT->getSizeModifier(), 0);
7071 if (
const auto *IAT = dyn_cast<IncompleteArrayType>(AT)) {
7075 if (
const auto *VAT = dyn_cast<VariableArrayType>(AT)) {
7077 VAT->getSizeModifier(),
7078 VAT->getIndexTypeCVRQualifiers());
7083 DSAT->getSizeModifier(), 0);
7093 bool AllowPiMismatch)
const {
7108 if (
auto *CAT1 = dyn_cast<ConstantArrayType>(AT1)) {
7109 auto *CAT2 = dyn_cast<ConstantArrayType>(AT2);
7110 if (!((CAT2 && CAT1->getSize() == CAT2->getSize()) ||
7123 T1 = AT1->getElementType();
7124 T2 = AT2->getElementType();
7144 bool AllowPiMismatch)
const {
7149 if (T1PtrType && T2PtrType) {
7157 T1MPType && T2MPType) {
7158 if (
auto *RD1 = T1MPType->getMostRecentCXXRecordDecl(),
7159 *RD2 = T2MPType->getMostRecentCXXRecordDecl();
7160 RD1 != RD2 && RD1->getCanonicalDecl() != RD2->getCanonicalDecl())
7162 if (T1MPType->getQualifier().getCanonical() !=
7163 T2MPType->getQualifier().getCanonical())
7173 if (T1OPType && T2OPType) {
7205 if (Quals1 != Quals2)
7275 llvm_unreachable(
"bad template name kind!");
7281 if (!TP->hasDefaultArgument())
7283 return &TP->getDefaultArgument().getArgument();
7286 case NamedDecl::TemplateTypeParm:
7288 case NamedDecl::NonTypeTemplateParm:
7290 case NamedDecl::TemplateTemplateParm:
7293 llvm_unreachable(
"Unexpected template parameter kind");
7298 bool IgnoreDeduced)
const {
7299 while (std::optional<TemplateName> UnderlyingOrNone =
7301 Name = *UnderlyingOrNone;
7306 if (
auto *TTP = dyn_cast<TemplateTemplateParmDecl>(
Template))
7315 llvm_unreachable(
"cannot canonicalize unresolved template");
7319 assert(DTN &&
"Non-dependent template names must refer to template decls.");
7338 assert(IgnoreDeduced ==
false);
7345 bool NonCanonical = CanonUnderlying != Underlying;
7351 assert(CanonArgs.size() <= Params.size());
7357 for (
int I = CanonArgs.size() - 1; I >= 0; --I) {
7366 if (I ==
int(CanonArgs.size() - 1))
7367 CanonArgs.pop_back();
7368 NonCanonical =
true;
7378 llvm_unreachable(
"always sugar node");
7381 llvm_unreachable(
"bad template name!");
7386 bool IgnoreDeduced)
const {
7407 llvm::FoldingSetNodeID XCEID, YCEID;
7408 XCE->
Profile(XCEID, *
this,
true,
true);
7409 YCE->
Profile(YCEID, *
this,
true,
true);
7410 return XCEID == YCEID;
7459 if (
auto *TX = dyn_cast<TemplateTypeParmDecl>(
X)) {
7461 if (TX->isParameterPack() != TY->isParameterPack())
7463 if (TX->hasTypeConstraint() != TY->hasTypeConstraint())
7466 TY->getTypeConstraint());
7469 if (
auto *TX = dyn_cast<NonTypeTemplateParmDecl>(
X)) {
7471 return TX->isParameterPack() == TY->isParameterPack() &&
7472 TX->getASTContext().hasSameType(TX->getType(), TY->getType()) &&
7474 TY->getPlaceholderTypeConstraint());
7479 return TX->isParameterPack() == TY->isParameterPack() &&
7481 TY->getTemplateParameters());
7486 if (
X->size() != Y->
size())
7489 for (
unsigned I = 0, N =
X->size(); I != N; ++I)
7503 if (
auto *TTPX = dyn_cast<TemplateTypeParmDecl>(
X)) {
7505 if (!TTPX->hasDefaultArgument() || !TTPY->hasDefaultArgument())
7508 return hasSameType(TTPX->getDefaultArgument().getArgument().getAsType(),
7509 TTPY->getDefaultArgument().getArgument().getAsType());
7512 if (
auto *NTTPX = dyn_cast<NonTypeTemplateParmDecl>(
X)) {
7514 if (!NTTPX->hasDefaultArgument() || !NTTPY->hasDefaultArgument())
7517 Expr *DefaultArgumentX =
7518 NTTPX->getDefaultArgument().getArgument().getAsExpr()->
IgnoreImpCasts();
7519 Expr *DefaultArgumentY =
7520 NTTPY->getDefaultArgument().getArgument().getAsExpr()->
IgnoreImpCasts();
7521 llvm::FoldingSetNodeID XID, YID;
7522 DefaultArgumentX->
Profile(XID, *
this,
true);
7523 DefaultArgumentY->
Profile(YID, *
this,
true);
7530 if (!TTPX->hasDefaultArgument() || !TTPY->hasDefaultArgument())
7545 auto Kind =
X.getKind();
7553 auto [NamespaceX, PrefixX] =
X.getAsNamespaceAndPrefix();
7556 NamespaceY->getNamespace()))
7561 const auto *TX =
X.getAsType(), *TY = Y.
getAsType();
7562 if (TX->getCanonicalTypeInternal() != TY->getCanonicalTypeInternal())
7571 llvm_unreachable(
"unhandled qualifier kind");
7577 if (A->
hasAttr<CUDADeviceAttr>() != B->
hasAttr<CUDADeviceAttr>())
7579 if (A->
hasAttr<CUDADeviceAttr>() && B->
hasAttr<CUDADeviceAttr>())
7591 llvm::FoldingSetNodeID Cand1ID, Cand2ID;
7595 for (
auto Pair : zip_longest(AEnableIfAttrs, BEnableIfAttrs)) {
7596 std::optional<EnableIfAttr *> Cand1A = std::get<0>(Pair);
7597 std::optional<EnableIfAttr *> Cand2A = std::get<1>(Pair);
7600 if (!Cand1A || !Cand2A)
7606 (*Cand1A)->getCond()->Profile(Cand1ID, A->
getASTContext(),
true);
7607 (*Cand2A)->getCond()->Profile(Cand2ID, B->
getASTContext(),
true);
7611 if (Cand1ID != Cand2ID)
7645 if (
const auto *TypedefX = dyn_cast<TypedefNameDecl>(
X))
7646 if (
const auto *TypedefY = dyn_cast<TypedefNameDecl>(Y))
7648 TypedefY->getUnderlyingType());
7665 if (
const auto *TagX = dyn_cast<TagDecl>(
X)) {
7667 return (TagX->getTagKind() == TagY->getTagKind()) ||
7679 if (
const auto *FuncX = dyn_cast<FunctionDecl>(
X)) {
7681 if (
const auto *CtorX = dyn_cast<CXXConstructorDecl>(
X)) {
7683 if (CtorX->getInheritedConstructor() &&
7684 !
isSameEntity(CtorX->getInheritedConstructor().getConstructor(),
7685 CtorY->getInheritedConstructor().getConstructor()))
7689 if (FuncX->isMultiVersion() != FuncY->isMultiVersion())
7694 if (FuncX->isMultiVersion()) {
7695 const auto *TAX = FuncX->getAttr<TargetAttr>();
7696 const auto *TAY = FuncY->getAttr<TargetAttr>();
7697 assert(TAX && TAY &&
"Multiversion Function without target attribute");
7699 if (TAX->getFeaturesStr() != TAY->getFeaturesStr())
7705 if ((FuncX->isMemberLikeConstrainedFriend() ||
7706 FuncY->isMemberLikeConstrainedFriend()) &&
7707 !FuncX->getLexicalDeclContext()->Equals(
7708 FuncY->getLexicalDeclContext())) {
7713 FuncY->getTrailingRequiresClause()))
7721 FD = FD->getCanonicalDecl();
7722 return FD->getTypeSourceInfo() ? FD->getTypeSourceInfo()->getType()
7725 QualType XT = GetTypeAsWritten(FuncX), YT = GetTypeAsWritten(FuncY);
7740 return FuncX->getLinkageInternal() == FuncY->getLinkageInternal() &&
7745 if (
const auto *VarX = dyn_cast<VarDecl>(
X)) {
7747 if (VarX->getLinkageInternal() == VarY->getLinkageInternal()) {
7750 if (VarX->getType().isNull() || VarY->getType().isNull())
7753 if (
hasSameType(VarX->getType(), VarY->getType()))
7763 if (!VarXTy || !VarYTy)
7772 if (
const auto *NamespaceX = dyn_cast<NamespaceDecl>(
X)) {
7774 return NamespaceX->isInline() == NamespaceY->isInline();
7779 if (
const auto *TemplateX = dyn_cast<TemplateDecl>(
X)) {
7783 if (
const auto *ConceptX = dyn_cast<ConceptDecl>(
X)) {
7786 ConceptY->getConstraintExpr()))
7791 TemplateY->getTemplatedDecl()) &&
7793 TemplateY->getTemplateParameters());
7797 if (
const auto *FDX = dyn_cast<FieldDecl>(
X)) {
7800 return hasSameType(FDX->getType(), FDY->getType());
7804 if (
const auto *IFDX = dyn_cast<IndirectFieldDecl>(
X)) {
7806 return IFDX->getAnonField()->getCanonicalDecl() ==
7807 IFDY->getAnonField()->getCanonicalDecl();
7816 if (
const auto *USX = dyn_cast<UsingShadowDecl>(
X)) {
7823 if (
const auto *UX = dyn_cast<UsingDecl>(
X)) {
7826 UX->hasTypename() == UY->hasTypename() &&
7827 UX->isAccessDeclaration() == UY->isAccessDeclaration();
7829 if (
const auto *UX = dyn_cast<UnresolvedUsingValueDecl>(
X)) {
7832 UX->isAccessDeclaration() == UY->isAccessDeclaration();
7834 if (
const auto *UX = dyn_cast<UnresolvedUsingTypenameDecl>(
X)) {
7842 if (
const auto *UX = dyn_cast<UsingPackDecl>(
X)) {
7844 UX->getInstantiatedFromUsingDecl(),
7849 if (
const auto *NAX = dyn_cast<NamespaceAliasDecl>(
X)) {
7851 return NAX->getNamespace()->Equals(NAY->getNamespace());
7899 bool AnyNonCanonArgs =
false;
7902 if (!AnyNonCanonArgs)
7912 llvm_unreachable(
"Unhandled template argument kind");
7922 llvm_unreachable(
"Comparing NULL template argument");
7947 llvm::FoldingSetNodeID ID1, ID2;
7957 return isSameTemplateArgument(Arg1, Arg2);
7961 llvm_unreachable(
"Unhandled template argument kind");
7966 if (!
T.hasLocalQualifiers()) {
7968 if (
const auto *AT = dyn_cast<ArrayType>(
T))
7988 const auto *ATy = dyn_cast<ArrayType>(split.
Ty);
7989 if (!ATy || qs.
empty())
7996 if (
const auto *CAT = dyn_cast<ConstantArrayType>(ATy))
7999 CAT->getSizeModifier(),
8000 CAT->getIndexTypeCVRQualifiers()));
8001 if (
const auto *IAT = dyn_cast<IncompleteArrayType>(ATy))
8003 IAT->getSizeModifier(),
8004 IAT->getIndexTypeCVRQualifiers()));
8006 if (
const auto *DSAT = dyn_cast<DependentSizedArrayType>(ATy))
8008 NewEltTy, DSAT->getSizeExpr(), DSAT->getSizeModifier(),
8009 DSAT->getIndexTypeCVRQualifiers()));
8014 VAT->getIndexTypeCVRQualifiers()));
8020 if (
T->isArrayType() ||
T->isFunctionType())
8028 return T.getUnqualifiedType();
8039 if (
T->isArrayType() ||
T->isFunctionType())
8041 return T.getUnqualifiedType();
8056 assert(PrettyArrayType &&
"Not an array type!");
8093 uint64_t ElementCount = 1;
8096 CA = dyn_cast_or_null<ConstantArrayType>(
8099 return ElementCount;
8107 uint64_t ElementCount = 1;
8111 AILE = dyn_cast<ArrayInitLoopExpr>(AILE->
getSubExpr());
8114 return ElementCount;
8124 default: llvm_unreachable(
"getFloatingRank(): not a floating type");
8126 case BuiltinType::Half:
return HalfRank;
8127 case BuiltinType::Float:
return FloatRank;
8160unsigned ASTContext::getIntegerRank(
const Type *
T)
const {
8161 assert(
T->isCanonicalUnqualified() &&
"T should be canonicalized");
8165 if (
const auto *EIT = dyn_cast<BitIntType>(
T))
8166 return 0 + (EIT->getNumBits() << 3);
8169 default: llvm_unreachable(
"getIntegerRank(): not a built-in integer");
8170 case BuiltinType::Bool:
8172 case BuiltinType::Char_S:
8173 case BuiltinType::Char_U:
8174 case BuiltinType::SChar:
8175 case BuiltinType::UChar:
8177 case BuiltinType::Short:
8178 case BuiltinType::UShort:
8180 case BuiltinType::Int:
8181 case BuiltinType::UInt:
8183 case BuiltinType::Long:
8184 case BuiltinType::ULong:
8186 case BuiltinType::LongLong:
8187 case BuiltinType::ULongLong:
8189 case BuiltinType::Int128:
8190 case BuiltinType::UInt128:
8195 case BuiltinType::Char8:
8197 case BuiltinType::Char16:
8198 return getIntegerRank(
8200 case BuiltinType::Char32:
8201 return getIntegerRank(
8203 case BuiltinType::WChar_S:
8204 case BuiltinType::WChar_U:
8205 return getIntegerRank(
8235 uint64_t BitWidth = Field->getBitWidthValue();
8261 if (BitWidth < IntSize)
8264 if (BitWidth == IntSize)
8279 assert(!Promotable.
isNull());
8282 return ED->getPromotionType();
8291 if (BT->getKind() == BuiltinType::WChar_S ||
8292 BT->getKind() == BuiltinType::WChar_U ||
8293 BT->getKind() == BuiltinType::Char8 ||
8294 BT->getKind() == BuiltinType::Char16 ||
8295 BT->getKind() == BuiltinType::Char32) {
8296 bool FromIsSigned = BT->getKind() == BuiltinType::WChar_S;
8300 for (
const auto &PT : PromoteTypes) {
8302 if (FromSize < ToSize ||
8303 (FromSize == ToSize && FromIsSigned == PT->isSignedIntegerType()))
8306 llvm_unreachable(
"char type should fit into long long");
8313 uint64_t PromotableSize =
getIntWidth(Promotable);
8322 while (!
T.isNull()) {
8324 return T.getObjCLifetime();
8325 if (
T->isArrayType())
8328 T = PT->getPointeeType();
8330 T = RT->getPointeeType();
8355 if (
const auto *ET = dyn_cast<EnumType>(LHSC))
8357 if (
const auto *ET = dyn_cast<EnumType>(RHSC))
8360 if (LHSC == RHSC)
return 0;
8365 unsigned LHSRank = getIntegerRank(LHSC);
8366 unsigned RHSRank = getIntegerRank(RHSC);
8368 if (LHSUnsigned == RHSUnsigned) {
8369 if (LHSRank == RHSRank)
return 0;
8370 return LHSRank > RHSRank ? 1 : -1;
8376 if (LHSRank >= RHSRank)
8386 if (RHSRank >= LHSRank)
8396 if (CFConstantStringTypeDecl)
8397 return CFConstantStringTypeDecl;
8399 assert(!CFConstantStringTagDecl &&
8400 "tag and typedef should be initialized together");
8402 CFConstantStringTagDecl->startDefinition();
8440 if (
static_cast<unsigned>(CFRuntime) <
8443 Fields[Count++] = {
IntTy,
"flags" };
8445 Fields[Count++] = {
LongTy,
"length" };
8449 Fields[Count++] = { getFromTargetType(Target->getUInt64Type()),
"_swift_rc" };
8453 Fields[Count++] = {
IntTy,
"_ptr" };
8459 for (
unsigned i = 0; i < Count; ++i) {
8463 Fields[i].Type,
nullptr,
8466 CFConstantStringTagDecl->addDecl(Field);
8469 CFConstantStringTagDecl->completeDefinition();
8473 CFConstantStringTypeDecl =
8476 return CFConstantStringTypeDecl;
8480 if (!CFConstantStringTagDecl)
8482 return CFConstantStringTagDecl;
8492 if (ObjCSuperType.isNull()) {
8497 return ObjCSuperType;
8503 CFConstantStringTagDecl = TT->castAsRecordDecl();
8507 if (BlockDescriptorType)
8520 static const char *
const FieldNames[] = {
8525 for (
size_t i = 0; i < 2; ++i) {
8528 &
Idents.get(FieldNames[i]), FieldTypes[i],
nullptr,
8536 BlockDescriptorType = RD;
8542 if (BlockDescriptorExtendedType)
8557 static const char *
const FieldNames[] = {
8564 for (
size_t i = 0; i < 4; ++i) {
8567 &
Idents.get(FieldNames[i]), FieldTypes[i],
nullptr,
8576 BlockDescriptorExtendedType = RD;
8581 const auto *BT = dyn_cast<BuiltinType>(
T);
8590 switch (BT->getKind()) {
8591#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
8592 case BuiltinType::Id: \
8594#include "clang/Basic/OpenCLImageTypes.def"
8596 case BuiltinType::OCLClkEvent:
8599 case BuiltinType::OCLEvent:
8602 case BuiltinType::OCLQueue:
8605 case BuiltinType::OCLReserveID:
8608 case BuiltinType::OCLSampler:
8627 if (!copyExpr && record->hasTrivialDestructor())
return false;
8658 llvm_unreachable(
"impossible");
8660 llvm_unreachable(
"fell out of lifetime switch!");
8668 bool &HasByrefExtendedLayout)
const {
8673 HasByrefExtendedLayout =
false;
8675 HasByrefExtendedLayout =
true;
8689 assert(Target &&
"Expected target to be initialized");
8690 const llvm::Triple &
T = Target->getTriple();
8692 if (
T.isOSWindows() &&
T.isArch64Bit())
8698 assert(Target &&
"Expected target to be initialized");
8699 const llvm::Triple &
T = Target->getTriple();
8701 if (
T.isOSWindows() &&
T.isArch64Bit())
8707 if (!ObjCInstanceTypeDecl)
8708 ObjCInstanceTypeDecl =
8710 return ObjCInstanceTypeDecl;
8716 if (
const auto *TT = dyn_cast<TypedefType>(
T))
8718 return II->isStr(
"BOOL");
8726 if (!
type->isIncompleteArrayType() &&
type->isIncompleteType())
8735 else if (
type->isArrayType())
8754 if (
First->isInlineSpecified() || !
First->isStaticDataMember())
8761 !D->isInlineSpecified() && (D->isConstexpr() ||
First->isConstexpr()))
8792 for (
auto *PI :
Decl->parameters()) {
8797 assert(sz.
isPositive() &&
"BlockExpr - Incomplete param type");
8806 ParmOffset = PtrSize;
8807 for (
auto *PVDecl :
Decl->parameters()) {
8808 QualType PType = PVDecl->getOriginalType();
8809 if (
const auto *AT =
8814 PType = PVDecl->getType();
8816 PType = PVDecl->getType();
8836 for (
auto *PI :
Decl->parameters()) {
8843 "getObjCEncodingForFunctionDecl - Incomplete param type");
8850 for (
auto *PVDecl :
Decl->parameters()) {
8851 QualType PType = PVDecl->getOriginalType();
8852 if (
const auto *AT =
8857 PType = PVDecl->getType();
8859 PType = PVDecl->getType();
8873 bool Extended)
const {
8877 ObjCEncOptions Options = ObjCEncOptions()
8878 .setExpandPointedToStructures()
8879 .setExpandStructures()
8880 .setIsOutermostType();
8882 Options.setEncodeBlockParameters().setEncodeClassNames();
8883 getObjCEncodingForTypeImpl(
T, S, Options,
nullptr);
8889 bool Extended)
const {
8894 Decl->getReturnType(), S, Extended);
8903 E =
Decl->sel_param_end(); PI != E; ++PI) {
8910 "getObjCEncodingForMethodDecl - Incomplete param type");
8918 ParmOffset = 2 * PtrSize;
8920 E =
Decl->sel_param_end(); PI != E; ++PI) {
8923 if (
const auto *AT =
8932 PType, S, Extended);
8943 const Decl *Container)
const {
8946 if (
const auto *CID = dyn_cast<ObjCCategoryImplDecl>(Container)) {
8947 for (
auto *PID : CID->property_impls())
8948 if (PID->getPropertyDecl() == PD)
8952 for (
auto *PID : OID->property_impls())
8953 if (PID->getPropertyDecl() == PD)
8987 const Decl *Container)
const {
8989 bool Dynamic =
false;
8997 SynthesizePID = PropertyImpDecl;
9001 std::string S =
"T";
9046 if (SynthesizePID) {
9063 if (BT->getKind() == BuiltinType::ULong &&
getIntWidth(PointeeTy) == 32)
9066 if (BT->getKind() == BuiltinType::Long &&
getIntWidth(PointeeTy) == 32)
9079 getObjCEncodingForTypeImpl(
T, S,
9081 .setExpandPointedToStructures()
9082 .setExpandStructures()
9083 .setIsOutermostType(),
9084 Field, NotEncodedT);
9088 std::string& S)
const {
9092 getObjCEncodingForTypeImpl(
T, S,
9094 .setExpandPointedToStructures()
9095 .setExpandStructures()
9096 .setIsOutermostType()
9097 .setEncodingProperty(),
9105 case BuiltinType::Void:
return 'v';
9106 case BuiltinType::Bool:
return 'B';
9107 case BuiltinType::Char8:
9108 case BuiltinType::Char_U:
9109 case BuiltinType::UChar:
return 'C';
9110 case BuiltinType::Char16:
9111 case BuiltinType::UShort:
return 'S';
9112 case BuiltinType::Char32:
9113 case BuiltinType::UInt:
return 'I';
9114 case BuiltinType::ULong:
9115 return C->getTargetInfo().getLongWidth() == 32 ?
'L' :
'Q';
9116 case BuiltinType::UInt128:
return 'T';
9117 case BuiltinType::ULongLong:
return 'Q';
9118 case BuiltinType::Char_S:
9119 case BuiltinType::SChar:
return 'c';
9120 case BuiltinType::Short:
return 's';
9121 case BuiltinType::WChar_S:
9122 case BuiltinType::WChar_U:
9123 case BuiltinType::Int:
return 'i';
9124 case BuiltinType::Long:
9125 return C->getTargetInfo().getLongWidth() == 32 ?
'l' :
'q';
9126 case BuiltinType::LongLong:
return 'q';
9127 case BuiltinType::Int128:
return 't';
9128 case BuiltinType::Float:
return 'f';
9129 case BuiltinType::Double:
return 'd';
9130 case BuiltinType::LongDouble:
return 'D';
9131 case BuiltinType::NullPtr:
return '*';
9133 case BuiltinType::BFloat16:
9134 case BuiltinType::Float16:
9135 case BuiltinType::Float128:
9136 case BuiltinType::Ibm128:
9137 case BuiltinType::Half:
9138 case BuiltinType::ShortAccum:
9139 case BuiltinType::Accum:
9140 case BuiltinType::LongAccum:
9141 case BuiltinType::UShortAccum:
9142 case BuiltinType::UAccum:
9143 case BuiltinType::ULongAccum:
9144 case BuiltinType::ShortFract:
9145 case BuiltinType::Fract:
9146 case BuiltinType::LongFract:
9147 case BuiltinType::UShortFract:
9148 case BuiltinType::UFract:
9149 case BuiltinType::ULongFract:
9150 case BuiltinType::SatShortAccum:
9151 case BuiltinType::SatAccum:
9152 case BuiltinType::SatLongAccum:
9153 case BuiltinType::SatUShortAccum:
9154 case BuiltinType::SatUAccum:
9155 case BuiltinType::SatULongAccum:
9156 case BuiltinType::SatShortFract:
9157 case BuiltinType::SatFract:
9158 case BuiltinType::SatLongFract:
9159 case BuiltinType::SatUShortFract:
9160 case BuiltinType::SatUFract:
9161 case BuiltinType::SatULongFract:
9165#define SVE_TYPE(Name, Id, SingletonId) \
9166 case BuiltinType::Id:
9167#include "clang/Basic/AArch64ACLETypes.def"
9168#define RVV_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
9169#include "clang/Basic/RISCVVTypes.def"
9170#define WASM_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
9171#include "clang/Basic/WebAssemblyReferenceTypes.def"
9172#define AMDGPU_TYPE(Name, Id, SingletonId, Width, Align) case BuiltinType::Id:
9173#include "clang/Basic/AMDGPUTypes.def"
9177 "cannot yet @encode type %0");
9182 case BuiltinType::ObjCId:
9183 case BuiltinType::ObjCClass:
9184 case BuiltinType::ObjCSel:
9185 llvm_unreachable(
"@encoding ObjC primitive type");
9188#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
9189 case BuiltinType::Id:
9190#include "clang/Basic/OpenCLImageTypes.def"
9191#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
9192 case BuiltinType::Id:
9193#include "clang/Basic/OpenCLExtensionTypes.def"
9194 case BuiltinType::OCLEvent:
9195 case BuiltinType::OCLClkEvent:
9196 case BuiltinType::OCLQueue:
9197 case BuiltinType::OCLReserveID:
9198 case BuiltinType::OCLSampler:
9199 case BuiltinType::Dependent:
9200#define PPC_VECTOR_TYPE(Name, Id, Size) \
9201 case BuiltinType::Id:
9202#include "clang/Basic/PPCTypes.def"
9203#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
9204#include "clang/Basic/HLSLIntangibleTypes.def"
9205#define BUILTIN_TYPE(KIND, ID)
9206#define PLACEHOLDER_TYPE(KIND, ID) \
9207 case BuiltinType::KIND:
9208#include "clang/AST/BuiltinTypes.def"
9209 llvm_unreachable(
"invalid builtin type for @encode");
9211 llvm_unreachable(
"invalid BuiltinType::Kind value");
9218 if (!
Enum->isFixed())
9228 assert(FD->
isBitField() &&
"not a bitfield - getObjCEncodingForTypeImpl");
9248 if (
const auto *IVD = dyn_cast<ObjCIvarDecl>(FD)) {
9256 S += llvm::utostr(Offset);
9258 if (
const auto *ET =
T->getAsCanonical<EnumType>())
9271 bool VisitBasesAndFields) {
9272 T =
T->getBaseElementTypeUnsafe();
9276 PT->getPointeeType().getTypePtr(),
false);
9278 auto *CXXRD =
T->getAsCXXRecordDecl();
9286 if (!CXXRD->hasDefinition() || !VisitBasesAndFields)
9289 for (
const auto &B : CXXRD->bases())
9294 for (
auto *FD : CXXRD->fields())
9303void ASTContext::getObjCEncodingForTypeImpl(QualType
T, std::string &S,
9304 const ObjCEncOptions Options,
9305 const FieldDecl *FD,
9306 QualType *NotEncodedT)
const {
9308 switch (CT->getTypeClass()) {
9313 if (
const auto *BT = dyn_cast<BuiltinType>(CT))
9321 getObjCEncodingForTypeImpl(
T->
castAs<ComplexType>()->getElementType(), S,
9328 getObjCEncodingForTypeImpl(
T->
castAs<AtomicType>()->getValueType(), S,
9335 case Type::LValueReference:
9336 case Type::RValueReference: {
9339 const auto *PT =
T->
castAs<PointerType>();
9340 if (PT->isObjCSelType()) {
9349 bool isReadOnly =
false;
9354 if (
T->
getAs<TypedefType>()) {
9355 if (Options.IsOutermostType() &&
T.isConstQualified()) {
9359 }
else if (Options.IsOutermostType()) {
9360 QualType P = PointeeTy;
9361 while (
auto PT = P->
getAs<PointerType>())
9372 if (StringRef(S).ends_with(
"nr"))
9373 S.replace(S.end()-2, S.end(),
"rn");
9383 }
else if (
const auto *RTy = PointeeTy->
getAsCanonical<RecordType>()) {
9384 const IdentifierInfo *II = RTy->getOriginalDecl()->getIdentifier();
9386 if (II == &
Idents.get(
"objc_class")) {
9391 if (II == &
Idents.get(
"objc_object")) {
9400 RTy, Options.ExpandPointedToStructures()))) {
9409 ObjCEncOptions NewOptions;
9410 if (Options.ExpandPointedToStructures())
9411 NewOptions.setExpandStructures();
9412 getObjCEncodingForTypeImpl(PointeeTy, S, NewOptions,
9413 nullptr, NotEncodedT);
9417 case Type::ConstantArray:
9418 case Type::IncompleteArray:
9419 case Type::VariableArray: {
9426 getObjCEncodingForTypeImpl(
9427 AT->getElementType(), S,
9428 Options.keepingOnly(ObjCEncOptions().setExpandStructures()), FD);
9432 if (
const auto *CAT = dyn_cast<ConstantArrayType>(AT))
9433 S += llvm::utostr(CAT->getZExtSize());
9437 "Unknown array type!");
9441 getObjCEncodingForTypeImpl(
9442 AT->getElementType(), S,
9443 Options.keepingOnly(ObjCEncOptions().setExpandStructures()), FD,
9450 case Type::FunctionNoProto:
9451 case Type::FunctionProto:
9455 case Type::Record: {
9457 S += RDecl->
isUnion() ?
'(' :
'{';
9461 if (
const auto *Spec = dyn_cast<ClassTemplateSpecializationDecl>(RDecl)) {
9462 const TemplateArgumentList &TemplateArgs = Spec->getTemplateArgs();
9463 llvm::raw_string_ostream
OS(S);
9464 printTemplateArgumentList(OS, TemplateArgs.
asArray(),
9470 if (Options.ExpandStructures()) {
9473 getObjCEncodingForStructureImpl(RDecl, S, FD,
true, NotEncodedT);
9475 for (
const auto *Field : RDecl->
fields()) {
9478 S +=
Field->getNameAsString();
9483 if (
Field->isBitField()) {
9484 getObjCEncodingForTypeImpl(
Field->getType(), S,
9485 ObjCEncOptions().setExpandStructures(),
9488 QualType qt =
Field->getType();
9490 getObjCEncodingForTypeImpl(
9492 ObjCEncOptions().setExpandStructures().setIsStructField(), FD,
9498 S += RDecl->
isUnion() ?
')' :
'}';
9502 case Type::BlockPointer: {
9503 const auto *BT =
T->
castAs<BlockPointerType>();
9505 if (Options.EncodeBlockParameters()) {
9506 const auto *FT = BT->getPointeeType()->castAs<FunctionType>();
9510 getObjCEncodingForTypeImpl(FT->getReturnType(), S,
9511 Options.forComponentType(), FD, NotEncodedT);
9515 if (
const auto *FPT = dyn_cast<FunctionProtoType>(FT)) {
9516 for (
const auto &I : FPT->param_types())
9517 getObjCEncodingForTypeImpl(I, S, Options.forComponentType(), FD,
9525 case Type::ObjCObject: {
9529 S +=
"{objc_object=}";
9533 S +=
"{objc_class=}";
9540 case Type::ObjCInterface: {
9543 ObjCInterfaceDecl *OI =
T->
castAs<ObjCObjectType>()->getInterface();
9546 if (Options.ExpandStructures()) {
9548 SmallVector<const ObjCIvarDecl*, 32> Ivars;
9550 for (
unsigned i = 0, e = Ivars.size(); i != e; ++i) {
9551 const FieldDecl *
Field = Ivars[i];
9552 if (
Field->isBitField())
9553 getObjCEncodingForTypeImpl(
Field->getType(), S,
9554 ObjCEncOptions().setExpandStructures(),
9557 getObjCEncodingForTypeImpl(
Field->getType(), S,
9558 ObjCEncOptions().setExpandStructures(), FD,
9566 case Type::ObjCObjectPointer: {
9567 const auto *OPT =
T->
castAs<ObjCObjectPointerType>();
9568 if (OPT->isObjCIdType()) {
9573 if (OPT->isObjCClassType() || OPT->isObjCQualifiedClassType()) {
9581 if (OPT->isObjCQualifiedIdType()) {
9582 getObjCEncodingForTypeImpl(
9584 Options.keepingOnly(ObjCEncOptions()
9585 .setExpandPointedToStructures()
9586 .setExpandStructures()),
9588 if (FD || Options.EncodingProperty() || Options.EncodeClassNames()) {
9592 for (
const auto *I : OPT->quals()) {
9594 S += I->getObjCRuntimeNameAsString();
9603 if (OPT->getInterfaceDecl() &&
9604 (FD || Options.EncodingProperty() || Options.EncodeClassNames())) {
9606 S += OPT->getInterfaceDecl()->getObjCRuntimeNameAsString();
9607 for (
const auto *I : OPT->quals()) {
9609 S += I->getObjCRuntimeNameAsString();
9619 case Type::MemberPointer:
9623 case Type::ExtVector:
9629 case Type::ConstantMatrix:
9642 case Type::DeducedTemplateSpecialization:
9645 case Type::HLSLAttributedResource:
9646 case Type::HLSLInlineSpirv:
9647 llvm_unreachable(
"unexpected type");
9649 case Type::ArrayParameter:
9651#define ABSTRACT_TYPE(KIND, BASE)
9652#define TYPE(KIND, BASE)
9653#define DEPENDENT_TYPE(KIND, BASE) \
9655#define NON_CANONICAL_TYPE(KIND, BASE) \
9657#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(KIND, BASE) \
9659#include "clang/AST/TypeNodes.inc"
9660 llvm_unreachable(
"@encode for dependent type!");
9662 llvm_unreachable(
"bad type kind!");
9665void ASTContext::getObjCEncodingForStructureImpl(RecordDecl *RDecl,
9667 const FieldDecl *FD,
9669 QualType *NotEncodedT)
const {
9670 assert(RDecl &&
"Expected non-null RecordDecl");
9671 assert(!RDecl->
isUnion() &&
"Should not be called for unions");
9675 const auto *CXXRec = dyn_cast<CXXRecordDecl>(RDecl);
9676 std::multimap<uint64_t, NamedDecl *> FieldOrBaseOffsets;
9680 for (
const auto &BI : CXXRec->bases()) {
9681 if (!BI.isVirtual()) {
9686 FieldOrBaseOffsets.insert(FieldOrBaseOffsets.upper_bound(offs),
9687 std::make_pair(offs, base));
9692 for (FieldDecl *Field : RDecl->
fields()) {
9693 if (!
Field->isZeroLengthBitField() &&
Field->isZeroSize(*
this))
9696 FieldOrBaseOffsets.insert(FieldOrBaseOffsets.upper_bound(offs),
9697 std::make_pair(offs, Field));
9700 if (CXXRec && includeVBases) {
9701 for (
const auto &BI : CXXRec->vbases()) {
9707 FieldOrBaseOffsets.find(offs) == FieldOrBaseOffsets.end())
9708 FieldOrBaseOffsets.insert(FieldOrBaseOffsets.end(),
9709 std::make_pair(offs, base));
9723 std::multimap<uint64_t, NamedDecl *>::iterator
9724 CurLayObj = FieldOrBaseOffsets.begin();
9726 if (CXXRec && CXXRec->isDynamicClass() &&
9727 (CurLayObj == FieldOrBaseOffsets.end() || CurLayObj->first != 0)) {
9730 std::string recname = CXXRec->getNameAsString();
9731 if (recname.empty()) recname =
"?";
9744 FieldOrBaseOffsets.insert(FieldOrBaseOffsets.upper_bound(offs),
9745 std::make_pair(offs,
nullptr));
9748 for (; CurLayObj != FieldOrBaseOffsets.end(); ++CurLayObj) {
9750 assert(CurOffs <= CurLayObj->first);
9751 if (CurOffs < CurLayObj->first) {
9752 uint64_t padding = CurLayObj->first - CurOffs;
9764 NamedDecl *dcl = CurLayObj->second;
9768 if (
auto *base = dyn_cast<CXXRecordDecl>(dcl)) {
9773 getObjCEncodingForStructureImpl(base, S, FD,
false,
9783 S += field->getNameAsString();
9787 if (field->isBitField()) {
9790 CurOffs += field->getBitWidthValue();
9793 QualType qt = field->getType();
9795 getObjCEncodingForTypeImpl(
9796 qt, S, ObjCEncOptions().setExpandStructures().setIsStructField(),
9807 std::string& S)
const {
9840 if (!ObjCClassDecl) {
9845 return ObjCClassDecl;
9849 if (!ObjCProtocolClassDecl) {
9850 ObjCProtocolClassDecl
9859 return ObjCProtocolClassDecl;
9880 QualType T = Context->getPointerType(Context->CharTy);
9881 return Context->buildImplicitTypedef(
T, Name);
9894 QualType T = Context->getPointerType(Context->VoidTy);
9895 return Context->buildImplicitTypedef(
T,
"__builtin_va_list");
9902 if (Context->getLangOpts().CPlusPlus) {
9907 &Context->Idents.get(
"std"),
9915 const size_t NumFields = 5;
9917 const char *FieldNames[NumFields];
9920 FieldTypes[0] = Context->getPointerType(Context->VoidTy);
9921 FieldNames[0] =
"__stack";
9924 FieldTypes[1] = Context->getPointerType(Context->VoidTy);
9925 FieldNames[1] =
"__gr_top";
9928 FieldTypes[2] = Context->getPointerType(Context->VoidTy);
9929 FieldNames[2] =
"__vr_top";
9932 FieldTypes[3] = Context->IntTy;
9933 FieldNames[3] =
"__gr_offs";
9936 FieldTypes[4] = Context->IntTy;
9937 FieldNames[4] =
"__vr_offs";
9940 for (
unsigned i = 0; i < NumFields; ++i) {
9945 &Context->Idents.get(FieldNames[i]),
9946 FieldTypes[i],
nullptr,
9958 return Context->buildImplicitTypedef(VaListTagType,
"__builtin_va_list");
9965 VaListTagDecl = Context->buildImplicitRecord(
"__va_list_tag");
9968 const size_t NumFields = 5;
9970 const char *FieldNames[NumFields];
9973 FieldTypes[0] = Context->UnsignedCharTy;
9974 FieldNames[0] =
"gpr";
9977 FieldTypes[1] = Context->UnsignedCharTy;
9978 FieldNames[1] =
"fpr";
9981 FieldTypes[2] = Context->UnsignedShortTy;
9982 FieldNames[2] =
"reserved";
9985 FieldTypes[3] = Context->getPointerType(Context->VoidTy);
9986 FieldNames[3] =
"overflow_arg_area";
9989 FieldTypes[4] = Context->getPointerType(Context->VoidTy);
9990 FieldNames[4] =
"reg_save_area";
9993 for (
unsigned i = 0; i < NumFields; ++i) {
9997 &Context->Idents.get(FieldNames[i]),
9998 FieldTypes[i],
nullptr,
10011 Context->buildImplicitTypedef(VaListTagType,
"__va_list_tag");
10015 std::nullopt, VaListTagTypedefDecl);
10018 llvm::APInt Size(Context->getTypeSize(Context->getSizeType()), 1);
10019 QualType VaListTagArrayType = Context->getConstantArrayType(
10021 return Context->buildImplicitTypedef(VaListTagArrayType,
"__builtin_va_list");
10024static TypedefDecl *
10028 VaListTagDecl = Context->buildImplicitRecord(
"__va_list_tag");
10031 const size_t NumFields = 4;
10033 const char *FieldNames[NumFields];
10036 FieldTypes[0] = Context->UnsignedIntTy;
10037 FieldNames[0] =
"gp_offset";
10040 FieldTypes[1] = Context->UnsignedIntTy;
10041 FieldNames[1] =
"fp_offset";
10044 FieldTypes[2] = Context->getPointerType(Context->VoidTy);
10045 FieldNames[2] =
"overflow_arg_area";
10048 FieldTypes[3] = Context->getPointerType(Context->VoidTy);
10049 FieldNames[3] =
"reg_save_area";
10052 for (
unsigned i = 0; i < NumFields; ++i) {
10057 &Context->Idents.get(FieldNames[i]),
10058 FieldTypes[i],
nullptr,
10072 llvm::APInt Size(Context->getTypeSize(Context->getSizeType()), 1);
10073 QualType VaListTagArrayType = Context->getConstantArrayType(
10075 return Context->buildImplicitTypedef(VaListTagArrayType,
"__builtin_va_list");
10078static TypedefDecl *
10081 RecordDecl *VaListDecl = Context->buildImplicitRecord(
"__va_list");
10082 if (Context->getLangOpts().CPlusPlus) {
10101 &Context->Idents.get(
"__ap"),
10102 Context->getPointerType(Context->VoidTy),
10112 Context->VaListTagDecl = VaListDecl;
10115 CanQualType T = Context->getCanonicalTagType(VaListDecl);
10116 return Context->buildImplicitTypedef(
T,
"__builtin_va_list");
10119static TypedefDecl *
10123 VaListTagDecl = Context->buildImplicitRecord(
"__va_list_tag");
10126 const size_t NumFields = 4;
10128 const char *FieldNames[NumFields];
10131 FieldTypes[0] = Context->LongTy;
10132 FieldNames[0] =
"__gpr";
10135 FieldTypes[1] = Context->LongTy;
10136 FieldNames[1] =
"__fpr";
10139 FieldTypes[2] = Context->getPointerType(Context->VoidTy);
10140 FieldNames[2] =
"__overflow_arg_area";
10143 FieldTypes[3] = Context->getPointerType(Context->VoidTy);
10144 FieldNames[3] =
"__reg_save_area";
10147 for (
unsigned i = 0; i < NumFields; ++i) {
10152 &Context->Idents.get(FieldNames[i]),
10153 FieldTypes[i],
nullptr,
10167 llvm::APInt Size(Context->getTypeSize(Context->getSizeType()), 1);
10168 QualType VaListTagArrayType = Context->getConstantArrayType(
10171 return Context->buildImplicitTypedef(VaListTagArrayType,
"__builtin_va_list");
10177 VaListTagDecl = Context->buildImplicitRecord(
"__va_list_tag");
10180 const size_t NumFields = 3;
10182 const char *FieldNames[NumFields];
10185 FieldTypes[0] = Context->getPointerType(Context->VoidTy);
10186 FieldNames[0] =
"__current_saved_reg_area_pointer";
10189 FieldTypes[1] = Context->getPointerType(Context->VoidTy);
10190 FieldNames[1] =
"__saved_reg_area_end_pointer";
10193 FieldTypes[2] = Context->getPointerType(Context->VoidTy);
10194 FieldNames[2] =
"__overflow_area_pointer";
10197 for (
unsigned i = 0; i < NumFields; ++i) {
10200 SourceLocation(), &Context->Idents.get(FieldNames[i]), FieldTypes[i],
10213 Context->buildImplicitTypedef(VaListTagType,
"__va_list_tag");
10217 std::nullopt, VaListTagTypedefDecl);
10220 llvm::APInt Size(Context->getTypeSize(Context->getSizeType()), 1);
10221 QualType VaListTagArrayType = Context->getConstantArrayType(
10224 return Context->buildImplicitTypedef(VaListTagArrayType,
"__builtin_va_list");
10227static TypedefDecl *
10237 constexpr size_t NumFields = 3;
10238 QualType FieldTypes[NumFields] = {Context->getPointerType(Context->IntTy),
10239 Context->getPointerType(Context->IntTy),
10241 const char *FieldNames[NumFields] = {
"__va_stk",
"__va_reg",
"__va_ndx"};
10244 for (
unsigned i = 0; i < NumFields; ++i) {
10247 &Context->Idents.get(FieldNames[i]), FieldTypes[i],
nullptr,
10259 Context->buildImplicitTypedef(VaListTagType,
"__builtin_va_list");
10261 return VaListTagTypedefDecl;
10287 llvm_unreachable(
"Unhandled __builtin_va_list type kind");
10291 if (!BuiltinVaListDecl) {
10292 BuiltinVaListDecl =
CreateVaListDecl(
this, Target->getBuiltinVaListKind());
10293 assert(BuiltinVaListDecl->isImplicit());
10296 return BuiltinVaListDecl;
10309 if (!BuiltinMSVaListDecl)
10312 return BuiltinMSVaListDecl;
10329 assert(ObjCConstantStringType.isNull() &&
10330 "'NSConstantString' type already set!");
10340 unsigned size = End - Begin;
10341 assert(size > 1 &&
"set is not overloaded!");
10347 NamedDecl **Storage = OT->getStorage();
10370 bool TemplateKeyword,
10375 if (
Template.getAsTemplateDecl()->getKind() == Decl::TemplateTemplateParm) {
10376 assert(!Qualifier &&
"unexpected qualified template template parameter");
10377 assert(TemplateKeyword ==
false);
10382 llvm::FoldingSetNodeID ID;
10385 void *InsertPos =
nullptr;
10387 QualifiedTemplateNames.FindNodeOrInsertPos(ID, InsertPos);
10391 QualifiedTemplateNames.InsertNode(QTN, InsertPos);
10401 llvm::FoldingSetNodeID ID;
10404 void *InsertPos =
nullptr;
10406 DependentTemplateNames.FindNodeOrInsertPos(ID, InsertPos))
10411 DependentTemplateNames.InsertNode(QTN, InsertPos);
10416 Decl *AssociatedDecl,
10419 bool Final)
const {
10420 llvm::FoldingSetNodeID ID;
10422 Index, PackIndex, Final);
10424 void *insertPos =
nullptr;
10426 = SubstTemplateTemplateParms.FindNodeOrInsertPos(ID, insertPos);
10430 Replacement, AssociatedDecl, Index, PackIndex, Final);
10431 SubstTemplateTemplateParms.InsertNode(subst, insertPos);
10439 Decl *AssociatedDecl,
10440 unsigned Index,
bool Final)
const {
10442 llvm::FoldingSetNodeID ID;
10444 AssociatedDecl, Index, Final);
10446 void *InsertPos =
nullptr;
10448 = SubstTemplateTemplateParmPacks.FindNodeOrInsertPos(ID, InsertPos);
10453 SubstTemplateTemplateParmPacks.InsertNode(Subst, InsertPos);
10467 llvm::FoldingSetNodeID ID;
10470 void *InsertPos =
nullptr;
10472 DeducedTemplates.FindNodeOrInsertPos(ID, InsertPos);
10478 DeducedTemplates.InsertNode(DTS, InsertPos);
10501 llvm_unreachable(
"Unhandled TargetInfo::IntType value");
10531 while (
const auto *AT = dyn_cast<ArrayType>(CT))
10532 CT = AT->getElementType();
10564 assert(FirstVec->
isVectorType() &&
"FirstVec should be a vector type");
10565 assert(SecondVec->
isVectorType() &&
"SecondVec should be a vector type");
10602 auto VScale = Context.getTargetInfo().getVScaleRange(
10609 uint64_t EltSize = Context.getTypeSize(Info.
ElementType);
10613 uint64_t MinElts = Info.
EC.getKnownMinValue();
10614 return VScale->first * MinElts * EltSize;
10622 "Expected RVV builtin type and vector type!");
10662 return IsValidCast(FirstType, SecondType) ||
10663 IsValidCast(SecondType, FirstType);
10671 "Expected RVV builtin type and vector type!");
10678 if (!BT->isRVVVLSBuiltinType())
10698 return VecTy->getElementType().getCanonicalType()->isIntegerType() &&
10705 return IsLaxCompatible(FirstType, SecondType) ||
10706 IsLaxCompatible(SecondType, FirstType);
10712 if (
const AttributedType *
Attr = dyn_cast<AttributedType>(Ty)) {
10713 if (
Attr->getAttrKind() == attr::ObjCOwnership)
10716 Ty =
Attr->getModifiedType();
10720 Ty =
Paren->getInnerType();
10752 for (
auto *lhsProto : lhs->
quals()) {
10753 bool match =
false;
10754 for (
auto *rhsProto : rhs->
quals()) {
10785 for (
auto *I : lhs->
quals()) {
10789 if (!rhsID->ClassImplementsProtocol(I,
true))
10797 for (
auto *lhsProto : lhs->
quals()) {
10798 bool match =
false;
10803 for (
auto *rhsProto : rhs->
quals()) {
10813 for (
auto *I : lhs->
quals()) {
10817 if (rhsID->ClassImplementsProtocol(I,
true)) {
10834 for (
auto *lhsProto : lhs->
quals()) {
10835 bool match =
false;
10842 for (
auto *rhsProto : rhs->
quals()) {
10861 if (LHSInheritedProtocols.empty() && lhs->
qual_empty())
10863 for (
auto *lhsProto : LHSInheritedProtocols) {
10864 bool match =
false;
10865 for (
auto *rhsProto : rhs->
quals()) {
10890 if (LHS->isObjCUnqualifiedId() || RHS->isObjCUnqualifiedId())
10895 auto finish = [&](
bool succeeded) ->
bool {
10899 if (!RHS->isKindOfType())
10910 if (LHS->isObjCQualifiedId() || RHS->isObjCQualifiedId()) {
10915 if (LHS->isObjCQualifiedClass() && RHS->isObjCQualifiedClass()) {
10920 if (LHS->isObjCClass() && RHS->isObjCClass()) {
10925 if (LHS->getInterface() && RHS->getInterface()) {
10940 bool BlockReturnType) {
10944 auto finish = [&](
bool succeeded) ->
bool {
10969 if (
getLangOpts().CompatibilityQualifiedIdBlockParamTypeChecking)
10973 (!BlockReturnType &&
10977 (BlockReturnType ? LHSOPT : RHSOPT),
10978 (BlockReturnType ? RHSOPT : LHSOPT),
false));
10986 return finish(BlockReturnType);
10988 return finish(!BlockReturnType);
11000 return (*lhs)->getName().compare((*rhs)->getName());
11017 assert(LHS->getInterface() &&
"LHS must have an interface base");
11018 assert(RHS->getInterface() &&
"RHS must have an interface base");
11024 for (
auto *proto : LHS->quals()) {
11025 Context.CollectInheritedProtocols(proto, LHSProtocolSet);
11029 Context.CollectInheritedProtocols(LHS->getInterface(), LHSProtocolSet);
11035 for (
auto *proto : RHS->quals()) {
11036 Context.CollectInheritedProtocols(proto, RHSProtocolSet);
11040 Context.CollectInheritedProtocols(RHS->getInterface(), RHSProtocolSet);
11043 for (
auto *proto : LHSProtocolSet) {
11044 if (RHSProtocolSet.count(proto))
11045 IntersectionSet.push_back(proto);
11051 Context.CollectInheritedProtocols(CommonBase, ImpliedProtocols);
11054 if (!ImpliedProtocols.empty()) {
11056 return ImpliedProtocols.contains(proto);
11061 llvm::array_pod_sort(IntersectionSet.begin(), IntersectionSet.end(),
11071 if (lhsOPT && rhsOPT)
11077 if (lhsBlock && rhsBlock)
11082 if ((lhsOPT && lhsOPT->isObjCIdType() && rhsBlock) ||
11094 bool stripKindOf) {
11095 if (lhsArgs.size() != rhsArgs.size())
11102 for (
unsigned i = 0, n = lhsArgs.size(); i != n; ++i) {
11108 if (!stripKindOf ||
11109 !ctx.
hasSameType(lhsArgs[i].stripObjCKindOfType(ctx),
11110 rhsArgs[i].stripObjCKindOfType(ctx))) {
11138 if (!LDecl || !RDecl)
11144 bool anyKindOf = LHS->isKindOfType() || RHS->isKindOfType();
11148 llvm::SmallDenseMap<const ObjCInterfaceDecl *, const ObjCObjectType *, 4>
11153 LHSAncestors[LHS->getInterface()->getCanonicalDecl()] = LHS;
11158 bool anyChanges =
false;
11159 if (LHS->isSpecialized() && RHS->isSpecialized()) {
11162 LHS->getTypeArgs(), RHS->getTypeArgs(),
11165 }
else if (LHS->isSpecialized() != RHS->isSpecialized()) {
11176 if (!Protocols.empty())
11182 if (anyChanges || LHS->isKindOfType() != anyKindOf) {
11185 anyKindOf || LHS->isKindOfType());
11193 QualType LHSSuperType = LHS->getSuperClassType();
11194 if (LHSSuperType.
isNull())
11203 auto KnownLHS = LHSAncestors.find(RHS->getInterface()->getCanonicalDecl());
11204 if (KnownLHS != LHSAncestors.end()) {
11205 LHS = KnownLHS->second;
11209 bool anyChanges =
false;
11210 if (LHS->isSpecialized() && RHS->isSpecialized()) {
11213 LHS->getTypeArgs(), RHS->getTypeArgs(),
11216 }
else if (LHS->isSpecialized() != RHS->isSpecialized()) {
11227 if (!Protocols.empty())
11232 if (anyChanges || RHS->isKindOfType() != anyKindOf) {
11235 anyKindOf || RHS->isKindOfType());
11243 QualType RHSSuperType = RHS->getSuperClassType();
11244 if (RHSSuperType.
isNull())
11255 assert(LHS->getInterface() &&
"LHS is not an interface type");
11256 assert(RHS->getInterface() &&
"RHS is not an interface type");
11261 bool IsSuperClass = LHSInterface->
isSuperClassOf(RHS->getInterface());
11268 if (LHS->getNumProtocols() > 0) {
11277 for (
auto *RHSPI : RHS->quals())
11280 if (SuperClassInheritedProtocols.empty())
11283 for (
const auto *LHSProto : LHS->quals()) {
11284 bool SuperImplementsProtocol =
false;
11285 for (
auto *SuperClassProto : SuperClassInheritedProtocols)
11286 if (SuperClassProto->lookupProtocolNamed(LHSProto->getIdentifier())) {
11287 SuperImplementsProtocol =
true;
11290 if (!SuperImplementsProtocol)
11296 if (LHS->isSpecialized()) {
11301 RHSSuper = RHSSuper->getSuperClassType()->castAs<
ObjCObjectType>();
11304 if (RHSSuper->isSpecialized() &&
11306 LHS->getTypeArgs(), RHSSuper->getTypeArgs(),
11320 if (!LHSOPT || !RHSOPT)
11338 bool CompareUnqualified) {
11357 bool OfBlockPointer,
11359 if (
const RecordType *UT =
T->getAsUnionType()) {
11361 if (UD->
hasAttr<TransparentUnionAttr>()) {
11362 for (
const auto *I : UD->
fields()) {
11363 QualType ET = I->getType().getUnqualifiedType();
11377 bool OfBlockPointer,
11398 bool IsConditionalOperator) {
11401 const auto *lproto = dyn_cast<FunctionProtoType>(lbase);
11402 const auto *rproto = dyn_cast<FunctionProtoType>(rbase);
11403 bool allLTypes =
true;
11404 bool allRTypes =
true;
11408 if (OfBlockPointer) {
11410 QualType LHS = lbase->getReturnType();
11412 if (!UnqualifiedResult)
11414 retType =
mergeTypes(LHS, RHS,
true, UnqualifiedResult,
true);
11479 bool NoReturn = IsConditionalOperator
11489 std::optional<FunctionEffectSet> MergedFX;
11491 if (lproto && rproto) {
11492 assert((AllowCXX ||
11493 (!lproto->hasExceptionSpec() && !rproto->hasExceptionSpec())) &&
11494 "C++ shouldn't be here");
11496 if (lproto->getNumParams() != rproto->getNumParams())
11500 if (lproto->isVariadic() != rproto->isVariadic())
11503 if (lproto->getMethodQuals() != rproto->getMethodQuals())
11507 if (lproto->getExtraAttributeInfo().CFISalt !=
11508 rproto->getExtraAttributeInfo().CFISalt)
11514 if (LHSFX != RHSFX) {
11515 if (IsConditionalOperator)
11524 if (*MergedFX != LHSFX)
11526 if (*MergedFX != RHSFX)
11531 bool canUseLeft, canUseRight;
11543 for (
unsigned i = 0, n = lproto->getNumParams(); i < n; i++) {
11544 QualType lParamType = lproto->getParamType(i).getUnqualifiedType();
11545 QualType rParamType = rproto->getParamType(i).getUnqualifiedType();
11547 lParamType, rParamType, OfBlockPointer,
Unqualified);
11554 types.push_back(paramType);
11566 if (allLTypes)
return lhs;
11567 if (allRTypes)
return rhs;
11572 newParamInfos.empty() ?
nullptr : newParamInfos.data();
11578 if (lproto) allRTypes =
false;
11579 if (rproto) allLTypes =
false;
11583 assert((AllowCXX || !proto->
hasExceptionSpec()) &&
"C++ shouldn't be here");
11591 for (
unsigned i = 0, n = proto->
getNumParams(); i < n; ++i) {
11597 paramTy = ED->getIntegerType();
11607 if (allLTypes)
return lhs;
11608 if (allRTypes)
return rhs;
11617 if (allLTypes)
return lhs;
11618 if (allRTypes)
return rhs;
11624 QualType other,
bool isBlockReturnType) {
11630 ET->getOriginalDecl()->getDefinitionOrSelf()->getIntegerType();
11631 if (underlyingType.
isNull())
11633 if (Context.hasSameType(underlyingType, other))
11639 Context.getTypeSize(underlyingType) == Context.getTypeSize(other))
11648 if (LangOpts.CPlusPlus || !LangOpts.C23)
11663 bool IsConditionalOperator) {
11674 if (LangOpts.OpenMP && LHSRefTy && RHSRefTy &&
11678 if (LHSRefTy || RHSRefTy)
11690 if (LHSCan == RHSCan)
11695 Qualifiers RQuals = RHSCan.getLocalQualifiers();
11696 if (LQuals != RQuals) {
11713 assert((GC_L != GC_R) &&
"unequal qualifier sets had only equal elements");
11734 if (LHSClass == Type::FunctionProto) LHSClass = Type::FunctionNoProto;
11735 if (RHSClass == Type::FunctionProto) RHSClass = Type::FunctionNoProto;
11738 if (LHSClass == Type::VariableArray || LHSClass == Type::IncompleteArray)
11739 LHSClass = Type::ConstantArray;
11740 if (RHSClass == Type::VariableArray || RHSClass == Type::IncompleteArray)
11741 RHSClass = Type::ConstantArray;
11744 if (LHSClass == Type::ObjCInterface) LHSClass = Type::ObjCObject;
11745 if (RHSClass == Type::ObjCInterface) RHSClass = Type::ObjCObject;
11748 if (LHSClass == Type::ExtVector) LHSClass = Type::Vector;
11749 if (RHSClass == Type::ExtVector) RHSClass = Type::Vector;
11752 if (LHSClass != RHSClass) {
11762 if (OfBlockPointer && !BlockReturnType) {
11770 if (
const auto *AT = LHS->
getAs<AutoType>()) {
11771 if (!AT->isDeduced() && AT->isGNUAutoType())
11774 if (
const auto *AT = RHS->
getAs<AutoType>()) {
11775 if (!AT->isDeduced() && AT->isGNUAutoType())
11782 switch (LHSClass) {
11783#define TYPE(Class, Base)
11784#define ABSTRACT_TYPE(Class, Base)
11785#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base) case Type::Class:
11786#define NON_CANONICAL_TYPE(Class, Base) case Type::Class:
11787#define DEPENDENT_TYPE(Class, Base) case Type::Class:
11788#include "clang/AST/TypeNodes.inc"
11789 llvm_unreachable(
"Non-canonical and dependent types shouldn't get here");
11792 case Type::DeducedTemplateSpecialization:
11793 case Type::LValueReference:
11794 case Type::RValueReference:
11795 case Type::MemberPointer:
11796 llvm_unreachable(
"C++ should never be in mergeTypes");
11798 case Type::ObjCInterface:
11799 case Type::IncompleteArray:
11800 case Type::VariableArray:
11801 case Type::FunctionProto:
11802 case Type::ExtVector:
11803 llvm_unreachable(
"Types are eliminated above");
11805 case Type::Pointer:
11816 if (ResultType.
isNull())
11824 case Type::BlockPointer:
11849 if (ResultType.
isNull())
11868 if (ResultType.
isNull())
11876 case Type::ConstantArray:
11891 if (ResultType.
isNull())
11899 if (LVAT || RVAT) {
11902 -> std::pair<bool,llvm::APInt> {
11904 std::optional<llvm::APSInt> TheInt;
11907 return std::make_pair(
true, *TheInt);
11908 return std::make_pair(
false, llvm::APSInt());
11911 return std::make_pair(
true, CAT->getSize());
11912 return std::make_pair(
false, llvm::APInt());
11915 bool HaveLSize, HaveRSize;
11916 llvm::APInt LSize, RSize;
11917 std::tie(HaveLSize, LSize) = SizeFetch(LVAT, LCAT);
11918 std::tie(HaveRSize, RSize) = SizeFetch(RVAT, RCAT);
11919 if (HaveLSize && HaveRSize && !llvm::APInt::isSameValue(LSize, RSize))
11953 case Type::FunctionNoProto:
11955 false, IsConditionalOperator);
11959 case Type::Builtin:
11962 case Type::Complex:
11971 case Type::ConstantMatrix:
11976 case Type::ObjCObject: {
11985 case Type::ObjCObjectPointer:
11986 if (OfBlockPointer) {
11998 assert(LHS != RHS &&
11999 "Equivalent pipe types should have already been handled!");
12001 case Type::ArrayParameter:
12002 assert(LHS != RHS &&
12003 "Equivalent ArrayParameter types should have already been handled!");
12005 case Type::BitInt: {
12013 if (LHSUnsigned != RHSUnsigned)
12016 if (LHSBits != RHSBits)
12020 case Type::HLSLAttributedResource: {
12021 const HLSLAttributedResourceType *LHSTy =
12022 LHS->
castAs<HLSLAttributedResourceType>();
12023 const HLSLAttributedResourceType *RHSTy =
12024 RHS->
castAs<HLSLAttributedResourceType>();
12025 assert(LHSTy->getWrappedType() == RHSTy->getWrappedType() &&
12026 LHSTy->getWrappedType()->isHLSLResourceType() &&
12027 "HLSLAttributedResourceType should always wrap __hlsl_resource_t");
12029 if (LHSTy->getAttrs() == RHSTy->getAttrs() &&
12030 LHSTy->getContainedType() == RHSTy->getContainedType())
12034 case Type::HLSLInlineSpirv:
12035 const HLSLInlineSpirvType *LHSTy = LHS->
castAs<HLSLInlineSpirvType>();
12036 const HLSLInlineSpirvType *RHSTy = RHS->
castAs<HLSLInlineSpirvType>();
12038 if (LHSTy->getOpcode() == RHSTy->getOpcode() &&
12039 LHSTy->getSize() == RHSTy->getSize() &&
12040 LHSTy->getAlignment() == RHSTy->getAlignment()) {
12041 for (
size_t I = 0; I < LHSTy->getOperands().size(); I++)
12042 if (LHSTy->getOperands()[I] != RHSTy->getOperands()[I])
12050 llvm_unreachable(
"Invalid Type::Class!");
12055 bool &CanUseFirst,
bool &CanUseSecond,
12057 assert(NewParamInfos.empty() &&
"param info list not empty");
12058 CanUseFirst = CanUseSecond =
true;
12064 if (!FirstHasInfo && !SecondHasInfo)
12067 bool NeedParamInfo =
false;
12071 for (
size_t I = 0; I < E; ++I) {
12082 bool FirstNoEscape = FirstParam.
isNoEscape();
12083 bool SecondNoEscape = SecondParam.
isNoEscape();
12084 bool IsNoEscape = FirstNoEscape && SecondNoEscape;
12086 if (NewParamInfos.back().getOpaqueValue())
12087 NeedParamInfo =
true;
12088 if (FirstNoEscape != IsNoEscape)
12089 CanUseFirst =
false;
12090 if (SecondNoEscape != IsNoEscape)
12091 CanUseSecond =
false;
12094 if (!NeedParamInfo)
12095 NewParamInfos.clear();
12101 if (
auto It = ObjCLayouts.find(D); It != ObjCLayouts.end()) {
12102 It->second =
nullptr;
12103 for (
auto *SubClass : ObjCSubClasses[D])
12115 if (LHSCan == RHSCan)
12117 if (RHSCan->isFunctionType()) {
12126 if (ResReturnType.
isNull())
12128 if (ResReturnType == NewReturnType || ResReturnType == OldReturnType) {
12145 Qualifiers RQuals = RHSCan.getLocalQualifiers();
12146 if (LQuals != RQuals) {
12159 assert((GC_L != GC_R) &&
"unequal qualifier sets had only equal elements");
12175 if (ResQT == LHSBaseQT)
12177 if (ResQT == RHSBaseQT)
12188 if (
const auto *ED =
T->getAsEnumDecl())
12189 T = ED->getIntegerType();
12190 if (
T->isBooleanType())
12193 return EIT->getNumBits();
12199 assert((
T->hasIntegerRepresentation() ||
T->isEnumeralType() ||
12200 T->isFixedPointType()) &&
12201 "Unexpected type");
12206 VTy->getNumElements(), VTy->getVectorKind());
12214 if (
const auto *ED =
T->getAsEnumDecl())
12215 T = ED->getIntegerType();
12218 case BuiltinType::Char_U:
12220 case BuiltinType::Char_S:
12221 case BuiltinType::SChar:
12222 case BuiltinType::Char8:
12224 case BuiltinType::Short:
12226 case BuiltinType::Int:
12228 case BuiltinType::Long:
12230 case BuiltinType::LongLong:
12232 case BuiltinType::Int128:
12237 case BuiltinType::WChar_S:
12240 case BuiltinType::ShortAccum:
12242 case BuiltinType::Accum:
12244 case BuiltinType::LongAccum:
12246 case BuiltinType::SatShortAccum:
12248 case BuiltinType::SatAccum:
12250 case BuiltinType::SatLongAccum:
12252 case BuiltinType::ShortFract:
12254 case BuiltinType::Fract:
12256 case BuiltinType::LongFract:
12258 case BuiltinType::SatShortFract:
12260 case BuiltinType::SatFract:
12262 case BuiltinType::SatLongFract:
12265 assert((
T->hasUnsignedIntegerRepresentation() ||
12266 T->isUnsignedFixedPointType()) &&
12267 "Unexpected signed integer or fixed point type");
12273 assert((
T->hasIntegerRepresentation() ||
T->isEnumeralType() ||
12274 T->isFixedPointType()) &&
12275 "Unexpected type");
12280 VTy->getNumElements(), VTy->getVectorKind());
12288 if (
const auto *ED =
T->getAsEnumDecl())
12289 T = ED->getIntegerType();
12292 case BuiltinType::Char_S:
12294 case BuiltinType::Char_U:
12295 case BuiltinType::UChar:
12296 case BuiltinType::Char8:
12298 case BuiltinType::UShort:
12300 case BuiltinType::UInt:
12302 case BuiltinType::ULong:
12304 case BuiltinType::ULongLong:
12306 case BuiltinType::UInt128:
12311 case BuiltinType::WChar_U:
12314 case BuiltinType::UShortAccum:
12316 case BuiltinType::UAccum:
12318 case BuiltinType::ULongAccum:
12320 case BuiltinType::SatUShortAccum:
12322 case BuiltinType::SatUAccum:
12324 case BuiltinType::SatULongAccum:
12326 case BuiltinType::UShortFract:
12328 case BuiltinType::UFract:
12330 case BuiltinType::ULongFract:
12332 case BuiltinType::SatUShortFract:
12334 case BuiltinType::SatUFract:
12336 case BuiltinType::SatULongFract:
12340 (
T->hasSignedIntegerRepresentation() ||
T->isSignedFixedPointType()) &&
12341 "Unexpected signed integer or fixed point type");
12366 bool AllowTypeModifiers) {
12370 RequiresICE =
false;
12375 bool IsSpecial =
false;
12379 default: Done =
true; --Str;
break;
12381 RequiresICE =
true;
12384 assert(!
Unsigned &&
"Can't use both 'S' and 'U' modifiers!");
12385 assert(!
Signed &&
"Can't use 'S' modifier multiple times!");
12389 assert(!
Signed &&
"Can't use both 'S' and 'U' modifiers!");
12390 assert(!
Unsigned &&
"Can't use 'U' modifier multiple times!");
12394 assert(!IsSpecial &&
"Can't use 'L' with 'W', 'N', 'Z' or 'O' modifiers");
12395 assert(HowLong <= 2 &&
"Can't have LLLL modifier");
12400 assert(!IsSpecial &&
"Can't use two 'N', 'W', 'Z' or 'O' modifiers!");
12401 assert(HowLong == 0 &&
"Can't use both 'L' and 'N' modifiers!");
12405 if (Context.getTargetInfo().getLongWidth() == 32)
12410 assert(!IsSpecial &&
"Can't use two 'N', 'W', 'Z' or 'O' modifiers!");
12411 assert(HowLong == 0 &&
"Can't use both 'L' and 'W' modifiers!");
12415 switch (Context.getTargetInfo().getInt64Type()) {
12417 llvm_unreachable(
"Unexpected integer type");
12428 assert(!IsSpecial &&
"Can't use two 'N', 'W', 'Z' or 'O' modifiers!");
12429 assert(HowLong == 0 &&
"Can't use both 'L' and 'Z' modifiers!");
12433 switch (Context.getTargetInfo().getIntTypeByWidth(32,
true)) {
12435 llvm_unreachable(
"Unexpected integer type");
12448 assert(!IsSpecial &&
"Can't use two 'N', 'W', 'Z' or 'O' modifiers!");
12449 assert(HowLong == 0 &&
"Can't use both 'L' and 'O' modifiers!");
12453 if (Context.getLangOpts().OpenCL)
12465 default: llvm_unreachable(
"Unknown builtin type letter!");
12468 "Bad modifiers used with 'x'!");
12469 Type = Context.Float16Ty;
12473 "Bad modifiers used with 'y'!");
12474 Type = Context.BFloat16Ty;
12478 "Bad modifiers used with 'v'!");
12479 Type = Context.VoidTy;
12483 "Bad modifiers used with 'h'!");
12484 Type = Context.HalfTy;
12488 "Bad modifiers used with 'f'!");
12489 Type = Context.FloatTy;
12493 "Bad modifiers used with 'd'!");
12495 Type = Context.LongDoubleTy;
12496 else if (HowLong == 2)
12497 Type = Context.Float128Ty;
12499 Type = Context.DoubleTy;
12502 assert(HowLong == 0 &&
"Bad modifiers used with 's'!");
12504 Type = Context.UnsignedShortTy;
12506 Type = Context.ShortTy;
12510 Type =
Unsigned ? Context.UnsignedInt128Ty : Context.Int128Ty;
12511 else if (HowLong == 2)
12512 Type =
Unsigned ? Context.UnsignedLongLongTy : Context.LongLongTy;
12513 else if (HowLong == 1)
12514 Type =
Unsigned ? Context.UnsignedLongTy : Context.LongTy;
12516 Type =
Unsigned ? Context.UnsignedIntTy : Context.IntTy;
12519 assert(HowLong == 0 &&
"Bad modifiers used with 'c'!");
12521 Type = Context.SignedCharTy;
12523 Type = Context.UnsignedCharTy;
12525 Type = Context.CharTy;
12528 assert(HowLong == 0 && !
Signed && !
Unsigned &&
"Bad modifiers for 'b'!");
12529 Type = Context.BoolTy;
12532 assert(HowLong == 0 && !
Signed && !
Unsigned &&
"Bad modifiers for 'z'!");
12533 Type = Context.getSizeType();
12536 assert(HowLong == 0 && !
Signed && !
Unsigned &&
"Bad modifiers for 'w'!");
12537 Type = Context.getWideCharType();
12540 Type = Context.getCFConstantStringType();
12543 Type = Context.getObjCIdType();
12546 Type = Context.getObjCSelType();
12549 Type = Context.getObjCSuperType();
12552 Type = Context.getBuiltinVaListType();
12553 assert(!
Type.isNull() &&
"builtin va list type not initialized!");
12564 Type = Context.getBuiltinVaListType();
12565 assert(!
Type.isNull() &&
"builtin va list type not initialized!");
12567 Type = Context.getArrayDecayedType(
Type);
12569 Type = Context.getLValueReferenceType(
Type);
12573 unsigned NumElements = strtoul(Str, &End, 10);
12574 assert(End != Str &&
"Missing vector size");
12578 RequiresICE,
false);
12579 assert(!RequiresICE &&
"Can't require vector ICE");
12581 Type = Context.getScalableVectorType(ElementType, NumElements);
12587 Type = Context.SveCountTy;
12591 Type = Context.AMDGPUBufferRsrcTy;
12595 Type = Context.AMDGPUTextureTy;
12599 llvm_unreachable(
"Unexpected target builtin type");
12605 unsigned NumElements = strtoul(Str, &End, 10);
12606 assert(End != Str &&
"Missing vector size");
12610 RequiresICE,
false);
12611 assert(!RequiresICE &&
"Can't require vector ICE");
12620 unsigned NumElements = strtoul(Str, &End, 10);
12621 assert(End != Str &&
"Missing vector size");
12627 Type = Context.getExtVectorType(ElementType, NumElements);
12633 assert(!RequiresICE &&
"Can't require complex ICE");
12634 Type = Context.getComplexType(ElementType);
12638 Type = Context.getPointerDiffType();
12641 Type = Context.getFILEType();
12642 if (
Type.isNull()) {
12649 Type = Context.getsigjmp_bufType();
12651 Type = Context.getjmp_bufType();
12653 if (
Type.isNull()) {
12659 assert(HowLong == 0 && !
Signed && !
Unsigned &&
"Bad modifiers for 'K'!");
12660 Type = Context.getucontext_tType();
12662 if (
Type.isNull()) {
12668 Type = Context.getProcessIDType();
12671 Type = Context.MFloat8Ty;
12676 Done = !AllowTypeModifiers;
12678 switch (
char c = *Str++) {
12679 default: Done =
true; --Str;
break;
12685 unsigned AddrSpace = strtoul(Str, &End, 10);
12688 Type = Context.getAddrSpaceQualType(
12690 Context.getLangASForBuiltinAddressSpace(AddrSpace));
12694 Type = Context.getPointerType(
Type);
12696 Type = Context.getLValueReferenceType(
Type);
12704 Type = Context.getVolatileType(
Type);
12713 "Integer constant 'I' type must be an integer");
12726 bool AllowTypeModifiers)
const {
12733 unsigned *IntegerConstantArgs)
const {
12734 const char *TypeStr =
BuiltinInfo.getTypeString(Id);
12735 if (TypeStr[0] ==
'\0') {
12742 bool RequiresICE =
false;
12745 RequiresICE,
true);
12749 assert(!RequiresICE &&
"Result of intrinsic cannot be required to be an ICE");
12751 while (TypeStr[0] && TypeStr[0] !=
'.') {
12758 if (RequiresICE && IntegerConstantArgs)
12759 *IntegerConstantArgs |= 1 << ArgTypes.size();
12765 ArgTypes.push_back(Ty);
12768 if (Id == Builtin::BI__GetExceptionInfo)
12771 assert((TypeStr[0] !=
'.' || TypeStr[1] == 0) &&
12772 "'.' should only occur at end of builtin type list!");
12774 bool Variadic = (TypeStr[0] ==
'.');
12781 if (ArgTypes.empty() && Variadic && !
getLangOpts().requiresStrictPrototypes())
12831 if ((!Context.getLangOpts().CPlusPlus &&
12832 !Context.getTargetInfo().getCXXABI().isMicrosoft() &&
12833 !FD->
hasAttr<DLLExportAttr>()) ||
12834 FD->
hasAttr<GNUInlineAttr>()) {
12852 if (Context.getTargetInfo().getCXXABI().isMicrosoft() &&
12867 if (D->
hasAttr<DLLImportAttr>()) {
12870 }
else if (D->
hasAttr<DLLExportAttr>()) {
12873 }
else if (Context.getLangOpts().CUDA && Context.getLangOpts().CUDAIsDevice) {
12876 if (D->
hasAttr<CUDAGlobalAttr>() &&
12885 if (Context.shouldExternalize(D))
12900 switch (Source->hasExternalDefinitions(D)) {
12927 if (Context.getLangOpts().CPlusPlus &&
12928 Context.getLangOpts().IncrementalExtensions &&
12944 if (!LexicalContext)
12949 auto StaticLocalLinkage =
12961 return StaticLocalLinkage;
12967 if (Context.isMSStaticDataMemberInlineDefinition(VD))
12973 switch (Context.getInlineVariableDefinitionKind(VD)) {
12988 return StrongLinkage;
12991 return Context.getTargetInfo().getCXXABI().isMicrosoft() &&
13006 llvm_unreachable(
"Invalid Linkage!");
13016 if (
const auto *VD = dyn_cast<VarDecl>(D)) {
13017 if (!VD->isFileVarDecl())
13022 if (VD->getDescribedVarTemplate() ||
13025 }
else if (
const auto *FD = dyn_cast<FunctionDecl>(D)) {
13051 if (D->
hasAttr<WeakRefAttr>())
13058 if (LangOpts.SYCLIsDevice)
13060 D->
hasAttr<SYCLExternalAttr>());
13066 if (
const auto *FD = dyn_cast<FunctionDecl>(D)) {
13068 if (!FD->doesThisDeclarationHaveABody())
13069 return FD->doesDeclarationForceExternallyVisibleDefinition();
13072 if (FD->
hasAttr<ConstructorAttr>() || FD->
hasAttr<DestructorAttr>())
13077 if (
getTargetInfo().getCXXABI().canKeyFunctionBeInline()) {
13078 if (
const auto *MD = dyn_cast<CXXMethodDecl>(FD)) {
13097 assert(VD->isFileVarDecl() &&
"Expected file scoped var");
13101 if (LangOpts.OpenMP &&
13102 OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(VD))
13109 if (VD->shouldEmitInExternalSource())
13122 if (VD->needsDestruction(*
this))
13126 if (VD->hasInitWithSideEffects())
13131 if (
const auto *DD = dyn_cast<DecompositionDecl>(VD)) {
13132 for (
const auto *BD : DD->flat_bindings())
13133 if (
const auto *BindingVD = BD->getHoldingVar())
13143 llvm::function_ref<
void(
FunctionDecl *)> Pred)
const {
13144 assert(FD->
isMultiVersion() &&
"Only valid for multiversioned functions");
13145 llvm::SmallDenseSet<const FunctionDecl*, 4> SeenDecls;
13150 for (
auto *CurDecl :
13154 SeenDecls.insert(CurFD).second) {
13161 bool IsCXXMethod)
const {
13164 return ABI->getDefaultMethodCallConv(IsVariadic);
13166 switch (LangOpts.getDefaultCallingConv()) {
13194 return Target->getDefaultCallingConv();
13199 return ABI->isNearlyEmpty(RD);
13204 auto ABI = Target->getCXXABI();
13205 if (ABI.isMicrosoft())
13208 auto ComponentLayout =
getLangOpts().RelativeCXXABIVTables
13214 return VTContext.get();
13220 switch (
T->getCXXABI().getKind()) {
13221 case TargetCXXABI::AppleARM64:
13222 case TargetCXXABI::Fuchsia:
13223 case TargetCXXABI::GenericAArch64:
13224 case TargetCXXABI::GenericItanium:
13225 case TargetCXXABI::GenericARM:
13226 case TargetCXXABI::GenericMIPS:
13227 case TargetCXXABI::iOS:
13228 case TargetCXXABI::WebAssembly:
13229 case TargetCXXABI::WatchOS:
13230 case TargetCXXABI::XL:
13232 case TargetCXXABI::Microsoft:
13235 llvm_unreachable(
"Unsupported ABI");
13239 assert(
T.getCXXABI().getKind() != TargetCXXABI::Microsoft &&
13240 "Device mangle context does not support Microsoft mangling.");
13241 switch (
T.getCXXABI().getKind()) {
13242 case TargetCXXABI::AppleARM64:
13243 case TargetCXXABI::Fuchsia:
13244 case TargetCXXABI::GenericAArch64:
13245 case TargetCXXABI::GenericItanium:
13246 case TargetCXXABI::GenericARM:
13247 case TargetCXXABI::GenericMIPS:
13248 case TargetCXXABI::iOS:
13249 case TargetCXXABI::WebAssembly:
13250 case TargetCXXABI::WatchOS:
13251 case TargetCXXABI::XL:
13255 if (
const auto *RD = dyn_cast<CXXRecordDecl>(ND))
13256 return RD->getDeviceLambdaManglingNumber();
13257 return std::nullopt;
13260 case TargetCXXABI::Microsoft:
13264 llvm_unreachable(
"Unsupported ABI");
13270 return ASTRecordLayouts.getMemorySize() +
13271 llvm::capacity_in_bytes(ObjCLayouts) +
13272 llvm::capacity_in_bytes(KeyFunctions) +
13273 llvm::capacity_in_bytes(ObjCImpls) +
13274 llvm::capacity_in_bytes(BlockVarCopyInits) +
13275 llvm::capacity_in_bytes(DeclAttrs) +
13276 llvm::capacity_in_bytes(TemplateOrInstantiation) +
13277 llvm::capacity_in_bytes(InstantiatedFromUsingDecl) +
13278 llvm::capacity_in_bytes(InstantiatedFromUsingShadowDecl) +
13279 llvm::capacity_in_bytes(InstantiatedFromUnnamedFieldDecl) +
13280 llvm::capacity_in_bytes(OverriddenMethods) +
13281 llvm::capacity_in_bytes(Types) +
13282 llvm::capacity_in_bytes(VariableArrayTypes);
13290 unsigned Signed)
const {
13293 if (!QualTy && DestWidth == 128)
13322 llvm_unreachable(
"Unhandled TargetInfo::RealType value");
13329 MangleNumbers[ND] = Number;
13332 Listener->AddedManglingNumber(ND, Number);
13336 bool ForAuxTarget)
const {
13337 auto I = MangleNumbers.find(ND);
13338 unsigned Res = I != MangleNumbers.end() ? I->second : 1;
13341 if (LangOpts.CUDA && !LangOpts.CUDAIsDevice) {
13342 Res = ForAuxTarget ? Res >> 16 : Res & 0xFFFF;
13344 assert(!ForAuxTarget &&
"Only CUDA/HIP host compilation supports mangling "
13345 "number for aux target");
13347 return Res > 1 ? Res : 1;
13354 StaticLocalNumbers[VD] = Number;
13357 Listener->AddedStaticLocalNumbers(VD, Number);
13361 auto I = StaticLocalNumbers.find(VD);
13362 return I != StaticLocalNumbers.end() ? I->second : 1;
13366 bool IsDestroying) {
13367 if (!IsDestroying) {
13379 bool IsTypeAware) {
13380 if (!IsTypeAware) {
13393 assert(LangOpts.CPlusPlus);
13394 std::unique_ptr<MangleNumberingContext> &MCtx = MangleNumberingContexts[DC];
13402 assert(LangOpts.CPlusPlus);
13403 std::unique_ptr<MangleNumberingContext> &MCtx =
13404 ExtraMangleNumberingContexts[D];
13410std::unique_ptr<MangleNumberingContext>
13412 return ABI->createMangleNumberingContext();
13417 return ABI->getCopyConstructorForExceptionObject(
13423 return ABI->addCopyConstructorForExceptionObject(
13430 return ABI->addTypedefNameForUnnamedTagDecl(TD, DD);
13435 return ABI->getTypedefNameForUnnamedTagDecl(TD);
13440 return ABI->addDeclaratorForUnnamedTagDecl(TD, DD);
13444 return ABI->getDeclaratorForUnnamedTagDecl(TD);
13448 ParamIndices[D] =
index;
13452 ParameterIndexTable::const_iterator I = ParamIndices.find(D);
13453 assert(I != ParamIndices.end() &&
13454 "ParmIndices lacks entry set by ParmVarDecl");
13459 unsigned Length)
const {
13485 assert(
MSGuidTagDecl &&
"building MS GUID without MS extensions?");
13487 llvm::FoldingSetNodeID ID;
13491 if (
MSGuidDecl *Existing = MSGuidDecls.FindNodeOrInsertPos(ID, InsertPos))
13495 MSGuidDecl *
New = MSGuidDecl::Create(*
this, GUIDType, Parts);
13496 MSGuidDecls.InsertNode(
New, InsertPos);
13502 const APValue &APVal)
const {
13503 llvm::FoldingSetNodeID ID;
13508 UnnamedGlobalConstantDecls.FindNodeOrInsertPos(ID, InsertPos))
13512 UnnamedGlobalConstantDecl::Create(*
this, Ty, APVal);
13513 UnnamedGlobalConstantDecls.InsertNode(
New, InsertPos);
13519 assert(
T->isRecordType() &&
"template param object of unexpected type");
13525 llvm::FoldingSetNodeID ID;
13530 TemplateParamObjectDecls.FindNodeOrInsertPos(ID, InsertPos))
13534 TemplateParamObjectDecls.InsertNode(
New, InsertPos);
13540 if (!
T.isOSDarwin())
13543 if (!(
T.isiOS() &&
T.isOSVersionLT(7)) &&
13544 !(
T.isMacOSX() &&
T.isOSVersionLT(10, 9)))
13553 return (Size != Align ||
toBits(sizeChars) > MaxInlineWidthInBits);
13560 if (MethodDecl->
hasAttr<UnavailableAttr>()
13561 || MethodDecl->
hasAttr<DeprecatedAttr>())
13575 IM != EM && IF != EF; ++IM, ++IF) {
13606 llvm::FoldingSetNodeID IDX, IDY;
13607 X->Profile(IDX, *
this,
true);
13608 Y->
Profile(IDY, *
this,
true);
13622 for (
const Decl *DX :
X->redecls()) {
13627 if (DX->isFirstDecl())
13630 llvm_unreachable(
"Corrupt redecls chain");
13633template <
class T, std::enable_if_t<std::is_base_of_v<Decl, T>,
bool> = true>
13635 return cast_or_null<T>(
13637 const_cast<Decl *
>(cast_or_null<Decl>(Y))));
13640template <
class T, std::enable_if_t<std::is_base_of_v<Decl, T>,
bool> = true>
13648 bool IgnoreDeduced =
false) {
13663 bool IgnoreDeduced) {
13671 assert(Xs.size() == Ys.size());
13673 for (
size_t I = 0; I < Rs.size(); ++I)
13680 return X->getAttributeLoc() == Y->getAttributeLoc() ?
X->getAttributeLoc()
13690 switch (
X.getKind()) {
13720 auto NExpX =
X.getNumTemplateExpansions();
13734 if (Xs.size() != Ys.size())
13736 R.resize(Xs.size());
13737 for (
size_t I = 0; I < R.size(); ++I) {
13750 assert(!Different);
13778 assert(!IsSame &&
"Should be the same NestedNameSpecifier");
13780 return std::nullopt;
13785 assert(Kind == NNS2.
getKind());
13790 auto Kind = Namespace1->getKind();
13791 if (Kind != Namespace2->getKind() ||
13792 (Kind == Decl::NamespaceAlias &&
13797 Namespace2->getNamespace()),
13831 llvm_unreachable(
"singletons did not compare equal");
13839 const T *Y,
bool IsSame) {
13840 return ::getCommonNNS(Ctx,
X->getQualifier(), Y->getQualifier(), IsSame);
13853 QualType EX =
X->getElementType(), EY = Y->getElementType();
13862 QY += EY.getQualifiers() - RQ;
13874 assert(Ctx.
hasSameExpr(
X->getSizeExpr(), Y->getSizeExpr()));
13875 return X->getSizeExpr();
13880 return X->getSizeModifier();
13886 return X->getIndexTypeCVRQualifiers();
13896 llvm::DenseMap<QualType, unsigned>
Found;
13897 for (
auto Ts : {
X, Y}) {
13904 Out.emplace_back(
T);
13910FunctionProtoType::ExceptionSpecInfo
13914 bool AcceptDependent)
const {
13940 assert(AcceptDependent &&
13941 "computing composite pointer type of dependent types");
13956 llvm_unreachable(
"These ESTs should be handled above");
13961 assert(EST2 ==
EST_Dynamic &&
"other cases should already be handled");
13965 Result.Exceptions = ExceptionTypeStorage;
13972 llvm_unreachable(
"shouldn't see unresolved exception specifications here");
13975 llvm_unreachable(
"invalid ExceptionSpecificationType");
13984#define UNEXPECTED_TYPE(Class, Kind) \
13985 case Type::Class: \
13986 llvm_unreachable("Unexpected " Kind ": " #Class);
13988#define NON_CANONICAL_TYPE(Class, Base) UNEXPECTED_TYPE(Class, "non-canonical")
13989#define TYPE(Class, Base)
13990#include "clang/AST/TypeNodes.inc"
13992#define SUGAR_FREE_TYPE(Class) UNEXPECTED_TYPE(Class, "sugar-free")
14003#undef SUGAR_FREE_TYPE
14004#define NON_UNIQUE_TYPE(Class) UNEXPECTED_TYPE(Class, "non-unique")
14007#undef NON_UNIQUE_TYPE
14011#undef UNEXPECTED_TYPE
14015 assert(AX->getDeducedType().isNull());
14016 assert(AY->getDeducedType().isNull());
14017 assert(AX->getKeyword() == AY->getKeyword());
14018 assert(AX->isInstantiationDependentType() ==
14019 AY->isInstantiationDependentType());
14021 AY->getTypeConstraintArguments());
14024 AX->containsUnexpandedParameterPack(),
14026 AY->getTypeConstraintConcept()),
14029 case Type::IncompleteArray: {
14036 case Type::DependentSizedArray: {
14044 case Type::ConstantArray: {
14047 assert(AX->getSize() == AY->getSize());
14048 const Expr *SizeExpr = Ctx.
hasSameExpr(AX->getSizeExpr(), AY->getSizeExpr())
14049 ? AX->getSizeExpr()
14055 case Type::ArrayParameter: {
14058 assert(AX->getSize() == AY->getSize());
14059 const Expr *SizeExpr = Ctx.
hasSameExpr(AX->getSizeExpr(), AY->getSizeExpr())
14060 ? AX->getSizeExpr()
14067 case Type::Atomic: {
14072 case Type::Complex: {
14076 case Type::Pointer: {
14080 case Type::BlockPointer: {
14084 case Type::ObjCObjectPointer: {
14089 case Type::MemberPointer: {
14093 PY->getMostRecentCXXRecordDecl()));
14097 PX->getMostRecentCXXRecordDecl());
14099 case Type::LValueReference: {
14104 PX->isSpelledAsLValue() ||
14105 PY->isSpelledAsLValue());
14107 case Type::RValueReference: {
14113 case Type::DependentAddressSpace: {
14116 assert(Ctx.
hasSameExpr(PX->getAddrSpaceExpr(), PY->getAddrSpaceExpr()));
14118 PX->getAddrSpaceExpr(),
14121 case Type::FunctionNoProto: {
14124 assert(FX->getExtInfo() == FY->getExtInfo());
14129 case Type::FunctionProto: {
14133 EPIY = FY->getExtProtoInfo();
14134 assert(EPIX.
ExtInfo == EPIY.ExtInfo);
14141 assert(EPIX.
TypeQuals == EPIY.TypeQuals);
14142 assert(EPIX.
Variadic == EPIY.Variadic);
14151 auto P =
getCommonTypes(Ctx, FX->param_types(), FY->param_types(),
14159 case Type::ObjCObject: {
14162 std::equal(OX->getProtocols().begin(), OX->getProtocols().end(),
14163 OY->getProtocols().begin(), OY->getProtocols().end(),
14165 return P0->getCanonicalDecl() == P1->getCanonicalDecl();
14167 "protocol lists must be the same");
14169 OY->getTypeArgsAsWritten());
14172 OX->getProtocols(),
14173 OX->isKindOfTypeAsWritten() && OY->isKindOfTypeAsWritten());
14175 case Type::ConstantMatrix: {
14178 assert(MX->getNumRows() == MY->getNumRows());
14179 assert(MX->getNumColumns() == MY->getNumColumns());
14181 MX->getNumRows(), MX->getNumColumns());
14183 case Type::DependentSizedMatrix: {
14186 assert(Ctx.
hasSameExpr(MX->getRowExpr(), MY->getRowExpr()));
14187 assert(Ctx.
hasSameExpr(MX->getColumnExpr(), MY->getColumnExpr()));
14192 case Type::Vector: {
14194 assert(VX->getNumElements() == VY->getNumElements());
14195 assert(VX->getVectorKind() == VY->getVectorKind());
14197 VX->getNumElements(), VX->getVectorKind());
14199 case Type::ExtVector: {
14201 assert(VX->getNumElements() == VY->getNumElements());
14203 VX->getNumElements());
14205 case Type::DependentSizedExtVector: {
14212 case Type::DependentVector: {
14215 assert(VX->getVectorKind() == VY->getVectorKind());
14222 case Type::InjectedClassName: {
14230 case Type::TemplateSpecialization: {
14234 TY->template_arguments());
14238 TY->getTemplateName(),
14240 As, {},
X->getCanonicalTypeInternal());
14242 case Type::Decltype: {
14245 assert(DX->isDependentType());
14246 assert(DY->isDependentType());
14247 assert(Ctx.
hasSameExpr(DX->getUnderlyingExpr(), DY->getUnderlyingExpr()));
14251 case Type::PackIndexing: {
14254 assert(DX->isDependentType());
14255 assert(DY->isDependentType());
14256 assert(Ctx.
hasSameExpr(DX->getIndexExpr(), DY->getIndexExpr()));
14259 case Type::DependentName: {
14262 assert(NX->getIdentifier() == NY->getIdentifier());
14267 case Type::UnaryTransform: {
14270 assert(TX->getUTTKind() == TY->getUTTKind());
14274 TY->getUnderlyingType()),
14277 case Type::PackExpansion: {
14280 assert(PX->getNumExpansions() == PY->getNumExpansions());
14283 PX->getNumExpansions(),
false);
14287 assert(PX->isReadOnly() == PY->isReadOnly());
14292 case Type::TemplateTypeParm: {
14295 assert(TX->getDepth() == TY->getDepth());
14296 assert(TX->getIndex() == TY->getIndex());
14297 assert(TX->isParameterPack() == TY->isParameterPack());
14299 TX->getDepth(), TX->getIndex(), TX->isParameterPack(),
14303 llvm_unreachable(
"Unknown Type Class");
14313#define UNEXPECTED_TYPE(Class, Kind) \
14314 case Type::Class: \
14315 llvm_unreachable("Unexpected " Kind ": " #Class);
14316#define TYPE(Class, Base)
14317#define DEPENDENT_TYPE(Class, Base) UNEXPECTED_TYPE(Class, "dependent")
14318#include "clang/AST/TypeNodes.inc"
14320#define CANONICAL_TYPE(Class) UNEXPECTED_TYPE(Class, "canonical")
14346#undef CANONICAL_TYPE
14348#undef UNEXPECTED_TYPE
14350 case Type::Adjusted: {
14352 QualType OX = AX->getOriginalType(), OY = AY->getOriginalType();
14359 case Type::Decayed: {
14361 QualType OX = DX->getOriginalType(), OY = DY->getOriginalType();
14368 case Type::Attributed: {
14370 AttributedType::Kind Kind = AX->getAttrKind();
14371 if (Kind != AY->getAttrKind())
14373 QualType MX = AX->getModifiedType(), MY = AY->getModifiedType();
14381 case Type::BTFTagAttributed: {
14383 const BTFTypeTagAttr *AX = BX->getAttr();
14385 if (AX->getBTFTypeTag() !=
14394 if (KW != AY->getKeyword())
14398 AY->getTypeConstraintConcept());
14402 AY->getTypeConstraintArguments())) {
14410 false,
false, CD, As);
14412 case Type::PackIndexing:
14413 case Type::Decltype:
14415 case Type::DeducedTemplateSpecialization:
14418 case Type::MacroQualified: {
14422 if (IX != MY->getMacroIdentifier())
14426 case Type::SubstTemplateTypeParm: {
14433 unsigned Index = SX->getIndex();
14434 if (Index != SY->getIndex())
14436 auto PackIndex = SX->getPackIndex();
14437 if (PackIndex != SY->getPackIndex())
14440 CD, Index, PackIndex,
14441 SX->getFinal() && SY->getFinal());
14443 case Type::ObjCTypeParam:
14449 case Type::TemplateSpecialization: {
14454 TY->getTemplateName(),
true);
14459 TY->template_arguments()))
14465 case Type::Typedef: {
14475 case Type::TypeOf: {
14486 case Type::TypeOfExpr:
14489 case Type::UnaryTransform: {
14492 UnaryTransformType::UTTKind KX = UX->getUTTKind();
14493 if (KX != UY->getUTTKind())
14495 QualType BX = UX->getBaseType(), BY = UY->getBaseType();
14502 case Type::Using: {
14511 case Type::MemberPointer: {
14515 assert(Cls == PY->getMostRecentCXXRecordDecl());
14520 case Type::CountAttributed: {
14523 if (DX->isCountInBytes() != DY->isCountInBytes())
14525 if (DX->isOrNull() != DY->isOrNull())
14527 Expr *CEX = DX->getCountExpr();
14528 Expr *CEY = DY->getCountExpr();
14532 DX->isCountInBytes(), DX->isOrNull(),
14543 DX->isCountInBytes(), DX->isOrNull(),
14546 case Type::PredefinedSugar:
14551 llvm_unreachable(
"Unhandled Type Class");
14558 QualType NT =
T.Ty->getLocallyUnqualifiedSingleStepDesugaredType();
14573 if (
X.isCanonical())
14602 if (SX.
Ty != SY.Ty) {
14610 while (!Xs.empty() && !Ys.empty() && Xs.back().Ty == Ys.back().Ty) {
14613 SX = Xs.pop_back_val();
14614 SY = Ys.pop_back_val();
14617 if (KeepCommonQualifiers)
14624 while (!Xs.empty() && !Ys.empty()) {
14627 SX = Xs.pop_back_val();
14628 SY = Ys.pop_back_val();
14633 SX.
Ty = Underlying.Ty;
14636 QX -= Underlying.Quals;
14654 llvm_unreachable(
"Not a saturated fixed point type!");
14655 case BuiltinType::SatShortAccum:
14657 case BuiltinType::SatAccum:
14659 case BuiltinType::SatLongAccum:
14661 case BuiltinType::SatUShortAccum:
14663 case BuiltinType::SatUAccum:
14665 case BuiltinType::SatULongAccum:
14667 case BuiltinType::SatShortFract:
14669 case BuiltinType::SatFract:
14671 case BuiltinType::SatLongFract:
14673 case BuiltinType::SatUShortFract:
14675 case BuiltinType::SatUFract:
14677 case BuiltinType::SatULongFract:
14689 llvm_unreachable(
"Not a fixed point type!");
14690 case BuiltinType::ShortAccum:
14692 case BuiltinType::Accum:
14694 case BuiltinType::LongAccum:
14696 case BuiltinType::UShortAccum:
14698 case BuiltinType::UAccum:
14700 case BuiltinType::ULongAccum:
14702 case BuiltinType::ShortFract:
14704 case BuiltinType::Fract:
14706 case BuiltinType::LongFract:
14708 case BuiltinType::UShortFract:
14710 case BuiltinType::UFract:
14712 case BuiltinType::ULongFract:
14718 if (LangOpts.OpenCL)
14742 llvm_unreachable(
"Not a fixed point type!");
14743 case BuiltinType::ShortAccum:
14744 case BuiltinType::SatShortAccum:
14745 return Target.getShortAccumScale();
14746 case BuiltinType::Accum:
14747 case BuiltinType::SatAccum:
14748 return Target.getAccumScale();
14749 case BuiltinType::LongAccum:
14750 case BuiltinType::SatLongAccum:
14751 return Target.getLongAccumScale();
14752 case BuiltinType::UShortAccum:
14753 case BuiltinType::SatUShortAccum:
14754 return Target.getUnsignedShortAccumScale();
14755 case BuiltinType::UAccum:
14756 case BuiltinType::SatUAccum:
14757 return Target.getUnsignedAccumScale();
14758 case BuiltinType::ULongAccum:
14759 case BuiltinType::SatULongAccum:
14760 return Target.getUnsignedLongAccumScale();
14761 case BuiltinType::ShortFract:
14762 case BuiltinType::SatShortFract:
14763 return Target.getShortFractScale();
14764 case BuiltinType::Fract:
14765 case BuiltinType::SatFract:
14766 return Target.getFractScale();
14767 case BuiltinType::LongFract:
14768 case BuiltinType::SatLongFract:
14769 return Target.getLongFractScale();
14770 case BuiltinType::UShortFract:
14771 case BuiltinType::SatUShortFract:
14772 return Target.getUnsignedShortFractScale();
14773 case BuiltinType::UFract:
14774 case BuiltinType::SatUFract:
14775 return Target.getUnsignedFractScale();
14776 case BuiltinType::ULongFract:
14777 case BuiltinType::SatULongFract:
14778 return Target.getUnsignedLongFractScale();
14788 llvm_unreachable(
"Not a fixed point type!");
14789 case BuiltinType::ShortAccum:
14790 case BuiltinType::SatShortAccum:
14791 return Target.getShortAccumIBits();
14792 case BuiltinType::Accum:
14793 case BuiltinType::SatAccum:
14794 return Target.getAccumIBits();
14795 case BuiltinType::LongAccum:
14796 case BuiltinType::SatLongAccum:
14797 return Target.getLongAccumIBits();
14798 case BuiltinType::UShortAccum:
14799 case BuiltinType::SatUShortAccum:
14800 return Target.getUnsignedShortAccumIBits();
14801 case BuiltinType::UAccum:
14802 case BuiltinType::SatUAccum:
14803 return Target.getUnsignedAccumIBits();
14804 case BuiltinType::ULongAccum:
14805 case BuiltinType::SatULongAccum:
14806 return Target.getUnsignedLongAccumIBits();
14807 case BuiltinType::ShortFract:
14808 case BuiltinType::SatShortFract:
14809 case BuiltinType::Fract:
14810 case BuiltinType::SatFract:
14811 case BuiltinType::LongFract:
14812 case BuiltinType::SatLongFract:
14813 case BuiltinType::UShortFract:
14814 case BuiltinType::SatUShortFract:
14815 case BuiltinType::UFract:
14816 case BuiltinType::SatUFract:
14817 case BuiltinType::ULongFract:
14818 case BuiltinType::SatULongFract:
14823llvm::FixedPointSemantics
14826 "Can only get the fixed point semantics for a "
14827 "fixed point or integer type.");
14829 return llvm::FixedPointSemantics::GetIntegerSemantics(
14833 return llvm::FixedPointSemantics(
14836 !isSigned &&
getTargetInfo().doUnsignedFixedPointTypesHavePadding());
14851 "Expected unsigned fixed point type");
14854 case BuiltinType::UShortAccum:
14856 case BuiltinType::UAccum:
14858 case BuiltinType::ULongAccum:
14860 case BuiltinType::SatUShortAccum:
14862 case BuiltinType::SatUAccum:
14864 case BuiltinType::SatULongAccum:
14866 case BuiltinType::UShortFract:
14868 case BuiltinType::UFract:
14870 case BuiltinType::ULongFract:
14872 case BuiltinType::SatUShortFract:
14874 case BuiltinType::SatUFract:
14876 case BuiltinType::SatULongFract:
14879 llvm_unreachable(
"Unexpected unsigned fixed point type");
14887 std::vector<std::string> BackendFeats;
14888 llvm::AArch64::ExtensionSet FeatureBits;
14889 for (StringRef F : FMVFeatStrings)
14890 if (
auto FMVExt = llvm::AArch64::parseFMVExtension(F))
14892 FeatureBits.enable(*FMVExt->ID);
14893 FeatureBits.toLLVMFeatureList(BackendFeats);
14894 return BackendFeats;
14899 assert(TD !=
nullptr);
14902 llvm::erase_if(
ParsedAttr.Features, [&](
const std::string &Feat) {
14903 return !Target->isValidFeatureName(StringRef{Feat}.substr(1));
14914 Target->getTargetOpts().CPU,
14915 Target->getTargetOpts().Features);
14922 StringRef TargetCPU = Target->getTargetOpts().CPU;
14924 if (
const auto *TD = FD->
getAttr<TargetAttr>()) {
14930 if (!Target->getTriple().isAArch64())
14933 Target->getTargetOpts().FeaturesAsWritten.begin(),
14934 Target->getTargetOpts().FeaturesAsWritten.end());
14945 }
else if (
const auto *SD = FD->
getAttr<CPUSpecificAttr>()) {
14947 Target->getCPUSpecificCPUDispatchFeatures(
14949 std::vector<std::string> Features(FeaturesTmp.begin(), FeaturesTmp.end());
14950 Features.insert(Features.begin(),
14951 Target->getTargetOpts().FeaturesAsWritten.begin(),
14952 Target->getTargetOpts().FeaturesAsWritten.end());
14953 Target->initFeatureMap(FeatureMap,
getDiagnostics(), TargetCPU, Features);
14954 }
else if (
const auto *TC = FD->
getAttr<TargetClonesAttr>()) {
14955 if (Target->getTriple().isAArch64()) {
14959 Features.insert(Features.begin(),
14960 Target->getTargetOpts().FeaturesAsWritten.begin(),
14961 Target->getTargetOpts().FeaturesAsWritten.end());
14962 Target->initFeatureMap(FeatureMap,
getDiagnostics(), TargetCPU, Features);
14963 }
else if (Target->getTriple().isRISCV()) {
14965 std::vector<std::string> Features;
14966 if (VersionStr !=
"default") {
14968 Features.insert(Features.begin(),
ParsedAttr.Features.begin(),
14971 Features.insert(Features.begin(),
14972 Target->getTargetOpts().FeaturesAsWritten.begin(),
14973 Target->getTargetOpts().FeaturesAsWritten.end());
14974 Target->initFeatureMap(FeatureMap,
getDiagnostics(), TargetCPU, Features);
14976 std::vector<std::string> Features;
14978 if (VersionStr.starts_with(
"arch="))
14979 TargetCPU = VersionStr.drop_front(
sizeof(
"arch=") - 1);
14980 else if (VersionStr !=
"default")
14981 Features.push_back((StringRef{
"+"} + VersionStr).str());
14982 Target->initFeatureMap(FeatureMap,
getDiagnostics(), TargetCPU, Features);
14984 }
else if (
const auto *TV = FD->
getAttr<TargetVersionAttr>()) {
14985 std::vector<std::string> Features;
14986 if (Target->getTriple().isRISCV()) {
14988 Features.insert(Features.begin(),
ParsedAttr.Features.begin(),
14991 assert(Target->getTriple().isAArch64());
14993 TV->getFeatures(Feats);
14996 Features.insert(Features.begin(),
14997 Target->getTargetOpts().FeaturesAsWritten.begin(),
14998 Target->getTargetOpts().FeaturesAsWritten.end());
14999 Target->initFeatureMap(FeatureMap,
getDiagnostics(), TargetCPU, Features);
15001 FeatureMap = Target->getTargetOpts().FeatureMap;
15012 auto DeviceDiscriminatorOverrider =
15014 if (
const auto *RD = dyn_cast<CXXRecordDecl>(ND))
15016 return RD->getDeviceLambdaManglingNumber();
15017 return std::nullopt;
15020 Context, Context.getDiagnostics(), DeviceDiscriminatorOverrider)};
15028 std::string Buffer;
15029 Buffer.reserve(128);
15030 llvm::raw_string_ostream Out(Buffer);
15031 MC->mangleCanonicalTypeName(KernelNameType, Out);
15032 std::string KernelName = Out.str();
15034 return {KernelNameType, FD, KernelName};
15043 const auto *SKEPAttr = FD->
getAttr<SYCLKernelEntryPointAttr>();
15044 assert(SKEPAttr &&
"Missing sycl_kernel_entry_point attribute");
15053 "SYCL kernel name conflict");
15068 return &IT->second;
15074 return *OMPTraitInfoVector.back();
15081 return DB << Section.
Decl;
15082 return DB <<
"a prior #pragma section";
15086 bool IsInternalVar =
15089 bool IsExplicitDeviceVar = (D->
hasAttr<CUDADeviceAttr>() &&
15090 !D->
getAttr<CUDADeviceAttr>()->isImplicit()) ||
15091 (D->
hasAttr<CUDAConstantAttr>() &&
15092 !D->
getAttr<CUDAConstantAttr>()->isImplicit());
15096 return (IsInternalVar &&
15097 (D->
hasAttr<HIPManagedAttr>() || IsExplicitDeviceVar)) ||
15098 (D->
hasAttr<CUDAGlobalAttr>() &&
15105 (D->
hasAttr<HIPManagedAttr>() || D->
hasAttr<CUDAGlobalAttr>() ||
15110 if (!CUIDHash.empty())
15112 if (LangOpts.CUID.empty())
15113 return StringRef();
15114 CUIDHash = llvm::utohexstr(llvm::MD5Hash(LangOpts.CUID),
true);
15124 assert(PrimaryBase);
15127 auto Base = Layout.getPrimaryBase();
15128 if (!
Base ||
Base == PrimaryBase || !
Base->isPolymorphic())
15130 PrimaryBase =
Base;
15132 return PrimaryBase;
15136 StringRef MangledName) {
15138 assert(
Method->isVirtual());
15139 bool DefaultIncludesPointerAuth =
15140 LangOpts.PointerAuthCalls || LangOpts.PointerAuthIntrinsics;
15142 if (!DefaultIncludesPointerAuth)
15145 auto Existing = ThunksToBeAbbreviated.find(VirtualMethodDecl);
15146 if (Existing != ThunksToBeAbbreviated.end())
15147 return Existing->second.contains(MangledName.str());
15150 llvm::StringMap<llvm::SmallVector<std::string, 2>> Thunks;
15152 if (
const auto *ThunkInfos = VtableContext->getThunkInfo(VirtualMethodDecl)) {
15154 for (
const auto &Thunk : *ThunkInfos) {
15156 llvm::raw_svector_ostream ElidedNameStream(ElidedName);
15162 Mangler->mangleThunk(
Method, Thunk,
true,
15165 llvm::raw_svector_ostream mangledNameStream(MangledName);
15169 mangledNameStream);
15171 Mangler->mangleThunk(
Method, Thunk,
false,
15172 mangledNameStream);
15174 Thunks[ElidedName].push_back(std::string(MangledName));
15177 llvm::StringSet<> SimplifiedThunkNames;
15178 for (
auto &ThunkList : Thunks) {
15179 llvm::sort(ThunkList.second);
15180 SimplifiedThunkNames.insert(ThunkList.second[0]);
15182 bool Result = SimplifiedThunkNames.contains(MangledName);
15183 ThunksToBeAbbreviated[VirtualMethodDecl] = std::move(SimplifiedThunkNames);
This file provides AST data structures related to concepts.
static void SortAndUniqueProtocols(SmallVectorImpl< ObjCProtocolDecl * > &Protocols)
static bool isCanonicalExceptionSpecification(const FunctionProtoType::ExceptionSpecInfo &ESI, bool NoexceptInType)
static SourceLocation getCommonAttrLoc(const T *X, const T *Y)
static auto getCanonicalTemplateArguments(const ASTContext &C, ArrayRef< TemplateArgument > Args, bool &AnyNonCanonArgs)
static char getObjCEncodingForPrimitiveType(const ASTContext *C, const BuiltinType *BT)
static bool isSameQualifier(const NestedNameSpecifier X, const NestedNameSpecifier Y)
static bool unionHasUniqueObjectRepresentations(const ASTContext &Context, const RecordDecl *RD, bool CheckIfTriviallyCopyable)
static TypedefDecl * CreateHexagonBuiltinVaListDecl(const ASTContext *Context)
#define CANONICAL_TYPE(Class)
static ElaboratedTypeKeyword getCommonTypeKeyword(const T *X, const T *Y, bool IsSame)
static Decl * getCommonDecl(Decl *X, Decl *Y)
static GVALinkage adjustGVALinkageForAttributes(const ASTContext &Context, const Decl *D, GVALinkage L)
static bool isTypeTypedefedAsBOOL(QualType T)
static void EncodeBitField(const ASTContext *Ctx, std::string &S, QualType T, const FieldDecl *FD)
static GVALinkage basicGVALinkageForVariable(const ASTContext &Context, const VarDecl *VD)
static const TemplateArgument * getDefaultTemplateArgumentOrNone(const NamedDecl *P)
static QualType getCommonArrayElementType(const ASTContext &Ctx, const T *X, Qualifiers &QX, const T *Y, Qualifiers &QY)
#define SUGAR_FREE_TYPE(Class)
static SYCLKernelInfo BuildSYCLKernelInfo(ASTContext &Context, CanQualType KernelNameType, const FunctionDecl *FD)
static bool hasTemplateSpecializationInEncodedString(const Type *T, bool VisitBasesAndFields)
static void getIntersectionOfProtocols(ASTContext &Context, const ObjCInterfaceDecl *CommonBase, const ObjCObjectPointerType *LHSOPT, const ObjCObjectPointerType *RHSOPT, SmallVectorImpl< ObjCProtocolDecl * > &IntersectionSet)
getIntersectionOfProtocols - This routine finds the intersection of set of protocols inherited from t...
static bool areCompatMatrixTypes(const ConstantMatrixType *LHS, const ConstantMatrixType *RHS)
areCompatMatrixTypes - Return true if the two specified matrix types are compatible.
static TypedefDecl * CreateAAPCSABIBuiltinVaListDecl(const ASTContext *Context)
static bool sameObjCTypeArgs(ASTContext &ctx, const ObjCInterfaceDecl *iface, ArrayRef< QualType > lhsArgs, ArrayRef< QualType > rhsArgs, bool stripKindOf)
static bool canAssignObjCObjectTypes(ASTContext &ctx, QualType lhs, QualType rhs)
Determine whether the first type is a subtype of the second.
static const Type * getIntegerTypeForEnum(const EnumType *ET)
static bool hasSameCudaAttrs(const FunctionDecl *A, const FunctionDecl *B)
static const Decl & adjustDeclToTemplate(const Decl &D)
If we have a 'templated' declaration for a template, adjust 'D' to refer to the actual template.
static TemplateName getCommonTemplateName(const ASTContext &Ctx, TemplateName X, TemplateName Y, bool IgnoreDeduced=false)
static int CmpProtocolNames(ObjCProtocolDecl *const *LHS, ObjCProtocolDecl *const *RHS)
CmpProtocolNames - Comparison predicate for sorting protocols alphabetically.
static auto * getCommonSizeExpr(const ASTContext &Ctx, T *X, T *Y)
static TypedefDecl * CreatePowerABIBuiltinVaListDecl(const ASTContext *Context)
static auto getCommonSizeModifier(const ArrayType *X, const ArrayType *Y)
static TemplateArgument getCommonTemplateArgument(const ASTContext &Ctx, const TemplateArgument &X, const TemplateArgument &Y)
static std::optional< int64_t > structHasUniqueObjectRepresentations(const ASTContext &Context, const RecordDecl *RD, bool CheckIfTriviallyCopyable)
static bool hasSameOverloadableAttrs(const FunctionDecl *A, const FunctionDecl *B)
Determine whether the attributes we can overload on are identical for A and B.
static T * getCommonDeclChecked(T *X, T *Y)
static NestedNameSpecifier getCommonNNS(const ASTContext &Ctx, NestedNameSpecifier NNS1, NestedNameSpecifier NNS2, bool IsSame)
Returns a NestedNameSpecifier which has only the common sugar present in both NNS1 and NNS2.
static TypedefDecl * CreateVoidPtrBuiltinVaListDecl(const ASTContext *Context)
static int64_t getSubobjectOffset(const FieldDecl *Field, const ASTContext &Context, const clang::ASTRecordLayout &)
static QualType getCommonSugarTypeNode(const ASTContext &Ctx, const Type *X, const Type *Y, SplitQualType Underlying)
static TypedefDecl * CreateAArch64ABIBuiltinVaListDecl(const ASTContext *Context)
static QualType getCommonNonSugarTypeNode(const ASTContext &Ctx, const Type *X, Qualifiers &QX, const Type *Y, Qualifiers &QY)
static QualType mergeEnumWithInteger(ASTContext &Context, const EnumType *ET, QualType other, bool isBlockReturnType)
Given that we have an enum type and a non-enum type, try to merge them.
static GVALinkage adjustGVALinkageForExternalDefinitionKind(const ASTContext &Ctx, const Decl *D, GVALinkage L)
Adjust the GVALinkage for a declaration based on what an external AST source knows about whether ther...
static TypedefDecl * CreateSystemZBuiltinVaListDecl(const ASTContext *Context)
static std::optional< int64_t > getSubobjectSizeInBits(const FieldDecl *Field, const ASTContext &Context, bool CheckIfTriviallyCopyable)
static GVALinkage basicGVALinkageForFunction(const ASTContext &Context, const FunctionDecl *FD)
#define NON_UNIQUE_TYPE(Class)
static TypedefDecl * CreateX86_64ABIBuiltinVaListDecl(const ASTContext *Context)
static bool isAddrSpaceMapManglingEnabled(const TargetInfo &TI, const LangOptions &LangOpts)
static ElaboratedTypeKeyword getCanonicalElaboratedTypeKeyword(ElaboratedTypeKeyword Keyword)
static QualType getCommonPointeeType(const ASTContext &Ctx, const T *X, const T *Y)
static auto getCommonIndexTypeCVRQualifiers(const ArrayType *X, const ArrayType *Y)
static QualType DecodeTypeFromStr(const char *&Str, const ASTContext &Context, ASTContext::GetBuiltinTypeError &Error, bool &RequiresICE, bool AllowTypeModifiers)
DecodeTypeFromStr - This decodes one type descriptor from Str, advancing the pointer over the consume...
static TypedefDecl * CreateCharPtrBuiltinVaListDecl(const ASTContext *Context)
static bool areSortedAndUniqued(ArrayRef< ObjCProtocolDecl * > Protocols)
static TypeInfoChars getConstantArrayInfoInChars(const ASTContext &Context, const ConstantArrayType *CAT)
getConstantArrayInfoInChars - Performing the computation in CharUnits instead of in bits prevents ove...
static FloatingRank getFloatingRank(QualType T)
getFloatingRank - Return a relative rank for floating point types.
static bool getCommonTemplateArguments(const ASTContext &Ctx, SmallVectorImpl< TemplateArgument > &R, ArrayRef< TemplateArgument > Xs, ArrayRef< TemplateArgument > Ys)
static TypedefDecl * CreateXtensaABIBuiltinVaListDecl(const ASTContext *Context)
static QualType getCommonElementType(const ASTContext &Ctx, const T *X, const T *Y)
static void mergeTypeLists(const ASTContext &Ctx, SmallVectorImpl< QualType > &Out, ArrayRef< QualType > X, ArrayRef< QualType > Y)
static void encodeTypeForFunctionPointerAuth(const ASTContext &Ctx, raw_ostream &OS, QualType QT)
Encode a function type for use in the discriminator of a function pointer type.
static std::optional< int64_t > structSubobjectsHaveUniqueObjectRepresentations(const RangeT &Subobjects, int64_t CurOffsetInBits, const ASTContext &Context, const clang::ASTRecordLayout &Layout, bool CheckIfTriviallyCopyable)
static uint64_t getRVVTypeSize(ASTContext &Context, const BuiltinType *Ty)
getRVVTypeSize - Return RVV vector register size.
static auto unwrapSugar(SplitQualType &T, Qualifiers &QTotal)
static TemplateName getCommonTemplateNameChecked(const ASTContext &Ctx, TemplateName X, TemplateName Y, bool IgnoreDeduced)
static int compareObjCProtocolsByName(ObjCProtocolDecl *const *lhs, ObjCProtocolDecl *const *rhs)
Comparison routine for Objective-C protocols to be used with llvm::array_pod_sort.
static std::string charUnitsToString(const CharUnits &CU)
static const TagDecl * getNonInjectedClassName(const TagDecl *TD)
static bool hasAnyPackExpansions(ArrayRef< TemplateArgument > Args)
static char ObjCEncodingForEnumDecl(const ASTContext *C, const EnumDecl *ED)
static void addRedeclaredMethods(const ObjCMethodDecl *ObjCMethod, SmallVectorImpl< const NamedDecl * > &Redeclared)
static SmallVector< SourceLocation, 2 > getDeclLocsForCommentSearch(const Decl *D, SourceManager &SourceMgr)
static auto getCommonTypes(const ASTContext &Ctx, ArrayRef< QualType > Xs, ArrayRef< QualType > Ys, bool Unqualified=false)
static bool isCanonicalResultType(QualType T)
Determine whether T is canonical as the result type of a function.
static TypedefDecl * CreateMSVaListDecl(const ASTContext *Context)
static bool areCompatVectorTypes(const VectorType *LHS, const VectorType *RHS)
areCompatVectorTypes - Return true if the two specified vector types are compatible.
static TypedefDecl * CreateCharPtrNamedVaListDecl(const ASTContext *Context, StringRef Name)
static NestedNameSpecifier getCommonQualifier(const ASTContext &Ctx, const T *X, const T *Y, bool IsSame)
#define UNEXPECTED_TYPE(Class, Kind)
static TypedefDecl * CreateVaListDecl(const ASTContext *Context, TargetInfo::BuiltinVaListKind Kind)
static bool primaryBaseHaseAddressDiscriminatedVTableAuthentication(const ASTContext &Context, const CXXRecordDecl *Class)
static std::vector< std::string > getFMVBackendFeaturesFor(const llvm::SmallVectorImpl< StringRef > &FMVFeatStrings)
Defines the clang::ASTContext interface.
#define BuiltinTemplate(BTName)
Provides definitions for the various language-specific address spaces.
static bool isUnsigned(SValBuilder &SVB, NonLoc Value)
Defines enum values for all the target-independent builtin functions.
static bool CanThrow(Expr *E, ASTContext &Ctx)
static Decl::Kind getKind(const Decl *D)
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
This file defines OpenMP nodes for declarative directives.
Defines the C++ template declaration subclasses.
Defines the ExceptionSpecificationType enumeration and various utility functions.
Defines the clang::Expr interface and subclasses for C++ expressions.
Defines the clang::IdentifierInfo, clang::IdentifierTable, and clang::Selector interfaces.
static const Decl * getCanonicalDecl(const Decl *D)
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified.
Defines the clang::LangOptions interface.
llvm::MachO::Record Record
static bool hasFeature(StringRef Feature, const LangOptions &LangOpts, const TargetInfo &Target)
Determine whether a translation unit built using the current language options has the given feature.
Defines the clang::Module class, which describes a module in the source code.
Defines types useful for describing an Objective-C runtime.
static bool compare(const PathDiagnostic &X, const PathDiagnostic &Y)
static QualType getUnderlyingType(const SubRegion *R)
Defines the clang::SourceLocation class and associated facilities.
Defines the SourceManager interface.
Defines various enumerations that describe declaration and type specifiers.
static QualType getPointeeType(const MemRegion *R)
Defines the TargetCXXABI class, which abstracts details of the C++ ABI that we're targeting.
Defines the clang::TypeLoc interface and its subclasses.
C Language Family Type Representation.
__device__ __2f16 float c
QualType getReadPipeType(QualType T) const
Return a read_only pipe type for the specified type.
QualType getWritePipeType(QualType T) const
Return a write_only pipe type for the specified type.
@ GE_Missing_stdio
Missing a type from <stdio.h>
@ GE_Missing_ucontext
Missing a type from <ucontext.h>
@ GE_Missing_setjmp
Missing a type from <setjmp.h>
RawComment * getRawCommentForDeclNoCacheImpl(const Decl *D, const SourceLocation RepresentativeLocForDecl, const std::map< unsigned, RawComment * > &CommentsInFile) const
APValue - This class implements a discriminated union of [uninitialized] [APSInt] [APFloat],...
bool isMemberPointerToDerivedMember() const
const ValueDecl * getMemberPointerDecl() const
ArrayRef< const CXXRecordDecl * > getMemberPointerPath() const
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
bool getByrefLifetime(QualType Ty, Qualifiers::ObjCLifetime &Lifetime, bool &HasByrefExtendedLayout) const
Returns true, if given type has a known lifetime.
MSGuidDecl * getMSGuidDecl(MSGuidDeclParts Parts) const
Return a declaration for the global GUID object representing the given GUID value.
BuiltinVectorTypeInfo getBuiltinVectorTypeInfo(const BuiltinType *VecTy) const
Returns the element type, element count and number of vectors (in case of tuple) for a builtin vector...
bool ObjCMethodsAreEqual(const ObjCMethodDecl *MethodDecl, const ObjCMethodDecl *MethodImp)
CanQualType ObjCBuiltinSelTy
TranslationUnitDecl * getTranslationUnitDecl() const
const ConstantArrayType * getAsConstantArrayType(QualType T) const
CanQualType getCanonicalFunctionResultType(QualType ResultType) const
Adjust the given function result type.
QualType getAtomicType(QualType T) const
Return the uniqued reference to the atomic type for the specified type.
LangAS getOpenCLTypeAddrSpace(const Type *T) const
Get address space for OpenCL type.
CharUnits getTypeAlignInChars(QualType T) const
Return the ABI-specified alignment of a (complete) type T, in characters.
void InitBuiltinTypes(const TargetInfo &Target, const TargetInfo *AuxTarget=nullptr)
Initialize built-in types.
ParentMapContext & getParentMapContext()
Returns the dynamic AST node parent map context.
QualType getParenType(QualType NamedType) const
size_t getSideTableAllocatedMemory() const
Return the total memory used for various side tables.
MemberSpecializationInfo * getInstantiatedFromStaticDataMember(const VarDecl *Var)
If this variable is an instantiated static data member of a class template specialization,...
QualType getRValueReferenceType(QualType T) const
Return the uniqued reference to the type for an rvalue reference to the specified type.
CanQualType ARCUnbridgedCastTy
QualType getDependentSizedMatrixType(QualType ElementType, Expr *RowExpr, Expr *ColumnExpr, SourceLocation AttrLoc) const
Return the unique reference to the matrix type of the specified element type and size.
QualType getBTFTagAttributedType(const BTFTypeTagAttr *BTFAttr, QualType Wrapped) const
llvm::DenseMap< const Decl *, comments::FullComment * > ParsedComments
Mapping from declarations to parsed comments attached to any redeclaration.
unsigned getManglingNumber(const NamedDecl *ND, bool ForAuxTarget=false) const
unsigned getIntWidth(QualType T) const
CanQualType getCanonicalParamType(QualType T) const
Return the canonical parameter type corresponding to the specific potentially non-canonical one.
const FunctionType * adjustFunctionType(const FunctionType *Fn, FunctionType::ExtInfo EInfo)
Change the ExtInfo on a function type.
TemplateOrSpecializationInfo getTemplateOrSpecializationInfo(const VarDecl *Var)
InlineVariableDefinitionKind
@ None
Not an inline variable.
@ Weak
Weak definition of inline variable.
@ Strong
Strong definition.
@ WeakUnknown
Weak for now, might become strong later in this TU.
void setObjCConstantStringInterface(ObjCInterfaceDecl *Decl)
TypedefDecl * getObjCClassDecl() const
Retrieve the typedef declaration corresponding to the predefined Objective-C 'Class' type.
TypedefNameDecl * getTypedefNameForUnnamedTagDecl(const TagDecl *TD)
TypedefDecl * getCFConstantStringDecl() const
CanQualType SatUnsignedFractTy
void setInstantiatedFromUsingDecl(NamedDecl *Inst, NamedDecl *Pattern)
Remember that the using decl Inst is an instantiation of the using decl Pattern of a class template.
bool areCompatibleRVVTypes(QualType FirstType, QualType SecondType)
Return true if the given types are an RISC-V vector builtin type and a VectorType that is a fixed-len...
ExternCContextDecl * getExternCContextDecl() const
const llvm::fltSemantics & getFloatTypeSemantics(QualType T) const
Return the APFloat 'semantics' for the specified scalar floating point type.
ParsedTargetAttr filterFunctionTargetAttrs(const TargetAttr *TD) const
Parses the target attributes passed in, and returns only the ones that are valid feature names.
QualType areCommonBaseCompatible(const ObjCObjectPointerType *LHSOPT, const ObjCObjectPointerType *RHSOPT)
TypedefDecl * getObjCSelDecl() const
Retrieve the typedef corresponding to the predefined 'SEL' type in Objective-C.
CanQualType UnsignedShortAccumTy
TypedefDecl * getObjCInstanceTypeDecl()
Retrieve the typedef declaration corresponding to the Objective-C "instancetype" type.
QualType adjustFunctionResultType(QualType FunctionType, QualType NewResultType)
Change the result type of a function type, preserving sugar such as attributed types.
void setTemplateOrSpecializationInfo(VarDecl *Inst, TemplateOrSpecializationInfo TSI)
bool isTypeAwareOperatorNewOrDelete(const FunctionDecl *FD) const
bool ProtocolCompatibleWithProtocol(ObjCProtocolDecl *lProto, ObjCProtocolDecl *rProto) const
ProtocolCompatibleWithProtocol - return 'true' if 'lProto' is in the inheritance hierarchy of 'rProto...
TypedefDecl * buildImplicitTypedef(QualType T, StringRef Name) const
Create a new implicit TU-level typedef declaration.
QualType getCanonicalTemplateSpecializationType(ElaboratedTypeKeyword Keyword, TemplateName T, ArrayRef< TemplateArgument > CanonicalArgs) const
QualType getObjCInterfaceType(const ObjCInterfaceDecl *Decl, ObjCInterfaceDecl *PrevDecl=nullptr) const
getObjCInterfaceType - Return the unique reference to the type for the specified ObjC interface decl.
void adjustObjCTypeParamBoundType(const ObjCTypeParamDecl *Orig, ObjCTypeParamDecl *New) const
QualType getBlockPointerType(QualType T) const
Return the uniqued reference to the type for a block of the specified type.
TemplateArgument getCanonicalTemplateArgument(const TemplateArgument &Arg) const
Retrieve the "canonical" template argument.
QualType getAutoRRefDeductType() const
C++11 deduction pattern for 'auto &&' type.
TypedefDecl * getBuiltinMSVaListDecl() const
Retrieve the C type declaration corresponding to the predefined __builtin_ms_va_list type.
bool ObjCQualifiedIdTypesAreCompatible(const ObjCObjectPointerType *LHS, const ObjCObjectPointerType *RHS, bool ForCompare)
ObjCQualifiedIdTypesAreCompatible - We know that one of lhs/rhs is an ObjCQualifiedIDType.
QualType mergeFunctionTypes(QualType, QualType, bool OfBlockPointer=false, bool Unqualified=false, bool AllowCXX=false, bool IsConditionalOperator=false)
NamedDecl * getInstantiatedFromUsingDecl(NamedDecl *Inst)
If the given using decl Inst is an instantiation of another (possibly unresolved) using decl,...
DeclarationNameTable DeclarationNames
comments::FullComment * cloneFullComment(comments::FullComment *FC, const Decl *D) const
CharUnits getObjCEncodingTypeSize(QualType T) const
Return the size of type T for Objective-C encoding purpose, in characters.
int getIntegerTypeOrder(QualType LHS, QualType RHS) const
Return the highest ranked integer type, see C99 6.3.1.8p1.
QualType getAttributedType(attr::Kind attrKind, QualType modifiedType, QualType equivalentType, const Attr *attr=nullptr) const
TypedefDecl * getObjCIdDecl() const
Retrieve the typedef corresponding to the predefined id type in Objective-C.
void setCurrentNamedModule(Module *M)
Set the (C++20) module we are building.
QualType getProcessIDType() const
Return the unique type for "pid_t" defined in <sys/types.h>.
CharUnits getMemberPointerPathAdjustment(const APValue &MP) const
Find the 'this' offset for the member path in a pointer-to-member APValue.
bool mayExternalize(const Decl *D) const
Whether a C++ static variable or CUDA/HIP kernel may be externalized.
std::unique_ptr< MangleNumberingContext > createMangleNumberingContext() const
QualType getUnsignedPointerDiffType() const
Return the unique unsigned counterpart of "ptrdiff_t" integer type.
QualType getScalableVectorType(QualType EltTy, unsigned NumElts, unsigned NumFields=1) const
Return the unique reference to a scalable vector type of the specified element type and scalable numb...
bool hasSameExpr(const Expr *X, const Expr *Y) const
Determine whether the given expressions X and Y are equivalent.
void getObjCEncodingForType(QualType T, std::string &S, const FieldDecl *Field=nullptr, QualType *NotEncodedT=nullptr) const
Emit the Objective-CC type encoding for the given type T into S.
MangleContext * createMangleContext(const TargetInfo *T=nullptr)
If T is null pointer, assume the target in ASTContext.
QualType getRealTypeForBitwidth(unsigned DestWidth, FloatModeKind ExplicitType) const
getRealTypeForBitwidth - sets floating point QualTy according to specified bitwidth.
QualType getFunctionNoProtoType(QualType ResultTy, const FunctionType::ExtInfo &Info) const
Return a K&R style C function type like 'int()'.
ASTMutationListener * getASTMutationListener() const
Retrieve a pointer to the AST mutation listener associated with this AST context, if any.
unsigned NumImplicitCopyAssignmentOperatorsDeclared
The number of implicitly-declared copy assignment operators for which declarations were built.
uint64_t getTargetNullPointerValue(QualType QT) const
Get target-dependent integer value for null pointer which is used for constant folding.
unsigned getTypeUnadjustedAlign(QualType T) const
Return the ABI-specified natural alignment of a (complete) type T, before alignment adjustments,...
unsigned char getFixedPointIBits(QualType Ty) const
QualType getSubstBuiltinTemplatePack(const TemplateArgument &ArgPack)
QualType getCorrespondingSignedFixedPointType(QualType Ty) const
IntrusiveRefCntPtr< ExternalASTSource > ExternalSource
QualType getArrayParameterType(QualType Ty) const
Return the uniqued reference to a specified array parameter type from the original array type.
QualType getCountAttributedType(QualType T, Expr *CountExpr, bool CountInBytes, bool OrNull, ArrayRef< TypeCoupledDeclRefInfo > DependentDecls) const
const ASTRecordLayout & getASTRecordLayout(const RecordDecl *D) const
Get or compute information about the layout of the specified record (struct/union/class) D,...
CanQualType getCanonicalType(QualType T) const
Return the canonical (structural) type corresponding to the specified potentially non-canonical type ...
unsigned NumImplicitDestructorsDeclared
The number of implicitly-declared destructors for which declarations were built.
bool mergeExtParameterInfo(const FunctionProtoType *FirstFnType, const FunctionProtoType *SecondFnType, bool &CanUseFirst, bool &CanUseSecond, SmallVectorImpl< FunctionProtoType::ExtParameterInfo > &NewParamInfos)
This function merges the ExtParameterInfo lists of two functions.
bool ObjCQualifiedClassTypesAreCompatible(const ObjCObjectPointerType *LHS, const ObjCObjectPointerType *RHS)
ObjCQualifiedClassTypesAreCompatible - compare Class<pr,...> and Class<pr1, ...>.
bool shouldExternalize(const Decl *D) const
Whether a C++ static variable or CUDA/HIP kernel should be externalized.
bool hasSameType(QualType T1, QualType T2) const
Determine whether the given types T1 and T2 are equivalent.
bool propertyTypesAreCompatible(QualType, QualType)
void setInstantiatedFromUsingShadowDecl(UsingShadowDecl *Inst, UsingShadowDecl *Pattern)
QualType getDependentVectorType(QualType VectorType, Expr *SizeExpr, SourceLocation AttrLoc, VectorKind VecKind) const
Return the unique reference to the type for a dependently sized vector of the specified element type.
CanQualType SatLongAccumTy
CanQualType getIntMaxType() const
Return the unique type for "intmax_t" (C99 7.18.1.5), defined in <stdint.h>.
QualType getVectorType(QualType VectorType, unsigned NumElts, VectorKind VecKind) const
Return the unique reference to a vector type of the specified element type and size.
OpenCLTypeKind getOpenCLTypeKind(const Type *T) const
Map an AST Type to an OpenCLTypeKind enum value.
TemplateName getDependentTemplateName(const DependentTemplateStorage &Name) const
Retrieve the template name that represents a dependent template name such as MetaFun::template operat...
ArrayRef< Decl * > getModuleInitializers(Module *M)
Get the initializations to perform when importing a module, if any.
void getObjCEncodingForTypeQualifier(Decl::ObjCDeclQualifier QT, std::string &S) const
Put the string version of the type qualifiers QT into S.
unsigned getPreferredTypeAlign(QualType T) const
Return the "preferred" alignment of the specified type T for the current target, in bits.
std::string getObjCEncodingForMethodDecl(const ObjCMethodDecl *Decl, bool Extended=false) const
Emit the encoded type for the method declaration Decl into S.
bool DeclMustBeEmitted(const Decl *D)
Determines if the decl can be CodeGen'ed or deserialized from PCH lazily, only when used; this is onl...
CanQualType OMPArrayShapingTy
ASTContext(LangOptions &LOpts, SourceManager &SM, IdentifierTable &idents, SelectorTable &sels, Builtin::Context &builtins, TranslationUnitKind TUKind)
QualType getReadPipeType(QualType T) const
Return a read_only pipe type for the specified type.
std::string getObjCEncodingForPropertyDecl(const ObjCPropertyDecl *PD, const Decl *Container) const
getObjCEncodingForPropertyDecl - Return the encoded type for this method declaration.
TemplateName getCanonicalTemplateName(TemplateName Name, bool IgnoreDeduced=false) const
Retrieves the "canonical" template name that refers to a given template.
unsigned getStaticLocalNumber(const VarDecl *VD) const
void addComment(const RawComment &RC)
void getLegacyIntegralTypeEncoding(QualType &t) const
getLegacyIntegralTypeEncoding - Another legacy compatibility encoding: 32-bit longs are encoded as 'l...
bool isSameTypeConstraint(const TypeConstraint *XTC, const TypeConstraint *YTC) const
Determine whether two type contraint are similar enough that they could used in declarations of the s...
void setRelocationInfoForCXXRecord(const CXXRecordDecl *, CXXRecordDeclRelocationInfo)
QualType getSubstTemplateTypeParmType(QualType Replacement, Decl *AssociatedDecl, unsigned Index, UnsignedOrNone PackIndex, bool Final) const
Retrieve a substitution-result type.
RecordDecl * buildImplicitRecord(StringRef Name, RecordDecl::TagKind TK=RecordDecl::TagKind::Struct) const
Create a new implicit TU-level CXXRecordDecl or RecordDecl declaration.
QualType getPointerType(QualType T) const
Return the uniqued reference to the type for a pointer to the specified type.
const CXXMethodDecl * getCurrentKeyFunction(const CXXRecordDecl *RD)
Get our current best idea for the key function of the given record decl, or nullptr if there isn't on...
CanQualType UnsignedLongFractTy
QualType mergeTagDefinitions(QualType, QualType)
overridden_method_range overridden_methods(const CXXMethodDecl *Method) const
void setIsTypeAwareOperatorNewOrDelete(const FunctionDecl *FD, bool IsTypeAware)
QualType getDependentBitIntType(bool Unsigned, Expr *BitsExpr) const
Return a dependent bit-precise integer type with the specified signedness and bit count.
void setObjCImplementation(ObjCInterfaceDecl *IFaceD, ObjCImplementationDecl *ImplD)
Set the implementation of ObjCInterfaceDecl.
StringRef getCUIDHash() const
bool isMSStaticDataMemberInlineDefinition(const VarDecl *VD) const
Returns true if this is an inline-initialized static data member which is treated as a definition for...
bool canAssignObjCInterfaces(const ObjCObjectPointerType *LHSOPT, const ObjCObjectPointerType *RHSOPT)
canAssignObjCInterfaces - Return true if the two interface types are compatible for assignment from R...
QualType getReferenceQualifiedType(const Expr *e) const
getReferenceQualifiedType - Given an expr, will return the type for that expression,...
bool hasSameFunctionTypeIgnoringExceptionSpec(QualType T, QualType U) const
Determine whether two function types are the same, ignoring exception specifications in cases where t...
QualType getBlockDescriptorExtendedType() const
Gets the struct used to keep track of the extended descriptor for pointer to blocks.
QualType getLValueReferenceType(QualType T, bool SpelledAsLValue=true) const
Return the uniqued reference to the type for an lvalue reference to the specified type.
bool QIdProtocolsAdoptObjCObjectProtocols(QualType QT, ObjCInterfaceDecl *IDecl)
QIdProtocolsAdoptObjCObjectProtocols - Checks that protocols in QT's qualified-id protocol list adopt...
FunctionProtoType::ExceptionSpecInfo mergeExceptionSpecs(FunctionProtoType::ExceptionSpecInfo ESI1, FunctionProtoType::ExceptionSpecInfo ESI2, SmallVectorImpl< QualType > &ExceptionTypeStorage, bool AcceptDependent) const
void addLazyModuleInitializers(Module *M, ArrayRef< GlobalDeclID > IDs)
bool isSameConstraintExpr(const Expr *XCE, const Expr *YCE) const
Determine whether two 'requires' expressions are similar enough that they may be used in re-declarati...
bool BlockRequiresCopying(QualType Ty, const VarDecl *D)
Returns true iff we need copy/dispose helpers for the given type.
QualType getUsingType(ElaboratedTypeKeyword Keyword, NestedNameSpecifier Qualifier, const UsingShadowDecl *D, QualType UnderlyingType=QualType()) const
CanQualType OMPIteratorTy
Builtin::Context & BuiltinInfo
QualType getConstantArrayType(QualType EltTy, const llvm::APInt &ArySize, const Expr *SizeExpr, ArraySizeModifier ASM, unsigned IndexTypeQuals) const
Return the unique reference to the type for a constant array of the specified element type.
void addModuleInitializer(Module *M, Decl *Init)
Add a declaration to the list of declarations that are initialized for a module.
const LangOptions & getLangOpts() const
QualType getFunctionTypeWithoutPtrSizes(QualType T)
Get a function type and produce the equivalent function type where pointer size address spaces in the...
uint64_t lookupFieldBitOffset(const ObjCInterfaceDecl *OID, const ObjCIvarDecl *Ivar) const
Get the offset of an ObjCIvarDecl in bits.
SelectorTable & Selectors
bool isTypeIgnoredBySanitizer(const SanitizerMask &Mask, const QualType &Ty) const
Check if a type can have its sanitizer instrumentation elided based on its presence within an ignorel...
unsigned getMinGlobalAlignOfVar(uint64_t Size, const VarDecl *VD) const
Return the minimum alignment as specified by the target.
RawCommentList Comments
All comments in this translation unit.
bool isSameDefaultTemplateArgument(const NamedDecl *X, const NamedDecl *Y) const
Determine whether two default template arguments are similar enough that they may be used in declarat...
QualType applyObjCProtocolQualifiers(QualType type, ArrayRef< ObjCProtocolDecl * > protocols, bool &hasError, bool allowOnPointerType=false) const
Apply Objective-C protocol qualifiers to the given type.
QualType getMacroQualifiedType(QualType UnderlyingTy, const IdentifierInfo *MacroII) const
QualType removePtrSizeAddrSpace(QualType T) const
Remove the existing address space on the type if it is a pointer size address space and return the ty...
bool areLaxCompatibleRVVTypes(QualType FirstType, QualType SecondType)
Return true if the given vector types are lax-compatible RISC-V vector types as defined by -flax-vect...
CanQualType SatShortFractTy
QualType getDecayedType(QualType T) const
Return the uniqued reference to the decayed version of the given type.
CallingConv getDefaultCallingConvention(bool IsVariadic, bool IsCXXMethod) const
Retrieves the default calling convention for the current context.
bool canBindObjCObjectType(QualType To, QualType From)
TemplateTemplateParmDecl * insertCanonicalTemplateTemplateParmDeclInternal(TemplateTemplateParmDecl *CanonTTP) const
int getFloatingTypeSemanticOrder(QualType LHS, QualType RHS) const
Compare the rank of two floating point types as above, but compare equal if both types have the same ...
QualType getUIntPtrType() const
Return a type compatible with "uintptr_t" (C99 7.18.1.4), as defined by the target.
void setParameterIndex(const ParmVarDecl *D, unsigned index)
Used by ParmVarDecl to store on the side the index of the parameter when it exceeds the size of the n...
QualType getFunctionTypeWithExceptionSpec(QualType Orig, const FunctionProtoType::ExceptionSpecInfo &ESI) const
Get a function type and produce the equivalent function type with the specified exception specificati...
QualType getDependentNameType(ElaboratedTypeKeyword Keyword, NestedNameSpecifier NNS, const IdentifierInfo *Name) const
Qualifiers::GC getObjCGCAttrKind(QualType Ty) const
Return one of the GCNone, Weak or Strong Objective-C garbage collection attributes.
bool hasUniqueObjectRepresentations(QualType Ty, bool CheckIfTriviallyCopyable=true) const
Return true if the specified type has unique object representations according to (C++17 [meta....
CanQualType getCanonicalSizeType() const
bool typesAreBlockPointerCompatible(QualType, QualType)
CanQualType SatUnsignedAccumTy
bool useAbbreviatedThunkName(GlobalDecl VirtualMethodDecl, StringRef MangledName)
const ASTRecordLayout & getASTObjCInterfaceLayout(const ObjCInterfaceDecl *D) const
Get or compute information about the layout of the specified Objective-C interface.
void forEachMultiversionedFunctionVersion(const FunctionDecl *FD, llvm::function_ref< void(FunctionDecl *)> Pred) const
Visits all versions of a multiversioned function with the passed predicate.
void setInstantiatedFromUsingEnumDecl(UsingEnumDecl *Inst, UsingEnumDecl *Pattern)
Remember that the using enum decl Inst is an instantiation of the using enum decl Pattern of a class ...
QualType getBaseElementType(const ArrayType *VAT) const
Return the innermost element type of an array type.
QualType getPointerDiffType() const
Return the unique type for "ptrdiff_t" (C99 7.17) defined in <stddef.h>.
QualType getSignatureParameterType(QualType T) const
Retrieve the parameter type as adjusted for use in the signature of a function, decaying array and fu...
CanQualType ArraySectionTy
CanQualType ObjCBuiltinIdTy
overridden_cxx_method_iterator overridden_methods_end(const CXXMethodDecl *Method) const
VTableContextBase * getVTableContext()
ComparisonCategories CompCategories
Types and expressions required to build C++2a three-way comparisons using operator<=>,...
int getFloatingTypeOrder(QualType LHS, QualType RHS) const
Compare the rank of the two specified floating point types, ignoring the domain of the type (i....
unsigned CountNonClassIvars(const ObjCInterfaceDecl *OI) const
ObjCPropertyImplDecl * getObjCPropertyImplDeclForPropertyDecl(const ObjCPropertyDecl *PD, const Decl *Container) const
bool isNearlyEmpty(const CXXRecordDecl *RD) const
PointerAuthQualifier getObjCMemberSelTypePtrAuth()
void cacheRawCommentForDecl(const Decl &OriginalD, const RawComment &Comment) const
Attaches Comment to OriginalD and to its redeclaration chain and removes the redeclaration chain from...
void attachCommentsToJustParsedDecls(ArrayRef< Decl * > Decls, const Preprocessor *PP)
Searches existing comments for doc comments that should be attached to Decls.
QualType getIntTypeForBitwidth(unsigned DestWidth, unsigned Signed) const
getIntTypeForBitwidth - sets integer QualTy according to specified details: bitwidth,...
void setStaticLocalNumber(const VarDecl *VD, unsigned Number)
QualType getCFConstantStringType() const
Return the C structure type used to represent constant CFStrings.
void eraseDeclAttrs(const Decl *D)
Erase the attributes corresponding to the given declaration.
UsingEnumDecl * getInstantiatedFromUsingEnumDecl(UsingEnumDecl *Inst)
If the given using-enum decl Inst is an instantiation of another using-enum decl, return it.
RecordDecl * getCFConstantStringTagDecl() const
std::string getObjCEncodingForFunctionDecl(const FunctionDecl *Decl) const
Emit the encoded type for the function Decl into S.
TypeSourceInfo * getTemplateSpecializationTypeInfo(ElaboratedTypeKeyword Keyword, SourceLocation ElaboratedKeywordLoc, NestedNameSpecifierLoc QualifierLoc, SourceLocation TemplateKeywordLoc, TemplateName T, SourceLocation TLoc, const TemplateArgumentListInfo &SpecifiedArgs, ArrayRef< TemplateArgument > CanonicalArgs, QualType Canon=QualType()) const
QualType getTemplateTypeParmType(unsigned Depth, unsigned Index, bool ParameterPack, TemplateTypeParmDecl *ParmDecl=nullptr) const
Retrieve the template type parameter type for a template parameter or parameter pack with the given d...
CanQualType UnsignedFractTy
GVALinkage GetGVALinkageForFunction(const FunctionDecl *FD) const
QualType mergeFunctionParameterTypes(QualType, QualType, bool OfBlockPointer=false, bool Unqualified=false)
mergeFunctionParameterTypes - merge two types which appear as function parameter types
void addOverriddenMethod(const CXXMethodDecl *Method, const CXXMethodDecl *Overridden)
Note that the given C++ Method overrides the given Overridden method.
TemplateTemplateParmDecl * findCanonicalTemplateTemplateParmDeclInternal(TemplateTemplateParmDecl *TTP) const
CanQualType ObjCBuiltinClassTy
unsigned NumImplicitDefaultConstructorsDeclared
The number of implicitly-declared default constructors for which declarations were built.
CanQualType UnresolvedTemplateTy
OMPTraitInfo & getNewOMPTraitInfo()
Return a new OMPTraitInfo object owned by this context.
friend class CXXRecordDecl
CanQualType UnsignedLongTy
void DeepCollectObjCIvars(const ObjCInterfaceDecl *OI, bool leafClass, SmallVectorImpl< const ObjCIvarDecl * > &Ivars) const
DeepCollectObjCIvars - This routine first collects all declared, but not synthesized,...
bool computeBestEnumTypes(bool IsPacked, unsigned NumNegativeBits, unsigned NumPositiveBits, QualType &BestType, QualType &BestPromotionType)
Compute BestType and BestPromotionType for an enum based on the highest number of negative and positi...
llvm::APFixedPoint getFixedPointMin(QualType Ty) const
TypeSourceInfo * getTrivialTypeSourceInfo(QualType T, SourceLocation Loc=SourceLocation()) const
Allocate a TypeSourceInfo where all locations have been initialized to a given location,...
QualType adjustType(QualType OldType, llvm::function_ref< QualType(QualType)> Adjust) const
Rebuild a type, preserving any existing type sugar.
void addedLocalImportDecl(ImportDecl *Import)
Notify the AST context that a new import declaration has been parsed or implicitly created within thi...
const TranslationUnitKind TUKind
CanQualType UnsignedLongAccumTy
QualType AutoRRefDeductTy
TypeInfo getTypeInfo(const Type *T) const
Get the size and alignment of the specified complete type in bits.
QualType getStringLiteralArrayType(QualType EltTy, unsigned Length) const
Return a type for a constant array for a string literal of the specified element type and length.
QualType getCorrespondingSaturatedType(QualType Ty) const
bool isSameEntity(const NamedDecl *X, const NamedDecl *Y) const
Determine whether the two declarations refer to the same entity.
QualType getSubstTemplateTypeParmPackType(Decl *AssociatedDecl, unsigned Index, bool Final, const TemplateArgument &ArgPack)
CanQualType BoundMemberTy
CanQualType SatUnsignedShortFractTy
QualType removeAddrSpaceQualType(QualType T) const
Remove any existing address space on the type and returns the type with qualifiers intact (or that's ...
bool hasSameFunctionTypeIgnoringParamABI(QualType T, QualType U) const
Determine if two function types are the same, ignoring parameter ABI annotations.
TypedefDecl * getInt128Decl() const
Retrieve the declaration for the 128-bit signed integer type.
unsigned getOpenMPDefaultSimdAlign(QualType T) const
Get default simd alignment of the specified complete type in bits.
QualType getObjCSuperType() const
Returns the C struct type for objc_super.
QualType getBlockDescriptorType() const
Gets the struct used to keep track of the descriptor for pointer to blocks.
bool CommentsLoaded
True if comments are already loaded from ExternalASTSource.
BlockVarCopyInit getBlockVarCopyInit(const VarDecl *VD) const
Get the copy initialization expression of the VarDecl VD, or nullptr if none exists.
QualType getHLSLInlineSpirvType(uint32_t Opcode, uint32_t Size, uint32_t Alignment, ArrayRef< SpirvOperand > Operands)
unsigned NumImplicitMoveConstructorsDeclared
The number of implicitly-declared move constructors for which declarations were built.
bool isInSameModule(const Module *M1, const Module *M2) const
If the two module M1 and M2 are in the same module.
unsigned NumImplicitCopyConstructorsDeclared
The number of implicitly-declared copy constructors for which declarations were built.
llvm::DenseSet< const VarDecl * > CUDADeviceVarODRUsedByHost
Keep track of CUDA/HIP device-side variables ODR-used by host code.
CanQualType PseudoObjectTy
QualType getWebAssemblyExternrefType() const
Return a WebAssembly externref type.
void setTraversalScope(const std::vector< Decl * > &)
CharUnits getTypeUnadjustedAlignInChars(QualType T) const
getTypeUnadjustedAlignInChars - Return the ABI-specified alignment of a type, in characters,...
QualType getAdjustedType(QualType Orig, QualType New) const
Return the uniqued reference to a type adjusted from the original type to a new type.
friend class NestedNameSpecifier
unsigned getAlignOfGlobalVar(QualType T, const VarDecl *VD) const
Return the alignment in bits that should be given to a global variable with type T.
TypeInfoChars getTypeInfoDataSizeInChars(QualType T) const
MangleNumberingContext & getManglingNumberContext(const DeclContext *DC)
Retrieve the context for computing mangling numbers in the given DeclContext.
comments::FullComment * getLocalCommentForDeclUncached(const Decl *D) const
Return parsed documentation comment attached to a given declaration.
unsigned NumImplicitDestructors
The number of implicitly-declared destructors.
QualType getQualifiedType(SplitQualType split) const
Un-split a SplitQualType.
bool isAlignmentRequired(const Type *T) const
Determine if the alignment the type has was required using an alignment attribute.
bool areComparableObjCPointerTypes(QualType LHS, QualType RHS)
MangleContext * createDeviceMangleContext(const TargetInfo &T)
Creates a device mangle context to correctly mangle lambdas in a mixed architecture compile by settin...
CharUnits getExnObjectAlignment() const
Return the alignment (in bytes) of the thrown exception object.
QualType getObjCObjectPointerType(QualType OIT) const
Return a ObjCObjectPointerType type for the given ObjCObjectType.
ASTMutationListener * Listener
CanQualType ObjCBuiltinBoolTy
TypeInfoChars getTypeInfoInChars(const Type *T) const
QualType getPredefinedSugarType(PredefinedSugarType::Kind KD) const
QualType getObjCObjectType(QualType Base, ObjCProtocolDecl *const *Protocols, unsigned NumProtocols) const
Legacy interface: cannot provide type arguments or __kindof.
TemplateParamObjectDecl * getTemplateParamObjectDecl(QualType T, const APValue &V) const
Return the template parameter object of the given type with the given value.
CharUnits getDeclAlign(const Decl *D, bool ForAlignof=false) const
Return a conservative estimate of the alignment of the specified decl D.
int64_t toBits(CharUnits CharSize) const
Convert a size in characters to a size in bits.
TemplateTemplateParmDecl * getCanonicalTemplateTemplateParmDecl(TemplateTemplateParmDecl *TTP) const
Canonicalize the given TemplateTemplateParmDecl.
CanQualType OCLClkEventTy
void adjustExceptionSpec(FunctionDecl *FD, const FunctionProtoType::ExceptionSpecInfo &ESI, bool AsWritten=false)
Change the exception specification on a function once it is delay-parsed, instantiated,...
TypedefDecl * getUInt128Decl() const
Retrieve the declaration for the 128-bit unsigned integer type.
const clang::PrintingPolicy & getPrintingPolicy() const
void ResetObjCLayout(const ObjCInterfaceDecl *D)
ArrayRef< Module * > getModulesWithMergedDefinition(const NamedDecl *Def)
Get the additional modules in which the definition Def has been merged.
llvm::FixedPointSemantics getFixedPointSemantics(QualType Ty) const
CanQualType SatUnsignedShortAccumTy
QualType mergeTypes(QualType, QualType, bool OfBlockPointer=false, bool Unqualified=false, bool BlockReturnType=false, bool IsConditionalOperator=false)
const RawComment * getRawCommentForAnyRedecl(const Decl *D, const Decl **OriginalDecl=nullptr) const
Return the documentation comment attached to a given declaration.
CharUnits getAlignOfGlobalVarInChars(QualType T, const VarDecl *VD) const
Return the alignment in characters that should be given to a global variable with type T.
const ObjCMethodDecl * getObjCMethodRedeclaration(const ObjCMethodDecl *MD) const
Get the duplicate declaration of a ObjCMethod in the same interface, or null if none exists.
QualType getPackIndexingType(QualType Pattern, Expr *IndexExpr, bool FullySubstituted=false, ArrayRef< QualType > Expansions={}, UnsignedOrNone Index=std::nullopt) const
static bool isObjCNSObjectType(QualType Ty)
Return true if this is an NSObject object with its NSObject attribute set.
GVALinkage GetGVALinkageForVariable(const VarDecl *VD) const
llvm::PointerUnion< VarTemplateDecl *, MemberSpecializationInfo * > TemplateOrSpecializationInfo
A type synonym for the TemplateOrInstantiation mapping.
UsingShadowDecl * getInstantiatedFromUsingShadowDecl(UsingShadowDecl *Inst)
QualType getVariableArrayType(QualType EltTy, Expr *NumElts, ArraySizeModifier ASM, unsigned IndexTypeQuals) const
Return a non-unique reference to the type for a variable array of the specified element type.
QualType getObjCIdType() const
Represents the Objective-CC id type.
Decl * getVaListTagDecl() const
Retrieve the C type declaration corresponding to the predefined __va_list_tag type used to help defin...
QualType getUnsignedWCharType() const
Return the type of "unsigned wchar_t".
QualType getFunctionTypeWithoutParamABIs(QualType T) const
Get or construct a function type that is equivalent to the input type except that the parameter ABI a...
bool hasSameUnqualifiedType(QualType T1, QualType T2) const
Determine whether the given types are equivalent after cvr-qualifiers have been removed.
QualType getCorrespondingUnsaturatedType(QualType Ty) const
comments::FullComment * getCommentForDecl(const Decl *D, const Preprocessor *PP) const
Return parsed documentation comment attached to a given declaration.
TemplateArgument getInjectedTemplateArg(NamedDecl *ParamDecl) const
unsigned getTargetDefaultAlignForAttributeAligned() const
Return the default alignment for attribute((aligned)) on this target, to be used if no alignment valu...
const ArrayType * getAsArrayType(QualType T) const
Type Query functions.
llvm::DenseMap< CanQualType, SYCLKernelInfo > SYCLKernels
Map of SYCL kernels indexed by the unique type used to name the kernel.
bool isSameTemplateParameterList(const TemplateParameterList *X, const TemplateParameterList *Y) const
Determine whether two template parameter lists are similar enough that they may be used in declaratio...
QualType getWritePipeType(QualType T) const
Return a write_only pipe type for the specified type.
QualType getTypeDeclType(ElaboratedTypeKeyword Keyword, NestedNameSpecifier Qualifier, const TypeDecl *Decl) const
bool isDestroyingOperatorDelete(const FunctionDecl *FD) const
uint64_t getTypeSize(QualType T) const
Return the size of the specified (complete) type T, in bits.
CanQualType UnsignedInt128Ty
ObjCInterfaceDecl * getObjCProtocolDecl() const
Retrieve the Objective-C class declaration corresponding to the predefined Protocol class.
unsigned NumImplicitDefaultConstructors
The number of implicitly-declared default constructors.
CharUnits getTypeSizeInChars(QualType T) const
Return the size of the specified (complete) type T, in characters.
llvm::iterator_range< overridden_cxx_method_iterator > overridden_method_range
unsigned NumImplicitMoveAssignmentOperatorsDeclared
The number of implicitly-declared move assignment operators for which declarations were built.
void setManglingNumber(const NamedDecl *ND, unsigned Number)
llvm::DenseMap< const Decl *, const RawComment * > DeclRawComments
Mapping from declaration to directly attached comment.
QualType getAutoType(QualType DeducedType, AutoTypeKeyword Keyword, bool IsDependent, bool IsPack=false, TemplateDecl *TypeConstraintConcept=nullptr, ArrayRef< TemplateArgument > TypeConstraintArgs={}) const
C++11 deduced auto type.
TypedefDecl * getBuiltinVaListDecl() const
Retrieve the C type declaration corresponding to the predefined __builtin_va_list type.
CanQualType getCanonicalTypeDeclType(const TypeDecl *TD) const
QualType getPackExpansionType(QualType Pattern, UnsignedOrNone NumExpansions, bool ExpectPackInType=true) const
Form a pack expansion type with the given pattern.
CanQualType UnsignedCharTy
CanQualType UnsignedShortFractTy
BuiltinTemplateDecl * buildBuiltinTemplateDecl(BuiltinTemplateKind BTK, const IdentifierInfo *II) const
void * Allocate(size_t Size, unsigned Align=8) const
bool canBuiltinBeRedeclared(const FunctionDecl *) const
Return whether a declaration to a builtin is allowed to be overloaded/redeclared.
CanQualType UnsignedIntTy
unsigned NumImplicitMoveConstructors
The number of implicitly-declared move constructors.
QualType getTypedefType(ElaboratedTypeKeyword Keyword, NestedNameSpecifier Qualifier, const TypedefNameDecl *Decl, QualType UnderlyingType=QualType(), std::optional< bool > TypeMatchesDeclOrNone=std::nullopt) const
Return the unique reference to the type for the specified typedef-name decl.
QualType getObjCTypeParamType(const ObjCTypeParamDecl *Decl, ArrayRef< ObjCProtocolDecl * > protocols) const
void getObjCEncodingForMethodParameter(Decl::ObjCDeclQualifier QT, QualType T, std::string &S, bool Extended) const
getObjCEncodingForMethodParameter - Return the encoded type for a single method parameter or return t...
void addDeclaratorForUnnamedTagDecl(TagDecl *TD, DeclaratorDecl *DD)
unsigned overridden_methods_size(const CXXMethodDecl *Method) const
std::string getObjCEncodingForBlock(const BlockExpr *blockExpr) const
Return the encoded type for this block declaration.
QualType getTemplateSpecializationType(ElaboratedTypeKeyword Keyword, TemplateName T, ArrayRef< TemplateArgument > SpecifiedArgs, ArrayRef< TemplateArgument > CanonicalArgs, QualType Underlying=QualType()) const
TypeSourceInfo * CreateTypeSourceInfo(QualType T, unsigned Size=0) const
Allocate an uninitialized TypeSourceInfo.
TemplateName getQualifiedTemplateName(NestedNameSpecifier Qualifier, bool TemplateKeyword, TemplateName Template) const
Retrieve the template name that represents a qualified template name such as std::vector.
bool isSameAssociatedConstraint(const AssociatedConstraint &ACX, const AssociatedConstraint &ACY) const
Determine whether two 'requires' expressions are similar enough that they may be used in re-declarati...
QualType getExceptionObjectType(QualType T) const
void setInstantiatedFromStaticDataMember(VarDecl *Inst, VarDecl *Tmpl, TemplateSpecializationKind TSK, SourceLocation PointOfInstantiation=SourceLocation())
Note that the static data member Inst is an instantiation of the static data member template Tmpl of ...
FieldDecl * getInstantiatedFromUnnamedFieldDecl(FieldDecl *Field) const
DeclaratorDecl * getDeclaratorForUnnamedTagDecl(const TagDecl *TD)
bool ObjCObjectAdoptsQTypeProtocols(QualType QT, ObjCInterfaceDecl *Decl)
ObjCObjectAdoptsQTypeProtocols - Checks that protocols in IC's protocol list adopt all protocols in Q...
CanQualType UnsignedLongLongTy
QualType GetBuiltinType(unsigned ID, GetBuiltinTypeError &Error, unsigned *IntegerConstantArgs=nullptr) const
Return the type for the specified builtin.
CanQualType OCLReserveIDTy
bool isSameTemplateParameter(const NamedDecl *X, const NamedDecl *Y) const
Determine whether two template parameters are similar enough that they may be used in declarations of...
void registerSYCLEntryPointFunction(FunctionDecl *FD)
Generates and stores SYCL kernel metadata for the provided SYCL kernel entry point function.
QualType getArrayDecayedType(QualType T) const
Return the properly qualified result of decaying the specified array type to a pointer.
overridden_cxx_method_iterator overridden_methods_begin(const CXXMethodDecl *Method) const
CanQualType UnsignedShortTy
unsigned getTypeAlignIfKnown(QualType T, bool NeedsPreferredAlignment=false) const
Return the alignment of a type, in bits, or 0 if the type is incomplete and we cannot determine the a...
void UnwrapSimilarArrayTypes(QualType &T1, QualType &T2, bool AllowPiMismatch=true) const
Attempt to unwrap two types that may both be array types with the same bound (or both be array types ...
bool isRepresentableIntegerValue(llvm::APSInt &Value, QualType T)
Determine whether the given integral value is representable within the given type T.
bool AtomicUsesUnsupportedLibcall(const AtomicExpr *E) const
QualType getFunctionType(QualType ResultTy, ArrayRef< QualType > Args, const FunctionProtoType::ExtProtoInfo &EPI) const
Return a normal function type with a typed argument list.
const SYCLKernelInfo & getSYCLKernelInfo(QualType T) const
Given a type used as a SYCL kernel name, returns a reference to the metadata generated from the corre...
bool canAssignObjCInterfacesInBlockPointer(const ObjCObjectPointerType *LHSOPT, const ObjCObjectPointerType *RHSOPT, bool BlockReturnType)
canAssignObjCInterfacesInBlockPointer - This routine is specifically written for providing type-safet...
CanQualType SatUnsignedLongFractTy
QualType getMemberPointerType(QualType T, NestedNameSpecifier Qualifier, const CXXRecordDecl *Cls) const
Return the uniqued reference to the type for a member pointer to the specified type in the specified ...
const CXXConstructorDecl * getCopyConstructorForExceptionObject(CXXRecordDecl *RD)
QualType getDependentAddressSpaceType(QualType PointeeType, Expr *AddrSpaceExpr, SourceLocation AttrLoc) const
RawComment * getRawCommentForDeclNoCache(const Decl *D) const
Return the documentation comment attached to a given declaration, without looking into cache.
QualType getTagType(ElaboratedTypeKeyword Keyword, NestedNameSpecifier Qualifier, const TagDecl *TD, bool OwnsTag) const
QualType getPromotedIntegerType(QualType PromotableType) const
Return the type that PromotableType will promote to: C99 6.3.1.1p2, assuming that PromotableType is a...
CanQualType getMSGuidType() const
Retrieve the implicitly-predeclared 'struct _GUID' type.
const VariableArrayType * getAsVariableArrayType(QualType T) const
QualType getUnaryTransformType(QualType BaseType, QualType UnderlyingType, UnaryTransformType::UTTKind UKind) const
Unary type transforms.
void setExternalSource(IntrusiveRefCntPtr< ExternalASTSource > Source)
Attach an external AST source to the AST context.
const ObjCInterfaceDecl * getObjContainingInterface(const NamedDecl *ND) const
Returns the Objective-C interface that ND belongs to if it is an Objective-C method/property/ivar etc...
StringLiteral * getPredefinedStringLiteralFromCache(StringRef Key) const
Return a string representing the human readable name for the specified function declaration or file n...
CanQualType getCanonicalUnresolvedUsingType(const UnresolvedUsingTypenameDecl *D) const
bool hasSimilarType(QualType T1, QualType T2) const
Determine if two types are similar, according to the C++ rules.
llvm::APFixedPoint getFixedPointMax(QualType Ty) const
QualType getComplexType(QualType T) const
Return the uniqued reference to the type for a complex number with the specified element type.
bool hasDirectOwnershipQualifier(QualType Ty) const
Return true if the type has been explicitly qualified with ObjC ownership.
Qualifiers::ObjCLifetime getInnerObjCOwnership(QualType T) const
Recurses in pointer/array types until it finds an Objective-C retainable type and returns its ownersh...
void addCopyConstructorForExceptionObject(CXXRecordDecl *RD, CXXConstructorDecl *CD)
void deduplicateMergedDefinitionsFor(NamedDecl *ND)
Clean up the merged definition list.
DiagnosticsEngine & getDiagnostics() const
QualType getAdjustedParameterType(QualType T) const
Perform adjustment on the parameter type of a function.
interp::Context & getInterpContext()
Returns the clang bytecode interpreter context.
QualType getSizeType() const
Return the unique type for "size_t" (C99 7.17), defined in <stddef.h>.
UnnamedGlobalConstantDecl * getUnnamedGlobalConstantDecl(QualType Ty, const APValue &Value) const
Return a declaration for a uniquified anonymous global constant corresponding to a given APValue.
QualType getExtVectorType(QualType VectorType, unsigned NumElts) const
Return the unique reference to an extended vector type of the specified element type and size.
QualType getUnresolvedUsingType(ElaboratedTypeKeyword Keyword, NestedNameSpecifier Qualifier, const UnresolvedUsingTypenameDecl *D) const
bool areCompatibleVectorTypes(QualType FirstVec, QualType SecondVec)
Return true if the given vector types are of the same unqualified type or if they are equivalent to t...
void getOverriddenMethods(const NamedDecl *Method, SmallVectorImpl< const NamedDecl * > &Overridden) const
Return C++ or ObjC overridden methods for the given Method.
DeclarationNameInfo getNameForTemplate(TemplateName Name, SourceLocation NameLoc) const
bool hasSameTemplateName(const TemplateName &X, const TemplateName &Y, bool IgnoreDeduced=false) const
Determine whether the given template names refer to the same template.
CanQualType SatLongFractTy
const TargetInfo & getTargetInfo() const
void setInstantiatedFromUnnamedFieldDecl(FieldDecl *Inst, FieldDecl *Tmpl)
CanQualType SatShortAccumTy
QualType getAutoDeductType() const
C++11 deduction pattern for 'auto' type.
unsigned NumImplicitCopyConstructors
The number of implicitly-declared copy constructors.
CharUnits toCharUnitsFromBits(int64_t BitSize) const
Convert a size in bits to a size in characters.
CanQualType IncompleteMatrixIdxTy
void getFunctionFeatureMap(llvm::StringMap< bool > &FeatureMap, const FunctionDecl *) const
CanQualType getNSIntegerType() const
QualType getCorrespondingUnsignedType(QualType T) const
void setBlockVarCopyInit(const VarDecl *VD, Expr *CopyExpr, bool CanThrow)
Set the copy initialization expression of a block var decl.
TemplateName getOverloadedTemplateName(UnresolvedSetIterator Begin, UnresolvedSetIterator End) const
Retrieve the template name that corresponds to a non-empty lookup.
bool typesAreCompatible(QualType T1, QualType T2, bool CompareUnqualified=false)
Compatibility predicates used to check assignment expressions.
TemplateName getSubstTemplateTemplateParmPack(const TemplateArgument &ArgPack, Decl *AssociatedDecl, unsigned Index, bool Final) const
QualType getDeducedTemplateSpecializationType(ElaboratedTypeKeyword Keyword, TemplateName Template, QualType DeducedType, bool IsDependent) const
C++17 deduced class template specialization type.
TargetCXXABI::Kind getCXXABIKind() const
Return the C++ ABI kind that should be used.
QualType getHLSLAttributedResourceType(QualType Wrapped, QualType Contained, const HLSLAttributedResourceType::Attributes &Attrs)
bool UnwrapSimilarTypes(QualType &T1, QualType &T2, bool AllowPiMismatch=true) const
Attempt to unwrap two types that may be similar (C++ [conv.qual]).
QualType getAddrSpaceQualType(QualType T, LangAS AddressSpace) const
Return the uniqued reference to the type for an address space qualified type with the specified type ...
QualType getSignedSizeType() const
Return the unique signed counterpart of the integer type corresponding to size_t.
ExternalASTSource * getExternalSource() const
Retrieve a pointer to the external AST source associated with this AST context, if any.
uint64_t getConstantArrayElementCount(const ConstantArrayType *CA) const
Return number of constant array elements.
CanQualType SatUnsignedLongAccumTy
QualType getUnconstrainedType(QualType T) const
Remove any type constraints from a template parameter type, for equivalence comparison of template pa...
CanQualType getCanonicalTagType(const TagDecl *TD) const
bool isSameTemplateArgument(const TemplateArgument &Arg1, const TemplateArgument &Arg2) const
Determine whether the given template arguments Arg1 and Arg2 are equivalent.
QualType getTypeOfType(QualType QT, TypeOfKind Kind) const
getTypeOfType - Unlike many "get<Type>" functions, we don't unique TypeOfType nodes.
QualType getCorrespondingSignedType(QualType T) const
QualType mergeObjCGCQualifiers(QualType, QualType)
mergeObjCGCQualifiers - This routine merges ObjC's GC attribute of 'LHS' and 'RHS' attributes and ret...
llvm::DenseMap< const Decl *, const Decl * > CommentlessRedeclChains
Keeps track of redeclaration chains that don't have any comment attached.
uint64_t getArrayInitLoopExprElementCount(const ArrayInitLoopExpr *AILE) const
Return number of elements initialized in an ArrayInitLoopExpr.
unsigned getTargetAddressSpace(LangAS AS) const
QualType getIntPtrType() const
Return a type compatible with "intptr_t" (C99 7.18.1.4), as defined by the target.
void mergeDefinitionIntoModule(NamedDecl *ND, Module *M, bool NotifyListeners=true)
Note that the definition ND has been merged into module M, and should be visible whenever M is visibl...
QualType getDependentSizedArrayType(QualType EltTy, Expr *NumElts, ArraySizeModifier ASM, unsigned IndexTypeQuals) const
Return a non-unique reference to the type for a dependently-sized array of the specified element type...
void addTranslationUnitDecl()
void getObjCEncodingForPropertyType(QualType T, std::string &S) const
Emit the Objective-C property type encoding for the given type T into S.
unsigned NumImplicitCopyAssignmentOperators
The number of implicitly-declared copy assignment operators.
void CollectInheritedProtocols(const Decl *CDecl, llvm::SmallPtrSet< ObjCProtocolDecl *, 8 > &Protocols)
CollectInheritedProtocols - Collect all protocols in current class and those inherited by it.
bool isPromotableIntegerType(QualType T) const
More type predicates useful for type checking/promotion.
llvm::DenseMap< const Decl *, const Decl * > RedeclChainComments
Mapping from canonical declaration to the first redeclaration in chain that has a comment attached.
void adjustDeducedFunctionResultType(FunctionDecl *FD, QualType ResultType)
Change the result type of a function type once it is deduced.
QualType getObjCGCQualType(QualType T, Qualifiers::GC gcAttr) const
Return the uniqued reference to the type for an Objective-C gc-qualified type.
QualType getDecltypeType(Expr *e, QualType UnderlyingType) const
C++11 decltype.
std::optional< CXXRecordDeclRelocationInfo > getRelocationInfoForCXXRecord(const CXXRecordDecl *) const
InlineVariableDefinitionKind getInlineVariableDefinitionKind(const VarDecl *VD) const
Determine whether a definition of this inline variable should be treated as a weak or strong definiti...
TemplateName getSubstTemplateTemplateParm(TemplateName replacement, Decl *AssociatedDecl, unsigned Index, UnsignedOrNone PackIndex, bool Final) const
CanQualType getUIntMaxType() const
Return the unique type for "uintmax_t" (C99 7.18.1.5), defined in <stdint.h>.
uint16_t getPointerAuthVTablePointerDiscriminator(const CXXRecordDecl *RD)
Return the "other" discriminator used for the pointer auth schema used for vtable pointers in instanc...
CharUnits getOffsetOfBaseWithVBPtr(const CXXRecordDecl *RD) const
Loading virtual member pointers using the virtual inheritance model always results in an adjustment u...
LangAS getLangASForBuiltinAddressSpace(unsigned AS) const
bool hasSameFunctionTypeIgnoringPtrSizes(QualType T, QualType U)
Determine whether two function types are the same, ignoring pointer sizes in the return type and para...
unsigned char getFixedPointScale(QualType Ty) const
QualType getIncompleteArrayType(QualType EltTy, ArraySizeModifier ASM, unsigned IndexTypeQuals) const
Return a unique reference to the type for an incomplete array of the specified element type.
QualType getDependentSizedExtVectorType(QualType VectorType, Expr *SizeExpr, SourceLocation AttrLoc) const
QualType DecodeTypeStr(const char *&Str, const ASTContext &Context, ASTContext::GetBuiltinTypeError &Error, bool &RequireICE, bool AllowTypeModifiers) const
TemplateName getAssumedTemplateName(DeclarationName Name) const
Retrieve a template name representing an unqualified-id that has been assumed to name a template for ...
@ GE_Missing_type
Missing a type.
QualType adjustStringLiteralBaseType(QualType StrLTy) const
uint16_t getPointerAuthTypeDiscriminator(QualType T)
Return the "other" type-specific discriminator for the given type.
bool canonicalizeTemplateArguments(MutableArrayRef< TemplateArgument > Args) const
Canonicalize the given template argument list.
QualType getTypeOfExprType(Expr *E, TypeOfKind Kind) const
C23 feature and GCC extension.
QualType getSignedWCharType() const
Return the type of "signed wchar_t".
QualType getUnqualifiedArrayType(QualType T, Qualifiers &Quals) const
Return this type as a completely-unqualified array type, capturing the qualifiers in Quals.
bool hasCvrSimilarType(QualType T1, QualType T2)
Determine if two types are similar, ignoring only CVR qualifiers.
TemplateName getDeducedTemplateName(TemplateName Underlying, DefaultArguments DefaultArgs) const
Represents a TemplateName which had some of its default arguments deduced.
ObjCImplementationDecl * getObjCImplementation(ObjCInterfaceDecl *D)
Get the implementation of the ObjCInterfaceDecl D, or nullptr if none exists.
CanQualType UnsignedAccumTy
void setObjCMethodRedeclaration(const ObjCMethodDecl *MD, const ObjCMethodDecl *Redecl)
void addTypedefNameForUnnamedTagDecl(TagDecl *TD, TypedefNameDecl *TND)
QualType getConstantMatrixType(QualType ElementType, unsigned NumRows, unsigned NumColumns) const
Return the unique reference to the matrix type of the specified element type and size.
const CXXRecordDecl * baseForVTableAuthentication(const CXXRecordDecl *ThisClass) const
Resolve the root record to be used to derive the vtable pointer authentication policy for the specifi...
QualType getVariableArrayDecayedType(QualType Ty) const
Returns a vla type where known sizes are replaced with [*].
void setCFConstantStringType(QualType T)
const SYCLKernelInfo * findSYCLKernelInfo(QualType T) const
Returns a pointer to the metadata generated from the corresponding SYCLkernel entry point if the prov...
unsigned getParameterIndex(const ParmVarDecl *D) const
Used by ParmVarDecl to retrieve on the side the index of the parameter when it exceeds the size of th...
QualType getCommonSugaredType(QualType X, QualType Y, bool Unqualified=false) const
void AddDeallocation(void(*Callback)(void *), void *Data) const
Add a deallocation callback that will be invoked when the ASTContext is destroyed.
AttrVec & getDeclAttrs(const Decl *D)
Retrieve the attributes for the given declaration.
CXXMethodVector::const_iterator overridden_cxx_method_iterator
RawComment * getRawCommentForDeclNoCacheImpl(const Decl *D, const SourceLocation RepresentativeLocForDecl, const std::map< unsigned, RawComment * > &CommentsInFile) const
unsigned getTypeAlign(QualType T) const
Return the ABI-specified alignment of a (complete) type T, in bits.
QualType mergeTransparentUnionType(QualType, QualType, bool OfBlockPointer=false, bool Unqualified=false)
mergeTransparentUnionType - if T is a transparent union type and a member of T is compatible with Sub...
QualType isPromotableBitField(Expr *E) const
Whether this is a promotable bitfield reference according to C99 6.3.1.1p2, bullet 2 (and GCC extensi...
bool isSentinelNullExpr(const Expr *E)
CanQualType getNSUIntegerType() const
void setIsDestroyingOperatorDelete(const FunctionDecl *FD, bool IsDestroying)
uint64_t getCharWidth() const
Return the size of the character type, in bits.
QualType getBitIntType(bool Unsigned, unsigned NumBits) const
Return a bit-precise integer type with the specified signedness and bit count.
unsigned NumImplicitMoveAssignmentOperators
The number of implicitly-declared move assignment operators.
An abstract interface that should be implemented by listeners that want to be notified when an AST en...
virtual ~ASTMutationListener()
virtual void DeducedReturnType(const FunctionDecl *FD, QualType ReturnType)
A function's return type has been deduced.
ASTRecordLayout - This class contains layout information for one RecordDecl, which is a struct/union/...
CharUnits getAlignment() const
getAlignment - Get the record alignment in characters.
const CXXRecordDecl * getBaseSharingVBPtr() const
CharUnits getSize() const
getSize - Get the record size in characters.
uint64_t getFieldOffset(unsigned FieldNo) const
getFieldOffset - Get the offset of the given field index, in bits.
CharUnits getDataSize() const
getDataSize() - Get the record data size, which is the record size without tail padding,...
CharUnits getBaseClassOffset(const CXXRecordDecl *Base) const
getBaseClassOffset - Get the offset, in chars, for the given base class.
CharUnits getVBaseClassOffset(const CXXRecordDecl *VBase) const
getVBaseClassOffset - Get the offset, in chars, for the given base class.
CharUnits getNonVirtualSize() const
getNonVirtualSize - Get the non-virtual size (in chars) of an object, which is the size of the object...
CharUnits getUnadjustedAlignment() const
getUnadjustedAlignment - Get the record alignment in characters, before alignment adjustment.
Represents a type which was implicitly adjusted by the semantic engine for arbitrary reasons.
void Profile(llvm::FoldingSetNodeID &ID)
Represents a loop initializing the elements of an array.
llvm::APInt getArraySize() const
Expr * getSubExpr() const
Get the initializer to use for each array element.
Represents a constant array type that does not decay to a pointer when used as a function parameter.
Represents an array type, per C99 6.7.5.2 - Array Declarators.
ArraySizeModifier getSizeModifier() const
Qualifiers getIndexTypeQualifiers() const
QualType getElementType() const
unsigned getIndexTypeCVRQualifiers() const
A structure for storing the information associated with a name that has been assumed to be a template...
AtomicExpr - Variadic atomic builtins: __atomic_exchange, __atomic_fetch_*, __atomic_load,...
void Profile(llvm::FoldingSetNodeID &ID)
Attr - This represents one attribute.
A fixed int type of a specified bitwidth.
void Profile(llvm::FoldingSetNodeID &ID) const
unsigned getNumBits() const
Represents a block literal declaration, which is like an unnamed FunctionDecl.
BlockExpr - Adaptor class for mixing a BlockDecl with expressions.
void Profile(llvm::FoldingSetNodeID &ID)
Represents the builtin template declaration which is used to implement __make_integer_seq and other b...
static BuiltinTemplateDecl * Create(const ASTContext &C, DeclContext *DC, DeclarationName Name, BuiltinTemplateKind BTK)
This class is used for builtin types like 'int'.
StringRef getName(const PrintingPolicy &Policy) const
Holds information about both target-independent and target-specific builtins, allowing easy queries b...
Implements C++ ABI-specific semantic analysis functions.
Represents a C++ constructor within a class.
Represents a static or instance method of a struct/union/class.
CXXMethodDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
Represents a C++ struct/union/class.
static CXXRecordDecl * Create(const ASTContext &C, TagKind TK, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, IdentifierInfo *Id, CXXRecordDecl *PrevDecl=nullptr)
CXXRecordDecl * getDefinition() const
bool isPolymorphic() const
Whether this class is polymorphic (C++ [class.virtual]), which means that the class contains or inher...
bool isDynamicClass() const
bool isEmpty() const
Determine whether this is an empty class in the sense of (C++11 [meta.unary.prop]).
SplitQualType split() const
static CanQual< Type > CreateUnsafe(QualType Other)
QualType withConst() const
Retrieves a version of this type with const applied.
CanQual< T > getUnqualifiedType() const
Retrieve the unqualified form of this type.
Qualifiers getQualifiers() const
Retrieve all qualifiers.
const T * getTypePtr() const
Retrieve the underlying type pointer, which refers to a canonical type.
CharUnits - This is an opaque type for sizes expressed in character units.
bool isPositive() const
isPositive - Test whether the quantity is greater than zero.
bool isZero() const
isZero - Test whether the quantity equals zero.
QuantityType getQuantity() const
getQuantity - Get the raw integer representation of this quantity.
static CharUnits fromQuantity(QuantityType Quantity)
fromQuantity - Construct a CharUnits quantity from a raw integer type.
static CharUnits Zero()
Zero - Construct a CharUnits quantity of zero.
Declaration of a class template.
llvm::PointerUnion< ClassTemplateDecl *, ClassTemplatePartialSpecializationDecl * > getSpecializedTemplateOrPartial() const
Retrieve the class template or class template partial specialization which was specialized by this.
Complex values, per C99 6.2.5p11.
void Profile(llvm::FoldingSetNodeID &ID)
bool hasExplicitTemplateArgs() const
Whether or not template arguments were explicitly specified in the concept reference (they might not ...
const ASTTemplateArgumentListInfo * getTemplateArgsAsWritten() const
Represents the canonical version of C arrays with a specified constant size.
const Expr * getSizeExpr() const
Return a pointer to the size expression.
llvm::APInt getSize() const
Return the constant array size as an APInt.
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Ctx)
uint64_t getZExtSize() const
Return the size zero-extended as a uint64_t.
Represents a concrete matrix type with constant number of rows and columns.
unsigned getNumColumns() const
Returns the number of columns in the matrix.
void Profile(llvm::FoldingSetNodeID &ID)
unsigned getNumRows() const
Returns the number of rows in the matrix.
static constexpr bool isDimensionValid(size_t NumElements)
Returns true if NumElements is a valid matrix dimension.
Represents a sugar type with __counted_by or __sized_by annotations, including their _or_null variant...
void Profile(llvm::FoldingSetNodeID &ID)
Represents a pointer type decayed from an array or function type.
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
DeclContext * getParent()
getParent - Returns the containing DeclContext.
bool isFileContext() const
bool isDependentContext() const
Determines whether this context is dependent on a template parameter.
DeclContext * getLexicalParent()
getLexicalParent - Returns the containing lexical DeclContext.
lookup_result lookup(DeclarationName Name) const
lookup - Find the declarations (if any) with the given Name in this context.
DeclContext * getRedeclContext()
getRedeclContext - Retrieve the context in which an entity conflicts with other entities of the same ...
void addDecl(Decl *D)
Add the declaration D into this context.
Decl::Kind getDeclKind() const
A reference to a declared variable, function, enum, etc.
Decl - This represents one declaration (or definition), e.g.
const DeclContext * getParentFunctionOrMethod(bool LexicalParent=false) const
If this decl is defined inside a function/method/block it returns the corresponding DeclContext,...
bool isModuleLocal() const
Whether this declaration was a local declaration to a C++20 named module.
ASTContext & getASTContext() const LLVM_READONLY
bool isImplicit() const
isImplicit - Indicates whether the declaration was implicitly generated by the implementation.
unsigned getMaxAlignment() const
getMaxAlignment - return the maximum alignment specified by attributes on this decl,...
bool isUnconditionallyVisible() const
Determine whether this declaration is definitely visible to name lookup, independent of whether the o...
static Decl * castFromDeclContext(const DeclContext *)
bool isTemplated() const
Determine whether this declaration is a templated entity (whether it is.
bool isCanonicalDecl() const
Whether this particular Decl is a canonical one.
Module * getOwningModule() const
Get the module that owns this declaration (for visibility purposes).
FunctionDecl * getAsFunction() LLVM_READONLY
Returns the function itself, or the templated function if this is a function template.
ObjCDeclQualifier
ObjCDeclQualifier - 'Qualifiers' written next to the return and parameter types in method declaration...
bool isInvalidDecl() const
llvm::iterator_range< specific_attr_iterator< T > > specific_attrs() const
SourceLocation getLocation() const
void setImplicit(bool I=true)
redecl_range redecls() const
Returns an iterator range for all the redeclarations of the same decl.
DeclContext * getDeclContext()
SourceLocation getBeginLoc() const LLVM_READONLY
void setDeclContext(DeclContext *DC)
setDeclContext - Set both the semantic and lexical DeclContext to DC.
DeclContext * getLexicalDeclContext()
getLexicalDeclContext - The declaration context where this Decl was lexically declared (LexicalDC).
virtual Decl * getCanonicalDecl()
Retrieves the "canonical" declaration of the given declaration.
DeclarationNameLoc - Additional source/type location info for a declaration name.
static DeclarationNameLoc makeCXXOperatorNameLoc(SourceLocation BeginLoc, SourceLocation EndLoc)
Construct location information for a non-literal C++ operator.
The name of a declaration.
static int compare(DeclarationName LHS, DeclarationName RHS)
Represents a ValueDecl that came out of a declarator.
TypeSourceInfo * getTypeSourceInfo() const
TemplateName getUnderlying() const
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context) const
DefaultArguments getDefaultArguments() const
Represents an extended address space qualifier where the input address space value is dependent.
Expr * getAddrSpaceExpr() const
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context)
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context)
Represents an array type in C++ whose size is a value-dependent expression.
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context)
Expr * getSizeExpr() const
Represents an extended vector type where either the type or size is dependent.
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context)
Represents a matrix type where the type and the number of rows and columns is dependent on a template...
Expr * getRowExpr() const
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context)
Represents a dependent template name that cannot be resolved prior to template instantiation.
void Profile(llvm::FoldingSetNodeID &ID) const
IdentifierOrOverloadedOperator getName() const
NestedNameSpecifier getQualifier() const
Return the nested name specifier that qualifies this name.
bool hasTemplateKeyword() const
Was this template name was preceeded by the template keyword?
Internal representation of canonical, dependent typeof(expr) types.
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context)
Represents a vector type where either the type or size is dependent.
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context)
Concrete class used by the front-end to report problems and issues.
DiagnosticBuilder Report(SourceLocation Loc, unsigned DiagID)
Issue the message to the client.
unsigned getCustomDiagID(Level L, const char(&FormatString)[N])
Return an ID for a diagnostic with the specified format string and level.
bool isScoped() const
Returns true if this is a C++11 scoped enumeration.
bool isComplete() const
Returns true if this can be considered a complete type.
EnumDecl * getDefinitionOrSelf() const
QualType getIntegerType() const
Return the integer type this enum decl corresponds to.
EnumDecl * getInstantiatedFromMemberEnum() const
Returns the enumeration (declared within the template) from which this enumeration type was instantia...
This represents one expression.
bool isIntegerConstantExpr(const ASTContext &Ctx) const
Expr * IgnoreParenCasts() LLVM_READONLY
Skip past any parentheses and casts which might surround this expression until reaching a fixed point...
bool isValueDependent() const
Determines whether the value of this expression depends on.
ExprValueKind getValueKind() const
getValueKind - The value kind that this expression produces.
bool isTypeDependent() const
Determines whether the type of this expression depends on.
std::optional< llvm::APSInt > getIntegerConstantExpr(const ASTContext &Ctx) const
isIntegerConstantExpr - Return the value if this expression is a valid integer constant expression.
FieldDecl * getSourceBitField()
If this expression refers to a bit-field, retrieve the declaration of that bit-field.
@ NPC_ValueDependentIsNull
Specifies that a value-dependent expression of integral or dependent type should be considered a null...
bool isInstantiationDependent() const
Whether this expression is instantiation-dependent, meaning that it depends in some way on.
Expr * IgnoreImpCasts() LLVM_READONLY
Skip past any implicit casts which might surround this expression until reaching a fixed point.
NullPointerConstantKind isNullPointerConstant(ASTContext &Ctx, NullPointerConstantValueDependence NPC) const
isNullPointerConstant - C99 6.3.2.3p3 - Test if this reduces down to a Null pointer constant.
static ExprValueKind getValueKindForType(QualType T)
getValueKindForType - Given a formal return or parameter type, give its value kind.
We can encode up to four bits in the low bits of a type pointer, but there are many more type qualifi...
void Profile(llvm::FoldingSetNodeID &ID) const
ExtVectorType - Extended vector type.
Declaration context for names declared as extern "C" in C++.
static ExternCContextDecl * Create(const ASTContext &C, TranslationUnitDecl *TU)
Abstract interface for external sources of AST nodes.
virtual void CompleteRedeclChain(const Decl *D)
Gives the external AST source an opportunity to complete the redeclaration chain for a declaration.
Represents a member of a struct/union/class.
bool isBitField() const
Determines whether this field is a bitfield.
unsigned getBitWidthValue() const
Computes the bit width of this field, if this is a bit field.
unsigned getFieldIndex() const
Returns the index of this field within its record, as appropriate for passing to ASTRecordLayout::get...
const RecordDecl * getParent() const
Returns the parent of this field declaration, which is the struct in which this field is defined.
static FieldDecl * Create(const ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id, QualType T, TypeSourceInfo *TInfo, Expr *BW, bool Mutable, InClassInitStyle InitStyle)
An opaque identifier used by SourceManager which refers to a source file (MemoryBuffer) along with it...
Represents a function declaration or definition.
bool isMultiVersion() const
True if this function is considered a multiversioned function.
unsigned getBuiltinID(bool ConsiderWrapperFunctions=false) const
Returns a value indicating whether this function corresponds to a builtin function.
bool isInlined() const
Determine whether this function should be inlined, because it is either marked "inline" or "constexpr...
bool isMSExternInline() const
The combination of the extern and inline keywords under MSVC forces the function to be required.
FunctionDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
FunctionDecl * getMostRecentDecl()
Returns the most recent (re)declaration of this declaration.
TemplateSpecializationKind getTemplateSpecializationKind() const
Determine what kind of template instantiation this function represents.
bool isUserProvided() const
True if this method is user-declared and was not deleted or defaulted on its first declaration.
FunctionDecl * getInstantiatedFromMemberFunction() const
If this function is an instantiation of a member function of a class template specialization,...
bool isInlineDefinitionExternallyVisible() const
For an inline function definition in C, or for a gnu_inline function in C++, determine whether the de...
FunctionDecl * getPreviousDecl()
Return the previous declaration of this declaration or NULL if this is the first declaration.
SmallVector< Conflict > Conflicts
static FunctionEffectSet getIntersection(FunctionEffectsRef LHS, FunctionEffectsRef RHS)
static FunctionEffectSet getUnion(FunctionEffectsRef LHS, FunctionEffectsRef RHS, Conflicts &Errs)
An immutable set of FunctionEffects and possibly conditions attached to them.
ArrayRef< EffectConditionExpr > conditions() const
Represents a K&R-style 'int foo()' function, which has no information available about its arguments.
void Profile(llvm::FoldingSetNodeID &ID)
Represents a prototype with parameter type info, e.g.
ExtParameterInfo getExtParameterInfo(unsigned I) const
ExceptionSpecificationType getExceptionSpecType() const
Get the kind of exception specification on this function.
unsigned getNumParams() const
QualType getParamType(unsigned i) const
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Ctx)
bool hasExceptionSpec() const
Return whether this function has any kind of exception spec.
bool isVariadic() const
Whether this function prototype is variadic.
ExtProtoInfo getExtProtoInfo() const
ArrayRef< QualType > getParamTypes() const
ArrayRef< ExtParameterInfo > getExtParameterInfos() const
bool hasExtParameterInfos() const
Is there any interesting extra information for any of the parameters of this function type?
Declaration of a template function.
A class which abstracts out some details necessary for making a call.
CallingConv getCC() const
bool getNoCfCheck() const
unsigned getRegParm() const
bool getNoCallerSavedRegs() const
ExtInfo withNoReturn(bool noReturn) const
bool getHasRegParm() const
bool getProducesResult() const
Interesting information about a specific parameter that can't simply be reflected in parameter's type...
ExtParameterInfo withIsNoEscape(bool NoEscape) const
FunctionType - C99 6.7.5.3 - Function Declarators.
ExtInfo getExtInfo() const
QualType getReturnType() const
GlobalDecl - represents a global declaration.
unsigned getMultiVersionIndex() const
CXXDtorType getDtorType() const
const Decl * getDecl() const
One of these records is kept for each identifier that is lexed.
unsigned getLength() const
Efficiently return the length of this identifier info.
StringRef getName() const
Return the actual identifier string.
Implements an efficient mapping from strings to IdentifierInfo nodes.
Describes a module import declaration, which makes the contents of the named module visible in the cu...
Represents a C array with an unspecified size.
void Profile(llvm::FoldingSetNodeID &ID)
static ItaniumMangleContext * create(ASTContext &Context, DiagnosticsEngine &Diags, bool IsAux=false)
@ Relative
Components in the vtable are relative offsets between the vtable and the other structs/functions.
@ Pointer
Components in the vtable are pointers to other structs/functions.
An lvalue reference type, per C++11 [dcl.ref].
@ Swift
Interoperability with the latest known version of the Swift runtime.
@ Swift4_2
Interoperability with the Swift 4.2 runtime.
@ Swift4_1
Interoperability with the Swift 4.1 runtime.
@ Integer
Permit vector bitcasts between integer vectors with different numbers of elements but the same total ...
@ All
Permit vector bitcasts between all vectors with the same total bit-width.
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
std::optional< TargetCXXABI::Kind > CXXABI
C++ ABI to compile with, if specified by the frontend through -fc++-abi=.
clang::ObjCRuntime ObjCRuntime
CoreFoundationABI CFRuntime
static void Profile(llvm::FoldingSetNodeID &ID, Parts P)
Sugar type that represents a type that was qualified by a qualifier written as a macro invocation.
MangleContext - Context for tracking state which persists across multiple calls to the C++ name mangl...
Keeps track of the mangled names of lambda expressions and block literals within a particular context...
QualType getElementType() const
Returns type of the elements being stored in the matrix.
static bool isValidElementType(QualType T)
Valid elements types are the following:
A pointer to member type per C++ 8.3.3 - Pointers to members.
void Profile(llvm::FoldingSetNodeID &ID)
Provides information a specialization of a member of a class template, which may be a member function...
static MicrosoftMangleContext * create(ASTContext &Context, DiagnosticsEngine &Diags, bool IsAux=false)
Describes a module or submodule.
bool isNamedModule() const
Does this Module is a named module of a standard named module?
This represents a decl that may have a name.
NamedDecl * getUnderlyingDecl()
Looks through UsingDecls and ObjCCompatibleAliasDecls for the underlying named decl.
IdentifierInfo * getIdentifier() const
Get the identifier that names this declaration, if there is one.
bool isPlaceholderVar(const LangOptions &LangOpts) const
DeclarationName getDeclName() const
Get the actual, stored name of the declaration, which may be a special name.
std::string getNameAsString() const
Get a human-readable name for the declaration, even if it is one of the special kinds of names (C++ c...
bool isExternallyVisible() const
Represent a C++ namespace.
static NamespaceDecl * Create(ASTContext &C, DeclContext *DC, bool Inline, SourceLocation StartLoc, SourceLocation IdLoc, IdentifierInfo *Id, NamespaceDecl *PrevDecl, bool Nested)
A C++ nested-name-specifier augmented with source location information.
Represents a C++ nested name specifier, such as "\::std::vector<int>::".
NestedNameSpecifier getCanonical() const
Retrieves the "canonical" nested name specifier for a given nested name specifier.
CXXRecordDecl * getAsMicrosoftSuper() const
NamespaceAndPrefix getAsNamespaceAndPrefix() const
bool isCanonical() const
Whether this nested name specifier is canonical.
const Type * getAsType() const
Kind
The kind of specifier that completes this nested name specifier.
@ MicrosoftSuper
Microsoft's '__super' specifier, stored as a CXXRecordDecl* of the class it appeared in.
@ Global
The global specifier '::'. There is no stored value.
@ Type
A type, stored as a Type*.
@ Namespace
A namespace-like entity, stored as a NamespaceBaseDecl*.
NonTypeTemplateParmDecl - Declares a non-type template parameter, e.g., "Size" in.
static NonTypeTemplateParmDecl * Create(const ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, unsigned D, unsigned P, const IdentifierInfo *Id, QualType T, bool ParameterPack, TypeSourceInfo *TInfo)
Helper data structure representing the traits in a match clause of an declare variant or metadirectiv...
ObjCCategoryDecl - Represents a category declaration.
ObjCCategoryImplDecl - An object of this class encapsulates a category @implementation declaration.
ObjCImplementationDecl - Represents a class definition - this is where method definitions are specifi...
Represents an ObjC class declaration.
ObjCTypeParamList * getTypeParamList() const
Retrieve the type parameters of this class.
static ObjCInterfaceDecl * Create(const ASTContext &C, DeclContext *DC, SourceLocation atLoc, const IdentifierInfo *Id, ObjCTypeParamList *typeParamList, ObjCInterfaceDecl *PrevDecl, SourceLocation ClassLoc=SourceLocation(), bool isInternal=false)
bool hasDefinition() const
Determine whether this class has been defined.
bool ClassImplementsProtocol(ObjCProtocolDecl *lProto, bool lookupCategory, bool RHSIsQualifiedID=false)
ClassImplementsProtocol - Checks that 'lProto' protocol has been implemented in IDecl class,...
StringRef getObjCRuntimeNameAsString() const
Produce a name to be used for class's metadata.
ObjCImplementationDecl * getImplementation() const
ObjCInterfaceDecl * getSuperClass() const
bool isSuperClassOf(const ObjCInterfaceDecl *I) const
isSuperClassOf - Return true if this class is the specified class or is a super class of the specifie...
known_extensions_range known_extensions() const
Represents typeof(type), a C23 feature and GCC extension, or `typeof_unqual(type),...
ObjCInterfaceDecl * getDecl() const
Get the declaration of this interface.
ObjCIvarDecl - Represents an ObjC instance variable.
ObjCIvarDecl * getNextIvar()
ObjCMethodDecl - Represents an instance or class method declaration.
ObjCDeclQualifier getObjCDeclQualifier() const
unsigned param_size() const
param_const_iterator param_end() const
param_const_iterator param_begin() const
const ParmVarDecl *const * param_const_iterator
Selector getSelector() const
bool isInstanceMethod() const
QualType getReturnType() const
Represents a pointer to an Objective C object.
bool isObjCQualifiedClassType() const
True if this is equivalent to 'Class.
const ObjCObjectPointerType * stripObjCKindOfTypeAndQuals(const ASTContext &ctx) const
Strip off the Objective-C "kindof" type and (with it) any protocol qualifiers.
bool isObjCQualifiedIdType() const
True if this is equivalent to 'id.
void Profile(llvm::FoldingSetNodeID &ID)
const ObjCObjectType * getObjectType() const
Gets the type pointed to by this ObjC pointer.
bool isObjCIdType() const
True if this is equivalent to the 'id' type, i.e.
QualType getPointeeType() const
Gets the type pointed to by this ObjC pointer.
ObjCInterfaceDecl * getInterfaceDecl() const
If this pointer points to an Objective @interface type, gets the declaration for that interface.
const ObjCInterfaceType * getInterfaceType() const
If this pointer points to an Objective C @interface type, gets the type for that interface.
bool isObjCClassType() const
True if this is equivalent to the 'Class' type, i.e.
Represents one property declaration in an Objective-C interface.
bool isReadOnly() const
isReadOnly - Return true iff the property has a setter.
static ObjCPropertyDecl * findPropertyDecl(const DeclContext *DC, const IdentifierInfo *propertyID, ObjCPropertyQueryKind queryKind)
Lookup a property by name in the specified DeclContext.
SetterKind getSetterKind() const
getSetterKind - Return the method used for doing assignment in the property setter.
Selector getSetterName() const
Selector getGetterName() const
ObjCPropertyAttribute::Kind getPropertyAttributes() const
ObjCPropertyImplDecl - Represents implementation declaration of a property in a class or category imp...
ObjCIvarDecl * getPropertyIvarDecl() const
Represents an Objective-C protocol declaration.
protocol_range protocols() const
bool isGNUFamily() const
Is this runtime basically of the GNU family of runtimes?
Represents the declaration of an Objective-C type parameter.
ObjCTypeParamVariance getVariance() const
Determine the variance of this type parameter.
Stores a list of Objective-C type parameters for a parameterized class or a category/extension thereo...
A structure for storing the information associated with an overloaded template name.
Represents a C++11 pack expansion that produces a sequence of expressions.
Sugar for parentheses used when specifying types.
void Profile(llvm::FoldingSetNodeID &ID)
void clear()
Clear parent maps.
Represents a parameter to a function.
ObjCDeclQualifier getObjCDeclQualifier() const
QualType getOriginalType() const
ParsedAttr - Represents a syntactic attribute.
void Profile(llvm::FoldingSetNodeID &ID)
Pointer-authentication qualifiers.
static PointerAuthQualifier Create(unsigned Key, bool IsAddressDiscriminated, unsigned ExtraDiscriminator, PointerAuthenticationMode AuthenticationMode, bool IsIsaPointer, bool AuthenticatesNullValues)
bool isEquivalent(PointerAuthQualifier Other) const
PointerType - C99 6.7.5.1 - Pointer Declarators.
QualType getPointeeType() const
void Profile(llvm::FoldingSetNodeID &ID)
Engages in a tight little dance with the lexer to efficiently preprocess tokens.
A (possibly-)qualified type.
bool hasAddressDiscriminatedPointerAuth() const
bool isVolatileQualified() const
Determine whether this type is volatile-qualified.
bool isTriviallyCopyableType(const ASTContext &Context) const
Return true if this is a trivially copyable type (C++0x [basic.types]p9)
Qualifiers::GC getObjCGCAttr() const
Returns gc attribute of this type.
bool hasQualifiers() const
Determine whether this type has any qualifiers.
QualType getDesugaredType(const ASTContext &Context) const
Return the specified type with any "sugar" removed from the type.
QualType withConst() const
bool hasLocalQualifiers() const
Determine whether this particular QualType instance has any qualifiers, without looking through any t...
bool isNull() const
Return true if this QualType doesn't point to a type yet.
const Type * getTypePtr() const
Retrieves a pointer to the underlying (unqualified) type.
LangAS getAddressSpace() const
Return the address space of this type.
Qualifiers getQualifiers() const
Retrieve the set of qualifiers applied to this type.
Qualifiers::ObjCLifetime getObjCLifetime() const
Returns lifetime attribute of this type.
QualType getCanonicalType() const
QualType getUnqualifiedType() const
Retrieve the unqualified variant of the given type, removing as little sugar as possible.
SplitQualType split() const
Divides a QualType into its unqualified type and a set of local qualifiers.
bool isConstQualified() const
Determine whether this type is const-qualified.
DestructionKind isDestructedType() const
Returns a nonzero value if objects of this type require non-trivial work to clean up after.
const Type * getTypePtrOrNull() const
static std::string getAsString(SplitQualType split, const PrintingPolicy &Policy)
PrimitiveCopyKind isNonTrivialToPrimitiveDestructiveMove() const
Check if this is a non-trivial type that would cause a C struct transitively containing this type to ...
Qualifiers getLocalQualifiers() const
Retrieve the set of qualifiers local to this particular QualType instance, not including any qualifie...
Represents a template name as written in source code.
void Profile(llvm::FoldingSetNodeID &ID)
A qualifier set is used to build a set of qualifiers.
const Type * strip(QualType type)
Collect any qualifiers on the given type and return an unqualified type.
The collection of all-type qualifiers we support.
unsigned getCVRQualifiers() const
void removeCVRQualifiers(unsigned mask)
void addAddressSpace(LangAS space)
static Qualifiers removeCommonQualifiers(Qualifiers &L, Qualifiers &R)
Returns the common set of qualifiers while removing them from the given sets.
@ OCL_Strong
Assigning into this object requires the old value to be released and the new value to be retained.
@ OCL_ExplicitNone
This object can be modified without requiring retains or releases.
@ OCL_None
There is no lifetime qualification on this type.
@ OCL_Weak
Reading or writing from this object requires a barrier call.
@ OCL_Autoreleasing
Assigning into this object requires a lifetime extension.
void removeObjCLifetime()
bool hasNonFastQualifiers() const
Return true if the set contains any qualifiers which require an ExtQuals node to be allocated.
void addConsistentQualifiers(Qualifiers qs)
Add the qualifiers from the given set to this set, given that they don't conflict.
void removeFastQualifiers(unsigned mask)
bool hasUnaligned() const
bool hasAddressSpace() const
static bool isAddressSpaceSupersetOf(LangAS A, LangAS B, const ASTContext &Ctx)
Returns true if address space A is equal to or a superset of B.
unsigned getFastQualifiers() const
void removeAddressSpace()
PointerAuthQualifier getPointerAuth() const
bool hasObjCGCAttr() const
uint64_t getAsOpaqueValue() const
bool hasObjCLifetime() const
ObjCLifetime getObjCLifetime() const
void addObjCGCAttr(GC type)
LangAS getAddressSpace() const
An rvalue reference type, per C++11 [dcl.ref].
Represents a struct/union/class.
bool isLambda() const
Determine whether this record is a class describing a lambda function object.
bool hasFlexibleArrayMember() const
field_range fields() const
static RecordDecl * Create(const ASTContext &C, TagKind TK, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, IdentifierInfo *Id, RecordDecl *PrevDecl=nullptr)
RecordDecl * getMostRecentDecl()
virtual void completeDefinition()
Note that the definition of this type is now complete.
RecordDecl * getDefinition() const
Returns the RecordDecl that actually defines this struct/union/class.
decl_type * getFirstDecl()
Return the first declaration of this declaration or itself if this is the only declaration.
Base for LValueReferenceType and RValueReferenceType.
QualType getPointeeType() const
void Profile(llvm::FoldingSetNodeID &ID)
This table allows us to fully hide how we implement multi-keyword caching.
std::string getAsString() const
Derive the full selector name (e.g.
Encodes a location in the source.
bool isValid() const
Return true if this is a valid SourceLocation object.
This class handles loading and caching of source files into memory.
A trivial tuple used to represent a source range.
SourceLocation getBegin() const
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context, bool Canonical, bool ProfileLambdaExpr=false) const
Produce a unique representation of the given statement.
The streaming interface shared between DiagnosticBuilder and PartialDiagnostic.
StringLiteral - This represents a string literal expression, e.g.
static StringLiteral * Create(const ASTContext &Ctx, StringRef Str, StringLiteralKind Kind, bool Pascal, QualType Ty, ArrayRef< SourceLocation > Locs)
This is the "fully general" constructor that allows representation of strings formed from one or more...
A structure for storing an already-substituted template template parameter pack.
Decl * getAssociatedDecl() const
A template-like entity which owns the whole pattern being substituted.
void Profile(llvm::FoldingSetNodeID &ID, ASTContext &Context)
TemplateTemplateParmDecl * getParameterPack() const
Retrieve the template template parameter pack being substituted.
TemplateArgument getArgumentPack() const
Retrieve the template template argument pack with which this parameter was substituted.
unsigned getIndex() const
Returns the index of the replaced parameter in the associated declaration.
A structure for storing the information associated with a substituted template template parameter.
void Profile(llvm::FoldingSetNodeID &ID)
TemplateTemplateParmDecl * getParameter() const
Represents the declaration of a struct/union/class/enum.
TypedefNameDecl * getTypedefNameForAnonDecl() const
void startDefinition()
Starts the definition of this tag declaration.
TagDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
TagKind getTagKind() const
bool isMicrosoft() const
Is this ABI an MSVC-compatible ABI?
Kind
The basic C++ ABI kind.
static Kind getKind(StringRef Name)
Exposes information about the current target.
TargetOptions & getTargetOpts() const
Retrieve the target options.
const llvm::Triple & getTriple() const
Returns the target triple of the primary target.
unsigned getMaxAtomicInlineWidth() const
Return the maximum width lock-free atomic operation which can be inlined given the supported features...
virtual LangAS getCUDABuiltinAddressSpace(unsigned AS) const
Map from the address space field in builtin description strings to the language address space.
virtual LangAS getOpenCLBuiltinAddressSpace(unsigned AS) const
Map from the address space field in builtin description strings to the language address space.
unsigned getDefaultAlignForAttributeAligned() const
Return the default alignment for attribute((aligned)) on this target, to be used if no alignment valu...
BuiltinVaListKind
The different kinds of __builtin_va_list types defined by the target implementation.
@ AArch64ABIBuiltinVaList
__builtin_va_list as defined by the AArch64 ABI http://infocenter.arm.com/help/topic/com....
@ PowerABIBuiltinVaList
__builtin_va_list as defined by the Power ABI: https://www.power.org /resources/downloads/Power-Arch-...
@ AAPCSABIBuiltinVaList
__builtin_va_list as defined by ARM AAPCS ABI http://infocenter.arm.com
@ CharPtrBuiltinVaList
typedef char* __builtin_va_list;
@ VoidPtrBuiltinVaList
typedef void* __builtin_va_list;
@ X86_64ABIBuiltinVaList
__builtin_va_list as defined by the x86-64 ABI: http://refspecs.linuxbase.org/elf/x86_64-abi-0....
virtual uint64_t getNullPointerValue(LangAS AddrSpace) const
Get integer value for null pointer.
static bool isTypeSigned(IntType T)
Returns true if the type is signed; false otherwise.
IntType getPtrDiffType(LangAS AddrSpace) const
IntType getSizeType() const
FloatModeKind getRealTypeByWidth(unsigned BitWidth, FloatModeKind ExplicitType) const
Return floating point type with specified width.
virtual IntType getIntTypeByWidth(unsigned BitWidth, bool IsSigned) const
Return integer type with specified width.
unsigned getMaxAlignedAttribute() const
Get the maximum alignment in bits for a static variable with aligned attribute.
virtual unsigned getMinGlobalAlign(uint64_t Size, bool HasNonWeakDef) const
getMinGlobalAlign - Return the minimum alignment of a global variable, unless its alignment is explic...
unsigned getTargetAddressSpace(LangAS AS) const
IntType getSignedSizeType() const
TargetCXXABI getCXXABI() const
Get the C++ ABI currently in use.
bool useAddressSpaceMapMangling() const
Specify if mangling based on address space map should be used or not for language specific address sp...
llvm::StringMap< bool > FeatureMap
The map of which features have been enabled disabled based on the command line.
A convenient class for passing around template argument information.
ArrayRef< TemplateArgumentLoc > arguments() const
ArrayRef< TemplateArgument > asArray() const
Produce this as an array ref.
Location wrapper for a TemplateArgument.
Represents a template argument.
ArrayRef< TemplateArgument > getPackAsArray() const
Return the array of arguments in this template argument pack.
QualType getStructuralValueType() const
Get the type of a StructuralValue.
QualType getParamTypeForDecl() const
Expr * getAsExpr() const
Retrieve the template argument as an expression.
UnsignedOrNone getNumTemplateExpansions() const
Retrieve the number of expansions that a template template argument expansion will produce,...
QualType getAsType() const
Retrieve the type for a type template argument.
llvm::APSInt getAsIntegral() const
Retrieve the template argument as an integral value.
QualType getNullPtrType() const
Retrieve the type for null non-type template argument.
static TemplateArgument CreatePackCopy(ASTContext &Context, ArrayRef< TemplateArgument > Args)
Create a new template argument pack by copying the given set of template arguments.
TemplateName getAsTemplate() const
Retrieve the template name for a template name argument.
bool structurallyEquals(const TemplateArgument &Other) const
Determines whether two template arguments are superficially the same.
QualType getIntegralType() const
Retrieve the type of the integral value.
bool getIsDefaulted() const
If returns 'true', this TemplateArgument corresponds to a default template parameter.
ValueDecl * getAsDecl() const
Retrieve the declaration for a declaration non-type template argument.
ArrayRef< TemplateArgument > pack_elements() const
Iterator range referencing all of the elements of a template argument pack.
@ Declaration
The template argument is a declaration that was provided for a pointer, reference,...
@ Template
The template argument is a template name that was provided for a template template parameter.
@ StructuralValue
The template argument is a non-type template argument that can't be represented by the special-case D...
@ Pack
The template argument is actually a parameter pack.
@ TemplateExpansion
The template argument is a pack expansion of a template name that was provided for a template templat...
@ NullPtr
The template argument is a null pointer or null pointer to member that was provided for a non-type te...
@ Type
The template argument is a type.
@ Null
Represents an empty template argument, e.g., one that has not been deduced.
@ Integral
The template argument is an integral value stored in an llvm::APSInt that was provided for an integra...
@ Expression
The template argument is an expression, and we've not resolved it to one of the other forms yet,...
ArgKind getKind() const
Return the kind of stored template argument.
TemplateName getAsTemplateOrTemplatePattern() const
Retrieve the template argument as a template name; if the argument is a pack expansion,...
const APValue & getAsStructuralValue() const
Get the value of a StructuralValue.
The base class of all kinds of template declarations (e.g., class, function, etc.).
TemplateParameterList * getTemplateParameters() const
Get the list of template parameters.
Represents a C++ template name within the type system.
TemplateDecl * getAsTemplateDecl(bool IgnoreDeduced=false) const
Retrieve the underlying template declaration that this template name refers to, if known.
DeducedTemplateStorage * getAsDeducedTemplateName() const
Retrieve the deduced template info, if any.
DependentTemplateName * getAsDependentTemplateName() const
Retrieve the underlying dependent template name structure, if any.
std::optional< TemplateName > desugar(bool IgnoreDeduced) const
OverloadedTemplateStorage * getAsOverloadedTemplate() const
Retrieve the underlying, overloaded function template declarations that this template name refers to,...
AssumedTemplateStorage * getAsAssumedTemplateName() const
Retrieve information on a name that has been assumed to be a template-name in order to permit a call ...
void * getAsVoidPointer() const
Retrieve the template name as a void pointer.
@ UsingTemplate
A template name that refers to a template declaration found through a specific using shadow declarati...
@ OverloadedTemplate
A set of overloaded template declarations.
@ Template
A single template declaration.
@ DependentTemplate
A dependent template name that has not been resolved to a template (or set of templates).
@ SubstTemplateTemplateParm
A template template parameter that has been substituted for some other template name.
@ SubstTemplateTemplateParmPack
A template template parameter pack that has been substituted for a template template argument pack,...
@ DeducedTemplate
A template name that refers to another TemplateName with deduced default arguments.
@ QualifiedTemplate
A qualified template name, where the qualification is kept to describe the source code as written.
@ AssumedTemplate
An unqualified-id that has been assumed to name a function template that will be found by ADL.
UsingShadowDecl * getAsUsingShadowDecl() const
Retrieve the using shadow declaration through which the underlying template declaration is introduced...
SubstTemplateTemplateParmPackStorage * getAsSubstTemplateTemplateParmPack() const
Retrieve the substituted template template parameter pack, if known.
SubstTemplateTemplateParmStorage * getAsSubstTemplateTemplateParm() const
Retrieve the substituted template template parameter, if known.
A template parameter object.
static void Profile(llvm::FoldingSetNodeID &ID, QualType T, const APValue &V)
Stores a list of template parameters for a TemplateDecl and its derived classes.
NamedDecl * getParam(unsigned Idx)
static TemplateParameterList * Create(const ASTContext &C, SourceLocation TemplateLoc, SourceLocation LAngleLoc, ArrayRef< NamedDecl * > Params, SourceLocation RAngleLoc, Expr *RequiresClause)
NamedDecl *const * const_iterator
Iterates through the template parameters in this list.
Expr * getRequiresClause()
The constraint-expression of the associated requires-clause.
ArrayRef< NamedDecl * > asArray()
TemplateTemplateParmDecl - Declares a template template parameter, e.g., "T" in.
TemplateNameKind templateParameterKind() const
unsigned getPosition() const
Get the position of the template parameter within its parameter list.
static TemplateTemplateParmDecl * Create(const ASTContext &C, DeclContext *DC, SourceLocation L, unsigned D, unsigned P, bool ParameterPack, IdentifierInfo *Id, TemplateNameKind ParameterKind, bool Typename, TemplateParameterList *Params)
bool isParameterPack() const
Whether this template template parameter is a template parameter pack.
unsigned getIndex() const
Get the index of the template parameter within its parameter list.
unsigned getDepth() const
Get the nesting depth of the template parameter.
Declaration of a template type parameter.
static TemplateTypeParmDecl * Create(const ASTContext &C, DeclContext *DC, SourceLocation KeyLoc, SourceLocation NameLoc, unsigned D, unsigned P, IdentifierInfo *Id, bool Typename, bool ParameterPack, bool HasTypeConstraint=false, UnsignedOrNone NumExpanded=std::nullopt)
Models the abbreviated syntax to constrain a template type parameter: template <convertible_to<string...
Expr * getImmediatelyDeclaredConstraint() const
Get the immediately-declared constraint expression introduced by this type-constraint,...
TemplateDecl * getNamedConcept() const
ConceptReference * getConceptReference() const
Represents a declaration of a type.
T castAs() const
Convert to the specified TypeLoc type, asserting that this TypeLoc is of the desired type.
static unsigned getFullDataSizeForType(QualType Ty)
Returns the size of type source info data block for the given type.
void initialize(ASTContext &Context, SourceLocation Loc) const
Initializes this to state that every location in this type is the given location.
Represents a typeof (or typeof) expression (a C23 feature and GCC extension) or a typeof_unqual expre...
A container of type source information.
TypeLoc getTypeLoc() const
Return the TypeLoc wrapper for the type source info.
The base class of the type hierarchy.
bool isBlockPointerType() const
bool isObjCBuiltinType() const
QualType getRVVEltType(const ASTContext &Ctx) const
Returns the representative type for the element of an RVV builtin type.
bool isIncompleteArrayType() const
bool isSignedIntegerType() const
Return true if this is an integer type that is signed, according to C99 6.2.5p4 [char,...
CXXRecordDecl * getAsCXXRecordDecl() const
Retrieves the CXXRecordDecl that this type refers to, either because the type is a RecordType or beca...
bool isConstantArrayType() const
RecordDecl * getAsRecordDecl() const
Retrieves the RecordDecl this type refers to.
bool isConstantSizeType() const
Return true if this is not a variable sized type, according to the rules of C99 6....
bool isPointerType() const
bool isArrayParameterType() const
CanQualType getCanonicalTypeUnqualified() const
bool isIntegerType() const
isIntegerType() does not include complex integers (a GCC extension).
const T * castAs() const
Member-template castAs<specific type>.
bool isSignedFixedPointType() const
Return true if this is a fixed point type that is signed according to ISO/IEC JTC1 SC22 WG14 N1169.
bool isEnumeralType() const
bool isObjCQualifiedIdType() const
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.
bool isIntegralOrEnumerationType() const
Determine whether this type is an integral or enumeration type.
AutoType * getContainedAutoType() const
Get the AutoType whose type will be deduced for a variable with an initializer of this type.
bool isInstantiationDependentType() const
Determine whether this type is an instantiation-dependent type, meaning that the type involves a temp...
bool isBitIntType() const
bool isBuiltinType() const
Helper methods to distinguish type categories.
bool isDependentType() const
Whether this type is a dependent type, meaning that its definition somehow depends on a template para...
bool isFixedPointType() const
Return true if this is a fixed point type according to ISO/IEC JTC1 SC22 WG14 N1169.
bool isSaturatedFixedPointType() const
Return true if this is a saturated fixed point type according to ISO/IEC JTC1 SC22 WG14 N1169.
bool containsUnexpandedParameterPack() const
Whether this type is or contains an unexpanded parameter pack, used to support C++0x variadic templat...
QualType getCanonicalTypeInternal() const
@ PtrdiffT
The "ptrdiff_t" type.
@ SizeT
The "size_t" type.
@ SignedSizeT
The signed integer type corresponding to "size_t".
bool isObjCIdType() const
bool isUnsaturatedFixedPointType() const
Return true if this is a saturated fixed point type according to ISO/IEC JTC1 SC22 WG14 N1169.
const ArrayType * getAsArrayTypeUnsafe() const
A variant of getAs<> for array types which silently discards qualifiers from the outermost type.
EnumDecl * getAsEnumDecl() const
Retrieves the EnumDecl this type refers to.
bool isIncompleteType(NamedDecl **Def=nullptr) const
Types are partitioned into 3 broad categories (C99 6.2.5p1): object types, function types,...
bool isFunctionType() const
bool isObjCObjectPointerType() const
bool isUnsignedFixedPointType() const
Return true if this is a fixed point type that is unsigned according to ISO/IEC JTC1 SC22 WG14 N1169.
bool isVectorType() const
bool isObjCClassType() const
bool isRVVVLSBuiltinType() const
Determines if this is a sizeless type supported by the 'riscv_rvv_vector_bits' type attribute,...
bool isRVVSizelessBuiltinType() const
Returns true for RVV scalable vector types.
const T * getAsCanonical() const
If this type is canonically the specified type, return its canonical type cast to that specified type...
bool isUnsignedIntegerType() const
Return true if this is an integer type that is unsigned, according to C99 6.2.5p6 [which returns true...
bool isAnyPointerType() const
TypeClass getTypeClass() const
bool isCanonicalUnqualified() const
Determines if this type would be canonical if it had no further qualification.
const T * getAs() const
Member-template getAs<specific type>'.
const Type * getUnqualifiedDesugaredType() const
Return the specified type with any "sugar" removed from the type, removing any typedefs,...
bool isNullPtrType() const
bool isRecordType() const
bool isObjCRetainableType() const
std::optional< NullabilityKind > getNullability() const
Determine the nullability of the given type.
Represents the declaration of a typedef-name via the 'typedef' type specifier.
static TypedefDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id, TypeSourceInfo *TInfo)
Base class for declarations which introduce a typedef-name.
QualType getUnderlyingType() const
static void Profile(llvm::FoldingSetNodeID &ID, ElaboratedTypeKeyword Keyword, NestedNameSpecifier Qualifier, const TypedefNameDecl *Decl, QualType Underlying)
An artificial decl, representing a global anonymous constant value which is uniquified by value withi...
static void Profile(llvm::FoldingSetNodeID &ID, QualType Ty, const APValue &APVal)
The iterator over UnresolvedSets.
Represents the dependent type named by a dependently-scoped typename using declaration,...
static void Profile(llvm::FoldingSetNodeID &ID, ElaboratedTypeKeyword Keyword, NestedNameSpecifier Qualifier, const UnresolvedUsingTypenameDecl *D)
Represents a dependent using declaration which was marked with typename.
UnresolvedUsingTypenameDecl * getCanonicalDecl() override
Retrieves the canonical declaration of this declaration.
Represents a C++ using-enum-declaration.
Represents a shadow declaration implicitly introduced into a scope by a (resolved) using-declaration ...
NamedDecl * getTargetDecl() const
Gets the underlying declaration which has been brought into the local scope.
BaseUsingDecl * getIntroducer() const
Gets the (written or instantiated) using declaration that introduced this declaration.
static void Profile(llvm::FoldingSetNodeID &ID, ElaboratedTypeKeyword Keyword, NestedNameSpecifier Qualifier, const UsingShadowDecl *D, QualType UnderlyingType)
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
void setType(QualType newType)
bool isWeak() const
Determine whether this symbol is weakly-imported, or declared with the weak or weak-ref attr.
Represents a variable declaration or definition.
VarTemplateDecl * getDescribedVarTemplate() const
Retrieves the variable template that is described by this variable declaration.
bool isOutOfLine() const override
Determine whether this is or was instantiated from an out-of-line definition of a static data member.
bool isStaticDataMember() const
Determines whether this is a static data member.
redecl_range redecls() const
Returns an iterator range for all the redeclarations of the same decl.
bool isStaticLocal() const
Returns true if a variable with function scope is a static local variable.
VarDecl * getInstantiatedFromStaticDataMember() const
If this variable is an instantiated static data member of a class template specialization,...
bool isInline() const
Whether this variable is (C++1z) inline.
@ DeclarationOnly
This declaration is only a declaration.
DefinitionKind hasDefinition(ASTContext &) const
Check whether this variable is defined in this translation unit.
TemplateSpecializationKind getTemplateSpecializationKind() const
If this variable is an instantiation of a variable template or a static data member of a class templa...
Represents a C array with a specified size that is not an integer-constant-expression.
Expr * getSizeExpr() const
Represents a GCC generic vector type.
unsigned getNumElements() const
void Profile(llvm::FoldingSetNodeID &ID)
VectorKind getVectorKind() const
QualType getElementType() const
Holds all information required to evaluate constexpr code in a module.
Defines the Linkage enumeration and various utility functions.
Defines the clang::TargetInfo interface.
mlir::Type getBaseType(mlir::Value varPtr)
const AstTypeMatcher< TagType > tagType
SmallVector< BoundNodes, 1 > match(MatcherT Matcher, const NodeT &Node, ASTContext &Context)
Returns the results of matching Matcher on Node.
const internal::VariadicAllOfMatcher< Type > type
Matches Types in the clang AST.
const AstTypeMatcher< ArrayType > arrayType
@ OS
Indicates that the tracking object is a descendant of a referenced-counted OSObject,...
The JSON file list parser is used to communicate input to InstallAPI.
CanQual< Type > CanQualType
Represents a canonical, potentially-qualified type.
bool isa(CodeGen::Address addr)
GVALinkage
A more specific kind of linkage than enum Linkage.
@ GVA_AvailableExternally
AutoTypeKeyword
Which keyword(s) were used to create an AutoType.
OpenCLTypeKind
OpenCL type kinds.
FunctionType::ExtInfo getFunctionExtInfo(const Type &t)
bool isUnresolvedExceptionSpec(ExceptionSpecificationType ESpecType)
NullabilityKind
Describes the nullability of a particular type.
@ Nullable
Values of this type can be null.
@ Unspecified
Whether values of this type can be null is (explicitly) unspecified.
@ NonNull
Values of this type can never be null.
@ ICIS_NoInit
No in-class initializer.
@ TemplateName
The identifier is a template name. FIXME: Add an annotation for that.
std::pair< FileID, unsigned > FileIDAndOffset
CXXABI * CreateMicrosoftCXXABI(ASTContext &Ctx)
@ Vector
'vector' clause, allowed on 'loop', Combined, and 'routine' directives.
@ Self
'self' clause, allowed on Compute and Combined Constructs, plus 'update'.
TypeOfKind
The kind of 'typeof' expression we're after.
SmallVector< Attr *, 4 > AttrVec
AttrVec - A vector of Attr, which is how they are stored on the AST.
nullptr
This class represents a compute construct, representing a 'Kind' of ‘parallel’, 'serial',...
CXXABI * CreateItaniumCXXABI(ASTContext &Ctx)
Creates an instance of a C++ ABI class.
const StreamingDiagnostic & operator<<(const StreamingDiagnostic &DB, const ASTContext::SectionInfo &Section)
Insertion operator for diagnostics.
Linkage
Describes the different kinds of linkage (C++ [basic.link], C99 6.2.2) that an entity may have.
@ External
External linkage, which indicates that the entity can be referred to from other translation units.
@ Result
The result type of a method or function.
ArraySizeModifier
Capture whether this is a normal array (e.g.
const FunctionProtoType * T
bool isComputedNoexcept(ExceptionSpecificationType ESpecType)
@ Template
We are parsing a template declaration.
@ Interface
The "__interface" keyword.
@ Struct
The "struct" keyword.
@ Class
The "class" keyword.
constexpr uint16_t SelPointerConstantDiscriminator
Constant discriminator to be used with objective-c sel pointers.
bool isDiscardableGVALinkage(GVALinkage L)
BuiltinTemplateKind
Kinds of BuiltinTemplateDecl.
@ Keyword
The name has been typo-corrected to a keyword.
LangAS
Defines the address space values used by the address space qualifier of QualType.
TranslationUnitKind
Describes the kind of translation unit being processed.
bool isPtrSizeAddressSpace(LangAS AS)
ExprValueKind
The categorization of expression values, currently following the C++11 scheme.
@ VK_PRValue
A pr-value expression (in the C++11 taxonomy) produces a temporary value.
@ VK_XValue
An x-value expression is a reference to an object with independent storage but which can be "moved",...
@ VK_LValue
An l-value expression is a reference to an object with independent storage.
bool declaresSameEntity(const Decl *D1, const Decl *D2)
Determine whether two declarations declare the same entity.
TemplateSpecializationKind
Describes the kind of template specialization that a particular template specialization declaration r...
@ TSK_ExplicitInstantiationDefinition
This template specialization was instantiated from a template due to an explicit instantiation defini...
@ TSK_ExplicitInstantiationDeclaration
This template specialization was instantiated from a template due to an explicit instantiation declar...
@ TSK_ExplicitSpecialization
This template specialization was declared or defined by an explicit specialization (C++ [temp....
@ TSK_ImplicitInstantiation
This template specialization was implicitly instantiated from a template.
@ TSK_Undeclared
This template specialization was formed from a template-id but has not yet been declared,...
CallingConv
CallingConv - Specifies the calling convention that a function uses.
@ Invariant
The parameter is invariant: must match exactly.
@ Contravariant
The parameter is contravariant, e.g., X<T> is a subtype of X when the type parameter is covariant and...
@ Covariant
The parameter is covariant, e.g., X<T> is a subtype of X when the type parameter is covariant and T i...
@ AltiVecBool
is AltiVec 'vector bool ...'
@ SveFixedLengthData
is AArch64 SVE fixed-length data vector
@ AltiVecPixel
is AltiVec 'vector Pixel'
@ Generic
not a target-specific vector type
@ RVVFixedLengthData
is RISC-V RVV fixed-length data vector
@ RVVFixedLengthMask
is RISC-V RVV fixed-length mask vector
@ SveFixedLengthPredicate
is AArch64 SVE fixed-length predicate vector
U cast(CodeGen::Address addr)
LangAS getLangASFromTargetAS(unsigned TargetAS)
@ None
The alignment was not explicit in code.
@ RequiredByEnum
The alignment comes from an alignment attribute on a enum type.
@ RequiredByTypedef
The alignment comes from an alignment attribute on a typedef.
@ RequiredByRecord
The alignment comes from an alignment attribute on a record type.
ElaboratedTypeKeyword
The elaboration keyword that precedes a qualified type name or introduces an elaborated-type-specifie...
@ Interface
The "__interface" keyword introduces the elaborated-type-specifier.
@ None
No keyword precedes the qualified type name.
@ Struct
The "struct" keyword introduces the elaborated-type-specifier.
@ Class
The "class" keyword introduces the elaborated-type-specifier.
@ Union
The "union" keyword introduces the elaborated-type-specifier.
@ Enum
The "enum" keyword introduces the elaborated-type-specifier.
@ Typename
The "typename" keyword precedes the qualified type name, e.g., typename T::type.
ExceptionSpecificationType
The various types of exception specifications that exist in C++11.
@ EST_DependentNoexcept
noexcept(expression), value-dependent
@ EST_Uninstantiated
not instantiated yet
@ EST_Unparsed
not parsed yet
@ EST_NoThrow
Microsoft __declspec(nothrow) extension.
@ EST_None
no exception specification
@ EST_MSAny
Microsoft throw(...) extension.
@ EST_BasicNoexcept
noexcept
@ EST_NoexceptFalse
noexcept(expression), evals to 'false'
@ EST_Unevaluated
not evaluated yet, for special member function
@ EST_NoexceptTrue
noexcept(expression), evals to 'true'
@ EST_Dynamic
throw(T1, T2)
unsigned NumTemplateArgs
The number of template arguments in TemplateArgs.
const Expr * ConstraintExpr
UnsignedOrNone ArgPackSubstIndex
Copy initialization expr of a __block variable and a boolean flag that indicates whether the expressi...
Expr * getCopyExpr() const
DeclarationNameInfo - A collector data type for bundling together a DeclarationName and the correspon...
ArrayRef< TemplateArgument > Args
Holds information about the various types of exception specification.
ExceptionSpecificationType Type
The kind of exception specification this is.
ArrayRef< QualType > Exceptions
Explicitly-specified list of exception types.
Expr * NoexceptExpr
Noexcept expression, if this is a computed noexcept specification.
Extra information about a function prototype.
ExceptionSpecInfo ExceptionSpec
bool requiresFunctionProtoTypeArmAttributes() const
FunctionEffectsRef FunctionEffects
const ExtParameterInfo * ExtParameterInfos
RefQualifierKind RefQualifier
bool requiresFunctionProtoTypeExtraAttributeInfo() const
unsigned HasTrailingReturn
bool requiresFunctionProtoTypeExtraBitfields() const
FunctionType::ExtInfo ExtInfo
const IdentifierInfo * getIdentifier() const
Returns the identifier to which this template name refers.
OverloadedOperatorKind getOperator() const
Return the overloaded operator to which this template name refers.
static ElaboratedTypeKeyword getKeywordForTagTypeKind(TagTypeKind Tag)
Converts a TagTypeKind into an elaborated type keyword.
A lazy value (of type T) that is within an AST node of type Owner, where the value might change in la...
Contains information gathered from parsing the contents of TargetAttr.
A std::pair-like structure for storing a qualified type split into its local qualifiers and its local...
const Type * Ty
The locally-unqualified type.
Qualifiers Quals
The local qualifiers.
llvm::DenseSet< std::tuple< Decl *, Decl *, int > > NonEquivalentDeclSet
Store declaration pairs already found to be non-equivalent.
bool IsEquivalent(Decl *D1, Decl *D2)
Determine whether the two declarations are structurally equivalent.
A this pointer adjustment.
IntType
===-— Target Data Type Query Methods ----------------------------—===//
AlignRequirementKind AlignRequirement
AlignRequirementKind AlignRequirement