70#include "llvm/ADT/APFixedPoint.h"
71#include "llvm/ADT/APInt.h"
72#include "llvm/ADT/APSInt.h"
73#include "llvm/ADT/ArrayRef.h"
74#include "llvm/ADT/DenseMap.h"
75#include "llvm/ADT/DenseSet.h"
76#include "llvm/ADT/FoldingSet.h"
77#include "llvm/ADT/PointerUnion.h"
78#include "llvm/ADT/STLExtras.h"
79#include "llvm/ADT/SmallPtrSet.h"
80#include "llvm/ADT/SmallVector.h"
81#include "llvm/ADT/StringExtras.h"
82#include "llvm/ADT/StringRef.h"
83#include "llvm/Frontend/OpenMP/OMPIRBuilder.h"
84#include "llvm/Support/Capacity.h"
85#include "llvm/Support/Casting.h"
86#include "llvm/Support/Compiler.h"
87#include "llvm/Support/ErrorHandling.h"
88#include "llvm/Support/MD5.h"
89#include "llvm/Support/MathExtras.h"
90#include "llvm/Support/SipHash.h"
91#include "llvm/Support/raw_ostream.h"
92#include "llvm/TargetParser/AArch64TargetParser.h"
93#include "llvm/TargetParser/Triple.h"
106using namespace clang;
124 if (
const auto *MI = dyn_cast<const MacroInfo *>(Key)) {
138 StringRef Buffer = SourceMgr.getBufferData(Decomposed.first, &
Invalid);
141 unsigned Offset = Decomposed.second;
142 if (
size_t Found = Buffer.find_last_of(
"#\n", Offset);
143 Found != StringRef::npos)
145 return {SourceMgr.getLocForStartOfFile(Decomposed.first)
146 .getLocWithOffset(Offset)};
157 if (
const auto *FD = dyn_cast<FunctionDecl>(D)) {
162 if (
const auto *VD = dyn_cast<VarDecl>(D)) {
163 if (VD->isStaticDataMember() &&
168 if (
const auto *CRD = dyn_cast<CXXRecordDecl>(D)) {
173 if (
const auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(D)) {
180 if (
const auto *ED = dyn_cast<EnumDecl>(D)) {
184 if (
const auto *TD = dyn_cast<TagDecl>(D)) {
187 if (TD->isEmbeddedInDeclarator() && !TD->isCompleteDefinition())
214 BaseLocation = D->getBeginLoc();
216 BaseLocation = D->getLocation();
218 if (!D->getLocation().isMacroID()) {
219 Locations.emplace_back(BaseLocation);
221 const auto *DeclCtx = D->getDeclContext();
232 Locations.emplace_back(SourceMgr.getExpansionLoc(BaseLocation));
239 Locations.emplace_back(SourceMgr.getSpellingLoc(D->getBeginLoc()));
247 const std::map<unsigned, RawComment *> &CommentsInTheFile)
const {
254 if (CommentsInTheFile.empty())
257 const auto *D = dyn_cast<const Decl *>(Key);
263 SourceMgr.getDecomposedLoc(RepresentativeLoc);
266 auto OffsetCommentBehindDecl =
267 CommentsInTheFile.lower_bound(LocDecomp.second);
270 if (OffsetCommentBehindDecl != CommentsInTheFile.end()) {
271 RawComment *CommentBehindDecl = OffsetCommentBehindDecl->second;
273 LangOpts.CommentOpts.ParseAllComments) &&
281 if (SourceMgr.getLineNumber(LocDecomp.first, LocDecomp.second) ==
282 Comments.getCommentBeginLine(CommentBehindDecl, LocDecomp.first,
283 OffsetCommentBehindDecl->first)) {
284 return CommentBehindDecl;
291 if (OffsetCommentBehindDecl == CommentsInTheFile.begin())
294 auto OffsetCommentBeforeDecl = --OffsetCommentBehindDecl;
295 RawComment *CommentBeforeDecl = OffsetCommentBeforeDecl->second;
299 LangOpts.CommentOpts.ParseAllComments) ||
304 const unsigned CommentEndOffset =
305 Comments.getCommentEndOffset(CommentBeforeDecl);
310 SourceMgr.getBufferData(LocDecomp.first, &
Invalid).data();
315 StringRef
Text(Buffer + CommentEndOffset,
316 LocDecomp.second - CommentEndOffset);
320 if (
Text.find_last_of(
";{}#@") != StringRef::npos)
323 return CommentBeforeDecl;
329 for (
const auto Loc : Locs) {
332 if (Loc.isInvalid() || !Loc.isFileID())
343 const FileID File = SourceMgr.getDecomposedLoc(Loc).first;
347 const auto CommentsInThisFile =
Comments.getCommentsInFile(
File);
348 if (!CommentsInThisFile || CommentsInThisFile->empty())
360 assert(LangOpts.RetainCommentsFromSystemHeaders ||
362 Comments.addComment(RC, LangOpts.CommentOpts, BumpAlloc);
367 const Decl **OriginalDecl)
const {
370 *OriginalDecl =
nullptr;
376 if (
const auto *MI = dyn_cast<const MacroInfo *>(Key)) {
378 *OriginalDecl =
nullptr;
381 return Existing->second;
398 return DeclComment->second;
411 *OriginalDecl = RedeclComment->second;
412 auto CommentAtRedecl =
RawComments.find(RedeclComment->second);
414 "This decl is supposed to have comment attached.");
415 return CommentAtRedecl->second;
420 const Decl *LastCheckedRedecl = [&]() {
422 bool CanUseCommentlessCache =
false;
424 for (
auto *Redecl : CanonicalD->
redecls()) {
426 CanUseCommentlessCache =
true;
429 if (Redecl == LastChecked)
436 return CanUseCommentlessCache ? LastChecked :
nullptr;
442 if (LastCheckedRedecl) {
443 if (LastCheckedRedecl == Redecl) {
444 LastCheckedRedecl =
nullptr;
452 *OriginalDecl = Redecl;
453 return RedeclComment;
459 *OriginalDecl =
nullptr;
465 assert(Comment.
isDocumentation() || LangOpts.CommentOpts.ParseAllComments);
467 if (
const auto *D = dyn_cast<const Decl *>(Original)) {
477 if (
const auto *IMD = dyn_cast<ObjCImplDecl>(DC)) {
482 for (
const auto *Ext : ID->known_extensions()) {
486 Redeclared.push_back(RedeclaredMethod);
493 if (
Comments.empty() || Decls.empty())
497 for (
const Decl *D : Decls) {
498 if (D->isInvalidDecl())
506 File = SourceMgr.getDecomposedLoc(Loc).first;
511 if (
File.isInvalid())
514 auto CommentsInThisFile =
Comments.getCommentsInFile(
File);
515 if (!CommentsInThisFile || CommentsInThisFile->empty() ||
516 CommentsInThisFile->rbegin()->second->isAttached())
526 for (
const Decl *D : Decls) {
528 if (D->isInvalidDecl())
538 for (
const auto DeclLoc : DeclLocs) {
539 if (DeclLoc.isInvalid() || !DeclLoc.isFileID())
554 const Decl *D)
const {
557 ThisDeclInfo->IsFilled =
false;
558 ThisDeclInfo->fill();
559 ThisDeclInfo->CommentDecl = FC->
getDecl();
560 if (!ThisDeclInfo->TemplateParameters)
570 return RC ? RC->
parse(*
this,
nullptr, D) :
nullptr;
581 llvm::DenseMap<const Decl *, comments::FullComment *>::iterator Pos =
585 if (Canonical != D) {
593 const Decl *OriginalDecl =
nullptr;
599 const auto *OMD = dyn_cast<ObjCMethodDecl>(D);
600 if (OMD && OMD->isPropertyAccessor())
607 for (
unsigned i = 0, e = Overridden.size(); i < e; i++)
611 else if (
const auto *TD = dyn_cast<TypedefNameDecl>(D)) {
614 QualType QT = TD->getUnderlyingType();
615 if (
const auto *TT = QT->
getAs<TagType>())
619 else if (
const auto *IC = dyn_cast<ObjCInterfaceDecl>(D)) {
620 while (IC->getSuperClass()) {
621 IC = IC->getSuperClass();
626 else if (
const auto *CD = dyn_cast<ObjCCategoryDecl>(D)) {
631 else if (
const auto *RD = dyn_cast<CXXRecordDecl>(D)) {
632 if (!(RD = RD->getDefinition()))
635 for (
const auto &I : RD->bases()) {
636 if (I.isVirtual() || (I.getAccessSpecifier() !=
AS_public))
650 for (
const auto &I : RD->vbases()) {
671 if (D != OriginalDecl && OriginalDecl)
679void ASTContext::CanonicalTemplateTemplateParm::Profile(
688 ID.AddInteger(Params->
size());
690 PEnd = Params->
end();
692 if (
const auto *TTP = dyn_cast<TemplateTypeParmDecl>(*P)) {
694 ID.AddBoolean(TTP->isParameterPack());
696 TTP->getNumExpansionParameters().toInternalRepresentation());
700 if (
const auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(*P)) {
702 ID.AddBoolean(NTTP->isParameterPack());
703 ID.AddPointer(
C.getUnconstrainedType(
C.getCanonicalType(NTTP->getType()))
705 if (NTTP->isExpandedParameterPack()) {
707 ID.AddInteger(NTTP->getNumExpansionTypes());
708 for (
unsigned I = 0, N = NTTP->getNumExpansionTypes(); I != N; ++I) {
709 QualType T = NTTP->getExpansionType(I);
710 ID.AddPointer(T.getCanonicalType().getAsOpaquePtr());
713 ID.AddBoolean(
false);
723TemplateTemplateParmDecl *
727 llvm::FoldingSetNodeID ID;
728 CanonicalTemplateTemplateParm::Profile(ID, *
this, TTP);
729 void *InsertPos =
nullptr;
730 CanonicalTemplateTemplateParm *Canonical
731 = CanonTemplateTemplateParms.FindNodeOrInsertPos(ID, InsertPos);
733 return Canonical->getParam();
738 CanonParams.reserve(Params->
size());
740 PEnd = Params->
end();
744 if (
const auto *TTP = dyn_cast<TemplateTypeParmDecl>(*P)) {
749 TTP->getNumExpansionParameters());
750 CanonParams.push_back(NewTTP);
751 }
else if (
const auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(*P)) {
755 if (NTTP->isExpandedParameterPack()) {
758 for (
unsigned I = 0, N = NTTP->getNumExpansionTypes(); I != N; ++I) {
760 ExpandedTInfos.push_back(
768 NTTP->getPosition(),
nullptr,
778 NTTP->getPosition(),
nullptr,
780 NTTP->isParameterPack(),
783 CanonParams.push_back(Param);
799 Canonical = CanonTemplateTemplateParms.FindNodeOrInsertPos(ID, InsertPos);
800 assert(!Canonical &&
"Shouldn't be in the map!");
804 Canonical =
new (*this) CanonicalTemplateTemplateParm(CanonTTP);
805 CanonTemplateTemplateParms.InsertNode(Canonical, InsertPos);
812 llvm::FoldingSetNodeID ID;
813 CanonicalTemplateTemplateParm::Profile(ID, *
this, TTP);
814 void *InsertPos =
nullptr;
815 CanonicalTemplateTemplateParm *Canonical =
816 CanonTemplateTemplateParms.FindNodeOrInsertPos(ID, InsertPos);
817 return Canonical ? Canonical->getParam() :
nullptr;
823 llvm::FoldingSetNodeID ID;
824 CanonicalTemplateTemplateParm::Profile(ID, *
this, CanonTTP);
825 void *InsertPos =
nullptr;
827 CanonTemplateTemplateParms.FindNodeOrInsertPos(ID, InsertPos))
828 return Existing->getParam();
829 CanonTemplateTemplateParms.InsertNode(
830 new (*
this) CanonicalTemplateTemplateParm(CanonTTP), InsertPos);
851 [](
const DynTypedNode &P) { return P.get<WhileStmt>() != nullptr; });
875 return NoSanitizeL->containsType(Mask, TyName);
884 if (!LangOpts.CPlusPlus)
return nullptr;
887 case TargetCXXABI::AppleARM64:
888 case TargetCXXABI::Fuchsia:
889 case TargetCXXABI::GenericARM:
890 case TargetCXXABI::iOS:
891 case TargetCXXABI::WatchOS:
892 case TargetCXXABI::GenericAArch64:
893 case TargetCXXABI::GenericMIPS:
894 case TargetCXXABI::GenericItanium:
895 case TargetCXXABI::WebAssembly:
896 case TargetCXXABI::XL:
898 case TargetCXXABI::Microsoft:
901 llvm_unreachable(
"Invalid CXXABI type!");
905 if (!InterpContext) {
908 return *InterpContext;
914 return *ParentMapCtx;
919 switch (LangOpts.getAddressSpaceMapMangling()) {
927 llvm_unreachable(
"getAddressSpaceMapMangling() doesn't cover anything.");
933 : ConstantArrayTypes(this_(), ConstantArrayTypesLog2InitSize),
934 DependentSizedArrayTypes(this_()), DependentSizedExtVectorTypes(this_()),
935 DependentAddressSpaceTypes(this_()), DependentVectorTypes(this_()),
936 DependentSizedMatrixTypes(this_()),
937 FunctionProtoTypes(this_(), FunctionProtoTypesLog2InitSize),
938 DependentTypeOfExprTypes(this_()), DependentDecltypeTypes(this_()),
939 DependentPackIndexingTypes(this_()), TemplateSpecializationTypes(this_()),
940 AttributedTypes(this_()), DependentBitIntTypes(this_()),
941 SubstTemplateTemplateParmPacks(this_()), DeducedTemplates(this_()),
942 ArrayParameterTypes(this_()), CanonTemplateTemplateParms(this_()),
943 SourceMgr(
SM), LangOpts(LOpts),
946 LangOpts.XRayNeverInstrumentFiles,
947 LangOpts.XRayAttrListFiles,
SM)),
951 Comments(
SM), CommentCommandTraits(BumpAlloc, LOpts.CommentOpts),
959 ReleaseDeclContextMaps();
962 for (
auto &Pair : Deallocations)
963 (Pair.first)(Pair.second);
964 Deallocations.clear();
970 I = ObjCLayouts.begin(),
971 E = ObjCLayouts.end();
978 for (llvm::DenseMap<const RecordDecl*, const ASTRecordLayout*>::iterator
979 I = ASTRecordLayouts.begin(), E = ASTRecordLayouts.end(); I != E; ) {
984 ASTRecordLayouts.clear();
986 for (llvm::DenseMap<const Decl*, AttrVec*>::iterator A = DeclAttrs.begin(),
987 AEnd = DeclAttrs.end();
989 A->second->~AttrVec();
992 for (
const auto &
Value : ModuleInitializers)
993 Value.second->~PerModuleInitializers();
994 ModuleInitializers.
clear();
1004 TraversalScope = TopLevelDecls;
1009 Deallocations.push_back({Callback,
Data});
1018 llvm::errs() <<
"\n*** AST Context Stats:\n";
1019 llvm::errs() <<
" " << Types.size() <<
" types total.\n";
1021 unsigned counts[] = {
1022#define TYPE(Name, Parent) 0,
1023#define ABSTRACT_TYPE(Name, Parent)
1024#include "clang/AST/TypeNodes.inc"
1028 for (
unsigned i = 0, e = Types.size(); i != e; ++i) {
1030 counts[(
unsigned)T->getTypeClass()]++;
1034 unsigned TotalBytes = 0;
1035#define TYPE(Name, Parent) \
1037 llvm::errs() << " " << counts[Idx] << " " << #Name \
1038 << " types, " << sizeof(Name##Type) << " each " \
1039 << "(" << counts[Idx] * sizeof(Name##Type) \
1041 TotalBytes += counts[Idx] * sizeof(Name##Type); \
1043#define ABSTRACT_TYPE(Name, Parent)
1044#include "clang/AST/TypeNodes.inc"
1046 llvm::errs() <<
"Total bytes = " << TotalBytes <<
"\n";
1051 <<
" implicit default constructors created\n";
1054 <<
" implicit copy constructors created\n";
1058 <<
" implicit move constructors created\n";
1061 <<
" implicit copy assignment operators created\n";
1065 <<
" implicit move assignment operators created\n";
1068 <<
" implicit destructors created\n";
1071 llvm::errs() <<
"\n";
1075 BumpAlloc.PrintStats();
1079 bool NotifyListeners) {
1080 if (NotifyListeners)
1083 Listener->RedefinedHiddenDefinition(ND, M);
1090 if (It == MergedDefModules.end())
1093 auto &Merged = It->second;
1094 llvm::DenseSet<Module*>
Found;
1095 for (
Module *&M : Merged)
1096 if (!
Found.insert(M).second)
1098 llvm::erase(Merged,
nullptr);
1105 if (MergedIt == MergedDefModules.end())
1107 return MergedIt->second;
1110void ASTContext::PerModuleInitializers::resolve(
ASTContext &Ctx) {
1111 if (LazyInitializers.empty())
1115 assert(Source &&
"lazy initializers but no external source");
1117 auto LazyInits = std::move(LazyInitializers);
1118 LazyInitializers.clear();
1120 for (
auto ID : LazyInits)
1121 Initializers.push_back(Source->GetExternalDecl(ID));
1123 assert(LazyInitializers.empty() &&
1124 "GetExternalDecl for lazy module initializer added more inits");
1130 if (
const auto *ID = dyn_cast<ImportDecl>(D)) {
1131 auto It = ModuleInitializers.find(ID->getImportedModule());
1134 if (It == ModuleInitializers.end())
1138 auto &Imported = *It->second;
1139 if (Imported.Initializers.size() + Imported.LazyInitializers.size() == 1) {
1140 Imported.resolve(*
this);
1141 auto *OnlyDecl = Imported.Initializers.front();
1147 auto *&
Inits = ModuleInitializers[M];
1149 Inits =
new (*this) PerModuleInitializers;
1150 Inits->Initializers.push_back(D);
1155 auto *&
Inits = ModuleInitializers[M];
1157 Inits =
new (*this) PerModuleInitializers;
1158 Inits->LazyInitializers.insert(
Inits->LazyInitializers.end(),
1159 IDs.begin(), IDs.end());
1163 auto It = ModuleInitializers.find(M);
1164 if (It == ModuleInitializers.end())
1167 auto *
Inits = It->second;
1168 Inits->resolve(*
this);
1169 return Inits->Initializers;
1174 assert(!CurrentCXXNamedModule &&
1175 "We should set named module for ASTContext for only once");
1176 CurrentCXXNamedModule = M;
1188 auto GetRepresentativeModule = [
this](
const Module *M) {
1189 auto Iter = SameModuleLookupSet.find(M);
1190 if (Iter != SameModuleLookupSet.end())
1191 return Iter->second;
1193 const Module *RepresentativeModule =
1194 PrimaryModuleNameMap.try_emplace(M->getPrimaryModuleInterfaceName(), M)
1196 SameModuleLookupSet[M] = RepresentativeModule;
1197 return RepresentativeModule;
1200 assert(M1 &&
"Shouldn't call `isInSameModule` if both M1 and M2 are none.");
1201 return GetRepresentativeModule(M1) == GetRepresentativeModule(M2);
1205 if (!ExternCContext)
1208 return ExternCContext;
1222#define BuiltinTemplate(BTName) \
1223 BuiltinTemplateDecl *ASTContext::get##BTName##Decl() const { \
1224 if (!Decl##BTName) \
1226 buildBuiltinTemplateDecl(BTK##BTName, get##BTName##Name()); \
1227 return Decl##BTName; \
1229#include "clang/Basic/BuiltinTemplates.inc"
1242 NewDecl->
addAttr(TypeVisibilityAttr::CreateImplicit(
1243 const_cast<ASTContext &
>(*
this), TypeVisibilityAttr::Default));
1248 StringRef Name)
const {
1272 Types.push_back(Ty);
1277 assert((!this->Target || this->Target == &Target) &&
1278 "Incorrect target reinitialization");
1279 assert(
VoidTy.isNull() &&
"Context reinitialized?");
1281 this->Target = &Target;
1282 this->AuxTarget = AuxTarget;
1284 ABI.reset(createCXXABI(Target));
1288 InitBuiltinType(
VoidTy, BuiltinType::Void);
1291 InitBuiltinType(
BoolTy, BuiltinType::Bool);
1293 if (LangOpts.CharIsSigned)
1294 InitBuiltinType(
CharTy, BuiltinType::Char_S);
1296 InitBuiltinType(
CharTy, BuiltinType::Char_U);
1299 InitBuiltinType(
ShortTy, BuiltinType::Short);
1300 InitBuiltinType(
IntTy, BuiltinType::Int);
1301 InitBuiltinType(
LongTy, BuiltinType::Long);
1302 InitBuiltinType(
LongLongTy, BuiltinType::LongLong);
1312 InitBuiltinType(
FloatTy, BuiltinType::Float);
1313 InitBuiltinType(
DoubleTy, BuiltinType::Double);
1314 InitBuiltinType(
LongDoubleTy, BuiltinType::LongDouble);
1317 InitBuiltinType(
Float128Ty, BuiltinType::Float128);
1320 InitBuiltinType(
Ibm128Ty, BuiltinType::Ibm128);
1323 InitBuiltinType(
Float16Ty, BuiltinType::Float16);
1326 InitBuiltinType(
ShortAccumTy, BuiltinType::ShortAccum);
1327 InitBuiltinType(
AccumTy, BuiltinType::Accum);
1328 InitBuiltinType(
LongAccumTy, BuiltinType::LongAccum);
1332 InitBuiltinType(
ShortFractTy, BuiltinType::ShortFract);
1333 InitBuiltinType(
FractTy, BuiltinType::Fract);
1334 InitBuiltinType(
LongFractTy, BuiltinType::LongFract);
1339 InitBuiltinType(
SatAccumTy, BuiltinType::SatAccum);
1345 InitBuiltinType(
SatFractTy, BuiltinType::SatFract);
1352 InitBuiltinType(
Int128Ty, BuiltinType::Int128);
1357 InitBuiltinType(
WCharTy, BuiltinType::WChar_S);
1359 InitBuiltinType(
WCharTy, BuiltinType::WChar_U);
1360 if (LangOpts.CPlusPlus && LangOpts.WChar)
1364 WideCharTy = getFromTargetType(Target.getWCharType());
1367 WIntTy = getFromTargetType(Target.getWIntType());
1370 InitBuiltinType(
Char8Ty, BuiltinType::Char8);
1372 if (LangOpts.CPlusPlus)
1373 InitBuiltinType(
Char16Ty, BuiltinType::Char16);
1375 Char16Ty = getFromTargetType(Target.getChar16Type());
1377 if (LangOpts.CPlusPlus)
1378 InitBuiltinType(
Char32Ty, BuiltinType::Char32);
1380 Char32Ty = getFromTargetType(Target.getChar32Type());
1387 InitBuiltinType(
DependentTy, BuiltinType::Dependent);
1390 InitBuiltinType(
OverloadTy, BuiltinType::Overload);
1402 InitBuiltinType(
UnknownAnyTy, BuiltinType::UnknownAny);
1408 InitBuiltinType(
BuiltinFnTy, BuiltinType::BuiltinFn);
1411 if (LangOpts.OpenMP) {
1418 if (LangOpts.OpenACC && !LangOpts.OpenMP) {
1421 if (LangOpts.MatrixTypes)
1429 if (LangOpts.OpenCL) {
1430#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
1431 InitBuiltinType(SingletonId, BuiltinType::Id);
1432#include "clang/Basic/OpenCLImageTypes.def"
1434 InitBuiltinType(
OCLSamplerTy, BuiltinType::OCLSampler);
1435 InitBuiltinType(
OCLEventTy, BuiltinType::OCLEvent);
1437 InitBuiltinType(
OCLQueueTy, BuiltinType::OCLQueue);
1440#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
1441 InitBuiltinType(Id##Ty, BuiltinType::Id);
1442#include "clang/Basic/OpenCLExtensionTypes.def"
1445 if (LangOpts.HLSL) {
1446#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) \
1447 InitBuiltinType(SingletonId, BuiltinType::Id);
1448#include "clang/Basic/HLSLIntangibleTypes.def"
1451 if (Target.hasAArch64ACLETypes() ||
1452 (AuxTarget && AuxTarget->hasAArch64ACLETypes())) {
1453#define SVE_TYPE(Name, Id, SingletonId) \
1454 InitBuiltinType(SingletonId, BuiltinType::Id);
1455#include "clang/Basic/AArch64ACLETypes.def"
1458 if (Target.getTriple().isPPC64()) {
1459#define PPC_VECTOR_MMA_TYPE(Name, Id, Size) \
1460 InitBuiltinType(Id##Ty, BuiltinType::Id);
1461#include "clang/Basic/PPCTypes.def"
1462#define PPC_VECTOR_VSX_TYPE(Name, Id, Size) \
1463 InitBuiltinType(Id##Ty, BuiltinType::Id);
1464#include "clang/Basic/PPCTypes.def"
1467 if (Target.hasRISCVVTypes()) {
1468#define RVV_TYPE(Name, Id, SingletonId) \
1469 InitBuiltinType(SingletonId, BuiltinType::Id);
1470#include "clang/Basic/RISCVVTypes.def"
1473 if (Target.getTriple().isWasm() && Target.hasFeature(
"reference-types")) {
1474#define WASM_TYPE(Name, Id, SingletonId) \
1475 InitBuiltinType(SingletonId, BuiltinType::Id);
1476#include "clang/Basic/WebAssemblyReferenceTypes.def"
1479 if (Target.getTriple().isAMDGPU() ||
1480 (Target.getTriple().isSPIRV() &&
1481 Target.getTriple().getVendor() == llvm::Triple::AMD) ||
1483 (AuxTarget->getTriple().isAMDGPU() ||
1484 ((AuxTarget->getTriple().isSPIRV() &&
1485 AuxTarget->getTriple().getVendor() == llvm::Triple::AMD))))) {
1486#define AMDGPU_TYPE(Name, Id, SingletonId, Width, Align) \
1487 InitBuiltinType(SingletonId, BuiltinType::Id);
1488#include "clang/Basic/AMDGPUTypes.def"
1495 ObjCConstantStringType =
QualType();
1500 if (LangOpts.OpenCLGenericAddressSpace) {
1501 auto Q =
VoidTy.getQualifiers();
1510 InitBuiltinType(
NullPtrTy, BuiltinType::NullPtr);
1513 InitBuiltinType(
HalfTy, BuiltinType::Half);
1515 InitBuiltinType(
BFloat16Ty, BuiltinType::BFloat16);
1521 if (LangOpts.MicrosoftExt || LangOpts.Borland) {
1528 return SourceMgr.getDiagnostics();
1543 llvm::DenseMap<const Decl*, AttrVec*>::iterator Pos = DeclAttrs.find(D);
1544 if (Pos != DeclAttrs.end()) {
1545 Pos->second->~AttrVec();
1546 DeclAttrs.erase(Pos);
1554 if (It != ExplicitInstantiations.end())
1575 llvm::DenseMap<const VarDecl *, TemplateOrSpecializationInfo>::iterator Pos =
1576 TemplateOrInstantiation.find(Var);
1577 if (Pos == TemplateOrInstantiation.end())
1590 Tmpl, TSK, PointOfInstantiation));
1596 assert(!TemplateOrInstantiation[Inst] &&
1597 "Already noted what the variable was instantiated from");
1598 TemplateOrInstantiation[Inst] = TSI;
1603 return InstantiatedFromUsingDecl.lookup(UUD);
1611 "pattern decl is not a using decl");
1615 "instantiation did not produce a using decl");
1616 assert(!InstantiatedFromUsingDecl[Inst] &&
"pattern already exists");
1617 InstantiatedFromUsingDecl[Inst] = Pattern;
1622 return InstantiatedFromUsingEnumDecl.lookup(UUD);
1627 assert(!InstantiatedFromUsingEnumDecl[Inst] &&
"pattern already exists");
1628 InstantiatedFromUsingEnumDecl[Inst] = Pattern;
1633 return InstantiatedFromUsingShadowDecl.lookup(Inst);
1639 assert(!InstantiatedFromUsingShadowDecl[Inst] &&
"pattern already exists");
1640 InstantiatedFromUsingShadowDecl[Inst] = Pattern;
1645 return InstantiatedFromUnnamedFieldDecl.lookup(Field);
1651 "Instantiated field decl is not unnamed");
1653 "Template field decl is not unnamed");
1654 assert(!InstantiatedFromUnnamedFieldDecl[Inst] &&
1655 "Already noted what unnamed field was instantiated from");
1657 InstantiatedFromUnnamedFieldDecl[Inst] = Tmpl;
1673 return Range.end() - Range.begin();
1678 llvm::DenseMap<const CXXMethodDecl *, CXXMethodVector>::const_iterator Pos =
1679 OverriddenMethods.find(
Method->getCanonicalDecl());
1680 if (Pos == OverriddenMethods.end())
1688 OverriddenMethods[
Method].push_back(Overridden);
1696 if (
const auto *CXXMethod = dyn_cast<CXXMethodDecl>(D)) {
1702 const auto *
Method = dyn_cast<ObjCMethodDecl>(D);
1707 Method->getOverriddenMethods(OverDecls);
1708 Overridden.append(OverDecls.begin(), OverDecls.end());
1711std::optional<ASTContext::CXXRecordDeclRelocationInfo>
1715 auto it = RelocatableClasses.find(D);
1716 if (it != RelocatableClasses.end())
1717 return it->getSecond();
1718 return std::nullopt;
1725 assert(RelocatableClasses.find(D) == RelocatableClasses.end());
1726 RelocatableClasses.insert({D, Info});
1731 if (!Class->isPolymorphic())
1733 const CXXRecordDecl *BaseType = Context.baseForVTableAuthentication(Class);
1734 using AuthAttr = VTablePointerAuthenticationAttr;
1735 const AuthAttr *ExplicitAuth = BaseType->
getAttr<AuthAttr>();
1737 return Context.getLangOpts().PointerAuthVTPtrAddressDiscrimination;
1738 AuthAttr::AddressDiscriminationMode AddressDiscrimination =
1739 ExplicitAuth->getAddressDiscrimination();
1740 if (AddressDiscrimination == AuthAttr::DefaultAddressDiscrimination)
1741 return Context.getLangOpts().PointerAuthVTPtrAddressDiscrimination;
1742 return AddressDiscrimination == AuthAttr::AddressDiscrimination;
1745ASTContext::PointerAuthContent
1746ASTContext::findPointerAuthContent(QualType T)
const {
1747 assert(isPointerAuthenticationAvailable());
1751 return PointerAuthContent::None;
1754 return PointerAuthContent::AddressDiscriminatedData;
1757 return PointerAuthContent::None;
1760 return PointerAuthContent::None;
1762 if (
auto Existing = RecordContainsAddressDiscriminatedPointerAuth.find(RD);
1763 Existing != RecordContainsAddressDiscriminatedPointerAuth.end())
1764 return Existing->second;
1766 PointerAuthContent
Result = PointerAuthContent::None;
1768 auto SaveResultAndReturn = [&]() -> PointerAuthContent {
1769 auto [ResultIter, DidAdd] =
1770 RecordContainsAddressDiscriminatedPointerAuth.try_emplace(RD,
Result);
1776 auto ShouldContinueAfterUpdate = [&](PointerAuthContent NewResult) {
1777 static_assert(PointerAuthContent::None <
1778 PointerAuthContent::AddressDiscriminatedVTable);
1779 static_assert(PointerAuthContent::AddressDiscriminatedVTable <
1780 PointerAuthContent::AddressDiscriminatedData);
1783 return Result != PointerAuthContent::AddressDiscriminatedData;
1785 if (
const CXXRecordDecl *CXXRD = dyn_cast<CXXRecordDecl>(RD)) {
1787 !ShouldContinueAfterUpdate(
1788 PointerAuthContent::AddressDiscriminatedVTable))
1789 return SaveResultAndReturn();
1790 for (
auto Base : CXXRD->bases()) {
1791 if (!ShouldContinueAfterUpdate(findPointerAuthContent(
Base.getType())))
1792 return SaveResultAndReturn();
1795 for (
auto *FieldDecl : RD->
fields()) {
1796 if (!ShouldContinueAfterUpdate(
1797 findPointerAuthContent(FieldDecl->getType())))
1798 return SaveResultAndReturn();
1800 return SaveResultAndReturn();
1804 assert(!Import->getNextLocalImport() &&
1805 "Import declaration already in the chain");
1806 assert(!Import->isFromASTFile() &&
"Non-local import declaration");
1807 if (!FirstLocalImport) {
1808 FirstLocalImport = Import;
1809 LastLocalImport = Import;
1813 LastLocalImport->setNextLocalImport(Import);
1814 LastLocalImport = Import;
1826 llvm_unreachable(
"Not a floating point type!");
1827 case BuiltinType::BFloat16:
1828 return Target->getBFloat16Format();
1829 case BuiltinType::Float16:
1830 return Target->getHalfFormat();
1831 case BuiltinType::Half:
1832 return Target->getHalfFormat();
1833 case BuiltinType::Float:
return Target->getFloatFormat();
1834 case BuiltinType::Double:
return Target->getDoubleFormat();
1835 case BuiltinType::Ibm128:
1836 return Target->getIbm128Format();
1837 case BuiltinType::LongDouble:
1839 return AuxTarget->getLongDoubleFormat();
1840 return Target->getLongDoubleFormat();
1841 case BuiltinType::Float128:
1843 return AuxTarget->getFloat128Format();
1844 return Target->getFloat128Format();
1849 unsigned Align = Target->getCharWidth();
1853 Align = AlignFromAttr;
1861 bool UseAlignAttrOnly;
1862 if (
const FieldDecl *FD = dyn_cast<FieldDecl>(D))
1864 FD->hasAttr<PackedAttr>() || FD->getParent()->hasAttr<PackedAttr>();
1866 UseAlignAttrOnly = AlignFromAttr != 0;
1869 if (UseAlignAttrOnly) {
1871 }
else if (
const auto *VD = dyn_cast<ValueDecl>(D)) {
1875 T = RT->getPointeeType();
1880 if (T->isFunctionType())
1881 Align = getTypeInfoImpl(T.getTypePtr()).Align;
1886 unsigned MinWidth = Target->getLargeArrayMinWidth();
1887 if (!ForAlignof && MinWidth) {
1889 Align = std::max(Align, Target->getLargeArrayAlign());
1892 Align = std::max(Align, Target->getLargeArrayAlign());
1897 Align = Target->getCharWidth();
1901 if (
const auto *VD = dyn_cast<VarDecl>(D))
1902 if (VD->hasGlobalStorage() && !ForAlignof) {
1913 if (
const auto *Field = dyn_cast<FieldDecl>(VD)) {
1927 uint64_t LowBitOfOffset = Offset & (~Offset + 1);
1928 if (LowBitOfOffset < FieldAlign)
1929 FieldAlign =
static_cast<unsigned>(LowBitOfOffset);
1932 Align = std::min(Align, FieldAlign);
1940 const auto *VD = dyn_cast<VarDecl>(D);
1941 if (MaxAlignedAttr && VD && VD->getStorageClass() ==
SC_Static)
1942 Align = std::min(Align, MaxAlignedAttr);
1962 if (
const auto *RD = T->getAsCXXRecordDecl(); RD && !RD->
isInvalidDecl()) {
1979 (uint64_t)(-1)/Size) &&
1980 "Overflow in array type char size evaluation");
1983 if (!Context.getTargetInfo().getCXXABI().isMicrosoft() ||
1985 Width = llvm::alignTo(Width, Align);
1992 if (
const auto *CAT = dyn_cast<ConstantArrayType>(T))
2010 switch (BT->getKind()) {
2011 case BuiltinType::Bool:
2012 case BuiltinType::Char_S:
2013 case BuiltinType::Char_U:
2014 case BuiltinType::SChar:
2015 case BuiltinType::UChar:
2016 case BuiltinType::Short:
2017 case BuiltinType::UShort:
2018 case BuiltinType::WChar_S:
2019 case BuiltinType::WChar_U:
2020 case BuiltinType::Char8:
2021 case BuiltinType::Char16:
2022 case BuiltinType::Char32:
2030 if (
const auto *ED = T->getAsEnumDecl()) {
2031 if (T->isDependentType() || ED->getPromotionType().isNull() ||
2039 if (
const auto *OBT = T->getAs<OverflowBehaviorType>()) {
2055 bool NeedsPreferredAlignment)
const {
2058 if (
unsigned Align = TT->getDecl()->getMaxAlignment())
2063 if (!T->isIncompleteType())
2069 if (
unsigned Align = TT->getDecl()->getMaxAlignment())
2073 if (
const auto *TD = T->getAsTagDecl())
2074 return TD->getMaxAlignment();
2080 TypeInfoMap::iterator I = MemoizedTypeInfo.find(T);
2081 if (I != MemoizedTypeInfo.end())
2086 MemoizedTypeInfo[T] = TI;
2096TypeInfo ASTContext::getTypeInfoImpl(
const Type *T)
const {
2101 switch (T->getTypeClass()) {
2102#define TYPE(Class, Base)
2103#define ABSTRACT_TYPE(Class, Base)
2104#define NON_CANONICAL_TYPE(Class, Base)
2105#define DEPENDENT_TYPE(Class, Base) case Type::Class:
2106#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base) \
2108 assert(!T->isDependentType() && "should not see dependent types here"); \
2109 return getTypeInfo(cast<Class##Type>(T)->desugar().getTypePtr());
2110#include "clang/AST/TypeNodes.inc"
2111 llvm_unreachable(
"Should not see dependent types");
2113 case Type::FunctionNoProto:
2114 case Type::FunctionProto:
2120 case Type::IncompleteArray:
2121 case Type::VariableArray:
2122 case Type::ConstantArray:
2123 case Type::ArrayParameter: {
2126 if (
const auto *CAT = dyn_cast<ConstantArrayType>(T))
2127 Size = CAT->getZExtSize();
2130 assert((Size == 0 || EltInfo.
Width <= (uint64_t)(-1) / Size) &&
2131 "Overflow in array type bit size evaluation");
2132 Width = EltInfo.
Width * Size;
2133 Align = EltInfo.
Align;
2137 Width = llvm::alignTo(Width, Align);
2141 case Type::ExtVector:
2142 case Type::Vector: {
2145 Width = VT->isPackedVectorBoolType(*
this)
2146 ? VT->getNumElements()
2147 : EltInfo.
Width * VT->getNumElements();
2149 Width = std::max<unsigned>(8, Width);
2150 Align = std::max<unsigned>(
2151 8,
Target->vectorsAreElementAligned() ? EltInfo.
Width : Width);
2155 if (Align & (Align-1)) {
2156 Align = llvm::bit_ceil(Align);
2157 Width = llvm::alignTo(Width, Align);
2160 uint64_t TargetVectorAlign = Target->getMaxVectorAlign();
2161 if (TargetVectorAlign && TargetVectorAlign < Align)
2162 Align = TargetVectorAlign;
2176 Align = std::min<unsigned>(64, Width);
2180 case Type::ConstantMatrix: {
2182 TypeInfo ElementInfo =
getTypeInfo(MT->getElementType());
2186 Width = ElementInfo.
Width * MT->getNumRows() * MT->getNumColumns();
2187 Align = ElementInfo.
Align;
2193 default: llvm_unreachable(
"Unknown builtin type!");
2194 case BuiltinType::Void:
2199 case BuiltinType::Bool:
2200 Width = Target->getBoolWidth();
2201 Align = Target->getBoolAlign();
2203 case BuiltinType::Char_S:
2204 case BuiltinType::Char_U:
2205 case BuiltinType::UChar:
2206 case BuiltinType::SChar:
2207 case BuiltinType::Char8:
2208 Width = Target->getCharWidth();
2209 Align = Target->getCharAlign();
2211 case BuiltinType::WChar_S:
2212 case BuiltinType::WChar_U:
2213 Width = Target->getWCharWidth();
2214 Align = Target->getWCharAlign();
2216 case BuiltinType::Char16:
2217 Width = Target->getChar16Width();
2218 Align = Target->getChar16Align();
2220 case BuiltinType::Char32:
2221 Width = Target->getChar32Width();
2222 Align = Target->getChar32Align();
2224 case BuiltinType::UShort:
2225 case BuiltinType::Short:
2226 Width = Target->getShortWidth();
2227 Align = Target->getShortAlign();
2229 case BuiltinType::UInt:
2230 case BuiltinType::Int:
2231 Width = Target->getIntWidth();
2232 Align = Target->getIntAlign();
2234 case BuiltinType::ULong:
2235 case BuiltinType::Long:
2236 Width = Target->getLongWidth();
2237 Align = Target->getLongAlign();
2239 case BuiltinType::ULongLong:
2240 case BuiltinType::LongLong:
2241 Width = Target->getLongLongWidth();
2242 Align = Target->getLongLongAlign();
2244 case BuiltinType::Int128:
2245 case BuiltinType::UInt128:
2247 Align = Target->getInt128Align();
2249 case BuiltinType::ShortAccum:
2250 case BuiltinType::UShortAccum:
2251 case BuiltinType::SatShortAccum:
2252 case BuiltinType::SatUShortAccum:
2253 Width = Target->getShortAccumWidth();
2254 Align = Target->getShortAccumAlign();
2256 case BuiltinType::Accum:
2257 case BuiltinType::UAccum:
2258 case BuiltinType::SatAccum:
2259 case BuiltinType::SatUAccum:
2260 Width = Target->getAccumWidth();
2261 Align = Target->getAccumAlign();
2263 case BuiltinType::LongAccum:
2264 case BuiltinType::ULongAccum:
2265 case BuiltinType::SatLongAccum:
2266 case BuiltinType::SatULongAccum:
2267 Width = Target->getLongAccumWidth();
2268 Align = Target->getLongAccumAlign();
2270 case BuiltinType::ShortFract:
2271 case BuiltinType::UShortFract:
2272 case BuiltinType::SatShortFract:
2273 case BuiltinType::SatUShortFract:
2274 Width = Target->getShortFractWidth();
2275 Align = Target->getShortFractAlign();
2277 case BuiltinType::Fract:
2278 case BuiltinType::UFract:
2279 case BuiltinType::SatFract:
2280 case BuiltinType::SatUFract:
2281 Width = Target->getFractWidth();
2282 Align = Target->getFractAlign();
2284 case BuiltinType::LongFract:
2285 case BuiltinType::ULongFract:
2286 case BuiltinType::SatLongFract:
2287 case BuiltinType::SatULongFract:
2288 Width = Target->getLongFractWidth();
2289 Align = Target->getLongFractAlign();
2291 case BuiltinType::BFloat16:
2292 if (Target->hasBFloat16Type()) {
2293 Width = Target->getBFloat16Width();
2294 Align = Target->getBFloat16Align();
2298 AuxTarget->hasBFloat16Type()) {
2299 Width = AuxTarget->getBFloat16Width();
2300 Align = AuxTarget->getBFloat16Align();
2303 case BuiltinType::Float16:
2304 case BuiltinType::Half:
2305 if (Target->hasFloat16Type() || !
getLangOpts().OpenMP ||
2307 Width = Target->getHalfWidth();
2308 Align = Target->getHalfAlign();
2311 "Expected OpenMP device compilation.");
2312 Width = AuxTarget->getHalfWidth();
2313 Align = AuxTarget->getHalfAlign();
2316 case BuiltinType::Float:
2317 Width = Target->getFloatWidth();
2318 Align = Target->getFloatAlign();
2320 case BuiltinType::Double:
2321 Width = Target->getDoubleWidth();
2322 Align = Target->getDoubleAlign();
2324 case BuiltinType::Ibm128:
2325 Width = Target->getIbm128Width();
2326 Align = Target->getIbm128Align();
2328 case BuiltinType::LongDouble:
2330 (Target->getLongDoubleWidth() != AuxTarget->getLongDoubleWidth() ||
2331 Target->getLongDoubleAlign() != AuxTarget->getLongDoubleAlign())) {
2332 Width = AuxTarget->getLongDoubleWidth();
2333 Align = AuxTarget->getLongDoubleAlign();
2335 Width = Target->getLongDoubleWidth();
2336 Align = Target->getLongDoubleAlign();
2339 case BuiltinType::Float128:
2340 if (Target->hasFloat128Type() || !
getLangOpts().OpenMP ||
2342 Width = Target->getFloat128Width();
2343 Align = Target->getFloat128Align();
2346 "Expected OpenMP device compilation.");
2347 Width = AuxTarget->getFloat128Width();
2348 Align = AuxTarget->getFloat128Align();
2351 case BuiltinType::NullPtr:
2356 case BuiltinType::ObjCId:
2357 case BuiltinType::ObjCClass:
2358 case BuiltinType::ObjCSel:
2362 case BuiltinType::OCLSampler:
2363 case BuiltinType::OCLEvent:
2364 case BuiltinType::OCLClkEvent:
2365 case BuiltinType::OCLQueue:
2366 case BuiltinType::OCLReserveID:
2367#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
2368 case BuiltinType::Id:
2369#include "clang/Basic/OpenCLImageTypes.def"
2370#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
2371 case BuiltinType::Id:
2372#include "clang/Basic/OpenCLExtensionTypes.def"
2374 Width = Target->getPointerWidth(AS);
2375 Align = Target->getPointerAlign(AS);
2385#define SVE_VECTOR_TYPE(Name, MangledName, Id, SingletonId) \
2386 case BuiltinType::Id: \
2390#define SVE_PREDICATE_TYPE(Name, MangledName, Id, SingletonId) \
2391 case BuiltinType::Id: \
2395#define SVE_OPAQUE_TYPE(Name, MangledName, Id, SingletonId) \
2396 case BuiltinType::Id: \
2400#define SVE_SCALAR_TYPE(Name, MangledName, Id, SingletonId, Bits) \
2401 case BuiltinType::Id: \
2405#include "clang/Basic/AArch64ACLETypes.def"
2406#define PPC_VECTOR_TYPE(Name, Id, Size) \
2407 case BuiltinType::Id: \
2411#include "clang/Basic/PPCTypes.def"
2412#define RVV_VECTOR_TYPE(Name, Id, SingletonId, ElKind, ElBits, NF, IsSigned, \
2414 case BuiltinType::Id: \
2418#define RVV_PREDICATE_TYPE(Name, Id, SingletonId, ElKind) \
2419 case BuiltinType::Id: \
2423#include "clang/Basic/RISCVVTypes.def"
2424#define WASM_TYPE(Name, Id, SingletonId) \
2425 case BuiltinType::Id: \
2429#include "clang/Basic/WebAssemblyReferenceTypes.def"
2430#define AMDGPU_TYPE(NAME, ID, SINGLETONID, WIDTH, ALIGN) \
2431 case BuiltinType::ID: \
2435#include "clang/Basic/AMDGPUTypes.def"
2436#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
2437#include "clang/Basic/HLSLIntangibleTypes.def"
2443 case Type::ObjCObjectPointer:
2447 case Type::BlockPointer:
2449 Width = Target->getPointerWidth(AS);
2450 Align = Target->getPointerAlign(AS);
2452 case Type::LValueReference:
2453 case Type::RValueReference:
2457 Width = Target->getPointerWidth(AS);
2458 Align = Target->getPointerAlign(AS);
2462 Width = Target->getPointerWidth(AS);
2463 Align = Target->getPointerAlign(AS);
2465 case Type::MemberPointer: {
2467 CXXABI::MemberPointerInfo MPI = ABI->getMemberPointerInfo(MPT);
2472 case Type::Complex: {
2476 Width = EltInfo.
Width * 2;
2477 Align = EltInfo.
Align;
2480 case Type::ObjCObject:
2482 case Type::Adjusted:
2485 case Type::ObjCInterface: {
2487 if (ObjCI->getDecl()->isInvalidDecl()) {
2497 case Type::BitInt: {
2499 Align = Target->getBitIntAlign(EIT->getNumBits());
2500 Width = Target->getBitIntWidth(EIT->getNumBits());
2506 const TagDecl *TD = TT->getDecl()->getDefinitionOrSelf();
2519 Info.
Align = AttrAlign;
2529 AlignRequirement = RD->
hasAttr<AlignedAttr>()
2535 case Type::SubstTemplateTypeParm:
2537 getReplacementType().getTypePtr());
2540 case Type::DeducedTemplateSpecialization: {
2542 assert(!A->getDeducedType().isNull() &&
2543 "cannot request the size of an undeduced or dependent auto type");
2544 return getTypeInfo(A->getDeducedType().getTypePtr());
2550 case Type::MacroQualified:
2554 case Type::ObjCTypeParam:
2560 case Type::Typedef: {
2562 TypeInfo Info =
getTypeInfo(TT->desugar().getTypePtr());
2566 if (
unsigned AttrAlign = TT->getDecl()->getMaxAlignment()) {
2577 case Type::Attributed:
2581 case Type::CountAttributed:
2584 case Type::BTFTagAttributed:
2588 case Type::OverflowBehavior:
2592 case Type::HLSLAttributedResource:
2596 case Type::HLSLInlineSpirv: {
2599 Width = ST->getSize() * 8;
2600 Align = ST->getAlignment();
2601 if (Width == 0 && Align == 0) {
2609 case Type::Atomic: {
2618 Width = Target->getCharWidth();
2620 }
else if (Width <= Target->getMaxAtomicPromoteWidth()) {
2626 Width = llvm::bit_ceil(Width);
2629 Align =
static_cast<unsigned>(Width);
2634 case Type::PredefinedSugar:
2643 assert(llvm::isPowerOf2_32(Align) &&
"Alignment must be power of 2");
2644 return TypeInfo(Width, Align, AlignRequirement);
2648 UnadjustedAlignMap::iterator I = MemoizedUnadjustedAlign.find(T);
2649 if (I != MemoizedUnadjustedAlign.end())
2652 unsigned UnadjustedAlign;
2653 if (
const auto *RT = T->getAsCanonical<RecordType>()) {
2660 UnadjustedAlign =
getTypeAlign(T->getUnqualifiedDesugaredType());
2663 MemoizedUnadjustedAlign[T] = UnadjustedAlign;
2664 return UnadjustedAlign;
2668 unsigned SimdAlign = llvm::OpenMPIRBuilder::getOpenMPDefaultSimdAlign(
2718 unsigned ABIAlign = TI.
Align;
2720 T = T->getBaseElementTypeUnsafe();
2723 if (T->isMemberPointerType())
2726 if (!Target->allowsLargerPreferedTypeAlignment())
2729 if (
const auto *RD = T->getAsRecordDecl()) {
2738 unsigned PreferredAlign =
static_cast<unsigned>(
2740 assert(PreferredAlign >= ABIAlign &&
2741 "PreferredAlign should be at least as large as ABIAlign.");
2742 return PreferredAlign;
2749 T = CT->getElementType().getTypePtr();
2750 if (
const auto *ED = T->getAsEnumDecl())
2751 T = ED->getIntegerType().getTypePtr();
2752 if (T->isSpecificBuiltinType(BuiltinType::Double) ||
2753 T->isSpecificBuiltinType(BuiltinType::LongLong) ||
2754 T->isSpecificBuiltinType(BuiltinType::ULongLong) ||
2755 (T->isSpecificBuiltinType(BuiltinType::LongDouble) &&
2756 Target->defaultsToAIXPowerAlignment()))
2760 return std::max(ABIAlign, (
unsigned)
getTypeSize(T));
2811 for (
unsigned I = 0, N = Path.size(); I != N; ++I) {
2815 std::swap(
Base, Derived);
2835 llvm::append_range(Ivars, OI->
ivars());
2838 for (
const ObjCIvarDecl *Iv = IDecl->all_declared_ivar_begin(); Iv;
2840 Ivars.push_back(Iv);
2848 if (
const auto *OI = dyn_cast<ObjCInterfaceDecl>(CDecl)) {
2851 for (
auto *Proto : OI->all_referenced_protocols()) {
2856 for (
const auto *Cat : OI->visible_categories())
2862 SD = SD->getSuperClass();
2864 }
else if (
const auto *OC = dyn_cast<ObjCCategoryDecl>(CDecl)) {
2865 for (
auto *Proto : OC->protocols()) {
2868 }
else if (
const auto *OP = dyn_cast<ObjCProtocolDecl>(CDecl)) {
2870 if (!Protocols.insert(
2874 for (
auto *Proto : OP->protocols())
2881 bool CheckIfTriviallyCopyable) {
2882 assert(RD->
isUnion() &&
"Must be union type");
2884 Context.getTypeSizeInChars(Context.getCanonicalTagType(RD));
2886 for (
const auto *Field : RD->
fields()) {
2887 if (!Context.hasUniqueObjectRepresentations(Field->getType(),
2888 CheckIfTriviallyCopyable))
2890 CharUnits FieldSize = Context.getTypeSizeInChars(Field->getType());
2891 if (FieldSize != UnionSize)
2900 return Context.getFieldOffset(Field);
2909static std::optional<int64_t>
2911 const RecordDecl *RD,
2912 bool CheckIfTriviallyCopyable);
2914static std::optional<int64_t>
2916 bool CheckIfTriviallyCopyable) {
2917 if (
const auto *RD = Field->getType()->getAsRecordDecl();
2920 CheckIfTriviallyCopyable);
2924 bool IsBitIntType = Field->getType()->isBitIntType();
2925 if (!Field->getType()->isReferenceType() && !IsBitIntType &&
2926 !Context.hasUniqueObjectRepresentations(Field->getType(),
2927 CheckIfTriviallyCopyable))
2928 return std::nullopt;
2930 int64_t FieldSizeInBits =
2931 Context.toBits(Context.getTypeSizeInChars(Field->getType()));
2932 if (Field->isBitField()) {
2935 if (Field->isUnnamedBitField())
2938 int64_t BitfieldSize = Field->getBitWidthValue();
2940 if ((
unsigned)BitfieldSize >
2942 return std::nullopt;
2943 }
else if (BitfieldSize > FieldSizeInBits) {
2944 return std::nullopt;
2946 FieldSizeInBits = BitfieldSize;
2947 }
else if (IsBitIntType && !Context.hasUniqueObjectRepresentations(
2948 Field->getType(), CheckIfTriviallyCopyable)) {
2949 return std::nullopt;
2951 return FieldSizeInBits;
2954static std::optional<int64_t>
2956 bool CheckIfTriviallyCopyable) {
2958 CheckIfTriviallyCopyable);
2961template <
typename RangeT>
2963 const RangeT &Subobjects, int64_t CurOffsetInBits,
2965 bool CheckIfTriviallyCopyable) {
2966 for (
const auto *Subobject : Subobjects) {
2967 std::optional<int64_t> SizeInBits =
2970 return std::nullopt;
2971 if (*SizeInBits != 0) {
2973 if (Offset != CurOffsetInBits)
2974 return std::nullopt;
2975 CurOffsetInBits += *SizeInBits;
2978 return CurOffsetInBits;
2981static std::optional<int64_t>
2984 bool CheckIfTriviallyCopyable) {
2985 assert(!RD->
isUnion() &&
"Must be struct/class type");
2986 const auto &Layout = Context.getASTRecordLayout(RD);
2988 int64_t CurOffsetInBits = 0;
2989 if (
const auto *ClassDecl = dyn_cast<CXXRecordDecl>(RD)) {
2990 if (ClassDecl->isDynamicClass())
2991 return std::nullopt;
2994 for (
const auto &
Base : ClassDecl->bases()) {
2997 Bases.emplace_back(
Base.getType()->getAsCXXRecordDecl());
3001 return Layout.getBaseClassOffset(L) < Layout.getBaseClassOffset(R);
3004 std::optional<int64_t> OffsetAfterBases =
3006 Bases, CurOffsetInBits, Context, Layout, CheckIfTriviallyCopyable);
3007 if (!OffsetAfterBases)
3008 return std::nullopt;
3009 CurOffsetInBits = *OffsetAfterBases;
3012 std::optional<int64_t> OffsetAfterFields =
3014 RD->
fields(), CurOffsetInBits, Context, Layout,
3015 CheckIfTriviallyCopyable);
3016 if (!OffsetAfterFields)
3017 return std::nullopt;
3018 CurOffsetInBits = *OffsetAfterFields;
3020 return CurOffsetInBits;
3024 QualType Ty,
bool CheckIfTriviallyCopyable)
const {
3041 assert(!Ty.
isNull() &&
"Null QualType sent to unique object rep check");
3046 CheckIfTriviallyCopyable);
3049 "hasUniqueObjectRepresentations should not be called with an "
3073 return !ABI->getMemberPointerInfo(MPT).HasPadding;
3076 if (
Record->isInvalidDecl())
3081 CheckIfTriviallyCopyable);
3084 *
this,
Record, CheckIfTriviallyCopyable);
3086 return StructSize && *StructSize ==
static_cast<int64_t
>(
getTypeSize(Ty));
3107 count += Ext->ivar_size();
3112 count += ImplDecl->ivar_size();
3138 llvm::DenseMap<ObjCContainerDecl*, ObjCImplDecl*>::iterator
3139 I = ObjCImpls.find(D);
3140 if (I != ObjCImpls.end())
3148 llvm::DenseMap<ObjCContainerDecl*, ObjCImplDecl*>::iterator
3149 I = ObjCImpls.find(D);
3150 if (I != ObjCImpls.end())
3158 assert(IFaceD && ImplD &&
"Passed null params");
3159 ObjCImpls[IFaceD] = ImplD;
3165 assert(CatD && ImplD &&
"Passed null params");
3166 ObjCImpls[CatD] = ImplD;
3171 return ObjCMethodRedecls.
lookup(MD);
3177 ObjCMethodRedecls[MD] = Redecl;
3182 if (
const auto *ID = dyn_cast<ObjCInterfaceDecl>(ND->
getDeclContext()))
3184 if (
const auto *CD = dyn_cast<ObjCCategoryDecl>(ND->
getDeclContext()))
3185 return CD->getClassInterface();
3186 if (
const auto *IMD = dyn_cast<ObjCImplDecl>(ND->
getDeclContext()))
3187 return IMD->getClassInterface();
3195 assert(VD &&
"Passed null params");
3196 assert(VD->
hasAttr<BlocksAttr>() &&
3197 "getBlockVarCopyInits - not __block var");
3198 auto I = BlockVarCopyInits.find(VD);
3199 if (I != BlockVarCopyInits.end())
3201 return {
nullptr,
false};
3207 assert(VD && CopyExpr &&
"Passed null params");
3208 assert(VD->
hasAttr<BlocksAttr>() &&
3209 "setBlockVarCopyInits - not __block var");
3210 BlockVarCopyInits[VD].setExprAndFlag(CopyExpr,
CanThrow);
3214 unsigned DataSize)
const {
3219 "incorrect data size provided to CreateTypeSourceInfo!");
3236 return getObjCLayout(D);
3241 bool &AnyNonCanonArgs) {
3243 AnyNonCanonArgs |=
C.canonicalizeTemplateArguments(CanonArgs);
3249 bool AnyNonCanonArgs =
false;
3250 for (
auto &Arg : Args) {
3253 AnyNonCanonArgs |= !Arg.structurallyEquals(OrigArg);
3255 return AnyNonCanonArgs;
3263ASTContext::getExtQualType(
const Type *baseType,
Qualifiers quals)
const {
3268 llvm::FoldingSetNodeID ID;
3270 void *insertPos =
nullptr;
3271 if (
ExtQuals *eq = ExtQualNodes.FindNodeOrInsertPos(ID, insertPos)) {
3272 assert(eq->getQualifiers() == quals);
3281 canon = getExtQualType(canonSplit.
Ty, canonSplit.
Quals);
3284 (void) ExtQualNodes.FindNodeOrInsertPos(ID, insertPos);
3287 auto *eq =
new (*
this,
alignof(ExtQuals)) ExtQuals(baseType, canon, quals);
3288 ExtQualNodes.InsertNode(eq, insertPos);
3289 return QualType(eq, fastQuals);
3293 LangAS AddressSpace)
const {
3306 "Type cannot be in multiple addr spaces!");
3309 return getExtQualType(TypeNode, Quals);
3315 if (!T.hasAddressSpace())
3319 const Type *TypeNode;
3322 if (T.getTypePtr()->isArrayType()) {
3324 TypeNode = T.getTypePtr();
3328 while (T.hasAddressSpace()) {
3329 TypeNode = Quals.
strip(T);
3333 if (!
QualType(TypeNode, 0).hasAddressSpace())
3337 T = T.getSingleStepDesugaredType(*
this);
3347 return getExtQualType(TypeNode, Quals);
3355 "Attempted to get vtable pointer discriminator on a monomorphic type");
3358 llvm::raw_svector_ostream Out(Str);
3359 MC->mangleCXXVTable(RD, Out);
3360 return llvm::getPointerAuthStableSipHash(Str);
3386 switch (T->getTypeClass()) {
3391 case Type::LValueReference:
3396 case Type::RValueReference:
3410 case Type::ObjCObjectPointer:
3411 case Type::BlockPointer:
3420 case Type::VariableArray:
3421 case Type::ConstantArray:
3422 case Type::IncompleteArray:
3423 case Type::ArrayParameter:
3436 case Type::ObjCInterface:
3437 case Type::ObjCObject:
3438 OS <<
"<objc_object>";
3449 Ctx, OS, UnderlyingType.
isNull() ? Ctx.
IntTy : UnderlyingType);
3452 case Type::FunctionNoProto:
3453 case Type::FunctionProto: {
3469 if (
const auto *FPT = dyn_cast<FunctionProtoType>(FuncType)) {
3470 for (
QualType Param : FPT->param_types()) {
3474 if (FPT->isVariadic())
3481 case Type::MemberPointer: {
3485 Ctx, OS,
QualType(MPT->getQualifier().getAsType(), 0));
3489 case Type::ExtVector:
3497 case Type::ConstantMatrix:
3501 case Type::Builtin: {
3503 switch (BTy->getKind()) {
3504#define SIGNED_TYPE(Id, SingletonId) \
3505 case BuiltinType::Id: \
3508#define UNSIGNED_TYPE(Id, SingletonId) \
3509 case BuiltinType::Id: \
3512#define PLACEHOLDER_TYPE(Id, SingletonId) case BuiltinType::Id:
3513#define BUILTIN_TYPE(Id, SingletonId)
3514#include "clang/AST/BuiltinTypes.def"
3515 llvm_unreachable(
"placeholder types should not appear here.");
3517 case BuiltinType::Half:
3520 case BuiltinType::Float:
3523 case BuiltinType::Double:
3526 case BuiltinType::LongDouble:
3529 case BuiltinType::Float16:
3532 case BuiltinType::Float128:
3536 case BuiltinType::Void:
3540 case BuiltinType::ObjCId:
3541 case BuiltinType::ObjCClass:
3542 case BuiltinType::ObjCSel:
3543 case BuiltinType::NullPtr:
3548 case BuiltinType::OCLSampler:
3549 case BuiltinType::OCLEvent:
3550 case BuiltinType::OCLClkEvent:
3551 case BuiltinType::OCLQueue:
3552 case BuiltinType::OCLReserveID:
3553 case BuiltinType::BFloat16:
3554 case BuiltinType::VectorQuad:
3555 case BuiltinType::VectorPair:
3556 case BuiltinType::DMR1024:
3557 case BuiltinType::DMR2048:
3562 case BuiltinType::Ibm128:
3564#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
3565 case BuiltinType::Id: \
3567#include "clang/Basic/OpenCLImageTypes.def"
3568#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
3569 case BuiltinType::Id: \
3571#include "clang/Basic/OpenCLExtensionTypes.def"
3572#define SVE_TYPE(Name, Id, SingletonId) \
3573 case BuiltinType::Id: \
3575#include "clang/Basic/AArch64ACLETypes.def"
3576#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) \
3577 case BuiltinType::Id: \
3579#include "clang/Basic/HLSLIntangibleTypes.def"
3580 case BuiltinType::Dependent:
3581 llvm_unreachable(
"should never get here");
3582#define AMDGPU_TYPE(Name, Id, SingletonId, Width, Align) case BuiltinType::Id:
3583#include "clang/Basic/AMDGPUTypes.def"
3584 case BuiltinType::WasmExternRef:
3585#define RVV_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
3586#include "clang/Basic/RISCVVTypes.def"
3587 llvm_unreachable(
"not yet implemented");
3589 llvm_unreachable(
"should never get here");
3591 case Type::Record: {
3592 const RecordDecl *RD = T->castAsCanonical<RecordType>()->getDecl();
3612 II = Typedef->getDeclName().getAsIdentifierInfo();
3615 OS <<
"<anonymous_record>";
3621 case Type::HLSLAttributedResource:
3622 case Type::HLSLInlineSpirv:
3623 llvm_unreachable(
"should never get here");
3625 case Type::OverflowBehavior:
3626 llvm_unreachable(
"should never get here");
3628 case Type::DeducedTemplateSpecialization:
3630#define NON_CANONICAL_TYPE(Class, Base) case Type::Class:
3631#define DEPENDENT_TYPE(Class, Base) case Type::Class:
3632#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base) case Type::Class:
3633#define ABSTRACT_TYPE(Class, Base)
3634#define TYPE(Class, Base)
3635#include "clang/AST/TypeNodes.inc"
3636 llvm_unreachable(
"unexpected non-canonical or dependent type!");
3642 assert(!T->isDependentType() &&
3643 "cannot compute type discriminator of a dependent type");
3645 llvm::raw_svector_ostream Out(Str);
3647 if (T->isFunctionPointerType() || T->isFunctionReferenceType())
3648 T = T->getPointeeType();
3650 if (T->isFunctionType()) {
3653 T = T.getUnqualifiedType();
3674 if (MPT->isMemberFunctionPointer()) {
3680 MPT->getMostRecentCXXRecordDecl());
3684 MC->mangleCanonicalTypeName(T, Out);
3687 return llvm::getPointerAuthStableSipHash(Str);
3712 "Type cannot have multiple ObjCGCs!");
3715 return getExtQualType(TypeNode, Quals);
3729 QualType WrappedTy,
Expr *CountExpr,
bool CountInBytes,
bool OrNull,
3733 llvm::FoldingSetNodeID ID;
3736 void *InsertPos =
nullptr;
3738 CountAttributedTypes.FindNodeOrInsertPos(ID, InsertPos);
3743 size_t Size = CountAttributedType::totalSizeToAlloc<TypeCoupledDeclRefInfo>(
3744 DependentDecls.size());
3747 OrNull, DependentDecls);
3748 Types.push_back(CATy);
3749 CountAttributedTypes.InsertNode(CATy, InsertPos);
3758 case Type::Attributed: {
3766 case Type::BTFTagAttributed: {
3767 const auto *BTFT = dyn_cast<BTFTagAttributedType>(Orig);
3772 case Type::OverflowBehavior: {
3773 const auto *OB = dyn_cast<OverflowBehaviorType>(Orig);
3775 adjustType(OB->getUnderlyingType(), Adjust));
3782 case Type::Adjusted: {
3788 case Type::MacroQualified: {
3791 MQT->getMacroIdentifier());
3795 return Adjust(Orig);
3801 if (T->getExtInfo() == Info)
3805 if (
const auto *FNPT = dyn_cast<FunctionNoProtoType>(T)) {
3825 FPT->getExtProtoInfo());
3840 L->DeducedReturnType(FD, ResultType);
3851 return getFunctionType(Proto->getReturnType(), Proto->getParamTypes(),
3852 Proto->getExtProtoInfo().withExceptionSpec(ESI));
3868 for (
unsigned i = 0, n = Args.size(); i != n; ++i)
3891 return getFunctionType(Proto->getReturnType(), Proto->param_types(), EPI);
3917 if (TSInfo->getType() != FD->
getType())
3925 "TypeLoc size mismatch from updating exception specification");
3926 TSInfo->overrideType(Updated);
3935 llvm::FoldingSetNodeID ID;
3938 void *InsertPos =
nullptr;
3939 if (
ComplexType *CT = ComplexTypes.FindNodeOrInsertPos(ID, InsertPos))
3945 if (!T.isCanonical()) {
3949 ComplexType *NewIP = ComplexTypes.FindNodeOrInsertPos(ID, InsertPos);
3950 assert(!NewIP &&
"Shouldn't be in the map!"); (void)NewIP;
3953 Types.push_back(
New);
3954 ComplexTypes.InsertNode(
New, InsertPos);
3963 llvm::FoldingSetNodeID ID;
3966 void *InsertPos =
nullptr;
3967 if (
PointerType *PT = PointerTypes.FindNodeOrInsertPos(ID, InsertPos))
3973 if (!T.isCanonical()) {
3977 PointerType *NewIP = PointerTypes.FindNodeOrInsertPos(ID, InsertPos);
3978 assert(!NewIP &&
"Shouldn't be in the map!"); (void)NewIP;
3981 Types.push_back(
New);
3982 PointerTypes.InsertNode(
New, InsertPos);
3987 llvm::FoldingSetNodeID ID;
3989 void *InsertPos =
nullptr;
3990 AdjustedType *AT = AdjustedTypes.FindNodeOrInsertPos(ID, InsertPos);
3997 AT = AdjustedTypes.FindNodeOrInsertPos(ID, InsertPos);
3998 assert(!AT &&
"Shouldn't be in the map!");
4002 Types.push_back(AT);
4003 AdjustedTypes.InsertNode(AT, InsertPos);
4008 llvm::FoldingSetNodeID ID;
4010 void *InsertPos =
nullptr;
4011 AdjustedType *AT = AdjustedTypes.FindNodeOrInsertPos(ID, InsertPos);
4018 AT = AdjustedTypes.FindNodeOrInsertPos(ID, InsertPos);
4019 assert(!AT &&
"Shouldn't be in the map!");
4022 Types.push_back(AT);
4023 AdjustedTypes.InsertNode(AT, InsertPos);
4028 assert((T->isArrayType() || T->isFunctionType()) &&
"T does not decay");
4037 if (T->isArrayType())
4044 if (T->isFunctionType())
4056 llvm::FoldingSetNodeID ID;
4057 ATy->Profile(ID, *
this, ATy->getElementType(), ATy->getZExtSize(),
4058 ATy->getSizeExpr(), ATy->getSizeModifier(),
4059 ATy->getIndexTypeQualifiers().getAsOpaqueValue());
4060 void *InsertPos =
nullptr;
4062 ArrayParameterTypes.FindNodeOrInsertPos(ID, InsertPos);
4071 AT = ArrayParameterTypes.FindNodeOrInsertPos(ID, InsertPos);
4072 assert(!AT &&
"Shouldn't be in the map!");
4077 Types.push_back(AT);
4078 ArrayParameterTypes.InsertNode(AT, InsertPos);
4085 assert(T->isFunctionType() &&
"block of function types only");
4088 llvm::FoldingSetNodeID ID;
4091 void *InsertPos =
nullptr;
4093 BlockPointerTypes.FindNodeOrInsertPos(ID, InsertPos))
4099 if (!T.isCanonical()) {
4104 BlockPointerTypes.FindNodeOrInsertPos(ID, InsertPos);
4105 assert(!NewIP &&
"Shouldn't be in the map!"); (void)NewIP;
4109 Types.push_back(
New);
4110 BlockPointerTypes.InsertNode(
New, InsertPos);
4118 assert((!T->isPlaceholderType() ||
4119 T->isSpecificPlaceholderType(BuiltinType::UnknownAny)) &&
4120 "Unresolved placeholder type");
4124 llvm::FoldingSetNodeID ID;
4127 void *InsertPos =
nullptr;
4129 LValueReferenceTypes.FindNodeOrInsertPos(ID, InsertPos))
4137 if (!SpelledAsLValue || InnerRef || !T.isCanonical()) {
4138 QualType PointeeType = (InnerRef ? InnerRef->getPointeeType() : T);
4143 LValueReferenceTypes.FindNodeOrInsertPos(ID, InsertPos);
4144 assert(!NewIP &&
"Shouldn't be in the map!"); (void)NewIP;
4149 Types.push_back(
New);
4150 LValueReferenceTypes.InsertNode(
New, InsertPos);
4158 assert((!T->isPlaceholderType() ||
4159 T->isSpecificPlaceholderType(BuiltinType::UnknownAny)) &&
4160 "Unresolved placeholder type");
4164 llvm::FoldingSetNodeID ID;
4167 void *InsertPos =
nullptr;
4169 RValueReferenceTypes.FindNodeOrInsertPos(ID, InsertPos))
4177 if (InnerRef || !T.isCanonical()) {
4178 QualType PointeeType = (InnerRef ? InnerRef->getPointeeType() : T);
4183 RValueReferenceTypes.FindNodeOrInsertPos(ID, InsertPos);
4184 assert(!NewIP &&
"Shouldn't be in the map!"); (void)NewIP;
4189 Types.push_back(
New);
4190 RValueReferenceTypes.InsertNode(
New, InsertPos);
4198 assert(Cls &&
"At least one of Qualifier or Cls must be provided");
4201 Cls = Qualifier.getAsRecordDecl();
4205 llvm::FoldingSetNodeID ID;
4208 void *InsertPos =
nullptr;
4210 MemberPointerTypes.FindNodeOrInsertPos(ID, InsertPos))
4215 return Qualifier.getCanonical();
4217 assert(R.isCanonical());
4223 if (!T.isCanonical() || Qualifier != CanonicalQualifier) {
4229 MemberPointerTypes.FindNodeOrInsertPos(ID, InsertPos);
4230 assert(!NewIP &&
"Shouldn't be in the map!");
4234 Types.push_back(
New);
4235 MemberPointerTypes.InsertNode(
New, InsertPos);
4242 const llvm::APInt &ArySizeIn,
4243 const Expr *SizeExpr,
4245 unsigned IndexTypeQuals)
const {
4248 "Constant array of VLAs is illegal!");
4256 llvm::APInt ArySize(ArySizeIn);
4257 ArySize = ArySize.zextOrTrunc(Target->getMaxPointerWidth());
4259 llvm::FoldingSetNodeID ID;
4261 ASM, IndexTypeQuals);
4263 void *InsertPos =
nullptr;
4265 ConstantArrayTypes.FindNodeOrInsertPos(ID, InsertPos))
4276 ASM, IndexTypeQuals);
4281 ConstantArrayTypes.FindNodeOrInsertPos(ID, InsertPos);
4282 assert(!NewIP &&
"Shouldn't be in the map!"); (void)NewIP;
4285 auto *
New = ConstantArrayType::Create(*
this, EltTy, Canon, ArySize, SizeExpr,
4286 ASM, IndexTypeQuals);
4287 ConstantArrayTypes.InsertNode(
New, InsertPos);
4288 Types.push_back(
New);
4297 if (!
type->isVariablyModifiedType())
return type;
4302 const Type *ty = split.
Ty;
4304#define TYPE(Class, Base)
4305#define ABSTRACT_TYPE(Class, Base)
4306#define NON_CANONICAL_TYPE(Class, Base) case Type::Class:
4307#include "clang/AST/TypeNodes.inc"
4308 llvm_unreachable(
"didn't desugar past all non-canonical types?");
4314 case Type::DependentVector:
4315 case Type::ExtVector:
4316 case Type::DependentSizedExtVector:
4317 case Type::ConstantMatrix:
4318 case Type::DependentSizedMatrix:
4319 case Type::DependentAddressSpace:
4320 case Type::ObjCObject:
4321 case Type::ObjCInterface:
4322 case Type::ObjCObjectPointer:
4325 case Type::UnresolvedUsing:
4326 case Type::TypeOfExpr:
4328 case Type::Decltype:
4329 case Type::UnaryTransform:
4330 case Type::DependentName:
4331 case Type::InjectedClassName:
4332 case Type::TemplateSpecialization:
4333 case Type::TemplateTypeParm:
4334 case Type::SubstTemplateTypeParmPack:
4335 case Type::SubstBuiltinTemplatePack:
4337 case Type::DeducedTemplateSpecialization:
4338 case Type::PackExpansion:
4339 case Type::PackIndexing:
4341 case Type::DependentBitInt:
4342 case Type::ArrayParameter:
4343 case Type::HLSLAttributedResource:
4344 case Type::HLSLInlineSpirv:
4345 case Type::OverflowBehavior:
4346 llvm_unreachable(
"type should never be variably-modified");
4350 case Type::FunctionNoProto:
4351 case Type::FunctionProto:
4352 case Type::BlockPointer:
4353 case Type::MemberPointer:
4366 case Type::LValueReference: {
4370 lv->isSpelledAsLValue());
4374 case Type::RValueReference: {
4381 case Type::Atomic: {
4387 case Type::ConstantArray: {
4393 cat->getSizeModifier(),
4394 cat->getIndexTypeCVRQualifiers());
4398 case Type::DependentSizedArray: {
4402 dat->getSizeModifier(), dat->getIndexTypeCVRQualifiers());
4407 case Type::IncompleteArray: {
4412 iat->getIndexTypeCVRQualifiers());
4417 case Type::VariableArray: {
4422 vat->getIndexTypeCVRQualifiers());
4435 unsigned IndexTypeQuals)
const {
4452 VariableArrayTypes.push_back(
New);
4453 Types.push_back(
New);
4463 unsigned elementTypeQuals)
const {
4466 "Size must be type- or value-dependent!");
4470 void *insertPos =
nullptr;
4471 llvm::FoldingSetNodeID ID;
4473 ID, *
this, numElements ?
QualType(canonElementType.
Ty, 0) : elementType,
4474 ASM, elementTypeQuals, numElements);
4478 DependentSizedArrayTypes.FindNodeOrInsertPos(ID, insertPos);
4490 DependentSizedArrayTypes.InsertNode(newType, insertPos);
4491 Types.push_back(newType);
4499 numElements, ASM, elementTypeQuals);
4500 DependentSizedArrayTypes.InsertNode(canonTy, insertPos);
4501 Types.push_back(canonTy);
4506 canonElementType.
Quals);
4510 if (
QualType(canonElementType.
Ty, 0) == elementType &&
4519 Types.push_back(sugaredType);
4525 unsigned elementTypeQuals)
const {
4526 llvm::FoldingSetNodeID ID;
4529 void *insertPos =
nullptr;
4531 IncompleteArrayTypes.FindNodeOrInsertPos(ID, insertPos))
4543 ASM, elementTypeQuals);
4548 IncompleteArrayTypes.FindNodeOrInsertPos(ID, insertPos);
4549 assert(!existing &&
"Shouldn't be in the map!"); (void) existing;
4555 IncompleteArrayTypes.InsertNode(newType, insertPos);
4556 Types.push_back(newType);
4562#define SVE_INT_ELTTY(BITS, ELTS, SIGNED, NUMVECTORS) \
4563 {getIntTypeForBitwidth(BITS, SIGNED), llvm::ElementCount::getScalable(ELTS), \
4566#define SVE_ELTTY(ELTTY, ELTS, NUMVECTORS) \
4567 {ELTTY, llvm::ElementCount::getScalable(ELTS), NUMVECTORS};
4571 llvm_unreachable(
"Unsupported builtin vector type");
4573#define SVE_VECTOR_TYPE_INT(Name, MangledName, Id, SingletonId, NumEls, \
4574 ElBits, NF, IsSigned) \
4575 case BuiltinType::Id: \
4576 return {getIntTypeForBitwidth(ElBits, IsSigned), \
4577 llvm::ElementCount::getScalable(NumEls), NF};
4578#define SVE_VECTOR_TYPE_FLOAT(Name, MangledName, Id, SingletonId, NumEls, \
4580 case BuiltinType::Id: \
4581 return {ElBits == 16 ? HalfTy : (ElBits == 32 ? FloatTy : DoubleTy), \
4582 llvm::ElementCount::getScalable(NumEls), NF};
4583#define SVE_VECTOR_TYPE_BFLOAT(Name, MangledName, Id, SingletonId, NumEls, \
4585 case BuiltinType::Id: \
4586 return {BFloat16Ty, llvm::ElementCount::getScalable(NumEls), NF};
4587#define SVE_VECTOR_TYPE_MFLOAT(Name, MangledName, Id, SingletonId, NumEls, \
4589 case BuiltinType::Id: \
4590 return {MFloat8Ty, llvm::ElementCount::getScalable(NumEls), NF};
4591#define SVE_PREDICATE_TYPE_ALL(Name, MangledName, Id, SingletonId, NumEls, NF) \
4592 case BuiltinType::Id: \
4593 return {BoolTy, llvm::ElementCount::getScalable(NumEls), NF};
4594#include "clang/Basic/AArch64ACLETypes.def"
4596#define RVV_VECTOR_TYPE_INT(Name, Id, SingletonId, NumEls, ElBits, NF, \
4598 case BuiltinType::Id: \
4599 return {getIntTypeForBitwidth(ElBits, IsSigned), \
4600 llvm::ElementCount::getScalable(NumEls), NF};
4601#define RVV_VECTOR_TYPE_FLOAT(Name, Id, SingletonId, NumEls, ElBits, NF) \
4602 case BuiltinType::Id: \
4603 return {ElBits == 16 ? Float16Ty : (ElBits == 32 ? FloatTy : DoubleTy), \
4604 llvm::ElementCount::getScalable(NumEls), NF};
4605#define RVV_VECTOR_TYPE_BFLOAT(Name, Id, SingletonId, NumEls, ElBits, NF) \
4606 case BuiltinType::Id: \
4607 return {BFloat16Ty, llvm::ElementCount::getScalable(NumEls), NF};
4608#define RVV_PREDICATE_TYPE(Name, Id, SingletonId, NumEls) \
4609 case BuiltinType::Id: \
4610 return {BoolTy, llvm::ElementCount::getScalable(NumEls), 1};
4611#include "clang/Basic/RISCVVTypes.def"
4618 if (Target->getTriple().isWasm() && Target->hasFeature(
"reference-types")) {
4619#define WASM_REF_TYPE(Name, MangledName, Id, SingletonId, AS) \
4620 if (BuiltinType::Id == BuiltinType::WasmExternRef) \
4622#include "clang/Basic/WebAssemblyReferenceTypes.def"
4625 "shouldn't try to generate type externref outside WebAssembly target");
4632 unsigned NumFields)
const {
4634 if (
auto It = ScalableVecTyMap.find(K); It != ScalableVecTyMap.end())
4637 if (Target->hasAArch64ACLETypes()) {
4640#define SVE_VECTOR_TYPE_INT(Name, MangledName, Id, SingletonId, NumEls, \
4641 ElBits, NF, IsSigned) \
4642 if (EltTy->hasIntegerRepresentation() && !EltTy->isBooleanType() && \
4643 EltTy->hasSignedIntegerRepresentation() == IsSigned && \
4644 EltTySize == ElBits && NumElts == (NumEls * NF) && NumFields == 1) { \
4645 return ScalableVecTyMap[K] = SingletonId; \
4647#define SVE_VECTOR_TYPE_FLOAT(Name, MangledName, Id, SingletonId, NumEls, \
4649 if (EltTy->hasFloatingRepresentation() && !EltTy->isBFloat16Type() && \
4650 EltTySize == ElBits && NumElts == (NumEls * NF) && NumFields == 1) { \
4651 return ScalableVecTyMap[K] = SingletonId; \
4653#define SVE_VECTOR_TYPE_BFLOAT(Name, MangledName, Id, SingletonId, NumEls, \
4655 if (EltTy->hasFloatingRepresentation() && EltTy->isBFloat16Type() && \
4656 EltTySize == ElBits && NumElts == (NumEls * NF) && NumFields == 1) { \
4657 return ScalableVecTyMap[K] = SingletonId; \
4659#define SVE_VECTOR_TYPE_MFLOAT(Name, MangledName, Id, SingletonId, NumEls, \
4661 if (EltTy->isMFloat8Type() && EltTySize == ElBits && \
4662 NumElts == (NumEls * NF) && NumFields == 1) { \
4663 return ScalableVecTyMap[K] = SingletonId; \
4665#define SVE_PREDICATE_TYPE_ALL(Name, MangledName, Id, SingletonId, NumEls, NF) \
4666 if (EltTy->isBooleanType() && NumElts == (NumEls * NF) && NumFields == 1) \
4667 return ScalableVecTyMap[K] = SingletonId;
4668#include "clang/Basic/AArch64ACLETypes.def"
4669 }
else if (Target->hasRISCVVTypes()) {
4671#define RVV_VECTOR_TYPE(Name, Id, SingletonId, NumEls, ElBits, NF, IsSigned, \
4673 if (!EltTy->isBooleanType() && \
4674 ((EltTy->hasIntegerRepresentation() && \
4675 EltTy->hasSignedIntegerRepresentation() == IsSigned) || \
4676 (EltTy->hasFloatingRepresentation() && !EltTy->isBFloat16Type() && \
4678 (EltTy->hasFloatingRepresentation() && EltTy->isBFloat16Type() && \
4679 IsBF && !IsFP)) && \
4680 EltTySize == ElBits && NumElts == NumEls && NumFields == NF) \
4681 return ScalableVecTyMap[K] = SingletonId;
4682#define RVV_PREDICATE_TYPE(Name, Id, SingletonId, NumEls) \
4683 if (EltTy->isBooleanType() && NumElts == NumEls) \
4684 return ScalableVecTyMap[K] = SingletonId;
4685#include "clang/Basic/RISCVVTypes.def"
4700 llvm::FoldingSetNodeID ID;
4703 void *InsertPos =
nullptr;
4704 if (
VectorType *VTP = VectorTypes.FindNodeOrInsertPos(ID, InsertPos))
4714 VectorType *NewIP = VectorTypes.FindNodeOrInsertPos(ID, InsertPos);
4715 assert(!NewIP &&
"Shouldn't be in the map!"); (void)NewIP;
4718 VectorType(vecType, NumElts, Canonical, VecKind);
4719 VectorTypes.InsertNode(
New, InsertPos);
4720 Types.push_back(
New);
4727 llvm::FoldingSetNodeID ID;
4730 void *InsertPos =
nullptr;
4732 DependentVectorTypes.FindNodeOrInsertPos(ID, InsertPos);
4737 VecType,
QualType(Canon, 0), SizeExpr, AttrLoc, VecKind);
4740 if (CanonVecTy == VecType) {
4745 DependentVectorTypes.FindNodeOrInsertPos(ID, InsertPos);
4746 assert(!CanonCheck &&
4747 "Dependent-sized vector_size canonical type broken");
4749 DependentVectorTypes.InsertNode(
New, InsertPos);
4758 Types.push_back(
New);
4765 unsigned NumElts)
const {
4772 llvm::FoldingSetNodeID ID;
4775 void *InsertPos =
nullptr;
4776 if (
VectorType *VTP = VectorTypes.FindNodeOrInsertPos(ID, InsertPos))
4786 VectorType *NewIP = VectorTypes.FindNodeOrInsertPos(ID, InsertPos);
4787 assert(!NewIP &&
"Shouldn't be in the map!"); (void)NewIP;
4791 VectorTypes.InsertNode(
New, InsertPos);
4792 Types.push_back(
New);
4800 llvm::FoldingSetNodeID ID;
4804 void *InsertPos =
nullptr;
4806 = DependentSizedExtVectorTypes.FindNodeOrInsertPos(ID, InsertPos);
4816 if (CanonVecTy == vecType) {
4821 = DependentSizedExtVectorTypes.FindNodeOrInsertPos(ID, InsertPos);
4822 assert(!CanonCheck &&
"Dependent-sized ext_vector canonical type broken");
4824 DependentSizedExtVectorTypes.InsertNode(
New, InsertPos);
4833 Types.push_back(
New);
4838 unsigned NumColumns)
const {
4839 llvm::FoldingSetNodeID ID;
4841 Type::ConstantMatrix);
4844 "need a valid element type");
4845 assert(NumRows > 0 && NumRows <= LangOpts.MaxMatrixDimension &&
4846 NumColumns > 0 && NumColumns <= LangOpts.MaxMatrixDimension &&
4847 "need valid matrix dimensions");
4848 void *InsertPos =
nullptr;
4858 assert(!NewIP &&
"Matrix type shouldn't already exist in the map");
4864 MatrixTypes.InsertNode(
New, InsertPos);
4865 Types.push_back(
New);
4874 llvm::FoldingSetNodeID ID;
4878 void *InsertPos =
nullptr;
4880 DependentSizedMatrixTypes.FindNodeOrInsertPos(ID, InsertPos);
4885 ColumnExpr, AttrLoc);
4888 DependentSizedMatrixTypes.FindNodeOrInsertPos(ID, InsertPos);
4889 assert(!CanonCheck &&
"Dependent-sized matrix canonical type broken");
4891 DependentSizedMatrixTypes.InsertNode(Canon, InsertPos);
4892 Types.push_back(Canon);
4905 ColumnExpr, AttrLoc);
4906 Types.push_back(
New);
4911 Expr *AddrSpaceExpr,
4917 void *insertPos =
nullptr;
4918 llvm::FoldingSetNodeID ID;
4923 DependentAddressSpaceTypes.FindNodeOrInsertPos(ID, insertPos);
4929 DependentAddressSpaceTypes.InsertNode(canonTy, insertPos);
4930 Types.push_back(canonTy);
4933 if (canonPointeeType == PointeeType &&
4939 AddrSpaceExpr, AttrLoc);
4940 Types.push_back(sugaredType);
4946 return T.isCanonical() &&
4964 llvm::FoldingSetNodeID ID;
4967 void *InsertPos =
nullptr;
4969 FunctionNoProtoTypes.FindNodeOrInsertPos(ID, InsertPos))
4979 FunctionNoProtoTypes.FindNodeOrInsertPos(ID, InsertPos);
4980 assert(!NewIP &&
"Shouldn't be in the map!"); (void)NewIP;
4985 Types.push_back(
New);
4986 FunctionNoProtoTypes.InsertNode(
New, InsertPos);
5002 return CanResultType;
5009 if (!NoexceptInType)
5026 bool AnyPackExpansions =
false;
5030 if (ET->
getAs<PackExpansionType>())
5031 AnyPackExpansions =
true;
5033 return AnyPackExpansions;
5039QualType ASTContext::getFunctionTypeInternal(
5040 QualType ResultTy, ArrayRef<QualType> ArgArray,
5041 const FunctionProtoType::ExtProtoInfo &EPI,
bool OnlyWantCanonical)
const {
5042 size_t NumArgs = ArgArray.size();
5046 llvm::FoldingSetNodeID
ID;
5051 bool Unique =
false;
5053 void *InsertPos =
nullptr;
5054 if (FunctionProtoType *FPT =
5055 FunctionProtoTypes.FindNodeOrInsertPos(ID, InsertPos)) {
5056 QualType Existing = QualType(FPT, 0);
5075 bool IsCanonicalExceptionSpec =
5079 bool isCanonical = !Unique && IsCanonicalExceptionSpec &&
5081 for (
unsigned i = 0; i != NumArgs && isCanonical; ++i)
5082 if (!ArgArray[i].isCanonicalAsParam())
5083 isCanonical =
false;
5085 if (OnlyWantCanonical)
5086 assert(isCanonical &&
5087 "given non-canonical parameters constructing canonical type");
5092 if (!isCanonical && Canonical.
isNull()) {
5093 SmallVector<QualType, 16> CanonicalArgs;
5094 CanonicalArgs.reserve(NumArgs);
5095 for (
unsigned i = 0; i != NumArgs; ++i)
5098 llvm::SmallVector<QualType, 8> ExceptionTypeStorage;
5099 FunctionProtoType::ExtProtoInfo CanonicalEPI = EPI;
5102 if (IsCanonicalExceptionSpec) {
5104 }
else if (NoexceptInType) {
5117 bool AnyPacks =
false;
5119 if (ET->
getAs<PackExpansionType>())
5140 llvm_unreachable(
"dependent noexcept is already canonical");
5143 CanonicalEPI.
ExceptionSpec = FunctionProtoType::ExceptionSpecInfo();
5149 getFunctionTypeInternal(CanResultTy, CanonicalArgs, CanonicalEPI,
true);
5152 FunctionProtoType *NewIP =
5153 FunctionProtoTypes.FindNodeOrInsertPos(ID, InsertPos);
5154 assert(!NewIP &&
"Shouldn't be in the map!"); (void)NewIP;
5159 auto ESH = FunctionProtoType::getExceptionSpecSize(
5161 size_t Size = FunctionProtoType::totalSizeToAlloc<
5162 QualType, SourceLocation, FunctionType::FunctionTypeExtraBitfields,
5163 FunctionType::FunctionTypeExtraAttributeInfo,
5164 FunctionType::FunctionTypeArmAttributes, FunctionType::ExceptionType,
5165 Expr *, FunctionDecl *, FunctionProtoType::ExtParameterInfo, Qualifiers,
5166 FunctionEffect, EffectConditionExpr>(
5170 ESH.NumExprPtr, ESH.NumFunctionDeclPtr,
5175 auto *FTP = (FunctionProtoType *)
Allocate(Size,
alignof(FunctionProtoType));
5176 FunctionProtoType::ExtProtoInfo newEPI = EPI;
5177 new (FTP) FunctionProtoType(ResultTy, ArgArray, Canonical, newEPI);
5178 Types.push_back(FTP);
5180 FunctionProtoTypes.InsertNode(FTP, InsertPos);
5182 AnyFunctionEffects =
true;
5183 return QualType(FTP, 0);
5186QualType ASTContext::getPipeType(QualType T,
bool ReadOnly)
const {
5187 llvm::FoldingSetNodeID
ID;
5190 void *InsertPos =
nullptr;
5191 if (PipeType *PT = PipeTypes.FindNodeOrInsertPos(ID, InsertPos))
5192 return QualType(PT, 0);
5201 PipeType *NewIP = PipeTypes.FindNodeOrInsertPos(ID, InsertPos);
5202 assert(!NewIP &&
"Shouldn't be in the map!");
5205 auto *
New =
new (*
this,
alignof(PipeType)) PipeType(T, Canonical, ReadOnly);
5206 Types.push_back(
New);
5207 PipeTypes.InsertNode(
New, InsertPos);
5208 return QualType(
New, 0);
5218 return getPipeType(T,
true);
5222 return getPipeType(T,
false);
5226 llvm::FoldingSetNodeID ID;
5229 void *InsertPos =
nullptr;
5230 if (
BitIntType *EIT = BitIntTypes.FindNodeOrInsertPos(ID, InsertPos))
5234 BitIntTypes.InsertNode(
New, InsertPos);
5235 Types.push_back(
New);
5240 Expr *NumBitsExpr)
const {
5242 llvm::FoldingSetNodeID ID;
5245 void *InsertPos =
nullptr;
5247 DependentBitIntTypes.FindNodeOrInsertPos(ID, InsertPos))
5252 DependentBitIntTypes.InsertNode(
New, InsertPos);
5254 Types.push_back(
New);
5262 if (
auto *Target = PredefinedSugarTypes[llvm::to_underlying(KD)];
5274 return Ctx.getFromTargetType(Ctx.Target->
getSizeType());
5275 case Kind::SignedSizeT:
5277 case Kind::PtrdiffT:
5280 llvm_unreachable(
"unexpected kind");
5285 Types.push_back(
New);
5286 PredefinedSugarTypes[llvm::to_underlying(KD)] =
New;
5293 if (
auto *Tag = dyn_cast<TagDecl>(
Decl))
5296 if (
auto *
Typedef = dyn_cast<TypedefNameDecl>(
Decl))
5298 if (
auto *UD = dyn_cast<UnresolvedUsingTypenameDecl>(
Decl))
5307 if (
auto *Tag = dyn_cast<TagDecl>(TD))
5309 if (
auto *TN = dyn_cast<TypedefNameDecl>(TD))
5311 if (
const auto *UD = dyn_cast<UnresolvedUsingTypenameDecl>(TD))
5313 assert(TD->TypeForDecl);
5318 if (
const auto *TD = dyn_cast<TagDecl>(
Decl))
5320 if (
const auto *TD = dyn_cast<TypedefNameDecl>(
Decl);
5321 isa_and_nonnull<TypedefDecl, TypeAliasDecl>(TD))
5324 if (
const auto *Using = dyn_cast<UnresolvedUsingTypenameDecl>(
Decl))
5327 assert(
Decl->TypeForDecl);
5337 std::optional<bool> TypeMatchesDeclOrNone)
const {
5338 if (!TypeMatchesDeclOrNone) {
5339 QualType DeclUnderlyingType =
Decl->getUnderlyingType();
5340 assert(!DeclUnderlyingType.
isNull());
5341 if (UnderlyingType.
isNull())
5342 UnderlyingType = DeclUnderlyingType;
5344 assert(
hasSameType(UnderlyingType, DeclUnderlyingType));
5345 TypeMatchesDeclOrNone = UnderlyingType == DeclUnderlyingType;
5349 assert(!UnderlyingType.
isNull());
5353 *TypeMatchesDeclOrNone) {
5354 if (
Decl->TypeForDecl)
5359 !*TypeMatchesDeclOrNone);
5361 Types.push_back(NewType);
5362 Decl->TypeForDecl = NewType;
5366 llvm::FoldingSetNodeID ID;
5368 *TypeMatchesDeclOrNone ?
QualType() : UnderlyingType);
5370 void *InsertPos =
nullptr;
5372 TypedefTypes.FindNodeOrInsertPos(ID, InsertPos))
5373 return QualType(Placeholder->getType(), 0);
5378 1, !!Qualifier, !*TypeMatchesDeclOrNone),
5382 UnderlyingType, !*TypeMatchesDeclOrNone);
5383 auto *Placeholder =
new (NewType->getFoldingSetPlaceholder())
5385 TypedefTypes.InsertNode(Placeholder, InsertPos);
5386 Types.push_back(NewType);
5395 if (UnderlyingType.
isNull()) {
5403 llvm::FoldingSetNodeID ID;
5406 void *InsertPos =
nullptr;
5407 if (
const UsingType *T = UsingTypes.FindNodeOrInsertPos(ID, InsertPos))
5417 Allocate(UsingType::totalSizeToAlloc<NestedNameSpecifier>(!!Qualifier),
5421 UsingTypes.InsertNode(T, InsertPos);
5427 const TagDecl *TD,
bool OwnsTag,
5429 const Type *CanonicalType,
5430 bool WithFoldingSetNode)
const {
5431 auto [TC, Size] = [&] {
5434 static_assert(
alignof(EnumType) ==
alignof(TagType));
5435 return std::make_tuple(Type::Enum,
sizeof(EnumType));
5436 case Decl::ClassTemplatePartialSpecialization:
5437 case Decl::ClassTemplateSpecialization:
5438 case Decl::CXXRecord:
5439 static_assert(
alignof(RecordType) ==
alignof(TagType));
5440 static_assert(
alignof(InjectedClassNameType) ==
alignof(TagType));
5442 return std::make_tuple(Type::InjectedClassName,
5443 sizeof(InjectedClassNameType));
5446 return std::make_tuple(Type::Record,
sizeof(RecordType));
5448 llvm_unreachable(
"unexpected decl kind");
5458 if (WithFoldingSetNode) {
5466 sizeof(TagTypeFoldingSetPlaceholder) +
5467 TagTypeFoldingSetPlaceholder::getOffset() + Size,
5468 std::max(
alignof(TagTypeFoldingSetPlaceholder),
alignof(TagType)));
5469 auto *T =
new (Mem) TagTypeFoldingSetPlaceholder();
5470 Mem = T->getTagType();
5472 Mem =
Allocate(Size,
alignof(TagType));
5475 auto *T = [&, TC = TC]() -> TagType * {
5479 auto *T =
new (Mem) EnumType(TC,
Keyword, Qualifier, TD, OwnsTag,
5480 IsInjected, CanonicalType);
5481 assert(
reinterpret_cast<void *
>(T) ==
5482 reinterpret_cast<void *
>(
static_cast<TagType *
>(T)) &&
5483 "TagType must be the first base of EnumType");
5486 case Type::Record: {
5488 auto *T =
new (Mem) RecordType(TC,
Keyword, Qualifier, TD, OwnsTag,
5489 IsInjected, CanonicalType);
5490 assert(
reinterpret_cast<void *
>(T) ==
5491 reinterpret_cast<void *
>(
static_cast<TagType *
>(T)) &&
5492 "TagType must be the first base of RecordType");
5495 case Type::InjectedClassName: {
5496 auto *T =
new (Mem) InjectedClassNameType(
Keyword, Qualifier, TD,
5497 IsInjected, CanonicalType);
5498 assert(
reinterpret_cast<void *
>(T) ==
5499 reinterpret_cast<void *
>(
static_cast<TagType *
>(T)) &&
5500 "TagType must be the first base of InjectedClassNameType");
5504 llvm_unreachable(
"unexpected type class");
5507 assert(T->getKeyword() ==
Keyword);
5508 assert(T->getQualifier() == Qualifier);
5509 assert(T->getDecl() == TD);
5510 assert(T->isInjected() == IsInjected);
5511 assert(T->isTagOwned() == OwnsTag);
5520 if (
const auto *RD = dyn_cast<CXXRecordDecl>(TD);
5521 RD && RD->isInjectedClassName())
5528 if (TD->TypeForDecl)
5529 return TD->TypeForDecl->getCanonicalTypeUnqualified();
5531 const Type *CanonicalType = getTagTypeInternal(
5534 false,
false,
nullptr,
5536 TD->TypeForDecl = CanonicalType;
5542 const TagDecl *TD,
bool OwnsTag)
const {
5545 bool IsInjected = TD != NonInjectedTD;
5552 if (
Keyword == PreferredKeyword && !Qualifier && !OwnsTag) {
5553 if (
const Type *T = TD->TypeForDecl; T && !T->isCanonicalUnqualified())
5559 std::nullopt, NonInjectedTD,
5560 false, IsInjected, CanonicalType,
5562 TD->TypeForDecl = T;
5566 llvm::FoldingSetNodeID ID;
5567 TagTypeFoldingSetPlaceholder::Profile(ID,
Keyword, Qualifier, NonInjectedTD,
5568 OwnsTag, IsInjected);
5570 void *InsertPos =
nullptr;
5571 if (TagTypeFoldingSetPlaceholder *T =
5572 TagTypes.FindNodeOrInsertPos(ID, InsertPos))
5573 return QualType(T->getTagType(), 0);
5577 getTagTypeInternal(
Keyword, Qualifier, NonInjectedTD, OwnsTag, IsInjected,
5578 CanonicalType,
true);
5579 TagTypes.InsertNode(TagTypeFoldingSetPlaceholder::fromTagType(T), InsertPos);
5584 unsigned NumPositiveBits,
5587 unsigned IntWidth = Target->getIntWidth();
5588 unsigned CharWidth = Target->getCharWidth();
5589 unsigned ShortWidth = Target->getShortWidth();
5590 bool EnumTooLarge =
false;
5592 if (NumNegativeBits) {
5596 if (IsPacked && NumNegativeBits <= CharWidth &&
5597 NumPositiveBits < CharWidth) {
5599 BestWidth = CharWidth;
5600 }
else if (IsPacked && NumNegativeBits <= ShortWidth &&
5601 NumPositiveBits < ShortWidth) {
5603 BestWidth = ShortWidth;
5604 }
else if (NumNegativeBits <= IntWidth && NumPositiveBits < IntWidth) {
5606 BestWidth = IntWidth;
5608 BestWidth = Target->getLongWidth();
5610 if (NumNegativeBits <= BestWidth && NumPositiveBits < BestWidth) {
5613 BestWidth = Target->getLongLongWidth();
5615 if (NumNegativeBits > BestWidth || NumPositiveBits >= BestWidth)
5616 EnumTooLarge =
true;
5620 BestPromotionType = (BestWidth <= IntWidth ?
IntTy : BestType);
5625 if (IsPacked && NumPositiveBits <= CharWidth) {
5627 BestPromotionType =
IntTy;
5628 BestWidth = CharWidth;
5629 }
else if (IsPacked && NumPositiveBits <= ShortWidth) {
5631 BestPromotionType =
IntTy;
5632 BestWidth = ShortWidth;
5633 }
else if (NumPositiveBits <= IntWidth) {
5635 BestWidth = IntWidth;
5636 BestPromotionType = (NumPositiveBits == BestWidth || !LangOpts.CPlusPlus)
5639 }
else if (NumPositiveBits <= (BestWidth = Target->getLongWidth())) {
5641 BestPromotionType = (NumPositiveBits == BestWidth || !LangOpts.CPlusPlus)
5645 BestWidth = Target->getLongLongWidth();
5646 if (NumPositiveBits > BestWidth) {
5651 EnumTooLarge =
true;
5654 BestPromotionType = (NumPositiveBits == BestWidth || !LangOpts.CPlusPlus)
5659 return EnumTooLarge;
5663 assert((T->isIntegralType(*
this) || T->isEnumeralType()) &&
5664 "Integral type required!");
5667 if (
Value.isUnsigned() ||
Value.isNonNegative()) {
5668 if (T->isSignedIntegerOrEnumerationType())
5670 return Value.getActiveBits() <= BitWidth;
5672 return Value.getSignificantBits() <= BitWidth;
5678 const Type *CanonicalType)
const {
5680 UnresolvedUsingType::totalSizeToAlloc<
5682 !!InsertPos, !!Qualifier),
5686 auto *Placeholder =
new (T->getFoldingSetPlaceholder())
5688 TypedefTypes.InsertNode(Placeholder, InsertPos);
5698 return D->TypeForDecl->getCanonicalTypeUnqualified();
5700 const Type *CanonicalType = getUnresolvedUsingTypeInternal(
5704 D->TypeForDecl = CanonicalType;
5713 if (
const Type *T = D->TypeForDecl; T && !T->isCanonicalUnqualified())
5720 nullptr, CanonicalType);
5725 llvm::FoldingSetNodeID ID;
5728 void *InsertPos =
nullptr;
5730 UnresolvedUsingTypes.FindNodeOrInsertPos(ID, InsertPos))
5731 return QualType(Placeholder->getType(), 0);
5735 const Type *T = getUnresolvedUsingTypeInternal(
Keyword, Qualifier, D,
5736 InsertPos, CanonicalType);
5744 llvm::FoldingSetNodeID id;
5745 AttributedType::Profile(
id, *
this, attrKind, modifiedType, equivalentType,
5748 void *insertPos =
nullptr;
5749 AttributedType *
type = AttributedTypes.FindNodeOrInsertPos(
id, insertPos);
5752 assert(!
attr ||
attr->getKind() == attrKind);
5755 type =
new (*
this,
alignof(AttributedType))
5756 AttributedType(canon, attrKind,
attr, modifiedType, equivalentType);
5758 Types.push_back(
type);
5759 AttributedTypes.InsertNode(
type, insertPos);
5772 switch (nullability) {
5788 llvm_unreachable(
"Unknown nullability kind");
5793 llvm::FoldingSetNodeID ID;
5794 BTFTagAttributedType::Profile(ID, Wrapped, BTFAttr);
5796 void *InsertPos =
nullptr;
5797 BTFTagAttributedType *Ty =
5798 BTFTagAttributedTypes.FindNodeOrInsertPos(ID, InsertPos);
5803 Ty =
new (*
this,
alignof(BTFTagAttributedType))
5804 BTFTagAttributedType(Canon, Wrapped, BTFAttr);
5806 Types.push_back(Ty);
5807 BTFTagAttributedTypes.InsertNode(Ty, InsertPos);
5815 StringRef IdentName = II->
getName();
5816 OverflowBehaviorType::OverflowBehaviorKind Kind;
5817 if (IdentName ==
"wrap") {
5818 Kind = OverflowBehaviorType::OverflowBehaviorKind::Wrap;
5819 }
else if (IdentName ==
"trap") {
5820 Kind = OverflowBehaviorType::OverflowBehaviorKind::Trap;
5829 OverflowBehaviorType::OverflowBehaviorKind Kind,
5832 "Cannot have underlying types that are themselves OBTs");
5833 llvm::FoldingSetNodeID ID;
5834 OverflowBehaviorType::Profile(ID, Underlying, Kind);
5835 void *InsertPos =
nullptr;
5837 if (OverflowBehaviorType *OBT =
5838 OverflowBehaviorTypes.FindNodeOrInsertPos(ID, InsertPos)) {
5847 assert(!OverflowBehaviorTypes.FindNodeOrInsertPos(ID, InsertPos) &&
5848 "Shouldn't be in the map");
5851 OverflowBehaviorType *Ty =
new (*
this,
alignof(OverflowBehaviorType))
5852 OverflowBehaviorType(Canonical, Underlying, Kind);
5854 Types.push_back(Ty);
5855 OverflowBehaviorTypes.InsertNode(Ty, InsertPos);
5861 const HLSLAttributedResourceType::Attributes &Attrs) {
5863 llvm::FoldingSetNodeID ID;
5864 HLSLAttributedResourceType::Profile(ID, Wrapped, Contained, Attrs);
5866 void *InsertPos =
nullptr;
5867 HLSLAttributedResourceType *Ty =
5868 HLSLAttributedResourceTypes.FindNodeOrInsertPos(ID, InsertPos);
5872 Ty =
new (*
this,
alignof(HLSLAttributedResourceType))
5873 HLSLAttributedResourceType(Wrapped, Contained, Attrs);
5875 Types.push_back(Ty);
5876 HLSLAttributedResourceTypes.InsertNode(Ty, InsertPos);
5884 llvm::FoldingSetNodeID ID;
5885 HLSLInlineSpirvType::Profile(ID, Opcode, Size, Alignment, Operands);
5887 void *InsertPos =
nullptr;
5888 HLSLInlineSpirvType *Ty =
5889 HLSLInlineSpirvTypes.FindNodeOrInsertPos(ID, InsertPos);
5894 HLSLInlineSpirvType::totalSizeToAlloc<SpirvOperand>(Operands.size()),
5895 alignof(HLSLInlineSpirvType));
5897 Ty =
new (Mem) HLSLInlineSpirvType(Opcode, Size, Alignment, Operands);
5899 Types.push_back(Ty);
5900 HLSLInlineSpirvTypes.InsertNode(Ty, InsertPos);
5907 Decl *AssociatedDecl,
5911 llvm::FoldingSetNodeID ID;
5912 SubstTemplateTypeParmType::Profile(ID, Replacement, AssociatedDecl, Index,
5914 void *InsertPos =
nullptr;
5915 SubstTemplateTypeParmType *SubstParm =
5916 SubstTemplateTypeParmTypes.FindNodeOrInsertPos(ID, InsertPos);
5919 void *Mem =
Allocate(SubstTemplateTypeParmType::totalSizeToAlloc<QualType>(
5920 !Replacement.isCanonical()),
5921 alignof(SubstTemplateTypeParmType));
5922 SubstParm =
new (Mem) SubstTemplateTypeParmType(Replacement, AssociatedDecl,
5923 Index, PackIndex, Final);
5924 Types.push_back(SubstParm);
5925 SubstTemplateTypeParmTypes.InsertNode(SubstParm, InsertPos);
5933 unsigned Index,
bool Final,
5940 llvm::FoldingSetNodeID ID;
5941 SubstTemplateTypeParmPackType::Profile(ID, AssociatedDecl, Index, Final,
5943 void *InsertPos =
nullptr;
5944 if (SubstTemplateTypeParmPackType *SubstParm =
5945 SubstTemplateTypeParmPackTypes.FindNodeOrInsertPos(ID, InsertPos))
5955 [[maybe_unused]]
const auto *Nothing =
5956 SubstTemplateTypeParmPackTypes.FindNodeOrInsertPos(ID, InsertPos);
5961 auto *SubstParm =
new (*
this,
alignof(SubstTemplateTypeParmPackType))
5962 SubstTemplateTypeParmPackType(Canon, AssociatedDecl, Index, Final,
5964 Types.push_back(SubstParm);
5965 SubstTemplateTypeParmPackTypes.InsertNode(SubstParm, InsertPos);
5973 return P.getKind() == TemplateArgument::Type;
5975 "Pack contains a non-type");
5977 llvm::FoldingSetNodeID ID;
5978 SubstBuiltinTemplatePackType::Profile(ID, ArgPack);
5980 void *InsertPos =
nullptr;
5982 SubstBuiltinTemplatePackTypes.FindNodeOrInsertPos(ID, InsertPos))
5991 [[maybe_unused]]
const auto *Nothing =
5992 SubstBuiltinTemplatePackTypes.FindNodeOrInsertPos(ID, InsertPos);
5996 auto *PackType =
new (*
this,
alignof(SubstBuiltinTemplatePackType))
5997 SubstBuiltinTemplatePackType(Canon, ArgPack);
5998 Types.push_back(PackType);
5999 SubstBuiltinTemplatePackTypes.InsertNode(PackType, InsertPos);
6009 assert(Depth >= 0 &&
"Depth must be non-negative");
6010 assert(Index >= 0 &&
"Index must be non-negative");
6012 llvm::FoldingSetNodeID ID;
6013 TemplateTypeParmType::Profile(ID, Depth, Index, ParameterPack, TTPDecl);
6014 void *InsertPos =
nullptr;
6015 TemplateTypeParmType *TypeParm
6016 = TemplateTypeParmTypes.FindNodeOrInsertPos(ID, InsertPos);
6023 TypeParm =
new (*
this,
alignof(TemplateTypeParmType))
6024 TemplateTypeParmType(Depth, Index, ParameterPack, TTPDecl, Canon);
6026 TemplateTypeParmType *TypeCheck
6027 = TemplateTypeParmTypes.FindNodeOrInsertPos(ID, InsertPos);
6028 assert(!TypeCheck &&
"Template type parameter canonical type broken");
6031 TypeParm =
new (*
this,
alignof(TemplateTypeParmType)) TemplateTypeParmType(
6032 Depth, Index, ParameterPack,
nullptr,
QualType());
6034 Types.push_back(TypeParm);
6035 TemplateTypeParmTypes.InsertNode(TypeParm, InsertPos);
6061 llvm_unreachable(
"unexpected keyword kind");
6075 ElaboratedKeywordLoc, QualifierLoc, TemplateKeywordLoc, NameLoc,
6085 SpecifiedArgVec.reserve(SpecifiedArgs.size());
6087 SpecifiedArgVec.push_back(Arg.getArgument());
6090 CanonicalArgs, Underlying);
6093[[maybe_unused]]
static bool
6096 if (Arg.isPackExpansion())
6107 Template.getAsDependentTemplateName()));
6109 for (
const auto &Arg : Args)
6113 llvm::FoldingSetNodeID ID;
6116 void *InsertPos =
nullptr;
6117 if (
auto *T = TemplateSpecializationTypes.FindNodeOrInsertPos(ID, InsertPos))
6120 void *Mem =
Allocate(
sizeof(TemplateSpecializationType) +
6122 alignof(TemplateSpecializationType));
6126 assert(Spec->isDependentType() &&
6127 "canonical template specialization must be dependent");
6128 Types.push_back(Spec);
6129 TemplateSpecializationTypes.InsertNode(Spec, InsertPos);
6137 const auto *TD =
Template.getAsTemplateDecl(
true);
6138 bool IsTypeAlias = TD && TD->isTypeAlias();
6139 if (Underlying.
isNull()) {
6146 bool NonCanonical =
Template != CanonTemplate ||
Keyword != CanonKeyword;
6148 if (CanonicalArgs.empty()) {
6151 CanonicalArgs = CanonArgsVec;
6153 NonCanonical |= !llvm::equal(
6154 SpecifiedArgs, CanonicalArgs,
6163 assert((!isa_and_nonnull<TypeAliasTemplateDecl>(TD) ||
6165 "Caller must compute aliased type");
6166 IsTypeAlias =
false;
6169 CanonKeyword, CanonTemplate, CanonicalArgs);
6173 void *Mem =
Allocate(
sizeof(TemplateSpecializationType) +
6175 (IsTypeAlias ?
sizeof(
QualType) : 0),
6176 alignof(TemplateSpecializationType));
6177 auto *Spec =
new (Mem) TemplateSpecializationType(
6179 Types.push_back(Spec);
6185 llvm::FoldingSetNodeID ID;
6188 void *InsertPos =
nullptr;
6189 ParenType *T = ParenTypes.FindNodeOrInsertPos(ID, InsertPos);
6196 ParenType *CheckT = ParenTypes.FindNodeOrInsertPos(ID, InsertPos);
6197 assert(!CheckT &&
"Paren canonical type broken");
6203 ParenTypes.InsertNode(T, InsertPos);
6216 Types.push_back(newType);
6223 llvm::FoldingSetNodeID ID;
6224 DependentNameType::Profile(ID,
Keyword, NNS, Name);
6226 void *InsertPos =
nullptr;
6227 if (DependentNameType *T =
6228 DependentNameTypes.FindNodeOrInsertPos(ID, InsertPos))
6236 if (CanonKeyword !=
Keyword || CanonNNS != NNS) {
6238 [[maybe_unused]] DependentNameType *T =
6239 DependentNameTypes.FindNodeOrInsertPos(ID, InsertPos);
6240 assert(!T &&
"broken canonicalization");
6244 DependentNameType *T =
new (*
this,
alignof(DependentNameType))
6245 DependentNameType(
Keyword, NNS, Name, Canon);
6247 DependentNameTypes.InsertNode(T, InsertPos);
6253 if (
const auto *TTP = dyn_cast<TemplateTypeParmDecl>(Param)) {
6255 if (TTP->isParameterPack())
6259 }
else if (
auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(Param)) {
6261 NTTP->getType().getNonPackExpansionType().getNonLValueExprType(*
this);
6267 if (T->isRecordType()) {
6276 Expr *E =
new (*this)
6278 T,
VK, NTTP->getLocation());
6280 if (NTTP->isParameterPack())
6286 std::nullopt,
false,
6288 if (TTP->isParameterPack())
6294 if (Param->isTemplateParameterPack())
6303 bool ExpectPackInType)
const {
6305 "Pack expansions must expand one or more parameter packs");
6307 llvm::FoldingSetNodeID ID;
6308 PackExpansionType::Profile(ID, Pattern, NumExpansions);
6310 void *InsertPos =
nullptr;
6311 PackExpansionType *T = PackExpansionTypes.FindNodeOrInsertPos(ID, InsertPos);
6322 PackExpansionTypes.FindNodeOrInsertPos(ID, InsertPos);
6325 T =
new (*
this,
alignof(PackExpansionType))
6326 PackExpansionType(Pattern, Canon, NumExpansions);
6328 PackExpansionTypes.InsertNode(T, InsertPos);
6340 if (Protocols.empty())
return true;
6345 for (
unsigned i = 1; i != Protocols.size(); ++i)
6355 llvm::array_pod_sort(Protocols.begin(), Protocols.end(),
CmpProtocolNames);
6359 P = P->getCanonicalDecl();
6362 auto ProtocolsEnd = llvm::unique(Protocols);
6363 Protocols.erase(ProtocolsEnd, Protocols.end());
6368 unsigned NumProtocols)
const {
6377 bool isKindOf)
const {
6380 if (typeArgs.empty() && protocols.empty() && !isKindOf &&
6385 llvm::FoldingSetNodeID ID;
6386 ObjCObjectTypeImpl::Profile(ID, baseType, typeArgs, protocols, isKindOf);
6387 void *InsertPos =
nullptr;
6388 if (
ObjCObjectType *QT = ObjCObjectTypes.FindNodeOrInsertPos(ID, InsertPos))
6395 if (effectiveTypeArgs.empty()) {
6397 effectiveTypeArgs = baseObject->getTypeArgs();
6404 bool typeArgsAreCanonical = llvm::all_of(
6407 if (!typeArgsAreCanonical || !protocolsSorted || !baseType.
isCanonical()) {
6411 if (!typeArgsAreCanonical) {
6412 canonTypeArgsVec.reserve(effectiveTypeArgs.size());
6413 for (
auto typeArg : effectiveTypeArgs)
6415 canonTypeArgs = canonTypeArgsVec;
6417 canonTypeArgs = effectiveTypeArgs;
6422 if (!protocolsSorted) {
6423 canonProtocolsVec.append(protocols.begin(), protocols.end());
6425 canonProtocols = canonProtocolsVec;
6427 canonProtocols = protocols;
6431 canonProtocols, isKindOf);
6434 ObjCObjectTypes.FindNodeOrInsertPos(ID, InsertPos);
6437 unsigned size =
sizeof(ObjCObjectTypeImpl);
6438 size += typeArgs.size() *
sizeof(
QualType);
6440 void *mem =
Allocate(size,
alignof(ObjCObjectTypeImpl));
6442 new (mem) ObjCObjectTypeImpl(canonical, baseType, typeArgs, protocols,
6446 ObjCObjectTypes.InsertNode(T, InsertPos);
6456 bool allowOnPointerType)
const {
6459 if (
const auto *objT = dyn_cast<ObjCTypeParamType>(
type.getTypePtr())) {
6464 if (allowOnPointerType) {
6465 if (
const auto *objPtr =
6466 dyn_cast<ObjCObjectPointerType>(
type.getTypePtr())) {
6470 protocolsVec.append(objT->qual_begin(),
6472 protocolsVec.append(protocols.begin(), protocols.end());
6475 objT->getBaseType(),
6476 objT->getTypeArgsAsWritten(),
6478 objT->isKindOfTypeAsWritten());
6484 if (
const auto *objT = dyn_cast<ObjCObjectType>(
type.getTypePtr())){
6489 objT->getTypeArgsAsWritten(),
6491 objT->isKindOfTypeAsWritten());
6495 if (
type->isObjCObjectType()) {
6505 if (
type->isObjCIdType()) {
6508 objPtr->isKindOfType());
6513 if (
type->isObjCClassType()) {
6516 objPtr->isKindOfType());
6528 llvm::FoldingSetNodeID ID;
6529 ObjCTypeParamType::Profile(ID,
Decl,
Decl->getUnderlyingType(), protocols);
6530 void *InsertPos =
nullptr;
6531 if (ObjCTypeParamType *TypeParam =
6532 ObjCTypeParamTypes.FindNodeOrInsertPos(ID, InsertPos))
6537 if (!protocols.empty()) {
6541 Canonical, protocols, hasError,
true ));
6542 assert(!hasError &&
"Error when apply protocol qualifier to bound type");
6545 unsigned size =
sizeof(ObjCTypeParamType);
6547 void *mem =
Allocate(size,
alignof(ObjCTypeParamType));
6548 auto *newType =
new (mem) ObjCTypeParamType(
Decl, Canonical, protocols);
6550 Types.push_back(newType);
6551 ObjCTypeParamTypes.InsertNode(newType, InsertPos);
6561 protocols.append(NewTypeParamTy->qual_begin(), NewTypeParamTy->qual_end());
6576 for (
auto *Proto : OPT->quals()) {
6599 if (InheritedProtocols.empty())
6603 bool Conforms =
false;
6604 for (
auto *Proto : OPT->quals()) {
6606 for (
auto *PI : InheritedProtocols) {
6618 for (
auto *PI : InheritedProtocols) {
6620 bool Adopts =
false;
6621 for (
auto *Proto : OPT->quals()) {
6635 llvm::FoldingSetNodeID ID;
6638 void *InsertPos =
nullptr;
6640 ObjCObjectPointerTypes.FindNodeOrInsertPos(ID, InsertPos))
6649 ObjCObjectPointerTypes.FindNodeOrInsertPos(ID, InsertPos);
6658 Types.push_back(QType);
6659 ObjCObjectPointerTypes.InsertNode(QType, InsertPos);
6667 if (
Decl->TypeForDecl)
6671 assert(PrevDecl->TypeForDecl &&
"previous decl has no TypeForDecl");
6672 Decl->TypeForDecl = PrevDecl->TypeForDecl;
6673 return QualType(PrevDecl->TypeForDecl, 0);
6682 Decl->TypeForDecl = T;
6695 llvm::FoldingSetNodeID ID;
6699 void *InsertPos =
nullptr;
6701 DependentTypeOfExprTypes.FindNodeOrInsertPos(ID, InsertPos);
6711 DependentTypeOfExprTypes.InsertNode(Canon, InsertPos);
6719 Types.push_back(toe);
6730 auto *tot =
new (*
this,
alignof(TypeOfType))
6731 TypeOfType(*
this, tofType, Canonical, Kind);
6732 Types.push_back(tot);
6756 llvm_unreachable(
"Unknown value kind");
6771 }
else if (!UnderlyingType.
isNull()) {
6774 llvm::FoldingSetNodeID ID;
6775 DependentDecltypeType::Profile(ID, *
this, E);
6777 void *InsertPos =
nullptr;
6778 if (DependentDecltypeType *Canon =
6779 DependentDecltypeTypes.FindNodeOrInsertPos(ID, InsertPos))
6784 new (*
this,
alignof(DependentDecltypeType)) DependentDecltypeType(E);
6785 DependentDecltypeTypes.InsertNode(DT, InsertPos);
6786 Types.push_back(DT);
6789 auto *DT =
new (*
this,
alignof(DecltypeType))
6790 DecltypeType(E, UnderlyingType, CanonType);
6791 Types.push_back(DT);
6796 bool FullySubstituted,
6800 if (FullySubstituted && Index) {
6803 llvm::FoldingSetNodeID ID;
6804 PackIndexingType::Profile(ID, *
this, Pattern.
getCanonicalType(), IndexExpr,
6805 FullySubstituted, Expansions);
6806 void *InsertPos =
nullptr;
6807 PackIndexingType *Canon =
6808 DependentPackIndexingTypes.FindNodeOrInsertPos(ID, InsertPos);
6811 PackIndexingType::totalSizeToAlloc<QualType>(Expansions.size()),
6815 IndexExpr, FullySubstituted, Expansions);
6816 DependentPackIndexingTypes.InsertNode(Canon, InsertPos);
6822 Allocate(PackIndexingType::totalSizeToAlloc<QualType>(Expansions.size()),
6824 auto *T =
new (Mem) PackIndexingType(Canonical, Pattern, IndexExpr,
6825 FullySubstituted, Expansions);
6834 UnaryTransformType::UTTKind Kind)
const {
6836 llvm::FoldingSetNodeID ID;
6837 UnaryTransformType::Profile(ID, BaseType, UnderlyingType, Kind);
6839 void *InsertPos =
nullptr;
6840 if (UnaryTransformType *UT =
6841 UnaryTransformTypes.FindNodeOrInsertPos(ID, InsertPos))
6845 if (!BaseType->isDependentType()) {
6848 assert(UnderlyingType.
isNull() || BaseType == UnderlyingType);
6851 BaseType != CanonBase) {
6856 [[maybe_unused]] UnaryTransformType *UT =
6857 UnaryTransformTypes.FindNodeOrInsertPos(ID, InsertPos);
6858 assert(!UT &&
"broken canonicalization");
6862 auto *UT =
new (*
this,
alignof(UnaryTransformType))
6863 UnaryTransformType(BaseType, UnderlyingType, Kind, CanonType);
6864 UnaryTransformTypes.InsertNode(UT, InsertPos);
6865 Types.push_back(UT);
6878 !TypeConstraintConcept) {
6879 assert(DeducedAsType.
isNull() &&
"");
6880 assert(TypeConstraintArgs.empty() &&
"");
6885 llvm::FoldingSetNodeID ID;
6886 AutoType::Profile(ID, *
this, DK, DeducedAsType,
Keyword,
6887 TypeConstraintConcept, TypeConstraintArgs);
6888 if (
auto const AT_iter = AutoTypes.find(ID); AT_iter != AutoTypes.end())
6889 return QualType(AT_iter->getSecond(), 0);
6892 assert(!DeducedAsType.
isNull() &&
"deduced type must be provided");
6894 assert(DeducedAsType.
isNull() &&
"deduced type must not be provided");
6895 if (TypeConstraintConcept) {
6896 bool AnyNonCanonArgs =
false;
6897 auto *CanonicalConcept =
6900 *
this, TypeConstraintArgs, AnyNonCanonArgs);
6901 if (TypeConstraintConcept != CanonicalConcept || AnyNonCanonArgs)
6903 CanonicalConceptArgs);
6907 void *Mem =
Allocate(
sizeof(AutoType) +
6910 auto *AT =
new (Mem) AutoType(DK, DeducedAsType,
Keyword,
6911 TypeConstraintConcept, TypeConstraintArgs);
6913 llvm::FoldingSetNodeID InsertedID;
6914 AT->Profile(InsertedID, *
this);
6915 assert(InsertedID == ID &&
"ID does not match");
6917 Types.push_back(AT);
6918 AutoTypes.try_emplace(ID, AT);
6926 if (
auto *AT = CanonT->
getAs<AutoType>()) {
6927 if (!AT->isConstrained())
6949 void *InsertPos =
nullptr;
6950 llvm::FoldingSetNodeID ID;
6951 DeducedTemplateSpecializationType::Profile(ID, DK, DeducedAsType,
Keyword,
6953 if (DeducedTemplateSpecializationType *DTST =
6954 DeducedTemplateSpecializationTypes.FindNodeOrInsertPos(ID, InsertPos))
6958 assert(!DeducedAsType.
isNull() &&
"deduced type must be provided");
6960 assert(DeducedAsType.
isNull() &&
"deduced type must not be provided");
6969 [[maybe_unused]] DeducedTemplateSpecializationType *DTST =
6970 DeducedTemplateSpecializationTypes.FindNodeOrInsertPos(ID, InsertPos);
6971 assert(!DTST &&
"broken canonicalization");
6975 auto *DTST =
new (*
this,
alignof(DeducedTemplateSpecializationType))
6976 DeducedTemplateSpecializationType(DK, DeducedAsType,
Keyword,
Template);
6979 llvm::FoldingSetNodeID TempID;
6980 DTST->Profile(TempID);
6981 assert(ID == TempID &&
"ID does not match");
6983 Types.push_back(DTST);
6984 DeducedTemplateSpecializationTypes.InsertNode(DTST, InsertPos);
6993 llvm::FoldingSetNodeID ID;
6996 void *InsertPos =
nullptr;
6997 if (
AtomicType *AT = AtomicTypes.FindNodeOrInsertPos(ID, InsertPos))
7003 if (!T.isCanonical()) {
7007 AtomicType *NewIP = AtomicTypes.FindNodeOrInsertPos(ID, InsertPos);
7008 assert(!NewIP &&
"Shouldn't be in the map!"); (void)NewIP;
7011 Types.push_back(
New);
7012 AtomicTypes.InsertNode(
New, InsertPos);
7044 return getFromTargetType(Target->getSizeType());
7063 return getFromTargetType(Target->getUnsignedPtrDiffType(
LangAS::Default));
7068 return getFromTargetType(Target->getIntMaxType());
7073 return getFromTargetType(Target->getUIntMaxType());
7091 return getFromTargetType(Target->getIntPtrType());
7101 return getFromTargetType(Target->getProcessIDType());
7113 const Type *Ty = T.getTypePtr();
7141 quals = splitType.
Quals;
7146 QualType elementType = AT->getElementType();
7151 if (elementType == unqualElementType) {
7152 assert(quals.
empty());
7153 quals = splitType.
Quals;
7161 if (
const auto *CAT = dyn_cast<ConstantArrayType>(AT)) {
7163 CAT->getSizeExpr(), CAT->getSizeModifier(), 0);
7166 if (
const auto *IAT = dyn_cast<IncompleteArrayType>(AT)) {
7170 if (
const auto *VAT = dyn_cast<VariableArrayType>(AT)) {
7172 VAT->getSizeModifier(),
7173 VAT->getIndexTypeCVRQualifiers());
7178 DSAT->getSizeModifier(), 0);
7188 bool AllowPiMismatch)
const {
7203 if (
auto *CAT1 = dyn_cast<ConstantArrayType>(AT1)) {
7204 auto *CAT2 = dyn_cast<ConstantArrayType>(AT2);
7205 if (!((CAT2 && CAT1->getSize() == CAT2->getSize()) ||
7218 T1 = AT1->getElementType();
7219 T2 = AT2->getElementType();
7239 bool AllowPiMismatch)
const {
7244 if (T1PtrType && T2PtrType) {
7252 T1MPType && T2MPType) {
7255 if (T1MPType->getQualifier() != T2MPType->getQualifier())
7267 if (T1OPType && T2OPType) {
7299 if (Quals1 != Quals2)
7369 llvm_unreachable(
"bad template name kind!");
7375 if (!TP->hasDefaultArgument())
7377 return &TP->getDefaultArgument().getArgument();
7380 case NamedDecl::TemplateTypeParm:
7382 case NamedDecl::NonTypeTemplateParm:
7384 case NamedDecl::TemplateTemplateParm:
7387 llvm_unreachable(
"Unexpected template parameter kind");
7392 bool IgnoreDeduced)
const {
7393 while (std::optional<TemplateName> UnderlyingOrNone =
7395 Name = *UnderlyingOrNone;
7400 if (
auto *TTP = dyn_cast<TemplateTemplateParmDecl>(
Template))
7412 llvm_unreachable(
"cannot canonicalize overloaded template");
7416 assert(DTN &&
"Non-dependent template names must refer to template decls.");
7435 assert(IgnoreDeduced ==
false);
7442 bool NonCanonical = CanonUnderlying != Underlying;
7448 assert(CanonArgs.size() <= Params.size());
7454 for (
int I = CanonArgs.size() - 1; I >= 0; --I) {
7463 if (I ==
int(CanonArgs.size() - 1))
7464 CanonArgs.pop_back();
7465 NonCanonical =
true;
7475 llvm_unreachable(
"always sugar node");
7478 llvm_unreachable(
"bad template name!");
7483 bool IgnoreDeduced)
const {
7504 llvm::FoldingSetNodeID XCEID, YCEID;
7505 XCE->
Profile(XCEID, *
this,
true,
true);
7506 YCE->
Profile(YCEID, *
this,
true,
true);
7507 return XCEID == YCEID;
7556 if (
auto *TX = dyn_cast<TemplateTypeParmDecl>(
X)) {
7558 if (TX->isParameterPack() != TY->isParameterPack())
7560 if (TX->hasTypeConstraint() != TY->hasTypeConstraint())
7563 TY->getTypeConstraint());
7566 if (
auto *TX = dyn_cast<NonTypeTemplateParmDecl>(
X)) {
7568 return TX->isParameterPack() == TY->isParameterPack() &&
7569 TX->getASTContext().hasSameType(TX->getType(), TY->getType()) &&
7571 TY->getPlaceholderTypeConstraint());
7576 return TX->isParameterPack() == TY->isParameterPack() &&
7578 TY->getTemplateParameters());
7583 if (
X->size() != Y->
size())
7586 for (
unsigned I = 0, N =
X->size(); I != N; ++I)
7600 if (
auto *TTPX = dyn_cast<TemplateTypeParmDecl>(
X)) {
7602 if (!TTPX->hasDefaultArgument() || !TTPY->hasDefaultArgument())
7605 return hasSameType(TTPX->getDefaultArgument().getArgument().getAsType(),
7606 TTPY->getDefaultArgument().getArgument().getAsType());
7609 if (
auto *NTTPX = dyn_cast<NonTypeTemplateParmDecl>(
X)) {
7611 if (!NTTPX->hasDefaultArgument() || !NTTPY->hasDefaultArgument())
7614 Expr *DefaultArgumentX =
7615 NTTPX->getDefaultArgument().getArgument().getAsExpr()->
IgnoreImpCasts();
7616 Expr *DefaultArgumentY =
7617 NTTPY->getDefaultArgument().getArgument().getAsExpr()->
IgnoreImpCasts();
7618 llvm::FoldingSetNodeID XID, YID;
7619 DefaultArgumentX->
Profile(XID, *
this,
true);
7620 DefaultArgumentY->
Profile(YID, *
this,
true);
7627 if (!TTPX->hasDefaultArgument() || !TTPY->hasDefaultArgument())
7642 auto Kind =
X.getKind();
7650 auto [NamespaceX, PrefixX] =
X.getAsNamespaceAndPrefix();
7653 NamespaceY->getNamespace()))
7658 const auto *TX =
X.getAsType(), *TY = Y.
getAsType();
7659 if (TX->getCanonicalTypeInternal() != TY->getCanonicalTypeInternal())
7668 llvm_unreachable(
"unhandled qualifier kind");
7674 if (A->
hasAttr<CUDADeviceAttr>() != B->
hasAttr<CUDADeviceAttr>())
7676 if (A->
hasAttr<CUDADeviceAttr>() && B->
hasAttr<CUDADeviceAttr>())
7688 llvm::FoldingSetNodeID Cand1ID, Cand2ID;
7692 for (
auto Pair : zip_longest(AEnableIfAttrs, BEnableIfAttrs)) {
7693 std::optional<EnableIfAttr *> Cand1A = std::get<0>(Pair);
7694 std::optional<EnableIfAttr *> Cand2A = std::get<1>(Pair);
7697 if (!Cand1A || !Cand2A)
7703 (*Cand1A)->getCond()->Profile(Cand1ID, A->
getASTContext(),
true);
7704 (*Cand2A)->getCond()->Profile(Cand2ID, B->
getASTContext(),
true);
7708 if (Cand1ID != Cand2ID)
7742 if (
const auto *TypedefX = dyn_cast<TypedefNameDecl>(
X))
7743 if (
const auto *TypedefY = dyn_cast<TypedefNameDecl>(Y))
7745 TypedefY->getUnderlyingType());
7762 if (
const auto *TagX = dyn_cast<TagDecl>(
X)) {
7764 return (TagX->getTagKind() == TagY->getTagKind()) ||
7776 if (
const auto *FuncX = dyn_cast<FunctionDecl>(
X)) {
7778 if (
const auto *CtorX = dyn_cast<CXXConstructorDecl>(
X)) {
7780 if (CtorX->getInheritedConstructor() &&
7781 !
isSameEntity(CtorX->getInheritedConstructor().getConstructor(),
7782 CtorY->getInheritedConstructor().getConstructor()))
7786 if (FuncX->isMultiVersion() != FuncY->isMultiVersion())
7791 if (FuncX->isMultiVersion()) {
7792 const auto *TAX = FuncX->getAttr<TargetAttr>();
7793 const auto *TAY = FuncY->getAttr<TargetAttr>();
7794 assert(TAX && TAY &&
"Multiversion Function without target attribute");
7796 if (TAX->getFeaturesStr() != TAY->getFeaturesStr())
7802 if ((FuncX->isMemberLikeConstrainedFriend() ||
7803 FuncY->isMemberLikeConstrainedFriend()) &&
7804 !FuncX->getLexicalDeclContext()->Equals(
7805 FuncY->getLexicalDeclContext())) {
7810 FuncY->getTrailingRequiresClause()))
7818 FD = FD->getCanonicalDecl();
7819 return FD->getTypeSourceInfo() ? FD->getTypeSourceInfo()->getType()
7822 QualType XT = GetTypeAsWritten(FuncX), YT = GetTypeAsWritten(FuncY);
7837 return FuncX->getLinkageInternal() == FuncY->getLinkageInternal() &&
7842 if (
const auto *VarX = dyn_cast<VarDecl>(
X)) {
7844 if (VarX->getLinkageInternal() == VarY->getLinkageInternal()) {
7847 if (VarX->getType().isNull() || VarY->getType().isNull())
7850 if (
hasSameType(VarX->getType(), VarY->getType()))
7860 if (!VarXTy || !VarYTy)
7869 if (
const auto *NamespaceX = dyn_cast<NamespaceDecl>(
X)) {
7871 return NamespaceX->isInline() == NamespaceY->isInline();
7876 if (
const auto *TemplateX = dyn_cast<TemplateDecl>(
X)) {
7880 if (
const auto *ConceptX = dyn_cast<ConceptDecl>(
X)) {
7883 ConceptY->getConstraintExpr()))
7888 TemplateY->getTemplatedDecl()) &&
7890 TemplateY->getTemplateParameters());
7894 if (
const auto *FDX = dyn_cast<FieldDecl>(
X)) {
7897 return hasSameType(FDX->getType(), FDY->getType());
7901 if (
const auto *IFDX = dyn_cast<IndirectFieldDecl>(
X)) {
7903 return IFDX->getAnonField()->getCanonicalDecl() ==
7904 IFDY->getAnonField()->getCanonicalDecl();
7913 if (
const auto *USX = dyn_cast<UsingShadowDecl>(
X)) {
7920 if (
const auto *UX = dyn_cast<UsingDecl>(
X)) {
7923 UX->hasTypename() == UY->hasTypename() &&
7924 UX->isAccessDeclaration() == UY->isAccessDeclaration();
7926 if (
const auto *UX = dyn_cast<UnresolvedUsingValueDecl>(
X)) {
7929 UX->isAccessDeclaration() == UY->isAccessDeclaration();
7931 if (
const auto *UX = dyn_cast<UnresolvedUsingTypenameDecl>(
X)) {
7939 if (
const auto *UX = dyn_cast<UsingPackDecl>(
X)) {
7941 UX->getInstantiatedFromUsingDecl(),
7946 if (
const auto *NAX = dyn_cast<NamespaceAliasDecl>(
X)) {
7948 return NAX->getNamespace()->Equals(NAY->getNamespace());
7996 bool AnyNonCanonArgs =
false;
7999 if (!AnyNonCanonArgs)
8009 llvm_unreachable(
"Unhandled template argument kind");
8019 llvm_unreachable(
"Comparing NULL template argument");
8044 llvm::FoldingSetNodeID ID1, ID2;
8054 return isSameTemplateArgument(Arg1, Arg2);
8058 llvm_unreachable(
"Unhandled template argument kind");
8063 if (!T.hasLocalQualifiers()) {
8065 if (
const auto *AT = dyn_cast<ArrayType>(T))
8085 const auto *ATy = dyn_cast<ArrayType>(split.
Ty);
8086 if (!ATy || qs.
empty())
8093 if (
const auto *CAT = dyn_cast<ConstantArrayType>(ATy))
8096 CAT->getSizeModifier(),
8097 CAT->getIndexTypeCVRQualifiers()));
8098 if (
const auto *IAT = dyn_cast<IncompleteArrayType>(ATy))
8100 IAT->getSizeModifier(),
8101 IAT->getIndexTypeCVRQualifiers()));
8103 if (
const auto *DSAT = dyn_cast<DependentSizedArrayType>(ATy))
8105 NewEltTy, DSAT->getSizeExpr(), DSAT->getSizeModifier(),
8106 DSAT->getIndexTypeCVRQualifiers()));
8111 VAT->getIndexTypeCVRQualifiers()));
8119 if (T->isArrayType() || T->isFunctionType())
8127 return T.getUnqualifiedType();
8138 if (T->isArrayType() || T->isFunctionType())
8140 return T.getUnqualifiedType();
8155 assert(PrettyArrayType &&
"Not an array type!");
8192 uint64_t ElementCount = 1;
8195 CA = dyn_cast_or_null<ConstantArrayType>(
8198 return ElementCount;
8206 uint64_t ElementCount = 1;
8210 AILE = dyn_cast<ArrayInitLoopExpr>(AILE->
getSubExpr());
8213 return ElementCount;
8223 default: llvm_unreachable(
"getFloatingRank(): not a floating type");
8225 case BuiltinType::Half:
return HalfRank;
8226 case BuiltinType::Float:
return FloatRank;
8259unsigned ASTContext::getIntegerRank(
const Type *T)
const {
8260 assert(T->isCanonicalUnqualified() &&
"T should be canonicalized");
8264 if (
const auto *EIT = dyn_cast<BitIntType>(T))
8265 return 0 + (EIT->getNumBits() << 3);
8267 if (
const auto *OBT = dyn_cast<OverflowBehaviorType>(T))
8268 return getIntegerRank(OBT->getUnderlyingType().getTypePtr());
8271 default: llvm_unreachable(
"getIntegerRank(): not a built-in integer");
8272 case BuiltinType::Bool:
8274 case BuiltinType::Char_S:
8275 case BuiltinType::Char_U:
8276 case BuiltinType::SChar:
8277 case BuiltinType::UChar:
8279 case BuiltinType::Short:
8280 case BuiltinType::UShort:
8282 case BuiltinType::Int:
8283 case BuiltinType::UInt:
8285 case BuiltinType::Long:
8286 case BuiltinType::ULong:
8288 case BuiltinType::LongLong:
8289 case BuiltinType::ULongLong:
8291 case BuiltinType::Int128:
8292 case BuiltinType::UInt128:
8297 case BuiltinType::Char8:
8299 case BuiltinType::Char16:
8300 return getIntegerRank(
8302 case BuiltinType::Char32:
8303 return getIntegerRank(
8305 case BuiltinType::WChar_S:
8306 case BuiltinType::WChar_U:
8307 return getIntegerRank(
8337 uint64_t BitWidth = Field->getBitWidthValue();
8363 if (BitWidth < IntSize)
8366 if (BitWidth == IntSize)
8381 assert(!Promotable.
isNull());
8384 return ED->getPromotionType();
8388 if (
const auto *OBT = Promotable->
getAs<OverflowBehaviorType>()) {
8401 if (BT->getKind() == BuiltinType::WChar_S ||
8402 BT->getKind() == BuiltinType::WChar_U ||
8403 BT->getKind() == BuiltinType::Char8 ||
8404 BT->getKind() == BuiltinType::Char16 ||
8405 BT->getKind() == BuiltinType::Char32) {
8406 bool FromIsSigned = BT->getKind() == BuiltinType::WChar_S;
8410 for (
const auto &PT : PromoteTypes) {
8412 if (FromSize < ToSize ||
8413 (FromSize == ToSize && FromIsSigned == PT->isSignedIntegerType()))
8416 llvm_unreachable(
"char type should fit into long long");
8423 uint64_t PromotableSize =
getIntWidth(Promotable);
8432 while (!T.isNull()) {
8434 return T.getObjCLifetime();
8435 if (T->isArrayType())
8437 else if (
const auto *PT = T->getAs<
PointerType>())
8438 T = PT->getPointeeType();
8440 T = RT->getPointeeType();
8465 if (
const auto *ET = dyn_cast<EnumType>(LHSC))
8467 if (
const auto *ET = dyn_cast<EnumType>(RHSC))
8470 if (LHSC == RHSC)
return 0;
8475 unsigned LHSRank = getIntegerRank(LHSC);
8476 unsigned RHSRank = getIntegerRank(RHSC);
8478 if (LHSUnsigned == RHSUnsigned) {
8479 if (LHSRank == RHSRank)
return 0;
8480 return LHSRank > RHSRank ? 1 : -1;
8486 if (LHSRank >= RHSRank)
8496 if (RHSRank >= LHSRank)
8506 if (CFConstantStringTypeDecl)
8507 return CFConstantStringTypeDecl;
8509 assert(!CFConstantStringTagDecl &&
8510 "tag and typedef should be initialized together");
8512 CFConstantStringTagDecl->startDefinition();
8550 if (
static_cast<unsigned>(CFRuntime) <
8553 Fields[Count++] = {
IntTy,
"flags" };
8555 Fields[Count++] = {
LongTy,
"length" };
8559 Fields[Count++] = { getFromTargetType(Target->getUInt64Type()),
"_swift_rc" };
8563 Fields[Count++] = {
IntTy,
"_ptr" };
8569 for (
unsigned i = 0; i < Count; ++i) {
8573 Fields[i].Type,
nullptr,
8576 CFConstantStringTagDecl->addDecl(Field);
8579 CFConstantStringTagDecl->completeDefinition();
8583 CFConstantStringTypeDecl =
8586 return CFConstantStringTypeDecl;
8590 if (!CFConstantStringTagDecl)
8592 return CFConstantStringTagDecl;
8602 if (ObjCSuperType.isNull()) {
8607 return ObjCSuperType;
8613 CFConstantStringTagDecl = TT->castAsRecordDecl();
8617 if (BlockDescriptorType)
8630 static const char *
const FieldNames[] = {
8635 for (
size_t i = 0; i < 2; ++i) {
8638 &
Idents.get(FieldNames[i]), FieldTypes[i],
nullptr,
8646 BlockDescriptorType = RD;
8652 if (BlockDescriptorExtendedType)
8667 static const char *
const FieldNames[] = {
8674 for (
size_t i = 0; i < 4; ++i) {
8677 &
Idents.get(FieldNames[i]), FieldTypes[i],
nullptr,
8686 BlockDescriptorExtendedType = RD;
8691 const auto *BT = dyn_cast<BuiltinType>(T);
8700 switch (BT->getKind()) {
8701#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
8702 case BuiltinType::Id: \
8704#include "clang/Basic/OpenCLImageTypes.def"
8706 case BuiltinType::OCLClkEvent:
8709 case BuiltinType::OCLEvent:
8712 case BuiltinType::OCLQueue:
8715 case BuiltinType::OCLReserveID:
8718 case BuiltinType::OCLSampler:
8737 if (!copyExpr && record->hasTrivialDestructor())
return false;
8768 llvm_unreachable(
"impossible");
8770 llvm_unreachable(
"fell out of lifetime switch!");
8778 bool &HasByrefExtendedLayout)
const {
8783 HasByrefExtendedLayout =
false;
8785 HasByrefExtendedLayout =
true;
8799 assert(Target &&
"Expected target to be initialized");
8800 const llvm::Triple &T = Target->getTriple();
8802 if (T.isOSWindows() && T.isArch64Bit())
8808 assert(Target &&
"Expected target to be initialized");
8809 const llvm::Triple &T = Target->getTriple();
8811 if (T.isOSWindows() && T.isArch64Bit())
8817 if (!ObjCInstanceTypeDecl)
8818 ObjCInstanceTypeDecl =
8820 return ObjCInstanceTypeDecl;
8826 if (
const auto *TT = dyn_cast<TypedefType>(T))
8828 return II->isStr(
"BOOL");
8836 if (!
type->isIncompleteArrayType() &&
type->isIncompleteType())
8845 else if (
type->isArrayType())
8864 if (
First->isInlineSpecified() || !
First->isStaticDataMember())
8871 !D->isInlineSpecified() && (D->isConstexpr() ||
First->isConstexpr()))
8902 for (
auto *PI :
Decl->parameters()) {
8907 assert(sz.
isPositive() &&
"BlockExpr - Incomplete param type");
8916 ParmOffset = PtrSize;
8917 for (
auto *PVDecl :
Decl->parameters()) {
8918 QualType PType = PVDecl->getOriginalType();
8919 if (
const auto *AT =
8924 PType = PVDecl->getType();
8926 PType = PVDecl->getType();
8946 for (
auto *PI :
Decl->parameters()) {
8953 "getObjCEncodingForFunctionDecl - Incomplete param type");
8960 for (
auto *PVDecl :
Decl->parameters()) {
8961 QualType PType = PVDecl->getOriginalType();
8962 if (
const auto *AT =
8967 PType = PVDecl->getType();
8969 PType = PVDecl->getType();
8983 bool Extended)
const {
8987 ObjCEncOptions Options = ObjCEncOptions()
8988 .setExpandPointedToStructures()
8989 .setExpandStructures()
8990 .setIsOutermostType();
8992 Options.setEncodeBlockParameters().setEncodeClassNames();
8993 getObjCEncodingForTypeImpl(T, S, Options,
nullptr);
8999 bool Extended)
const {
9004 Decl->getReturnType(), S, Extended);
9013 E =
Decl->sel_param_end(); PI != E; ++PI) {
9020 "getObjCEncodingForMethodDecl - Incomplete param type");
9028 ParmOffset = 2 * PtrSize;
9030 E =
Decl->sel_param_end(); PI != E; ++PI) {
9033 if (
const auto *AT =
9042 PType, S, Extended);
9053 const Decl *Container)
const {
9056 if (
const auto *CID = dyn_cast<ObjCCategoryImplDecl>(Container)) {
9057 for (
auto *PID : CID->property_impls())
9058 if (PID->getPropertyDecl() == PD)
9062 for (
auto *PID : OID->property_impls())
9063 if (PID->getPropertyDecl() == PD)
9097 const Decl *Container)
const {
9099 bool Dynamic =
false;
9107 SynthesizePID = PropertyImpDecl;
9111 std::string S =
"T";
9156 if (SynthesizePID) {
9173 if (BT->getKind() == BuiltinType::ULong &&
getIntWidth(PointeeTy) == 32)
9176 if (BT->getKind() == BuiltinType::Long &&
getIntWidth(PointeeTy) == 32)
9189 getObjCEncodingForTypeImpl(T, S,
9191 .setExpandPointedToStructures()
9192 .setExpandStructures()
9193 .setIsOutermostType(),
9194 Field, NotEncodedT);
9198 std::string& S)
const {
9202 getObjCEncodingForTypeImpl(T, S,
9204 .setExpandPointedToStructures()
9205 .setExpandStructures()
9206 .setIsOutermostType()
9207 .setEncodingProperty(),
9215 case BuiltinType::Void:
return 'v';
9216 case BuiltinType::Bool:
return 'B';
9217 case BuiltinType::Char8:
9218 case BuiltinType::Char_U:
9219 case BuiltinType::UChar:
return 'C';
9220 case BuiltinType::Char16:
9221 case BuiltinType::UShort:
return 'S';
9222 case BuiltinType::Char32:
9223 case BuiltinType::UInt:
return 'I';
9224 case BuiltinType::ULong:
9225 return C->getTargetInfo().getLongWidth() == 32 ?
'L' :
'Q';
9226 case BuiltinType::UInt128:
return 'T';
9227 case BuiltinType::ULongLong:
return 'Q';
9228 case BuiltinType::Char_S:
9229 case BuiltinType::SChar:
return 'c';
9230 case BuiltinType::Short:
return 's';
9231 case BuiltinType::WChar_S:
9232 case BuiltinType::WChar_U:
9233 case BuiltinType::Int:
return 'i';
9234 case BuiltinType::Long:
9235 return C->getTargetInfo().getLongWidth() == 32 ?
'l' :
'q';
9236 case BuiltinType::LongLong:
return 'q';
9237 case BuiltinType::Int128:
return 't';
9238 case BuiltinType::Float:
return 'f';
9239 case BuiltinType::Double:
return 'd';
9240 case BuiltinType::LongDouble:
return 'D';
9241 case BuiltinType::NullPtr:
return '*';
9243 case BuiltinType::BFloat16:
9244 case BuiltinType::Float16:
9245 case BuiltinType::Float128:
9246 case BuiltinType::Ibm128:
9247 case BuiltinType::Half:
9248 case BuiltinType::ShortAccum:
9249 case BuiltinType::Accum:
9250 case BuiltinType::LongAccum:
9251 case BuiltinType::UShortAccum:
9252 case BuiltinType::UAccum:
9253 case BuiltinType::ULongAccum:
9254 case BuiltinType::ShortFract:
9255 case BuiltinType::Fract:
9256 case BuiltinType::LongFract:
9257 case BuiltinType::UShortFract:
9258 case BuiltinType::UFract:
9259 case BuiltinType::ULongFract:
9260 case BuiltinType::SatShortAccum:
9261 case BuiltinType::SatAccum:
9262 case BuiltinType::SatLongAccum:
9263 case BuiltinType::SatUShortAccum:
9264 case BuiltinType::SatUAccum:
9265 case BuiltinType::SatULongAccum:
9266 case BuiltinType::SatShortFract:
9267 case BuiltinType::SatFract:
9268 case BuiltinType::SatLongFract:
9269 case BuiltinType::SatUShortFract:
9270 case BuiltinType::SatUFract:
9271 case BuiltinType::SatULongFract:
9275#define SVE_TYPE(Name, Id, SingletonId) \
9276 case BuiltinType::Id:
9277#include "clang/Basic/AArch64ACLETypes.def"
9278#define RVV_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
9279#include "clang/Basic/RISCVVTypes.def"
9280#define WASM_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
9281#include "clang/Basic/WebAssemblyReferenceTypes.def"
9282#define AMDGPU_TYPE(Name, Id, SingletonId, Width, Align) case BuiltinType::Id:
9283#include "clang/Basic/AMDGPUTypes.def"
9286 Diags.
Report(diag::err_unsupported_objc_primitive_encoding)
9291 case BuiltinType::ObjCId:
9292 case BuiltinType::ObjCClass:
9293 case BuiltinType::ObjCSel:
9294 llvm_unreachable(
"@encoding ObjC primitive type");
9297#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
9298 case BuiltinType::Id:
9299#include "clang/Basic/OpenCLImageTypes.def"
9300#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
9301 case BuiltinType::Id:
9302#include "clang/Basic/OpenCLExtensionTypes.def"
9303 case BuiltinType::OCLEvent:
9304 case BuiltinType::OCLClkEvent:
9305 case BuiltinType::OCLQueue:
9306 case BuiltinType::OCLReserveID:
9307 case BuiltinType::OCLSampler:
9308 case BuiltinType::Dependent:
9309#define PPC_VECTOR_TYPE(Name, Id, Size) \
9310 case BuiltinType::Id:
9311#include "clang/Basic/PPCTypes.def"
9312#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
9313#include "clang/Basic/HLSLIntangibleTypes.def"
9314#define BUILTIN_TYPE(KIND, ID)
9315#define PLACEHOLDER_TYPE(KIND, ID) \
9316 case BuiltinType::KIND:
9317#include "clang/AST/BuiltinTypes.def"
9318 llvm_unreachable(
"invalid builtin type for @encode");
9320 llvm_unreachable(
"invalid BuiltinType::Kind value");
9327 if (!
Enum->isFixed())
9337 assert(FD->
isBitField() &&
"not a bitfield - getObjCEncodingForTypeImpl");
9357 if (
const auto *IVD = dyn_cast<ObjCIvarDecl>(FD)) {
9365 S += llvm::utostr(Offset);
9380 bool VisitBasesAndFields) {
9381 T = T->getBaseElementTypeUnsafe();
9385 PT->getPointeeType().getTypePtr(),
false);
9387 auto *CXXRD = T->getAsCXXRecordDecl();
9395 if (!CXXRD->hasDefinition() || !VisitBasesAndFields)
9398 for (
const auto &B : CXXRD->bases())
9403 for (
auto *FD : CXXRD->fields())
9412void ASTContext::getObjCEncodingForTypeImpl(QualType T, std::string &S,
9413 const ObjCEncOptions Options,
9414 const FieldDecl *FD,
9415 QualType *NotEncodedT)
const {
9417 switch (CT->getTypeClass()) {
9422 if (
const auto *BT = dyn_cast<BuiltinType>(CT))
9430 getObjCEncodingForTypeImpl(T->
castAs<ComplexType>()->getElementType(), S,
9437 getObjCEncodingForTypeImpl(T->
castAs<AtomicType>()->getValueType(), S,
9444 case Type::LValueReference:
9445 case Type::RValueReference: {
9448 const auto *PT = T->
castAs<PointerType>();
9449 if (PT->isObjCSelType()) {
9458 bool isReadOnly =
false;
9463 if (T->
getAs<TypedefType>()) {
9468 }
else if (Options.IsOutermostType()) {
9469 QualType P = PointeeTy;
9470 while (
auto PT = P->
getAs<PointerType>())
9481 if (StringRef(S).ends_with(
"nr"))
9482 S.replace(S.end()-2, S.end(),
"rn");
9492 }
else if (
const auto *RTy = PointeeTy->
getAsCanonical<RecordType>()) {
9493 const IdentifierInfo *II = RTy->getDecl()->getIdentifier();
9495 if (II == &
Idents.get(
"objc_class")) {
9500 if (II == &
Idents.get(
"objc_object")) {
9509 RTy, Options.ExpandPointedToStructures()))) {
9518 ObjCEncOptions NewOptions;
9519 if (Options.ExpandPointedToStructures())
9520 NewOptions.setExpandStructures();
9521 getObjCEncodingForTypeImpl(PointeeTy, S, NewOptions,
9522 nullptr, NotEncodedT);
9526 case Type::ConstantArray:
9527 case Type::IncompleteArray:
9528 case Type::VariableArray: {
9535 getObjCEncodingForTypeImpl(
9536 AT->getElementType(), S,
9537 Options.keepingOnly(ObjCEncOptions().setExpandStructures()), FD);
9541 if (
const auto *CAT = dyn_cast<ConstantArrayType>(AT))
9542 S += llvm::utostr(CAT->getZExtSize());
9546 "Unknown array type!");
9550 getObjCEncodingForTypeImpl(
9551 AT->getElementType(), S,
9552 Options.keepingOnly(ObjCEncOptions().setExpandStructures()), FD,
9559 case Type::FunctionNoProto:
9560 case Type::FunctionProto:
9564 case Type::Record: {
9566 S += RDecl->
isUnion() ?
'(' :
'{';
9570 if (
const auto *Spec = dyn_cast<ClassTemplateSpecializationDecl>(RDecl)) {
9571 const TemplateArgumentList &TemplateArgs = Spec->getTemplateArgs();
9572 llvm::raw_string_ostream
OS(S);
9573 printTemplateArgumentList(OS, TemplateArgs.
asArray(),
9579 if (Options.ExpandStructures()) {
9582 getObjCEncodingForStructureImpl(RDecl, S, FD,
true, NotEncodedT);
9584 for (
const auto *Field : RDecl->
fields()) {
9587 S +=
Field->getNameAsString();
9592 if (
Field->isBitField()) {
9593 getObjCEncodingForTypeImpl(
Field->getType(), S,
9594 ObjCEncOptions().setExpandStructures(),
9597 QualType qt =
Field->getType();
9599 getObjCEncodingForTypeImpl(
9601 ObjCEncOptions().setExpandStructures().setIsStructField(), FD,
9607 S += RDecl->
isUnion() ?
')' :
'}';
9611 case Type::BlockPointer: {
9612 const auto *BT = T->
castAs<BlockPointerType>();
9614 if (Options.EncodeBlockParameters()) {
9615 const auto *FT = BT->getPointeeType()->castAs<FunctionType>();
9619 getObjCEncodingForTypeImpl(FT->getReturnType(), S,
9620 Options.forComponentType(), FD, NotEncodedT);
9624 if (
const auto *FPT = dyn_cast<FunctionProtoType>(FT)) {
9625 for (
const auto &I : FPT->param_types())
9626 getObjCEncodingForTypeImpl(I, S, Options.forComponentType(), FD,
9634 case Type::ObjCObject: {
9638 S +=
"{objc_object=}";
9642 S +=
"{objc_class=}";
9649 case Type::ObjCInterface: {
9652 ObjCInterfaceDecl *OI = T->
castAs<ObjCObjectType>()->getInterface();
9655 if (Options.ExpandStructures()) {
9657 SmallVector<const ObjCIvarDecl*, 32> Ivars;
9659 for (
unsigned i = 0, e = Ivars.size(); i != e; ++i) {
9660 const FieldDecl *
Field = Ivars[i];
9661 if (
Field->isBitField())
9662 getObjCEncodingForTypeImpl(
Field->getType(), S,
9663 ObjCEncOptions().setExpandStructures(),
9666 getObjCEncodingForTypeImpl(
Field->getType(), S,
9667 ObjCEncOptions().setExpandStructures(), FD,
9675 case Type::ObjCObjectPointer: {
9676 const auto *OPT = T->
castAs<ObjCObjectPointerType>();
9677 if (OPT->isObjCIdType()) {
9682 if (OPT->isObjCClassType() || OPT->isObjCQualifiedClassType()) {
9690 if (OPT->isObjCQualifiedIdType()) {
9691 getObjCEncodingForTypeImpl(
9693 Options.keepingOnly(ObjCEncOptions()
9694 .setExpandPointedToStructures()
9695 .setExpandStructures()),
9697 if (FD || Options.EncodingProperty() || Options.EncodeClassNames()) {
9701 for (
const auto *I : OPT->quals()) {
9703 S += I->getObjCRuntimeNameAsString();
9712 if (OPT->getInterfaceDecl() &&
9713 (FD || Options.EncodingProperty() || Options.EncodeClassNames())) {
9715 S += OPT->getInterfaceDecl()->getObjCRuntimeNameAsString();
9716 for (
const auto *I : OPT->quals()) {
9718 S += I->getObjCRuntimeNameAsString();
9728 case Type::MemberPointer:
9732 case Type::ExtVector:
9738 case Type::ConstantMatrix:
9751 case Type::DeducedTemplateSpecialization:
9754 case Type::HLSLAttributedResource:
9755 case Type::HLSLInlineSpirv:
9756 case Type::OverflowBehavior:
9757 llvm_unreachable(
"unexpected type");
9759 case Type::ArrayParameter:
9761#define ABSTRACT_TYPE(KIND, BASE)
9762#define TYPE(KIND, BASE)
9763#define DEPENDENT_TYPE(KIND, BASE) \
9765#define NON_CANONICAL_TYPE(KIND, BASE) \
9767#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(KIND, BASE) \
9769#include "clang/AST/TypeNodes.inc"
9770 llvm_unreachable(
"@encode for dependent type!");
9772 llvm_unreachable(
"bad type kind!");
9775void ASTContext::getObjCEncodingForStructureImpl(RecordDecl *RDecl,
9777 const FieldDecl *FD,
9779 QualType *NotEncodedT)
const {
9780 assert(RDecl &&
"Expected non-null RecordDecl");
9781 assert(!RDecl->
isUnion() &&
"Should not be called for unions");
9785 const auto *CXXRec = dyn_cast<CXXRecordDecl>(RDecl);
9786 std::multimap<uint64_t, NamedDecl *> FieldOrBaseOffsets;
9790 for (
const auto &BI : CXXRec->bases()) {
9791 if (!BI.isVirtual()) {
9796 FieldOrBaseOffsets.insert(FieldOrBaseOffsets.upper_bound(offs),
9797 std::make_pair(offs, base));
9802 for (FieldDecl *Field : RDecl->
fields()) {
9803 if (!
Field->isZeroLengthBitField() &&
Field->isZeroSize(*
this))
9806 FieldOrBaseOffsets.insert(FieldOrBaseOffsets.upper_bound(offs),
9807 std::make_pair(offs, Field));
9810 if (CXXRec && includeVBases) {
9811 for (
const auto &BI : CXXRec->vbases()) {
9817 FieldOrBaseOffsets.find(offs) == FieldOrBaseOffsets.end())
9818 FieldOrBaseOffsets.insert(FieldOrBaseOffsets.end(),
9819 std::make_pair(offs, base));
9833 std::multimap<uint64_t, NamedDecl *>::iterator
9834 CurLayObj = FieldOrBaseOffsets.begin();
9836 if (CXXRec && CXXRec->isDynamicClass() &&
9837 (CurLayObj == FieldOrBaseOffsets.end() || CurLayObj->first != 0)) {
9840 std::string recname = CXXRec->getNameAsString();
9841 if (recname.empty()) recname =
"?";
9854 FieldOrBaseOffsets.insert(FieldOrBaseOffsets.upper_bound(offs),
9855 std::make_pair(offs,
nullptr));
9858 for (; CurLayObj != FieldOrBaseOffsets.end(); ++CurLayObj) {
9860 assert(CurOffs <= CurLayObj->first);
9861 if (CurOffs < CurLayObj->first) {
9862 uint64_t padding = CurLayObj->first - CurOffs;
9874 NamedDecl *dcl = CurLayObj->second;
9878 if (
auto *base = dyn_cast<CXXRecordDecl>(dcl)) {
9883 getObjCEncodingForStructureImpl(base, S, FD,
false,
9893 S += field->getNameAsString();
9897 if (field->isBitField()) {
9900 CurOffs += field->getBitWidthValue();
9903 QualType qt = field->getType();
9905 getObjCEncodingForTypeImpl(
9906 qt, S, ObjCEncOptions().setExpandStructures().setIsStructField(),
9917 std::string& S)
const {
9950 if (!ObjCClassDecl) {
9955 return ObjCClassDecl;
9959 if (!ObjCProtocolClassDecl) {
9960 ObjCProtocolClassDecl
9969 return ObjCProtocolClassDecl;
9990 QualType T = Context->getPointerType(Context->CharTy);
9991 return Context->buildImplicitTypedef(T, Name);
10004 QualType T = Context->getPointerType(Context->VoidTy);
10005 return Context->buildImplicitTypedef(T,
"__builtin_va_list");
10008static TypedefDecl *
10012 if (Context->getLangOpts().CPlusPlus) {
10017 &Context->Idents.get(
"std"),
10025 const size_t NumFields = 5;
10027 const char *FieldNames[NumFields];
10030 FieldTypes[0] = Context->getPointerType(Context->VoidTy);
10031 FieldNames[0] =
"__stack";
10034 FieldTypes[1] = Context->getPointerType(Context->VoidTy);
10035 FieldNames[1] =
"__gr_top";
10038 FieldTypes[2] = Context->getPointerType(Context->VoidTy);
10039 FieldNames[2] =
"__vr_top";
10042 FieldTypes[3] = Context->IntTy;
10043 FieldNames[3] =
"__gr_offs";
10046 FieldTypes[4] = Context->IntTy;
10047 FieldNames[4] =
"__vr_offs";
10050 for (
unsigned i = 0; i < NumFields; ++i) {
10055 &Context->Idents.get(FieldNames[i]),
10056 FieldTypes[i],
nullptr,
10068 return Context->buildImplicitTypedef(VaListTagType,
"__builtin_va_list");
10075 VaListTagDecl = Context->buildImplicitRecord(
"__va_list_tag");
10078 const size_t NumFields = 5;
10080 const char *FieldNames[NumFields];
10083 FieldTypes[0] = Context->UnsignedCharTy;
10084 FieldNames[0] =
"gpr";
10087 FieldTypes[1] = Context->UnsignedCharTy;
10088 FieldNames[1] =
"fpr";
10091 FieldTypes[2] = Context->UnsignedShortTy;
10092 FieldNames[2] =
"reserved";
10095 FieldTypes[3] = Context->getPointerType(Context->VoidTy);
10096 FieldNames[3] =
"overflow_arg_area";
10099 FieldTypes[4] = Context->getPointerType(Context->VoidTy);
10100 FieldNames[4] =
"reg_save_area";
10103 for (
unsigned i = 0; i < NumFields; ++i) {
10107 &Context->Idents.get(FieldNames[i]),
10108 FieldTypes[i],
nullptr,
10121 Context->buildImplicitTypedef(VaListTagType,
"__va_list_tag");
10125 std::nullopt, VaListTagTypedefDecl);
10128 llvm::APInt Size(Context->getTypeSize(Context->getSizeType()), 1);
10129 QualType VaListTagArrayType = Context->getConstantArrayType(
10131 return Context->buildImplicitTypedef(VaListTagArrayType,
"__builtin_va_list");
10134static TypedefDecl *
10138 VaListTagDecl = Context->buildImplicitRecord(
"__va_list_tag");
10141 const size_t NumFields = 4;
10143 const char *FieldNames[NumFields];
10146 FieldTypes[0] = Context->UnsignedIntTy;
10147 FieldNames[0] =
"gp_offset";
10150 FieldTypes[1] = Context->UnsignedIntTy;
10151 FieldNames[1] =
"fp_offset";
10154 FieldTypes[2] = Context->getPointerType(Context->VoidTy);
10155 FieldNames[2] =
"overflow_arg_area";
10158 FieldTypes[3] = Context->getPointerType(Context->VoidTy);
10159 FieldNames[3] =
"reg_save_area";
10162 for (
unsigned i = 0; i < NumFields; ++i) {
10167 &Context->Idents.get(FieldNames[i]),
10168 FieldTypes[i],
nullptr,
10182 llvm::APInt Size(Context->getTypeSize(Context->getSizeType()), 1);
10183 QualType VaListTagArrayType = Context->getConstantArrayType(
10185 return Context->buildImplicitTypedef(VaListTagArrayType,
"__builtin_va_list");
10188static TypedefDecl *
10191 RecordDecl *VaListDecl = Context->buildImplicitRecord(
"__va_list");
10192 if (Context->getLangOpts().CPlusPlus) {
10211 &Context->Idents.get(
"__ap"),
10212 Context->getPointerType(Context->VoidTy),
10222 Context->VaListTagDecl = VaListDecl;
10225 CanQualType T = Context->getCanonicalTagType(VaListDecl);
10226 return Context->buildImplicitTypedef(T,
"__builtin_va_list");
10229static TypedefDecl *
10233 VaListTagDecl = Context->buildImplicitRecord(
"__va_list_tag");
10236 const size_t NumFields = 4;
10238 const char *FieldNames[NumFields];
10241 FieldTypes[0] = Context->LongTy;
10242 FieldNames[0] =
"__gpr";
10245 FieldTypes[1] = Context->LongTy;
10246 FieldNames[1] =
"__fpr";
10249 FieldTypes[2] = Context->getPointerType(Context->VoidTy);
10250 FieldNames[2] =
"__overflow_arg_area";
10253 FieldTypes[3] = Context->getPointerType(Context->VoidTy);
10254 FieldNames[3] =
"__reg_save_area";
10257 for (
unsigned i = 0; i < NumFields; ++i) {
10262 &Context->Idents.get(FieldNames[i]),
10263 FieldTypes[i],
nullptr,
10277 llvm::APInt Size(Context->getTypeSize(Context->getSizeType()), 1);
10278 QualType VaListTagArrayType = Context->getConstantArrayType(
10281 return Context->buildImplicitTypedef(VaListTagArrayType,
"__builtin_va_list");
10287 VaListTagDecl = Context->buildImplicitRecord(
"__va_list_tag");
10290 const size_t NumFields = 3;
10292 const char *FieldNames[NumFields];
10295 FieldTypes[0] = Context->getPointerType(Context->VoidTy);
10296 FieldNames[0] =
"__current_saved_reg_area_pointer";
10299 FieldTypes[1] = Context->getPointerType(Context->VoidTy);
10300 FieldNames[1] =
"__saved_reg_area_end_pointer";
10303 FieldTypes[2] = Context->getPointerType(Context->VoidTy);
10304 FieldNames[2] =
"__overflow_area_pointer";
10307 for (
unsigned i = 0; i < NumFields; ++i) {
10310 SourceLocation(), &Context->Idents.get(FieldNames[i]), FieldTypes[i],
10323 Context->buildImplicitTypedef(VaListTagType,
"__va_list_tag");
10327 std::nullopt, VaListTagTypedefDecl);
10330 llvm::APInt Size(Context->getTypeSize(Context->getSizeType()), 1);
10331 QualType VaListTagArrayType = Context->getConstantArrayType(
10334 return Context->buildImplicitTypedef(VaListTagArrayType,
"__builtin_va_list");
10337static TypedefDecl *
10347 constexpr size_t NumFields = 3;
10348 QualType FieldTypes[NumFields] = {Context->getPointerType(Context->IntTy),
10349 Context->getPointerType(Context->IntTy),
10351 const char *FieldNames[NumFields] = {
"__va_stk",
"__va_reg",
"__va_ndx"};
10354 for (
unsigned i = 0; i < NumFields; ++i) {
10357 &Context->Idents.get(FieldNames[i]), FieldTypes[i],
nullptr,
10369 Context->buildImplicitTypedef(VaListTagType,
"__builtin_va_list");
10371 return VaListTagTypedefDecl;
10397 llvm_unreachable(
"Unhandled __builtin_va_list type kind");
10401 if (!BuiltinVaListDecl) {
10402 BuiltinVaListDecl =
CreateVaListDecl(
this, Target->getBuiltinVaListKind());
10403 assert(BuiltinVaListDecl->isImplicit());
10406 return BuiltinVaListDecl;
10419 if (!BuiltinMSVaListDecl)
10422 return BuiltinMSVaListDecl;
10439 assert(ObjCConstantStringType.isNull() &&
10440 "'NSConstantString' type already set!");
10450 unsigned size = End - Begin;
10451 assert(size > 1 &&
"set is not overloaded!");
10457 NamedDecl **Storage = OT->getStorage();
10480 bool TemplateKeyword,
10485 if (
Template.getAsTemplateDecl()->getKind() == Decl::TemplateTemplateParm) {
10486 assert(!Qualifier &&
"unexpected qualified template template parameter");
10487 assert(TemplateKeyword ==
false);
10492 llvm::FoldingSetNodeID ID;
10495 void *InsertPos =
nullptr;
10497 QualifiedTemplateNames.FindNodeOrInsertPos(ID, InsertPos);
10501 QualifiedTemplateNames.InsertNode(QTN, InsertPos);
10511 llvm::FoldingSetNodeID ID;
10514 void *InsertPos =
nullptr;
10516 DependentTemplateNames.FindNodeOrInsertPos(ID, InsertPos))
10521 DependentTemplateNames.InsertNode(QTN, InsertPos);
10526 Decl *AssociatedDecl,
10529 bool Final)
const {
10530 llvm::FoldingSetNodeID ID;
10532 Index, PackIndex, Final);
10534 void *insertPos =
nullptr;
10536 = SubstTemplateTemplateParms.FindNodeOrInsertPos(ID, insertPos);
10540 Replacement, AssociatedDecl, Index, PackIndex, Final);
10541 SubstTemplateTemplateParms.InsertNode(subst, insertPos);
10549 Decl *AssociatedDecl,
10550 unsigned Index,
bool Final)
const {
10552 llvm::FoldingSetNodeID ID;
10554 AssociatedDecl, Index, Final);
10556 void *InsertPos =
nullptr;
10558 = SubstTemplateTemplateParmPacks.FindNodeOrInsertPos(ID, InsertPos);
10563 SubstTemplateTemplateParmPacks.InsertNode(Subst, InsertPos);
10577 llvm::FoldingSetNodeID ID;
10580 void *InsertPos =
nullptr;
10582 DeducedTemplates.FindNodeOrInsertPos(ID, InsertPos);
10588 DeducedTemplates.InsertNode(DTS, InsertPos);
10611 llvm_unreachable(
"Unhandled TargetInfo::IntType value");
10641 while (
const auto *AT = dyn_cast<ArrayType>(CT))
10642 CT = AT->getElementType();
10674 assert(FirstVec->
isVectorType() &&
"FirstVec should be a vector type");
10675 assert(SecondVec->
isVectorType() &&
"SecondVec should be a vector type");
10732 const auto *LHSOBT = LHS->
getAs<OverflowBehaviorType>();
10733 const auto *RHSOBT = RHS->
getAs<OverflowBehaviorType>();
10735 if (!LHSOBT && !RHSOBT)
10738 if (LHSOBT && RHSOBT) {
10739 if (LHSOBT->getBehaviorKind() != RHSOBT->getBehaviorKind())
10744 QualType LHSUnderlying = LHSOBT ? LHSOBT->desugar() : LHS;
10745 QualType RHSUnderlying = RHSOBT ? RHSOBT->desugar() : RHS;
10747 if (RHSOBT && !LHSOBT) {
10758 auto VScale = Context.getTargetInfo().getVScaleRange(
10765 uint64_t EltSize = Context.getTypeSize(Info.
ElementType);
10769 uint64_t MinElts = Info.
EC.getKnownMinValue();
10770 return VScale->first * MinElts * EltSize;
10778 "Expected RVV builtin type and vector type!");
10818 return IsValidCast(FirstType, SecondType) ||
10819 IsValidCast(SecondType, FirstType);
10827 "Expected RVV builtin type and vector type!");
10834 if (!BT->isRVVVLSBuiltinType())
10854 return VecTy->getElementType().getCanonicalType()->isIntegerType() &&
10861 return IsLaxCompatible(FirstType, SecondType) ||
10862 IsLaxCompatible(SecondType, FirstType);
10868 if (
const AttributedType *
Attr = dyn_cast<AttributedType>(Ty)) {
10869 if (
Attr->getAttrKind() == attr::ObjCOwnership)
10872 Ty =
Attr->getModifiedType();
10876 Ty =
Paren->getInnerType();
10908 for (
auto *lhsProto : lhs->
quals()) {
10909 bool match =
false;
10910 for (
auto *rhsProto : rhs->
quals()) {
10941 for (
auto *I : lhs->
quals()) {
10945 if (!rhsID->ClassImplementsProtocol(I,
true))
10953 for (
auto *lhsProto : lhs->
quals()) {
10954 bool match =
false;
10959 for (
auto *rhsProto : rhs->
quals()) {
10969 for (
auto *I : lhs->
quals()) {
10973 if (rhsID->ClassImplementsProtocol(I,
true)) {
10990 for (
auto *lhsProto : lhs->
quals()) {
10991 bool match =
false;
10998 for (
auto *rhsProto : rhs->
quals()) {
11017 if (LHSInheritedProtocols.empty() && lhs->
qual_empty())
11019 for (
auto *lhsProto : LHSInheritedProtocols) {
11020 bool match =
false;
11021 for (
auto *rhsProto : rhs->
quals()) {
11046 if (LHS->isObjCUnqualifiedId() || RHS->isObjCUnqualifiedId())
11051 auto finish = [&](
bool succeeded) ->
bool {
11055 if (!RHS->isKindOfType())
11066 if (LHS->isObjCQualifiedId() || RHS->isObjCQualifiedId()) {
11071 if (LHS->isObjCQualifiedClass() && RHS->isObjCQualifiedClass()) {
11076 if (LHS->isObjCClass() && RHS->isObjCClass()) {
11081 if (LHS->getInterface() && RHS->getInterface()) {
11096 bool BlockReturnType) {
11100 auto finish = [&](
bool succeeded) ->
bool {
11125 if (
getLangOpts().CompatibilityQualifiedIdBlockParamTypeChecking)
11129 (!BlockReturnType &&
11133 (BlockReturnType ? LHSOPT : RHSOPT),
11134 (BlockReturnType ? RHSOPT : LHSOPT),
false));
11142 return finish(BlockReturnType);
11144 return finish(!BlockReturnType);
11156 return (*lhs)->getName().compare((*rhs)->getName());
11173 assert(LHS->getInterface() &&
"LHS must have an interface base");
11174 assert(RHS->getInterface() &&
"RHS must have an interface base");
11180 for (
auto *proto : LHS->quals()) {
11181 Context.CollectInheritedProtocols(proto, LHSProtocolSet);
11185 Context.CollectInheritedProtocols(LHS->getInterface(), LHSProtocolSet);
11191 for (
auto *proto : RHS->quals()) {
11192 Context.CollectInheritedProtocols(proto, RHSProtocolSet);
11196 Context.CollectInheritedProtocols(RHS->getInterface(), RHSProtocolSet);
11199 for (
auto *proto : LHSProtocolSet) {
11200 if (RHSProtocolSet.count(proto))
11201 IntersectionSet.push_back(proto);
11207 Context.CollectInheritedProtocols(CommonBase, ImpliedProtocols);
11210 if (!ImpliedProtocols.empty()) {
11212 return ImpliedProtocols.contains(proto);
11217 llvm::array_pod_sort(IntersectionSet.begin(), IntersectionSet.end(),
11227 if (lhsOPT && rhsOPT)
11233 if (lhsBlock && rhsBlock)
11238 if ((lhsOPT && lhsOPT->isObjCIdType() && rhsBlock) ||
11250 bool stripKindOf) {
11251 if (lhsArgs.size() != rhsArgs.size())
11258 for (
unsigned i = 0, n = lhsArgs.size(); i != n; ++i) {
11264 if (!stripKindOf ||
11265 !ctx.
hasSameType(lhsArgs[i].stripObjCKindOfType(ctx),
11266 rhsArgs[i].stripObjCKindOfType(ctx))) {
11294 if (!LDecl || !RDecl)
11300 bool anyKindOf = LHS->isKindOfType() || RHS->isKindOfType();
11304 llvm::SmallDenseMap<const ObjCInterfaceDecl *, const ObjCObjectType *, 4>
11309 LHSAncestors[LHS->getInterface()->getCanonicalDecl()] = LHS;
11314 bool anyChanges =
false;
11315 if (LHS->isSpecialized() && RHS->isSpecialized()) {
11318 LHS->getTypeArgs(), RHS->getTypeArgs(),
11321 }
else if (LHS->isSpecialized() != RHS->isSpecialized()) {
11332 if (!Protocols.empty())
11338 if (anyChanges || LHS->isKindOfType() != anyKindOf) {
11341 anyKindOf || LHS->isKindOfType());
11349 QualType LHSSuperType = LHS->getSuperClassType();
11350 if (LHSSuperType.
isNull())
11359 auto KnownLHS = LHSAncestors.find(RHS->getInterface()->getCanonicalDecl());
11360 if (KnownLHS != LHSAncestors.end()) {
11361 LHS = KnownLHS->second;
11365 bool anyChanges =
false;
11366 if (LHS->isSpecialized() && RHS->isSpecialized()) {
11369 LHS->getTypeArgs(), RHS->getTypeArgs(),
11372 }
else if (LHS->isSpecialized() != RHS->isSpecialized()) {
11383 if (!Protocols.empty())
11388 if (anyChanges || RHS->isKindOfType() != anyKindOf) {
11391 anyKindOf || RHS->isKindOfType());
11399 QualType RHSSuperType = RHS->getSuperClassType();
11400 if (RHSSuperType.
isNull())
11411 assert(LHS->getInterface() &&
"LHS is not an interface type");
11412 assert(RHS->getInterface() &&
"RHS is not an interface type");
11417 bool IsSuperClass = LHSInterface->
isSuperClassOf(RHS->getInterface());
11424 if (LHS->getNumProtocols() > 0) {
11433 for (
auto *RHSPI : RHS->quals())
11436 if (SuperClassInheritedProtocols.empty())
11439 for (
const auto *LHSProto : LHS->quals()) {
11440 bool SuperImplementsProtocol =
false;
11441 for (
auto *SuperClassProto : SuperClassInheritedProtocols)
11442 if (SuperClassProto->lookupProtocolNamed(LHSProto->getIdentifier())) {
11443 SuperImplementsProtocol =
true;
11446 if (!SuperImplementsProtocol)
11452 if (LHS->isSpecialized()) {
11457 RHSSuper = RHSSuper->getSuperClassType()->castAs<
ObjCObjectType>();
11460 if (RHSSuper->isSpecialized() &&
11462 LHS->getTypeArgs(), RHSSuper->getTypeArgs(),
11476 if (!LHSOPT || !RHSOPT)
11494 bool CompareUnqualified) {
11513 bool OfBlockPointer,
11515 if (
const RecordType *UT = T->getAsUnionType()) {
11517 if (UD->
hasAttr<TransparentUnionAttr>()) {
11518 for (
const auto *I : UD->
fields()) {
11519 QualType ET = I->getType().getUnqualifiedType();
11533 bool OfBlockPointer,
11554 bool IsConditionalOperator) {
11557 const auto *lproto = dyn_cast<FunctionProtoType>(lbase);
11558 const auto *rproto = dyn_cast<FunctionProtoType>(rbase);
11559 bool allLTypes =
true;
11560 bool allRTypes =
true;
11564 if (OfBlockPointer) {
11566 QualType LHS = lbase->getReturnType();
11568 if (!UnqualifiedResult)
11570 retType =
mergeTypes(LHS, RHS,
true, UnqualifiedResult,
true);
11635 bool NoReturn = IsConditionalOperator
11645 std::optional<FunctionEffectSet> MergedFX;
11647 if (lproto && rproto) {
11648 assert((AllowCXX ||
11649 (!lproto->hasExceptionSpec() && !rproto->hasExceptionSpec())) &&
11650 "C++ shouldn't be here");
11652 if (lproto->getNumParams() != rproto->getNumParams())
11656 if (lproto->isVariadic() != rproto->isVariadic())
11659 if (lproto->getMethodQuals() != rproto->getMethodQuals())
11663 if (lproto->getExtraAttributeInfo().CFISalt !=
11664 rproto->getExtraAttributeInfo().CFISalt)
11670 if (LHSFX != RHSFX) {
11671 if (IsConditionalOperator)
11680 if (*MergedFX != LHSFX)
11682 if (*MergedFX != RHSFX)
11687 bool canUseLeft, canUseRight;
11699 for (
unsigned i = 0, n = lproto->getNumParams(); i < n; i++) {
11700 QualType lParamType = lproto->getParamType(i).getUnqualifiedType();
11701 QualType rParamType = rproto->getParamType(i).getUnqualifiedType();
11703 lParamType, rParamType, OfBlockPointer,
Unqualified);
11710 types.push_back(paramType);
11722 if (allLTypes)
return lhs;
11723 if (allRTypes)
return rhs;
11728 newParamInfos.empty() ?
nullptr : newParamInfos.data();
11734 if (lproto) allRTypes =
false;
11735 if (rproto) allLTypes =
false;
11739 assert((AllowCXX || !proto->
hasExceptionSpec()) &&
"C++ shouldn't be here");
11747 for (
unsigned i = 0, n = proto->
getNumParams(); i < n; ++i) {
11753 paramTy = ED->getIntegerType();
11763 if (allLTypes)
return lhs;
11764 if (allRTypes)
return rhs;
11773 if (allLTypes)
return lhs;
11774 if (allRTypes)
return rhs;
11780 QualType other,
bool isBlockReturnType) {
11786 ET->getDecl()->getDefinitionOrSelf()->getIntegerType();
11787 if (underlyingType.
isNull())
11789 if (Context.hasSameType(underlyingType, other))
11795 Context.getTypeSize(underlyingType) == Context.getTypeSize(other))
11804 if (LangOpts.CPlusPlus || !LangOpts.C23)
11825 bool BlockReturnType,
bool IsConditionalOperator) {
11826 const auto *LHSOBT = LHS->
getAs<OverflowBehaviorType>();
11827 const auto *RHSOBT = RHS->
getAs<OverflowBehaviorType>();
11829 if (!LHSOBT && !RHSOBT)
11830 return std::nullopt;
11834 if (LHSOBT->getBehaviorKind() != RHSOBT->getBehaviorKind())
11838 LHSOBT->getUnderlyingType(), RHSOBT->getUnderlyingType(),
11839 OfBlockPointer,
Unqualified, BlockReturnType, IsConditionalOperator);
11841 if (MergedUnderlying.
isNull())
11845 if (LHSOBT->getUnderlyingType() == RHSOBT->getUnderlyingType())
11848 LHSOBT->getBehaviorKind(),
11857 return mergeTypes(LHSOBT->getUnderlyingType(), RHS, OfBlockPointer,
11858 Unqualified, BlockReturnType, IsConditionalOperator);
11861 return mergeTypes(LHS, RHSOBT->getUnderlyingType(), OfBlockPointer,
11862 Unqualified, BlockReturnType, IsConditionalOperator);
11867 bool IsConditionalOperator) {
11878 if (LangOpts.OpenMP && LHSRefTy && RHSRefTy &&
11882 if (LHSRefTy || RHSRefTy)
11885 if (std::optional<QualType> MergedOBT =
11887 BlockReturnType, IsConditionalOperator))
11899 if (LHSCan == RHSCan)
11904 Qualifiers RQuals = RHSCan.getLocalQualifiers();
11905 if (LQuals != RQuals) {
11922 assert((GC_L != GC_R) &&
"unequal qualifier sets had only equal elements");
11943 if (LHSClass == Type::FunctionProto) LHSClass = Type::FunctionNoProto;
11944 if (RHSClass == Type::FunctionProto) RHSClass = Type::FunctionNoProto;
11947 if (LHSClass == Type::VariableArray || LHSClass == Type::IncompleteArray)
11948 LHSClass = Type::ConstantArray;
11949 if (RHSClass == Type::VariableArray || RHSClass == Type::IncompleteArray)
11950 RHSClass = Type::ConstantArray;
11953 if (LHSClass == Type::ObjCInterface) LHSClass = Type::ObjCObject;
11954 if (RHSClass == Type::ObjCInterface) RHSClass = Type::ObjCObject;
11957 if (LHSClass == Type::ExtVector) LHSClass = Type::Vector;
11958 if (RHSClass == Type::ExtVector) RHSClass = Type::Vector;
11961 if (LHSClass != RHSClass) {
11971 if (OfBlockPointer && !BlockReturnType) {
11979 if (
const auto *AT = LHS->
getAs<AutoType>()) {
11980 if (!AT->isDeduced() && AT->isGNUAutoType())
11983 if (
const auto *AT = RHS->
getAs<AutoType>()) {
11984 if (!AT->isDeduced() && AT->isGNUAutoType())
11991 switch (LHSClass) {
11992#define TYPE(Class, Base)
11993#define ABSTRACT_TYPE(Class, Base)
11994#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base) case Type::Class:
11995#define NON_CANONICAL_TYPE(Class, Base) case Type::Class:
11996#define DEPENDENT_TYPE(Class, Base) case Type::Class:
11997#include "clang/AST/TypeNodes.inc"
11998 llvm_unreachable(
"Non-canonical and dependent types shouldn't get here");
12001 case Type::DeducedTemplateSpecialization:
12002 case Type::LValueReference:
12003 case Type::RValueReference:
12004 case Type::MemberPointer:
12005 llvm_unreachable(
"C++ should never be in mergeTypes");
12007 case Type::ObjCInterface:
12008 case Type::IncompleteArray:
12009 case Type::VariableArray:
12010 case Type::FunctionProto:
12011 case Type::ExtVector:
12012 case Type::OverflowBehavior:
12013 llvm_unreachable(
"Types are eliminated above");
12015 case Type::Pointer:
12026 if (ResultType.
isNull())
12034 case Type::BlockPointer:
12059 if (ResultType.
isNull())
12078 if (ResultType.
isNull())
12086 case Type::ConstantArray:
12101 if (ResultType.
isNull())
12109 if (LVAT || RVAT) {
12112 -> std::pair<bool,llvm::APInt> {
12114 std::optional<llvm::APSInt> TheInt;
12117 return std::make_pair(
true, *TheInt);
12118 return std::make_pair(
false, llvm::APSInt());
12121 return std::make_pair(
true, CAT->getSize());
12122 return std::make_pair(
false, llvm::APInt());
12125 bool HaveLSize, HaveRSize;
12126 llvm::APInt LSize, RSize;
12127 std::tie(HaveLSize, LSize) = SizeFetch(LVAT, LCAT);
12128 std::tie(HaveRSize, RSize) = SizeFetch(RVAT, RCAT);
12129 if (HaveLSize && HaveRSize && !llvm::APInt::isSameValue(LSize, RSize))
12163 case Type::FunctionNoProto:
12165 false, IsConditionalOperator);
12169 case Type::Builtin:
12172 case Type::Complex:
12181 case Type::ConstantMatrix:
12186 case Type::ObjCObject: {
12195 case Type::ObjCObjectPointer:
12196 if (OfBlockPointer) {
12208 assert(LHS != RHS &&
12209 "Equivalent pipe types should have already been handled!");
12211 case Type::ArrayParameter:
12212 assert(LHS != RHS &&
12213 "Equivalent ArrayParameter types should have already been handled!");
12215 case Type::BitInt: {
12223 if (LHSUnsigned != RHSUnsigned)
12226 if (LHSBits != RHSBits)
12230 case Type::HLSLAttributedResource: {
12231 const HLSLAttributedResourceType *LHSTy =
12232 LHS->
castAs<HLSLAttributedResourceType>();
12233 const HLSLAttributedResourceType *RHSTy =
12234 RHS->
castAs<HLSLAttributedResourceType>();
12235 assert(LHSTy->getWrappedType() == RHSTy->getWrappedType() &&
12236 LHSTy->getWrappedType()->isHLSLResourceType() &&
12237 "HLSLAttributedResourceType should always wrap __hlsl_resource_t");
12239 if (LHSTy->getAttrs() == RHSTy->getAttrs() &&
12240 LHSTy->getContainedType() == RHSTy->getContainedType())
12244 case Type::HLSLInlineSpirv:
12245 const HLSLInlineSpirvType *LHSTy = LHS->
castAs<HLSLInlineSpirvType>();
12246 const HLSLInlineSpirvType *RHSTy = RHS->
castAs<HLSLInlineSpirvType>();
12248 if (LHSTy->getOpcode() == RHSTy->getOpcode() &&
12249 LHSTy->getSize() == RHSTy->getSize() &&
12250 LHSTy->getAlignment() == RHSTy->getAlignment()) {
12251 for (
size_t I = 0; I < LHSTy->getOperands().size(); I++)
12252 if (LHSTy->getOperands()[I] != RHSTy->getOperands()[I])
12260 llvm_unreachable(
"Invalid Type::Class!");
12265 bool &CanUseFirst,
bool &CanUseSecond,
12267 assert(NewParamInfos.empty() &&
"param info list not empty");
12268 CanUseFirst = CanUseSecond =
true;
12274 if (!FirstHasInfo && !SecondHasInfo)
12277 bool NeedParamInfo =
false;
12281 for (
size_t I = 0; I < E; ++I) {
12292 bool FirstNoEscape = FirstParam.
isNoEscape();
12293 bool SecondNoEscape = SecondParam.
isNoEscape();
12294 bool IsNoEscape = FirstNoEscape && SecondNoEscape;
12296 if (NewParamInfos.back().getOpaqueValue())
12297 NeedParamInfo =
true;
12298 if (FirstNoEscape != IsNoEscape)
12299 CanUseFirst =
false;
12300 if (SecondNoEscape != IsNoEscape)
12301 CanUseSecond =
false;
12304 if (!NeedParamInfo)
12305 NewParamInfos.clear();
12311 if (
auto It = ObjCLayouts.find(D); It != ObjCLayouts.end()) {
12312 It->second =
nullptr;
12313 for (
auto *SubClass : ObjCSubClasses.lookup(D))
12325 if (LHSCan == RHSCan)
12327 if (RHSCan->isFunctionType()) {
12336 if (ResReturnType.
isNull())
12338 if (ResReturnType == NewReturnType || ResReturnType == OldReturnType) {
12355 Qualifiers RQuals = RHSCan.getLocalQualifiers();
12356 if (LQuals != RQuals) {
12369 assert((GC_L != GC_R) &&
"unequal qualifier sets had only equal elements");
12385 if (ResQT == LHSBaseQT)
12387 if (ResQT == RHSBaseQT)
12398 if (
const auto *ED = T->getAsEnumDecl())
12399 T = ED->getIntegerType();
12400 if (T->isBooleanType())
12402 if (
const auto *EIT = T->getAs<
BitIntType>())
12403 return EIT->getNumBits();
12409 assert((T->hasIntegerRepresentation() || T->isEnumeralType() ||
12410 T->isFixedPointType()) &&
12411 "Unexpected type");
12414 if (
const auto *VTy = T->getAs<
VectorType>())
12416 VTy->getNumElements(), VTy->getVectorKind());
12419 if (
const auto *EITy = T->getAs<
BitIntType>())
12423 if (
const auto *OBT = T->getAs<OverflowBehaviorType>())
12425 OBT->getBehaviorKind(),
12430 if (
const auto *ED = T->getAsEnumDecl())
12431 T = ED->getIntegerType();
12434 case BuiltinType::Char_U:
12436 case BuiltinType::Char_S:
12437 case BuiltinType::SChar:
12438 case BuiltinType::Char8:
12440 case BuiltinType::Short:
12442 case BuiltinType::Int:
12444 case BuiltinType::Long:
12446 case BuiltinType::LongLong:
12448 case BuiltinType::Int128:
12453 case BuiltinType::WChar_S:
12456 case BuiltinType::ShortAccum:
12458 case BuiltinType::Accum:
12460 case BuiltinType::LongAccum:
12462 case BuiltinType::SatShortAccum:
12464 case BuiltinType::SatAccum:
12466 case BuiltinType::SatLongAccum:
12468 case BuiltinType::ShortFract:
12470 case BuiltinType::Fract:
12472 case BuiltinType::LongFract:
12474 case BuiltinType::SatShortFract:
12476 case BuiltinType::SatFract:
12478 case BuiltinType::SatLongFract:
12481 assert((T->hasUnsignedIntegerRepresentation() ||
12482 T->isUnsignedFixedPointType()) &&
12483 "Unexpected signed integer or fixed point type");
12489 assert((T->hasIntegerRepresentation() || T->isEnumeralType() ||
12490 T->isFixedPointType()) &&
12491 "Unexpected type");
12494 if (
const auto *VTy = T->getAs<
VectorType>())
12496 VTy->getNumElements(), VTy->getVectorKind());
12499 if (
const auto *EITy = T->getAs<
BitIntType>())
12504 if (
const auto *ED = T->getAsEnumDecl())
12505 T = ED->getIntegerType();
12508 case BuiltinType::Char_S:
12510 case BuiltinType::Char_U:
12511 case BuiltinType::UChar:
12512 case BuiltinType::Char8:
12514 case BuiltinType::UShort:
12516 case BuiltinType::UInt:
12518 case BuiltinType::ULong:
12520 case BuiltinType::ULongLong:
12522 case BuiltinType::UInt128:
12527 case BuiltinType::WChar_U:
12530 case BuiltinType::UShortAccum:
12532 case BuiltinType::UAccum:
12534 case BuiltinType::ULongAccum:
12536 case BuiltinType::SatUShortAccum:
12538 case BuiltinType::SatUAccum:
12540 case BuiltinType::SatULongAccum:
12542 case BuiltinType::UShortFract:
12544 case BuiltinType::UFract:
12546 case BuiltinType::ULongFract:
12548 case BuiltinType::SatUShortFract:
12550 case BuiltinType::SatUFract:
12552 case BuiltinType::SatULongFract:
12556 (T->hasSignedIntegerRepresentation() || T->isSignedFixedPointType()) &&
12557 "Unexpected signed integer or fixed point type");
12582 bool AllowTypeModifiers) {
12586 bool IsChar =
false, IsShort =
false;
12587 RequiresICE =
false;
12592 bool IsSpecial =
false;
12596 default: Done =
true; --Str;
break;
12598 RequiresICE =
true;
12601 assert(!
Unsigned &&
"Can't use both 'S' and 'U' modifiers!");
12602 assert(!
Signed &&
"Can't use 'S' modifier multiple times!");
12606 assert(!
Signed &&
"Can't use both 'S' and 'U' modifiers!");
12607 assert(!
Unsigned &&
"Can't use 'U' modifier multiple times!");
12612 assert(!IsSpecial &&
12613 "Can't use two 'N', 'W', 'Z', 'O', 'B', or 'T' modifiers!");
12614 assert(HowLong == 0 &&
"Can't use both 'L' and 'B' modifiers!");
12622 assert(!IsSpecial &&
12623 "Can't use two 'N', 'W', 'Z', 'O', 'B', or 'T' modifiers!");
12624 assert(HowLong == 0 &&
"Can't use both 'L' and 'T' modifiers!");
12631 assert(!IsSpecial &&
12632 "Can't use 'L' with 'W', 'N', 'Z', 'O', 'B', or 'T' modifiers");
12633 assert(HowLong <= 2 &&
"Can't have LLLL modifier");
12638 assert(!IsSpecial &&
"Can't use two 'N', 'W', 'Z' or 'O' modifiers!");
12639 assert(HowLong == 0 &&
"Can't use both 'L' and 'N' modifiers!");
12643 if (Context.getTargetInfo().getLongWidth() == 32)
12648 assert(!IsSpecial &&
"Can't use two 'N', 'W', 'Z' or 'O' modifiers!");
12649 assert(HowLong == 0 &&
"Can't use both 'L' and 'W' modifiers!");
12653 switch (Context.getTargetInfo().getInt64Type()) {
12655 llvm_unreachable(
"Unexpected integer type");
12666 assert(!IsSpecial &&
"Can't use two 'N', 'W', 'Z' or 'O' modifiers!");
12667 assert(HowLong == 0 &&
"Can't use both 'L' and 'Z' modifiers!");
12671 switch (Context.getTargetInfo().getIntTypeByWidth(32,
true)) {
12673 llvm_unreachable(
"Unexpected integer type");
12686 assert(!IsSpecial &&
"Can't use two 'N', 'W', 'Z' or 'O' modifiers!");
12687 assert(HowLong == 0 &&
"Can't use both 'L' and 'O' modifiers!");
12691 if (Context.getLangOpts().OpenCL)
12704 llvm_unreachable(
"Unknown builtin type letter!");
12707 "Bad modifiers used with 'x'!");
12708 Type = Context.Float16Ty;
12712 "Bad modifiers used with 'y'!");
12713 Type = Context.BFloat16Ty;
12717 "Bad modifiers used with 'v'!");
12718 Type = Context.VoidTy;
12722 "Bad modifiers used with 'h'!");
12723 Type = Context.HalfTy;
12727 "Bad modifiers used with 'f'!");
12728 Type = Context.FloatTy;
12732 "Bad modifiers used with 'd'!");
12734 Type = Context.LongDoubleTy;
12735 else if (HowLong == 2)
12736 Type = Context.Float128Ty;
12738 Type = Context.DoubleTy;
12741 assert(HowLong == 0 &&
"Bad modifiers used with 's'!");
12743 Type = Context.UnsignedShortTy;
12745 Type = Context.ShortTy;
12749 Type =
Unsigned ? Context.UnsignedCharTy : Context.SignedCharTy;
12751 Type =
Unsigned ? Context.UnsignedShortTy : Context.ShortTy;
12752 else if (HowLong == 3)
12753 Type =
Unsigned ? Context.UnsignedInt128Ty : Context.Int128Ty;
12754 else if (HowLong == 2)
12755 Type =
Unsigned ? Context.UnsignedLongLongTy : Context.LongLongTy;
12756 else if (HowLong == 1)
12757 Type =
Unsigned ? Context.UnsignedLongTy : Context.LongTy;
12759 Type =
Unsigned ? Context.UnsignedIntTy : Context.IntTy;
12762 assert(HowLong == 0 &&
"Bad modifiers used with 'c'!");
12764 Type = Context.SignedCharTy;
12766 Type = Context.UnsignedCharTy;
12768 Type = Context.CharTy;
12771 assert(HowLong == 0 && !
Signed && !
Unsigned &&
"Bad modifiers for 'b'!");
12772 Type = Context.BoolTy;
12775 assert(HowLong == 0 && !
Signed && !
Unsigned &&
"Bad modifiers for 'z'!");
12776 Type = Context.getSizeType();
12779 assert(HowLong == 0 && !
Signed && !
Unsigned &&
"Bad modifiers for 'w'!");
12780 Type = Context.getWideCharType();
12783 Type = Context.getCFConstantStringType();
12786 Type = Context.getObjCIdType();
12789 Type = Context.getObjCSelType();
12792 Type = Context.getObjCSuperType();
12795 Type = Context.getBuiltinVaListType();
12796 assert(!
Type.isNull() &&
"builtin va list type not initialized!");
12807 Type = Context.getBuiltinVaListType();
12808 assert(!
Type.isNull() &&
"builtin va list type not initialized!");
12810 Type = Context.getArrayDecayedType(
Type);
12812 Type = Context.getLValueReferenceType(
Type);
12816 unsigned NumElements = strtoul(Str, &End, 10);
12817 assert(End != Str &&
"Missing vector size");
12821 RequiresICE,
false);
12822 assert(!RequiresICE &&
"Can't require vector ICE");
12824 Type = Context.getScalableVectorType(ElementType, NumElements);
12830 Type = Context.SveCountTy;
12834 Type = Context.AMDGPUBufferRsrcTy;
12838 Type = Context.AMDGPUFeaturePredicateTy;
12842 Type = Context.AMDGPUTextureTy;
12846 Type = Context.HLSLResourceTy;
12850 llvm_unreachable(
"Unexpected target builtin type");
12856 unsigned NumElements = strtoul(Str, &End, 10);
12857 assert(End != Str &&
"Missing vector size");
12861 RequiresICE,
false);
12862 assert(!RequiresICE &&
"Can't require vector ICE");
12871 unsigned NumElements = strtoul(Str, &End, 10);
12872 assert(End != Str &&
"Missing vector size");
12878 Type = Context.getExtVectorType(ElementType, NumElements);
12884 assert(!RequiresICE &&
"Can't require complex ICE");
12885 Type = Context.getComplexType(ElementType);
12889 Type = Context.getPointerDiffType();
12892 Type = Context.getFILEType();
12893 if (
Type.isNull()) {
12900 Type = Context.getsigjmp_bufType();
12902 Type = Context.getjmp_bufType();
12904 if (
Type.isNull()) {
12910 assert(HowLong == 0 && !
Signed && !
Unsigned &&
"Bad modifiers for 'K'!");
12911 Type = Context.getucontext_tType();
12913 if (
Type.isNull()) {
12919 Type = Context.getProcessIDType();
12922 Type = Context.MFloat8Ty;
12927 Done = !AllowTypeModifiers;
12929 switch (
char c = *Str++) {
12930 default: Done =
true; --Str;
break;
12936 unsigned AddrSpace = strtoul(Str, &End, 10);
12939 Type = Context.getAddrSpaceQualType(
12941 Context.getLangASForBuiltinAddressSpace(AddrSpace));
12945 Type = Context.getPointerType(
Type);
12947 Type = Context.getLValueReferenceType(
Type);
12955 Type = Context.getVolatileType(
Type);
12964 "Integer constant 'I' type must be an integer");
12977 bool AllowTypeModifiers)
const {
12984 unsigned *IntegerConstantArgs)
const {
12985 const char *TypeStr =
BuiltinInfo.getTypeString(Id);
12986 if (TypeStr[0] ==
'\0') {
12993 bool RequiresICE =
false;
12996 RequiresICE,
true);
13000 assert(!RequiresICE &&
"Result of intrinsic cannot be required to be an ICE");
13002 while (TypeStr[0] && TypeStr[0] !=
'.') {
13009 if (RequiresICE && IntegerConstantArgs)
13010 *IntegerConstantArgs |= 1 << ArgTypes.size();
13016 ArgTypes.push_back(Ty);
13019 if (Id == Builtin::BI__GetExceptionInfo)
13022 assert((TypeStr[0] !=
'.' || TypeStr[1] == 0) &&
13023 "'.' should only occur at end of builtin type list!");
13025 bool Variadic = (TypeStr[0] ==
'.');
13032 if (ArgTypes.empty() && Variadic && !
getLangOpts().requiresStrictPrototypes())
13082 if ((!Context.getLangOpts().CPlusPlus &&
13083 !Context.getTargetInfo().getCXXABI().isMicrosoft() &&
13084 !FD->
hasAttr<DLLExportAttr>()) ||
13085 FD->
hasAttr<GNUInlineAttr>()) {
13104 if (Context.getTargetInfo().getCXXABI().isMicrosoft() &&
13107 !FD->
hasAttr<DLLExportAttr>()) {
13128 if (D->
hasAttr<DLLImportAttr>()) {
13131 }
else if (D->
hasAttr<DLLExportAttr>()) {
13134 }
else if (Context.getLangOpts().CUDA && Context.getLangOpts().CUDAIsDevice) {
13137 if (D->
hasAttr<CUDAGlobalAttr>() &&
13146 if (Context.shouldExternalize(D))
13161 switch (Source->hasExternalDefinitions(D)) {
13188 if (Context.getLangOpts().CPlusPlus &&
13189 Context.getLangOpts().IncrementalExtensions &&
13205 if (!LexicalContext)
13210 auto StaticLocalLinkage =
13222 return StaticLocalLinkage;
13228 if (Context.isMSStaticDataMemberInlineDefinition(VD))
13234 switch (Context.getInlineVariableDefinitionKind(VD)) {
13249 return StrongLinkage;
13252 return Context.getTargetInfo().getCXXABI().isMicrosoft() &&
13267 llvm_unreachable(
"Invalid Linkage!");
13277 if (
const auto *VD = dyn_cast<VarDecl>(D)) {
13278 if (!VD->isFileVarDecl())
13283 if (VD->getDescribedVarTemplate() ||
13286 }
else if (
const auto *FD = dyn_cast<FunctionDecl>(D)) {
13312 if (D->
hasAttr<WeakRefAttr>())
13319 if (LangOpts.SYCLIsDevice)
13321 D->
hasAttr<SYCLExternalAttr>());
13327 if (
const auto *FD = dyn_cast<FunctionDecl>(D)) {
13329 if (!FD->doesThisDeclarationHaveABody())
13330 return FD->doesDeclarationForceExternallyVisibleDefinition();
13333 if (FD->
hasAttr<ConstructorAttr>() || FD->
hasAttr<DestructorAttr>())
13338 if (
getTargetInfo().getCXXABI().canKeyFunctionBeInline()) {
13339 if (
const auto *MD = dyn_cast<CXXMethodDecl>(FD)) {
13358 assert(VD->isFileVarDecl() &&
"Expected file scoped var");
13362 if (LangOpts.OpenMP &&
13363 OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(VD))
13370 if (VD->shouldEmitInExternalSource())
13383 if (VD->needsDestruction(*
this))
13387 if (VD->hasInitWithSideEffects())
13392 if (
const auto *DD = dyn_cast<DecompositionDecl>(VD)) {
13393 for (
const auto *BD : DD->flat_bindings())
13394 if (
const auto *BindingVD = BD->getHoldingVar())
13404 llvm::function_ref<
void(
FunctionDecl *)> Pred)
const {
13405 assert(FD->
isMultiVersion() &&
"Only valid for multiversioned functions");
13406 llvm::SmallDenseSet<const FunctionDecl*, 4> SeenDecls;
13411 for (
auto *CurDecl :
13415 SeenDecls.insert(CurFD).second) {
13422 bool IsCXXMethod)
const {
13425 return ABI->getDefaultMethodCallConv(IsVariadic);
13427 switch (LangOpts.getDefaultCallingConv()) {
13455 return Target->getDefaultCallingConv();
13460 return ABI->isNearlyEmpty(RD);
13465 auto ABI = Target->getCXXABI();
13466 if (ABI.isMicrosoft())
13472 return VTContext.get();
13478 switch (T->getCXXABI().getKind()) {
13479 case TargetCXXABI::AppleARM64:
13480 case TargetCXXABI::Fuchsia:
13481 case TargetCXXABI::GenericAArch64:
13482 case TargetCXXABI::GenericItanium:
13483 case TargetCXXABI::GenericARM:
13484 case TargetCXXABI::GenericMIPS:
13485 case TargetCXXABI::iOS:
13486 case TargetCXXABI::WebAssembly:
13487 case TargetCXXABI::WatchOS:
13488 case TargetCXXABI::XL:
13490 case TargetCXXABI::Microsoft:
13493 llvm_unreachable(
"Unsupported ABI");
13497 assert(T.getCXXABI().getKind() != TargetCXXABI::Microsoft &&
13498 "Device mangle context does not support Microsoft mangling.");
13499 switch (T.getCXXABI().getKind()) {
13500 case TargetCXXABI::AppleARM64:
13501 case TargetCXXABI::Fuchsia:
13502 case TargetCXXABI::GenericAArch64:
13503 case TargetCXXABI::GenericItanium:
13504 case TargetCXXABI::GenericARM:
13505 case TargetCXXABI::GenericMIPS:
13506 case TargetCXXABI::iOS:
13507 case TargetCXXABI::WebAssembly:
13508 case TargetCXXABI::WatchOS:
13509 case TargetCXXABI::XL:
13513 if (
const auto *RD = dyn_cast<CXXRecordDecl>(ND))
13514 return RD->getDeviceLambdaManglingNumber();
13515 return std::nullopt;
13518 case TargetCXXABI::Microsoft:
13522 llvm_unreachable(
"Unsupported ABI");
13540 return ASTRecordLayouts.getMemorySize() +
13541 llvm::capacity_in_bytes(ObjCLayouts) +
13542 llvm::capacity_in_bytes(KeyFunctions) +
13543 llvm::capacity_in_bytes(ObjCImpls) +
13544 llvm::capacity_in_bytes(BlockVarCopyInits) +
13545 llvm::capacity_in_bytes(DeclAttrs) +
13546 llvm::capacity_in_bytes(TemplateOrInstantiation) +
13547 llvm::capacity_in_bytes(InstantiatedFromUsingDecl) +
13548 llvm::capacity_in_bytes(InstantiatedFromUsingShadowDecl) +
13549 llvm::capacity_in_bytes(InstantiatedFromUnnamedFieldDecl) +
13550 llvm::capacity_in_bytes(OverriddenMethods) +
13551 llvm::capacity_in_bytes(Types) +
13552 llvm::capacity_in_bytes(VariableArrayTypes);
13560 unsigned Signed)
const {
13563 if (!QualTy && DestWidth == 128)
13569 unsigned Signed)
const {
13570 return getFromTargetType(
13598 llvm_unreachable(
"Unhandled TargetInfo::RealType value");
13605 MangleNumbers[ND] = Number;
13608 Listener->AddedManglingNumber(ND, Number);
13612 bool ForAuxTarget)
const {
13613 auto I = MangleNumbers.find(ND);
13614 unsigned Res = I != MangleNumbers.end() ? I->second : 1;
13617 if (LangOpts.CUDA && !LangOpts.CUDAIsDevice) {
13618 Res = ForAuxTarget ? Res >> 16 : Res & 0xFFFF;
13620 assert(!ForAuxTarget &&
"Only CUDA/HIP host compilation supports mangling "
13621 "number for aux target");
13623 return Res > 1 ? Res : 1;
13630 StaticLocalNumbers[VD] = Number;
13633 Listener->AddedStaticLocalNumbers(VD, Number);
13637 auto I = StaticLocalNumbers.find(VD);
13638 return I != StaticLocalNumbers.end() ? I->second : 1;
13642 bool IsDestroying) {
13643 if (!IsDestroying) {
13655 bool IsTypeAware) {
13656 if (!IsTypeAware) {
13695 return GlobalOperatorDeletesForVirtualDtor.contains(
13698 return ArrayOperatorDeletesForVirtualDtor.contains(
13701 return GlobalArrayOperatorDeletesForVirtualDtor.contains(
13713 if (OperatorDeletesForVirtualDtor.contains(Canon))
13714 return OperatorDeletesForVirtualDtor[Canon];
13717 if (GlobalOperatorDeletesForVirtualDtor.contains(Canon))
13718 return GlobalOperatorDeletesForVirtualDtor[Canon];
13721 if (ArrayOperatorDeletesForVirtualDtor.contains(Canon))
13722 return ArrayOperatorDeletesForVirtualDtor[Canon];
13725 if (GlobalArrayOperatorDeletesForVirtualDtor.contains(Canon))
13726 return GlobalArrayOperatorDeletesForVirtualDtor[Canon];
13737 return MaybeRequireVectorDeletingDtor.count(RD);
13745 MaybeRequireVectorDeletingDtor.insert(RD);
13750 assert(LangOpts.CPlusPlus);
13751 std::unique_ptr<MangleNumberingContext> &MCtx = MangleNumberingContexts[DC];
13759 assert(LangOpts.CPlusPlus);
13760 std::unique_ptr<MangleNumberingContext> &MCtx =
13761 ExtraMangleNumberingContexts[D];
13767std::unique_ptr<MangleNumberingContext>
13769 return ABI->createMangleNumberingContext();
13774 return ABI->getCopyConstructorForExceptionObject(
13780 return ABI->addCopyConstructorForExceptionObject(
13787 return ABI->addTypedefNameForUnnamedTagDecl(TD, DD);
13792 return ABI->getTypedefNameForUnnamedTagDecl(TD);
13797 return ABI->addDeclaratorForUnnamedTagDecl(TD, DD);
13801 return ABI->getDeclaratorForUnnamedTagDecl(TD);
13805 ParamIndices[D] =
index;
13809 ParameterIndexTable::const_iterator I = ParamIndices.find(D);
13810 assert(I != ParamIndices.end() &&
13811 "ParmIndices lacks entry set by ParmVarDecl");
13816 unsigned Length)
const {
13842 assert(
MSGuidTagDecl &&
"building MS GUID without MS extensions?");
13844 llvm::FoldingSetNodeID ID;
13848 if (
MSGuidDecl *Existing = MSGuidDecls.FindNodeOrInsertPos(ID, InsertPos))
13852 MSGuidDecl *
New = MSGuidDecl::Create(*
this, GUIDType, Parts);
13853 MSGuidDecls.InsertNode(
New, InsertPos);
13859 const APValue &APVal)
const {
13860 llvm::FoldingSetNodeID ID;
13865 UnnamedGlobalConstantDecls.FindNodeOrInsertPos(ID, InsertPos))
13869 UnnamedGlobalConstantDecl::Create(*
this, Ty, APVal);
13870 UnnamedGlobalConstantDecls.InsertNode(
New, InsertPos);
13876 assert(T->isRecordType() &&
"template param object of unexpected type");
13882 llvm::FoldingSetNodeID ID;
13887 TemplateParamObjectDecls.FindNodeOrInsertPos(ID, InsertPos))
13891 TemplateParamObjectDecls.InsertNode(
New, InsertPos);
13897 if (!T.isOSDarwin())
13900 if (!(T.isiOS() && T.isOSVersionLT(7)) &&
13901 !(T.isMacOSX() && T.isOSVersionLT(10, 9)))
13910 return (Size != Align ||
toBits(sizeChars) > MaxInlineWidthInBits);
13917 if (MethodDecl->
hasAttr<UnavailableAttr>()
13918 || MethodDecl->
hasAttr<DeprecatedAttr>())
13932 IM != EM && IF != EF; ++IM, ++IF) {
13963 llvm::FoldingSetNodeID IDX, IDY;
13964 X->Profile(IDX, *
this,
true);
13965 Y->
Profile(IDY, *
this,
true);
13979 for (
const Decl *DX :
X->redecls()) {
13984 if (DX->isFirstDecl())
13987 llvm_unreachable(
"Corrupt redecls chain");
13990template <
class T, std::enable_if_t<std::is_base_of_v<Decl, T>,
bool> = true>
13992 return cast_or_null<T>(
13994 const_cast<Decl *
>(cast_or_null<Decl>(Y))));
13997template <
class T, std::enable_if_t<std::is_base_of_v<Decl, T>,
bool> = true>
14005 bool IgnoreDeduced =
false) {
14020 bool IgnoreDeduced) {
14022 assert(R.getAsVoidPointer() !=
nullptr);
14028 assert(Xs.size() == Ys.size());
14030 for (
size_t I = 0; I < Rs.size(); ++I)
14037 return X->getAttributeLoc() == Y->getAttributeLoc() ?
X->getAttributeLoc()
14047 switch (
X.getKind()) {
14077 auto NExpX =
X.getNumTemplateExpansions();
14091 if (Xs.size() != Ys.size())
14093 R.resize(Xs.size());
14094 for (
size_t I = 0; I < R.size(); ++I) {
14107 assert(!Different);
14135 assert(!IsSame &&
"Should be the same NestedNameSpecifier");
14137 return std::nullopt;
14142 assert(Kind == NNS2.
getKind());
14147 auto Kind = Namespace1->getKind();
14148 if (Kind != Namespace2->getKind() ||
14149 (Kind == Decl::NamespaceAlias &&
14154 Namespace2->getNamespace()),
14188 llvm_unreachable(
"singletons did not compare equal");
14190 assert(R.getCanonical() == Canon);
14196 const T *Y,
bool IsSame) {
14197 return ::getCommonNNS(Ctx,
X->getQualifier(), Y->getQualifier(), IsSame);
14217 QX +=
X.getQualifiers() - RQ;
14227 Y->getElementType(), QX, QY);
14238 assert(Ctx.
hasSameExpr(
X->getSizeExpr(), Y->getSizeExpr()));
14239 return X->getSizeExpr();
14244 return X->getSizeModifier();
14250 return X->getIndexTypeCVRQualifiers();
14260 llvm::DenseMap<QualType, unsigned>
Found;
14261 for (
auto Ts : {
X, Y}) {
14268 Out.emplace_back(T);
14274FunctionProtoType::ExceptionSpecInfo
14278 bool AcceptDependent)
const {
14304 assert(AcceptDependent &&
14305 "computing composite pointer type of dependent types");
14320 llvm_unreachable(
"These ESTs should be handled above");
14325 assert(EST2 ==
EST_Dynamic &&
"other cases should already be handled");
14329 Result.Exceptions = ExceptionTypeStorage;
14336 llvm_unreachable(
"shouldn't see unresolved exception specifications here");
14339 llvm_unreachable(
"invalid ExceptionSpecificationType");
14348#define UNEXPECTED_TYPE(Class, Kind) \
14349 case Type::Class: \
14350 llvm_unreachable("Unexpected " Kind ": " #Class);
14352#define NON_CANONICAL_TYPE(Class, Base) UNEXPECTED_TYPE(Class, "non-canonical")
14353#define TYPE(Class, Base)
14354#include "clang/AST/TypeNodes.inc"
14356#define SUGAR_FREE_TYPE(Class) UNEXPECTED_TYPE(Class, "sugar-free")
14367#undef SUGAR_FREE_TYPE
14368#define NON_UNIQUE_TYPE(Class) UNEXPECTED_TYPE(Class, "non-unique")
14371#undef NON_UNIQUE_TYPE
14375#undef UNEXPECTED_TYPE
14379 assert(AX->getDeducedKind() == AY->getDeducedKind());
14381 assert(AX->getKeyword() == AY->getKeyword());
14383 AY->getTypeConstraintConcept());
14387 AY->getTypeConstraintArguments())) {
14394 case Type::IncompleteArray: {
14401 case Type::DependentSizedArray: {
14409 case Type::ConstantArray: {
14412 assert(AX->getSize() == AY->getSize());
14413 const Expr *SizeExpr = Ctx.
hasSameExpr(AX->getSizeExpr(), AY->getSizeExpr())
14414 ? AX->getSizeExpr()
14420 case Type::ArrayParameter: {
14423 assert(AX->getSize() == AY->getSize());
14424 const Expr *SizeExpr = Ctx.
hasSameExpr(AX->getSizeExpr(), AY->getSizeExpr())
14425 ? AX->getSizeExpr()
14432 case Type::Atomic: {
14437 case Type::Complex: {
14441 case Type::Pointer: {
14445 case Type::BlockPointer: {
14449 case Type::ObjCObjectPointer: {
14454 case Type::MemberPointer: {
14458 PY->getMostRecentCXXRecordDecl()));
14462 PX->getMostRecentCXXRecordDecl());
14464 case Type::LValueReference: {
14469 PX->isSpelledAsLValue() ||
14470 PY->isSpelledAsLValue());
14472 case Type::RValueReference: {
14478 case Type::DependentAddressSpace: {
14481 assert(Ctx.
hasSameExpr(PX->getAddrSpaceExpr(), PY->getAddrSpaceExpr()));
14483 PX->getAddrSpaceExpr(),
14486 case Type::FunctionNoProto: {
14489 assert(FX->getExtInfo() == FY->getExtInfo());
14494 case Type::FunctionProto: {
14498 EPIY = FY->getExtProtoInfo();
14499 assert(EPIX.
ExtInfo == EPIY.ExtInfo);
14506 assert(EPIX.
TypeQuals == EPIY.TypeQuals);
14507 assert(EPIX.
Variadic == EPIY.Variadic);
14516 auto P =
getCommonTypes(Ctx, FX->param_types(), FY->param_types(),
14524 case Type::ObjCObject: {
14527 std::equal(OX->getProtocols().begin(), OX->getProtocols().end(),
14528 OY->getProtocols().begin(), OY->getProtocols().end(),
14530 return P0->getCanonicalDecl() == P1->getCanonicalDecl();
14532 "protocol lists must be the same");
14534 OY->getTypeArgsAsWritten());
14537 OX->getProtocols(),
14538 OX->isKindOfTypeAsWritten() && OY->isKindOfTypeAsWritten());
14540 case Type::ConstantMatrix: {
14543 assert(MX->getNumRows() == MY->getNumRows());
14544 assert(MX->getNumColumns() == MY->getNumColumns());
14546 MX->getNumRows(), MX->getNumColumns());
14548 case Type::DependentSizedMatrix: {
14551 assert(Ctx.
hasSameExpr(MX->getRowExpr(), MY->getRowExpr()));
14552 assert(Ctx.
hasSameExpr(MX->getColumnExpr(), MY->getColumnExpr()));
14557 case Type::Vector: {
14559 assert(VX->getNumElements() == VY->getNumElements());
14560 assert(VX->getVectorKind() == VY->getVectorKind());
14562 VX->getNumElements(), VX->getVectorKind());
14564 case Type::ExtVector: {
14566 assert(VX->getNumElements() == VY->getNumElements());
14568 VX->getNumElements());
14570 case Type::DependentSizedExtVector: {
14577 case Type::DependentVector: {
14580 assert(VX->getVectorKind() == VY->getVectorKind());
14587 case Type::InjectedClassName: {
14594 case Type::TemplateSpecialization: {
14598 TY->template_arguments());
14602 TY->getTemplateName(),
14604 As, {},
X->getCanonicalTypeInternal());
14606 case Type::Decltype: {
14609 assert(DX->isDependentType());
14610 assert(DY->isDependentType());
14611 assert(Ctx.
hasSameExpr(DX->getUnderlyingExpr(), DY->getUnderlyingExpr()));
14615 case Type::PackIndexing: {
14618 assert(DX->isDependentType());
14619 assert(DY->isDependentType());
14620 assert(Ctx.
hasSameExpr(DX->getIndexExpr(), DY->getIndexExpr()));
14623 case Type::DependentName: {
14626 assert(NX->getIdentifier() == NY->getIdentifier());
14631 case Type::OverflowBehavior: {
14634 assert(NX->getBehaviorKind() == NY->getBehaviorKind());
14636 NX->getBehaviorKind(),
14638 NY->getUnderlyingType(), QX, QY));
14640 case Type::UnaryTransform: {
14643 assert(TX->getUTTKind() == TY->getUTTKind());
14647 TY->getUnderlyingType()),
14650 case Type::PackExpansion: {
14653 assert(PX->getNumExpansions() == PY->getNumExpansions());
14656 PX->getNumExpansions(),
false);
14660 assert(PX->isReadOnly() == PY->isReadOnly());
14665 case Type::TemplateTypeParm: {
14668 assert(TX->getDepth() == TY->getDepth());
14669 assert(TX->getIndex() == TY->getIndex());
14670 assert(TX->isParameterPack() == TY->isParameterPack());
14672 TX->getDepth(), TX->getIndex(), TX->isParameterPack(),
14676 llvm_unreachable(
"Unknown Type Class");
14686#define UNEXPECTED_TYPE(Class, Kind) \
14687 case Type::Class: \
14688 llvm_unreachable("Unexpected " Kind ": " #Class);
14689#define TYPE(Class, Base)
14690#define DEPENDENT_TYPE(Class, Base) UNEXPECTED_TYPE(Class, "dependent")
14691#include "clang/AST/TypeNodes.inc"
14693#define CANONICAL_TYPE(Class) UNEXPECTED_TYPE(Class, "canonical")
14720#undef CANONICAL_TYPE
14722#undef UNEXPECTED_TYPE
14724 case Type::Adjusted: {
14726 QualType OX = AX->getOriginalType(), OY = AY->getOriginalType();
14733 case Type::Decayed: {
14735 QualType OX = DX->getOriginalType(), OY = DY->getOriginalType();
14742 case Type::Attributed: {
14744 AttributedType::Kind Kind = AX->getAttrKind();
14745 if (Kind != AY->getAttrKind())
14747 QualType MX = AX->getModifiedType(), MY = AY->getModifiedType();
14755 case Type::BTFTagAttributed: {
14757 const BTFTypeTagAttr *AX = BX->getAttr();
14759 if (AX->getBTFTypeTag() !=
14770 if (KW != AY->getKeyword())
14774 AY->getTypeConstraintConcept());
14778 AY->getTypeConstraintArguments())) {
14789 case Type::PackIndexing:
14790 case Type::Decltype:
14792 case Type::DeducedTemplateSpecialization:
14795 case Type::MacroQualified: {
14799 if (IX != MY->getMacroIdentifier())
14803 case Type::SubstTemplateTypeParm: {
14810 unsigned Index = SX->getIndex();
14811 if (Index != SY->getIndex())
14813 auto PackIndex = SX->getPackIndex();
14814 if (PackIndex != SY->getPackIndex())
14817 CD, Index, PackIndex,
14818 SX->getFinal() && SY->getFinal());
14820 case Type::ObjCTypeParam:
14826 case Type::TemplateSpecialization: {
14831 TY->getTemplateName(),
true);
14836 TY->template_arguments()))
14842 case Type::Typedef: {
14852 case Type::TypeOf: {
14863 case Type::TypeOfExpr:
14866 case Type::UnaryTransform: {
14869 UnaryTransformType::UTTKind KX = UX->getUTTKind();
14870 if (KX != UY->getUTTKind())
14872 QualType BX = UX->getBaseType(), BY = UY->getBaseType();
14879 case Type::Using: {
14888 case Type::MemberPointer: {
14892 assert(Cls == PY->getMostRecentCXXRecordDecl());
14897 case Type::CountAttributed: {
14900 if (DX->isCountInBytes() != DY->isCountInBytes())
14902 if (DX->isOrNull() != DY->isOrNull())
14904 Expr *CEX = DX->getCountExpr();
14905 Expr *CEY = DY->getCountExpr();
14909 DX->isCountInBytes(), DX->isOrNull(),
14920 DX->isCountInBytes(), DX->isOrNull(),
14923 case Type::PredefinedSugar:
14928 llvm_unreachable(
"Unhandled Type Class");
14950 if (
X.isCanonical())
14977 bool KeepCommonQualifiers =
14980 if (SX.
Ty != SY.Ty) {
14988 while (!Xs.empty() && !Ys.empty() && Xs.back().Ty == Ys.back().Ty) {
14991 SX = Xs.pop_back_val();
14992 SY = Ys.pop_back_val();
14995 if (KeepCommonQualifiers)
15002 while (!Xs.empty() && !Ys.empty()) {
15005 SX = Xs.pop_back_val();
15006 SY = Ys.pop_back_val();
15011 SX.
Ty = Underlying.Ty;
15014 QX -= Underlying.Quals;
15032 llvm_unreachable(
"Not a saturated fixed point type!");
15033 case BuiltinType::SatShortAccum:
15035 case BuiltinType::SatAccum:
15037 case BuiltinType::SatLongAccum:
15039 case BuiltinType::SatUShortAccum:
15041 case BuiltinType::SatUAccum:
15043 case BuiltinType::SatULongAccum:
15045 case BuiltinType::SatShortFract:
15047 case BuiltinType::SatFract:
15049 case BuiltinType::SatLongFract:
15051 case BuiltinType::SatUShortFract:
15053 case BuiltinType::SatUFract:
15055 case BuiltinType::SatULongFract:
15067 llvm_unreachable(
"Not a fixed point type!");
15068 case BuiltinType::ShortAccum:
15070 case BuiltinType::Accum:
15072 case BuiltinType::LongAccum:
15074 case BuiltinType::UShortAccum:
15076 case BuiltinType::UAccum:
15078 case BuiltinType::ULongAccum:
15080 case BuiltinType::ShortFract:
15082 case BuiltinType::Fract:
15084 case BuiltinType::LongFract:
15086 case BuiltinType::UShortFract:
15088 case BuiltinType::UFract:
15090 case BuiltinType::ULongFract:
15096 if (LangOpts.OpenCL)
15120 llvm_unreachable(
"Not a fixed point type!");
15121 case BuiltinType::ShortAccum:
15122 case BuiltinType::SatShortAccum:
15123 return Target.getShortAccumScale();
15124 case BuiltinType::Accum:
15125 case BuiltinType::SatAccum:
15126 return Target.getAccumScale();
15127 case BuiltinType::LongAccum:
15128 case BuiltinType::SatLongAccum:
15129 return Target.getLongAccumScale();
15130 case BuiltinType::UShortAccum:
15131 case BuiltinType::SatUShortAccum:
15132 return Target.getUnsignedShortAccumScale();
15133 case BuiltinType::UAccum:
15134 case BuiltinType::SatUAccum:
15135 return Target.getUnsignedAccumScale();
15136 case BuiltinType::ULongAccum:
15137 case BuiltinType::SatULongAccum:
15138 return Target.getUnsignedLongAccumScale();
15139 case BuiltinType::ShortFract:
15140 case BuiltinType::SatShortFract:
15141 return Target.getShortFractScale();
15142 case BuiltinType::Fract:
15143 case BuiltinType::SatFract:
15144 return Target.getFractScale();
15145 case BuiltinType::LongFract:
15146 case BuiltinType::SatLongFract:
15147 return Target.getLongFractScale();
15148 case BuiltinType::UShortFract:
15149 case BuiltinType::SatUShortFract:
15150 return Target.getUnsignedShortFractScale();
15151 case BuiltinType::UFract:
15152 case BuiltinType::SatUFract:
15153 return Target.getUnsignedFractScale();
15154 case BuiltinType::ULongFract:
15155 case BuiltinType::SatULongFract:
15156 return Target.getUnsignedLongFractScale();
15166 llvm_unreachable(
"Not a fixed point type!");
15167 case BuiltinType::ShortAccum:
15168 case BuiltinType::SatShortAccum:
15169 return Target.getShortAccumIBits();
15170 case BuiltinType::Accum:
15171 case BuiltinType::SatAccum:
15172 return Target.getAccumIBits();
15173 case BuiltinType::LongAccum:
15174 case BuiltinType::SatLongAccum:
15175 return Target.getLongAccumIBits();
15176 case BuiltinType::UShortAccum:
15177 case BuiltinType::SatUShortAccum:
15178 return Target.getUnsignedShortAccumIBits();
15179 case BuiltinType::UAccum:
15180 case BuiltinType::SatUAccum:
15181 return Target.getUnsignedAccumIBits();
15182 case BuiltinType::ULongAccum:
15183 case BuiltinType::SatULongAccum:
15184 return Target.getUnsignedLongAccumIBits();
15185 case BuiltinType::ShortFract:
15186 case BuiltinType::SatShortFract:
15187 case BuiltinType::Fract:
15188 case BuiltinType::SatFract:
15189 case BuiltinType::LongFract:
15190 case BuiltinType::SatLongFract:
15191 case BuiltinType::UShortFract:
15192 case BuiltinType::SatUShortFract:
15193 case BuiltinType::UFract:
15194 case BuiltinType::SatUFract:
15195 case BuiltinType::ULongFract:
15196 case BuiltinType::SatULongFract:
15201llvm::FixedPointSemantics
15204 "Can only get the fixed point semantics for a "
15205 "fixed point or integer type.");
15207 return llvm::FixedPointSemantics::GetIntegerSemantics(
15211 return llvm::FixedPointSemantics(
15214 !isSigned &&
getTargetInfo().doUnsignedFixedPointTypesHavePadding());
15229 "Expected unsigned fixed point type");
15232 case BuiltinType::UShortAccum:
15234 case BuiltinType::UAccum:
15236 case BuiltinType::ULongAccum:
15238 case BuiltinType::SatUShortAccum:
15240 case BuiltinType::SatUAccum:
15242 case BuiltinType::SatULongAccum:
15244 case BuiltinType::UShortFract:
15246 case BuiltinType::UFract:
15248 case BuiltinType::ULongFract:
15250 case BuiltinType::SatUShortFract:
15252 case BuiltinType::SatUFract:
15254 case BuiltinType::SatULongFract:
15257 llvm_unreachable(
"Unexpected unsigned fixed point type");
15265 std::vector<std::string> BackendFeats;
15266 llvm::AArch64::ExtensionSet FeatureBits;
15267 for (StringRef F : FMVFeatStrings)
15268 if (
auto FMVExt = llvm::AArch64::parseFMVExtension(F))
15270 FeatureBits.enable(*FMVExt->ID);
15271 FeatureBits.toLLVMFeatureList(BackendFeats);
15272 return BackendFeats;
15277 assert(TD !=
nullptr);
15280 llvm::erase_if(
ParsedAttr.Features, [&](
const std::string &Feat) {
15281 return !Target->isValidFeatureName(StringRef{Feat}.substr(1));
15292 Target->getTargetOpts().CPU,
15293 Target->getTargetOpts().Features);
15300 StringRef TargetCPU = Target->getTargetOpts().CPU;
15302 if (
const auto *TD = FD->
getAttr<TargetAttr>()) {
15308 if (!Target->getTriple().isAArch64())
15311 Target->getTargetOpts().FeaturesAsWritten.begin(),
15312 Target->getTargetOpts().FeaturesAsWritten.end());
15323 }
else if (
const auto *SD = FD->
getAttr<CPUSpecificAttr>()) {
15325 Target->getCPUSpecificCPUDispatchFeatures(
15327 std::vector<std::string> Features(FeaturesTmp.begin(), FeaturesTmp.end());
15328 Features.insert(Features.begin(),
15329 Target->getTargetOpts().FeaturesAsWritten.begin(),
15330 Target->getTargetOpts().FeaturesAsWritten.end());
15331 Target->initFeatureMap(FeatureMap,
getDiagnostics(), TargetCPU, Features);
15332 }
else if (
const auto *TC = FD->
getAttr<TargetClonesAttr>()) {
15333 if (Target->getTriple().isAArch64()) {
15337 Features.insert(Features.begin(),
15338 Target->getTargetOpts().FeaturesAsWritten.begin(),
15339 Target->getTargetOpts().FeaturesAsWritten.end());
15340 Target->initFeatureMap(FeatureMap,
getDiagnostics(), TargetCPU, Features);
15341 }
else if (Target->getTriple().isRISCV()) {
15343 std::vector<std::string> Features;
15344 if (VersionStr !=
"default") {
15346 Features.insert(Features.begin(),
ParsedAttr.Features.begin(),
15349 Features.insert(Features.begin(),
15350 Target->getTargetOpts().FeaturesAsWritten.begin(),
15351 Target->getTargetOpts().FeaturesAsWritten.end());
15352 Target->initFeatureMap(FeatureMap,
getDiagnostics(), TargetCPU, Features);
15353 }
else if (Target->getTriple().isOSAIX()) {
15354 std::vector<std::string> Features;
15356 if (VersionStr.starts_with(
"cpu="))
15357 TargetCPU = VersionStr.drop_front(
sizeof(
"cpu=") - 1);
15359 assert(VersionStr ==
"default");
15360 Target->initFeatureMap(FeatureMap,
getDiagnostics(), TargetCPU, Features);
15362 std::vector<std::string> Features;
15364 if (VersionStr.starts_with(
"arch="))
15365 TargetCPU = VersionStr.drop_front(
sizeof(
"arch=") - 1);
15366 else if (VersionStr !=
"default")
15367 Features.push_back((StringRef{
"+"} + VersionStr).str());
15368 Target->initFeatureMap(FeatureMap,
getDiagnostics(), TargetCPU, Features);
15370 }
else if (
const auto *TV = FD->
getAttr<TargetVersionAttr>()) {
15371 std::vector<std::string> Features;
15372 if (Target->getTriple().isRISCV()) {
15374 Features.insert(Features.begin(),
ParsedAttr.Features.begin(),
15377 assert(Target->getTriple().isAArch64());
15379 TV->getFeatures(Feats);
15382 Features.insert(Features.begin(),
15383 Target->getTargetOpts().FeaturesAsWritten.begin(),
15384 Target->getTargetOpts().FeaturesAsWritten.end());
15385 Target->initFeatureMap(FeatureMap,
getDiagnostics(), TargetCPU, Features);
15387 FeatureMap = Target->getTargetOpts().FeatureMap;
15398 auto DeviceDiscriminatorOverrider =
15400 if (
const auto *RD = dyn_cast<CXXRecordDecl>(ND))
15402 return RD->getDeviceLambdaManglingNumber();
15403 return std::nullopt;
15406 Context, Context.getDiagnostics(), DeviceDiscriminatorOverrider)};
15414 std::string Buffer;
15415 Buffer.reserve(128);
15416 llvm::raw_string_ostream Out(Buffer);
15417 MC->mangleCanonicalTypeName(KernelNameType, Out);
15418 std::string KernelName = Out.str();
15420 return {KernelNameType, FD, KernelName};
15429 const auto *SKEPAttr = FD->
getAttr<SYCLKernelEntryPointAttr>();
15430 assert(SKEPAttr &&
"Missing sycl_kernel_entry_point attribute");
15439 "SYCL kernel name conflict");
15454 return &IT->second;
15460 return *OMPTraitInfoVector.back();
15467 return DB << Section.
Decl;
15468 return DB <<
"a prior #pragma section";
15472 bool IsInternalVar =
15475 bool IsExplicitDeviceVar = (D->
hasAttr<CUDADeviceAttr>() &&
15476 !D->
getAttr<CUDADeviceAttr>()->isImplicit()) ||
15477 (D->
hasAttr<CUDAConstantAttr>() &&
15478 !D->
getAttr<CUDAConstantAttr>()->isImplicit());
15482 return (IsInternalVar &&
15483 (D->
hasAttr<HIPManagedAttr>() || IsExplicitDeviceVar)) ||
15484 (D->
hasAttr<CUDAGlobalAttr>() &&
15491 (D->
hasAttr<HIPManagedAttr>() || D->
hasAttr<CUDAGlobalAttr>() ||
15496 if (!CUIDHash.empty())
15498 if (LangOpts.CUID.empty())
15499 return StringRef();
15500 CUIDHash = llvm::utohexstr(llvm::MD5Hash(LangOpts.CUID),
true);
15510 assert(PrimaryBase);
15513 auto Base = Layout.getPrimaryBase();
15514 if (!
Base ||
Base == PrimaryBase || !
Base->isPolymorphic())
15516 PrimaryBase =
Base;
15518 return PrimaryBase;
15522 StringRef MangledName) {
15524 assert(
Method->isVirtual());
15525 bool DefaultIncludesPointerAuth =
15526 LangOpts.PointerAuthCalls || LangOpts.PointerAuthIntrinsics;
15528 if (!DefaultIncludesPointerAuth)
15531 auto Existing = ThunksToBeAbbreviated.find(VirtualMethodDecl);
15532 if (Existing != ThunksToBeAbbreviated.end())
15533 return Existing->second.contains(MangledName.str());
15536 llvm::StringMap<llvm::SmallVector<std::string, 2>> Thunks;
15538 if (
const auto *ThunkInfos = VtableContext->getThunkInfo(VirtualMethodDecl)) {
15540 for (
const auto &Thunk : *ThunkInfos) {
15542 llvm::raw_svector_ostream ElidedNameStream(ElidedName);
15548 Mangler->mangleThunk(
Method, Thunk,
true,
15551 llvm::raw_svector_ostream mangledNameStream(MangledName);
15555 mangledNameStream);
15557 Mangler->mangleThunk(
Method, Thunk,
false,
15558 mangledNameStream);
15560 Thunks[ElidedName].push_back(std::string(MangledName));
15563 llvm::StringSet<> SimplifiedThunkNames;
15564 for (
auto &ThunkList : Thunks) {
15565 llvm::sort(ThunkList.second);
15566 SimplifiedThunkNames.insert(ThunkList.second[0]);
15568 bool Result = SimplifiedThunkNames.contains(MangledName);
15569 ThunksToBeAbbreviated[VirtualMethodDecl] = std::move(SimplifiedThunkNames);
15587 std::vector<PFPField> &Fields,
bool IncludeVBases) {
15589 if (
auto *ElemDecl = AT->getElementType()->getAsCXXRecordDecl()) {
15591 for (
unsigned i = 0; i != AT->getSize(); ++i)
15608 Fields.push_back({FieldOffset, Field});
15615 if (
Base.isVirtual())
15622 if (IncludeVBases) {
15633 std::vector<PFPField> PFPFields;
15643 if (
auto *RD = dyn_cast<CXXRecordDecl>(FD->
getParent()))
15645 !FD->
hasAttr<NoFieldProtectionAttr>();
15650 auto *FD = dyn_cast<FieldDecl>(VD);
This file provides AST data structures related to concepts.
static void SortAndUniqueProtocols(SmallVectorImpl< ObjCProtocolDecl * > &Protocols)
static bool isCanonicalExceptionSpecification(const FunctionProtoType::ExceptionSpecInfo &ESI, bool NoexceptInType)
static SourceLocation getCommonAttrLoc(const T *X, const T *Y)
static auto getCanonicalTemplateArguments(const ASTContext &C, ArrayRef< TemplateArgument > Args, bool &AnyNonCanonArgs)
static char getObjCEncodingForPrimitiveType(const ASTContext *C, const BuiltinType *BT)
static bool isSameQualifier(const NestedNameSpecifier X, const NestedNameSpecifier Y)
static bool unionHasUniqueObjectRepresentations(const ASTContext &Context, const RecordDecl *RD, bool CheckIfTriviallyCopyable)
static TypedefDecl * CreateHexagonBuiltinVaListDecl(const ASTContext *Context)
#define CANONICAL_TYPE(Class)
static ElaboratedTypeKeyword getCommonTypeKeyword(const T *X, const T *Y, bool IsSame)
static Decl * getCommonDecl(Decl *X, Decl *Y)
static GVALinkage adjustGVALinkageForAttributes(const ASTContext &Context, const Decl *D, GVALinkage L)
static bool isTypeTypedefedAsBOOL(QualType T)
static void EncodeBitField(const ASTContext *Ctx, std::string &S, QualType T, const FieldDecl *FD)
static GVALinkage basicGVALinkageForVariable(const ASTContext &Context, const VarDecl *VD)
static 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 SmallVector< SourceLocation, 2 > getLocsForCommentSearch(ASTContext::RawCommentLookupKey Key, SourceManager &SourceMgr)
static bool hasSameCudaAttrs(const FunctionDecl *A, const FunctionDecl *B)
static TemplateName getCommonTemplateName(const ASTContext &Ctx, TemplateName X, TemplateName Y, bool IgnoreDeduced=false)
static int CmpProtocolNames(ObjCProtocolDecl *const *LHS, ObjCProtocolDecl *const *RHS)
CmpProtocolNames - Comparison predicate for sorting protocols alphabetically.
static auto * getCommonSizeExpr(const ASTContext &Ctx, T *X, T *Y)
static TypedefDecl * CreatePowerABIBuiltinVaListDecl(const ASTContext *Context)
static auto getCommonSizeModifier(const ArrayType *X, const ArrayType *Y)
static TemplateArgument getCommonTemplateArgument(const ASTContext &Ctx, const TemplateArgument &X, const TemplateArgument &Y)
static std::optional< int64_t > structHasUniqueObjectRepresentations(const ASTContext &Context, const RecordDecl *RD, bool CheckIfTriviallyCopyable)
static bool hasSameOverloadableAttrs(const FunctionDecl *A, const FunctionDecl *B)
Determine whether the attributes we can overload on are identical for A and B.
static T * getCommonDeclChecked(T *X, T *Y)
static NestedNameSpecifier getCommonNNS(const ASTContext &Ctx, NestedNameSpecifier NNS1, NestedNameSpecifier NNS2, bool IsSame)
Returns a NestedNameSpecifier which has only the common sugar present in both NNS1 and NNS2.
static TypedefDecl * CreateVoidPtrBuiltinVaListDecl(const ASTContext *Context)
static int64_t getSubobjectOffset(const FieldDecl *Field, const ASTContext &Context, const clang::ASTRecordLayout &)
static QualType getCommonSugarTypeNode(const ASTContext &Ctx, const Type *X, const Type *Y, SplitQualType Underlying)
static TypedefDecl * CreateAArch64ABIBuiltinVaListDecl(const ASTContext *Context)
static QualType getCommonNonSugarTypeNode(const ASTContext &Ctx, const Type *X, Qualifiers &QX, const Type *Y, Qualifiers &QY)
static QualType mergeEnumWithInteger(ASTContext &Context, const EnumType *ET, QualType other, bool isBlockReturnType)
Given that we have an enum type and a non-enum type, try to merge them.
static GVALinkage adjustGVALinkageForExternalDefinitionKind(const ASTContext &Ctx, const Decl *D, GVALinkage L)
Adjust the GVALinkage for a declaration based on what an external AST source knows about whether ther...
static TypedefDecl * CreateSystemZBuiltinVaListDecl(const ASTContext *Context)
static std::optional< int64_t > getSubobjectSizeInBits(const FieldDecl *Field, const ASTContext &Context, bool CheckIfTriviallyCopyable)
static GVALinkage basicGVALinkageForFunction(const ASTContext &Context, const FunctionDecl *FD)
#define NON_UNIQUE_TYPE(Class)
static TypedefDecl * CreateX86_64ABIBuiltinVaListDecl(const ASTContext *Context)
static bool isAddrSpaceMapManglingEnabled(const TargetInfo &TI, const LangOptions &LangOpts)
static ElaboratedTypeKeyword getCanonicalElaboratedTypeKeyword(ElaboratedTypeKeyword Keyword)
static QualType getCommonPointeeType(const ASTContext &Ctx, const T *X, const T *Y)
static auto getCommonIndexTypeCVRQualifiers(const ArrayType *X, const ArrayType *Y)
static QualType DecodeTypeFromStr(const char *&Str, const ASTContext &Context, ASTContext::GetBuiltinTypeError &Error, bool &RequiresICE, bool AllowTypeModifiers)
DecodeTypeFromStr - This decodes one type descriptor from Str, advancing the pointer over the consume...
static TypedefDecl * CreateCharPtrBuiltinVaListDecl(const ASTContext *Context)
static bool areSortedAndUniqued(ArrayRef< ObjCProtocolDecl * > Protocols)
static TypeInfoChars getConstantArrayInfoInChars(const ASTContext &Context, const ConstantArrayType *CAT)
getConstantArrayInfoInChars - Performing the computation in CharUnits instead of in bits prevents ove...
static FloatingRank getFloatingRank(QualType T)
getFloatingRank - Return a relative rank for floating point types.
static bool getCommonTemplateArguments(const ASTContext &Ctx, SmallVectorImpl< TemplateArgument > &R, ArrayRef< TemplateArgument > Xs, ArrayRef< TemplateArgument > Ys)
static TypedefDecl * CreateXtensaABIBuiltinVaListDecl(const ASTContext *Context)
static QualType getCommonElementType(const ASTContext &Ctx, const T *X, const T *Y)
static void mergeTypeLists(const ASTContext &Ctx, SmallVectorImpl< QualType > &Out, ArrayRef< QualType > X, ArrayRef< QualType > Y)
static bool matchesPostDecrInWhile(const UnaryOperator *UO, ASTContext &Ctx)
For the purposes of overflow pattern exclusion, does this match the while(i–) pattern?
static void encodeTypeForFunctionPointerAuth(const ASTContext &Ctx, raw_ostream &OS, QualType QT)
Encode a function type for use in the discriminator of a function pointer type.
static std::optional< int64_t > structSubobjectsHaveUniqueObjectRepresentations(const RangeT &Subobjects, int64_t CurOffsetInBits, const ASTContext &Context, const clang::ASTRecordLayout &Layout, bool CheckIfTriviallyCopyable)
static uint64_t getRVVTypeSize(ASTContext &Context, const BuiltinType *Ty)
getRVVTypeSize - Return RVV vector register size.
static auto unwrapSugar(SplitQualType &T, Qualifiers &QTotal)
static TemplateName getCommonTemplateNameChecked(const ASTContext &Ctx, TemplateName X, TemplateName Y, bool IgnoreDeduced)
static int compareObjCProtocolsByName(ObjCProtocolDecl *const *lhs, ObjCProtocolDecl *const *rhs)
Comparison routine for Objective-C protocols to be used with llvm::array_pod_sort.
static std::string charUnitsToString(const CharUnits &CU)
static const TagDecl * getNonInjectedClassName(const TagDecl *TD)
static bool hasAnyPackExpansions(ArrayRef< TemplateArgument > Args)
static char ObjCEncodingForEnumDecl(const ASTContext *C, const EnumDecl *ED)
static void addRedeclaredMethods(const ObjCMethodDecl *ObjCMethod, SmallVectorImpl< const NamedDecl * > &Redeclared)
static QualType getCommonTypeWithQualifierLifting(const ASTContext &Ctx, QualType X, QualType Y, Qualifiers &QX, Qualifiers &QY)
static auto getCommonTypes(const ASTContext &Ctx, ArrayRef< QualType > Xs, ArrayRef< QualType > Ys, bool Unqualified=false)
static bool isCanonicalResultType(QualType T)
Determine whether T is canonical as the result type of a function.
static TypedefDecl * CreateMSVaListDecl(const ASTContext *Context)
static bool areCompatVectorTypes(const VectorType *LHS, const VectorType *RHS)
areCompatVectorTypes - Return true if the two specified vector types are compatible.
static TypedefDecl * CreateCharPtrNamedVaListDecl(const ASTContext *Context, StringRef Name)
static NestedNameSpecifier getCommonQualifier(const ASTContext &Ctx, const T *X, const T *Y, bool IsSame)
#define UNEXPECTED_TYPE(Class, Kind)
static TypedefDecl * CreateVaListDecl(const ASTContext *Context, TargetInfo::BuiltinVaListKind Kind)
static bool primaryBaseHaseAddressDiscriminatedVTableAuthentication(const ASTContext &Context, const CXXRecordDecl *Class)
static std::vector< std::string > getFMVBackendFeaturesFor(const llvm::SmallVectorImpl< StringRef > &FMVFeatStrings)
Defines the clang::ASTContext interface.
#define BuiltinTemplate(BTName)
Provides definitions for the various language-specific address spaces.
static bool isUnsigned(SValBuilder &SVB, NonLoc Value)
Defines enum values for all the target-independent builtin functions.
static bool CanThrow(Expr *E, ASTContext &Ctx)
static Decl::Kind getKind(const Decl *D)
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
This file defines OpenMP nodes for declarative directives.
Defines the C++ template declaration subclasses.
Defines the ExceptionSpecificationType enumeration and various utility functions.
Defines the clang::Expr interface and subclasses for C++ expressions.
Defines the clang::IdentifierInfo, clang::IdentifierTable, and clang::Selector interfaces.
static const Decl * getCanonicalDecl(const Decl *D)
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified.
Defines the clang::LangOptions interface.
llvm::MachO::Target Target
llvm::MachO::Record Record
Defines the clang::MacroInfo and clang::MacroDirective classes.
static bool hasFeature(StringRef Feature, const LangOptions &LangOpts, const TargetInfo &Target)
Determine whether a translation unit built using the current language options has the given feature.
Defines the clang::Module class, which describes a module in the source code.
static StringRef getTriple(const Command &Job)
Defines types useful for describing an Objective-C runtime.
*collection of selector each with an associated kind and an ordered *collection of selectors A selector has a kind
static bool compare(const PathDiagnostic &X, const PathDiagnostic &Y)
static QualType getUnderlyingType(const SubRegion *R)
Defines the clang::SourceLocation class and associated facilities.
Defines the SourceManager interface.
Defines various enumerations that describe declaration and type specifiers.
static QualType getPointeeType(const MemRegion *R)
Defines the TargetCXXABI class, which abstracts details of the C++ ABI that we're targeting.
Defines the clang::TypeLoc interface and its subclasses.
C Language Family Type Representation.
QualType getReadPipeType(QualType T) const
Return a read_only pipe type for the specified type.
llvm::PointerUnion< const Decl *, const MacroInfo * > RawCommentLookupKey
Key used to look up the raw comment attached to a declaration or macro.
RawComment * getRawCommentNoCacheImpl(RawCommentLookupKey Key, const SourceLocation RepresentativeLoc, const std::map< unsigned, RawComment * > &CommentsInFile) const
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>
APValue - This class implements a discriminated union of [uninitialized] [APSInt] [APFloat],...
bool isMemberPointerToDerivedMember() const
const ValueDecl * getMemberPointerDecl() const
ArrayRef< const CXXRecordDecl * > getMemberPointerPath() const
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
bool getByrefLifetime(QualType Ty, Qualifiers::ObjCLifetime &Lifetime, bool &HasByrefExtendedLayout) const
Returns true, if given type has a known lifetime.
MSGuidDecl * getMSGuidDecl(MSGuidDeclParts Parts) const
Return a declaration for the global GUID object representing the given GUID value.
BuiltinVectorTypeInfo getBuiltinVectorTypeInfo(const BuiltinType *VecTy) const
Returns the element type, element count and number of vectors (in case of tuple) for a builtin vector...
bool ObjCMethodsAreEqual(const ObjCMethodDecl *MethodDecl, const ObjCMethodDecl *MethodImp)
CanQualType ObjCBuiltinSelTy
TranslationUnitDecl * getTranslationUnitDecl() const
const ConstantArrayType * getAsConstantArrayType(QualType T) const
CanQualType getCanonicalFunctionResultType(QualType ResultType) const
Adjust the given function result type.
QualType getAtomicType(QualType T) const
Return the uniqued reference to the atomic type for the specified type.
LangAS getOpenCLTypeAddrSpace(const Type *T) const
Get address space for OpenCL type.
CharUnits getTypeAlignInChars(QualType T) const
Return the ABI-specified alignment of a (complete) type T, in characters.
void InitBuiltinTypes(const TargetInfo &Target, const TargetInfo *AuxTarget=nullptr)
Initialize built-in types.
ParentMapContext & getParentMapContext()
Returns the dynamic AST node parent map context.
QualType getParenType(QualType NamedType) const
size_t getSideTableAllocatedMemory() const
Return the total memory used for various side tables.
MemberSpecializationInfo * getInstantiatedFromStaticDataMember(const VarDecl *Var)
If this variable is an instantiated static data member of a class template specialization,...
QualType getRValueReferenceType(QualType T) const
Return the uniqued reference to the type for an rvalue reference to the specified type.
CanQualType ARCUnbridgedCastTy
QualType getDependentSizedMatrixType(QualType ElementType, Expr *RowExpr, Expr *ColumnExpr, SourceLocation AttrLoc) const
Return the unique reference to the matrix type of the specified element type and size.
QualType getBTFTagAttributedType(const BTFTypeTagAttr *BTFAttr, QualType Wrapped) const
llvm::DenseMap< const Decl *, comments::FullComment * > ParsedComments
Mapping from declarations to parsed comments attached to any redeclaration.
unsigned getManglingNumber(const NamedDecl *ND, bool ForAuxTarget=false) const
unsigned getIntWidth(QualType T) const
CanQualType getCanonicalParamType(QualType T) const
Return the canonical parameter type corresponding to the specific potentially non-canonical one.
const FunctionType * adjustFunctionType(const FunctionType *Fn, FunctionType::ExtInfo EInfo)
Change the ExtInfo on a function type.
TemplateOrSpecializationInfo getTemplateOrSpecializationInfo(const VarDecl *Var)
InlineVariableDefinitionKind
@ None
Not an inline variable.
@ Weak
Weak definition of inline variable.
@ Strong
Strong definition.
@ WeakUnknown
Weak for now, might become strong later in this TU.
bool dtorHasOperatorDelete(const CXXDestructorDecl *Dtor, OperatorDeleteKind K) const
void setObjCConstantStringInterface(ObjCInterfaceDecl *Decl)
TypedefDecl * getObjCClassDecl() const
Retrieve the typedef declaration corresponding to the predefined Objective-C 'Class' type.
TypedefNameDecl * getTypedefNameForUnnamedTagDecl(const TagDecl *TD)
TypedefDecl * getCFConstantStringDecl() const
CanQualType SatUnsignedFractTy
void setInstantiatedFromUsingDecl(NamedDecl *Inst, NamedDecl *Pattern)
Remember that the using decl Inst is an instantiation of the using decl Pattern of a class template.
bool areCompatibleRVVTypes(QualType FirstType, QualType SecondType)
Return true if the given types are an RISC-V vector builtin type and a VectorType that is a fixed-len...
ExternCContextDecl * getExternCContextDecl() const
const llvm::fltSemantics & getFloatTypeSemantics(QualType T) const
Return the APFloat 'semantics' for the specified scalar floating point type.
ParsedTargetAttr filterFunctionTargetAttrs(const TargetAttr *TD) const
Parses the target attributes passed in, and returns only the ones that are valid feature names.
QualType areCommonBaseCompatible(const ObjCObjectPointerType *LHSOPT, const ObjCObjectPointerType *RHSOPT)
TypedefDecl * getObjCSelDecl() const
Retrieve the typedef corresponding to the predefined 'SEL' type in Objective-C.
CanQualType UnsignedShortAccumTy
TypedefDecl * getObjCInstanceTypeDecl()
Retrieve the typedef declaration corresponding to the Objective-C "instancetype" type.
bool isPFPField(const FieldDecl *Field) const
QualType adjustFunctionResultType(QualType FunctionType, QualType NewResultType)
Change the result type of a function type, preserving sugar such as attributed types.
void setTemplateOrSpecializationInfo(VarDecl *Inst, TemplateOrSpecializationInfo TSI)
bool isTypeAwareOperatorNewOrDelete(const FunctionDecl *FD) const
bool ProtocolCompatibleWithProtocol(ObjCProtocolDecl *lProto, ObjCProtocolDecl *rProto) const
ProtocolCompatibleWithProtocol - return 'true' if 'lProto' is in the inheritance hierarchy of 'rProto...
TypedefDecl * buildImplicitTypedef(QualType T, StringRef Name) const
Create a new implicit TU-level typedef declaration.
QualType getCanonicalTemplateSpecializationType(ElaboratedTypeKeyword Keyword, TemplateName T, ArrayRef< TemplateArgument > CanonicalArgs) const
QualType getObjCInterfaceType(const ObjCInterfaceDecl *Decl, ObjCInterfaceDecl *PrevDecl=nullptr) const
getObjCInterfaceType - Return the unique reference to the type for the specified ObjC interface decl.
void adjustObjCTypeParamBoundType(const ObjCTypeParamDecl *Orig, ObjCTypeParamDecl *New) const
QualType getBlockPointerType(QualType T) const
Return the uniqued reference to the type for a block of the specified type.
TemplateArgument getCanonicalTemplateArgument(const TemplateArgument &Arg) const
Retrieve the "canonical" template argument.
QualType getAutoRRefDeductType() const
C++11 deduction pattern for 'auto &&' type.
TypedefDecl * getBuiltinMSVaListDecl() const
Retrieve the C type declaration corresponding to the predefined __builtin_ms_va_list type.
bool ObjCQualifiedIdTypesAreCompatible(const ObjCObjectPointerType *LHS, const ObjCObjectPointerType *RHS, bool ForCompare)
ObjCQualifiedIdTypesAreCompatible - We know that one of lhs/rhs is an ObjCQualifiedIDType.
static CanQualType getCanonicalType(QualType T)
Return the canonical (structural) type corresponding to the specified potentially non-canonical type ...
QualType mergeFunctionTypes(QualType, QualType, bool OfBlockPointer=false, bool Unqualified=false, bool AllowCXX=false, bool IsConditionalOperator=false)
NamedDecl * getInstantiatedFromUsingDecl(NamedDecl *Inst)
If the given using decl Inst is an instantiation of another (possibly unresolved) using decl,...
DeclarationNameTable DeclarationNames
comments::FullComment * cloneFullComment(comments::FullComment *FC, const Decl *D) const
CharUnits getObjCEncodingTypeSize(QualType T) const
Return the size of type T for Objective-C encoding purpose, in characters.
int getIntegerTypeOrder(QualType LHS, QualType RHS) const
Return the highest ranked integer type, see C99 6.3.1.8p1.
const TemplateArgument * getDefaultTemplateArgumentOrNone(const NamedDecl *P) const
Return the default argument of a template parameter, if one exists.
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.
RawComment * getRawCommentNoCache(RawCommentLookupKey Key) const
Return the documentation comment attached to a given declaration or macro, without looking into cache...
QualType getRealTypeForBitwidth(unsigned DestWidth, FloatModeKind ExplicitType) const
getRealTypeForBitwidth - sets floating point QualTy according to specified bitwidth.
QualType getFunctionNoProtoType(QualType ResultTy, const FunctionType::ExtInfo &Info) const
Return a K&R style C function type like 'int()'.
ASTMutationListener * getASTMutationListener() const
Retrieve a pointer to the AST mutation listener associated with this AST context, if any.
unsigned NumImplicitCopyAssignmentOperatorsDeclared
The number of implicitly-declared copy assignment operators for which declarations were built.
uint64_t getTargetNullPointerValue(QualType QT) const
Get target-dependent integer value for null pointer which is used for constant folding.
unsigned getTypeUnadjustedAlign(QualType T) const
Return the ABI-specified natural alignment of a (complete) type T, before alignment adjustments,...
unsigned char getFixedPointIBits(QualType Ty) const
QualType getSubstBuiltinTemplatePack(const TemplateArgument &ArgPack)
QualType getCorrespondingSignedFixedPointType(QualType Ty) const
IntrusiveRefCntPtr< ExternalASTSource > ExternalSource
QualType getArrayParameterType(QualType Ty) const
Return the uniqued reference to a specified array parameter type from the original array type.
QualType getCountAttributedType(QualType T, Expr *CountExpr, bool CountInBytes, bool OrNull, ArrayRef< TypeCoupledDeclRefInfo > DependentDecls) const
const ASTRecordLayout & getASTRecordLayout(const RecordDecl *D) const
Get or compute information about the layout of the specified record (struct/union/class) D,...
unsigned NumImplicitDestructorsDeclared
The number of implicitly-declared destructors for which declarations were built.
bool mergeExtParameterInfo(const FunctionProtoType *FirstFnType, const FunctionProtoType *SecondFnType, bool &CanUseFirst, bool &CanUseSecond, SmallVectorImpl< FunctionProtoType::ExtParameterInfo > &NewParamInfos)
This function merges the ExtParameterInfo lists of two functions.
bool ObjCQualifiedClassTypesAreCompatible(const ObjCObjectPointerType *LHS, const ObjCObjectPointerType *RHS)
ObjCQualifiedClassTypesAreCompatible - compare Class<pr,...> and Class<pr1, ...>.
bool shouldExternalize(const Decl *D) const
Whether a C++ static variable or CUDA/HIP kernel should be externalized.
bool propertyTypesAreCompatible(QualType, QualType)
void setInstantiatedFromUsingShadowDecl(UsingShadowDecl *Inst, UsingShadowDecl *Pattern)
QualType getDependentVectorType(QualType VectorType, Expr *SizeExpr, SourceLocation AttrLoc, VectorKind VecKind) const
Return the unique reference to the type for a dependently sized vector of the specified element type.
CanQualType SatLongAccumTy
CanQualType getIntMaxType() const
Return the unique type for "intmax_t" (C99 7.18.1.5), defined in <stdint.h>.
QualType getVectorType(QualType VectorType, unsigned NumElts, VectorKind VecKind) const
Return the unique reference to a vector type of the specified element type and size.
OpenCLTypeKind getOpenCLTypeKind(const Type *T) const
Map an AST Type to an OpenCLTypeKind enum value.
TemplateName getDependentTemplateName(const DependentTemplateStorage &Name) const
Retrieve the template name that represents a dependent template name such as MetaFun::template operat...
ArrayRef< Decl * > getModuleInitializers(Module *M)
Get the initializations to perform when importing a module, if any.
void getObjCEncodingForTypeQualifier(Decl::ObjCDeclQualifier QT, std::string &S) const
Put the string version of the type qualifiers QT into S.
unsigned getPreferredTypeAlign(QualType T) const
Return the "preferred" alignment of the specified type T for the current target, in bits.
std::string getObjCEncodingForMethodDecl(const ObjCMethodDecl *Decl, bool Extended=false) const
Emit the encoded type for the method declaration Decl into S.
bool DeclMustBeEmitted(const Decl *D)
Determines if the decl can be CodeGen'ed or deserialized from PCH lazily, only when used; this is onl...
CanQualType OMPArrayShapingTy
ASTContext(LangOptions &LOpts, SourceManager &SM, IdentifierTable &idents, SelectorTable &sels, Builtin::Context &builtins, TranslationUnitKind TUKind)
QualType getReadPipeType(QualType T) const
Return a read_only pipe type for the specified type.
std::string getObjCEncodingForPropertyDecl(const ObjCPropertyDecl *PD, const Decl *Container) const
getObjCEncodingForPropertyDecl - Return the encoded type for this method declaration.
TemplateName getCanonicalTemplateName(TemplateName Name, bool IgnoreDeduced=false) const
Retrieves the "canonical" template name that refers to a given template.
unsigned getStaticLocalNumber(const VarDecl *VD) const
void addComment(const RawComment &RC)
void getLegacyIntegralTypeEncoding(QualType &t) const
getLegacyIntegralTypeEncoding - Another legacy compatibility encoding: 32-bit longs are encoded as 'l...
bool isSameTypeConstraint(const TypeConstraint *XTC, const TypeConstraint *YTC) const
Determine whether two type contraint are similar enough that they could used in declarations of the s...
void setRelocationInfoForCXXRecord(const CXXRecordDecl *, CXXRecordDeclRelocationInfo)
QualType getSubstTemplateTypeParmType(QualType Replacement, Decl *AssociatedDecl, unsigned Index, UnsignedOrNone PackIndex, bool Final) const
Retrieve a substitution-result type.
RecordDecl * buildImplicitRecord(StringRef Name, RecordDecl::TagKind TK=RecordDecl::TagKind::Struct) const
Create a new implicit TU-level CXXRecordDecl or RecordDecl declaration.
QualType getPointerType(QualType T) const
Return the uniqued reference to the type for a pointer to the specified type.
const CXXMethodDecl * getCurrentKeyFunction(const CXXRecordDecl *RD)
Get our current best idea for the key function of the given record decl, or nullptr if there isn't on...
CanQualType UnsignedLongFractTy
QualType mergeTagDefinitions(QualType, QualType)
void setClassMaybeNeedsVectorDeletingDestructor(const CXXRecordDecl *RD)
overridden_method_range overridden_methods(const CXXMethodDecl *Method) const
void setIsTypeAwareOperatorNewOrDelete(const FunctionDecl *FD, bool IsTypeAware)
QualType getDependentBitIntType(bool Unsigned, Expr *BitsExpr) const
Return a dependent bit-precise integer type with the specified signedness and bit count.
void setObjCImplementation(ObjCInterfaceDecl *IFaceD, ObjCImplementationDecl *ImplD)
Set the implementation of ObjCInterfaceDecl.
StringRef getCUIDHash() const
bool isMSStaticDataMemberInlineDefinition(const VarDecl *VD) const
Returns true if this is an inline-initialized static data member which is treated as a definition for...
bool canAssignObjCInterfaces(const ObjCObjectPointerType *LHSOPT, const ObjCObjectPointerType *RHSOPT)
canAssignObjCInterfaces - Return true if the two interface types are compatible for assignment from R...
QualType getReferenceQualifiedType(const Expr *e) const
getReferenceQualifiedType - Given an expr, will return the type for that expression,...
bool hasSameFunctionTypeIgnoringExceptionSpec(QualType T, QualType U) const
Determine whether two function types are the same, ignoring exception specifications in cases where t...
QualType getBlockDescriptorExtendedType() const
Gets the struct used to keep track of the extended descriptor for pointer to blocks.
QualType getLValueReferenceType(QualType T, bool SpelledAsLValue=true) const
Return the uniqued reference to the type for an lvalue reference to the specified type.
bool QIdProtocolsAdoptObjCObjectProtocols(QualType QT, ObjCInterfaceDecl *IDecl)
QIdProtocolsAdoptObjCObjectProtocols - Checks that protocols in QT's qualified-id protocol list adopt...
FunctionProtoType::ExceptionSpecInfo mergeExceptionSpecs(FunctionProtoType::ExceptionSpecInfo ESI1, FunctionProtoType::ExceptionSpecInfo ESI2, SmallVectorImpl< QualType > &ExceptionTypeStorage, bool AcceptDependent) const
llvm::PointerUnion< const Decl *, const MacroInfo * > RawCommentLookupKey
Key used to look up the raw comment attached to a declaration or macro.
void addLazyModuleInitializers(Module *M, ArrayRef< GlobalDeclID > IDs)
bool isSameConstraintExpr(const Expr *XCE, const Expr *YCE) const
Determine whether two 'requires' expressions are similar enough that they may be used in re-declarati...
bool BlockRequiresCopying(QualType Ty, const VarDecl *D)
Returns true iff we need copy/dispose helpers for the given type.
QualType getUsingType(ElaboratedTypeKeyword Keyword, NestedNameSpecifier Qualifier, const UsingShadowDecl *D, QualType UnderlyingType=QualType()) const
std::optional< QualType > tryMergeOverflowBehaviorTypes(QualType LHS, QualType RHS, bool OfBlockPointer, bool Unqualified, bool BlockReturnType, bool IsConditionalOperator)
Attempts to merge two types that may be OverflowBehaviorTypes.
CanQualType OMPIteratorTy
Builtin::Context & BuiltinInfo
QualType getConstantArrayType(QualType EltTy, const llvm::APInt &ArySize, const Expr *SizeExpr, ArraySizeModifier ASM, unsigned IndexTypeQuals) const
Return the unique reference to the type for a constant array of the specified element type.
void addModuleInitializer(Module *M, Decl *Init)
Add a declaration to the list of declarations that are initialized for a module.
const LangOptions & getLangOpts() const
QualType getFunctionTypeWithoutPtrSizes(QualType T)
Get a function type and produce the equivalent function type where pointer size address spaces in the...
uint64_t lookupFieldBitOffset(const ObjCInterfaceDecl *OID, const ObjCIvarDecl *Ivar) const
Get the offset of an ObjCIvarDecl in bits.
SelectorTable & Selectors
bool isTypeIgnoredBySanitizer(const SanitizerMask &Mask, const QualType &Ty) const
Check if a type can have its sanitizer instrumentation elided based on its presence within an ignorel...
unsigned getMinGlobalAlignOfVar(uint64_t Size, const VarDecl *VD) const
Return the minimum alignment as specified by the target.
RawCommentList Comments
All comments in this translation unit.
bool isSameDefaultTemplateArgument(const NamedDecl *X, const NamedDecl *Y) const
Determine whether two default template arguments are similar enough that they may be used in declarat...
QualType applyObjCProtocolQualifiers(QualType type, ArrayRef< ObjCProtocolDecl * > protocols, bool &hasError, bool allowOnPointerType=false) const
Apply Objective-C protocol qualifiers to the given type.
QualType getMacroQualifiedType(QualType UnderlyingTy, const IdentifierInfo *MacroII) const
QualType removePtrSizeAddrSpace(QualType T) const
Remove the existing address space on the type if it is a pointer size address space and return the ty...
bool areLaxCompatibleRVVTypes(QualType FirstType, QualType SecondType)
Return true if the given vector types are lax-compatible RISC-V vector types as defined by -flax-vect...
CanQualType SatShortFractTy
QualType getDecayedType(QualType T) const
Return the uniqued reference to the decayed version of the given type.
CallingConv getDefaultCallingConvention(bool IsVariadic, bool IsCXXMethod) const
Retrieves the default calling convention for the current context.
bool canBindObjCObjectType(QualType To, QualType From)
TemplateTemplateParmDecl * insertCanonicalTemplateTemplateParmDeclInternal(TemplateTemplateParmDecl *CanonTTP) const
int getFloatingTypeSemanticOrder(QualType LHS, QualType RHS) const
Compare the rank of two floating point types as above, but compare equal if both types have the same ...
QualType getUIntPtrType() const
Return a type compatible with "uintptr_t" (C99 7.18.1.4), as defined by the target.
void setParameterIndex(const ParmVarDecl *D, unsigned index)
Used by ParmVarDecl to store on the side the index of the parameter when it exceeds the size of the n...
QualType getFunctionTypeWithExceptionSpec(QualType Orig, const FunctionProtoType::ExceptionSpecInfo &ESI) const
Get a function type and produce the equivalent function type with the specified exception specificati...
QualType getDependentNameType(ElaboratedTypeKeyword Keyword, NestedNameSpecifier NNS, const IdentifierInfo *Name) const
Qualifiers::GC getObjCGCAttrKind(QualType Ty) const
Return one of the GCNone, Weak or Strong Objective-C garbage collection attributes.
bool hasUniqueObjectRepresentations(QualType Ty, bool CheckIfTriviallyCopyable=true) const
Return true if the specified type has unique object representations according to (C++17 [meta....
CanQualType getCanonicalSizeType() const
bool typesAreBlockPointerCompatible(QualType, QualType)
CanQualType SatUnsignedAccumTy
bool useAbbreviatedThunkName(GlobalDecl VirtualMethodDecl, StringRef MangledName)
const ASTRecordLayout & getASTObjCInterfaceLayout(const ObjCInterfaceDecl *D) const
Get or compute information about the layout of the specified Objective-C interface.
void forEachMultiversionedFunctionVersion(const FunctionDecl *FD, llvm::function_ref< void(FunctionDecl *)> Pred) const
Visits all versions of a multiversioned function with the passed predicate.
void setInstantiatedFromUsingEnumDecl(UsingEnumDecl *Inst, UsingEnumDecl *Pattern)
Remember that the using enum decl Inst is an instantiation of the using enum decl Pattern of a class ...
QualType getAutoType(DeducedKind DK, QualType DeducedAsType, AutoTypeKeyword Keyword, TemplateDecl *TypeConstraintConcept=nullptr, ArrayRef< TemplateArgument > TypeConstraintArgs={}) const
C++11 deduced auto type.
QualType getBaseElementType(const ArrayType *VAT) const
Return the innermost element type of an array type.
llvm::SetVector< const VarDecl * > CUDADeviceVarODRUsedByHost
Keep track of CUDA/HIP device-side variables ODR-used by host code.
QualType getPointerDiffType() const
Return the unique type for "ptrdiff_t" (C99 7.17) defined in <stddef.h>.
QualType getSignatureParameterType(QualType T) const
Retrieve the parameter type as adjusted for use in the signature of a function, decaying array and fu...
CanQualType ArraySectionTy
CanQualType ObjCBuiltinIdTy
overridden_cxx_method_iterator overridden_methods_end(const CXXMethodDecl *Method) const
VTableContextBase * getVTableContext()
ComparisonCategories CompCategories
Types and expressions required to build C++2a three-way comparisons using operator<=>,...
int getFloatingTypeOrder(QualType LHS, QualType RHS) const
Compare the rank of the two specified floating point types, ignoring the domain of the type (i....
unsigned CountNonClassIvars(const ObjCInterfaceDecl *OI) const
ObjCPropertyImplDecl * getObjCPropertyImplDeclForPropertyDecl(const ObjCPropertyDecl *PD, const Decl *Container) const
bool isNearlyEmpty(const CXXRecordDecl *RD) const
PointerAuthQualifier getObjCMemberSelTypePtrAuth()
void 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
CanQualType UnsignedFractTy
GVALinkage GetGVALinkageForFunction(const FunctionDecl *FD) const
QualType mergeFunctionParameterTypes(QualType, QualType, bool OfBlockPointer=false, bool Unqualified=false)
mergeFunctionParameterTypes - merge two types which appear as function parameter types
void addOverriddenMethod(const CXXMethodDecl *Method, const CXXMethodDecl *Overridden)
Note that the given C++ Method overrides the given Overridden method.
TemplateTemplateParmDecl * findCanonicalTemplateTemplateParmDeclInternal(TemplateTemplateParmDecl *TTP) const
const TargetInfo * getAuxTargetInfo() const
CanQualType ObjCBuiltinClassTy
unsigned NumImplicitDefaultConstructorsDeclared
The number of implicitly-declared default constructors for which declarations were built.
CanQualType UnresolvedTemplateTy
OMPTraitInfo & getNewOMPTraitInfo()
Return a new OMPTraitInfo object owned by this context.
friend class CXXRecordDecl
CanQualType UnsignedLongTy
void DeepCollectObjCIvars(const ObjCInterfaceDecl *OI, bool leafClass, SmallVectorImpl< const ObjCIvarDecl * > &Ivars) const
DeepCollectObjCIvars - This routine first collects all declared, but not synthesized,...
bool computeBestEnumTypes(bool IsPacked, unsigned NumNegativeBits, unsigned NumPositiveBits, QualType &BestType, QualType &BestPromotionType)
Compute BestType and BestPromotionType for an enum based on the highest number of negative and positi...
llvm::APFixedPoint getFixedPointMin(QualType Ty) const
TypeSourceInfo * getTrivialTypeSourceInfo(QualType T, SourceLocation Loc=SourceLocation()) const
Allocate a TypeSourceInfo where all locations have been initialized to a given location,...
QualType adjustType(QualType OldType, llvm::function_ref< QualType(QualType)> Adjust) const
Rebuild a type, preserving any existing type sugar.
void addedLocalImportDecl(ImportDecl *Import)
Notify the AST context that a new import declaration has been parsed or implicitly created within thi...
const TranslationUnitKind TUKind
CanQualType UnsignedLongAccumTy
QualType AutoRRefDeductTy
RawComment * getRawCommentNoCacheImpl(RawCommentLookupKey Key, const SourceLocation RepresentativeLoc, const std::map< unsigned, RawComment * > &CommentsInFile) const
TypeInfo getTypeInfo(const Type *T) const
Get the size and alignment of the specified complete type in bits.
QualType getStringLiteralArrayType(QualType EltTy, unsigned Length) const
Return a type for a constant array for a string literal of the specified element type and length.
QualType getCorrespondingSaturatedType(QualType Ty) const
bool arePFPFieldsTriviallyCopyable(const RecordDecl *RD) const
Returns whether this record's PFP fields (if any) are trivially copyable (i.e.
bool isSameEntity(const NamedDecl *X, const NamedDecl *Y) const
Determine whether the two declarations refer to the same entity.
QualType getSubstTemplateTypeParmPackType(Decl *AssociatedDecl, unsigned Index, bool Final, const TemplateArgument &ArgPack)
CanQualType BoundMemberTy
CanQualType SatUnsignedShortFractTy
QualType removeAddrSpaceQualType(QualType T) const
Remove any existing address space on the type and returns the type with qualifiers intact (or that's ...
bool hasSameFunctionTypeIgnoringParamABI(QualType T, QualType U) const
Determine if two function types are the same, ignoring parameter ABI annotations.
TypedefDecl * getInt128Decl() const
Retrieve the declaration for the 128-bit signed integer type.
unsigned getOpenMPDefaultSimdAlign(QualType T) const
Get default simd alignment of the specified complete type in bits.
QualType getObjCSuperType() const
Returns the C struct type for objc_super.
QualType getBlockDescriptorType() const
Gets the struct used to keep track of the descriptor for pointer to blocks.
bool CommentsLoaded
True if comments are already loaded from ExternalASTSource.
BlockVarCopyInit getBlockVarCopyInit(const VarDecl *VD) const
Get the copy initialization expression of the VarDecl VD, or nullptr if none exists.
QualType getHLSLInlineSpirvType(uint32_t Opcode, uint32_t Size, uint32_t Alignment, ArrayRef< SpirvOperand > Operands)
unsigned NumImplicitMoveConstructorsDeclared
The number of implicitly-declared move constructors for which declarations were built.
bool isInSameModule(const Module *M1, const Module *M2) const
If the two module M1 and M2 are in the same module.
unsigned NumImplicitCopyConstructorsDeclared
The number of implicitly-declared copy constructors for which declarations were built.
QualType getLeastIntTypeForBitwidth(unsigned DestWidth, unsigned Signed) const
CanQualType PseudoObjectTy
QualType getWebAssemblyExternrefType() const
Return a WebAssembly externref type.
void setTraversalScope(const std::vector< Decl * > &)
CharUnits getTypeUnadjustedAlignInChars(QualType T) const
getTypeUnadjustedAlignInChars - Return the ABI-specified alignment of a type, in characters,...
QualType getAdjustedType(QualType Orig, QualType New) const
Return the uniqued reference to a type adjusted from the original type to a new type.
friend class NestedNameSpecifier
MangleContext * cudaNVInitDeviceMC()
unsigned getAlignOfGlobalVar(QualType T, const VarDecl *VD) const
Return the alignment in bits that should be given to a global variable with type T.
bool areCompatibleOverflowBehaviorTypes(QualType LHS, QualType RHS)
Return true if two OverflowBehaviorTypes are compatible for assignment.
TypeInfoChars getTypeInfoDataSizeInChars(QualType T) const
MangleNumberingContext & getManglingNumberContext(const DeclContext *DC)
Retrieve the context for computing mangling numbers in the given DeclContext.
comments::FullComment * getLocalCommentForDeclUncached(const Decl *D) const
Return parsed documentation comment attached to a given declaration.
unsigned NumImplicitDestructors
The number of implicitly-declared destructors.
QualType getQualifiedType(SplitQualType split) const
Un-split a SplitQualType.
bool isAlignmentRequired(const Type *T) const
Determine if the alignment the type has was required using an alignment attribute.
bool areComparableObjCPointerTypes(QualType LHS, QualType RHS)
MangleContext * createDeviceMangleContext(const TargetInfo &T)
Creates a device mangle context to correctly mangle lambdas in a mixed architecture compile by settin...
CharUnits getExnObjectAlignment() const
Return the alignment (in bytes) of the thrown exception object.
QualType getObjCObjectPointerType(QualType OIT) const
Return a ObjCObjectPointerType type for the given ObjCObjectType.
ASTMutationListener * Listener
CanQualType ObjCBuiltinBoolTy
TypeInfoChars getTypeInfoInChars(const Type *T) const
QualType getPredefinedSugarType(PredefinedSugarType::Kind KD) const
QualType getObjCObjectType(QualType Base, ObjCProtocolDecl *const *Protocols, unsigned NumProtocols) const
Legacy interface: cannot provide type arguments or __kindof.
TemplateParamObjectDecl * getTemplateParamObjectDecl(QualType T, const APValue &V) const
Return the template parameter object of the given type with the given value.
interp::Context & getInterpContext() const
Returns the clang bytecode interpreter context.
CharUnits getDeclAlign(const Decl *D, bool ForAlignof=false) const
Return a conservative estimate of the alignment of the specified decl D.
int64_t toBits(CharUnits CharSize) const
Convert a size in characters to a size in bits.
TemplateTemplateParmDecl * getCanonicalTemplateTemplateParmDecl(TemplateTemplateParmDecl *TTP) const
Canonicalize the given TemplateTemplateParmDecl.
CanQualType OCLClkEventTy
void adjustExceptionSpec(FunctionDecl *FD, const FunctionProtoType::ExceptionSpecInfo &ESI, bool AsWritten=false)
Change the exception specification on a function once it is delay-parsed, instantiated,...
TypedefDecl * getUInt128Decl() const
Retrieve the declaration for the 128-bit unsigned integer type.
bool hasPFPFields(QualType Ty) const
const clang::PrintingPolicy & getPrintingPolicy() const
void ResetObjCLayout(const ObjCInterfaceDecl *D)
ArrayRef< Module * > getModulesWithMergedDefinition(const NamedDecl *Def)
Get the additional modules in which the definition Def has been merged.
llvm::FixedPointSemantics getFixedPointSemantics(QualType Ty) const
CanQualType SatUnsignedShortAccumTy
QualType mergeTypes(QualType, QualType, bool OfBlockPointer=false, bool Unqualified=false, bool BlockReturnType=false, bool IsConditionalOperator=false)
CharUnits getAlignOfGlobalVarInChars(QualType T, const VarDecl *VD) const
Return the alignment in characters that should be given to a global variable with type T.
const ObjCMethodDecl * getObjCMethodRedeclaration(const ObjCMethodDecl *MD) const
Get the duplicate declaration of a ObjCMethod in the same interface, or null if none exists.
QualType getPackIndexingType(QualType Pattern, Expr *IndexExpr, bool FullySubstituted=false, ArrayRef< QualType > Expansions={}, UnsignedOrNone Index=std::nullopt) const
static bool isObjCNSObjectType(QualType Ty)
Return true if this is an NSObject object with its NSObject attribute set.
GVALinkage GetGVALinkageForVariable(const VarDecl *VD) const
llvm::PointerUnion< VarTemplateDecl *, MemberSpecializationInfo * > TemplateOrSpecializationInfo
A type synonym for the TemplateOrInstantiation mapping.
UsingShadowDecl * getInstantiatedFromUsingShadowDecl(UsingShadowDecl *Inst)
QualType getVariableArrayType(QualType EltTy, Expr *NumElts, ArraySizeModifier ASM, unsigned IndexTypeQuals) const
Return a non-unique reference to the type for a variable array of the specified element type.
QualType getObjCIdType() const
Represents the Objective-CC id type.
Decl * getVaListTagDecl() const
Retrieve the C type declaration corresponding to the predefined __va_list_tag type used to help defin...
QualType getUnsignedWCharType() const
Return the type of "unsigned wchar_t".
QualType getFunctionTypeWithoutParamABIs(QualType T) const
Get or construct a function type that is equivalent to the input type except that the parameter ABI a...
QualType getCorrespondingUnsaturatedType(QualType Ty) const
comments::FullComment * getCommentForDecl(const Decl *D, const Preprocessor *PP) const
Return parsed documentation comment attached to a given declaration.
TemplateArgument getInjectedTemplateArg(NamedDecl *ParamDecl) const
unsigned getTargetDefaultAlignForAttributeAligned() const
Return the default alignment for attribute((aligned)) on this target, to be used if no alignment valu...
const ArrayType * getAsArrayType(QualType T) const
Type Query functions.
llvm::DenseMap< CanQualType, SYCLKernelInfo > SYCLKernels
Map of SYCL kernels indexed by the unique type used to name the kernel.
bool isSameTemplateParameterList(const TemplateParameterList *X, const TemplateParameterList *Y) const
Determine whether two template parameter lists are similar enough that they may be used in declaratio...
QualType getWritePipeType(QualType T) const
Return a write_only pipe type for the specified type.
QualType getTypeDeclType(ElaboratedTypeKeyword Keyword, NestedNameSpecifier Qualifier, const TypeDecl *Decl) const
bool isDestroyingOperatorDelete(const FunctionDecl *FD) const
uint64_t getTypeSize(QualType T) const
Return the size of the specified (complete) type T, in bits.
CanQualType UnsignedInt128Ty
ObjCInterfaceDecl * getObjCProtocolDecl() const
Retrieve the Objective-C class declaration corresponding to the predefined Protocol class.
unsigned NumImplicitDefaultConstructors
The number of implicitly-declared default constructors.
CharUnits getTypeSizeInChars(QualType T) const
Return the size of the specified (complete) type T, in characters.
llvm::iterator_range< overridden_cxx_method_iterator > overridden_method_range
unsigned NumImplicitMoveAssignmentOperatorsDeclared
The number of implicitly-declared move assignment operators for which declarations were built.
void setManglingNumber(const NamedDecl *ND, unsigned Number)
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
ArrayRef< ExplicitInstantiationDecl * > getExplicitInstantiationDecls(const NamedDecl *Spec) const
Get all ExplicitInstantiationDecls for a given specialization.
bool canBuiltinBeRedeclared(const FunctionDecl *) const
Return whether a declaration to a builtin is allowed to be overloaded/redeclared.
CanQualType UnsignedIntTy
unsigned NumImplicitMoveConstructors
The number of implicitly-declared move constructors.
QualType getTypedefType(ElaboratedTypeKeyword Keyword, NestedNameSpecifier Qualifier, const TypedefNameDecl *Decl, QualType UnderlyingType=QualType(), std::optional< bool > TypeMatchesDeclOrNone=std::nullopt) const
Return the unique reference to the type for the specified typedef-name decl.
QualType getObjCTypeParamType(const ObjCTypeParamDecl *Decl, ArrayRef< ObjCProtocolDecl * > protocols) const
void getObjCEncodingForMethodParameter(Decl::ObjCDeclQualifier QT, QualType T, std::string &S, bool Extended) const
getObjCEncodingForMethodParameter - Return the encoded type for a single method parameter or return t...
void addDeclaratorForUnnamedTagDecl(TagDecl *TD, DeclaratorDecl *DD)
unsigned overridden_methods_size(const CXXMethodDecl *Method) const
std::string getObjCEncodingForBlock(const BlockExpr *blockExpr) const
Return the encoded type for this block declaration.
QualType getTemplateSpecializationType(ElaboratedTypeKeyword Keyword, TemplateName T, ArrayRef< TemplateArgument > SpecifiedArgs, ArrayRef< TemplateArgument > CanonicalArgs, QualType Underlying=QualType()) const
TypeSourceInfo * CreateTypeSourceInfo(QualType T, unsigned Size=0) const
Allocate an uninitialized TypeSourceInfo.
TemplateName getQualifiedTemplateName(NestedNameSpecifier Qualifier, bool TemplateKeyword, TemplateName Template) const
Retrieve the template name that represents a qualified template name such as std::vector.
bool isSameAssociatedConstraint(const AssociatedConstraint &ACX, const AssociatedConstraint &ACY) const
Determine whether two 'requires' expressions are similar enough that they may be used in re-declarati...
QualType getExceptionObjectType(QualType T) const
void setInstantiatedFromStaticDataMember(VarDecl *Inst, VarDecl *Tmpl, TemplateSpecializationKind TSK, SourceLocation PointOfInstantiation=SourceLocation())
Note that the static data member Inst is an instantiation of the static data member template Tmpl of ...
FieldDecl * getInstantiatedFromUnnamedFieldDecl(FieldDecl *Field) const
DeclaratorDecl * getDeclaratorForUnnamedTagDecl(const TagDecl *TD)
bool ObjCObjectAdoptsQTypeProtocols(QualType QT, ObjCInterfaceDecl *Decl)
ObjCObjectAdoptsQTypeProtocols - Checks that protocols in IC's protocol list adopt all protocols in Q...
CanQualType UnsignedLongLongTy
QualType GetBuiltinType(unsigned ID, GetBuiltinTypeError &Error, unsigned *IntegerConstantArgs=nullptr) const
Return the type for the specified builtin.
CanQualType OCLReserveIDTy
bool isSameTemplateParameter(const NamedDecl *X, const NamedDecl *Y) const
Determine whether two template parameters are similar enough that they may be used in declarations of...
void registerSYCLEntryPointFunction(FunctionDecl *FD)
Generates and stores SYCL kernel metadata for the provided SYCL kernel entry point function.
QualType getArrayDecayedType(QualType T) const
Return the properly qualified result of decaying the specified array type to a pointer.
overridden_cxx_method_iterator overridden_methods_begin(const CXXMethodDecl *Method) const
CanQualType UnsignedShortTy
FunctionDecl * getOperatorDeleteForVDtor(const CXXDestructorDecl *Dtor, OperatorDeleteKind K) const
unsigned getTypeAlignIfKnown(QualType T, bool NeedsPreferredAlignment=false) const
Return the alignment of a type, in bits, or 0 if the type is incomplete and we cannot determine the a...
void UnwrapSimilarArrayTypes(QualType &T1, QualType &T2, bool AllowPiMismatch=true) const
Attempt to unwrap two types that may both be array types with the same bound (or both be array types ...
bool isRepresentableIntegerValue(llvm::APSInt &Value, QualType T)
Determine whether the given integral value is representable within the given type T.
bool AtomicUsesUnsupportedLibcall(const AtomicExpr *E) const
QualType getFunctionType(QualType ResultTy, ArrayRef< QualType > Args, const FunctionProtoType::ExtProtoInfo &EPI) const
Return a normal function type with a typed argument list.
llvm::DenseMap< RawCommentLookupKey, const RawComment * > RawComments
Mapping from declaration or macro to directly attached comment.
const SYCLKernelInfo & getSYCLKernelInfo(QualType T) const
Given a type used as a SYCL kernel name, returns a reference to the metadata generated from the corre...
bool canAssignObjCInterfacesInBlockPointer(const ObjCObjectPointerType *LHSOPT, const ObjCObjectPointerType *RHSOPT, bool BlockReturnType)
canAssignObjCInterfacesInBlockPointer - This routine is specifically written for providing type-safet...
CanQualType SatUnsignedLongFractTy
QualType getMemberPointerType(QualType T, NestedNameSpecifier Qualifier, const CXXRecordDecl *Cls) const
Return the uniqued reference to the type for a member pointer to the specified type in the specified ...
static bool hasSameType(QualType T1, QualType T2)
Determine whether the given types T1 and T2 are equivalent.
const CXXConstructorDecl * getCopyConstructorForExceptionObject(CXXRecordDecl *RD)
QualType getDependentAddressSpaceType(QualType PointeeType, Expr *AddrSpaceExpr, SourceLocation AttrLoc) const
QualType getTagType(ElaboratedTypeKeyword Keyword, NestedNameSpecifier Qualifier, const TagDecl *TD, bool OwnsTag) const
QualType getPromotedIntegerType(QualType PromotableType) const
Return the type that PromotableType will promote to: C99 6.3.1.1p2, assuming that PromotableType is a...
CanQualType getMSGuidType() const
Retrieve the implicitly-predeclared 'struct _GUID' type.
const VariableArrayType * getAsVariableArrayType(QualType T) const
QualType getUnaryTransformType(QualType BaseType, QualType UnderlyingType, UnaryTransformType::UTTKind UKind) const
Unary type transforms.
void setExternalSource(IntrusiveRefCntPtr< ExternalASTSource > Source)
Attach an external AST source to the AST context.
const ObjCInterfaceDecl * getObjContainingInterface(const NamedDecl *ND) const
Returns the Objective-C interface that ND belongs to if it is an Objective-C method/property/ivar etc...
StringLiteral * getPredefinedStringLiteralFromCache(StringRef Key) const
Return a string representing the human readable name for the specified function declaration or file n...
CanQualType getCanonicalUnresolvedUsingType(const UnresolvedUsingTypenameDecl *D) const
bool hasSimilarType(QualType T1, QualType T2) const
Determine if two types are similar, according to the C++ rules.
llvm::APFixedPoint getFixedPointMax(QualType Ty) const
QualType getComplexType(QualType T) const
Return the uniqued reference to the type for a complex number with the specified element type.
bool classMaybeNeedsVectorDeletingDestructor(const CXXRecordDecl *RD)
QualType getTemplateTypeParmType(int Depth, int Index, bool ParameterPack, TemplateTypeParmDecl *ParmDecl=nullptr) const
Retrieve the template type parameter type for a template parameter or parameter pack with the given d...
bool hasDirectOwnershipQualifier(QualType Ty) const
Return true if the type has been explicitly qualified with ObjC ownership.
Qualifiers::ObjCLifetime getInnerObjCOwnership(QualType T) const
Recurses in pointer/array types until it finds an Objective-C retainable type and returns its ownersh...
void addCopyConstructorForExceptionObject(CXXRecordDecl *RD, CXXConstructorDecl *CD)
void deduplicateMergedDefinitionsFor(NamedDecl *ND)
Clean up the merged definition list.
DiagnosticsEngine & getDiagnostics() const
QualType getAdjustedParameterType(QualType T) const
Perform adjustment on the parameter type of a function.
void recordOffsetOfEvaluation(const OffsetOfExpr *E)
QualType getSizeType() const
Return the unique type for "size_t" (C99 7.17), defined in <stddef.h>.
UnnamedGlobalConstantDecl * getUnnamedGlobalConstantDecl(QualType Ty, const APValue &Value) const
Return a declaration for a uniquified anonymous global constant corresponding to a given APValue.
QualType getExtVectorType(QualType VectorType, unsigned NumElts) const
Return the unique reference to an extended vector type of the specified element type and size.
QualType getUnresolvedUsingType(ElaboratedTypeKeyword Keyword, NestedNameSpecifier Qualifier, const UnresolvedUsingTypenameDecl *D) const
bool areCompatibleVectorTypes(QualType FirstVec, QualType SecondVec)
Return true if the given vector types are of the same unqualified type or if they are equivalent to t...
void getOverriddenMethods(const NamedDecl *Method, SmallVectorImpl< const NamedDecl * > &Overridden) const
Return C++ or ObjC overridden methods for the given Method.
DeclarationNameInfo getNameForTemplate(TemplateName Name, SourceLocation NameLoc) const
bool hasSameTemplateName(const TemplateName &X, const TemplateName &Y, bool IgnoreDeduced=false) const
Determine whether the given template names refer to the same template.
CanQualType SatLongFractTy
const TargetInfo & getTargetInfo() const
void setInstantiatedFromUnnamedFieldDecl(FieldDecl *Inst, FieldDecl *Tmpl)
OBTAssignResult checkOBTAssignmentCompatibility(QualType LHS, QualType RHS)
Check overflow behavior type compatibility for assignments.
CanQualType SatShortAccumTy
QualType getAutoDeductType() const
C++11 deduction pattern for 'auto' type.
unsigned NumImplicitCopyConstructors
The number of implicitly-declared copy constructors.
CharUnits toCharUnitsFromBits(int64_t BitSize) const
Convert a size in bits to a size in characters.
void addExplicitInstantiationDecl(const NamedDecl *Spec, ExplicitInstantiationDecl *EID)
Add an ExplicitInstantiationDecl for a given specialization.
QualType getOverflowBehaviorType(const OverflowBehaviorAttr *Attr, QualType Wrapped) const
CanQualType IncompleteMatrixIdxTy
void getFunctionFeatureMap(llvm::StringMap< bool > &FeatureMap, const FunctionDecl *) const
CanQualType getNSIntegerType() const
QualType getCorrespondingUnsignedType(QualType T) const
void setBlockVarCopyInit(const VarDecl *VD, Expr *CopyExpr, bool CanThrow)
Set the copy initialization expression of a block var decl.
TemplateName getOverloadedTemplateName(UnresolvedSetIterator Begin, UnresolvedSetIterator End) const
Retrieve the template name that corresponds to a non-empty lookup.
bool typesAreCompatible(QualType T1, QualType T2, bool CompareUnqualified=false)
Compatibility predicates used to check assignment expressions.
TemplateName getSubstTemplateTemplateParmPack(const TemplateArgument &ArgPack, Decl *AssociatedDecl, unsigned Index, bool Final) const
TargetCXXABI::Kind getCXXABIKind() const
Return the C++ ABI kind that should be used.
QualType getHLSLAttributedResourceType(QualType Wrapped, QualType Contained, const HLSLAttributedResourceType::Attributes &Attrs)
bool UnwrapSimilarTypes(QualType &T1, QualType &T2, bool AllowPiMismatch=true) const
Attempt to unwrap two types that may be similar (C++ [conv.qual]).
QualType getAddrSpaceQualType(QualType T, LangAS AddressSpace) const
Return the uniqued reference to the type for an address space qualified type with the specified type ...
QualType getSignedSizeType() const
Return the unique signed counterpart of the integer type corresponding to size_t.
ExternalASTSource * getExternalSource() const
Retrieve a pointer to the external AST source associated with this AST context, if any.
uint64_t getConstantArrayElementCount(const ConstantArrayType *CA) const
Return number of constant array elements.
CanQualType SatUnsignedLongAccumTy
QualType getUnconstrainedType(QualType T) const
Remove any type constraints from a template parameter type, for equivalence comparison of template pa...
CanQualType getCanonicalTagType(const TagDecl *TD) const
bool isSameTemplateArgument(const TemplateArgument &Arg1, const TemplateArgument &Arg2) const
Determine whether the given template arguments Arg1 and Arg2 are equivalent.
QualType getTypeOfType(QualType QT, TypeOfKind Kind) const
getTypeOfType - Unlike many "get<Type>" functions, we don't unique TypeOfType nodes.
QualType getCorrespondingSignedType(QualType T) const
QualType mergeObjCGCQualifiers(QualType, QualType)
mergeObjCGCQualifiers - This routine merges ObjC's GC attribute of 'LHS' and 'RHS' attributes and ret...
llvm::DenseMap< const Decl *, const Decl * > CommentlessRedeclChains
Keeps track of redeclaration chains that don't have any comment attached.
uint64_t getArrayInitLoopExprElementCount(const ArrayInitLoopExpr *AILE) const
Return number of elements initialized in an ArrayInitLoopExpr.
unsigned getTargetAddressSpace(LangAS AS) const
std::vector< PFPField > findPFPFields(QualType Ty) const
Returns a list of PFP fields for the given type, including subfields in bases or other fields,...
QualType getIntPtrType() const
Return a type compatible with "intptr_t" (C99 7.18.1.4), as defined by the target.
void mergeDefinitionIntoModule(NamedDecl *ND, Module *M, bool NotifyListeners=true)
Note that the definition ND has been merged into module M, and should be visible whenever M is visibl...
QualType getDependentSizedArrayType(QualType EltTy, Expr *NumElts, ArraySizeModifier ASM, unsigned IndexTypeQuals) const
Return a non-unique reference to the type for a dependently-sized array of the specified element type...
void addTranslationUnitDecl()
void getObjCEncodingForPropertyType(QualType T, std::string &S) const
Emit the Objective-C property type encoding for the given type T into S.
unsigned NumImplicitCopyAssignmentOperators
The number of implicitly-declared copy assignment operators.
void CollectInheritedProtocols(const Decl *CDecl, llvm::SmallPtrSet< ObjCProtocolDecl *, 8 > &Protocols)
CollectInheritedProtocols - Collect all protocols in current class and those inherited by it.
bool isPromotableIntegerType(QualType T) const
More type predicates useful for type checking/promotion.
llvm::DenseMap< const Decl *, const Decl * > RedeclChainComments
Mapping from canonical declaration to the first redeclaration in chain that has a comment attached.
void adjustDeducedFunctionResultType(FunctionDecl *FD, QualType ResultType)
Change the result type of a function type once it is deduced.
QualType getObjCGCQualType(QualType T, Qualifiers::GC gcAttr) const
Return the uniqued reference to the type for an Objective-C gc-qualified type.
QualType getDecltypeType(Expr *e, QualType UnderlyingType) const
C++11 decltype.
std::optional< CXXRecordDeclRelocationInfo > getRelocationInfoForCXXRecord(const CXXRecordDecl *) const
static bool hasSameUnqualifiedType(QualType T1, QualType T2)
Determine whether the given types are equivalent after cvr-qualifiers have been removed.
InlineVariableDefinitionKind getInlineVariableDefinitionKind(const VarDecl *VD) const
Determine whether a definition of this inline variable should be treated as a weak or strong definiti...
const RawComment * getRawCommentForAnyRedecl(RawCommentLookupKey Key, const Decl **OriginalDecl=nullptr) const
Return the documentation comment attached to a given declaration or macro.
TemplateName getSubstTemplateTemplateParm(TemplateName replacement, Decl *AssociatedDecl, unsigned Index, UnsignedOrNone PackIndex, bool Final) const
CanQualType getUIntMaxType() const
Return the unique type for "uintmax_t" (C99 7.18.1.5), defined in <stdint.h>.
uint16_t getPointerAuthVTablePointerDiscriminator(const CXXRecordDecl *RD)
Return the "other" discriminator used for the pointer auth schema used for vtable pointers in instanc...
CharUnits getOffsetOfBaseWithVBPtr(const CXXRecordDecl *RD) const
Loading virtual member pointers using the virtual inheritance model always results in an adjustment u...
LangAS getLangASForBuiltinAddressSpace(unsigned AS) const
bool hasSameFunctionTypeIgnoringPtrSizes(QualType T, QualType U)
Determine whether two function types are the same, ignoring pointer sizes in the return type and para...
void addOperatorDeleteForVDtor(const CXXDestructorDecl *Dtor, FunctionDecl *OperatorDelete, OperatorDeleteKind K) const
unsigned char getFixedPointScale(QualType Ty) const
QualType getIncompleteArrayType(QualType EltTy, ArraySizeModifier ASM, unsigned IndexTypeQuals) const
Return a unique reference to the type for an incomplete array of the specified element type.
QualType getDependentSizedExtVectorType(QualType VectorType, Expr *SizeExpr, SourceLocation AttrLoc) const
QualType DecodeTypeStr(const char *&Str, const ASTContext &Context, ASTContext::GetBuiltinTypeError &Error, bool &RequireICE, bool AllowTypeModifiers) const
TemplateName getAssumedTemplateName(DeclarationName Name) const
Retrieve a template name representing an unqualified-id that has been assumed to name a template for ...
@ GE_Missing_type
Missing a type.
QualType adjustStringLiteralBaseType(QualType StrLTy) const
uint16_t getPointerAuthTypeDiscriminator(QualType T)
Return the "other" type-specific discriminator for the given type.
llvm::SetVector< const FieldDecl * > PFPFieldsWithEvaluatedOffset
bool canonicalizeTemplateArguments(MutableArrayRef< TemplateArgument > Args) const
Canonicalize the given template argument list.
QualType getTypeOfExprType(Expr *E, TypeOfKind Kind) const
C23 feature and GCC extension.
bool isUnaryOverflowPatternExcluded(const UnaryOperator *UO)
QualType getSignedWCharType() const
Return the type of "signed wchar_t".
QualType getUnqualifiedArrayType(QualType T, Qualifiers &Quals) const
Return this type as a completely-unqualified array type, capturing the qualifiers in Quals.
bool hasCvrSimilarType(QualType T1, QualType T2)
Determine if two types are similar, ignoring only CVR qualifiers.
TemplateName getDeducedTemplateName(TemplateName Underlying, DefaultArguments DefaultArgs) const
Represents a TemplateName which had some of its default arguments deduced.
ObjCImplementationDecl * getObjCImplementation(ObjCInterfaceDecl *D)
Get the implementation of the ObjCInterfaceDecl D, or nullptr if none exists.
CanQualType UnsignedAccumTy
void setObjCMethodRedeclaration(const ObjCMethodDecl *MD, const ObjCMethodDecl *Redecl)
void addTypedefNameForUnnamedTagDecl(TagDecl *TD, TypedefNameDecl *TND)
QualType getConstantMatrixType(QualType ElementType, unsigned NumRows, unsigned NumColumns) const
Return the unique reference to the matrix type of the specified element type and size.
const CXXRecordDecl * baseForVTableAuthentication(const CXXRecordDecl *ThisClass) const
Resolve the root record to be used to derive the vtable pointer authentication policy for the specifi...
void cacheRawComment(RawCommentLookupKey Original, const RawComment &Comment) const
Attaches Comment to Original (a declaration or macro), and to its redeclaration chain when Original i...
QualType getVariableArrayDecayedType(QualType Ty) const
Returns a vla type where known sizes are replaced with [*].
void setCFConstantStringType(QualType T)
const SYCLKernelInfo * findSYCLKernelInfo(QualType T) const
Returns a pointer to the metadata generated from the corresponding SYCLkernel entry point if the prov...
unsigned getParameterIndex(const ParmVarDecl *D) const
Used by ParmVarDecl to retrieve on the side the index of the parameter when it exceeds the size of th...
QualType getCommonSugaredType(QualType X, QualType Y, bool Unqualified=false) const
void AddDeallocation(void(*Callback)(void *), void *Data) const
Add a deallocation callback that will be invoked when the ASTContext is destroyed.
AttrVec & getDeclAttrs(const Decl *D)
Retrieve the attributes for the given declaration.
QualType getDeducedTemplateSpecializationType(DeducedKind DK, QualType DeducedAsType, ElaboratedTypeKeyword Keyword, TemplateName Template) const
C++17 deduced class template specialization type.
CXXMethodVector::const_iterator overridden_cxx_method_iterator
unsigned getTypeAlign(QualType T) const
Return the ABI-specified alignment of a (complete) type T, in bits.
QualType mergeTransparentUnionType(QualType, QualType, bool OfBlockPointer=false, bool Unqualified=false)
mergeTransparentUnionType - if T is a transparent union type and a member of T is compatible with Sub...
QualType isPromotableBitField(Expr *E) const
Whether this is a promotable bitfield reference according to C99 6.3.1.1p2, bullet 2 (and GCC extensi...
bool isSentinelNullExpr(const Expr *E)
CanQualType getNSUIntegerType() const
void setIsDestroyingOperatorDelete(const FunctionDecl *FD, bool IsDestroying)
void recordMemberDataPointerEvaluation(const ValueDecl *VD)
uint64_t getCharWidth() const
Return the size of the character type, in bits.
QualType getBitIntType(bool Unsigned, unsigned NumBits) const
Return a bit-precise integer type with the specified signedness and bit count.
unsigned NumImplicitMoveAssignmentOperators
The number of implicitly-declared move assignment operators.
An abstract interface that should be implemented by listeners that want to be notified when an AST en...
virtual ~ASTMutationListener()
virtual void DeducedReturnType(const FunctionDecl *FD, QualType ReturnType)
A function's return type has been deduced.
ASTRecordLayout - This class contains layout information for one RecordDecl, which is a struct/union/...
CharUnits getAlignment() const
getAlignment - Get the record alignment in characters.
const CXXRecordDecl * getBaseSharingVBPtr() const
CharUnits getSize() const
getSize - Get the record size in characters.
uint64_t getFieldOffset(unsigned FieldNo) const
getFieldOffset - Get the offset of the given field index, in bits.
CharUnits getDataSize() const
getDataSize() - Get the record data size, which is the record size without tail padding,...
CharUnits getBaseClassOffset(const CXXRecordDecl *Base) const
getBaseClassOffset - Get the offset, in chars, for the given base class.
CharUnits getVBaseClassOffset(const CXXRecordDecl *VBase) const
getVBaseClassOffset - Get the offset, in chars, for the given base class.
CharUnits getNonVirtualSize() const
getNonVirtualSize - Get the non-virtual size (in chars) of an object, which is the size of the object...
CharUnits getUnadjustedAlignment() const
getUnadjustedAlignment - Get the record alignment in characters, before alignment adjustment.
Represents a type which was implicitly adjusted by the semantic engine for arbitrary reasons.
void Profile(llvm::FoldingSetNodeID &ID)
Represents a loop initializing the elements of an array.
llvm::APInt getArraySize() const
Expr * getSubExpr() const
Get the initializer to use for each array element.
Represents a constant array type that does not decay to a pointer when used as a function parameter.
Represents an array type, per C99 6.7.5.2 - Array Declarators.
ArraySizeModifier getSizeModifier() const
Qualifiers getIndexTypeQualifiers() const
QualType getElementType() const
unsigned getIndexTypeCVRQualifiers() const
A structure for storing the information associated with a name that has been assumed to be a template...
AtomicExpr - Variadic atomic builtins: __atomic_exchange, __atomic_fetch_*, __atomic_load,...
void Profile(llvm::FoldingSetNodeID &ID)
Attr - This represents one attribute.
A fixed int type of a specified bitwidth.
void Profile(llvm::FoldingSetNodeID &ID) const
unsigned getNumBits() const
Represents a block literal declaration, which is like an unnamed FunctionDecl.
BlockExpr - Adaptor class for mixing a BlockDecl with expressions.
void Profile(llvm::FoldingSetNodeID &ID)
Represents the builtin template declaration which is used to implement __make_integer_seq and other b...
static BuiltinTemplateDecl * Create(const ASTContext &C, DeclContext *DC, DeclarationName Name, BuiltinTemplateKind BTK)
This class is used for builtin types like 'int'.
Holds information about both target-independent and target-specific builtins, allowing easy queries b...
Implements C++ ABI-specific semantic analysis functions.
Represents a base class of a C++ class.
Represents a C++ constructor within a class.
Represents a C++ destructor within a class.
CXXDestructorDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
Represents a static or instance method of a struct/union/class.
CXXMethodDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
Represents a C++ struct/union/class.
static CXXRecordDecl * Create(const ASTContext &C, TagKind TK, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, IdentifierInfo *Id, CXXRecordDecl *PrevDecl=nullptr)
CXXRecordDecl * getDefinition() const
bool isPolymorphic() const
Whether this class is polymorphic (C++ [class.virtual]), which means that the class contains or inher...
bool isDynamicClass() const
bool isEmpty() const
Determine whether this is an empty class in the sense of (C++11 [meta.unary.prop]).
SplitQualType split() const
static CanQual< Type > CreateUnsafe(QualType Other)
QualType withConst() const
Retrieves a version of this type with const applied.
CanQual< T > getUnqualifiedType() const
Retrieve the unqualified form of this type.
Qualifiers getQualifiers() const
Retrieve all qualifiers.
const T * getTypePtr() const
Retrieve the underlying type pointer, which refers to a canonical type.
CharUnits - This is an opaque type for sizes expressed in character units.
bool isPositive() const
isPositive - Test whether the quantity is greater than zero.
bool isZero() const
isZero - Test whether the quantity equals zero.
QuantityType getQuantity() const
getQuantity - Get the raw integer representation of this quantity.
static CharUnits fromQuantity(QuantityType Quantity)
fromQuantity - Construct a CharUnits quantity from a raw integer type.
static CharUnits Zero()
Zero - Construct a CharUnits quantity of zero.
Complex values, per C99 6.2.5p11.
void Profile(llvm::FoldingSetNodeID &ID)
bool hasExplicitTemplateArgs() const
Whether or not template arguments were explicitly specified in the concept reference (they might not ...
const ASTTemplateArgumentListInfo * getTemplateArgsAsWritten() const
Represents the canonical version of C arrays with a specified constant size.
const Expr * getSizeExpr() const
Return a pointer to the size expression.
llvm::APInt getSize() const
Return the constant array size as an APInt.
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Ctx)
uint64_t getZExtSize() const
Return the size zero-extended as a uint64_t.
Represents a concrete matrix type with constant number of rows and columns.
unsigned getNumColumns() const
Returns the number of columns in the matrix.
void Profile(llvm::FoldingSetNodeID &ID)
unsigned getNumRows() const
Returns the number of rows in the matrix.
Represents a sugar type with __counted_by or __sized_by annotations, including their _or_null variant...
void Profile(llvm::FoldingSetNodeID &ID)
Represents a pointer type decayed from an array or function type.
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
DeclContext * getParent()
getParent - Returns the containing DeclContext.
bool isFileContext() const
bool isDependentContext() const
Determines whether this context is dependent on a template parameter.
DeclContext * getLexicalParent()
getLexicalParent - Returns the containing lexical DeclContext.
lookup_result lookup(DeclarationName Name) const
lookup - Find the declarations (if any) with the given Name in this context.
DeclContext * getRedeclContext()
getRedeclContext - Retrieve the context in which an entity conflicts with other entities of the same ...
void addDecl(Decl *D)
Add the declaration D into this context.
Decl::Kind getDeclKind() const
A reference to a declared variable, function, enum, etc.
Decl - This represents one declaration (or definition), e.g.
const DeclContext * getParentFunctionOrMethod(bool LexicalParent=false) const
If this decl is defined inside a function/method/block it returns the corresponding DeclContext,...
bool isModuleLocal() const
Whether this declaration was a local declaration to a C++20 named module.
ASTContext & getASTContext() const LLVM_READONLY
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
void setImplicit(bool I=true)
redecl_range redecls() const
Returns an iterator range for all the redeclarations of the same decl.
DeclContext * getDeclContext()
void setDeclContext(DeclContext *DC)
setDeclContext - Set both the semantic and lexical DeclContext to DC.
DeclContext * getLexicalDeclContext()
getLexicalDeclContext - The declaration context where this Decl was lexically declared (LexicalDC).
virtual Decl * getCanonicalDecl()
Retrieves the "canonical" declaration of the given declaration.
DeclarationNameLoc - Additional source/type location info for a declaration name.
static DeclarationNameLoc makeCXXOperatorNameLoc(SourceLocation BeginLoc, SourceLocation EndLoc)
Construct location information for a non-literal C++ operator.
The name of a declaration.
static int compare(DeclarationName LHS, DeclarationName RHS)
Represents a ValueDecl that came out of a declarator.
TypeSourceInfo * getTypeSourceInfo() const
TemplateName getUnderlying() const
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context) const
DefaultArguments getDefaultArguments() const
Represents an extended address space qualifier where the input address space value is dependent.
Expr * getAddrSpaceExpr() const
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context)
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context)
Represents an array type in C++ whose size is a value-dependent expression.
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context)
Expr * getSizeExpr() const
Represents an extended vector type where either the type or size is dependent.
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context)
Represents a matrix type where the type and the number of rows and columns is dependent on a template...
Expr * getRowExpr() const
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context)
Represents a dependent template name that cannot be resolved prior to template instantiation.
void Profile(llvm::FoldingSetNodeID &ID) const
IdentifierOrOverloadedOperator getName() const
NestedNameSpecifier getQualifier() const
Return the nested name specifier that qualifies this name.
bool hasTemplateKeyword() const
Was this template name was preceeded by the template keyword?
Internal representation of canonical, dependent typeof(expr) types.
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context)
Represents a vector type where either the type or size is dependent.
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context)
Concrete class used by the front-end to report problems and issues.
DiagnosticBuilder Report(SourceLocation Loc, unsigned DiagID)
Issue the message to the client.
A dynamically typed AST node container.
bool isScoped() const
Returns true if this is a C++11 scoped enumeration.
bool isComplete() const
Returns true if this can be considered a complete type.
EnumDecl * getDefinitionOrSelf() const
QualType getIntegerType() const
Return the integer type this enum decl corresponds to.
Represents an explicit instantiation of a template entity in source code.
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.
FunctionDecl * getDefinition()
Get the definition for this declaration.
TemplateSpecializationKind getTemplateSpecializationKind() const
Determine what kind of template instantiation this function represents.
bool isUserProvided() const
True if this method is user-declared and was not deleted or defaulted on its first declaration.
bool isInlineDefinitionExternallyVisible() const
For an inline function definition in C, or for a gnu_inline function in C++, determine whether the de...
FunctionDecl * getPreviousDecl()
Return the previous declaration of this declaration or NULL if this is the first declaration.
SmallVector< Conflict > Conflicts
static FunctionEffectSet getIntersection(FunctionEffectsRef LHS, FunctionEffectsRef RHS)
static FunctionEffectSet getUnion(FunctionEffectsRef LHS, FunctionEffectsRef RHS, Conflicts &Errs)
An immutable set of FunctionEffects and possibly conditions attached to them.
ArrayRef< EffectConditionExpr > conditions() const
Represents a K&R-style 'int foo()' function, which has no information available about its arguments.
void Profile(llvm::FoldingSetNodeID &ID)
Represents a prototype with parameter type info, e.g.
ExtParameterInfo getExtParameterInfo(unsigned I) const
ExceptionSpecificationType getExceptionSpecType() const
Get the kind of exception specification on this function.
unsigned getNumParams() const
QualType getParamType(unsigned i) const
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Ctx)
bool hasExceptionSpec() const
Return whether this function has any kind of exception spec.
bool isVariadic() const
Whether this function prototype is variadic.
ExtProtoInfo getExtProtoInfo() const
ArrayRef< QualType > getParamTypes() const
ArrayRef< ExtParameterInfo > getExtParameterInfos() const
bool hasExtParameterInfos() const
Is there any interesting extra information for any of the parameters of this function type?
Declaration of a template function.
A class which abstracts out some details necessary for making a call.
CallingConv getCC() const
bool getNoCfCheck() const
unsigned getRegParm() const
bool getNoCallerSavedRegs() const
ExtInfo withNoReturn(bool noReturn) const
bool getHasRegParm() const
bool getProducesResult() const
Interesting information about a specific parameter that can't simply be reflected in parameter's type...
ExtParameterInfo withIsNoEscape(bool NoEscape) const
FunctionType - C99 6.7.5.3 - Function Declarators.
ExtInfo getExtInfo() const
QualType getReturnType() const
GlobalDecl - represents a global declaration.
unsigned getMultiVersionIndex() const
CXXDtorType getDtorType() const
const Decl * getDecl() const
One of these records is kept for each identifier that is lexed.
unsigned getLength() const
Efficiently return the length of this identifier info.
StringRef getName() const
Return the actual identifier string.
Implements an efficient mapping from strings to IdentifierInfo nodes.
Describes a module import declaration, which makes the contents of the named module visible in the cu...
Represents a C array with an unspecified size.
void Profile(llvm::FoldingSetNodeID &ID)
static ItaniumMangleContext * create(ASTContext &Context, DiagnosticsEngine &Diags, bool IsAux=false)
An lvalue reference type, per C++11 [dcl.ref].
@ Swift
Interoperability with the latest known version of the Swift runtime.
@ Swift4_2
Interoperability with the Swift 4.2 runtime.
@ Swift4_1
Interoperability with the Swift 4.1 runtime.
@ Integer
Permit vector bitcasts between integer vectors with different numbers of elements but the same total ...
@ All
Permit vector bitcasts between all vectors with the same total bit-width.
@ PostDecrInWhile
while (count–)
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
std::optional< TargetCXXABI::Kind > CXXABI
C++ ABI to compile with, if specified by the frontend through -fc++-abi=.
clang::ObjCRuntime ObjCRuntime
CoreFoundationABI CFRuntime
bool isOverflowPatternExcluded(OverflowPatternExclusionKind Kind) const
static void Profile(llvm::FoldingSetNodeID &ID, Parts P)
Sugar type that represents a type that was qualified by a qualifier written as a macro invocation.
MangleContext - Context for tracking state which persists across multiple calls to the C++ name mangl...
Keeps track of the mangled names of lambda expressions and block literals within a particular context...
static bool isValidElementType(QualType T, const LangOptions &LangOpts)
Valid elements types are the following:
QualType getElementType() const
Returns type of the elements being stored in the matrix.
A pointer to member type per C++ 8.3.3 - Pointers to members.
void Profile(llvm::FoldingSetNodeID &ID)
Provides information a specialization of a member of a class template, which may be a member function...
static MicrosoftMangleContext * create(ASTContext &Context, DiagnosticsEngine &Diags, bool IsAux=false)
Describes a module or submodule.
bool isNamedModule() const
Does this Module is a named module of a standard named module?
This represents a decl that may have a name.
NamedDecl * getUnderlyingDecl()
Looks through UsingDecls and ObjCCompatibleAliasDecls for the underlying named decl.
IdentifierInfo * getIdentifier() const
Get the identifier that names this declaration, if there is one.
bool isPlaceholderVar(const LangOptions &LangOpts) const
DeclarationName getDeclName() const
Get the actual, stored name of the declaration, which may be a special name.
std::string getNameAsString() const
Get a human-readable name for the declaration, even if it is one of the special kinds of names (C++ c...
bool isExternallyVisible() const
Represent a C++ namespace.
static NamespaceDecl * Create(ASTContext &C, DeclContext *DC, bool Inline, SourceLocation StartLoc, SourceLocation IdLoc, IdentifierInfo *Id, NamespaceDecl *PrevDecl, bool Nested)
A C++ nested-name-specifier augmented with source location information.
Represents a C++ nested name specifier, such as "\::std::vector<int>::".
NestedNameSpecifier getCanonical() const
Retrieves the "canonical" nested name specifier for a given nested name specifier.
CXXRecordDecl * getAsMicrosoftSuper() const
NamespaceAndPrefix getAsNamespaceAndPrefix() const
const Type * getAsType() const
Kind
The kind of specifier that completes this nested name specifier.
@ MicrosoftSuper
Microsoft's '__super' specifier, stored as a CXXRecordDecl* of the class it appeared in.
@ Global
The global specifier '::'. There is no stored value.
@ Type
A type, stored as a Type*.
@ Namespace
A namespace-like entity, stored as a NamespaceBaseDecl*.
NonTypeTemplateParmDecl - Declares a non-type template parameter, e.g., "Size" in.
static NonTypeTemplateParmDecl * Create(const ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, int D, int P, const IdentifierInfo *Id, QualType T, bool ParameterPack, TypeSourceInfo *TInfo)
ObjCCategoryDecl - Represents a category declaration.
ObjCCategoryImplDecl - An object of this class encapsulates a category @implementation declaration.
ObjCImplementationDecl - Represents a class definition - this is where method definitions are specifi...
Represents an ObjC class declaration.
ObjCTypeParamList * getTypeParamList() const
Retrieve the type parameters of this class.
static ObjCInterfaceDecl * Create(const ASTContext &C, DeclContext *DC, SourceLocation atLoc, const IdentifierInfo *Id, ObjCTypeParamList *typeParamList, ObjCInterfaceDecl *PrevDecl, SourceLocation ClassLoc=SourceLocation(), bool isInternal=false)
bool hasDefinition() const
Determine whether this class has been defined.
bool ClassImplementsProtocol(ObjCProtocolDecl *lProto, bool lookupCategory, bool RHSIsQualifiedID=false)
ClassImplementsProtocol - Checks that 'lProto' protocol has been implemented in IDecl class,...
StringRef getObjCRuntimeNameAsString() const
Produce a name to be used for class's metadata.
ObjCImplementationDecl * getImplementation() const
ObjCInterfaceDecl * getSuperClass() const
bool isSuperClassOf(const ObjCInterfaceDecl *I) const
isSuperClassOf - Return true if this class is the specified class or is a super class of the specifie...
known_extensions_range known_extensions() const
Represents typeof(type), a C23 feature and GCC extension, or `typeof_unqual(type),...
ObjCInterfaceDecl * getDecl() const
Get the declaration of this interface.
ObjCIvarDecl - Represents an ObjC instance variable.
ObjCIvarDecl * getNextIvar()
ObjCMethodDecl - Represents an instance or class method declaration.
ObjCDeclQualifier getObjCDeclQualifier() const
unsigned param_size() const
param_const_iterator param_end() const
param_const_iterator param_begin() const
const ParmVarDecl *const * param_const_iterator
Selector getSelector() const
bool isInstanceMethod() const
QualType getReturnType() const
Represents a pointer to an Objective C object.
bool isObjCQualifiedClassType() const
True if this is equivalent to 'Class.
const ObjCObjectPointerType * stripObjCKindOfTypeAndQuals(const ASTContext &ctx) const
Strip off the Objective-C "kindof" type and (with it) any protocol qualifiers.
bool isObjCQualifiedIdType() const
True if this is equivalent to 'id.
void Profile(llvm::FoldingSetNodeID &ID)
const ObjCObjectType * getObjectType() const
Gets the type pointed to by this ObjC pointer.
bool isObjCIdType() const
True if this is equivalent to the 'id' type, i.e.
QualType getPointeeType() const
Gets the type pointed to by this ObjC pointer.
ObjCInterfaceDecl * getInterfaceDecl() const
If this pointer points to an Objective @interface type, gets the declaration for that interface.
const ObjCInterfaceType * getInterfaceType() const
If this pointer points to an Objective C @interface type, gets the type for that interface.
bool isObjCClassType() const
True if this is equivalent to the 'Class' type, i.e.
Represents one property declaration in an Objective-C interface.
bool isReadOnly() const
isReadOnly - Return true iff the property has a setter.
static ObjCPropertyDecl * findPropertyDecl(const DeclContext *DC, const IdentifierInfo *propertyID, ObjCPropertyQueryKind queryKind)
Lookup a property by name in the specified DeclContext.
SetterKind getSetterKind() const
getSetterKind - Return the method used for doing assignment in the property setter.
Selector getSetterName() const
Selector getGetterName() const
ObjCPropertyAttribute::Kind getPropertyAttributes() const
ObjCPropertyImplDecl - Represents implementation declaration of a property in a class or category imp...
ObjCIvarDecl * getPropertyIvarDecl() const
Represents an Objective-C protocol declaration.
protocol_range protocols() const
bool isGNUFamily() const
Is this runtime basically of the GNU family of runtimes?
Represents the declaration of an Objective-C type parameter.
ObjCTypeParamVariance getVariance() const
Determine the variance of this type parameter.
Stores a list of Objective-C type parameters for a parameterized class or a category/extension thereo...
OffsetOfExpr - [C99 7.17] - This represents an expression of the form offsetof(record-type,...
const OffsetOfNode & getComponent(unsigned Idx) const
unsigned getNumComponents() const
Helper class for OffsetOfExpr.
A structure for storing the information associated with an overloaded template name.
Represents a C++11 pack expansion that produces a sequence of expressions.
Sugar for parentheses used when specifying types.
void Profile(llvm::FoldingSetNodeID &ID)
void clear()
Clear parent maps.
DynTypedNodeList getParents(const NodeT &Node)
Returns the parents of the given node (within the traversal scope).
Represents a parameter to a function.
ObjCDeclQualifier getObjCDeclQualifier() const
QualType getOriginalType() const
ParsedAttr - Represents a syntactic attribute.
void Profile(llvm::FoldingSetNodeID &ID)
Pointer-authentication qualifiers.
static PointerAuthQualifier Create(unsigned Key, bool IsAddressDiscriminated, unsigned ExtraDiscriminator, PointerAuthenticationMode AuthenticationMode, bool IsIsaPointer, bool AuthenticatesNullValues)
bool isEquivalent(PointerAuthQualifier Other) const
PointerType - C99 6.7.5.1 - Pointer Declarators.
QualType getPointeeType() const
void Profile(llvm::FoldingSetNodeID &ID)
Engages in a tight little dance with the lexer to efficiently preprocess tokens.
A (possibly-)qualified type.
bool hasAddressDiscriminatedPointerAuth() const
bool isVolatileQualified() const
Determine whether this type is volatile-qualified.
bool isTriviallyCopyableType(const ASTContext &Context) const
Return true if this is a trivially copyable type (C++0x [basic.types]p9)
Qualifiers::GC getObjCGCAttr() const
Returns gc attribute of this type.
bool hasQualifiers() const
Determine whether this type has any qualifiers.
QualType getDesugaredType(const ASTContext &Context) const
Return the specified type with any "sugar" removed from the type.
QualType withConst() const
bool hasLocalQualifiers() const
Determine whether this particular QualType instance has any qualifiers, without looking through any t...
bool isNull() const
Return true if this QualType doesn't point to a type yet.
const Type * getTypePtr() const
Retrieves a pointer to the underlying (unqualified) type.
LangAS getAddressSpace() const
Return the address space of this type.
Qualifiers getQualifiers() const
Retrieve the set of qualifiers applied to this type.
Qualifiers::ObjCLifetime getObjCLifetime() const
Returns lifetime attribute of this type.
QualType getCanonicalType() const
QualType getUnqualifiedType() const
Retrieve the unqualified variant of the given type, removing as little sugar as possible.
SplitQualType split() const
Divides a QualType into its unqualified type and a set of local qualifiers.
QualType getNonPackExpansionType() const
Remove an outer pack expansion type (if any) from this type.
bool isConstQualified() const
Determine whether this type is const-qualified.
DestructionKind isDestructedType() const
Returns a nonzero value if objects of this type require non-trivial work to clean up after.
const Type * getTypePtrOrNull() const
static std::string getAsString(SplitQualType split, const PrintingPolicy &Policy)
PrimitiveCopyKind isNonTrivialToPrimitiveDestructiveMove() const
Check if this is a non-trivial type that would cause a C struct transitively containing this type to ...
Qualifiers getLocalQualifiers() const
Retrieve the set of qualifiers local to this particular QualType instance, not including any qualifie...
Represents a template name as written in source code.
void Profile(llvm::FoldingSetNodeID &ID)
A qualifier set is used to build a set of qualifiers.
const Type * strip(QualType type)
Collect any qualifiers on the given type and return an unqualified type.
The collection of all-type qualifiers we support.
unsigned getCVRQualifiers() const
void removeCVRQualifiers(unsigned mask)
void addAddressSpace(LangAS space)
static Qualifiers removeCommonQualifiers(Qualifiers &L, Qualifiers &R)
Returns the common set of qualifiers while removing them from the given sets.
@ OCL_Strong
Assigning into this object requires the old value to be released and the new value to be retained.
@ OCL_ExplicitNone
This object can be modified without requiring retains or releases.
@ OCL_None
There is no lifetime qualification on this type.
@ OCL_Weak
Reading or writing from this object requires a barrier call.
@ OCL_Autoreleasing
Assigning into this object requires a lifetime extension.
void removeObjCLifetime()
bool hasNonFastQualifiers() const
Return true if the set contains any qualifiers which require an ExtQuals node to be allocated.
void addConsistentQualifiers(Qualifiers qs)
Add the qualifiers from the given set to this set, given that they don't conflict.
void removeFastQualifiers(unsigned mask)
bool hasUnaligned() const
bool hasAddressSpace() const
static bool isAddressSpaceSupersetOf(LangAS A, LangAS B, const ASTContext &Ctx)
Returns true if address space A is equal to or a superset of B.
unsigned getFastQualifiers() const
void removeAddressSpace()
PointerAuthQualifier getPointerAuth() const
bool hasObjCGCAttr() const
uint64_t getAsOpaqueValue() const
bool hasObjCLifetime() const
ObjCLifetime getObjCLifetime() const
void addObjCGCAttr(GC type)
LangAS getAddressSpace() const
An rvalue reference type, per C++11 [dcl.ref].
Represents a struct/union/class.
bool isLambda() const
Determine whether this record is a class describing a lambda function object.
bool hasFlexibleArrayMember() const
field_range fields() const
static RecordDecl * Create(const ASTContext &C, TagKind TK, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, IdentifierInfo *Id, RecordDecl *PrevDecl=nullptr)
RecordDecl * getMostRecentDecl()
virtual void completeDefinition()
Note that the definition of this type is now complete.
RecordDecl * getDefinition() const
Returns the RecordDecl that actually defines this struct/union/class.
decl_type * getFirstDecl()
Return the first declaration of this declaration or itself if this is the only declaration.
Base for LValueReferenceType and RValueReferenceType.
QualType getPointeeType() const
void Profile(llvm::FoldingSetNodeID &ID)
This table allows us to fully hide how we implement multi-keyword caching.
std::string getAsString() const
Derive the full selector name (e.g.
Encodes a location in the source.
bool isValid() const
Return true if this is a valid SourceLocation object.
This class handles loading and caching of source files into memory.
A trivial tuple used to represent a source range.
SourceLocation getBegin() const
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context, bool Canonical, bool ProfileLambdaExpr=false) const
Produce a unique representation of the given statement.
The streaming interface shared between DiagnosticBuilder and PartialDiagnostic.
StringLiteral - This represents a string literal expression, e.g.
static StringLiteral * Create(const ASTContext &Ctx, StringRef Str, StringLiteralKind Kind, bool Pascal, QualType Ty, ArrayRef< SourceLocation > Locs)
This is the "fully general" constructor that allows representation of strings formed from one or more...
A structure for storing an already-substituted template template parameter pack.
Decl * getAssociatedDecl() const
A template-like entity which owns the whole pattern being substituted.
void Profile(llvm::FoldingSetNodeID &ID, ASTContext &Context)
TemplateTemplateParmDecl * getParameterPack() const
Retrieve the template template parameter pack being substituted.
TemplateArgument getArgumentPack() const
Retrieve the template template argument pack with which this parameter was substituted.
unsigned getIndex() const
Returns the index of the replaced parameter in the associated declaration.
A structure for storing the information associated with a substituted template template parameter.
void Profile(llvm::FoldingSetNodeID &ID)
TemplateTemplateParmDecl * getParameter() const
Represents the declaration of a struct/union/class/enum.
TypedefNameDecl * getTypedefNameForAnonDecl() const
void startDefinition()
Starts the definition of this tag declaration.
TagDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
TagKind getTagKind() const
bool isMicrosoft() const
Is this ABI an MSVC-compatible ABI?
Kind
The basic C++ ABI kind.
static Kind getKind(StringRef Name)
Exposes information about the current target.
const llvm::Triple & getTriple() const
Returns the target triple of the primary target.
unsigned getMaxAtomicInlineWidth() const
Return the maximum width lock-free atomic operation which can be inlined given the supported features...
virtual LangAS getCUDABuiltinAddressSpace(unsigned AS) const
Map from the address space field in builtin description strings to the language address space.
virtual LangAS getOpenCLBuiltinAddressSpace(unsigned AS) const
Map from the address space field in builtin description strings to the language address space.
unsigned getDefaultAlignForAttributeAligned() const
Return the default alignment for attribute((aligned)) on this target, to be used if no alignment valu...
BuiltinVaListKind
The different kinds of __builtin_va_list types defined by the target implementation.
@ AArch64ABIBuiltinVaList
__builtin_va_list as defined by the AArch64 ABI http://infocenter.arm.com/help/topic/com....
@ PowerABIBuiltinVaList
__builtin_va_list as defined by the Power ABI: https://www.power.org /resources/downloads/Power-Arch-...
@ AAPCSABIBuiltinVaList
__builtin_va_list as defined by ARM AAPCS ABI http://infocenter.arm.com
@ CharPtrBuiltinVaList
typedef char* __builtin_va_list;
@ VoidPtrBuiltinVaList
typedef void* __builtin_va_list;
@ X86_64ABIBuiltinVaList
__builtin_va_list as defined by the x86-64 ABI: http://refspecs.linuxbase.org/elf/x86_64-abi-0....
virtual uint64_t getNullPointerValue(LangAS AddrSpace) const
Get integer value for null pointer.
static bool isTypeSigned(IntType T)
Returns true if the type is signed; false otherwise.
IntType getPtrDiffType(LangAS AddrSpace) const
IntType getSizeType() const
FloatModeKind getRealTypeByWidth(unsigned BitWidth, FloatModeKind ExplicitType) const
Return floating point type with specified width.
virtual IntType getIntTypeByWidth(unsigned BitWidth, bool IsSigned) const
Return integer type with specified width.
unsigned getMaxAlignedAttribute() const
Get the maximum alignment in bits for a static variable with aligned attribute.
virtual unsigned getMinGlobalAlign(uint64_t Size, bool HasNonWeakDef) const
getMinGlobalAlign - Return the minimum alignment of a global variable, unless its alignment is explic...
unsigned getTargetAddressSpace(LangAS AS) const
IntType getSignedSizeType() const
TargetCXXABI getCXXABI() const
Get the C++ ABI currently in use.
bool useAddressSpaceMapMangling() const
Specify if mangling based on address space map should be used or not for language specific address sp...
A convenient class for passing around template argument information.
ArrayRef< TemplateArgumentLoc > arguments() const
ArrayRef< TemplateArgument > asArray() const
Produce this as an array ref.
Location wrapper for a TemplateArgument.
Represents a template argument.
ArrayRef< TemplateArgument > getPackAsArray() const
Return the array of arguments in this template argument pack.
QualType getStructuralValueType() const
Get the type of a StructuralValue.
QualType getParamTypeForDecl() const
Expr * getAsExpr() const
Retrieve the template argument as an expression.
UnsignedOrNone getNumTemplateExpansions() const
Retrieve the number of expansions that a template template argument expansion will produce,...
QualType getAsType() const
Retrieve the type for a type template argument.
llvm::APSInt getAsIntegral() const
Retrieve the template argument as an integral value.
QualType getNullPtrType() const
Retrieve the type for null non-type template argument.
static TemplateArgument CreatePackCopy(ASTContext &Context, ArrayRef< TemplateArgument > Args)
Create a new template argument pack by copying the given set of template arguments.
TemplateName getAsTemplate() const
Retrieve the template name for a template name argument.
bool structurallyEquals(const TemplateArgument &Other) const
Determines whether two template arguments are superficially the same.
QualType getIntegralType() const
Retrieve the type of the integral value.
bool getIsDefaulted() const
If returns 'true', this TemplateArgument corresponds to a default template parameter.
ValueDecl * getAsDecl() const
Retrieve the declaration for a declaration non-type template argument.
ArrayRef< TemplateArgument > pack_elements() const
Iterator range referencing all of the elements of a template argument pack.
@ Declaration
The template argument is a declaration that was provided for a pointer, reference,...
@ Template
The template argument is a template name that was provided for a template template parameter.
@ StructuralValue
The template argument is a non-type template argument that can't be represented by the special-case D...
@ Pack
The template argument is actually a parameter pack.
@ TemplateExpansion
The template argument is a pack expansion of a template name that was provided for a template templat...
@ NullPtr
The template argument is a null pointer or null pointer to member that was provided for a non-type te...
@ Type
The template argument is a type.
@ Null
Represents an empty template argument, e.g., one that has not been deduced.
@ Integral
The template argument is an integral value stored in an llvm::APSInt that was provided for an integra...
@ Expression
The template argument is an expression, and we've not resolved it to one of the other forms yet,...
ArgKind getKind() const
Return the kind of stored template argument.
TemplateName getAsTemplateOrTemplatePattern() const
Retrieve the template argument as a template name; if the argument is a pack expansion,...
const APValue & getAsStructuralValue() const
Get the value of a StructuralValue.
The base class of all kinds of template declarations (e.g., class, function, etc.).
TemplateParameterList * getTemplateParameters() const
Get the list of template parameters.
Represents a C++ template name within the type system.
TemplateDecl * getAsTemplateDecl(bool IgnoreDeduced=false) const
Retrieve the underlying template declaration that this template name refers to, if known.
DeducedTemplateStorage * getAsDeducedTemplateName() const
Retrieve the deduced template info, if any.
DependentTemplateName * getAsDependentTemplateName() const
Retrieve the underlying dependent template name structure, if any.
std::optional< TemplateName > desugar(bool IgnoreDeduced) const
OverloadedTemplateStorage * getAsOverloadedTemplate() const
Retrieve the underlying, overloaded function template declarations that this template name refers to,...
AssumedTemplateStorage * getAsAssumedTemplateName() const
Retrieve information on a name that has been assumed to be a template-name in order to permit a call ...
void * getAsVoidPointer() const
Retrieve the template name as a void pointer.
@ UsingTemplate
A template name that refers to a template declaration found through a specific using shadow declarati...
@ OverloadedTemplate
A set of overloaded template declarations.
@ Template
A single template declaration.
@ DependentTemplate
A dependent template name that has not been resolved to a template (or set of templates).
@ SubstTemplateTemplateParm
A template template parameter that has been substituted for some other template name.
@ SubstTemplateTemplateParmPack
A template template parameter pack that has been substituted for a template template argument pack,...
@ DeducedTemplate
A template name that refers to another TemplateName with deduced default arguments.
@ QualifiedTemplate
A qualified template name, where the qualification is kept to describe the source code as written.
@ AssumedTemplate
An unqualified-id that has been assumed to name a function template that will be found by ADL.
UsingShadowDecl * getAsUsingShadowDecl() const
Retrieve the using shadow declaration through which the underlying template declaration is introduced...
SubstTemplateTemplateParmPackStorage * getAsSubstTemplateTemplateParmPack() const
Retrieve the substituted template template parameter pack, if known.
SubstTemplateTemplateParmStorage * getAsSubstTemplateTemplateParm() const
Retrieve the substituted template template parameter, if known.
A template parameter object.
static void Profile(llvm::FoldingSetNodeID &ID, QualType T, const APValue &V)
Stores a list of template parameters for a TemplateDecl and its derived classes.
NamedDecl * getParam(unsigned Idx)
static TemplateParameterList * Create(const ASTContext &C, SourceLocation TemplateLoc, SourceLocation LAngleLoc, ArrayRef< NamedDecl * > Params, SourceLocation RAngleLoc, Expr *RequiresClause)
NamedDecl *const * const_iterator
Iterates through the template parameters in this list.
Expr * getRequiresClause()
The constraint-expression of the associated requires-clause.
ArrayRef< NamedDecl * > asArray()
TemplateTemplateParmDecl - Declares a template template parameter, e.g., "T" in.
TemplateNameKind templateParameterKind() const
unsigned getPosition() const
Get the position of the template parameter within its parameter list.
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.
static TemplateTemplateParmDecl * Create(const ASTContext &C, DeclContext *DC, SourceLocation L, int D, int P, bool ParameterPack, IdentifierInfo *Id, TemplateNameKind ParameterKind, bool Typename, TemplateParameterList *Params)
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, int D, int P, IdentifierInfo *Id, bool Typename, bool ParameterPack, bool HasTypeConstraint=false, UnsignedOrNone NumExpanded=std::nullopt)
Models the abbreviated syntax to constrain a template type parameter: template <convertible_to<string...
Expr * getImmediatelyDeclaredConstraint() const
Get the immediately-declared constraint expression introduced by this type-constraint,...
TemplateDecl * getNamedConcept() const
ConceptReference * getConceptReference() const
Represents a declaration of a type.
T castAs() const
Convert to the specified TypeLoc type, asserting that this TypeLoc is of the desired type.
static unsigned getFullDataSizeForType(QualType Ty)
Returns the size of type source info data block for the given type.
void initialize(ASTContext &Context, SourceLocation Loc) const
Initializes this to state that every location in this type is the given location.
Represents a typeof (or typeof) expression (a C23 feature and GCC extension) or a typeof_unqual expre...
A container of type source information.
TypeLoc getTypeLoc() const
Return the TypeLoc wrapper for the type source info.
The base class of the type hierarchy.
bool isBlockPointerType() const
bool isObjCBuiltinType() const
QualType getRVVEltType(const ASTContext &Ctx) const
Returns the representative type for the element of an RVV builtin type.
bool isIncompleteArrayType() const
bool isSignedIntegerType() const
Return true if this is an integer type that is signed, according to C99 6.2.5p4 [char,...
bool isFloat16Type() const
CXXRecordDecl * getAsCXXRecordDecl() const
Retrieves the CXXRecordDecl that this type refers to, either because the type is a RecordType or beca...
bool isConstantArrayType() const
RecordDecl * getAsRecordDecl() const
Retrieves the RecordDecl this type refers to.
bool isConstantSizeType() const
Return true if this is not a variable sized type, according to the rules of C99 6....
QualType getLocallyUnqualifiedSingleStepDesugaredType() const
Pull a single level of sugar off of this locally-unqualified type.
bool isPointerType() const
TagDecl * castAsTagDecl() const
bool isArrayParameterType() const
CanQualType getCanonicalTypeUnqualified() const
bool isIntegerType() const
isIntegerType() does not include complex integers (a GCC extension).
const T * castAs() const
Member-template castAs<specific type>.
bool isSignedFixedPointType() const
Return true if this is a fixed point type that is signed according to ISO/IEC JTC1 SC22 WG14 N1169.
bool isEnumeralType() const
bool isObjCQualifiedIdType() const
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.
bool isIntegralOrEnumerationType() const
Determine whether this type is an integral or enumeration type.
AutoType * getContainedAutoType() const
Get the AutoType whose type will be deduced for a variable with an initializer of this type.
bool isBitIntType() const
bool isBuiltinType() const
Helper methods to distinguish type categories.
bool isDependentType() const
Whether this type is a dependent type, meaning that its definition somehow depends on a template para...
bool isFixedPointType() const
Return true if this is a fixed point type according to ISO/IEC JTC1 SC22 WG14 N1169.
bool isSaturatedFixedPointType() const
Return true if this is a saturated fixed point type according to ISO/IEC JTC1 SC22 WG14 N1169.
bool containsUnexpandedParameterPack() const
Whether this type is or contains an unexpanded parameter pack, used to support C++0x variadic templat...
QualType getCanonicalTypeInternal() const
@ PtrdiffT
The "ptrdiff_t" type.
@ SizeT
The "size_t" type.
@ SignedSizeT
The signed integer type corresponding to "size_t".
bool isObjCIdType() const
bool isOverflowBehaviorType() const
EnumDecl * castAsEnumDecl() const
bool isUnsaturatedFixedPointType() const
Return true if this is a saturated fixed point type according to ISO/IEC JTC1 SC22 WG14 N1169.
const ArrayType * getAsArrayTypeUnsafe() const
A variant of getAs<> for array types which silently discards qualifiers from the outermost type.
EnumDecl * getAsEnumDecl() const
Retrieves the EnumDecl this type refers to.
bool isIncompleteType(NamedDecl **Def=nullptr) const
Types are partitioned into 3 broad categories (C99 6.2.5p1): object types, function types,...
bool isFunctionType() const
bool isObjCObjectPointerType() const
bool isUnsignedFixedPointType() const
Return true if this is a fixed point type that is unsigned according to ISO/IEC JTC1 SC22 WG14 N1169.
bool isVectorType() const
bool isObjCClassType() const
bool isRVVVLSBuiltinType() const
Determines if this is a sizeless type supported by the 'riscv_rvv_vector_bits' type attribute,...
bool isRVVSizelessBuiltinType() const
Returns true for RVV scalable vector types.
const T * getAsCanonical() const
If this type is canonically the specified type, return its canonical type cast to that specified type...
bool isUnsignedIntegerType() const
Return true if this is an integer type that is unsigned, according to C99 6.2.5p6 [which returns true...
bool isAnyPointerType() const
TypeClass getTypeClass() const
bool isCanonicalUnqualified() const
Determines if this type would be canonical if it had no further qualification.
const T * getAs() const
Member-template getAs<specific type>'.
const Type * getUnqualifiedDesugaredType() const
Return the specified type with any "sugar" removed from the type, removing any typedefs,...
bool isNullPtrType() const
bool isRecordType() const
bool isObjCRetainableType() const
NullabilityKindOrNone getNullability() const
Determine the nullability of the given type.
Represents the declaration of a typedef-name via the 'typedef' type specifier.
static TypedefDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id, TypeSourceInfo *TInfo)
Base class for declarations which introduce a typedef-name.
QualType getUnderlyingType() const
static void Profile(llvm::FoldingSetNodeID &ID, ElaboratedTypeKeyword Keyword, NestedNameSpecifier Qualifier, const TypedefNameDecl *Decl, QualType Underlying)
UnaryOperator - This represents the unary-expression's (except sizeof and alignof),...
An artificial decl, representing a global anonymous constant value which is uniquified by value withi...
static void Profile(llvm::FoldingSetNodeID &ID, QualType Ty, const APValue &APVal)
The iterator over UnresolvedSets.
Represents the dependent type named by a dependently-scoped typename using declaration,...
static void Profile(llvm::FoldingSetNodeID &ID, ElaboratedTypeKeyword Keyword, NestedNameSpecifier Qualifier, const UnresolvedUsingTypenameDecl *D)
Represents a dependent using declaration which was marked with typename.
UnresolvedUsingTypenameDecl * getCanonicalDecl() override
Retrieves the canonical declaration of this declaration.
Represents a C++ using-enum-declaration.
Represents a shadow declaration implicitly introduced into a scope by a (resolved) using-declaration ...
NamedDecl * getTargetDecl() const
Gets the underlying declaration which has been brought into the local scope.
BaseUsingDecl * getIntroducer() const
Gets the (written or instantiated) using declaration that introduced this declaration.
static void Profile(llvm::FoldingSetNodeID &ID, ElaboratedTypeKeyword Keyword, NestedNameSpecifier Qualifier, const UsingShadowDecl *D, QualType UnderlyingType)
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
void setType(QualType newType)
bool isWeak() const
Determine whether this symbol is weakly-imported, or declared with the weak or weak-ref attr.
Represents a variable declaration or definition.
VarTemplateDecl * getDescribedVarTemplate() const
Retrieves the variable template that is described by this variable declaration.
bool isOutOfLine() const override
Determine whether this is or was instantiated from an out-of-line definition of a static data member.
bool isStaticDataMember() const
Determines whether this is a static data member.
redecl_range redecls() const
Returns an iterator range for all the redeclarations of the same decl.
bool isStaticLocal() const
Returns true if a variable with function scope is a static local variable.
bool isInline() const
Whether this variable is (C++1z) inline.
@ DeclarationOnly
This declaration is only a declaration.
DefinitionKind hasDefinition(ASTContext &) const
Check whether this variable is defined in this translation unit.
TemplateSpecializationKind getTemplateSpecializationKind() const
If this variable is an instantiation of a variable template or a static data member of a class templa...
Represents a C array with a specified size that is not an integer-constant-expression.
Expr * getSizeExpr() const
Represents a GCC generic vector type.
unsigned getNumElements() const
void Profile(llvm::FoldingSetNodeID &ID)
VectorKind getVectorKind() const
QualType getElementType() const
Holds all information required to evaluate constexpr code in a module.
Defines the Linkage enumeration and various utility functions.
Defines the clang::TargetInfo interface.
mlir::Type getBaseType(mlir::Value varPtr)
const AstTypeMatcher< TagType > tagType
SmallVector< BoundNodes, 1 > match(MatcherT Matcher, const NodeT &Node, ASTContext &Context)
Returns the results of matching Matcher on Node.
const internal::VariadicAllOfMatcher< Type > type
Matches Types in the clang AST.
const AstTypeMatcher< ArrayType > arrayType
@ OS
Indicates that the tracking object is a descendant of a referenced-counted OSObject,...
The JSON file list parser is used to communicate input to InstallAPI.
CanQual< Type > CanQualType
Represents a canonical, potentially-qualified type.
bool isa(CodeGen::Address addr)
GVALinkage
A more specific kind of linkage than enum Linkage.
@ GVA_AvailableExternally
AutoTypeKeyword
Which keyword(s) were used to create an AutoType.
OpenCLTypeKind
OpenCL type kinds.
FunctionType::ExtInfo getFunctionExtInfo(const Type &t)
bool isUnresolvedExceptionSpec(ExceptionSpecificationType ESpecType)
NullabilityKind
Describes the nullability of a particular type.
@ Nullable
Values of this type can be null.
@ Unspecified
Whether values of this type can be null is (explicitly) unspecified.
@ NonNull
Values of this type can never be null.
@ ICIS_NoInit
No in-class initializer.
@ TemplateName
The identifier is a template name. FIXME: Add an annotation for that.
std::pair< FileID, unsigned > FileIDAndOffset
CXXABI * CreateMicrosoftCXXABI(ASTContext &Ctx)
@ Vector
'vector' clause, allowed on 'loop', Combined, and 'routine' directives.
@ Self
'self' clause, allowed on Compute and Combined Constructs, plus 'update'.
TypeOfKind
The kind of 'typeof' expression we're after.
SmallVector< Attr *, 4 > AttrVec
AttrVec - A vector of Attr, which is how they are stored on the AST.
nullptr
This class represents a compute construct, representing a 'Kind' of ‘parallel’, 'serial',...
CXXABI * CreateItaniumCXXABI(ASTContext &Ctx)
Creates an instance of a C++ ABI class.
Linkage
Describes the different kinds of linkage (C++ [basic.link], C99 6.2.2) that an entity may have.
@ External
External linkage, which indicates that the entity can be referred to from other translation units.
@ Result
The result type of a method or function.
ArraySizeModifier
Capture whether this is a normal array (e.g.
OptionalUnsigned< unsigned > UnsignedOrNone
bool isComputedNoexcept(ExceptionSpecificationType ESpecType)
@ Template
We are parsing a template declaration.
@ Interface
The "__interface" keyword.
@ Struct
The "struct" keyword.
@ Class
The "class" keyword.
constexpr uint16_t SelPointerConstantDiscriminator
Constant discriminator to be used with objective-c sel pointers.
bool isDiscardableGVALinkage(GVALinkage L)
BuiltinTemplateKind
Kinds of BuiltinTemplateDecl.
@ Keyword
The name has been typo-corrected to a keyword.
LangAS
Defines the address space values used by the address space qualifier of QualType.
TranslationUnitKind
Describes the kind of translation unit being processed.
@ Deduced
The normal deduced case.
@ Undeduced
Not deduced yet. This is for example an 'auto' which was just parsed.
const Decl & adjustDeclToTemplate(const Decl &D)
If we have a 'templated' declaration for a template, adjust 'D' to refer to the actual template.
bool isPtrSizeAddressSpace(LangAS AS)
ExprValueKind
The categorization of expression values, currently following the C++11 scheme.
@ VK_PRValue
A pr-value expression (in the C++11 taxonomy) produces a temporary value.
@ VK_XValue
An x-value expression is a reference to an object with independent storage but which can be "moved",...
@ VK_LValue
An l-value expression is a reference to an object with independent storage.
bool declaresSameEntity(const Decl *D1, const Decl *D2)
Determine whether two declarations declare the same entity.
const StreamingDiagnostic & operator<<(const StreamingDiagnostic &DB, const ConceptReference *C)
Insertion operator for diagnostics.
TemplateSpecializationKind
Describes the kind of template specialization that a particular template specialization declaration r...
@ TSK_ExplicitInstantiationDefinition
This template specialization was instantiated from a template due to an explicit instantiation defini...
@ TSK_ExplicitInstantiationDeclaration
This template specialization was instantiated from a template due to an explicit instantiation declar...
@ TSK_ExplicitSpecialization
This template specialization was declared or defined by an explicit specialization (C++ [temp....
@ TSK_ImplicitInstantiation
This template specialization was implicitly instantiated from a template.
@ TSK_Undeclared
This template specialization was formed from a template-id but has not yet been declared,...
CallingConv
CallingConv - Specifies the calling convention that a function uses.
@ Invariant
The parameter is invariant: must match exactly.
@ Contravariant
The parameter is contravariant, e.g., X<T> is a subtype of X when the type parameter is covariant and...
@ Covariant
The parameter is covariant, e.g., X<T> is a subtype of X when the type parameter is covariant and T i...
@ AltiVecBool
is AltiVec 'vector bool ...'
@ SveFixedLengthData
is AArch64 SVE fixed-length data vector
@ AltiVecPixel
is AltiVec 'vector Pixel'
@ Generic
not a target-specific vector type
@ RVVFixedLengthData
is RISC-V RVV fixed-length data vector
@ RVVFixedLengthMask
is RISC-V RVV fixed-length mask vector
@ SveFixedLengthPredicate
is AArch64 SVE fixed-length predicate vector
U cast(CodeGen::Address addr)
LangAS getLangASFromTargetAS(unsigned TargetAS)
@ None
The alignment was not explicit in code.
@ RequiredByEnum
The alignment comes from an alignment attribute on a enum type.
@ RequiredByTypedef
The alignment comes from an alignment attribute on a typedef.
@ RequiredByRecord
The alignment comes from an alignment attribute on a record type.
ElaboratedTypeKeyword
The elaboration keyword that precedes a qualified type name or introduces an elaborated-type-specifie...
@ Interface
The "__interface" keyword introduces the elaborated-type-specifier.
@ None
No keyword precedes the qualified type name.
@ Struct
The "struct" keyword introduces the elaborated-type-specifier.
@ Class
The "class" keyword introduces the elaborated-type-specifier.
@ Union
The "union" keyword introduces the elaborated-type-specifier.
@ Enum
The "enum" keyword introduces the elaborated-type-specifier.
@ Typename
The "typename" keyword precedes the qualified type name, e.g., typename T::type.
ExceptionSpecificationType
The various types of exception specifications that exist in C++11.
@ EST_DependentNoexcept
noexcept(expression), value-dependent
@ EST_Uninstantiated
not instantiated yet
@ EST_Unparsed
not parsed yet
@ EST_NoThrow
Microsoft __declspec(nothrow) extension.
@ EST_None
no exception specification
@ EST_MSAny
Microsoft throw(...) extension.
@ EST_BasicNoexcept
noexcept
@ EST_NoexceptFalse
noexcept(expression), evals to 'false'
@ EST_Unevaluated
not evaluated yet, for special member function
@ EST_NoexceptTrue
noexcept(expression), evals to 'true'
@ EST_Dynamic
throw(T1, T2)
unsigned NumTemplateArgs
The number of template arguments in TemplateArgs.
const Expr * ConstraintExpr
UnsignedOrNone ArgPackSubstIndex
Copy initialization expr of a __block variable and a boolean flag that indicates whether the expressi...
Expr * getCopyExpr() const
DeclarationNameInfo - A collector data type for bundling together a DeclarationName and the correspon...
ArrayRef< TemplateArgument > Args
Holds information about the various types of exception specification.
ExceptionSpecificationType Type
The kind of exception specification this is.
ArrayRef< QualType > Exceptions
Explicitly-specified list of exception types.
Expr * NoexceptExpr
Noexcept expression, if this is a computed noexcept specification.
Extra information about a function prototype.
ExceptionSpecInfo ExceptionSpec
bool requiresFunctionProtoTypeArmAttributes() const
FunctionEffectsRef FunctionEffects
const ExtParameterInfo * ExtParameterInfos
RefQualifierKind RefQualifier
bool requiresFunctionProtoTypeExtraAttributeInfo() const
unsigned HasTrailingReturn
bool requiresFunctionProtoTypeExtraBitfields() const
FunctionType::ExtInfo ExtInfo
const IdentifierInfo * getIdentifier() const
Returns the identifier to which this template name refers.
OverloadedOperatorKind getOperator() const
Return the overloaded operator to which this template name refers.
static ElaboratedTypeKeyword getKeywordForTagTypeKind(TagTypeKind Tag)
Converts a TagTypeKind into an elaborated type keyword.
A lazy value (of type T) that is within an AST node of type Owner, where the value might change in la...
Contains information gathered from parsing the contents of TargetAttr.
A std::pair-like structure for storing a qualified type split into its local qualifiers and its local...
const Type * Ty
The locally-unqualified type.
Qualifiers Quals
The local qualifiers.
llvm::DenseSet< std::tuple< Decl *, Decl *, int > > NonEquivalentDeclSet
Store declaration pairs already found to be non-equivalent.
bool IsEquivalent(Decl *D1, Decl *D2)
Determine whether the two declarations are structurally equivalent.
A this pointer adjustment.
IntType
===-— Target Data Type Query Methods ----------------------------—===//
AlignRequirementKind AlignRequirement
AlignRequirementKind AlignRequirement