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>(
2080 8,
Target->vectorsAreElementAligned() ? EltInfo.
Width : Width);
2084 if (Align & (Align-1)) {
2085 Align = llvm::bit_ceil(Align);
2086 Width = llvm::alignTo(Width, Align);
2089 uint64_t TargetVectorAlign = Target->getMaxVectorAlign();
2090 if (TargetVectorAlign && TargetVectorAlign < Align)
2091 Align = TargetVectorAlign;
2105 Align = std::min<unsigned>(64, Width);
2109 case Type::ConstantMatrix: {
2111 TypeInfo ElementInfo =
getTypeInfo(MT->getElementType());
2115 Width = ElementInfo.
Width * MT->getNumRows() * MT->getNumColumns();
2116 Align = ElementInfo.
Align;
2122 default: llvm_unreachable(
"Unknown builtin type!");
2123 case BuiltinType::Void:
2128 case BuiltinType::Bool:
2129 Width = Target->getBoolWidth();
2130 Align = Target->getBoolAlign();
2132 case BuiltinType::Char_S:
2133 case BuiltinType::Char_U:
2134 case BuiltinType::UChar:
2135 case BuiltinType::SChar:
2136 case BuiltinType::Char8:
2137 Width = Target->getCharWidth();
2138 Align = Target->getCharAlign();
2140 case BuiltinType::WChar_S:
2141 case BuiltinType::WChar_U:
2142 Width = Target->getWCharWidth();
2143 Align = Target->getWCharAlign();
2145 case BuiltinType::Char16:
2146 Width = Target->getChar16Width();
2147 Align = Target->getChar16Align();
2149 case BuiltinType::Char32:
2150 Width = Target->getChar32Width();
2151 Align = Target->getChar32Align();
2153 case BuiltinType::UShort:
2154 case BuiltinType::Short:
2155 Width = Target->getShortWidth();
2156 Align = Target->getShortAlign();
2158 case BuiltinType::UInt:
2159 case BuiltinType::Int:
2160 Width = Target->getIntWidth();
2161 Align = Target->getIntAlign();
2163 case BuiltinType::ULong:
2164 case BuiltinType::Long:
2165 Width = Target->getLongWidth();
2166 Align = Target->getLongAlign();
2168 case BuiltinType::ULongLong:
2169 case BuiltinType::LongLong:
2170 Width = Target->getLongLongWidth();
2171 Align = Target->getLongLongAlign();
2173 case BuiltinType::Int128:
2174 case BuiltinType::UInt128:
2176 Align = Target->getInt128Align();
2178 case BuiltinType::ShortAccum:
2179 case BuiltinType::UShortAccum:
2180 case BuiltinType::SatShortAccum:
2181 case BuiltinType::SatUShortAccum:
2182 Width = Target->getShortAccumWidth();
2183 Align = Target->getShortAccumAlign();
2185 case BuiltinType::Accum:
2186 case BuiltinType::UAccum:
2187 case BuiltinType::SatAccum:
2188 case BuiltinType::SatUAccum:
2189 Width = Target->getAccumWidth();
2190 Align = Target->getAccumAlign();
2192 case BuiltinType::LongAccum:
2193 case BuiltinType::ULongAccum:
2194 case BuiltinType::SatLongAccum:
2195 case BuiltinType::SatULongAccum:
2196 Width = Target->getLongAccumWidth();
2197 Align = Target->getLongAccumAlign();
2199 case BuiltinType::ShortFract:
2200 case BuiltinType::UShortFract:
2201 case BuiltinType::SatShortFract:
2202 case BuiltinType::SatUShortFract:
2203 Width = Target->getShortFractWidth();
2204 Align = Target->getShortFractAlign();
2206 case BuiltinType::Fract:
2207 case BuiltinType::UFract:
2208 case BuiltinType::SatFract:
2209 case BuiltinType::SatUFract:
2210 Width = Target->getFractWidth();
2211 Align = Target->getFractAlign();
2213 case BuiltinType::LongFract:
2214 case BuiltinType::ULongFract:
2215 case BuiltinType::SatLongFract:
2216 case BuiltinType::SatULongFract:
2217 Width = Target->getLongFractWidth();
2218 Align = Target->getLongFractAlign();
2220 case BuiltinType::BFloat16:
2221 if (Target->hasBFloat16Type()) {
2222 Width = Target->getBFloat16Width();
2223 Align = Target->getBFloat16Align();
2227 AuxTarget->hasBFloat16Type()) {
2228 Width = AuxTarget->getBFloat16Width();
2229 Align = AuxTarget->getBFloat16Align();
2232 case BuiltinType::Float16:
2233 case BuiltinType::Half:
2234 if (Target->hasFloat16Type() || !
getLangOpts().OpenMP ||
2236 Width = Target->getHalfWidth();
2237 Align = Target->getHalfAlign();
2240 "Expected OpenMP device compilation.");
2241 Width = AuxTarget->getHalfWidth();
2242 Align = AuxTarget->getHalfAlign();
2245 case BuiltinType::Float:
2246 Width = Target->getFloatWidth();
2247 Align = Target->getFloatAlign();
2249 case BuiltinType::Double:
2250 Width = Target->getDoubleWidth();
2251 Align = Target->getDoubleAlign();
2253 case BuiltinType::Ibm128:
2254 Width = Target->getIbm128Width();
2255 Align = Target->getIbm128Align();
2257 case BuiltinType::LongDouble:
2259 (Target->getLongDoubleWidth() != AuxTarget->getLongDoubleWidth() ||
2260 Target->getLongDoubleAlign() != AuxTarget->getLongDoubleAlign())) {
2261 Width = AuxTarget->getLongDoubleWidth();
2262 Align = AuxTarget->getLongDoubleAlign();
2264 Width = Target->getLongDoubleWidth();
2265 Align = Target->getLongDoubleAlign();
2268 case BuiltinType::Float128:
2269 if (Target->hasFloat128Type() || !
getLangOpts().OpenMP ||
2271 Width = Target->getFloat128Width();
2272 Align = Target->getFloat128Align();
2275 "Expected OpenMP device compilation.");
2276 Width = AuxTarget->getFloat128Width();
2277 Align = AuxTarget->getFloat128Align();
2280 case BuiltinType::NullPtr:
2285 case BuiltinType::ObjCId:
2286 case BuiltinType::ObjCClass:
2287 case BuiltinType::ObjCSel:
2291 case BuiltinType::OCLSampler:
2292 case BuiltinType::OCLEvent:
2293 case BuiltinType::OCLClkEvent:
2294 case BuiltinType::OCLQueue:
2295 case BuiltinType::OCLReserveID:
2296#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
2297 case BuiltinType::Id:
2298#include "clang/Basic/OpenCLImageTypes.def"
2299#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
2300 case BuiltinType::Id:
2301#include "clang/Basic/OpenCLExtensionTypes.def"
2303 Width = Target->getPointerWidth(AS);
2304 Align = Target->getPointerAlign(AS);
2314#define SVE_VECTOR_TYPE(Name, MangledName, Id, SingletonId) \
2315 case BuiltinType::Id: \
2319#define SVE_PREDICATE_TYPE(Name, MangledName, Id, SingletonId) \
2320 case BuiltinType::Id: \
2324#define SVE_OPAQUE_TYPE(Name, MangledName, Id, SingletonId) \
2325 case BuiltinType::Id: \
2329#define SVE_SCALAR_TYPE(Name, MangledName, Id, SingletonId, Bits) \
2330 case BuiltinType::Id: \
2334#include "clang/Basic/AArch64ACLETypes.def"
2335#define PPC_VECTOR_TYPE(Name, Id, Size) \
2336 case BuiltinType::Id: \
2340#include "clang/Basic/PPCTypes.def"
2341#define RVV_VECTOR_TYPE(Name, Id, SingletonId, ElKind, ElBits, NF, IsSigned, \
2343 case BuiltinType::Id: \
2347#define RVV_PREDICATE_TYPE(Name, Id, SingletonId, ElKind) \
2348 case BuiltinType::Id: \
2352#include "clang/Basic/RISCVVTypes.def"
2353#define WASM_TYPE(Name, Id, SingletonId) \
2354 case BuiltinType::Id: \
2358#include "clang/Basic/WebAssemblyReferenceTypes.def"
2359#define AMDGPU_TYPE(NAME, ID, SINGLETONID, WIDTH, ALIGN) \
2360 case BuiltinType::ID: \
2364#include "clang/Basic/AMDGPUTypes.def"
2365#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
2366#include "clang/Basic/HLSLIntangibleTypes.def"
2372 case Type::ObjCObjectPointer:
2376 case Type::BlockPointer:
2378 Width = Target->getPointerWidth(AS);
2379 Align = Target->getPointerAlign(AS);
2381 case Type::LValueReference:
2382 case Type::RValueReference:
2386 Width = Target->getPointerWidth(AS);
2387 Align = Target->getPointerAlign(AS);
2391 Width = Target->getPointerWidth(AS);
2392 Align = Target->getPointerAlign(AS);
2394 case Type::MemberPointer: {
2396 CXXABI::MemberPointerInfo MPI = ABI->getMemberPointerInfo(MPT);
2401 case Type::Complex: {
2405 Width = EltInfo.
Width * 2;
2406 Align = EltInfo.
Align;
2409 case Type::ObjCObject:
2411 case Type::Adjusted:
2414 case Type::ObjCInterface: {
2416 if (ObjCI->getDecl()->isInvalidDecl()) {
2426 case Type::BitInt: {
2428 Align = Target->getBitIntAlign(EIT->getNumBits());
2429 Width = Target->getBitIntWidth(EIT->getNumBits());
2435 const TagDecl *TD = TT->getDecl()->getDefinitionOrSelf();
2448 Info.
Align = AttrAlign;
2458 AlignRequirement = RD->
hasAttr<AlignedAttr>()
2464 case Type::SubstTemplateTypeParm:
2466 getReplacementType().getTypePtr());
2469 case Type::DeducedTemplateSpecialization: {
2471 assert(!A->getDeducedType().isNull() &&
2472 "cannot request the size of an undeduced or dependent auto type");
2473 return getTypeInfo(A->getDeducedType().getTypePtr());
2479 case Type::MacroQualified:
2483 case Type::ObjCTypeParam:
2489 case Type::Typedef: {
2491 TypeInfo Info =
getTypeInfo(TT->desugar().getTypePtr());
2495 if (
unsigned AttrAlign = TT->getDecl()->getMaxAlignment()) {
2506 case Type::Attributed:
2510 case Type::CountAttributed:
2513 case Type::BTFTagAttributed:
2517 case Type::OverflowBehavior:
2521 case Type::HLSLAttributedResource:
2525 case Type::HLSLInlineSpirv: {
2528 Width = ST->getSize() * 8;
2529 Align = ST->getAlignment();
2530 if (Width == 0 && Align == 0) {
2538 case Type::Atomic: {
2547 Width = Target->getCharWidth();
2549 }
else if (Width <= Target->getMaxAtomicPromoteWidth()) {
2555 Width = llvm::bit_ceil(Width);
2558 Align =
static_cast<unsigned>(Width);
2563 case Type::PredefinedSugar:
2572 assert(llvm::isPowerOf2_32(Align) &&
"Alignment must be power of 2");
2573 return TypeInfo(Width, Align, AlignRequirement);
2577 UnadjustedAlignMap::iterator I = MemoizedUnadjustedAlign.find(T);
2578 if (I != MemoizedUnadjustedAlign.end())
2581 unsigned UnadjustedAlign;
2582 if (
const auto *RT = T->getAsCanonical<RecordType>()) {
2589 UnadjustedAlign =
getTypeAlign(T->getUnqualifiedDesugaredType());
2592 MemoizedUnadjustedAlign[T] = UnadjustedAlign;
2593 return UnadjustedAlign;
2597 unsigned SimdAlign = llvm::OpenMPIRBuilder::getOpenMPDefaultSimdAlign(
2647 unsigned ABIAlign = TI.
Align;
2649 T = T->getBaseElementTypeUnsafe();
2652 if (T->isMemberPointerType())
2655 if (!Target->allowsLargerPreferedTypeAlignment())
2658 if (
const auto *RD = T->getAsRecordDecl()) {
2667 unsigned PreferredAlign =
static_cast<unsigned>(
2669 assert(PreferredAlign >= ABIAlign &&
2670 "PreferredAlign should be at least as large as ABIAlign.");
2671 return PreferredAlign;
2678 T = CT->getElementType().getTypePtr();
2679 if (
const auto *ED = T->getAsEnumDecl())
2680 T = ED->getIntegerType().getTypePtr();
2681 if (T->isSpecificBuiltinType(BuiltinType::Double) ||
2682 T->isSpecificBuiltinType(BuiltinType::LongLong) ||
2683 T->isSpecificBuiltinType(BuiltinType::ULongLong) ||
2684 (T->isSpecificBuiltinType(BuiltinType::LongDouble) &&
2685 Target->defaultsToAIXPowerAlignment()))
2689 return std::max(ABIAlign, (
unsigned)
getTypeSize(T));
2740 for (
unsigned I = 0, N = Path.size(); I != N; ++I) {
2744 std::swap(
Base, Derived);
2764 llvm::append_range(Ivars, OI->
ivars());
2767 for (
const ObjCIvarDecl *Iv = IDecl->all_declared_ivar_begin(); Iv;
2769 Ivars.push_back(Iv);
2777 if (
const auto *OI = dyn_cast<ObjCInterfaceDecl>(CDecl)) {
2780 for (
auto *Proto : OI->all_referenced_protocols()) {
2785 for (
const auto *Cat : OI->visible_categories())
2791 SD = SD->getSuperClass();
2793 }
else if (
const auto *OC = dyn_cast<ObjCCategoryDecl>(CDecl)) {
2794 for (
auto *Proto : OC->protocols()) {
2797 }
else if (
const auto *OP = dyn_cast<ObjCProtocolDecl>(CDecl)) {
2799 if (!Protocols.insert(
2803 for (
auto *Proto : OP->protocols())
2810 bool CheckIfTriviallyCopyable) {
2811 assert(RD->
isUnion() &&
"Must be union type");
2813 Context.getTypeSizeInChars(Context.getCanonicalTagType(RD));
2815 for (
const auto *Field : RD->
fields()) {
2816 if (!Context.hasUniqueObjectRepresentations(Field->getType(),
2817 CheckIfTriviallyCopyable))
2819 CharUnits FieldSize = Context.getTypeSizeInChars(Field->getType());
2820 if (FieldSize != UnionSize)
2829 return Context.getFieldOffset(Field);
2838static std::optional<int64_t>
2840 const RecordDecl *RD,
2841 bool CheckIfTriviallyCopyable);
2843static std::optional<int64_t>
2845 bool CheckIfTriviallyCopyable) {
2846 if (
const auto *RD = Field->getType()->getAsRecordDecl();
2849 CheckIfTriviallyCopyable);
2853 bool IsBitIntType = Field->getType()->isBitIntType();
2854 if (!Field->getType()->isReferenceType() && !IsBitIntType &&
2855 !Context.hasUniqueObjectRepresentations(Field->getType(),
2856 CheckIfTriviallyCopyable))
2857 return std::nullopt;
2859 int64_t FieldSizeInBits =
2860 Context.toBits(Context.getTypeSizeInChars(Field->getType()));
2861 if (Field->isBitField()) {
2864 if (Field->isUnnamedBitField())
2867 int64_t BitfieldSize = Field->getBitWidthValue();
2869 if ((
unsigned)BitfieldSize >
2871 return std::nullopt;
2872 }
else if (BitfieldSize > FieldSizeInBits) {
2873 return std::nullopt;
2875 FieldSizeInBits = BitfieldSize;
2876 }
else if (IsBitIntType && !Context.hasUniqueObjectRepresentations(
2877 Field->getType(), CheckIfTriviallyCopyable)) {
2878 return std::nullopt;
2880 return FieldSizeInBits;
2883static std::optional<int64_t>
2885 bool CheckIfTriviallyCopyable) {
2887 CheckIfTriviallyCopyable);
2890template <
typename RangeT>
2892 const RangeT &Subobjects, int64_t CurOffsetInBits,
2894 bool CheckIfTriviallyCopyable) {
2895 for (
const auto *Subobject : Subobjects) {
2896 std::optional<int64_t> SizeInBits =
2899 return std::nullopt;
2900 if (*SizeInBits != 0) {
2902 if (Offset != CurOffsetInBits)
2903 return std::nullopt;
2904 CurOffsetInBits += *SizeInBits;
2907 return CurOffsetInBits;
2910static std::optional<int64_t>
2913 bool CheckIfTriviallyCopyable) {
2914 assert(!RD->
isUnion() &&
"Must be struct/class type");
2915 const auto &Layout = Context.getASTRecordLayout(RD);
2917 int64_t CurOffsetInBits = 0;
2918 if (
const auto *ClassDecl = dyn_cast<CXXRecordDecl>(RD)) {
2919 if (ClassDecl->isDynamicClass())
2920 return std::nullopt;
2923 for (
const auto &
Base : ClassDecl->bases()) {
2926 Bases.emplace_back(
Base.getType()->getAsCXXRecordDecl());
2930 return Layout.getBaseClassOffset(L) < Layout.getBaseClassOffset(R);
2933 std::optional<int64_t> OffsetAfterBases =
2935 Bases, CurOffsetInBits, Context, Layout, CheckIfTriviallyCopyable);
2936 if (!OffsetAfterBases)
2937 return std::nullopt;
2938 CurOffsetInBits = *OffsetAfterBases;
2941 std::optional<int64_t> OffsetAfterFields =
2943 RD->
fields(), CurOffsetInBits, Context, Layout,
2944 CheckIfTriviallyCopyable);
2945 if (!OffsetAfterFields)
2946 return std::nullopt;
2947 CurOffsetInBits = *OffsetAfterFields;
2949 return CurOffsetInBits;
2953 QualType Ty,
bool CheckIfTriviallyCopyable)
const {
2970 assert(!Ty.
isNull() &&
"Null QualType sent to unique object rep check");
2975 CheckIfTriviallyCopyable);
2978 "hasUniqueObjectRepresentations should not be called with an "
3002 return !ABI->getMemberPointerInfo(MPT).HasPadding;
3005 if (
Record->isInvalidDecl())
3010 CheckIfTriviallyCopyable);
3013 *
this,
Record, CheckIfTriviallyCopyable);
3015 return StructSize && *StructSize ==
static_cast<int64_t
>(
getTypeSize(Ty));
3036 count += Ext->ivar_size();
3041 count += ImplDecl->ivar_size();
3067 llvm::DenseMap<ObjCContainerDecl*, ObjCImplDecl*>::iterator
3068 I = ObjCImpls.find(D);
3069 if (I != ObjCImpls.end())
3077 llvm::DenseMap<ObjCContainerDecl*, ObjCImplDecl*>::iterator
3078 I = ObjCImpls.find(D);
3079 if (I != ObjCImpls.end())
3087 assert(IFaceD && ImplD &&
"Passed null params");
3088 ObjCImpls[IFaceD] = ImplD;
3094 assert(CatD && ImplD &&
"Passed null params");
3095 ObjCImpls[CatD] = ImplD;
3100 return ObjCMethodRedecls.
lookup(MD);
3106 ObjCMethodRedecls[MD] = Redecl;
3111 if (
const auto *ID = dyn_cast<ObjCInterfaceDecl>(ND->
getDeclContext()))
3113 if (
const auto *CD = dyn_cast<ObjCCategoryDecl>(ND->
getDeclContext()))
3114 return CD->getClassInterface();
3115 if (
const auto *IMD = dyn_cast<ObjCImplDecl>(ND->
getDeclContext()))
3116 return IMD->getClassInterface();
3124 assert(VD &&
"Passed null params");
3125 assert(VD->
hasAttr<BlocksAttr>() &&
3126 "getBlockVarCopyInits - not __block var");
3127 auto I = BlockVarCopyInits.find(VD);
3128 if (I != BlockVarCopyInits.end())
3130 return {
nullptr,
false};
3136 assert(VD && CopyExpr &&
"Passed null params");
3137 assert(VD->
hasAttr<BlocksAttr>() &&
3138 "setBlockVarCopyInits - not __block var");
3139 BlockVarCopyInits[VD].setExprAndFlag(CopyExpr,
CanThrow);
3143 unsigned DataSize)
const {
3148 "incorrect data size provided to CreateTypeSourceInfo!");
3165 return getObjCLayout(D);
3170 bool &AnyNonCanonArgs) {
3172 AnyNonCanonArgs |=
C.canonicalizeTemplateArguments(CanonArgs);
3178 bool AnyNonCanonArgs =
false;
3179 for (
auto &Arg : Args) {
3182 AnyNonCanonArgs |= !Arg.structurallyEquals(OrigArg);
3184 return AnyNonCanonArgs;
3192ASTContext::getExtQualType(
const Type *baseType,
Qualifiers quals)
const {
3197 llvm::FoldingSetNodeID ID;
3199 void *insertPos =
nullptr;
3200 if (
ExtQuals *eq = ExtQualNodes.FindNodeOrInsertPos(ID, insertPos)) {
3201 assert(eq->getQualifiers() == quals);
3210 canon = getExtQualType(canonSplit.
Ty, canonSplit.
Quals);
3213 (void) ExtQualNodes.FindNodeOrInsertPos(ID, insertPos);
3216 auto *eq =
new (*
this,
alignof(ExtQuals)) ExtQuals(baseType, canon, quals);
3217 ExtQualNodes.InsertNode(eq, insertPos);
3218 return QualType(eq, fastQuals);
3222 LangAS AddressSpace)
const {
3235 "Type cannot be in multiple addr spaces!");
3238 return getExtQualType(TypeNode, Quals);
3244 if (!T.hasAddressSpace())
3248 const Type *TypeNode;
3251 if (T.getTypePtr()->isArrayType()) {
3253 TypeNode = T.getTypePtr();
3257 while (T.hasAddressSpace()) {
3258 TypeNode = Quals.
strip(T);
3262 if (!
QualType(TypeNode, 0).hasAddressSpace())
3266 T = T.getSingleStepDesugaredType(*
this);
3276 return getExtQualType(TypeNode, Quals);
3284 "Attempted to get vtable pointer discriminator on a monomorphic type");
3287 llvm::raw_svector_ostream Out(Str);
3288 MC->mangleCXXVTable(RD, Out);
3289 return llvm::getPointerAuthStableSipHash(Str);
3315 switch (T->getTypeClass()) {
3320 case Type::LValueReference:
3325 case Type::RValueReference:
3339 case Type::ObjCObjectPointer:
3340 case Type::BlockPointer:
3349 case Type::VariableArray:
3350 case Type::ConstantArray:
3351 case Type::IncompleteArray:
3352 case Type::ArrayParameter:
3365 case Type::ObjCInterface:
3366 case Type::ObjCObject:
3367 OS <<
"<objc_object>";
3378 Ctx, OS, UnderlyingType.
isNull() ? Ctx.
IntTy : UnderlyingType);
3381 case Type::FunctionNoProto:
3382 case Type::FunctionProto: {
3398 if (
const auto *FPT = dyn_cast<FunctionProtoType>(FuncType)) {
3399 for (
QualType Param : FPT->param_types()) {
3403 if (FPT->isVariadic())
3410 case Type::MemberPointer: {
3414 Ctx, OS,
QualType(MPT->getQualifier().getAsType(), 0));
3418 case Type::ExtVector:
3426 case Type::ConstantMatrix:
3430 case Type::Builtin: {
3432 switch (BTy->getKind()) {
3433#define SIGNED_TYPE(Id, SingletonId) \
3434 case BuiltinType::Id: \
3437#define UNSIGNED_TYPE(Id, SingletonId) \
3438 case BuiltinType::Id: \
3441#define PLACEHOLDER_TYPE(Id, SingletonId) case BuiltinType::Id:
3442#define BUILTIN_TYPE(Id, SingletonId)
3443#include "clang/AST/BuiltinTypes.def"
3444 llvm_unreachable(
"placeholder types should not appear here.");
3446 case BuiltinType::Half:
3449 case BuiltinType::Float:
3452 case BuiltinType::Double:
3455 case BuiltinType::LongDouble:
3458 case BuiltinType::Float16:
3461 case BuiltinType::Float128:
3465 case BuiltinType::Void:
3469 case BuiltinType::ObjCId:
3470 case BuiltinType::ObjCClass:
3471 case BuiltinType::ObjCSel:
3472 case BuiltinType::NullPtr:
3477 case BuiltinType::OCLSampler:
3478 case BuiltinType::OCLEvent:
3479 case BuiltinType::OCLClkEvent:
3480 case BuiltinType::OCLQueue:
3481 case BuiltinType::OCLReserveID:
3482 case BuiltinType::BFloat16:
3483 case BuiltinType::VectorQuad:
3484 case BuiltinType::VectorPair:
3485 case BuiltinType::DMR1024:
3486 case BuiltinType::DMR2048:
3491 case BuiltinType::Ibm128:
3493#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
3494 case BuiltinType::Id: \
3496#include "clang/Basic/OpenCLImageTypes.def"
3497#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
3498 case BuiltinType::Id: \
3500#include "clang/Basic/OpenCLExtensionTypes.def"
3501#define SVE_TYPE(Name, Id, SingletonId) \
3502 case BuiltinType::Id: \
3504#include "clang/Basic/AArch64ACLETypes.def"
3505#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) \
3506 case BuiltinType::Id: \
3508#include "clang/Basic/HLSLIntangibleTypes.def"
3509 case BuiltinType::Dependent:
3510 llvm_unreachable(
"should never get here");
3511#define AMDGPU_TYPE(Name, Id, SingletonId, Width, Align) case BuiltinType::Id:
3512#include "clang/Basic/AMDGPUTypes.def"
3513 case BuiltinType::WasmExternRef:
3514#define RVV_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
3515#include "clang/Basic/RISCVVTypes.def"
3516 llvm_unreachable(
"not yet implemented");
3518 llvm_unreachable(
"should never get here");
3520 case Type::Record: {
3521 const RecordDecl *RD = T->castAsCanonical<RecordType>()->getDecl();
3541 II = Typedef->getDeclName().getAsIdentifierInfo();
3544 OS <<
"<anonymous_record>";
3550 case Type::HLSLAttributedResource:
3551 case Type::HLSLInlineSpirv:
3552 llvm_unreachable(
"should never get here");
3554 case Type::OverflowBehavior:
3555 llvm_unreachable(
"should never get here");
3557 case Type::DeducedTemplateSpecialization:
3559#define NON_CANONICAL_TYPE(Class, Base) case Type::Class:
3560#define DEPENDENT_TYPE(Class, Base) case Type::Class:
3561#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base) case Type::Class:
3562#define ABSTRACT_TYPE(Class, Base)
3563#define TYPE(Class, Base)
3564#include "clang/AST/TypeNodes.inc"
3565 llvm_unreachable(
"unexpected non-canonical or dependent type!");
3571 assert(!T->isDependentType() &&
3572 "cannot compute type discriminator of a dependent type");
3574 llvm::raw_svector_ostream Out(Str);
3576 if (T->isFunctionPointerType() || T->isFunctionReferenceType())
3577 T = T->getPointeeType();
3579 if (T->isFunctionType()) {
3582 T = T.getUnqualifiedType();
3603 if (MPT->isMemberFunctionPointer()) {
3609 MPT->getMostRecentCXXRecordDecl());
3613 MC->mangleCanonicalTypeName(T, Out);
3616 return llvm::getPointerAuthStableSipHash(Str);
3641 "Type cannot have multiple ObjCGCs!");
3644 return getExtQualType(TypeNode, Quals);
3658 QualType WrappedTy,
Expr *CountExpr,
bool CountInBytes,
bool OrNull,
3662 llvm::FoldingSetNodeID ID;
3665 void *InsertPos =
nullptr;
3667 CountAttributedTypes.FindNodeOrInsertPos(ID, InsertPos);
3672 size_t Size = CountAttributedType::totalSizeToAlloc<TypeCoupledDeclRefInfo>(
3673 DependentDecls.size());
3676 OrNull, DependentDecls);
3677 Types.push_back(CATy);
3678 CountAttributedTypes.InsertNode(CATy, InsertPos);
3687 case Type::Attributed: {
3695 case Type::BTFTagAttributed: {
3696 const auto *BTFT = dyn_cast<BTFTagAttributedType>(Orig);
3701 case Type::OverflowBehavior: {
3702 const auto *OB = dyn_cast<OverflowBehaviorType>(Orig);
3704 adjustType(OB->getUnderlyingType(), Adjust));
3711 case Type::Adjusted: {
3717 case Type::MacroQualified: {
3720 MQT->getMacroIdentifier());
3724 return Adjust(Orig);
3730 if (T->getExtInfo() == Info)
3734 if (
const auto *FNPT = dyn_cast<FunctionNoProtoType>(T)) {
3754 FPT->getExtProtoInfo());
3769 L->DeducedReturnType(FD, ResultType);
3780 return getFunctionType(Proto->getReturnType(), Proto->getParamTypes(),
3781 Proto->getExtProtoInfo().withExceptionSpec(ESI));
3797 for (
unsigned i = 0, n = Args.size(); i != n; ++i)
3820 return getFunctionType(Proto->getReturnType(), Proto->param_types(), EPI);
3846 if (TSInfo->getType() != FD->
getType())
3854 "TypeLoc size mismatch from updating exception specification");
3855 TSInfo->overrideType(Updated);
3864 llvm::FoldingSetNodeID ID;
3867 void *InsertPos =
nullptr;
3868 if (
ComplexType *CT = ComplexTypes.FindNodeOrInsertPos(ID, InsertPos))
3874 if (!T.isCanonical()) {
3878 ComplexType *NewIP = ComplexTypes.FindNodeOrInsertPos(ID, InsertPos);
3879 assert(!NewIP &&
"Shouldn't be in the map!"); (void)NewIP;
3882 Types.push_back(
New);
3883 ComplexTypes.InsertNode(
New, InsertPos);
3892 llvm::FoldingSetNodeID ID;
3895 void *InsertPos =
nullptr;
3896 if (
PointerType *PT = PointerTypes.FindNodeOrInsertPos(ID, InsertPos))
3902 if (!T.isCanonical()) {
3906 PointerType *NewIP = PointerTypes.FindNodeOrInsertPos(ID, InsertPos);
3907 assert(!NewIP &&
"Shouldn't be in the map!"); (void)NewIP;
3910 Types.push_back(
New);
3911 PointerTypes.InsertNode(
New, InsertPos);
3916 llvm::FoldingSetNodeID ID;
3918 void *InsertPos =
nullptr;
3919 AdjustedType *AT = AdjustedTypes.FindNodeOrInsertPos(ID, InsertPos);
3926 AT = AdjustedTypes.FindNodeOrInsertPos(ID, InsertPos);
3927 assert(!AT &&
"Shouldn't be in the map!");
3931 Types.push_back(AT);
3932 AdjustedTypes.InsertNode(AT, InsertPos);
3937 llvm::FoldingSetNodeID ID;
3939 void *InsertPos =
nullptr;
3940 AdjustedType *AT = AdjustedTypes.FindNodeOrInsertPos(ID, InsertPos);
3947 AT = AdjustedTypes.FindNodeOrInsertPos(ID, InsertPos);
3948 assert(!AT &&
"Shouldn't be in the map!");
3951 Types.push_back(AT);
3952 AdjustedTypes.InsertNode(AT, InsertPos);
3957 assert((T->isArrayType() || T->isFunctionType()) &&
"T does not decay");
3966 if (T->isArrayType())
3973 if (T->isFunctionType())
3985 llvm::FoldingSetNodeID ID;
3986 ATy->Profile(ID, *
this, ATy->getElementType(), ATy->getZExtSize(),
3987 ATy->getSizeExpr(), ATy->getSizeModifier(),
3988 ATy->getIndexTypeQualifiers().getAsOpaqueValue());
3989 void *InsertPos =
nullptr;
3991 ArrayParameterTypes.FindNodeOrInsertPos(ID, InsertPos);
4000 AT = ArrayParameterTypes.FindNodeOrInsertPos(ID, InsertPos);
4001 assert(!AT &&
"Shouldn't be in the map!");
4006 Types.push_back(AT);
4007 ArrayParameterTypes.InsertNode(AT, InsertPos);
4014 assert(T->isFunctionType() &&
"block of function types only");
4017 llvm::FoldingSetNodeID ID;
4020 void *InsertPos =
nullptr;
4022 BlockPointerTypes.FindNodeOrInsertPos(ID, InsertPos))
4028 if (!T.isCanonical()) {
4033 BlockPointerTypes.FindNodeOrInsertPos(ID, InsertPos);
4034 assert(!NewIP &&
"Shouldn't be in the map!"); (void)NewIP;
4038 Types.push_back(
New);
4039 BlockPointerTypes.InsertNode(
New, InsertPos);
4047 assert((!T->isPlaceholderType() ||
4048 T->isSpecificPlaceholderType(BuiltinType::UnknownAny)) &&
4049 "Unresolved placeholder type");
4053 llvm::FoldingSetNodeID ID;
4056 void *InsertPos =
nullptr;
4058 LValueReferenceTypes.FindNodeOrInsertPos(ID, InsertPos))
4066 if (!SpelledAsLValue || InnerRef || !T.isCanonical()) {
4067 QualType PointeeType = (InnerRef ? InnerRef->getPointeeType() : T);
4072 LValueReferenceTypes.FindNodeOrInsertPos(ID, InsertPos);
4073 assert(!NewIP &&
"Shouldn't be in the map!"); (void)NewIP;
4078 Types.push_back(
New);
4079 LValueReferenceTypes.InsertNode(
New, InsertPos);
4087 assert((!T->isPlaceholderType() ||
4088 T->isSpecificPlaceholderType(BuiltinType::UnknownAny)) &&
4089 "Unresolved placeholder type");
4093 llvm::FoldingSetNodeID ID;
4096 void *InsertPos =
nullptr;
4098 RValueReferenceTypes.FindNodeOrInsertPos(ID, InsertPos))
4106 if (InnerRef || !T.isCanonical()) {
4107 QualType PointeeType = (InnerRef ? InnerRef->getPointeeType() : T);
4112 RValueReferenceTypes.FindNodeOrInsertPos(ID, InsertPos);
4113 assert(!NewIP &&
"Shouldn't be in the map!"); (void)NewIP;
4118 Types.push_back(
New);
4119 RValueReferenceTypes.InsertNode(
New, InsertPos);
4127 assert(Cls &&
"At least one of Qualifier or Cls must be provided");
4130 Cls = Qualifier.getAsRecordDecl();
4134 llvm::FoldingSetNodeID ID;
4137 void *InsertPos =
nullptr;
4139 MemberPointerTypes.FindNodeOrInsertPos(ID, InsertPos))
4144 return Qualifier.getCanonical();
4146 assert(R.isCanonical());
4152 if (!T.isCanonical() || Qualifier != CanonicalQualifier) {
4158 MemberPointerTypes.FindNodeOrInsertPos(ID, InsertPos);
4159 assert(!NewIP &&
"Shouldn't be in the map!");
4163 Types.push_back(
New);
4164 MemberPointerTypes.InsertNode(
New, InsertPos);
4171 const llvm::APInt &ArySizeIn,
4172 const Expr *SizeExpr,
4174 unsigned IndexTypeQuals)
const {
4177 "Constant array of VLAs is illegal!");
4185 llvm::APInt ArySize(ArySizeIn);
4186 ArySize = ArySize.zextOrTrunc(Target->getMaxPointerWidth());
4188 llvm::FoldingSetNodeID ID;
4190 ASM, IndexTypeQuals);
4192 void *InsertPos =
nullptr;
4194 ConstantArrayTypes.FindNodeOrInsertPos(ID, InsertPos))
4205 ASM, IndexTypeQuals);
4210 ConstantArrayTypes.FindNodeOrInsertPos(ID, InsertPos);
4211 assert(!NewIP &&
"Shouldn't be in the map!"); (void)NewIP;
4214 auto *
New = ConstantArrayType::Create(*
this, EltTy, Canon, ArySize, SizeExpr,
4215 ASM, IndexTypeQuals);
4216 ConstantArrayTypes.InsertNode(
New, InsertPos);
4217 Types.push_back(
New);
4226 if (!
type->isVariablyModifiedType())
return type;
4231 const Type *ty = split.
Ty;
4233#define TYPE(Class, Base)
4234#define ABSTRACT_TYPE(Class, Base)
4235#define NON_CANONICAL_TYPE(Class, Base) case Type::Class:
4236#include "clang/AST/TypeNodes.inc"
4237 llvm_unreachable(
"didn't desugar past all non-canonical types?");
4243 case Type::DependentVector:
4244 case Type::ExtVector:
4245 case Type::DependentSizedExtVector:
4246 case Type::ConstantMatrix:
4247 case Type::DependentSizedMatrix:
4248 case Type::DependentAddressSpace:
4249 case Type::ObjCObject:
4250 case Type::ObjCInterface:
4251 case Type::ObjCObjectPointer:
4254 case Type::UnresolvedUsing:
4255 case Type::TypeOfExpr:
4257 case Type::Decltype:
4258 case Type::UnaryTransform:
4259 case Type::DependentName:
4260 case Type::InjectedClassName:
4261 case Type::TemplateSpecialization:
4262 case Type::TemplateTypeParm:
4263 case Type::SubstTemplateTypeParmPack:
4264 case Type::SubstBuiltinTemplatePack:
4266 case Type::DeducedTemplateSpecialization:
4267 case Type::PackExpansion:
4268 case Type::PackIndexing:
4270 case Type::DependentBitInt:
4271 case Type::ArrayParameter:
4272 case Type::HLSLAttributedResource:
4273 case Type::HLSLInlineSpirv:
4274 case Type::OverflowBehavior:
4275 llvm_unreachable(
"type should never be variably-modified");
4279 case Type::FunctionNoProto:
4280 case Type::FunctionProto:
4281 case Type::BlockPointer:
4282 case Type::MemberPointer:
4295 case Type::LValueReference: {
4299 lv->isSpelledAsLValue());
4303 case Type::RValueReference: {
4310 case Type::Atomic: {
4316 case Type::ConstantArray: {
4322 cat->getSizeModifier(),
4323 cat->getIndexTypeCVRQualifiers());
4327 case Type::DependentSizedArray: {
4331 dat->getSizeModifier(), dat->getIndexTypeCVRQualifiers());
4336 case Type::IncompleteArray: {
4341 iat->getIndexTypeCVRQualifiers());
4346 case Type::VariableArray: {
4351 vat->getIndexTypeCVRQualifiers());
4364 unsigned IndexTypeQuals)
const {
4381 VariableArrayTypes.push_back(
New);
4382 Types.push_back(
New);
4392 unsigned elementTypeQuals)
const {
4395 "Size must be type- or value-dependent!");
4399 void *insertPos =
nullptr;
4400 llvm::FoldingSetNodeID ID;
4402 ID, *
this, numElements ?
QualType(canonElementType.
Ty, 0) : elementType,
4403 ASM, elementTypeQuals, numElements);
4407 DependentSizedArrayTypes.FindNodeOrInsertPos(ID, insertPos);
4419 DependentSizedArrayTypes.InsertNode(newType, insertPos);
4420 Types.push_back(newType);
4428 numElements, ASM, elementTypeQuals);
4429 DependentSizedArrayTypes.InsertNode(canonTy, insertPos);
4430 Types.push_back(canonTy);
4435 canonElementType.
Quals);
4439 if (
QualType(canonElementType.
Ty, 0) == elementType &&
4448 Types.push_back(sugaredType);
4454 unsigned elementTypeQuals)
const {
4455 llvm::FoldingSetNodeID ID;
4458 void *insertPos =
nullptr;
4460 IncompleteArrayTypes.FindNodeOrInsertPos(ID, insertPos))
4472 ASM, elementTypeQuals);
4477 IncompleteArrayTypes.FindNodeOrInsertPos(ID, insertPos);
4478 assert(!existing &&
"Shouldn't be in the map!"); (void) existing;
4484 IncompleteArrayTypes.InsertNode(newType, insertPos);
4485 Types.push_back(newType);
4491#define SVE_INT_ELTTY(BITS, ELTS, SIGNED, NUMVECTORS) \
4492 {getIntTypeForBitwidth(BITS, SIGNED), llvm::ElementCount::getScalable(ELTS), \
4495#define SVE_ELTTY(ELTTY, ELTS, NUMVECTORS) \
4496 {ELTTY, llvm::ElementCount::getScalable(ELTS), NUMVECTORS};
4500 llvm_unreachable(
"Unsupported builtin vector type");
4502#define SVE_VECTOR_TYPE_INT(Name, MangledName, Id, SingletonId, NumEls, \
4503 ElBits, NF, IsSigned) \
4504 case BuiltinType::Id: \
4505 return {getIntTypeForBitwidth(ElBits, IsSigned), \
4506 llvm::ElementCount::getScalable(NumEls), NF};
4507#define SVE_VECTOR_TYPE_FLOAT(Name, MangledName, Id, SingletonId, NumEls, \
4509 case BuiltinType::Id: \
4510 return {ElBits == 16 ? HalfTy : (ElBits == 32 ? FloatTy : DoubleTy), \
4511 llvm::ElementCount::getScalable(NumEls), NF};
4512#define SVE_VECTOR_TYPE_BFLOAT(Name, MangledName, Id, SingletonId, NumEls, \
4514 case BuiltinType::Id: \
4515 return {BFloat16Ty, llvm::ElementCount::getScalable(NumEls), NF};
4516#define SVE_VECTOR_TYPE_MFLOAT(Name, MangledName, Id, SingletonId, NumEls, \
4518 case BuiltinType::Id: \
4519 return {MFloat8Ty, llvm::ElementCount::getScalable(NumEls), NF};
4520#define SVE_PREDICATE_TYPE_ALL(Name, MangledName, Id, SingletonId, NumEls, NF) \
4521 case BuiltinType::Id: \
4522 return {BoolTy, llvm::ElementCount::getScalable(NumEls), NF};
4523#include "clang/Basic/AArch64ACLETypes.def"
4525#define RVV_VECTOR_TYPE_INT(Name, Id, SingletonId, NumEls, ElBits, NF, \
4527 case BuiltinType::Id: \
4528 return {getIntTypeForBitwidth(ElBits, IsSigned), \
4529 llvm::ElementCount::getScalable(NumEls), NF};
4530#define RVV_VECTOR_TYPE_FLOAT(Name, Id, SingletonId, NumEls, ElBits, NF) \
4531 case BuiltinType::Id: \
4532 return {ElBits == 16 ? Float16Ty : (ElBits == 32 ? FloatTy : DoubleTy), \
4533 llvm::ElementCount::getScalable(NumEls), NF};
4534#define RVV_VECTOR_TYPE_BFLOAT(Name, Id, SingletonId, NumEls, ElBits, NF) \
4535 case BuiltinType::Id: \
4536 return {BFloat16Ty, llvm::ElementCount::getScalable(NumEls), NF};
4537#define RVV_PREDICATE_TYPE(Name, Id, SingletonId, NumEls) \
4538 case BuiltinType::Id: \
4539 return {BoolTy, llvm::ElementCount::getScalable(NumEls), 1};
4540#include "clang/Basic/RISCVVTypes.def"
4547 if (Target->getTriple().isWasm() && Target->hasFeature(
"reference-types")) {
4548#define WASM_REF_TYPE(Name, MangledName, Id, SingletonId, AS) \
4549 if (BuiltinType::Id == BuiltinType::WasmExternRef) \
4551#include "clang/Basic/WebAssemblyReferenceTypes.def"
4554 "shouldn't try to generate type externref outside WebAssembly target");
4561 unsigned NumFields)
const {
4563 if (
auto It = ScalableVecTyMap.find(K); It != ScalableVecTyMap.end())
4566 if (Target->hasAArch64ACLETypes()) {
4569#define SVE_VECTOR_TYPE_INT(Name, MangledName, Id, SingletonId, NumEls, \
4570 ElBits, NF, IsSigned) \
4571 if (EltTy->hasIntegerRepresentation() && !EltTy->isBooleanType() && \
4572 EltTy->hasSignedIntegerRepresentation() == IsSigned && \
4573 EltTySize == ElBits && NumElts == (NumEls * NF) && NumFields == 1) { \
4574 return ScalableVecTyMap[K] = SingletonId; \
4576#define SVE_VECTOR_TYPE_FLOAT(Name, MangledName, Id, SingletonId, NumEls, \
4578 if (EltTy->hasFloatingRepresentation() && !EltTy->isBFloat16Type() && \
4579 EltTySize == ElBits && NumElts == (NumEls * NF) && NumFields == 1) { \
4580 return ScalableVecTyMap[K] = SingletonId; \
4582#define SVE_VECTOR_TYPE_BFLOAT(Name, MangledName, Id, SingletonId, NumEls, \
4584 if (EltTy->hasFloatingRepresentation() && EltTy->isBFloat16Type() && \
4585 EltTySize == ElBits && NumElts == (NumEls * NF) && NumFields == 1) { \
4586 return ScalableVecTyMap[K] = SingletonId; \
4588#define SVE_VECTOR_TYPE_MFLOAT(Name, MangledName, Id, SingletonId, NumEls, \
4590 if (EltTy->isMFloat8Type() && EltTySize == ElBits && \
4591 NumElts == (NumEls * NF) && NumFields == 1) { \
4592 return ScalableVecTyMap[K] = SingletonId; \
4594#define SVE_PREDICATE_TYPE_ALL(Name, MangledName, Id, SingletonId, NumEls, NF) \
4595 if (EltTy->isBooleanType() && NumElts == (NumEls * NF) && NumFields == 1) \
4596 return ScalableVecTyMap[K] = SingletonId;
4597#include "clang/Basic/AArch64ACLETypes.def"
4598 }
else if (Target->hasRISCVVTypes()) {
4600#define RVV_VECTOR_TYPE(Name, Id, SingletonId, NumEls, ElBits, NF, IsSigned, \
4602 if (!EltTy->isBooleanType() && \
4603 ((EltTy->hasIntegerRepresentation() && \
4604 EltTy->hasSignedIntegerRepresentation() == IsSigned) || \
4605 (EltTy->hasFloatingRepresentation() && !EltTy->isBFloat16Type() && \
4607 (EltTy->hasFloatingRepresentation() && EltTy->isBFloat16Type() && \
4608 IsBF && !IsFP)) && \
4609 EltTySize == ElBits && NumElts == NumEls && NumFields == NF) \
4610 return ScalableVecTyMap[K] = SingletonId;
4611#define RVV_PREDICATE_TYPE(Name, Id, SingletonId, NumEls) \
4612 if (EltTy->isBooleanType() && NumElts == NumEls) \
4613 return ScalableVecTyMap[K] = SingletonId;
4614#include "clang/Basic/RISCVVTypes.def"
4629 llvm::FoldingSetNodeID ID;
4632 void *InsertPos =
nullptr;
4633 if (
VectorType *VTP = VectorTypes.FindNodeOrInsertPos(ID, InsertPos))
4643 VectorType *NewIP = VectorTypes.FindNodeOrInsertPos(ID, InsertPos);
4644 assert(!NewIP &&
"Shouldn't be in the map!"); (void)NewIP;
4647 VectorType(vecType, NumElts, Canonical, VecKind);
4648 VectorTypes.InsertNode(
New, InsertPos);
4649 Types.push_back(
New);
4656 llvm::FoldingSetNodeID ID;
4659 void *InsertPos =
nullptr;
4661 DependentVectorTypes.FindNodeOrInsertPos(ID, InsertPos);
4666 VecType,
QualType(Canon, 0), SizeExpr, AttrLoc, VecKind);
4669 if (CanonVecTy == VecType) {
4674 DependentVectorTypes.FindNodeOrInsertPos(ID, InsertPos);
4675 assert(!CanonCheck &&
4676 "Dependent-sized vector_size canonical type broken");
4678 DependentVectorTypes.InsertNode(
New, InsertPos);
4687 Types.push_back(
New);
4694 unsigned NumElts)
const {
4701 llvm::FoldingSetNodeID ID;
4704 void *InsertPos =
nullptr;
4705 if (
VectorType *VTP = VectorTypes.FindNodeOrInsertPos(ID, InsertPos))
4715 VectorType *NewIP = VectorTypes.FindNodeOrInsertPos(ID, InsertPos);
4716 assert(!NewIP &&
"Shouldn't be in the map!"); (void)NewIP;
4720 VectorTypes.InsertNode(
New, InsertPos);
4721 Types.push_back(
New);
4729 llvm::FoldingSetNodeID ID;
4733 void *InsertPos =
nullptr;
4735 = DependentSizedExtVectorTypes.FindNodeOrInsertPos(ID, InsertPos);
4745 if (CanonVecTy == vecType) {
4750 = DependentSizedExtVectorTypes.FindNodeOrInsertPos(ID, InsertPos);
4751 assert(!CanonCheck &&
"Dependent-sized ext_vector canonical type broken");
4753 DependentSizedExtVectorTypes.InsertNode(
New, InsertPos);
4762 Types.push_back(
New);
4767 unsigned NumColumns)
const {
4768 llvm::FoldingSetNodeID ID;
4770 Type::ConstantMatrix);
4773 "need a valid element type");
4774 assert(NumRows > 0 && NumRows <= LangOpts.MaxMatrixDimension &&
4775 NumColumns > 0 && NumColumns <= LangOpts.MaxMatrixDimension &&
4776 "need valid matrix dimensions");
4777 void *InsertPos =
nullptr;
4787 assert(!NewIP &&
"Matrix type shouldn't already exist in the map");
4793 MatrixTypes.InsertNode(
New, InsertPos);
4794 Types.push_back(
New);
4803 llvm::FoldingSetNodeID ID;
4807 void *InsertPos =
nullptr;
4809 DependentSizedMatrixTypes.FindNodeOrInsertPos(ID, InsertPos);
4814 ColumnExpr, AttrLoc);
4817 DependentSizedMatrixTypes.FindNodeOrInsertPos(ID, InsertPos);
4818 assert(!CanonCheck &&
"Dependent-sized matrix canonical type broken");
4820 DependentSizedMatrixTypes.InsertNode(Canon, InsertPos);
4821 Types.push_back(Canon);
4834 ColumnExpr, AttrLoc);
4835 Types.push_back(
New);
4840 Expr *AddrSpaceExpr,
4846 void *insertPos =
nullptr;
4847 llvm::FoldingSetNodeID ID;
4852 DependentAddressSpaceTypes.FindNodeOrInsertPos(ID, insertPos);
4858 DependentAddressSpaceTypes.InsertNode(canonTy, insertPos);
4859 Types.push_back(canonTy);
4862 if (canonPointeeType == PointeeType &&
4868 AddrSpaceExpr, AttrLoc);
4869 Types.push_back(sugaredType);
4875 return T.isCanonical() &&
4893 llvm::FoldingSetNodeID ID;
4896 void *InsertPos =
nullptr;
4898 FunctionNoProtoTypes.FindNodeOrInsertPos(ID, InsertPos))
4908 FunctionNoProtoTypes.FindNodeOrInsertPos(ID, InsertPos);
4909 assert(!NewIP &&
"Shouldn't be in the map!"); (void)NewIP;
4914 Types.push_back(
New);
4915 FunctionNoProtoTypes.InsertNode(
New, InsertPos);
4931 return CanResultType;
4938 if (!NoexceptInType)
4955 bool AnyPackExpansions =
false;
4959 if (ET->
getAs<PackExpansionType>())
4960 AnyPackExpansions =
true;
4962 return AnyPackExpansions;
4968QualType ASTContext::getFunctionTypeInternal(
4969 QualType ResultTy, ArrayRef<QualType> ArgArray,
4970 const FunctionProtoType::ExtProtoInfo &EPI,
bool OnlyWantCanonical)
const {
4971 size_t NumArgs = ArgArray.size();
4975 llvm::FoldingSetNodeID
ID;
4980 bool Unique =
false;
4982 void *InsertPos =
nullptr;
4983 if (FunctionProtoType *FPT =
4984 FunctionProtoTypes.FindNodeOrInsertPos(ID, InsertPos)) {
4985 QualType Existing = QualType(FPT, 0);
5004 bool IsCanonicalExceptionSpec =
5008 bool isCanonical = !Unique && IsCanonicalExceptionSpec &&
5010 for (
unsigned i = 0; i != NumArgs && isCanonical; ++i)
5011 if (!ArgArray[i].isCanonicalAsParam())
5012 isCanonical =
false;
5014 if (OnlyWantCanonical)
5015 assert(isCanonical &&
5016 "given non-canonical parameters constructing canonical type");
5021 if (!isCanonical && Canonical.
isNull()) {
5022 SmallVector<QualType, 16> CanonicalArgs;
5023 CanonicalArgs.reserve(NumArgs);
5024 for (
unsigned i = 0; i != NumArgs; ++i)
5027 llvm::SmallVector<QualType, 8> ExceptionTypeStorage;
5028 FunctionProtoType::ExtProtoInfo CanonicalEPI = EPI;
5031 if (IsCanonicalExceptionSpec) {
5033 }
else if (NoexceptInType) {
5046 bool AnyPacks =
false;
5048 if (ET->
getAs<PackExpansionType>())
5069 llvm_unreachable(
"dependent noexcept is already canonical");
5072 CanonicalEPI.
ExceptionSpec = FunctionProtoType::ExceptionSpecInfo();
5078 getFunctionTypeInternal(CanResultTy, CanonicalArgs, CanonicalEPI,
true);
5081 FunctionProtoType *NewIP =
5082 FunctionProtoTypes.FindNodeOrInsertPos(ID, InsertPos);
5083 assert(!NewIP &&
"Shouldn't be in the map!"); (void)NewIP;
5088 auto ESH = FunctionProtoType::getExceptionSpecSize(
5090 size_t Size = FunctionProtoType::totalSizeToAlloc<
5091 QualType, SourceLocation, FunctionType::FunctionTypeExtraBitfields,
5092 FunctionType::FunctionTypeExtraAttributeInfo,
5093 FunctionType::FunctionTypeArmAttributes, FunctionType::ExceptionType,
5094 Expr *, FunctionDecl *, FunctionProtoType::ExtParameterInfo, Qualifiers,
5095 FunctionEffect, EffectConditionExpr>(
5099 ESH.NumExprPtr, ESH.NumFunctionDeclPtr,
5104 auto *FTP = (FunctionProtoType *)
Allocate(Size,
alignof(FunctionProtoType));
5105 FunctionProtoType::ExtProtoInfo newEPI = EPI;
5106 new (FTP) FunctionProtoType(ResultTy, ArgArray, Canonical, newEPI);
5107 Types.push_back(FTP);
5109 FunctionProtoTypes.InsertNode(FTP, InsertPos);
5111 AnyFunctionEffects =
true;
5112 return QualType(FTP, 0);
5115QualType ASTContext::getPipeType(QualType T,
bool ReadOnly)
const {
5116 llvm::FoldingSetNodeID
ID;
5119 void *InsertPos =
nullptr;
5120 if (PipeType *PT = PipeTypes.FindNodeOrInsertPos(ID, InsertPos))
5121 return QualType(PT, 0);
5130 PipeType *NewIP = PipeTypes.FindNodeOrInsertPos(ID, InsertPos);
5131 assert(!NewIP &&
"Shouldn't be in the map!");
5134 auto *
New =
new (*
this,
alignof(PipeType)) PipeType(T, Canonical, ReadOnly);
5135 Types.push_back(
New);
5136 PipeTypes.InsertNode(
New, InsertPos);
5137 return QualType(
New, 0);
5147 return getPipeType(T,
true);
5151 return getPipeType(T,
false);
5155 llvm::FoldingSetNodeID ID;
5158 void *InsertPos =
nullptr;
5159 if (
BitIntType *EIT = BitIntTypes.FindNodeOrInsertPos(ID, InsertPos))
5163 BitIntTypes.InsertNode(
New, InsertPos);
5164 Types.push_back(
New);
5169 Expr *NumBitsExpr)
const {
5171 llvm::FoldingSetNodeID ID;
5174 void *InsertPos =
nullptr;
5176 DependentBitIntTypes.FindNodeOrInsertPos(ID, InsertPos))
5181 DependentBitIntTypes.InsertNode(
New, InsertPos);
5183 Types.push_back(
New);
5191 if (
auto *Target = PredefinedSugarTypes[llvm::to_underlying(KD)];
5203 return Ctx.getFromTargetType(Ctx.Target->
getSizeType());
5204 case Kind::SignedSizeT:
5206 case Kind::PtrdiffT:
5209 llvm_unreachable(
"unexpected kind");
5214 Types.push_back(
New);
5215 PredefinedSugarTypes[llvm::to_underlying(KD)] =
New;
5222 if (
auto *Tag = dyn_cast<TagDecl>(
Decl))
5225 if (
auto *
Typedef = dyn_cast<TypedefNameDecl>(
Decl))
5227 if (
auto *UD = dyn_cast<UnresolvedUsingTypenameDecl>(
Decl))
5236 if (
auto *Tag = dyn_cast<TagDecl>(TD))
5238 if (
auto *TN = dyn_cast<TypedefNameDecl>(TD))
5240 if (
const auto *UD = dyn_cast<UnresolvedUsingTypenameDecl>(TD))
5242 assert(TD->TypeForDecl);
5247 if (
const auto *TD = dyn_cast<TagDecl>(
Decl))
5249 if (
const auto *TD = dyn_cast<TypedefNameDecl>(
Decl);
5250 isa_and_nonnull<TypedefDecl, TypeAliasDecl>(TD))
5253 if (
const auto *Using = dyn_cast<UnresolvedUsingTypenameDecl>(
Decl))
5256 assert(
Decl->TypeForDecl);
5266 std::optional<bool> TypeMatchesDeclOrNone)
const {
5267 if (!TypeMatchesDeclOrNone) {
5268 QualType DeclUnderlyingType =
Decl->getUnderlyingType();
5269 assert(!DeclUnderlyingType.
isNull());
5270 if (UnderlyingType.
isNull())
5271 UnderlyingType = DeclUnderlyingType;
5273 assert(
hasSameType(UnderlyingType, DeclUnderlyingType));
5274 TypeMatchesDeclOrNone = UnderlyingType == DeclUnderlyingType;
5278 assert(!UnderlyingType.
isNull());
5282 *TypeMatchesDeclOrNone) {
5283 if (
Decl->TypeForDecl)
5288 !*TypeMatchesDeclOrNone);
5290 Types.push_back(NewType);
5291 Decl->TypeForDecl = NewType;
5295 llvm::FoldingSetNodeID ID;
5297 *TypeMatchesDeclOrNone ?
QualType() : UnderlyingType);
5299 void *InsertPos =
nullptr;
5301 TypedefTypes.FindNodeOrInsertPos(ID, InsertPos))
5302 return QualType(Placeholder->getType(), 0);
5307 1, !!Qualifier, !*TypeMatchesDeclOrNone),
5311 UnderlyingType, !*TypeMatchesDeclOrNone);
5312 auto *Placeholder =
new (NewType->getFoldingSetPlaceholder())
5314 TypedefTypes.InsertNode(Placeholder, InsertPos);
5315 Types.push_back(NewType);
5324 if (UnderlyingType.
isNull()) {
5332 llvm::FoldingSetNodeID ID;
5335 void *InsertPos =
nullptr;
5336 if (
const UsingType *T = UsingTypes.FindNodeOrInsertPos(ID, InsertPos))
5346 Allocate(UsingType::totalSizeToAlloc<NestedNameSpecifier>(!!Qualifier),
5350 UsingTypes.InsertNode(T, InsertPos);
5356 const TagDecl *TD,
bool OwnsTag,
5358 const Type *CanonicalType,
5359 bool WithFoldingSetNode)
const {
5360 auto [TC, Size] = [&] {
5363 static_assert(
alignof(EnumType) ==
alignof(TagType));
5364 return std::make_tuple(Type::Enum,
sizeof(EnumType));
5365 case Decl::ClassTemplatePartialSpecialization:
5366 case Decl::ClassTemplateSpecialization:
5367 case Decl::CXXRecord:
5368 static_assert(
alignof(RecordType) ==
alignof(TagType));
5369 static_assert(
alignof(InjectedClassNameType) ==
alignof(TagType));
5371 return std::make_tuple(Type::InjectedClassName,
5372 sizeof(InjectedClassNameType));
5375 return std::make_tuple(Type::Record,
sizeof(RecordType));
5377 llvm_unreachable(
"unexpected decl kind");
5387 if (WithFoldingSetNode) {
5395 sizeof(TagTypeFoldingSetPlaceholder) +
5396 TagTypeFoldingSetPlaceholder::getOffset() + Size,
5397 std::max(
alignof(TagTypeFoldingSetPlaceholder),
alignof(TagType)));
5398 auto *T =
new (Mem) TagTypeFoldingSetPlaceholder();
5399 Mem = T->getTagType();
5401 Mem =
Allocate(Size,
alignof(TagType));
5404 auto *T = [&, TC = TC]() -> TagType * {
5408 auto *T =
new (Mem) EnumType(TC,
Keyword, Qualifier, TD, OwnsTag,
5409 IsInjected, CanonicalType);
5410 assert(
reinterpret_cast<void *
>(T) ==
5411 reinterpret_cast<void *
>(
static_cast<TagType *
>(T)) &&
5412 "TagType must be the first base of EnumType");
5415 case Type::Record: {
5417 auto *T =
new (Mem) RecordType(TC,
Keyword, Qualifier, TD, OwnsTag,
5418 IsInjected, CanonicalType);
5419 assert(
reinterpret_cast<void *
>(T) ==
5420 reinterpret_cast<void *
>(
static_cast<TagType *
>(T)) &&
5421 "TagType must be the first base of RecordType");
5424 case Type::InjectedClassName: {
5425 auto *T =
new (Mem) InjectedClassNameType(
Keyword, Qualifier, TD,
5426 IsInjected, CanonicalType);
5427 assert(
reinterpret_cast<void *
>(T) ==
5428 reinterpret_cast<void *
>(
static_cast<TagType *
>(T)) &&
5429 "TagType must be the first base of InjectedClassNameType");
5433 llvm_unreachable(
"unexpected type class");
5436 assert(T->getKeyword() ==
Keyword);
5437 assert(T->getQualifier() == Qualifier);
5438 assert(T->getDecl() == TD);
5439 assert(T->isInjected() == IsInjected);
5440 assert(T->isTagOwned() == OwnsTag);
5449 if (
const auto *RD = dyn_cast<CXXRecordDecl>(TD);
5450 RD && RD->isInjectedClassName())
5457 if (TD->TypeForDecl)
5458 return TD->TypeForDecl->getCanonicalTypeUnqualified();
5460 const Type *CanonicalType = getTagTypeInternal(
5463 false,
false,
nullptr,
5465 TD->TypeForDecl = CanonicalType;
5471 const TagDecl *TD,
bool OwnsTag)
const {
5474 bool IsInjected = TD != NonInjectedTD;
5481 if (
Keyword == PreferredKeyword && !Qualifier && !OwnsTag) {
5482 if (
const Type *T = TD->TypeForDecl; T && !T->isCanonicalUnqualified())
5488 std::nullopt, NonInjectedTD,
5489 false, IsInjected, CanonicalType,
5491 TD->TypeForDecl = T;
5495 llvm::FoldingSetNodeID ID;
5496 TagTypeFoldingSetPlaceholder::Profile(ID,
Keyword, Qualifier, NonInjectedTD,
5497 OwnsTag, IsInjected);
5499 void *InsertPos =
nullptr;
5500 if (TagTypeFoldingSetPlaceholder *T =
5501 TagTypes.FindNodeOrInsertPos(ID, InsertPos))
5502 return QualType(T->getTagType(), 0);
5506 getTagTypeInternal(
Keyword, Qualifier, NonInjectedTD, OwnsTag, IsInjected,
5507 CanonicalType,
true);
5508 TagTypes.InsertNode(TagTypeFoldingSetPlaceholder::fromTagType(T), InsertPos);
5513 unsigned NumPositiveBits,
5516 unsigned IntWidth = Target->getIntWidth();
5517 unsigned CharWidth = Target->getCharWidth();
5518 unsigned ShortWidth = Target->getShortWidth();
5519 bool EnumTooLarge =
false;
5521 if (NumNegativeBits) {
5525 if (IsPacked && NumNegativeBits <= CharWidth &&
5526 NumPositiveBits < CharWidth) {
5528 BestWidth = CharWidth;
5529 }
else if (IsPacked && NumNegativeBits <= ShortWidth &&
5530 NumPositiveBits < ShortWidth) {
5532 BestWidth = ShortWidth;
5533 }
else if (NumNegativeBits <= IntWidth && NumPositiveBits < IntWidth) {
5535 BestWidth = IntWidth;
5537 BestWidth = Target->getLongWidth();
5539 if (NumNegativeBits <= BestWidth && NumPositiveBits < BestWidth) {
5542 BestWidth = Target->getLongLongWidth();
5544 if (NumNegativeBits > BestWidth || NumPositiveBits >= BestWidth)
5545 EnumTooLarge =
true;
5549 BestPromotionType = (BestWidth <= IntWidth ?
IntTy : BestType);
5554 if (IsPacked && NumPositiveBits <= CharWidth) {
5556 BestPromotionType =
IntTy;
5557 BestWidth = CharWidth;
5558 }
else if (IsPacked && NumPositiveBits <= ShortWidth) {
5560 BestPromotionType =
IntTy;
5561 BestWidth = ShortWidth;
5562 }
else if (NumPositiveBits <= IntWidth) {
5564 BestWidth = IntWidth;
5565 BestPromotionType = (NumPositiveBits == BestWidth || !LangOpts.CPlusPlus)
5568 }
else if (NumPositiveBits <= (BestWidth = Target->getLongWidth())) {
5570 BestPromotionType = (NumPositiveBits == BestWidth || !LangOpts.CPlusPlus)
5574 BestWidth = Target->getLongLongWidth();
5575 if (NumPositiveBits > BestWidth) {
5580 EnumTooLarge =
true;
5583 BestPromotionType = (NumPositiveBits == BestWidth || !LangOpts.CPlusPlus)
5588 return EnumTooLarge;
5592 assert((T->isIntegralType(*
this) || T->isEnumeralType()) &&
5593 "Integral type required!");
5596 if (
Value.isUnsigned() ||
Value.isNonNegative()) {
5597 if (T->isSignedIntegerOrEnumerationType())
5599 return Value.getActiveBits() <= BitWidth;
5601 return Value.getSignificantBits() <= BitWidth;
5607 const Type *CanonicalType)
const {
5609 UnresolvedUsingType::totalSizeToAlloc<
5611 !!InsertPos, !!Qualifier),
5615 auto *Placeholder =
new (T->getFoldingSetPlaceholder())
5617 TypedefTypes.InsertNode(Placeholder, InsertPos);
5627 return D->TypeForDecl->getCanonicalTypeUnqualified();
5629 const Type *CanonicalType = getUnresolvedUsingTypeInternal(
5633 D->TypeForDecl = CanonicalType;
5642 if (
const Type *T = D->TypeForDecl; T && !T->isCanonicalUnqualified())
5649 nullptr, CanonicalType);
5654 llvm::FoldingSetNodeID ID;
5657 void *InsertPos =
nullptr;
5659 UnresolvedUsingTypes.FindNodeOrInsertPos(ID, InsertPos))
5660 return QualType(Placeholder->getType(), 0);
5664 const Type *T = getUnresolvedUsingTypeInternal(
Keyword, Qualifier, D,
5665 InsertPos, CanonicalType);
5673 llvm::FoldingSetNodeID id;
5674 AttributedType::Profile(
id, attrKind, modifiedType, equivalentType,
attr);
5676 void *insertPos =
nullptr;
5677 AttributedType *
type = AttributedTypes.FindNodeOrInsertPos(
id, insertPos);
5680 assert(!
attr ||
attr->getKind() == attrKind);
5683 type =
new (*
this,
alignof(AttributedType))
5684 AttributedType(canon, attrKind,
attr, modifiedType, equivalentType);
5686 Types.push_back(
type);
5687 AttributedTypes.InsertNode(
type, insertPos);
5700 switch (nullability) {
5716 llvm_unreachable(
"Unknown nullability kind");
5721 llvm::FoldingSetNodeID ID;
5722 BTFTagAttributedType::Profile(ID, Wrapped, BTFAttr);
5724 void *InsertPos =
nullptr;
5725 BTFTagAttributedType *Ty =
5726 BTFTagAttributedTypes.FindNodeOrInsertPos(ID, InsertPos);
5731 Ty =
new (*
this,
alignof(BTFTagAttributedType))
5732 BTFTagAttributedType(Canon, Wrapped, BTFAttr);
5734 Types.push_back(Ty);
5735 BTFTagAttributedTypes.InsertNode(Ty, InsertPos);
5743 StringRef IdentName = II->
getName();
5744 OverflowBehaviorType::OverflowBehaviorKind Kind;
5745 if (IdentName ==
"wrap") {
5746 Kind = OverflowBehaviorType::OverflowBehaviorKind::Wrap;
5747 }
else if (IdentName ==
"trap") {
5748 Kind = OverflowBehaviorType::OverflowBehaviorKind::Trap;
5757 OverflowBehaviorType::OverflowBehaviorKind Kind,
5760 "Cannot have underlying types that are themselves OBTs");
5761 llvm::FoldingSetNodeID ID;
5762 OverflowBehaviorType::Profile(ID, Underlying, Kind);
5763 void *InsertPos =
nullptr;
5765 if (OverflowBehaviorType *OBT =
5766 OverflowBehaviorTypes.FindNodeOrInsertPos(ID, InsertPos)) {
5775 assert(!OverflowBehaviorTypes.FindNodeOrInsertPos(ID, InsertPos) &&
5776 "Shouldn't be in the map");
5779 OverflowBehaviorType *Ty =
new (*
this,
alignof(OverflowBehaviorType))
5780 OverflowBehaviorType(Canonical, Underlying, Kind);
5782 Types.push_back(Ty);
5783 OverflowBehaviorTypes.InsertNode(Ty, InsertPos);
5789 const HLSLAttributedResourceType::Attributes &Attrs) {
5791 llvm::FoldingSetNodeID ID;
5792 HLSLAttributedResourceType::Profile(ID, Wrapped, Contained, Attrs);
5794 void *InsertPos =
nullptr;
5795 HLSLAttributedResourceType *Ty =
5796 HLSLAttributedResourceTypes.FindNodeOrInsertPos(ID, InsertPos);
5800 Ty =
new (*
this,
alignof(HLSLAttributedResourceType))
5801 HLSLAttributedResourceType(Wrapped, Contained, Attrs);
5803 Types.push_back(Ty);
5804 HLSLAttributedResourceTypes.InsertNode(Ty, InsertPos);
5812 llvm::FoldingSetNodeID ID;
5813 HLSLInlineSpirvType::Profile(ID, Opcode, Size, Alignment, Operands);
5815 void *InsertPos =
nullptr;
5816 HLSLInlineSpirvType *Ty =
5817 HLSLInlineSpirvTypes.FindNodeOrInsertPos(ID, InsertPos);
5822 HLSLInlineSpirvType::totalSizeToAlloc<SpirvOperand>(Operands.size()),
5823 alignof(HLSLInlineSpirvType));
5825 Ty =
new (Mem) HLSLInlineSpirvType(Opcode, Size, Alignment, Operands);
5827 Types.push_back(Ty);
5828 HLSLInlineSpirvTypes.InsertNode(Ty, InsertPos);
5835 Decl *AssociatedDecl,
5839 llvm::FoldingSetNodeID ID;
5840 SubstTemplateTypeParmType::Profile(ID, Replacement, AssociatedDecl, Index,
5842 void *InsertPos =
nullptr;
5843 SubstTemplateTypeParmType *SubstParm =
5844 SubstTemplateTypeParmTypes.FindNodeOrInsertPos(ID, InsertPos);
5847 void *Mem =
Allocate(SubstTemplateTypeParmType::totalSizeToAlloc<QualType>(
5848 !Replacement.isCanonical()),
5849 alignof(SubstTemplateTypeParmType));
5850 SubstParm =
new (Mem) SubstTemplateTypeParmType(Replacement, AssociatedDecl,
5851 Index, PackIndex, Final);
5852 Types.push_back(SubstParm);
5853 SubstTemplateTypeParmTypes.InsertNode(SubstParm, InsertPos);
5861 unsigned Index,
bool Final,
5868 llvm::FoldingSetNodeID ID;
5869 SubstTemplateTypeParmPackType::Profile(ID, AssociatedDecl, Index, Final,
5871 void *InsertPos =
nullptr;
5872 if (SubstTemplateTypeParmPackType *SubstParm =
5873 SubstTemplateTypeParmPackTypes.FindNodeOrInsertPos(ID, InsertPos))
5883 [[maybe_unused]]
const auto *Nothing =
5884 SubstTemplateTypeParmPackTypes.FindNodeOrInsertPos(ID, InsertPos);
5889 auto *SubstParm =
new (*
this,
alignof(SubstTemplateTypeParmPackType))
5890 SubstTemplateTypeParmPackType(Canon, AssociatedDecl, Index, Final,
5892 Types.push_back(SubstParm);
5893 SubstTemplateTypeParmPackTypes.InsertNode(SubstParm, InsertPos);
5901 return P.getKind() == TemplateArgument::Type;
5903 "Pack contains a non-type");
5905 llvm::FoldingSetNodeID ID;
5906 SubstBuiltinTemplatePackType::Profile(ID, ArgPack);
5908 void *InsertPos =
nullptr;
5910 SubstBuiltinTemplatePackTypes.FindNodeOrInsertPos(ID, InsertPos))
5919 [[maybe_unused]]
const auto *Nothing =
5920 SubstBuiltinTemplatePackTypes.FindNodeOrInsertPos(ID, InsertPos);
5924 auto *PackType =
new (*
this,
alignof(SubstBuiltinTemplatePackType))
5925 SubstBuiltinTemplatePackType(Canon, ArgPack);
5926 Types.push_back(PackType);
5927 SubstBuiltinTemplatePackTypes.InsertNode(PackType, InsertPos);
5937 llvm::FoldingSetNodeID ID;
5938 TemplateTypeParmType::Profile(ID, Depth, Index, ParameterPack, TTPDecl);
5939 void *InsertPos =
nullptr;
5940 TemplateTypeParmType *TypeParm
5941 = TemplateTypeParmTypes.FindNodeOrInsertPos(ID, InsertPos);
5948 TypeParm =
new (*
this,
alignof(TemplateTypeParmType))
5949 TemplateTypeParmType(Depth, Index, ParameterPack, TTPDecl, Canon);
5951 TemplateTypeParmType *TypeCheck
5952 = TemplateTypeParmTypes.FindNodeOrInsertPos(ID, InsertPos);
5953 assert(!TypeCheck &&
"Template type parameter canonical type broken");
5956 TypeParm =
new (*
this,
alignof(TemplateTypeParmType)) TemplateTypeParmType(
5957 Depth, Index, ParameterPack,
nullptr,
QualType());
5959 Types.push_back(TypeParm);
5960 TemplateTypeParmTypes.InsertNode(TypeParm, InsertPos);
5986 llvm_unreachable(
"unexpected keyword kind");
6000 ElaboratedKeywordLoc, QualifierLoc, TemplateKeywordLoc, NameLoc,
6010 SpecifiedArgVec.reserve(SpecifiedArgs.size());
6012 SpecifiedArgVec.push_back(Arg.getArgument());
6015 CanonicalArgs, Underlying);
6018[[maybe_unused]]
static bool
6021 if (Arg.isPackExpansion())
6032 Template.getAsDependentTemplateName()));
6034 for (
const auto &Arg : Args)
6038 llvm::FoldingSetNodeID ID;
6041 void *InsertPos =
nullptr;
6042 if (
auto *T = TemplateSpecializationTypes.FindNodeOrInsertPos(ID, InsertPos))
6045 void *Mem =
Allocate(
sizeof(TemplateSpecializationType) +
6047 alignof(TemplateSpecializationType));
6051 assert(Spec->isDependentType() &&
6052 "canonical template specialization must be dependent");
6053 Types.push_back(Spec);
6054 TemplateSpecializationTypes.InsertNode(Spec, InsertPos);
6062 const auto *TD =
Template.getAsTemplateDecl(
true);
6063 bool IsTypeAlias = TD && TD->isTypeAlias();
6064 if (Underlying.
isNull()) {
6071 bool NonCanonical =
Template != CanonTemplate ||
Keyword != CanonKeyword;
6073 if (CanonicalArgs.empty()) {
6076 CanonicalArgs = CanonArgsVec;
6078 NonCanonical |= !llvm::equal(
6079 SpecifiedArgs, CanonicalArgs,
6088 assert((!isa_and_nonnull<TypeAliasTemplateDecl>(TD) ||
6090 "Caller must compute aliased type");
6091 IsTypeAlias =
false;
6094 CanonKeyword, CanonTemplate, CanonicalArgs);
6098 void *Mem =
Allocate(
sizeof(TemplateSpecializationType) +
6100 (IsTypeAlias ?
sizeof(
QualType) : 0),
6101 alignof(TemplateSpecializationType));
6102 auto *Spec =
new (Mem) TemplateSpecializationType(
6104 Types.push_back(Spec);
6110 llvm::FoldingSetNodeID ID;
6113 void *InsertPos =
nullptr;
6114 ParenType *T = ParenTypes.FindNodeOrInsertPos(ID, InsertPos);
6121 ParenType *CheckT = ParenTypes.FindNodeOrInsertPos(ID, InsertPos);
6122 assert(!CheckT &&
"Paren canonical type broken");
6128 ParenTypes.InsertNode(T, InsertPos);
6141 Types.push_back(newType);
6148 llvm::FoldingSetNodeID ID;
6149 DependentNameType::Profile(ID,
Keyword, NNS, Name);
6151 void *InsertPos =
nullptr;
6152 if (DependentNameType *T =
6153 DependentNameTypes.FindNodeOrInsertPos(ID, InsertPos))
6161 if (CanonKeyword !=
Keyword || CanonNNS != NNS) {
6163 [[maybe_unused]] DependentNameType *T =
6164 DependentNameTypes.FindNodeOrInsertPos(ID, InsertPos);
6165 assert(!T &&
"broken canonicalization");
6169 DependentNameType *T =
new (*
this,
alignof(DependentNameType))
6170 DependentNameType(
Keyword, NNS, Name, Canon);
6172 DependentNameTypes.InsertNode(T, InsertPos);
6178 if (
const auto *TTP = dyn_cast<TemplateTypeParmDecl>(Param)) {
6180 if (TTP->isParameterPack())
6184 }
else if (
auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(Param)) {
6186 NTTP->getType().getNonPackExpansionType().getNonLValueExprType(*
this);
6192 if (T->isRecordType()) {
6201 Expr *E =
new (*this)
6203 T,
VK, NTTP->getLocation());
6205 if (NTTP->isParameterPack())
6211 std::nullopt,
false,
6213 if (TTP->isParameterPack())
6219 if (Param->isTemplateParameterPack())
6228 bool ExpectPackInType)
const {
6230 "Pack expansions must expand one or more parameter packs");
6232 llvm::FoldingSetNodeID ID;
6233 PackExpansionType::Profile(ID, Pattern, NumExpansions);
6235 void *InsertPos =
nullptr;
6236 PackExpansionType *T = PackExpansionTypes.FindNodeOrInsertPos(ID, InsertPos);
6247 PackExpansionTypes.FindNodeOrInsertPos(ID, InsertPos);
6250 T =
new (*
this,
alignof(PackExpansionType))
6251 PackExpansionType(Pattern, Canon, NumExpansions);
6253 PackExpansionTypes.InsertNode(T, InsertPos);
6265 if (Protocols.empty())
return true;
6270 for (
unsigned i = 1; i != Protocols.size(); ++i)
6280 llvm::array_pod_sort(Protocols.begin(), Protocols.end(),
CmpProtocolNames);
6284 P = P->getCanonicalDecl();
6287 auto ProtocolsEnd = llvm::unique(Protocols);
6288 Protocols.erase(ProtocolsEnd, Protocols.end());
6293 unsigned NumProtocols)
const {
6302 bool isKindOf)
const {
6305 if (typeArgs.empty() && protocols.empty() && !isKindOf &&
6310 llvm::FoldingSetNodeID ID;
6311 ObjCObjectTypeImpl::Profile(ID, baseType, typeArgs, protocols, isKindOf);
6312 void *InsertPos =
nullptr;
6313 if (
ObjCObjectType *QT = ObjCObjectTypes.FindNodeOrInsertPos(ID, InsertPos))
6320 if (effectiveTypeArgs.empty()) {
6322 effectiveTypeArgs = baseObject->getTypeArgs();
6329 bool typeArgsAreCanonical = llvm::all_of(
6332 if (!typeArgsAreCanonical || !protocolsSorted || !baseType.
isCanonical()) {
6336 if (!typeArgsAreCanonical) {
6337 canonTypeArgsVec.reserve(effectiveTypeArgs.size());
6338 for (
auto typeArg : effectiveTypeArgs)
6340 canonTypeArgs = canonTypeArgsVec;
6342 canonTypeArgs = effectiveTypeArgs;
6347 if (!protocolsSorted) {
6348 canonProtocolsVec.append(protocols.begin(), protocols.end());
6350 canonProtocols = canonProtocolsVec;
6352 canonProtocols = protocols;
6356 canonProtocols, isKindOf);
6359 ObjCObjectTypes.FindNodeOrInsertPos(ID, InsertPos);
6362 unsigned size =
sizeof(ObjCObjectTypeImpl);
6363 size += typeArgs.size() *
sizeof(
QualType);
6365 void *mem =
Allocate(size,
alignof(ObjCObjectTypeImpl));
6367 new (mem) ObjCObjectTypeImpl(canonical, baseType, typeArgs, protocols,
6371 ObjCObjectTypes.InsertNode(T, InsertPos);
6381 bool allowOnPointerType)
const {
6384 if (
const auto *objT = dyn_cast<ObjCTypeParamType>(
type.getTypePtr())) {
6389 if (allowOnPointerType) {
6390 if (
const auto *objPtr =
6391 dyn_cast<ObjCObjectPointerType>(
type.getTypePtr())) {
6395 protocolsVec.append(objT->qual_begin(),
6397 protocolsVec.append(protocols.begin(), protocols.end());
6400 objT->getBaseType(),
6401 objT->getTypeArgsAsWritten(),
6403 objT->isKindOfTypeAsWritten());
6409 if (
const auto *objT = dyn_cast<ObjCObjectType>(
type.getTypePtr())){
6414 objT->getTypeArgsAsWritten(),
6416 objT->isKindOfTypeAsWritten());
6420 if (
type->isObjCObjectType()) {
6430 if (
type->isObjCIdType()) {
6433 objPtr->isKindOfType());
6438 if (
type->isObjCClassType()) {
6441 objPtr->isKindOfType());
6453 llvm::FoldingSetNodeID ID;
6454 ObjCTypeParamType::Profile(ID,
Decl,
Decl->getUnderlyingType(), protocols);
6455 void *InsertPos =
nullptr;
6456 if (ObjCTypeParamType *TypeParam =
6457 ObjCTypeParamTypes.FindNodeOrInsertPos(ID, InsertPos))
6462 if (!protocols.empty()) {
6466 Canonical, protocols, hasError,
true ));
6467 assert(!hasError &&
"Error when apply protocol qualifier to bound type");
6470 unsigned size =
sizeof(ObjCTypeParamType);
6472 void *mem =
Allocate(size,
alignof(ObjCTypeParamType));
6473 auto *newType =
new (mem) ObjCTypeParamType(
Decl, Canonical, protocols);
6475 Types.push_back(newType);
6476 ObjCTypeParamTypes.InsertNode(newType, InsertPos);
6486 protocols.append(NewTypeParamTy->qual_begin(), NewTypeParamTy->qual_end());
6501 for (
auto *Proto : OPT->quals()) {
6524 if (InheritedProtocols.empty())
6528 bool Conforms =
false;
6529 for (
auto *Proto : OPT->quals()) {
6531 for (
auto *PI : InheritedProtocols) {
6543 for (
auto *PI : InheritedProtocols) {
6545 bool Adopts =
false;
6546 for (
auto *Proto : OPT->quals()) {
6560 llvm::FoldingSetNodeID ID;
6563 void *InsertPos =
nullptr;
6565 ObjCObjectPointerTypes.FindNodeOrInsertPos(ID, InsertPos))
6574 ObjCObjectPointerTypes.FindNodeOrInsertPos(ID, InsertPos);
6583 Types.push_back(QType);
6584 ObjCObjectPointerTypes.InsertNode(QType, InsertPos);
6592 if (
Decl->TypeForDecl)
6596 assert(PrevDecl->TypeForDecl &&
"previous decl has no TypeForDecl");
6597 Decl->TypeForDecl = PrevDecl->TypeForDecl;
6598 return QualType(PrevDecl->TypeForDecl, 0);
6607 Decl->TypeForDecl = T;
6620 llvm::FoldingSetNodeID ID;
6624 void *InsertPos =
nullptr;
6626 DependentTypeOfExprTypes.FindNodeOrInsertPos(ID, InsertPos);
6636 DependentTypeOfExprTypes.InsertNode(Canon, InsertPos);
6644 Types.push_back(toe);
6655 auto *tot =
new (*
this,
alignof(TypeOfType))
6656 TypeOfType(*
this, tofType, Canonical, Kind);
6657 Types.push_back(tot);
6681 llvm_unreachable(
"Unknown value kind");
6696 }
else if (!UnderlyingType.
isNull()) {
6699 llvm::FoldingSetNodeID ID;
6700 DependentDecltypeType::Profile(ID, *
this, E);
6702 void *InsertPos =
nullptr;
6703 if (DependentDecltypeType *Canon =
6704 DependentDecltypeTypes.FindNodeOrInsertPos(ID, InsertPos))
6709 new (*
this,
alignof(DependentDecltypeType)) DependentDecltypeType(E);
6710 DependentDecltypeTypes.InsertNode(DT, InsertPos);
6711 Types.push_back(DT);
6714 auto *DT =
new (*
this,
alignof(DecltypeType))
6715 DecltypeType(E, UnderlyingType, CanonType);
6716 Types.push_back(DT);
6721 bool FullySubstituted,
6725 if (FullySubstituted && Index) {
6728 llvm::FoldingSetNodeID ID;
6729 PackIndexingType::Profile(ID, *
this, Pattern.
getCanonicalType(), IndexExpr,
6730 FullySubstituted, Expansions);
6731 void *InsertPos =
nullptr;
6732 PackIndexingType *Canon =
6733 DependentPackIndexingTypes.FindNodeOrInsertPos(ID, InsertPos);
6736 PackIndexingType::totalSizeToAlloc<QualType>(Expansions.size()),
6740 IndexExpr, FullySubstituted, Expansions);
6741 DependentPackIndexingTypes.InsertNode(Canon, InsertPos);
6747 Allocate(PackIndexingType::totalSizeToAlloc<QualType>(Expansions.size()),
6749 auto *T =
new (Mem) PackIndexingType(Canonical, Pattern, IndexExpr,
6750 FullySubstituted, Expansions);
6759 UnaryTransformType::UTTKind Kind)
const {
6761 llvm::FoldingSetNodeID ID;
6762 UnaryTransformType::Profile(ID, BaseType, UnderlyingType, Kind);
6764 void *InsertPos =
nullptr;
6765 if (UnaryTransformType *UT =
6766 UnaryTransformTypes.FindNodeOrInsertPos(ID, InsertPos))
6770 if (!BaseType->isDependentType()) {
6773 assert(UnderlyingType.
isNull() || BaseType == UnderlyingType);
6776 BaseType != CanonBase) {
6781 [[maybe_unused]] UnaryTransformType *UT =
6782 UnaryTransformTypes.FindNodeOrInsertPos(ID, InsertPos);
6783 assert(!UT &&
"broken canonicalization");
6787 auto *UT =
new (*
this,
alignof(UnaryTransformType))
6788 UnaryTransformType(BaseType, UnderlyingType, Kind, CanonType);
6789 UnaryTransformTypes.InsertNode(UT, InsertPos);
6790 Types.push_back(UT);
6803 !TypeConstraintConcept) {
6804 assert(DeducedAsType.
isNull() &&
"");
6805 assert(TypeConstraintArgs.empty() &&
"");
6810 llvm::FoldingSetNodeID ID;
6811 AutoType::Profile(ID, *
this, DK, DeducedAsType,
Keyword,
6812 TypeConstraintConcept, TypeConstraintArgs);
6813 if (
auto const AT_iter = AutoTypes.find(ID); AT_iter != AutoTypes.end())
6814 return QualType(AT_iter->getSecond(), 0);
6817 assert(!DeducedAsType.
isNull() &&
"deduced type must be provided");
6819 assert(DeducedAsType.
isNull() &&
"deduced type must not be provided");
6820 if (TypeConstraintConcept) {
6821 bool AnyNonCanonArgs =
false;
6822 auto *CanonicalConcept =
6825 *
this, TypeConstraintArgs, AnyNonCanonArgs);
6826 if (TypeConstraintConcept != CanonicalConcept || AnyNonCanonArgs)
6828 CanonicalConceptArgs);
6832 void *Mem =
Allocate(
sizeof(AutoType) +
6835 auto *AT =
new (Mem) AutoType(DK, DeducedAsType,
Keyword,
6836 TypeConstraintConcept, TypeConstraintArgs);
6838 llvm::FoldingSetNodeID InsertedID;
6839 AT->Profile(InsertedID, *
this);
6840 assert(InsertedID == ID &&
"ID does not match");
6842 Types.push_back(AT);
6843 AutoTypes.try_emplace(ID, AT);
6851 if (
auto *AT = CanonT->
getAs<AutoType>()) {
6852 if (!AT->isConstrained())
6876 "unexpected DeducedAsPack for DeducedTemplateSpecializationType");
6879 void *InsertPos =
nullptr;
6880 llvm::FoldingSetNodeID ID;
6881 DeducedTemplateSpecializationType::Profile(ID, DK, DeducedAsType,
Keyword,
6883 if (DeducedTemplateSpecializationType *DTST =
6884 DeducedTemplateSpecializationTypes.FindNodeOrInsertPos(ID, InsertPos))
6888 assert(!DeducedAsType.
isNull() &&
"deduced type must be provided");
6890 assert(DeducedAsType.
isNull() &&
"deduced type must not be provided");
6899 [[maybe_unused]] DeducedTemplateSpecializationType *DTST =
6900 DeducedTemplateSpecializationTypes.FindNodeOrInsertPos(ID, InsertPos);
6901 assert(!DTST &&
"broken canonicalization");
6905 auto *DTST =
new (*
this,
alignof(DeducedTemplateSpecializationType))
6906 DeducedTemplateSpecializationType(DK, DeducedAsType,
Keyword,
Template);
6909 llvm::FoldingSetNodeID TempID;
6910 DTST->Profile(TempID);
6911 assert(ID == TempID &&
"ID does not match");
6913 Types.push_back(DTST);
6914 DeducedTemplateSpecializationTypes.InsertNode(DTST, InsertPos);
6923 llvm::FoldingSetNodeID ID;
6926 void *InsertPos =
nullptr;
6927 if (
AtomicType *AT = AtomicTypes.FindNodeOrInsertPos(ID, InsertPos))
6933 if (!T.isCanonical()) {
6937 AtomicType *NewIP = AtomicTypes.FindNodeOrInsertPos(ID, InsertPos);
6938 assert(!NewIP &&
"Shouldn't be in the map!"); (void)NewIP;
6941 Types.push_back(
New);
6942 AtomicTypes.InsertNode(
New, InsertPos);
6974 return getFromTargetType(Target->getSizeType());
6993 return getFromTargetType(Target->getUnsignedPtrDiffType(
LangAS::Default));
6998 return getFromTargetType(Target->getIntMaxType());
7003 return getFromTargetType(Target->getUIntMaxType());
7021 return getFromTargetType(Target->getIntPtrType());
7031 return getFromTargetType(Target->getProcessIDType());
7043 const Type *Ty = T.getTypePtr();
7071 quals = splitType.
Quals;
7076 QualType elementType = AT->getElementType();
7081 if (elementType == unqualElementType) {
7082 assert(quals.
empty());
7083 quals = splitType.
Quals;
7091 if (
const auto *CAT = dyn_cast<ConstantArrayType>(AT)) {
7093 CAT->getSizeExpr(), CAT->getSizeModifier(), 0);
7096 if (
const auto *IAT = dyn_cast<IncompleteArrayType>(AT)) {
7100 if (
const auto *VAT = dyn_cast<VariableArrayType>(AT)) {
7102 VAT->getSizeModifier(),
7103 VAT->getIndexTypeCVRQualifiers());
7108 DSAT->getSizeModifier(), 0);
7118 bool AllowPiMismatch)
const {
7133 if (
auto *CAT1 = dyn_cast<ConstantArrayType>(AT1)) {
7134 auto *CAT2 = dyn_cast<ConstantArrayType>(AT2);
7135 if (!((CAT2 && CAT1->getSize() == CAT2->getSize()) ||
7148 T1 = AT1->getElementType();
7149 T2 = AT2->getElementType();
7169 bool AllowPiMismatch)
const {
7174 if (T1PtrType && T2PtrType) {
7182 T1MPType && T2MPType) {
7183 if (
auto *RD1 = T1MPType->getMostRecentCXXRecordDecl(),
7184 *RD2 = T2MPType->getMostRecentCXXRecordDecl();
7185 RD1 != RD2 && RD1->getCanonicalDecl() != RD2->getCanonicalDecl())
7187 if (T1MPType->getQualifier().getCanonical() !=
7188 T2MPType->getQualifier().getCanonical())
7198 if (T1OPType && T2OPType) {
7230 if (Quals1 != Quals2)
7300 llvm_unreachable(
"bad template name kind!");
7306 if (!TP->hasDefaultArgument())
7308 return &TP->getDefaultArgument().getArgument();
7311 case NamedDecl::TemplateTypeParm:
7313 case NamedDecl::NonTypeTemplateParm:
7315 case NamedDecl::TemplateTemplateParm:
7318 llvm_unreachable(
"Unexpected template parameter kind");
7323 bool IgnoreDeduced)
const {
7324 while (std::optional<TemplateName> UnderlyingOrNone =
7326 Name = *UnderlyingOrNone;
7331 if (
auto *TTP = dyn_cast<TemplateTemplateParmDecl>(
Template))
7343 llvm_unreachable(
"cannot canonicalize overloaded template");
7347 assert(DTN &&
"Non-dependent template names must refer to template decls.");
7366 assert(IgnoreDeduced ==
false);
7373 bool NonCanonical = CanonUnderlying != Underlying;
7379 assert(CanonArgs.size() <= Params.size());
7385 for (
int I = CanonArgs.size() - 1; I >= 0; --I) {
7394 if (I ==
int(CanonArgs.size() - 1))
7395 CanonArgs.pop_back();
7396 NonCanonical =
true;
7406 llvm_unreachable(
"always sugar node");
7409 llvm_unreachable(
"bad template name!");
7414 bool IgnoreDeduced)
const {
7435 llvm::FoldingSetNodeID XCEID, YCEID;
7436 XCE->
Profile(XCEID, *
this,
true,
true);
7437 YCE->
Profile(YCEID, *
this,
true,
true);
7438 return XCEID == YCEID;
7487 if (
auto *TX = dyn_cast<TemplateTypeParmDecl>(
X)) {
7489 if (TX->isParameterPack() != TY->isParameterPack())
7491 if (TX->hasTypeConstraint() != TY->hasTypeConstraint())
7494 TY->getTypeConstraint());
7497 if (
auto *TX = dyn_cast<NonTypeTemplateParmDecl>(
X)) {
7499 return TX->isParameterPack() == TY->isParameterPack() &&
7500 TX->getASTContext().hasSameType(TX->getType(), TY->getType()) &&
7502 TY->getPlaceholderTypeConstraint());
7507 return TX->isParameterPack() == TY->isParameterPack() &&
7509 TY->getTemplateParameters());
7514 if (
X->size() != Y->
size())
7517 for (
unsigned I = 0, N =
X->size(); I != N; ++I)
7531 if (
auto *TTPX = dyn_cast<TemplateTypeParmDecl>(
X)) {
7533 if (!TTPX->hasDefaultArgument() || !TTPY->hasDefaultArgument())
7536 return hasSameType(TTPX->getDefaultArgument().getArgument().getAsType(),
7537 TTPY->getDefaultArgument().getArgument().getAsType());
7540 if (
auto *NTTPX = dyn_cast<NonTypeTemplateParmDecl>(
X)) {
7542 if (!NTTPX->hasDefaultArgument() || !NTTPY->hasDefaultArgument())
7545 Expr *DefaultArgumentX =
7546 NTTPX->getDefaultArgument().getArgument().getAsExpr()->
IgnoreImpCasts();
7547 Expr *DefaultArgumentY =
7548 NTTPY->getDefaultArgument().getArgument().getAsExpr()->
IgnoreImpCasts();
7549 llvm::FoldingSetNodeID XID, YID;
7550 DefaultArgumentX->
Profile(XID, *
this,
true);
7551 DefaultArgumentY->
Profile(YID, *
this,
true);
7558 if (!TTPX->hasDefaultArgument() || !TTPY->hasDefaultArgument())
7573 auto Kind =
X.getKind();
7581 auto [NamespaceX, PrefixX] =
X.getAsNamespaceAndPrefix();
7584 NamespaceY->getNamespace()))
7589 const auto *TX =
X.getAsType(), *TY = Y.
getAsType();
7590 if (TX->getCanonicalTypeInternal() != TY->getCanonicalTypeInternal())
7599 llvm_unreachable(
"unhandled qualifier kind");
7605 if (A->
hasAttr<CUDADeviceAttr>() != B->
hasAttr<CUDADeviceAttr>())
7607 if (A->
hasAttr<CUDADeviceAttr>() && B->
hasAttr<CUDADeviceAttr>())
7619 llvm::FoldingSetNodeID Cand1ID, Cand2ID;
7623 for (
auto Pair : zip_longest(AEnableIfAttrs, BEnableIfAttrs)) {
7624 std::optional<EnableIfAttr *> Cand1A = std::get<0>(Pair);
7625 std::optional<EnableIfAttr *> Cand2A = std::get<1>(Pair);
7628 if (!Cand1A || !Cand2A)
7634 (*Cand1A)->getCond()->Profile(Cand1ID, A->
getASTContext(),
true);
7635 (*Cand2A)->getCond()->Profile(Cand2ID, B->
getASTContext(),
true);
7639 if (Cand1ID != Cand2ID)
7673 if (
const auto *TypedefX = dyn_cast<TypedefNameDecl>(
X))
7674 if (
const auto *TypedefY = dyn_cast<TypedefNameDecl>(Y))
7676 TypedefY->getUnderlyingType());
7693 if (
const auto *TagX = dyn_cast<TagDecl>(
X)) {
7695 return (TagX->getTagKind() == TagY->getTagKind()) ||
7707 if (
const auto *FuncX = dyn_cast<FunctionDecl>(
X)) {
7709 if (
const auto *CtorX = dyn_cast<CXXConstructorDecl>(
X)) {
7711 if (CtorX->getInheritedConstructor() &&
7712 !
isSameEntity(CtorX->getInheritedConstructor().getConstructor(),
7713 CtorY->getInheritedConstructor().getConstructor()))
7717 if (FuncX->isMultiVersion() != FuncY->isMultiVersion())
7722 if (FuncX->isMultiVersion()) {
7723 const auto *TAX = FuncX->getAttr<TargetAttr>();
7724 const auto *TAY = FuncY->getAttr<TargetAttr>();
7725 assert(TAX && TAY &&
"Multiversion Function without target attribute");
7727 if (TAX->getFeaturesStr() != TAY->getFeaturesStr())
7733 if ((FuncX->isMemberLikeConstrainedFriend() ||
7734 FuncY->isMemberLikeConstrainedFriend()) &&
7735 !FuncX->getLexicalDeclContext()->Equals(
7736 FuncY->getLexicalDeclContext())) {
7741 FuncY->getTrailingRequiresClause()))
7749 FD = FD->getCanonicalDecl();
7750 return FD->getTypeSourceInfo() ? FD->getTypeSourceInfo()->getType()
7753 QualType XT = GetTypeAsWritten(FuncX), YT = GetTypeAsWritten(FuncY);
7768 return FuncX->getLinkageInternal() == FuncY->getLinkageInternal() &&
7773 if (
const auto *VarX = dyn_cast<VarDecl>(
X)) {
7775 if (VarX->getLinkageInternal() == VarY->getLinkageInternal()) {
7778 if (VarX->getType().isNull() || VarY->getType().isNull())
7781 if (
hasSameType(VarX->getType(), VarY->getType()))
7791 if (!VarXTy || !VarYTy)
7800 if (
const auto *NamespaceX = dyn_cast<NamespaceDecl>(
X)) {
7802 return NamespaceX->isInline() == NamespaceY->isInline();
7807 if (
const auto *TemplateX = dyn_cast<TemplateDecl>(
X)) {
7811 if (
const auto *ConceptX = dyn_cast<ConceptDecl>(
X)) {
7814 ConceptY->getConstraintExpr()))
7819 TemplateY->getTemplatedDecl()) &&
7821 TemplateY->getTemplateParameters());
7825 if (
const auto *FDX = dyn_cast<FieldDecl>(
X)) {
7828 return hasSameType(FDX->getType(), FDY->getType());
7832 if (
const auto *IFDX = dyn_cast<IndirectFieldDecl>(
X)) {
7834 return IFDX->getAnonField()->getCanonicalDecl() ==
7835 IFDY->getAnonField()->getCanonicalDecl();
7844 if (
const auto *USX = dyn_cast<UsingShadowDecl>(
X)) {
7851 if (
const auto *UX = dyn_cast<UsingDecl>(
X)) {
7854 UX->hasTypename() == UY->hasTypename() &&
7855 UX->isAccessDeclaration() == UY->isAccessDeclaration();
7857 if (
const auto *UX = dyn_cast<UnresolvedUsingValueDecl>(
X)) {
7860 UX->isAccessDeclaration() == UY->isAccessDeclaration();
7862 if (
const auto *UX = dyn_cast<UnresolvedUsingTypenameDecl>(
X)) {
7870 if (
const auto *UX = dyn_cast<UsingPackDecl>(
X)) {
7872 UX->getInstantiatedFromUsingDecl(),
7877 if (
const auto *NAX = dyn_cast<NamespaceAliasDecl>(
X)) {
7879 return NAX->getNamespace()->Equals(NAY->getNamespace());
7927 bool AnyNonCanonArgs =
false;
7930 if (!AnyNonCanonArgs)
7940 llvm_unreachable(
"Unhandled template argument kind");
7950 llvm_unreachable(
"Comparing NULL template argument");
7975 llvm::FoldingSetNodeID ID1, ID2;
7985 return isSameTemplateArgument(Arg1, Arg2);
7989 llvm_unreachable(
"Unhandled template argument kind");
7994 if (!T.hasLocalQualifiers()) {
7996 if (
const auto *AT = dyn_cast<ArrayType>(T))
8016 const auto *ATy = dyn_cast<ArrayType>(split.
Ty);
8017 if (!ATy || qs.
empty())
8024 if (
const auto *CAT = dyn_cast<ConstantArrayType>(ATy))
8027 CAT->getSizeModifier(),
8028 CAT->getIndexTypeCVRQualifiers()));
8029 if (
const auto *IAT = dyn_cast<IncompleteArrayType>(ATy))
8031 IAT->getSizeModifier(),
8032 IAT->getIndexTypeCVRQualifiers()));
8034 if (
const auto *DSAT = dyn_cast<DependentSizedArrayType>(ATy))
8036 NewEltTy, DSAT->getSizeExpr(), DSAT->getSizeModifier(),
8037 DSAT->getIndexTypeCVRQualifiers()));
8042 VAT->getIndexTypeCVRQualifiers()));
8050 if (T->isArrayType() || T->isFunctionType())
8058 return T.getUnqualifiedType();
8069 if (T->isArrayType() || T->isFunctionType())
8071 return T.getUnqualifiedType();
8086 assert(PrettyArrayType &&
"Not an array type!");
8123 uint64_t ElementCount = 1;
8126 CA = dyn_cast_or_null<ConstantArrayType>(
8129 return ElementCount;
8137 uint64_t ElementCount = 1;
8141 AILE = dyn_cast<ArrayInitLoopExpr>(AILE->
getSubExpr());
8144 return ElementCount;
8154 default: llvm_unreachable(
"getFloatingRank(): not a floating type");
8156 case BuiltinType::Half:
return HalfRank;
8157 case BuiltinType::Float:
return FloatRank;
8190unsigned ASTContext::getIntegerRank(
const Type *T)
const {
8191 assert(T->isCanonicalUnqualified() &&
"T should be canonicalized");
8195 if (
const auto *EIT = dyn_cast<BitIntType>(T))
8196 return 0 + (EIT->getNumBits() << 3);
8198 if (
const auto *OBT = dyn_cast<OverflowBehaviorType>(T))
8199 return getIntegerRank(OBT->getUnderlyingType().getTypePtr());
8202 default: llvm_unreachable(
"getIntegerRank(): not a built-in integer");
8203 case BuiltinType::Bool:
8205 case BuiltinType::Char_S:
8206 case BuiltinType::Char_U:
8207 case BuiltinType::SChar:
8208 case BuiltinType::UChar:
8210 case BuiltinType::Short:
8211 case BuiltinType::UShort:
8213 case BuiltinType::Int:
8214 case BuiltinType::UInt:
8216 case BuiltinType::Long:
8217 case BuiltinType::ULong:
8219 case BuiltinType::LongLong:
8220 case BuiltinType::ULongLong:
8222 case BuiltinType::Int128:
8223 case BuiltinType::UInt128:
8228 case BuiltinType::Char8:
8230 case BuiltinType::Char16:
8231 return getIntegerRank(
8233 case BuiltinType::Char32:
8234 return getIntegerRank(
8236 case BuiltinType::WChar_S:
8237 case BuiltinType::WChar_U:
8238 return getIntegerRank(
8268 uint64_t BitWidth = Field->getBitWidthValue();
8294 if (BitWidth < IntSize)
8297 if (BitWidth == IntSize)
8312 assert(!Promotable.
isNull());
8315 return ED->getPromotionType();
8319 if (
const auto *OBT = Promotable->
getAs<OverflowBehaviorType>()) {
8332 if (BT->getKind() == BuiltinType::WChar_S ||
8333 BT->getKind() == BuiltinType::WChar_U ||
8334 BT->getKind() == BuiltinType::Char8 ||
8335 BT->getKind() == BuiltinType::Char16 ||
8336 BT->getKind() == BuiltinType::Char32) {
8337 bool FromIsSigned = BT->getKind() == BuiltinType::WChar_S;
8341 for (
const auto &PT : PromoteTypes) {
8343 if (FromSize < ToSize ||
8344 (FromSize == ToSize && FromIsSigned == PT->isSignedIntegerType()))
8347 llvm_unreachable(
"char type should fit into long long");
8354 uint64_t PromotableSize =
getIntWidth(Promotable);
8363 while (!T.isNull()) {
8365 return T.getObjCLifetime();
8366 if (T->isArrayType())
8368 else if (
const auto *PT = T->getAs<
PointerType>())
8369 T = PT->getPointeeType();
8371 T = RT->getPointeeType();
8396 if (
const auto *ET = dyn_cast<EnumType>(LHSC))
8398 if (
const auto *ET = dyn_cast<EnumType>(RHSC))
8401 if (LHSC == RHSC)
return 0;
8406 unsigned LHSRank = getIntegerRank(LHSC);
8407 unsigned RHSRank = getIntegerRank(RHSC);
8409 if (LHSUnsigned == RHSUnsigned) {
8410 if (LHSRank == RHSRank)
return 0;
8411 return LHSRank > RHSRank ? 1 : -1;
8417 if (LHSRank >= RHSRank)
8427 if (RHSRank >= LHSRank)
8437 if (CFConstantStringTypeDecl)
8438 return CFConstantStringTypeDecl;
8440 assert(!CFConstantStringTagDecl &&
8441 "tag and typedef should be initialized together");
8443 CFConstantStringTagDecl->startDefinition();
8481 if (
static_cast<unsigned>(CFRuntime) <
8484 Fields[Count++] = {
IntTy,
"flags" };
8486 Fields[Count++] = {
LongTy,
"length" };
8490 Fields[Count++] = { getFromTargetType(Target->getUInt64Type()),
"_swift_rc" };
8494 Fields[Count++] = {
IntTy,
"_ptr" };
8500 for (
unsigned i = 0; i < Count; ++i) {
8504 Fields[i].Type,
nullptr,
8507 CFConstantStringTagDecl->addDecl(Field);
8510 CFConstantStringTagDecl->completeDefinition();
8514 CFConstantStringTypeDecl =
8517 return CFConstantStringTypeDecl;
8521 if (!CFConstantStringTagDecl)
8523 return CFConstantStringTagDecl;
8533 if (ObjCSuperType.isNull()) {
8538 return ObjCSuperType;
8544 CFConstantStringTagDecl = TT->castAsRecordDecl();
8548 if (BlockDescriptorType)
8561 static const char *
const FieldNames[] = {
8566 for (
size_t i = 0; i < 2; ++i) {
8569 &
Idents.get(FieldNames[i]), FieldTypes[i],
nullptr,
8577 BlockDescriptorType = RD;
8583 if (BlockDescriptorExtendedType)
8598 static const char *
const FieldNames[] = {
8605 for (
size_t i = 0; i < 4; ++i) {
8608 &
Idents.get(FieldNames[i]), FieldTypes[i],
nullptr,
8617 BlockDescriptorExtendedType = RD;
8622 const auto *BT = dyn_cast<BuiltinType>(T);
8631 switch (BT->getKind()) {
8632#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
8633 case BuiltinType::Id: \
8635#include "clang/Basic/OpenCLImageTypes.def"
8637 case BuiltinType::OCLClkEvent:
8640 case BuiltinType::OCLEvent:
8643 case BuiltinType::OCLQueue:
8646 case BuiltinType::OCLReserveID:
8649 case BuiltinType::OCLSampler:
8668 if (!copyExpr && record->hasTrivialDestructor())
return false;
8699 llvm_unreachable(
"impossible");
8701 llvm_unreachable(
"fell out of lifetime switch!");
8709 bool &HasByrefExtendedLayout)
const {
8714 HasByrefExtendedLayout =
false;
8716 HasByrefExtendedLayout =
true;
8730 assert(Target &&
"Expected target to be initialized");
8731 const llvm::Triple &T = Target->getTriple();
8733 if (T.isOSWindows() && T.isArch64Bit())
8739 assert(Target &&
"Expected target to be initialized");
8740 const llvm::Triple &T = Target->getTriple();
8742 if (T.isOSWindows() && T.isArch64Bit())
8748 if (!ObjCInstanceTypeDecl)
8749 ObjCInstanceTypeDecl =
8751 return ObjCInstanceTypeDecl;
8757 if (
const auto *TT = dyn_cast<TypedefType>(T))
8759 return II->isStr(
"BOOL");
8767 if (!
type->isIncompleteArrayType() &&
type->isIncompleteType())
8776 else if (
type->isArrayType())
8795 if (
First->isInlineSpecified() || !
First->isStaticDataMember())
8802 !D->isInlineSpecified() && (D->isConstexpr() ||
First->isConstexpr()))
8833 for (
auto *PI :
Decl->parameters()) {
8838 assert(sz.
isPositive() &&
"BlockExpr - Incomplete param type");
8847 ParmOffset = PtrSize;
8848 for (
auto *PVDecl :
Decl->parameters()) {
8849 QualType PType = PVDecl->getOriginalType();
8850 if (
const auto *AT =
8855 PType = PVDecl->getType();
8857 PType = PVDecl->getType();
8877 for (
auto *PI :
Decl->parameters()) {
8884 "getObjCEncodingForFunctionDecl - Incomplete param type");
8891 for (
auto *PVDecl :
Decl->parameters()) {
8892 QualType PType = PVDecl->getOriginalType();
8893 if (
const auto *AT =
8898 PType = PVDecl->getType();
8900 PType = PVDecl->getType();
8914 bool Extended)
const {
8918 ObjCEncOptions Options = ObjCEncOptions()
8919 .setExpandPointedToStructures()
8920 .setExpandStructures()
8921 .setIsOutermostType();
8923 Options.setEncodeBlockParameters().setEncodeClassNames();
8924 getObjCEncodingForTypeImpl(T, S, Options,
nullptr);
8930 bool Extended)
const {
8935 Decl->getReturnType(), S, Extended);
8944 E =
Decl->sel_param_end(); PI != E; ++PI) {
8951 "getObjCEncodingForMethodDecl - Incomplete param type");
8959 ParmOffset = 2 * PtrSize;
8961 E =
Decl->sel_param_end(); PI != E; ++PI) {
8964 if (
const auto *AT =
8973 PType, S, Extended);
8984 const Decl *Container)
const {
8987 if (
const auto *CID = dyn_cast<ObjCCategoryImplDecl>(Container)) {
8988 for (
auto *PID : CID->property_impls())
8989 if (PID->getPropertyDecl() == PD)
8993 for (
auto *PID : OID->property_impls())
8994 if (PID->getPropertyDecl() == PD)
9028 const Decl *Container)
const {
9030 bool Dynamic =
false;
9038 SynthesizePID = PropertyImpDecl;
9042 std::string S =
"T";
9087 if (SynthesizePID) {
9104 if (BT->getKind() == BuiltinType::ULong &&
getIntWidth(PointeeTy) == 32)
9107 if (BT->getKind() == BuiltinType::Long &&
getIntWidth(PointeeTy) == 32)
9120 getObjCEncodingForTypeImpl(T, S,
9122 .setExpandPointedToStructures()
9123 .setExpandStructures()
9124 .setIsOutermostType(),
9125 Field, NotEncodedT);
9129 std::string& S)
const {
9133 getObjCEncodingForTypeImpl(T, S,
9135 .setExpandPointedToStructures()
9136 .setExpandStructures()
9137 .setIsOutermostType()
9138 .setEncodingProperty(),
9146 case BuiltinType::Void:
return 'v';
9147 case BuiltinType::Bool:
return 'B';
9148 case BuiltinType::Char8:
9149 case BuiltinType::Char_U:
9150 case BuiltinType::UChar:
return 'C';
9151 case BuiltinType::Char16:
9152 case BuiltinType::UShort:
return 'S';
9153 case BuiltinType::Char32:
9154 case BuiltinType::UInt:
return 'I';
9155 case BuiltinType::ULong:
9156 return C->getTargetInfo().getLongWidth() == 32 ?
'L' :
'Q';
9157 case BuiltinType::UInt128:
return 'T';
9158 case BuiltinType::ULongLong:
return 'Q';
9159 case BuiltinType::Char_S:
9160 case BuiltinType::SChar:
return 'c';
9161 case BuiltinType::Short:
return 's';
9162 case BuiltinType::WChar_S:
9163 case BuiltinType::WChar_U:
9164 case BuiltinType::Int:
return 'i';
9165 case BuiltinType::Long:
9166 return C->getTargetInfo().getLongWidth() == 32 ?
'l' :
'q';
9167 case BuiltinType::LongLong:
return 'q';
9168 case BuiltinType::Int128:
return 't';
9169 case BuiltinType::Float:
return 'f';
9170 case BuiltinType::Double:
return 'd';
9171 case BuiltinType::LongDouble:
return 'D';
9172 case BuiltinType::NullPtr:
return '*';
9174 case BuiltinType::BFloat16:
9175 case BuiltinType::Float16:
9176 case BuiltinType::Float128:
9177 case BuiltinType::Ibm128:
9178 case BuiltinType::Half:
9179 case BuiltinType::ShortAccum:
9180 case BuiltinType::Accum:
9181 case BuiltinType::LongAccum:
9182 case BuiltinType::UShortAccum:
9183 case BuiltinType::UAccum:
9184 case BuiltinType::ULongAccum:
9185 case BuiltinType::ShortFract:
9186 case BuiltinType::Fract:
9187 case BuiltinType::LongFract:
9188 case BuiltinType::UShortFract:
9189 case BuiltinType::UFract:
9190 case BuiltinType::ULongFract:
9191 case BuiltinType::SatShortAccum:
9192 case BuiltinType::SatAccum:
9193 case BuiltinType::SatLongAccum:
9194 case BuiltinType::SatUShortAccum:
9195 case BuiltinType::SatUAccum:
9196 case BuiltinType::SatULongAccum:
9197 case BuiltinType::SatShortFract:
9198 case BuiltinType::SatFract:
9199 case BuiltinType::SatLongFract:
9200 case BuiltinType::SatUShortFract:
9201 case BuiltinType::SatUFract:
9202 case BuiltinType::SatULongFract:
9206#define SVE_TYPE(Name, Id, SingletonId) \
9207 case BuiltinType::Id:
9208#include "clang/Basic/AArch64ACLETypes.def"
9209#define RVV_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
9210#include "clang/Basic/RISCVVTypes.def"
9211#define WASM_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
9212#include "clang/Basic/WebAssemblyReferenceTypes.def"
9213#define AMDGPU_TYPE(Name, Id, SingletonId, Width, Align) case BuiltinType::Id:
9214#include "clang/Basic/AMDGPUTypes.def"
9217 Diags.
Report(diag::err_unsupported_objc_primitive_encoding)
9222 case BuiltinType::ObjCId:
9223 case BuiltinType::ObjCClass:
9224 case BuiltinType::ObjCSel:
9225 llvm_unreachable(
"@encoding ObjC primitive type");
9228#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
9229 case BuiltinType::Id:
9230#include "clang/Basic/OpenCLImageTypes.def"
9231#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
9232 case BuiltinType::Id:
9233#include "clang/Basic/OpenCLExtensionTypes.def"
9234 case BuiltinType::OCLEvent:
9235 case BuiltinType::OCLClkEvent:
9236 case BuiltinType::OCLQueue:
9237 case BuiltinType::OCLReserveID:
9238 case BuiltinType::OCLSampler:
9239 case BuiltinType::Dependent:
9240#define PPC_VECTOR_TYPE(Name, Id, Size) \
9241 case BuiltinType::Id:
9242#include "clang/Basic/PPCTypes.def"
9243#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
9244#include "clang/Basic/HLSLIntangibleTypes.def"
9245#define BUILTIN_TYPE(KIND, ID)
9246#define PLACEHOLDER_TYPE(KIND, ID) \
9247 case BuiltinType::KIND:
9248#include "clang/AST/BuiltinTypes.def"
9249 llvm_unreachable(
"invalid builtin type for @encode");
9251 llvm_unreachable(
"invalid BuiltinType::Kind value");
9258 if (!
Enum->isFixed())
9268 assert(FD->
isBitField() &&
"not a bitfield - getObjCEncodingForTypeImpl");
9288 if (
const auto *IVD = dyn_cast<ObjCIvarDecl>(FD)) {
9296 S += llvm::utostr(Offset);
9311 bool VisitBasesAndFields) {
9312 T = T->getBaseElementTypeUnsafe();
9316 PT->getPointeeType().getTypePtr(),
false);
9318 auto *CXXRD = T->getAsCXXRecordDecl();
9326 if (!CXXRD->hasDefinition() || !VisitBasesAndFields)
9329 for (
const auto &B : CXXRD->bases())
9334 for (
auto *FD : CXXRD->fields())
9343void ASTContext::getObjCEncodingForTypeImpl(QualType T, std::string &S,
9344 const ObjCEncOptions Options,
9345 const FieldDecl *FD,
9346 QualType *NotEncodedT)
const {
9348 switch (CT->getTypeClass()) {
9353 if (
const auto *BT = dyn_cast<BuiltinType>(CT))
9361 getObjCEncodingForTypeImpl(T->
castAs<ComplexType>()->getElementType(), S,
9368 getObjCEncodingForTypeImpl(T->
castAs<AtomicType>()->getValueType(), S,
9375 case Type::LValueReference:
9376 case Type::RValueReference: {
9379 const auto *PT = T->
castAs<PointerType>();
9380 if (PT->isObjCSelType()) {
9389 bool isReadOnly =
false;
9394 if (T->
getAs<TypedefType>()) {
9399 }
else if (Options.IsOutermostType()) {
9400 QualType P = PointeeTy;
9401 while (
auto PT = P->
getAs<PointerType>())
9412 if (StringRef(S).ends_with(
"nr"))
9413 S.replace(S.end()-2, S.end(),
"rn");
9423 }
else if (
const auto *RTy = PointeeTy->
getAsCanonical<RecordType>()) {
9424 const IdentifierInfo *II = RTy->getDecl()->getIdentifier();
9426 if (II == &
Idents.get(
"objc_class")) {
9431 if (II == &
Idents.get(
"objc_object")) {
9440 RTy, Options.ExpandPointedToStructures()))) {
9449 ObjCEncOptions NewOptions;
9450 if (Options.ExpandPointedToStructures())
9451 NewOptions.setExpandStructures();
9452 getObjCEncodingForTypeImpl(PointeeTy, S, NewOptions,
9453 nullptr, NotEncodedT);
9457 case Type::ConstantArray:
9458 case Type::IncompleteArray:
9459 case Type::VariableArray: {
9466 getObjCEncodingForTypeImpl(
9467 AT->getElementType(), S,
9468 Options.keepingOnly(ObjCEncOptions().setExpandStructures()), FD);
9472 if (
const auto *CAT = dyn_cast<ConstantArrayType>(AT))
9473 S += llvm::utostr(CAT->getZExtSize());
9477 "Unknown array type!");
9481 getObjCEncodingForTypeImpl(
9482 AT->getElementType(), S,
9483 Options.keepingOnly(ObjCEncOptions().setExpandStructures()), FD,
9490 case Type::FunctionNoProto:
9491 case Type::FunctionProto:
9495 case Type::Record: {
9497 S += RDecl->
isUnion() ?
'(' :
'{';
9501 if (
const auto *Spec = dyn_cast<ClassTemplateSpecializationDecl>(RDecl)) {
9502 const TemplateArgumentList &TemplateArgs = Spec->getTemplateArgs();
9503 llvm::raw_string_ostream
OS(S);
9504 printTemplateArgumentList(OS, TemplateArgs.
asArray(),
9510 if (Options.ExpandStructures()) {
9513 getObjCEncodingForStructureImpl(RDecl, S, FD,
true, NotEncodedT);
9515 for (
const auto *Field : RDecl->
fields()) {
9518 S +=
Field->getNameAsString();
9523 if (
Field->isBitField()) {
9524 getObjCEncodingForTypeImpl(
Field->getType(), S,
9525 ObjCEncOptions().setExpandStructures(),
9528 QualType qt =
Field->getType();
9530 getObjCEncodingForTypeImpl(
9532 ObjCEncOptions().setExpandStructures().setIsStructField(), FD,
9538 S += RDecl->
isUnion() ?
')' :
'}';
9542 case Type::BlockPointer: {
9543 const auto *BT = T->
castAs<BlockPointerType>();
9545 if (Options.EncodeBlockParameters()) {
9546 const auto *FT = BT->getPointeeType()->castAs<FunctionType>();
9550 getObjCEncodingForTypeImpl(FT->getReturnType(), S,
9551 Options.forComponentType(), FD, NotEncodedT);
9555 if (
const auto *FPT = dyn_cast<FunctionProtoType>(FT)) {
9556 for (
const auto &I : FPT->param_types())
9557 getObjCEncodingForTypeImpl(I, S, Options.forComponentType(), FD,
9565 case Type::ObjCObject: {
9569 S +=
"{objc_object=}";
9573 S +=
"{objc_class=}";
9580 case Type::ObjCInterface: {
9583 ObjCInterfaceDecl *OI = T->
castAs<ObjCObjectType>()->getInterface();
9586 if (Options.ExpandStructures()) {
9588 SmallVector<const ObjCIvarDecl*, 32> Ivars;
9590 for (
unsigned i = 0, e = Ivars.size(); i != e; ++i) {
9591 const FieldDecl *
Field = Ivars[i];
9592 if (
Field->isBitField())
9593 getObjCEncodingForTypeImpl(
Field->getType(), S,
9594 ObjCEncOptions().setExpandStructures(),
9597 getObjCEncodingForTypeImpl(
Field->getType(), S,
9598 ObjCEncOptions().setExpandStructures(), FD,
9606 case Type::ObjCObjectPointer: {
9607 const auto *OPT = T->
castAs<ObjCObjectPointerType>();
9608 if (OPT->isObjCIdType()) {
9613 if (OPT->isObjCClassType() || OPT->isObjCQualifiedClassType()) {
9621 if (OPT->isObjCQualifiedIdType()) {
9622 getObjCEncodingForTypeImpl(
9624 Options.keepingOnly(ObjCEncOptions()
9625 .setExpandPointedToStructures()
9626 .setExpandStructures()),
9628 if (FD || Options.EncodingProperty() || Options.EncodeClassNames()) {
9632 for (
const auto *I : OPT->quals()) {
9634 S += I->getObjCRuntimeNameAsString();
9643 if (OPT->getInterfaceDecl() &&
9644 (FD || Options.EncodingProperty() || Options.EncodeClassNames())) {
9646 S += OPT->getInterfaceDecl()->getObjCRuntimeNameAsString();
9647 for (
const auto *I : OPT->quals()) {
9649 S += I->getObjCRuntimeNameAsString();
9659 case Type::MemberPointer:
9663 case Type::ExtVector:
9669 case Type::ConstantMatrix:
9682 case Type::DeducedTemplateSpecialization:
9685 case Type::HLSLAttributedResource:
9686 case Type::HLSLInlineSpirv:
9687 case Type::OverflowBehavior:
9688 llvm_unreachable(
"unexpected type");
9690 case Type::ArrayParameter:
9692#define ABSTRACT_TYPE(KIND, BASE)
9693#define TYPE(KIND, BASE)
9694#define DEPENDENT_TYPE(KIND, BASE) \
9696#define NON_CANONICAL_TYPE(KIND, BASE) \
9698#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(KIND, BASE) \
9700#include "clang/AST/TypeNodes.inc"
9701 llvm_unreachable(
"@encode for dependent type!");
9703 llvm_unreachable(
"bad type kind!");
9706void ASTContext::getObjCEncodingForStructureImpl(RecordDecl *RDecl,
9708 const FieldDecl *FD,
9710 QualType *NotEncodedT)
const {
9711 assert(RDecl &&
"Expected non-null RecordDecl");
9712 assert(!RDecl->
isUnion() &&
"Should not be called for unions");
9716 const auto *CXXRec = dyn_cast<CXXRecordDecl>(RDecl);
9717 std::multimap<uint64_t, NamedDecl *> FieldOrBaseOffsets;
9721 for (
const auto &BI : CXXRec->bases()) {
9722 if (!BI.isVirtual()) {
9727 FieldOrBaseOffsets.insert(FieldOrBaseOffsets.upper_bound(offs),
9728 std::make_pair(offs, base));
9733 for (FieldDecl *Field : RDecl->
fields()) {
9734 if (!
Field->isZeroLengthBitField() &&
Field->isZeroSize(*
this))
9737 FieldOrBaseOffsets.insert(FieldOrBaseOffsets.upper_bound(offs),
9738 std::make_pair(offs, Field));
9741 if (CXXRec && includeVBases) {
9742 for (
const auto &BI : CXXRec->vbases()) {
9748 FieldOrBaseOffsets.find(offs) == FieldOrBaseOffsets.end())
9749 FieldOrBaseOffsets.insert(FieldOrBaseOffsets.end(),
9750 std::make_pair(offs, base));
9764 std::multimap<uint64_t, NamedDecl *>::iterator
9765 CurLayObj = FieldOrBaseOffsets.begin();
9767 if (CXXRec && CXXRec->isDynamicClass() &&
9768 (CurLayObj == FieldOrBaseOffsets.end() || CurLayObj->first != 0)) {
9771 std::string recname = CXXRec->getNameAsString();
9772 if (recname.empty()) recname =
"?";
9785 FieldOrBaseOffsets.insert(FieldOrBaseOffsets.upper_bound(offs),
9786 std::make_pair(offs,
nullptr));
9789 for (; CurLayObj != FieldOrBaseOffsets.end(); ++CurLayObj) {
9791 assert(CurOffs <= CurLayObj->first);
9792 if (CurOffs < CurLayObj->first) {
9793 uint64_t padding = CurLayObj->first - CurOffs;
9805 NamedDecl *dcl = CurLayObj->second;
9809 if (
auto *base = dyn_cast<CXXRecordDecl>(dcl)) {
9814 getObjCEncodingForStructureImpl(base, S, FD,
false,
9824 S += field->getNameAsString();
9828 if (field->isBitField()) {
9831 CurOffs += field->getBitWidthValue();
9834 QualType qt = field->getType();
9836 getObjCEncodingForTypeImpl(
9837 qt, S, ObjCEncOptions().setExpandStructures().setIsStructField(),
9848 std::string& S)
const {
9881 if (!ObjCClassDecl) {
9886 return ObjCClassDecl;
9890 if (!ObjCProtocolClassDecl) {
9891 ObjCProtocolClassDecl
9900 return ObjCProtocolClassDecl;
9921 QualType T = Context->getPointerType(Context->CharTy);
9922 return Context->buildImplicitTypedef(T, Name);
9935 QualType T = Context->getPointerType(Context->VoidTy);
9936 return Context->buildImplicitTypedef(T,
"__builtin_va_list");
9943 if (Context->getLangOpts().CPlusPlus) {
9948 &Context->Idents.get(
"std"),
9956 const size_t NumFields = 5;
9958 const char *FieldNames[NumFields];
9961 FieldTypes[0] = Context->getPointerType(Context->VoidTy);
9962 FieldNames[0] =
"__stack";
9965 FieldTypes[1] = Context->getPointerType(Context->VoidTy);
9966 FieldNames[1] =
"__gr_top";
9969 FieldTypes[2] = Context->getPointerType(Context->VoidTy);
9970 FieldNames[2] =
"__vr_top";
9973 FieldTypes[3] = Context->IntTy;
9974 FieldNames[3] =
"__gr_offs";
9977 FieldTypes[4] = Context->IntTy;
9978 FieldNames[4] =
"__vr_offs";
9981 for (
unsigned i = 0; i < NumFields; ++i) {
9986 &Context->Idents.get(FieldNames[i]),
9987 FieldTypes[i],
nullptr,
9999 return Context->buildImplicitTypedef(VaListTagType,
"__builtin_va_list");
10006 VaListTagDecl = Context->buildImplicitRecord(
"__va_list_tag");
10009 const size_t NumFields = 5;
10011 const char *FieldNames[NumFields];
10014 FieldTypes[0] = Context->UnsignedCharTy;
10015 FieldNames[0] =
"gpr";
10018 FieldTypes[1] = Context->UnsignedCharTy;
10019 FieldNames[1] =
"fpr";
10022 FieldTypes[2] = Context->UnsignedShortTy;
10023 FieldNames[2] =
"reserved";
10026 FieldTypes[3] = Context->getPointerType(Context->VoidTy);
10027 FieldNames[3] =
"overflow_arg_area";
10030 FieldTypes[4] = Context->getPointerType(Context->VoidTy);
10031 FieldNames[4] =
"reg_save_area";
10034 for (
unsigned i = 0; i < NumFields; ++i) {
10038 &Context->Idents.get(FieldNames[i]),
10039 FieldTypes[i],
nullptr,
10052 Context->buildImplicitTypedef(VaListTagType,
"__va_list_tag");
10056 std::nullopt, VaListTagTypedefDecl);
10059 llvm::APInt Size(Context->getTypeSize(Context->getSizeType()), 1);
10060 QualType VaListTagArrayType = Context->getConstantArrayType(
10062 return Context->buildImplicitTypedef(VaListTagArrayType,
"__builtin_va_list");
10065static TypedefDecl *
10069 VaListTagDecl = Context->buildImplicitRecord(
"__va_list_tag");
10072 const size_t NumFields = 4;
10074 const char *FieldNames[NumFields];
10077 FieldTypes[0] = Context->UnsignedIntTy;
10078 FieldNames[0] =
"gp_offset";
10081 FieldTypes[1] = Context->UnsignedIntTy;
10082 FieldNames[1] =
"fp_offset";
10085 FieldTypes[2] = Context->getPointerType(Context->VoidTy);
10086 FieldNames[2] =
"overflow_arg_area";
10089 FieldTypes[3] = Context->getPointerType(Context->VoidTy);
10090 FieldNames[3] =
"reg_save_area";
10093 for (
unsigned i = 0; i < NumFields; ++i) {
10098 &Context->Idents.get(FieldNames[i]),
10099 FieldTypes[i],
nullptr,
10113 llvm::APInt Size(Context->getTypeSize(Context->getSizeType()), 1);
10114 QualType VaListTagArrayType = Context->getConstantArrayType(
10116 return Context->buildImplicitTypedef(VaListTagArrayType,
"__builtin_va_list");
10119static TypedefDecl *
10122 RecordDecl *VaListDecl = Context->buildImplicitRecord(
"__va_list");
10123 if (Context->getLangOpts().CPlusPlus) {
10142 &Context->Idents.get(
"__ap"),
10143 Context->getPointerType(Context->VoidTy),
10153 Context->VaListTagDecl = VaListDecl;
10156 CanQualType T = Context->getCanonicalTagType(VaListDecl);
10157 return Context->buildImplicitTypedef(T,
"__builtin_va_list");
10160static TypedefDecl *
10164 VaListTagDecl = Context->buildImplicitRecord(
"__va_list_tag");
10167 const size_t NumFields = 4;
10169 const char *FieldNames[NumFields];
10172 FieldTypes[0] = Context->LongTy;
10173 FieldNames[0] =
"__gpr";
10176 FieldTypes[1] = Context->LongTy;
10177 FieldNames[1] =
"__fpr";
10180 FieldTypes[2] = Context->getPointerType(Context->VoidTy);
10181 FieldNames[2] =
"__overflow_arg_area";
10184 FieldTypes[3] = Context->getPointerType(Context->VoidTy);
10185 FieldNames[3] =
"__reg_save_area";
10188 for (
unsigned i = 0; i < NumFields; ++i) {
10193 &Context->Idents.get(FieldNames[i]),
10194 FieldTypes[i],
nullptr,
10208 llvm::APInt Size(Context->getTypeSize(Context->getSizeType()), 1);
10209 QualType VaListTagArrayType = Context->getConstantArrayType(
10212 return Context->buildImplicitTypedef(VaListTagArrayType,
"__builtin_va_list");
10218 VaListTagDecl = Context->buildImplicitRecord(
"__va_list_tag");
10221 const size_t NumFields = 3;
10223 const char *FieldNames[NumFields];
10226 FieldTypes[0] = Context->getPointerType(Context->VoidTy);
10227 FieldNames[0] =
"__current_saved_reg_area_pointer";
10230 FieldTypes[1] = Context->getPointerType(Context->VoidTy);
10231 FieldNames[1] =
"__saved_reg_area_end_pointer";
10234 FieldTypes[2] = Context->getPointerType(Context->VoidTy);
10235 FieldNames[2] =
"__overflow_area_pointer";
10238 for (
unsigned i = 0; i < NumFields; ++i) {
10241 SourceLocation(), &Context->Idents.get(FieldNames[i]), FieldTypes[i],
10254 Context->buildImplicitTypedef(VaListTagType,
"__va_list_tag");
10258 std::nullopt, VaListTagTypedefDecl);
10261 llvm::APInt Size(Context->getTypeSize(Context->getSizeType()), 1);
10262 QualType VaListTagArrayType = Context->getConstantArrayType(
10265 return Context->buildImplicitTypedef(VaListTagArrayType,
"__builtin_va_list");
10268static TypedefDecl *
10278 constexpr size_t NumFields = 3;
10279 QualType FieldTypes[NumFields] = {Context->getPointerType(Context->IntTy),
10280 Context->getPointerType(Context->IntTy),
10282 const char *FieldNames[NumFields] = {
"__va_stk",
"__va_reg",
"__va_ndx"};
10285 for (
unsigned i = 0; i < NumFields; ++i) {
10288 &Context->Idents.get(FieldNames[i]), FieldTypes[i],
nullptr,
10300 Context->buildImplicitTypedef(VaListTagType,
"__builtin_va_list");
10302 return VaListTagTypedefDecl;
10328 llvm_unreachable(
"Unhandled __builtin_va_list type kind");
10332 if (!BuiltinVaListDecl) {
10333 BuiltinVaListDecl =
CreateVaListDecl(
this, Target->getBuiltinVaListKind());
10334 assert(BuiltinVaListDecl->isImplicit());
10337 return BuiltinVaListDecl;
10350 if (!BuiltinMSVaListDecl)
10353 return BuiltinMSVaListDecl;
10370 assert(ObjCConstantStringType.isNull() &&
10371 "'NSConstantString' type already set!");
10381 unsigned size = End - Begin;
10382 assert(size > 1 &&
"set is not overloaded!");
10388 NamedDecl **Storage = OT->getStorage();
10411 bool TemplateKeyword,
10416 if (
Template.getAsTemplateDecl()->getKind() == Decl::TemplateTemplateParm) {
10417 assert(!Qualifier &&
"unexpected qualified template template parameter");
10418 assert(TemplateKeyword ==
false);
10423 llvm::FoldingSetNodeID ID;
10426 void *InsertPos =
nullptr;
10428 QualifiedTemplateNames.FindNodeOrInsertPos(ID, InsertPos);
10432 QualifiedTemplateNames.InsertNode(QTN, InsertPos);
10442 llvm::FoldingSetNodeID ID;
10445 void *InsertPos =
nullptr;
10447 DependentTemplateNames.FindNodeOrInsertPos(ID, InsertPos))
10452 DependentTemplateNames.InsertNode(QTN, InsertPos);
10457 Decl *AssociatedDecl,
10460 bool Final)
const {
10461 llvm::FoldingSetNodeID ID;
10463 Index, PackIndex, Final);
10465 void *insertPos =
nullptr;
10467 = SubstTemplateTemplateParms.FindNodeOrInsertPos(ID, insertPos);
10471 Replacement, AssociatedDecl, Index, PackIndex, Final);
10472 SubstTemplateTemplateParms.InsertNode(subst, insertPos);
10480 Decl *AssociatedDecl,
10481 unsigned Index,
bool Final)
const {
10483 llvm::FoldingSetNodeID ID;
10485 AssociatedDecl, Index, Final);
10487 void *InsertPos =
nullptr;
10489 = SubstTemplateTemplateParmPacks.FindNodeOrInsertPos(ID, InsertPos);
10494 SubstTemplateTemplateParmPacks.InsertNode(Subst, InsertPos);
10508 llvm::FoldingSetNodeID ID;
10511 void *InsertPos =
nullptr;
10513 DeducedTemplates.FindNodeOrInsertPos(ID, InsertPos);
10519 DeducedTemplates.InsertNode(DTS, InsertPos);
10542 llvm_unreachable(
"Unhandled TargetInfo::IntType value");
10572 while (
const auto *AT = dyn_cast<ArrayType>(CT))
10573 CT = AT->getElementType();
10605 assert(FirstVec->
isVectorType() &&
"FirstVec should be a vector type");
10606 assert(SecondVec->
isVectorType() &&
"SecondVec should be a vector type");
10663 const auto *LHSOBT = LHS->
getAs<OverflowBehaviorType>();
10664 const auto *RHSOBT = RHS->
getAs<OverflowBehaviorType>();
10666 if (!LHSOBT && !RHSOBT)
10669 if (LHSOBT && RHSOBT) {
10670 if (LHSOBT->getBehaviorKind() != RHSOBT->getBehaviorKind())
10675 QualType LHSUnderlying = LHSOBT ? LHSOBT->desugar() : LHS;
10676 QualType RHSUnderlying = RHSOBT ? RHSOBT->desugar() : RHS;
10678 if (RHSOBT && !LHSOBT) {
10689 auto VScale = Context.getTargetInfo().getVScaleRange(
10696 uint64_t EltSize = Context.getTypeSize(Info.
ElementType);
10700 uint64_t MinElts = Info.
EC.getKnownMinValue();
10701 return VScale->first * MinElts * EltSize;
10709 "Expected RVV builtin type and vector type!");
10749 return IsValidCast(FirstType, SecondType) ||
10750 IsValidCast(SecondType, FirstType);
10758 "Expected RVV builtin type and vector type!");
10765 if (!BT->isRVVVLSBuiltinType())
10785 return VecTy->getElementType().getCanonicalType()->isIntegerType() &&
10792 return IsLaxCompatible(FirstType, SecondType) ||
10793 IsLaxCompatible(SecondType, FirstType);
10799 if (
const AttributedType *
Attr = dyn_cast<AttributedType>(Ty)) {
10800 if (
Attr->getAttrKind() == attr::ObjCOwnership)
10803 Ty =
Attr->getModifiedType();
10807 Ty =
Paren->getInnerType();
10839 for (
auto *lhsProto : lhs->
quals()) {
10840 bool match =
false;
10841 for (
auto *rhsProto : rhs->
quals()) {
10872 for (
auto *I : lhs->
quals()) {
10876 if (!rhsID->ClassImplementsProtocol(I,
true))
10884 for (
auto *lhsProto : lhs->
quals()) {
10885 bool match =
false;
10890 for (
auto *rhsProto : rhs->
quals()) {
10900 for (
auto *I : lhs->
quals()) {
10904 if (rhsID->ClassImplementsProtocol(I,
true)) {
10921 for (
auto *lhsProto : lhs->
quals()) {
10922 bool match =
false;
10929 for (
auto *rhsProto : rhs->
quals()) {
10948 if (LHSInheritedProtocols.empty() && lhs->
qual_empty())
10950 for (
auto *lhsProto : LHSInheritedProtocols) {
10951 bool match =
false;
10952 for (
auto *rhsProto : rhs->
quals()) {
10977 if (LHS->isObjCUnqualifiedId() || RHS->isObjCUnqualifiedId())
10982 auto finish = [&](
bool succeeded) ->
bool {
10986 if (!RHS->isKindOfType())
10997 if (LHS->isObjCQualifiedId() || RHS->isObjCQualifiedId()) {
11002 if (LHS->isObjCQualifiedClass() && RHS->isObjCQualifiedClass()) {
11007 if (LHS->isObjCClass() && RHS->isObjCClass()) {
11012 if (LHS->getInterface() && RHS->getInterface()) {
11027 bool BlockReturnType) {
11031 auto finish = [&](
bool succeeded) ->
bool {
11056 if (
getLangOpts().CompatibilityQualifiedIdBlockParamTypeChecking)
11060 (!BlockReturnType &&
11064 (BlockReturnType ? LHSOPT : RHSOPT),
11065 (BlockReturnType ? RHSOPT : LHSOPT),
false));
11073 return finish(BlockReturnType);
11075 return finish(!BlockReturnType);
11087 return (*lhs)->getName().compare((*rhs)->getName());
11104 assert(LHS->getInterface() &&
"LHS must have an interface base");
11105 assert(RHS->getInterface() &&
"RHS must have an interface base");
11111 for (
auto *proto : LHS->quals()) {
11112 Context.CollectInheritedProtocols(proto, LHSProtocolSet);
11116 Context.CollectInheritedProtocols(LHS->getInterface(), LHSProtocolSet);
11122 for (
auto *proto : RHS->quals()) {
11123 Context.CollectInheritedProtocols(proto, RHSProtocolSet);
11127 Context.CollectInheritedProtocols(RHS->getInterface(), RHSProtocolSet);
11130 for (
auto *proto : LHSProtocolSet) {
11131 if (RHSProtocolSet.count(proto))
11132 IntersectionSet.push_back(proto);
11138 Context.CollectInheritedProtocols(CommonBase, ImpliedProtocols);
11141 if (!ImpliedProtocols.empty()) {
11143 return ImpliedProtocols.contains(proto);
11148 llvm::array_pod_sort(IntersectionSet.begin(), IntersectionSet.end(),
11158 if (lhsOPT && rhsOPT)
11164 if (lhsBlock && rhsBlock)
11169 if ((lhsOPT && lhsOPT->isObjCIdType() && rhsBlock) ||
11181 bool stripKindOf) {
11182 if (lhsArgs.size() != rhsArgs.size())
11189 for (
unsigned i = 0, n = lhsArgs.size(); i != n; ++i) {
11195 if (!stripKindOf ||
11196 !ctx.
hasSameType(lhsArgs[i].stripObjCKindOfType(ctx),
11197 rhsArgs[i].stripObjCKindOfType(ctx))) {
11225 if (!LDecl || !RDecl)
11231 bool anyKindOf = LHS->isKindOfType() || RHS->isKindOfType();
11235 llvm::SmallDenseMap<const ObjCInterfaceDecl *, const ObjCObjectType *, 4>
11240 LHSAncestors[LHS->getInterface()->getCanonicalDecl()] = LHS;
11245 bool anyChanges =
false;
11246 if (LHS->isSpecialized() && RHS->isSpecialized()) {
11249 LHS->getTypeArgs(), RHS->getTypeArgs(),
11252 }
else if (LHS->isSpecialized() != RHS->isSpecialized()) {
11263 if (!Protocols.empty())
11269 if (anyChanges || LHS->isKindOfType() != anyKindOf) {
11272 anyKindOf || LHS->isKindOfType());
11280 QualType LHSSuperType = LHS->getSuperClassType();
11281 if (LHSSuperType.
isNull())
11290 auto KnownLHS = LHSAncestors.find(RHS->getInterface()->getCanonicalDecl());
11291 if (KnownLHS != LHSAncestors.end()) {
11292 LHS = KnownLHS->second;
11296 bool anyChanges =
false;
11297 if (LHS->isSpecialized() && RHS->isSpecialized()) {
11300 LHS->getTypeArgs(), RHS->getTypeArgs(),
11303 }
else if (LHS->isSpecialized() != RHS->isSpecialized()) {
11314 if (!Protocols.empty())
11319 if (anyChanges || RHS->isKindOfType() != anyKindOf) {
11322 anyKindOf || RHS->isKindOfType());
11330 QualType RHSSuperType = RHS->getSuperClassType();
11331 if (RHSSuperType.
isNull())
11342 assert(LHS->getInterface() &&
"LHS is not an interface type");
11343 assert(RHS->getInterface() &&
"RHS is not an interface type");
11348 bool IsSuperClass = LHSInterface->
isSuperClassOf(RHS->getInterface());
11355 if (LHS->getNumProtocols() > 0) {
11364 for (
auto *RHSPI : RHS->quals())
11367 if (SuperClassInheritedProtocols.empty())
11370 for (
const auto *LHSProto : LHS->quals()) {
11371 bool SuperImplementsProtocol =
false;
11372 for (
auto *SuperClassProto : SuperClassInheritedProtocols)
11373 if (SuperClassProto->lookupProtocolNamed(LHSProto->getIdentifier())) {
11374 SuperImplementsProtocol =
true;
11377 if (!SuperImplementsProtocol)
11383 if (LHS->isSpecialized()) {
11388 RHSSuper = RHSSuper->getSuperClassType()->castAs<
ObjCObjectType>();
11391 if (RHSSuper->isSpecialized() &&
11393 LHS->getTypeArgs(), RHSSuper->getTypeArgs(),
11407 if (!LHSOPT || !RHSOPT)
11425 bool CompareUnqualified) {
11444 bool OfBlockPointer,
11446 if (
const RecordType *UT = T->getAsUnionType()) {
11448 if (UD->
hasAttr<TransparentUnionAttr>()) {
11449 for (
const auto *I : UD->
fields()) {
11450 QualType ET = I->getType().getUnqualifiedType();
11464 bool OfBlockPointer,
11485 bool IsConditionalOperator) {
11488 const auto *lproto = dyn_cast<FunctionProtoType>(lbase);
11489 const auto *rproto = dyn_cast<FunctionProtoType>(rbase);
11490 bool allLTypes =
true;
11491 bool allRTypes =
true;
11495 if (OfBlockPointer) {
11497 QualType LHS = lbase->getReturnType();
11499 if (!UnqualifiedResult)
11501 retType =
mergeTypes(LHS, RHS,
true, UnqualifiedResult,
true);
11566 bool NoReturn = IsConditionalOperator
11576 std::optional<FunctionEffectSet> MergedFX;
11578 if (lproto && rproto) {
11579 assert((AllowCXX ||
11580 (!lproto->hasExceptionSpec() && !rproto->hasExceptionSpec())) &&
11581 "C++ shouldn't be here");
11583 if (lproto->getNumParams() != rproto->getNumParams())
11587 if (lproto->isVariadic() != rproto->isVariadic())
11590 if (lproto->getMethodQuals() != rproto->getMethodQuals())
11594 if (lproto->getExtraAttributeInfo().CFISalt !=
11595 rproto->getExtraAttributeInfo().CFISalt)
11601 if (LHSFX != RHSFX) {
11602 if (IsConditionalOperator)
11611 if (*MergedFX != LHSFX)
11613 if (*MergedFX != RHSFX)
11618 bool canUseLeft, canUseRight;
11630 for (
unsigned i = 0, n = lproto->getNumParams(); i < n; i++) {
11631 QualType lParamType = lproto->getParamType(i).getUnqualifiedType();
11632 QualType rParamType = rproto->getParamType(i).getUnqualifiedType();
11634 lParamType, rParamType, OfBlockPointer,
Unqualified);
11641 types.push_back(paramType);
11653 if (allLTypes)
return lhs;
11654 if (allRTypes)
return rhs;
11659 newParamInfos.empty() ?
nullptr : newParamInfos.data();
11665 if (lproto) allRTypes =
false;
11666 if (rproto) allLTypes =
false;
11670 assert((AllowCXX || !proto->
hasExceptionSpec()) &&
"C++ shouldn't be here");
11678 for (
unsigned i = 0, n = proto->
getNumParams(); i < n; ++i) {
11684 paramTy = ED->getIntegerType();
11694 if (allLTypes)
return lhs;
11695 if (allRTypes)
return rhs;
11704 if (allLTypes)
return lhs;
11705 if (allRTypes)
return rhs;
11711 QualType other,
bool isBlockReturnType) {
11717 ET->getDecl()->getDefinitionOrSelf()->getIntegerType();
11718 if (underlyingType.
isNull())
11720 if (Context.hasSameType(underlyingType, other))
11726 Context.getTypeSize(underlyingType) == Context.getTypeSize(other))
11735 if (LangOpts.CPlusPlus || !LangOpts.C23)
11756 bool BlockReturnType,
bool IsConditionalOperator) {
11757 const auto *LHSOBT = LHS->
getAs<OverflowBehaviorType>();
11758 const auto *RHSOBT = RHS->
getAs<OverflowBehaviorType>();
11760 if (!LHSOBT && !RHSOBT)
11761 return std::nullopt;
11765 if (LHSOBT->getBehaviorKind() != RHSOBT->getBehaviorKind())
11769 LHSOBT->getUnderlyingType(), RHSOBT->getUnderlyingType(),
11770 OfBlockPointer,
Unqualified, BlockReturnType, IsConditionalOperator);
11772 if (MergedUnderlying.
isNull())
11776 if (LHSOBT->getUnderlyingType() == RHSOBT->getUnderlyingType())
11779 LHSOBT->getBehaviorKind(),
11788 return mergeTypes(LHSOBT->getUnderlyingType(), RHS, OfBlockPointer,
11789 Unqualified, BlockReturnType, IsConditionalOperator);
11792 return mergeTypes(LHS, RHSOBT->getUnderlyingType(), OfBlockPointer,
11793 Unqualified, BlockReturnType, IsConditionalOperator);
11798 bool IsConditionalOperator) {
11809 if (LangOpts.OpenMP && LHSRefTy && RHSRefTy &&
11813 if (LHSRefTy || RHSRefTy)
11816 if (std::optional<QualType> MergedOBT =
11818 BlockReturnType, IsConditionalOperator))
11830 if (LHSCan == RHSCan)
11835 Qualifiers RQuals = RHSCan.getLocalQualifiers();
11836 if (LQuals != RQuals) {
11853 assert((GC_L != GC_R) &&
"unequal qualifier sets had only equal elements");
11874 if (LHSClass == Type::FunctionProto) LHSClass = Type::FunctionNoProto;
11875 if (RHSClass == Type::FunctionProto) RHSClass = Type::FunctionNoProto;
11878 if (LHSClass == Type::VariableArray || LHSClass == Type::IncompleteArray)
11879 LHSClass = Type::ConstantArray;
11880 if (RHSClass == Type::VariableArray || RHSClass == Type::IncompleteArray)
11881 RHSClass = Type::ConstantArray;
11884 if (LHSClass == Type::ObjCInterface) LHSClass = Type::ObjCObject;
11885 if (RHSClass == Type::ObjCInterface) RHSClass = Type::ObjCObject;
11888 if (LHSClass == Type::ExtVector) LHSClass = Type::Vector;
11889 if (RHSClass == Type::ExtVector) RHSClass = Type::Vector;
11892 if (LHSClass != RHSClass) {
11902 if (OfBlockPointer && !BlockReturnType) {
11910 if (
const auto *AT = LHS->
getAs<AutoType>()) {
11911 if (!AT->isDeduced() && AT->isGNUAutoType())
11914 if (
const auto *AT = RHS->
getAs<AutoType>()) {
11915 if (!AT->isDeduced() && AT->isGNUAutoType())
11922 switch (LHSClass) {
11923#define TYPE(Class, Base)
11924#define ABSTRACT_TYPE(Class, Base)
11925#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base) case Type::Class:
11926#define NON_CANONICAL_TYPE(Class, Base) case Type::Class:
11927#define DEPENDENT_TYPE(Class, Base) case Type::Class:
11928#include "clang/AST/TypeNodes.inc"
11929 llvm_unreachable(
"Non-canonical and dependent types shouldn't get here");
11932 case Type::DeducedTemplateSpecialization:
11933 case Type::LValueReference:
11934 case Type::RValueReference:
11935 case Type::MemberPointer:
11936 llvm_unreachable(
"C++ should never be in mergeTypes");
11938 case Type::ObjCInterface:
11939 case Type::IncompleteArray:
11940 case Type::VariableArray:
11941 case Type::FunctionProto:
11942 case Type::ExtVector:
11943 case Type::OverflowBehavior:
11944 llvm_unreachable(
"Types are eliminated above");
11946 case Type::Pointer:
11957 if (ResultType.
isNull())
11965 case Type::BlockPointer:
11990 if (ResultType.
isNull())
12009 if (ResultType.
isNull())
12017 case Type::ConstantArray:
12032 if (ResultType.
isNull())
12040 if (LVAT || RVAT) {
12043 -> std::pair<bool,llvm::APInt> {
12045 std::optional<llvm::APSInt> TheInt;
12048 return std::make_pair(
true, *TheInt);
12049 return std::make_pair(
false, llvm::APSInt());
12052 return std::make_pair(
true, CAT->getSize());
12053 return std::make_pair(
false, llvm::APInt());
12056 bool HaveLSize, HaveRSize;
12057 llvm::APInt LSize, RSize;
12058 std::tie(HaveLSize, LSize) = SizeFetch(LVAT, LCAT);
12059 std::tie(HaveRSize, RSize) = SizeFetch(RVAT, RCAT);
12060 if (HaveLSize && HaveRSize && !llvm::APInt::isSameValue(LSize, RSize))
12094 case Type::FunctionNoProto:
12096 false, IsConditionalOperator);
12100 case Type::Builtin:
12103 case Type::Complex:
12112 case Type::ConstantMatrix:
12117 case Type::ObjCObject: {
12126 case Type::ObjCObjectPointer:
12127 if (OfBlockPointer) {
12139 assert(LHS != RHS &&
12140 "Equivalent pipe types should have already been handled!");
12142 case Type::ArrayParameter:
12143 assert(LHS != RHS &&
12144 "Equivalent ArrayParameter types should have already been handled!");
12146 case Type::BitInt: {
12154 if (LHSUnsigned != RHSUnsigned)
12157 if (LHSBits != RHSBits)
12161 case Type::HLSLAttributedResource: {
12162 const HLSLAttributedResourceType *LHSTy =
12163 LHS->
castAs<HLSLAttributedResourceType>();
12164 const HLSLAttributedResourceType *RHSTy =
12165 RHS->
castAs<HLSLAttributedResourceType>();
12166 assert(LHSTy->getWrappedType() == RHSTy->getWrappedType() &&
12167 LHSTy->getWrappedType()->isHLSLResourceType() &&
12168 "HLSLAttributedResourceType should always wrap __hlsl_resource_t");
12170 if (LHSTy->getAttrs() == RHSTy->getAttrs() &&
12171 LHSTy->getContainedType() == RHSTy->getContainedType())
12175 case Type::HLSLInlineSpirv:
12176 const HLSLInlineSpirvType *LHSTy = LHS->
castAs<HLSLInlineSpirvType>();
12177 const HLSLInlineSpirvType *RHSTy = RHS->
castAs<HLSLInlineSpirvType>();
12179 if (LHSTy->getOpcode() == RHSTy->getOpcode() &&
12180 LHSTy->getSize() == RHSTy->getSize() &&
12181 LHSTy->getAlignment() == RHSTy->getAlignment()) {
12182 for (
size_t I = 0; I < LHSTy->getOperands().size(); I++)
12183 if (LHSTy->getOperands()[I] != RHSTy->getOperands()[I])
12191 llvm_unreachable(
"Invalid Type::Class!");
12196 bool &CanUseFirst,
bool &CanUseSecond,
12198 assert(NewParamInfos.empty() &&
"param info list not empty");
12199 CanUseFirst = CanUseSecond =
true;
12205 if (!FirstHasInfo && !SecondHasInfo)
12208 bool NeedParamInfo =
false;
12212 for (
size_t I = 0; I < E; ++I) {
12223 bool FirstNoEscape = FirstParam.
isNoEscape();
12224 bool SecondNoEscape = SecondParam.
isNoEscape();
12225 bool IsNoEscape = FirstNoEscape && SecondNoEscape;
12227 if (NewParamInfos.back().getOpaqueValue())
12228 NeedParamInfo =
true;
12229 if (FirstNoEscape != IsNoEscape)
12230 CanUseFirst =
false;
12231 if (SecondNoEscape != IsNoEscape)
12232 CanUseSecond =
false;
12235 if (!NeedParamInfo)
12236 NewParamInfos.clear();
12242 if (
auto It = ObjCLayouts.find(D); It != ObjCLayouts.end()) {
12243 It->second =
nullptr;
12244 for (
auto *SubClass : ObjCSubClasses.lookup(D))
12256 if (LHSCan == RHSCan)
12258 if (RHSCan->isFunctionType()) {
12267 if (ResReturnType.
isNull())
12269 if (ResReturnType == NewReturnType || ResReturnType == OldReturnType) {
12286 Qualifiers RQuals = RHSCan.getLocalQualifiers();
12287 if (LQuals != RQuals) {
12300 assert((GC_L != GC_R) &&
"unequal qualifier sets had only equal elements");
12316 if (ResQT == LHSBaseQT)
12318 if (ResQT == RHSBaseQT)
12329 if (
const auto *ED = T->getAsEnumDecl())
12330 T = ED->getIntegerType();
12331 if (T->isBooleanType())
12333 if (
const auto *EIT = T->getAs<
BitIntType>())
12334 return EIT->getNumBits();
12340 assert((T->hasIntegerRepresentation() || T->isEnumeralType() ||
12341 T->isFixedPointType()) &&
12342 "Unexpected type");
12345 if (
const auto *VTy = T->getAs<
VectorType>())
12347 VTy->getNumElements(), VTy->getVectorKind());
12350 if (
const auto *EITy = T->getAs<
BitIntType>())
12354 if (
const auto *OBT = T->getAs<OverflowBehaviorType>())
12356 OBT->getBehaviorKind(),
12361 if (
const auto *ED = T->getAsEnumDecl())
12362 T = ED->getIntegerType();
12365 case BuiltinType::Char_U:
12367 case BuiltinType::Char_S:
12368 case BuiltinType::SChar:
12369 case BuiltinType::Char8:
12371 case BuiltinType::Short:
12373 case BuiltinType::Int:
12375 case BuiltinType::Long:
12377 case BuiltinType::LongLong:
12379 case BuiltinType::Int128:
12384 case BuiltinType::WChar_S:
12387 case BuiltinType::ShortAccum:
12389 case BuiltinType::Accum:
12391 case BuiltinType::LongAccum:
12393 case BuiltinType::SatShortAccum:
12395 case BuiltinType::SatAccum:
12397 case BuiltinType::SatLongAccum:
12399 case BuiltinType::ShortFract:
12401 case BuiltinType::Fract:
12403 case BuiltinType::LongFract:
12405 case BuiltinType::SatShortFract:
12407 case BuiltinType::SatFract:
12409 case BuiltinType::SatLongFract:
12412 assert((T->hasUnsignedIntegerRepresentation() ||
12413 T->isUnsignedFixedPointType()) &&
12414 "Unexpected signed integer or fixed point type");
12420 assert((T->hasIntegerRepresentation() || T->isEnumeralType() ||
12421 T->isFixedPointType()) &&
12422 "Unexpected type");
12425 if (
const auto *VTy = T->getAs<
VectorType>())
12427 VTy->getNumElements(), VTy->getVectorKind());
12430 if (
const auto *EITy = T->getAs<
BitIntType>())
12435 if (
const auto *ED = T->getAsEnumDecl())
12436 T = ED->getIntegerType();
12439 case BuiltinType::Char_S:
12441 case BuiltinType::Char_U:
12442 case BuiltinType::UChar:
12443 case BuiltinType::Char8:
12445 case BuiltinType::UShort:
12447 case BuiltinType::UInt:
12449 case BuiltinType::ULong:
12451 case BuiltinType::ULongLong:
12453 case BuiltinType::UInt128:
12458 case BuiltinType::WChar_U:
12461 case BuiltinType::UShortAccum:
12463 case BuiltinType::UAccum:
12465 case BuiltinType::ULongAccum:
12467 case BuiltinType::SatUShortAccum:
12469 case BuiltinType::SatUAccum:
12471 case BuiltinType::SatULongAccum:
12473 case BuiltinType::UShortFract:
12475 case BuiltinType::UFract:
12477 case BuiltinType::ULongFract:
12479 case BuiltinType::SatUShortFract:
12481 case BuiltinType::SatUFract:
12483 case BuiltinType::SatULongFract:
12487 (T->hasSignedIntegerRepresentation() || T->isSignedFixedPointType()) &&
12488 "Unexpected signed integer or fixed point type");
12513 bool AllowTypeModifiers) {
12517 RequiresICE =
false;
12522 bool IsSpecial =
false;
12526 default: Done =
true; --Str;
break;
12528 RequiresICE =
true;
12531 assert(!
Unsigned &&
"Can't use both 'S' and 'U' modifiers!");
12532 assert(!
Signed &&
"Can't use 'S' modifier multiple times!");
12536 assert(!
Signed &&
"Can't use both 'S' and 'U' modifiers!");
12537 assert(!
Unsigned &&
"Can't use 'U' modifier multiple times!");
12541 assert(!IsSpecial &&
"Can't use 'L' with 'W', 'N', 'Z' or 'O' modifiers");
12542 assert(HowLong <= 2 &&
"Can't have LLLL modifier");
12547 assert(!IsSpecial &&
"Can't use two 'N', 'W', 'Z' or 'O' modifiers!");
12548 assert(HowLong == 0 &&
"Can't use both 'L' and 'N' modifiers!");
12552 if (Context.getTargetInfo().getLongWidth() == 32)
12557 assert(!IsSpecial &&
"Can't use two 'N', 'W', 'Z' or 'O' modifiers!");
12558 assert(HowLong == 0 &&
"Can't use both 'L' and 'W' modifiers!");
12562 switch (Context.getTargetInfo().getInt64Type()) {
12564 llvm_unreachable(
"Unexpected integer type");
12575 assert(!IsSpecial &&
"Can't use two 'N', 'W', 'Z' or 'O' modifiers!");
12576 assert(HowLong == 0 &&
"Can't use both 'L' and 'Z' modifiers!");
12580 switch (Context.getTargetInfo().getIntTypeByWidth(32,
true)) {
12582 llvm_unreachable(
"Unexpected integer type");
12595 assert(!IsSpecial &&
"Can't use two 'N', 'W', 'Z' or 'O' modifiers!");
12596 assert(HowLong == 0 &&
"Can't use both 'L' and 'O' modifiers!");
12600 if (Context.getLangOpts().OpenCL)
12613 llvm_unreachable(
"Unknown builtin type letter!");
12616 "Bad modifiers used with 'x'!");
12617 Type = Context.Float16Ty;
12621 "Bad modifiers used with 'y'!");
12622 Type = Context.BFloat16Ty;
12626 "Bad modifiers used with 'v'!");
12627 Type = Context.VoidTy;
12631 "Bad modifiers used with 'h'!");
12632 Type = Context.HalfTy;
12636 "Bad modifiers used with 'f'!");
12637 Type = Context.FloatTy;
12641 "Bad modifiers used with 'd'!");
12643 Type = Context.LongDoubleTy;
12644 else if (HowLong == 2)
12645 Type = Context.Float128Ty;
12647 Type = Context.DoubleTy;
12650 assert(HowLong == 0 &&
"Bad modifiers used with 's'!");
12652 Type = Context.UnsignedShortTy;
12654 Type = Context.ShortTy;
12658 Type =
Unsigned ? Context.UnsignedInt128Ty : Context.Int128Ty;
12659 else if (HowLong == 2)
12660 Type =
Unsigned ? Context.UnsignedLongLongTy : Context.LongLongTy;
12661 else if (HowLong == 1)
12662 Type =
Unsigned ? Context.UnsignedLongTy : Context.LongTy;
12664 Type =
Unsigned ? Context.UnsignedIntTy : Context.IntTy;
12667 assert(HowLong == 0 &&
"Bad modifiers used with 'c'!");
12669 Type = Context.SignedCharTy;
12671 Type = Context.UnsignedCharTy;
12673 Type = Context.CharTy;
12676 assert(HowLong == 0 && !
Signed && !
Unsigned &&
"Bad modifiers for 'b'!");
12677 Type = Context.BoolTy;
12680 assert(HowLong == 0 && !
Signed && !
Unsigned &&
"Bad modifiers for 'z'!");
12681 Type = Context.getSizeType();
12684 assert(HowLong == 0 && !
Signed && !
Unsigned &&
"Bad modifiers for 'w'!");
12685 Type = Context.getWideCharType();
12688 Type = Context.getCFConstantStringType();
12691 Type = Context.getObjCIdType();
12694 Type = Context.getObjCSelType();
12697 Type = Context.getObjCSuperType();
12700 Type = Context.getBuiltinVaListType();
12701 assert(!
Type.isNull() &&
"builtin va list type not initialized!");
12712 Type = Context.getBuiltinVaListType();
12713 assert(!
Type.isNull() &&
"builtin va list type not initialized!");
12715 Type = Context.getArrayDecayedType(
Type);
12717 Type = Context.getLValueReferenceType(
Type);
12721 unsigned NumElements = strtoul(Str, &End, 10);
12722 assert(End != Str &&
"Missing vector size");
12726 RequiresICE,
false);
12727 assert(!RequiresICE &&
"Can't require vector ICE");
12729 Type = Context.getScalableVectorType(ElementType, NumElements);
12735 Type = Context.SveCountTy;
12739 Type = Context.AMDGPUBufferRsrcTy;
12743 Type = Context.AMDGPUTextureTy;
12747 Type = Context.HLSLResourceTy;
12751 llvm_unreachable(
"Unexpected target builtin type");
12757 unsigned NumElements = strtoul(Str, &End, 10);
12758 assert(End != Str &&
"Missing vector size");
12762 RequiresICE,
false);
12763 assert(!RequiresICE &&
"Can't require vector ICE");
12772 unsigned NumElements = strtoul(Str, &End, 10);
12773 assert(End != Str &&
"Missing vector size");
12779 Type = Context.getExtVectorType(ElementType, NumElements);
12785 assert(!RequiresICE &&
"Can't require complex ICE");
12786 Type = Context.getComplexType(ElementType);
12790 Type = Context.getPointerDiffType();
12793 Type = Context.getFILEType();
12794 if (
Type.isNull()) {
12801 Type = Context.getsigjmp_bufType();
12803 Type = Context.getjmp_bufType();
12805 if (
Type.isNull()) {
12811 assert(HowLong == 0 && !
Signed && !
Unsigned &&
"Bad modifiers for 'K'!");
12812 Type = Context.getucontext_tType();
12814 if (
Type.isNull()) {
12820 Type = Context.getProcessIDType();
12823 Type = Context.MFloat8Ty;
12828 Done = !AllowTypeModifiers;
12830 switch (
char c = *Str++) {
12831 default: Done =
true; --Str;
break;
12837 unsigned AddrSpace = strtoul(Str, &End, 10);
12840 Type = Context.getAddrSpaceQualType(
12842 Context.getLangASForBuiltinAddressSpace(AddrSpace));
12846 Type = Context.getPointerType(
Type);
12848 Type = Context.getLValueReferenceType(
Type);
12856 Type = Context.getVolatileType(
Type);
12865 "Integer constant 'I' type must be an integer");
12878 bool AllowTypeModifiers)
const {
12885 unsigned *IntegerConstantArgs)
const {
12886 const char *TypeStr =
BuiltinInfo.getTypeString(Id);
12887 if (TypeStr[0] ==
'\0') {
12894 bool RequiresICE =
false;
12897 RequiresICE,
true);
12901 assert(!RequiresICE &&
"Result of intrinsic cannot be required to be an ICE");
12903 while (TypeStr[0] && TypeStr[0] !=
'.') {
12910 if (RequiresICE && IntegerConstantArgs)
12911 *IntegerConstantArgs |= 1 << ArgTypes.size();
12917 ArgTypes.push_back(Ty);
12920 if (Id == Builtin::BI__GetExceptionInfo)
12923 assert((TypeStr[0] !=
'.' || TypeStr[1] == 0) &&
12924 "'.' should only occur at end of builtin type list!");
12926 bool Variadic = (TypeStr[0] ==
'.');
12933 if (ArgTypes.empty() && Variadic && !
getLangOpts().requiresStrictPrototypes())
12983 if ((!Context.getLangOpts().CPlusPlus &&
12984 !Context.getTargetInfo().getCXXABI().isMicrosoft() &&
12985 !FD->
hasAttr<DLLExportAttr>()) ||
12986 FD->
hasAttr<GNUInlineAttr>()) {
13004 if (Context.getTargetInfo().getCXXABI().isMicrosoft() &&
13007 !FD->
hasAttr<DLLExportAttr>()) {
13028 if (D->
hasAttr<DLLImportAttr>()) {
13031 }
else if (D->
hasAttr<DLLExportAttr>()) {
13034 }
else if (Context.getLangOpts().CUDA && Context.getLangOpts().CUDAIsDevice) {
13037 if (D->
hasAttr<CUDAGlobalAttr>() &&
13046 if (Context.shouldExternalize(D))
13061 switch (Source->hasExternalDefinitions(D)) {
13088 if (Context.getLangOpts().CPlusPlus &&
13089 Context.getLangOpts().IncrementalExtensions &&
13105 if (!LexicalContext)
13110 auto StaticLocalLinkage =
13122 return StaticLocalLinkage;
13128 if (Context.isMSStaticDataMemberInlineDefinition(VD))
13134 switch (Context.getInlineVariableDefinitionKind(VD)) {
13149 return StrongLinkage;
13152 return Context.getTargetInfo().getCXXABI().isMicrosoft() &&
13167 llvm_unreachable(
"Invalid Linkage!");
13177 if (
const auto *VD = dyn_cast<VarDecl>(D)) {
13178 if (!VD->isFileVarDecl())
13183 if (VD->getDescribedVarTemplate() ||
13186 }
else if (
const auto *FD = dyn_cast<FunctionDecl>(D)) {
13212 if (D->
hasAttr<WeakRefAttr>())
13219 if (LangOpts.SYCLIsDevice)
13221 D->
hasAttr<SYCLExternalAttr>());
13227 if (
const auto *FD = dyn_cast<FunctionDecl>(D)) {
13229 if (!FD->doesThisDeclarationHaveABody())
13230 return FD->doesDeclarationForceExternallyVisibleDefinition();
13233 if (FD->
hasAttr<ConstructorAttr>() || FD->
hasAttr<DestructorAttr>())
13238 if (
getTargetInfo().getCXXABI().canKeyFunctionBeInline()) {
13239 if (
const auto *MD = dyn_cast<CXXMethodDecl>(FD)) {
13258 assert(VD->isFileVarDecl() &&
"Expected file scoped var");
13262 if (LangOpts.OpenMP &&
13263 OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(VD))
13270 if (VD->shouldEmitInExternalSource())
13283 if (VD->needsDestruction(*
this))
13287 if (VD->hasInitWithSideEffects())
13292 if (
const auto *DD = dyn_cast<DecompositionDecl>(VD)) {
13293 for (
const auto *BD : DD->flat_bindings())
13294 if (
const auto *BindingVD = BD->getHoldingVar())
13304 llvm::function_ref<
void(
FunctionDecl *)> Pred)
const {
13305 assert(FD->
isMultiVersion() &&
"Only valid for multiversioned functions");
13306 llvm::SmallDenseSet<const FunctionDecl*, 4> SeenDecls;
13311 for (
auto *CurDecl :
13315 SeenDecls.insert(CurFD).second) {
13322 bool IsCXXMethod)
const {
13325 return ABI->getDefaultMethodCallConv(IsVariadic);
13327 switch (LangOpts.getDefaultCallingConv()) {
13355 return Target->getDefaultCallingConv();
13360 return ABI->isNearlyEmpty(RD);
13365 auto ABI = Target->getCXXABI();
13366 if (ABI.isMicrosoft())
13369 auto ComponentLayout =
getLangOpts().RelativeCXXABIVTables
13375 return VTContext.get();
13381 switch (T->getCXXABI().getKind()) {
13382 case TargetCXXABI::AppleARM64:
13383 case TargetCXXABI::Fuchsia:
13384 case TargetCXXABI::GenericAArch64:
13385 case TargetCXXABI::GenericItanium:
13386 case TargetCXXABI::GenericARM:
13387 case TargetCXXABI::GenericMIPS:
13388 case TargetCXXABI::iOS:
13389 case TargetCXXABI::WebAssembly:
13390 case TargetCXXABI::WatchOS:
13391 case TargetCXXABI::XL:
13393 case TargetCXXABI::Microsoft:
13396 llvm_unreachable(
"Unsupported ABI");
13400 assert(T.getCXXABI().getKind() != TargetCXXABI::Microsoft &&
13401 "Device mangle context does not support Microsoft mangling.");
13402 switch (T.getCXXABI().getKind()) {
13403 case TargetCXXABI::AppleARM64:
13404 case TargetCXXABI::Fuchsia:
13405 case TargetCXXABI::GenericAArch64:
13406 case TargetCXXABI::GenericItanium:
13407 case TargetCXXABI::GenericARM:
13408 case TargetCXXABI::GenericMIPS:
13409 case TargetCXXABI::iOS:
13410 case TargetCXXABI::WebAssembly:
13411 case TargetCXXABI::WatchOS:
13412 case TargetCXXABI::XL:
13416 if (
const auto *RD = dyn_cast<CXXRecordDecl>(ND))
13417 return RD->getDeviceLambdaManglingNumber();
13418 return std::nullopt;
13421 case TargetCXXABI::Microsoft:
13425 llvm_unreachable(
"Unsupported ABI");
13443 return ASTRecordLayouts.getMemorySize() +
13444 llvm::capacity_in_bytes(ObjCLayouts) +
13445 llvm::capacity_in_bytes(KeyFunctions) +
13446 llvm::capacity_in_bytes(ObjCImpls) +
13447 llvm::capacity_in_bytes(BlockVarCopyInits) +
13448 llvm::capacity_in_bytes(DeclAttrs) +
13449 llvm::capacity_in_bytes(TemplateOrInstantiation) +
13450 llvm::capacity_in_bytes(InstantiatedFromUsingDecl) +
13451 llvm::capacity_in_bytes(InstantiatedFromUsingShadowDecl) +
13452 llvm::capacity_in_bytes(InstantiatedFromUnnamedFieldDecl) +
13453 llvm::capacity_in_bytes(OverriddenMethods) +
13454 llvm::capacity_in_bytes(Types) +
13455 llvm::capacity_in_bytes(VariableArrayTypes);
13463 unsigned Signed)
const {
13466 if (!QualTy && DestWidth == 128)
13495 llvm_unreachable(
"Unhandled TargetInfo::RealType value");
13502 MangleNumbers[ND] = Number;
13505 Listener->AddedManglingNumber(ND, Number);
13509 bool ForAuxTarget)
const {
13510 auto I = MangleNumbers.find(ND);
13511 unsigned Res = I != MangleNumbers.end() ? I->second : 1;
13514 if (LangOpts.CUDA && !LangOpts.CUDAIsDevice) {
13515 Res = ForAuxTarget ? Res >> 16 : Res & 0xFFFF;
13517 assert(!ForAuxTarget &&
"Only CUDA/HIP host compilation supports mangling "
13518 "number for aux target");
13520 return Res > 1 ? Res : 1;
13527 StaticLocalNumbers[VD] = Number;
13530 Listener->AddedStaticLocalNumbers(VD, Number);
13534 auto I = StaticLocalNumbers.find(VD);
13535 return I != StaticLocalNumbers.end() ? I->second : 1;
13539 bool IsDestroying) {
13540 if (!IsDestroying) {
13552 bool IsTypeAware) {
13553 if (!IsTypeAware) {
13592 return GlobalOperatorDeletesForVirtualDtor.contains(
13595 return ArrayOperatorDeletesForVirtualDtor.contains(
13598 return GlobalArrayOperatorDeletesForVirtualDtor.contains(
13610 if (OperatorDeletesForVirtualDtor.contains(Canon))
13611 return OperatorDeletesForVirtualDtor[Canon];
13614 if (GlobalOperatorDeletesForVirtualDtor.contains(Canon))
13615 return GlobalOperatorDeletesForVirtualDtor[Canon];
13618 if (ArrayOperatorDeletesForVirtualDtor.contains(Canon))
13619 return ArrayOperatorDeletesForVirtualDtor[Canon];
13622 if (GlobalArrayOperatorDeletesForVirtualDtor.contains(Canon))
13623 return GlobalArrayOperatorDeletesForVirtualDtor[Canon];
13634 return MaybeRequireVectorDeletingDtor.count(RD);
13642 MaybeRequireVectorDeletingDtor.insert(RD);
13647 assert(LangOpts.CPlusPlus);
13648 std::unique_ptr<MangleNumberingContext> &MCtx = MangleNumberingContexts[DC];
13656 assert(LangOpts.CPlusPlus);
13657 std::unique_ptr<MangleNumberingContext> &MCtx =
13658 ExtraMangleNumberingContexts[D];
13664std::unique_ptr<MangleNumberingContext>
13666 return ABI->createMangleNumberingContext();
13671 return ABI->getCopyConstructorForExceptionObject(
13677 return ABI->addCopyConstructorForExceptionObject(
13684 return ABI->addTypedefNameForUnnamedTagDecl(TD, DD);
13689 return ABI->getTypedefNameForUnnamedTagDecl(TD);
13694 return ABI->addDeclaratorForUnnamedTagDecl(TD, DD);
13698 return ABI->getDeclaratorForUnnamedTagDecl(TD);
13702 ParamIndices[D] =
index;
13706 ParameterIndexTable::const_iterator I = ParamIndices.find(D);
13707 assert(I != ParamIndices.end() &&
13708 "ParmIndices lacks entry set by ParmVarDecl");
13713 unsigned Length)
const {
13739 assert(
MSGuidTagDecl &&
"building MS GUID without MS extensions?");
13741 llvm::FoldingSetNodeID ID;
13745 if (
MSGuidDecl *Existing = MSGuidDecls.FindNodeOrInsertPos(ID, InsertPos))
13749 MSGuidDecl *
New = MSGuidDecl::Create(*
this, GUIDType, Parts);
13750 MSGuidDecls.InsertNode(
New, InsertPos);
13756 const APValue &APVal)
const {
13757 llvm::FoldingSetNodeID ID;
13762 UnnamedGlobalConstantDecls.FindNodeOrInsertPos(ID, InsertPos))
13766 UnnamedGlobalConstantDecl::Create(*
this, Ty, APVal);
13767 UnnamedGlobalConstantDecls.InsertNode(
New, InsertPos);
13773 assert(T->isRecordType() &&
"template param object of unexpected type");
13779 llvm::FoldingSetNodeID ID;
13784 TemplateParamObjectDecls.FindNodeOrInsertPos(ID, InsertPos))
13788 TemplateParamObjectDecls.InsertNode(
New, InsertPos);
13794 if (!T.isOSDarwin())
13797 if (!(T.isiOS() && T.isOSVersionLT(7)) &&
13798 !(T.isMacOSX() && T.isOSVersionLT(10, 9)))
13807 return (Size != Align ||
toBits(sizeChars) > MaxInlineWidthInBits);
13814 if (MethodDecl->
hasAttr<UnavailableAttr>()
13815 || MethodDecl->
hasAttr<DeprecatedAttr>())
13829 IM != EM && IF != EF; ++IM, ++IF) {
13860 llvm::FoldingSetNodeID IDX, IDY;
13861 X->Profile(IDX, *
this,
true);
13862 Y->
Profile(IDY, *
this,
true);
13876 for (
const Decl *DX :
X->redecls()) {
13881 if (DX->isFirstDecl())
13884 llvm_unreachable(
"Corrupt redecls chain");
13887template <
class T, std::enable_if_t<std::is_base_of_v<Decl, T>,
bool> = true>
13889 return cast_or_null<T>(
13891 const_cast<Decl *
>(cast_or_null<Decl>(Y))));
13894template <
class T, std::enable_if_t<std::is_base_of_v<Decl, T>,
bool> = true>
13902 bool IgnoreDeduced =
false) {
13917 bool IgnoreDeduced) {
13919 assert(R.getAsVoidPointer() !=
nullptr);
13925 assert(Xs.size() == Ys.size());
13927 for (
size_t I = 0; I < Rs.size(); ++I)
13934 return X->getAttributeLoc() == Y->getAttributeLoc() ?
X->getAttributeLoc()
13944 switch (
X.getKind()) {
13974 auto NExpX =
X.getNumTemplateExpansions();
13988 if (Xs.size() != Ys.size())
13990 R.resize(Xs.size());
13991 for (
size_t I = 0; I < R.size(); ++I) {
14004 assert(!Different);
14032 assert(!IsSame &&
"Should be the same NestedNameSpecifier");
14034 return std::nullopt;
14039 assert(Kind == NNS2.
getKind());
14044 auto Kind = Namespace1->getKind();
14045 if (Kind != Namespace2->getKind() ||
14046 (Kind == Decl::NamespaceAlias &&
14051 Namespace2->getNamespace()),
14085 llvm_unreachable(
"singletons did not compare equal");
14087 assert(R.getCanonical() == Canon);
14093 const T *Y,
bool IsSame) {
14094 return ::getCommonNNS(Ctx,
X->getQualifier(), Y->getQualifier(), IsSame);
14114 QX +=
X.getQualifiers() - RQ;
14124 Y->getElementType(), QX, QY);
14135 assert(Ctx.
hasSameExpr(
X->getSizeExpr(), Y->getSizeExpr()));
14136 return X->getSizeExpr();
14141 return X->getSizeModifier();
14147 return X->getIndexTypeCVRQualifiers();
14157 llvm::DenseMap<QualType, unsigned>
Found;
14158 for (
auto Ts : {
X, Y}) {
14165 Out.emplace_back(T);
14171FunctionProtoType::ExceptionSpecInfo
14175 bool AcceptDependent)
const {
14201 assert(AcceptDependent &&
14202 "computing composite pointer type of dependent types");
14217 llvm_unreachable(
"These ESTs should be handled above");
14222 assert(EST2 ==
EST_Dynamic &&
"other cases should already be handled");
14226 Result.Exceptions = ExceptionTypeStorage;
14233 llvm_unreachable(
"shouldn't see unresolved exception specifications here");
14236 llvm_unreachable(
"invalid ExceptionSpecificationType");
14245#define UNEXPECTED_TYPE(Class, Kind) \
14246 case Type::Class: \
14247 llvm_unreachable("Unexpected " Kind ": " #Class);
14249#define NON_CANONICAL_TYPE(Class, Base) UNEXPECTED_TYPE(Class, "non-canonical")
14250#define TYPE(Class, Base)
14251#include "clang/AST/TypeNodes.inc"
14253#define SUGAR_FREE_TYPE(Class) UNEXPECTED_TYPE(Class, "sugar-free")
14264#undef SUGAR_FREE_TYPE
14265#define NON_UNIQUE_TYPE(Class) UNEXPECTED_TYPE(Class, "non-unique")
14268#undef NON_UNIQUE_TYPE
14272#undef UNEXPECTED_TYPE
14276 assert(AX->getDeducedKind() == AY->getDeducedKind());
14278 assert(AX->getKeyword() == AY->getKeyword());
14280 AY->getTypeConstraintConcept());
14284 AY->getTypeConstraintArguments())) {
14291 case Type::IncompleteArray: {
14298 case Type::DependentSizedArray: {
14306 case Type::ConstantArray: {
14309 assert(AX->getSize() == AY->getSize());
14310 const Expr *SizeExpr = Ctx.
hasSameExpr(AX->getSizeExpr(), AY->getSizeExpr())
14311 ? AX->getSizeExpr()
14317 case Type::ArrayParameter: {
14320 assert(AX->getSize() == AY->getSize());
14321 const Expr *SizeExpr = Ctx.
hasSameExpr(AX->getSizeExpr(), AY->getSizeExpr())
14322 ? AX->getSizeExpr()
14329 case Type::Atomic: {
14334 case Type::Complex: {
14338 case Type::Pointer: {
14342 case Type::BlockPointer: {
14346 case Type::ObjCObjectPointer: {
14351 case Type::MemberPointer: {
14355 PY->getMostRecentCXXRecordDecl()));
14359 PX->getMostRecentCXXRecordDecl());
14361 case Type::LValueReference: {
14366 PX->isSpelledAsLValue() ||
14367 PY->isSpelledAsLValue());
14369 case Type::RValueReference: {
14375 case Type::DependentAddressSpace: {
14378 assert(Ctx.
hasSameExpr(PX->getAddrSpaceExpr(), PY->getAddrSpaceExpr()));
14380 PX->getAddrSpaceExpr(),
14383 case Type::FunctionNoProto: {
14386 assert(FX->getExtInfo() == FY->getExtInfo());
14391 case Type::FunctionProto: {
14395 EPIY = FY->getExtProtoInfo();
14396 assert(EPIX.
ExtInfo == EPIY.ExtInfo);
14403 assert(EPIX.
TypeQuals == EPIY.TypeQuals);
14404 assert(EPIX.
Variadic == EPIY.Variadic);
14413 auto P =
getCommonTypes(Ctx, FX->param_types(), FY->param_types(),
14421 case Type::ObjCObject: {
14424 std::equal(OX->getProtocols().begin(), OX->getProtocols().end(),
14425 OY->getProtocols().begin(), OY->getProtocols().end(),
14427 return P0->getCanonicalDecl() == P1->getCanonicalDecl();
14429 "protocol lists must be the same");
14431 OY->getTypeArgsAsWritten());
14434 OX->getProtocols(),
14435 OX->isKindOfTypeAsWritten() && OY->isKindOfTypeAsWritten());
14437 case Type::ConstantMatrix: {
14440 assert(MX->getNumRows() == MY->getNumRows());
14441 assert(MX->getNumColumns() == MY->getNumColumns());
14443 MX->getNumRows(), MX->getNumColumns());
14445 case Type::DependentSizedMatrix: {
14448 assert(Ctx.
hasSameExpr(MX->getRowExpr(), MY->getRowExpr()));
14449 assert(Ctx.
hasSameExpr(MX->getColumnExpr(), MY->getColumnExpr()));
14454 case Type::Vector: {
14456 assert(VX->getNumElements() == VY->getNumElements());
14457 assert(VX->getVectorKind() == VY->getVectorKind());
14459 VX->getNumElements(), VX->getVectorKind());
14461 case Type::ExtVector: {
14463 assert(VX->getNumElements() == VY->getNumElements());
14465 VX->getNumElements());
14467 case Type::DependentSizedExtVector: {
14474 case Type::DependentVector: {
14477 assert(VX->getVectorKind() == VY->getVectorKind());
14484 case Type::InjectedClassName: {
14491 case Type::TemplateSpecialization: {
14495 TY->template_arguments());
14499 TY->getTemplateName(),
14501 As, {},
X->getCanonicalTypeInternal());
14503 case Type::Decltype: {
14506 assert(DX->isDependentType());
14507 assert(DY->isDependentType());
14508 assert(Ctx.
hasSameExpr(DX->getUnderlyingExpr(), DY->getUnderlyingExpr()));
14512 case Type::PackIndexing: {
14515 assert(DX->isDependentType());
14516 assert(DY->isDependentType());
14517 assert(Ctx.
hasSameExpr(DX->getIndexExpr(), DY->getIndexExpr()));
14520 case Type::DependentName: {
14523 assert(NX->getIdentifier() == NY->getIdentifier());
14528 case Type::OverflowBehavior: {
14531 assert(NX->getBehaviorKind() == NY->getBehaviorKind());
14533 NX->getBehaviorKind(),
14535 NY->getUnderlyingType(), QX, QY));
14537 case Type::UnaryTransform: {
14540 assert(TX->getUTTKind() == TY->getUTTKind());
14544 TY->getUnderlyingType()),
14547 case Type::PackExpansion: {
14550 assert(PX->getNumExpansions() == PY->getNumExpansions());
14553 PX->getNumExpansions(),
false);
14557 assert(PX->isReadOnly() == PY->isReadOnly());
14562 case Type::TemplateTypeParm: {
14565 assert(TX->getDepth() == TY->getDepth());
14566 assert(TX->getIndex() == TY->getIndex());
14567 assert(TX->isParameterPack() == TY->isParameterPack());
14569 TX->getDepth(), TX->getIndex(), TX->isParameterPack(),
14573 llvm_unreachable(
"Unknown Type Class");
14583#define UNEXPECTED_TYPE(Class, Kind) \
14584 case Type::Class: \
14585 llvm_unreachable("Unexpected " Kind ": " #Class);
14586#define TYPE(Class, Base)
14587#define DEPENDENT_TYPE(Class, Base) UNEXPECTED_TYPE(Class, "dependent")
14588#include "clang/AST/TypeNodes.inc"
14590#define CANONICAL_TYPE(Class) UNEXPECTED_TYPE(Class, "canonical")
14617#undef CANONICAL_TYPE
14619#undef UNEXPECTED_TYPE
14621 case Type::Adjusted: {
14623 QualType OX = AX->getOriginalType(), OY = AY->getOriginalType();
14630 case Type::Decayed: {
14632 QualType OX = DX->getOriginalType(), OY = DY->getOriginalType();
14639 case Type::Attributed: {
14641 AttributedType::Kind Kind = AX->getAttrKind();
14642 if (Kind != AY->getAttrKind())
14644 QualType MX = AX->getModifiedType(), MY = AY->getModifiedType();
14652 case Type::BTFTagAttributed: {
14654 const BTFTypeTagAttr *AX = BX->getAttr();
14656 if (AX->getBTFTypeTag() !=
14667 if (KW != AY->getKeyword())
14671 AY->getTypeConstraintConcept());
14675 AY->getTypeConstraintArguments())) {
14686 case Type::PackIndexing:
14687 case Type::Decltype:
14689 case Type::DeducedTemplateSpecialization:
14692 case Type::MacroQualified: {
14696 if (IX != MY->getMacroIdentifier())
14700 case Type::SubstTemplateTypeParm: {
14707 unsigned Index = SX->getIndex();
14708 if (Index != SY->getIndex())
14710 auto PackIndex = SX->getPackIndex();
14711 if (PackIndex != SY->getPackIndex())
14714 CD, Index, PackIndex,
14715 SX->getFinal() && SY->getFinal());
14717 case Type::ObjCTypeParam:
14723 case Type::TemplateSpecialization: {
14728 TY->getTemplateName(),
true);
14733 TY->template_arguments()))
14739 case Type::Typedef: {
14749 case Type::TypeOf: {
14760 case Type::TypeOfExpr:
14763 case Type::UnaryTransform: {
14766 UnaryTransformType::UTTKind KX = UX->getUTTKind();
14767 if (KX != UY->getUTTKind())
14769 QualType BX = UX->getBaseType(), BY = UY->getBaseType();
14776 case Type::Using: {
14785 case Type::MemberPointer: {
14789 assert(Cls == PY->getMostRecentCXXRecordDecl());
14794 case Type::CountAttributed: {
14797 if (DX->isCountInBytes() != DY->isCountInBytes())
14799 if (DX->isOrNull() != DY->isOrNull())
14801 Expr *CEX = DX->getCountExpr();
14802 Expr *CEY = DY->getCountExpr();
14806 DX->isCountInBytes(), DX->isOrNull(),
14817 DX->isCountInBytes(), DX->isOrNull(),
14820 case Type::PredefinedSugar:
14825 llvm_unreachable(
"Unhandled Type Class");
14847 if (
X.isCanonical())
14874 bool KeepCommonQualifiers =
14877 if (SX.
Ty != SY.Ty) {
14885 while (!Xs.empty() && !Ys.empty() && Xs.back().Ty == Ys.back().Ty) {
14888 SX = Xs.pop_back_val();
14889 SY = Ys.pop_back_val();
14892 if (KeepCommonQualifiers)
14899 while (!Xs.empty() && !Ys.empty()) {
14902 SX = Xs.pop_back_val();
14903 SY = Ys.pop_back_val();
14908 SX.
Ty = Underlying.Ty;
14911 QX -= Underlying.Quals;
14929 llvm_unreachable(
"Not a saturated fixed point type!");
14930 case BuiltinType::SatShortAccum:
14932 case BuiltinType::SatAccum:
14934 case BuiltinType::SatLongAccum:
14936 case BuiltinType::SatUShortAccum:
14938 case BuiltinType::SatUAccum:
14940 case BuiltinType::SatULongAccum:
14942 case BuiltinType::SatShortFract:
14944 case BuiltinType::SatFract:
14946 case BuiltinType::SatLongFract:
14948 case BuiltinType::SatUShortFract:
14950 case BuiltinType::SatUFract:
14952 case BuiltinType::SatULongFract:
14964 llvm_unreachable(
"Not a fixed point type!");
14965 case BuiltinType::ShortAccum:
14967 case BuiltinType::Accum:
14969 case BuiltinType::LongAccum:
14971 case BuiltinType::UShortAccum:
14973 case BuiltinType::UAccum:
14975 case BuiltinType::ULongAccum:
14977 case BuiltinType::ShortFract:
14979 case BuiltinType::Fract:
14981 case BuiltinType::LongFract:
14983 case BuiltinType::UShortFract:
14985 case BuiltinType::UFract:
14987 case BuiltinType::ULongFract:
14993 if (LangOpts.OpenCL)
15017 llvm_unreachable(
"Not a fixed point type!");
15018 case BuiltinType::ShortAccum:
15019 case BuiltinType::SatShortAccum:
15020 return Target.getShortAccumScale();
15021 case BuiltinType::Accum:
15022 case BuiltinType::SatAccum:
15023 return Target.getAccumScale();
15024 case BuiltinType::LongAccum:
15025 case BuiltinType::SatLongAccum:
15026 return Target.getLongAccumScale();
15027 case BuiltinType::UShortAccum:
15028 case BuiltinType::SatUShortAccum:
15029 return Target.getUnsignedShortAccumScale();
15030 case BuiltinType::UAccum:
15031 case BuiltinType::SatUAccum:
15032 return Target.getUnsignedAccumScale();
15033 case BuiltinType::ULongAccum:
15034 case BuiltinType::SatULongAccum:
15035 return Target.getUnsignedLongAccumScale();
15036 case BuiltinType::ShortFract:
15037 case BuiltinType::SatShortFract:
15038 return Target.getShortFractScale();
15039 case BuiltinType::Fract:
15040 case BuiltinType::SatFract:
15041 return Target.getFractScale();
15042 case BuiltinType::LongFract:
15043 case BuiltinType::SatLongFract:
15044 return Target.getLongFractScale();
15045 case BuiltinType::UShortFract:
15046 case BuiltinType::SatUShortFract:
15047 return Target.getUnsignedShortFractScale();
15048 case BuiltinType::UFract:
15049 case BuiltinType::SatUFract:
15050 return Target.getUnsignedFractScale();
15051 case BuiltinType::ULongFract:
15052 case BuiltinType::SatULongFract:
15053 return Target.getUnsignedLongFractScale();
15063 llvm_unreachable(
"Not a fixed point type!");
15064 case BuiltinType::ShortAccum:
15065 case BuiltinType::SatShortAccum:
15066 return Target.getShortAccumIBits();
15067 case BuiltinType::Accum:
15068 case BuiltinType::SatAccum:
15069 return Target.getAccumIBits();
15070 case BuiltinType::LongAccum:
15071 case BuiltinType::SatLongAccum:
15072 return Target.getLongAccumIBits();
15073 case BuiltinType::UShortAccum:
15074 case BuiltinType::SatUShortAccum:
15075 return Target.getUnsignedShortAccumIBits();
15076 case BuiltinType::UAccum:
15077 case BuiltinType::SatUAccum:
15078 return Target.getUnsignedAccumIBits();
15079 case BuiltinType::ULongAccum:
15080 case BuiltinType::SatULongAccum:
15081 return Target.getUnsignedLongAccumIBits();
15082 case BuiltinType::ShortFract:
15083 case BuiltinType::SatShortFract:
15084 case BuiltinType::Fract:
15085 case BuiltinType::SatFract:
15086 case BuiltinType::LongFract:
15087 case BuiltinType::SatLongFract:
15088 case BuiltinType::UShortFract:
15089 case BuiltinType::SatUShortFract:
15090 case BuiltinType::UFract:
15091 case BuiltinType::SatUFract:
15092 case BuiltinType::ULongFract:
15093 case BuiltinType::SatULongFract:
15098llvm::FixedPointSemantics
15101 "Can only get the fixed point semantics for a "
15102 "fixed point or integer type.");
15104 return llvm::FixedPointSemantics::GetIntegerSemantics(
15108 return llvm::FixedPointSemantics(
15111 !isSigned &&
getTargetInfo().doUnsignedFixedPointTypesHavePadding());
15126 "Expected unsigned fixed point type");
15129 case BuiltinType::UShortAccum:
15131 case BuiltinType::UAccum:
15133 case BuiltinType::ULongAccum:
15135 case BuiltinType::SatUShortAccum:
15137 case BuiltinType::SatUAccum:
15139 case BuiltinType::SatULongAccum:
15141 case BuiltinType::UShortFract:
15143 case BuiltinType::UFract:
15145 case BuiltinType::ULongFract:
15147 case BuiltinType::SatUShortFract:
15149 case BuiltinType::SatUFract:
15151 case BuiltinType::SatULongFract:
15154 llvm_unreachable(
"Unexpected unsigned fixed point type");
15162 std::vector<std::string> BackendFeats;
15163 llvm::AArch64::ExtensionSet FeatureBits;
15164 for (StringRef F : FMVFeatStrings)
15165 if (
auto FMVExt = llvm::AArch64::parseFMVExtension(F))
15167 FeatureBits.enable(*FMVExt->ID);
15168 FeatureBits.toLLVMFeatureList(BackendFeats);
15169 return BackendFeats;
15174 assert(TD !=
nullptr);
15177 llvm::erase_if(
ParsedAttr.Features, [&](
const std::string &Feat) {
15178 return !Target->isValidFeatureName(StringRef{Feat}.substr(1));
15189 Target->getTargetOpts().CPU,
15190 Target->getTargetOpts().Features);
15197 StringRef TargetCPU = Target->getTargetOpts().CPU;
15199 if (
const auto *TD = FD->
getAttr<TargetAttr>()) {
15205 if (!Target->getTriple().isAArch64())
15208 Target->getTargetOpts().FeaturesAsWritten.begin(),
15209 Target->getTargetOpts().FeaturesAsWritten.end());
15220 }
else if (
const auto *SD = FD->
getAttr<CPUSpecificAttr>()) {
15222 Target->getCPUSpecificCPUDispatchFeatures(
15224 std::vector<std::string> Features(FeaturesTmp.begin(), FeaturesTmp.end());
15225 Features.insert(Features.begin(),
15226 Target->getTargetOpts().FeaturesAsWritten.begin(),
15227 Target->getTargetOpts().FeaturesAsWritten.end());
15228 Target->initFeatureMap(FeatureMap,
getDiagnostics(), TargetCPU, Features);
15229 }
else if (
const auto *TC = FD->
getAttr<TargetClonesAttr>()) {
15230 if (Target->getTriple().isAArch64()) {
15234 Features.insert(Features.begin(),
15235 Target->getTargetOpts().FeaturesAsWritten.begin(),
15236 Target->getTargetOpts().FeaturesAsWritten.end());
15237 Target->initFeatureMap(FeatureMap,
getDiagnostics(), TargetCPU, Features);
15238 }
else if (Target->getTriple().isRISCV()) {
15240 std::vector<std::string> Features;
15241 if (VersionStr !=
"default") {
15243 Features.insert(Features.begin(),
ParsedAttr.Features.begin(),
15246 Features.insert(Features.begin(),
15247 Target->getTargetOpts().FeaturesAsWritten.begin(),
15248 Target->getTargetOpts().FeaturesAsWritten.end());
15249 Target->initFeatureMap(FeatureMap,
getDiagnostics(), TargetCPU, Features);
15250 }
else if (Target->getTriple().isOSAIX()) {
15251 std::vector<std::string> Features;
15253 if (VersionStr.starts_with(
"cpu="))
15254 TargetCPU = VersionStr.drop_front(
sizeof(
"cpu=") - 1);
15256 assert(VersionStr ==
"default");
15257 Target->initFeatureMap(FeatureMap,
getDiagnostics(), TargetCPU, Features);
15259 std::vector<std::string> Features;
15261 if (VersionStr.starts_with(
"arch="))
15262 TargetCPU = VersionStr.drop_front(
sizeof(
"arch=") - 1);
15263 else if (VersionStr !=
"default")
15264 Features.push_back((StringRef{
"+"} + VersionStr).str());
15265 Target->initFeatureMap(FeatureMap,
getDiagnostics(), TargetCPU, Features);
15267 }
else if (
const auto *TV = FD->
getAttr<TargetVersionAttr>()) {
15268 std::vector<std::string> Features;
15269 if (Target->getTriple().isRISCV()) {
15271 Features.insert(Features.begin(),
ParsedAttr.Features.begin(),
15274 assert(Target->getTriple().isAArch64());
15276 TV->getFeatures(Feats);
15279 Features.insert(Features.begin(),
15280 Target->getTargetOpts().FeaturesAsWritten.begin(),
15281 Target->getTargetOpts().FeaturesAsWritten.end());
15282 Target->initFeatureMap(FeatureMap,
getDiagnostics(), TargetCPU, Features);
15284 FeatureMap = Target->getTargetOpts().FeatureMap;
15295 auto DeviceDiscriminatorOverrider =
15297 if (
const auto *RD = dyn_cast<CXXRecordDecl>(ND))
15299 return RD->getDeviceLambdaManglingNumber();
15300 return std::nullopt;
15303 Context, Context.getDiagnostics(), DeviceDiscriminatorOverrider)};
15311 std::string Buffer;
15312 Buffer.reserve(128);
15313 llvm::raw_string_ostream Out(Buffer);
15314 MC->mangleCanonicalTypeName(KernelNameType, Out);
15315 std::string KernelName = Out.str();
15317 return {KernelNameType, FD, KernelName};
15326 const auto *SKEPAttr = FD->
getAttr<SYCLKernelEntryPointAttr>();
15327 assert(SKEPAttr &&
"Missing sycl_kernel_entry_point attribute");
15336 "SYCL kernel name conflict");
15351 return &IT->second;
15357 return *OMPTraitInfoVector.back();
15364 return DB << Section.
Decl;
15365 return DB <<
"a prior #pragma section";
15369 bool IsInternalVar =
15372 bool IsExplicitDeviceVar = (D->
hasAttr<CUDADeviceAttr>() &&
15373 !D->
getAttr<CUDADeviceAttr>()->isImplicit()) ||
15374 (D->
hasAttr<CUDAConstantAttr>() &&
15375 !D->
getAttr<CUDAConstantAttr>()->isImplicit());
15379 return (IsInternalVar &&
15380 (D->
hasAttr<HIPManagedAttr>() || IsExplicitDeviceVar)) ||
15381 (D->
hasAttr<CUDAGlobalAttr>() &&
15388 (D->
hasAttr<HIPManagedAttr>() || D->
hasAttr<CUDAGlobalAttr>() ||
15393 if (!CUIDHash.empty())
15395 if (LangOpts.CUID.empty())
15396 return StringRef();
15397 CUIDHash = llvm::utohexstr(llvm::MD5Hash(LangOpts.CUID),
true);
15407 assert(PrimaryBase);
15410 auto Base = Layout.getPrimaryBase();
15411 if (!
Base ||
Base == PrimaryBase || !
Base->isPolymorphic())
15413 PrimaryBase =
Base;
15415 return PrimaryBase;
15419 StringRef MangledName) {
15421 assert(
Method->isVirtual());
15422 bool DefaultIncludesPointerAuth =
15423 LangOpts.PointerAuthCalls || LangOpts.PointerAuthIntrinsics;
15425 if (!DefaultIncludesPointerAuth)
15428 auto Existing = ThunksToBeAbbreviated.find(VirtualMethodDecl);
15429 if (Existing != ThunksToBeAbbreviated.end())
15430 return Existing->second.contains(MangledName.str());
15433 llvm::StringMap<llvm::SmallVector<std::string, 2>> Thunks;
15435 if (
const auto *ThunkInfos = VtableContext->getThunkInfo(VirtualMethodDecl)) {
15437 for (
const auto &Thunk : *ThunkInfos) {
15439 llvm::raw_svector_ostream ElidedNameStream(ElidedName);
15445 Mangler->mangleThunk(
Method, Thunk,
true,
15448 llvm::raw_svector_ostream mangledNameStream(MangledName);
15452 mangledNameStream);
15454 Mangler->mangleThunk(
Method, Thunk,
false,
15455 mangledNameStream);
15457 Thunks[ElidedName].push_back(std::string(MangledName));
15460 llvm::StringSet<> SimplifiedThunkNames;
15461 for (
auto &ThunkList : Thunks) {
15462 llvm::sort(ThunkList.second);
15463 SimplifiedThunkNames.insert(ThunkList.second[0]);
15465 bool Result = SimplifiedThunkNames.contains(MangledName);
15466 ThunksToBeAbbreviated[VirtualMethodDecl] = std::move(SimplifiedThunkNames);
15484 std::vector<PFPField> &Fields,
bool IncludeVBases) {
15486 if (
auto *ElemDecl = AT->getElementType()->getAsCXXRecordDecl()) {
15488 for (
unsigned i = 0; i != AT->getSize(); ++i)
15505 Fields.push_back({FieldOffset, Field});
15512 if (
Base.isVirtual())
15519 if (IncludeVBases) {
15530 std::vector<PFPField> PFPFields;
15540 if (
auto *RD = dyn_cast<CXXRecordDecl>(FD->
getParent()))
15542 !FD->
hasAttr<NoFieldProtectionAttr>();
15547 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::Target Target
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.
static StringRef getTriple(const Command &Job)
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 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)
void setClassMaybeNeedsVectorDeletingDestructor(const CXXRecordDecl *RD)
overridden_method_range overridden_methods(const CXXMethodDecl *Method) const
void setIsTypeAwareOperatorNewOrDelete(const FunctionDecl *FD, bool IsTypeAware)
QualType getDependentBitIntType(bool Unsigned, Expr *BitsExpr) const
Return a dependent bit-precise integer type with the specified signedness and bit count.
void setObjCImplementation(ObjCInterfaceDecl *IFaceD, ObjCImplementationDecl *ImplD)
Set the implementation of ObjCInterfaceDecl.
StringRef getCUIDHash() const
bool isMSStaticDataMemberInlineDefinition(const VarDecl *VD) const
Returns true if this is an inline-initialized static data member which is treated as a definition for...
bool canAssignObjCInterfaces(const ObjCObjectPointerType *LHSOPT, const ObjCObjectPointerType *RHSOPT)
canAssignObjCInterfaces - Return true if the two interface types are compatible for assignment from R...
QualType getReferenceQualifiedType(const Expr *e) const
getReferenceQualifiedType - Given an expr, will return the type for that expression,...
bool hasSameFunctionTypeIgnoringExceptionSpec(QualType T, QualType U) const
Determine whether two function types are the same, ignoring exception specifications in cases where t...
QualType getBlockDescriptorExtendedType() const
Gets the struct used to keep track of the extended descriptor for pointer to blocks.
QualType getLValueReferenceType(QualType T, bool SpelledAsLValue=true) const
Return the uniqued reference to the type for an lvalue reference to the specified type.
bool QIdProtocolsAdoptObjCObjectProtocols(QualType QT, ObjCInterfaceDecl *IDecl)
QIdProtocolsAdoptObjCObjectProtocols - Checks that protocols in QT's qualified-id protocol list adopt...
FunctionProtoType::ExceptionSpecInfo mergeExceptionSpecs(FunctionProtoType::ExceptionSpecInfo ESI1, FunctionProtoType::ExceptionSpecInfo ESI2, SmallVectorImpl< QualType > &ExceptionTypeStorage, bool AcceptDependent) const
void addLazyModuleInitializers(Module *M, ArrayRef< GlobalDeclID > IDs)
bool isSameConstraintExpr(const Expr *XCE, const Expr *YCE) const
Determine whether two 'requires' expressions are similar enough that they may be used in re-declarati...
bool BlockRequiresCopying(QualType Ty, const VarDecl *D)
Returns true iff we need copy/dispose helpers for the given type.
QualType getUsingType(ElaboratedTypeKeyword Keyword, NestedNameSpecifier Qualifier, const UsingShadowDecl *D, QualType UnderlyingType=QualType()) const
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 getAutoType(DeducedKind DK, QualType DeducedAsType, AutoTypeKeyword Keyword, TemplateDecl *TypeConstraintConcept=nullptr, ArrayRef< TemplateArgument > TypeConstraintArgs={}) const
C++11 deduced auto type.
QualType getBaseElementType(const ArrayType *VAT) const
Return the innermost element type of an array type.
llvm::SetVector< const VarDecl * > CUDADeviceVarODRUsedByHost
Keep track of CUDA/HIP device-side variables ODR-used by host code.
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.
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.
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 classMaybeNeedsVectorDeletingDestructor(const CXXRecordDecl *RD)
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
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.
QualType getDeducedTemplateSpecializationType(DeducedKind DK, QualType DeducedAsType, ElaboratedTypeKeyword Keyword, TemplateName Template) const
C++17 deduced class template specialization type.
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]).
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
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.
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...
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 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.
@ Deduced
The normal deduced case.
@ Undeduced
Not deduced yet. This is for example an 'auto' which was just parsed.
@ DeducedAsPack
Same as above, but additionally this represents a case where the deduced entity itself is a pack.
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