69#include "llvm/ADT/APFixedPoint.h"
70#include "llvm/ADT/APInt.h"
71#include "llvm/ADT/APSInt.h"
72#include "llvm/ADT/ArrayRef.h"
73#include "llvm/ADT/DenseMap.h"
74#include "llvm/ADT/DenseSet.h"
75#include "llvm/ADT/FoldingSet.h"
76#include "llvm/ADT/PointerUnion.h"
77#include "llvm/ADT/STLExtras.h"
78#include "llvm/ADT/SmallPtrSet.h"
79#include "llvm/ADT/SmallVector.h"
80#include "llvm/ADT/StringExtras.h"
81#include "llvm/ADT/StringRef.h"
82#include "llvm/Frontend/OpenMP/OMPIRBuilder.h"
83#include "llvm/Support/Capacity.h"
84#include "llvm/Support/Casting.h"
85#include "llvm/Support/Compiler.h"
86#include "llvm/Support/ErrorHandling.h"
87#include "llvm/Support/MD5.h"
88#include "llvm/Support/MathExtras.h"
89#include "llvm/Support/SipHash.h"
90#include "llvm/Support/raw_ostream.h"
91#include "llvm/TargetParser/AArch64TargetParser.h"
92#include "llvm/TargetParser/Triple.h"
105using namespace clang;
129 if (
const auto *FD = dyn_cast<FunctionDecl>(D)) {
134 if (
const auto *VD = dyn_cast<VarDecl>(D)) {
135 if (VD->isStaticDataMember() &&
140 if (
const auto *CRD = dyn_cast<CXXRecordDecl>(D)) {
145 if (
const auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(D)) {
152 if (
const auto *ED = dyn_cast<EnumDecl>(D)) {
156 if (
const auto *TD = dyn_cast<TagDecl>(D)) {
159 if (TD->isEmbeddedInDeclarator() && !TD->isCompleteDefinition())
191 Locations.emplace_back(BaseLocation);
204 Locations.emplace_back(SourceMgr.getExpansionLoc(BaseLocation));
211 Locations.emplace_back(SourceMgr.getSpellingLoc(D->
getBeginLoc()));
219 const std::map<unsigned, RawComment *> &CommentsInTheFile)
const {
222 if (RepresentativeLocForDecl.
isInvalid() ||
223 !RepresentativeLocForDecl.
isFileID())
227 if (CommentsInTheFile.empty())
233 SourceMgr.getDecomposedLoc(RepresentativeLocForDecl);
236 auto OffsetCommentBehindDecl =
237 CommentsInTheFile.lower_bound(DeclLocDecomp.second);
240 if (OffsetCommentBehindDecl != CommentsInTheFile.end()) {
241 RawComment *CommentBehindDecl = OffsetCommentBehindDecl->second;
243 LangOpts.CommentOpts.ParseAllComments) &&
250 if (SourceMgr.getLineNumber(DeclLocDecomp.first, DeclLocDecomp.second) ==
251 Comments.getCommentBeginLine(CommentBehindDecl, DeclLocDecomp.first,
252 OffsetCommentBehindDecl->first)) {
253 return CommentBehindDecl;
260 if (OffsetCommentBehindDecl == CommentsInTheFile.begin())
263 auto OffsetCommentBeforeDecl = --OffsetCommentBehindDecl;
264 RawComment *CommentBeforeDecl = OffsetCommentBeforeDecl->second;
268 LangOpts.CommentOpts.ParseAllComments) ||
273 const unsigned CommentEndOffset =
274 Comments.getCommentEndOffset(CommentBeforeDecl);
278 const char *Buffer = SourceMgr.getBufferData(DeclLocDecomp.first,
284 StringRef
Text(Buffer + CommentEndOffset,
285 DeclLocDecomp.second - CommentEndOffset);
289 if (
Text.find_last_of(
";{}#@") != StringRef::npos)
292 return CommentBeforeDecl;
298 for (
const auto DeclLoc : DeclLocs) {
301 if (DeclLoc.isInvalid() || !DeclLoc.isFileID())
312 const FileID File = SourceMgr.getDecomposedLoc(DeclLoc).first;
316 const auto CommentsInThisFile =
Comments.getCommentsInFile(
File);
317 if (!CommentsInThisFile || CommentsInThisFile->empty())
329 assert(LangOpts.RetainCommentsFromSystemHeaders ||
331 Comments.addComment(RC, LangOpts.CommentOpts, BumpAlloc);
336 const Decl **OriginalDecl)
const {
339 OriginalDecl =
nullptr;
351 return DeclComment->second;
364 *OriginalDecl = RedeclComment->second;
367 "This decl is supposed to have comment attached.");
368 return CommentAtRedecl->second;
373 const Decl *LastCheckedRedecl = [&]() {
375 bool CanUseCommentlessCache =
false;
377 for (
auto *Redecl : CanonicalD->
redecls()) {
379 CanUseCommentlessCache =
true;
382 if (Redecl == LastChecked)
389 return CanUseCommentlessCache ? LastChecked :
nullptr;
395 if (LastCheckedRedecl) {
396 if (LastCheckedRedecl == Redecl) {
397 LastCheckedRedecl =
nullptr;
405 *OriginalDecl = Redecl;
406 return RedeclComment;
412 *OriginalDecl =
nullptr;
418 assert(Comment.
isDocumentation() || LangOpts.CommentOpts.ParseAllComments);
428 if (
const auto *IMD = dyn_cast<ObjCImplDecl>(DC)) {
433 for (
const auto *Ext : ID->known_extensions()) {
437 Redeclared.push_back(RedeclaredMethod);
444 if (
Comments.empty() || Decls.empty())
448 for (
const Decl *D : Decls) {
449 if (D->isInvalidDecl())
457 File = SourceMgr.getDecomposedLoc(Loc).first;
462 if (
File.isInvalid())
465 auto CommentsInThisFile =
Comments.getCommentsInFile(
File);
466 if (!CommentsInThisFile || CommentsInThisFile->empty() ||
467 CommentsInThisFile->rbegin()->second->isAttached())
477 for (
const Decl *D : Decls) {
479 if (D->isInvalidDecl())
489 for (
const auto DeclLoc : DeclLocs) {
490 if (DeclLoc.isInvalid() || !DeclLoc.isFileID())
494 D, DeclLoc, *CommentsInThisFile)) {
505 const Decl *D)
const {
508 ThisDeclInfo->IsFilled =
false;
509 ThisDeclInfo->fill();
510 ThisDeclInfo->CommentDecl = FC->
getDecl();
511 if (!ThisDeclInfo->TemplateParameters)
521 return RC ? RC->
parse(*
this,
nullptr, D) :
nullptr;
532 llvm::DenseMap<const Decl *, comments::FullComment *>::iterator Pos =
536 if (Canonical != D) {
544 const Decl *OriginalDecl =
nullptr;
550 const auto *OMD = dyn_cast<ObjCMethodDecl>(D);
551 if (OMD && OMD->isPropertyAccessor())
558 for (
unsigned i = 0, e = Overridden.size(); i < e; i++)
562 else if (
const auto *TD = dyn_cast<TypedefNameDecl>(D)) {
565 QualType QT = TD->getUnderlyingType();
566 if (
const auto *TT = QT->
getAs<TagType>())
570 else if (
const auto *IC = dyn_cast<ObjCInterfaceDecl>(D)) {
571 while (IC->getSuperClass()) {
572 IC = IC->getSuperClass();
577 else if (
const auto *CD = dyn_cast<ObjCCategoryDecl>(D)) {
582 else if (
const auto *RD = dyn_cast<CXXRecordDecl>(D)) {
583 if (!(RD = RD->getDefinition()))
586 for (
const auto &I : RD->bases()) {
587 if (I.isVirtual() || (I.getAccessSpecifier() !=
AS_public))
601 for (
const auto &I : RD->vbases()) {
622 if (D != OriginalDecl && OriginalDecl)
630void ASTContext::CanonicalTemplateTemplateParm::Profile(
639 ID.AddInteger(Params->
size());
641 PEnd = Params->
end();
643 if (
const auto *TTP = dyn_cast<TemplateTypeParmDecl>(*P)) {
645 ID.AddBoolean(TTP->isParameterPack());
647 TTP->getNumExpansionParameters().toInternalRepresentation());
651 if (
const auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(*P)) {
653 ID.AddBoolean(NTTP->isParameterPack());
654 ID.AddPointer(
C.getUnconstrainedType(
C.getCanonicalType(NTTP->getType()))
656 if (NTTP->isExpandedParameterPack()) {
658 ID.AddInteger(NTTP->getNumExpansionTypes());
659 for (
unsigned I = 0, N = NTTP->getNumExpansionTypes(); I != N; ++I) {
660 QualType T = NTTP->getExpansionType(I);
661 ID.AddPointer(T.getCanonicalType().getAsOpaquePtr());
664 ID.AddBoolean(
false);
674TemplateTemplateParmDecl *
678 llvm::FoldingSetNodeID ID;
679 CanonicalTemplateTemplateParm::Profile(ID, *
this, TTP);
680 void *InsertPos =
nullptr;
681 CanonicalTemplateTemplateParm *Canonical
682 = CanonTemplateTemplateParms.FindNodeOrInsertPos(ID, InsertPos);
684 return Canonical->getParam();
689 CanonParams.reserve(Params->
size());
691 PEnd = Params->
end();
695 if (
const auto *TTP = dyn_cast<TemplateTypeParmDecl>(*P)) {
700 TTP->getNumExpansionParameters());
701 CanonParams.push_back(NewTTP);
702 }
else if (
const auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(*P)) {
706 if (NTTP->isExpandedParameterPack()) {
709 for (
unsigned I = 0, N = NTTP->getNumExpansionTypes(); I != N; ++I) {
711 ExpandedTInfos.push_back(
719 NTTP->getPosition(),
nullptr,
729 NTTP->getPosition(),
nullptr,
731 NTTP->isParameterPack(),
734 CanonParams.push_back(Param);
750 Canonical = CanonTemplateTemplateParms.FindNodeOrInsertPos(ID, InsertPos);
751 assert(!Canonical &&
"Shouldn't be in the map!");
755 Canonical =
new (*this) CanonicalTemplateTemplateParm(CanonTTP);
756 CanonTemplateTemplateParms.InsertNode(Canonical, InsertPos);
763 llvm::FoldingSetNodeID ID;
764 CanonicalTemplateTemplateParm::Profile(ID, *
this, TTP);
765 void *InsertPos =
nullptr;
766 CanonicalTemplateTemplateParm *Canonical =
767 CanonTemplateTemplateParms.FindNodeOrInsertPos(ID, InsertPos);
768 return Canonical ? Canonical->getParam() :
nullptr;
774 llvm::FoldingSetNodeID ID;
775 CanonicalTemplateTemplateParm::Profile(ID, *
this, CanonTTP);
776 void *InsertPos =
nullptr;
778 CanonTemplateTemplateParms.FindNodeOrInsertPos(ID, InsertPos))
779 return Existing->getParam();
780 CanonTemplateTemplateParms.InsertNode(
781 new (*
this) CanonicalTemplateTemplateParm(CanonTTP), InsertPos);
802 [](
const DynTypedNode &P) { return P.get<WhileStmt>() != nullptr; });
826 return NoSanitizeL->containsType(Mask, TyName);
835 if (!LangOpts.CPlusPlus)
return nullptr;
838 case TargetCXXABI::AppleARM64:
839 case TargetCXXABI::Fuchsia:
840 case TargetCXXABI::GenericARM:
841 case TargetCXXABI::iOS:
842 case TargetCXXABI::WatchOS:
843 case TargetCXXABI::GenericAArch64:
844 case TargetCXXABI::GenericMIPS:
845 case TargetCXXABI::GenericItanium:
846 case TargetCXXABI::WebAssembly:
847 case TargetCXXABI::XL:
849 case TargetCXXABI::Microsoft:
852 llvm_unreachable(
"Invalid CXXABI type!");
856 if (!InterpContext) {
859 return *InterpContext;
865 return *ParentMapCtx;
870 switch (LangOpts.getAddressSpaceMapMangling()) {
878 llvm_unreachable(
"getAddressSpaceMapMangling() doesn't cover anything.");
884 : ConstantArrayTypes(this_(), ConstantArrayTypesLog2InitSize),
885 DependentSizedArrayTypes(this_()), DependentSizedExtVectorTypes(this_()),
886 DependentAddressSpaceTypes(this_()), DependentVectorTypes(this_()),
887 DependentSizedMatrixTypes(this_()),
888 FunctionProtoTypes(this_(), FunctionProtoTypesLog2InitSize),
889 DependentTypeOfExprTypes(this_()), DependentDecltypeTypes(this_()),
890 DependentPackIndexingTypes(this_()), TemplateSpecializationTypes(this_()),
891 DependentBitIntTypes(this_()), SubstTemplateTemplateParmPacks(this_()),
892 DeducedTemplates(this_()), ArrayParameterTypes(this_()),
893 CanonTemplateTemplateParms(this_()), SourceMgr(
SM), LangOpts(LOpts),
896 LangOpts.XRayNeverInstrumentFiles,
897 LangOpts.XRayAttrListFiles,
SM)),
901 Comments(
SM), CommentCommandTraits(BumpAlloc, LOpts.CommentOpts),
909 ReleaseDeclContextMaps();
912 for (
auto &Pair : Deallocations)
913 (Pair.first)(Pair.second);
914 Deallocations.clear();
920 I = ObjCLayouts.begin(),
921 E = ObjCLayouts.end();
928 for (llvm::DenseMap<const RecordDecl*, const ASTRecordLayout*>::iterator
929 I = ASTRecordLayouts.begin(), E = ASTRecordLayouts.end(); I != E; ) {
934 ASTRecordLayouts.clear();
936 for (llvm::DenseMap<const Decl*, AttrVec*>::iterator A = DeclAttrs.begin(),
937 AEnd = DeclAttrs.end();
939 A->second->~AttrVec();
942 for (
const auto &
Value : ModuleInitializers)
943 Value.second->~PerModuleInitializers();
944 ModuleInitializers.
clear();
953 TraversalScope = TopLevelDecls;
958 Deallocations.push_back({Callback,
Data});
967 llvm::errs() <<
"\n*** AST Context Stats:\n";
968 llvm::errs() <<
" " << Types.size() <<
" types total.\n";
970 unsigned counts[] = {
971#define TYPE(Name, Parent) 0,
972#define ABSTRACT_TYPE(Name, Parent)
973#include "clang/AST/TypeNodes.inc"
977 for (
unsigned i = 0, e = Types.size(); i != e; ++i) {
979 counts[(
unsigned)T->getTypeClass()]++;
983 unsigned TotalBytes = 0;
984#define TYPE(Name, Parent) \
986 llvm::errs() << " " << counts[Idx] << " " << #Name \
987 << " types, " << sizeof(Name##Type) << " each " \
988 << "(" << counts[Idx] * sizeof(Name##Type) \
990 TotalBytes += counts[Idx] * sizeof(Name##Type); \
992#define ABSTRACT_TYPE(Name, Parent)
993#include "clang/AST/TypeNodes.inc"
995 llvm::errs() <<
"Total bytes = " << TotalBytes <<
"\n";
1000 <<
" implicit default constructors created\n";
1003 <<
" implicit copy constructors created\n";
1007 <<
" implicit move constructors created\n";
1010 <<
" implicit copy assignment operators created\n";
1014 <<
" implicit move assignment operators created\n";
1017 <<
" implicit destructors created\n";
1020 llvm::errs() <<
"\n";
1024 BumpAlloc.PrintStats();
1028 bool NotifyListeners) {
1029 if (NotifyListeners)
1032 Listener->RedefinedHiddenDefinition(ND, M);
1039 if (It == MergedDefModules.end())
1042 auto &Merged = It->second;
1043 llvm::DenseSet<Module*>
Found;
1044 for (
Module *&M : Merged)
1045 if (!
Found.insert(M).second)
1047 llvm::erase(Merged,
nullptr);
1054 if (MergedIt == MergedDefModules.end())
1056 return MergedIt->second;
1059void ASTContext::PerModuleInitializers::resolve(
ASTContext &Ctx) {
1060 if (LazyInitializers.empty())
1064 assert(Source &&
"lazy initializers but no external source");
1066 auto LazyInits = std::move(LazyInitializers);
1067 LazyInitializers.clear();
1069 for (
auto ID : LazyInits)
1070 Initializers.push_back(Source->GetExternalDecl(ID));
1072 assert(LazyInitializers.empty() &&
1073 "GetExternalDecl for lazy module initializer added more inits");
1079 if (
const auto *ID = dyn_cast<ImportDecl>(D)) {
1080 auto It = ModuleInitializers.find(ID->getImportedModule());
1083 if (It == ModuleInitializers.end())
1087 auto &Imported = *It->second;
1088 if (Imported.Initializers.size() + Imported.LazyInitializers.size() == 1) {
1089 Imported.resolve(*
this);
1090 auto *OnlyDecl = Imported.Initializers.front();
1096 auto *&
Inits = ModuleInitializers[M];
1098 Inits =
new (*this) PerModuleInitializers;
1099 Inits->Initializers.push_back(D);
1104 auto *&
Inits = ModuleInitializers[M];
1106 Inits =
new (*this) PerModuleInitializers;
1107 Inits->LazyInitializers.insert(
Inits->LazyInitializers.end(),
1108 IDs.begin(), IDs.end());
1112 auto It = ModuleInitializers.find(M);
1113 if (It == ModuleInitializers.end())
1116 auto *
Inits = It->second;
1117 Inits->resolve(*
this);
1118 return Inits->Initializers;
1123 assert(!CurrentCXXNamedModule &&
1124 "We should set named module for ASTContext for only once");
1125 CurrentCXXNamedModule = M;
1137 auto GetRepresentativeModule = [
this](
const Module *M) {
1138 auto Iter = SameModuleLookupSet.find(M);
1139 if (Iter != SameModuleLookupSet.end())
1140 return Iter->second;
1142 const Module *RepresentativeModule =
1143 PrimaryModuleNameMap.try_emplace(M->getPrimaryModuleInterfaceName(), M)
1145 SameModuleLookupSet[M] = RepresentativeModule;
1146 return RepresentativeModule;
1149 assert(M1 &&
"Shouldn't call `isInSameModule` if both M1 and M2 are none.");
1150 return GetRepresentativeModule(M1) == GetRepresentativeModule(M2);
1154 if (!ExternCContext)
1157 return ExternCContext;
1171#define BuiltinTemplate(BTName) \
1172 BuiltinTemplateDecl *ASTContext::get##BTName##Decl() const { \
1173 if (!Decl##BTName) \
1175 buildBuiltinTemplateDecl(BTK##BTName, get##BTName##Name()); \
1176 return Decl##BTName; \
1178#include "clang/Basic/BuiltinTemplates.inc"
1191 NewDecl->
addAttr(TypeVisibilityAttr::CreateImplicit(
1192 const_cast<ASTContext &
>(*
this), TypeVisibilityAttr::Default));
1197 StringRef Name)
const {
1221 Types.push_back(Ty);
1226 assert((!this->Target || this->Target == &Target) &&
1227 "Incorrect target reinitialization");
1228 assert(
VoidTy.isNull() &&
"Context reinitialized?");
1230 this->Target = &Target;
1231 this->AuxTarget = AuxTarget;
1233 ABI.reset(createCXXABI(Target));
1237 InitBuiltinType(
VoidTy, BuiltinType::Void);
1240 InitBuiltinType(
BoolTy, BuiltinType::Bool);
1242 if (LangOpts.CharIsSigned)
1243 InitBuiltinType(
CharTy, BuiltinType::Char_S);
1245 InitBuiltinType(
CharTy, BuiltinType::Char_U);
1248 InitBuiltinType(
ShortTy, BuiltinType::Short);
1249 InitBuiltinType(
IntTy, BuiltinType::Int);
1250 InitBuiltinType(
LongTy, BuiltinType::Long);
1251 InitBuiltinType(
LongLongTy, BuiltinType::LongLong);
1261 InitBuiltinType(
FloatTy, BuiltinType::Float);
1262 InitBuiltinType(
DoubleTy, BuiltinType::Double);
1263 InitBuiltinType(
LongDoubleTy, BuiltinType::LongDouble);
1266 InitBuiltinType(
Float128Ty, BuiltinType::Float128);
1269 InitBuiltinType(
Ibm128Ty, BuiltinType::Ibm128);
1272 InitBuiltinType(
Float16Ty, BuiltinType::Float16);
1275 InitBuiltinType(
ShortAccumTy, BuiltinType::ShortAccum);
1276 InitBuiltinType(
AccumTy, BuiltinType::Accum);
1277 InitBuiltinType(
LongAccumTy, BuiltinType::LongAccum);
1281 InitBuiltinType(
ShortFractTy, BuiltinType::ShortFract);
1282 InitBuiltinType(
FractTy, BuiltinType::Fract);
1283 InitBuiltinType(
LongFractTy, BuiltinType::LongFract);
1288 InitBuiltinType(
SatAccumTy, BuiltinType::SatAccum);
1294 InitBuiltinType(
SatFractTy, BuiltinType::SatFract);
1301 InitBuiltinType(
Int128Ty, BuiltinType::Int128);
1306 InitBuiltinType(
WCharTy, BuiltinType::WChar_S);
1308 InitBuiltinType(
WCharTy, BuiltinType::WChar_U);
1309 if (LangOpts.CPlusPlus && LangOpts.WChar)
1313 WideCharTy = getFromTargetType(Target.getWCharType());
1316 WIntTy = getFromTargetType(Target.getWIntType());
1319 InitBuiltinType(
Char8Ty, BuiltinType::Char8);
1321 if (LangOpts.CPlusPlus)
1322 InitBuiltinType(
Char16Ty, BuiltinType::Char16);
1324 Char16Ty = getFromTargetType(Target.getChar16Type());
1326 if (LangOpts.CPlusPlus)
1327 InitBuiltinType(
Char32Ty, BuiltinType::Char32);
1329 Char32Ty = getFromTargetType(Target.getChar32Type());
1336 InitBuiltinType(
DependentTy, BuiltinType::Dependent);
1339 InitBuiltinType(
OverloadTy, BuiltinType::Overload);
1351 InitBuiltinType(
UnknownAnyTy, BuiltinType::UnknownAny);
1357 InitBuiltinType(
BuiltinFnTy, BuiltinType::BuiltinFn);
1360 if (LangOpts.OpenMP) {
1367 if (LangOpts.OpenACC && !LangOpts.OpenMP) {
1370 if (LangOpts.MatrixTypes)
1378 if (LangOpts.OpenCL) {
1379#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
1380 InitBuiltinType(SingletonId, BuiltinType::Id);
1381#include "clang/Basic/OpenCLImageTypes.def"
1383 InitBuiltinType(
OCLSamplerTy, BuiltinType::OCLSampler);
1384 InitBuiltinType(
OCLEventTy, BuiltinType::OCLEvent);
1386 InitBuiltinType(
OCLQueueTy, BuiltinType::OCLQueue);
1389#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
1390 InitBuiltinType(Id##Ty, BuiltinType::Id);
1391#include "clang/Basic/OpenCLExtensionTypes.def"
1394 if (LangOpts.HLSL) {
1395#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) \
1396 InitBuiltinType(SingletonId, BuiltinType::Id);
1397#include "clang/Basic/HLSLIntangibleTypes.def"
1400 if (Target.hasAArch64ACLETypes() ||
1401 (AuxTarget && AuxTarget->hasAArch64ACLETypes())) {
1402#define SVE_TYPE(Name, Id, SingletonId) \
1403 InitBuiltinType(SingletonId, BuiltinType::Id);
1404#include "clang/Basic/AArch64ACLETypes.def"
1407 if (Target.getTriple().isPPC64()) {
1408#define PPC_VECTOR_MMA_TYPE(Name, Id, Size) \
1409 InitBuiltinType(Id##Ty, BuiltinType::Id);
1410#include "clang/Basic/PPCTypes.def"
1411#define PPC_VECTOR_VSX_TYPE(Name, Id, Size) \
1412 InitBuiltinType(Id##Ty, BuiltinType::Id);
1413#include "clang/Basic/PPCTypes.def"
1416 if (Target.hasRISCVVTypes()) {
1417#define RVV_TYPE(Name, Id, SingletonId) \
1418 InitBuiltinType(SingletonId, BuiltinType::Id);
1419#include "clang/Basic/RISCVVTypes.def"
1422 if (Target.getTriple().isWasm() && Target.hasFeature(
"reference-types")) {
1423#define WASM_TYPE(Name, Id, SingletonId) \
1424 InitBuiltinType(SingletonId, BuiltinType::Id);
1425#include "clang/Basic/WebAssemblyReferenceTypes.def"
1428 if (Target.getTriple().isAMDGPU() ||
1429 (AuxTarget && AuxTarget->getTriple().isAMDGPU())) {
1430#define AMDGPU_TYPE(Name, Id, SingletonId, Width, Align) \
1431 InitBuiltinType(SingletonId, BuiltinType::Id);
1432#include "clang/Basic/AMDGPUTypes.def"
1439 ObjCConstantStringType =
QualType();
1444 if (LangOpts.OpenCLGenericAddressSpace) {
1445 auto Q =
VoidTy.getQualifiers();
1454 InitBuiltinType(
NullPtrTy, BuiltinType::NullPtr);
1457 InitBuiltinType(
HalfTy, BuiltinType::Half);
1459 InitBuiltinType(
BFloat16Ty, BuiltinType::BFloat16);
1465 if (LangOpts.MicrosoftExt || LangOpts.Borland) {
1472 return SourceMgr.getDiagnostics();
1487 llvm::DenseMap<const Decl*, AttrVec*>::iterator Pos = DeclAttrs.find(D);
1488 if (Pos != DeclAttrs.end()) {
1489 Pos->second->~AttrVec();
1490 DeclAttrs.erase(Pos);
1504 llvm::DenseMap<const VarDecl *, TemplateOrSpecializationInfo>::iterator Pos =
1505 TemplateOrInstantiation.find(Var);
1506 if (Pos == TemplateOrInstantiation.end())
1519 Tmpl, TSK, PointOfInstantiation));
1525 assert(!TemplateOrInstantiation[Inst] &&
1526 "Already noted what the variable was instantiated from");
1527 TemplateOrInstantiation[Inst] = TSI;
1532 return InstantiatedFromUsingDecl.lookup(UUD);
1540 "pattern decl is not a using decl");
1544 "instantiation did not produce a using decl");
1545 assert(!InstantiatedFromUsingDecl[Inst] &&
"pattern already exists");
1546 InstantiatedFromUsingDecl[Inst] = Pattern;
1551 return InstantiatedFromUsingEnumDecl.lookup(UUD);
1556 assert(!InstantiatedFromUsingEnumDecl[Inst] &&
"pattern already exists");
1557 InstantiatedFromUsingEnumDecl[Inst] = Pattern;
1562 return InstantiatedFromUsingShadowDecl.lookup(Inst);
1568 assert(!InstantiatedFromUsingShadowDecl[Inst] &&
"pattern already exists");
1569 InstantiatedFromUsingShadowDecl[Inst] = Pattern;
1574 return InstantiatedFromUnnamedFieldDecl.lookup(Field);
1580 "Instantiated field decl is not unnamed");
1582 "Template field decl is not unnamed");
1583 assert(!InstantiatedFromUnnamedFieldDecl[Inst] &&
1584 "Already noted what unnamed field was instantiated from");
1586 InstantiatedFromUnnamedFieldDecl[Inst] = Tmpl;
1602 return Range.end() - Range.begin();
1607 llvm::DenseMap<const CXXMethodDecl *, CXXMethodVector>::const_iterator Pos =
1608 OverriddenMethods.find(
Method->getCanonicalDecl());
1609 if (Pos == OverriddenMethods.end())
1617 OverriddenMethods[
Method].push_back(Overridden);
1625 if (
const auto *CXXMethod = dyn_cast<CXXMethodDecl>(D)) {
1631 const auto *
Method = dyn_cast<ObjCMethodDecl>(D);
1636 Method->getOverriddenMethods(OverDecls);
1637 Overridden.append(OverDecls.begin(), OverDecls.end());
1640std::optional<ASTContext::CXXRecordDeclRelocationInfo>
1644 auto it = RelocatableClasses.find(D);
1645 if (it != RelocatableClasses.end())
1646 return it->getSecond();
1647 return std::nullopt;
1654 assert(RelocatableClasses.find(D) == RelocatableClasses.end());
1655 RelocatableClasses.insert({D, Info});
1660 if (!Class->isPolymorphic())
1662 const CXXRecordDecl *BaseType = Context.baseForVTableAuthentication(Class);
1663 using AuthAttr = VTablePointerAuthenticationAttr;
1664 const AuthAttr *ExplicitAuth = BaseType->
getAttr<AuthAttr>();
1666 return Context.getLangOpts().PointerAuthVTPtrAddressDiscrimination;
1667 AuthAttr::AddressDiscriminationMode AddressDiscrimination =
1668 ExplicitAuth->getAddressDiscrimination();
1669 if (AddressDiscrimination == AuthAttr::DefaultAddressDiscrimination)
1670 return Context.getLangOpts().PointerAuthVTPtrAddressDiscrimination;
1671 return AddressDiscrimination == AuthAttr::AddressDiscrimination;
1674ASTContext::PointerAuthContent
1675ASTContext::findPointerAuthContent(QualType T)
const {
1676 assert(isPointerAuthenticationAvailable());
1680 return PointerAuthContent::None;
1683 return PointerAuthContent::AddressDiscriminatedData;
1686 return PointerAuthContent::None;
1689 return PointerAuthContent::None;
1691 if (
auto Existing = RecordContainsAddressDiscriminatedPointerAuth.find(RD);
1692 Existing != RecordContainsAddressDiscriminatedPointerAuth.end())
1693 return Existing->second;
1695 PointerAuthContent
Result = PointerAuthContent::None;
1697 auto SaveResultAndReturn = [&]() -> PointerAuthContent {
1698 auto [ResultIter, DidAdd] =
1699 RecordContainsAddressDiscriminatedPointerAuth.try_emplace(RD,
Result);
1705 auto ShouldContinueAfterUpdate = [&](PointerAuthContent NewResult) {
1706 static_assert(PointerAuthContent::None <
1707 PointerAuthContent::AddressDiscriminatedVTable);
1708 static_assert(PointerAuthContent::AddressDiscriminatedVTable <
1709 PointerAuthContent::AddressDiscriminatedData);
1712 return Result != PointerAuthContent::AddressDiscriminatedData;
1714 if (
const CXXRecordDecl *CXXRD = dyn_cast<CXXRecordDecl>(RD)) {
1716 !ShouldContinueAfterUpdate(
1717 PointerAuthContent::AddressDiscriminatedVTable))
1718 return SaveResultAndReturn();
1719 for (
auto Base : CXXRD->bases()) {
1720 if (!ShouldContinueAfterUpdate(findPointerAuthContent(
Base.getType())))
1721 return SaveResultAndReturn();
1724 for (
auto *FieldDecl : RD->
fields()) {
1725 if (!ShouldContinueAfterUpdate(
1726 findPointerAuthContent(FieldDecl->getType())))
1727 return SaveResultAndReturn();
1729 return SaveResultAndReturn();
1733 assert(!Import->getNextLocalImport() &&
1734 "Import declaration already in the chain");
1735 assert(!Import->isFromASTFile() &&
"Non-local import declaration");
1736 if (!FirstLocalImport) {
1737 FirstLocalImport = Import;
1738 LastLocalImport = Import;
1742 LastLocalImport->setNextLocalImport(Import);
1743 LastLocalImport = Import;
1755 llvm_unreachable(
"Not a floating point type!");
1756 case BuiltinType::BFloat16:
1757 return Target->getBFloat16Format();
1758 case BuiltinType::Float16:
1759 return Target->getHalfFormat();
1760 case BuiltinType::Half:
1761 return Target->getHalfFormat();
1762 case BuiltinType::Float:
return Target->getFloatFormat();
1763 case BuiltinType::Double:
return Target->getDoubleFormat();
1764 case BuiltinType::Ibm128:
1765 return Target->getIbm128Format();
1766 case BuiltinType::LongDouble:
1768 return AuxTarget->getLongDoubleFormat();
1769 return Target->getLongDoubleFormat();
1770 case BuiltinType::Float128:
1772 return AuxTarget->getFloat128Format();
1773 return Target->getFloat128Format();
1778 unsigned Align = Target->getCharWidth();
1782 Align = AlignFromAttr;
1790 bool UseAlignAttrOnly;
1791 if (
const FieldDecl *FD = dyn_cast<FieldDecl>(D))
1793 FD->hasAttr<PackedAttr>() || FD->getParent()->hasAttr<PackedAttr>();
1795 UseAlignAttrOnly = AlignFromAttr != 0;
1798 if (UseAlignAttrOnly) {
1800 }
else if (
const auto *VD = dyn_cast<ValueDecl>(D)) {
1804 T = RT->getPointeeType();
1809 if (T->isFunctionType())
1810 Align = getTypeInfoImpl(T.getTypePtr()).Align;
1815 unsigned MinWidth = Target->getLargeArrayMinWidth();
1816 if (!ForAlignof && MinWidth) {
1818 Align = std::max(Align, Target->getLargeArrayAlign());
1821 Align = std::max(Align, Target->getLargeArrayAlign());
1826 Align = Target->getCharWidth();
1830 if (
const auto *VD = dyn_cast<VarDecl>(D))
1831 if (VD->hasGlobalStorage() && !ForAlignof) {
1842 if (
const auto *Field = dyn_cast<FieldDecl>(VD)) {
1856 uint64_t LowBitOfOffset = Offset & (~Offset + 1);
1857 if (LowBitOfOffset < FieldAlign)
1858 FieldAlign =
static_cast<unsigned>(LowBitOfOffset);
1861 Align = std::min(Align, FieldAlign);
1869 const auto *VD = dyn_cast<VarDecl>(D);
1870 if (MaxAlignedAttr && VD && VD->getStorageClass() ==
SC_Static)
1871 Align = std::min(Align, MaxAlignedAttr);
1891 if (
const auto *RD = T->getAsCXXRecordDecl(); RD && !RD->
isInvalidDecl()) {
1908 (uint64_t)(-1)/Size) &&
1909 "Overflow in array type char size evaluation");
1912 if (!Context.getTargetInfo().getCXXABI().isMicrosoft() ||
1914 Width = llvm::alignTo(Width, Align);
1921 if (
const auto *CAT = dyn_cast<ConstantArrayType>(T))
1939 switch (BT->getKind()) {
1940 case BuiltinType::Bool:
1941 case BuiltinType::Char_S:
1942 case BuiltinType::Char_U:
1943 case BuiltinType::SChar:
1944 case BuiltinType::UChar:
1945 case BuiltinType::Short:
1946 case BuiltinType::UShort:
1947 case BuiltinType::WChar_S:
1948 case BuiltinType::WChar_U:
1949 case BuiltinType::Char8:
1950 case BuiltinType::Char16:
1951 case BuiltinType::Char32:
1959 if (
const auto *ED = T->getAsEnumDecl()) {
1960 if (T->isDependentType() || ED->getPromotionType().isNull() ||
1968 if (
const auto *OBT = T->getAs<OverflowBehaviorType>()) {
1984 bool NeedsPreferredAlignment)
const {
1987 if (
unsigned Align = TT->getDecl()->getMaxAlignment())
1992 if (!T->isIncompleteType())
1998 if (
unsigned Align = TT->getDecl()->getMaxAlignment())
2002 if (
const auto *TD = T->getAsTagDecl())
2003 return TD->getMaxAlignment();
2009 TypeInfoMap::iterator I = MemoizedTypeInfo.find(T);
2010 if (I != MemoizedTypeInfo.end())
2015 MemoizedTypeInfo[T] = TI;
2025TypeInfo ASTContext::getTypeInfoImpl(
const Type *T)
const {
2030 switch (T->getTypeClass()) {
2031#define TYPE(Class, Base)
2032#define ABSTRACT_TYPE(Class, Base)
2033#define NON_CANONICAL_TYPE(Class, Base)
2034#define DEPENDENT_TYPE(Class, Base) case Type::Class:
2035#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base) \
2037 assert(!T->isDependentType() && "should not see dependent types here"); \
2038 return getTypeInfo(cast<Class##Type>(T)->desugar().getTypePtr());
2039#include "clang/AST/TypeNodes.inc"
2040 llvm_unreachable(
"Should not see dependent types");
2042 case Type::FunctionNoProto:
2043 case Type::FunctionProto:
2049 case Type::IncompleteArray:
2050 case Type::VariableArray:
2051 case Type::ConstantArray:
2052 case Type::ArrayParameter: {
2055 if (
const auto *CAT = dyn_cast<ConstantArrayType>(T))
2056 Size = CAT->getZExtSize();
2059 assert((Size == 0 || EltInfo.
Width <= (uint64_t)(-1) / Size) &&
2060 "Overflow in array type bit size evaluation");
2061 Width = EltInfo.
Width * Size;
2062 Align = EltInfo.
Align;
2066 Width = llvm::alignTo(Width, Align);
2070 case Type::ExtVector:
2071 case Type::Vector: {
2074 Width = VT->isPackedVectorBoolType(*
this)
2075 ? VT->getNumElements()
2076 : EltInfo.
Width * VT->getNumElements();
2078 Width = std::max<unsigned>(8, Width);
2079 Align = std::max<unsigned>(8, Width);
2083 if (Align & (Align-1)) {
2084 Align = llvm::bit_ceil(Align);
2085 Width = llvm::alignTo(Width, Align);
2088 uint64_t TargetVectorAlign = Target->getMaxVectorAlign();
2089 if (TargetVectorAlign && TargetVectorAlign < Align)
2090 Align = TargetVectorAlign;
2104 Align = std::min<unsigned>(64, Width);
2108 case Type::ConstantMatrix: {
2110 TypeInfo ElementInfo =
getTypeInfo(MT->getElementType());
2114 Width = ElementInfo.
Width * MT->getNumRows() * MT->getNumColumns();
2115 Align = ElementInfo.
Align;
2121 default: llvm_unreachable(
"Unknown builtin type!");
2122 case BuiltinType::Void:
2127 case BuiltinType::Bool:
2128 Width = Target->getBoolWidth();
2129 Align = Target->getBoolAlign();
2131 case BuiltinType::Char_S:
2132 case BuiltinType::Char_U:
2133 case BuiltinType::UChar:
2134 case BuiltinType::SChar:
2135 case BuiltinType::Char8:
2136 Width = Target->getCharWidth();
2137 Align = Target->getCharAlign();
2139 case BuiltinType::WChar_S:
2140 case BuiltinType::WChar_U:
2141 Width = Target->getWCharWidth();
2142 Align = Target->getWCharAlign();
2144 case BuiltinType::Char16:
2145 Width = Target->getChar16Width();
2146 Align = Target->getChar16Align();
2148 case BuiltinType::Char32:
2149 Width = Target->getChar32Width();
2150 Align = Target->getChar32Align();
2152 case BuiltinType::UShort:
2153 case BuiltinType::Short:
2154 Width = Target->getShortWidth();
2155 Align = Target->getShortAlign();
2157 case BuiltinType::UInt:
2158 case BuiltinType::Int:
2159 Width = Target->getIntWidth();
2160 Align = Target->getIntAlign();
2162 case BuiltinType::ULong:
2163 case BuiltinType::Long:
2164 Width = Target->getLongWidth();
2165 Align = Target->getLongAlign();
2167 case BuiltinType::ULongLong:
2168 case BuiltinType::LongLong:
2169 Width = Target->getLongLongWidth();
2170 Align = Target->getLongLongAlign();
2172 case BuiltinType::Int128:
2173 case BuiltinType::UInt128:
2175 Align = Target->getInt128Align();
2177 case BuiltinType::ShortAccum:
2178 case BuiltinType::UShortAccum:
2179 case BuiltinType::SatShortAccum:
2180 case BuiltinType::SatUShortAccum:
2181 Width = Target->getShortAccumWidth();
2182 Align = Target->getShortAccumAlign();
2184 case BuiltinType::Accum:
2185 case BuiltinType::UAccum:
2186 case BuiltinType::SatAccum:
2187 case BuiltinType::SatUAccum:
2188 Width = Target->getAccumWidth();
2189 Align = Target->getAccumAlign();
2191 case BuiltinType::LongAccum:
2192 case BuiltinType::ULongAccum:
2193 case BuiltinType::SatLongAccum:
2194 case BuiltinType::SatULongAccum:
2195 Width = Target->getLongAccumWidth();
2196 Align = Target->getLongAccumAlign();
2198 case BuiltinType::ShortFract:
2199 case BuiltinType::UShortFract:
2200 case BuiltinType::SatShortFract:
2201 case BuiltinType::SatUShortFract:
2202 Width = Target->getShortFractWidth();
2203 Align = Target->getShortFractAlign();
2205 case BuiltinType::Fract:
2206 case BuiltinType::UFract:
2207 case BuiltinType::SatFract:
2208 case BuiltinType::SatUFract:
2209 Width = Target->getFractWidth();
2210 Align = Target->getFractAlign();
2212 case BuiltinType::LongFract:
2213 case BuiltinType::ULongFract:
2214 case BuiltinType::SatLongFract:
2215 case BuiltinType::SatULongFract:
2216 Width = Target->getLongFractWidth();
2217 Align = Target->getLongFractAlign();
2219 case BuiltinType::BFloat16:
2220 if (Target->hasBFloat16Type()) {
2221 Width = Target->getBFloat16Width();
2222 Align = Target->getBFloat16Align();
2226 AuxTarget->hasBFloat16Type()) {
2227 Width = AuxTarget->getBFloat16Width();
2228 Align = AuxTarget->getBFloat16Align();
2231 case BuiltinType::Float16:
2232 case BuiltinType::Half:
2233 if (Target->hasFloat16Type() || !
getLangOpts().OpenMP ||
2235 Width = Target->getHalfWidth();
2236 Align = Target->getHalfAlign();
2239 "Expected OpenMP device compilation.");
2240 Width = AuxTarget->getHalfWidth();
2241 Align = AuxTarget->getHalfAlign();
2244 case BuiltinType::Float:
2245 Width = Target->getFloatWidth();
2246 Align = Target->getFloatAlign();
2248 case BuiltinType::Double:
2249 Width = Target->getDoubleWidth();
2250 Align = Target->getDoubleAlign();
2252 case BuiltinType::Ibm128:
2253 Width = Target->getIbm128Width();
2254 Align = Target->getIbm128Align();
2256 case BuiltinType::LongDouble:
2258 (Target->getLongDoubleWidth() != AuxTarget->getLongDoubleWidth() ||
2259 Target->getLongDoubleAlign() != AuxTarget->getLongDoubleAlign())) {
2260 Width = AuxTarget->getLongDoubleWidth();
2261 Align = AuxTarget->getLongDoubleAlign();
2263 Width = Target->getLongDoubleWidth();
2264 Align = Target->getLongDoubleAlign();
2267 case BuiltinType::Float128:
2268 if (Target->hasFloat128Type() || !
getLangOpts().OpenMP ||
2270 Width = Target->getFloat128Width();
2271 Align = Target->getFloat128Align();
2274 "Expected OpenMP device compilation.");
2275 Width = AuxTarget->getFloat128Width();
2276 Align = AuxTarget->getFloat128Align();
2279 case BuiltinType::NullPtr:
2284 case BuiltinType::ObjCId:
2285 case BuiltinType::ObjCClass:
2286 case BuiltinType::ObjCSel:
2290 case BuiltinType::OCLSampler:
2291 case BuiltinType::OCLEvent:
2292 case BuiltinType::OCLClkEvent:
2293 case BuiltinType::OCLQueue:
2294 case BuiltinType::OCLReserveID:
2295#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
2296 case BuiltinType::Id:
2297#include "clang/Basic/OpenCLImageTypes.def"
2298#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
2299 case BuiltinType::Id:
2300#include "clang/Basic/OpenCLExtensionTypes.def"
2302 Width = Target->getPointerWidth(AS);
2303 Align = Target->getPointerAlign(AS);
2313#define SVE_VECTOR_TYPE(Name, MangledName, Id, SingletonId) \
2314 case BuiltinType::Id: \
2318#define SVE_PREDICATE_TYPE(Name, MangledName, Id, SingletonId) \
2319 case BuiltinType::Id: \
2323#define SVE_OPAQUE_TYPE(Name, MangledName, Id, SingletonId) \
2324 case BuiltinType::Id: \
2328#define SVE_SCALAR_TYPE(Name, MangledName, Id, SingletonId, Bits) \
2329 case BuiltinType::Id: \
2333#include "clang/Basic/AArch64ACLETypes.def"
2334#define PPC_VECTOR_TYPE(Name, Id, Size) \
2335 case BuiltinType::Id: \
2339#include "clang/Basic/PPCTypes.def"
2340#define RVV_VECTOR_TYPE(Name, Id, SingletonId, ElKind, ElBits, NF, IsSigned, \
2342 case BuiltinType::Id: \
2346#define RVV_PREDICATE_TYPE(Name, Id, SingletonId, ElKind) \
2347 case BuiltinType::Id: \
2351#include "clang/Basic/RISCVVTypes.def"
2352#define WASM_TYPE(Name, Id, SingletonId) \
2353 case BuiltinType::Id: \
2357#include "clang/Basic/WebAssemblyReferenceTypes.def"
2358#define AMDGPU_TYPE(NAME, ID, SINGLETONID, WIDTH, ALIGN) \
2359 case BuiltinType::ID: \
2363#include "clang/Basic/AMDGPUTypes.def"
2364#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
2365#include "clang/Basic/HLSLIntangibleTypes.def"
2371 case Type::ObjCObjectPointer:
2375 case Type::BlockPointer:
2377 Width = Target->getPointerWidth(AS);
2378 Align = Target->getPointerAlign(AS);
2380 case Type::LValueReference:
2381 case Type::RValueReference:
2385 Width = Target->getPointerWidth(AS);
2386 Align = Target->getPointerAlign(AS);
2390 Width = Target->getPointerWidth(AS);
2391 Align = Target->getPointerAlign(AS);
2393 case Type::MemberPointer: {
2395 CXXABI::MemberPointerInfo MPI = ABI->getMemberPointerInfo(MPT);
2400 case Type::Complex: {
2404 Width = EltInfo.
Width * 2;
2405 Align = EltInfo.
Align;
2408 case Type::ObjCObject:
2410 case Type::Adjusted:
2413 case Type::ObjCInterface: {
2415 if (ObjCI->getDecl()->isInvalidDecl()) {
2425 case Type::BitInt: {
2427 Align = Target->getBitIntAlign(EIT->getNumBits());
2428 Width = Target->getBitIntWidth(EIT->getNumBits());
2434 const TagDecl *TD = TT->getDecl()->getDefinitionOrSelf();
2447 Info.
Align = AttrAlign;
2457 AlignRequirement = RD->
hasAttr<AlignedAttr>()
2463 case Type::SubstTemplateTypeParm:
2465 getReplacementType().getTypePtr());
2468 case Type::DeducedTemplateSpecialization: {
2470 assert(!A->getDeducedType().isNull() &&
2471 "cannot request the size of an undeduced or dependent auto type");
2472 return getTypeInfo(A->getDeducedType().getTypePtr());
2478 case Type::MacroQualified:
2482 case Type::ObjCTypeParam:
2488 case Type::Typedef: {
2490 TypeInfo Info =
getTypeInfo(TT->desugar().getTypePtr());
2494 if (
unsigned AttrAlign = TT->getDecl()->getMaxAlignment()) {
2505 case Type::Attributed:
2509 case Type::CountAttributed:
2512 case Type::BTFTagAttributed:
2516 case Type::OverflowBehavior:
2520 case Type::HLSLAttributedResource:
2524 case Type::HLSLInlineSpirv: {
2527 Width = ST->getSize() * 8;
2528 Align = ST->getAlignment();
2529 if (Width == 0 && Align == 0) {
2537 case Type::Atomic: {
2546 Width = Target->getCharWidth();
2548 }
else if (Width <= Target->getMaxAtomicPromoteWidth()) {
2554 Width = llvm::bit_ceil(Width);
2557 Align =
static_cast<unsigned>(Width);
2562 case Type::PredefinedSugar:
2571 assert(llvm::isPowerOf2_32(Align) &&
"Alignment must be power of 2");
2572 return TypeInfo(Width, Align, AlignRequirement);
2576 UnadjustedAlignMap::iterator I = MemoizedUnadjustedAlign.find(T);
2577 if (I != MemoizedUnadjustedAlign.end())
2580 unsigned UnadjustedAlign;
2581 if (
const auto *RT = T->getAsCanonical<RecordType>()) {
2588 UnadjustedAlign =
getTypeAlign(T->getUnqualifiedDesugaredType());
2591 MemoizedUnadjustedAlign[T] = UnadjustedAlign;
2592 return UnadjustedAlign;
2596 unsigned SimdAlign = llvm::OpenMPIRBuilder::getOpenMPDefaultSimdAlign(
2646 unsigned ABIAlign = TI.
Align;
2648 T = T->getBaseElementTypeUnsafe();
2651 if (T->isMemberPointerType())
2654 if (!Target->allowsLargerPreferedTypeAlignment())
2657 if (
const auto *RD = T->getAsRecordDecl()) {
2666 unsigned PreferredAlign =
static_cast<unsigned>(
2668 assert(PreferredAlign >= ABIAlign &&
2669 "PreferredAlign should be at least as large as ABIAlign.");
2670 return PreferredAlign;
2677 T = CT->getElementType().getTypePtr();
2678 if (
const auto *ED = T->getAsEnumDecl())
2679 T = ED->getIntegerType().getTypePtr();
2680 if (T->isSpecificBuiltinType(BuiltinType::Double) ||
2681 T->isSpecificBuiltinType(BuiltinType::LongLong) ||
2682 T->isSpecificBuiltinType(BuiltinType::ULongLong) ||
2683 (T->isSpecificBuiltinType(BuiltinType::LongDouble) &&
2684 Target->defaultsToAIXPowerAlignment()))
2688 return std::max(ABIAlign, (
unsigned)
getTypeSize(T));
2739 for (
unsigned I = 0, N = Path.size(); I != N; ++I) {
2743 std::swap(
Base, Derived);
2763 llvm::append_range(Ivars, OI->
ivars());
2766 for (
const ObjCIvarDecl *Iv = IDecl->all_declared_ivar_begin(); Iv;
2768 Ivars.push_back(Iv);
2776 if (
const auto *OI = dyn_cast<ObjCInterfaceDecl>(CDecl)) {
2779 for (
auto *Proto : OI->all_referenced_protocols()) {
2784 for (
const auto *Cat : OI->visible_categories())
2790 SD = SD->getSuperClass();
2792 }
else if (
const auto *OC = dyn_cast<ObjCCategoryDecl>(CDecl)) {
2793 for (
auto *Proto : OC->protocols()) {
2796 }
else if (
const auto *OP = dyn_cast<ObjCProtocolDecl>(CDecl)) {
2798 if (!Protocols.insert(
2802 for (
auto *Proto : OP->protocols())
2809 bool CheckIfTriviallyCopyable) {
2810 assert(RD->
isUnion() &&
"Must be union type");
2812 Context.getTypeSizeInChars(Context.getCanonicalTagType(RD));
2814 for (
const auto *Field : RD->
fields()) {
2815 if (!Context.hasUniqueObjectRepresentations(Field->getType(),
2816 CheckIfTriviallyCopyable))
2818 CharUnits FieldSize = Context.getTypeSizeInChars(Field->getType());
2819 if (FieldSize != UnionSize)
2828 return Context.getFieldOffset(Field);
2837static std::optional<int64_t>
2839 const RecordDecl *RD,
2840 bool CheckIfTriviallyCopyable);
2842static std::optional<int64_t>
2844 bool CheckIfTriviallyCopyable) {
2845 if (
const auto *RD = Field->getType()->getAsRecordDecl();
2848 CheckIfTriviallyCopyable);
2852 bool IsBitIntType = Field->getType()->isBitIntType();
2853 if (!Field->getType()->isReferenceType() && !IsBitIntType &&
2854 !Context.hasUniqueObjectRepresentations(Field->getType(),
2855 CheckIfTriviallyCopyable))
2856 return std::nullopt;
2858 int64_t FieldSizeInBits =
2859 Context.toBits(Context.getTypeSizeInChars(Field->getType()));
2860 if (Field->isBitField()) {
2863 if (Field->isUnnamedBitField())
2866 int64_t BitfieldSize = Field->getBitWidthValue();
2868 if ((
unsigned)BitfieldSize >
2870 return std::nullopt;
2871 }
else if (BitfieldSize > FieldSizeInBits) {
2872 return std::nullopt;
2874 FieldSizeInBits = BitfieldSize;
2875 }
else if (IsBitIntType && !Context.hasUniqueObjectRepresentations(
2876 Field->getType(), CheckIfTriviallyCopyable)) {
2877 return std::nullopt;
2879 return FieldSizeInBits;
2882static std::optional<int64_t>
2884 bool CheckIfTriviallyCopyable) {
2886 CheckIfTriviallyCopyable);
2889template <
typename RangeT>
2891 const RangeT &Subobjects, int64_t CurOffsetInBits,
2893 bool CheckIfTriviallyCopyable) {
2894 for (
const auto *Subobject : Subobjects) {
2895 std::optional<int64_t> SizeInBits =
2898 return std::nullopt;
2899 if (*SizeInBits != 0) {
2901 if (Offset != CurOffsetInBits)
2902 return std::nullopt;
2903 CurOffsetInBits += *SizeInBits;
2906 return CurOffsetInBits;
2909static std::optional<int64_t>
2912 bool CheckIfTriviallyCopyable) {
2913 assert(!RD->
isUnion() &&
"Must be struct/class type");
2914 const auto &Layout = Context.getASTRecordLayout(RD);
2916 int64_t CurOffsetInBits = 0;
2917 if (
const auto *ClassDecl = dyn_cast<CXXRecordDecl>(RD)) {
2918 if (ClassDecl->isDynamicClass())
2919 return std::nullopt;
2922 for (
const auto &
Base : ClassDecl->bases()) {
2925 Bases.emplace_back(
Base.getType()->getAsCXXRecordDecl());
2929 return Layout.getBaseClassOffset(L) < Layout.getBaseClassOffset(R);
2932 std::optional<int64_t> OffsetAfterBases =
2934 Bases, CurOffsetInBits, Context, Layout, CheckIfTriviallyCopyable);
2935 if (!OffsetAfterBases)
2936 return std::nullopt;
2937 CurOffsetInBits = *OffsetAfterBases;
2940 std::optional<int64_t> OffsetAfterFields =
2942 RD->
fields(), CurOffsetInBits, Context, Layout,
2943 CheckIfTriviallyCopyable);
2944 if (!OffsetAfterFields)
2945 return std::nullopt;
2946 CurOffsetInBits = *OffsetAfterFields;
2948 return CurOffsetInBits;
2952 QualType Ty,
bool CheckIfTriviallyCopyable)
const {
2969 assert(!Ty.
isNull() &&
"Null QualType sent to unique object rep check");
2974 CheckIfTriviallyCopyable);
2977 "hasUniqueObjectRepresentations should not be called with an "
3001 return !ABI->getMemberPointerInfo(MPT).HasPadding;
3004 if (
Record->isInvalidDecl())
3009 CheckIfTriviallyCopyable);
3012 *
this,
Record, CheckIfTriviallyCopyable);
3014 return StructSize && *StructSize ==
static_cast<int64_t
>(
getTypeSize(Ty));
3035 count += Ext->ivar_size();
3040 count += ImplDecl->ivar_size();
3066 llvm::DenseMap<ObjCContainerDecl*, ObjCImplDecl*>::iterator
3067 I = ObjCImpls.find(D);
3068 if (I != ObjCImpls.end())
3076 llvm::DenseMap<ObjCContainerDecl*, ObjCImplDecl*>::iterator
3077 I = ObjCImpls.find(D);
3078 if (I != ObjCImpls.end())
3086 assert(IFaceD && ImplD &&
"Passed null params");
3087 ObjCImpls[IFaceD] = ImplD;
3093 assert(CatD && ImplD &&
"Passed null params");
3094 ObjCImpls[CatD] = ImplD;
3099 return ObjCMethodRedecls.
lookup(MD);
3105 ObjCMethodRedecls[MD] = Redecl;
3110 if (
const auto *ID = dyn_cast<ObjCInterfaceDecl>(ND->
getDeclContext()))
3112 if (
const auto *CD = dyn_cast<ObjCCategoryDecl>(ND->
getDeclContext()))
3113 return CD->getClassInterface();
3114 if (
const auto *IMD = dyn_cast<ObjCImplDecl>(ND->
getDeclContext()))
3115 return IMD->getClassInterface();
3123 assert(VD &&
"Passed null params");
3124 assert(VD->
hasAttr<BlocksAttr>() &&
3125 "getBlockVarCopyInits - not __block var");
3126 auto I = BlockVarCopyInits.find(VD);
3127 if (I != BlockVarCopyInits.end())
3129 return {
nullptr,
false};
3135 assert(VD && CopyExpr &&
"Passed null params");
3136 assert(VD->
hasAttr<BlocksAttr>() &&
3137 "setBlockVarCopyInits - not __block var");
3138 BlockVarCopyInits[VD].setExprAndFlag(CopyExpr,
CanThrow);
3142 unsigned DataSize)
const {
3147 "incorrect data size provided to CreateTypeSourceInfo!");
3164 return getObjCLayout(D);
3169 bool &AnyNonCanonArgs) {
3171 AnyNonCanonArgs |=
C.canonicalizeTemplateArguments(CanonArgs);
3177 bool AnyNonCanonArgs =
false;
3178 for (
auto &Arg : Args) {
3181 AnyNonCanonArgs |= !Arg.structurallyEquals(OrigArg);
3183 return AnyNonCanonArgs;
3191ASTContext::getExtQualType(
const Type *baseType,
Qualifiers quals)
const {
3196 llvm::FoldingSetNodeID ID;
3198 void *insertPos =
nullptr;
3199 if (
ExtQuals *eq = ExtQualNodes.FindNodeOrInsertPos(ID, insertPos)) {
3200 assert(eq->getQualifiers() == quals);
3209 canon = getExtQualType(canonSplit.
Ty, canonSplit.
Quals);
3212 (void) ExtQualNodes.FindNodeOrInsertPos(ID, insertPos);
3215 auto *eq =
new (*
this,
alignof(ExtQuals)) ExtQuals(baseType, canon, quals);
3216 ExtQualNodes.InsertNode(eq, insertPos);
3217 return QualType(eq, fastQuals);
3221 LangAS AddressSpace)
const {
3234 "Type cannot be in multiple addr spaces!");
3237 return getExtQualType(TypeNode, Quals);
3243 if (!T.hasAddressSpace())
3247 const Type *TypeNode;
3250 if (T.getTypePtr()->isArrayType()) {
3252 TypeNode = T.getTypePtr();
3256 while (T.hasAddressSpace()) {
3257 TypeNode = Quals.
strip(T);
3261 if (!
QualType(TypeNode, 0).hasAddressSpace())
3265 T = T.getSingleStepDesugaredType(*
this);
3275 return getExtQualType(TypeNode, Quals);
3283 "Attempted to get vtable pointer discriminator on a monomorphic type");
3286 llvm::raw_svector_ostream Out(Str);
3287 MC->mangleCXXVTable(RD, Out);
3288 return llvm::getPointerAuthStableSipHash(Str);
3314 switch (T->getTypeClass()) {
3319 case Type::LValueReference:
3324 case Type::RValueReference:
3338 case Type::ObjCObjectPointer:
3339 case Type::BlockPointer:
3348 case Type::VariableArray:
3349 case Type::ConstantArray:
3350 case Type::IncompleteArray:
3351 case Type::ArrayParameter:
3364 case Type::ObjCInterface:
3365 case Type::ObjCObject:
3366 OS <<
"<objc_object>";
3377 Ctx, OS, UnderlyingType.
isNull() ? Ctx.
IntTy : UnderlyingType);
3380 case Type::FunctionNoProto:
3381 case Type::FunctionProto: {
3397 if (
const auto *FPT = dyn_cast<FunctionProtoType>(FuncType)) {
3398 for (
QualType Param : FPT->param_types()) {
3402 if (FPT->isVariadic())
3409 case Type::MemberPointer: {
3413 Ctx, OS,
QualType(MPT->getQualifier().getAsType(), 0));
3417 case Type::ExtVector:
3425 case Type::ConstantMatrix:
3429 case Type::Builtin: {
3431 switch (BTy->getKind()) {
3432#define SIGNED_TYPE(Id, SingletonId) \
3433 case BuiltinType::Id: \
3436#define UNSIGNED_TYPE(Id, SingletonId) \
3437 case BuiltinType::Id: \
3440#define PLACEHOLDER_TYPE(Id, SingletonId) case BuiltinType::Id:
3441#define BUILTIN_TYPE(Id, SingletonId)
3442#include "clang/AST/BuiltinTypes.def"
3443 llvm_unreachable(
"placeholder types should not appear here.");
3445 case BuiltinType::Half:
3448 case BuiltinType::Float:
3451 case BuiltinType::Double:
3454 case BuiltinType::LongDouble:
3457 case BuiltinType::Float16:
3460 case BuiltinType::Float128:
3464 case BuiltinType::Void:
3468 case BuiltinType::ObjCId:
3469 case BuiltinType::ObjCClass:
3470 case BuiltinType::ObjCSel:
3471 case BuiltinType::NullPtr:
3476 case BuiltinType::OCLSampler:
3477 case BuiltinType::OCLEvent:
3478 case BuiltinType::OCLClkEvent:
3479 case BuiltinType::OCLQueue:
3480 case BuiltinType::OCLReserveID:
3481 case BuiltinType::BFloat16:
3482 case BuiltinType::VectorQuad:
3483 case BuiltinType::VectorPair:
3484 case BuiltinType::DMR1024:
3485 case BuiltinType::DMR2048:
3490 case BuiltinType::Ibm128:
3492#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
3493 case BuiltinType::Id: \
3495#include "clang/Basic/OpenCLImageTypes.def"
3496#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
3497 case BuiltinType::Id: \
3499#include "clang/Basic/OpenCLExtensionTypes.def"
3500#define SVE_TYPE(Name, Id, SingletonId) \
3501 case BuiltinType::Id: \
3503#include "clang/Basic/AArch64ACLETypes.def"
3504#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) \
3505 case BuiltinType::Id: \
3507#include "clang/Basic/HLSLIntangibleTypes.def"
3508 case BuiltinType::Dependent:
3509 llvm_unreachable(
"should never get here");
3510#define AMDGPU_TYPE(Name, Id, SingletonId, Width, Align) case BuiltinType::Id:
3511#include "clang/Basic/AMDGPUTypes.def"
3512 case BuiltinType::WasmExternRef:
3513#define RVV_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
3514#include "clang/Basic/RISCVVTypes.def"
3515 llvm_unreachable(
"not yet implemented");
3517 llvm_unreachable(
"should never get here");
3519 case Type::Record: {
3520 const RecordDecl *RD = T->castAsCanonical<RecordType>()->getDecl();
3540 II = Typedef->getDeclName().getAsIdentifierInfo();
3543 OS <<
"<anonymous_record>";
3549 case Type::HLSLAttributedResource:
3550 case Type::HLSLInlineSpirv:
3551 llvm_unreachable(
"should never get here");
3553 case Type::OverflowBehavior:
3554 llvm_unreachable(
"should never get here");
3556 case Type::DeducedTemplateSpecialization:
3558#define NON_CANONICAL_TYPE(Class, Base) case Type::Class:
3559#define DEPENDENT_TYPE(Class, Base) case Type::Class:
3560#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base) case Type::Class:
3561#define ABSTRACT_TYPE(Class, Base)
3562#define TYPE(Class, Base)
3563#include "clang/AST/TypeNodes.inc"
3564 llvm_unreachable(
"unexpected non-canonical or dependent type!");
3570 assert(!T->isDependentType() &&
3571 "cannot compute type discriminator of a dependent type");
3573 llvm::raw_svector_ostream Out(Str);
3575 if (T->isFunctionPointerType() || T->isFunctionReferenceType())
3576 T = T->getPointeeType();
3578 if (T->isFunctionType()) {
3581 T = T.getUnqualifiedType();
3602 if (MPT->isMemberFunctionPointer()) {
3608 MPT->getMostRecentCXXRecordDecl());
3612 MC->mangleCanonicalTypeName(T, Out);
3615 return llvm::getPointerAuthStableSipHash(Str);
3640 "Type cannot have multiple ObjCGCs!");
3643 return getExtQualType(TypeNode, Quals);
3657 QualType WrappedTy,
Expr *CountExpr,
bool CountInBytes,
bool OrNull,
3661 llvm::FoldingSetNodeID ID;
3664 void *InsertPos =
nullptr;
3666 CountAttributedTypes.FindNodeOrInsertPos(ID, InsertPos);
3671 size_t Size = CountAttributedType::totalSizeToAlloc<TypeCoupledDeclRefInfo>(
3672 DependentDecls.size());
3675 OrNull, DependentDecls);
3676 Types.push_back(CATy);
3677 CountAttributedTypes.InsertNode(CATy, InsertPos);
3686 case Type::Attributed: {
3694 case Type::BTFTagAttributed: {
3695 const auto *BTFT = dyn_cast<BTFTagAttributedType>(Orig);
3700 case Type::OverflowBehavior: {
3701 const auto *OB = dyn_cast<OverflowBehaviorType>(Orig);
3703 adjustType(OB->getUnderlyingType(), Adjust));
3710 case Type::Adjusted: {
3716 case Type::MacroQualified: {
3719 MQT->getMacroIdentifier());
3723 return Adjust(Orig);
3729 if (T->getExtInfo() == Info)
3733 if (
const auto *FNPT = dyn_cast<FunctionNoProtoType>(T)) {
3753 FPT->getExtProtoInfo());
3768 L->DeducedReturnType(FD, ResultType);
3779 return getFunctionType(Proto->getReturnType(), Proto->getParamTypes(),
3780 Proto->getExtProtoInfo().withExceptionSpec(ESI));
3796 for (
unsigned i = 0, n = Args.size(); i != n; ++i)
3819 return getFunctionType(Proto->getReturnType(), Proto->param_types(), EPI);
3845 if (TSInfo->getType() != FD->
getType())
3853 "TypeLoc size mismatch from updating exception specification");
3854 TSInfo->overrideType(Updated);
3863 llvm::FoldingSetNodeID ID;
3866 void *InsertPos =
nullptr;
3867 if (
ComplexType *CT = ComplexTypes.FindNodeOrInsertPos(ID, InsertPos))
3873 if (!T.isCanonical()) {
3877 ComplexType *NewIP = ComplexTypes.FindNodeOrInsertPos(ID, InsertPos);
3878 assert(!NewIP &&
"Shouldn't be in the map!"); (void)NewIP;
3881 Types.push_back(
New);
3882 ComplexTypes.InsertNode(
New, InsertPos);
3891 llvm::FoldingSetNodeID ID;
3894 void *InsertPos =
nullptr;
3895 if (
PointerType *PT = PointerTypes.FindNodeOrInsertPos(ID, InsertPos))
3901 if (!T.isCanonical()) {
3905 PointerType *NewIP = PointerTypes.FindNodeOrInsertPos(ID, InsertPos);
3906 assert(!NewIP &&
"Shouldn't be in the map!"); (void)NewIP;
3909 Types.push_back(
New);
3910 PointerTypes.InsertNode(
New, InsertPos);
3915 llvm::FoldingSetNodeID ID;
3917 void *InsertPos =
nullptr;
3918 AdjustedType *AT = AdjustedTypes.FindNodeOrInsertPos(ID, InsertPos);
3925 AT = AdjustedTypes.FindNodeOrInsertPos(ID, InsertPos);
3926 assert(!AT &&
"Shouldn't be in the map!");
3930 Types.push_back(AT);
3931 AdjustedTypes.InsertNode(AT, InsertPos);
3936 llvm::FoldingSetNodeID ID;
3938 void *InsertPos =
nullptr;
3939 AdjustedType *AT = AdjustedTypes.FindNodeOrInsertPos(ID, InsertPos);
3946 AT = AdjustedTypes.FindNodeOrInsertPos(ID, InsertPos);
3947 assert(!AT &&
"Shouldn't be in the map!");
3950 Types.push_back(AT);
3951 AdjustedTypes.InsertNode(AT, InsertPos);
3956 assert((T->isArrayType() || T->isFunctionType()) &&
"T does not decay");
3965 if (T->isArrayType())
3972 if (T->isFunctionType())
3984 llvm::FoldingSetNodeID ID;
3985 ATy->Profile(ID, *
this, ATy->getElementType(), ATy->getZExtSize(),
3986 ATy->getSizeExpr(), ATy->getSizeModifier(),
3987 ATy->getIndexTypeQualifiers().getAsOpaqueValue());
3988 void *InsertPos =
nullptr;
3990 ArrayParameterTypes.FindNodeOrInsertPos(ID, InsertPos);
3999 AT = ArrayParameterTypes.FindNodeOrInsertPos(ID, InsertPos);
4000 assert(!AT &&
"Shouldn't be in the map!");
4005 Types.push_back(AT);
4006 ArrayParameterTypes.InsertNode(AT, InsertPos);
4013 assert(T->isFunctionType() &&
"block of function types only");
4016 llvm::FoldingSetNodeID ID;
4019 void *InsertPos =
nullptr;
4021 BlockPointerTypes.FindNodeOrInsertPos(ID, InsertPos))
4027 if (!T.isCanonical()) {
4032 BlockPointerTypes.FindNodeOrInsertPos(ID, InsertPos);
4033 assert(!NewIP &&
"Shouldn't be in the map!"); (void)NewIP;
4037 Types.push_back(
New);
4038 BlockPointerTypes.InsertNode(
New, InsertPos);
4046 assert((!T->isPlaceholderType() ||
4047 T->isSpecificPlaceholderType(BuiltinType::UnknownAny)) &&
4048 "Unresolved placeholder type");
4052 llvm::FoldingSetNodeID ID;
4055 void *InsertPos =
nullptr;
4057 LValueReferenceTypes.FindNodeOrInsertPos(ID, InsertPos))
4065 if (!SpelledAsLValue || InnerRef || !T.isCanonical()) {
4066 QualType PointeeType = (InnerRef ? InnerRef->getPointeeType() : T);
4071 LValueReferenceTypes.FindNodeOrInsertPos(ID, InsertPos);
4072 assert(!NewIP &&
"Shouldn't be in the map!"); (void)NewIP;
4077 Types.push_back(
New);
4078 LValueReferenceTypes.InsertNode(
New, InsertPos);
4086 assert((!T->isPlaceholderType() ||
4087 T->isSpecificPlaceholderType(BuiltinType::UnknownAny)) &&
4088 "Unresolved placeholder type");
4092 llvm::FoldingSetNodeID ID;
4095 void *InsertPos =
nullptr;
4097 RValueReferenceTypes.FindNodeOrInsertPos(ID, InsertPos))
4105 if (InnerRef || !T.isCanonical()) {
4106 QualType PointeeType = (InnerRef ? InnerRef->getPointeeType() : T);
4111 RValueReferenceTypes.FindNodeOrInsertPos(ID, InsertPos);
4112 assert(!NewIP &&
"Shouldn't be in the map!"); (void)NewIP;
4117 Types.push_back(
New);
4118 RValueReferenceTypes.InsertNode(
New, InsertPos);
4126 assert(Cls &&
"At least one of Qualifier or Cls must be provided");
4129 Cls = Qualifier.getAsRecordDecl();
4133 llvm::FoldingSetNodeID ID;
4136 void *InsertPos =
nullptr;
4138 MemberPointerTypes.FindNodeOrInsertPos(ID, InsertPos))
4143 return Qualifier.getCanonical();
4151 if (!T.isCanonical() || Qualifier != CanonicalQualifier) {
4157 MemberPointerTypes.FindNodeOrInsertPos(ID, InsertPos);
4158 assert(!NewIP &&
"Shouldn't be in the map!");
4162 Types.push_back(
New);
4163 MemberPointerTypes.InsertNode(
New, InsertPos);
4170 const llvm::APInt &ArySizeIn,
4171 const Expr *SizeExpr,
4173 unsigned IndexTypeQuals)
const {
4176 "Constant array of VLAs is illegal!");
4184 llvm::APInt ArySize(ArySizeIn);
4185 ArySize = ArySize.zextOrTrunc(Target->getMaxPointerWidth());
4187 llvm::FoldingSetNodeID ID;
4189 ASM, IndexTypeQuals);
4191 void *InsertPos =
nullptr;
4193 ConstantArrayTypes.FindNodeOrInsertPos(ID, InsertPos))
4204 ASM, IndexTypeQuals);
4209 ConstantArrayTypes.FindNodeOrInsertPos(ID, InsertPos);
4210 assert(!NewIP &&
"Shouldn't be in the map!"); (void)NewIP;
4213 auto *
New = ConstantArrayType::Create(*
this, EltTy, Canon, ArySize, SizeExpr,
4214 ASM, IndexTypeQuals);
4215 ConstantArrayTypes.InsertNode(
New, InsertPos);
4216 Types.push_back(
New);
4225 if (!
type->isVariablyModifiedType())
return type;
4230 const Type *ty = split.
Ty;
4232#define TYPE(Class, Base)
4233#define ABSTRACT_TYPE(Class, Base)
4234#define NON_CANONICAL_TYPE(Class, Base) case Type::Class:
4235#include "clang/AST/TypeNodes.inc"
4236 llvm_unreachable(
"didn't desugar past all non-canonical types?");
4242 case Type::DependentVector:
4243 case Type::ExtVector:
4244 case Type::DependentSizedExtVector:
4245 case Type::ConstantMatrix:
4246 case Type::DependentSizedMatrix:
4247 case Type::DependentAddressSpace:
4248 case Type::ObjCObject:
4249 case Type::ObjCInterface:
4250 case Type::ObjCObjectPointer:
4253 case Type::UnresolvedUsing:
4254 case Type::TypeOfExpr:
4256 case Type::Decltype:
4257 case Type::UnaryTransform:
4258 case Type::DependentName:
4259 case Type::InjectedClassName:
4260 case Type::TemplateSpecialization:
4261 case Type::TemplateTypeParm:
4262 case Type::SubstTemplateTypeParmPack:
4263 case Type::SubstBuiltinTemplatePack:
4265 case Type::DeducedTemplateSpecialization:
4266 case Type::PackExpansion:
4267 case Type::PackIndexing:
4269 case Type::DependentBitInt:
4270 case Type::ArrayParameter:
4271 case Type::HLSLAttributedResource:
4272 case Type::HLSLInlineSpirv:
4273 case Type::OverflowBehavior:
4274 llvm_unreachable(
"type should never be variably-modified");
4278 case Type::FunctionNoProto:
4279 case Type::FunctionProto:
4280 case Type::BlockPointer:
4281 case Type::MemberPointer:
4294 case Type::LValueReference: {
4298 lv->isSpelledAsLValue());
4302 case Type::RValueReference: {
4309 case Type::Atomic: {
4315 case Type::ConstantArray: {
4321 cat->getSizeModifier(),
4322 cat->getIndexTypeCVRQualifiers());
4326 case Type::DependentSizedArray: {
4330 dat->getSizeModifier(), dat->getIndexTypeCVRQualifiers());
4335 case Type::IncompleteArray: {
4340 iat->getIndexTypeCVRQualifiers());
4345 case Type::VariableArray: {
4350 vat->getIndexTypeCVRQualifiers());
4363 unsigned IndexTypeQuals)
const {
4380 VariableArrayTypes.push_back(
New);
4381 Types.push_back(
New);
4391 unsigned elementTypeQuals)
const {
4394 "Size must be type- or value-dependent!");
4398 void *insertPos =
nullptr;
4399 llvm::FoldingSetNodeID ID;
4401 ID, *
this, numElements ?
QualType(canonElementType.
Ty, 0) : elementType,
4402 ASM, elementTypeQuals, numElements);
4406 DependentSizedArrayTypes.FindNodeOrInsertPos(ID, insertPos);
4418 DependentSizedArrayTypes.InsertNode(newType, insertPos);
4419 Types.push_back(newType);
4427 numElements, ASM, elementTypeQuals);
4428 DependentSizedArrayTypes.InsertNode(canonTy, insertPos);
4429 Types.push_back(canonTy);
4434 canonElementType.
Quals);
4438 if (
QualType(canonElementType.
Ty, 0) == elementType &&
4447 Types.push_back(sugaredType);
4453 unsigned elementTypeQuals)
const {
4454 llvm::FoldingSetNodeID ID;
4457 void *insertPos =
nullptr;
4459 IncompleteArrayTypes.FindNodeOrInsertPos(ID, insertPos))
4471 ASM, elementTypeQuals);
4476 IncompleteArrayTypes.FindNodeOrInsertPos(ID, insertPos);
4477 assert(!existing &&
"Shouldn't be in the map!"); (void) existing;
4483 IncompleteArrayTypes.InsertNode(newType, insertPos);
4484 Types.push_back(newType);
4490#define SVE_INT_ELTTY(BITS, ELTS, SIGNED, NUMVECTORS) \
4491 {getIntTypeForBitwidth(BITS, SIGNED), llvm::ElementCount::getScalable(ELTS), \
4494#define SVE_ELTTY(ELTTY, ELTS, NUMVECTORS) \
4495 {ELTTY, llvm::ElementCount::getScalable(ELTS), NUMVECTORS};
4499 llvm_unreachable(
"Unsupported builtin vector type");
4501#define SVE_VECTOR_TYPE_INT(Name, MangledName, Id, SingletonId, NumEls, \
4502 ElBits, NF, IsSigned) \
4503 case BuiltinType::Id: \
4504 return {getIntTypeForBitwidth(ElBits, IsSigned), \
4505 llvm::ElementCount::getScalable(NumEls), NF};
4506#define SVE_VECTOR_TYPE_FLOAT(Name, MangledName, Id, SingletonId, NumEls, \
4508 case BuiltinType::Id: \
4509 return {ElBits == 16 ? HalfTy : (ElBits == 32 ? FloatTy : DoubleTy), \
4510 llvm::ElementCount::getScalable(NumEls), NF};
4511#define SVE_VECTOR_TYPE_BFLOAT(Name, MangledName, Id, SingletonId, NumEls, \
4513 case BuiltinType::Id: \
4514 return {BFloat16Ty, llvm::ElementCount::getScalable(NumEls), NF};
4515#define SVE_VECTOR_TYPE_MFLOAT(Name, MangledName, Id, SingletonId, NumEls, \
4517 case BuiltinType::Id: \
4518 return {MFloat8Ty, llvm::ElementCount::getScalable(NumEls), NF};
4519#define SVE_PREDICATE_TYPE_ALL(Name, MangledName, Id, SingletonId, NumEls, NF) \
4520 case BuiltinType::Id: \
4521 return {BoolTy, llvm::ElementCount::getScalable(NumEls), NF};
4522#include "clang/Basic/AArch64ACLETypes.def"
4524#define RVV_VECTOR_TYPE_INT(Name, Id, SingletonId, NumEls, ElBits, NF, \
4526 case BuiltinType::Id: \
4527 return {getIntTypeForBitwidth(ElBits, IsSigned), \
4528 llvm::ElementCount::getScalable(NumEls), NF};
4529#define RVV_VECTOR_TYPE_FLOAT(Name, Id, SingletonId, NumEls, ElBits, NF) \
4530 case BuiltinType::Id: \
4531 return {ElBits == 16 ? Float16Ty : (ElBits == 32 ? FloatTy : DoubleTy), \
4532 llvm::ElementCount::getScalable(NumEls), NF};
4533#define RVV_VECTOR_TYPE_BFLOAT(Name, Id, SingletonId, NumEls, ElBits, NF) \
4534 case BuiltinType::Id: \
4535 return {BFloat16Ty, llvm::ElementCount::getScalable(NumEls), NF};
4536#define RVV_PREDICATE_TYPE(Name, Id, SingletonId, NumEls) \
4537 case BuiltinType::Id: \
4538 return {BoolTy, llvm::ElementCount::getScalable(NumEls), 1};
4539#include "clang/Basic/RISCVVTypes.def"
4546 if (Target->getTriple().isWasm() && Target->hasFeature(
"reference-types")) {
4547#define WASM_REF_TYPE(Name, MangledName, Id, SingletonId, AS) \
4548 if (BuiltinType::Id == BuiltinType::WasmExternRef) \
4550#include "clang/Basic/WebAssemblyReferenceTypes.def"
4553 "shouldn't try to generate type externref outside WebAssembly target");
4560 unsigned NumFields)
const {
4562 if (
auto It = ScalableVecTyMap.find(K); It != ScalableVecTyMap.end())
4565 if (Target->hasAArch64ACLETypes()) {
4568#define SVE_VECTOR_TYPE_INT(Name, MangledName, Id, SingletonId, NumEls, \
4569 ElBits, NF, IsSigned) \
4570 if (EltTy->hasIntegerRepresentation() && !EltTy->isBooleanType() && \
4571 EltTy->hasSignedIntegerRepresentation() == IsSigned && \
4572 EltTySize == ElBits && NumElts == (NumEls * NF) && NumFields == 1) { \
4573 return ScalableVecTyMap[K] = SingletonId; \
4575#define SVE_VECTOR_TYPE_FLOAT(Name, MangledName, Id, SingletonId, NumEls, \
4577 if (EltTy->hasFloatingRepresentation() && !EltTy->isBFloat16Type() && \
4578 EltTySize == ElBits && NumElts == (NumEls * NF) && NumFields == 1) { \
4579 return ScalableVecTyMap[K] = SingletonId; \
4581#define SVE_VECTOR_TYPE_BFLOAT(Name, MangledName, Id, SingletonId, NumEls, \
4583 if (EltTy->hasFloatingRepresentation() && EltTy->isBFloat16Type() && \
4584 EltTySize == ElBits && NumElts == (NumEls * NF) && NumFields == 1) { \
4585 return ScalableVecTyMap[K] = SingletonId; \
4587#define SVE_VECTOR_TYPE_MFLOAT(Name, MangledName, Id, SingletonId, NumEls, \
4589 if (EltTy->isMFloat8Type() && EltTySize == ElBits && \
4590 NumElts == (NumEls * NF) && NumFields == 1) { \
4591 return ScalableVecTyMap[K] = SingletonId; \
4593#define SVE_PREDICATE_TYPE_ALL(Name, MangledName, Id, SingletonId, NumEls, NF) \
4594 if (EltTy->isBooleanType() && NumElts == (NumEls * NF) && NumFields == 1) \
4595 return ScalableVecTyMap[K] = SingletonId;
4596#include "clang/Basic/AArch64ACLETypes.def"
4597 }
else if (Target->hasRISCVVTypes()) {
4599#define RVV_VECTOR_TYPE(Name, Id, SingletonId, NumEls, ElBits, NF, IsSigned, \
4601 if (!EltTy->isBooleanType() && \
4602 ((EltTy->hasIntegerRepresentation() && \
4603 EltTy->hasSignedIntegerRepresentation() == IsSigned) || \
4604 (EltTy->hasFloatingRepresentation() && !EltTy->isBFloat16Type() && \
4606 (EltTy->hasFloatingRepresentation() && EltTy->isBFloat16Type() && \
4607 IsBF && !IsFP)) && \
4608 EltTySize == ElBits && NumElts == NumEls && NumFields == NF) \
4609 return ScalableVecTyMap[K] = SingletonId;
4610#define RVV_PREDICATE_TYPE(Name, Id, SingletonId, NumEls) \
4611 if (EltTy->isBooleanType() && NumElts == NumEls) \
4612 return ScalableVecTyMap[K] = SingletonId;
4613#include "clang/Basic/RISCVVTypes.def"
4628 llvm::FoldingSetNodeID ID;
4631 void *InsertPos =
nullptr;
4632 if (
VectorType *VTP = VectorTypes.FindNodeOrInsertPos(ID, InsertPos))
4642 VectorType *NewIP = VectorTypes.FindNodeOrInsertPos(ID, InsertPos);
4643 assert(!NewIP &&
"Shouldn't be in the map!"); (void)NewIP;
4646 VectorType(vecType, NumElts, Canonical, VecKind);
4647 VectorTypes.InsertNode(
New, InsertPos);
4648 Types.push_back(
New);
4655 llvm::FoldingSetNodeID ID;
4658 void *InsertPos =
nullptr;
4660 DependentVectorTypes.FindNodeOrInsertPos(ID, InsertPos);
4665 VecType,
QualType(Canon, 0), SizeExpr, AttrLoc, VecKind);
4668 if (CanonVecTy == VecType) {
4673 DependentVectorTypes.FindNodeOrInsertPos(ID, InsertPos);
4674 assert(!CanonCheck &&
4675 "Dependent-sized vector_size canonical type broken");
4677 DependentVectorTypes.InsertNode(
New, InsertPos);
4686 Types.push_back(
New);
4693 unsigned NumElts)
const {
4700 llvm::FoldingSetNodeID ID;
4703 void *InsertPos =
nullptr;
4704 if (
VectorType *VTP = VectorTypes.FindNodeOrInsertPos(ID, InsertPos))
4714 VectorType *NewIP = VectorTypes.FindNodeOrInsertPos(ID, InsertPos);
4715 assert(!NewIP &&
"Shouldn't be in the map!"); (void)NewIP;
4719 VectorTypes.InsertNode(
New, InsertPos);
4720 Types.push_back(
New);
4728 llvm::FoldingSetNodeID ID;
4732 void *InsertPos =
nullptr;
4734 = DependentSizedExtVectorTypes.FindNodeOrInsertPos(ID, InsertPos);
4744 if (CanonVecTy == vecType) {
4749 = DependentSizedExtVectorTypes.FindNodeOrInsertPos(ID, InsertPos);
4750 assert(!CanonCheck &&
"Dependent-sized ext_vector canonical type broken");
4752 DependentSizedExtVectorTypes.InsertNode(
New, InsertPos);
4761 Types.push_back(
New);
4766 unsigned NumColumns)
const {
4767 llvm::FoldingSetNodeID ID;
4769 Type::ConstantMatrix);
4772 "need a valid element type");
4773 assert(NumRows > 0 && NumRows <= LangOpts.MaxMatrixDimension &&
4774 NumColumns > 0 && NumColumns <= LangOpts.MaxMatrixDimension &&
4775 "need valid matrix dimensions");
4776 void *InsertPos =
nullptr;
4786 assert(!NewIP &&
"Matrix type shouldn't already exist in the map");
4792 MatrixTypes.InsertNode(
New, InsertPos);
4793 Types.push_back(
New);
4802 llvm::FoldingSetNodeID ID;
4806 void *InsertPos =
nullptr;
4808 DependentSizedMatrixTypes.FindNodeOrInsertPos(ID, InsertPos);
4813 ColumnExpr, AttrLoc);
4816 DependentSizedMatrixTypes.FindNodeOrInsertPos(ID, InsertPos);
4817 assert(!CanonCheck &&
"Dependent-sized matrix canonical type broken");
4819 DependentSizedMatrixTypes.InsertNode(Canon, InsertPos);
4820 Types.push_back(Canon);
4833 ColumnExpr, AttrLoc);
4834 Types.push_back(
New);
4839 Expr *AddrSpaceExpr,
4845 void *insertPos =
nullptr;
4846 llvm::FoldingSetNodeID ID;
4851 DependentAddressSpaceTypes.FindNodeOrInsertPos(ID, insertPos);
4857 DependentAddressSpaceTypes.InsertNode(canonTy, insertPos);
4858 Types.push_back(canonTy);
4861 if (canonPointeeType == PointeeType &&
4867 AddrSpaceExpr, AttrLoc);
4868 Types.push_back(sugaredType);
4874 return T.isCanonical() &&
4892 llvm::FoldingSetNodeID ID;
4895 void *InsertPos =
nullptr;
4897 FunctionNoProtoTypes.FindNodeOrInsertPos(ID, InsertPos))
4907 FunctionNoProtoTypes.FindNodeOrInsertPos(ID, InsertPos);
4908 assert(!NewIP &&
"Shouldn't be in the map!"); (void)NewIP;
4913 Types.push_back(
New);
4914 FunctionNoProtoTypes.InsertNode(
New, InsertPos);
4930 return CanResultType;
4937 if (!NoexceptInType)
4954 bool AnyPackExpansions =
false;
4958 if (ET->
getAs<PackExpansionType>())
4959 AnyPackExpansions =
true;
4961 return AnyPackExpansions;
4967QualType ASTContext::getFunctionTypeInternal(
4968 QualType ResultTy, ArrayRef<QualType> ArgArray,
4969 const FunctionProtoType::ExtProtoInfo &EPI,
bool OnlyWantCanonical)
const {
4970 size_t NumArgs = ArgArray.size();
4974 llvm::FoldingSetNodeID
ID;
4979 bool Unique =
false;
4981 void *InsertPos =
nullptr;
4982 if (FunctionProtoType *FPT =
4983 FunctionProtoTypes.FindNodeOrInsertPos(ID, InsertPos)) {
4984 QualType Existing = QualType(FPT, 0);
5003 bool IsCanonicalExceptionSpec =
5007 bool isCanonical = !Unique && IsCanonicalExceptionSpec &&
5009 for (
unsigned i = 0; i != NumArgs && isCanonical; ++i)
5010 if (!ArgArray[i].isCanonicalAsParam())
5011 isCanonical =
false;
5013 if (OnlyWantCanonical)
5014 assert(isCanonical &&
5015 "given non-canonical parameters constructing canonical type");
5020 if (!isCanonical && Canonical.
isNull()) {
5021 SmallVector<QualType, 16> CanonicalArgs;
5022 CanonicalArgs.reserve(NumArgs);
5023 for (
unsigned i = 0; i != NumArgs; ++i)
5026 llvm::SmallVector<QualType, 8> ExceptionTypeStorage;
5027 FunctionProtoType::ExtProtoInfo CanonicalEPI = EPI;
5030 if (IsCanonicalExceptionSpec) {
5032 }
else if (NoexceptInType) {
5045 bool AnyPacks =
false;
5047 if (ET->
getAs<PackExpansionType>())
5068 llvm_unreachable(
"dependent noexcept is already canonical");
5071 CanonicalEPI.
ExceptionSpec = FunctionProtoType::ExceptionSpecInfo();
5077 getFunctionTypeInternal(CanResultTy, CanonicalArgs, CanonicalEPI,
true);
5080 FunctionProtoType *NewIP =
5081 FunctionProtoTypes.FindNodeOrInsertPos(ID, InsertPos);
5082 assert(!NewIP &&
"Shouldn't be in the map!"); (void)NewIP;
5087 auto ESH = FunctionProtoType::getExceptionSpecSize(
5089 size_t Size = FunctionProtoType::totalSizeToAlloc<
5090 QualType, SourceLocation, FunctionType::FunctionTypeExtraBitfields,
5091 FunctionType::FunctionTypeExtraAttributeInfo,
5092 FunctionType::FunctionTypeArmAttributes, FunctionType::ExceptionType,
5093 Expr *, FunctionDecl *, FunctionProtoType::ExtParameterInfo, Qualifiers,
5094 FunctionEffect, EffectConditionExpr>(
5098 ESH.NumExprPtr, ESH.NumFunctionDeclPtr,
5103 auto *FTP = (FunctionProtoType *)
Allocate(Size,
alignof(FunctionProtoType));
5104 FunctionProtoType::ExtProtoInfo newEPI = EPI;
5105 new (FTP) FunctionProtoType(ResultTy, ArgArray, Canonical, newEPI);
5106 Types.push_back(FTP);
5108 FunctionProtoTypes.InsertNode(FTP, InsertPos);
5110 AnyFunctionEffects =
true;
5111 return QualType(FTP, 0);
5114QualType ASTContext::getPipeType(QualType T,
bool ReadOnly)
const {
5115 llvm::FoldingSetNodeID
ID;
5118 void *InsertPos =
nullptr;
5119 if (PipeType *PT = PipeTypes.FindNodeOrInsertPos(ID, InsertPos))
5120 return QualType(PT, 0);
5129 PipeType *NewIP = PipeTypes.FindNodeOrInsertPos(ID, InsertPos);
5130 assert(!NewIP &&
"Shouldn't be in the map!");
5133 auto *
New =
new (*
this,
alignof(PipeType)) PipeType(T, Canonical, ReadOnly);
5134 Types.push_back(
New);
5135 PipeTypes.InsertNode(
New, InsertPos);
5136 return QualType(
New, 0);
5146 return getPipeType(T,
true);
5150 return getPipeType(T,
false);
5154 llvm::FoldingSetNodeID ID;
5157 void *InsertPos =
nullptr;
5158 if (
BitIntType *EIT = BitIntTypes.FindNodeOrInsertPos(ID, InsertPos))
5162 BitIntTypes.InsertNode(
New, InsertPos);
5163 Types.push_back(
New);
5168 Expr *NumBitsExpr)
const {
5170 llvm::FoldingSetNodeID ID;
5173 void *InsertPos =
nullptr;
5175 DependentBitIntTypes.FindNodeOrInsertPos(ID, InsertPos))
5180 DependentBitIntTypes.InsertNode(
New, InsertPos);
5182 Types.push_back(
New);
5190 if (
auto *Target = PredefinedSugarTypes[llvm::to_underlying(KD)];
5202 return Ctx.getFromTargetType(Ctx.Target->
getSizeType());
5203 case Kind::SignedSizeT:
5205 case Kind::PtrdiffT:
5208 llvm_unreachable(
"unexpected kind");
5213 Types.push_back(
New);
5214 PredefinedSugarTypes[llvm::to_underlying(KD)] =
New;
5221 if (
auto *Tag = dyn_cast<TagDecl>(
Decl))
5224 if (
auto *
Typedef = dyn_cast<TypedefNameDecl>(
Decl))
5226 if (
auto *UD = dyn_cast<UnresolvedUsingTypenameDecl>(
Decl))
5235 if (
auto *Tag = dyn_cast<TagDecl>(TD))
5237 if (
auto *TN = dyn_cast<TypedefNameDecl>(TD))
5239 if (
const auto *UD = dyn_cast<UnresolvedUsingTypenameDecl>(TD))
5241 assert(TD->TypeForDecl);
5246 if (
const auto *TD = dyn_cast<TagDecl>(
Decl))
5248 if (
const auto *TD = dyn_cast<TypedefNameDecl>(
Decl);
5249 isa_and_nonnull<TypedefDecl, TypeAliasDecl>(TD))
5252 if (
const auto *Using = dyn_cast<UnresolvedUsingTypenameDecl>(
Decl))
5255 assert(
Decl->TypeForDecl);
5265 std::optional<bool> TypeMatchesDeclOrNone)
const {
5266 if (!TypeMatchesDeclOrNone) {
5267 QualType DeclUnderlyingType =
Decl->getUnderlyingType();
5268 assert(!DeclUnderlyingType.
isNull());
5269 if (UnderlyingType.
isNull())
5270 UnderlyingType = DeclUnderlyingType;
5272 assert(
hasSameType(UnderlyingType, DeclUnderlyingType));
5273 TypeMatchesDeclOrNone = UnderlyingType == DeclUnderlyingType;
5277 assert(!UnderlyingType.
isNull());
5281 *TypeMatchesDeclOrNone) {
5282 if (
Decl->TypeForDecl)
5287 !*TypeMatchesDeclOrNone);
5289 Types.push_back(NewType);
5290 Decl->TypeForDecl = NewType;
5294 llvm::FoldingSetNodeID ID;
5296 *TypeMatchesDeclOrNone ?
QualType() : UnderlyingType);
5298 void *InsertPos =
nullptr;
5300 TypedefTypes.FindNodeOrInsertPos(ID, InsertPos))
5301 return QualType(Placeholder->getType(), 0);
5306 1, !!Qualifier, !*TypeMatchesDeclOrNone),
5310 UnderlyingType, !*TypeMatchesDeclOrNone);
5311 auto *Placeholder =
new (NewType->getFoldingSetPlaceholder())
5313 TypedefTypes.InsertNode(Placeholder, InsertPos);
5314 Types.push_back(NewType);
5323 if (UnderlyingType.
isNull()) {
5331 llvm::FoldingSetNodeID ID;
5334 void *InsertPos =
nullptr;
5335 if (
const UsingType *T = UsingTypes.FindNodeOrInsertPos(ID, InsertPos))
5345 Allocate(UsingType::totalSizeToAlloc<NestedNameSpecifier>(!!Qualifier),
5349 UsingTypes.InsertNode(T, InsertPos);
5355 const TagDecl *TD,
bool OwnsTag,
5357 const Type *CanonicalType,
5358 bool WithFoldingSetNode)
const {
5359 auto [TC, Size] = [&] {
5362 static_assert(
alignof(EnumType) ==
alignof(TagType));
5363 return std::make_tuple(Type::Enum,
sizeof(EnumType));
5364 case Decl::ClassTemplatePartialSpecialization:
5365 case Decl::ClassTemplateSpecialization:
5366 case Decl::CXXRecord:
5367 static_assert(
alignof(RecordType) ==
alignof(TagType));
5368 static_assert(
alignof(InjectedClassNameType) ==
alignof(TagType));
5370 return std::make_tuple(Type::InjectedClassName,
5371 sizeof(InjectedClassNameType));
5374 return std::make_tuple(Type::Record,
sizeof(RecordType));
5376 llvm_unreachable(
"unexpected decl kind");
5386 if (WithFoldingSetNode) {
5394 sizeof(TagTypeFoldingSetPlaceholder) +
5395 TagTypeFoldingSetPlaceholder::getOffset() + Size,
5396 std::max(
alignof(TagTypeFoldingSetPlaceholder),
alignof(TagType)));
5397 auto *T =
new (Mem) TagTypeFoldingSetPlaceholder();
5398 Mem = T->getTagType();
5400 Mem =
Allocate(Size,
alignof(TagType));
5403 auto *T = [&, TC = TC]() -> TagType * {
5407 auto *T =
new (Mem) EnumType(TC,
Keyword, Qualifier, TD, OwnsTag,
5408 IsInjected, CanonicalType);
5409 assert(
reinterpret_cast<void *
>(T) ==
5410 reinterpret_cast<void *
>(
static_cast<TagType *
>(T)) &&
5411 "TagType must be the first base of EnumType");
5414 case Type::Record: {
5416 auto *T =
new (Mem) RecordType(TC,
Keyword, Qualifier, TD, OwnsTag,
5417 IsInjected, CanonicalType);
5418 assert(
reinterpret_cast<void *
>(T) ==
5419 reinterpret_cast<void *
>(
static_cast<TagType *
>(T)) &&
5420 "TagType must be the first base of RecordType");
5423 case Type::InjectedClassName: {
5424 auto *T =
new (Mem) InjectedClassNameType(
Keyword, Qualifier, TD,
5425 IsInjected, CanonicalType);
5426 assert(
reinterpret_cast<void *
>(T) ==
5427 reinterpret_cast<void *
>(
static_cast<TagType *
>(T)) &&
5428 "TagType must be the first base of InjectedClassNameType");
5432 llvm_unreachable(
"unexpected type class");
5435 assert(T->getKeyword() ==
Keyword);
5436 assert(T->getQualifier() == Qualifier);
5437 assert(T->getDecl() == TD);
5438 assert(T->isInjected() == IsInjected);
5439 assert(T->isTagOwned() == OwnsTag);
5448 if (
const auto *RD = dyn_cast<CXXRecordDecl>(TD);
5449 RD && RD->isInjectedClassName())
5456 if (TD->TypeForDecl)
5457 return TD->TypeForDecl->getCanonicalTypeUnqualified();
5459 const Type *CanonicalType = getTagTypeInternal(
5462 false,
false,
nullptr,
5464 TD->TypeForDecl = CanonicalType;
5470 const TagDecl *TD,
bool OwnsTag)
const {
5473 bool IsInjected = TD != NonInjectedTD;
5480 if (
Keyword == PreferredKeyword && !Qualifier && !OwnsTag) {
5481 if (
const Type *T = TD->TypeForDecl; T && !T->isCanonicalUnqualified())
5487 std::nullopt, NonInjectedTD,
5488 false, IsInjected, CanonicalType,
5490 TD->TypeForDecl = T;
5494 llvm::FoldingSetNodeID ID;
5495 TagTypeFoldingSetPlaceholder::Profile(ID,
Keyword, Qualifier, NonInjectedTD,
5496 OwnsTag, IsInjected);
5498 void *InsertPos =
nullptr;
5499 if (TagTypeFoldingSetPlaceholder *T =
5500 TagTypes.FindNodeOrInsertPos(ID, InsertPos))
5501 return QualType(T->getTagType(), 0);
5505 getTagTypeInternal(
Keyword, Qualifier, NonInjectedTD, OwnsTag, IsInjected,
5506 CanonicalType,
true);
5507 TagTypes.InsertNode(TagTypeFoldingSetPlaceholder::fromTagType(T), InsertPos);
5512 unsigned NumPositiveBits,
5515 unsigned IntWidth = Target->getIntWidth();
5516 unsigned CharWidth = Target->getCharWidth();
5517 unsigned ShortWidth = Target->getShortWidth();
5518 bool EnumTooLarge =
false;
5520 if (NumNegativeBits) {
5524 if (IsPacked && NumNegativeBits <= CharWidth &&
5525 NumPositiveBits < CharWidth) {
5527 BestWidth = CharWidth;
5528 }
else if (IsPacked && NumNegativeBits <= ShortWidth &&
5529 NumPositiveBits < ShortWidth) {
5531 BestWidth = ShortWidth;
5532 }
else if (NumNegativeBits <= IntWidth && NumPositiveBits < IntWidth) {
5534 BestWidth = IntWidth;
5536 BestWidth = Target->getLongWidth();
5538 if (NumNegativeBits <= BestWidth && NumPositiveBits < BestWidth) {
5541 BestWidth = Target->getLongLongWidth();
5543 if (NumNegativeBits > BestWidth || NumPositiveBits >= BestWidth)
5544 EnumTooLarge =
true;
5548 BestPromotionType = (BestWidth <= IntWidth ?
IntTy : BestType);
5553 if (IsPacked && NumPositiveBits <= CharWidth) {
5555 BestPromotionType =
IntTy;
5556 BestWidth = CharWidth;
5557 }
else if (IsPacked && NumPositiveBits <= ShortWidth) {
5559 BestPromotionType =
IntTy;
5560 BestWidth = ShortWidth;
5561 }
else if (NumPositiveBits <= IntWidth) {
5563 BestWidth = IntWidth;
5564 BestPromotionType = (NumPositiveBits == BestWidth || !LangOpts.CPlusPlus)
5567 }
else if (NumPositiveBits <= (BestWidth = Target->getLongWidth())) {
5569 BestPromotionType = (NumPositiveBits == BestWidth || !LangOpts.CPlusPlus)
5573 BestWidth = Target->getLongLongWidth();
5574 if (NumPositiveBits > BestWidth) {
5579 EnumTooLarge =
true;
5582 BestPromotionType = (NumPositiveBits == BestWidth || !LangOpts.CPlusPlus)
5587 return EnumTooLarge;
5591 assert((T->isIntegralType(*
this) || T->isEnumeralType()) &&
5592 "Integral type required!");
5595 if (
Value.isUnsigned() ||
Value.isNonNegative()) {
5596 if (T->isSignedIntegerOrEnumerationType())
5598 return Value.getActiveBits() <= BitWidth;
5600 return Value.getSignificantBits() <= BitWidth;
5606 const Type *CanonicalType)
const {
5608 UnresolvedUsingType::totalSizeToAlloc<
5610 !!InsertPos, !!Qualifier),
5614 auto *Placeholder =
new (T->getFoldingSetPlaceholder())
5616 TypedefTypes.InsertNode(Placeholder, InsertPos);
5626 return D->TypeForDecl->getCanonicalTypeUnqualified();
5628 const Type *CanonicalType = getUnresolvedUsingTypeInternal(
5632 D->TypeForDecl = CanonicalType;
5641 if (
const Type *T = D->TypeForDecl; T && !T->isCanonicalUnqualified())
5648 nullptr, CanonicalType);
5653 llvm::FoldingSetNodeID ID;
5656 void *InsertPos =
nullptr;
5658 UnresolvedUsingTypes.FindNodeOrInsertPos(ID, InsertPos))
5659 return QualType(Placeholder->getType(), 0);
5663 const Type *T = getUnresolvedUsingTypeInternal(
Keyword, Qualifier, D,
5664 InsertPos, CanonicalType);
5672 llvm::FoldingSetNodeID id;
5673 AttributedType::Profile(
id, attrKind, modifiedType, equivalentType,
attr);
5675 void *insertPos =
nullptr;
5676 AttributedType *
type = AttributedTypes.FindNodeOrInsertPos(
id, insertPos);
5679 assert(!
attr ||
attr->getKind() == attrKind);
5682 type =
new (*
this,
alignof(AttributedType))
5683 AttributedType(canon, attrKind,
attr, modifiedType, equivalentType);
5685 Types.push_back(
type);
5686 AttributedTypes.InsertNode(
type, insertPos);
5699 switch (nullability) {
5715 llvm_unreachable(
"Unknown nullability kind");
5720 llvm::FoldingSetNodeID ID;
5721 BTFTagAttributedType::Profile(ID, Wrapped, BTFAttr);
5723 void *InsertPos =
nullptr;
5724 BTFTagAttributedType *Ty =
5725 BTFTagAttributedTypes.FindNodeOrInsertPos(ID, InsertPos);
5730 Ty =
new (*
this,
alignof(BTFTagAttributedType))
5731 BTFTagAttributedType(Canon, Wrapped, BTFAttr);
5733 Types.push_back(Ty);
5734 BTFTagAttributedTypes.InsertNode(Ty, InsertPos);
5742 StringRef IdentName = II->
getName();
5743 OverflowBehaviorType::OverflowBehaviorKind Kind;
5744 if (IdentName ==
"wrap") {
5745 Kind = OverflowBehaviorType::OverflowBehaviorKind::Wrap;
5746 }
else if (IdentName ==
"trap") {
5747 Kind = OverflowBehaviorType::OverflowBehaviorKind::Trap;
5756 OverflowBehaviorType::OverflowBehaviorKind Kind,
5759 "Cannot have underlying types that are themselves OBTs");
5760 llvm::FoldingSetNodeID ID;
5761 OverflowBehaviorType::Profile(ID, Underlying, Kind);
5762 void *InsertPos =
nullptr;
5764 if (OverflowBehaviorType *OBT =
5765 OverflowBehaviorTypes.FindNodeOrInsertPos(ID, InsertPos)) {
5774 assert(!OverflowBehaviorTypes.FindNodeOrInsertPos(ID, InsertPos) &&
5775 "Shouldn't be in the map");
5778 OverflowBehaviorType *Ty =
new (*
this,
alignof(OverflowBehaviorType))
5779 OverflowBehaviorType(Canonical, Underlying, Kind);
5781 Types.push_back(Ty);
5782 OverflowBehaviorTypes.InsertNode(Ty, InsertPos);
5788 const HLSLAttributedResourceType::Attributes &Attrs) {
5790 llvm::FoldingSetNodeID ID;
5791 HLSLAttributedResourceType::Profile(ID, Wrapped, Contained, Attrs);
5793 void *InsertPos =
nullptr;
5794 HLSLAttributedResourceType *Ty =
5795 HLSLAttributedResourceTypes.FindNodeOrInsertPos(ID, InsertPos);
5799 Ty =
new (*
this,
alignof(HLSLAttributedResourceType))
5800 HLSLAttributedResourceType(Wrapped, Contained, Attrs);
5802 Types.push_back(Ty);
5803 HLSLAttributedResourceTypes.InsertNode(Ty, InsertPos);
5811 llvm::FoldingSetNodeID ID;
5812 HLSLInlineSpirvType::Profile(ID, Opcode, Size, Alignment, Operands);
5814 void *InsertPos =
nullptr;
5815 HLSLInlineSpirvType *Ty =
5816 HLSLInlineSpirvTypes.FindNodeOrInsertPos(ID, InsertPos);
5821 HLSLInlineSpirvType::totalSizeToAlloc<SpirvOperand>(Operands.size()),
5822 alignof(HLSLInlineSpirvType));
5824 Ty =
new (Mem) HLSLInlineSpirvType(Opcode, Size, Alignment, Operands);
5826 Types.push_back(Ty);
5827 HLSLInlineSpirvTypes.InsertNode(Ty, InsertPos);
5834 Decl *AssociatedDecl,
5838 llvm::FoldingSetNodeID ID;
5839 SubstTemplateTypeParmType::Profile(ID, Replacement, AssociatedDecl, Index,
5841 void *InsertPos =
nullptr;
5842 SubstTemplateTypeParmType *SubstParm =
5843 SubstTemplateTypeParmTypes.FindNodeOrInsertPos(ID, InsertPos);
5846 void *Mem =
Allocate(SubstTemplateTypeParmType::totalSizeToAlloc<QualType>(
5847 !Replacement.isCanonical()),
5848 alignof(SubstTemplateTypeParmType));
5849 SubstParm =
new (Mem) SubstTemplateTypeParmType(Replacement, AssociatedDecl,
5850 Index, PackIndex, Final);
5851 Types.push_back(SubstParm);
5852 SubstTemplateTypeParmTypes.InsertNode(SubstParm, InsertPos);
5860 unsigned Index,
bool Final,
5867 llvm::FoldingSetNodeID ID;
5868 SubstTemplateTypeParmPackType::Profile(ID, AssociatedDecl, Index, Final,
5870 void *InsertPos =
nullptr;
5871 if (SubstTemplateTypeParmPackType *SubstParm =
5872 SubstTemplateTypeParmPackTypes.FindNodeOrInsertPos(ID, InsertPos))
5882 [[maybe_unused]]
const auto *Nothing =
5883 SubstTemplateTypeParmPackTypes.FindNodeOrInsertPos(ID, InsertPos);
5888 auto *SubstParm =
new (*
this,
alignof(SubstTemplateTypeParmPackType))
5889 SubstTemplateTypeParmPackType(Canon, AssociatedDecl, Index, Final,
5891 Types.push_back(SubstParm);
5892 SubstTemplateTypeParmPackTypes.InsertNode(SubstParm, InsertPos);
5900 return P.getKind() == TemplateArgument::Type;
5902 "Pack contains a non-type");
5904 llvm::FoldingSetNodeID ID;
5905 SubstBuiltinTemplatePackType::Profile(ID, ArgPack);
5907 void *InsertPos =
nullptr;
5909 SubstBuiltinTemplatePackTypes.FindNodeOrInsertPos(ID, InsertPos))
5918 [[maybe_unused]]
const auto *Nothing =
5919 SubstBuiltinTemplatePackTypes.FindNodeOrInsertPos(ID, InsertPos);
5923 auto *PackType =
new (*
this,
alignof(SubstBuiltinTemplatePackType))
5924 SubstBuiltinTemplatePackType(Canon, ArgPack);
5925 Types.push_back(PackType);
5926 SubstBuiltinTemplatePackTypes.InsertNode(PackType, InsertPos);
5936 llvm::FoldingSetNodeID ID;
5937 TemplateTypeParmType::Profile(ID, Depth, Index, ParameterPack, TTPDecl);
5938 void *InsertPos =
nullptr;
5939 TemplateTypeParmType *TypeParm
5940 = TemplateTypeParmTypes.FindNodeOrInsertPos(ID, InsertPos);
5947 TypeParm =
new (*
this,
alignof(TemplateTypeParmType))
5948 TemplateTypeParmType(Depth, Index, ParameterPack, TTPDecl, Canon);
5950 TemplateTypeParmType *TypeCheck
5951 = TemplateTypeParmTypes.FindNodeOrInsertPos(ID, InsertPos);
5952 assert(!TypeCheck &&
"Template type parameter canonical type broken");
5955 TypeParm =
new (*
this,
alignof(TemplateTypeParmType)) TemplateTypeParmType(
5956 Depth, Index, ParameterPack,
nullptr,
QualType());
5958 Types.push_back(TypeParm);
5959 TemplateTypeParmTypes.InsertNode(TypeParm, InsertPos);
5985 llvm_unreachable(
"unexpected keyword kind");
5999 ElaboratedKeywordLoc, QualifierLoc, TemplateKeywordLoc, NameLoc,
6009 SpecifiedArgVec.reserve(SpecifiedArgs.size());
6011 SpecifiedArgVec.push_back(Arg.getArgument());
6014 CanonicalArgs, Underlying);
6017[[maybe_unused]]
static bool
6020 if (Arg.isPackExpansion())
6031 Template.getAsDependentTemplateName()));
6033 for (
const auto &Arg : Args)
6037 llvm::FoldingSetNodeID ID;
6040 void *InsertPos =
nullptr;
6041 if (
auto *T = TemplateSpecializationTypes.FindNodeOrInsertPos(ID, InsertPos))
6044 void *Mem =
Allocate(
sizeof(TemplateSpecializationType) +
6046 alignof(TemplateSpecializationType));
6050 assert(Spec->isDependentType() &&
6051 "canonical template specialization must be dependent");
6052 Types.push_back(Spec);
6053 TemplateSpecializationTypes.InsertNode(Spec, InsertPos);
6061 const auto *TD =
Template.getAsTemplateDecl(
true);
6062 bool IsTypeAlias = TD && TD->isTypeAlias();
6063 if (Underlying.
isNull()) {
6070 bool NonCanonical =
Template != CanonTemplate ||
Keyword != CanonKeyword;
6072 if (CanonicalArgs.empty()) {
6075 CanonicalArgs = CanonArgsVec;
6077 NonCanonical |= !llvm::equal(
6078 SpecifiedArgs, CanonicalArgs,
6087 assert((!isa_and_nonnull<TypeAliasTemplateDecl>(TD) ||
6089 "Caller must compute aliased type");
6090 IsTypeAlias =
false;
6093 CanonKeyword, CanonTemplate, CanonicalArgs);
6097 void *Mem =
Allocate(
sizeof(TemplateSpecializationType) +
6099 (IsTypeAlias ?
sizeof(
QualType) : 0),
6100 alignof(TemplateSpecializationType));
6101 auto *Spec =
new (Mem) TemplateSpecializationType(
6103 Types.push_back(Spec);
6109 llvm::FoldingSetNodeID ID;
6112 void *InsertPos =
nullptr;
6113 ParenType *T = ParenTypes.FindNodeOrInsertPos(ID, InsertPos);
6120 ParenType *CheckT = ParenTypes.FindNodeOrInsertPos(ID, InsertPos);
6121 assert(!CheckT &&
"Paren canonical type broken");
6127 ParenTypes.InsertNode(T, InsertPos);
6140 Types.push_back(newType);
6147 llvm::FoldingSetNodeID ID;
6148 DependentNameType::Profile(ID,
Keyword, NNS, Name);
6150 void *InsertPos =
nullptr;
6151 if (DependentNameType *T =
6152 DependentNameTypes.FindNodeOrInsertPos(ID, InsertPos))
6160 if (CanonKeyword !=
Keyword || CanonNNS != NNS) {
6162 [[maybe_unused]] DependentNameType *T =
6163 DependentNameTypes.FindNodeOrInsertPos(ID, InsertPos);
6164 assert(!T &&
"broken canonicalization");
6168 DependentNameType *T =
new (*
this,
alignof(DependentNameType))
6169 DependentNameType(
Keyword, NNS, Name, Canon);
6171 DependentNameTypes.InsertNode(T, InsertPos);
6177 if (
const auto *TTP = dyn_cast<TemplateTypeParmDecl>(Param)) {
6179 if (TTP->isParameterPack())
6183 }
else if (
auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(Param)) {
6185 NTTP->getType().getNonPackExpansionType().getNonLValueExprType(*
this);
6191 if (T->isRecordType()) {
6200 Expr *E =
new (*this)
6202 T,
VK, NTTP->getLocation());
6204 if (NTTP->isParameterPack())
6210 std::nullopt,
false,
6212 if (TTP->isParameterPack())
6218 if (Param->isTemplateParameterPack())
6227 bool ExpectPackInType)
const {
6229 "Pack expansions must expand one or more parameter packs");
6231 llvm::FoldingSetNodeID ID;
6232 PackExpansionType::Profile(ID, Pattern, NumExpansions);
6234 void *InsertPos =
nullptr;
6235 PackExpansionType *T = PackExpansionTypes.FindNodeOrInsertPos(ID, InsertPos);
6246 PackExpansionTypes.FindNodeOrInsertPos(ID, InsertPos);
6249 T =
new (*
this,
alignof(PackExpansionType))
6250 PackExpansionType(Pattern, Canon, NumExpansions);
6252 PackExpansionTypes.InsertNode(T, InsertPos);
6264 if (Protocols.empty())
return true;
6269 for (
unsigned i = 1; i != Protocols.size(); ++i)
6279 llvm::array_pod_sort(Protocols.begin(), Protocols.end(),
CmpProtocolNames);
6283 P = P->getCanonicalDecl();
6286 auto ProtocolsEnd = llvm::unique(Protocols);
6287 Protocols.erase(ProtocolsEnd, Protocols.end());
6292 unsigned NumProtocols)
const {
6301 bool isKindOf)
const {
6304 if (typeArgs.empty() && protocols.empty() && !isKindOf &&
6309 llvm::FoldingSetNodeID ID;
6310 ObjCObjectTypeImpl::Profile(ID, baseType, typeArgs, protocols, isKindOf);
6311 void *InsertPos =
nullptr;
6312 if (
ObjCObjectType *QT = ObjCObjectTypes.FindNodeOrInsertPos(ID, InsertPos))
6319 if (effectiveTypeArgs.empty()) {
6321 effectiveTypeArgs = baseObject->getTypeArgs();
6328 bool typeArgsAreCanonical = llvm::all_of(
6331 if (!typeArgsAreCanonical || !protocolsSorted || !baseType.
isCanonical()) {
6335 if (!typeArgsAreCanonical) {
6336 canonTypeArgsVec.reserve(effectiveTypeArgs.size());
6337 for (
auto typeArg : effectiveTypeArgs)
6339 canonTypeArgs = canonTypeArgsVec;
6341 canonTypeArgs = effectiveTypeArgs;
6346 if (!protocolsSorted) {
6347 canonProtocolsVec.append(protocols.begin(), protocols.end());
6349 canonProtocols = canonProtocolsVec;
6351 canonProtocols = protocols;
6355 canonProtocols, isKindOf);
6358 ObjCObjectTypes.FindNodeOrInsertPos(ID, InsertPos);
6361 unsigned size =
sizeof(ObjCObjectTypeImpl);
6362 size += typeArgs.size() *
sizeof(
QualType);
6364 void *mem =
Allocate(size,
alignof(ObjCObjectTypeImpl));
6366 new (mem) ObjCObjectTypeImpl(canonical, baseType, typeArgs, protocols,
6370 ObjCObjectTypes.InsertNode(T, InsertPos);
6380 bool allowOnPointerType)
const {
6383 if (
const auto *objT = dyn_cast<ObjCTypeParamType>(
type.getTypePtr())) {
6388 if (allowOnPointerType) {
6389 if (
const auto *objPtr =
6390 dyn_cast<ObjCObjectPointerType>(
type.getTypePtr())) {
6394 protocolsVec.append(objT->qual_begin(),
6396 protocolsVec.append(protocols.begin(), protocols.end());
6399 objT->getBaseType(),
6400 objT->getTypeArgsAsWritten(),
6402 objT->isKindOfTypeAsWritten());
6408 if (
const auto *objT = dyn_cast<ObjCObjectType>(
type.getTypePtr())){
6413 objT->getTypeArgsAsWritten(),
6415 objT->isKindOfTypeAsWritten());
6419 if (
type->isObjCObjectType()) {
6429 if (
type->isObjCIdType()) {
6432 objPtr->isKindOfType());
6437 if (
type->isObjCClassType()) {
6440 objPtr->isKindOfType());
6452 llvm::FoldingSetNodeID ID;
6453 ObjCTypeParamType::Profile(ID,
Decl,
Decl->getUnderlyingType(), protocols);
6454 void *InsertPos =
nullptr;
6455 if (ObjCTypeParamType *TypeParam =
6456 ObjCTypeParamTypes.FindNodeOrInsertPos(ID, InsertPos))
6461 if (!protocols.empty()) {
6465 Canonical, protocols, hasError,
true ));
6466 assert(!hasError &&
"Error when apply protocol qualifier to bound type");
6469 unsigned size =
sizeof(ObjCTypeParamType);
6471 void *mem =
Allocate(size,
alignof(ObjCTypeParamType));
6472 auto *newType =
new (mem) ObjCTypeParamType(
Decl, Canonical, protocols);
6474 Types.push_back(newType);
6475 ObjCTypeParamTypes.InsertNode(newType, InsertPos);
6485 protocols.append(NewTypeParamTy->qual_begin(), NewTypeParamTy->qual_end());
6500 for (
auto *Proto : OPT->quals()) {
6523 if (InheritedProtocols.empty())
6527 bool Conforms =
false;
6528 for (
auto *Proto : OPT->quals()) {
6530 for (
auto *PI : InheritedProtocols) {
6542 for (
auto *PI : InheritedProtocols) {
6544 bool Adopts =
false;
6545 for (
auto *Proto : OPT->quals()) {
6559 llvm::FoldingSetNodeID ID;
6562 void *InsertPos =
nullptr;
6564 ObjCObjectPointerTypes.FindNodeOrInsertPos(ID, InsertPos))
6573 ObjCObjectPointerTypes.FindNodeOrInsertPos(ID, InsertPos);
6582 Types.push_back(QType);
6583 ObjCObjectPointerTypes.InsertNode(QType, InsertPos);
6591 if (
Decl->TypeForDecl)
6595 assert(PrevDecl->TypeForDecl &&
"previous decl has no TypeForDecl");
6596 Decl->TypeForDecl = PrevDecl->TypeForDecl;
6597 return QualType(PrevDecl->TypeForDecl, 0);
6606 Decl->TypeForDecl = T;
6619 llvm::FoldingSetNodeID ID;
6623 void *InsertPos =
nullptr;
6625 DependentTypeOfExprTypes.FindNodeOrInsertPos(ID, InsertPos);
6635 DependentTypeOfExprTypes.InsertNode(Canon, InsertPos);
6643 Types.push_back(toe);
6654 auto *tot =
new (*
this,
alignof(TypeOfType))
6655 TypeOfType(*
this, tofType, Canonical, Kind);
6656 Types.push_back(tot);
6680 llvm_unreachable(
"Unknown value kind");
6695 }
else if (!UnderlyingType.
isNull()) {
6698 llvm::FoldingSetNodeID ID;
6699 DependentDecltypeType::Profile(ID, *
this, E);
6701 void *InsertPos =
nullptr;
6702 if (DependentDecltypeType *Canon =
6703 DependentDecltypeTypes.FindNodeOrInsertPos(ID, InsertPos))
6708 new (*
this,
alignof(DependentDecltypeType)) DependentDecltypeType(E);
6709 DependentDecltypeTypes.InsertNode(DT, InsertPos);
6710 Types.push_back(DT);
6713 auto *DT =
new (*
this,
alignof(DecltypeType))
6714 DecltypeType(E, UnderlyingType, CanonType);
6715 Types.push_back(DT);
6720 bool FullySubstituted,
6724 if (FullySubstituted && Index) {
6727 llvm::FoldingSetNodeID ID;
6728 PackIndexingType::Profile(ID, *
this, Pattern.
getCanonicalType(), IndexExpr,
6729 FullySubstituted, Expansions);
6730 void *InsertPos =
nullptr;
6731 PackIndexingType *Canon =
6732 DependentPackIndexingTypes.FindNodeOrInsertPos(ID, InsertPos);
6735 PackIndexingType::totalSizeToAlloc<QualType>(Expansions.size()),
6739 IndexExpr, FullySubstituted, Expansions);
6740 DependentPackIndexingTypes.InsertNode(Canon, InsertPos);
6746 Allocate(PackIndexingType::totalSizeToAlloc<QualType>(Expansions.size()),
6748 auto *T =
new (Mem) PackIndexingType(Canonical, Pattern, IndexExpr,
6749 FullySubstituted, Expansions);
6758 UnaryTransformType::UTTKind Kind)
const {
6760 llvm::FoldingSetNodeID ID;
6761 UnaryTransformType::Profile(ID, BaseType, UnderlyingType, Kind);
6763 void *InsertPos =
nullptr;
6764 if (UnaryTransformType *UT =
6765 UnaryTransformTypes.FindNodeOrInsertPos(ID, InsertPos))
6769 if (!BaseType->isDependentType()) {
6772 assert(UnderlyingType.
isNull() || BaseType == UnderlyingType);
6775 BaseType != CanonBase) {
6780 [[maybe_unused]] UnaryTransformType *UT =
6781 UnaryTransformTypes.FindNodeOrInsertPos(ID, InsertPos);
6782 assert(!UT &&
"broken canonicalization");
6786 auto *UT =
new (*
this,
alignof(UnaryTransformType))
6787 UnaryTransformType(BaseType, UnderlyingType, Kind, CanonType);
6788 UnaryTransformTypes.InsertNode(UT, InsertPos);
6789 Types.push_back(UT);
6793QualType ASTContext::getAutoTypeInternal(
6798 !TypeConstraintConcept && !IsDependent)
6802 llvm::FoldingSetNodeID ID;
6803 bool IsDeducedDependent =
6804 isa_and_nonnull<TemplateTemplateParmDecl>(TypeConstraintConcept) ||
6806 AutoType::Profile(ID, *
this, DeducedType,
Keyword,
6807 IsDependent || IsDeducedDependent, TypeConstraintConcept,
6808 TypeConstraintArgs);
6809 if (
auto const AT_iter = AutoTypes.find(ID); AT_iter != AutoTypes.end())
6810 return QualType(AT_iter->getSecond(), 0);
6814 if (!DeducedType.
isNull()) {
6816 }
else if (TypeConstraintConcept) {
6817 bool AnyNonCanonArgs =
false;
6818 auto *CanonicalConcept =
6821 *
this, TypeConstraintArgs, AnyNonCanonArgs);
6822 if (CanonicalConcept != TypeConstraintConcept || AnyNonCanonArgs) {
6824 CanonicalConcept, CanonicalConceptArgs,
6830 void *Mem =
Allocate(
sizeof(AutoType) +
6831 sizeof(TemplateArgument) * TypeConstraintArgs.size(),
6833 auto *AT =
new (Mem) AutoType(
6835 (IsDependent ? TypeDependence::DependentInstantiation
6836 : TypeDependence::None) |
6837 (IsPack ? TypeDependence::UnexpandedPack : TypeDependence::None),
6838 Canon, TypeConstraintConcept, TypeConstraintArgs);
6840 llvm::FoldingSetNodeID InsertedID;
6841 AT->Profile(InsertedID, *
this);
6842 assert(InsertedID == ID &&
"ID does not match");
6844 Types.push_back(AT);
6845 AutoTypes.try_emplace(ID, AT);
6846 return QualType(AT, 0);
6854 bool IsDependent,
bool IsPack,
6857 assert((!IsPack || IsDependent) &&
"only use IsPack for a dependent pack");
6858 assert((!IsDependent || DeducedType.
isNull()) &&
6859 "A dependent auto should be undeduced");
6860 return getAutoTypeInternal(DeducedType,
Keyword, IsDependent, IsPack,
6861 TypeConstraintConcept, TypeConstraintArgs);
6868 if (
auto *AT = CanonT->
getAs<AutoType>()) {
6869 if (!AT->isConstrained())
6873 AT->containsUnexpandedParameterPack()),
6885QualType ASTContext::getDeducedTemplateSpecializationTypeInternal(
6887 bool IsDependent,
QualType Canon)
const {
6889 void *InsertPos =
nullptr;
6890 llvm::FoldingSetNodeID ID;
6891 DeducedTemplateSpecializationType::Profile(ID,
Keyword,
Template, DeducedType,
6893 if (DeducedTemplateSpecializationType *DTST =
6894 DeducedTemplateSpecializationTypes.FindNodeOrInsertPos(ID, InsertPos))
6897 auto *DTST =
new (*
this,
alignof(DeducedTemplateSpecializationType))
6899 IsDependent, Canon);
6902 llvm::FoldingSetNodeID TempID;
6903 DTST->Profile(TempID);
6904 assert(ID == TempID &&
"ID does not match");
6906 Types.push_back(DTST);
6907 DeducedTemplateSpecializationTypes.InsertNode(DTST, InsertPos);
6916 bool IsDependent)
const {
6923 ? getDeducedTemplateSpecializationTypeInternal(
6927 return getDeducedTemplateSpecializationTypeInternal(
6936 llvm::FoldingSetNodeID ID;
6939 void *InsertPos =
nullptr;
6940 if (
AtomicType *AT = AtomicTypes.FindNodeOrInsertPos(ID, InsertPos))
6946 if (!T.isCanonical()) {
6950 AtomicType *NewIP = AtomicTypes.FindNodeOrInsertPos(ID, InsertPos);
6951 assert(!NewIP &&
"Shouldn't be in the map!"); (void)NewIP;
6954 Types.push_back(
New);
6955 AtomicTypes.InsertNode(
New, InsertPos);
6986 return getFromTargetType(Target->getSizeType());
7005 return getFromTargetType(Target->getUnsignedPtrDiffType(
LangAS::Default));
7010 return getFromTargetType(Target->getIntMaxType());
7015 return getFromTargetType(Target->getUIntMaxType());
7033 return getFromTargetType(Target->getIntPtrType());
7043 return getFromTargetType(Target->getProcessIDType());
7055 const Type *Ty = T.getTypePtr();
7083 quals = splitType.
Quals;
7088 QualType elementType = AT->getElementType();
7093 if (elementType == unqualElementType) {
7094 assert(quals.
empty());
7095 quals = splitType.
Quals;
7103 if (
const auto *CAT = dyn_cast<ConstantArrayType>(AT)) {
7105 CAT->getSizeExpr(), CAT->getSizeModifier(), 0);
7108 if (
const auto *IAT = dyn_cast<IncompleteArrayType>(AT)) {
7112 if (
const auto *VAT = dyn_cast<VariableArrayType>(AT)) {
7114 VAT->getSizeModifier(),
7115 VAT->getIndexTypeCVRQualifiers());
7120 DSAT->getSizeModifier(), 0);
7130 bool AllowPiMismatch)
const {
7145 if (
auto *CAT1 = dyn_cast<ConstantArrayType>(AT1)) {
7146 auto *CAT2 = dyn_cast<ConstantArrayType>(AT2);
7147 if (!((CAT2 && CAT1->getSize() == CAT2->getSize()) ||
7160 T1 = AT1->getElementType();
7161 T2 = AT2->getElementType();
7181 bool AllowPiMismatch)
const {
7186 if (T1PtrType && T2PtrType) {
7194 T1MPType && T2MPType) {
7195 if (
auto *RD1 = T1MPType->getMostRecentCXXRecordDecl(),
7196 *RD2 = T2MPType->getMostRecentCXXRecordDecl();
7197 RD1 != RD2 && RD1->getCanonicalDecl() != RD2->getCanonicalDecl())
7199 if (T1MPType->getQualifier().getCanonical() !=
7200 T2MPType->getQualifier().getCanonical())
7210 if (T1OPType && T2OPType) {
7242 if (Quals1 != Quals2)
7312 llvm_unreachable(
"bad template name kind!");
7318 if (!TP->hasDefaultArgument())
7320 return &TP->getDefaultArgument().getArgument();
7323 case NamedDecl::TemplateTypeParm:
7325 case NamedDecl::NonTypeTemplateParm:
7327 case NamedDecl::TemplateTemplateParm:
7330 llvm_unreachable(
"Unexpected template parameter kind");
7335 bool IgnoreDeduced)
const {
7336 while (std::optional<TemplateName> UnderlyingOrNone =
7338 Name = *UnderlyingOrNone;
7343 if (
auto *TTP = dyn_cast<TemplateTemplateParmDecl>(
Template))
7355 llvm_unreachable(
"cannot canonicalize overloaded template");
7359 assert(DTN &&
"Non-dependent template names must refer to template decls.");
7378 assert(IgnoreDeduced ==
false);
7385 bool NonCanonical = CanonUnderlying != Underlying;
7391 assert(CanonArgs.size() <= Params.size());
7397 for (
int I = CanonArgs.size() - 1; I >= 0; --I) {
7406 if (I ==
int(CanonArgs.size() - 1))
7407 CanonArgs.pop_back();
7408 NonCanonical =
true;
7418 llvm_unreachable(
"always sugar node");
7421 llvm_unreachable(
"bad template name!");
7426 bool IgnoreDeduced)
const {
7447 llvm::FoldingSetNodeID XCEID, YCEID;
7448 XCE->
Profile(XCEID, *
this,
true,
true);
7449 YCE->
Profile(YCEID, *
this,
true,
true);
7450 return XCEID == YCEID;
7499 if (
auto *TX = dyn_cast<TemplateTypeParmDecl>(
X)) {
7501 if (TX->isParameterPack() != TY->isParameterPack())
7503 if (TX->hasTypeConstraint() != TY->hasTypeConstraint())
7506 TY->getTypeConstraint());
7509 if (
auto *TX = dyn_cast<NonTypeTemplateParmDecl>(
X)) {
7511 return TX->isParameterPack() == TY->isParameterPack() &&
7512 TX->getASTContext().hasSameType(TX->getType(), TY->getType()) &&
7514 TY->getPlaceholderTypeConstraint());
7519 return TX->isParameterPack() == TY->isParameterPack() &&
7521 TY->getTemplateParameters());
7526 if (
X->size() != Y->
size())
7529 for (
unsigned I = 0, N =
X->size(); I != N; ++I)
7543 if (
auto *TTPX = dyn_cast<TemplateTypeParmDecl>(
X)) {
7545 if (!TTPX->hasDefaultArgument() || !TTPY->hasDefaultArgument())
7548 return hasSameType(TTPX->getDefaultArgument().getArgument().getAsType(),
7549 TTPY->getDefaultArgument().getArgument().getAsType());
7552 if (
auto *NTTPX = dyn_cast<NonTypeTemplateParmDecl>(
X)) {
7554 if (!NTTPX->hasDefaultArgument() || !NTTPY->hasDefaultArgument())
7557 Expr *DefaultArgumentX =
7558 NTTPX->getDefaultArgument().getArgument().getAsExpr()->
IgnoreImpCasts();
7559 Expr *DefaultArgumentY =
7560 NTTPY->getDefaultArgument().getArgument().getAsExpr()->
IgnoreImpCasts();
7561 llvm::FoldingSetNodeID XID, YID;
7562 DefaultArgumentX->
Profile(XID, *
this,
true);
7563 DefaultArgumentY->
Profile(YID, *
this,
true);
7570 if (!TTPX->hasDefaultArgument() || !TTPY->hasDefaultArgument())
7585 auto Kind =
X.getKind();
7593 auto [NamespaceX, PrefixX] =
X.getAsNamespaceAndPrefix();
7596 NamespaceY->getNamespace()))
7601 const auto *TX =
X.getAsType(), *TY = Y.
getAsType();
7602 if (TX->getCanonicalTypeInternal() != TY->getCanonicalTypeInternal())
7611 llvm_unreachable(
"unhandled qualifier kind");
7617 if (A->
hasAttr<CUDADeviceAttr>() != B->
hasAttr<CUDADeviceAttr>())
7619 if (A->
hasAttr<CUDADeviceAttr>() && B->
hasAttr<CUDADeviceAttr>())
7631 llvm::FoldingSetNodeID Cand1ID, Cand2ID;
7635 for (
auto Pair : zip_longest(AEnableIfAttrs, BEnableIfAttrs)) {
7636 std::optional<EnableIfAttr *> Cand1A = std::get<0>(Pair);
7637 std::optional<EnableIfAttr *> Cand2A = std::get<1>(Pair);
7640 if (!Cand1A || !Cand2A)
7646 (*Cand1A)->getCond()->Profile(Cand1ID, A->
getASTContext(),
true);
7647 (*Cand2A)->getCond()->Profile(Cand2ID, B->
getASTContext(),
true);
7651 if (Cand1ID != Cand2ID)
7685 if (
const auto *TypedefX = dyn_cast<TypedefNameDecl>(
X))
7686 if (
const auto *TypedefY = dyn_cast<TypedefNameDecl>(Y))
7688 TypedefY->getUnderlyingType());
7705 if (
const auto *TagX = dyn_cast<TagDecl>(
X)) {
7707 return (TagX->getTagKind() == TagY->getTagKind()) ||
7719 if (
const auto *FuncX = dyn_cast<FunctionDecl>(
X)) {
7721 if (
const auto *CtorX = dyn_cast<CXXConstructorDecl>(
X)) {
7723 if (CtorX->getInheritedConstructor() &&
7724 !
isSameEntity(CtorX->getInheritedConstructor().getConstructor(),
7725 CtorY->getInheritedConstructor().getConstructor()))
7729 if (FuncX->isMultiVersion() != FuncY->isMultiVersion())
7734 if (FuncX->isMultiVersion()) {
7735 const auto *TAX = FuncX->getAttr<TargetAttr>();
7736 const auto *TAY = FuncY->getAttr<TargetAttr>();
7737 assert(TAX && TAY &&
"Multiversion Function without target attribute");
7739 if (TAX->getFeaturesStr() != TAY->getFeaturesStr())
7745 if ((FuncX->isMemberLikeConstrainedFriend() ||
7746 FuncY->isMemberLikeConstrainedFriend()) &&
7747 !FuncX->getLexicalDeclContext()->Equals(
7748 FuncY->getLexicalDeclContext())) {
7753 FuncY->getTrailingRequiresClause()))
7761 FD = FD->getCanonicalDecl();
7762 return FD->getTypeSourceInfo() ? FD->getTypeSourceInfo()->getType()
7765 QualType XT = GetTypeAsWritten(FuncX), YT = GetTypeAsWritten(FuncY);
7780 return FuncX->getLinkageInternal() == FuncY->getLinkageInternal() &&
7785 if (
const auto *VarX = dyn_cast<VarDecl>(
X)) {
7787 if (VarX->getLinkageInternal() == VarY->getLinkageInternal()) {
7790 if (VarX->getType().isNull() || VarY->getType().isNull())
7793 if (
hasSameType(VarX->getType(), VarY->getType()))
7803 if (!VarXTy || !VarYTy)
7812 if (
const auto *NamespaceX = dyn_cast<NamespaceDecl>(
X)) {
7814 return NamespaceX->isInline() == NamespaceY->isInline();
7819 if (
const auto *TemplateX = dyn_cast<TemplateDecl>(
X)) {
7823 if (
const auto *ConceptX = dyn_cast<ConceptDecl>(
X)) {
7826 ConceptY->getConstraintExpr()))
7831 TemplateY->getTemplatedDecl()) &&
7833 TemplateY->getTemplateParameters());
7837 if (
const auto *FDX = dyn_cast<FieldDecl>(
X)) {
7840 return hasSameType(FDX->getType(), FDY->getType());
7844 if (
const auto *IFDX = dyn_cast<IndirectFieldDecl>(
X)) {
7846 return IFDX->getAnonField()->getCanonicalDecl() ==
7847 IFDY->getAnonField()->getCanonicalDecl();
7856 if (
const auto *USX = dyn_cast<UsingShadowDecl>(
X)) {
7863 if (
const auto *UX = dyn_cast<UsingDecl>(
X)) {
7866 UX->hasTypename() == UY->hasTypename() &&
7867 UX->isAccessDeclaration() == UY->isAccessDeclaration();
7869 if (
const auto *UX = dyn_cast<UnresolvedUsingValueDecl>(
X)) {
7872 UX->isAccessDeclaration() == UY->isAccessDeclaration();
7874 if (
const auto *UX = dyn_cast<UnresolvedUsingTypenameDecl>(
X)) {
7882 if (
const auto *UX = dyn_cast<UsingPackDecl>(
X)) {
7884 UX->getInstantiatedFromUsingDecl(),
7889 if (
const auto *NAX = dyn_cast<NamespaceAliasDecl>(
X)) {
7891 return NAX->getNamespace()->Equals(NAY->getNamespace());
7939 bool AnyNonCanonArgs =
false;
7942 if (!AnyNonCanonArgs)
7952 llvm_unreachable(
"Unhandled template argument kind");
7962 llvm_unreachable(
"Comparing NULL template argument");
7987 llvm::FoldingSetNodeID ID1, ID2;
7997 return isSameTemplateArgument(Arg1, Arg2);
8001 llvm_unreachable(
"Unhandled template argument kind");
8006 if (!T.hasLocalQualifiers()) {
8008 if (
const auto *AT = dyn_cast<ArrayType>(T))
8028 const auto *ATy = dyn_cast<ArrayType>(split.
Ty);
8029 if (!ATy || qs.
empty())
8036 if (
const auto *CAT = dyn_cast<ConstantArrayType>(ATy))
8039 CAT->getSizeModifier(),
8040 CAT->getIndexTypeCVRQualifiers()));
8041 if (
const auto *IAT = dyn_cast<IncompleteArrayType>(ATy))
8043 IAT->getSizeModifier(),
8044 IAT->getIndexTypeCVRQualifiers()));
8046 if (
const auto *DSAT = dyn_cast<DependentSizedArrayType>(ATy))
8048 NewEltTy, DSAT->getSizeExpr(), DSAT->getSizeModifier(),
8049 DSAT->getIndexTypeCVRQualifiers()));
8054 VAT->getIndexTypeCVRQualifiers()));
8060 if (T->isArrayType() || T->isFunctionType())
8068 return T.getUnqualifiedType();
8079 if (T->isArrayType() || T->isFunctionType())
8081 return T.getUnqualifiedType();
8096 assert(PrettyArrayType &&
"Not an array type!");
8133 uint64_t ElementCount = 1;
8136 CA = dyn_cast_or_null<ConstantArrayType>(
8139 return ElementCount;
8147 uint64_t ElementCount = 1;
8151 AILE = dyn_cast<ArrayInitLoopExpr>(AILE->
getSubExpr());
8154 return ElementCount;
8164 default: llvm_unreachable(
"getFloatingRank(): not a floating type");
8166 case BuiltinType::Half:
return HalfRank;
8167 case BuiltinType::Float:
return FloatRank;
8200unsigned ASTContext::getIntegerRank(
const Type *T)
const {
8201 assert(T->isCanonicalUnqualified() &&
"T should be canonicalized");
8205 if (
const auto *EIT = dyn_cast<BitIntType>(T))
8206 return 0 + (EIT->getNumBits() << 3);
8208 if (
const auto *OBT = dyn_cast<OverflowBehaviorType>(T))
8209 return getIntegerRank(OBT->getUnderlyingType().getTypePtr());
8212 default: llvm_unreachable(
"getIntegerRank(): not a built-in integer");
8213 case BuiltinType::Bool:
8215 case BuiltinType::Char_S:
8216 case BuiltinType::Char_U:
8217 case BuiltinType::SChar:
8218 case BuiltinType::UChar:
8220 case BuiltinType::Short:
8221 case BuiltinType::UShort:
8223 case BuiltinType::Int:
8224 case BuiltinType::UInt:
8226 case BuiltinType::Long:
8227 case BuiltinType::ULong:
8229 case BuiltinType::LongLong:
8230 case BuiltinType::ULongLong:
8232 case BuiltinType::Int128:
8233 case BuiltinType::UInt128:
8238 case BuiltinType::Char8:
8240 case BuiltinType::Char16:
8241 return getIntegerRank(
8243 case BuiltinType::Char32:
8244 return getIntegerRank(
8246 case BuiltinType::WChar_S:
8247 case BuiltinType::WChar_U:
8248 return getIntegerRank(
8278 uint64_t BitWidth = Field->getBitWidthValue();
8304 if (BitWidth < IntSize)
8307 if (BitWidth == IntSize)
8322 assert(!Promotable.
isNull());
8325 return ED->getPromotionType();
8329 if (
const auto *OBT = Promotable->
getAs<OverflowBehaviorType>()) {
8342 if (BT->getKind() == BuiltinType::WChar_S ||
8343 BT->getKind() == BuiltinType::WChar_U ||
8344 BT->getKind() == BuiltinType::Char8 ||
8345 BT->getKind() == BuiltinType::Char16 ||
8346 BT->getKind() == BuiltinType::Char32) {
8347 bool FromIsSigned = BT->getKind() == BuiltinType::WChar_S;
8351 for (
const auto &PT : PromoteTypes) {
8353 if (FromSize < ToSize ||
8354 (FromSize == ToSize && FromIsSigned == PT->isSignedIntegerType()))
8357 llvm_unreachable(
"char type should fit into long long");
8364 uint64_t PromotableSize =
getIntWidth(Promotable);
8373 while (!T.isNull()) {
8375 return T.getObjCLifetime();
8376 if (T->isArrayType())
8378 else if (
const auto *PT = T->getAs<
PointerType>())
8379 T = PT->getPointeeType();
8381 T = RT->getPointeeType();
8406 if (
const auto *ET = dyn_cast<EnumType>(LHSC))
8408 if (
const auto *ET = dyn_cast<EnumType>(RHSC))
8411 if (LHSC == RHSC)
return 0;
8416 unsigned LHSRank = getIntegerRank(LHSC);
8417 unsigned RHSRank = getIntegerRank(RHSC);
8419 if (LHSUnsigned == RHSUnsigned) {
8420 if (LHSRank == RHSRank)
return 0;
8421 return LHSRank > RHSRank ? 1 : -1;
8427 if (LHSRank >= RHSRank)
8437 if (RHSRank >= LHSRank)
8447 if (CFConstantStringTypeDecl)
8448 return CFConstantStringTypeDecl;
8450 assert(!CFConstantStringTagDecl &&
8451 "tag and typedef should be initialized together");
8453 CFConstantStringTagDecl->startDefinition();
8491 if (
static_cast<unsigned>(CFRuntime) <
8494 Fields[Count++] = {
IntTy,
"flags" };
8496 Fields[Count++] = {
LongTy,
"length" };
8500 Fields[Count++] = { getFromTargetType(Target->getUInt64Type()),
"_swift_rc" };
8504 Fields[Count++] = {
IntTy,
"_ptr" };
8510 for (
unsigned i = 0; i < Count; ++i) {
8514 Fields[i].Type,
nullptr,
8517 CFConstantStringTagDecl->addDecl(Field);
8520 CFConstantStringTagDecl->completeDefinition();
8524 CFConstantStringTypeDecl =
8527 return CFConstantStringTypeDecl;
8531 if (!CFConstantStringTagDecl)
8533 return CFConstantStringTagDecl;
8543 if (ObjCSuperType.isNull()) {
8548 return ObjCSuperType;
8554 CFConstantStringTagDecl = TT->castAsRecordDecl();
8558 if (BlockDescriptorType)
8571 static const char *
const FieldNames[] = {
8576 for (
size_t i = 0; i < 2; ++i) {
8579 &
Idents.get(FieldNames[i]), FieldTypes[i],
nullptr,
8587 BlockDescriptorType = RD;
8593 if (BlockDescriptorExtendedType)
8608 static const char *
const FieldNames[] = {
8615 for (
size_t i = 0; i < 4; ++i) {
8618 &
Idents.get(FieldNames[i]), FieldTypes[i],
nullptr,
8627 BlockDescriptorExtendedType = RD;
8632 const auto *BT = dyn_cast<BuiltinType>(T);
8641 switch (BT->getKind()) {
8642#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
8643 case BuiltinType::Id: \
8645#include "clang/Basic/OpenCLImageTypes.def"
8647 case BuiltinType::OCLClkEvent:
8650 case BuiltinType::OCLEvent:
8653 case BuiltinType::OCLQueue:
8656 case BuiltinType::OCLReserveID:
8659 case BuiltinType::OCLSampler:
8678 if (!copyExpr && record->hasTrivialDestructor())
return false;
8709 llvm_unreachable(
"impossible");
8711 llvm_unreachable(
"fell out of lifetime switch!");
8719 bool &HasByrefExtendedLayout)
const {
8724 HasByrefExtendedLayout =
false;
8726 HasByrefExtendedLayout =
true;
8740 assert(Target &&
"Expected target to be initialized");
8741 const llvm::Triple &T = Target->getTriple();
8743 if (T.isOSWindows() && T.isArch64Bit())
8749 assert(Target &&
"Expected target to be initialized");
8750 const llvm::Triple &T = Target->getTriple();
8752 if (T.isOSWindows() && T.isArch64Bit())
8758 if (!ObjCInstanceTypeDecl)
8759 ObjCInstanceTypeDecl =
8761 return ObjCInstanceTypeDecl;
8767 if (
const auto *TT = dyn_cast<TypedefType>(T))
8769 return II->isStr(
"BOOL");
8777 if (!
type->isIncompleteArrayType() &&
type->isIncompleteType())
8786 else if (
type->isArrayType())
8805 if (
First->isInlineSpecified() || !
First->isStaticDataMember())
8812 !D->isInlineSpecified() && (D->isConstexpr() ||
First->isConstexpr()))
8843 for (
auto *PI :
Decl->parameters()) {
8848 assert(sz.
isPositive() &&
"BlockExpr - Incomplete param type");
8857 ParmOffset = PtrSize;
8858 for (
auto *PVDecl :
Decl->parameters()) {
8859 QualType PType = PVDecl->getOriginalType();
8860 if (
const auto *AT =
8865 PType = PVDecl->getType();
8867 PType = PVDecl->getType();
8887 for (
auto *PI :
Decl->parameters()) {
8894 "getObjCEncodingForFunctionDecl - Incomplete param type");
8901 for (
auto *PVDecl :
Decl->parameters()) {
8902 QualType PType = PVDecl->getOriginalType();
8903 if (
const auto *AT =
8908 PType = PVDecl->getType();
8910 PType = PVDecl->getType();
8924 bool Extended)
const {
8928 ObjCEncOptions Options = ObjCEncOptions()
8929 .setExpandPointedToStructures()
8930 .setExpandStructures()
8931 .setIsOutermostType();
8933 Options.setEncodeBlockParameters().setEncodeClassNames();
8934 getObjCEncodingForTypeImpl(T, S, Options,
nullptr);
8940 bool Extended)
const {
8945 Decl->getReturnType(), S, Extended);
8954 E =
Decl->sel_param_end(); PI != E; ++PI) {
8961 "getObjCEncodingForMethodDecl - Incomplete param type");
8969 ParmOffset = 2 * PtrSize;
8971 E =
Decl->sel_param_end(); PI != E; ++PI) {
8974 if (
const auto *AT =
8983 PType, S, Extended);
8994 const Decl *Container)
const {
8997 if (
const auto *CID = dyn_cast<ObjCCategoryImplDecl>(Container)) {
8998 for (
auto *PID : CID->property_impls())
8999 if (PID->getPropertyDecl() == PD)
9003 for (
auto *PID : OID->property_impls())
9004 if (PID->getPropertyDecl() == PD)
9038 const Decl *Container)
const {
9040 bool Dynamic =
false;
9048 SynthesizePID = PropertyImpDecl;
9052 std::string S =
"T";
9097 if (SynthesizePID) {
9114 if (BT->getKind() == BuiltinType::ULong &&
getIntWidth(PointeeTy) == 32)
9117 if (BT->getKind() == BuiltinType::Long &&
getIntWidth(PointeeTy) == 32)
9130 getObjCEncodingForTypeImpl(T, S,
9132 .setExpandPointedToStructures()
9133 .setExpandStructures()
9134 .setIsOutermostType(),
9135 Field, NotEncodedT);
9139 std::string& S)
const {
9143 getObjCEncodingForTypeImpl(T, S,
9145 .setExpandPointedToStructures()
9146 .setExpandStructures()
9147 .setIsOutermostType()
9148 .setEncodingProperty(),
9156 case BuiltinType::Void:
return 'v';
9157 case BuiltinType::Bool:
return 'B';
9158 case BuiltinType::Char8:
9159 case BuiltinType::Char_U:
9160 case BuiltinType::UChar:
return 'C';
9161 case BuiltinType::Char16:
9162 case BuiltinType::UShort:
return 'S';
9163 case BuiltinType::Char32:
9164 case BuiltinType::UInt:
return 'I';
9165 case BuiltinType::ULong:
9166 return C->getTargetInfo().getLongWidth() == 32 ?
'L' :
'Q';
9167 case BuiltinType::UInt128:
return 'T';
9168 case BuiltinType::ULongLong:
return 'Q';
9169 case BuiltinType::Char_S:
9170 case BuiltinType::SChar:
return 'c';
9171 case BuiltinType::Short:
return 's';
9172 case BuiltinType::WChar_S:
9173 case BuiltinType::WChar_U:
9174 case BuiltinType::Int:
return 'i';
9175 case BuiltinType::Long:
9176 return C->getTargetInfo().getLongWidth() == 32 ?
'l' :
'q';
9177 case BuiltinType::LongLong:
return 'q';
9178 case BuiltinType::Int128:
return 't';
9179 case BuiltinType::Float:
return 'f';
9180 case BuiltinType::Double:
return 'd';
9181 case BuiltinType::LongDouble:
return 'D';
9182 case BuiltinType::NullPtr:
return '*';
9184 case BuiltinType::BFloat16:
9185 case BuiltinType::Float16:
9186 case BuiltinType::Float128:
9187 case BuiltinType::Ibm128:
9188 case BuiltinType::Half:
9189 case BuiltinType::ShortAccum:
9190 case BuiltinType::Accum:
9191 case BuiltinType::LongAccum:
9192 case BuiltinType::UShortAccum:
9193 case BuiltinType::UAccum:
9194 case BuiltinType::ULongAccum:
9195 case BuiltinType::ShortFract:
9196 case BuiltinType::Fract:
9197 case BuiltinType::LongFract:
9198 case BuiltinType::UShortFract:
9199 case BuiltinType::UFract:
9200 case BuiltinType::ULongFract:
9201 case BuiltinType::SatShortAccum:
9202 case BuiltinType::SatAccum:
9203 case BuiltinType::SatLongAccum:
9204 case BuiltinType::SatUShortAccum:
9205 case BuiltinType::SatUAccum:
9206 case BuiltinType::SatULongAccum:
9207 case BuiltinType::SatShortFract:
9208 case BuiltinType::SatFract:
9209 case BuiltinType::SatLongFract:
9210 case BuiltinType::SatUShortFract:
9211 case BuiltinType::SatUFract:
9212 case BuiltinType::SatULongFract:
9216#define SVE_TYPE(Name, Id, SingletonId) \
9217 case BuiltinType::Id:
9218#include "clang/Basic/AArch64ACLETypes.def"
9219#define RVV_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
9220#include "clang/Basic/RISCVVTypes.def"
9221#define WASM_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
9222#include "clang/Basic/WebAssemblyReferenceTypes.def"
9223#define AMDGPU_TYPE(Name, Id, SingletonId, Width, Align) case BuiltinType::Id:
9224#include "clang/Basic/AMDGPUTypes.def"
9227 Diags.
Report(diag::err_unsupported_objc_primitive_encoding)
9232 case BuiltinType::ObjCId:
9233 case BuiltinType::ObjCClass:
9234 case BuiltinType::ObjCSel:
9235 llvm_unreachable(
"@encoding ObjC primitive type");
9238#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
9239 case BuiltinType::Id:
9240#include "clang/Basic/OpenCLImageTypes.def"
9241#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
9242 case BuiltinType::Id:
9243#include "clang/Basic/OpenCLExtensionTypes.def"
9244 case BuiltinType::OCLEvent:
9245 case BuiltinType::OCLClkEvent:
9246 case BuiltinType::OCLQueue:
9247 case BuiltinType::OCLReserveID:
9248 case BuiltinType::OCLSampler:
9249 case BuiltinType::Dependent:
9250#define PPC_VECTOR_TYPE(Name, Id, Size) \
9251 case BuiltinType::Id:
9252#include "clang/Basic/PPCTypes.def"
9253#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
9254#include "clang/Basic/HLSLIntangibleTypes.def"
9255#define BUILTIN_TYPE(KIND, ID)
9256#define PLACEHOLDER_TYPE(KIND, ID) \
9257 case BuiltinType::KIND:
9258#include "clang/AST/BuiltinTypes.def"
9259 llvm_unreachable(
"invalid builtin type for @encode");
9261 llvm_unreachable(
"invalid BuiltinType::Kind value");
9268 if (!
Enum->isFixed())
9278 assert(FD->
isBitField() &&
"not a bitfield - getObjCEncodingForTypeImpl");
9298 if (
const auto *IVD = dyn_cast<ObjCIvarDecl>(FD)) {
9306 S += llvm::utostr(Offset);
9321 bool VisitBasesAndFields) {
9322 T = T->getBaseElementTypeUnsafe();
9326 PT->getPointeeType().getTypePtr(),
false);
9328 auto *CXXRD = T->getAsCXXRecordDecl();
9336 if (!CXXRD->hasDefinition() || !VisitBasesAndFields)
9339 for (
const auto &B : CXXRD->bases())
9344 for (
auto *FD : CXXRD->fields())
9353void ASTContext::getObjCEncodingForTypeImpl(QualType T, std::string &S,
9354 const ObjCEncOptions Options,
9355 const FieldDecl *FD,
9356 QualType *NotEncodedT)
const {
9358 switch (CT->getTypeClass()) {
9363 if (
const auto *BT = dyn_cast<BuiltinType>(CT))
9371 getObjCEncodingForTypeImpl(T->
castAs<ComplexType>()->getElementType(), S,
9378 getObjCEncodingForTypeImpl(T->
castAs<AtomicType>()->getValueType(), S,
9385 case Type::LValueReference:
9386 case Type::RValueReference: {
9389 const auto *PT = T->
castAs<PointerType>();
9390 if (PT->isObjCSelType()) {
9399 bool isReadOnly =
false;
9404 if (T->
getAs<TypedefType>()) {
9409 }
else if (Options.IsOutermostType()) {
9410 QualType P = PointeeTy;
9411 while (
auto PT = P->
getAs<PointerType>())
9422 if (StringRef(S).ends_with(
"nr"))
9423 S.replace(S.end()-2, S.end(),
"rn");
9433 }
else if (
const auto *RTy = PointeeTy->
getAsCanonical<RecordType>()) {
9434 const IdentifierInfo *II = RTy->getDecl()->getIdentifier();
9436 if (II == &
Idents.get(
"objc_class")) {
9441 if (II == &
Idents.get(
"objc_object")) {
9450 RTy, Options.ExpandPointedToStructures()))) {
9459 ObjCEncOptions NewOptions;
9460 if (Options.ExpandPointedToStructures())
9461 NewOptions.setExpandStructures();
9462 getObjCEncodingForTypeImpl(PointeeTy, S, NewOptions,
9463 nullptr, NotEncodedT);
9467 case Type::ConstantArray:
9468 case Type::IncompleteArray:
9469 case Type::VariableArray: {
9476 getObjCEncodingForTypeImpl(
9477 AT->getElementType(), S,
9478 Options.keepingOnly(ObjCEncOptions().setExpandStructures()), FD);
9482 if (
const auto *CAT = dyn_cast<ConstantArrayType>(AT))
9483 S += llvm::utostr(CAT->getZExtSize());
9487 "Unknown array type!");
9491 getObjCEncodingForTypeImpl(
9492 AT->getElementType(), S,
9493 Options.keepingOnly(ObjCEncOptions().setExpandStructures()), FD,
9500 case Type::FunctionNoProto:
9501 case Type::FunctionProto:
9505 case Type::Record: {
9507 S += RDecl->
isUnion() ?
'(' :
'{';
9511 if (
const auto *Spec = dyn_cast<ClassTemplateSpecializationDecl>(RDecl)) {
9512 const TemplateArgumentList &TemplateArgs = Spec->getTemplateArgs();
9513 llvm::raw_string_ostream
OS(S);
9514 printTemplateArgumentList(OS, TemplateArgs.
asArray(),
9520 if (Options.ExpandStructures()) {
9523 getObjCEncodingForStructureImpl(RDecl, S, FD,
true, NotEncodedT);
9525 for (
const auto *Field : RDecl->
fields()) {
9528 S +=
Field->getNameAsString();
9533 if (
Field->isBitField()) {
9534 getObjCEncodingForTypeImpl(
Field->getType(), S,
9535 ObjCEncOptions().setExpandStructures(),
9538 QualType qt =
Field->getType();
9540 getObjCEncodingForTypeImpl(
9542 ObjCEncOptions().setExpandStructures().setIsStructField(), FD,
9548 S += RDecl->
isUnion() ?
')' :
'}';
9552 case Type::BlockPointer: {
9553 const auto *BT = T->
castAs<BlockPointerType>();
9555 if (Options.EncodeBlockParameters()) {
9556 const auto *FT = BT->getPointeeType()->castAs<FunctionType>();
9560 getObjCEncodingForTypeImpl(FT->getReturnType(), S,
9561 Options.forComponentType(), FD, NotEncodedT);
9565 if (
const auto *FPT = dyn_cast<FunctionProtoType>(FT)) {
9566 for (
const auto &I : FPT->param_types())
9567 getObjCEncodingForTypeImpl(I, S, Options.forComponentType(), FD,
9575 case Type::ObjCObject: {
9579 S +=
"{objc_object=}";
9583 S +=
"{objc_class=}";
9590 case Type::ObjCInterface: {
9593 ObjCInterfaceDecl *OI = T->
castAs<ObjCObjectType>()->getInterface();
9596 if (Options.ExpandStructures()) {
9598 SmallVector<const ObjCIvarDecl*, 32> Ivars;
9600 for (
unsigned i = 0, e = Ivars.size(); i != e; ++i) {
9601 const FieldDecl *
Field = Ivars[i];
9602 if (
Field->isBitField())
9603 getObjCEncodingForTypeImpl(
Field->getType(), S,
9604 ObjCEncOptions().setExpandStructures(),
9607 getObjCEncodingForTypeImpl(
Field->getType(), S,
9608 ObjCEncOptions().setExpandStructures(), FD,
9616 case Type::ObjCObjectPointer: {
9617 const auto *OPT = T->
castAs<ObjCObjectPointerType>();
9618 if (OPT->isObjCIdType()) {
9623 if (OPT->isObjCClassType() || OPT->isObjCQualifiedClassType()) {
9631 if (OPT->isObjCQualifiedIdType()) {
9632 getObjCEncodingForTypeImpl(
9634 Options.keepingOnly(ObjCEncOptions()
9635 .setExpandPointedToStructures()
9636 .setExpandStructures()),
9638 if (FD || Options.EncodingProperty() || Options.EncodeClassNames()) {
9642 for (
const auto *I : OPT->quals()) {
9644 S += I->getObjCRuntimeNameAsString();
9653 if (OPT->getInterfaceDecl() &&
9654 (FD || Options.EncodingProperty() || Options.EncodeClassNames())) {
9656 S += OPT->getInterfaceDecl()->getObjCRuntimeNameAsString();
9657 for (
const auto *I : OPT->quals()) {
9659 S += I->getObjCRuntimeNameAsString();
9669 case Type::MemberPointer:
9673 case Type::ExtVector:
9679 case Type::ConstantMatrix:
9692 case Type::DeducedTemplateSpecialization:
9695 case Type::HLSLAttributedResource:
9696 case Type::HLSLInlineSpirv:
9697 case Type::OverflowBehavior:
9698 llvm_unreachable(
"unexpected type");
9700 case Type::ArrayParameter:
9702#define ABSTRACT_TYPE(KIND, BASE)
9703#define TYPE(KIND, BASE)
9704#define DEPENDENT_TYPE(KIND, BASE) \
9706#define NON_CANONICAL_TYPE(KIND, BASE) \
9708#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(KIND, BASE) \
9710#include "clang/AST/TypeNodes.inc"
9711 llvm_unreachable(
"@encode for dependent type!");
9713 llvm_unreachable(
"bad type kind!");
9716void ASTContext::getObjCEncodingForStructureImpl(RecordDecl *RDecl,
9718 const FieldDecl *FD,
9720 QualType *NotEncodedT)
const {
9721 assert(RDecl &&
"Expected non-null RecordDecl");
9722 assert(!RDecl->
isUnion() &&
"Should not be called for unions");
9726 const auto *CXXRec = dyn_cast<CXXRecordDecl>(RDecl);
9727 std::multimap<uint64_t, NamedDecl *> FieldOrBaseOffsets;
9731 for (
const auto &BI : CXXRec->bases()) {
9732 if (!BI.isVirtual()) {
9737 FieldOrBaseOffsets.insert(FieldOrBaseOffsets.upper_bound(offs),
9738 std::make_pair(offs, base));
9743 for (FieldDecl *Field : RDecl->
fields()) {
9744 if (!
Field->isZeroLengthBitField() &&
Field->isZeroSize(*
this))
9747 FieldOrBaseOffsets.insert(FieldOrBaseOffsets.upper_bound(offs),
9748 std::make_pair(offs, Field));
9751 if (CXXRec && includeVBases) {
9752 for (
const auto &BI : CXXRec->vbases()) {
9758 FieldOrBaseOffsets.find(offs) == FieldOrBaseOffsets.end())
9759 FieldOrBaseOffsets.insert(FieldOrBaseOffsets.end(),
9760 std::make_pair(offs, base));
9774 std::multimap<uint64_t, NamedDecl *>::iterator
9775 CurLayObj = FieldOrBaseOffsets.begin();
9777 if (CXXRec && CXXRec->isDynamicClass() &&
9778 (CurLayObj == FieldOrBaseOffsets.end() || CurLayObj->first != 0)) {
9781 std::string recname = CXXRec->getNameAsString();
9782 if (recname.empty()) recname =
"?";
9795 FieldOrBaseOffsets.insert(FieldOrBaseOffsets.upper_bound(offs),
9796 std::make_pair(offs,
nullptr));
9799 for (; CurLayObj != FieldOrBaseOffsets.end(); ++CurLayObj) {
9801 assert(CurOffs <= CurLayObj->first);
9802 if (CurOffs < CurLayObj->first) {
9803 uint64_t padding = CurLayObj->first - CurOffs;
9815 NamedDecl *dcl = CurLayObj->second;
9819 if (
auto *base = dyn_cast<CXXRecordDecl>(dcl)) {
9824 getObjCEncodingForStructureImpl(base, S, FD,
false,
9834 S += field->getNameAsString();
9838 if (field->isBitField()) {
9841 CurOffs += field->getBitWidthValue();
9844 QualType qt = field->getType();
9846 getObjCEncodingForTypeImpl(
9847 qt, S, ObjCEncOptions().setExpandStructures().setIsStructField(),
9858 std::string& S)
const {
9891 if (!ObjCClassDecl) {
9896 return ObjCClassDecl;
9900 if (!ObjCProtocolClassDecl) {
9901 ObjCProtocolClassDecl
9910 return ObjCProtocolClassDecl;
9931 QualType T = Context->getPointerType(Context->CharTy);
9932 return Context->buildImplicitTypedef(T, Name);
9945 QualType T = Context->getPointerType(Context->VoidTy);
9946 return Context->buildImplicitTypedef(T,
"__builtin_va_list");
9953 if (Context->getLangOpts().CPlusPlus) {
9958 &Context->Idents.get(
"std"),
9966 const size_t NumFields = 5;
9968 const char *FieldNames[NumFields];
9971 FieldTypes[0] = Context->getPointerType(Context->VoidTy);
9972 FieldNames[0] =
"__stack";
9975 FieldTypes[1] = Context->getPointerType(Context->VoidTy);
9976 FieldNames[1] =
"__gr_top";
9979 FieldTypes[2] = Context->getPointerType(Context->VoidTy);
9980 FieldNames[2] =
"__vr_top";
9983 FieldTypes[3] = Context->IntTy;
9984 FieldNames[3] =
"__gr_offs";
9987 FieldTypes[4] = Context->IntTy;
9988 FieldNames[4] =
"__vr_offs";
9991 for (
unsigned i = 0; i < NumFields; ++i) {
9996 &Context->Idents.get(FieldNames[i]),
9997 FieldTypes[i],
nullptr,
10009 return Context->buildImplicitTypedef(VaListTagType,
"__builtin_va_list");
10016 VaListTagDecl = Context->buildImplicitRecord(
"__va_list_tag");
10019 const size_t NumFields = 5;
10021 const char *FieldNames[NumFields];
10024 FieldTypes[0] = Context->UnsignedCharTy;
10025 FieldNames[0] =
"gpr";
10028 FieldTypes[1] = Context->UnsignedCharTy;
10029 FieldNames[1] =
"fpr";
10032 FieldTypes[2] = Context->UnsignedShortTy;
10033 FieldNames[2] =
"reserved";
10036 FieldTypes[3] = Context->getPointerType(Context->VoidTy);
10037 FieldNames[3] =
"overflow_arg_area";
10040 FieldTypes[4] = Context->getPointerType(Context->VoidTy);
10041 FieldNames[4] =
"reg_save_area";
10044 for (
unsigned i = 0; i < NumFields; ++i) {
10048 &Context->Idents.get(FieldNames[i]),
10049 FieldTypes[i],
nullptr,
10062 Context->buildImplicitTypedef(VaListTagType,
"__va_list_tag");
10066 std::nullopt, VaListTagTypedefDecl);
10069 llvm::APInt Size(Context->getTypeSize(Context->getSizeType()), 1);
10070 QualType VaListTagArrayType = Context->getConstantArrayType(
10072 return Context->buildImplicitTypedef(VaListTagArrayType,
"__builtin_va_list");
10075static TypedefDecl *
10079 VaListTagDecl = Context->buildImplicitRecord(
"__va_list_tag");
10082 const size_t NumFields = 4;
10084 const char *FieldNames[NumFields];
10087 FieldTypes[0] = Context->UnsignedIntTy;
10088 FieldNames[0] =
"gp_offset";
10091 FieldTypes[1] = Context->UnsignedIntTy;
10092 FieldNames[1] =
"fp_offset";
10095 FieldTypes[2] = Context->getPointerType(Context->VoidTy);
10096 FieldNames[2] =
"overflow_arg_area";
10099 FieldTypes[3] = Context->getPointerType(Context->VoidTy);
10100 FieldNames[3] =
"reg_save_area";
10103 for (
unsigned i = 0; i < NumFields; ++i) {
10108 &Context->Idents.get(FieldNames[i]),
10109 FieldTypes[i],
nullptr,
10123 llvm::APInt Size(Context->getTypeSize(Context->getSizeType()), 1);
10124 QualType VaListTagArrayType = Context->getConstantArrayType(
10126 return Context->buildImplicitTypedef(VaListTagArrayType,
"__builtin_va_list");
10129static TypedefDecl *
10132 RecordDecl *VaListDecl = Context->buildImplicitRecord(
"__va_list");
10133 if (Context->getLangOpts().CPlusPlus) {
10152 &Context->Idents.get(
"__ap"),
10153 Context->getPointerType(Context->VoidTy),
10163 Context->VaListTagDecl = VaListDecl;
10166 CanQualType T = Context->getCanonicalTagType(VaListDecl);
10167 return Context->buildImplicitTypedef(T,
"__builtin_va_list");
10170static TypedefDecl *
10174 VaListTagDecl = Context->buildImplicitRecord(
"__va_list_tag");
10177 const size_t NumFields = 4;
10179 const char *FieldNames[NumFields];
10182 FieldTypes[0] = Context->LongTy;
10183 FieldNames[0] =
"__gpr";
10186 FieldTypes[1] = Context->LongTy;
10187 FieldNames[1] =
"__fpr";
10190 FieldTypes[2] = Context->getPointerType(Context->VoidTy);
10191 FieldNames[2] =
"__overflow_arg_area";
10194 FieldTypes[3] = Context->getPointerType(Context->VoidTy);
10195 FieldNames[3] =
"__reg_save_area";
10198 for (
unsigned i = 0; i < NumFields; ++i) {
10203 &Context->Idents.get(FieldNames[i]),
10204 FieldTypes[i],
nullptr,
10218 llvm::APInt Size(Context->getTypeSize(Context->getSizeType()), 1);
10219 QualType VaListTagArrayType = Context->getConstantArrayType(
10222 return Context->buildImplicitTypedef(VaListTagArrayType,
"__builtin_va_list");
10228 VaListTagDecl = Context->buildImplicitRecord(
"__va_list_tag");
10231 const size_t NumFields = 3;
10233 const char *FieldNames[NumFields];
10236 FieldTypes[0] = Context->getPointerType(Context->VoidTy);
10237 FieldNames[0] =
"__current_saved_reg_area_pointer";
10240 FieldTypes[1] = Context->getPointerType(Context->VoidTy);
10241 FieldNames[1] =
"__saved_reg_area_end_pointer";
10244 FieldTypes[2] = Context->getPointerType(Context->VoidTy);
10245 FieldNames[2] =
"__overflow_area_pointer";
10248 for (
unsigned i = 0; i < NumFields; ++i) {
10251 SourceLocation(), &Context->Idents.get(FieldNames[i]), FieldTypes[i],
10264 Context->buildImplicitTypedef(VaListTagType,
"__va_list_tag");
10268 std::nullopt, VaListTagTypedefDecl);
10271 llvm::APInt Size(Context->getTypeSize(Context->getSizeType()), 1);
10272 QualType VaListTagArrayType = Context->getConstantArrayType(
10275 return Context->buildImplicitTypedef(VaListTagArrayType,
"__builtin_va_list");
10278static TypedefDecl *
10288 constexpr size_t NumFields = 3;
10289 QualType FieldTypes[NumFields] = {Context->getPointerType(Context->IntTy),
10290 Context->getPointerType(Context->IntTy),
10292 const char *FieldNames[NumFields] = {
"__va_stk",
"__va_reg",
"__va_ndx"};
10295 for (
unsigned i = 0; i < NumFields; ++i) {
10298 &Context->Idents.get(FieldNames[i]), FieldTypes[i],
nullptr,
10310 Context->buildImplicitTypedef(VaListTagType,
"__builtin_va_list");
10312 return VaListTagTypedefDecl;
10338 llvm_unreachable(
"Unhandled __builtin_va_list type kind");
10342 if (!BuiltinVaListDecl) {
10343 BuiltinVaListDecl =
CreateVaListDecl(
this, Target->getBuiltinVaListKind());
10344 assert(BuiltinVaListDecl->isImplicit());
10347 return BuiltinVaListDecl;
10360 if (!BuiltinMSVaListDecl)
10363 return BuiltinMSVaListDecl;
10380 assert(ObjCConstantStringType.isNull() &&
10381 "'NSConstantString' type already set!");
10391 unsigned size = End - Begin;
10392 assert(size > 1 &&
"set is not overloaded!");
10398 NamedDecl **Storage = OT->getStorage();
10421 bool TemplateKeyword,
10426 if (
Template.getAsTemplateDecl()->getKind() == Decl::TemplateTemplateParm) {
10427 assert(!Qualifier &&
"unexpected qualified template template parameter");
10428 assert(TemplateKeyword ==
false);
10433 llvm::FoldingSetNodeID ID;
10436 void *InsertPos =
nullptr;
10438 QualifiedTemplateNames.FindNodeOrInsertPos(ID, InsertPos);
10442 QualifiedTemplateNames.InsertNode(QTN, InsertPos);
10452 llvm::FoldingSetNodeID ID;
10455 void *InsertPos =
nullptr;
10457 DependentTemplateNames.FindNodeOrInsertPos(ID, InsertPos))
10462 DependentTemplateNames.InsertNode(QTN, InsertPos);
10467 Decl *AssociatedDecl,
10470 bool Final)
const {
10471 llvm::FoldingSetNodeID ID;
10473 Index, PackIndex, Final);
10475 void *insertPos =
nullptr;
10477 = SubstTemplateTemplateParms.FindNodeOrInsertPos(ID, insertPos);
10481 Replacement, AssociatedDecl, Index, PackIndex, Final);
10482 SubstTemplateTemplateParms.InsertNode(subst, insertPos);
10490 Decl *AssociatedDecl,
10491 unsigned Index,
bool Final)
const {
10493 llvm::FoldingSetNodeID ID;
10495 AssociatedDecl, Index, Final);
10497 void *InsertPos =
nullptr;
10499 = SubstTemplateTemplateParmPacks.FindNodeOrInsertPos(ID, InsertPos);
10504 SubstTemplateTemplateParmPacks.InsertNode(Subst, InsertPos);
10518 llvm::FoldingSetNodeID ID;
10521 void *InsertPos =
nullptr;
10523 DeducedTemplates.FindNodeOrInsertPos(ID, InsertPos);
10529 DeducedTemplates.InsertNode(DTS, InsertPos);
10552 llvm_unreachable(
"Unhandled TargetInfo::IntType value");
10582 while (
const auto *AT = dyn_cast<ArrayType>(CT))
10583 CT = AT->getElementType();
10615 assert(FirstVec->
isVectorType() &&
"FirstVec should be a vector type");
10616 assert(SecondVec->
isVectorType() &&
"SecondVec should be a vector type");
10673 const auto *LHSOBT = LHS->
getAs<OverflowBehaviorType>();
10674 const auto *RHSOBT = RHS->
getAs<OverflowBehaviorType>();
10676 if (!LHSOBT && !RHSOBT)
10679 if (LHSOBT && RHSOBT) {
10680 if (LHSOBT->getBehaviorKind() != RHSOBT->getBehaviorKind())
10685 QualType LHSUnderlying = LHSOBT ? LHSOBT->desugar() : LHS;
10686 QualType RHSUnderlying = RHSOBT ? RHSOBT->desugar() : RHS;
10688 if (RHSOBT && !LHSOBT) {
10699 auto VScale = Context.getTargetInfo().getVScaleRange(
10706 uint64_t EltSize = Context.getTypeSize(Info.
ElementType);
10710 uint64_t MinElts = Info.
EC.getKnownMinValue();
10711 return VScale->first * MinElts * EltSize;
10719 "Expected RVV builtin type and vector type!");
10759 return IsValidCast(FirstType, SecondType) ||
10760 IsValidCast(SecondType, FirstType);
10768 "Expected RVV builtin type and vector type!");
10775 if (!BT->isRVVVLSBuiltinType())
10795 return VecTy->getElementType().getCanonicalType()->isIntegerType() &&
10802 return IsLaxCompatible(FirstType, SecondType) ||
10803 IsLaxCompatible(SecondType, FirstType);
10809 if (
const AttributedType *
Attr = dyn_cast<AttributedType>(Ty)) {
10810 if (
Attr->getAttrKind() == attr::ObjCOwnership)
10813 Ty =
Attr->getModifiedType();
10817 Ty =
Paren->getInnerType();
10849 for (
auto *lhsProto : lhs->
quals()) {
10850 bool match =
false;
10851 for (
auto *rhsProto : rhs->
quals()) {
10882 for (
auto *I : lhs->
quals()) {
10886 if (!rhsID->ClassImplementsProtocol(I,
true))
10894 for (
auto *lhsProto : lhs->
quals()) {
10895 bool match =
false;
10900 for (
auto *rhsProto : rhs->
quals()) {
10910 for (
auto *I : lhs->
quals()) {
10914 if (rhsID->ClassImplementsProtocol(I,
true)) {
10931 for (
auto *lhsProto : lhs->
quals()) {
10932 bool match =
false;
10939 for (
auto *rhsProto : rhs->
quals()) {
10958 if (LHSInheritedProtocols.empty() && lhs->
qual_empty())
10960 for (
auto *lhsProto : LHSInheritedProtocols) {
10961 bool match =
false;
10962 for (
auto *rhsProto : rhs->
quals()) {
10987 if (LHS->isObjCUnqualifiedId() || RHS->isObjCUnqualifiedId())
10992 auto finish = [&](
bool succeeded) ->
bool {
10996 if (!RHS->isKindOfType())
11007 if (LHS->isObjCQualifiedId() || RHS->isObjCQualifiedId()) {
11012 if (LHS->isObjCQualifiedClass() && RHS->isObjCQualifiedClass()) {
11017 if (LHS->isObjCClass() && RHS->isObjCClass()) {
11022 if (LHS->getInterface() && RHS->getInterface()) {
11037 bool BlockReturnType) {
11041 auto finish = [&](
bool succeeded) ->
bool {
11066 if (
getLangOpts().CompatibilityQualifiedIdBlockParamTypeChecking)
11070 (!BlockReturnType &&
11074 (BlockReturnType ? LHSOPT : RHSOPT),
11075 (BlockReturnType ? RHSOPT : LHSOPT),
false));
11083 return finish(BlockReturnType);
11085 return finish(!BlockReturnType);
11097 return (*lhs)->getName().compare((*rhs)->getName());
11114 assert(LHS->getInterface() &&
"LHS must have an interface base");
11115 assert(RHS->getInterface() &&
"RHS must have an interface base");
11121 for (
auto *proto : LHS->quals()) {
11122 Context.CollectInheritedProtocols(proto, LHSProtocolSet);
11126 Context.CollectInheritedProtocols(LHS->getInterface(), LHSProtocolSet);
11132 for (
auto *proto : RHS->quals()) {
11133 Context.CollectInheritedProtocols(proto, RHSProtocolSet);
11137 Context.CollectInheritedProtocols(RHS->getInterface(), RHSProtocolSet);
11140 for (
auto *proto : LHSProtocolSet) {
11141 if (RHSProtocolSet.count(proto))
11142 IntersectionSet.push_back(proto);
11148 Context.CollectInheritedProtocols(CommonBase, ImpliedProtocols);
11151 if (!ImpliedProtocols.empty()) {
11153 return ImpliedProtocols.contains(proto);
11158 llvm::array_pod_sort(IntersectionSet.begin(), IntersectionSet.end(),
11168 if (lhsOPT && rhsOPT)
11174 if (lhsBlock && rhsBlock)
11179 if ((lhsOPT && lhsOPT->isObjCIdType() && rhsBlock) ||
11191 bool stripKindOf) {
11192 if (lhsArgs.size() != rhsArgs.size())
11199 for (
unsigned i = 0, n = lhsArgs.size(); i != n; ++i) {
11205 if (!stripKindOf ||
11206 !ctx.
hasSameType(lhsArgs[i].stripObjCKindOfType(ctx),
11207 rhsArgs[i].stripObjCKindOfType(ctx))) {
11235 if (!LDecl || !RDecl)
11241 bool anyKindOf = LHS->isKindOfType() || RHS->isKindOfType();
11245 llvm::SmallDenseMap<const ObjCInterfaceDecl *, const ObjCObjectType *, 4>
11250 LHSAncestors[LHS->getInterface()->getCanonicalDecl()] = LHS;
11255 bool anyChanges =
false;
11256 if (LHS->isSpecialized() && RHS->isSpecialized()) {
11259 LHS->getTypeArgs(), RHS->getTypeArgs(),
11262 }
else if (LHS->isSpecialized() != RHS->isSpecialized()) {
11273 if (!Protocols.empty())
11279 if (anyChanges || LHS->isKindOfType() != anyKindOf) {
11282 anyKindOf || LHS->isKindOfType());
11290 QualType LHSSuperType = LHS->getSuperClassType();
11291 if (LHSSuperType.
isNull())
11300 auto KnownLHS = LHSAncestors.find(RHS->getInterface()->getCanonicalDecl());
11301 if (KnownLHS != LHSAncestors.end()) {
11302 LHS = KnownLHS->second;
11306 bool anyChanges =
false;
11307 if (LHS->isSpecialized() && RHS->isSpecialized()) {
11310 LHS->getTypeArgs(), RHS->getTypeArgs(),
11313 }
else if (LHS->isSpecialized() != RHS->isSpecialized()) {
11324 if (!Protocols.empty())
11329 if (anyChanges || RHS->isKindOfType() != anyKindOf) {
11332 anyKindOf || RHS->isKindOfType());
11340 QualType RHSSuperType = RHS->getSuperClassType();
11341 if (RHSSuperType.
isNull())
11352 assert(LHS->getInterface() &&
"LHS is not an interface type");
11353 assert(RHS->getInterface() &&
"RHS is not an interface type");
11358 bool IsSuperClass = LHSInterface->
isSuperClassOf(RHS->getInterface());
11365 if (LHS->getNumProtocols() > 0) {
11374 for (
auto *RHSPI : RHS->quals())
11377 if (SuperClassInheritedProtocols.empty())
11380 for (
const auto *LHSProto : LHS->quals()) {
11381 bool SuperImplementsProtocol =
false;
11382 for (
auto *SuperClassProto : SuperClassInheritedProtocols)
11383 if (SuperClassProto->lookupProtocolNamed(LHSProto->getIdentifier())) {
11384 SuperImplementsProtocol =
true;
11387 if (!SuperImplementsProtocol)
11393 if (LHS->isSpecialized()) {
11398 RHSSuper = RHSSuper->getSuperClassType()->castAs<
ObjCObjectType>();
11401 if (RHSSuper->isSpecialized() &&
11403 LHS->getTypeArgs(), RHSSuper->getTypeArgs(),
11417 if (!LHSOPT || !RHSOPT)
11435 bool CompareUnqualified) {
11454 bool OfBlockPointer,
11456 if (
const RecordType *UT = T->getAsUnionType()) {
11458 if (UD->
hasAttr<TransparentUnionAttr>()) {
11459 for (
const auto *I : UD->
fields()) {
11460 QualType ET = I->getType().getUnqualifiedType();
11474 bool OfBlockPointer,
11495 bool IsConditionalOperator) {
11498 const auto *lproto = dyn_cast<FunctionProtoType>(lbase);
11499 const auto *rproto = dyn_cast<FunctionProtoType>(rbase);
11500 bool allLTypes =
true;
11501 bool allRTypes =
true;
11505 if (OfBlockPointer) {
11507 QualType LHS = lbase->getReturnType();
11509 if (!UnqualifiedResult)
11511 retType =
mergeTypes(LHS, RHS,
true, UnqualifiedResult,
true);
11576 bool NoReturn = IsConditionalOperator
11586 std::optional<FunctionEffectSet> MergedFX;
11588 if (lproto && rproto) {
11589 assert((AllowCXX ||
11590 (!lproto->hasExceptionSpec() && !rproto->hasExceptionSpec())) &&
11591 "C++ shouldn't be here");
11593 if (lproto->getNumParams() != rproto->getNumParams())
11597 if (lproto->isVariadic() != rproto->isVariadic())
11600 if (lproto->getMethodQuals() != rproto->getMethodQuals())
11604 if (lproto->getExtraAttributeInfo().CFISalt !=
11605 rproto->getExtraAttributeInfo().CFISalt)
11611 if (LHSFX != RHSFX) {
11612 if (IsConditionalOperator)
11621 if (*MergedFX != LHSFX)
11623 if (*MergedFX != RHSFX)
11628 bool canUseLeft, canUseRight;
11640 for (
unsigned i = 0, n = lproto->getNumParams(); i < n; i++) {
11641 QualType lParamType = lproto->getParamType(i).getUnqualifiedType();
11642 QualType rParamType = rproto->getParamType(i).getUnqualifiedType();
11644 lParamType, rParamType, OfBlockPointer,
Unqualified);
11651 types.push_back(paramType);
11663 if (allLTypes)
return lhs;
11664 if (allRTypes)
return rhs;
11669 newParamInfos.empty() ?
nullptr : newParamInfos.data();
11675 if (lproto) allRTypes =
false;
11676 if (rproto) allLTypes =
false;
11680 assert((AllowCXX || !proto->
hasExceptionSpec()) &&
"C++ shouldn't be here");
11688 for (
unsigned i = 0, n = proto->
getNumParams(); i < n; ++i) {
11694 paramTy = ED->getIntegerType();
11704 if (allLTypes)
return lhs;
11705 if (allRTypes)
return rhs;
11714 if (allLTypes)
return lhs;
11715 if (allRTypes)
return rhs;
11721 QualType other,
bool isBlockReturnType) {
11727 ET->getDecl()->getDefinitionOrSelf()->getIntegerType();
11728 if (underlyingType.
isNull())
11730 if (Context.hasSameType(underlyingType, other))
11736 Context.getTypeSize(underlyingType) == Context.getTypeSize(other))
11745 if (LangOpts.CPlusPlus || !LangOpts.C23)
11766 bool BlockReturnType,
bool IsConditionalOperator) {
11767 const auto *LHSOBT = LHS->
getAs<OverflowBehaviorType>();
11768 const auto *RHSOBT = RHS->
getAs<OverflowBehaviorType>();
11770 if (!LHSOBT && !RHSOBT)
11771 return std::nullopt;
11775 if (LHSOBT->getBehaviorKind() != RHSOBT->getBehaviorKind())
11779 LHSOBT->getUnderlyingType(), RHSOBT->getUnderlyingType(),
11780 OfBlockPointer,
Unqualified, BlockReturnType, IsConditionalOperator);
11782 if (MergedUnderlying.
isNull())
11786 if (LHSOBT->getUnderlyingType() == RHSOBT->getUnderlyingType())
11789 LHSOBT->getBehaviorKind(),
11798 return mergeTypes(LHSOBT->getUnderlyingType(), RHS, OfBlockPointer,
11799 Unqualified, BlockReturnType, IsConditionalOperator);
11802 return mergeTypes(LHS, RHSOBT->getUnderlyingType(), OfBlockPointer,
11803 Unqualified, BlockReturnType, IsConditionalOperator);
11808 bool IsConditionalOperator) {
11819 if (LangOpts.OpenMP && LHSRefTy && RHSRefTy &&
11823 if (LHSRefTy || RHSRefTy)
11826 if (std::optional<QualType> MergedOBT =
11828 BlockReturnType, IsConditionalOperator))
11840 if (LHSCan == RHSCan)
11845 Qualifiers RQuals = RHSCan.getLocalQualifiers();
11846 if (LQuals != RQuals) {
11863 assert((GC_L != GC_R) &&
"unequal qualifier sets had only equal elements");
11884 if (LHSClass == Type::FunctionProto) LHSClass = Type::FunctionNoProto;
11885 if (RHSClass == Type::FunctionProto) RHSClass = Type::FunctionNoProto;
11888 if (LHSClass == Type::VariableArray || LHSClass == Type::IncompleteArray)
11889 LHSClass = Type::ConstantArray;
11890 if (RHSClass == Type::VariableArray || RHSClass == Type::IncompleteArray)
11891 RHSClass = Type::ConstantArray;
11894 if (LHSClass == Type::ObjCInterface) LHSClass = Type::ObjCObject;
11895 if (RHSClass == Type::ObjCInterface) RHSClass = Type::ObjCObject;
11898 if (LHSClass == Type::ExtVector) LHSClass = Type::Vector;
11899 if (RHSClass == Type::ExtVector) RHSClass = Type::Vector;
11902 if (LHSClass != RHSClass) {
11912 if (OfBlockPointer && !BlockReturnType) {
11920 if (
const auto *AT = LHS->
getAs<AutoType>()) {
11921 if (!AT->isDeduced() && AT->isGNUAutoType())
11924 if (
const auto *AT = RHS->
getAs<AutoType>()) {
11925 if (!AT->isDeduced() && AT->isGNUAutoType())
11932 switch (LHSClass) {
11933#define TYPE(Class, Base)
11934#define ABSTRACT_TYPE(Class, Base)
11935#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base) case Type::Class:
11936#define NON_CANONICAL_TYPE(Class, Base) case Type::Class:
11937#define DEPENDENT_TYPE(Class, Base) case Type::Class:
11938#include "clang/AST/TypeNodes.inc"
11939 llvm_unreachable(
"Non-canonical and dependent types shouldn't get here");
11942 case Type::DeducedTemplateSpecialization:
11943 case Type::LValueReference:
11944 case Type::RValueReference:
11945 case Type::MemberPointer:
11946 llvm_unreachable(
"C++ should never be in mergeTypes");
11948 case Type::ObjCInterface:
11949 case Type::IncompleteArray:
11950 case Type::VariableArray:
11951 case Type::FunctionProto:
11952 case Type::ExtVector:
11953 case Type::OverflowBehavior:
11954 llvm_unreachable(
"Types are eliminated above");
11956 case Type::Pointer:
11967 if (ResultType.
isNull())
11975 case Type::BlockPointer:
12000 if (ResultType.
isNull())
12019 if (ResultType.
isNull())
12027 case Type::ConstantArray:
12042 if (ResultType.
isNull())
12050 if (LVAT || RVAT) {
12053 -> std::pair<bool,llvm::APInt> {
12055 std::optional<llvm::APSInt> TheInt;
12058 return std::make_pair(
true, *TheInt);
12059 return std::make_pair(
false, llvm::APSInt());
12062 return std::make_pair(
true, CAT->getSize());
12063 return std::make_pair(
false, llvm::APInt());
12066 bool HaveLSize, HaveRSize;
12067 llvm::APInt LSize, RSize;
12068 std::tie(HaveLSize, LSize) = SizeFetch(LVAT, LCAT);
12069 std::tie(HaveRSize, RSize) = SizeFetch(RVAT, RCAT);
12070 if (HaveLSize && HaveRSize && !llvm::APInt::isSameValue(LSize, RSize))
12104 case Type::FunctionNoProto:
12106 false, IsConditionalOperator);
12110 case Type::Builtin:
12113 case Type::Complex:
12122 case Type::ConstantMatrix:
12127 case Type::ObjCObject: {
12136 case Type::ObjCObjectPointer:
12137 if (OfBlockPointer) {
12149 assert(LHS != RHS &&
12150 "Equivalent pipe types should have already been handled!");
12152 case Type::ArrayParameter:
12153 assert(LHS != RHS &&
12154 "Equivalent ArrayParameter types should have already been handled!");
12156 case Type::BitInt: {
12164 if (LHSUnsigned != RHSUnsigned)
12167 if (LHSBits != RHSBits)
12171 case Type::HLSLAttributedResource: {
12172 const HLSLAttributedResourceType *LHSTy =
12173 LHS->
castAs<HLSLAttributedResourceType>();
12174 const HLSLAttributedResourceType *RHSTy =
12175 RHS->
castAs<HLSLAttributedResourceType>();
12176 assert(LHSTy->getWrappedType() == RHSTy->getWrappedType() &&
12177 LHSTy->getWrappedType()->isHLSLResourceType() &&
12178 "HLSLAttributedResourceType should always wrap __hlsl_resource_t");
12180 if (LHSTy->getAttrs() == RHSTy->getAttrs() &&
12181 LHSTy->getContainedType() == RHSTy->getContainedType())
12185 case Type::HLSLInlineSpirv:
12186 const HLSLInlineSpirvType *LHSTy = LHS->
castAs<HLSLInlineSpirvType>();
12187 const HLSLInlineSpirvType *RHSTy = RHS->
castAs<HLSLInlineSpirvType>();
12189 if (LHSTy->getOpcode() == RHSTy->getOpcode() &&
12190 LHSTy->getSize() == RHSTy->getSize() &&
12191 LHSTy->getAlignment() == RHSTy->getAlignment()) {
12192 for (
size_t I = 0; I < LHSTy->getOperands().size(); I++)
12193 if (LHSTy->getOperands()[I] != RHSTy->getOperands()[I])
12201 llvm_unreachable(
"Invalid Type::Class!");
12206 bool &CanUseFirst,
bool &CanUseSecond,
12208 assert(NewParamInfos.empty() &&
"param info list not empty");
12209 CanUseFirst = CanUseSecond =
true;
12215 if (!FirstHasInfo && !SecondHasInfo)
12218 bool NeedParamInfo =
false;
12222 for (
size_t I = 0; I < E; ++I) {
12233 bool FirstNoEscape = FirstParam.
isNoEscape();
12234 bool SecondNoEscape = SecondParam.
isNoEscape();
12235 bool IsNoEscape = FirstNoEscape && SecondNoEscape;
12237 if (NewParamInfos.back().getOpaqueValue())
12238 NeedParamInfo =
true;
12239 if (FirstNoEscape != IsNoEscape)
12240 CanUseFirst =
false;
12241 if (SecondNoEscape != IsNoEscape)
12242 CanUseSecond =
false;
12245 if (!NeedParamInfo)
12246 NewParamInfos.clear();
12252 if (
auto It = ObjCLayouts.find(D); It != ObjCLayouts.end()) {
12253 It->second =
nullptr;
12254 for (
auto *SubClass : ObjCSubClasses.lookup(D))
12266 if (LHSCan == RHSCan)
12268 if (RHSCan->isFunctionType()) {
12277 if (ResReturnType.
isNull())
12279 if (ResReturnType == NewReturnType || ResReturnType == OldReturnType) {
12296 Qualifiers RQuals = RHSCan.getLocalQualifiers();
12297 if (LQuals != RQuals) {
12310 assert((GC_L != GC_R) &&
"unequal qualifier sets had only equal elements");
12326 if (ResQT == LHSBaseQT)
12328 if (ResQT == RHSBaseQT)
12339 if (
const auto *ED = T->getAsEnumDecl())
12340 T = ED->getIntegerType();
12341 if (T->isBooleanType())
12343 if (
const auto *EIT = T->getAs<
BitIntType>())
12344 return EIT->getNumBits();
12350 assert((T->hasIntegerRepresentation() || T->isEnumeralType() ||
12351 T->isFixedPointType()) &&
12352 "Unexpected type");
12355 if (
const auto *VTy = T->getAs<
VectorType>())
12357 VTy->getNumElements(), VTy->getVectorKind());
12360 if (
const auto *EITy = T->getAs<
BitIntType>())
12364 if (
const auto *OBT = T->getAs<OverflowBehaviorType>())
12366 OBT->getBehaviorKind(),
12371 if (
const auto *ED = T->getAsEnumDecl())
12372 T = ED->getIntegerType();
12375 case BuiltinType::Char_U:
12377 case BuiltinType::Char_S:
12378 case BuiltinType::SChar:
12379 case BuiltinType::Char8:
12381 case BuiltinType::Short:
12383 case BuiltinType::Int:
12385 case BuiltinType::Long:
12387 case BuiltinType::LongLong:
12389 case BuiltinType::Int128:
12394 case BuiltinType::WChar_S:
12397 case BuiltinType::ShortAccum:
12399 case BuiltinType::Accum:
12401 case BuiltinType::LongAccum:
12403 case BuiltinType::SatShortAccum:
12405 case BuiltinType::SatAccum:
12407 case BuiltinType::SatLongAccum:
12409 case BuiltinType::ShortFract:
12411 case BuiltinType::Fract:
12413 case BuiltinType::LongFract:
12415 case BuiltinType::SatShortFract:
12417 case BuiltinType::SatFract:
12419 case BuiltinType::SatLongFract:
12422 assert((T->hasUnsignedIntegerRepresentation() ||
12423 T->isUnsignedFixedPointType()) &&
12424 "Unexpected signed integer or fixed point type");
12430 assert((T->hasIntegerRepresentation() || T->isEnumeralType() ||
12431 T->isFixedPointType()) &&
12432 "Unexpected type");
12435 if (
const auto *VTy = T->getAs<
VectorType>())
12437 VTy->getNumElements(), VTy->getVectorKind());
12440 if (
const auto *EITy = T->getAs<
BitIntType>())
12445 if (
const auto *ED = T->getAsEnumDecl())
12446 T = ED->getIntegerType();
12449 case BuiltinType::Char_S:
12451 case BuiltinType::Char_U:
12452 case BuiltinType::UChar:
12453 case BuiltinType::Char8:
12455 case BuiltinType::UShort:
12457 case BuiltinType::UInt:
12459 case BuiltinType::ULong:
12461 case BuiltinType::ULongLong:
12463 case BuiltinType::UInt128:
12468 case BuiltinType::WChar_U:
12471 case BuiltinType::UShortAccum:
12473 case BuiltinType::UAccum:
12475 case BuiltinType::ULongAccum:
12477 case BuiltinType::SatUShortAccum:
12479 case BuiltinType::SatUAccum:
12481 case BuiltinType::SatULongAccum:
12483 case BuiltinType::UShortFract:
12485 case BuiltinType::UFract:
12487 case BuiltinType::ULongFract:
12489 case BuiltinType::SatUShortFract:
12491 case BuiltinType::SatUFract:
12493 case BuiltinType::SatULongFract:
12497 (T->hasSignedIntegerRepresentation() || T->isSignedFixedPointType()) &&
12498 "Unexpected signed integer or fixed point type");
12523 bool AllowTypeModifiers) {
12527 RequiresICE =
false;
12532 bool IsSpecial =
false;
12536 default: Done =
true; --Str;
break;
12538 RequiresICE =
true;
12541 assert(!
Unsigned &&
"Can't use both 'S' and 'U' modifiers!");
12542 assert(!
Signed &&
"Can't use 'S' modifier multiple times!");
12546 assert(!
Signed &&
"Can't use both 'S' and 'U' modifiers!");
12547 assert(!
Unsigned &&
"Can't use 'U' modifier multiple times!");
12551 assert(!IsSpecial &&
"Can't use 'L' with 'W', 'N', 'Z' or 'O' modifiers");
12552 assert(HowLong <= 2 &&
"Can't have LLLL modifier");
12557 assert(!IsSpecial &&
"Can't use two 'N', 'W', 'Z' or 'O' modifiers!");
12558 assert(HowLong == 0 &&
"Can't use both 'L' and 'N' modifiers!");
12562 if (Context.getTargetInfo().getLongWidth() == 32)
12567 assert(!IsSpecial &&
"Can't use two 'N', 'W', 'Z' or 'O' modifiers!");
12568 assert(HowLong == 0 &&
"Can't use both 'L' and 'W' modifiers!");
12572 switch (Context.getTargetInfo().getInt64Type()) {
12574 llvm_unreachable(
"Unexpected integer type");
12585 assert(!IsSpecial &&
"Can't use two 'N', 'W', 'Z' or 'O' modifiers!");
12586 assert(HowLong == 0 &&
"Can't use both 'L' and 'Z' modifiers!");
12590 switch (Context.getTargetInfo().getIntTypeByWidth(32,
true)) {
12592 llvm_unreachable(
"Unexpected integer type");
12605 assert(!IsSpecial &&
"Can't use two 'N', 'W', 'Z' or 'O' modifiers!");
12606 assert(HowLong == 0 &&
"Can't use both 'L' and 'O' modifiers!");
12610 if (Context.getLangOpts().OpenCL)
12623 llvm_unreachable(
"Unknown builtin type letter!");
12626 "Bad modifiers used with 'x'!");
12627 Type = Context.Float16Ty;
12631 "Bad modifiers used with 'y'!");
12632 Type = Context.BFloat16Ty;
12636 "Bad modifiers used with 'v'!");
12637 Type = Context.VoidTy;
12641 "Bad modifiers used with 'h'!");
12642 Type = Context.HalfTy;
12646 "Bad modifiers used with 'f'!");
12647 Type = Context.FloatTy;
12651 "Bad modifiers used with 'd'!");
12653 Type = Context.LongDoubleTy;
12654 else if (HowLong == 2)
12655 Type = Context.Float128Ty;
12657 Type = Context.DoubleTy;
12660 assert(HowLong == 0 &&
"Bad modifiers used with 's'!");
12662 Type = Context.UnsignedShortTy;
12664 Type = Context.ShortTy;
12668 Type =
Unsigned ? Context.UnsignedInt128Ty : Context.Int128Ty;
12669 else if (HowLong == 2)
12670 Type =
Unsigned ? Context.UnsignedLongLongTy : Context.LongLongTy;
12671 else if (HowLong == 1)
12672 Type =
Unsigned ? Context.UnsignedLongTy : Context.LongTy;
12674 Type =
Unsigned ? Context.UnsignedIntTy : Context.IntTy;
12677 assert(HowLong == 0 &&
"Bad modifiers used with 'c'!");
12679 Type = Context.SignedCharTy;
12681 Type = Context.UnsignedCharTy;
12683 Type = Context.CharTy;
12686 assert(HowLong == 0 && !
Signed && !
Unsigned &&
"Bad modifiers for 'b'!");
12687 Type = Context.BoolTy;
12690 assert(HowLong == 0 && !
Signed && !
Unsigned &&
"Bad modifiers for 'z'!");
12691 Type = Context.getSizeType();
12694 assert(HowLong == 0 && !
Signed && !
Unsigned &&
"Bad modifiers for 'w'!");
12695 Type = Context.getWideCharType();
12698 Type = Context.getCFConstantStringType();
12701 Type = Context.getObjCIdType();
12704 Type = Context.getObjCSelType();
12707 Type = Context.getObjCSuperType();
12710 Type = Context.getBuiltinVaListType();
12711 assert(!
Type.isNull() &&
"builtin va list type not initialized!");
12722 Type = Context.getBuiltinVaListType();
12723 assert(!
Type.isNull() &&
"builtin va list type not initialized!");
12725 Type = Context.getArrayDecayedType(
Type);
12727 Type = Context.getLValueReferenceType(
Type);
12731 unsigned NumElements = strtoul(Str, &End, 10);
12732 assert(End != Str &&
"Missing vector size");
12736 RequiresICE,
false);
12737 assert(!RequiresICE &&
"Can't require vector ICE");
12739 Type = Context.getScalableVectorType(ElementType, NumElements);
12745 Type = Context.SveCountTy;
12749 Type = Context.AMDGPUBufferRsrcTy;
12753 Type = Context.AMDGPUTextureTy;
12757 Type = Context.HLSLResourceTy;
12761 llvm_unreachable(
"Unexpected target builtin type");
12767 unsigned NumElements = strtoul(Str, &End, 10);
12768 assert(End != Str &&
"Missing vector size");
12772 RequiresICE,
false);
12773 assert(!RequiresICE &&
"Can't require vector ICE");
12782 unsigned NumElements = strtoul(Str, &End, 10);
12783 assert(End != Str &&
"Missing vector size");
12789 Type = Context.getExtVectorType(ElementType, NumElements);
12795 assert(!RequiresICE &&
"Can't require complex ICE");
12796 Type = Context.getComplexType(ElementType);
12800 Type = Context.getPointerDiffType();
12803 Type = Context.getFILEType();
12804 if (
Type.isNull()) {
12811 Type = Context.getsigjmp_bufType();
12813 Type = Context.getjmp_bufType();
12815 if (
Type.isNull()) {
12821 assert(HowLong == 0 && !
Signed && !
Unsigned &&
"Bad modifiers for 'K'!");
12822 Type = Context.getucontext_tType();
12824 if (
Type.isNull()) {
12830 Type = Context.getProcessIDType();
12833 Type = Context.MFloat8Ty;
12838 Done = !AllowTypeModifiers;
12840 switch (
char c = *Str++) {
12841 default: Done =
true; --Str;
break;
12847 unsigned AddrSpace = strtoul(Str, &End, 10);
12850 Type = Context.getAddrSpaceQualType(
12852 Context.getLangASForBuiltinAddressSpace(AddrSpace));
12856 Type = Context.getPointerType(
Type);
12858 Type = Context.getLValueReferenceType(
Type);
12866 Type = Context.getVolatileType(
Type);
12875 "Integer constant 'I' type must be an integer");
12888 bool AllowTypeModifiers)
const {
12895 unsigned *IntegerConstantArgs)
const {
12896 const char *TypeStr =
BuiltinInfo.getTypeString(Id);
12897 if (TypeStr[0] ==
'\0') {
12904 bool RequiresICE =
false;
12907 RequiresICE,
true);
12911 assert(!RequiresICE &&
"Result of intrinsic cannot be required to be an ICE");
12913 while (TypeStr[0] && TypeStr[0] !=
'.') {
12920 if (RequiresICE && IntegerConstantArgs)
12921 *IntegerConstantArgs |= 1 << ArgTypes.size();
12927 ArgTypes.push_back(Ty);
12930 if (Id == Builtin::BI__GetExceptionInfo)
12933 assert((TypeStr[0] !=
'.' || TypeStr[1] == 0) &&
12934 "'.' should only occur at end of builtin type list!");
12936 bool Variadic = (TypeStr[0] ==
'.');
12943 if (ArgTypes.empty() && Variadic && !
getLangOpts().requiresStrictPrototypes())
12993 if ((!Context.getLangOpts().CPlusPlus &&
12994 !Context.getTargetInfo().getCXXABI().isMicrosoft() &&
12995 !FD->
hasAttr<DLLExportAttr>()) ||
12996 FD->
hasAttr<GNUInlineAttr>()) {
13014 if (Context.getTargetInfo().getCXXABI().isMicrosoft() &&
13017 !FD->
hasAttr<DLLExportAttr>()) {
13038 if (D->
hasAttr<DLLImportAttr>()) {
13041 }
else if (D->
hasAttr<DLLExportAttr>()) {
13044 }
else if (Context.getLangOpts().CUDA && Context.getLangOpts().CUDAIsDevice) {
13047 if (D->
hasAttr<CUDAGlobalAttr>() &&
13056 if (Context.shouldExternalize(D))
13071 switch (Source->hasExternalDefinitions(D)) {
13098 if (Context.getLangOpts().CPlusPlus &&
13099 Context.getLangOpts().IncrementalExtensions &&
13115 if (!LexicalContext)
13120 auto StaticLocalLinkage =
13132 return StaticLocalLinkage;
13138 if (Context.isMSStaticDataMemberInlineDefinition(VD))
13144 switch (Context.getInlineVariableDefinitionKind(VD)) {
13159 return StrongLinkage;
13162 return Context.getTargetInfo().getCXXABI().isMicrosoft() &&
13177 llvm_unreachable(
"Invalid Linkage!");
13187 if (
const auto *VD = dyn_cast<VarDecl>(D)) {
13188 if (!VD->isFileVarDecl())
13193 if (VD->getDescribedVarTemplate() ||
13196 }
else if (
const auto *FD = dyn_cast<FunctionDecl>(D)) {
13222 if (D->
hasAttr<WeakRefAttr>())
13229 if (LangOpts.SYCLIsDevice)
13231 D->
hasAttr<SYCLExternalAttr>());
13237 if (
const auto *FD = dyn_cast<FunctionDecl>(D)) {
13239 if (!FD->doesThisDeclarationHaveABody())
13240 return FD->doesDeclarationForceExternallyVisibleDefinition();
13243 if (FD->
hasAttr<ConstructorAttr>() || FD->
hasAttr<DestructorAttr>())
13248 if (
getTargetInfo().getCXXABI().canKeyFunctionBeInline()) {
13249 if (
const auto *MD = dyn_cast<CXXMethodDecl>(FD)) {
13268 assert(VD->isFileVarDecl() &&
"Expected file scoped var");
13272 if (LangOpts.OpenMP &&
13273 OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(VD))
13280 if (VD->shouldEmitInExternalSource())
13293 if (VD->needsDestruction(*
this))
13297 if (VD->hasInitWithSideEffects())
13302 if (
const auto *DD = dyn_cast<DecompositionDecl>(VD)) {
13303 for (
const auto *BD : DD->flat_bindings())
13304 if (
const auto *BindingVD = BD->getHoldingVar())
13314 llvm::function_ref<
void(
FunctionDecl *)> Pred)
const {
13315 assert(FD->
isMultiVersion() &&
"Only valid for multiversioned functions");
13316 llvm::SmallDenseSet<const FunctionDecl*, 4> SeenDecls;
13321 for (
auto *CurDecl :
13325 SeenDecls.insert(CurFD).second) {
13332 bool IsCXXMethod)
const {
13335 return ABI->getDefaultMethodCallConv(IsVariadic);
13337 switch (LangOpts.getDefaultCallingConv()) {
13365 return Target->getDefaultCallingConv();
13370 return ABI->isNearlyEmpty(RD);
13375 auto ABI = Target->getCXXABI();
13376 if (ABI.isMicrosoft())
13379 auto ComponentLayout =
getLangOpts().RelativeCXXABIVTables
13385 return VTContext.get();
13391 switch (T->getCXXABI().getKind()) {
13392 case TargetCXXABI::AppleARM64:
13393 case TargetCXXABI::Fuchsia:
13394 case TargetCXXABI::GenericAArch64:
13395 case TargetCXXABI::GenericItanium:
13396 case TargetCXXABI::GenericARM:
13397 case TargetCXXABI::GenericMIPS:
13398 case TargetCXXABI::iOS:
13399 case TargetCXXABI::WebAssembly:
13400 case TargetCXXABI::WatchOS:
13401 case TargetCXXABI::XL:
13403 case TargetCXXABI::Microsoft:
13406 llvm_unreachable(
"Unsupported ABI");
13410 assert(T.getCXXABI().getKind() != TargetCXXABI::Microsoft &&
13411 "Device mangle context does not support Microsoft mangling.");
13412 switch (T.getCXXABI().getKind()) {
13413 case TargetCXXABI::AppleARM64:
13414 case TargetCXXABI::Fuchsia:
13415 case TargetCXXABI::GenericAArch64:
13416 case TargetCXXABI::GenericItanium:
13417 case TargetCXXABI::GenericARM:
13418 case TargetCXXABI::GenericMIPS:
13419 case TargetCXXABI::iOS:
13420 case TargetCXXABI::WebAssembly:
13421 case TargetCXXABI::WatchOS:
13422 case TargetCXXABI::XL:
13426 if (
const auto *RD = dyn_cast<CXXRecordDecl>(ND))
13427 return RD->getDeviceLambdaManglingNumber();
13428 return std::nullopt;
13431 case TargetCXXABI::Microsoft:
13435 llvm_unreachable(
"Unsupported ABI");
13453 return ASTRecordLayouts.getMemorySize() +
13454 llvm::capacity_in_bytes(ObjCLayouts) +
13455 llvm::capacity_in_bytes(KeyFunctions) +
13456 llvm::capacity_in_bytes(ObjCImpls) +
13457 llvm::capacity_in_bytes(BlockVarCopyInits) +
13458 llvm::capacity_in_bytes(DeclAttrs) +
13459 llvm::capacity_in_bytes(TemplateOrInstantiation) +
13460 llvm::capacity_in_bytes(InstantiatedFromUsingDecl) +
13461 llvm::capacity_in_bytes(InstantiatedFromUsingShadowDecl) +
13462 llvm::capacity_in_bytes(InstantiatedFromUnnamedFieldDecl) +
13463 llvm::capacity_in_bytes(OverriddenMethods) +
13464 llvm::capacity_in_bytes(Types) +
13465 llvm::capacity_in_bytes(VariableArrayTypes);
13473 unsigned Signed)
const {
13476 if (!QualTy && DestWidth == 128)
13505 llvm_unreachable(
"Unhandled TargetInfo::RealType value");
13512 MangleNumbers[ND] = Number;
13515 Listener->AddedManglingNumber(ND, Number);
13519 bool ForAuxTarget)
const {
13520 auto I = MangleNumbers.find(ND);
13521 unsigned Res = I != MangleNumbers.end() ? I->second : 1;
13524 if (LangOpts.CUDA && !LangOpts.CUDAIsDevice) {
13525 Res = ForAuxTarget ? Res >> 16 : Res & 0xFFFF;
13527 assert(!ForAuxTarget &&
"Only CUDA/HIP host compilation supports mangling "
13528 "number for aux target");
13530 return Res > 1 ? Res : 1;
13537 StaticLocalNumbers[VD] = Number;
13540 Listener->AddedStaticLocalNumbers(VD, Number);
13544 auto I = StaticLocalNumbers.find(VD);
13545 return I != StaticLocalNumbers.end() ? I->second : 1;
13549 bool IsDestroying) {
13550 if (!IsDestroying) {
13562 bool IsTypeAware) {
13563 if (!IsTypeAware) {
13602 return GlobalOperatorDeletesForVirtualDtor.contains(
13605 return ArrayOperatorDeletesForVirtualDtor.contains(
13608 return GlobalArrayOperatorDeletesForVirtualDtor.contains(
13620 if (OperatorDeletesForVirtualDtor.contains(Canon))
13621 return OperatorDeletesForVirtualDtor[Canon];
13624 if (GlobalOperatorDeletesForVirtualDtor.contains(Canon))
13625 return GlobalOperatorDeletesForVirtualDtor[Canon];
13628 if (ArrayOperatorDeletesForVirtualDtor.contains(Canon))
13629 return ArrayOperatorDeletesForVirtualDtor[Canon];
13632 if (GlobalArrayOperatorDeletesForVirtualDtor.contains(Canon))
13633 return GlobalArrayOperatorDeletesForVirtualDtor[Canon];
13649 return RequireVectorDeletingDtor.count(RD);
13656 RequireVectorDeletingDtor.insert(RD);
13661 assert(LangOpts.CPlusPlus);
13662 std::unique_ptr<MangleNumberingContext> &MCtx = MangleNumberingContexts[DC];
13670 assert(LangOpts.CPlusPlus);
13671 std::unique_ptr<MangleNumberingContext> &MCtx =
13672 ExtraMangleNumberingContexts[D];
13678std::unique_ptr<MangleNumberingContext>
13680 return ABI->createMangleNumberingContext();
13685 return ABI->getCopyConstructorForExceptionObject(
13691 return ABI->addCopyConstructorForExceptionObject(
13698 return ABI->addTypedefNameForUnnamedTagDecl(TD, DD);
13703 return ABI->getTypedefNameForUnnamedTagDecl(TD);
13708 return ABI->addDeclaratorForUnnamedTagDecl(TD, DD);
13712 return ABI->getDeclaratorForUnnamedTagDecl(TD);
13716 ParamIndices[D] =
index;
13720 ParameterIndexTable::const_iterator I = ParamIndices.find(D);
13721 assert(I != ParamIndices.end() &&
13722 "ParmIndices lacks entry set by ParmVarDecl");
13727 unsigned Length)
const {
13753 assert(
MSGuidTagDecl &&
"building MS GUID without MS extensions?");
13755 llvm::FoldingSetNodeID ID;
13759 if (
MSGuidDecl *Existing = MSGuidDecls.FindNodeOrInsertPos(ID, InsertPos))
13763 MSGuidDecl *
New = MSGuidDecl::Create(*
this, GUIDType, Parts);
13764 MSGuidDecls.InsertNode(
New, InsertPos);
13770 const APValue &APVal)
const {
13771 llvm::FoldingSetNodeID ID;
13776 UnnamedGlobalConstantDecls.FindNodeOrInsertPos(ID, InsertPos))
13780 UnnamedGlobalConstantDecl::Create(*
this, Ty, APVal);
13781 UnnamedGlobalConstantDecls.InsertNode(
New, InsertPos);
13787 assert(T->isRecordType() &&
"template param object of unexpected type");
13793 llvm::FoldingSetNodeID ID;
13798 TemplateParamObjectDecls.FindNodeOrInsertPos(ID, InsertPos))
13802 TemplateParamObjectDecls.InsertNode(
New, InsertPos);
13808 if (!T.isOSDarwin())
13811 if (!(T.isiOS() && T.isOSVersionLT(7)) &&
13812 !(T.isMacOSX() && T.isOSVersionLT(10, 9)))
13821 return (Size != Align ||
toBits(sizeChars) > MaxInlineWidthInBits);
13828 if (MethodDecl->
hasAttr<UnavailableAttr>()
13829 || MethodDecl->
hasAttr<DeprecatedAttr>())
13843 IM != EM && IF != EF; ++IM, ++IF) {
13874 llvm::FoldingSetNodeID IDX, IDY;
13875 X->Profile(IDX, *
this,
true);
13876 Y->
Profile(IDY, *
this,
true);
13890 for (
const Decl *DX :
X->redecls()) {
13895 if (DX->isFirstDecl())
13898 llvm_unreachable(
"Corrupt redecls chain");
13901template <
class T, std::enable_if_t<std::is_base_of_v<Decl, T>,
bool> = true>
13903 return cast_or_null<T>(
13905 const_cast<Decl *
>(cast_or_null<Decl>(Y))));
13908template <
class T, std::enable_if_t<std::is_base_of_v<Decl, T>,
bool> = true>
13916 bool IgnoreDeduced =
false) {
13931 bool IgnoreDeduced) {
13939 assert(Xs.size() == Ys.size());
13941 for (
size_t I = 0; I < Rs.size(); ++I)
13948 return X->getAttributeLoc() == Y->getAttributeLoc() ?
X->getAttributeLoc()
13958 switch (
X.getKind()) {
13988 auto NExpX =
X.getNumTemplateExpansions();
14002 if (Xs.size() != Ys.size())
14004 R.resize(Xs.size());
14005 for (
size_t I = 0; I < R.size(); ++I) {
14018 assert(!Different);
14046 assert(!IsSame &&
"Should be the same NestedNameSpecifier");
14048 return std::nullopt;
14053 assert(Kind == NNS2.
getKind());
14058 auto Kind = Namespace1->getKind();
14059 if (Kind != Namespace2->getKind() ||
14060 (Kind == Decl::NamespaceAlias &&
14065 Namespace2->getNamespace()),
14099 llvm_unreachable(
"singletons did not compare equal");
14107 const T *Y,
bool IsSame) {
14108 return ::getCommonNNS(Ctx,
X->getQualifier(), Y->getQualifier(), IsSame);
14128 QX +=
X.getQualifiers() - RQ;
14138 Y->getElementType(), QX, QY);
14149 assert(Ctx.
hasSameExpr(
X->getSizeExpr(), Y->getSizeExpr()));
14150 return X->getSizeExpr();
14155 return X->getSizeModifier();
14161 return X->getIndexTypeCVRQualifiers();
14171 llvm::DenseMap<QualType, unsigned>
Found;
14172 for (
auto Ts : {
X, Y}) {
14179 Out.emplace_back(T);
14185FunctionProtoType::ExceptionSpecInfo
14189 bool AcceptDependent)
const {
14215 assert(AcceptDependent &&
14216 "computing composite pointer type of dependent types");
14231 llvm_unreachable(
"These ESTs should be handled above");
14236 assert(EST2 ==
EST_Dynamic &&
"other cases should already be handled");
14240 Result.Exceptions = ExceptionTypeStorage;
14247 llvm_unreachable(
"shouldn't see unresolved exception specifications here");
14250 llvm_unreachable(
"invalid ExceptionSpecificationType");
14259#define UNEXPECTED_TYPE(Class, Kind) \
14260 case Type::Class: \
14261 llvm_unreachable("Unexpected " Kind ": " #Class);
14263#define NON_CANONICAL_TYPE(Class, Base) UNEXPECTED_TYPE(Class, "non-canonical")
14264#define TYPE(Class, Base)
14265#include "clang/AST/TypeNodes.inc"
14267#define SUGAR_FREE_TYPE(Class) UNEXPECTED_TYPE(Class, "sugar-free")
14278#undef SUGAR_FREE_TYPE
14279#define NON_UNIQUE_TYPE(Class) UNEXPECTED_TYPE(Class, "non-unique")
14282#undef NON_UNIQUE_TYPE
14286#undef UNEXPECTED_TYPE
14290 assert(AX->getDeducedType().isNull());
14291 assert(AY->getDeducedType().isNull());
14292 assert(AX->getKeyword() == AY->getKeyword());
14293 assert(AX->isInstantiationDependentType() ==
14294 AY->isInstantiationDependentType());
14296 AY->getTypeConstraintArguments());
14299 AX->containsUnexpandedParameterPack(),
14301 AY->getTypeConstraintConcept()),
14304 case Type::IncompleteArray: {
14311 case Type::DependentSizedArray: {
14319 case Type::ConstantArray: {
14322 assert(AX->getSize() == AY->getSize());
14323 const Expr *SizeExpr = Ctx.
hasSameExpr(AX->getSizeExpr(), AY->getSizeExpr())
14324 ? AX->getSizeExpr()
14330 case Type::ArrayParameter: {
14333 assert(AX->getSize() == AY->getSize());
14334 const Expr *SizeExpr = Ctx.
hasSameExpr(AX->getSizeExpr(), AY->getSizeExpr())
14335 ? AX->getSizeExpr()
14342 case Type::Atomic: {
14347 case Type::Complex: {
14351 case Type::Pointer: {
14355 case Type::BlockPointer: {
14359 case Type::ObjCObjectPointer: {
14364 case Type::MemberPointer: {
14368 PY->getMostRecentCXXRecordDecl()));
14372 PX->getMostRecentCXXRecordDecl());
14374 case Type::LValueReference: {
14379 PX->isSpelledAsLValue() ||
14380 PY->isSpelledAsLValue());
14382 case Type::RValueReference: {
14388 case Type::DependentAddressSpace: {
14391 assert(Ctx.
hasSameExpr(PX->getAddrSpaceExpr(), PY->getAddrSpaceExpr()));
14393 PX->getAddrSpaceExpr(),
14396 case Type::FunctionNoProto: {
14399 assert(FX->getExtInfo() == FY->getExtInfo());
14404 case Type::FunctionProto: {
14408 EPIY = FY->getExtProtoInfo();
14409 assert(EPIX.
ExtInfo == EPIY.ExtInfo);
14416 assert(EPIX.
TypeQuals == EPIY.TypeQuals);
14417 assert(EPIX.
Variadic == EPIY.Variadic);
14426 auto P =
getCommonTypes(Ctx, FX->param_types(), FY->param_types(),
14434 case Type::ObjCObject: {
14437 std::equal(OX->getProtocols().begin(), OX->getProtocols().end(),
14438 OY->getProtocols().begin(), OY->getProtocols().end(),
14440 return P0->getCanonicalDecl() == P1->getCanonicalDecl();
14442 "protocol lists must be the same");
14444 OY->getTypeArgsAsWritten());
14447 OX->getProtocols(),
14448 OX->isKindOfTypeAsWritten() && OY->isKindOfTypeAsWritten());
14450 case Type::ConstantMatrix: {
14453 assert(MX->getNumRows() == MY->getNumRows());
14454 assert(MX->getNumColumns() == MY->getNumColumns());
14456 MX->getNumRows(), MX->getNumColumns());
14458 case Type::DependentSizedMatrix: {
14461 assert(Ctx.
hasSameExpr(MX->getRowExpr(), MY->getRowExpr()));
14462 assert(Ctx.
hasSameExpr(MX->getColumnExpr(), MY->getColumnExpr()));
14467 case Type::Vector: {
14469 assert(VX->getNumElements() == VY->getNumElements());
14470 assert(VX->getVectorKind() == VY->getVectorKind());
14472 VX->getNumElements(), VX->getVectorKind());
14474 case Type::ExtVector: {
14476 assert(VX->getNumElements() == VY->getNumElements());
14478 VX->getNumElements());
14480 case Type::DependentSizedExtVector: {
14487 case Type::DependentVector: {
14490 assert(VX->getVectorKind() == VY->getVectorKind());
14497 case Type::InjectedClassName: {
14504 case Type::TemplateSpecialization: {
14508 TY->template_arguments());
14512 TY->getTemplateName(),
14514 As, {},
X->getCanonicalTypeInternal());
14516 case Type::Decltype: {
14519 assert(DX->isDependentType());
14520 assert(DY->isDependentType());
14521 assert(Ctx.
hasSameExpr(DX->getUnderlyingExpr(), DY->getUnderlyingExpr()));
14525 case Type::PackIndexing: {
14528 assert(DX->isDependentType());
14529 assert(DY->isDependentType());
14530 assert(Ctx.
hasSameExpr(DX->getIndexExpr(), DY->getIndexExpr()));
14533 case Type::DependentName: {
14536 assert(NX->getIdentifier() == NY->getIdentifier());
14541 case Type::OverflowBehavior: {
14544 assert(NX->getBehaviorKind() == NY->getBehaviorKind());
14546 NX->getBehaviorKind(),
14548 NY->getUnderlyingType(), QX, QY));
14550 case Type::UnaryTransform: {
14553 assert(TX->getUTTKind() == TY->getUTTKind());
14557 TY->getUnderlyingType()),
14560 case Type::PackExpansion: {
14563 assert(PX->getNumExpansions() == PY->getNumExpansions());
14566 PX->getNumExpansions(),
false);
14570 assert(PX->isReadOnly() == PY->isReadOnly());
14575 case Type::TemplateTypeParm: {
14578 assert(TX->getDepth() == TY->getDepth());
14579 assert(TX->getIndex() == TY->getIndex());
14580 assert(TX->isParameterPack() == TY->isParameterPack());
14582 TX->getDepth(), TX->getIndex(), TX->isParameterPack(),
14586 llvm_unreachable(
"Unknown Type Class");
14596#define UNEXPECTED_TYPE(Class, Kind) \
14597 case Type::Class: \
14598 llvm_unreachable("Unexpected " Kind ": " #Class);
14599#define TYPE(Class, Base)
14600#define DEPENDENT_TYPE(Class, Base) UNEXPECTED_TYPE(Class, "dependent")
14601#include "clang/AST/TypeNodes.inc"
14603#define CANONICAL_TYPE(Class) UNEXPECTED_TYPE(Class, "canonical")
14630#undef CANONICAL_TYPE
14632#undef UNEXPECTED_TYPE
14634 case Type::Adjusted: {
14636 QualType OX = AX->getOriginalType(), OY = AY->getOriginalType();
14643 case Type::Decayed: {
14645 QualType OX = DX->getOriginalType(), OY = DY->getOriginalType();
14652 case Type::Attributed: {
14654 AttributedType::Kind Kind = AX->getAttrKind();
14655 if (Kind != AY->getAttrKind())
14657 QualType MX = AX->getModifiedType(), MY = AY->getModifiedType();
14665 case Type::BTFTagAttributed: {
14667 const BTFTypeTagAttr *AX = BX->getAttr();
14669 if (AX->getBTFTypeTag() !=
14678 if (KW != AY->getKeyword())
14682 AY->getTypeConstraintConcept());
14686 AY->getTypeConstraintArguments())) {
14694 false,
false, CD, As);
14696 case Type::PackIndexing:
14697 case Type::Decltype:
14699 case Type::DeducedTemplateSpecialization:
14702 case Type::MacroQualified: {
14706 if (IX != MY->getMacroIdentifier())
14710 case Type::SubstTemplateTypeParm: {
14717 unsigned Index = SX->getIndex();
14718 if (Index != SY->getIndex())
14720 auto PackIndex = SX->getPackIndex();
14721 if (PackIndex != SY->getPackIndex())
14724 CD, Index, PackIndex,
14725 SX->getFinal() && SY->getFinal());
14727 case Type::ObjCTypeParam:
14733 case Type::TemplateSpecialization: {
14738 TY->getTemplateName(),
true);
14743 TY->template_arguments()))
14749 case Type::Typedef: {
14759 case Type::TypeOf: {
14770 case Type::TypeOfExpr:
14773 case Type::UnaryTransform: {
14776 UnaryTransformType::UTTKind KX = UX->getUTTKind();
14777 if (KX != UY->getUTTKind())
14779 QualType BX = UX->getBaseType(), BY = UY->getBaseType();
14786 case Type::Using: {
14795 case Type::MemberPointer: {
14799 assert(Cls == PY->getMostRecentCXXRecordDecl());
14804 case Type::CountAttributed: {
14807 if (DX->isCountInBytes() != DY->isCountInBytes())
14809 if (DX->isOrNull() != DY->isOrNull())
14811 Expr *CEX = DX->getCountExpr();
14812 Expr *CEY = DY->getCountExpr();
14816 DX->isCountInBytes(), DX->isOrNull(),
14827 DX->isCountInBytes(), DX->isOrNull(),
14830 case Type::PredefinedSugar:
14835 llvm_unreachable(
"Unhandled Type Class");
14857 if (
X.isCanonical())
14884 bool KeepCommonQualifiers =
14887 if (SX.
Ty != SY.Ty) {
14895 while (!Xs.empty() && !Ys.empty() && Xs.back().Ty == Ys.back().Ty) {
14898 SX = Xs.pop_back_val();
14899 SY = Ys.pop_back_val();
14902 if (KeepCommonQualifiers)
14909 while (!Xs.empty() && !Ys.empty()) {
14912 SX = Xs.pop_back_val();
14913 SY = Ys.pop_back_val();
14918 SX.
Ty = Underlying.Ty;
14921 QX -= Underlying.Quals;
14939 llvm_unreachable(
"Not a saturated fixed point type!");
14940 case BuiltinType::SatShortAccum:
14942 case BuiltinType::SatAccum:
14944 case BuiltinType::SatLongAccum:
14946 case BuiltinType::SatUShortAccum:
14948 case BuiltinType::SatUAccum:
14950 case BuiltinType::SatULongAccum:
14952 case BuiltinType::SatShortFract:
14954 case BuiltinType::SatFract:
14956 case BuiltinType::SatLongFract:
14958 case BuiltinType::SatUShortFract:
14960 case BuiltinType::SatUFract:
14962 case BuiltinType::SatULongFract:
14974 llvm_unreachable(
"Not a fixed point type!");
14975 case BuiltinType::ShortAccum:
14977 case BuiltinType::Accum:
14979 case BuiltinType::LongAccum:
14981 case BuiltinType::UShortAccum:
14983 case BuiltinType::UAccum:
14985 case BuiltinType::ULongAccum:
14987 case BuiltinType::ShortFract:
14989 case BuiltinType::Fract:
14991 case BuiltinType::LongFract:
14993 case BuiltinType::UShortFract:
14995 case BuiltinType::UFract:
14997 case BuiltinType::ULongFract:
15003 if (LangOpts.OpenCL)
15027 llvm_unreachable(
"Not a fixed point type!");
15028 case BuiltinType::ShortAccum:
15029 case BuiltinType::SatShortAccum:
15030 return Target.getShortAccumScale();
15031 case BuiltinType::Accum:
15032 case BuiltinType::SatAccum:
15033 return Target.getAccumScale();
15034 case BuiltinType::LongAccum:
15035 case BuiltinType::SatLongAccum:
15036 return Target.getLongAccumScale();
15037 case BuiltinType::UShortAccum:
15038 case BuiltinType::SatUShortAccum:
15039 return Target.getUnsignedShortAccumScale();
15040 case BuiltinType::UAccum:
15041 case BuiltinType::SatUAccum:
15042 return Target.getUnsignedAccumScale();
15043 case BuiltinType::ULongAccum:
15044 case BuiltinType::SatULongAccum:
15045 return Target.getUnsignedLongAccumScale();
15046 case BuiltinType::ShortFract:
15047 case BuiltinType::SatShortFract:
15048 return Target.getShortFractScale();
15049 case BuiltinType::Fract:
15050 case BuiltinType::SatFract:
15051 return Target.getFractScale();
15052 case BuiltinType::LongFract:
15053 case BuiltinType::SatLongFract:
15054 return Target.getLongFractScale();
15055 case BuiltinType::UShortFract:
15056 case BuiltinType::SatUShortFract:
15057 return Target.getUnsignedShortFractScale();
15058 case BuiltinType::UFract:
15059 case BuiltinType::SatUFract:
15060 return Target.getUnsignedFractScale();
15061 case BuiltinType::ULongFract:
15062 case BuiltinType::SatULongFract:
15063 return Target.getUnsignedLongFractScale();
15073 llvm_unreachable(
"Not a fixed point type!");
15074 case BuiltinType::ShortAccum:
15075 case BuiltinType::SatShortAccum:
15076 return Target.getShortAccumIBits();
15077 case BuiltinType::Accum:
15078 case BuiltinType::SatAccum:
15079 return Target.getAccumIBits();
15080 case BuiltinType::LongAccum:
15081 case BuiltinType::SatLongAccum:
15082 return Target.getLongAccumIBits();
15083 case BuiltinType::UShortAccum:
15084 case BuiltinType::SatUShortAccum:
15085 return Target.getUnsignedShortAccumIBits();
15086 case BuiltinType::UAccum:
15087 case BuiltinType::SatUAccum:
15088 return Target.getUnsignedAccumIBits();
15089 case BuiltinType::ULongAccum:
15090 case BuiltinType::SatULongAccum:
15091 return Target.getUnsignedLongAccumIBits();
15092 case BuiltinType::ShortFract:
15093 case BuiltinType::SatShortFract:
15094 case BuiltinType::Fract:
15095 case BuiltinType::SatFract:
15096 case BuiltinType::LongFract:
15097 case BuiltinType::SatLongFract:
15098 case BuiltinType::UShortFract:
15099 case BuiltinType::SatUShortFract:
15100 case BuiltinType::UFract:
15101 case BuiltinType::SatUFract:
15102 case BuiltinType::ULongFract:
15103 case BuiltinType::SatULongFract:
15108llvm::FixedPointSemantics
15111 "Can only get the fixed point semantics for a "
15112 "fixed point or integer type.");
15114 return llvm::FixedPointSemantics::GetIntegerSemantics(
15118 return llvm::FixedPointSemantics(
15121 !isSigned &&
getTargetInfo().doUnsignedFixedPointTypesHavePadding());
15136 "Expected unsigned fixed point type");
15139 case BuiltinType::UShortAccum:
15141 case BuiltinType::UAccum:
15143 case BuiltinType::ULongAccum:
15145 case BuiltinType::SatUShortAccum:
15147 case BuiltinType::SatUAccum:
15149 case BuiltinType::SatULongAccum:
15151 case BuiltinType::UShortFract:
15153 case BuiltinType::UFract:
15155 case BuiltinType::ULongFract:
15157 case BuiltinType::SatUShortFract:
15159 case BuiltinType::SatUFract:
15161 case BuiltinType::SatULongFract:
15164 llvm_unreachable(
"Unexpected unsigned fixed point type");
15172 std::vector<std::string> BackendFeats;
15173 llvm::AArch64::ExtensionSet FeatureBits;
15174 for (StringRef F : FMVFeatStrings)
15175 if (
auto FMVExt = llvm::AArch64::parseFMVExtension(F))
15177 FeatureBits.enable(*FMVExt->ID);
15178 FeatureBits.toLLVMFeatureList(BackendFeats);
15179 return BackendFeats;
15184 assert(TD !=
nullptr);
15187 llvm::erase_if(
ParsedAttr.Features, [&](
const std::string &Feat) {
15188 return !Target->isValidFeatureName(StringRef{Feat}.substr(1));
15199 Target->getTargetOpts().CPU,
15200 Target->getTargetOpts().Features);
15207 StringRef TargetCPU = Target->getTargetOpts().CPU;
15209 if (
const auto *TD = FD->
getAttr<TargetAttr>()) {
15215 if (!Target->getTriple().isAArch64())
15218 Target->getTargetOpts().FeaturesAsWritten.begin(),
15219 Target->getTargetOpts().FeaturesAsWritten.end());
15230 }
else if (
const auto *SD = FD->
getAttr<CPUSpecificAttr>()) {
15232 Target->getCPUSpecificCPUDispatchFeatures(
15234 std::vector<std::string> Features(FeaturesTmp.begin(), FeaturesTmp.end());
15235 Features.insert(Features.begin(),
15236 Target->getTargetOpts().FeaturesAsWritten.begin(),
15237 Target->getTargetOpts().FeaturesAsWritten.end());
15238 Target->initFeatureMap(FeatureMap,
getDiagnostics(), TargetCPU, Features);
15239 }
else if (
const auto *TC = FD->
getAttr<TargetClonesAttr>()) {
15240 if (Target->getTriple().isAArch64()) {
15244 Features.insert(Features.begin(),
15245 Target->getTargetOpts().FeaturesAsWritten.begin(),
15246 Target->getTargetOpts().FeaturesAsWritten.end());
15247 Target->initFeatureMap(FeatureMap,
getDiagnostics(), TargetCPU, Features);
15248 }
else if (Target->getTriple().isRISCV()) {
15250 std::vector<std::string> Features;
15251 if (VersionStr !=
"default") {
15253 Features.insert(Features.begin(),
ParsedAttr.Features.begin(),
15256 Features.insert(Features.begin(),
15257 Target->getTargetOpts().FeaturesAsWritten.begin(),
15258 Target->getTargetOpts().FeaturesAsWritten.end());
15259 Target->initFeatureMap(FeatureMap,
getDiagnostics(), TargetCPU, Features);
15261 std::vector<std::string> Features;
15263 if (VersionStr.starts_with(
"arch="))
15264 TargetCPU = VersionStr.drop_front(
sizeof(
"arch=") - 1);
15265 else if (VersionStr !=
"default")
15266 Features.push_back((StringRef{
"+"} + VersionStr).str());
15267 Target->initFeatureMap(FeatureMap,
getDiagnostics(), TargetCPU, Features);
15269 }
else if (
const auto *TV = FD->
getAttr<TargetVersionAttr>()) {
15270 std::vector<std::string> Features;
15271 if (Target->getTriple().isRISCV()) {
15273 Features.insert(Features.begin(),
ParsedAttr.Features.begin(),
15276 assert(Target->getTriple().isAArch64());
15278 TV->getFeatures(Feats);
15281 Features.insert(Features.begin(),
15282 Target->getTargetOpts().FeaturesAsWritten.begin(),
15283 Target->getTargetOpts().FeaturesAsWritten.end());
15284 Target->initFeatureMap(FeatureMap,
getDiagnostics(), TargetCPU, Features);
15286 FeatureMap = Target->getTargetOpts().FeatureMap;
15297 auto DeviceDiscriminatorOverrider =
15299 if (
const auto *RD = dyn_cast<CXXRecordDecl>(ND))
15301 return RD->getDeviceLambdaManglingNumber();
15302 return std::nullopt;
15305 Context, Context.getDiagnostics(), DeviceDiscriminatorOverrider)};
15313 std::string Buffer;
15314 Buffer.reserve(128);
15315 llvm::raw_string_ostream Out(Buffer);
15316 MC->mangleCanonicalTypeName(KernelNameType, Out);
15317 std::string KernelName = Out.str();
15319 return {KernelNameType, FD, KernelName};
15328 const auto *SKEPAttr = FD->
getAttr<SYCLKernelEntryPointAttr>();
15329 assert(SKEPAttr &&
"Missing sycl_kernel_entry_point attribute");
15338 "SYCL kernel name conflict");
15353 return &IT->second;
15359 return *OMPTraitInfoVector.back();
15366 return DB << Section.
Decl;
15367 return DB <<
"a prior #pragma section";
15371 bool IsInternalVar =
15374 bool IsExplicitDeviceVar = (D->
hasAttr<CUDADeviceAttr>() &&
15375 !D->
getAttr<CUDADeviceAttr>()->isImplicit()) ||
15376 (D->
hasAttr<CUDAConstantAttr>() &&
15377 !D->
getAttr<CUDAConstantAttr>()->isImplicit());
15381 return (IsInternalVar &&
15382 (D->
hasAttr<HIPManagedAttr>() || IsExplicitDeviceVar)) ||
15383 (D->
hasAttr<CUDAGlobalAttr>() &&
15390 (D->
hasAttr<HIPManagedAttr>() || D->
hasAttr<CUDAGlobalAttr>() ||
15395 if (!CUIDHash.empty())
15397 if (LangOpts.CUID.empty())
15398 return StringRef();
15399 CUIDHash = llvm::utohexstr(llvm::MD5Hash(LangOpts.CUID),
true);
15409 assert(PrimaryBase);
15412 auto Base = Layout.getPrimaryBase();
15413 if (!
Base ||
Base == PrimaryBase || !
Base->isPolymorphic())
15415 PrimaryBase =
Base;
15417 return PrimaryBase;
15421 StringRef MangledName) {
15423 assert(
Method->isVirtual());
15424 bool DefaultIncludesPointerAuth =
15425 LangOpts.PointerAuthCalls || LangOpts.PointerAuthIntrinsics;
15427 if (!DefaultIncludesPointerAuth)
15430 auto Existing = ThunksToBeAbbreviated.find(VirtualMethodDecl);
15431 if (Existing != ThunksToBeAbbreviated.end())
15432 return Existing->second.contains(MangledName.str());
15435 llvm::StringMap<llvm::SmallVector<std::string, 2>> Thunks;
15437 if (
const auto *ThunkInfos = VtableContext->getThunkInfo(VirtualMethodDecl)) {
15439 for (
const auto &Thunk : *ThunkInfos) {
15441 llvm::raw_svector_ostream ElidedNameStream(ElidedName);
15447 Mangler->mangleThunk(
Method, Thunk,
true,
15450 llvm::raw_svector_ostream mangledNameStream(MangledName);
15454 mangledNameStream);
15456 Mangler->mangleThunk(
Method, Thunk,
false,
15457 mangledNameStream);
15459 Thunks[ElidedName].push_back(std::string(MangledName));
15462 llvm::StringSet<> SimplifiedThunkNames;
15463 for (
auto &ThunkList : Thunks) {
15464 llvm::sort(ThunkList.second);
15465 SimplifiedThunkNames.insert(ThunkList.second[0]);
15467 bool Result = SimplifiedThunkNames.contains(MangledName);
15468 ThunksToBeAbbreviated[VirtualMethodDecl] = std::move(SimplifiedThunkNames);
15486 std::vector<PFPField> &Fields,
bool IncludeVBases) {
15488 if (
auto *ElemDecl = AT->getElementType()->getAsCXXRecordDecl()) {
15490 for (
unsigned i = 0; i != AT->getSize(); ++i)
15507 Fields.push_back({FieldOffset, Field});
15514 if (
Base.isVirtual())
15521 if (IncludeVBases) {
15532 std::vector<PFPField> PFPFields;
15542 if (
auto *RD = dyn_cast<CXXRecordDecl>(FD->
getParent()))
15544 !FD->
hasAttr<NoFieldProtectionAttr>();
15549 auto *FD = dyn_cast<FieldDecl>(VD);
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 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 bool matchesPostDecrInWhile(const UnaryOperator *UO, ASTContext &Ctx)
For the purposes of overflow pattern exclusion, does this match the while(i–) pattern?
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 QualType getCommonTypeWithQualifierLifting(const ASTContext &Ctx, QualType X, QualType Y, Qualifiers &QX, Qualifiers &QY)
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.
*collection of selector each with an associated kind and an ordered *collection of selectors A selector has a kind
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.
bool dtorHasOperatorDelete(const CXXDestructorDecl *Dtor, OperatorDeleteKind K) const
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.
bool isPFPField(const FieldDecl *Field) const
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.
static CanQualType getCanonicalType(QualType T)
Return the canonical (structural) type corresponding to the specified potentially non-canonical type ...
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,...
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 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 classNeedsVectorDeletingDestructor(const CXXRecordDecl *RD)
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.
void setClassNeedsVectorDeletingDestructor(const CXXRecordDecl *RD)
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
std::optional< QualType > tryMergeOverflowBehaviorTypes(QualType LHS, QualType RHS, bool OfBlockPointer, bool Unqualified, bool BlockReturnType, bool IsConditionalOperator)
Attempts to merge two types that may be OverflowBehaviorTypes.
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
const TargetInfo * getAuxTargetInfo() 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 arePFPFieldsTriviallyCopyable(const RecordDecl *RD) const
Returns whether this record's PFP fields (if any) are trivially copyable (i.e.
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
MangleContext * cudaNVInitDeviceMC()
unsigned getAlignOfGlobalVar(QualType T, const VarDecl *VD) const
Return the alignment in bits that should be given to a global variable with type T.
bool areCompatibleOverflowBehaviorTypes(QualType LHS, QualType RHS)
Return true if two OverflowBehaviorTypes are compatible for assignment.
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.
interp::Context & getInterpContext() const
Returns the clang bytecode interpreter context.
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.
bool hasPFPFields(QualType Ty) const
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...
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
FunctionDecl * getOperatorDeleteForVDtor(const CXXDestructorDecl *Dtor, OperatorDeleteKind K) const
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 ...
static bool hasSameType(QualType T1, QualType T2)
Determine whether the given types T1 and T2 are equivalent.
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.
void recordOffsetOfEvaluation(const OffsetOfExpr *E)
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)
OBTAssignResult checkOBTAssignmentCompatibility(QualType LHS, QualType RHS)
Check overflow behavior type compatibility for assignments.
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.
QualType getOverflowBehaviorType(const OverflowBehaviorAttr *Attr, QualType Wrapped) const
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
std::vector< PFPField > findPFPFields(QualType Ty) const
Returns a list of PFP fields for the given type, including subfields in bases or other fields,...
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
static bool hasSameUnqualifiedType(QualType T1, QualType T2)
Determine whether the given types are equivalent after cvr-qualifiers have been removed.
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...
void addOperatorDeleteForVDtor(const CXXDestructorDecl *Dtor, FunctionDecl *OperatorDelete, OperatorDeleteKind K) const
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.
llvm::SetVector< const FieldDecl * > PFPFieldsWithEvaluatedOffset
bool canonicalizeTemplateArguments(MutableArrayRef< TemplateArgument > Args) const
Canonicalize the given template argument list.
QualType getTypeOfExprType(Expr *E, TypeOfKind Kind) const
C23 feature and GCC extension.
bool isUnaryOverflowPatternExcluded(const UnaryOperator *UO)
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)
void recordMemberDataPointerEvaluation(const ValueDecl *VD)
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'.
Holds information about both target-independent and target-specific builtins, allowing easy queries b...
Implements C++ ABI-specific semantic analysis functions.
Represents a base class of a C++ class.
Represents a C++ constructor within a class.
Represents a C++ destructor within a class.
CXXDestructorDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
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]).
CXXDestructorDecl * getDestructor() const
Returns the destructor decl for this class.
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.
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.
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.
A dynamically typed AST node container.
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.
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.
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.
@ PostDecrInWhile
while (count–)
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
bool isOverflowPatternExcluded(OverflowPatternExclusionKind Kind) const
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...
static bool isValidElementType(QualType T, const LangOptions &LangOpts)
Valid elements types are the following:
QualType getElementType() const
Returns type of the elements being stored in the matrix.
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)
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...
OffsetOfExpr - [C99 7.17] - This represents an expression of the form offsetof(record-type,...
const OffsetOfNode & getComponent(unsigned Idx) const
unsigned getNumComponents() const
Helper class for OffsetOfExpr.
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.
DynTypedNodeList getParents(const NodeT &Node)
Returns the parents of the given node (within the traversal scope).
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.
QualType getNonPackExpansionType() const
Remove an outer pack expansion type (if any) from this type.
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,...
bool isFloat16Type() const
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....
QualType getLocallyUnqualifiedSingleStepDesugaredType() const
Pull a single level of sugar off of this locally-unqualified type.
bool isPointerType() const
TagDecl * castAsTagDecl() 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 isOverflowBehaviorType() const
EnumDecl * castAsEnumDecl() 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)
UnaryOperator - This represents the unary-expression's (except sizeof and alignof),...
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.
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.
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.
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.
const Decl & adjustDeclToTemplate(const Decl &D)
If we have a 'templated' declaration for a template, adjust 'D' to refer to the actual template.
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.
const StreamingDiagnostic & operator<<(const StreamingDiagnostic &DB, const ConceptReference *C)
Insertion operator for diagnostics.
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