68#include "llvm/ADT/APFixedPoint.h"
69#include "llvm/ADT/APInt.h"
70#include "llvm/ADT/APSInt.h"
71#include "llvm/ADT/ArrayRef.h"
72#include "llvm/ADT/DenseMap.h"
73#include "llvm/ADT/DenseSet.h"
74#include "llvm/ADT/FoldingSet.h"
75#include "llvm/ADT/PointerUnion.h"
76#include "llvm/ADT/STLExtras.h"
77#include "llvm/ADT/SmallPtrSet.h"
78#include "llvm/ADT/SmallVector.h"
79#include "llvm/ADT/StringExtras.h"
80#include "llvm/ADT/StringRef.h"
81#include "llvm/Frontend/OpenMP/OMPIRBuilder.h"
82#include "llvm/Support/Capacity.h"
83#include "llvm/Support/Casting.h"
84#include "llvm/Support/Compiler.h"
85#include "llvm/Support/ErrorHandling.h"
86#include "llvm/Support/MD5.h"
87#include "llvm/Support/MathExtras.h"
88#include "llvm/Support/SipHash.h"
89#include "llvm/Support/raw_ostream.h"
90#include "llvm/TargetParser/AArch64TargetParser.h"
91#include "llvm/TargetParser/Triple.h"
104using namespace clang;
117template <>
struct llvm::DenseMapInfo<
llvm::FoldingSetNodeID> {
118 static FoldingSetNodeID
getEmptyKey() {
return FoldingSetNodeID{}; }
122 for (
size_t i = 0; i <
sizeof(id) /
sizeof(
unsigned); ++i) {
123 id.AddInteger(std::numeric_limits<unsigned>::max());
129 return Val.ComputeHash();
132 static bool isEqual(
const FoldingSetNodeID &LHS,
133 const FoldingSetNodeID &RHS) {
149 if (
const auto *FD = dyn_cast<FunctionDecl>(D)) {
154 if (
const auto *VD = dyn_cast<VarDecl>(D)) {
155 if (VD->isStaticDataMember() &&
160 if (
const auto *CRD = dyn_cast<CXXRecordDecl>(D)) {
165 if (
const auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(D)) {
172 if (
const auto *ED = dyn_cast<EnumDecl>(D)) {
176 if (
const auto *TD = dyn_cast<TagDecl>(D)) {
179 if (TD->isEmbeddedInDeclarator() && !TD->isCompleteDefinition())
211 Locations.emplace_back(BaseLocation);
224 Locations.emplace_back(SourceMgr.getExpansionLoc(BaseLocation));
231 Locations.emplace_back(SourceMgr.getSpellingLoc(D->
getBeginLoc()));
239 const std::map<unsigned, RawComment *> &CommentsInTheFile)
const {
242 if (RepresentativeLocForDecl.
isInvalid() ||
243 !RepresentativeLocForDecl.
isFileID())
247 if (CommentsInTheFile.empty())
253 SourceMgr.getDecomposedLoc(RepresentativeLocForDecl);
256 auto OffsetCommentBehindDecl =
257 CommentsInTheFile.lower_bound(DeclLocDecomp.second);
260 if (OffsetCommentBehindDecl != CommentsInTheFile.end()) {
261 RawComment *CommentBehindDecl = OffsetCommentBehindDecl->second;
263 LangOpts.CommentOpts.ParseAllComments) &&
270 if (SourceMgr.getLineNumber(DeclLocDecomp.first, DeclLocDecomp.second) ==
271 Comments.getCommentBeginLine(CommentBehindDecl, DeclLocDecomp.first,
272 OffsetCommentBehindDecl->first)) {
273 return CommentBehindDecl;
280 if (OffsetCommentBehindDecl == CommentsInTheFile.begin())
283 auto OffsetCommentBeforeDecl = --OffsetCommentBehindDecl;
284 RawComment *CommentBeforeDecl = OffsetCommentBeforeDecl->second;
288 LangOpts.CommentOpts.ParseAllComments) ||
293 const unsigned CommentEndOffset =
294 Comments.getCommentEndOffset(CommentBeforeDecl);
298 const char *Buffer = SourceMgr.getBufferData(DeclLocDecomp.first,
304 StringRef
Text(Buffer + CommentEndOffset,
305 DeclLocDecomp.second - CommentEndOffset);
309 if (
Text.find_last_of(
";{}#@") != StringRef::npos)
312 return CommentBeforeDecl;
318 for (
const auto DeclLoc : DeclLocs) {
321 if (DeclLoc.isInvalid() || !DeclLoc.isFileID())
332 const FileID File = SourceMgr.getDecomposedLoc(DeclLoc).first;
336 const auto CommentsInThisFile =
Comments.getCommentsInFile(
File);
337 if (!CommentsInThisFile || CommentsInThisFile->empty())
349 assert(LangOpts.RetainCommentsFromSystemHeaders ||
351 Comments.addComment(RC, LangOpts.CommentOpts, BumpAlloc);
358 if (
const auto *FD = dyn_cast<FunctionDecl>(&D)) {
378 if (
const auto *VD = dyn_cast<VarDecl>(&D)) {
381 if (VD->isStaticDataMember())
387 if (
const auto *CRD = dyn_cast<CXXRecordDecl>(&D)) {
394 if (
const auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(CRD)) {
402 : *
static_cast<const Decl *
>(
408 CRD->getMemberSpecializationInfo())
409 return *Info->getInstantiatedFrom();
413 if (
const auto *ED = dyn_cast<EnumDecl>(&D)) {
426 const Decl **OriginalDecl)
const {
429 OriginalDecl =
nullptr;
441 return DeclComment->second;
454 *OriginalDecl = RedeclComment->second;
457 "This decl is supposed to have comment attached.");
458 return CommentAtRedecl->second;
463 const Decl *LastCheckedRedecl = [&]() {
465 bool CanUseCommentlessCache =
false;
467 for (
auto *Redecl : CanonicalD->
redecls()) {
469 CanUseCommentlessCache =
true;
472 if (Redecl == LastChecked)
479 return CanUseCommentlessCache ? LastChecked :
nullptr;
485 if (LastCheckedRedecl) {
486 if (LastCheckedRedecl == Redecl) {
487 LastCheckedRedecl =
nullptr;
495 *OriginalDecl = Redecl;
496 return RedeclComment;
502 *OriginalDecl =
nullptr;
508 assert(Comment.
isDocumentation() || LangOpts.CommentOpts.ParseAllComments);
518 if (
const auto *IMD = dyn_cast<ObjCImplDecl>(DC)) {
523 for (
const auto *Ext : ID->known_extensions()) {
527 Redeclared.push_back(RedeclaredMethod);
534 if (
Comments.empty() || Decls.empty())
538 for (
const Decl *D : Decls) {
539 if (D->isInvalidDecl())
547 File = SourceMgr.getDecomposedLoc(Loc).first;
552 if (
File.isInvalid())
555 auto CommentsInThisFile =
Comments.getCommentsInFile(
File);
556 if (!CommentsInThisFile || CommentsInThisFile->empty() ||
557 CommentsInThisFile->rbegin()->second->isAttached())
567 for (
const Decl *D : Decls) {
569 if (D->isInvalidDecl())
579 for (
const auto DeclLoc : DeclLocs) {
580 if (DeclLoc.isInvalid() || !DeclLoc.isFileID())
584 D, DeclLoc, *CommentsInThisFile)) {
595 const Decl *D)
const {
598 ThisDeclInfo->IsFilled =
false;
599 ThisDeclInfo->fill();
600 ThisDeclInfo->CommentDecl = FC->
getDecl();
601 if (!ThisDeclInfo->TemplateParameters)
611 return RC ? RC->
parse(*
this,
nullptr, D) :
nullptr;
622 llvm::DenseMap<const Decl *, comments::FullComment *>::iterator Pos =
626 if (Canonical != D) {
634 const Decl *OriginalDecl =
nullptr;
640 const auto *OMD = dyn_cast<ObjCMethodDecl>(D);
641 if (OMD && OMD->isPropertyAccessor())
648 for (
unsigned i = 0, e = Overridden.size(); i < e; i++)
652 else if (
const auto *TD = dyn_cast<TypedefNameDecl>(D)) {
655 QualType QT = TD->getUnderlyingType();
656 if (
const auto *TT = QT->
getAs<TagType>())
661 else if (
const auto *IC = dyn_cast<ObjCInterfaceDecl>(D)) {
662 while (IC->getSuperClass()) {
663 IC = IC->getSuperClass();
668 else if (
const auto *CD = dyn_cast<ObjCCategoryDecl>(D)) {
673 else if (
const auto *RD = dyn_cast<CXXRecordDecl>(D)) {
674 if (!(RD = RD->getDefinition()))
677 for (
const auto &I : RD->bases()) {
678 if (I.isVirtual() || (I.getAccessSpecifier() !=
AS_public))
692 for (
const auto &I : RD->vbases()) {
713 if (D != OriginalDecl && OriginalDecl)
721void ASTContext::CanonicalTemplateTemplateParm::Profile(
730 ID.AddInteger(Params->
size());
732 PEnd = Params->
end();
734 if (
const auto *TTP = dyn_cast<TemplateTypeParmDecl>(*P)) {
736 ID.AddBoolean(TTP->isParameterPack());
738 TTP->getNumExpansionParameters().toInternalRepresentation());
742 if (
const auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(*P)) {
744 ID.AddBoolean(NTTP->isParameterPack());
745 ID.AddPointer(
C.getUnconstrainedType(
C.getCanonicalType(NTTP->getType()))
747 if (NTTP->isExpandedParameterPack()) {
749 ID.AddInteger(NTTP->getNumExpansionTypes());
750 for (
unsigned I = 0, N = NTTP->getNumExpansionTypes(); I != N; ++I) {
752 ID.AddPointer(
T.getCanonicalType().getAsOpaquePtr());
755 ID.AddBoolean(
false);
765TemplateTemplateParmDecl *
769 llvm::FoldingSetNodeID ID;
770 CanonicalTemplateTemplateParm::Profile(ID, *
this, TTP);
771 void *InsertPos =
nullptr;
772 CanonicalTemplateTemplateParm *Canonical
773 = CanonTemplateTemplateParms.FindNodeOrInsertPos(ID, InsertPos);
775 return Canonical->getParam();
780 CanonParams.reserve(Params->
size());
782 PEnd = Params->
end();
786 if (
const auto *TTP = dyn_cast<TemplateTypeParmDecl>(*P)) {
791 TTP->getNumExpansionParameters());
792 CanonParams.push_back(NewTTP);
793 }
else if (
const auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(*P)) {
797 if (NTTP->isExpandedParameterPack()) {
800 for (
unsigned I = 0, N = NTTP->getNumExpansionTypes(); I != N; ++I) {
802 ExpandedTInfos.push_back(
810 NTTP->getPosition(),
nullptr,
820 NTTP->getPosition(),
nullptr,
822 NTTP->isParameterPack(),
825 CanonParams.push_back(Param);
841 Canonical = CanonTemplateTemplateParms.FindNodeOrInsertPos(ID, InsertPos);
842 assert(!Canonical &&
"Shouldn't be in the map!");
846 Canonical =
new (*this) CanonicalTemplateTemplateParm(CanonTTP);
847 CanonTemplateTemplateParms.InsertNode(Canonical, InsertPos);
854 llvm::FoldingSetNodeID ID;
855 CanonicalTemplateTemplateParm::Profile(ID, *
this, TTP);
856 void *InsertPos =
nullptr;
857 CanonicalTemplateTemplateParm *Canonical =
858 CanonTemplateTemplateParms.FindNodeOrInsertPos(ID, InsertPos);
859 return Canonical ? Canonical->getParam() :
nullptr;
865 llvm::FoldingSetNodeID ID;
866 CanonicalTemplateTemplateParm::Profile(ID, *
this, CanonTTP);
867 void *InsertPos =
nullptr;
869 CanonTemplateTemplateParms.FindNodeOrInsertPos(ID, InsertPos))
870 return Existing->getParam();
871 CanonTemplateTemplateParms.InsertNode(
872 new (*
this) CanonicalTemplateTemplateParm(CanonTTP), InsertPos);
881 return NoSanitizeL->containsType(Mask, TyName);
890 if (!LangOpts.CPlusPlus)
return nullptr;
893 case TargetCXXABI::AppleARM64:
894 case TargetCXXABI::Fuchsia:
895 case TargetCXXABI::GenericARM:
896 case TargetCXXABI::iOS:
897 case TargetCXXABI::WatchOS:
898 case TargetCXXABI::GenericAArch64:
899 case TargetCXXABI::GenericMIPS:
900 case TargetCXXABI::GenericItanium:
901 case TargetCXXABI::WebAssembly:
902 case TargetCXXABI::XL:
904 case TargetCXXABI::Microsoft:
907 llvm_unreachable(
"Invalid CXXABI type!");
911 if (!InterpContext) {
914 return *InterpContext;
920 return *ParentMapCtx;
925 switch (LangOpts.getAddressSpaceMapMangling()) {
933 llvm_unreachable(
"getAddressSpaceMapMangling() doesn't cover anything.");
939 : ConstantArrayTypes(this_(), ConstantArrayTypesLog2InitSize),
940 DependentSizedArrayTypes(this_()), DependentSizedExtVectorTypes(this_()),
941 DependentAddressSpaceTypes(this_()), DependentVectorTypes(this_()),
942 DependentSizedMatrixTypes(this_()),
943 FunctionProtoTypes(this_(), FunctionProtoTypesLog2InitSize),
944 DependentTypeOfExprTypes(this_()), DependentDecltypeTypes(this_()),
945 DependentPackIndexingTypes(this_()), TemplateSpecializationTypes(this_()),
946 DependentBitIntTypes(this_()), SubstTemplateTemplateParmPacks(this_()),
947 DeducedTemplates(this_()), ArrayParameterTypes(this_()),
948 CanonTemplateTemplateParms(this_()), SourceMgr(
SM), LangOpts(LOpts),
951 LangOpts.XRayNeverInstrumentFiles,
952 LangOpts.XRayAttrListFiles,
SM)),
956 Comments(
SM), CommentCommandTraits(BumpAlloc, LOpts.CommentOpts),
964 ReleaseDeclContextMaps();
967 for (
auto &Pair : Deallocations)
968 (Pair.first)(Pair.second);
969 Deallocations.clear();
975 I = ObjCLayouts.begin(),
976 E = ObjCLayouts.end();
983 for (llvm::DenseMap<const RecordDecl*, const ASTRecordLayout*>::iterator
984 I = ASTRecordLayouts.begin(), E = ASTRecordLayouts.end(); I != E; ) {
989 ASTRecordLayouts.clear();
991 for (llvm::DenseMap<const Decl*, AttrVec*>::iterator A = DeclAttrs.begin(),
992 AEnd = DeclAttrs.end();
994 A->second->~AttrVec();
997 for (
const auto &
Value : ModuleInitializers)
998 Value.second->~PerModuleInitializers();
999 ModuleInitializers.
clear();
1005 TraversalScope = TopLevelDecls;
1010 Deallocations.push_back({Callback,
Data});
1019 llvm::errs() <<
"\n*** AST Context Stats:\n";
1020 llvm::errs() <<
" " << Types.size() <<
" types total.\n";
1022 unsigned counts[] = {
1023#define TYPE(Name, Parent) 0,
1024#define ABSTRACT_TYPE(Name, Parent)
1025#include "clang/AST/TypeNodes.inc"
1029 for (
unsigned i = 0, e = Types.size(); i != e; ++i) {
1035 unsigned TotalBytes = 0;
1036#define TYPE(Name, Parent) \
1038 llvm::errs() << " " << counts[Idx] << " " << #Name \
1039 << " types, " << sizeof(Name##Type) << " each " \
1040 << "(" << counts[Idx] * sizeof(Name##Type) \
1042 TotalBytes += counts[Idx] * sizeof(Name##Type); \
1044#define ABSTRACT_TYPE(Name, Parent)
1045#include "clang/AST/TypeNodes.inc"
1047 llvm::errs() <<
"Total bytes = " << TotalBytes <<
"\n";
1052 <<
" implicit default constructors created\n";
1055 <<
" implicit copy constructors created\n";
1059 <<
" implicit move constructors created\n";
1062 <<
" implicit copy assignment operators created\n";
1066 <<
" implicit move assignment operators created\n";
1069 <<
" implicit destructors created\n";
1072 llvm::errs() <<
"\n";
1076 BumpAlloc.PrintStats();
1080 bool NotifyListeners) {
1081 if (NotifyListeners)
1084 Listener->RedefinedHiddenDefinition(ND, M);
1091 if (It == MergedDefModules.end())
1094 auto &Merged = It->second;
1095 llvm::DenseSet<Module*>
Found;
1096 for (
Module *&M : Merged)
1097 if (!
Found.insert(M).second)
1099 llvm::erase(Merged,
nullptr);
1106 if (MergedIt == MergedDefModules.end())
1108 return MergedIt->second;
1111void ASTContext::PerModuleInitializers::resolve(
ASTContext &Ctx) {
1112 if (LazyInitializers.empty())
1116 assert(Source &&
"lazy initializers but no external source");
1118 auto LazyInits = std::move(LazyInitializers);
1119 LazyInitializers.clear();
1121 for (
auto ID : LazyInits)
1122 Initializers.push_back(Source->GetExternalDecl(ID));
1124 assert(LazyInitializers.empty() &&
1125 "GetExternalDecl for lazy module initializer added more inits");
1131 if (
const auto *ID = dyn_cast<ImportDecl>(D)) {
1132 auto It = ModuleInitializers.find(ID->getImportedModule());
1135 if (It == ModuleInitializers.end())
1139 auto &Imported = *It->second;
1140 if (Imported.Initializers.size() + Imported.LazyInitializers.size() == 1) {
1141 Imported.resolve(*
this);
1142 auto *OnlyDecl = Imported.Initializers.front();
1148 auto *&Inits = ModuleInitializers[M];
1150 Inits =
new (*this) PerModuleInitializers;
1151 Inits->Initializers.push_back(D);
1156 auto *&Inits = ModuleInitializers[M];
1158 Inits =
new (*this) PerModuleInitializers;
1159 Inits->LazyInitializers.insert(Inits->LazyInitializers.end(),
1160 IDs.begin(), IDs.end());
1164 auto It = ModuleInitializers.find(M);
1165 if (It == ModuleInitializers.end())
1168 auto *Inits = It->second;
1169 Inits->resolve(*
this);
1170 return Inits->Initializers;
1175 assert(!CurrentCXXNamedModule &&
1176 "We should set named module for ASTContext for only once");
1177 CurrentCXXNamedModule = M;
1189 auto GetRepresentativeModule = [
this](
const Module *M) {
1190 auto Iter = SameModuleLookupSet.find(M);
1191 if (Iter != SameModuleLookupSet.end())
1192 return Iter->second;
1194 const Module *RepresentativeModule =
1195 PrimaryModuleNameMap.try_emplace(M->getPrimaryModuleInterfaceName(), M)
1197 SameModuleLookupSet[M] = RepresentativeModule;
1198 return RepresentativeModule;
1201 assert(M1 &&
"Shouldn't call `isInSameModule` if both M1 and M2 are none.");
1202 return GetRepresentativeModule(M1) == GetRepresentativeModule(M2);
1206 if (!ExternCContext)
1209 return ExternCContext;
1223#define BuiltinTemplate(BTName) \
1224 BuiltinTemplateDecl *ASTContext::get##BTName##Decl() const { \
1225 if (!Decl##BTName) \
1227 buildBuiltinTemplateDecl(BTK##BTName, get##BTName##Name()); \
1228 return Decl##BTName; \
1230#include "clang/Basic/BuiltinTemplates.inc"
1243 NewDecl->
addAttr(TypeVisibilityAttr::CreateImplicit(
1244 const_cast<ASTContext &
>(*
this), TypeVisibilityAttr::Default));
1249 StringRef Name)
const {
1273 Types.push_back(Ty);
1278 assert((!this->Target || this->Target == &Target) &&
1279 "Incorrect target reinitialization");
1280 assert(
VoidTy.isNull() &&
"Context reinitialized?");
1282 this->Target = &Target;
1283 this->AuxTarget = AuxTarget;
1285 ABI.reset(createCXXABI(Target));
1289 InitBuiltinType(
VoidTy, BuiltinType::Void);
1292 InitBuiltinType(
BoolTy, BuiltinType::Bool);
1294 if (LangOpts.CharIsSigned)
1295 InitBuiltinType(
CharTy, BuiltinType::Char_S);
1297 InitBuiltinType(
CharTy, BuiltinType::Char_U);
1300 InitBuiltinType(
ShortTy, BuiltinType::Short);
1301 InitBuiltinType(
IntTy, BuiltinType::Int);
1302 InitBuiltinType(
LongTy, BuiltinType::Long);
1303 InitBuiltinType(
LongLongTy, BuiltinType::LongLong);
1313 InitBuiltinType(
FloatTy, BuiltinType::Float);
1314 InitBuiltinType(
DoubleTy, BuiltinType::Double);
1315 InitBuiltinType(
LongDoubleTy, BuiltinType::LongDouble);
1318 InitBuiltinType(
Float128Ty, BuiltinType::Float128);
1321 InitBuiltinType(
Ibm128Ty, BuiltinType::Ibm128);
1324 InitBuiltinType(
Float16Ty, BuiltinType::Float16);
1327 InitBuiltinType(
ShortAccumTy, BuiltinType::ShortAccum);
1328 InitBuiltinType(
AccumTy, BuiltinType::Accum);
1329 InitBuiltinType(
LongAccumTy, BuiltinType::LongAccum);
1333 InitBuiltinType(
ShortFractTy, BuiltinType::ShortFract);
1334 InitBuiltinType(
FractTy, BuiltinType::Fract);
1335 InitBuiltinType(
LongFractTy, BuiltinType::LongFract);
1340 InitBuiltinType(
SatAccumTy, BuiltinType::SatAccum);
1346 InitBuiltinType(
SatFractTy, BuiltinType::SatFract);
1353 InitBuiltinType(
Int128Ty, BuiltinType::Int128);
1358 InitBuiltinType(
WCharTy, BuiltinType::WChar_S);
1360 InitBuiltinType(
WCharTy, BuiltinType::WChar_U);
1361 if (LangOpts.CPlusPlus && LangOpts.WChar)
1365 WideCharTy = getFromTargetType(Target.getWCharType());
1368 WIntTy = getFromTargetType(Target.getWIntType());
1371 InitBuiltinType(
Char8Ty, BuiltinType::Char8);
1373 if (LangOpts.CPlusPlus)
1374 InitBuiltinType(
Char16Ty, BuiltinType::Char16);
1376 Char16Ty = getFromTargetType(Target.getChar16Type());
1378 if (LangOpts.CPlusPlus)
1379 InitBuiltinType(
Char32Ty, BuiltinType::Char32);
1381 Char32Ty = getFromTargetType(Target.getChar32Type());
1388 InitBuiltinType(
DependentTy, BuiltinType::Dependent);
1391 InitBuiltinType(
OverloadTy, BuiltinType::Overload);
1403 InitBuiltinType(
UnknownAnyTy, BuiltinType::UnknownAny);
1409 InitBuiltinType(
BuiltinFnTy, BuiltinType::BuiltinFn);
1412 if (LangOpts.OpenMP) {
1419 if (LangOpts.OpenACC && !LangOpts.OpenMP) {
1422 if (LangOpts.MatrixTypes)
1430 if (LangOpts.OpenCL) {
1431#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
1432 InitBuiltinType(SingletonId, BuiltinType::Id);
1433#include "clang/Basic/OpenCLImageTypes.def"
1435 InitBuiltinType(
OCLSamplerTy, BuiltinType::OCLSampler);
1436 InitBuiltinType(
OCLEventTy, BuiltinType::OCLEvent);
1438 InitBuiltinType(
OCLQueueTy, BuiltinType::OCLQueue);
1441#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
1442 InitBuiltinType(Id##Ty, BuiltinType::Id);
1443#include "clang/Basic/OpenCLExtensionTypes.def"
1446 if (LangOpts.HLSL) {
1447#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) \
1448 InitBuiltinType(SingletonId, BuiltinType::Id);
1449#include "clang/Basic/HLSLIntangibleTypes.def"
1452 if (Target.hasAArch64ACLETypes() ||
1453 (AuxTarget && AuxTarget->hasAArch64ACLETypes())) {
1454#define SVE_TYPE(Name, Id, SingletonId) \
1455 InitBuiltinType(SingletonId, BuiltinType::Id);
1456#include "clang/Basic/AArch64ACLETypes.def"
1459 if (Target.getTriple().isPPC64()) {
1460#define PPC_VECTOR_MMA_TYPE(Name, Id, Size) \
1461 InitBuiltinType(Id##Ty, BuiltinType::Id);
1462#include "clang/Basic/PPCTypes.def"
1463#define PPC_VECTOR_VSX_TYPE(Name, Id, Size) \
1464 InitBuiltinType(Id##Ty, BuiltinType::Id);
1465#include "clang/Basic/PPCTypes.def"
1468 if (Target.hasRISCVVTypes()) {
1469#define RVV_TYPE(Name, Id, SingletonId) \
1470 InitBuiltinType(SingletonId, BuiltinType::Id);
1471#include "clang/Basic/RISCVVTypes.def"
1474 if (Target.getTriple().isWasm() && Target.hasFeature(
"reference-types")) {
1475#define WASM_TYPE(Name, Id, SingletonId) \
1476 InitBuiltinType(SingletonId, BuiltinType::Id);
1477#include "clang/Basic/WebAssemblyReferenceTypes.def"
1480 if (Target.getTriple().isAMDGPU() ||
1481 (AuxTarget && AuxTarget->getTriple().isAMDGPU())) {
1482#define AMDGPU_TYPE(Name, Id, SingletonId, Width, Align) \
1483 InitBuiltinType(SingletonId, BuiltinType::Id);
1484#include "clang/Basic/AMDGPUTypes.def"
1491 ObjCConstantStringType =
QualType();
1496 if (LangOpts.OpenCLGenericAddressSpace) {
1497 auto Q =
VoidTy.getQualifiers();
1506 InitBuiltinType(
NullPtrTy, BuiltinType::NullPtr);
1509 InitBuiltinType(
HalfTy, BuiltinType::Half);
1511 InitBuiltinType(
BFloat16Ty, BuiltinType::BFloat16);
1517 if (LangOpts.MicrosoftExt || LangOpts.Borland) {
1524 return SourceMgr.getDiagnostics();
1539 llvm::DenseMap<const Decl*, AttrVec*>::iterator Pos = DeclAttrs.find(D);
1540 if (Pos != DeclAttrs.end()) {
1541 Pos->second->~AttrVec();
1542 DeclAttrs.erase(Pos);
1556 llvm::DenseMap<const VarDecl *, TemplateOrSpecializationInfo>::iterator Pos =
1557 TemplateOrInstantiation.find(Var);
1558 if (Pos == TemplateOrInstantiation.end())
1571 Tmpl, TSK, PointOfInstantiation));
1577 assert(!TemplateOrInstantiation[Inst] &&
1578 "Already noted what the variable was instantiated from");
1579 TemplateOrInstantiation[Inst] = TSI;
1584 return InstantiatedFromUsingDecl.lookup(UUD);
1592 "pattern decl is not a using decl");
1596 "instantiation did not produce a using decl");
1597 assert(!InstantiatedFromUsingDecl[Inst] &&
"pattern already exists");
1598 InstantiatedFromUsingDecl[Inst] = Pattern;
1603 return InstantiatedFromUsingEnumDecl.lookup(UUD);
1608 assert(!InstantiatedFromUsingEnumDecl[Inst] &&
"pattern already exists");
1609 InstantiatedFromUsingEnumDecl[Inst] = Pattern;
1614 return InstantiatedFromUsingShadowDecl.lookup(Inst);
1620 assert(!InstantiatedFromUsingShadowDecl[Inst] &&
"pattern already exists");
1621 InstantiatedFromUsingShadowDecl[Inst] = Pattern;
1626 return InstantiatedFromUnnamedFieldDecl.lookup(Field);
1632 "Instantiated field decl is not unnamed");
1634 "Template field decl is not unnamed");
1635 assert(!InstantiatedFromUnnamedFieldDecl[Inst] &&
1636 "Already noted what unnamed field was instantiated from");
1638 InstantiatedFromUnnamedFieldDecl[Inst] = Tmpl;
1654 return Range.end() - Range.begin();
1659 llvm::DenseMap<const CXXMethodDecl *, CXXMethodVector>::const_iterator Pos =
1660 OverriddenMethods.find(
Method->getCanonicalDecl());
1661 if (Pos == OverriddenMethods.end())
1669 OverriddenMethods[
Method].push_back(Overridden);
1677 if (
const auto *CXXMethod = dyn_cast<CXXMethodDecl>(D)) {
1683 const auto *
Method = dyn_cast<ObjCMethodDecl>(D);
1688 Method->getOverriddenMethods(OverDecls);
1689 Overridden.append(OverDecls.begin(), OverDecls.end());
1692std::optional<ASTContext::CXXRecordDeclRelocationInfo>
1696 auto it = RelocatableClasses.find(D);
1697 if (it != RelocatableClasses.end())
1698 return it->getSecond();
1699 return std::nullopt;
1706 assert(RelocatableClasses.find(D) == RelocatableClasses.end());
1707 RelocatableClasses.insert({D, Info});
1712 if (!Class->isPolymorphic())
1714 const CXXRecordDecl *BaseType = Context.baseForVTableAuthentication(Class);
1715 using AuthAttr = VTablePointerAuthenticationAttr;
1716 const AuthAttr *ExplicitAuth = BaseType->
getAttr<AuthAttr>();
1718 return Context.getLangOpts().PointerAuthVTPtrAddressDiscrimination;
1719 AuthAttr::AddressDiscriminationMode AddressDiscrimination =
1720 ExplicitAuth->getAddressDiscrimination();
1721 if (AddressDiscrimination == AuthAttr::DefaultAddressDiscrimination)
1722 return Context.getLangOpts().PointerAuthVTPtrAddressDiscrimination;
1723 return AddressDiscrimination == AuthAttr::AddressDiscrimination;
1726ASTContext::PointerAuthContent
1727ASTContext::findPointerAuthContent(QualType
T)
const {
1728 assert(isPointerAuthenticationAvailable());
1730 T =
T.getCanonicalType();
1731 if (
T.hasAddressDiscriminatedPointerAuth())
1732 return PointerAuthContent::AddressDiscriminatedData;
1735 return PointerAuthContent::None;
1737 if (
auto Existing = RecordContainsAddressDiscriminatedPointerAuth.find(RD);
1738 Existing != RecordContainsAddressDiscriminatedPointerAuth.end())
1739 return Existing->second;
1741 PointerAuthContent
Result = PointerAuthContent::None;
1743 auto SaveResultAndReturn = [&]() -> PointerAuthContent {
1744 auto [ResultIter, DidAdd] =
1745 RecordContainsAddressDiscriminatedPointerAuth.try_emplace(RD,
Result);
1751 auto ShouldContinueAfterUpdate = [&](PointerAuthContent NewResult) {
1752 static_assert(PointerAuthContent::None <
1753 PointerAuthContent::AddressDiscriminatedVTable);
1754 static_assert(PointerAuthContent::AddressDiscriminatedVTable <
1755 PointerAuthContent::AddressDiscriminatedData);
1758 return Result != PointerAuthContent::AddressDiscriminatedData;
1760 if (
const CXXRecordDecl *CXXRD = dyn_cast<CXXRecordDecl>(RD)) {
1762 !ShouldContinueAfterUpdate(
1763 PointerAuthContent::AddressDiscriminatedVTable))
1764 return SaveResultAndReturn();
1765 for (
auto Base : CXXRD->bases()) {
1766 if (!ShouldContinueAfterUpdate(findPointerAuthContent(
Base.getType())))
1767 return SaveResultAndReturn();
1770 for (
auto *FieldDecl : RD->
fields()) {
1771 if (!ShouldContinueAfterUpdate(
1772 findPointerAuthContent(FieldDecl->getType())))
1773 return SaveResultAndReturn();
1775 return SaveResultAndReturn();
1779 assert(!Import->getNextLocalImport() &&
1780 "Import declaration already in the chain");
1781 assert(!Import->isFromASTFile() &&
"Non-local import declaration");
1782 if (!FirstLocalImport) {
1783 FirstLocalImport = Import;
1784 LastLocalImport = Import;
1788 LastLocalImport->setNextLocalImport(Import);
1789 LastLocalImport = Import;
1801 llvm_unreachable(
"Not a floating point type!");
1802 case BuiltinType::BFloat16:
1803 return Target->getBFloat16Format();
1804 case BuiltinType::Float16:
1805 return Target->getHalfFormat();
1806 case BuiltinType::Half:
1807 return Target->getHalfFormat();
1808 case BuiltinType::Float:
return Target->getFloatFormat();
1809 case BuiltinType::Double:
return Target->getDoubleFormat();
1810 case BuiltinType::Ibm128:
1811 return Target->getIbm128Format();
1812 case BuiltinType::LongDouble:
1814 return AuxTarget->getLongDoubleFormat();
1815 return Target->getLongDoubleFormat();
1816 case BuiltinType::Float128:
1818 return AuxTarget->getFloat128Format();
1819 return Target->getFloat128Format();
1824 unsigned Align = Target->getCharWidth();
1828 Align = AlignFromAttr;
1836 bool UseAlignAttrOnly;
1837 if (
const FieldDecl *FD = dyn_cast<FieldDecl>(D))
1839 FD->hasAttr<PackedAttr>() || FD->getParent()->hasAttr<PackedAttr>();
1841 UseAlignAttrOnly = AlignFromAttr != 0;
1844 if (UseAlignAttrOnly) {
1846 }
else if (
const auto *VD = dyn_cast<ValueDecl>(D)) {
1850 T = RT->getPointeeType();
1855 if (
T->isFunctionType())
1856 Align = getTypeInfoImpl(
T.getTypePtr()).Align;
1861 unsigned MinWidth = Target->getLargeArrayMinWidth();
1862 if (!ForAlignof && MinWidth) {
1864 Align = std::max(Align, Target->getLargeArrayAlign());
1867 Align = std::max(Align, Target->getLargeArrayAlign());
1872 Align = Target->getCharWidth();
1876 if (
const auto *VD = dyn_cast<VarDecl>(D))
1877 if (VD->hasGlobalStorage() && !ForAlignof) {
1888 if (
const auto *Field = dyn_cast<FieldDecl>(VD)) {
1902 uint64_t LowBitOfOffset = Offset & (~Offset + 1);
1903 if (LowBitOfOffset < FieldAlign)
1904 FieldAlign =
static_cast<unsigned>(LowBitOfOffset);
1907 Align = std::min(Align, FieldAlign);
1915 const auto *VD = dyn_cast<VarDecl>(D);
1916 if (MaxAlignedAttr && VD && VD->getStorageClass() ==
SC_Static)
1917 Align = std::min(Align, MaxAlignedAttr);
1937 if (
const auto *RD =
T->getAsCXXRecordDecl(); RD && !RD->
isInvalidDecl()) {
1954 (uint64_t)(-1)/Size) &&
1955 "Overflow in array type char size evaluation");
1958 if (!Context.getTargetInfo().getCXXABI().isMicrosoft() ||
1960 Width = llvm::alignTo(Width, Align);
1967 if (
const auto *CAT = dyn_cast<ConstantArrayType>(
T))
1985 switch (BT->getKind()) {
1986 case BuiltinType::Bool:
1987 case BuiltinType::Char_S:
1988 case BuiltinType::Char_U:
1989 case BuiltinType::SChar:
1990 case BuiltinType::UChar:
1991 case BuiltinType::Short:
1992 case BuiltinType::UShort:
1993 case BuiltinType::WChar_S:
1994 case BuiltinType::WChar_U:
1995 case BuiltinType::Char8:
1996 case BuiltinType::Char16:
1997 case BuiltinType::Char32:
2005 if (
const auto *ED =
T->getAsEnumDecl()) {
2006 if (
T->isDependentType() || ED->getPromotionType().isNull() ||
2025 bool NeedsPreferredAlignment)
const {
2028 if (
unsigned Align = TT->getDecl()->getMaxAlignment())
2033 if (!
T->isIncompleteType())
2039 if (
unsigned Align = TT->getDecl()->getMaxAlignment())
2043 if (
const auto *TD =
T->getAsTagDecl())
2044 return TD->getMaxAlignment();
2050 TypeInfoMap::iterator I = MemoizedTypeInfo.find(
T);
2051 if (I != MemoizedTypeInfo.end())
2056 MemoizedTypeInfo[
T] = TI;
2071 switch (
T->getTypeClass()) {
2072#define TYPE(Class, Base)
2073#define ABSTRACT_TYPE(Class, Base)
2074#define NON_CANONICAL_TYPE(Class, Base)
2075#define DEPENDENT_TYPE(Class, Base) case Type::Class:
2076#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base) \
2078 assert(!T->isDependentType() && "should not see dependent types here"); \
2079 return getTypeInfo(cast<Class##Type>(T)->desugar().getTypePtr());
2080#include "clang/AST/TypeNodes.inc"
2081 llvm_unreachable(
"Should not see dependent types");
2083 case Type::FunctionNoProto:
2084 case Type::FunctionProto:
2090 case Type::IncompleteArray:
2091 case Type::VariableArray:
2092 case Type::ConstantArray:
2093 case Type::ArrayParameter: {
2096 if (
const auto *CAT = dyn_cast<ConstantArrayType>(
T))
2097 Size = CAT->getZExtSize();
2100 assert((Size == 0 || EltInfo.
Width <= (uint64_t)(-1) / Size) &&
2101 "Overflow in array type bit size evaluation");
2102 Width = EltInfo.
Width * Size;
2103 Align = EltInfo.
Align;
2107 Width = llvm::alignTo(Width, Align);
2111 case Type::ExtVector:
2112 case Type::Vector: {
2115 Width = VT->isPackedVectorBoolType(*
this)
2116 ? VT->getNumElements()
2117 : EltInfo.
Width * VT->getNumElements();
2119 Width = std::max<unsigned>(8, Width);
2120 Align = std::max<unsigned>(8, Width);
2124 if (Align & (Align-1)) {
2125 Align = llvm::bit_ceil(Align);
2126 Width = llvm::alignTo(Width, Align);
2129 uint64_t TargetVectorAlign = Target->getMaxVectorAlign();
2130 if (TargetVectorAlign && TargetVectorAlign < Align)
2131 Align = TargetVectorAlign;
2145 Align = std::min<unsigned>(64, Width);
2149 case Type::ConstantMatrix: {
2151 TypeInfo ElementInfo =
getTypeInfo(MT->getElementType());
2155 Width = ElementInfo.
Width * MT->getNumRows() * MT->getNumColumns();
2156 Align = ElementInfo.
Align;
2162 default: llvm_unreachable(
"Unknown builtin type!");
2163 case BuiltinType::Void:
2168 case BuiltinType::Bool:
2169 Width = Target->getBoolWidth();
2170 Align = Target->getBoolAlign();
2172 case BuiltinType::Char_S:
2173 case BuiltinType::Char_U:
2174 case BuiltinType::UChar:
2175 case BuiltinType::SChar:
2176 case BuiltinType::Char8:
2177 Width = Target->getCharWidth();
2178 Align = Target->getCharAlign();
2180 case BuiltinType::WChar_S:
2181 case BuiltinType::WChar_U:
2182 Width = Target->getWCharWidth();
2183 Align = Target->getWCharAlign();
2185 case BuiltinType::Char16:
2186 Width = Target->getChar16Width();
2187 Align = Target->getChar16Align();
2189 case BuiltinType::Char32:
2190 Width = Target->getChar32Width();
2191 Align = Target->getChar32Align();
2193 case BuiltinType::UShort:
2194 case BuiltinType::Short:
2195 Width = Target->getShortWidth();
2196 Align = Target->getShortAlign();
2198 case BuiltinType::UInt:
2199 case BuiltinType::Int:
2200 Width = Target->getIntWidth();
2201 Align = Target->getIntAlign();
2203 case BuiltinType::ULong:
2204 case BuiltinType::Long:
2205 Width = Target->getLongWidth();
2206 Align = Target->getLongAlign();
2208 case BuiltinType::ULongLong:
2209 case BuiltinType::LongLong:
2210 Width = Target->getLongLongWidth();
2211 Align = Target->getLongLongAlign();
2213 case BuiltinType::Int128:
2214 case BuiltinType::UInt128:
2216 Align = Target->getInt128Align();
2218 case BuiltinType::ShortAccum:
2219 case BuiltinType::UShortAccum:
2220 case BuiltinType::SatShortAccum:
2221 case BuiltinType::SatUShortAccum:
2222 Width = Target->getShortAccumWidth();
2223 Align = Target->getShortAccumAlign();
2225 case BuiltinType::Accum:
2226 case BuiltinType::UAccum:
2227 case BuiltinType::SatAccum:
2228 case BuiltinType::SatUAccum:
2229 Width = Target->getAccumWidth();
2230 Align = Target->getAccumAlign();
2232 case BuiltinType::LongAccum:
2233 case BuiltinType::ULongAccum:
2234 case BuiltinType::SatLongAccum:
2235 case BuiltinType::SatULongAccum:
2236 Width = Target->getLongAccumWidth();
2237 Align = Target->getLongAccumAlign();
2239 case BuiltinType::ShortFract:
2240 case BuiltinType::UShortFract:
2241 case BuiltinType::SatShortFract:
2242 case BuiltinType::SatUShortFract:
2243 Width = Target->getShortFractWidth();
2244 Align = Target->getShortFractAlign();
2246 case BuiltinType::Fract:
2247 case BuiltinType::UFract:
2248 case BuiltinType::SatFract:
2249 case BuiltinType::SatUFract:
2250 Width = Target->getFractWidth();
2251 Align = Target->getFractAlign();
2253 case BuiltinType::LongFract:
2254 case BuiltinType::ULongFract:
2255 case BuiltinType::SatLongFract:
2256 case BuiltinType::SatULongFract:
2257 Width = Target->getLongFractWidth();
2258 Align = Target->getLongFractAlign();
2260 case BuiltinType::BFloat16:
2261 if (Target->hasBFloat16Type()) {
2262 Width = Target->getBFloat16Width();
2263 Align = Target->getBFloat16Align();
2267 AuxTarget->hasBFloat16Type()) {
2268 Width = AuxTarget->getBFloat16Width();
2269 Align = AuxTarget->getBFloat16Align();
2272 case BuiltinType::Float16:
2273 case BuiltinType::Half:
2274 if (Target->hasFloat16Type() || !
getLangOpts().OpenMP ||
2276 Width = Target->getHalfWidth();
2277 Align = Target->getHalfAlign();
2280 "Expected OpenMP device compilation.");
2281 Width = AuxTarget->getHalfWidth();
2282 Align = AuxTarget->getHalfAlign();
2285 case BuiltinType::Float:
2286 Width = Target->getFloatWidth();
2287 Align = Target->getFloatAlign();
2289 case BuiltinType::Double:
2290 Width = Target->getDoubleWidth();
2291 Align = Target->getDoubleAlign();
2293 case BuiltinType::Ibm128:
2294 Width = Target->getIbm128Width();
2295 Align = Target->getIbm128Align();
2297 case BuiltinType::LongDouble:
2299 (Target->getLongDoubleWidth() != AuxTarget->getLongDoubleWidth() ||
2300 Target->getLongDoubleAlign() != AuxTarget->getLongDoubleAlign())) {
2301 Width = AuxTarget->getLongDoubleWidth();
2302 Align = AuxTarget->getLongDoubleAlign();
2304 Width = Target->getLongDoubleWidth();
2305 Align = Target->getLongDoubleAlign();
2308 case BuiltinType::Float128:
2309 if (Target->hasFloat128Type() || !
getLangOpts().OpenMP ||
2311 Width = Target->getFloat128Width();
2312 Align = Target->getFloat128Align();
2315 "Expected OpenMP device compilation.");
2316 Width = AuxTarget->getFloat128Width();
2317 Align = AuxTarget->getFloat128Align();
2320 case BuiltinType::NullPtr:
2325 case BuiltinType::ObjCId:
2326 case BuiltinType::ObjCClass:
2327 case BuiltinType::ObjCSel:
2331 case BuiltinType::OCLSampler:
2332 case BuiltinType::OCLEvent:
2333 case BuiltinType::OCLClkEvent:
2334 case BuiltinType::OCLQueue:
2335 case BuiltinType::OCLReserveID:
2336#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
2337 case BuiltinType::Id:
2338#include "clang/Basic/OpenCLImageTypes.def"
2339#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
2340 case BuiltinType::Id:
2341#include "clang/Basic/OpenCLExtensionTypes.def"
2343 Width = Target->getPointerWidth(AS);
2344 Align = Target->getPointerAlign(AS);
2354#define SVE_VECTOR_TYPE(Name, MangledName, Id, SingletonId) \
2355 case BuiltinType::Id: \
2359#define SVE_PREDICATE_TYPE(Name, MangledName, Id, SingletonId) \
2360 case BuiltinType::Id: \
2364#define SVE_OPAQUE_TYPE(Name, MangledName, Id, SingletonId) \
2365 case BuiltinType::Id: \
2369#define SVE_SCALAR_TYPE(Name, MangledName, Id, SingletonId, Bits) \
2370 case BuiltinType::Id: \
2374#include "clang/Basic/AArch64ACLETypes.def"
2375#define PPC_VECTOR_TYPE(Name, Id, Size) \
2376 case BuiltinType::Id: \
2380#include "clang/Basic/PPCTypes.def"
2381#define RVV_VECTOR_TYPE(Name, Id, SingletonId, ElKind, ElBits, NF, IsSigned, \
2383 case BuiltinType::Id: \
2387#define RVV_PREDICATE_TYPE(Name, Id, SingletonId, ElKind) \
2388 case BuiltinType::Id: \
2392#include "clang/Basic/RISCVVTypes.def"
2393#define WASM_TYPE(Name, Id, SingletonId) \
2394 case BuiltinType::Id: \
2398#include "clang/Basic/WebAssemblyReferenceTypes.def"
2399#define AMDGPU_TYPE(NAME, ID, SINGLETONID, WIDTH, ALIGN) \
2400 case BuiltinType::ID: \
2404#include "clang/Basic/AMDGPUTypes.def"
2405#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
2406#include "clang/Basic/HLSLIntangibleTypes.def"
2412 case Type::ObjCObjectPointer:
2416 case Type::BlockPointer:
2418 Width = Target->getPointerWidth(AS);
2419 Align = Target->getPointerAlign(AS);
2421 case Type::LValueReference:
2422 case Type::RValueReference:
2426 Width = Target->getPointerWidth(AS);
2427 Align = Target->getPointerAlign(AS);
2431 Width = Target->getPointerWidth(AS);
2432 Align = Target->getPointerAlign(AS);
2434 case Type::MemberPointer: {
2436 CXXABI::MemberPointerInfo MPI = ABI->getMemberPointerInfo(MPT);
2441 case Type::Complex: {
2445 Width = EltInfo.
Width * 2;
2446 Align = EltInfo.
Align;
2449 case Type::ObjCObject:
2451 case Type::Adjusted:
2454 case Type::ObjCInterface: {
2456 if (ObjCI->getDecl()->isInvalidDecl()) {
2466 case Type::BitInt: {
2468 Align = Target->getBitIntAlign(EIT->getNumBits());
2469 Width = Target->getBitIntWidth(EIT->getNumBits());
2475 const TagDecl *TD = TT->getOriginalDecl()->getDefinitionOrSelf();
2488 Info.
Align = AttrAlign;
2498 AlignRequirement = RD->
hasAttr<AlignedAttr>()
2504 case Type::SubstTemplateTypeParm:
2506 getReplacementType().getTypePtr());
2509 case Type::DeducedTemplateSpecialization: {
2511 assert(!A->getDeducedType().isNull() &&
2512 "cannot request the size of an undeduced or dependent auto type");
2513 return getTypeInfo(A->getDeducedType().getTypePtr());
2519 case Type::MacroQualified:
2523 case Type::ObjCTypeParam:
2529 case Type::Typedef: {
2531 TypeInfo Info =
getTypeInfo(TT->desugar().getTypePtr());
2535 if (
unsigned AttrAlign = TT->getDecl()->getMaxAlignment()) {
2546 case Type::Attributed:
2550 case Type::CountAttributed:
2553 case Type::BTFTagAttributed:
2557 case Type::HLSLAttributedResource:
2561 case Type::HLSLInlineSpirv: {
2564 Width = ST->getSize() * 8;
2565 Align = ST->getAlignment();
2566 if (Width == 0 && Align == 0) {
2574 case Type::Atomic: {
2583 Width = Target->getCharWidth();
2585 }
else if (Width <= Target->getMaxAtomicPromoteWidth()) {
2591 Width = llvm::bit_ceil(Width);
2594 Align =
static_cast<unsigned>(Width);
2599 case Type::PredefinedSugar:
2608 assert(llvm::isPowerOf2_32(Align) &&
"Alignment must be power of 2");
2609 return TypeInfo(Width, Align, AlignRequirement);
2613 UnadjustedAlignMap::iterator I = MemoizedUnadjustedAlign.find(
T);
2614 if (I != MemoizedUnadjustedAlign.end())
2617 unsigned UnadjustedAlign;
2618 if (
const auto *RT =
T->getAsCanonical<RecordType>()) {
2625 UnadjustedAlign =
getTypeAlign(
T->getUnqualifiedDesugaredType());
2628 MemoizedUnadjustedAlign[
T] = UnadjustedAlign;
2629 return UnadjustedAlign;
2633 unsigned SimdAlign = llvm::OpenMPIRBuilder::getOpenMPDefaultSimdAlign(
2683 unsigned ABIAlign = TI.
Align;
2685 T =
T->getBaseElementTypeUnsafe();
2688 if (
T->isMemberPointerType())
2691 if (!Target->allowsLargerPreferedTypeAlignment())
2694 if (
const auto *RD =
T->getAsRecordDecl()) {
2703 unsigned PreferredAlign =
static_cast<unsigned>(
2705 assert(PreferredAlign >= ABIAlign &&
2706 "PreferredAlign should be at least as large as ABIAlign.");
2707 return PreferredAlign;
2714 T = CT->getElementType().getTypePtr();
2715 if (
const auto *ED =
T->getAsEnumDecl())
2716 T = ED->getIntegerType().getTypePtr();
2717 if (
T->isSpecificBuiltinType(BuiltinType::Double) ||
2718 T->isSpecificBuiltinType(BuiltinType::LongLong) ||
2719 T->isSpecificBuiltinType(BuiltinType::ULongLong) ||
2720 (
T->isSpecificBuiltinType(BuiltinType::LongDouble) &&
2721 Target->defaultsToAIXPowerAlignment()))
2776 for (
unsigned I = 0, N = Path.size(); I != N; ++I) {
2780 std::swap(
Base, Derived);
2800 llvm::append_range(Ivars, OI->
ivars());
2803 for (
const ObjCIvarDecl *Iv = IDecl->all_declared_ivar_begin(); Iv;
2805 Ivars.push_back(Iv);
2813 if (
const auto *OI = dyn_cast<ObjCInterfaceDecl>(CDecl)) {
2816 for (
auto *Proto : OI->all_referenced_protocols()) {
2821 for (
const auto *Cat : OI->visible_categories())
2827 SD = SD->getSuperClass();
2829 }
else if (
const auto *OC = dyn_cast<ObjCCategoryDecl>(CDecl)) {
2830 for (
auto *Proto : OC->protocols()) {
2833 }
else if (
const auto *OP = dyn_cast<ObjCProtocolDecl>(CDecl)) {
2835 if (!Protocols.insert(
2839 for (
auto *Proto : OP->protocols())
2846 bool CheckIfTriviallyCopyable) {
2847 assert(RD->
isUnion() &&
"Must be union type");
2849 Context.getTypeSizeInChars(Context.getCanonicalTagType(RD));
2851 for (
const auto *Field : RD->
fields()) {
2852 if (!Context.hasUniqueObjectRepresentations(Field->getType(),
2853 CheckIfTriviallyCopyable))
2855 CharUnits FieldSize = Context.getTypeSizeInChars(Field->getType());
2856 if (FieldSize != UnionSize)
2865 return Context.getFieldOffset(Field);
2874static std::optional<int64_t>
2876 const RecordDecl *RD,
2877 bool CheckIfTriviallyCopyable);
2879static std::optional<int64_t>
2881 bool CheckIfTriviallyCopyable) {
2882 if (
const auto *RD = Field->getType()->getAsRecordDecl();
2885 CheckIfTriviallyCopyable);
2889 bool IsBitIntType = Field->getType()->isBitIntType();
2890 if (!Field->getType()->isReferenceType() && !IsBitIntType &&
2891 !Context.hasUniqueObjectRepresentations(Field->getType(),
2892 CheckIfTriviallyCopyable))
2893 return std::nullopt;
2895 int64_t FieldSizeInBits =
2896 Context.toBits(Context.getTypeSizeInChars(Field->getType()));
2897 if (Field->isBitField()) {
2900 if (Field->isUnnamedBitField())
2903 int64_t BitfieldSize = Field->getBitWidthValue();
2905 if ((
unsigned)BitfieldSize >
2907 return std::nullopt;
2908 }
else if (BitfieldSize > FieldSizeInBits) {
2909 return std::nullopt;
2911 FieldSizeInBits = BitfieldSize;
2912 }
else if (IsBitIntType && !Context.hasUniqueObjectRepresentations(
2913 Field->getType(), CheckIfTriviallyCopyable)) {
2914 return std::nullopt;
2916 return FieldSizeInBits;
2919static std::optional<int64_t>
2921 bool CheckIfTriviallyCopyable) {
2923 CheckIfTriviallyCopyable);
2926template <
typename RangeT>
2928 const RangeT &Subobjects, int64_t CurOffsetInBits,
2930 bool CheckIfTriviallyCopyable) {
2931 for (
const auto *Subobject : Subobjects) {
2932 std::optional<int64_t> SizeInBits =
2935 return std::nullopt;
2936 if (*SizeInBits != 0) {
2938 if (Offset != CurOffsetInBits)
2939 return std::nullopt;
2940 CurOffsetInBits += *SizeInBits;
2943 return CurOffsetInBits;
2946static std::optional<int64_t>
2949 bool CheckIfTriviallyCopyable) {
2950 assert(!RD->
isUnion() &&
"Must be struct/class type");
2951 const auto &Layout = Context.getASTRecordLayout(RD);
2953 int64_t CurOffsetInBits = 0;
2954 if (
const auto *ClassDecl = dyn_cast<CXXRecordDecl>(RD)) {
2955 if (ClassDecl->isDynamicClass())
2956 return std::nullopt;
2959 for (
const auto &
Base : ClassDecl->bases()) {
2962 Bases.emplace_back(
Base.getType()->getAsCXXRecordDecl());
2966 return Layout.getBaseClassOffset(L) < Layout.getBaseClassOffset(R);
2969 std::optional<int64_t> OffsetAfterBases =
2971 Bases, CurOffsetInBits, Context, Layout, CheckIfTriviallyCopyable);
2972 if (!OffsetAfterBases)
2973 return std::nullopt;
2974 CurOffsetInBits = *OffsetAfterBases;
2977 std::optional<int64_t> OffsetAfterFields =
2979 RD->
fields(), CurOffsetInBits, Context, Layout,
2980 CheckIfTriviallyCopyable);
2981 if (!OffsetAfterFields)
2982 return std::nullopt;
2983 CurOffsetInBits = *OffsetAfterFields;
2985 return CurOffsetInBits;
2989 QualType Ty,
bool CheckIfTriviallyCopyable)
const {
3006 assert(!Ty.
isNull() &&
"Null QualType sent to unique object rep check");
3011 CheckIfTriviallyCopyable);
3014 "hasUniqueObjectRepresentations should not be called with an "
3038 return !ABI->getMemberPointerInfo(MPT).HasPadding;
3041 if (
Record->isInvalidDecl())
3046 CheckIfTriviallyCopyable);
3049 *
this,
Record, CheckIfTriviallyCopyable);
3051 return StructSize && *StructSize ==
static_cast<int64_t
>(
getTypeSize(Ty));
3072 count += Ext->ivar_size();
3077 count += ImplDecl->ivar_size();
3103 llvm::DenseMap<ObjCContainerDecl*, ObjCImplDecl*>::iterator
3104 I = ObjCImpls.find(D);
3105 if (I != ObjCImpls.end())
3113 llvm::DenseMap<ObjCContainerDecl*, ObjCImplDecl*>::iterator
3114 I = ObjCImpls.find(D);
3115 if (I != ObjCImpls.end())
3123 assert(IFaceD && ImplD &&
"Passed null params");
3124 ObjCImpls[IFaceD] = ImplD;
3130 assert(CatD && ImplD &&
"Passed null params");
3131 ObjCImpls[CatD] = ImplD;
3136 return ObjCMethodRedecls.
lookup(MD);
3142 ObjCMethodRedecls[MD] = Redecl;
3147 if (
const auto *ID = dyn_cast<ObjCInterfaceDecl>(ND->
getDeclContext()))
3149 if (
const auto *CD = dyn_cast<ObjCCategoryDecl>(ND->
getDeclContext()))
3150 return CD->getClassInterface();
3151 if (
const auto *IMD = dyn_cast<ObjCImplDecl>(ND->
getDeclContext()))
3152 return IMD->getClassInterface();
3160 assert(VD &&
"Passed null params");
3161 assert(VD->
hasAttr<BlocksAttr>() &&
3162 "getBlockVarCopyInits - not __block var");
3163 auto I = BlockVarCopyInits.find(VD);
3164 if (I != BlockVarCopyInits.end())
3166 return {
nullptr,
false};
3172 assert(VD && CopyExpr &&
"Passed null params");
3173 assert(VD->
hasAttr<BlocksAttr>() &&
3174 "setBlockVarCopyInits - not __block var");
3175 BlockVarCopyInits[VD].setExprAndFlag(CopyExpr,
CanThrow);
3179 unsigned DataSize)
const {
3184 "incorrect data size provided to CreateTypeSourceInfo!");
3201 return getObjCLayout(D);
3206 bool &AnyNonCanonArgs) {
3208 AnyNonCanonArgs |=
C.canonicalizeTemplateArguments(CanonArgs);
3214 bool AnyNonCanonArgs =
false;
3215 for (
auto &Arg : Args) {
3218 AnyNonCanonArgs |= !Arg.structurallyEquals(OrigArg);
3220 return AnyNonCanonArgs;
3228ASTContext::getExtQualType(
const Type *baseType,
Qualifiers quals)
const {
3233 llvm::FoldingSetNodeID ID;
3235 void *insertPos =
nullptr;
3236 if (
ExtQuals *eq = ExtQualNodes.FindNodeOrInsertPos(ID, insertPos)) {
3237 assert(eq->getQualifiers() == quals);
3246 canon = getExtQualType(canonSplit.
Ty, canonSplit.
Quals);
3249 (void) ExtQualNodes.FindNodeOrInsertPos(ID, insertPos);
3252 auto *eq =
new (*
this,
alignof(ExtQuals)) ExtQuals(baseType, canon, quals);
3253 ExtQualNodes.InsertNode(eq, insertPos);
3254 return QualType(eq, fastQuals);
3258 LangAS AddressSpace)
const {
3271 "Type cannot be in multiple addr spaces!");
3274 return getExtQualType(TypeNode, Quals);
3280 if (!
T.hasAddressSpace())
3284 const Type *TypeNode;
3287 if (
T.getTypePtr()->isArrayType()) {
3289 TypeNode =
T.getTypePtr();
3293 while (
T.hasAddressSpace()) {
3294 TypeNode = Quals.
strip(
T);
3298 if (!
QualType(TypeNode, 0).hasAddressSpace())
3302 T =
T.getSingleStepDesugaredType(*
this);
3312 return getExtQualType(TypeNode, Quals);
3320 "Attempted to get vtable pointer discriminator on a monomorphic type");
3323 llvm::raw_svector_ostream Out(Str);
3324 MC->mangleCXXVTable(RD, Out);
3325 return llvm::getPointerAuthStableSipHash(Str);
3351 switch (
T->getTypeClass()) {
3356 case Type::LValueReference:
3361 case Type::RValueReference:
3375 case Type::ObjCObjectPointer:
3376 case Type::BlockPointer:
3385 case Type::VariableArray:
3386 case Type::ConstantArray:
3387 case Type::IncompleteArray:
3388 case Type::ArrayParameter:
3401 case Type::ObjCInterface:
3402 case Type::ObjCObject:
3403 OS <<
"<objc_object>";
3412 QualType UnderlyingType =
T->castAsEnumDecl()->getIntegerType();
3414 Ctx, OS, UnderlyingType.
isNull() ? Ctx.
IntTy : UnderlyingType);
3417 case Type::FunctionNoProto:
3418 case Type::FunctionProto: {
3434 if (
const auto *FPT = dyn_cast<FunctionProtoType>(FuncType)) {
3435 for (
QualType Param : FPT->param_types()) {
3439 if (FPT->isVariadic())
3446 case Type::MemberPointer: {
3450 Ctx, OS,
QualType(MPT->getQualifier().getAsType(), 0));
3454 case Type::ExtVector:
3462 case Type::ConstantMatrix:
3466 case Type::Builtin: {
3468 switch (BTy->getKind()) {
3469#define SIGNED_TYPE(Id, SingletonId) \
3470 case BuiltinType::Id: \
3473#define UNSIGNED_TYPE(Id, SingletonId) \
3474 case BuiltinType::Id: \
3477#define PLACEHOLDER_TYPE(Id, SingletonId) case BuiltinType::Id:
3478#define BUILTIN_TYPE(Id, SingletonId)
3479#include "clang/AST/BuiltinTypes.def"
3480 llvm_unreachable(
"placeholder types should not appear here.");
3482 case BuiltinType::Half:
3485 case BuiltinType::Float:
3488 case BuiltinType::Double:
3491 case BuiltinType::LongDouble:
3494 case BuiltinType::Float16:
3497 case BuiltinType::Float128:
3501 case BuiltinType::Void:
3505 case BuiltinType::ObjCId:
3506 case BuiltinType::ObjCClass:
3507 case BuiltinType::ObjCSel:
3508 case BuiltinType::NullPtr:
3513 case BuiltinType::OCLSampler:
3514 case BuiltinType::OCLEvent:
3515 case BuiltinType::OCLClkEvent:
3516 case BuiltinType::OCLQueue:
3517 case BuiltinType::OCLReserveID:
3518 case BuiltinType::BFloat16:
3519 case BuiltinType::VectorQuad:
3520 case BuiltinType::VectorPair:
3521 case BuiltinType::DMR1024:
3526 case BuiltinType::Ibm128:
3528#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
3529 case BuiltinType::Id: \
3531#include "clang/Basic/OpenCLImageTypes.def"
3532#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
3533 case BuiltinType::Id: \
3535#include "clang/Basic/OpenCLExtensionTypes.def"
3536#define SVE_TYPE(Name, Id, SingletonId) \
3537 case BuiltinType::Id: \
3539#include "clang/Basic/AArch64ACLETypes.def"
3540#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) \
3541 case BuiltinType::Id: \
3543#include "clang/Basic/HLSLIntangibleTypes.def"
3544 case BuiltinType::Dependent:
3545 llvm_unreachable(
"should never get here");
3546#define AMDGPU_TYPE(Name, Id, SingletonId, Width, Align) case BuiltinType::Id:
3547#include "clang/Basic/AMDGPUTypes.def"
3548 case BuiltinType::WasmExternRef:
3549#define RVV_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
3550#include "clang/Basic/RISCVVTypes.def"
3551 llvm_unreachable(
"not yet implemented");
3553 llvm_unreachable(
"should never get here");
3555 case Type::Record: {
3556 const RecordDecl *RD =
T->castAsCanonical<RecordType>()->getOriginalDecl();
3576 II = Typedef->getDeclName().getAsIdentifierInfo();
3579 OS <<
"<anonymous_record>";
3585 case Type::HLSLAttributedResource:
3586 case Type::HLSLInlineSpirv:
3587 llvm_unreachable(
"should never get here");
3589 case Type::DeducedTemplateSpecialization:
3591#define NON_CANONICAL_TYPE(Class, Base) case Type::Class:
3592#define DEPENDENT_TYPE(Class, Base) case Type::Class:
3593#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base) case Type::Class:
3594#define ABSTRACT_TYPE(Class, Base)
3595#define TYPE(Class, Base)
3596#include "clang/AST/TypeNodes.inc"
3597 llvm_unreachable(
"unexpected non-canonical or dependent type!");
3603 assert(!
T->isDependentType() &&
3604 "cannot compute type discriminator of a dependent type");
3607 llvm::raw_svector_ostream Out(Str);
3609 if (
T->isFunctionPointerType() ||
T->isFunctionReferenceType())
3610 T =
T->getPointeeType();
3612 if (
T->isFunctionType()) {
3615 T =
T.getUnqualifiedType();
3636 if (MPT->isMemberFunctionPointer()) {
3642 MPT->getMostRecentCXXRecordDecl());
3646 MC->mangleCanonicalTypeName(
T, Out);
3649 return llvm::getPointerAuthStableSipHash(Str);
3674 "Type cannot have multiple ObjCGCs!");
3677 return getExtQualType(TypeNode, Quals);
3691 QualType WrappedTy,
Expr *CountExpr,
bool CountInBytes,
bool OrNull,
3695 llvm::FoldingSetNodeID ID;
3698 void *InsertPos =
nullptr;
3700 CountAttributedTypes.FindNodeOrInsertPos(ID, InsertPos);
3705 size_t Size = CountAttributedType::totalSizeToAlloc<TypeCoupledDeclRefInfo>(
3706 DependentDecls.size());
3709 OrNull, DependentDecls);
3710 Types.push_back(CATy);
3711 CountAttributedTypes.InsertNode(CATy, InsertPos);
3720 case Type::Attributed: {
3728 case Type::BTFTagAttributed: {
3729 const auto *BTFT = dyn_cast<BTFTagAttributedType>(Orig);
3738 case Type::Adjusted: {
3744 case Type::MacroQualified: {
3747 MQT->getMacroIdentifier());
3751 return Adjust(Orig);
3757 if (
T->getExtInfo() == Info)
3761 if (
const auto *FNPT = dyn_cast<FunctionNoProtoType>(
T)) {
3781 FPT->getExtProtoInfo());
3796 L->DeducedReturnType(FD, ResultType);
3807 return getFunctionType(Proto->getReturnType(), Proto->getParamTypes(),
3808 Proto->getExtProtoInfo().withExceptionSpec(ESI));
3824 for (
unsigned i = 0, n = Args.size(); i != n; ++i)
3847 return getFunctionType(Proto->getReturnType(), Proto->param_types(), EPI);
3873 if (TSInfo->getType() != FD->
getType())
3881 "TypeLoc size mismatch from updating exception specification");
3882 TSInfo->overrideType(Updated);
3891 llvm::FoldingSetNodeID ID;
3894 void *InsertPos =
nullptr;
3895 if (
ComplexType *CT = ComplexTypes.FindNodeOrInsertPos(ID, InsertPos))
3901 if (!
T.isCanonical()) {
3905 ComplexType *NewIP = ComplexTypes.FindNodeOrInsertPos(ID, InsertPos);
3906 assert(!NewIP &&
"Shouldn't be in the map!"); (void)NewIP;
3909 Types.push_back(
New);
3910 ComplexTypes.InsertNode(
New, InsertPos);
3919 llvm::FoldingSetNodeID ID;
3922 void *InsertPos =
nullptr;
3923 if (
PointerType *PT = PointerTypes.FindNodeOrInsertPos(ID, InsertPos))
3929 if (!
T.isCanonical()) {
3933 PointerType *NewIP = PointerTypes.FindNodeOrInsertPos(ID, InsertPos);
3934 assert(!NewIP &&
"Shouldn't be in the map!"); (void)NewIP;
3937 Types.push_back(
New);
3938 PointerTypes.InsertNode(
New, InsertPos);
3943 llvm::FoldingSetNodeID ID;
3945 void *InsertPos =
nullptr;
3946 AdjustedType *AT = AdjustedTypes.FindNodeOrInsertPos(ID, InsertPos);
3953 AT = AdjustedTypes.FindNodeOrInsertPos(ID, InsertPos);
3954 assert(!AT &&
"Shouldn't be in the map!");
3958 Types.push_back(AT);
3959 AdjustedTypes.InsertNode(AT, InsertPos);
3964 llvm::FoldingSetNodeID ID;
3966 void *InsertPos =
nullptr;
3967 AdjustedType *AT = AdjustedTypes.FindNodeOrInsertPos(ID, InsertPos);
3974 AT = AdjustedTypes.FindNodeOrInsertPos(ID, InsertPos);
3975 assert(!AT &&
"Shouldn't be in the map!");
3978 Types.push_back(AT);
3979 AdjustedTypes.InsertNode(AT, InsertPos);
3984 assert((
T->isArrayType() ||
T->isFunctionType()) &&
"T does not decay");
3993 if (
T->isArrayType())
4000 if (
T->isFunctionType())
4012 llvm::FoldingSetNodeID ID;
4013 ATy->Profile(ID, *
this, ATy->getElementType(), ATy->getZExtSize(),
4014 ATy->getSizeExpr(), ATy->getSizeModifier(),
4015 ATy->getIndexTypeQualifiers().getAsOpaqueValue());
4016 void *InsertPos =
nullptr;
4018 ArrayParameterTypes.FindNodeOrInsertPos(ID, InsertPos);
4027 AT = ArrayParameterTypes.FindNodeOrInsertPos(ID, InsertPos);
4028 assert(!AT &&
"Shouldn't be in the map!");
4033 Types.push_back(AT);
4034 ArrayParameterTypes.InsertNode(AT, InsertPos);
4041 assert(
T->isFunctionType() &&
"block of function types only");
4044 llvm::FoldingSetNodeID ID;
4047 void *InsertPos =
nullptr;
4049 BlockPointerTypes.FindNodeOrInsertPos(ID, InsertPos))
4055 if (!
T.isCanonical()) {
4060 BlockPointerTypes.FindNodeOrInsertPos(ID, InsertPos);
4061 assert(!NewIP &&
"Shouldn't be in the map!"); (void)NewIP;
4065 Types.push_back(
New);
4066 BlockPointerTypes.InsertNode(
New, InsertPos);
4074 assert((!
T->isPlaceholderType() ||
4075 T->isSpecificPlaceholderType(BuiltinType::UnknownAny)) &&
4076 "Unresolved placeholder type");
4080 llvm::FoldingSetNodeID ID;
4083 void *InsertPos =
nullptr;
4085 LValueReferenceTypes.FindNodeOrInsertPos(ID, InsertPos))
4093 if (!SpelledAsLValue || InnerRef || !
T.isCanonical()) {
4094 QualType PointeeType = (InnerRef ? InnerRef->getPointeeType() :
T);
4099 LValueReferenceTypes.FindNodeOrInsertPos(ID, InsertPos);
4100 assert(!NewIP &&
"Shouldn't be in the map!"); (void)NewIP;
4105 Types.push_back(
New);
4106 LValueReferenceTypes.InsertNode(
New, InsertPos);
4114 assert((!
T->isPlaceholderType() ||
4115 T->isSpecificPlaceholderType(BuiltinType::UnknownAny)) &&
4116 "Unresolved placeholder type");
4120 llvm::FoldingSetNodeID ID;
4123 void *InsertPos =
nullptr;
4125 RValueReferenceTypes.FindNodeOrInsertPos(ID, InsertPos))
4133 if (InnerRef || !
T.isCanonical()) {
4134 QualType PointeeType = (InnerRef ? InnerRef->getPointeeType() :
T);
4139 RValueReferenceTypes.FindNodeOrInsertPos(ID, InsertPos);
4140 assert(!NewIP &&
"Shouldn't be in the map!"); (void)NewIP;
4145 Types.push_back(
New);
4146 RValueReferenceTypes.InsertNode(
New, InsertPos);
4154 assert(Cls &&
"At least one of Qualifier or Cls must be provided");
4157 Cls = Qualifier.getAsRecordDecl();
4161 llvm::FoldingSetNodeID ID;
4164 void *InsertPos =
nullptr;
4166 MemberPointerTypes.FindNodeOrInsertPos(ID, InsertPos))
4171 return Qualifier.getCanonical();
4179 if (!
T.isCanonical() || Qualifier != CanonicalQualifier) {
4185 MemberPointerTypes.FindNodeOrInsertPos(ID, InsertPos);
4186 assert(!NewIP &&
"Shouldn't be in the map!");
4190 Types.push_back(
New);
4191 MemberPointerTypes.InsertNode(
New, InsertPos);
4198 const llvm::APInt &ArySizeIn,
4199 const Expr *SizeExpr,
4201 unsigned IndexTypeQuals)
const {
4204 "Constant array of VLAs is illegal!");
4212 llvm::APInt ArySize(ArySizeIn);
4213 ArySize = ArySize.zextOrTrunc(Target->getMaxPointerWidth());
4215 llvm::FoldingSetNodeID ID;
4217 ASM, IndexTypeQuals);
4219 void *InsertPos =
nullptr;
4221 ConstantArrayTypes.FindNodeOrInsertPos(ID, InsertPos))
4232 ASM, IndexTypeQuals);
4237 ConstantArrayTypes.FindNodeOrInsertPos(ID, InsertPos);
4238 assert(!NewIP &&
"Shouldn't be in the map!"); (void)NewIP;
4241 auto *
New = ConstantArrayType::Create(*
this, EltTy, Canon, ArySize, SizeExpr,
4242 ASM, IndexTypeQuals);
4243 ConstantArrayTypes.InsertNode(
New, InsertPos);
4244 Types.push_back(
New);
4253 if (!
type->isVariablyModifiedType())
return type;
4258 const Type *ty = split.
Ty;
4260#define TYPE(Class, Base)
4261#define ABSTRACT_TYPE(Class, Base)
4262#define NON_CANONICAL_TYPE(Class, Base) case Type::Class:
4263#include "clang/AST/TypeNodes.inc"
4264 llvm_unreachable(
"didn't desugar past all non-canonical types?");
4270 case Type::DependentVector:
4271 case Type::ExtVector:
4272 case Type::DependentSizedExtVector:
4273 case Type::ConstantMatrix:
4274 case Type::DependentSizedMatrix:
4275 case Type::DependentAddressSpace:
4276 case Type::ObjCObject:
4277 case Type::ObjCInterface:
4278 case Type::ObjCObjectPointer:
4281 case Type::UnresolvedUsing:
4282 case Type::TypeOfExpr:
4284 case Type::Decltype:
4285 case Type::UnaryTransform:
4286 case Type::DependentName:
4287 case Type::InjectedClassName:
4288 case Type::TemplateSpecialization:
4289 case Type::DependentTemplateSpecialization:
4290 case Type::TemplateTypeParm:
4291 case Type::SubstTemplateTypeParmPack:
4292 case Type::SubstBuiltinTemplatePack:
4294 case Type::DeducedTemplateSpecialization:
4295 case Type::PackExpansion:
4296 case Type::PackIndexing:
4298 case Type::DependentBitInt:
4299 case Type::ArrayParameter:
4300 case Type::HLSLAttributedResource:
4301 case Type::HLSLInlineSpirv:
4302 llvm_unreachable(
"type should never be variably-modified");
4306 case Type::FunctionNoProto:
4307 case Type::FunctionProto:
4308 case Type::BlockPointer:
4309 case Type::MemberPointer:
4322 case Type::LValueReference: {
4326 lv->isSpelledAsLValue());
4330 case Type::RValueReference: {
4337 case Type::Atomic: {
4343 case Type::ConstantArray: {
4349 cat->getSizeModifier(),
4350 cat->getIndexTypeCVRQualifiers());
4354 case Type::DependentSizedArray: {
4358 dat->getSizeModifier(), dat->getIndexTypeCVRQualifiers());
4363 case Type::IncompleteArray: {
4368 iat->getIndexTypeCVRQualifiers());
4373 case Type::VariableArray: {
4378 vat->getIndexTypeCVRQualifiers());
4391 unsigned IndexTypeQuals)
const {
4408 VariableArrayTypes.push_back(
New);
4409 Types.push_back(
New);
4419 unsigned elementTypeQuals)
const {
4422 "Size must be type- or value-dependent!");
4426 void *insertPos =
nullptr;
4427 llvm::FoldingSetNodeID ID;
4429 ID, *
this, numElements ?
QualType(canonElementType.
Ty, 0) : elementType,
4430 ASM, elementTypeQuals, numElements);
4434 DependentSizedArrayTypes.FindNodeOrInsertPos(ID, insertPos);
4446 DependentSizedArrayTypes.InsertNode(newType, insertPos);
4447 Types.push_back(newType);
4455 numElements, ASM, elementTypeQuals);
4456 DependentSizedArrayTypes.InsertNode(canonTy, insertPos);
4457 Types.push_back(canonTy);
4462 canonElementType.
Quals);
4466 if (
QualType(canonElementType.
Ty, 0) == elementType &&
4475 Types.push_back(sugaredType);
4481 unsigned elementTypeQuals)
const {
4482 llvm::FoldingSetNodeID ID;
4485 void *insertPos =
nullptr;
4487 IncompleteArrayTypes.FindNodeOrInsertPos(ID, insertPos))
4499 ASM, elementTypeQuals);
4504 IncompleteArrayTypes.FindNodeOrInsertPos(ID, insertPos);
4505 assert(!existing &&
"Shouldn't be in the map!"); (void) existing;
4511 IncompleteArrayTypes.InsertNode(newType, insertPos);
4512 Types.push_back(newType);
4518#define SVE_INT_ELTTY(BITS, ELTS, SIGNED, NUMVECTORS) \
4519 {getIntTypeForBitwidth(BITS, SIGNED), llvm::ElementCount::getScalable(ELTS), \
4522#define SVE_ELTTY(ELTTY, ELTS, NUMVECTORS) \
4523 {ELTTY, llvm::ElementCount::getScalable(ELTS), NUMVECTORS};
4527 llvm_unreachable(
"Unsupported builtin vector type");
4529#define SVE_VECTOR_TYPE_INT(Name, MangledName, Id, SingletonId, NumEls, \
4530 ElBits, NF, IsSigned) \
4531 case BuiltinType::Id: \
4532 return {getIntTypeForBitwidth(ElBits, IsSigned), \
4533 llvm::ElementCount::getScalable(NumEls), NF};
4534#define SVE_VECTOR_TYPE_FLOAT(Name, MangledName, Id, SingletonId, NumEls, \
4536 case BuiltinType::Id: \
4537 return {ElBits == 16 ? HalfTy : (ElBits == 32 ? FloatTy : DoubleTy), \
4538 llvm::ElementCount::getScalable(NumEls), NF};
4539#define SVE_VECTOR_TYPE_BFLOAT(Name, MangledName, Id, SingletonId, NumEls, \
4541 case BuiltinType::Id: \
4542 return {BFloat16Ty, llvm::ElementCount::getScalable(NumEls), NF};
4543#define SVE_VECTOR_TYPE_MFLOAT(Name, MangledName, Id, SingletonId, NumEls, \
4545 case BuiltinType::Id: \
4546 return {MFloat8Ty, llvm::ElementCount::getScalable(NumEls), NF};
4547#define SVE_PREDICATE_TYPE_ALL(Name, MangledName, Id, SingletonId, NumEls, NF) \
4548 case BuiltinType::Id: \
4549 return {BoolTy, llvm::ElementCount::getScalable(NumEls), NF};
4550#include "clang/Basic/AArch64ACLETypes.def"
4552#define RVV_VECTOR_TYPE_INT(Name, Id, SingletonId, NumEls, ElBits, NF, \
4554 case BuiltinType::Id: \
4555 return {getIntTypeForBitwidth(ElBits, IsSigned), \
4556 llvm::ElementCount::getScalable(NumEls), NF};
4557#define RVV_VECTOR_TYPE_FLOAT(Name, Id, SingletonId, NumEls, ElBits, NF) \
4558 case BuiltinType::Id: \
4559 return {ElBits == 16 ? Float16Ty : (ElBits == 32 ? FloatTy : DoubleTy), \
4560 llvm::ElementCount::getScalable(NumEls), NF};
4561#define RVV_VECTOR_TYPE_BFLOAT(Name, Id, SingletonId, NumEls, ElBits, NF) \
4562 case BuiltinType::Id: \
4563 return {BFloat16Ty, llvm::ElementCount::getScalable(NumEls), NF};
4564#define RVV_PREDICATE_TYPE(Name, Id, SingletonId, NumEls) \
4565 case BuiltinType::Id: \
4566 return {BoolTy, llvm::ElementCount::getScalable(NumEls), 1};
4567#include "clang/Basic/RISCVVTypes.def"
4574 if (Target->getTriple().isWasm() && Target->hasFeature(
"reference-types")) {
4575#define WASM_REF_TYPE(Name, MangledName, Id, SingletonId, AS) \
4576 if (BuiltinType::Id == BuiltinType::WasmExternRef) \
4578#include "clang/Basic/WebAssemblyReferenceTypes.def"
4581 "shouldn't try to generate type externref outside WebAssembly target");
4588 unsigned NumFields)
const {
4589 if (Target->hasAArch64ACLETypes()) {
4592#define SVE_VECTOR_TYPE_INT(Name, MangledName, Id, SingletonId, NumEls, \
4593 ElBits, NF, IsSigned) \
4594 if (EltTy->hasIntegerRepresentation() && !EltTy->isBooleanType() && \
4595 EltTy->hasSignedIntegerRepresentation() == IsSigned && \
4596 EltTySize == ElBits && NumElts == (NumEls * NF) && NumFields == 1) { \
4597 return SingletonId; \
4599#define SVE_VECTOR_TYPE_FLOAT(Name, MangledName, Id, SingletonId, NumEls, \
4601 if (EltTy->hasFloatingRepresentation() && !EltTy->isBFloat16Type() && \
4602 EltTySize == ElBits && NumElts == (NumEls * NF) && NumFields == 1) { \
4603 return SingletonId; \
4605#define SVE_VECTOR_TYPE_BFLOAT(Name, MangledName, Id, SingletonId, NumEls, \
4607 if (EltTy->hasFloatingRepresentation() && EltTy->isBFloat16Type() && \
4608 EltTySize == ElBits && NumElts == (NumEls * NF) && NumFields == 1) { \
4609 return SingletonId; \
4611#define SVE_VECTOR_TYPE_MFLOAT(Name, MangledName, Id, SingletonId, NumEls, \
4613 if (EltTy->isMFloat8Type() && EltTySize == ElBits && \
4614 NumElts == (NumEls * NF) && NumFields == 1) { \
4615 return SingletonId; \
4617#define SVE_PREDICATE_TYPE_ALL(Name, MangledName, Id, SingletonId, NumEls, NF) \
4618 if (EltTy->isBooleanType() && NumElts == (NumEls * NF) && NumFields == 1) \
4620#include "clang/Basic/AArch64ACLETypes.def"
4621 }
else if (Target->hasRISCVVTypes()) {
4623#define RVV_VECTOR_TYPE(Name, Id, SingletonId, NumEls, ElBits, NF, IsSigned, \
4625 if (!EltTy->isBooleanType() && \
4626 ((EltTy->hasIntegerRepresentation() && \
4627 EltTy->hasSignedIntegerRepresentation() == IsSigned) || \
4628 (EltTy->hasFloatingRepresentation() && !EltTy->isBFloat16Type() && \
4630 (EltTy->hasFloatingRepresentation() && EltTy->isBFloat16Type() && \
4631 IsBF && !IsFP)) && \
4632 EltTySize == ElBits && NumElts == NumEls && NumFields == NF) \
4634#define RVV_PREDICATE_TYPE(Name, Id, SingletonId, NumEls) \
4635 if (EltTy->isBooleanType() && NumElts == NumEls) \
4637#include "clang/Basic/RISCVVTypes.def"
4652 llvm::FoldingSetNodeID ID;
4655 void *InsertPos =
nullptr;
4656 if (
VectorType *VTP = VectorTypes.FindNodeOrInsertPos(ID, InsertPos))
4666 VectorType *NewIP = VectorTypes.FindNodeOrInsertPos(ID, InsertPos);
4667 assert(!NewIP &&
"Shouldn't be in the map!"); (void)NewIP;
4670 VectorType(vecType, NumElts, Canonical, VecKind);
4671 VectorTypes.InsertNode(
New, InsertPos);
4672 Types.push_back(
New);
4679 llvm::FoldingSetNodeID ID;
4682 void *InsertPos =
nullptr;
4684 DependentVectorTypes.FindNodeOrInsertPos(ID, InsertPos);
4689 VecType,
QualType(Canon, 0), SizeExpr, AttrLoc, VecKind);
4692 if (CanonVecTy == VecType) {
4697 DependentVectorTypes.FindNodeOrInsertPos(ID, InsertPos);
4698 assert(!CanonCheck &&
4699 "Dependent-sized vector_size canonical type broken");
4701 DependentVectorTypes.InsertNode(
New, InsertPos);
4710 Types.push_back(
New);
4717 unsigned NumElts)
const {
4724 llvm::FoldingSetNodeID ID;
4727 void *InsertPos =
nullptr;
4728 if (
VectorType *VTP = VectorTypes.FindNodeOrInsertPos(ID, InsertPos))
4738 VectorType *NewIP = VectorTypes.FindNodeOrInsertPos(ID, InsertPos);
4739 assert(!NewIP &&
"Shouldn't be in the map!"); (void)NewIP;
4743 VectorTypes.InsertNode(
New, InsertPos);
4744 Types.push_back(
New);
4752 llvm::FoldingSetNodeID ID;
4756 void *InsertPos =
nullptr;
4758 = DependentSizedExtVectorTypes.FindNodeOrInsertPos(ID, InsertPos);
4768 if (CanonVecTy == vecType) {
4773 = DependentSizedExtVectorTypes.FindNodeOrInsertPos(ID, InsertPos);
4774 assert(!CanonCheck &&
"Dependent-sized ext_vector canonical type broken");
4776 DependentSizedExtVectorTypes.InsertNode(
New, InsertPos);
4785 Types.push_back(
New);
4790 unsigned NumColumns)
const {
4791 llvm::FoldingSetNodeID ID;
4793 Type::ConstantMatrix);
4796 "need a valid element type");
4799 "need valid matrix dimensions");
4800 void *InsertPos =
nullptr;
4810 assert(!NewIP &&
"Matrix type shouldn't already exist in the map");
4816 MatrixTypes.InsertNode(
New, InsertPos);
4817 Types.push_back(
New);
4826 llvm::FoldingSetNodeID ID;
4830 void *InsertPos =
nullptr;
4832 DependentSizedMatrixTypes.FindNodeOrInsertPos(ID, InsertPos);
4837 ColumnExpr, AttrLoc);
4840 DependentSizedMatrixTypes.FindNodeOrInsertPos(ID, InsertPos);
4841 assert(!CanonCheck &&
"Dependent-sized matrix canonical type broken");
4843 DependentSizedMatrixTypes.InsertNode(Canon, InsertPos);
4844 Types.push_back(Canon);
4857 ColumnExpr, AttrLoc);
4858 Types.push_back(
New);
4863 Expr *AddrSpaceExpr,
4869 void *insertPos =
nullptr;
4870 llvm::FoldingSetNodeID ID;
4875 DependentAddressSpaceTypes.FindNodeOrInsertPos(ID, insertPos);
4881 DependentAddressSpaceTypes.InsertNode(canonTy, insertPos);
4882 Types.push_back(canonTy);
4885 if (canonPointeeType == PointeeType &&
4891 AddrSpaceExpr, AttrLoc);
4892 Types.push_back(sugaredType);
4898 return T.isCanonical() &&
4916 llvm::FoldingSetNodeID ID;
4919 void *InsertPos =
nullptr;
4921 FunctionNoProtoTypes.FindNodeOrInsertPos(ID, InsertPos))
4931 FunctionNoProtoTypes.FindNodeOrInsertPos(ID, InsertPos);
4932 assert(!NewIP &&
"Shouldn't be in the map!"); (void)NewIP;
4937 Types.push_back(
New);
4938 FunctionNoProtoTypes.InsertNode(
New, InsertPos);
4954 return CanResultType;
4961 if (!NoexceptInType)
4978 bool AnyPackExpansions =
false;
4982 if (ET->
getAs<PackExpansionType>())
4983 AnyPackExpansions =
true;
4985 return AnyPackExpansions;
4991QualType ASTContext::getFunctionTypeInternal(
4992 QualType ResultTy, ArrayRef<QualType> ArgArray,
4993 const FunctionProtoType::ExtProtoInfo &EPI,
bool OnlyWantCanonical)
const {
4994 size_t NumArgs = ArgArray.size();
4998 llvm::FoldingSetNodeID
ID;
5003 bool Unique =
false;
5005 void *InsertPos =
nullptr;
5006 if (FunctionProtoType *FPT =
5007 FunctionProtoTypes.FindNodeOrInsertPos(ID, InsertPos)) {
5008 QualType Existing = QualType(FPT, 0);
5027 bool IsCanonicalExceptionSpec =
5031 bool isCanonical = !Unique && IsCanonicalExceptionSpec &&
5033 for (
unsigned i = 0; i != NumArgs && isCanonical; ++i)
5034 if (!ArgArray[i].isCanonicalAsParam())
5035 isCanonical =
false;
5037 if (OnlyWantCanonical)
5038 assert(isCanonical &&
5039 "given non-canonical parameters constructing canonical type");
5044 if (!isCanonical && Canonical.
isNull()) {
5045 SmallVector<QualType, 16> CanonicalArgs;
5046 CanonicalArgs.reserve(NumArgs);
5047 for (
unsigned i = 0; i != NumArgs; ++i)
5050 llvm::SmallVector<QualType, 8> ExceptionTypeStorage;
5051 FunctionProtoType::ExtProtoInfo CanonicalEPI = EPI;
5054 if (IsCanonicalExceptionSpec) {
5056 }
else if (NoexceptInType) {
5069 bool AnyPacks =
false;
5071 if (ET->
getAs<PackExpansionType>())
5092 llvm_unreachable(
"dependent noexcept is already canonical");
5095 CanonicalEPI.
ExceptionSpec = FunctionProtoType::ExceptionSpecInfo();
5101 getFunctionTypeInternal(CanResultTy, CanonicalArgs, CanonicalEPI,
true);
5104 FunctionProtoType *NewIP =
5105 FunctionProtoTypes.FindNodeOrInsertPos(ID, InsertPos);
5106 assert(!NewIP &&
"Shouldn't be in the map!"); (void)NewIP;
5111 auto ESH = FunctionProtoType::getExceptionSpecSize(
5113 size_t Size = FunctionProtoType::totalSizeToAlloc<
5114 QualType, SourceLocation, FunctionType::FunctionTypeExtraBitfields,
5115 FunctionType::FunctionTypeExtraAttributeInfo,
5116 FunctionType::FunctionTypeArmAttributes, FunctionType::ExceptionType,
5117 Expr *, FunctionDecl *, FunctionProtoType::ExtParameterInfo, Qualifiers,
5118 FunctionEffect, EffectConditionExpr>(
5122 ESH.NumExprPtr, ESH.NumFunctionDeclPtr,
5127 auto *FTP = (FunctionProtoType *)
Allocate(Size,
alignof(FunctionProtoType));
5128 FunctionProtoType::ExtProtoInfo newEPI = EPI;
5129 new (FTP) FunctionProtoType(ResultTy, ArgArray, Canonical, newEPI);
5130 Types.push_back(FTP);
5132 FunctionProtoTypes.InsertNode(FTP, InsertPos);
5134 AnyFunctionEffects =
true;
5135 return QualType(FTP, 0);
5138QualType ASTContext::getPipeType(QualType
T,
bool ReadOnly)
const {
5139 llvm::FoldingSetNodeID
ID;
5142 void *InsertPos =
nullptr;
5143 if (PipeType *PT = PipeTypes.FindNodeOrInsertPos(ID, InsertPos))
5144 return QualType(PT, 0);
5149 if (!
T.isCanonical()) {
5153 PipeType *NewIP = PipeTypes.FindNodeOrInsertPos(ID, InsertPos);
5154 assert(!NewIP &&
"Shouldn't be in the map!");
5157 auto *
New =
new (*
this,
alignof(PipeType)) PipeType(
T, Canonical, ReadOnly);
5158 Types.push_back(
New);
5159 PipeTypes.InsertNode(
New, InsertPos);
5160 return QualType(
New, 0);
5170 return getPipeType(
T,
true);
5174 return getPipeType(
T,
false);
5178 llvm::FoldingSetNodeID ID;
5181 void *InsertPos =
nullptr;
5182 if (
BitIntType *EIT = BitIntTypes.FindNodeOrInsertPos(ID, InsertPos))
5186 BitIntTypes.InsertNode(
New, InsertPos);
5187 Types.push_back(
New);
5192 Expr *NumBitsExpr)
const {
5194 llvm::FoldingSetNodeID ID;
5197 void *InsertPos =
nullptr;
5199 DependentBitIntTypes.FindNodeOrInsertPos(ID, InsertPos))
5204 DependentBitIntTypes.InsertNode(
New, InsertPos);
5206 Types.push_back(
New);
5214 if (
auto *Target = PredefinedSugarTypes[llvm::to_underlying(KD)];
5226 return Ctx.getFromTargetType(Ctx.Target->
getSizeType());
5227 case Kind::SignedSizeT:
5229 case Kind::PtrdiffT:
5232 llvm_unreachable(
"unexpected kind");
5237 Types.push_back(
New);
5238 PredefinedSugarTypes[llvm::to_underlying(KD)] =
New;
5245 if (
auto *Tag = dyn_cast<TagDecl>(
Decl))
5248 if (
auto *
Typedef = dyn_cast<TypedefNameDecl>(
Decl))
5250 if (
auto *UD = dyn_cast<UnresolvedUsingTypenameDecl>(
Decl))
5259 if (
auto *Tag = dyn_cast<TagDecl>(TD))
5261 if (
auto *TN = dyn_cast<TypedefNameDecl>(TD))
5263 if (
const auto *UD = dyn_cast<UnresolvedUsingTypenameDecl>(TD))
5265 assert(TD->TypeForDecl);
5270 if (
const auto *TD = dyn_cast<TagDecl>(
Decl))
5272 if (
const auto *TD = dyn_cast<TypedefNameDecl>(
Decl);
5273 isa_and_nonnull<TypedefDecl, TypeAliasDecl>(TD))
5276 if (
const auto *Using = dyn_cast<UnresolvedUsingTypenameDecl>(
Decl))
5279 assert(
Decl->TypeForDecl);
5289 std::optional<bool> TypeMatchesDeclOrNone)
const {
5290 if (!TypeMatchesDeclOrNone) {
5291 QualType DeclUnderlyingType =
Decl->getUnderlyingType();
5292 assert(!DeclUnderlyingType.
isNull());
5293 if (UnderlyingType.
isNull())
5294 UnderlyingType = DeclUnderlyingType;
5296 assert(
hasSameType(UnderlyingType, DeclUnderlyingType));
5297 TypeMatchesDeclOrNone = UnderlyingType == DeclUnderlyingType;
5301 assert(!UnderlyingType.
isNull());
5305 *TypeMatchesDeclOrNone) {
5306 if (
Decl->TypeForDecl)
5311 !*TypeMatchesDeclOrNone);
5313 Types.push_back(NewType);
5314 Decl->TypeForDecl = NewType;
5318 llvm::FoldingSetNodeID ID;
5320 *TypeMatchesDeclOrNone ?
QualType() : UnderlyingType);
5322 void *InsertPos =
nullptr;
5324 TypedefTypes.FindNodeOrInsertPos(ID, InsertPos))
5325 return QualType(Placeholder->getType(), 0);
5330 1, !!Qualifier, !*TypeMatchesDeclOrNone),
5334 UnderlyingType, !*TypeMatchesDeclOrNone);
5335 auto *Placeholder =
new (NewType->getFoldingSetPlaceholder())
5337 TypedefTypes.InsertNode(Placeholder, InsertPos);
5338 Types.push_back(NewType);
5347 if (UnderlyingType.
isNull()) {
5355 llvm::FoldingSetNodeID ID;
5358 void *InsertPos =
nullptr;
5359 if (
const UsingType *
T = UsingTypes.FindNodeOrInsertPos(ID, InsertPos))
5369 Allocate(UsingType::totalSizeToAlloc<NestedNameSpecifier>(!!Qualifier),
5373 UsingTypes.InsertNode(
T, InsertPos);
5379 const TagDecl *TD,
bool OwnsTag,
5381 const Type *CanonicalType,
5382 bool WithFoldingSetNode)
const {
5383 auto [TC, Size] = [&] {
5386 static_assert(
alignof(EnumType) ==
alignof(TagType));
5387 return std::make_tuple(Type::Enum,
sizeof(EnumType));
5388 case Decl::ClassTemplatePartialSpecialization:
5389 case Decl::ClassTemplateSpecialization:
5390 case Decl::CXXRecord:
5391 static_assert(
alignof(RecordType) ==
alignof(TagType));
5392 static_assert(
alignof(InjectedClassNameType) ==
alignof(TagType));
5394 return std::make_tuple(Type::InjectedClassName,
5395 sizeof(InjectedClassNameType));
5398 return std::make_tuple(Type::Record,
sizeof(RecordType));
5400 llvm_unreachable(
"unexpected decl kind");
5410 if (WithFoldingSetNode) {
5418 sizeof(TagTypeFoldingSetPlaceholder) +
5419 TagTypeFoldingSetPlaceholder::getOffset() + Size,
5420 std::max(
alignof(TagTypeFoldingSetPlaceholder),
alignof(TagType)));
5421 auto *
T =
new (Mem) TagTypeFoldingSetPlaceholder();
5422 Mem =
T->getTagType();
5424 Mem =
Allocate(Size,
alignof(TagType));
5427 auto *
T = [&, TC = TC]() -> TagType * {
5431 auto *
T =
new (Mem) EnumType(TC,
Keyword, Qualifier, TD, OwnsTag,
5432 IsInjected, CanonicalType);
5433 assert(
reinterpret_cast<void *
>(
T) ==
5434 reinterpret_cast<void *
>(
static_cast<TagType *
>(
T)) &&
5435 "TagType must be the first base of EnumType");
5438 case Type::Record: {
5440 auto *
T =
new (Mem) RecordType(TC,
Keyword, Qualifier, TD, OwnsTag,
5441 IsInjected, CanonicalType);
5442 assert(
reinterpret_cast<void *
>(
T) ==
5443 reinterpret_cast<void *
>(
static_cast<TagType *
>(
T)) &&
5444 "TagType must be the first base of RecordType");
5447 case Type::InjectedClassName: {
5448 auto *
T =
new (Mem) InjectedClassNameType(
Keyword, Qualifier, TD,
5449 IsInjected, CanonicalType);
5450 assert(
reinterpret_cast<void *
>(
T) ==
5451 reinterpret_cast<void *
>(
static_cast<TagType *
>(
T)) &&
5452 "TagType must be the first base of InjectedClassNameType");
5456 llvm_unreachable(
"unexpected type class");
5459 assert(
T->getKeyword() ==
Keyword);
5460 assert(
T->getQualifier() == Qualifier);
5461 assert(
T->getOriginalDecl() == TD);
5462 assert(
T->isInjected() == IsInjected);
5463 assert(
T->isTagOwned() == OwnsTag);
5472 if (
const auto *RD = dyn_cast<CXXRecordDecl>(TD);
5473 RD && RD->isInjectedClassName())
5480 if (TD->TypeForDecl)
5481 return TD->TypeForDecl->getCanonicalTypeUnqualified();
5483 const Type *CanonicalType = getTagTypeInternal(
5486 false,
false,
nullptr,
5488 TD->TypeForDecl = CanonicalType;
5494 const TagDecl *TD,
bool OwnsTag)
const {
5497 bool IsInjected = TD != NonInjectedTD;
5504 if (
Keyword == PreferredKeyword && !Qualifier && !OwnsTag) {
5505 if (
const Type *
T = TD->TypeForDecl;
T && !
T->isCanonicalUnqualified())
5511 std::nullopt, NonInjectedTD,
5512 false, IsInjected, CanonicalType,
5514 TD->TypeForDecl =
T;
5518 llvm::FoldingSetNodeID ID;
5519 TagTypeFoldingSetPlaceholder::Profile(ID,
Keyword, Qualifier, NonInjectedTD,
5520 OwnsTag, IsInjected);
5522 void *InsertPos =
nullptr;
5523 if (TagTypeFoldingSetPlaceholder *
T =
5524 TagTypes.FindNodeOrInsertPos(ID, InsertPos))
5529 getTagTypeInternal(
Keyword, Qualifier, NonInjectedTD, OwnsTag, IsInjected,
5530 CanonicalType,
true);
5531 TagTypes.InsertNode(TagTypeFoldingSetPlaceholder::fromTagType(
T), InsertPos);
5536 unsigned NumPositiveBits,
5539 unsigned IntWidth = Target->getIntWidth();
5540 unsigned CharWidth = Target->getCharWidth();
5541 unsigned ShortWidth = Target->getShortWidth();
5542 bool EnumTooLarge =
false;
5544 if (NumNegativeBits) {
5548 if (IsPacked && NumNegativeBits <= CharWidth &&
5549 NumPositiveBits < CharWidth) {
5551 BestWidth = CharWidth;
5552 }
else if (IsPacked && NumNegativeBits <= ShortWidth &&
5553 NumPositiveBits < ShortWidth) {
5555 BestWidth = ShortWidth;
5556 }
else if (NumNegativeBits <= IntWidth && NumPositiveBits < IntWidth) {
5558 BestWidth = IntWidth;
5560 BestWidth = Target->getLongWidth();
5562 if (NumNegativeBits <= BestWidth && NumPositiveBits < BestWidth) {
5565 BestWidth = Target->getLongLongWidth();
5567 if (NumNegativeBits > BestWidth || NumPositiveBits >= BestWidth)
5568 EnumTooLarge =
true;
5572 BestPromotionType = (BestWidth <= IntWidth ?
IntTy : BestType);
5577 if (IsPacked && NumPositiveBits <= CharWidth) {
5579 BestPromotionType =
IntTy;
5580 BestWidth = CharWidth;
5581 }
else if (IsPacked && NumPositiveBits <= ShortWidth) {
5583 BestPromotionType =
IntTy;
5584 BestWidth = ShortWidth;
5585 }
else if (NumPositiveBits <= IntWidth) {
5587 BestWidth = IntWidth;
5588 BestPromotionType = (NumPositiveBits == BestWidth || !LangOpts.CPlusPlus)
5591 }
else if (NumPositiveBits <= (BestWidth = Target->getLongWidth())) {
5593 BestPromotionType = (NumPositiveBits == BestWidth || !LangOpts.CPlusPlus)
5597 BestWidth = Target->getLongLongWidth();
5598 if (NumPositiveBits > BestWidth) {
5603 EnumTooLarge =
true;
5606 BestPromotionType = (NumPositiveBits == BestWidth || !LangOpts.CPlusPlus)
5611 return EnumTooLarge;
5615 assert((
T->isIntegralType(*
this) ||
T->isEnumeralType()) &&
5616 "Integral type required!");
5619 if (
Value.isUnsigned() ||
Value.isNonNegative()) {
5620 if (
T->isSignedIntegerOrEnumerationType())
5622 return Value.getActiveBits() <= BitWidth;
5624 return Value.getSignificantBits() <= BitWidth;
5630 const Type *CanonicalType)
const {
5632 UnresolvedUsingType::totalSizeToAlloc<
5634 !!InsertPos, !!Qualifier),
5638 auto *Placeholder =
new (
T->getFoldingSetPlaceholder())
5640 TypedefTypes.InsertNode(Placeholder, InsertPos);
5650 return D->TypeForDecl->getCanonicalTypeUnqualified();
5652 const Type *CanonicalType = getUnresolvedUsingTypeInternal(
5656 D->TypeForDecl = CanonicalType;
5665 if (
const Type *
T = D->TypeForDecl;
T && !
T->isCanonicalUnqualified())
5672 nullptr, CanonicalType);
5677 llvm::FoldingSetNodeID ID;
5680 void *InsertPos =
nullptr;
5682 UnresolvedUsingTypes.FindNodeOrInsertPos(ID, InsertPos))
5683 return QualType(Placeholder->getType(), 0);
5687 const Type *
T = getUnresolvedUsingTypeInternal(
Keyword, Qualifier, D,
5688 InsertPos, CanonicalType);
5696 llvm::FoldingSetNodeID id;
5697 AttributedType::Profile(
id, attrKind, modifiedType, equivalentType,
attr);
5699 void *insertPos =
nullptr;
5700 AttributedType *
type = AttributedTypes.FindNodeOrInsertPos(
id, insertPos);
5703 assert(!
attr ||
attr->getKind() == attrKind);
5706 type =
new (*
this,
alignof(AttributedType))
5707 AttributedType(canon, attrKind,
attr, modifiedType, equivalentType);
5709 Types.push_back(
type);
5710 AttributedTypes.InsertNode(
type, insertPos);
5723 switch (nullability) {
5739 llvm_unreachable(
"Unknown nullability kind");
5744 llvm::FoldingSetNodeID ID;
5745 BTFTagAttributedType::Profile(ID, Wrapped, BTFAttr);
5747 void *InsertPos =
nullptr;
5748 BTFTagAttributedType *Ty =
5749 BTFTagAttributedTypes.FindNodeOrInsertPos(ID, InsertPos);
5754 Ty =
new (*
this,
alignof(BTFTagAttributedType))
5755 BTFTagAttributedType(Canon, Wrapped, BTFAttr);
5757 Types.push_back(Ty);
5758 BTFTagAttributedTypes.InsertNode(Ty, InsertPos);
5765 const HLSLAttributedResourceType::Attributes &Attrs) {
5767 llvm::FoldingSetNodeID ID;
5768 HLSLAttributedResourceType::Profile(ID, Wrapped, Contained, Attrs);
5770 void *InsertPos =
nullptr;
5771 HLSLAttributedResourceType *Ty =
5772 HLSLAttributedResourceTypes.FindNodeOrInsertPos(ID, InsertPos);
5776 Ty =
new (*
this,
alignof(HLSLAttributedResourceType))
5777 HLSLAttributedResourceType(Wrapped, Contained, Attrs);
5779 Types.push_back(Ty);
5780 HLSLAttributedResourceTypes.InsertNode(Ty, InsertPos);
5788 llvm::FoldingSetNodeID ID;
5789 HLSLInlineSpirvType::Profile(ID, Opcode, Size, Alignment, Operands);
5791 void *InsertPos =
nullptr;
5792 HLSLInlineSpirvType *Ty =
5793 HLSLInlineSpirvTypes.FindNodeOrInsertPos(ID, InsertPos);
5798 HLSLInlineSpirvType::totalSizeToAlloc<SpirvOperand>(Operands.size()),
5799 alignof(HLSLInlineSpirvType));
5801 Ty =
new (Mem) HLSLInlineSpirvType(Opcode, Size, Alignment, Operands);
5803 Types.push_back(Ty);
5804 HLSLInlineSpirvTypes.InsertNode(Ty, InsertPos);
5811 Decl *AssociatedDecl,
5815 llvm::FoldingSetNodeID ID;
5816 SubstTemplateTypeParmType::Profile(ID, Replacement, AssociatedDecl, Index,
5818 void *InsertPos =
nullptr;
5819 SubstTemplateTypeParmType *SubstParm =
5820 SubstTemplateTypeParmTypes.FindNodeOrInsertPos(ID, InsertPos);
5823 void *Mem =
Allocate(SubstTemplateTypeParmType::totalSizeToAlloc<QualType>(
5824 !Replacement.isCanonical()),
5825 alignof(SubstTemplateTypeParmType));
5826 SubstParm =
new (Mem) SubstTemplateTypeParmType(Replacement, AssociatedDecl,
5827 Index, PackIndex, Final);
5828 Types.push_back(SubstParm);
5829 SubstTemplateTypeParmTypes.InsertNode(SubstParm, InsertPos);
5837 unsigned Index,
bool Final,
5844 llvm::FoldingSetNodeID ID;
5845 SubstTemplateTypeParmPackType::Profile(ID, AssociatedDecl, Index, Final,
5847 void *InsertPos =
nullptr;
5848 if (SubstTemplateTypeParmPackType *SubstParm =
5849 SubstTemplateTypeParmPackTypes.FindNodeOrInsertPos(ID, InsertPos))
5859 [[maybe_unused]]
const auto *Nothing =
5860 SubstTemplateTypeParmPackTypes.FindNodeOrInsertPos(ID, InsertPos);
5865 auto *SubstParm =
new (*
this,
alignof(SubstTemplateTypeParmPackType))
5866 SubstTemplateTypeParmPackType(Canon, AssociatedDecl, Index, Final,
5868 Types.push_back(SubstParm);
5869 SubstTemplateTypeParmPackTypes.InsertNode(SubstParm, InsertPos);
5877 return P.getKind() == TemplateArgument::Type;
5879 "Pack contains a non-type");
5881 llvm::FoldingSetNodeID ID;
5882 SubstBuiltinTemplatePackType::Profile(ID, ArgPack);
5884 void *InsertPos =
nullptr;
5886 SubstBuiltinTemplatePackTypes.FindNodeOrInsertPos(ID, InsertPos))
5894 auto *PackType =
new (*
this,
alignof(SubstBuiltinTemplatePackType))
5895 SubstBuiltinTemplatePackType(Canon, ArgPack);
5896 Types.push_back(PackType);
5897 SubstBuiltinTemplatePackTypes.InsertNode(PackType, InsertPos);
5907 llvm::FoldingSetNodeID ID;
5908 TemplateTypeParmType::Profile(ID, Depth, Index, ParameterPack, TTPDecl);
5909 void *InsertPos =
nullptr;
5910 TemplateTypeParmType *TypeParm
5911 = TemplateTypeParmTypes.FindNodeOrInsertPos(ID, InsertPos);
5918 TypeParm =
new (*
this,
alignof(TemplateTypeParmType))
5919 TemplateTypeParmType(Depth, Index, ParameterPack, TTPDecl, Canon);
5921 TemplateTypeParmType *TypeCheck
5922 = TemplateTypeParmTypes.FindNodeOrInsertPos(ID, InsertPos);
5923 assert(!TypeCheck &&
"Template type parameter canonical type broken");
5926 TypeParm =
new (*
this,
alignof(TemplateTypeParmType)) TemplateTypeParmType(
5927 Depth, Index, ParameterPack,
nullptr,
QualType());
5929 Types.push_back(TypeParm);
5930 TemplateTypeParmTypes.InsertNode(TypeParm, InsertPos);
5946 ElaboratedKeywordLoc, QualifierLoc, TemplateKeywordLoc, NameLoc,
5956 SpecifiedArgVec.reserve(SpecifiedArgs.size());
5958 SpecifiedArgVec.push_back(Arg.getArgument());
5961 CanonicalArgs, Underlying);
5964[[maybe_unused]]
static bool
5967 if (Arg.isPackExpansion())
5976 assert(!Args.empty());
5978 for (
const auto &Arg : Args)
5982 llvm::FoldingSetNodeID ID;
5983 TemplateSpecializationType::Profile(ID,
Template, Args,
QualType(), *
this);
5984 void *InsertPos =
nullptr;
5985 if (
auto *
T = TemplateSpecializationTypes.FindNodeOrInsertPos(ID, InsertPos))
5988 void *Mem =
Allocate(
sizeof(TemplateSpecializationType) +
5990 alignof(TemplateSpecializationType));
5991 auto *Spec =
new (Mem)
5994 assert(Spec->isDependentType() &&
5995 "canonical template specialization must be dependent");
5996 Types.push_back(Spec);
5997 TemplateSpecializationTypes.InsertNode(Spec, InsertPos);
6005 assert(!
Template.getUnderlying().getAsDependentTemplateName() &&
6006 "No dependent template names here!");
6008 const auto *TD =
Template.getAsTemplateDecl(
true);
6009 bool IsTypeAlias = TD && TD->isTypeAlias();
6010 if (Underlying.
isNull()) {
6016 if (CanonicalArgs.empty()) {
6019 CanonicalArgs = CanonArgsVec;
6021 NonCanonical |= !llvm::equal(
6022 SpecifiedArgs, CanonicalArgs,
6031 assert((!isa_and_nonnull<TypeAliasTemplateDecl>(TD) ||
6033 "Caller must compute aliased type");
6034 IsTypeAlias =
false;
6041 void *Mem =
Allocate(
sizeof(TemplateSpecializationType) +
6043 (IsTypeAlias ?
sizeof(
QualType) : 0),
6044 alignof(TemplateSpecializationType));
6045 auto *Spec =
new (Mem) TemplateSpecializationType(
6047 Types.push_back(Spec);
6053 llvm::FoldingSetNodeID ID;
6056 void *InsertPos =
nullptr;
6057 ParenType *
T = ParenTypes.FindNodeOrInsertPos(ID, InsertPos);
6064 ParenType *CheckT = ParenTypes.FindNodeOrInsertPos(ID, InsertPos);
6065 assert(!CheckT &&
"Paren canonical type broken");
6071 ParenTypes.InsertNode(
T, InsertPos);
6084 Types.push_back(newType);
6109 llvm_unreachable(
"unexpected keyword kind");
6115 llvm::FoldingSetNodeID ID;
6116 DependentNameType::Profile(ID,
Keyword, NNS, Name);
6118 void *InsertPos =
nullptr;
6119 if (DependentNameType *
T =
6120 DependentNameTypes.FindNodeOrInsertPos(ID, InsertPos))
6128 if (CanonKeyword !=
Keyword || CanonNNS != NNS) {
6130 [[maybe_unused]] DependentNameType *
T =
6131 DependentNameTypes.FindNodeOrInsertPos(ID, InsertPos);
6132 assert(!
T &&
"broken canonicalization");
6136 DependentNameType *
T =
new (*
this,
alignof(DependentNameType))
6137 DependentNameType(
Keyword, NNS, Name, Canon);
6139 DependentNameTypes.InsertNode(
T, InsertPos);
6148 for (
unsigned I = 0, E = Args.size(); I != E; ++I)
6156 llvm::FoldingSetNodeID ID;
6157 DependentTemplateSpecializationType::Profile(ID, *
this,
Keyword, Name, Args);
6159 if (
auto const T_iter = DependentTemplateSpecializationTypes.find(ID);
6160 T_iter != DependentTemplateSpecializationTypes.end())
6161 return QualType(T_iter->getSecond(), 0);
6170 bool AnyNonCanonArgs =
false;
6174 if (CanonKeyword !=
Keyword || AnyNonCanonArgs || CanonNNS != NNS ||
6177 CanonKeyword, {CanonNNS, Name.
getName(),
true},
6186 for (
const auto &Arg : Args)
6190 void *Mem =
Allocate((
sizeof(DependentTemplateSpecializationType) +
6192 alignof(DependentTemplateSpecializationType));
6194 new (Mem) DependentTemplateSpecializationType(
Keyword, Name, Args, Canon);
6196 llvm::FoldingSetNodeID InsertedID;
6197 T->Profile(InsertedID, *
this);
6198 assert(InsertedID == ID &&
"ID does not match");
6201 DependentTemplateSpecializationTypes.try_emplace(ID,
T);
6207 if (
const auto *TTP = dyn_cast<TemplateTypeParmDecl>(Param)) {
6209 if (TTP->isParameterPack())
6213 }
else if (
auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(Param)) {
6215 NTTP->getType().getNonPackExpansionType().getNonLValueExprType(*
this);
6221 if (
T->isRecordType()) {
6230 Expr *E =
new (*this)
6232 T,
VK, NTTP->getLocation());
6234 if (NTTP->isParameterPack())
6240 std::nullopt,
false,
6242 if (TTP->isParameterPack())
6248 if (Param->isTemplateParameterPack())
6257 bool ExpectPackInType)
const {
6259 "Pack expansions must expand one or more parameter packs");
6261 llvm::FoldingSetNodeID ID;
6262 PackExpansionType::Profile(ID, Pattern, NumExpansions);
6264 void *InsertPos =
nullptr;
6265 PackExpansionType *
T = PackExpansionTypes.FindNodeOrInsertPos(ID, InsertPos);
6276 PackExpansionTypes.FindNodeOrInsertPos(ID, InsertPos);
6279 T =
new (*
this,
alignof(PackExpansionType))
6280 PackExpansionType(Pattern, Canon, NumExpansions);
6282 PackExpansionTypes.InsertNode(
T, InsertPos);
6294 if (Protocols.empty())
return true;
6299 for (
unsigned i = 1; i != Protocols.size(); ++i)
6309 llvm::array_pod_sort(Protocols.begin(), Protocols.end(),
CmpProtocolNames);
6313 P = P->getCanonicalDecl();
6316 auto ProtocolsEnd = llvm::unique(Protocols);
6317 Protocols.erase(ProtocolsEnd, Protocols.end());
6322 unsigned NumProtocols)
const {
6331 bool isKindOf)
const {
6334 if (typeArgs.empty() && protocols.empty() && !isKindOf &&
6339 llvm::FoldingSetNodeID ID;
6340 ObjCObjectTypeImpl::Profile(ID, baseType, typeArgs, protocols, isKindOf);
6341 void *InsertPos =
nullptr;
6342 if (
ObjCObjectType *QT = ObjCObjectTypes.FindNodeOrInsertPos(ID, InsertPos))
6349 if (effectiveTypeArgs.empty()) {
6351 effectiveTypeArgs = baseObject->getTypeArgs();
6358 bool typeArgsAreCanonical = llvm::all_of(
6361 if (!typeArgsAreCanonical || !protocolsSorted || !baseType.
isCanonical()) {
6365 if (!typeArgsAreCanonical) {
6366 canonTypeArgsVec.reserve(effectiveTypeArgs.size());
6367 for (
auto typeArg : effectiveTypeArgs)
6369 canonTypeArgs = canonTypeArgsVec;
6371 canonTypeArgs = effectiveTypeArgs;
6376 if (!protocolsSorted) {
6377 canonProtocolsVec.append(protocols.begin(), protocols.end());
6379 canonProtocols = canonProtocolsVec;
6381 canonProtocols = protocols;
6385 canonProtocols, isKindOf);
6388 ObjCObjectTypes.FindNodeOrInsertPos(ID, InsertPos);
6391 unsigned size =
sizeof(ObjCObjectTypeImpl);
6392 size += typeArgs.size() *
sizeof(
QualType);
6394 void *mem =
Allocate(size,
alignof(ObjCObjectTypeImpl));
6396 new (mem) ObjCObjectTypeImpl(canonical, baseType, typeArgs, protocols,
6400 ObjCObjectTypes.InsertNode(
T, InsertPos);
6410 bool allowOnPointerType)
const {
6413 if (
const auto *objT = dyn_cast<ObjCTypeParamType>(
type.getTypePtr())) {
6418 if (allowOnPointerType) {
6419 if (
const auto *objPtr =
6420 dyn_cast<ObjCObjectPointerType>(
type.getTypePtr())) {
6424 protocolsVec.append(objT->qual_begin(),
6426 protocolsVec.append(protocols.begin(), protocols.end());
6429 objT->getBaseType(),
6430 objT->getTypeArgsAsWritten(),
6432 objT->isKindOfTypeAsWritten());
6438 if (
const auto *objT = dyn_cast<ObjCObjectType>(
type.getTypePtr())){
6443 objT->getTypeArgsAsWritten(),
6445 objT->isKindOfTypeAsWritten());
6449 if (
type->isObjCObjectType()) {
6459 if (
type->isObjCIdType()) {
6462 objPtr->isKindOfType());
6467 if (
type->isObjCClassType()) {
6470 objPtr->isKindOfType());
6482 llvm::FoldingSetNodeID ID;
6483 ObjCTypeParamType::Profile(ID,
Decl,
Decl->getUnderlyingType(), protocols);
6484 void *InsertPos =
nullptr;
6485 if (ObjCTypeParamType *TypeParam =
6486 ObjCTypeParamTypes.FindNodeOrInsertPos(ID, InsertPos))
6491 if (!protocols.empty()) {
6495 Canonical, protocols, hasError,
true ));
6496 assert(!hasError &&
"Error when apply protocol qualifier to bound type");
6499 unsigned size =
sizeof(ObjCTypeParamType);
6501 void *mem =
Allocate(size,
alignof(ObjCTypeParamType));
6502 auto *newType =
new (mem) ObjCTypeParamType(
Decl, Canonical, protocols);
6504 Types.push_back(newType);
6505 ObjCTypeParamTypes.InsertNode(newType, InsertPos);
6515 protocols.append(NewTypeParamTy->qual_begin(), NewTypeParamTy->qual_end());
6530 for (
auto *Proto : OPT->quals()) {
6553 if (InheritedProtocols.empty())
6557 bool Conforms =
false;
6558 for (
auto *Proto : OPT->quals()) {
6560 for (
auto *PI : InheritedProtocols) {
6572 for (
auto *PI : InheritedProtocols) {
6574 bool Adopts =
false;
6575 for (
auto *Proto : OPT->quals()) {
6589 llvm::FoldingSetNodeID ID;
6592 void *InsertPos =
nullptr;
6594 ObjCObjectPointerTypes.FindNodeOrInsertPos(ID, InsertPos))
6603 ObjCObjectPointerTypes.FindNodeOrInsertPos(ID, InsertPos);
6612 Types.push_back(QType);
6613 ObjCObjectPointerTypes.InsertNode(QType, InsertPos);
6621 if (
Decl->TypeForDecl)
6625 assert(PrevDecl->TypeForDecl &&
"previous decl has no TypeForDecl");
6626 Decl->TypeForDecl = PrevDecl->TypeForDecl;
6627 return QualType(PrevDecl->TypeForDecl, 0);
6636 Decl->TypeForDecl =
T;
6649 llvm::FoldingSetNodeID ID;
6653 void *InsertPos =
nullptr;
6655 DependentTypeOfExprTypes.FindNodeOrInsertPos(ID, InsertPos);
6665 DependentTypeOfExprTypes.InsertNode(Canon, InsertPos);
6673 Types.push_back(toe);
6684 auto *tot =
new (*
this,
alignof(TypeOfType))
6685 TypeOfType(*
this, tofType, Canonical, Kind);
6686 Types.push_back(tot);
6710 llvm_unreachable(
"Unknown value kind");
6725 }
else if (!UnderlyingType.
isNull()) {
6728 llvm::FoldingSetNodeID ID;
6729 DependentDecltypeType::Profile(ID, *
this, E);
6731 void *InsertPos =
nullptr;
6732 if (DependentDecltypeType *Canon =
6733 DependentDecltypeTypes.FindNodeOrInsertPos(ID, InsertPos))
6738 new (*
this,
alignof(DependentDecltypeType)) DependentDecltypeType(E);
6739 DependentDecltypeTypes.InsertNode(DT, InsertPos);
6740 Types.push_back(DT);
6743 auto *DT =
new (*
this,
alignof(DecltypeType))
6744 DecltypeType(E, UnderlyingType, CanonType);
6745 Types.push_back(DT);
6750 bool FullySubstituted,
6754 if (FullySubstituted && Index) {
6757 llvm::FoldingSetNodeID ID;
6758 PackIndexingType::Profile(ID, *
this, Pattern.
getCanonicalType(), IndexExpr,
6759 FullySubstituted, Expansions);
6760 void *InsertPos =
nullptr;
6761 PackIndexingType *Canon =
6762 DependentPackIndexingTypes.FindNodeOrInsertPos(ID, InsertPos);
6765 PackIndexingType::totalSizeToAlloc<QualType>(Expansions.size()),
6769 IndexExpr, FullySubstituted, Expansions);
6770 DependentPackIndexingTypes.InsertNode(Canon, InsertPos);
6776 Allocate(PackIndexingType::totalSizeToAlloc<QualType>(Expansions.size()),
6778 auto *
T =
new (Mem) PackIndexingType(Canonical, Pattern, IndexExpr,
6779 FullySubstituted, Expansions);
6788 UnaryTransformType::UTTKind Kind)
const {
6790 llvm::FoldingSetNodeID ID;
6791 UnaryTransformType::Profile(ID, BaseType, UnderlyingType, Kind);
6793 void *InsertPos =
nullptr;
6794 if (UnaryTransformType *UT =
6795 UnaryTransformTypes.FindNodeOrInsertPos(ID, InsertPos))
6799 if (!BaseType->isDependentType()) {
6802 assert(UnderlyingType.
isNull() || BaseType == UnderlyingType);
6805 BaseType != CanonBase) {
6810 [[maybe_unused]] UnaryTransformType *UT =
6811 UnaryTransformTypes.FindNodeOrInsertPos(ID, InsertPos);
6812 assert(!UT &&
"broken canonicalization");
6816 auto *UT =
new (*
this,
alignof(UnaryTransformType))
6817 UnaryTransformType(BaseType, UnderlyingType, Kind, CanonType);
6818 UnaryTransformTypes.InsertNode(UT, InsertPos);
6819 Types.push_back(UT);
6823QualType ASTContext::getAutoTypeInternal(
6828 !TypeConstraintConcept && !IsDependent)
6832 llvm::FoldingSetNodeID ID;
6833 bool IsDeducedDependent =
6834 isa_and_nonnull<TemplateTemplateParmDecl>(TypeConstraintConcept) ||
6836 AutoType::Profile(ID, *
this, DeducedType,
Keyword,
6837 IsDependent || IsDeducedDependent, TypeConstraintConcept,
6838 TypeConstraintArgs);
6839 if (
auto const AT_iter = AutoTypes.find(ID); AT_iter != AutoTypes.end())
6840 return QualType(AT_iter->getSecond(), 0);
6844 if (!DeducedType.
isNull()) {
6846 }
else if (TypeConstraintConcept) {
6847 bool AnyNonCanonArgs =
false;
6848 auto *CanonicalConcept =
6851 *
this, TypeConstraintArgs, AnyNonCanonArgs);
6852 if (CanonicalConcept != TypeConstraintConcept || AnyNonCanonArgs) {
6854 CanonicalConcept, CanonicalConceptArgs,
6860 void *Mem =
Allocate(
sizeof(AutoType) +
6861 sizeof(TemplateArgument) * TypeConstraintArgs.size(),
6863 auto *AT =
new (Mem) AutoType(
6865 (IsDependent ? TypeDependence::DependentInstantiation
6866 : TypeDependence::None) |
6867 (IsPack ? TypeDependence::UnexpandedPack : TypeDependence::None),
6868 Canon, TypeConstraintConcept, TypeConstraintArgs);
6870 llvm::FoldingSetNodeID InsertedID;
6871 AT->Profile(InsertedID, *
this);
6872 assert(InsertedID == ID &&
"ID does not match");
6874 Types.push_back(AT);
6875 AutoTypes.try_emplace(ID, AT);
6876 return QualType(AT, 0);
6884 bool IsDependent,
bool IsPack,
6887 assert((!IsPack || IsDependent) &&
"only use IsPack for a dependent pack");
6888 assert((!IsDependent || DeducedType.
isNull()) &&
6889 "A dependent auto should be undeduced");
6890 return getAutoTypeInternal(DeducedType,
Keyword, IsDependent, IsPack,
6891 TypeConstraintConcept, TypeConstraintArgs);
6895 QualType CanonT =
T.getNonPackExpansionType().getCanonicalType();
6898 if (
auto *AT = CanonT->
getAs<AutoType>()) {
6899 if (!AT->isConstrained())
6903 AT->containsUnexpandedParameterPack()),
6915QualType ASTContext::getDeducedTemplateSpecializationTypeInternal(
6917 bool IsDependent,
QualType Canon)
const {
6919 void *InsertPos =
nullptr;
6920 llvm::FoldingSetNodeID ID;
6921 DeducedTemplateSpecializationType::Profile(ID,
Keyword,
Template, DeducedType,
6923 if (DeducedTemplateSpecializationType *DTST =
6924 DeducedTemplateSpecializationTypes.FindNodeOrInsertPos(ID, InsertPos))
6927 auto *DTST =
new (*
this,
alignof(DeducedTemplateSpecializationType))
6929 IsDependent, Canon);
6932 llvm::FoldingSetNodeID TempID;
6933 DTST->Profile(TempID);
6934 assert(ID == TempID &&
"ID does not match");
6936 Types.push_back(DTST);
6937 DeducedTemplateSpecializationTypes.InsertNode(DTST, InsertPos);
6946 bool IsDependent)
const {
6953 ? getDeducedTemplateSpecializationTypeInternal(
6957 return getDeducedTemplateSpecializationTypeInternal(
6966 llvm::FoldingSetNodeID ID;
6969 void *InsertPos =
nullptr;
6970 if (
AtomicType *AT = AtomicTypes.FindNodeOrInsertPos(ID, InsertPos))
6976 if (!
T.isCanonical()) {
6980 AtomicType *NewIP = AtomicTypes.FindNodeOrInsertPos(ID, InsertPos);
6981 assert(!NewIP &&
"Shouldn't be in the map!"); (void)NewIP;
6984 Types.push_back(
New);
6985 AtomicTypes.InsertNode(
New, InsertPos);
7016 return getFromTargetType(Target->getSizeType());
7035 return getFromTargetType(Target->getUnsignedPtrDiffType(
LangAS::Default));
7040 return getFromTargetType(Target->getIntMaxType());
7045 return getFromTargetType(Target->getUIntMaxType());
7063 return getFromTargetType(Target->getIntPtrType());
7073 return getFromTargetType(Target->getProcessIDType());
7085 const Type *Ty =
T.getTypePtr();
7113 quals = splitType.
Quals;
7118 QualType elementType = AT->getElementType();
7123 if (elementType == unqualElementType) {
7124 assert(quals.
empty());
7125 quals = splitType.
Quals;
7133 if (
const auto *CAT = dyn_cast<ConstantArrayType>(AT)) {
7135 CAT->getSizeExpr(), CAT->getSizeModifier(), 0);
7138 if (
const auto *IAT = dyn_cast<IncompleteArrayType>(AT)) {
7142 if (
const auto *VAT = dyn_cast<VariableArrayType>(AT)) {
7144 VAT->getSizeModifier(),
7145 VAT->getIndexTypeCVRQualifiers());
7150 DSAT->getSizeModifier(), 0);
7160 bool AllowPiMismatch)
const {
7175 if (
auto *CAT1 = dyn_cast<ConstantArrayType>(AT1)) {
7176 auto *CAT2 = dyn_cast<ConstantArrayType>(AT2);
7177 if (!((CAT2 && CAT1->getSize() == CAT2->getSize()) ||
7190 T1 = AT1->getElementType();
7191 T2 = AT2->getElementType();
7211 bool AllowPiMismatch)
const {
7216 if (T1PtrType && T2PtrType) {
7224 T1MPType && T2MPType) {
7225 if (
auto *RD1 = T1MPType->getMostRecentCXXRecordDecl(),
7226 *RD2 = T2MPType->getMostRecentCXXRecordDecl();
7227 RD1 != RD2 && RD1->getCanonicalDecl() != RD2->getCanonicalDecl())
7229 if (T1MPType->getQualifier().getCanonical() !=
7230 T2MPType->getQualifier().getCanonical())
7240 if (T1OPType && T2OPType) {
7272 if (Quals1 != Quals2)
7342 llvm_unreachable(
"bad template name kind!");
7348 if (!TP->hasDefaultArgument())
7350 return &TP->getDefaultArgument().getArgument();
7353 case NamedDecl::TemplateTypeParm:
7355 case NamedDecl::NonTypeTemplateParm:
7357 case NamedDecl::TemplateTemplateParm:
7360 llvm_unreachable(
"Unexpected template parameter kind");
7365 bool IgnoreDeduced)
const {
7366 while (std::optional<TemplateName> UnderlyingOrNone =
7368 Name = *UnderlyingOrNone;
7373 if (
auto *TTP = dyn_cast<TemplateTemplateParmDecl>(
Template))
7382 llvm_unreachable(
"cannot canonicalize unresolved template");
7386 assert(DTN &&
"Non-dependent template names must refer to template decls.");
7405 assert(IgnoreDeduced ==
false);
7412 bool NonCanonical = CanonUnderlying != Underlying;
7418 assert(CanonArgs.size() <= Params.size());
7424 for (
int I = CanonArgs.size() - 1; I >= 0; --I) {
7433 if (I ==
int(CanonArgs.size() - 1))
7434 CanonArgs.pop_back();
7435 NonCanonical =
true;
7445 llvm_unreachable(
"always sugar node");
7448 llvm_unreachable(
"bad template name!");
7453 bool IgnoreDeduced)
const {
7474 llvm::FoldingSetNodeID XCEID, YCEID;
7475 XCE->
Profile(XCEID, *
this,
true,
true);
7476 YCE->
Profile(YCEID, *
this,
true,
true);
7477 return XCEID == YCEID;
7526 if (
auto *TX = dyn_cast<TemplateTypeParmDecl>(
X)) {
7528 if (TX->isParameterPack() != TY->isParameterPack())
7530 if (TX->hasTypeConstraint() != TY->hasTypeConstraint())
7533 TY->getTypeConstraint());
7536 if (
auto *TX = dyn_cast<NonTypeTemplateParmDecl>(
X)) {
7538 return TX->isParameterPack() == TY->isParameterPack() &&
7539 TX->getASTContext().hasSameType(TX->getType(), TY->getType()) &&
7541 TY->getPlaceholderTypeConstraint());
7546 return TX->isParameterPack() == TY->isParameterPack() &&
7548 TY->getTemplateParameters());
7553 if (
X->size() != Y->
size())
7556 for (
unsigned I = 0, N =
X->size(); I != N; ++I)
7570 if (
auto *TTPX = dyn_cast<TemplateTypeParmDecl>(
X)) {
7572 if (!TTPX->hasDefaultArgument() || !TTPY->hasDefaultArgument())
7575 return hasSameType(TTPX->getDefaultArgument().getArgument().getAsType(),
7576 TTPY->getDefaultArgument().getArgument().getAsType());
7579 if (
auto *NTTPX = dyn_cast<NonTypeTemplateParmDecl>(
X)) {
7581 if (!NTTPX->hasDefaultArgument() || !NTTPY->hasDefaultArgument())
7584 Expr *DefaultArgumentX =
7585 NTTPX->getDefaultArgument().getArgument().getAsExpr()->
IgnoreImpCasts();
7586 Expr *DefaultArgumentY =
7587 NTTPY->getDefaultArgument().getArgument().getAsExpr()->
IgnoreImpCasts();
7588 llvm::FoldingSetNodeID XID, YID;
7589 DefaultArgumentX->
Profile(XID, *
this,
true);
7590 DefaultArgumentY->
Profile(YID, *
this,
true);
7597 if (!TTPX->hasDefaultArgument() || !TTPY->hasDefaultArgument())
7612 auto Kind =
X.getKind();
7620 auto [NamespaceX, PrefixX] =
X.getAsNamespaceAndPrefix();
7623 NamespaceY->getNamespace()))
7628 const auto *TX =
X.getAsType(), *TY = Y.
getAsType();
7629 if (TX->getCanonicalTypeInternal() != TY->getCanonicalTypeInternal())
7638 llvm_unreachable(
"unhandled qualifier kind");
7644 if (A->
hasAttr<CUDADeviceAttr>() != B->
hasAttr<CUDADeviceAttr>())
7646 if (A->
hasAttr<CUDADeviceAttr>() && B->
hasAttr<CUDADeviceAttr>())
7658 llvm::FoldingSetNodeID Cand1ID, Cand2ID;
7662 for (
auto Pair : zip_longest(AEnableIfAttrs, BEnableIfAttrs)) {
7663 std::optional<EnableIfAttr *> Cand1A = std::get<0>(Pair);
7664 std::optional<EnableIfAttr *> Cand2A = std::get<1>(Pair);
7667 if (!Cand1A || !Cand2A)
7673 (*Cand1A)->getCond()->Profile(Cand1ID, A->
getASTContext(),
true);
7674 (*Cand2A)->getCond()->Profile(Cand2ID, B->
getASTContext(),
true);
7678 if (Cand1ID != Cand2ID)
7712 if (
const auto *TypedefX = dyn_cast<TypedefNameDecl>(
X))
7713 if (
const auto *TypedefY = dyn_cast<TypedefNameDecl>(Y))
7715 TypedefY->getUnderlyingType());
7732 if (
const auto *TagX = dyn_cast<TagDecl>(
X)) {
7734 return (TagX->getTagKind() == TagY->getTagKind()) ||
7746 if (
const auto *FuncX = dyn_cast<FunctionDecl>(
X)) {
7748 if (
const auto *CtorX = dyn_cast<CXXConstructorDecl>(
X)) {
7750 if (CtorX->getInheritedConstructor() &&
7751 !
isSameEntity(CtorX->getInheritedConstructor().getConstructor(),
7752 CtorY->getInheritedConstructor().getConstructor()))
7756 if (FuncX->isMultiVersion() != FuncY->isMultiVersion())
7761 if (FuncX->isMultiVersion()) {
7762 const auto *TAX = FuncX->getAttr<TargetAttr>();
7763 const auto *TAY = FuncY->getAttr<TargetAttr>();
7764 assert(TAX && TAY &&
"Multiversion Function without target attribute");
7766 if (TAX->getFeaturesStr() != TAY->getFeaturesStr())
7772 if ((FuncX->isMemberLikeConstrainedFriend() ||
7773 FuncY->isMemberLikeConstrainedFriend()) &&
7774 !FuncX->getLexicalDeclContext()->Equals(
7775 FuncY->getLexicalDeclContext())) {
7780 FuncY->getTrailingRequiresClause()))
7788 FD = FD->getCanonicalDecl();
7789 return FD->getTypeSourceInfo() ? FD->getTypeSourceInfo()->getType()
7792 QualType XT = GetTypeAsWritten(FuncX), YT = GetTypeAsWritten(FuncY);
7807 return FuncX->getLinkageInternal() == FuncY->getLinkageInternal() &&
7812 if (
const auto *VarX = dyn_cast<VarDecl>(
X)) {
7814 if (VarX->getLinkageInternal() == VarY->getLinkageInternal()) {
7817 if (VarX->getType().isNull() || VarY->getType().isNull())
7820 if (
hasSameType(VarX->getType(), VarY->getType()))
7830 if (!VarXTy || !VarYTy)
7839 if (
const auto *NamespaceX = dyn_cast<NamespaceDecl>(
X)) {
7841 return NamespaceX->isInline() == NamespaceY->isInline();
7846 if (
const auto *TemplateX = dyn_cast<TemplateDecl>(
X)) {
7850 if (
const auto *ConceptX = dyn_cast<ConceptDecl>(
X)) {
7853 ConceptY->getConstraintExpr()))
7858 TemplateY->getTemplatedDecl()) &&
7860 TemplateY->getTemplateParameters());
7864 if (
const auto *FDX = dyn_cast<FieldDecl>(
X)) {
7867 return hasSameType(FDX->getType(), FDY->getType());
7871 if (
const auto *IFDX = dyn_cast<IndirectFieldDecl>(
X)) {
7873 return IFDX->getAnonField()->getCanonicalDecl() ==
7874 IFDY->getAnonField()->getCanonicalDecl();
7883 if (
const auto *USX = dyn_cast<UsingShadowDecl>(
X)) {
7890 if (
const auto *UX = dyn_cast<UsingDecl>(
X)) {
7893 UX->hasTypename() == UY->hasTypename() &&
7894 UX->isAccessDeclaration() == UY->isAccessDeclaration();
7896 if (
const auto *UX = dyn_cast<UnresolvedUsingValueDecl>(
X)) {
7899 UX->isAccessDeclaration() == UY->isAccessDeclaration();
7901 if (
const auto *UX = dyn_cast<UnresolvedUsingTypenameDecl>(
X)) {
7909 if (
const auto *UX = dyn_cast<UsingPackDecl>(
X)) {
7911 UX->getInstantiatedFromUsingDecl(),
7916 if (
const auto *NAX = dyn_cast<NamespaceAliasDecl>(
X)) {
7918 return NAX->getNamespace()->Equals(NAY->getNamespace());
7966 bool AnyNonCanonArgs =
false;
7969 if (!AnyNonCanonArgs)
7979 llvm_unreachable(
"Unhandled template argument kind");
7989 llvm_unreachable(
"Comparing NULL template argument");
8014 llvm::FoldingSetNodeID ID1, ID2;
8024 return isSameTemplateArgument(Arg1, Arg2);
8028 llvm_unreachable(
"Unhandled template argument kind");
8033 if (!
T.hasLocalQualifiers()) {
8035 if (
const auto *AT = dyn_cast<ArrayType>(
T))
8055 const auto *ATy = dyn_cast<ArrayType>(split.
Ty);
8056 if (!ATy || qs.
empty())
8063 if (
const auto *CAT = dyn_cast<ConstantArrayType>(ATy))
8066 CAT->getSizeModifier(),
8067 CAT->getIndexTypeCVRQualifiers()));
8068 if (
const auto *IAT = dyn_cast<IncompleteArrayType>(ATy))
8070 IAT->getSizeModifier(),
8071 IAT->getIndexTypeCVRQualifiers()));
8073 if (
const auto *DSAT = dyn_cast<DependentSizedArrayType>(ATy))
8075 NewEltTy, DSAT->getSizeExpr(), DSAT->getSizeModifier(),
8076 DSAT->getIndexTypeCVRQualifiers()));
8081 VAT->getIndexTypeCVRQualifiers()));
8087 if (
T->isArrayType() ||
T->isFunctionType())
8095 return T.getUnqualifiedType();
8106 if (
T->isArrayType() ||
T->isFunctionType())
8108 return T.getUnqualifiedType();
8123 assert(PrettyArrayType &&
"Not an array type!");
8160 uint64_t ElementCount = 1;
8163 CA = dyn_cast_or_null<ConstantArrayType>(
8166 return ElementCount;
8174 uint64_t ElementCount = 1;
8178 AILE = dyn_cast<ArrayInitLoopExpr>(AILE->
getSubExpr());
8181 return ElementCount;
8191 default: llvm_unreachable(
"getFloatingRank(): not a floating type");
8193 case BuiltinType::Half:
return HalfRank;
8194 case BuiltinType::Float:
return FloatRank;
8227unsigned ASTContext::getIntegerRank(
const Type *
T)
const {
8228 assert(
T->isCanonicalUnqualified() &&
"T should be canonicalized");
8232 if (
const auto *EIT = dyn_cast<BitIntType>(
T))
8233 return 0 + (EIT->getNumBits() << 3);
8236 default: llvm_unreachable(
"getIntegerRank(): not a built-in integer");
8237 case BuiltinType::Bool:
8239 case BuiltinType::Char_S:
8240 case BuiltinType::Char_U:
8241 case BuiltinType::SChar:
8242 case BuiltinType::UChar:
8244 case BuiltinType::Short:
8245 case BuiltinType::UShort:
8247 case BuiltinType::Int:
8248 case BuiltinType::UInt:
8250 case BuiltinType::Long:
8251 case BuiltinType::ULong:
8253 case BuiltinType::LongLong:
8254 case BuiltinType::ULongLong:
8256 case BuiltinType::Int128:
8257 case BuiltinType::UInt128:
8262 case BuiltinType::Char8:
8264 case BuiltinType::Char16:
8265 return getIntegerRank(
8267 case BuiltinType::Char32:
8268 return getIntegerRank(
8270 case BuiltinType::WChar_S:
8271 case BuiltinType::WChar_U:
8272 return getIntegerRank(
8302 uint64_t BitWidth = Field->getBitWidthValue();
8328 if (BitWidth < IntSize)
8331 if (BitWidth == IntSize)
8346 assert(!Promotable.
isNull());
8349 return ED->getPromotionType();
8358 if (BT->getKind() == BuiltinType::WChar_S ||
8359 BT->getKind() == BuiltinType::WChar_U ||
8360 BT->getKind() == BuiltinType::Char8 ||
8361 BT->getKind() == BuiltinType::Char16 ||
8362 BT->getKind() == BuiltinType::Char32) {
8363 bool FromIsSigned = BT->getKind() == BuiltinType::WChar_S;
8367 for (
const auto &PT : PromoteTypes) {
8369 if (FromSize < ToSize ||
8370 (FromSize == ToSize && FromIsSigned == PT->isSignedIntegerType()))
8373 llvm_unreachable(
"char type should fit into long long");
8380 uint64_t PromotableSize =
getIntWidth(Promotable);
8389 while (!
T.isNull()) {
8391 return T.getObjCLifetime();
8392 if (
T->isArrayType())
8395 T = PT->getPointeeType();
8397 T = RT->getPointeeType();
8422 if (
const auto *ET = dyn_cast<EnumType>(LHSC))
8424 if (
const auto *ET = dyn_cast<EnumType>(RHSC))
8427 if (LHSC == RHSC)
return 0;
8432 unsigned LHSRank = getIntegerRank(LHSC);
8433 unsigned RHSRank = getIntegerRank(RHSC);
8435 if (LHSUnsigned == RHSUnsigned) {
8436 if (LHSRank == RHSRank)
return 0;
8437 return LHSRank > RHSRank ? 1 : -1;
8443 if (LHSRank >= RHSRank)
8453 if (RHSRank >= LHSRank)
8463 if (CFConstantStringTypeDecl)
8464 return CFConstantStringTypeDecl;
8466 assert(!CFConstantStringTagDecl &&
8467 "tag and typedef should be initialized together");
8469 CFConstantStringTagDecl->startDefinition();
8507 if (
static_cast<unsigned>(CFRuntime) <
8510 Fields[Count++] = {
IntTy,
"flags" };
8512 Fields[Count++] = {
LongTy,
"length" };
8516 Fields[Count++] = { getFromTargetType(Target->getUInt64Type()),
"_swift_rc" };
8520 Fields[Count++] = {
IntTy,
"_ptr" };
8526 for (
unsigned i = 0; i < Count; ++i) {
8530 Fields[i].Type,
nullptr,
8533 CFConstantStringTagDecl->addDecl(Field);
8536 CFConstantStringTagDecl->completeDefinition();
8540 CFConstantStringTypeDecl =
8543 return CFConstantStringTypeDecl;
8547 if (!CFConstantStringTagDecl)
8549 return CFConstantStringTagDecl;
8559 if (ObjCSuperType.isNull()) {
8564 return ObjCSuperType;
8570 CFConstantStringTagDecl = TT->castAsRecordDecl();
8574 if (BlockDescriptorType)
8587 static const char *
const FieldNames[] = {
8592 for (
size_t i = 0; i < 2; ++i) {
8595 &
Idents.get(FieldNames[i]), FieldTypes[i],
nullptr,
8603 BlockDescriptorType = RD;
8609 if (BlockDescriptorExtendedType)
8624 static const char *
const FieldNames[] = {
8631 for (
size_t i = 0; i < 4; ++i) {
8634 &
Idents.get(FieldNames[i]), FieldTypes[i],
nullptr,
8643 BlockDescriptorExtendedType = RD;
8648 const auto *BT = dyn_cast<BuiltinType>(
T);
8657 switch (BT->getKind()) {
8658#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
8659 case BuiltinType::Id: \
8661#include "clang/Basic/OpenCLImageTypes.def"
8663 case BuiltinType::OCLClkEvent:
8666 case BuiltinType::OCLEvent:
8669 case BuiltinType::OCLQueue:
8672 case BuiltinType::OCLReserveID:
8675 case BuiltinType::OCLSampler:
8694 if (!copyExpr && record->hasTrivialDestructor())
return false;
8725 llvm_unreachable(
"impossible");
8727 llvm_unreachable(
"fell out of lifetime switch!");
8735 bool &HasByrefExtendedLayout)
const {
8740 HasByrefExtendedLayout =
false;
8742 HasByrefExtendedLayout =
true;
8756 assert(Target &&
"Expected target to be initialized");
8757 const llvm::Triple &
T = Target->getTriple();
8759 if (
T.isOSWindows() &&
T.isArch64Bit())
8765 assert(Target &&
"Expected target to be initialized");
8766 const llvm::Triple &
T = Target->getTriple();
8768 if (
T.isOSWindows() &&
T.isArch64Bit())
8774 if (!ObjCInstanceTypeDecl)
8775 ObjCInstanceTypeDecl =
8777 return ObjCInstanceTypeDecl;
8783 if (
const auto *TT = dyn_cast<TypedefType>(
T))
8785 return II->isStr(
"BOOL");
8793 if (!
type->isIncompleteArrayType() &&
type->isIncompleteType())
8802 else if (
type->isArrayType())
8821 if (
First->isInlineSpecified() || !
First->isStaticDataMember())
8828 !D->isInlineSpecified() && (D->isConstexpr() ||
First->isConstexpr()))
8859 for (
auto *PI :
Decl->parameters()) {
8864 assert(sz.
isPositive() &&
"BlockExpr - Incomplete param type");
8873 ParmOffset = PtrSize;
8874 for (
auto *PVDecl :
Decl->parameters()) {
8875 QualType PType = PVDecl->getOriginalType();
8876 if (
const auto *AT =
8881 PType = PVDecl->getType();
8883 PType = PVDecl->getType();
8903 for (
auto *PI :
Decl->parameters()) {
8910 "getObjCEncodingForFunctionDecl - Incomplete param type");
8917 for (
auto *PVDecl :
Decl->parameters()) {
8918 QualType PType = PVDecl->getOriginalType();
8919 if (
const auto *AT =
8924 PType = PVDecl->getType();
8926 PType = PVDecl->getType();
8940 bool Extended)
const {
8944 ObjCEncOptions Options = ObjCEncOptions()
8945 .setExpandPointedToStructures()
8946 .setExpandStructures()
8947 .setIsOutermostType();
8949 Options.setEncodeBlockParameters().setEncodeClassNames();
8950 getObjCEncodingForTypeImpl(
T, S, Options,
nullptr);
8956 bool Extended)
const {
8961 Decl->getReturnType(), S, Extended);
8970 E =
Decl->sel_param_end(); PI != E; ++PI) {
8977 "getObjCEncodingForMethodDecl - Incomplete param type");
8985 ParmOffset = 2 * PtrSize;
8987 E =
Decl->sel_param_end(); PI != E; ++PI) {
8990 if (
const auto *AT =
8999 PType, S, Extended);
9010 const Decl *Container)
const {
9013 if (
const auto *CID = dyn_cast<ObjCCategoryImplDecl>(Container)) {
9014 for (
auto *PID : CID->property_impls())
9015 if (PID->getPropertyDecl() == PD)
9019 for (
auto *PID : OID->property_impls())
9020 if (PID->getPropertyDecl() == PD)
9054 const Decl *Container)
const {
9056 bool Dynamic =
false;
9064 SynthesizePID = PropertyImpDecl;
9068 std::string S =
"T";
9113 if (SynthesizePID) {
9130 if (BT->getKind() == BuiltinType::ULong &&
getIntWidth(PointeeTy) == 32)
9133 if (BT->getKind() == BuiltinType::Long &&
getIntWidth(PointeeTy) == 32)
9146 getObjCEncodingForTypeImpl(
T, S,
9148 .setExpandPointedToStructures()
9149 .setExpandStructures()
9150 .setIsOutermostType(),
9151 Field, NotEncodedT);
9155 std::string& S)
const {
9159 getObjCEncodingForTypeImpl(
T, S,
9161 .setExpandPointedToStructures()
9162 .setExpandStructures()
9163 .setIsOutermostType()
9164 .setEncodingProperty(),
9172 case BuiltinType::Void:
return 'v';
9173 case BuiltinType::Bool:
return 'B';
9174 case BuiltinType::Char8:
9175 case BuiltinType::Char_U:
9176 case BuiltinType::UChar:
return 'C';
9177 case BuiltinType::Char16:
9178 case BuiltinType::UShort:
return 'S';
9179 case BuiltinType::Char32:
9180 case BuiltinType::UInt:
return 'I';
9181 case BuiltinType::ULong:
9182 return C->getTargetInfo().getLongWidth() == 32 ?
'L' :
'Q';
9183 case BuiltinType::UInt128:
return 'T';
9184 case BuiltinType::ULongLong:
return 'Q';
9185 case BuiltinType::Char_S:
9186 case BuiltinType::SChar:
return 'c';
9187 case BuiltinType::Short:
return 's';
9188 case BuiltinType::WChar_S:
9189 case BuiltinType::WChar_U:
9190 case BuiltinType::Int:
return 'i';
9191 case BuiltinType::Long:
9192 return C->getTargetInfo().getLongWidth() == 32 ?
'l' :
'q';
9193 case BuiltinType::LongLong:
return 'q';
9194 case BuiltinType::Int128:
return 't';
9195 case BuiltinType::Float:
return 'f';
9196 case BuiltinType::Double:
return 'd';
9197 case BuiltinType::LongDouble:
return 'D';
9198 case BuiltinType::NullPtr:
return '*';
9200 case BuiltinType::BFloat16:
9201 case BuiltinType::Float16:
9202 case BuiltinType::Float128:
9203 case BuiltinType::Ibm128:
9204 case BuiltinType::Half:
9205 case BuiltinType::ShortAccum:
9206 case BuiltinType::Accum:
9207 case BuiltinType::LongAccum:
9208 case BuiltinType::UShortAccum:
9209 case BuiltinType::UAccum:
9210 case BuiltinType::ULongAccum:
9211 case BuiltinType::ShortFract:
9212 case BuiltinType::Fract:
9213 case BuiltinType::LongFract:
9214 case BuiltinType::UShortFract:
9215 case BuiltinType::UFract:
9216 case BuiltinType::ULongFract:
9217 case BuiltinType::SatShortAccum:
9218 case BuiltinType::SatAccum:
9219 case BuiltinType::SatLongAccum:
9220 case BuiltinType::SatUShortAccum:
9221 case BuiltinType::SatUAccum:
9222 case BuiltinType::SatULongAccum:
9223 case BuiltinType::SatShortFract:
9224 case BuiltinType::SatFract:
9225 case BuiltinType::SatLongFract:
9226 case BuiltinType::SatUShortFract:
9227 case BuiltinType::SatUFract:
9228 case BuiltinType::SatULongFract:
9232#define SVE_TYPE(Name, Id, SingletonId) \
9233 case BuiltinType::Id:
9234#include "clang/Basic/AArch64ACLETypes.def"
9235#define RVV_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
9236#include "clang/Basic/RISCVVTypes.def"
9237#define WASM_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
9238#include "clang/Basic/WebAssemblyReferenceTypes.def"
9239#define AMDGPU_TYPE(Name, Id, SingletonId, Width, Align) case BuiltinType::Id:
9240#include "clang/Basic/AMDGPUTypes.def"
9244 "cannot yet @encode type %0");
9249 case BuiltinType::ObjCId:
9250 case BuiltinType::ObjCClass:
9251 case BuiltinType::ObjCSel:
9252 llvm_unreachable(
"@encoding ObjC primitive type");
9255#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
9256 case BuiltinType::Id:
9257#include "clang/Basic/OpenCLImageTypes.def"
9258#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
9259 case BuiltinType::Id:
9260#include "clang/Basic/OpenCLExtensionTypes.def"
9261 case BuiltinType::OCLEvent:
9262 case BuiltinType::OCLClkEvent:
9263 case BuiltinType::OCLQueue:
9264 case BuiltinType::OCLReserveID:
9265 case BuiltinType::OCLSampler:
9266 case BuiltinType::Dependent:
9267#define PPC_VECTOR_TYPE(Name, Id, Size) \
9268 case BuiltinType::Id:
9269#include "clang/Basic/PPCTypes.def"
9270#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
9271#include "clang/Basic/HLSLIntangibleTypes.def"
9272#define BUILTIN_TYPE(KIND, ID)
9273#define PLACEHOLDER_TYPE(KIND, ID) \
9274 case BuiltinType::KIND:
9275#include "clang/AST/BuiltinTypes.def"
9276 llvm_unreachable(
"invalid builtin type for @encode");
9278 llvm_unreachable(
"invalid BuiltinType::Kind value");
9285 if (!
Enum->isFixed())
9295 assert(FD->
isBitField() &&
"not a bitfield - getObjCEncodingForTypeImpl");
9315 if (
const auto *IVD = dyn_cast<ObjCIvarDecl>(FD)) {
9323 S += llvm::utostr(Offset);
9325 if (
const auto *ET =
T->getAsCanonical<EnumType>())
9338 bool VisitBasesAndFields) {
9339 T =
T->getBaseElementTypeUnsafe();
9343 PT->getPointeeType().getTypePtr(),
false);
9345 auto *CXXRD =
T->getAsCXXRecordDecl();
9353 if (!CXXRD->hasDefinition() || !VisitBasesAndFields)
9356 for (
const auto &B : CXXRD->bases())
9361 for (
auto *FD : CXXRD->fields())
9370void ASTContext::getObjCEncodingForTypeImpl(QualType
T, std::string &S,
9371 const ObjCEncOptions Options,
9372 const FieldDecl *FD,
9373 QualType *NotEncodedT)
const {
9375 switch (CT->getTypeClass()) {
9380 if (
const auto *BT = dyn_cast<BuiltinType>(CT))
9388 getObjCEncodingForTypeImpl(
T->
castAs<ComplexType>()->getElementType(), S,
9395 getObjCEncodingForTypeImpl(
T->
castAs<AtomicType>()->getValueType(), S,
9402 case Type::LValueReference:
9403 case Type::RValueReference: {
9406 const auto *PT =
T->
castAs<PointerType>();
9407 if (PT->isObjCSelType()) {
9416 bool isReadOnly =
false;
9421 if (
T->
getAs<TypedefType>()) {
9422 if (Options.IsOutermostType() &&
T.isConstQualified()) {
9426 }
else if (Options.IsOutermostType()) {
9427 QualType P = PointeeTy;
9428 while (
auto PT = P->
getAs<PointerType>())
9439 if (StringRef(S).ends_with(
"nr"))
9440 S.replace(S.end()-2, S.end(),
"rn");
9450 }
else if (
const auto *RTy = PointeeTy->
getAsCanonical<RecordType>()) {
9451 const IdentifierInfo *II = RTy->getOriginalDecl()->getIdentifier();
9453 if (II == &
Idents.get(
"objc_class")) {
9458 if (II == &
Idents.get(
"objc_object")) {
9467 RTy, Options.ExpandPointedToStructures()))) {
9476 ObjCEncOptions NewOptions;
9477 if (Options.ExpandPointedToStructures())
9478 NewOptions.setExpandStructures();
9479 getObjCEncodingForTypeImpl(PointeeTy, S, NewOptions,
9480 nullptr, NotEncodedT);
9484 case Type::ConstantArray:
9485 case Type::IncompleteArray:
9486 case Type::VariableArray: {
9493 getObjCEncodingForTypeImpl(
9494 AT->getElementType(), S,
9495 Options.keepingOnly(ObjCEncOptions().setExpandStructures()), FD);
9499 if (
const auto *CAT = dyn_cast<ConstantArrayType>(AT))
9500 S += llvm::utostr(CAT->getZExtSize());
9504 "Unknown array type!");
9508 getObjCEncodingForTypeImpl(
9509 AT->getElementType(), S,
9510 Options.keepingOnly(ObjCEncOptions().setExpandStructures()), FD,
9517 case Type::FunctionNoProto:
9518 case Type::FunctionProto:
9522 case Type::Record: {
9524 S += RDecl->
isUnion() ?
'(' :
'{';
9528 if (
const auto *Spec = dyn_cast<ClassTemplateSpecializationDecl>(RDecl)) {
9529 const TemplateArgumentList &TemplateArgs = Spec->getTemplateArgs();
9530 llvm::raw_string_ostream
OS(S);
9531 printTemplateArgumentList(OS, TemplateArgs.
asArray(),
9537 if (Options.ExpandStructures()) {
9540 getObjCEncodingForStructureImpl(RDecl, S, FD,
true, NotEncodedT);
9542 for (
const auto *Field : RDecl->
fields()) {
9545 S +=
Field->getNameAsString();
9550 if (
Field->isBitField()) {
9551 getObjCEncodingForTypeImpl(
Field->getType(), S,
9552 ObjCEncOptions().setExpandStructures(),
9555 QualType qt =
Field->getType();
9557 getObjCEncodingForTypeImpl(
9559 ObjCEncOptions().setExpandStructures().setIsStructField(), FD,
9565 S += RDecl->
isUnion() ?
')' :
'}';
9569 case Type::BlockPointer: {
9570 const auto *BT =
T->
castAs<BlockPointerType>();
9572 if (Options.EncodeBlockParameters()) {
9573 const auto *FT = BT->getPointeeType()->castAs<FunctionType>();
9577 getObjCEncodingForTypeImpl(FT->getReturnType(), S,
9578 Options.forComponentType(), FD, NotEncodedT);
9582 if (
const auto *FPT = dyn_cast<FunctionProtoType>(FT)) {
9583 for (
const auto &I : FPT->param_types())
9584 getObjCEncodingForTypeImpl(I, S, Options.forComponentType(), FD,
9592 case Type::ObjCObject: {
9596 S +=
"{objc_object=}";
9600 S +=
"{objc_class=}";
9607 case Type::ObjCInterface: {
9610 ObjCInterfaceDecl *OI =
T->
castAs<ObjCObjectType>()->getInterface();
9613 if (Options.ExpandStructures()) {
9615 SmallVector<const ObjCIvarDecl*, 32> Ivars;
9617 for (
unsigned i = 0, e = Ivars.size(); i != e; ++i) {
9618 const FieldDecl *
Field = Ivars[i];
9619 if (
Field->isBitField())
9620 getObjCEncodingForTypeImpl(
Field->getType(), S,
9621 ObjCEncOptions().setExpandStructures(),
9624 getObjCEncodingForTypeImpl(
Field->getType(), S,
9625 ObjCEncOptions().setExpandStructures(), FD,
9633 case Type::ObjCObjectPointer: {
9634 const auto *OPT =
T->
castAs<ObjCObjectPointerType>();
9635 if (OPT->isObjCIdType()) {
9640 if (OPT->isObjCClassType() || OPT->isObjCQualifiedClassType()) {
9648 if (OPT->isObjCQualifiedIdType()) {
9649 getObjCEncodingForTypeImpl(
9651 Options.keepingOnly(ObjCEncOptions()
9652 .setExpandPointedToStructures()
9653 .setExpandStructures()),
9655 if (FD || Options.EncodingProperty() || Options.EncodeClassNames()) {
9659 for (
const auto *I : OPT->quals()) {
9661 S += I->getObjCRuntimeNameAsString();
9670 if (OPT->getInterfaceDecl() &&
9671 (FD || Options.EncodingProperty() || Options.EncodeClassNames())) {
9673 S += OPT->getInterfaceDecl()->getObjCRuntimeNameAsString();
9674 for (
const auto *I : OPT->quals()) {
9676 S += I->getObjCRuntimeNameAsString();
9686 case Type::MemberPointer:
9690 case Type::ExtVector:
9696 case Type::ConstantMatrix:
9709 case Type::DeducedTemplateSpecialization:
9712 case Type::HLSLAttributedResource:
9713 case Type::HLSLInlineSpirv:
9714 llvm_unreachable(
"unexpected type");
9716 case Type::ArrayParameter:
9718#define ABSTRACT_TYPE(KIND, BASE)
9719#define TYPE(KIND, BASE)
9720#define DEPENDENT_TYPE(KIND, BASE) \
9722#define NON_CANONICAL_TYPE(KIND, BASE) \
9724#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(KIND, BASE) \
9726#include "clang/AST/TypeNodes.inc"
9727 llvm_unreachable(
"@encode for dependent type!");
9729 llvm_unreachable(
"bad type kind!");
9732void ASTContext::getObjCEncodingForStructureImpl(RecordDecl *RDecl,
9734 const FieldDecl *FD,
9736 QualType *NotEncodedT)
const {
9737 assert(RDecl &&
"Expected non-null RecordDecl");
9738 assert(!RDecl->
isUnion() &&
"Should not be called for unions");
9742 const auto *CXXRec = dyn_cast<CXXRecordDecl>(RDecl);
9743 std::multimap<uint64_t, NamedDecl *> FieldOrBaseOffsets;
9747 for (
const auto &BI : CXXRec->bases()) {
9748 if (!BI.isVirtual()) {
9753 FieldOrBaseOffsets.insert(FieldOrBaseOffsets.upper_bound(offs),
9754 std::make_pair(offs, base));
9759 for (FieldDecl *Field : RDecl->
fields()) {
9760 if (!
Field->isZeroLengthBitField() &&
Field->isZeroSize(*
this))
9763 FieldOrBaseOffsets.insert(FieldOrBaseOffsets.upper_bound(offs),
9764 std::make_pair(offs, Field));
9767 if (CXXRec && includeVBases) {
9768 for (
const auto &BI : CXXRec->vbases()) {
9774 FieldOrBaseOffsets.find(offs) == FieldOrBaseOffsets.end())
9775 FieldOrBaseOffsets.insert(FieldOrBaseOffsets.end(),
9776 std::make_pair(offs, base));
9790 std::multimap<uint64_t, NamedDecl *>::iterator
9791 CurLayObj = FieldOrBaseOffsets.begin();
9793 if (CXXRec && CXXRec->isDynamicClass() &&
9794 (CurLayObj == FieldOrBaseOffsets.end() || CurLayObj->first != 0)) {
9797 std::string recname = CXXRec->getNameAsString();
9798 if (recname.empty()) recname =
"?";
9811 FieldOrBaseOffsets.insert(FieldOrBaseOffsets.upper_bound(offs),
9812 std::make_pair(offs,
nullptr));
9815 for (; CurLayObj != FieldOrBaseOffsets.end(); ++CurLayObj) {
9817 assert(CurOffs <= CurLayObj->first);
9818 if (CurOffs < CurLayObj->first) {
9819 uint64_t padding = CurLayObj->first - CurOffs;
9831 NamedDecl *dcl = CurLayObj->second;
9835 if (
auto *base = dyn_cast<CXXRecordDecl>(dcl)) {
9840 getObjCEncodingForStructureImpl(base, S, FD,
false,
9850 S += field->getNameAsString();
9854 if (field->isBitField()) {
9857 CurOffs += field->getBitWidthValue();
9860 QualType qt = field->getType();
9862 getObjCEncodingForTypeImpl(
9863 qt, S, ObjCEncOptions().setExpandStructures().setIsStructField(),
9874 std::string& S)
const {
9907 if (!ObjCClassDecl) {
9912 return ObjCClassDecl;
9916 if (!ObjCProtocolClassDecl) {
9917 ObjCProtocolClassDecl
9926 return ObjCProtocolClassDecl;
9947 QualType T = Context->getPointerType(Context->CharTy);
9948 return Context->buildImplicitTypedef(
T, Name);
9961 QualType T = Context->getPointerType(Context->VoidTy);
9962 return Context->buildImplicitTypedef(
T,
"__builtin_va_list");
9969 if (Context->getLangOpts().CPlusPlus) {
9974 &Context->Idents.get(
"std"),
9982 const size_t NumFields = 5;
9984 const char *FieldNames[NumFields];
9987 FieldTypes[0] = Context->getPointerType(Context->VoidTy);
9988 FieldNames[0] =
"__stack";
9991 FieldTypes[1] = Context->getPointerType(Context->VoidTy);
9992 FieldNames[1] =
"__gr_top";
9995 FieldTypes[2] = Context->getPointerType(Context->VoidTy);
9996 FieldNames[2] =
"__vr_top";
9999 FieldTypes[3] = Context->IntTy;
10000 FieldNames[3] =
"__gr_offs";
10003 FieldTypes[4] = Context->IntTy;
10004 FieldNames[4] =
"__vr_offs";
10007 for (
unsigned i = 0; i < NumFields; ++i) {
10012 &Context->Idents.get(FieldNames[i]),
10013 FieldTypes[i],
nullptr,
10025 return Context->buildImplicitTypedef(VaListTagType,
"__builtin_va_list");
10032 VaListTagDecl = Context->buildImplicitRecord(
"__va_list_tag");
10035 const size_t NumFields = 5;
10037 const char *FieldNames[NumFields];
10040 FieldTypes[0] = Context->UnsignedCharTy;
10041 FieldNames[0] =
"gpr";
10044 FieldTypes[1] = Context->UnsignedCharTy;
10045 FieldNames[1] =
"fpr";
10048 FieldTypes[2] = Context->UnsignedShortTy;
10049 FieldNames[2] =
"reserved";
10052 FieldTypes[3] = Context->getPointerType(Context->VoidTy);
10053 FieldNames[3] =
"overflow_arg_area";
10056 FieldTypes[4] = Context->getPointerType(Context->VoidTy);
10057 FieldNames[4] =
"reg_save_area";
10060 for (
unsigned i = 0; i < NumFields; ++i) {
10064 &Context->Idents.get(FieldNames[i]),
10065 FieldTypes[i],
nullptr,
10078 Context->buildImplicitTypedef(VaListTagType,
"__va_list_tag");
10082 std::nullopt, VaListTagTypedefDecl);
10085 llvm::APInt Size(Context->getTypeSize(Context->getSizeType()), 1);
10086 QualType VaListTagArrayType = Context->getConstantArrayType(
10088 return Context->buildImplicitTypedef(VaListTagArrayType,
"__builtin_va_list");
10091static TypedefDecl *
10095 VaListTagDecl = Context->buildImplicitRecord(
"__va_list_tag");
10098 const size_t NumFields = 4;
10100 const char *FieldNames[NumFields];
10103 FieldTypes[0] = Context->UnsignedIntTy;
10104 FieldNames[0] =
"gp_offset";
10107 FieldTypes[1] = Context->UnsignedIntTy;
10108 FieldNames[1] =
"fp_offset";
10111 FieldTypes[2] = Context->getPointerType(Context->VoidTy);
10112 FieldNames[2] =
"overflow_arg_area";
10115 FieldTypes[3] = Context->getPointerType(Context->VoidTy);
10116 FieldNames[3] =
"reg_save_area";
10119 for (
unsigned i = 0; i < NumFields; ++i) {
10124 &Context->Idents.get(FieldNames[i]),
10125 FieldTypes[i],
nullptr,
10139 llvm::APInt Size(Context->getTypeSize(Context->getSizeType()), 1);
10140 QualType VaListTagArrayType = Context->getConstantArrayType(
10142 return Context->buildImplicitTypedef(VaListTagArrayType,
"__builtin_va_list");
10145static TypedefDecl *
10148 RecordDecl *VaListDecl = Context->buildImplicitRecord(
"__va_list");
10149 if (Context->getLangOpts().CPlusPlus) {
10168 &Context->Idents.get(
"__ap"),
10169 Context->getPointerType(Context->VoidTy),
10179 Context->VaListTagDecl = VaListDecl;
10182 CanQualType T = Context->getCanonicalTagType(VaListDecl);
10183 return Context->buildImplicitTypedef(
T,
"__builtin_va_list");
10186static TypedefDecl *
10190 VaListTagDecl = Context->buildImplicitRecord(
"__va_list_tag");
10193 const size_t NumFields = 4;
10195 const char *FieldNames[NumFields];
10198 FieldTypes[0] = Context->LongTy;
10199 FieldNames[0] =
"__gpr";
10202 FieldTypes[1] = Context->LongTy;
10203 FieldNames[1] =
"__fpr";
10206 FieldTypes[2] = Context->getPointerType(Context->VoidTy);
10207 FieldNames[2] =
"__overflow_arg_area";
10210 FieldTypes[3] = Context->getPointerType(Context->VoidTy);
10211 FieldNames[3] =
"__reg_save_area";
10214 for (
unsigned i = 0; i < NumFields; ++i) {
10219 &Context->Idents.get(FieldNames[i]),
10220 FieldTypes[i],
nullptr,
10234 llvm::APInt Size(Context->getTypeSize(Context->getSizeType()), 1);
10235 QualType VaListTagArrayType = Context->getConstantArrayType(
10238 return Context->buildImplicitTypedef(VaListTagArrayType,
"__builtin_va_list");
10244 VaListTagDecl = Context->buildImplicitRecord(
"__va_list_tag");
10247 const size_t NumFields = 3;
10249 const char *FieldNames[NumFields];
10252 FieldTypes[0] = Context->getPointerType(Context->VoidTy);
10253 FieldNames[0] =
"__current_saved_reg_area_pointer";
10256 FieldTypes[1] = Context->getPointerType(Context->VoidTy);
10257 FieldNames[1] =
"__saved_reg_area_end_pointer";
10260 FieldTypes[2] = Context->getPointerType(Context->VoidTy);
10261 FieldNames[2] =
"__overflow_area_pointer";
10264 for (
unsigned i = 0; i < NumFields; ++i) {
10267 SourceLocation(), &Context->Idents.get(FieldNames[i]), FieldTypes[i],
10280 Context->buildImplicitTypedef(VaListTagType,
"__va_list_tag");
10284 std::nullopt, VaListTagTypedefDecl);
10287 llvm::APInt Size(Context->getTypeSize(Context->getSizeType()), 1);
10288 QualType VaListTagArrayType = Context->getConstantArrayType(
10291 return Context->buildImplicitTypedef(VaListTagArrayType,
"__builtin_va_list");
10294static TypedefDecl *
10304 constexpr size_t NumFields = 3;
10305 QualType FieldTypes[NumFields] = {Context->getPointerType(Context->IntTy),
10306 Context->getPointerType(Context->IntTy),
10308 const char *FieldNames[NumFields] = {
"__va_stk",
"__va_reg",
"__va_ndx"};
10311 for (
unsigned i = 0; i < NumFields; ++i) {
10314 &Context->Idents.get(FieldNames[i]), FieldTypes[i],
nullptr,
10326 Context->buildImplicitTypedef(VaListTagType,
"__builtin_va_list");
10328 return VaListTagTypedefDecl;
10354 llvm_unreachable(
"Unhandled __builtin_va_list type kind");
10358 if (!BuiltinVaListDecl) {
10359 BuiltinVaListDecl =
CreateVaListDecl(
this, Target->getBuiltinVaListKind());
10360 assert(BuiltinVaListDecl->isImplicit());
10363 return BuiltinVaListDecl;
10376 if (!BuiltinMSVaListDecl)
10379 return BuiltinMSVaListDecl;
10396 assert(ObjCConstantStringType.isNull() &&
10397 "'NSConstantString' type already set!");
10407 unsigned size = End - Begin;
10408 assert(size > 1 &&
"set is not overloaded!");
10414 NamedDecl **Storage = OT->getStorage();
10437 bool TemplateKeyword,
10442 if (
Template.getAsTemplateDecl()->getKind() == Decl::TemplateTemplateParm) {
10443 assert(!Qualifier &&
"unexpected qualified template template parameter");
10444 assert(TemplateKeyword ==
false);
10449 llvm::FoldingSetNodeID ID;
10452 void *InsertPos =
nullptr;
10454 QualifiedTemplateNames.FindNodeOrInsertPos(ID, InsertPos);
10458 QualifiedTemplateNames.InsertNode(QTN, InsertPos);
10468 llvm::FoldingSetNodeID ID;
10471 void *InsertPos =
nullptr;
10473 DependentTemplateNames.FindNodeOrInsertPos(ID, InsertPos))
10478 DependentTemplateNames.InsertNode(QTN, InsertPos);
10483 Decl *AssociatedDecl,
10486 bool Final)
const {
10487 llvm::FoldingSetNodeID ID;
10489 Index, PackIndex, Final);
10491 void *insertPos =
nullptr;
10493 = SubstTemplateTemplateParms.FindNodeOrInsertPos(ID, insertPos);
10497 Replacement, AssociatedDecl, Index, PackIndex, Final);
10498 SubstTemplateTemplateParms.InsertNode(subst, insertPos);
10506 Decl *AssociatedDecl,
10507 unsigned Index,
bool Final)
const {
10509 llvm::FoldingSetNodeID ID;
10511 AssociatedDecl, Index, Final);
10513 void *InsertPos =
nullptr;
10515 = SubstTemplateTemplateParmPacks.FindNodeOrInsertPos(ID, InsertPos);
10520 SubstTemplateTemplateParmPacks.InsertNode(Subst, InsertPos);
10534 llvm::FoldingSetNodeID ID;
10537 void *InsertPos =
nullptr;
10539 DeducedTemplates.FindNodeOrInsertPos(ID, InsertPos);
10545 DeducedTemplates.InsertNode(DTS, InsertPos);
10568 llvm_unreachable(
"Unhandled TargetInfo::IntType value");
10598 while (
const auto *AT = dyn_cast<ArrayType>(CT))
10599 CT = AT->getElementType();
10631 assert(FirstVec->
isVectorType() &&
"FirstVec should be a vector type");
10632 assert(SecondVec->
isVectorType() &&
"SecondVec should be a vector type");
10669 auto VScale = Context.getTargetInfo().getVScaleRange(
10676 uint64_t EltSize = Context.getTypeSize(Info.
ElementType);
10680 uint64_t MinElts = Info.
EC.getKnownMinValue();
10681 return VScale->first * MinElts * EltSize;
10689 "Expected RVV builtin type and vector type!");
10729 return IsValidCast(FirstType, SecondType) ||
10730 IsValidCast(SecondType, FirstType);
10738 "Expected RVV builtin type and vector type!");
10745 if (!BT->isRVVVLSBuiltinType())
10765 return VecTy->getElementType().getCanonicalType()->isIntegerType() &&
10772 return IsLaxCompatible(FirstType, SecondType) ||
10773 IsLaxCompatible(SecondType, FirstType);
10779 if (
const AttributedType *
Attr = dyn_cast<AttributedType>(Ty)) {
10780 if (
Attr->getAttrKind() == attr::ObjCOwnership)
10783 Ty =
Attr->getModifiedType();
10787 Ty =
Paren->getInnerType();
10819 for (
auto *lhsProto : lhs->
quals()) {
10820 bool match =
false;
10821 for (
auto *rhsProto : rhs->
quals()) {
10852 for (
auto *I : lhs->
quals()) {
10856 if (!rhsID->ClassImplementsProtocol(I,
true))
10864 for (
auto *lhsProto : lhs->
quals()) {
10865 bool match =
false;
10870 for (
auto *rhsProto : rhs->
quals()) {
10880 for (
auto *I : lhs->
quals()) {
10884 if (rhsID->ClassImplementsProtocol(I,
true)) {
10901 for (
auto *lhsProto : lhs->
quals()) {
10902 bool match =
false;
10909 for (
auto *rhsProto : rhs->
quals()) {
10928 if (LHSInheritedProtocols.empty() && lhs->
qual_empty())
10930 for (
auto *lhsProto : LHSInheritedProtocols) {
10931 bool match =
false;
10932 for (
auto *rhsProto : rhs->
quals()) {
10957 if (LHS->isObjCUnqualifiedId() || RHS->isObjCUnqualifiedId())
10962 auto finish = [&](
bool succeeded) ->
bool {
10966 if (!RHS->isKindOfType())
10977 if (LHS->isObjCQualifiedId() || RHS->isObjCQualifiedId()) {
10982 if (LHS->isObjCQualifiedClass() && RHS->isObjCQualifiedClass()) {
10987 if (LHS->isObjCClass() && RHS->isObjCClass()) {
10992 if (LHS->getInterface() && RHS->getInterface()) {
11007 bool BlockReturnType) {
11011 auto finish = [&](
bool succeeded) ->
bool {
11036 if (
getLangOpts().CompatibilityQualifiedIdBlockParamTypeChecking)
11040 (!BlockReturnType &&
11044 (BlockReturnType ? LHSOPT : RHSOPT),
11045 (BlockReturnType ? RHSOPT : LHSOPT),
false));
11053 return finish(BlockReturnType);
11055 return finish(!BlockReturnType);
11067 return (*lhs)->getName().compare((*rhs)->getName());
11084 assert(LHS->getInterface() &&
"LHS must have an interface base");
11085 assert(RHS->getInterface() &&
"RHS must have an interface base");
11091 for (
auto *proto : LHS->quals()) {
11092 Context.CollectInheritedProtocols(proto, LHSProtocolSet);
11096 Context.CollectInheritedProtocols(LHS->getInterface(), LHSProtocolSet);
11102 for (
auto *proto : RHS->quals()) {
11103 Context.CollectInheritedProtocols(proto, RHSProtocolSet);
11107 Context.CollectInheritedProtocols(RHS->getInterface(), RHSProtocolSet);
11110 for (
auto *proto : LHSProtocolSet) {
11111 if (RHSProtocolSet.count(proto))
11112 IntersectionSet.push_back(proto);
11118 Context.CollectInheritedProtocols(CommonBase, ImpliedProtocols);
11121 if (!ImpliedProtocols.empty()) {
11123 return ImpliedProtocols.contains(proto);
11128 llvm::array_pod_sort(IntersectionSet.begin(), IntersectionSet.end(),
11138 if (lhsOPT && rhsOPT)
11144 if (lhsBlock && rhsBlock)
11149 if ((lhsOPT && lhsOPT->isObjCIdType() && rhsBlock) ||
11161 bool stripKindOf) {
11162 if (lhsArgs.size() != rhsArgs.size())
11169 for (
unsigned i = 0, n = lhsArgs.size(); i != n; ++i) {
11175 if (!stripKindOf ||
11176 !ctx.
hasSameType(lhsArgs[i].stripObjCKindOfType(ctx),
11177 rhsArgs[i].stripObjCKindOfType(ctx))) {
11205 if (!LDecl || !RDecl)
11211 bool anyKindOf = LHS->isKindOfType() || RHS->isKindOfType();
11215 llvm::SmallDenseMap<const ObjCInterfaceDecl *, const ObjCObjectType *, 4>
11220 LHSAncestors[LHS->getInterface()->getCanonicalDecl()] = LHS;
11225 bool anyChanges =
false;
11226 if (LHS->isSpecialized() && RHS->isSpecialized()) {
11229 LHS->getTypeArgs(), RHS->getTypeArgs(),
11232 }
else if (LHS->isSpecialized() != RHS->isSpecialized()) {
11243 if (!Protocols.empty())
11249 if (anyChanges || LHS->isKindOfType() != anyKindOf) {
11252 anyKindOf || LHS->isKindOfType());
11260 QualType LHSSuperType = LHS->getSuperClassType();
11261 if (LHSSuperType.
isNull())
11270 auto KnownLHS = LHSAncestors.find(RHS->getInterface()->getCanonicalDecl());
11271 if (KnownLHS != LHSAncestors.end()) {
11272 LHS = KnownLHS->second;
11276 bool anyChanges =
false;
11277 if (LHS->isSpecialized() && RHS->isSpecialized()) {
11280 LHS->getTypeArgs(), RHS->getTypeArgs(),
11283 }
else if (LHS->isSpecialized() != RHS->isSpecialized()) {
11294 if (!Protocols.empty())
11299 if (anyChanges || RHS->isKindOfType() != anyKindOf) {
11302 anyKindOf || RHS->isKindOfType());
11310 QualType RHSSuperType = RHS->getSuperClassType();
11311 if (RHSSuperType.
isNull())
11322 assert(LHS->getInterface() &&
"LHS is not an interface type");
11323 assert(RHS->getInterface() &&
"RHS is not an interface type");
11328 bool IsSuperClass = LHSInterface->
isSuperClassOf(RHS->getInterface());
11335 if (LHS->getNumProtocols() > 0) {
11344 for (
auto *RHSPI : RHS->quals())
11347 if (SuperClassInheritedProtocols.empty())
11350 for (
const auto *LHSProto : LHS->quals()) {
11351 bool SuperImplementsProtocol =
false;
11352 for (
auto *SuperClassProto : SuperClassInheritedProtocols)
11353 if (SuperClassProto->lookupProtocolNamed(LHSProto->getIdentifier())) {
11354 SuperImplementsProtocol =
true;
11357 if (!SuperImplementsProtocol)
11363 if (LHS->isSpecialized()) {
11368 RHSSuper = RHSSuper->getSuperClassType()->castAs<
ObjCObjectType>();
11371 if (RHSSuper->isSpecialized() &&
11373 LHS->getTypeArgs(), RHSSuper->getTypeArgs(),
11387 if (!LHSOPT || !RHSOPT)
11405 bool CompareUnqualified) {
11424 bool OfBlockPointer,
11426 if (
const RecordType *UT =
T->getAsUnionType()) {
11428 if (UD->
hasAttr<TransparentUnionAttr>()) {
11429 for (
const auto *I : UD->
fields()) {
11430 QualType ET = I->getType().getUnqualifiedType();
11444 bool OfBlockPointer,
11465 bool IsConditionalOperator) {
11468 const auto *lproto = dyn_cast<FunctionProtoType>(lbase);
11469 const auto *rproto = dyn_cast<FunctionProtoType>(rbase);
11470 bool allLTypes =
true;
11471 bool allRTypes =
true;
11475 if (OfBlockPointer) {
11477 QualType LHS = lbase->getReturnType();
11479 if (!UnqualifiedResult)
11481 retType =
mergeTypes(LHS, RHS,
true, UnqualifiedResult,
true);
11546 bool NoReturn = IsConditionalOperator
11556 std::optional<FunctionEffectSet> MergedFX;
11558 if (lproto && rproto) {
11559 assert((AllowCXX ||
11560 (!lproto->hasExceptionSpec() && !rproto->hasExceptionSpec())) &&
11561 "C++ shouldn't be here");
11563 if (lproto->getNumParams() != rproto->getNumParams())
11567 if (lproto->isVariadic() != rproto->isVariadic())
11570 if (lproto->getMethodQuals() != rproto->getMethodQuals())
11574 if (lproto->getExtraAttributeInfo().CFISalt !=
11575 rproto->getExtraAttributeInfo().CFISalt)
11581 if (LHSFX != RHSFX) {
11582 if (IsConditionalOperator)
11591 if (*MergedFX != LHSFX)
11593 if (*MergedFX != RHSFX)
11598 bool canUseLeft, canUseRight;
11610 for (
unsigned i = 0, n = lproto->getNumParams(); i < n; i++) {
11611 QualType lParamType = lproto->getParamType(i).getUnqualifiedType();
11612 QualType rParamType = rproto->getParamType(i).getUnqualifiedType();
11614 lParamType, rParamType, OfBlockPointer,
Unqualified);
11621 types.push_back(paramType);
11633 if (allLTypes)
return lhs;
11634 if (allRTypes)
return rhs;
11639 newParamInfos.empty() ?
nullptr : newParamInfos.data();
11645 if (lproto) allRTypes =
false;
11646 if (rproto) allLTypes =
false;
11650 assert((AllowCXX || !proto->
hasExceptionSpec()) &&
"C++ shouldn't be here");
11658 for (
unsigned i = 0, n = proto->
getNumParams(); i < n; ++i) {
11664 paramTy = ED->getIntegerType();
11674 if (allLTypes)
return lhs;
11675 if (allRTypes)
return rhs;
11684 if (allLTypes)
return lhs;
11685 if (allRTypes)
return rhs;
11691 QualType other,
bool isBlockReturnType) {
11697 ET->getOriginalDecl()->getDefinitionOrSelf()->getIntegerType();
11698 if (underlyingType.
isNull())
11700 if (Context.hasSameType(underlyingType, other))
11706 Context.getTypeSize(underlyingType) == Context.getTypeSize(other))
11715 if (LangOpts.CPlusPlus || !LangOpts.C23)
11730 bool IsConditionalOperator) {
11741 if (LangOpts.OpenMP && LHSRefTy && RHSRefTy &&
11745 if (LHSRefTy || RHSRefTy)
11757 if (LHSCan == RHSCan)
11762 Qualifiers RQuals = RHSCan.getLocalQualifiers();
11763 if (LQuals != RQuals) {
11780 assert((GC_L != GC_R) &&
"unequal qualifier sets had only equal elements");
11801 if (LHSClass == Type::FunctionProto) LHSClass = Type::FunctionNoProto;
11802 if (RHSClass == Type::FunctionProto) RHSClass = Type::FunctionNoProto;
11805 if (LHSClass == Type::VariableArray || LHSClass == Type::IncompleteArray)
11806 LHSClass = Type::ConstantArray;
11807 if (RHSClass == Type::VariableArray || RHSClass == Type::IncompleteArray)
11808 RHSClass = Type::ConstantArray;
11811 if (LHSClass == Type::ObjCInterface) LHSClass = Type::ObjCObject;
11812 if (RHSClass == Type::ObjCInterface) RHSClass = Type::ObjCObject;
11815 if (LHSClass == Type::ExtVector) LHSClass = Type::Vector;
11816 if (RHSClass == Type::ExtVector) RHSClass = Type::Vector;
11819 if (LHSClass != RHSClass) {
11829 if (OfBlockPointer && !BlockReturnType) {
11837 if (
const auto *AT = LHS->
getAs<AutoType>()) {
11838 if (!AT->isDeduced() && AT->isGNUAutoType())
11841 if (
const auto *AT = RHS->
getAs<AutoType>()) {
11842 if (!AT->isDeduced() && AT->isGNUAutoType())
11849 switch (LHSClass) {
11850#define TYPE(Class, Base)
11851#define ABSTRACT_TYPE(Class, Base)
11852#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base) case Type::Class:
11853#define NON_CANONICAL_TYPE(Class, Base) case Type::Class:
11854#define DEPENDENT_TYPE(Class, Base) case Type::Class:
11855#include "clang/AST/TypeNodes.inc"
11856 llvm_unreachable(
"Non-canonical and dependent types shouldn't get here");
11859 case Type::DeducedTemplateSpecialization:
11860 case Type::LValueReference:
11861 case Type::RValueReference:
11862 case Type::MemberPointer:
11863 llvm_unreachable(
"C++ should never be in mergeTypes");
11865 case Type::ObjCInterface:
11866 case Type::IncompleteArray:
11867 case Type::VariableArray:
11868 case Type::FunctionProto:
11869 case Type::ExtVector:
11870 llvm_unreachable(
"Types are eliminated above");
11872 case Type::Pointer:
11883 if (ResultType.
isNull())
11891 case Type::BlockPointer:
11916 if (ResultType.
isNull())
11935 if (ResultType.
isNull())
11943 case Type::ConstantArray:
11958 if (ResultType.
isNull())
11966 if (LVAT || RVAT) {
11969 -> std::pair<bool,llvm::APInt> {
11971 std::optional<llvm::APSInt> TheInt;
11974 return std::make_pair(
true, *TheInt);
11975 return std::make_pair(
false, llvm::APSInt());
11978 return std::make_pair(
true, CAT->getSize());
11979 return std::make_pair(
false, llvm::APInt());
11982 bool HaveLSize, HaveRSize;
11983 llvm::APInt LSize, RSize;
11984 std::tie(HaveLSize, LSize) = SizeFetch(LVAT, LCAT);
11985 std::tie(HaveRSize, RSize) = SizeFetch(RVAT, RCAT);
11986 if (HaveLSize && HaveRSize && !llvm::APInt::isSameValue(LSize, RSize))
12020 case Type::FunctionNoProto:
12022 false, IsConditionalOperator);
12026 case Type::Builtin:
12029 case Type::Complex:
12038 case Type::ConstantMatrix:
12043 case Type::ObjCObject: {
12052 case Type::ObjCObjectPointer:
12053 if (OfBlockPointer) {
12065 assert(LHS != RHS &&
12066 "Equivalent pipe types should have already been handled!");
12068 case Type::ArrayParameter:
12069 assert(LHS != RHS &&
12070 "Equivalent ArrayParameter types should have already been handled!");
12072 case Type::BitInt: {
12080 if (LHSUnsigned != RHSUnsigned)
12083 if (LHSBits != RHSBits)
12087 case Type::HLSLAttributedResource: {
12088 const HLSLAttributedResourceType *LHSTy =
12089 LHS->
castAs<HLSLAttributedResourceType>();
12090 const HLSLAttributedResourceType *RHSTy =
12091 RHS->
castAs<HLSLAttributedResourceType>();
12092 assert(LHSTy->getWrappedType() == RHSTy->getWrappedType() &&
12093 LHSTy->getWrappedType()->isHLSLResourceType() &&
12094 "HLSLAttributedResourceType should always wrap __hlsl_resource_t");
12096 if (LHSTy->getAttrs() == RHSTy->getAttrs() &&
12097 LHSTy->getContainedType() == RHSTy->getContainedType())
12101 case Type::HLSLInlineSpirv:
12102 const HLSLInlineSpirvType *LHSTy = LHS->
castAs<HLSLInlineSpirvType>();
12103 const HLSLInlineSpirvType *RHSTy = RHS->
castAs<HLSLInlineSpirvType>();
12105 if (LHSTy->getOpcode() == RHSTy->getOpcode() &&
12106 LHSTy->getSize() == RHSTy->getSize() &&
12107 LHSTy->getAlignment() == RHSTy->getAlignment()) {
12108 for (
size_t I = 0; I < LHSTy->getOperands().size(); I++)
12109 if (LHSTy->getOperands()[I] != RHSTy->getOperands()[I])
12117 llvm_unreachable(
"Invalid Type::Class!");
12122 bool &CanUseFirst,
bool &CanUseSecond,
12124 assert(NewParamInfos.empty() &&
"param info list not empty");
12125 CanUseFirst = CanUseSecond =
true;
12131 if (!FirstHasInfo && !SecondHasInfo)
12134 bool NeedParamInfo =
false;
12138 for (
size_t I = 0; I < E; ++I) {
12149 bool FirstNoEscape = FirstParam.
isNoEscape();
12150 bool SecondNoEscape = SecondParam.
isNoEscape();
12151 bool IsNoEscape = FirstNoEscape && SecondNoEscape;
12153 if (NewParamInfos.back().getOpaqueValue())
12154 NeedParamInfo =
true;
12155 if (FirstNoEscape != IsNoEscape)
12156 CanUseFirst =
false;
12157 if (SecondNoEscape != IsNoEscape)
12158 CanUseSecond =
false;
12161 if (!NeedParamInfo)
12162 NewParamInfos.clear();
12168 if (
auto It = ObjCLayouts.find(D); It != ObjCLayouts.end()) {
12169 It->second =
nullptr;
12170 for (
auto *SubClass : ObjCSubClasses[D])
12182 if (LHSCan == RHSCan)
12184 if (RHSCan->isFunctionType()) {
12193 if (ResReturnType.
isNull())
12195 if (ResReturnType == NewReturnType || ResReturnType == OldReturnType) {
12212 Qualifiers RQuals = RHSCan.getLocalQualifiers();
12213 if (LQuals != RQuals) {
12226 assert((GC_L != GC_R) &&
"unequal qualifier sets had only equal elements");
12242 if (ResQT == LHSBaseQT)
12244 if (ResQT == RHSBaseQT)
12255 if (
const auto *ED =
T->getAsEnumDecl())
12256 T = ED->getIntegerType();
12257 if (
T->isBooleanType())
12260 return EIT->getNumBits();
12266 assert((
T->hasIntegerRepresentation() ||
T->isEnumeralType() ||
12267 T->isFixedPointType()) &&
12268 "Unexpected type");
12273 VTy->getNumElements(), VTy->getVectorKind());
12281 if (
const auto *ED =
T->getAsEnumDecl())
12282 T = ED->getIntegerType();
12285 case BuiltinType::Char_U:
12287 case BuiltinType::Char_S:
12288 case BuiltinType::SChar:
12289 case BuiltinType::Char8:
12291 case BuiltinType::Short:
12293 case BuiltinType::Int:
12295 case BuiltinType::Long:
12297 case BuiltinType::LongLong:
12299 case BuiltinType::Int128:
12304 case BuiltinType::WChar_S:
12307 case BuiltinType::ShortAccum:
12309 case BuiltinType::Accum:
12311 case BuiltinType::LongAccum:
12313 case BuiltinType::SatShortAccum:
12315 case BuiltinType::SatAccum:
12317 case BuiltinType::SatLongAccum:
12319 case BuiltinType::ShortFract:
12321 case BuiltinType::Fract:
12323 case BuiltinType::LongFract:
12325 case BuiltinType::SatShortFract:
12327 case BuiltinType::SatFract:
12329 case BuiltinType::SatLongFract:
12332 assert((
T->hasUnsignedIntegerRepresentation() ||
12333 T->isUnsignedFixedPointType()) &&
12334 "Unexpected signed integer or fixed point type");
12340 assert((
T->hasIntegerRepresentation() ||
T->isEnumeralType() ||
12341 T->isFixedPointType()) &&
12342 "Unexpected type");
12347 VTy->getNumElements(), VTy->getVectorKind());
12355 if (
const auto *ED =
T->getAsEnumDecl())
12356 T = ED->getIntegerType();
12359 case BuiltinType::Char_S:
12361 case BuiltinType::Char_U:
12362 case BuiltinType::UChar:
12363 case BuiltinType::Char8:
12365 case BuiltinType::UShort:
12367 case BuiltinType::UInt:
12369 case BuiltinType::ULong:
12371 case BuiltinType::ULongLong:
12373 case BuiltinType::UInt128:
12378 case BuiltinType::WChar_U:
12381 case BuiltinType::UShortAccum:
12383 case BuiltinType::UAccum:
12385 case BuiltinType::ULongAccum:
12387 case BuiltinType::SatUShortAccum:
12389 case BuiltinType::SatUAccum:
12391 case BuiltinType::SatULongAccum:
12393 case BuiltinType::UShortFract:
12395 case BuiltinType::UFract:
12397 case BuiltinType::ULongFract:
12399 case BuiltinType::SatUShortFract:
12401 case BuiltinType::SatUFract:
12403 case BuiltinType::SatULongFract:
12407 (
T->hasSignedIntegerRepresentation() ||
T->isSignedFixedPointType()) &&
12408 "Unexpected signed integer or fixed point type");
12433 bool AllowTypeModifiers) {
12437 RequiresICE =
false;
12442 bool IsSpecial =
false;
12446 default: Done =
true; --Str;
break;
12448 RequiresICE =
true;
12451 assert(!
Unsigned &&
"Can't use both 'S' and 'U' modifiers!");
12452 assert(!
Signed &&
"Can't use 'S' modifier multiple times!");
12456 assert(!
Signed &&
"Can't use both 'S' and 'U' modifiers!");
12457 assert(!
Unsigned &&
"Can't use 'U' modifier multiple times!");
12461 assert(!IsSpecial &&
"Can't use 'L' with 'W', 'N', 'Z' or 'O' modifiers");
12462 assert(HowLong <= 2 &&
"Can't have LLLL modifier");
12467 assert(!IsSpecial &&
"Can't use two 'N', 'W', 'Z' or 'O' modifiers!");
12468 assert(HowLong == 0 &&
"Can't use both 'L' and 'N' modifiers!");
12472 if (Context.getTargetInfo().getLongWidth() == 32)
12477 assert(!IsSpecial &&
"Can't use two 'N', 'W', 'Z' or 'O' modifiers!");
12478 assert(HowLong == 0 &&
"Can't use both 'L' and 'W' modifiers!");
12482 switch (Context.getTargetInfo().getInt64Type()) {
12484 llvm_unreachable(
"Unexpected integer type");
12495 assert(!IsSpecial &&
"Can't use two 'N', 'W', 'Z' or 'O' modifiers!");
12496 assert(HowLong == 0 &&
"Can't use both 'L' and 'Z' modifiers!");
12500 switch (Context.getTargetInfo().getIntTypeByWidth(32,
true)) {
12502 llvm_unreachable(
"Unexpected integer type");
12515 assert(!IsSpecial &&
"Can't use two 'N', 'W', 'Z' or 'O' modifiers!");
12516 assert(HowLong == 0 &&
"Can't use both 'L' and 'O' modifiers!");
12520 if (Context.getLangOpts().OpenCL)
12532 default: llvm_unreachable(
"Unknown builtin type letter!");
12535 "Bad modifiers used with 'x'!");
12536 Type = Context.Float16Ty;
12540 "Bad modifiers used with 'y'!");
12541 Type = Context.BFloat16Ty;
12545 "Bad modifiers used with 'v'!");
12546 Type = Context.VoidTy;
12550 "Bad modifiers used with 'h'!");
12551 Type = Context.HalfTy;
12555 "Bad modifiers used with 'f'!");
12556 Type = Context.FloatTy;
12560 "Bad modifiers used with 'd'!");
12562 Type = Context.LongDoubleTy;
12563 else if (HowLong == 2)
12564 Type = Context.Float128Ty;
12566 Type = Context.DoubleTy;
12569 assert(HowLong == 0 &&
"Bad modifiers used with 's'!");
12571 Type = Context.UnsignedShortTy;
12573 Type = Context.ShortTy;
12577 Type =
Unsigned ? Context.UnsignedInt128Ty : Context.Int128Ty;
12578 else if (HowLong == 2)
12579 Type =
Unsigned ? Context.UnsignedLongLongTy : Context.LongLongTy;
12580 else if (HowLong == 1)
12581 Type =
Unsigned ? Context.UnsignedLongTy : Context.LongTy;
12583 Type =
Unsigned ? Context.UnsignedIntTy : Context.IntTy;
12586 assert(HowLong == 0 &&
"Bad modifiers used with 'c'!");
12588 Type = Context.SignedCharTy;
12590 Type = Context.UnsignedCharTy;
12592 Type = Context.CharTy;
12595 assert(HowLong == 0 && !
Signed && !
Unsigned &&
"Bad modifiers for 'b'!");
12596 Type = Context.BoolTy;
12599 assert(HowLong == 0 && !
Signed && !
Unsigned &&
"Bad modifiers for 'z'!");
12600 Type = Context.getSizeType();
12603 assert(HowLong == 0 && !
Signed && !
Unsigned &&
"Bad modifiers for 'w'!");
12604 Type = Context.getWideCharType();
12607 Type = Context.getCFConstantStringType();
12610 Type = Context.getObjCIdType();
12613 Type = Context.getObjCSelType();
12616 Type = Context.getObjCSuperType();
12619 Type = Context.getBuiltinVaListType();
12620 assert(!
Type.isNull() &&
"builtin va list type not initialized!");
12631 Type = Context.getBuiltinVaListType();
12632 assert(!
Type.isNull() &&
"builtin va list type not initialized!");
12634 Type = Context.getArrayDecayedType(
Type);
12636 Type = Context.getLValueReferenceType(
Type);
12640 unsigned NumElements = strtoul(Str, &End, 10);
12641 assert(End != Str &&
"Missing vector size");
12645 RequiresICE,
false);
12646 assert(!RequiresICE &&
"Can't require vector ICE");
12648 Type = Context.getScalableVectorType(ElementType, NumElements);
12654 Type = Context.SveCountTy;
12658 Type = Context.AMDGPUBufferRsrcTy;
12662 llvm_unreachable(
"Unexpected target builtin type");
12668 unsigned NumElements = strtoul(Str, &End, 10);
12669 assert(End != Str &&
"Missing vector size");
12673 RequiresICE,
false);
12674 assert(!RequiresICE &&
"Can't require vector ICE");
12683 unsigned NumElements = strtoul(Str, &End, 10);
12684 assert(End != Str &&
"Missing vector size");
12690 Type = Context.getExtVectorType(ElementType, NumElements);
12696 assert(!RequiresICE &&
"Can't require complex ICE");
12697 Type = Context.getComplexType(ElementType);
12701 Type = Context.getPointerDiffType();
12704 Type = Context.getFILEType();
12705 if (
Type.isNull()) {
12712 Type = Context.getsigjmp_bufType();
12714 Type = Context.getjmp_bufType();
12716 if (
Type.isNull()) {
12722 assert(HowLong == 0 && !
Signed && !
Unsigned &&
"Bad modifiers for 'K'!");
12723 Type = Context.getucontext_tType();
12725 if (
Type.isNull()) {
12731 Type = Context.getProcessIDType();
12734 Type = Context.MFloat8Ty;
12739 Done = !AllowTypeModifiers;
12741 switch (
char c = *Str++) {
12742 default: Done =
true; --Str;
break;
12748 unsigned AddrSpace = strtoul(Str, &End, 10);
12751 Type = Context.getAddrSpaceQualType(
12753 Context.getLangASForBuiltinAddressSpace(AddrSpace));
12757 Type = Context.getPointerType(
Type);
12759 Type = Context.getLValueReferenceType(
Type);
12767 Type = Context.getVolatileType(
Type);
12776 "Integer constant 'I' type must be an integer");
12789 bool AllowTypeModifiers)
const {
12796 unsigned *IntegerConstantArgs)
const {
12797 const char *TypeStr =
BuiltinInfo.getTypeString(Id);
12798 if (TypeStr[0] ==
'\0') {
12805 bool RequiresICE =
false;
12808 RequiresICE,
true);
12812 assert(!RequiresICE &&
"Result of intrinsic cannot be required to be an ICE");
12814 while (TypeStr[0] && TypeStr[0] !=
'.') {
12821 if (RequiresICE && IntegerConstantArgs)
12822 *IntegerConstantArgs |= 1 << ArgTypes.size();
12828 ArgTypes.push_back(Ty);
12831 if (Id == Builtin::BI__GetExceptionInfo)
12834 assert((TypeStr[0] !=
'.' || TypeStr[1] == 0) &&
12835 "'.' should only occur at end of builtin type list!");
12837 bool Variadic = (TypeStr[0] ==
'.');
12844 if (ArgTypes.empty() && Variadic && !
getLangOpts().requiresStrictPrototypes())
12894 if ((!Context.getLangOpts().CPlusPlus &&
12895 !Context.getTargetInfo().getCXXABI().isMicrosoft() &&
12896 !FD->
hasAttr<DLLExportAttr>()) ||
12897 FD->
hasAttr<GNUInlineAttr>()) {
12915 if (Context.getTargetInfo().getCXXABI().isMicrosoft() &&
12930 if (D->
hasAttr<DLLImportAttr>()) {
12933 }
else if (D->
hasAttr<DLLExportAttr>()) {
12936 }
else if (Context.getLangOpts().CUDA && Context.getLangOpts().CUDAIsDevice) {
12939 if (D->
hasAttr<CUDAGlobalAttr>() &&
12948 if (Context.shouldExternalize(D))
12963 switch (Source->hasExternalDefinitions(D)) {
12990 if (Context.getLangOpts().CPlusPlus &&
12991 Context.getLangOpts().IncrementalExtensions &&
13007 if (!LexicalContext)
13012 auto StaticLocalLinkage =
13024 return StaticLocalLinkage;
13030 if (Context.isMSStaticDataMemberInlineDefinition(VD))
13036 switch (Context.getInlineVariableDefinitionKind(VD)) {
13051 return StrongLinkage;
13054 return Context.getTargetInfo().getCXXABI().isMicrosoft() &&
13069 llvm_unreachable(
"Invalid Linkage!");
13079 if (
const auto *VD = dyn_cast<VarDecl>(D)) {
13080 if (!VD->isFileVarDecl())
13085 if (VD->getDescribedVarTemplate() ||
13088 }
else if (
const auto *FD = dyn_cast<FunctionDecl>(D)) {
13114 if (D->
hasAttr<WeakRefAttr>())
13121 if (LangOpts.SYCLIsDevice)
13123 D->
hasAttr<SYCLExternalAttr>());
13129 if (
const auto *FD = dyn_cast<FunctionDecl>(D)) {
13131 if (!FD->doesThisDeclarationHaveABody())
13132 return FD->doesDeclarationForceExternallyVisibleDefinition();
13135 if (FD->
hasAttr<ConstructorAttr>() || FD->
hasAttr<DestructorAttr>())
13140 if (
getTargetInfo().getCXXABI().canKeyFunctionBeInline()) {
13141 if (
const auto *MD = dyn_cast<CXXMethodDecl>(FD)) {
13160 assert(VD->isFileVarDecl() &&
"Expected file scoped var");
13164 if (LangOpts.OpenMP &&
13165 OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(VD))
13172 if (VD->shouldEmitInExternalSource())
13185 if (VD->needsDestruction(*
this))
13189 if (VD->hasInitWithSideEffects())
13194 if (
const auto *DD = dyn_cast<DecompositionDecl>(VD)) {
13195 for (
const auto *BD : DD->flat_bindings())
13196 if (
const auto *BindingVD = BD->getHoldingVar())
13206 llvm::function_ref<
void(
FunctionDecl *)> Pred)
const {
13207 assert(FD->
isMultiVersion() &&
"Only valid for multiversioned functions");
13208 llvm::SmallDenseSet<const FunctionDecl*, 4> SeenDecls;
13213 for (
auto *CurDecl :
13217 SeenDecls.insert(CurFD).second) {
13224 bool IsCXXMethod)
const {
13227 return ABI->getDefaultMethodCallConv(IsVariadic);
13229 switch (LangOpts.getDefaultCallingConv()) {
13257 return Target->getDefaultCallingConv();
13262 return ABI->isNearlyEmpty(RD);
13267 auto ABI = Target->getCXXABI();
13268 if (ABI.isMicrosoft())
13271 auto ComponentLayout =
getLangOpts().RelativeCXXABIVTables
13277 return VTContext.get();
13283 switch (
T->getCXXABI().getKind()) {
13284 case TargetCXXABI::AppleARM64:
13285 case TargetCXXABI::Fuchsia:
13286 case TargetCXXABI::GenericAArch64:
13287 case TargetCXXABI::GenericItanium:
13288 case TargetCXXABI::GenericARM:
13289 case TargetCXXABI::GenericMIPS:
13290 case TargetCXXABI::iOS:
13291 case TargetCXXABI::WebAssembly:
13292 case TargetCXXABI::WatchOS:
13293 case TargetCXXABI::XL:
13295 case TargetCXXABI::Microsoft:
13298 llvm_unreachable(
"Unsupported ABI");
13302 assert(
T.getCXXABI().getKind() != TargetCXXABI::Microsoft &&
13303 "Device mangle context does not support Microsoft mangling.");
13304 switch (
T.getCXXABI().getKind()) {
13305 case TargetCXXABI::AppleARM64:
13306 case TargetCXXABI::Fuchsia:
13307 case TargetCXXABI::GenericAArch64:
13308 case TargetCXXABI::GenericItanium:
13309 case TargetCXXABI::GenericARM:
13310 case TargetCXXABI::GenericMIPS:
13311 case TargetCXXABI::iOS:
13312 case TargetCXXABI::WebAssembly:
13313 case TargetCXXABI::WatchOS:
13314 case TargetCXXABI::XL:
13318 if (
const auto *RD = dyn_cast<CXXRecordDecl>(ND))
13319 return RD->getDeviceLambdaManglingNumber();
13320 return std::nullopt;
13323 case TargetCXXABI::Microsoft:
13327 llvm_unreachable(
"Unsupported ABI");
13333 return ASTRecordLayouts.getMemorySize() +
13334 llvm::capacity_in_bytes(ObjCLayouts) +
13335 llvm::capacity_in_bytes(KeyFunctions) +
13336 llvm::capacity_in_bytes(ObjCImpls) +
13337 llvm::capacity_in_bytes(BlockVarCopyInits) +
13338 llvm::capacity_in_bytes(DeclAttrs) +
13339 llvm::capacity_in_bytes(TemplateOrInstantiation) +
13340 llvm::capacity_in_bytes(InstantiatedFromUsingDecl) +
13341 llvm::capacity_in_bytes(InstantiatedFromUsingShadowDecl) +
13342 llvm::capacity_in_bytes(InstantiatedFromUnnamedFieldDecl) +
13343 llvm::capacity_in_bytes(OverriddenMethods) +
13344 llvm::capacity_in_bytes(Types) +
13345 llvm::capacity_in_bytes(VariableArrayTypes);
13353 unsigned Signed)
const {
13356 if (!QualTy && DestWidth == 128)
13385 llvm_unreachable(
"Unhandled TargetInfo::RealType value");
13392 MangleNumbers[ND] = Number;
13395 Listener->AddedManglingNumber(ND, Number);
13399 bool ForAuxTarget)
const {
13400 auto I = MangleNumbers.find(ND);
13401 unsigned Res = I != MangleNumbers.end() ? I->second : 1;
13404 if (LangOpts.CUDA && !LangOpts.CUDAIsDevice) {
13405 Res = ForAuxTarget ? Res >> 16 : Res & 0xFFFF;
13407 assert(!ForAuxTarget &&
"Only CUDA/HIP host compilation supports mangling "
13408 "number for aux target");
13410 return Res > 1 ? Res : 1;
13417 StaticLocalNumbers[VD] = Number;
13420 Listener->AddedStaticLocalNumbers(VD, Number);
13424 auto I = StaticLocalNumbers.find(VD);
13425 return I != StaticLocalNumbers.end() ? I->second : 1;
13429 bool IsDestroying) {
13430 if (!IsDestroying) {
13442 bool IsTypeAware) {
13443 if (!IsTypeAware) {
13456 assert(LangOpts.CPlusPlus);
13457 std::unique_ptr<MangleNumberingContext> &MCtx = MangleNumberingContexts[DC];
13465 assert(LangOpts.CPlusPlus);
13466 std::unique_ptr<MangleNumberingContext> &MCtx =
13467 ExtraMangleNumberingContexts[D];
13473std::unique_ptr<MangleNumberingContext>
13475 return ABI->createMangleNumberingContext();
13480 return ABI->getCopyConstructorForExceptionObject(
13486 return ABI->addCopyConstructorForExceptionObject(
13493 return ABI->addTypedefNameForUnnamedTagDecl(TD, DD);
13498 return ABI->getTypedefNameForUnnamedTagDecl(TD);
13503 return ABI->addDeclaratorForUnnamedTagDecl(TD, DD);
13507 return ABI->getDeclaratorForUnnamedTagDecl(TD);
13511 ParamIndices[D] =
index;
13515 ParameterIndexTable::const_iterator I = ParamIndices.find(D);
13516 assert(I != ParamIndices.end() &&
13517 "ParmIndices lacks entry set by ParmVarDecl");
13522 unsigned Length)
const {
13548 assert(
MSGuidTagDecl &&
"building MS GUID without MS extensions?");
13550 llvm::FoldingSetNodeID ID;
13554 if (
MSGuidDecl *Existing = MSGuidDecls.FindNodeOrInsertPos(ID, InsertPos))
13558 MSGuidDecl *
New = MSGuidDecl::Create(*
this, GUIDType, Parts);
13559 MSGuidDecls.InsertNode(
New, InsertPos);
13565 const APValue &APVal)
const {
13566 llvm::FoldingSetNodeID ID;
13571 UnnamedGlobalConstantDecls.FindNodeOrInsertPos(ID, InsertPos))
13575 UnnamedGlobalConstantDecl::Create(*
this, Ty, APVal);
13576 UnnamedGlobalConstantDecls.InsertNode(
New, InsertPos);
13582 assert(
T->isRecordType() &&
"template param object of unexpected type");
13588 llvm::FoldingSetNodeID ID;
13593 TemplateParamObjectDecls.FindNodeOrInsertPos(ID, InsertPos))
13597 TemplateParamObjectDecls.InsertNode(
New, InsertPos);
13603 if (!
T.isOSDarwin())
13606 if (!(
T.isiOS() &&
T.isOSVersionLT(7)) &&
13607 !(
T.isMacOSX() &&
T.isOSVersionLT(10, 9)))
13616 return (Size != Align ||
toBits(sizeChars) > MaxInlineWidthInBits);
13623 if (MethodDecl->
hasAttr<UnavailableAttr>()
13624 || MethodDecl->
hasAttr<DeprecatedAttr>())
13638 IM != EM && IF != EF; ++IM, ++IF) {
13669 llvm::FoldingSetNodeID IDX, IDY;
13670 X->Profile(IDX, *
this,
true);
13671 Y->
Profile(IDY, *
this,
true);
13685 for (
const Decl *DX :
X->redecls()) {
13690 if (DX->isFirstDecl())
13693 llvm_unreachable(
"Corrupt redecls chain");
13696template <
class T, std::enable_if_t<std::is_base_of_v<Decl, T>,
bool> = true>
13698 return cast_or_null<T>(
13700 const_cast<Decl *
>(cast_or_null<Decl>(Y))));
13703template <
class T, std::enable_if_t<std::is_base_of_v<Decl, T>,
bool> = true>
13711 bool IgnoreDeduced =
false) {
13726 bool IgnoreDeduced) {
13734 assert(Xs.size() == Ys.size());
13736 for (
size_t I = 0; I < Rs.size(); ++I)
13743 return X->getAttributeLoc() == Y->getAttributeLoc() ?
X->getAttributeLoc()
13753 switch (
X.getKind()) {
13783 auto NExpX =
X.getNumTemplateExpansions();
13797 if (Xs.size() != Ys.size())
13799 R.resize(Xs.size());
13800 for (
size_t I = 0; I < R.size(); ++I) {
13813 assert(!Different);
13841 assert(!IsSame &&
"Should be the same NestedNameSpecifier");
13843 return std::nullopt;
13848 assert(Kind == NNS2.
getKind());
13853 auto Kind = Namespace1->getKind();
13854 if (Kind != Namespace2->getKind() ||
13855 (Kind == Decl::NamespaceAlias &&
13860 Namespace2->getNamespace()),
13894 llvm_unreachable(
"singletons did not compare equal");
13902 const T *Y,
bool IsSame) {
13903 return ::getCommonNNS(Ctx,
X->getQualifier(), Y->getQualifier(), IsSame);
13916 QualType EX =
X->getElementType(), EY = Y->getElementType();
13925 QY += EY.getQualifiers() - RQ;
13937 assert(Ctx.
hasSameExpr(
X->getSizeExpr(), Y->getSizeExpr()));
13938 return X->getSizeExpr();
13943 return X->getSizeModifier();
13949 return X->getIndexTypeCVRQualifiers();
13959 llvm::DenseMap<QualType, unsigned>
Found;
13960 for (
auto Ts : {
X, Y}) {
13967 Out.emplace_back(
T);
13973FunctionProtoType::ExceptionSpecInfo
13977 bool AcceptDependent)
const {
14003 assert(AcceptDependent &&
14004 "computing composite pointer type of dependent types");
14019 llvm_unreachable(
"These ESTs should be handled above");
14024 assert(EST2 ==
EST_Dynamic &&
"other cases should already be handled");
14028 Result.Exceptions = ExceptionTypeStorage;
14035 llvm_unreachable(
"shouldn't see unresolved exception specifications here");
14038 llvm_unreachable(
"invalid ExceptionSpecificationType");
14047#define UNEXPECTED_TYPE(Class, Kind) \
14048 case Type::Class: \
14049 llvm_unreachable("Unexpected " Kind ": " #Class);
14051#define NON_CANONICAL_TYPE(Class, Base) UNEXPECTED_TYPE(Class, "non-canonical")
14052#define TYPE(Class, Base)
14053#include "clang/AST/TypeNodes.inc"
14055#define SUGAR_FREE_TYPE(Class) UNEXPECTED_TYPE(Class, "sugar-free")
14066#undef SUGAR_FREE_TYPE
14067#define NON_UNIQUE_TYPE(Class) UNEXPECTED_TYPE(Class, "non-unique")
14070#undef NON_UNIQUE_TYPE
14074#undef UNEXPECTED_TYPE
14078 assert(AX->getDeducedType().isNull());
14079 assert(AY->getDeducedType().isNull());
14080 assert(AX->getKeyword() == AY->getKeyword());
14081 assert(AX->isInstantiationDependentType() ==
14082 AY->isInstantiationDependentType());
14084 AY->getTypeConstraintArguments());
14087 AX->containsUnexpandedParameterPack(),
14089 AY->getTypeConstraintConcept()),
14092 case Type::IncompleteArray: {
14099 case Type::DependentSizedArray: {
14107 case Type::ConstantArray: {
14110 assert(AX->getSize() == AY->getSize());
14111 const Expr *SizeExpr = Ctx.
hasSameExpr(AX->getSizeExpr(), AY->getSizeExpr())
14112 ? AX->getSizeExpr()
14118 case Type::ArrayParameter: {
14121 assert(AX->getSize() == AY->getSize());
14122 const Expr *SizeExpr = Ctx.
hasSameExpr(AX->getSizeExpr(), AY->getSizeExpr())
14123 ? AX->getSizeExpr()
14130 case Type::Atomic: {
14135 case Type::Complex: {
14139 case Type::Pointer: {
14143 case Type::BlockPointer: {
14147 case Type::ObjCObjectPointer: {
14152 case Type::MemberPointer: {
14156 PY->getMostRecentCXXRecordDecl()));
14160 PX->getMostRecentCXXRecordDecl());
14162 case Type::LValueReference: {
14167 PX->isSpelledAsLValue() ||
14168 PY->isSpelledAsLValue());
14170 case Type::RValueReference: {
14176 case Type::DependentAddressSpace: {
14179 assert(Ctx.
hasSameExpr(PX->getAddrSpaceExpr(), PY->getAddrSpaceExpr()));
14181 PX->getAddrSpaceExpr(),
14184 case Type::FunctionNoProto: {
14187 assert(FX->getExtInfo() == FY->getExtInfo());
14192 case Type::FunctionProto: {
14196 EPIY = FY->getExtProtoInfo();
14197 assert(EPIX.
ExtInfo == EPIY.ExtInfo);
14204 assert(EPIX.
TypeQuals == EPIY.TypeQuals);
14205 assert(EPIX.
Variadic == EPIY.Variadic);
14214 auto P =
getCommonTypes(Ctx, FX->param_types(), FY->param_types(),
14222 case Type::ObjCObject: {
14225 std::equal(OX->getProtocols().begin(), OX->getProtocols().end(),
14226 OY->getProtocols().begin(), OY->getProtocols().end(),
14228 return P0->getCanonicalDecl() == P1->getCanonicalDecl();
14230 "protocol lists must be the same");
14232 OY->getTypeArgsAsWritten());
14235 OX->getProtocols(),
14236 OX->isKindOfTypeAsWritten() && OY->isKindOfTypeAsWritten());
14238 case Type::ConstantMatrix: {
14241 assert(MX->getNumRows() == MY->getNumRows());
14242 assert(MX->getNumColumns() == MY->getNumColumns());
14244 MX->getNumRows(), MX->getNumColumns());
14246 case Type::DependentSizedMatrix: {
14249 assert(Ctx.
hasSameExpr(MX->getRowExpr(), MY->getRowExpr()));
14250 assert(Ctx.
hasSameExpr(MX->getColumnExpr(), MY->getColumnExpr()));
14255 case Type::Vector: {
14257 assert(VX->getNumElements() == VY->getNumElements());
14258 assert(VX->getVectorKind() == VY->getVectorKind());
14260 VX->getNumElements(), VX->getVectorKind());
14262 case Type::ExtVector: {
14264 assert(VX->getNumElements() == VY->getNumElements());
14266 VX->getNumElements());
14268 case Type::DependentSizedExtVector: {
14275 case Type::DependentVector: {
14278 assert(VX->getVectorKind() == VY->getVectorKind());
14285 case Type::InjectedClassName: {
14293 case Type::TemplateSpecialization: {
14297 TY->template_arguments());
14301 TY->getTemplateName(),
14303 As, {},
X->getCanonicalTypeInternal());
14305 case Type::Decltype: {
14308 assert(DX->isDependentType());
14309 assert(DY->isDependentType());
14310 assert(Ctx.
hasSameExpr(DX->getUnderlyingExpr(), DY->getUnderlyingExpr()));
14314 case Type::PackIndexing: {
14317 assert(DX->isDependentType());
14318 assert(DY->isDependentType());
14319 assert(Ctx.
hasSameExpr(DX->getIndexExpr(), DY->getIndexExpr()));
14322 case Type::DependentName: {
14325 assert(NX->getIdentifier() == NY->getIdentifier());
14330 case Type::DependentTemplateSpecialization: {
14334 TY->template_arguments());
14336 &SY = TY->getDependentTemplateName();
14337 assert(SX.
getName() == SY.getName());
14345 case Type::UnaryTransform: {
14348 assert(TX->getUTTKind() == TY->getUTTKind());
14352 TY->getUnderlyingType()),
14355 case Type::PackExpansion: {
14358 assert(PX->getNumExpansions() == PY->getNumExpansions());
14361 PX->getNumExpansions(),
false);
14365 assert(PX->isReadOnly() == PY->isReadOnly());
14370 case Type::TemplateTypeParm: {
14373 assert(TX->getDepth() == TY->getDepth());
14374 assert(TX->getIndex() == TY->getIndex());
14375 assert(TX->isParameterPack() == TY->isParameterPack());
14377 TX->getDepth(), TX->getIndex(), TX->isParameterPack(),
14381 llvm_unreachable(
"Unknown Type Class");
14391#define UNEXPECTED_TYPE(Class, Kind) \
14392 case Type::Class: \
14393 llvm_unreachable("Unexpected " Kind ": " #Class);
14394#define TYPE(Class, Base)
14395#define DEPENDENT_TYPE(Class, Base) UNEXPECTED_TYPE(Class, "dependent")
14396#include "clang/AST/TypeNodes.inc"
14398#define CANONICAL_TYPE(Class) UNEXPECTED_TYPE(Class, "canonical")
14424#undef CANONICAL_TYPE
14426#undef UNEXPECTED_TYPE
14428 case Type::Adjusted: {
14430 QualType OX = AX->getOriginalType(), OY = AY->getOriginalType();
14437 case Type::Decayed: {
14439 QualType OX = DX->getOriginalType(), OY = DY->getOriginalType();
14446 case Type::Attributed: {
14448 AttributedType::Kind Kind = AX->getAttrKind();
14449 if (Kind != AY->getAttrKind())
14451 QualType MX = AX->getModifiedType(), MY = AY->getModifiedType();
14459 case Type::BTFTagAttributed: {
14461 const BTFTypeTagAttr *AX = BX->getAttr();
14463 if (AX->getBTFTypeTag() !=
14472 if (KW != AY->getKeyword())
14476 AY->getTypeConstraintConcept());
14480 AY->getTypeConstraintArguments())) {
14488 false,
false, CD, As);
14490 case Type::PackIndexing:
14491 case Type::Decltype:
14493 case Type::DeducedTemplateSpecialization:
14496 case Type::MacroQualified: {
14500 if (IX != MY->getMacroIdentifier())
14504 case Type::SubstTemplateTypeParm: {
14511 unsigned Index = SX->getIndex();
14512 if (Index != SY->getIndex())
14514 auto PackIndex = SX->getPackIndex();
14515 if (PackIndex != SY->getPackIndex())
14518 CD, Index, PackIndex,
14519 SX->getFinal() && SY->getFinal());
14521 case Type::ObjCTypeParam:
14527 case Type::TemplateSpecialization: {
14532 TY->getTemplateName(),
true);
14537 TY->template_arguments()))
14543 case Type::Typedef: {
14553 case Type::TypeOf: {
14564 case Type::TypeOfExpr:
14567 case Type::UnaryTransform: {
14570 UnaryTransformType::UTTKind KX = UX->getUTTKind();
14571 if (KX != UY->getUTTKind())
14573 QualType BX = UX->getBaseType(), BY = UY->getBaseType();
14580 case Type::Using: {
14589 case Type::MemberPointer: {
14593 assert(Cls == PY->getMostRecentCXXRecordDecl());
14598 case Type::CountAttributed: {
14601 if (DX->isCountInBytes() != DY->isCountInBytes())
14603 if (DX->isOrNull() != DY->isOrNull())
14605 Expr *CEX = DX->getCountExpr();
14606 Expr *CEY = DY->getCountExpr();
14610 DX->isCountInBytes(), DX->isOrNull(),
14621 DX->isCountInBytes(), DX->isOrNull(),
14624 case Type::PredefinedSugar:
14629 llvm_unreachable(
"Unhandled Type Class");
14636 QualType NT =
T.Ty->getLocallyUnqualifiedSingleStepDesugaredType();
14651 if (
X.isCanonical())
14680 if (SX.
Ty != SY.Ty) {
14688 while (!Xs.empty() && !Ys.empty() && Xs.back().Ty == Ys.back().Ty) {
14691 SX = Xs.pop_back_val();
14692 SY = Ys.pop_back_val();
14695 if (KeepCommonQualifiers)
14702 while (!Xs.empty() && !Ys.empty()) {
14705 SX = Xs.pop_back_val();
14706 SY = Ys.pop_back_val();
14711 SX.
Ty = Underlying.Ty;
14714 QX -= Underlying.Quals;
14732 llvm_unreachable(
"Not a saturated fixed point type!");
14733 case BuiltinType::SatShortAccum:
14735 case BuiltinType::SatAccum:
14737 case BuiltinType::SatLongAccum:
14739 case BuiltinType::SatUShortAccum:
14741 case BuiltinType::SatUAccum:
14743 case BuiltinType::SatULongAccum:
14745 case BuiltinType::SatShortFract:
14747 case BuiltinType::SatFract:
14749 case BuiltinType::SatLongFract:
14751 case BuiltinType::SatUShortFract:
14753 case BuiltinType::SatUFract:
14755 case BuiltinType::SatULongFract:
14767 llvm_unreachable(
"Not a fixed point type!");
14768 case BuiltinType::ShortAccum:
14770 case BuiltinType::Accum:
14772 case BuiltinType::LongAccum:
14774 case BuiltinType::UShortAccum:
14776 case BuiltinType::UAccum:
14778 case BuiltinType::ULongAccum:
14780 case BuiltinType::ShortFract:
14782 case BuiltinType::Fract:
14784 case BuiltinType::LongFract:
14786 case BuiltinType::UShortFract:
14788 case BuiltinType::UFract:
14790 case BuiltinType::ULongFract:
14796 if (LangOpts.OpenCL)
14820 llvm_unreachable(
"Not a fixed point type!");
14821 case BuiltinType::ShortAccum:
14822 case BuiltinType::SatShortAccum:
14823 return Target.getShortAccumScale();
14824 case BuiltinType::Accum:
14825 case BuiltinType::SatAccum:
14826 return Target.getAccumScale();
14827 case BuiltinType::LongAccum:
14828 case BuiltinType::SatLongAccum:
14829 return Target.getLongAccumScale();
14830 case BuiltinType::UShortAccum:
14831 case BuiltinType::SatUShortAccum:
14832 return Target.getUnsignedShortAccumScale();
14833 case BuiltinType::UAccum:
14834 case BuiltinType::SatUAccum:
14835 return Target.getUnsignedAccumScale();
14836 case BuiltinType::ULongAccum:
14837 case BuiltinType::SatULongAccum:
14838 return Target.getUnsignedLongAccumScale();
14839 case BuiltinType::ShortFract:
14840 case BuiltinType::SatShortFract:
14841 return Target.getShortFractScale();
14842 case BuiltinType::Fract:
14843 case BuiltinType::SatFract:
14844 return Target.getFractScale();
14845 case BuiltinType::LongFract:
14846 case BuiltinType::SatLongFract:
14847 return Target.getLongFractScale();
14848 case BuiltinType::UShortFract:
14849 case BuiltinType::SatUShortFract:
14850 return Target.getUnsignedShortFractScale();
14851 case BuiltinType::UFract:
14852 case BuiltinType::SatUFract:
14853 return Target.getUnsignedFractScale();
14854 case BuiltinType::ULongFract:
14855 case BuiltinType::SatULongFract:
14856 return Target.getUnsignedLongFractScale();
14866 llvm_unreachable(
"Not a fixed point type!");
14867 case BuiltinType::ShortAccum:
14868 case BuiltinType::SatShortAccum:
14869 return Target.getShortAccumIBits();
14870 case BuiltinType::Accum:
14871 case BuiltinType::SatAccum:
14872 return Target.getAccumIBits();
14873 case BuiltinType::LongAccum:
14874 case BuiltinType::SatLongAccum:
14875 return Target.getLongAccumIBits();
14876 case BuiltinType::UShortAccum:
14877 case BuiltinType::SatUShortAccum:
14878 return Target.getUnsignedShortAccumIBits();
14879 case BuiltinType::UAccum:
14880 case BuiltinType::SatUAccum:
14881 return Target.getUnsignedAccumIBits();
14882 case BuiltinType::ULongAccum:
14883 case BuiltinType::SatULongAccum:
14884 return Target.getUnsignedLongAccumIBits();
14885 case BuiltinType::ShortFract:
14886 case BuiltinType::SatShortFract:
14887 case BuiltinType::Fract:
14888 case BuiltinType::SatFract:
14889 case BuiltinType::LongFract:
14890 case BuiltinType::SatLongFract:
14891 case BuiltinType::UShortFract:
14892 case BuiltinType::SatUShortFract:
14893 case BuiltinType::UFract:
14894 case BuiltinType::SatUFract:
14895 case BuiltinType::ULongFract:
14896 case BuiltinType::SatULongFract:
14901llvm::FixedPointSemantics
14904 "Can only get the fixed point semantics for a "
14905 "fixed point or integer type.");
14907 return llvm::FixedPointSemantics::GetIntegerSemantics(
14911 return llvm::FixedPointSemantics(
14914 !isSigned &&
getTargetInfo().doUnsignedFixedPointTypesHavePadding());
14929 "Expected unsigned fixed point type");
14932 case BuiltinType::UShortAccum:
14934 case BuiltinType::UAccum:
14936 case BuiltinType::ULongAccum:
14938 case BuiltinType::SatUShortAccum:
14940 case BuiltinType::SatUAccum:
14942 case BuiltinType::SatULongAccum:
14944 case BuiltinType::UShortFract:
14946 case BuiltinType::UFract:
14948 case BuiltinType::ULongFract:
14950 case BuiltinType::SatUShortFract:
14952 case BuiltinType::SatUFract:
14954 case BuiltinType::SatULongFract:
14957 llvm_unreachable(
"Unexpected unsigned fixed point type");
14965 std::vector<std::string> BackendFeats;
14966 llvm::AArch64::ExtensionSet FeatureBits;
14967 for (StringRef F : FMVFeatStrings)
14968 if (
auto FMVExt = llvm::AArch64::parseFMVExtension(F))
14970 FeatureBits.enable(*FMVExt->ID);
14971 FeatureBits.toLLVMFeatureList(BackendFeats);
14972 return BackendFeats;
14977 assert(TD !=
nullptr);
14980 llvm::erase_if(
ParsedAttr.Features, [&](
const std::string &Feat) {
14981 return !Target->isValidFeatureName(StringRef{Feat}.substr(1));
14992 Target->getTargetOpts().CPU,
14993 Target->getTargetOpts().Features);
15000 StringRef TargetCPU = Target->getTargetOpts().CPU;
15002 if (
const auto *TD = FD->
getAttr<TargetAttr>()) {
15008 if (!Target->getTriple().isAArch64())
15011 Target->getTargetOpts().FeaturesAsWritten.begin(),
15012 Target->getTargetOpts().FeaturesAsWritten.end());
15023 }
else if (
const auto *SD = FD->
getAttr<CPUSpecificAttr>()) {
15025 Target->getCPUSpecificCPUDispatchFeatures(
15027 std::vector<std::string> Features(FeaturesTmp.begin(), FeaturesTmp.end());
15028 Features.insert(Features.begin(),
15029 Target->getTargetOpts().FeaturesAsWritten.begin(),
15030 Target->getTargetOpts().FeaturesAsWritten.end());
15031 Target->initFeatureMap(FeatureMap,
getDiagnostics(), TargetCPU, Features);
15032 }
else if (
const auto *TC = FD->
getAttr<TargetClonesAttr>()) {
15033 if (Target->getTriple().isAArch64()) {
15037 Features.insert(Features.begin(),
15038 Target->getTargetOpts().FeaturesAsWritten.begin(),
15039 Target->getTargetOpts().FeaturesAsWritten.end());
15040 Target->initFeatureMap(FeatureMap,
getDiagnostics(), TargetCPU, Features);
15041 }
else if (Target->getTriple().isRISCV()) {
15043 std::vector<std::string> Features;
15044 if (VersionStr !=
"default") {
15046 Features.insert(Features.begin(),
ParsedAttr.Features.begin(),
15049 Features.insert(Features.begin(),
15050 Target->getTargetOpts().FeaturesAsWritten.begin(),
15051 Target->getTargetOpts().FeaturesAsWritten.end());
15052 Target->initFeatureMap(FeatureMap,
getDiagnostics(), TargetCPU, Features);
15054 std::vector<std::string> Features;
15056 if (VersionStr.starts_with(
"arch="))
15057 TargetCPU = VersionStr.drop_front(
sizeof(
"arch=") - 1);
15058 else if (VersionStr !=
"default")
15059 Features.push_back((StringRef{
"+"} + VersionStr).str());
15060 Target->initFeatureMap(FeatureMap,
getDiagnostics(), TargetCPU, Features);
15062 }
else if (
const auto *TV = FD->
getAttr<TargetVersionAttr>()) {
15063 std::vector<std::string> Features;
15064 if (Target->getTriple().isRISCV()) {
15066 Features.insert(Features.begin(),
ParsedAttr.Features.begin(),
15069 assert(Target->getTriple().isAArch64());
15071 TV->getFeatures(Feats);
15074 Features.insert(Features.begin(),
15075 Target->getTargetOpts().FeaturesAsWritten.begin(),
15076 Target->getTargetOpts().FeaturesAsWritten.end());
15077 Target->initFeatureMap(FeatureMap,
getDiagnostics(), TargetCPU, Features);
15079 FeatureMap = Target->getTargetOpts().FeatureMap;
15090 auto DeviceDiscriminatorOverrider =
15092 if (
const auto *RD = dyn_cast<CXXRecordDecl>(ND))
15094 return RD->getDeviceLambdaManglingNumber();
15095 return std::nullopt;
15098 Context, Context.getDiagnostics(), DeviceDiscriminatorOverrider)};
15106 std::string Buffer;
15107 Buffer.reserve(128);
15108 llvm::raw_string_ostream Out(Buffer);
15109 MC->mangleCanonicalTypeName(KernelNameType, Out);
15110 std::string KernelName = Out.str();
15112 return {KernelNameType, FD, KernelName};
15121 const auto *SKEPAttr = FD->
getAttr<SYCLKernelEntryPointAttr>();
15122 assert(SKEPAttr &&
"Missing sycl_kernel_entry_point attribute");
15131 "SYCL kernel name conflict");
15146 return &IT->second;
15152 return *OMPTraitInfoVector.back();
15159 return DB << Section.
Decl;
15160 return DB <<
"a prior #pragma section";
15164 bool IsInternalVar =
15167 bool IsExplicitDeviceVar = (D->
hasAttr<CUDADeviceAttr>() &&
15168 !D->
getAttr<CUDADeviceAttr>()->isImplicit()) ||
15169 (D->
hasAttr<CUDAConstantAttr>() &&
15170 !D->
getAttr<CUDAConstantAttr>()->isImplicit());
15174 return (IsInternalVar &&
15175 (D->
hasAttr<HIPManagedAttr>() || IsExplicitDeviceVar)) ||
15176 (D->
hasAttr<CUDAGlobalAttr>() &&
15183 (D->
hasAttr<HIPManagedAttr>() || D->
hasAttr<CUDAGlobalAttr>() ||
15188 if (!CUIDHash.empty())
15190 if (LangOpts.CUID.empty())
15191 return StringRef();
15192 CUIDHash = llvm::utohexstr(llvm::MD5Hash(LangOpts.CUID),
true);
15202 assert(PrimaryBase);
15205 auto Base = Layout.getPrimaryBase();
15206 if (!
Base ||
Base == PrimaryBase || !
Base->isPolymorphic())
15208 PrimaryBase =
Base;
15210 return PrimaryBase;
15214 StringRef MangledName) {
15216 assert(
Method->isVirtual());
15217 bool DefaultIncludesPointerAuth =
15218 LangOpts.PointerAuthCalls || LangOpts.PointerAuthIntrinsics;
15220 if (!DefaultIncludesPointerAuth)
15223 auto Existing = ThunksToBeAbbreviated.find(VirtualMethodDecl);
15224 if (Existing != ThunksToBeAbbreviated.end())
15225 return Existing->second.contains(MangledName.str());
15228 llvm::StringMap<llvm::SmallVector<std::string, 2>> Thunks;
15230 if (
const auto *ThunkInfos = VtableContext->getThunkInfo(VirtualMethodDecl)) {
15232 for (
const auto &Thunk : *ThunkInfos) {
15234 llvm::raw_svector_ostream ElidedNameStream(ElidedName);
15240 Mangler->mangleThunk(
Method, Thunk,
true,
15243 llvm::raw_svector_ostream mangledNameStream(MangledName);
15247 mangledNameStream);
15249 Mangler->mangleThunk(
Method, Thunk,
false,
15250 mangledNameStream);
15252 Thunks[ElidedName].push_back(std::string(MangledName));
15255 llvm::StringSet<> SimplifiedThunkNames;
15256 for (
auto &ThunkList : Thunks) {
15257 llvm::sort(ThunkList.second);
15258 SimplifiedThunkNames.insert(ThunkList.second[0]);
15260 bool Result = SimplifiedThunkNames.contains(MangledName);
15261 ThunksToBeAbbreviated[VirtualMethodDecl] = std::move(SimplifiedThunkNames);
This file provides AST data structures related to concepts.
static void SortAndUniqueProtocols(SmallVectorImpl< ObjCProtocolDecl * > &Protocols)
static bool isCanonicalExceptionSpecification(const FunctionProtoType::ExceptionSpecInfo &ESI, bool NoexceptInType)
static SourceLocation getCommonAttrLoc(const T *X, const T *Y)
static auto getCanonicalTemplateArguments(const ASTContext &C, ArrayRef< TemplateArgument > Args, bool &AnyNonCanonArgs)
static char getObjCEncodingForPrimitiveType(const ASTContext *C, const BuiltinType *BT)
static bool isSameQualifier(const NestedNameSpecifier X, const NestedNameSpecifier Y)
static bool unionHasUniqueObjectRepresentations(const ASTContext &Context, const RecordDecl *RD, bool CheckIfTriviallyCopyable)
static TypedefDecl * CreateHexagonBuiltinVaListDecl(const ASTContext *Context)
#define CANONICAL_TYPE(Class)
static ElaboratedTypeKeyword getCommonTypeKeyword(const T *X, const T *Y, bool IsSame)
static Decl * getCommonDecl(Decl *X, Decl *Y)
static GVALinkage adjustGVALinkageForAttributes(const ASTContext &Context, const Decl *D, GVALinkage L)
static bool isTypeTypedefedAsBOOL(QualType T)
static void EncodeBitField(const ASTContext *Ctx, std::string &S, QualType T, const FieldDecl *FD)
static GVALinkage basicGVALinkageForVariable(const ASTContext &Context, const VarDecl *VD)
static const TemplateArgument * getDefaultTemplateArgumentOrNone(const NamedDecl *P)
static QualType getCommonArrayElementType(const ASTContext &Ctx, const T *X, Qualifiers &QX, const T *Y, Qualifiers &QY)
#define SUGAR_FREE_TYPE(Class)
static SYCLKernelInfo BuildSYCLKernelInfo(ASTContext &Context, CanQualType KernelNameType, const FunctionDecl *FD)
static bool hasTemplateSpecializationInEncodedString(const Type *T, bool VisitBasesAndFields)
static void getIntersectionOfProtocols(ASTContext &Context, const ObjCInterfaceDecl *CommonBase, const ObjCObjectPointerType *LHSOPT, const ObjCObjectPointerType *RHSOPT, SmallVectorImpl< ObjCProtocolDecl * > &IntersectionSet)
getIntersectionOfProtocols - This routine finds the intersection of set of protocols inherited from t...
static bool areCompatMatrixTypes(const ConstantMatrixType *LHS, const ConstantMatrixType *RHS)
areCompatMatrixTypes - Return true if the two specified matrix types are compatible.
static TypedefDecl * CreateAAPCSABIBuiltinVaListDecl(const ASTContext *Context)
static bool sameObjCTypeArgs(ASTContext &ctx, const ObjCInterfaceDecl *iface, ArrayRef< QualType > lhsArgs, ArrayRef< QualType > rhsArgs, bool stripKindOf)
static bool canAssignObjCObjectTypes(ASTContext &ctx, QualType lhs, QualType rhs)
Determine whether the first type is a subtype of the second.
static const Type * getIntegerTypeForEnum(const EnumType *ET)
static bool hasSameCudaAttrs(const FunctionDecl *A, const FunctionDecl *B)
static const Decl & adjustDeclToTemplate(const Decl &D)
If we have a 'templated' declaration for a template, adjust 'D' to refer to the actual template.
static TemplateName getCommonTemplateName(const ASTContext &Ctx, TemplateName X, TemplateName Y, bool IgnoreDeduced=false)
static int CmpProtocolNames(ObjCProtocolDecl *const *LHS, ObjCProtocolDecl *const *RHS)
CmpProtocolNames - Comparison predicate for sorting protocols alphabetically.
static auto * getCommonSizeExpr(const ASTContext &Ctx, T *X, T *Y)
static TypedefDecl * CreatePowerABIBuiltinVaListDecl(const ASTContext *Context)
static auto getCommonSizeModifier(const ArrayType *X, const ArrayType *Y)
static TemplateArgument getCommonTemplateArgument(const ASTContext &Ctx, const TemplateArgument &X, const TemplateArgument &Y)
static std::optional< int64_t > structHasUniqueObjectRepresentations(const ASTContext &Context, const RecordDecl *RD, bool CheckIfTriviallyCopyable)
static bool hasSameOverloadableAttrs(const FunctionDecl *A, const FunctionDecl *B)
Determine whether the attributes we can overload on are identical for A and B.
static T * getCommonDeclChecked(T *X, T *Y)
static NestedNameSpecifier getCommonNNS(const ASTContext &Ctx, NestedNameSpecifier NNS1, NestedNameSpecifier NNS2, bool IsSame)
Returns a NestedNameSpecifier which has only the common sugar present in both NNS1 and NNS2.
static TypedefDecl * CreateVoidPtrBuiltinVaListDecl(const ASTContext *Context)
static int64_t getSubobjectOffset(const FieldDecl *Field, const ASTContext &Context, const clang::ASTRecordLayout &)
static QualType getCommonSugarTypeNode(const ASTContext &Ctx, const Type *X, const Type *Y, SplitQualType Underlying)
static TypedefDecl * CreateAArch64ABIBuiltinVaListDecl(const ASTContext *Context)
static QualType getCommonNonSugarTypeNode(const ASTContext &Ctx, const Type *X, Qualifiers &QX, const Type *Y, Qualifiers &QY)
static QualType mergeEnumWithInteger(ASTContext &Context, const EnumType *ET, QualType other, bool isBlockReturnType)
Given that we have an enum type and a non-enum type, try to merge them.
static GVALinkage adjustGVALinkageForExternalDefinitionKind(const ASTContext &Ctx, const Decl *D, GVALinkage L)
Adjust the GVALinkage for a declaration based on what an external AST source knows about whether ther...
static TypedefDecl * CreateSystemZBuiltinVaListDecl(const ASTContext *Context)
static std::optional< int64_t > getSubobjectSizeInBits(const FieldDecl *Field, const ASTContext &Context, bool CheckIfTriviallyCopyable)
static GVALinkage basicGVALinkageForFunction(const ASTContext &Context, const FunctionDecl *FD)
#define NON_UNIQUE_TYPE(Class)
static TypedefDecl * CreateX86_64ABIBuiltinVaListDecl(const ASTContext *Context)
static bool isAddrSpaceMapManglingEnabled(const TargetInfo &TI, const LangOptions &LangOpts)
static ElaboratedTypeKeyword getCanonicalElaboratedTypeKeyword(ElaboratedTypeKeyword Keyword)
static QualType getCommonPointeeType(const ASTContext &Ctx, const T *X, const T *Y)
static auto getCommonIndexTypeCVRQualifiers(const ArrayType *X, const ArrayType *Y)
static QualType DecodeTypeFromStr(const char *&Str, const ASTContext &Context, ASTContext::GetBuiltinTypeError &Error, bool &RequiresICE, bool AllowTypeModifiers)
DecodeTypeFromStr - This decodes one type descriptor from Str, advancing the pointer over the consume...
static TypedefDecl * CreateCharPtrBuiltinVaListDecl(const ASTContext *Context)
static bool areSortedAndUniqued(ArrayRef< ObjCProtocolDecl * > Protocols)
static TypeInfoChars getConstantArrayInfoInChars(const ASTContext &Context, const ConstantArrayType *CAT)
getConstantArrayInfoInChars - Performing the computation in CharUnits instead of in bits prevents ove...
static FloatingRank getFloatingRank(QualType T)
getFloatingRank - Return a relative rank for floating point types.
static bool getCommonTemplateArguments(const ASTContext &Ctx, SmallVectorImpl< TemplateArgument > &R, ArrayRef< TemplateArgument > Xs, ArrayRef< TemplateArgument > Ys)
static TypedefDecl * CreateXtensaABIBuiltinVaListDecl(const ASTContext *Context)
static QualType getCommonElementType(const ASTContext &Ctx, const T *X, const T *Y)
static void mergeTypeLists(const ASTContext &Ctx, SmallVectorImpl< QualType > &Out, ArrayRef< QualType > X, ArrayRef< QualType > Y)
static void encodeTypeForFunctionPointerAuth(const ASTContext &Ctx, raw_ostream &OS, QualType QT)
Encode a function type for use in the discriminator of a function pointer type.
static std::optional< int64_t > structSubobjectsHaveUniqueObjectRepresentations(const RangeT &Subobjects, int64_t CurOffsetInBits, const ASTContext &Context, const clang::ASTRecordLayout &Layout, bool CheckIfTriviallyCopyable)
static uint64_t getRVVTypeSize(ASTContext &Context, const BuiltinType *Ty)
getRVVTypeSize - Return RVV vector register size.
static auto unwrapSugar(SplitQualType &T, Qualifiers &QTotal)
static TemplateName getCommonTemplateNameChecked(const ASTContext &Ctx, TemplateName X, TemplateName Y, bool IgnoreDeduced)
static int compareObjCProtocolsByName(ObjCProtocolDecl *const *lhs, ObjCProtocolDecl *const *rhs)
Comparison routine for Objective-C protocols to be used with llvm::array_pod_sort.
static std::string charUnitsToString(const CharUnits &CU)
static const TagDecl * getNonInjectedClassName(const TagDecl *TD)
static bool hasAnyPackExpansions(ArrayRef< TemplateArgument > Args)
static char ObjCEncodingForEnumDecl(const ASTContext *C, const EnumDecl *ED)
static void addRedeclaredMethods(const ObjCMethodDecl *ObjCMethod, SmallVectorImpl< const NamedDecl * > &Redeclared)
static SmallVector< SourceLocation, 2 > getDeclLocsForCommentSearch(const Decl *D, SourceManager &SourceMgr)
static auto getCommonTypes(const ASTContext &Ctx, ArrayRef< QualType > Xs, ArrayRef< QualType > Ys, bool Unqualified=false)
static bool isCanonicalResultType(QualType T)
Determine whether T is canonical as the result type of a function.
static TypedefDecl * CreateMSVaListDecl(const ASTContext *Context)
static bool areCompatVectorTypes(const VectorType *LHS, const VectorType *RHS)
areCompatVectorTypes - Return true if the two specified vector types are compatible.
static TypedefDecl * CreateCharPtrNamedVaListDecl(const ASTContext *Context, StringRef Name)
static NestedNameSpecifier getCommonQualifier(const ASTContext &Ctx, const T *X, const T *Y, bool IsSame)
#define UNEXPECTED_TYPE(Class, Kind)
static TypedefDecl * CreateVaListDecl(const ASTContext *Context, TargetInfo::BuiltinVaListKind Kind)
static bool primaryBaseHaseAddressDiscriminatedVTableAuthentication(const ASTContext &Context, const CXXRecordDecl *Class)
static std::vector< std::string > getFMVBackendFeaturesFor(const llvm::SmallVectorImpl< StringRef > &FMVFeatStrings)
Defines the clang::ASTContext interface.
#define BuiltinTemplate(BTName)
Provides definitions for the various language-specific address spaces.
static bool isUnsigned(SValBuilder &SVB, NonLoc Value)
Defines enum values for all the target-independent builtin functions.
static bool CanThrow(Expr *E, ASTContext &Ctx)
static Decl::Kind getKind(const Decl *D)
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
This file defines OpenMP nodes for declarative directives.
Defines the C++ template declaration subclasses.
Defines the ExceptionSpecificationType enumeration and various utility functions.
Defines the clang::Expr interface and subclasses for C++ expressions.
Defines the clang::IdentifierInfo, clang::IdentifierTable, and clang::Selector interfaces.
static const Decl * getCanonicalDecl(const Decl *D)
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified.
Defines the clang::LangOptions interface.
llvm::MachO::Record Record
static bool hasFeature(StringRef Feature, const LangOptions &LangOpts, const TargetInfo &Target)
Determine whether a translation unit built using the current language options has the given feature.
Defines the clang::Module class, which describes a module in the source code.
Defines types useful for describing an Objective-C runtime.
static bool compare(const PathDiagnostic &X, const PathDiagnostic &Y)
static QualType getUnderlyingType(const SubRegion *R)
Defines the clang::SourceLocation class and associated facilities.
Defines the SourceManager interface.
Defines various enumerations that describe declaration and type specifiers.
static QualType getPointeeType(const MemRegion *R)
Defines the TargetCXXABI class, which abstracts details of the C++ ABI that we're targeting.
Defines the clang::TypeLoc interface and its subclasses.
static const TemplateArgument & getArgument(const TemplateArgument &A)
C Language Family Type Representation.
__device__ __2f16 float c
QualType getReadPipeType(QualType T) const
Return a read_only pipe type for the specified type.
QualType getWritePipeType(QualType T) const
Return a write_only pipe type for the specified type.
@ GE_Missing_stdio
Missing a type from <stdio.h>
@ GE_Missing_ucontext
Missing a type from <ucontext.h>
@ GE_Missing_setjmp
Missing a type from <setjmp.h>
RawComment * getRawCommentForDeclNoCacheImpl(const Decl *D, const SourceLocation RepresentativeLocForDecl, const std::map< unsigned, RawComment * > &CommentsInFile) const
APValue - This class implements a discriminated union of [uninitialized] [APSInt] [APFloat],...
bool isMemberPointerToDerivedMember() const
const ValueDecl * getMemberPointerDecl() const
ArrayRef< const CXXRecordDecl * > getMemberPointerPath() const
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
bool getByrefLifetime(QualType Ty, Qualifiers::ObjCLifetime &Lifetime, bool &HasByrefExtendedLayout) const
Returns true, if given type has a known lifetime.
MSGuidDecl * getMSGuidDecl(MSGuidDeclParts Parts) const
Return a declaration for the global GUID object representing the given GUID value.
BuiltinVectorTypeInfo getBuiltinVectorTypeInfo(const BuiltinType *VecTy) const
Returns the element type, element count and number of vectors (in case of tuple) for a builtin vector...
bool ObjCMethodsAreEqual(const ObjCMethodDecl *MethodDecl, const ObjCMethodDecl *MethodImp)
CanQualType ObjCBuiltinSelTy
TranslationUnitDecl * getTranslationUnitDecl() const
const ConstantArrayType * getAsConstantArrayType(QualType T) const
CanQualType getCanonicalFunctionResultType(QualType ResultType) const
Adjust the given function result type.
QualType getAtomicType(QualType T) const
Return the uniqued reference to the atomic type for the specified type.
LangAS getOpenCLTypeAddrSpace(const Type *T) const
Get address space for OpenCL type.
CharUnits getTypeAlignInChars(QualType T) const
Return the ABI-specified alignment of a (complete) type T, in characters.
void InitBuiltinTypes(const TargetInfo &Target, const TargetInfo *AuxTarget=nullptr)
Initialize built-in types.
ParentMapContext & getParentMapContext()
Returns the dynamic AST node parent map context.
QualType getParenType(QualType NamedType) const
size_t getSideTableAllocatedMemory() const
Return the total memory used for various side tables.
MemberSpecializationInfo * getInstantiatedFromStaticDataMember(const VarDecl *Var)
If this variable is an instantiated static data member of a class template specialization,...
QualType getRValueReferenceType(QualType T) const
Return the uniqued reference to the type for an rvalue reference to the specified type.
CanQualType ARCUnbridgedCastTy
QualType getDependentSizedMatrixType(QualType ElementType, Expr *RowExpr, Expr *ColumnExpr, SourceLocation AttrLoc) const
Return the unique reference to the matrix type of the specified element type and size.
QualType getBTFTagAttributedType(const BTFTypeTagAttr *BTFAttr, QualType Wrapped) const
llvm::DenseMap< const Decl *, comments::FullComment * > ParsedComments
Mapping from declarations to parsed comments attached to any redeclaration.
unsigned getManglingNumber(const NamedDecl *ND, bool ForAuxTarget=false) const
unsigned getIntWidth(QualType T) const
CanQualType getCanonicalParamType(QualType T) const
Return the canonical parameter type corresponding to the specific potentially non-canonical one.
const FunctionType * adjustFunctionType(const FunctionType *Fn, FunctionType::ExtInfo EInfo)
Change the ExtInfo on a function type.
TemplateOrSpecializationInfo getTemplateOrSpecializationInfo(const VarDecl *Var)
InlineVariableDefinitionKind
@ None
Not an inline variable.
@ Weak
Weak definition of inline variable.
@ Strong
Strong definition.
@ WeakUnknown
Weak for now, might become strong later in this TU.
void setObjCConstantStringInterface(ObjCInterfaceDecl *Decl)
TypedefDecl * getObjCClassDecl() const
Retrieve the typedef declaration corresponding to the predefined Objective-C 'Class' type.
TypedefNameDecl * getTypedefNameForUnnamedTagDecl(const TagDecl *TD)
TypedefDecl * getCFConstantStringDecl() const
CanQualType SatUnsignedFractTy
void setInstantiatedFromUsingDecl(NamedDecl *Inst, NamedDecl *Pattern)
Remember that the using decl Inst is an instantiation of the using decl Pattern of a class template.
bool areCompatibleRVVTypes(QualType FirstType, QualType SecondType)
Return true if the given types are an RISC-V vector builtin type and a VectorType that is a fixed-len...
ExternCContextDecl * getExternCContextDecl() const
const llvm::fltSemantics & getFloatTypeSemantics(QualType T) const
Return the APFloat 'semantics' for the specified scalar floating point type.
ParsedTargetAttr filterFunctionTargetAttrs(const TargetAttr *TD) const
Parses the target attributes passed in, and returns only the ones that are valid feature names.
QualType areCommonBaseCompatible(const ObjCObjectPointerType *LHSOPT, const ObjCObjectPointerType *RHSOPT)
TypedefDecl * getObjCSelDecl() const
Retrieve the typedef corresponding to the predefined 'SEL' type in Objective-C.
CanQualType UnsignedShortAccumTy
TypedefDecl * getObjCInstanceTypeDecl()
Retrieve the typedef declaration corresponding to the Objective-C "instancetype" type.
QualType adjustFunctionResultType(QualType FunctionType, QualType NewResultType)
Change the result type of a function type, preserving sugar such as attributed types.
void setTemplateOrSpecializationInfo(VarDecl *Inst, TemplateOrSpecializationInfo TSI)
bool isTypeAwareOperatorNewOrDelete(const FunctionDecl *FD) const
bool ProtocolCompatibleWithProtocol(ObjCProtocolDecl *lProto, ObjCProtocolDecl *rProto) const
ProtocolCompatibleWithProtocol - return 'true' if 'lProto' is in the inheritance hierarchy of 'rProto...
TypedefDecl * buildImplicitTypedef(QualType T, StringRef Name) const
Create a new implicit TU-level typedef declaration.
QualType getObjCInterfaceType(const ObjCInterfaceDecl *Decl, ObjCInterfaceDecl *PrevDecl=nullptr) const
getObjCInterfaceType - Return the unique reference to the type for the specified ObjC interface decl.
void adjustObjCTypeParamBoundType(const ObjCTypeParamDecl *Orig, ObjCTypeParamDecl *New) const
QualType getBlockPointerType(QualType T) const
Return the uniqued reference to the type for a block of the specified type.
TemplateArgument getCanonicalTemplateArgument(const TemplateArgument &Arg) const
Retrieve the "canonical" template argument.
QualType getAutoRRefDeductType() const
C++11 deduction pattern for 'auto &&' type.
TypedefDecl * getBuiltinMSVaListDecl() const
Retrieve the C type declaration corresponding to the predefined __builtin_ms_va_list type.
bool ObjCQualifiedIdTypesAreCompatible(const ObjCObjectPointerType *LHS, const ObjCObjectPointerType *RHS, bool ForCompare)
ObjCQualifiedIdTypesAreCompatible - We know that one of lhs/rhs is an ObjCQualifiedIDType.
QualType mergeFunctionTypes(QualType, QualType, bool OfBlockPointer=false, bool Unqualified=false, bool AllowCXX=false, bool IsConditionalOperator=false)
NamedDecl * getInstantiatedFromUsingDecl(NamedDecl *Inst)
If the given using decl Inst is an instantiation of another (possibly unresolved) using decl,...
DeclarationNameTable DeclarationNames
comments::FullComment * cloneFullComment(comments::FullComment *FC, const Decl *D) const
CharUnits getObjCEncodingTypeSize(QualType T) const
Return the size of type T for Objective-C encoding purpose, in characters.
int getIntegerTypeOrder(QualType LHS, QualType RHS) const
Return the highest ranked integer type, see C99 6.3.1.8p1.
QualType getAttributedType(attr::Kind attrKind, QualType modifiedType, QualType equivalentType, const Attr *attr=nullptr) const
TypedefDecl * getObjCIdDecl() const
Retrieve the typedef corresponding to the predefined id type in Objective-C.
void setCurrentNamedModule(Module *M)
Set the (C++20) module we are building.
QualType getProcessIDType() const
Return the unique type for "pid_t" defined in <sys/types.h>.
CharUnits getMemberPointerPathAdjustment(const APValue &MP) const
Find the 'this' offset for the member path in a pointer-to-member APValue.
bool mayExternalize(const Decl *D) const
Whether a C++ static variable or CUDA/HIP kernel may be externalized.
std::unique_ptr< MangleNumberingContext > createMangleNumberingContext() const
QualType getUnsignedPointerDiffType() const
Return the unique unsigned counterpart of "ptrdiff_t" integer type.
QualType getScalableVectorType(QualType EltTy, unsigned NumElts, unsigned NumFields=1) const
Return the unique reference to a scalable vector type of the specified element type and scalable numb...
bool hasSameExpr(const Expr *X, const Expr *Y) const
Determine whether the given expressions X and Y are equivalent.
void getObjCEncodingForType(QualType T, std::string &S, const FieldDecl *Field=nullptr, QualType *NotEncodedT=nullptr) const
Emit the Objective-CC type encoding for the given type T into S.
MangleContext * createMangleContext(const TargetInfo *T=nullptr)
If T is null pointer, assume the target in ASTContext.
QualType getRealTypeForBitwidth(unsigned DestWidth, FloatModeKind ExplicitType) const
getRealTypeForBitwidth - sets floating point QualTy according to specified bitwidth.
QualType getDependentTemplateSpecializationType(ElaboratedTypeKeyword Keyword, const DependentTemplateStorage &Name, ArrayRef< TemplateArgumentLoc > Args) const
QualType getFunctionNoProtoType(QualType ResultTy, const FunctionType::ExtInfo &Info) const
Return a K&R style C function type like 'int()'.
ASTMutationListener * getASTMutationListener() const
Retrieve a pointer to the AST mutation listener associated with this AST context, if any.
unsigned NumImplicitCopyAssignmentOperatorsDeclared
The number of implicitly-declared copy assignment operators for which declarations were built.
uint64_t getTargetNullPointerValue(QualType QT) const
Get target-dependent integer value for null pointer which is used for constant folding.
unsigned getTypeUnadjustedAlign(QualType T) const
Return the ABI-specified natural alignment of a (complete) type T, before alignment adjustments,...
unsigned char getFixedPointIBits(QualType Ty) const
QualType getSubstBuiltinTemplatePack(const TemplateArgument &ArgPack)
QualType getCorrespondingSignedFixedPointType(QualType Ty) const
IntrusiveRefCntPtr< ExternalASTSource > ExternalSource
QualType getArrayParameterType(QualType Ty) const
Return the uniqued reference to a specified array parameter type from the original array type.
QualType getCountAttributedType(QualType T, Expr *CountExpr, bool CountInBytes, bool OrNull, ArrayRef< TypeCoupledDeclRefInfo > DependentDecls) const
const ASTRecordLayout & getASTRecordLayout(const RecordDecl *D) const
Get or compute information about the layout of the specified record (struct/union/class) D,...
CanQualType getCanonicalType(QualType T) const
Return the canonical (structural) type corresponding to the specified potentially non-canonical type ...
unsigned NumImplicitDestructorsDeclared
The number of implicitly-declared destructors for which declarations were built.
bool mergeExtParameterInfo(const FunctionProtoType *FirstFnType, const FunctionProtoType *SecondFnType, bool &CanUseFirst, bool &CanUseSecond, SmallVectorImpl< FunctionProtoType::ExtParameterInfo > &NewParamInfos)
This function merges the ExtParameterInfo lists of two functions.
bool ObjCQualifiedClassTypesAreCompatible(const ObjCObjectPointerType *LHS, const ObjCObjectPointerType *RHS)
ObjCQualifiedClassTypesAreCompatible - compare Class<pr,...> and Class<pr1, ...>.
bool shouldExternalize(const Decl *D) const
Whether a C++ static variable or CUDA/HIP kernel should be externalized.
bool hasSameType(QualType T1, QualType T2) const
Determine whether the given types T1 and T2 are equivalent.
bool propertyTypesAreCompatible(QualType, QualType)
void setInstantiatedFromUsingShadowDecl(UsingShadowDecl *Inst, UsingShadowDecl *Pattern)
QualType getDependentVectorType(QualType VectorType, Expr *SizeExpr, SourceLocation AttrLoc, VectorKind VecKind) const
Return the unique reference to the type for a dependently sized vector of the specified element type.
CanQualType SatLongAccumTy
CanQualType getIntMaxType() const
Return the unique type for "intmax_t" (C99 7.18.1.5), defined in <stdint.h>.
QualType getVectorType(QualType VectorType, unsigned NumElts, VectorKind VecKind) const
Return the unique reference to a vector type of the specified element type and size.
QualType getCanonicalTemplateSpecializationType(TemplateName T, ArrayRef< TemplateArgument > CanonicalArgs) const
OpenCLTypeKind getOpenCLTypeKind(const Type *T) const
Map an AST Type to an OpenCLTypeKind enum value.
TemplateName getDependentTemplateName(const DependentTemplateStorage &Name) const
Retrieve the template name that represents a dependent template name such as MetaFun::template operat...
ArrayRef< Decl * > getModuleInitializers(Module *M)
Get the initializations to perform when importing a module, if any.
void getObjCEncodingForTypeQualifier(Decl::ObjCDeclQualifier QT, std::string &S) const
Put the string version of the type qualifiers QT into S.
unsigned getPreferredTypeAlign(QualType T) const
Return the "preferred" alignment of the specified type T for the current target, in bits.
std::string getObjCEncodingForMethodDecl(const ObjCMethodDecl *Decl, bool Extended=false) const
Emit the encoded type for the method declaration Decl into S.
bool DeclMustBeEmitted(const Decl *D)
Determines if the decl can be CodeGen'ed or deserialized from PCH lazily, only when used; this is onl...
CanQualType OMPArrayShapingTy
ASTContext(LangOptions &LOpts, SourceManager &SM, IdentifierTable &idents, SelectorTable &sels, Builtin::Context &builtins, TranslationUnitKind TUKind)
QualType getReadPipeType(QualType T) const
Return a read_only pipe type for the specified type.
std::string getObjCEncodingForPropertyDecl(const ObjCPropertyDecl *PD, const Decl *Container) const
getObjCEncodingForPropertyDecl - Return the encoded type for this method declaration.
TemplateName getCanonicalTemplateName(TemplateName Name, bool IgnoreDeduced=false) const
Retrieves the "canonical" template name that refers to a given template.
unsigned getStaticLocalNumber(const VarDecl *VD) const
void addComment(const RawComment &RC)
void getLegacyIntegralTypeEncoding(QualType &t) const
getLegacyIntegralTypeEncoding - Another legacy compatibility encoding: 32-bit longs are encoded as 'l...
bool isSameTypeConstraint(const TypeConstraint *XTC, const TypeConstraint *YTC) const
Determine whether two type contraint are similar enough that they could used in declarations of the s...
void setRelocationInfoForCXXRecord(const CXXRecordDecl *, CXXRecordDeclRelocationInfo)
QualType getSubstTemplateTypeParmType(QualType Replacement, Decl *AssociatedDecl, unsigned Index, UnsignedOrNone PackIndex, bool Final) const
Retrieve a substitution-result type.
RecordDecl * buildImplicitRecord(StringRef Name, RecordDecl::TagKind TK=RecordDecl::TagKind::Struct) const
Create a new implicit TU-level CXXRecordDecl or RecordDecl declaration.
QualType getPointerType(QualType T) const
Return the uniqued reference to the type for a pointer to the specified type.
const CXXMethodDecl * getCurrentKeyFunction(const CXXRecordDecl *RD)
Get our current best idea for the key function of the given record decl, or nullptr if there isn't on...
CanQualType UnsignedLongFractTy
QualType mergeTagDefinitions(QualType, QualType)
overridden_method_range overridden_methods(const CXXMethodDecl *Method) const
void setIsTypeAwareOperatorNewOrDelete(const FunctionDecl *FD, bool IsTypeAware)
QualType getDependentBitIntType(bool Unsigned, Expr *BitsExpr) const
Return a dependent bit-precise integer type with the specified signedness and bit count.
void setObjCImplementation(ObjCInterfaceDecl *IFaceD, ObjCImplementationDecl *ImplD)
Set the implementation of ObjCInterfaceDecl.
StringRef getCUIDHash() const
bool isMSStaticDataMemberInlineDefinition(const VarDecl *VD) const
Returns true if this is an inline-initialized static data member which is treated as a definition for...
bool canAssignObjCInterfaces(const ObjCObjectPointerType *LHSOPT, const ObjCObjectPointerType *RHSOPT)
canAssignObjCInterfaces - Return true if the two interface types are compatible for assignment from R...
QualType getReferenceQualifiedType(const Expr *e) const
getReferenceQualifiedType - Given an expr, will return the type for that expression,...
bool hasSameFunctionTypeIgnoringExceptionSpec(QualType T, QualType U) const
Determine whether two function types are the same, ignoring exception specifications in cases where t...
QualType getBlockDescriptorExtendedType() const
Gets the struct used to keep track of the extended descriptor for pointer to blocks.
QualType getLValueReferenceType(QualType T, bool SpelledAsLValue=true) const
Return the uniqued reference to the type for an lvalue reference to the specified type.
bool QIdProtocolsAdoptObjCObjectProtocols(QualType QT, ObjCInterfaceDecl *IDecl)
QIdProtocolsAdoptObjCObjectProtocols - Checks that protocols in QT's qualified-id protocol list adopt...
FunctionProtoType::ExceptionSpecInfo mergeExceptionSpecs(FunctionProtoType::ExceptionSpecInfo ESI1, FunctionProtoType::ExceptionSpecInfo ESI2, SmallVectorImpl< QualType > &ExceptionTypeStorage, bool AcceptDependent) const
void addLazyModuleInitializers(Module *M, ArrayRef< GlobalDeclID > IDs)
bool isSameConstraintExpr(const Expr *XCE, const Expr *YCE) const
Determine whether two 'requires' expressions are similar enough that they may be used in re-declarati...
bool BlockRequiresCopying(QualType Ty, const VarDecl *D)
Returns true iff we need copy/dispose helpers for the given type.
QualType getUsingType(ElaboratedTypeKeyword Keyword, NestedNameSpecifier Qualifier, const UsingShadowDecl *D, QualType UnderlyingType=QualType()) const
CanQualType OMPIteratorTy
Builtin::Context & BuiltinInfo
QualType getConstantArrayType(QualType EltTy, const llvm::APInt &ArySize, const Expr *SizeExpr, ArraySizeModifier ASM, unsigned IndexTypeQuals) const
Return the unique reference to the type for a constant array of the specified element type.
void addModuleInitializer(Module *M, Decl *Init)
Add a declaration to the list of declarations that are initialized for a module.
const LangOptions & getLangOpts() const
QualType getFunctionTypeWithoutPtrSizes(QualType T)
Get a function type and produce the equivalent function type where pointer size address spaces in the...
uint64_t lookupFieldBitOffset(const ObjCInterfaceDecl *OID, const ObjCIvarDecl *Ivar) const
Get the offset of an ObjCIvarDecl in bits.
SelectorTable & Selectors
bool isTypeIgnoredBySanitizer(const SanitizerMask &Mask, const QualType &Ty) const
Check if a type can have its sanitizer instrumentation elided based on its presence within an ignorel...
unsigned getMinGlobalAlignOfVar(uint64_t Size, const VarDecl *VD) const
Return the minimum alignment as specified by the target.
RawCommentList Comments
All comments in this translation unit.
bool isSameDefaultTemplateArgument(const NamedDecl *X, const NamedDecl *Y) const
Determine whether two default template arguments are similar enough that they may be used in declarat...
QualType applyObjCProtocolQualifiers(QualType type, ArrayRef< ObjCProtocolDecl * > protocols, bool &hasError, bool allowOnPointerType=false) const
Apply Objective-C protocol qualifiers to the given type.
QualType getMacroQualifiedType(QualType UnderlyingTy, const IdentifierInfo *MacroII) const
QualType removePtrSizeAddrSpace(QualType T) const
Remove the existing address space on the type if it is a pointer size address space and return the ty...
bool areLaxCompatibleRVVTypes(QualType FirstType, QualType SecondType)
Return true if the given vector types are lax-compatible RISC-V vector types as defined by -flax-vect...
CanQualType SatShortFractTy
QualType getDecayedType(QualType T) const
Return the uniqued reference to the decayed version of the given type.
CallingConv getDefaultCallingConvention(bool IsVariadic, bool IsCXXMethod) const
Retrieves the default calling convention for the current context.
bool canBindObjCObjectType(QualType To, QualType From)
TemplateTemplateParmDecl * insertCanonicalTemplateTemplateParmDeclInternal(TemplateTemplateParmDecl *CanonTTP) const
int getFloatingTypeSemanticOrder(QualType LHS, QualType RHS) const
Compare the rank of two floating point types as above, but compare equal if both types have the same ...
QualType getUIntPtrType() const
Return a type compatible with "uintptr_t" (C99 7.18.1.4), as defined by the target.
void setParameterIndex(const ParmVarDecl *D, unsigned index)
Used by ParmVarDecl to store on the side the index of the parameter when it exceeds the size of the n...
QualType getFunctionTypeWithExceptionSpec(QualType Orig, const FunctionProtoType::ExceptionSpecInfo &ESI) const
Get a function type and produce the equivalent function type with the specified exception specificati...
QualType getDependentNameType(ElaboratedTypeKeyword Keyword, NestedNameSpecifier NNS, const IdentifierInfo *Name) const
Qualifiers::GC getObjCGCAttrKind(QualType Ty) const
Return one of the GCNone, Weak or Strong Objective-C garbage collection attributes.
bool hasUniqueObjectRepresentations(QualType Ty, bool CheckIfTriviallyCopyable=true) const
Return true if the specified type has unique object representations according to (C++17 [meta....
CanQualType getCanonicalSizeType() const
bool typesAreBlockPointerCompatible(QualType, QualType)
CanQualType SatUnsignedAccumTy
bool useAbbreviatedThunkName(GlobalDecl VirtualMethodDecl, StringRef MangledName)
const ASTRecordLayout & getASTObjCInterfaceLayout(const ObjCInterfaceDecl *D) const
Get or compute information about the layout of the specified Objective-C interface.
void forEachMultiversionedFunctionVersion(const FunctionDecl *FD, llvm::function_ref< void(FunctionDecl *)> Pred) const
Visits all versions of a multiversioned function with the passed predicate.
void setInstantiatedFromUsingEnumDecl(UsingEnumDecl *Inst, UsingEnumDecl *Pattern)
Remember that the using enum decl Inst is an instantiation of the using enum decl Pattern of a class ...
QualType getBaseElementType(const ArrayType *VAT) const
Return the innermost element type of an array type.
QualType getPointerDiffType() const
Return the unique type for "ptrdiff_t" (C99 7.17) defined in <stddef.h>.
QualType getSignatureParameterType(QualType T) const
Retrieve the parameter type as adjusted for use in the signature of a function, decaying array and fu...
CanQualType ArraySectionTy
CanQualType ObjCBuiltinIdTy
overridden_cxx_method_iterator overridden_methods_end(const CXXMethodDecl *Method) const
VTableContextBase * getVTableContext()
ComparisonCategories CompCategories
Types and expressions required to build C++2a three-way comparisons using operator<=>,...
int getFloatingTypeOrder(QualType LHS, QualType RHS) const
Compare the rank of the two specified floating point types, ignoring the domain of the type (i....
unsigned CountNonClassIvars(const ObjCInterfaceDecl *OI) const
ObjCPropertyImplDecl * getObjCPropertyImplDeclForPropertyDecl(const ObjCPropertyDecl *PD, const Decl *Container) const
bool isNearlyEmpty(const CXXRecordDecl *RD) const
PointerAuthQualifier getObjCMemberSelTypePtrAuth()
void cacheRawCommentForDecl(const Decl &OriginalD, const RawComment &Comment) const
Attaches Comment to OriginalD and to its redeclaration chain and removes the redeclaration chain from...
void attachCommentsToJustParsedDecls(ArrayRef< Decl * > Decls, const Preprocessor *PP)
Searches existing comments for doc comments that should be attached to Decls.
QualType getIntTypeForBitwidth(unsigned DestWidth, unsigned Signed) const
getIntTypeForBitwidth - sets integer QualTy according to specified details: bitwidth,...
void setStaticLocalNumber(const VarDecl *VD, unsigned Number)
QualType getCFConstantStringType() const
Return the C structure type used to represent constant CFStrings.
void eraseDeclAttrs(const Decl *D)
Erase the attributes corresponding to the given declaration.
UsingEnumDecl * getInstantiatedFromUsingEnumDecl(UsingEnumDecl *Inst)
If the given using-enum decl Inst is an instantiation of another using-enum decl, return it.
RecordDecl * getCFConstantStringTagDecl() const
std::string getObjCEncodingForFunctionDecl(const FunctionDecl *Decl) const
Emit the encoded type for the function Decl into S.
TypeSourceInfo * getTemplateSpecializationTypeInfo(ElaboratedTypeKeyword Keyword, SourceLocation ElaboratedKeywordLoc, NestedNameSpecifierLoc QualifierLoc, SourceLocation TemplateKeywordLoc, TemplateName T, SourceLocation TLoc, const TemplateArgumentListInfo &SpecifiedArgs, ArrayRef< TemplateArgument > CanonicalArgs, QualType Canon=QualType()) const
QualType getTemplateTypeParmType(unsigned Depth, unsigned Index, bool ParameterPack, TemplateTypeParmDecl *ParmDecl=nullptr) const
Retrieve the template type parameter type for a template parameter or parameter pack with the given d...
CanQualType UnsignedFractTy
GVALinkage GetGVALinkageForFunction(const FunctionDecl *FD) const
QualType mergeFunctionParameterTypes(QualType, QualType, bool OfBlockPointer=false, bool Unqualified=false)
mergeFunctionParameterTypes - merge two types which appear as function parameter types
void addOverriddenMethod(const CXXMethodDecl *Method, const CXXMethodDecl *Overridden)
Note that the given C++ Method overrides the given Overridden method.
TemplateTemplateParmDecl * findCanonicalTemplateTemplateParmDeclInternal(TemplateTemplateParmDecl *TTP) const
CanQualType ObjCBuiltinClassTy
unsigned NumImplicitDefaultConstructorsDeclared
The number of implicitly-declared default constructors for which declarations were built.
CanQualType UnresolvedTemplateTy
OMPTraitInfo & getNewOMPTraitInfo()
Return a new OMPTraitInfo object owned by this context.
friend class CXXRecordDecl
CanQualType UnsignedLongTy
void DeepCollectObjCIvars(const ObjCInterfaceDecl *OI, bool leafClass, SmallVectorImpl< const ObjCIvarDecl * > &Ivars) const
DeepCollectObjCIvars - This routine first collects all declared, but not synthesized,...
bool computeBestEnumTypes(bool IsPacked, unsigned NumNegativeBits, unsigned NumPositiveBits, QualType &BestType, QualType &BestPromotionType)
Compute BestType and BestPromotionType for an enum based on the highest number of negative and positi...
llvm::APFixedPoint getFixedPointMin(QualType Ty) const
TypeSourceInfo * getTrivialTypeSourceInfo(QualType T, SourceLocation Loc=SourceLocation()) const
Allocate a TypeSourceInfo where all locations have been initialized to a given location,...
QualType adjustType(QualType OldType, llvm::function_ref< QualType(QualType)> Adjust) const
Rebuild a type, preserving any existing type sugar.
void addedLocalImportDecl(ImportDecl *Import)
Notify the AST context that a new import declaration has been parsed or implicitly created within thi...
const TranslationUnitKind TUKind
CanQualType UnsignedLongAccumTy
QualType AutoRRefDeductTy
TypeInfo getTypeInfo(const Type *T) const
Get the size and alignment of the specified complete type in bits.
QualType getStringLiteralArrayType(QualType EltTy, unsigned Length) const
Return a type for a constant array for a string literal of the specified element type and length.
QualType getCorrespondingSaturatedType(QualType Ty) const
bool isSameEntity(const NamedDecl *X, const NamedDecl *Y) const
Determine whether the two declarations refer to the same entity.
QualType getSubstTemplateTypeParmPackType(Decl *AssociatedDecl, unsigned Index, bool Final, const TemplateArgument &ArgPack)
CanQualType BoundMemberTy
CanQualType SatUnsignedShortFractTy
QualType removeAddrSpaceQualType(QualType T) const
Remove any existing address space on the type and returns the type with qualifiers intact (or that's ...
bool hasSameFunctionTypeIgnoringParamABI(QualType T, QualType U) const
Determine if two function types are the same, ignoring parameter ABI annotations.
TypedefDecl * getInt128Decl() const
Retrieve the declaration for the 128-bit signed integer type.
unsigned getOpenMPDefaultSimdAlign(QualType T) const
Get default simd alignment of the specified complete type in bits.
QualType getObjCSuperType() const
Returns the C struct type for objc_super.
QualType getBlockDescriptorType() const
Gets the struct used to keep track of the descriptor for pointer to blocks.
bool CommentsLoaded
True if comments are already loaded from ExternalASTSource.
BlockVarCopyInit getBlockVarCopyInit(const VarDecl *VD) const
Get the copy initialization expression of the VarDecl VD, or nullptr if none exists.
QualType getHLSLInlineSpirvType(uint32_t Opcode, uint32_t Size, uint32_t Alignment, ArrayRef< SpirvOperand > Operands)
unsigned NumImplicitMoveConstructorsDeclared
The number of implicitly-declared move constructors for which declarations were built.
bool isInSameModule(const Module *M1, const Module *M2) const
If the two module M1 and M2 are in the same module.
unsigned NumImplicitCopyConstructorsDeclared
The number of implicitly-declared copy constructors for which declarations were built.
llvm::DenseSet< const VarDecl * > CUDADeviceVarODRUsedByHost
Keep track of CUDA/HIP device-side variables ODR-used by host code.
CanQualType PseudoObjectTy
QualType getWebAssemblyExternrefType() const
Return a WebAssembly externref type.
void setTraversalScope(const std::vector< Decl * > &)
CharUnits getTypeUnadjustedAlignInChars(QualType T) const
getTypeUnadjustedAlignInChars - Return the ABI-specified alignment of a type, in characters,...
QualType getAdjustedType(QualType Orig, QualType New) const
Return the uniqued reference to a type adjusted from the original type to a new type.
friend class NestedNameSpecifier
unsigned getAlignOfGlobalVar(QualType T, const VarDecl *VD) const
Return the alignment in bits that should be given to a global variable with type T.
TypeInfoChars getTypeInfoDataSizeInChars(QualType T) const
MangleNumberingContext & getManglingNumberContext(const DeclContext *DC)
Retrieve the context for computing mangling numbers in the given DeclContext.
comments::FullComment * getLocalCommentForDeclUncached(const Decl *D) const
Return parsed documentation comment attached to a given declaration.
unsigned NumImplicitDestructors
The number of implicitly-declared destructors.
QualType getQualifiedType(SplitQualType split) const
Un-split a SplitQualType.
bool isAlignmentRequired(const Type *T) const
Determine if the alignment the type has was required using an alignment attribute.
bool areComparableObjCPointerTypes(QualType LHS, QualType RHS)
MangleContext * createDeviceMangleContext(const TargetInfo &T)
Creates a device mangle context to correctly mangle lambdas in a mixed architecture compile by settin...
CharUnits getExnObjectAlignment() const
Return the alignment (in bytes) of the thrown exception object.
QualType getObjCObjectPointerType(QualType OIT) const
Return a ObjCObjectPointerType type for the given ObjCObjectType.
ASTMutationListener * Listener
CanQualType ObjCBuiltinBoolTy
TypeInfoChars getTypeInfoInChars(const Type *T) const
QualType getPredefinedSugarType(PredefinedSugarType::Kind KD) const
QualType getObjCObjectType(QualType Base, ObjCProtocolDecl *const *Protocols, unsigned NumProtocols) const
Legacy interface: cannot provide type arguments or __kindof.
TemplateParamObjectDecl * getTemplateParamObjectDecl(QualType T, const APValue &V) const
Return the template parameter object of the given type with the given value.
CharUnits getDeclAlign(const Decl *D, bool ForAlignof=false) const
Return a conservative estimate of the alignment of the specified decl D.
int64_t toBits(CharUnits CharSize) const
Convert a size in characters to a size in bits.
TemplateTemplateParmDecl * getCanonicalTemplateTemplateParmDecl(TemplateTemplateParmDecl *TTP) const
Canonicalize the given TemplateTemplateParmDecl.
CanQualType OCLClkEventTy
void adjustExceptionSpec(FunctionDecl *FD, const FunctionProtoType::ExceptionSpecInfo &ESI, bool AsWritten=false)
Change the exception specification on a function once it is delay-parsed, instantiated,...
TypedefDecl * getUInt128Decl() const
Retrieve the declaration for the 128-bit unsigned integer type.
const clang::PrintingPolicy & getPrintingPolicy() const
void ResetObjCLayout(const ObjCInterfaceDecl *D)
ArrayRef< Module * > getModulesWithMergedDefinition(const NamedDecl *Def)
Get the additional modules in which the definition Def has been merged.
llvm::FixedPointSemantics getFixedPointSemantics(QualType Ty) const
CanQualType SatUnsignedShortAccumTy
QualType mergeTypes(QualType, QualType, bool OfBlockPointer=false, bool Unqualified=false, bool BlockReturnType=false, bool IsConditionalOperator=false)
const RawComment * getRawCommentForAnyRedecl(const Decl *D, const Decl **OriginalDecl=nullptr) const
Return the documentation comment attached to a given declaration.
CharUnits getAlignOfGlobalVarInChars(QualType T, const VarDecl *VD) const
Return the alignment in characters that should be given to a global variable with type T.
const ObjCMethodDecl * getObjCMethodRedeclaration(const ObjCMethodDecl *MD) const
Get the duplicate declaration of a ObjCMethod in the same interface, or null if none exists.
QualType getPackIndexingType(QualType Pattern, Expr *IndexExpr, bool FullySubstituted=false, ArrayRef< QualType > Expansions={}, UnsignedOrNone Index=std::nullopt) const
static bool isObjCNSObjectType(QualType Ty)
Return true if this is an NSObject object with its NSObject attribute set.
GVALinkage GetGVALinkageForVariable(const VarDecl *VD) const
llvm::PointerUnion< VarTemplateDecl *, MemberSpecializationInfo * > TemplateOrSpecializationInfo
A type synonym for the TemplateOrInstantiation mapping.
UsingShadowDecl * getInstantiatedFromUsingShadowDecl(UsingShadowDecl *Inst)
QualType getVariableArrayType(QualType EltTy, Expr *NumElts, ArraySizeModifier ASM, unsigned IndexTypeQuals) const
Return a non-unique reference to the type for a variable array of the specified element type.
QualType getObjCIdType() const
Represents the Objective-CC id type.
Decl * getVaListTagDecl() const
Retrieve the C type declaration corresponding to the predefined __va_list_tag type used to help defin...
QualType getUnsignedWCharType() const
Return the type of "unsigned wchar_t".
QualType getFunctionTypeWithoutParamABIs(QualType T) const
Get or construct a function type that is equivalent to the input type except that the parameter ABI a...
bool hasSameUnqualifiedType(QualType T1, QualType T2) const
Determine whether the given types are equivalent after cvr-qualifiers have been removed.
QualType getCorrespondingUnsaturatedType(QualType Ty) const
comments::FullComment * getCommentForDecl(const Decl *D, const Preprocessor *PP) const
Return parsed documentation comment attached to a given declaration.
TemplateArgument getInjectedTemplateArg(NamedDecl *ParamDecl) const
unsigned getTargetDefaultAlignForAttributeAligned() const
Return the default alignment for attribute((aligned)) on this target, to be used if no alignment valu...
const ArrayType * getAsArrayType(QualType T) const
Type Query functions.
llvm::DenseMap< CanQualType, SYCLKernelInfo > SYCLKernels
Map of SYCL kernels indexed by the unique type used to name the kernel.
bool isSameTemplateParameterList(const TemplateParameterList *X, const TemplateParameterList *Y) const
Determine whether two template parameter lists are similar enough that they may be used in declaratio...
QualType getWritePipeType(QualType T) const
Return a write_only pipe type for the specified type.
QualType getTypeDeclType(ElaboratedTypeKeyword Keyword, NestedNameSpecifier Qualifier, const TypeDecl *Decl) const
bool isDestroyingOperatorDelete(const FunctionDecl *FD) const
uint64_t getTypeSize(QualType T) const
Return the size of the specified (complete) type T, in bits.
CanQualType UnsignedInt128Ty
ObjCInterfaceDecl * getObjCProtocolDecl() const
Retrieve the Objective-C class declaration corresponding to the predefined Protocol class.
unsigned NumImplicitDefaultConstructors
The number of implicitly-declared default constructors.
CharUnits getTypeSizeInChars(QualType T) const
Return the size of the specified (complete) type T, in characters.
llvm::iterator_range< overridden_cxx_method_iterator > overridden_method_range
unsigned NumImplicitMoveAssignmentOperatorsDeclared
The number of implicitly-declared move assignment operators for which declarations were built.
void setManglingNumber(const NamedDecl *ND, unsigned Number)
llvm::DenseMap< const Decl *, const RawComment * > DeclRawComments
Mapping from declaration to directly attached comment.
QualType getAutoType(QualType DeducedType, AutoTypeKeyword Keyword, bool IsDependent, bool IsPack=false, TemplateDecl *TypeConstraintConcept=nullptr, ArrayRef< TemplateArgument > TypeConstraintArgs={}) const
C++11 deduced auto type.
TypedefDecl * getBuiltinVaListDecl() const
Retrieve the C type declaration corresponding to the predefined __builtin_va_list type.
CanQualType getCanonicalTypeDeclType(const TypeDecl *TD) const
QualType getPackExpansionType(QualType Pattern, UnsignedOrNone NumExpansions, bool ExpectPackInType=true) const
Form a pack expansion type with the given pattern.
CanQualType UnsignedCharTy
CanQualType UnsignedShortFractTy
BuiltinTemplateDecl * buildBuiltinTemplateDecl(BuiltinTemplateKind BTK, const IdentifierInfo *II) const
void * Allocate(size_t Size, unsigned Align=8) const
bool canBuiltinBeRedeclared(const FunctionDecl *) const
Return whether a declaration to a builtin is allowed to be overloaded/redeclared.
CanQualType UnsignedIntTy
unsigned NumImplicitMoveConstructors
The number of implicitly-declared move constructors.
QualType getTypedefType(ElaboratedTypeKeyword Keyword, NestedNameSpecifier Qualifier, const TypedefNameDecl *Decl, QualType UnderlyingType=QualType(), std::optional< bool > TypeMatchesDeclOrNone=std::nullopt) const
Return the unique reference to the type for the specified typedef-name decl.
QualType getObjCTypeParamType(const ObjCTypeParamDecl *Decl, ArrayRef< ObjCProtocolDecl * > protocols) const
void getObjCEncodingForMethodParameter(Decl::ObjCDeclQualifier QT, QualType T, std::string &S, bool Extended) const
getObjCEncodingForMethodParameter - Return the encoded type for a single method parameter or return t...
void addDeclaratorForUnnamedTagDecl(TagDecl *TD, DeclaratorDecl *DD)
unsigned overridden_methods_size(const CXXMethodDecl *Method) const
std::string getObjCEncodingForBlock(const BlockExpr *blockExpr) const
Return the encoded type for this block declaration.
QualType getTemplateSpecializationType(ElaboratedTypeKeyword Keyword, TemplateName T, ArrayRef< TemplateArgument > SpecifiedArgs, ArrayRef< TemplateArgument > CanonicalArgs, QualType Underlying=QualType()) const
TypeSourceInfo * CreateTypeSourceInfo(QualType T, unsigned Size=0) const
Allocate an uninitialized TypeSourceInfo.
TemplateName getQualifiedTemplateName(NestedNameSpecifier Qualifier, bool TemplateKeyword, TemplateName Template) const
Retrieve the template name that represents a qualified template name such as std::vector.
bool isSameAssociatedConstraint(const AssociatedConstraint &ACX, const AssociatedConstraint &ACY) const
Determine whether two 'requires' expressions are similar enough that they may be used in re-declarati...
QualType getExceptionObjectType(QualType T) const
void setInstantiatedFromStaticDataMember(VarDecl *Inst, VarDecl *Tmpl, TemplateSpecializationKind TSK, SourceLocation PointOfInstantiation=SourceLocation())
Note that the static data member Inst is an instantiation of the static data member template Tmpl of ...
FieldDecl * getInstantiatedFromUnnamedFieldDecl(FieldDecl *Field) const
DeclaratorDecl * getDeclaratorForUnnamedTagDecl(const TagDecl *TD)
bool ObjCObjectAdoptsQTypeProtocols(QualType QT, ObjCInterfaceDecl *Decl)
ObjCObjectAdoptsQTypeProtocols - Checks that protocols in IC's protocol list adopt all protocols in Q...
CanQualType UnsignedLongLongTy
QualType GetBuiltinType(unsigned ID, GetBuiltinTypeError &Error, unsigned *IntegerConstantArgs=nullptr) const
Return the type for the specified builtin.
CanQualType OCLReserveIDTy
bool isSameTemplateParameter(const NamedDecl *X, const NamedDecl *Y) const
Determine whether two template parameters are similar enough that they may be used in declarations of...
void registerSYCLEntryPointFunction(FunctionDecl *FD)
Generates and stores SYCL kernel metadata for the provided SYCL kernel entry point function.
QualType getArrayDecayedType(QualType T) const
Return the properly qualified result of decaying the specified array type to a pointer.
overridden_cxx_method_iterator overridden_methods_begin(const CXXMethodDecl *Method) const
CanQualType UnsignedShortTy
unsigned getTypeAlignIfKnown(QualType T, bool NeedsPreferredAlignment=false) const
Return the alignment of a type, in bits, or 0 if the type is incomplete and we cannot determine the a...
void UnwrapSimilarArrayTypes(QualType &T1, QualType &T2, bool AllowPiMismatch=true) const
Attempt to unwrap two types that may both be array types with the same bound (or both be array types ...
bool isRepresentableIntegerValue(llvm::APSInt &Value, QualType T)
Determine whether the given integral value is representable within the given type T.
bool AtomicUsesUnsupportedLibcall(const AtomicExpr *E) const
QualType getFunctionType(QualType ResultTy, ArrayRef< QualType > Args, const FunctionProtoType::ExtProtoInfo &EPI) const
Return a normal function type with a typed argument list.
const SYCLKernelInfo & getSYCLKernelInfo(QualType T) const
Given a type used as a SYCL kernel name, returns a reference to the metadata generated from the corre...
bool canAssignObjCInterfacesInBlockPointer(const ObjCObjectPointerType *LHSOPT, const ObjCObjectPointerType *RHSOPT, bool BlockReturnType)
canAssignObjCInterfacesInBlockPointer - This routine is specifically written for providing type-safet...
CanQualType SatUnsignedLongFractTy
QualType getMemberPointerType(QualType T, NestedNameSpecifier Qualifier, const CXXRecordDecl *Cls) const
Return the uniqued reference to the type for a member pointer to the specified type in the specified ...
const CXXConstructorDecl * getCopyConstructorForExceptionObject(CXXRecordDecl *RD)
QualType getDependentAddressSpaceType(QualType PointeeType, Expr *AddrSpaceExpr, SourceLocation AttrLoc) const
RawComment * getRawCommentForDeclNoCache(const Decl *D) const
Return the documentation comment attached to a given declaration, without looking into cache.
QualType getTagType(ElaboratedTypeKeyword Keyword, NestedNameSpecifier Qualifier, const TagDecl *TD, bool OwnsTag) const
QualType getPromotedIntegerType(QualType PromotableType) const
Return the type that PromotableType will promote to: C99 6.3.1.1p2, assuming that PromotableType is a...
CanQualType getMSGuidType() const
Retrieve the implicitly-predeclared 'struct _GUID' type.
const VariableArrayType * getAsVariableArrayType(QualType T) const
QualType getUnaryTransformType(QualType BaseType, QualType UnderlyingType, UnaryTransformType::UTTKind UKind) const
Unary type transforms.
void setExternalSource(IntrusiveRefCntPtr< ExternalASTSource > Source)
Attach an external AST source to the AST context.
const ObjCInterfaceDecl * getObjContainingInterface(const NamedDecl *ND) const
Returns the Objective-C interface that ND belongs to if it is an Objective-C method/property/ivar etc...
StringLiteral * getPredefinedStringLiteralFromCache(StringRef Key) const
Return a string representing the human readable name for the specified function declaration or file n...
CanQualType getCanonicalUnresolvedUsingType(const UnresolvedUsingTypenameDecl *D) const
bool hasSimilarType(QualType T1, QualType T2) const
Determine if two types are similar, according to the C++ rules.
llvm::APFixedPoint getFixedPointMax(QualType Ty) const
QualType getComplexType(QualType T) const
Return the uniqued reference to the type for a complex number with the specified element type.
bool hasDirectOwnershipQualifier(QualType Ty) const
Return true if the type has been explicitly qualified with ObjC ownership.
Qualifiers::ObjCLifetime getInnerObjCOwnership(QualType T) const
Recurses in pointer/array types until it finds an Objective-C retainable type and returns its ownersh...
void addCopyConstructorForExceptionObject(CXXRecordDecl *RD, CXXConstructorDecl *CD)
void deduplicateMergedDefinitionsFor(NamedDecl *ND)
Clean up the merged definition list.
DiagnosticsEngine & getDiagnostics() const
QualType getAdjustedParameterType(QualType T) const
Perform adjustment on the parameter type of a function.
interp::Context & getInterpContext()
Returns the clang bytecode interpreter context.
QualType getSizeType() const
Return the unique type for "size_t" (C99 7.17), defined in <stddef.h>.
UnnamedGlobalConstantDecl * getUnnamedGlobalConstantDecl(QualType Ty, const APValue &Value) const
Return a declaration for a uniquified anonymous global constant corresponding to a given APValue.
QualType getExtVectorType(QualType VectorType, unsigned NumElts) const
Return the unique reference to an extended vector type of the specified element type and size.
QualType getUnresolvedUsingType(ElaboratedTypeKeyword Keyword, NestedNameSpecifier Qualifier, const UnresolvedUsingTypenameDecl *D) const
bool areCompatibleVectorTypes(QualType FirstVec, QualType SecondVec)
Return true if the given vector types are of the same unqualified type or if they are equivalent to t...
void getOverriddenMethods(const NamedDecl *Method, SmallVectorImpl< const NamedDecl * > &Overridden) const
Return C++ or ObjC overridden methods for the given Method.
DeclarationNameInfo getNameForTemplate(TemplateName Name, SourceLocation NameLoc) const
bool hasSameTemplateName(const TemplateName &X, const TemplateName &Y, bool IgnoreDeduced=false) const
Determine whether the given template names refer to the same template.
CanQualType SatLongFractTy
const TargetInfo & getTargetInfo() const
void setInstantiatedFromUnnamedFieldDecl(FieldDecl *Inst, FieldDecl *Tmpl)
CanQualType SatShortAccumTy
QualType getAutoDeductType() const
C++11 deduction pattern for 'auto' type.
unsigned NumImplicitCopyConstructors
The number of implicitly-declared copy constructors.
CharUnits toCharUnitsFromBits(int64_t BitSize) const
Convert a size in bits to a size in characters.
CanQualType IncompleteMatrixIdxTy
void getFunctionFeatureMap(llvm::StringMap< bool > &FeatureMap, const FunctionDecl *) const
CanQualType getNSIntegerType() const
QualType getCorrespondingUnsignedType(QualType T) const
void setBlockVarCopyInit(const VarDecl *VD, Expr *CopyExpr, bool CanThrow)
Set the copy initialization expression of a block var decl.
TemplateName getOverloadedTemplateName(UnresolvedSetIterator Begin, UnresolvedSetIterator End) const
Retrieve the template name that corresponds to a non-empty lookup.
bool typesAreCompatible(QualType T1, QualType T2, bool CompareUnqualified=false)
Compatibility predicates used to check assignment expressions.
TemplateName getSubstTemplateTemplateParmPack(const TemplateArgument &ArgPack, Decl *AssociatedDecl, unsigned Index, bool Final) const
QualType getDeducedTemplateSpecializationType(ElaboratedTypeKeyword Keyword, TemplateName Template, QualType DeducedType, bool IsDependent) const
C++17 deduced class template specialization type.
TargetCXXABI::Kind getCXXABIKind() const
Return the C++ ABI kind that should be used.
QualType getHLSLAttributedResourceType(QualType Wrapped, QualType Contained, const HLSLAttributedResourceType::Attributes &Attrs)
bool UnwrapSimilarTypes(QualType &T1, QualType &T2, bool AllowPiMismatch=true) const
Attempt to unwrap two types that may be similar (C++ [conv.qual]).
QualType getAddrSpaceQualType(QualType T, LangAS AddressSpace) const
Return the uniqued reference to the type for an address space qualified type with the specified type ...
QualType getSignedSizeType() const
Return the unique signed counterpart of the integer type corresponding to size_t.
ExternalASTSource * getExternalSource() const
Retrieve a pointer to the external AST source associated with this AST context, if any.
uint64_t getConstantArrayElementCount(const ConstantArrayType *CA) const
Return number of constant array elements.
CanQualType SatUnsignedLongAccumTy
QualType getUnconstrainedType(QualType T) const
Remove any type constraints from a template parameter type, for equivalence comparison of template pa...
CanQualType getCanonicalTagType(const TagDecl *TD) const
bool isSameTemplateArgument(const TemplateArgument &Arg1, const TemplateArgument &Arg2) const
Determine whether the given template arguments Arg1 and Arg2 are equivalent.
QualType getTypeOfType(QualType QT, TypeOfKind Kind) const
getTypeOfType - Unlike many "get<Type>" functions, we don't unique TypeOfType nodes.
QualType getCorrespondingSignedType(QualType T) const
QualType mergeObjCGCQualifiers(QualType, QualType)
mergeObjCGCQualifiers - This routine merges ObjC's GC attribute of 'LHS' and 'RHS' attributes and ret...
llvm::DenseMap< const Decl *, const Decl * > CommentlessRedeclChains
Keeps track of redeclaration chains that don't have any comment attached.
uint64_t getArrayInitLoopExprElementCount(const ArrayInitLoopExpr *AILE) const
Return number of elements initialized in an ArrayInitLoopExpr.
unsigned getTargetAddressSpace(LangAS AS) const
QualType getIntPtrType() const
Return a type compatible with "intptr_t" (C99 7.18.1.4), as defined by the target.
void mergeDefinitionIntoModule(NamedDecl *ND, Module *M, bool NotifyListeners=true)
Note that the definition ND has been merged into module M, and should be visible whenever M is visibl...
QualType getDependentSizedArrayType(QualType EltTy, Expr *NumElts, ArraySizeModifier ASM, unsigned IndexTypeQuals) const
Return a non-unique reference to the type for a dependently-sized array of the specified element type...
void addTranslationUnitDecl()
void getObjCEncodingForPropertyType(QualType T, std::string &S) const
Emit the Objective-C property type encoding for the given type T into S.
unsigned NumImplicitCopyAssignmentOperators
The number of implicitly-declared copy assignment operators.
void CollectInheritedProtocols(const Decl *CDecl, llvm::SmallPtrSet< ObjCProtocolDecl *, 8 > &Protocols)
CollectInheritedProtocols - Collect all protocols in current class and those inherited by it.
bool isPromotableIntegerType(QualType T) const
More type predicates useful for type checking/promotion.
llvm::DenseMap< const Decl *, const Decl * > RedeclChainComments
Mapping from canonical declaration to the first redeclaration in chain that has a comment attached.
void adjustDeducedFunctionResultType(FunctionDecl *FD, QualType ResultType)
Change the result type of a function type once it is deduced.
QualType getObjCGCQualType(QualType T, Qualifiers::GC gcAttr) const
Return the uniqued reference to the type for an Objective-C gc-qualified type.
QualType getDecltypeType(Expr *e, QualType UnderlyingType) const
C++11 decltype.
std::optional< CXXRecordDeclRelocationInfo > getRelocationInfoForCXXRecord(const CXXRecordDecl *) const
InlineVariableDefinitionKind getInlineVariableDefinitionKind(const VarDecl *VD) const
Determine whether a definition of this inline variable should be treated as a weak or strong definiti...
TemplateName getSubstTemplateTemplateParm(TemplateName replacement, Decl *AssociatedDecl, unsigned Index, UnsignedOrNone PackIndex, bool Final) const
CanQualType getUIntMaxType() const
Return the unique type for "uintmax_t" (C99 7.18.1.5), defined in <stdint.h>.
uint16_t getPointerAuthVTablePointerDiscriminator(const CXXRecordDecl *RD)
Return the "other" discriminator used for the pointer auth schema used for vtable pointers in instanc...
CharUnits getOffsetOfBaseWithVBPtr(const CXXRecordDecl *RD) const
Loading virtual member pointers using the virtual inheritance model always results in an adjustment u...
LangAS getLangASForBuiltinAddressSpace(unsigned AS) const
bool hasSameFunctionTypeIgnoringPtrSizes(QualType T, QualType U)
Determine whether two function types are the same, ignoring pointer sizes in the return type and para...
unsigned char getFixedPointScale(QualType Ty) const
QualType getIncompleteArrayType(QualType EltTy, ArraySizeModifier ASM, unsigned IndexTypeQuals) const
Return a unique reference to the type for an incomplete array of the specified element type.
QualType getDependentSizedExtVectorType(QualType VectorType, Expr *SizeExpr, SourceLocation AttrLoc) const
QualType DecodeTypeStr(const char *&Str, const ASTContext &Context, ASTContext::GetBuiltinTypeError &Error, bool &RequireICE, bool AllowTypeModifiers) const
TemplateName getAssumedTemplateName(DeclarationName Name) const
Retrieve a template name representing an unqualified-id that has been assumed to name a template for ...
@ GE_Missing_type
Missing a type.
QualType adjustStringLiteralBaseType(QualType StrLTy) const
uint16_t getPointerAuthTypeDiscriminator(QualType T)
Return the "other" type-specific discriminator for the given type.
bool canonicalizeTemplateArguments(MutableArrayRef< TemplateArgument > Args) const
Canonicalize the given template argument list.
QualType getTypeOfExprType(Expr *E, TypeOfKind Kind) const
C23 feature and GCC extension.
QualType getSignedWCharType() const
Return the type of "signed wchar_t".
QualType getUnqualifiedArrayType(QualType T, Qualifiers &Quals) const
Return this type as a completely-unqualified array type, capturing the qualifiers in Quals.
bool hasCvrSimilarType(QualType T1, QualType T2)
Determine if two types are similar, ignoring only CVR qualifiers.
TemplateName getDeducedTemplateName(TemplateName Underlying, DefaultArguments DefaultArgs) const
Represents a TemplateName which had some of its default arguments deduced.
ObjCImplementationDecl * getObjCImplementation(ObjCInterfaceDecl *D)
Get the implementation of the ObjCInterfaceDecl D, or nullptr if none exists.
CanQualType UnsignedAccumTy
void setObjCMethodRedeclaration(const ObjCMethodDecl *MD, const ObjCMethodDecl *Redecl)
void addTypedefNameForUnnamedTagDecl(TagDecl *TD, TypedefNameDecl *TND)
QualType getConstantMatrixType(QualType ElementType, unsigned NumRows, unsigned NumColumns) const
Return the unique reference to the matrix type of the specified element type and size.
const CXXRecordDecl * baseForVTableAuthentication(const CXXRecordDecl *ThisClass) const
Resolve the root record to be used to derive the vtable pointer authentication policy for the specifi...
QualType getVariableArrayDecayedType(QualType Ty) const
Returns a vla type where known sizes are replaced with [*].
void setCFConstantStringType(QualType T)
const SYCLKernelInfo * findSYCLKernelInfo(QualType T) const
Returns a pointer to the metadata generated from the corresponding SYCLkernel entry point if the prov...
unsigned getParameterIndex(const ParmVarDecl *D) const
Used by ParmVarDecl to retrieve on the side the index of the parameter when it exceeds the size of th...
QualType getCommonSugaredType(QualType X, QualType Y, bool Unqualified=false) const
void AddDeallocation(void(*Callback)(void *), void *Data) const
Add a deallocation callback that will be invoked when the ASTContext is destroyed.
AttrVec & getDeclAttrs(const Decl *D)
Retrieve the attributes for the given declaration.
CXXMethodVector::const_iterator overridden_cxx_method_iterator
RawComment * getRawCommentForDeclNoCacheImpl(const Decl *D, const SourceLocation RepresentativeLocForDecl, const std::map< unsigned, RawComment * > &CommentsInFile) const
unsigned getTypeAlign(QualType T) const
Return the ABI-specified alignment of a (complete) type T, in bits.
QualType mergeTransparentUnionType(QualType, QualType, bool OfBlockPointer=false, bool Unqualified=false)
mergeTransparentUnionType - if T is a transparent union type and a member of T is compatible with Sub...
QualType isPromotableBitField(Expr *E) const
Whether this is a promotable bitfield reference according to C99 6.3.1.1p2, bullet 2 (and GCC extensi...
bool isSentinelNullExpr(const Expr *E)
CanQualType getNSUIntegerType() const
void setIsDestroyingOperatorDelete(const FunctionDecl *FD, bool IsDestroying)
uint64_t getCharWidth() const
Return the size of the character type, in bits.
QualType getBitIntType(bool Unsigned, unsigned NumBits) const
Return a bit-precise integer type with the specified signedness and bit count.
unsigned NumImplicitMoveAssignmentOperators
The number of implicitly-declared move assignment operators.
An abstract interface that should be implemented by listeners that want to be notified when an AST en...
virtual ~ASTMutationListener()
virtual void DeducedReturnType(const FunctionDecl *FD, QualType ReturnType)
A function's return type has been deduced.
ASTRecordLayout - This class contains layout information for one RecordDecl, which is a struct/union/...
CharUnits getAlignment() const
getAlignment - Get the record alignment in characters.
const CXXRecordDecl * getBaseSharingVBPtr() const
CharUnits getSize() const
getSize - Get the record size in characters.
uint64_t getFieldOffset(unsigned FieldNo) const
getFieldOffset - Get the offset of the given field index, in bits.
CharUnits getDataSize() const
getDataSize() - Get the record data size, which is the record size without tail padding,...
CharUnits getBaseClassOffset(const CXXRecordDecl *Base) const
getBaseClassOffset - Get the offset, in chars, for the given base class.
CharUnits getVBaseClassOffset(const CXXRecordDecl *VBase) const
getVBaseClassOffset - Get the offset, in chars, for the given base class.
CharUnits getNonVirtualSize() const
getNonVirtualSize - Get the non-virtual size (in chars) of an object, which is the size of the object...
CharUnits getUnadjustedAlignment() const
getUnadjustedAlignment - Get the record alignment in characters, before alignment adjustment.
Represents a type which was implicitly adjusted by the semantic engine for arbitrary reasons.
void Profile(llvm::FoldingSetNodeID &ID)
Represents a loop initializing the elements of an array.
llvm::APInt getArraySize() const
Expr * getSubExpr() const
Get the initializer to use for each array element.
Represents a constant array type that does not decay to a pointer when used as a function parameter.
Represents an array type, per C99 6.7.5.2 - Array Declarators.
ArraySizeModifier getSizeModifier() const
Qualifiers getIndexTypeQualifiers() const
QualType getElementType() const
unsigned getIndexTypeCVRQualifiers() const
A structure for storing the information associated with a name that has been assumed to be a template...
AtomicExpr - Variadic atomic builtins: __atomic_exchange, __atomic_fetch_*, __atomic_load,...
void Profile(llvm::FoldingSetNodeID &ID)
Attr - This represents one attribute.
A fixed int type of a specified bitwidth.
void Profile(llvm::FoldingSetNodeID &ID) const
unsigned getNumBits() const
Represents a block literal declaration, which is like an unnamed FunctionDecl.
BlockExpr - Adaptor class for mixing a BlockDecl with expressions.
void Profile(llvm::FoldingSetNodeID &ID)
Represents the builtin template declaration which is used to implement __make_integer_seq and other b...
static BuiltinTemplateDecl * Create(const ASTContext &C, DeclContext *DC, DeclarationName Name, BuiltinTemplateKind BTK)
This class is used for builtin types like 'int'.
StringRef getName(const PrintingPolicy &Policy) const
Holds information about both target-independent and target-specific builtins, allowing easy queries b...
Implements C++ ABI-specific semantic analysis functions.
Represents a C++ constructor within a class.
Represents a static or instance method of a struct/union/class.
CXXMethodDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
Represents a C++ struct/union/class.
static CXXRecordDecl * Create(const ASTContext &C, TagKind TK, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, IdentifierInfo *Id, CXXRecordDecl *PrevDecl=nullptr)
CXXRecordDecl * getDefinition() const
bool isPolymorphic() const
Whether this class is polymorphic (C++ [class.virtual]), which means that the class contains or inher...
bool isDynamicClass() const
bool isEmpty() const
Determine whether this is an empty class in the sense of (C++11 [meta.unary.prop]).
SplitQualType split() const
static CanQual< Type > CreateUnsafe(QualType Other)
QualType withConst() const
Retrieves a version of this type with const applied.
CanQual< T > getUnqualifiedType() const
Retrieve the unqualified form of this type.
Qualifiers getQualifiers() const
Retrieve all qualifiers.
const T * getTypePtr() const
Retrieve the underlying type pointer, which refers to a canonical type.
CharUnits - This is an opaque type for sizes expressed in character units.
bool isPositive() const
isPositive - Test whether the quantity is greater than zero.
bool isZero() const
isZero - Test whether the quantity equals zero.
QuantityType getQuantity() const
getQuantity - Get the raw integer representation of this quantity.
static CharUnits fromQuantity(QuantityType Quantity)
fromQuantity - Construct a CharUnits quantity from a raw integer type.
static CharUnits Zero()
Zero - Construct a CharUnits quantity of zero.
Declaration of a class template.
llvm::PointerUnion< ClassTemplateDecl *, ClassTemplatePartialSpecializationDecl * > getSpecializedTemplateOrPartial() const
Retrieve the class template or class template partial specialization which was specialized by this.
Complex values, per C99 6.2.5p11.
void Profile(llvm::FoldingSetNodeID &ID)
bool hasExplicitTemplateArgs() const
Whether or not template arguments were explicitly specified in the concept reference (they might not ...
const ASTTemplateArgumentListInfo * getTemplateArgsAsWritten() const
Represents the canonical version of C arrays with a specified constant size.
const Expr * getSizeExpr() const
Return a pointer to the size expression.
llvm::APInt getSize() const
Return the constant array size as an APInt.
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Ctx)
uint64_t getZExtSize() const
Return the size zero-extended as a uint64_t.
Represents a concrete matrix type with constant number of rows and columns.
unsigned getNumColumns() const
Returns the number of columns in the matrix.
void Profile(llvm::FoldingSetNodeID &ID)
unsigned getNumRows() const
Returns the number of rows in the matrix.
static constexpr bool isDimensionValid(size_t NumElements)
Returns true if NumElements is a valid matrix dimension.
Represents a sugar type with __counted_by or __sized_by annotations, including their _or_null variant...
void Profile(llvm::FoldingSetNodeID &ID)
Represents a pointer type decayed from an array or function type.
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
DeclContext * getParent()
getParent - Returns the containing DeclContext.
bool isFileContext() const
bool isDependentContext() const
Determines whether this context is dependent on a template parameter.
DeclContext * getLexicalParent()
getLexicalParent - Returns the containing lexical DeclContext.
lookup_result lookup(DeclarationName Name) const
lookup - Find the declarations (if any) with the given Name in this context.
DeclContext * getRedeclContext()
getRedeclContext - Retrieve the context in which an entity conflicts with other entities of the same ...
void addDecl(Decl *D)
Add the declaration D into this context.
Decl::Kind getDeclKind() const
A reference to a declared variable, function, enum, etc.
Decl - This represents one declaration (or definition), e.g.
const DeclContext * getParentFunctionOrMethod(bool LexicalParent=false) const
If this decl is defined inside a function/method/block it returns the corresponding DeclContext,...
bool isModuleLocal() const
Whether this declaration was a local declaration to a C++20 named module.
ASTContext & getASTContext() const LLVM_READONLY
bool isImplicit() const
isImplicit - Indicates whether the declaration was implicitly generated by the implementation.
unsigned getMaxAlignment() const
getMaxAlignment - return the maximum alignment specified by attributes on this decl,...
bool isUnconditionallyVisible() const
Determine whether this declaration is definitely visible to name lookup, independent of whether the o...
static Decl * castFromDeclContext(const DeclContext *)
bool isTemplated() const
Determine whether this declaration is a templated entity (whether it is.
bool isCanonicalDecl() const
Whether this particular Decl is a canonical one.
Module * getOwningModule() const
Get the module that owns this declaration (for visibility purposes).
FunctionDecl * getAsFunction() LLVM_READONLY
Returns the function itself, or the templated function if this is a function template.
ObjCDeclQualifier
ObjCDeclQualifier - 'Qualifiers' written next to the return and parameter types in method declaration...
bool isInvalidDecl() const
llvm::iterator_range< specific_attr_iterator< T > > specific_attrs() const
SourceLocation getLocation() const
void setImplicit(bool I=true)
redecl_range redecls() const
Returns an iterator range for all the redeclarations of the same decl.
DeclContext * getDeclContext()
SourceLocation getBeginLoc() const LLVM_READONLY
void setDeclContext(DeclContext *DC)
setDeclContext - Set both the semantic and lexical DeclContext to DC.
DeclContext * getLexicalDeclContext()
getLexicalDeclContext - The declaration context where this Decl was lexically declared (LexicalDC).
virtual Decl * getCanonicalDecl()
Retrieves the "canonical" declaration of the given declaration.
DeclarationNameLoc - Additional source/type location info for a declaration name.
static DeclarationNameLoc makeCXXOperatorNameLoc(SourceLocation BeginLoc, SourceLocation EndLoc)
Construct location information for a non-literal C++ operator.
The name of a declaration.
static int compare(DeclarationName LHS, DeclarationName RHS)
Represents a ValueDecl that came out of a declarator.
TypeSourceInfo * getTypeSourceInfo() const
TemplateName getUnderlying() const
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context) const
DefaultArguments getDefaultArguments() const
Represents an extended address space qualifier where the input address space value is dependent.
Expr * getAddrSpaceExpr() const
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context)
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context)
Represents an array type in C++ whose size is a value-dependent expression.
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context)
Expr * getSizeExpr() const
Represents an extended vector type where either the type or size is dependent.
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context)
Represents a matrix type where the type and the number of rows and columns is dependent on a template...
Expr * getRowExpr() const
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context)
Represents a dependent template name that cannot be resolved prior to template instantiation.
void Profile(llvm::FoldingSetNodeID &ID) const
IdentifierOrOverloadedOperator getName() const
NestedNameSpecifier getQualifier() const
Return the nested name specifier that qualifies this name.
bool hasTemplateKeyword() const
Was this template name was preceeded by the template keyword?
Internal representation of canonical, dependent typeof(expr) types.
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context)
Represents a vector type where either the type or size is dependent.
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context)
Concrete class used by the front-end to report problems and issues.
DiagnosticBuilder Report(SourceLocation Loc, unsigned DiagID)
Issue the message to the client.
unsigned getCustomDiagID(Level L, const char(&FormatString)[N])
Return an ID for a diagnostic with the specified format string and level.
bool isScoped() const
Returns true if this is a C++11 scoped enumeration.
bool isComplete() const
Returns true if this can be considered a complete type.
EnumDecl * getDefinitionOrSelf() const
QualType getIntegerType() const
Return the integer type this enum decl corresponds to.
EnumDecl * getInstantiatedFromMemberEnum() const
Returns the enumeration (declared within the template) from which this enumeration type was instantia...
This represents one expression.
bool isIntegerConstantExpr(const ASTContext &Ctx) const
Expr * IgnoreParenCasts() LLVM_READONLY
Skip past any parentheses and casts which might surround this expression until reaching a fixed point...
bool isValueDependent() const
Determines whether the value of this expression depends on.
ExprValueKind getValueKind() const
getValueKind - The value kind that this expression produces.
bool isTypeDependent() const
Determines whether the type of this expression depends on.
std::optional< llvm::APSInt > getIntegerConstantExpr(const ASTContext &Ctx) const
isIntegerConstantExpr - Return the value if this expression is a valid integer constant expression.
FieldDecl * getSourceBitField()
If this expression refers to a bit-field, retrieve the declaration of that bit-field.
@ NPC_ValueDependentIsNull
Specifies that a value-dependent expression of integral or dependent type should be considered a null...
bool isInstantiationDependent() const
Whether this expression is instantiation-dependent, meaning that it depends in some way on.
Expr * IgnoreImpCasts() LLVM_READONLY
Skip past any implicit casts which might surround this expression until reaching a fixed point.
NullPointerConstantKind isNullPointerConstant(ASTContext &Ctx, NullPointerConstantValueDependence NPC) const
isNullPointerConstant - C99 6.3.2.3p3 - Test if this reduces down to a Null pointer constant.
static ExprValueKind getValueKindForType(QualType T)
getValueKindForType - Given a formal return or parameter type, give its value kind.
We can encode up to four bits in the low bits of a type pointer, but there are many more type qualifi...
void Profile(llvm::FoldingSetNodeID &ID) const
ExtVectorType - Extended vector type.
Declaration context for names declared as extern "C" in C++.
static ExternCContextDecl * Create(const ASTContext &C, TranslationUnitDecl *TU)
Abstract interface for external sources of AST nodes.
virtual void CompleteRedeclChain(const Decl *D)
Gives the external AST source an opportunity to complete the redeclaration chain for a declaration.
Represents a member of a struct/union/class.
bool isBitField() const
Determines whether this field is a bitfield.
unsigned getBitWidthValue() const
Computes the bit width of this field, if this is a bit field.
unsigned getFieldIndex() const
Returns the index of this field within its record, as appropriate for passing to ASTRecordLayout::get...
const RecordDecl * getParent() const
Returns the parent of this field declaration, which is the struct in which this field is defined.
static FieldDecl * Create(const ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id, QualType T, TypeSourceInfo *TInfo, Expr *BW, bool Mutable, InClassInitStyle InitStyle)
An opaque identifier used by SourceManager which refers to a source file (MemoryBuffer) along with it...
Represents a function declaration or definition.
bool isMultiVersion() const
True if this function is considered a multiversioned function.
unsigned getBuiltinID(bool ConsiderWrapperFunctions=false) const
Returns a value indicating whether this function corresponds to a builtin function.
bool isInlined() const
Determine whether this function should be inlined, because it is either marked "inline" or "constexpr...
bool isMSExternInline() const
The combination of the extern and inline keywords under MSVC forces the function to be required.
FunctionDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
FunctionDecl * getMostRecentDecl()
Returns the most recent (re)declaration of this declaration.
TemplateSpecializationKind getTemplateSpecializationKind() const
Determine what kind of template instantiation this function represents.
bool isUserProvided() const
True if this method is user-declared and was not deleted or defaulted on its first declaration.
FunctionDecl * getInstantiatedFromMemberFunction() const
If this function is an instantiation of a member function of a class template specialization,...
bool isInlineDefinitionExternallyVisible() const
For an inline function definition in C, or for a gnu_inline function in C++, determine whether the de...
FunctionDecl * getPreviousDecl()
Return the previous declaration of this declaration or NULL if this is the first declaration.
SmallVector< Conflict > Conflicts
static FunctionEffectSet getIntersection(FunctionEffectsRef LHS, FunctionEffectsRef RHS)
static FunctionEffectSet getUnion(FunctionEffectsRef LHS, FunctionEffectsRef RHS, Conflicts &Errs)
An immutable set of FunctionEffects and possibly conditions attached to them.
ArrayRef< EffectConditionExpr > conditions() const
Represents a K&R-style 'int foo()' function, which has no information available about its arguments.
void Profile(llvm::FoldingSetNodeID &ID)
Represents a prototype with parameter type info, e.g.
ExtParameterInfo getExtParameterInfo(unsigned I) const
ExceptionSpecificationType getExceptionSpecType() const
Get the kind of exception specification on this function.
unsigned getNumParams() const
QualType getParamType(unsigned i) const
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Ctx)
bool hasExceptionSpec() const
Return whether this function has any kind of exception spec.
bool isVariadic() const
Whether this function prototype is variadic.
ExtProtoInfo getExtProtoInfo() const
ArrayRef< QualType > getParamTypes() const
ArrayRef< ExtParameterInfo > getExtParameterInfos() const
bool hasExtParameterInfos() const
Is there any interesting extra information for any of the parameters of this function type?
Declaration of a template function.
A class which abstracts out some details necessary for making a call.
CallingConv getCC() const
bool getNoCfCheck() const
unsigned getRegParm() const
bool getNoCallerSavedRegs() const
ExtInfo withNoReturn(bool noReturn) const
bool getHasRegParm() const
bool getProducesResult() const
Interesting information about a specific parameter that can't simply be reflected in parameter's type...
ExtParameterInfo withIsNoEscape(bool NoEscape) const
FunctionType - C99 6.7.5.3 - Function Declarators.
ExtInfo getExtInfo() const
QualType getReturnType() const
GlobalDecl - represents a global declaration.
unsigned getMultiVersionIndex() const
CXXDtorType getDtorType() const
const Decl * getDecl() const
One of these records is kept for each identifier that is lexed.
unsigned getLength() const
Efficiently return the length of this identifier info.
StringRef getName() const
Return the actual identifier string.
Implements an efficient mapping from strings to IdentifierInfo nodes.
Describes a module import declaration, which makes the contents of the named module visible in the cu...
Represents a C array with an unspecified size.
void Profile(llvm::FoldingSetNodeID &ID)
static ItaniumMangleContext * create(ASTContext &Context, DiagnosticsEngine &Diags, bool IsAux=false)
@ Relative
Components in the vtable are relative offsets between the vtable and the other structs/functions.
@ Pointer
Components in the vtable are pointers to other structs/functions.
An lvalue reference type, per C++11 [dcl.ref].
@ Swift
Interoperability with the latest known version of the Swift runtime.
@ Swift4_2
Interoperability with the Swift 4.2 runtime.
@ Swift4_1
Interoperability with the Swift 4.1 runtime.
@ Integer
Permit vector bitcasts between integer vectors with different numbers of elements but the same total ...
@ All
Permit vector bitcasts between all vectors with the same total bit-width.
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
std::optional< TargetCXXABI::Kind > CXXABI
C++ ABI to compile with, if specified by the frontend through -fc++-abi=.
clang::ObjCRuntime ObjCRuntime
CoreFoundationABI CFRuntime
static void Profile(llvm::FoldingSetNodeID &ID, Parts P)
Sugar type that represents a type that was qualified by a qualifier written as a macro invocation.
MangleContext - Context for tracking state which persists across multiple calls to the C++ name mangl...
Keeps track of the mangled names of lambda expressions and block literals within a particular context...
QualType getElementType() const
Returns type of the elements being stored in the matrix.
static bool isValidElementType(QualType T)
Valid elements types are the following:
A pointer to member type per C++ 8.3.3 - Pointers to members.
void Profile(llvm::FoldingSetNodeID &ID)
Provides information a specialization of a member of a class template, which may be a member function...
static MicrosoftMangleContext * create(ASTContext &Context, DiagnosticsEngine &Diags, bool IsAux=false)
Describes a module or submodule.
bool isNamedModule() const
Does this Module is a named module of a standard named module?
This represents a decl that may have a name.
NamedDecl * getUnderlyingDecl()
Looks through UsingDecls and ObjCCompatibleAliasDecls for the underlying named decl.
IdentifierInfo * getIdentifier() const
Get the identifier that names this declaration, if there is one.
bool isPlaceholderVar(const LangOptions &LangOpts) const
DeclarationName getDeclName() const
Get the actual, stored name of the declaration, which may be a special name.
std::string getNameAsString() const
Get a human-readable name for the declaration, even if it is one of the special kinds of names (C++ c...
bool isExternallyVisible() const
Represent a C++ namespace.
static NamespaceDecl * Create(ASTContext &C, DeclContext *DC, bool Inline, SourceLocation StartLoc, SourceLocation IdLoc, IdentifierInfo *Id, NamespaceDecl *PrevDecl, bool Nested)
A C++ nested-name-specifier augmented with source location information.
Represents a C++ nested name specifier, such as "\::std::vector<int>::".
NestedNameSpecifier getCanonical() const
Retrieves the "canonical" nested name specifier for a given nested name specifier.
CXXRecordDecl * getAsMicrosoftSuper() const
NamespaceAndPrefix getAsNamespaceAndPrefix() const
bool isCanonical() const
Whether this nested name specifier is canonical.
const Type * getAsType() const
Kind
The kind of specifier that completes this nested name specifier.
@ MicrosoftSuper
Microsoft's '__super' specifier, stored as a CXXRecordDecl* of the class it appeared in.
@ Global
The global specifier '::'. There is no stored value.
@ Type
A type, stored as a Type*.
@ Namespace
A namespace-like entity, stored as a NamespaceBaseDecl*.
NonTypeTemplateParmDecl - Declares a non-type template parameter, e.g., "Size" in.
static NonTypeTemplateParmDecl * Create(const ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, unsigned D, unsigned P, const IdentifierInfo *Id, QualType T, bool ParameterPack, TypeSourceInfo *TInfo)
Helper data structure representing the traits in a match clause of an declare variant or metadirectiv...
ObjCCategoryDecl - Represents a category declaration.
ObjCCategoryImplDecl - An object of this class encapsulates a category @implementation declaration.
ObjCImplementationDecl - Represents a class definition - this is where method definitions are specifi...
Represents an ObjC class declaration.
ObjCTypeParamList * getTypeParamList() const
Retrieve the type parameters of this class.
static ObjCInterfaceDecl * Create(const ASTContext &C, DeclContext *DC, SourceLocation atLoc, const IdentifierInfo *Id, ObjCTypeParamList *typeParamList, ObjCInterfaceDecl *PrevDecl, SourceLocation ClassLoc=SourceLocation(), bool isInternal=false)
bool hasDefinition() const
Determine whether this class has been defined.
bool ClassImplementsProtocol(ObjCProtocolDecl *lProto, bool lookupCategory, bool RHSIsQualifiedID=false)
ClassImplementsProtocol - Checks that 'lProto' protocol has been implemented in IDecl class,...
StringRef getObjCRuntimeNameAsString() const
Produce a name to be used for class's metadata.
ObjCImplementationDecl * getImplementation() const
ObjCInterfaceDecl * getSuperClass() const
bool isSuperClassOf(const ObjCInterfaceDecl *I) const
isSuperClassOf - Return true if this class is the specified class or is a super class of the specifie...
known_extensions_range known_extensions() const
Represents typeof(type), a C23 feature and GCC extension, or `typeof_unqual(type),...
ObjCInterfaceDecl * getDecl() const
Get the declaration of this interface.
ObjCIvarDecl - Represents an ObjC instance variable.
ObjCIvarDecl * getNextIvar()
ObjCMethodDecl - Represents an instance or class method declaration.
ObjCDeclQualifier getObjCDeclQualifier() const
unsigned param_size() const
param_const_iterator param_end() const
param_const_iterator param_begin() const
const ParmVarDecl *const * param_const_iterator
Selector getSelector() const
bool isInstanceMethod() const
QualType getReturnType() const
Represents a pointer to an Objective C object.
bool isObjCQualifiedClassType() const
True if this is equivalent to 'Class.
const ObjCObjectPointerType * stripObjCKindOfTypeAndQuals(const ASTContext &ctx) const
Strip off the Objective-C "kindof" type and (with it) any protocol qualifiers.
bool isObjCQualifiedIdType() const
True if this is equivalent to 'id.
void Profile(llvm::FoldingSetNodeID &ID)
const ObjCObjectType * getObjectType() const
Gets the type pointed to by this ObjC pointer.
bool isObjCIdType() const
True if this is equivalent to the 'id' type, i.e.
QualType getPointeeType() const
Gets the type pointed to by this ObjC pointer.
ObjCInterfaceDecl * getInterfaceDecl() const
If this pointer points to an Objective @interface type, gets the declaration for that interface.
const ObjCInterfaceType * getInterfaceType() const
If this pointer points to an Objective C @interface type, gets the type for that interface.
bool isObjCClassType() const
True if this is equivalent to the 'Class' type, i.e.
Represents one property declaration in an Objective-C interface.
bool isReadOnly() const
isReadOnly - Return true iff the property has a setter.
static ObjCPropertyDecl * findPropertyDecl(const DeclContext *DC, const IdentifierInfo *propertyID, ObjCPropertyQueryKind queryKind)
Lookup a property by name in the specified DeclContext.
SetterKind getSetterKind() const
getSetterKind - Return the method used for doing assignment in the property setter.
Selector getSetterName() const
Selector getGetterName() const
ObjCPropertyAttribute::Kind getPropertyAttributes() const
ObjCPropertyImplDecl - Represents implementation declaration of a property in a class or category imp...
ObjCIvarDecl * getPropertyIvarDecl() const
Represents an Objective-C protocol declaration.
protocol_range protocols() const
bool isGNUFamily() const
Is this runtime basically of the GNU family of runtimes?
Represents the declaration of an Objective-C type parameter.
ObjCTypeParamVariance getVariance() const
Determine the variance of this type parameter.
Stores a list of Objective-C type parameters for a parameterized class or a category/extension thereo...
A structure for storing the information associated with an overloaded template name.
Represents a C++11 pack expansion that produces a sequence of expressions.
Sugar for parentheses used when specifying types.
void Profile(llvm::FoldingSetNodeID &ID)
void clear()
Clear parent maps.
Represents a parameter to a function.
ObjCDeclQualifier getObjCDeclQualifier() const
QualType getOriginalType() const
ParsedAttr - Represents a syntactic attribute.
void Profile(llvm::FoldingSetNodeID &ID)
Pointer-authentication qualifiers.
static PointerAuthQualifier Create(unsigned Key, bool IsAddressDiscriminated, unsigned ExtraDiscriminator, PointerAuthenticationMode AuthenticationMode, bool IsIsaPointer, bool AuthenticatesNullValues)
bool isEquivalent(PointerAuthQualifier Other) const
PointerType - C99 6.7.5.1 - Pointer Declarators.
QualType getPointeeType() const
void Profile(llvm::FoldingSetNodeID &ID)
Engages in a tight little dance with the lexer to efficiently preprocess tokens.
A (possibly-)qualified type.
bool hasAddressDiscriminatedPointerAuth() const
bool isVolatileQualified() const
Determine whether this type is volatile-qualified.
bool isTriviallyCopyableType(const ASTContext &Context) const
Return true if this is a trivially copyable type (C++0x [basic.types]p9)
Qualifiers::GC getObjCGCAttr() const
Returns gc attribute of this type.
bool hasQualifiers() const
Determine whether this type has any qualifiers.
QualType getDesugaredType(const ASTContext &Context) const
Return the specified type with any "sugar" removed from the type.
QualType withConst() const
bool hasLocalQualifiers() const
Determine whether this particular QualType instance has any qualifiers, without looking through any t...
bool isNull() const
Return true if this QualType doesn't point to a type yet.
const Type * getTypePtr() const
Retrieves a pointer to the underlying (unqualified) type.
LangAS getAddressSpace() const
Return the address space of this type.
Qualifiers getQualifiers() const
Retrieve the set of qualifiers applied to this type.
Qualifiers::ObjCLifetime getObjCLifetime() const
Returns lifetime attribute of this type.
QualType getCanonicalType() const
QualType getUnqualifiedType() const
Retrieve the unqualified variant of the given type, removing as little sugar as possible.
SplitQualType split() const
Divides a QualType into its unqualified type and a set of local qualifiers.
bool isConstQualified() const
Determine whether this type is const-qualified.
DestructionKind isDestructedType() const
Returns a nonzero value if objects of this type require non-trivial work to clean up after.
const Type * getTypePtrOrNull() const
static std::string getAsString(SplitQualType split, const PrintingPolicy &Policy)
PrimitiveCopyKind isNonTrivialToPrimitiveDestructiveMove() const
Check if this is a non-trivial type that would cause a C struct transitively containing this type to ...
Qualifiers getLocalQualifiers() const
Retrieve the set of qualifiers local to this particular QualType instance, not including any qualifie...
Represents a template name as written in source code.
void Profile(llvm::FoldingSetNodeID &ID)
A qualifier set is used to build a set of qualifiers.
const Type * strip(QualType type)
Collect any qualifiers on the given type and return an unqualified type.
The collection of all-type qualifiers we support.
unsigned getCVRQualifiers() const
void removeCVRQualifiers(unsigned mask)
void addAddressSpace(LangAS space)
static Qualifiers removeCommonQualifiers(Qualifiers &L, Qualifiers &R)
Returns the common set of qualifiers while removing them from the given sets.
@ OCL_Strong
Assigning into this object requires the old value to be released and the new value to be retained.
@ OCL_ExplicitNone
This object can be modified without requiring retains or releases.
@ OCL_None
There is no lifetime qualification on this type.
@ OCL_Weak
Reading or writing from this object requires a barrier call.
@ OCL_Autoreleasing
Assigning into this object requires a lifetime extension.
void removeObjCLifetime()
bool hasNonFastQualifiers() const
Return true if the set contains any qualifiers which require an ExtQuals node to be allocated.
void addConsistentQualifiers(Qualifiers qs)
Add the qualifiers from the given set to this set, given that they don't conflict.
void removeFastQualifiers(unsigned mask)
bool hasUnaligned() const
bool hasAddressSpace() const
static bool isAddressSpaceSupersetOf(LangAS A, LangAS B, const ASTContext &Ctx)
Returns true if address space A is equal to or a superset of B.
unsigned getFastQualifiers() const
void removeAddressSpace()
PointerAuthQualifier getPointerAuth() const
bool hasObjCGCAttr() const
uint64_t getAsOpaqueValue() const
bool hasObjCLifetime() const
ObjCLifetime getObjCLifetime() const
void addObjCGCAttr(GC type)
LangAS getAddressSpace() const
An rvalue reference type, per C++11 [dcl.ref].
Represents a struct/union/class.
bool isLambda() const
Determine whether this record is a class describing a lambda function object.
bool hasFlexibleArrayMember() const
field_range fields() const
static RecordDecl * Create(const ASTContext &C, TagKind TK, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, IdentifierInfo *Id, RecordDecl *PrevDecl=nullptr)
RecordDecl * getMostRecentDecl()
virtual void completeDefinition()
Note that the definition of this type is now complete.
RecordDecl * getDefinition() const
Returns the RecordDecl that actually defines this struct/union/class.
decl_type * getFirstDecl()
Return the first declaration of this declaration or itself if this is the only declaration.
Base for LValueReferenceType and RValueReferenceType.
QualType getPointeeType() const
void Profile(llvm::FoldingSetNodeID &ID)
This table allows us to fully hide how we implement multi-keyword caching.
std::string getAsString() const
Derive the full selector name (e.g.
Encodes a location in the source.
bool isValid() const
Return true if this is a valid SourceLocation object.
This class handles loading and caching of source files into memory.
A trivial tuple used to represent a source range.
SourceLocation getBegin() const
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context, bool Canonical, bool ProfileLambdaExpr=false) const
Produce a unique representation of the given statement.
The streaming interface shared between DiagnosticBuilder and PartialDiagnostic.
StringLiteral - This represents a string literal expression, e.g.
static StringLiteral * Create(const ASTContext &Ctx, StringRef Str, StringLiteralKind Kind, bool Pascal, QualType Ty, ArrayRef< SourceLocation > Locs)
This is the "fully general" constructor that allows representation of strings formed from one or more...
A structure for storing an already-substituted template template parameter pack.
Decl * getAssociatedDecl() const
A template-like entity which owns the whole pattern being substituted.
void Profile(llvm::FoldingSetNodeID &ID, ASTContext &Context)
TemplateTemplateParmDecl * getParameterPack() const
Retrieve the template template parameter pack being substituted.
TemplateArgument getArgumentPack() const
Retrieve the template template argument pack with which this parameter was substituted.
unsigned getIndex() const
Returns the index of the replaced parameter in the associated declaration.
A structure for storing the information associated with a substituted template template parameter.
void Profile(llvm::FoldingSetNodeID &ID)
TemplateTemplateParmDecl * getParameter() const
Represents the declaration of a struct/union/class/enum.
TypedefNameDecl * getTypedefNameForAnonDecl() const
void startDefinition()
Starts the definition of this tag declaration.
TagDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
TagKind getTagKind() const
bool isMicrosoft() const
Is this ABI an MSVC-compatible ABI?
Kind
The basic C++ ABI kind.
static Kind getKind(StringRef Name)
Exposes information about the current target.
TargetOptions & getTargetOpts() const
Retrieve the target options.
const llvm::Triple & getTriple() const
Returns the target triple of the primary target.
unsigned getMaxAtomicInlineWidth() const
Return the maximum width lock-free atomic operation which can be inlined given the supported features...
virtual LangAS getCUDABuiltinAddressSpace(unsigned AS) const
Map from the address space field in builtin description strings to the language address space.
virtual LangAS getOpenCLBuiltinAddressSpace(unsigned AS) const
Map from the address space field in builtin description strings to the language address space.
unsigned getDefaultAlignForAttributeAligned() const
Return the default alignment for attribute((aligned)) on this target, to be used if no alignment valu...
BuiltinVaListKind
The different kinds of __builtin_va_list types defined by the target implementation.
@ AArch64ABIBuiltinVaList
__builtin_va_list as defined by the AArch64 ABI http://infocenter.arm.com/help/topic/com....
@ PowerABIBuiltinVaList
__builtin_va_list as defined by the Power ABI: https://www.power.org /resources/downloads/Power-Arch-...
@ AAPCSABIBuiltinVaList
__builtin_va_list as defined by ARM AAPCS ABI http://infocenter.arm.com
@ CharPtrBuiltinVaList
typedef char* __builtin_va_list;
@ VoidPtrBuiltinVaList
typedef void* __builtin_va_list;
@ X86_64ABIBuiltinVaList
__builtin_va_list as defined by the x86-64 ABI: http://refspecs.linuxbase.org/elf/x86_64-abi-0....
virtual uint64_t getNullPointerValue(LangAS AddrSpace) const
Get integer value for null pointer.
static bool isTypeSigned(IntType T)
Returns true if the type is signed; false otherwise.
IntType getPtrDiffType(LangAS AddrSpace) const
IntType getSizeType() const
FloatModeKind getRealTypeByWidth(unsigned BitWidth, FloatModeKind ExplicitType) const
Return floating point type with specified width.
virtual IntType getIntTypeByWidth(unsigned BitWidth, bool IsSigned) const
Return integer type with specified width.
unsigned getMaxAlignedAttribute() const
Get the maximum alignment in bits for a static variable with aligned attribute.
virtual unsigned getMinGlobalAlign(uint64_t Size, bool HasNonWeakDef) const
getMinGlobalAlign - Return the minimum alignment of a global variable, unless its alignment is explic...
unsigned getTargetAddressSpace(LangAS AS) const
IntType getSignedSizeType() const
TargetCXXABI getCXXABI() const
Get the C++ ABI currently in use.
bool useAddressSpaceMapMangling() const
Specify if mangling based on address space map should be used or not for language specific address sp...
llvm::StringMap< bool > FeatureMap
The map of which features have been enabled disabled based on the command line.
A convenient class for passing around template argument information.
ArrayRef< TemplateArgumentLoc > arguments() const
ArrayRef< TemplateArgument > asArray() const
Produce this as an array ref.
Location wrapper for a TemplateArgument.
Represents a template argument.
ArrayRef< TemplateArgument > getPackAsArray() const
Return the array of arguments in this template argument pack.
QualType getStructuralValueType() const
Get the type of a StructuralValue.
QualType getParamTypeForDecl() const
Expr * getAsExpr() const
Retrieve the template argument as an expression.
UnsignedOrNone getNumTemplateExpansions() const
Retrieve the number of expansions that a template template argument expansion will produce,...
QualType getAsType() const
Retrieve the type for a type template argument.
llvm::APSInt getAsIntegral() const
Retrieve the template argument as an integral value.
QualType getNullPtrType() const
Retrieve the type for null non-type template argument.
static TemplateArgument CreatePackCopy(ASTContext &Context, ArrayRef< TemplateArgument > Args)
Create a new template argument pack by copying the given set of template arguments.
TemplateName getAsTemplate() const
Retrieve the template name for a template name argument.
bool structurallyEquals(const TemplateArgument &Other) const
Determines whether two template arguments are superficially the same.
QualType getIntegralType() const
Retrieve the type of the integral value.
bool getIsDefaulted() const
If returns 'true', this TemplateArgument corresponds to a default template parameter.
ValueDecl * getAsDecl() const
Retrieve the declaration for a declaration non-type template argument.
ArrayRef< TemplateArgument > pack_elements() const
Iterator range referencing all of the elements of a template argument pack.
@ Declaration
The template argument is a declaration that was provided for a pointer, reference,...
@ Template
The template argument is a template name that was provided for a template template parameter.
@ StructuralValue
The template argument is a non-type template argument that can't be represented by the special-case D...
@ Pack
The template argument is actually a parameter pack.
@ TemplateExpansion
The template argument is a pack expansion of a template name that was provided for a template templat...
@ NullPtr
The template argument is a null pointer or null pointer to member that was provided for a non-type te...
@ Type
The template argument is a type.
@ Null
Represents an empty template argument, e.g., one that has not been deduced.
@ Integral
The template argument is an integral value stored in an llvm::APSInt that was provided for an integra...
@ Expression
The template argument is an expression, and we've not resolved it to one of the other forms yet,...
ArgKind getKind() const
Return the kind of stored template argument.
TemplateName getAsTemplateOrTemplatePattern() const
Retrieve the template argument as a template name; if the argument is a pack expansion,...
const APValue & getAsStructuralValue() const
Get the value of a StructuralValue.
The base class of all kinds of template declarations (e.g., class, function, etc.).
TemplateParameterList * getTemplateParameters() const
Get the list of template parameters.
Represents a C++ template name within the type system.
TemplateDecl * getAsTemplateDecl(bool IgnoreDeduced=false) const
Retrieve the underlying template declaration that this template name refers to, if known.
DeducedTemplateStorage * getAsDeducedTemplateName() const
Retrieve the deduced template info, if any.
DependentTemplateName * getAsDependentTemplateName() const
Retrieve the underlying dependent template name structure, if any.
std::optional< TemplateName > desugar(bool IgnoreDeduced) const
OverloadedTemplateStorage * getAsOverloadedTemplate() const
Retrieve the underlying, overloaded function template declarations that this template name refers to,...
AssumedTemplateStorage * getAsAssumedTemplateName() const
Retrieve information on a name that has been assumed to be a template-name in order to permit a call ...
void * getAsVoidPointer() const
Retrieve the template name as a void pointer.
@ UsingTemplate
A template name that refers to a template declaration found through a specific using shadow declarati...
@ OverloadedTemplate
A set of overloaded template declarations.
@ Template
A single template declaration.
@ DependentTemplate
A dependent template name that has not been resolved to a template (or set of templates).
@ SubstTemplateTemplateParm
A template template parameter that has been substituted for some other template name.
@ SubstTemplateTemplateParmPack
A template template parameter pack that has been substituted for a template template argument pack,...
@ DeducedTemplate
A template name that refers to another TemplateName with deduced default arguments.
@ QualifiedTemplate
A qualified template name, where the qualification is kept to describe the source code as written.
@ AssumedTemplate
An unqualified-id that has been assumed to name a function template that will be found by ADL.
UsingShadowDecl * getAsUsingShadowDecl() const
Retrieve the using shadow declaration through which the underlying template declaration is introduced...
SubstTemplateTemplateParmPackStorage * getAsSubstTemplateTemplateParmPack() const
Retrieve the substituted template template parameter pack, if known.
SubstTemplateTemplateParmStorage * getAsSubstTemplateTemplateParm() const
Retrieve the substituted template template parameter, if known.
A template parameter object.
static void Profile(llvm::FoldingSetNodeID &ID, QualType T, const APValue &V)
Stores a list of template parameters for a TemplateDecl and its derived classes.
NamedDecl * getParam(unsigned Idx)
static TemplateParameterList * Create(const ASTContext &C, SourceLocation TemplateLoc, SourceLocation LAngleLoc, ArrayRef< NamedDecl * > Params, SourceLocation RAngleLoc, Expr *RequiresClause)
NamedDecl *const * const_iterator
Iterates through the template parameters in this list.
Expr * getRequiresClause()
The constraint-expression of the associated requires-clause.
ArrayRef< NamedDecl * > asArray()
TemplateTemplateParmDecl - Declares a template template parameter, e.g., "T" in.
TemplateNameKind templateParameterKind() const
unsigned getPosition() const
Get the position of the template parameter within its parameter list.
static TemplateTemplateParmDecl * Create(const ASTContext &C, DeclContext *DC, SourceLocation L, unsigned D, unsigned P, bool ParameterPack, IdentifierInfo *Id, TemplateNameKind ParameterKind, bool Typename, TemplateParameterList *Params)
bool isParameterPack() const
Whether this template template parameter is a template parameter pack.
unsigned getIndex() const
Get the index of the template parameter within its parameter list.
unsigned getDepth() const
Get the nesting depth of the template parameter.
Declaration of a template type parameter.
static TemplateTypeParmDecl * Create(const ASTContext &C, DeclContext *DC, SourceLocation KeyLoc, SourceLocation NameLoc, unsigned D, unsigned P, IdentifierInfo *Id, bool Typename, bool ParameterPack, bool HasTypeConstraint=false, UnsignedOrNone NumExpanded=std::nullopt)
Models the abbreviated syntax to constrain a template type parameter: template <convertible_to<string...
Expr * getImmediatelyDeclaredConstraint() const
Get the immediately-declared constraint expression introduced by this type-constraint,...
TemplateDecl * getNamedConcept() const
ConceptReference * getConceptReference() const
Represents a declaration of a type.
T castAs() const
Convert to the specified TypeLoc type, asserting that this TypeLoc is of the desired type.
static unsigned getFullDataSizeForType(QualType Ty)
Returns the size of type source info data block for the given type.
void initialize(ASTContext &Context, SourceLocation Loc) const
Initializes this to state that every location in this type is the given location.
Represents a typeof (or typeof) expression (a C23 feature and GCC extension) or a typeof_unqual expre...
A container of type source information.
TypeLoc getTypeLoc() const
Return the TypeLoc wrapper for the type source info.
The base class of the type hierarchy.
bool isBlockPointerType() const
bool isObjCBuiltinType() const
QualType getRVVEltType(const ASTContext &Ctx) const
Returns the representative type for the element of an RVV builtin type.
bool isIncompleteArrayType() const
bool isSignedIntegerType() const
Return true if this is an integer type that is signed, according to C99 6.2.5p4 [char,...
CXXRecordDecl * getAsCXXRecordDecl() const
Retrieves the CXXRecordDecl that this type refers to, either because the type is a RecordType or beca...
bool isConstantArrayType() const
RecordDecl * getAsRecordDecl() const
Retrieves the RecordDecl this type refers to.
bool isConstantSizeType() const
Return true if this is not a variable sized type, according to the rules of C99 6....
bool isPointerType() const
bool isArrayParameterType() const
CanQualType getCanonicalTypeUnqualified() const
bool isIntegerType() const
isIntegerType() does not include complex integers (a GCC extension).
const T * castAs() const
Member-template castAs<specific type>.
bool isSignedFixedPointType() const
Return true if this is a fixed point type that is signed according to ISO/IEC JTC1 SC22 WG14 N1169.
bool isEnumeralType() const
bool isObjCQualifiedIdType() const
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.
bool isIntegralOrEnumerationType() const
Determine whether this type is an integral or enumeration type.
AutoType * getContainedAutoType() const
Get the AutoType whose type will be deduced for a variable with an initializer of this type.
bool isInstantiationDependentType() const
Determine whether this type is an instantiation-dependent type, meaning that the type involves a temp...
bool isBitIntType() const
bool isBuiltinType() const
Helper methods to distinguish type categories.
bool isDependentType() const
Whether this type is a dependent type, meaning that its definition somehow depends on a template para...
bool isFixedPointType() const
Return true if this is a fixed point type according to ISO/IEC JTC1 SC22 WG14 N1169.
bool isSaturatedFixedPointType() const
Return true if this is a saturated fixed point type according to ISO/IEC JTC1 SC22 WG14 N1169.
bool containsUnexpandedParameterPack() const
Whether this type is or contains an unexpanded parameter pack, used to support C++0x variadic templat...
QualType getCanonicalTypeInternal() const
@ PtrdiffT
The "ptrdiff_t" type.
@ SizeT
The "size_t" type.
@ SignedSizeT
The signed integer type corresponding to "size_t".
bool isObjCIdType() const
bool isUnsaturatedFixedPointType() const
Return true if this is a saturated fixed point type according to ISO/IEC JTC1 SC22 WG14 N1169.
const ArrayType * getAsArrayTypeUnsafe() const
A variant of getAs<> for array types which silently discards qualifiers from the outermost type.
EnumDecl * getAsEnumDecl() const
Retrieves the EnumDecl this type refers to.
bool isIncompleteType(NamedDecl **Def=nullptr) const
Types are partitioned into 3 broad categories (C99 6.2.5p1): object types, function types,...
bool isFunctionType() const
bool isObjCObjectPointerType() const
bool isUnsignedFixedPointType() const
Return true if this is a fixed point type that is unsigned according to ISO/IEC JTC1 SC22 WG14 N1169.
bool isVectorType() const
bool isObjCClassType() const
bool isRVVVLSBuiltinType() const
Determines if this is a sizeless type supported by the 'riscv_rvv_vector_bits' type attribute,...
bool isRVVSizelessBuiltinType() const
Returns true for RVV scalable vector types.
const T * getAsCanonical() const
If this type is canonically the specified type, return its canonical type cast to that specified type...
bool isUnsignedIntegerType() const
Return true if this is an integer type that is unsigned, according to C99 6.2.5p6 [which returns true...
bool isAnyPointerType() const
TypeClass getTypeClass() const
bool isCanonicalUnqualified() const
Determines if this type would be canonical if it had no further qualification.
const T * getAs() const
Member-template getAs<specific type>'.
const Type * getUnqualifiedDesugaredType() const
Return the specified type with any "sugar" removed from the type, removing any typedefs,...
bool isNullPtrType() const
bool isRecordType() const
bool isObjCRetainableType() const
std::optional< NullabilityKind > getNullability() const
Determine the nullability of the given type.
Represents the declaration of a typedef-name via the 'typedef' type specifier.
static TypedefDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id, TypeSourceInfo *TInfo)
Base class for declarations which introduce a typedef-name.
QualType getUnderlyingType() const
static void Profile(llvm::FoldingSetNodeID &ID, ElaboratedTypeKeyword Keyword, NestedNameSpecifier Qualifier, const TypedefNameDecl *Decl, QualType Underlying)
An artificial decl, representing a global anonymous constant value which is uniquified by value withi...
static void Profile(llvm::FoldingSetNodeID &ID, QualType Ty, const APValue &APVal)
The iterator over UnresolvedSets.
Represents the dependent type named by a dependently-scoped typename using declaration,...
static void Profile(llvm::FoldingSetNodeID &ID, ElaboratedTypeKeyword Keyword, NestedNameSpecifier Qualifier, const UnresolvedUsingTypenameDecl *D)
Represents a dependent using declaration which was marked with typename.
UnresolvedUsingTypenameDecl * getCanonicalDecl() override
Retrieves the canonical declaration of this declaration.
Represents a C++ using-enum-declaration.
Represents a shadow declaration implicitly introduced into a scope by a (resolved) using-declaration ...
NamedDecl * getTargetDecl() const
Gets the underlying declaration which has been brought into the local scope.
BaseUsingDecl * getIntroducer() const
Gets the (written or instantiated) using declaration that introduced this declaration.
static void Profile(llvm::FoldingSetNodeID &ID, ElaboratedTypeKeyword Keyword, NestedNameSpecifier Qualifier, const UsingShadowDecl *D, QualType UnderlyingType)
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
void setType(QualType newType)
bool isWeak() const
Determine whether this symbol is weakly-imported, or declared with the weak or weak-ref attr.
Represents a variable declaration or definition.
VarTemplateDecl * getDescribedVarTemplate() const
Retrieves the variable template that is described by this variable declaration.
bool isOutOfLine() const override
Determine whether this is or was instantiated from an out-of-line definition of a static data member.
bool isStaticDataMember() const
Determines whether this is a static data member.
redecl_range redecls() const
Returns an iterator range for all the redeclarations of the same decl.
bool isStaticLocal() const
Returns true if a variable with function scope is a static local variable.
VarDecl * getInstantiatedFromStaticDataMember() const
If this variable is an instantiated static data member of a class template specialization,...
bool isInline() const
Whether this variable is (C++1z) inline.
@ DeclarationOnly
This declaration is only a declaration.
DefinitionKind hasDefinition(ASTContext &) const
Check whether this variable is defined in this translation unit.
TemplateSpecializationKind getTemplateSpecializationKind() const
If this variable is an instantiation of a variable template or a static data member of a class templa...
Represents a C array with a specified size that is not an integer-constant-expression.
Expr * getSizeExpr() const
Represents a GCC generic vector type.
unsigned getNumElements() const
void Profile(llvm::FoldingSetNodeID &ID)
VectorKind getVectorKind() const
QualType getElementType() const
Holds all information required to evaluate constexpr code in a module.
Defines the Linkage enumeration and various utility functions.
Defines the clang::TargetInfo interface.
mlir::Type getBaseType(mlir::Value varPtr)
const AstTypeMatcher< TagType > tagType
SmallVector< BoundNodes, 1 > match(MatcherT Matcher, const NodeT &Node, ASTContext &Context)
Returns the results of matching Matcher on Node.
const internal::VariadicAllOfMatcher< Type > type
Matches Types in the clang AST.
const AstTypeMatcher< ArrayType > arrayType
@ OS
Indicates that the tracking object is a descendant of a referenced-counted OSObject,...
The JSON file list parser is used to communicate input to InstallAPI.
CanQual< Type > CanQualType
Represents a canonical, potentially-qualified type.
bool isa(CodeGen::Address addr)
GVALinkage
A more specific kind of linkage than enum Linkage.
@ GVA_AvailableExternally
AutoTypeKeyword
Which keyword(s) were used to create an AutoType.
OpenCLTypeKind
OpenCL type kinds.
FunctionType::ExtInfo getFunctionExtInfo(const Type &t)
bool isUnresolvedExceptionSpec(ExceptionSpecificationType ESpecType)
NullabilityKind
Describes the nullability of a particular type.
@ Nullable
Values of this type can be null.
@ Unspecified
Whether values of this type can be null is (explicitly) unspecified.
@ NonNull
Values of this type can never be null.
@ ICIS_NoInit
No in-class initializer.
@ TemplateName
The identifier is a template name. FIXME: Add an annotation for that.
std::pair< FileID, unsigned > FileIDAndOffset
CXXABI * CreateMicrosoftCXXABI(ASTContext &Ctx)
@ Vector
'vector' clause, allowed on 'loop', Combined, and 'routine' directives.
@ Self
'self' clause, allowed on Compute and Combined Constructs, plus 'update'.
TypeOfKind
The kind of 'typeof' expression we're after.
SmallVector< Attr *, 4 > AttrVec
AttrVec - A vector of Attr, which is how they are stored on the AST.
nullptr
This class represents a compute construct, representing a 'Kind' of ‘parallel’, 'serial',...
CXXABI * CreateItaniumCXXABI(ASTContext &Ctx)
Creates an instance of a C++ ABI class.
const StreamingDiagnostic & operator<<(const StreamingDiagnostic &DB, const ASTContext::SectionInfo &Section)
Insertion operator for diagnostics.
Linkage
Describes the different kinds of linkage (C++ [basic.link], C99 6.2.2) that an entity may have.
@ External
External linkage, which indicates that the entity can be referred to from other translation units.
@ Result
The result type of a method or function.
ArraySizeModifier
Capture whether this is a normal array (e.g.
bool isComputedNoexcept(ExceptionSpecificationType ESpecType)
@ Template
We are parsing a template declaration.
@ Interface
The "__interface" keyword.
@ Struct
The "struct" keyword.
@ Class
The "class" keyword.
constexpr uint16_t SelPointerConstantDiscriminator
Constant discriminator to be used with objective-c sel pointers.
bool isDiscardableGVALinkage(GVALinkage L)
BuiltinTemplateKind
Kinds of BuiltinTemplateDecl.
@ Keyword
The name has been typo-corrected to a keyword.
LangAS
Defines the address space values used by the address space qualifier of QualType.
TranslationUnitKind
Describes the kind of translation unit being processed.
bool isPtrSizeAddressSpace(LangAS AS)
ExprValueKind
The categorization of expression values, currently following the C++11 scheme.
@ VK_PRValue
A pr-value expression (in the C++11 taxonomy) produces a temporary value.
@ VK_XValue
An x-value expression is a reference to an object with independent storage but which can be "moved",...
@ VK_LValue
An l-value expression is a reference to an object with independent storage.
const FunctionProtoType * T
bool declaresSameEntity(const Decl *D1, const Decl *D2)
Determine whether two declarations declare the same entity.
TemplateSpecializationKind
Describes the kind of template specialization that a particular template specialization declaration r...
@ TSK_ExplicitInstantiationDefinition
This template specialization was instantiated from a template due to an explicit instantiation defini...
@ TSK_ExplicitInstantiationDeclaration
This template specialization was instantiated from a template due to an explicit instantiation declar...
@ TSK_ExplicitSpecialization
This template specialization was declared or defined by an explicit specialization (C++ [temp....
@ TSK_ImplicitInstantiation
This template specialization was implicitly instantiated from a template.
@ TSK_Undeclared
This template specialization was formed from a template-id but has not yet been declared,...
CallingConv
CallingConv - Specifies the calling convention that a function uses.
@ Invariant
The parameter is invariant: must match exactly.
@ Contravariant
The parameter is contravariant, e.g., X<T> is a subtype of X when the type parameter is covariant and...
@ Covariant
The parameter is covariant, e.g., X<T> is a subtype of X when the type parameter is covariant and T i...
@ AltiVecBool
is AltiVec 'vector bool ...'
@ SveFixedLengthData
is AArch64 SVE fixed-length data vector
@ AltiVecPixel
is AltiVec 'vector Pixel'
@ Generic
not a target-specific vector type
@ RVVFixedLengthData
is RISC-V RVV fixed-length data vector
@ RVVFixedLengthMask
is RISC-V RVV fixed-length mask vector
@ SveFixedLengthPredicate
is AArch64 SVE fixed-length predicate vector
U cast(CodeGen::Address addr)
LangAS getLangASFromTargetAS(unsigned TargetAS)
@ None
The alignment was not explicit in code.
@ RequiredByEnum
The alignment comes from an alignment attribute on a enum type.
@ RequiredByTypedef
The alignment comes from an alignment attribute on a typedef.
@ RequiredByRecord
The alignment comes from an alignment attribute on a record type.
ElaboratedTypeKeyword
The elaboration keyword that precedes a qualified type name or introduces an elaborated-type-specifie...
@ Interface
The "__interface" keyword introduces the elaborated-type-specifier.
@ None
No keyword precedes the qualified type name.
@ Struct
The "struct" keyword introduces the elaborated-type-specifier.
@ Class
The "class" keyword introduces the elaborated-type-specifier.
@ Union
The "union" keyword introduces the elaborated-type-specifier.
@ Enum
The "enum" keyword introduces the elaborated-type-specifier.
@ Typename
The "typename" keyword precedes the qualified type name, e.g., typename T::type.
ExceptionSpecificationType
The various types of exception specifications that exist in C++11.
@ EST_DependentNoexcept
noexcept(expression), value-dependent
@ EST_Uninstantiated
not instantiated yet
@ EST_Unparsed
not parsed yet
@ EST_NoThrow
Microsoft __declspec(nothrow) extension.
@ EST_None
no exception specification
@ EST_MSAny
Microsoft throw(...) extension.
@ EST_BasicNoexcept
noexcept
@ EST_NoexceptFalse
noexcept(expression), evals to 'false'
@ EST_Unevaluated
not evaluated yet, for special member function
@ EST_NoexceptTrue
noexcept(expression), evals to 'true'
@ EST_Dynamic
throw(T1, T2)
Diagnostic wrappers for TextAPI types for error reporting.
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
static bool isEqual(const FoldingSetNodeID &LHS, const FoldingSetNodeID &RHS)
static FoldingSetNodeID getTombstoneKey()
static FoldingSetNodeID getEmptyKey()
static unsigned getHashValue(const FoldingSetNodeID &Val)