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 DependentBitIntTypes(this_()), SubstTemplateTemplateParmPacks(this_()),
941 DeducedTemplates(this_()), ArrayParameterTypes(this_()),
942 CanonTemplateTemplateParms(this_()), SourceMgr(
SM), LangOpts(LOpts),
945 LangOpts.XRayNeverInstrumentFiles,
946 LangOpts.XRayAttrListFiles,
SM)),
950 Comments(
SM), CommentCommandTraits(BumpAlloc, LOpts.CommentOpts),
958 ReleaseDeclContextMaps();
961 for (
auto &Pair : Deallocations)
962 (Pair.first)(Pair.second);
963 Deallocations.clear();
969 I = ObjCLayouts.begin(),
970 E = ObjCLayouts.end();
977 for (llvm::DenseMap<const RecordDecl*, const ASTRecordLayout*>::iterator
978 I = ASTRecordLayouts.begin(), E = ASTRecordLayouts.end(); I != E; ) {
983 ASTRecordLayouts.clear();
985 for (llvm::DenseMap<const Decl*, AttrVec*>::iterator A = DeclAttrs.begin(),
986 AEnd = DeclAttrs.end();
988 A->second->~AttrVec();
991 for (
const auto &
Value : ModuleInitializers)
992 Value.second->~PerModuleInitializers();
993 ModuleInitializers.
clear();
1003 TraversalScope = TopLevelDecls;
1008 Deallocations.push_back({Callback,
Data});
1017 llvm::errs() <<
"\n*** AST Context Stats:\n";
1018 llvm::errs() <<
" " << Types.size() <<
" types total.\n";
1020 unsigned counts[] = {
1021#define TYPE(Name, Parent) 0,
1022#define ABSTRACT_TYPE(Name, Parent)
1023#include "clang/AST/TypeNodes.inc"
1027 for (
unsigned i = 0, e = Types.size(); i != e; ++i) {
1029 counts[(
unsigned)T->getTypeClass()]++;
1033 unsigned TotalBytes = 0;
1034#define TYPE(Name, Parent) \
1036 llvm::errs() << " " << counts[Idx] << " " << #Name \
1037 << " types, " << sizeof(Name##Type) << " each " \
1038 << "(" << counts[Idx] * sizeof(Name##Type) \
1040 TotalBytes += counts[Idx] * sizeof(Name##Type); \
1042#define ABSTRACT_TYPE(Name, Parent)
1043#include "clang/AST/TypeNodes.inc"
1045 llvm::errs() <<
"Total bytes = " << TotalBytes <<
"\n";
1050 <<
" implicit default constructors created\n";
1053 <<
" implicit copy constructors created\n";
1057 <<
" implicit move constructors created\n";
1060 <<
" implicit copy assignment operators created\n";
1064 <<
" implicit move assignment operators created\n";
1067 <<
" implicit destructors created\n";
1070 llvm::errs() <<
"\n";
1074 BumpAlloc.PrintStats();
1078 bool NotifyListeners) {
1079 if (NotifyListeners)
1082 Listener->RedefinedHiddenDefinition(ND, M);
1089 if (It == MergedDefModules.end())
1092 auto &Merged = It->second;
1093 llvm::DenseSet<Module*>
Found;
1094 for (
Module *&M : Merged)
1095 if (!
Found.insert(M).second)
1097 llvm::erase(Merged,
nullptr);
1104 if (MergedIt == MergedDefModules.end())
1106 return MergedIt->second;
1109void ASTContext::PerModuleInitializers::resolve(
ASTContext &Ctx) {
1110 if (LazyInitializers.empty())
1114 assert(Source &&
"lazy initializers but no external source");
1116 auto LazyInits = std::move(LazyInitializers);
1117 LazyInitializers.clear();
1119 for (
auto ID : LazyInits)
1120 Initializers.push_back(Source->GetExternalDecl(ID));
1122 assert(LazyInitializers.empty() &&
1123 "GetExternalDecl for lazy module initializer added more inits");
1129 if (
const auto *ID = dyn_cast<ImportDecl>(D)) {
1130 auto It = ModuleInitializers.find(ID->getImportedModule());
1133 if (It == ModuleInitializers.end())
1137 auto &Imported = *It->second;
1138 if (Imported.Initializers.size() + Imported.LazyInitializers.size() == 1) {
1139 Imported.resolve(*
this);
1140 auto *OnlyDecl = Imported.Initializers.front();
1146 auto *&
Inits = ModuleInitializers[M];
1148 Inits =
new (*this) PerModuleInitializers;
1149 Inits->Initializers.push_back(D);
1154 auto *&
Inits = ModuleInitializers[M];
1156 Inits =
new (*this) PerModuleInitializers;
1157 Inits->LazyInitializers.insert(
Inits->LazyInitializers.end(),
1158 IDs.begin(), IDs.end());
1162 auto It = ModuleInitializers.find(M);
1163 if (It == ModuleInitializers.end())
1166 auto *
Inits = It->second;
1167 Inits->resolve(*
this);
1168 return Inits->Initializers;
1173 assert(!CurrentCXXNamedModule &&
1174 "We should set named module for ASTContext for only once");
1175 CurrentCXXNamedModule = M;
1187 auto GetRepresentativeModule = [
this](
const Module *M) {
1188 auto Iter = SameModuleLookupSet.find(M);
1189 if (Iter != SameModuleLookupSet.end())
1190 return Iter->second;
1192 const Module *RepresentativeModule =
1193 PrimaryModuleNameMap.try_emplace(M->getPrimaryModuleInterfaceName(), M)
1195 SameModuleLookupSet[M] = RepresentativeModule;
1196 return RepresentativeModule;
1199 assert(M1 &&
"Shouldn't call `isInSameModule` if both M1 and M2 are none.");
1200 return GetRepresentativeModule(M1) == GetRepresentativeModule(M2);
1204 if (!ExternCContext)
1207 return ExternCContext;
1221#define BuiltinTemplate(BTName) \
1222 BuiltinTemplateDecl *ASTContext::get##BTName##Decl() const { \
1223 if (!Decl##BTName) \
1225 buildBuiltinTemplateDecl(BTK##BTName, get##BTName##Name()); \
1226 return Decl##BTName; \
1228#include "clang/Basic/BuiltinTemplates.inc"
1241 NewDecl->
addAttr(TypeVisibilityAttr::CreateImplicit(
1242 const_cast<ASTContext &
>(*
this), TypeVisibilityAttr::Default));
1247 StringRef Name)
const {
1271 Types.push_back(Ty);
1276 assert((!this->Target || this->Target == &Target) &&
1277 "Incorrect target reinitialization");
1278 assert(
VoidTy.isNull() &&
"Context reinitialized?");
1280 this->Target = &Target;
1281 this->AuxTarget = AuxTarget;
1283 ABI.reset(createCXXABI(Target));
1287 InitBuiltinType(
VoidTy, BuiltinType::Void);
1290 InitBuiltinType(
BoolTy, BuiltinType::Bool);
1292 if (LangOpts.CharIsSigned)
1293 InitBuiltinType(
CharTy, BuiltinType::Char_S);
1295 InitBuiltinType(
CharTy, BuiltinType::Char_U);
1298 InitBuiltinType(
ShortTy, BuiltinType::Short);
1299 InitBuiltinType(
IntTy, BuiltinType::Int);
1300 InitBuiltinType(
LongTy, BuiltinType::Long);
1301 InitBuiltinType(
LongLongTy, BuiltinType::LongLong);
1311 InitBuiltinType(
FloatTy, BuiltinType::Float);
1312 InitBuiltinType(
DoubleTy, BuiltinType::Double);
1313 InitBuiltinType(
LongDoubleTy, BuiltinType::LongDouble);
1316 InitBuiltinType(
Float128Ty, BuiltinType::Float128);
1319 InitBuiltinType(
Ibm128Ty, BuiltinType::Ibm128);
1322 InitBuiltinType(
Float16Ty, BuiltinType::Float16);
1325 InitBuiltinType(
ShortAccumTy, BuiltinType::ShortAccum);
1326 InitBuiltinType(
AccumTy, BuiltinType::Accum);
1327 InitBuiltinType(
LongAccumTy, BuiltinType::LongAccum);
1331 InitBuiltinType(
ShortFractTy, BuiltinType::ShortFract);
1332 InitBuiltinType(
FractTy, BuiltinType::Fract);
1333 InitBuiltinType(
LongFractTy, BuiltinType::LongFract);
1338 InitBuiltinType(
SatAccumTy, BuiltinType::SatAccum);
1344 InitBuiltinType(
SatFractTy, BuiltinType::SatFract);
1351 InitBuiltinType(
Int128Ty, BuiltinType::Int128);
1356 InitBuiltinType(
WCharTy, BuiltinType::WChar_S);
1358 InitBuiltinType(
WCharTy, BuiltinType::WChar_U);
1359 if (LangOpts.CPlusPlus && LangOpts.WChar)
1363 WideCharTy = getFromTargetType(Target.getWCharType());
1366 WIntTy = getFromTargetType(Target.getWIntType());
1369 InitBuiltinType(
Char8Ty, BuiltinType::Char8);
1371 if (LangOpts.CPlusPlus)
1372 InitBuiltinType(
Char16Ty, BuiltinType::Char16);
1374 Char16Ty = getFromTargetType(Target.getChar16Type());
1376 if (LangOpts.CPlusPlus)
1377 InitBuiltinType(
Char32Ty, BuiltinType::Char32);
1379 Char32Ty = getFromTargetType(Target.getChar32Type());
1386 InitBuiltinType(
DependentTy, BuiltinType::Dependent);
1389 InitBuiltinType(
OverloadTy, BuiltinType::Overload);
1401 InitBuiltinType(
UnknownAnyTy, BuiltinType::UnknownAny);
1407 InitBuiltinType(
BuiltinFnTy, BuiltinType::BuiltinFn);
1410 if (LangOpts.OpenMP) {
1417 if (LangOpts.OpenACC && !LangOpts.OpenMP) {
1420 if (LangOpts.MatrixTypes)
1428 if (LangOpts.OpenCL) {
1429#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
1430 InitBuiltinType(SingletonId, BuiltinType::Id);
1431#include "clang/Basic/OpenCLImageTypes.def"
1433 InitBuiltinType(
OCLSamplerTy, BuiltinType::OCLSampler);
1434 InitBuiltinType(
OCLEventTy, BuiltinType::OCLEvent);
1436 InitBuiltinType(
OCLQueueTy, BuiltinType::OCLQueue);
1439#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
1440 InitBuiltinType(Id##Ty, BuiltinType::Id);
1441#include "clang/Basic/OpenCLExtensionTypes.def"
1444 if (LangOpts.HLSL) {
1445#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) \
1446 InitBuiltinType(SingletonId, BuiltinType::Id);
1447#include "clang/Basic/HLSLIntangibleTypes.def"
1450 if (Target.hasAArch64ACLETypes() ||
1451 (AuxTarget && AuxTarget->hasAArch64ACLETypes())) {
1452#define SVE_TYPE(Name, Id, SingletonId) \
1453 InitBuiltinType(SingletonId, BuiltinType::Id);
1454#include "clang/Basic/AArch64ACLETypes.def"
1457 if (Target.getTriple().isPPC64()) {
1458#define PPC_VECTOR_MMA_TYPE(Name, Id, Size) \
1459 InitBuiltinType(Id##Ty, BuiltinType::Id);
1460#include "clang/Basic/PPCTypes.def"
1461#define PPC_VECTOR_VSX_TYPE(Name, Id, Size) \
1462 InitBuiltinType(Id##Ty, BuiltinType::Id);
1463#include "clang/Basic/PPCTypes.def"
1466 if (Target.hasRISCVVTypes()) {
1467#define RVV_TYPE(Name, Id, SingletonId) \
1468 InitBuiltinType(SingletonId, BuiltinType::Id);
1469#include "clang/Basic/RISCVVTypes.def"
1472 if (Target.getTriple().isWasm() && Target.hasFeature(
"reference-types")) {
1473#define WASM_TYPE(Name, Id, SingletonId) \
1474 InitBuiltinType(SingletonId, BuiltinType::Id);
1475#include "clang/Basic/WebAssemblyReferenceTypes.def"
1478 if (Target.getTriple().isAMDGPU() ||
1479 (Target.getTriple().isSPIRV() &&
1480 Target.getTriple().getVendor() == llvm::Triple::AMD) ||
1482 (AuxTarget->getTriple().isAMDGPU() ||
1483 ((AuxTarget->getTriple().isSPIRV() &&
1484 AuxTarget->getTriple().getVendor() == llvm::Triple::AMD))))) {
1485#define AMDGPU_TYPE(Name, Id, SingletonId, Width, Align) \
1486 InitBuiltinType(SingletonId, BuiltinType::Id);
1487#include "clang/Basic/AMDGPUTypes.def"
1494 ObjCConstantStringType =
QualType();
1499 if (LangOpts.OpenCLGenericAddressSpace) {
1500 auto Q =
VoidTy.getQualifiers();
1509 InitBuiltinType(
NullPtrTy, BuiltinType::NullPtr);
1512 InitBuiltinType(
HalfTy, BuiltinType::Half);
1514 InitBuiltinType(
BFloat16Ty, BuiltinType::BFloat16);
1520 if (LangOpts.MicrosoftExt || LangOpts.Borland) {
1527 return SourceMgr.getDiagnostics();
1542 llvm::DenseMap<const Decl*, AttrVec*>::iterator Pos = DeclAttrs.find(D);
1543 if (Pos != DeclAttrs.end()) {
1544 Pos->second->~AttrVec();
1545 DeclAttrs.erase(Pos);
1553 if (It != ExplicitInstantiations.end())
1574 llvm::DenseMap<const VarDecl *, TemplateOrSpecializationInfo>::iterator Pos =
1575 TemplateOrInstantiation.find(Var);
1576 if (Pos == TemplateOrInstantiation.end())
1589 Tmpl, TSK, PointOfInstantiation));
1595 assert(!TemplateOrInstantiation[Inst] &&
1596 "Already noted what the variable was instantiated from");
1597 TemplateOrInstantiation[Inst] = TSI;
1602 return InstantiatedFromUsingDecl.lookup(UUD);
1610 "pattern decl is not a using decl");
1614 "instantiation did not produce a using decl");
1615 assert(!InstantiatedFromUsingDecl[Inst] &&
"pattern already exists");
1616 InstantiatedFromUsingDecl[Inst] = Pattern;
1621 return InstantiatedFromUsingEnumDecl.lookup(UUD);
1626 assert(!InstantiatedFromUsingEnumDecl[Inst] &&
"pattern already exists");
1627 InstantiatedFromUsingEnumDecl[Inst] = Pattern;
1632 return InstantiatedFromUsingShadowDecl.lookup(Inst);
1638 assert(!InstantiatedFromUsingShadowDecl[Inst] &&
"pattern already exists");
1639 InstantiatedFromUsingShadowDecl[Inst] = Pattern;
1644 return InstantiatedFromUnnamedFieldDecl.lookup(Field);
1650 "Instantiated field decl is not unnamed");
1652 "Template field decl is not unnamed");
1653 assert(!InstantiatedFromUnnamedFieldDecl[Inst] &&
1654 "Already noted what unnamed field was instantiated from");
1656 InstantiatedFromUnnamedFieldDecl[Inst] = Tmpl;
1672 return Range.end() - Range.begin();
1677 llvm::DenseMap<const CXXMethodDecl *, CXXMethodVector>::const_iterator Pos =
1678 OverriddenMethods.find(
Method->getCanonicalDecl());
1679 if (Pos == OverriddenMethods.end())
1687 OverriddenMethods[
Method].push_back(Overridden);
1695 if (
const auto *CXXMethod = dyn_cast<CXXMethodDecl>(D)) {
1701 const auto *
Method = dyn_cast<ObjCMethodDecl>(D);
1706 Method->getOverriddenMethods(OverDecls);
1707 Overridden.append(OverDecls.begin(), OverDecls.end());
1710std::optional<ASTContext::CXXRecordDeclRelocationInfo>
1714 auto it = RelocatableClasses.find(D);
1715 if (it != RelocatableClasses.end())
1716 return it->getSecond();
1717 return std::nullopt;
1724 assert(RelocatableClasses.find(D) == RelocatableClasses.end());
1725 RelocatableClasses.insert({D, Info});
1730 if (!Class->isPolymorphic())
1732 const CXXRecordDecl *BaseType = Context.baseForVTableAuthentication(Class);
1733 using AuthAttr = VTablePointerAuthenticationAttr;
1734 const AuthAttr *ExplicitAuth = BaseType->
getAttr<AuthAttr>();
1736 return Context.getLangOpts().PointerAuthVTPtrAddressDiscrimination;
1737 AuthAttr::AddressDiscriminationMode AddressDiscrimination =
1738 ExplicitAuth->getAddressDiscrimination();
1739 if (AddressDiscrimination == AuthAttr::DefaultAddressDiscrimination)
1740 return Context.getLangOpts().PointerAuthVTPtrAddressDiscrimination;
1741 return AddressDiscrimination == AuthAttr::AddressDiscrimination;
1744ASTContext::PointerAuthContent
1745ASTContext::findPointerAuthContent(QualType T)
const {
1746 assert(isPointerAuthenticationAvailable());
1750 return PointerAuthContent::None;
1753 return PointerAuthContent::AddressDiscriminatedData;
1756 return PointerAuthContent::None;
1759 return PointerAuthContent::None;
1761 if (
auto Existing = RecordContainsAddressDiscriminatedPointerAuth.find(RD);
1762 Existing != RecordContainsAddressDiscriminatedPointerAuth.end())
1763 return Existing->second;
1765 PointerAuthContent
Result = PointerAuthContent::None;
1767 auto SaveResultAndReturn = [&]() -> PointerAuthContent {
1768 auto [ResultIter, DidAdd] =
1769 RecordContainsAddressDiscriminatedPointerAuth.try_emplace(RD,
Result);
1775 auto ShouldContinueAfterUpdate = [&](PointerAuthContent NewResult) {
1776 static_assert(PointerAuthContent::None <
1777 PointerAuthContent::AddressDiscriminatedVTable);
1778 static_assert(PointerAuthContent::AddressDiscriminatedVTable <
1779 PointerAuthContent::AddressDiscriminatedData);
1782 return Result != PointerAuthContent::AddressDiscriminatedData;
1784 if (
const CXXRecordDecl *CXXRD = dyn_cast<CXXRecordDecl>(RD)) {
1786 !ShouldContinueAfterUpdate(
1787 PointerAuthContent::AddressDiscriminatedVTable))
1788 return SaveResultAndReturn();
1789 for (
auto Base : CXXRD->bases()) {
1790 if (!ShouldContinueAfterUpdate(findPointerAuthContent(
Base.getType())))
1791 return SaveResultAndReturn();
1794 for (
auto *FieldDecl : RD->
fields()) {
1795 if (!ShouldContinueAfterUpdate(
1796 findPointerAuthContent(FieldDecl->getType())))
1797 return SaveResultAndReturn();
1799 return SaveResultAndReturn();
1803 assert(!Import->getNextLocalImport() &&
1804 "Import declaration already in the chain");
1805 assert(!Import->isFromASTFile() &&
"Non-local import declaration");
1806 if (!FirstLocalImport) {
1807 FirstLocalImport = Import;
1808 LastLocalImport = Import;
1812 LastLocalImport->setNextLocalImport(Import);
1813 LastLocalImport = Import;
1825 llvm_unreachable(
"Not a floating point type!");
1826 case BuiltinType::BFloat16:
1827 return Target->getBFloat16Format();
1828 case BuiltinType::Float16:
1829 return Target->getHalfFormat();
1830 case BuiltinType::Half:
1831 return Target->getHalfFormat();
1832 case BuiltinType::Float:
return Target->getFloatFormat();
1833 case BuiltinType::Double:
return Target->getDoubleFormat();
1834 case BuiltinType::Ibm128:
1835 return Target->getIbm128Format();
1836 case BuiltinType::LongDouble:
1838 return AuxTarget->getLongDoubleFormat();
1839 return Target->getLongDoubleFormat();
1840 case BuiltinType::Float128:
1842 return AuxTarget->getFloat128Format();
1843 return Target->getFloat128Format();
1848 unsigned Align = Target->getCharWidth();
1852 Align = AlignFromAttr;
1860 bool UseAlignAttrOnly;
1861 if (
const FieldDecl *FD = dyn_cast<FieldDecl>(D))
1863 FD->hasAttr<PackedAttr>() || FD->getParent()->hasAttr<PackedAttr>();
1865 UseAlignAttrOnly = AlignFromAttr != 0;
1868 if (UseAlignAttrOnly) {
1870 }
else if (
const auto *VD = dyn_cast<ValueDecl>(D)) {
1874 T = RT->getPointeeType();
1879 if (T->isFunctionType())
1880 Align = getTypeInfoImpl(T.getTypePtr()).Align;
1885 unsigned MinWidth = Target->getLargeArrayMinWidth();
1886 if (!ForAlignof && MinWidth) {
1888 Align = std::max(Align, Target->getLargeArrayAlign());
1891 Align = std::max(Align, Target->getLargeArrayAlign());
1896 Align = Target->getCharWidth();
1900 if (
const auto *VD = dyn_cast<VarDecl>(D))
1901 if (VD->hasGlobalStorage() && !ForAlignof) {
1912 if (
const auto *Field = dyn_cast<FieldDecl>(VD)) {
1926 uint64_t LowBitOfOffset = Offset & (~Offset + 1);
1927 if (LowBitOfOffset < FieldAlign)
1928 FieldAlign =
static_cast<unsigned>(LowBitOfOffset);
1931 Align = std::min(Align, FieldAlign);
1939 const auto *VD = dyn_cast<VarDecl>(D);
1940 if (MaxAlignedAttr && VD && VD->getStorageClass() ==
SC_Static)
1941 Align = std::min(Align, MaxAlignedAttr);
1961 if (
const auto *RD = T->getAsCXXRecordDecl(); RD && !RD->
isInvalidDecl()) {
1978 (uint64_t)(-1)/Size) &&
1979 "Overflow in array type char size evaluation");
1982 if (!Context.getTargetInfo().getCXXABI().isMicrosoft() ||
1984 Width = llvm::alignTo(Width, Align);
1991 if (
const auto *CAT = dyn_cast<ConstantArrayType>(T))
2009 switch (BT->getKind()) {
2010 case BuiltinType::Bool:
2011 case BuiltinType::Char_S:
2012 case BuiltinType::Char_U:
2013 case BuiltinType::SChar:
2014 case BuiltinType::UChar:
2015 case BuiltinType::Short:
2016 case BuiltinType::UShort:
2017 case BuiltinType::WChar_S:
2018 case BuiltinType::WChar_U:
2019 case BuiltinType::Char8:
2020 case BuiltinType::Char16:
2021 case BuiltinType::Char32:
2029 if (
const auto *ED = T->getAsEnumDecl()) {
2030 if (T->isDependentType() || ED->getPromotionType().isNull() ||
2038 if (
const auto *OBT = T->getAs<OverflowBehaviorType>()) {
2054 bool NeedsPreferredAlignment)
const {
2057 if (
unsigned Align = TT->getDecl()->getMaxAlignment())
2062 if (!T->isIncompleteType())
2068 if (
unsigned Align = TT->getDecl()->getMaxAlignment())
2072 if (
const auto *TD = T->getAsTagDecl())
2073 return TD->getMaxAlignment();
2079 TypeInfoMap::iterator I = MemoizedTypeInfo.find(T);
2080 if (I != MemoizedTypeInfo.end())
2085 MemoizedTypeInfo[T] = TI;
2095TypeInfo ASTContext::getTypeInfoImpl(
const Type *T)
const {
2100 switch (T->getTypeClass()) {
2101#define TYPE(Class, Base)
2102#define ABSTRACT_TYPE(Class, Base)
2103#define NON_CANONICAL_TYPE(Class, Base)
2104#define DEPENDENT_TYPE(Class, Base) case Type::Class:
2105#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base) \
2107 assert(!T->isDependentType() && "should not see dependent types here"); \
2108 return getTypeInfo(cast<Class##Type>(T)->desugar().getTypePtr());
2109#include "clang/AST/TypeNodes.inc"
2110 llvm_unreachable(
"Should not see dependent types");
2112 case Type::FunctionNoProto:
2113 case Type::FunctionProto:
2119 case Type::IncompleteArray:
2120 case Type::VariableArray:
2121 case Type::ConstantArray:
2122 case Type::ArrayParameter: {
2125 if (
const auto *CAT = dyn_cast<ConstantArrayType>(T))
2126 Size = CAT->getZExtSize();
2129 assert((Size == 0 || EltInfo.
Width <= (uint64_t)(-1) / Size) &&
2130 "Overflow in array type bit size evaluation");
2131 Width = EltInfo.
Width * Size;
2132 Align = EltInfo.
Align;
2136 Width = llvm::alignTo(Width, Align);
2140 case Type::ExtVector:
2141 case Type::Vector: {
2144 Width = VT->isPackedVectorBoolType(*
this)
2145 ? VT->getNumElements()
2146 : EltInfo.
Width * VT->getNumElements();
2148 Width = std::max<unsigned>(8, Width);
2149 Align = std::max<unsigned>(
2150 8,
Target->vectorsAreElementAligned() ? EltInfo.
Width : Width);
2154 if (Align & (Align-1)) {
2155 Align = llvm::bit_ceil(Align);
2156 Width = llvm::alignTo(Width, Align);
2159 uint64_t TargetVectorAlign = Target->getMaxVectorAlign();
2160 if (TargetVectorAlign && TargetVectorAlign < Align)
2161 Align = TargetVectorAlign;
2175 Align = std::min<unsigned>(64, Width);
2179 case Type::ConstantMatrix: {
2181 TypeInfo ElementInfo =
getTypeInfo(MT->getElementType());
2185 Width = ElementInfo.
Width * MT->getNumRows() * MT->getNumColumns();
2186 Align = ElementInfo.
Align;
2192 default: llvm_unreachable(
"Unknown builtin type!");
2193 case BuiltinType::Void:
2198 case BuiltinType::Bool:
2199 Width = Target->getBoolWidth();
2200 Align = Target->getBoolAlign();
2202 case BuiltinType::Char_S:
2203 case BuiltinType::Char_U:
2204 case BuiltinType::UChar:
2205 case BuiltinType::SChar:
2206 case BuiltinType::Char8:
2207 Width = Target->getCharWidth();
2208 Align = Target->getCharAlign();
2210 case BuiltinType::WChar_S:
2211 case BuiltinType::WChar_U:
2212 Width = Target->getWCharWidth();
2213 Align = Target->getWCharAlign();
2215 case BuiltinType::Char16:
2216 Width = Target->getChar16Width();
2217 Align = Target->getChar16Align();
2219 case BuiltinType::Char32:
2220 Width = Target->getChar32Width();
2221 Align = Target->getChar32Align();
2223 case BuiltinType::UShort:
2224 case BuiltinType::Short:
2225 Width = Target->getShortWidth();
2226 Align = Target->getShortAlign();
2228 case BuiltinType::UInt:
2229 case BuiltinType::Int:
2230 Width = Target->getIntWidth();
2231 Align = Target->getIntAlign();
2233 case BuiltinType::ULong:
2234 case BuiltinType::Long:
2235 Width = Target->getLongWidth();
2236 Align = Target->getLongAlign();
2238 case BuiltinType::ULongLong:
2239 case BuiltinType::LongLong:
2240 Width = Target->getLongLongWidth();
2241 Align = Target->getLongLongAlign();
2243 case BuiltinType::Int128:
2244 case BuiltinType::UInt128:
2246 Align = Target->getInt128Align();
2248 case BuiltinType::ShortAccum:
2249 case BuiltinType::UShortAccum:
2250 case BuiltinType::SatShortAccum:
2251 case BuiltinType::SatUShortAccum:
2252 Width = Target->getShortAccumWidth();
2253 Align = Target->getShortAccumAlign();
2255 case BuiltinType::Accum:
2256 case BuiltinType::UAccum:
2257 case BuiltinType::SatAccum:
2258 case BuiltinType::SatUAccum:
2259 Width = Target->getAccumWidth();
2260 Align = Target->getAccumAlign();
2262 case BuiltinType::LongAccum:
2263 case BuiltinType::ULongAccum:
2264 case BuiltinType::SatLongAccum:
2265 case BuiltinType::SatULongAccum:
2266 Width = Target->getLongAccumWidth();
2267 Align = Target->getLongAccumAlign();
2269 case BuiltinType::ShortFract:
2270 case BuiltinType::UShortFract:
2271 case BuiltinType::SatShortFract:
2272 case BuiltinType::SatUShortFract:
2273 Width = Target->getShortFractWidth();
2274 Align = Target->getShortFractAlign();
2276 case BuiltinType::Fract:
2277 case BuiltinType::UFract:
2278 case BuiltinType::SatFract:
2279 case BuiltinType::SatUFract:
2280 Width = Target->getFractWidth();
2281 Align = Target->getFractAlign();
2283 case BuiltinType::LongFract:
2284 case BuiltinType::ULongFract:
2285 case BuiltinType::SatLongFract:
2286 case BuiltinType::SatULongFract:
2287 Width = Target->getLongFractWidth();
2288 Align = Target->getLongFractAlign();
2290 case BuiltinType::BFloat16:
2291 if (Target->hasBFloat16Type()) {
2292 Width = Target->getBFloat16Width();
2293 Align = Target->getBFloat16Align();
2297 AuxTarget->hasBFloat16Type()) {
2298 Width = AuxTarget->getBFloat16Width();
2299 Align = AuxTarget->getBFloat16Align();
2302 case BuiltinType::Float16:
2303 case BuiltinType::Half:
2304 if (Target->hasFloat16Type() || !
getLangOpts().OpenMP ||
2306 Width = Target->getHalfWidth();
2307 Align = Target->getHalfAlign();
2310 "Expected OpenMP device compilation.");
2311 Width = AuxTarget->getHalfWidth();
2312 Align = AuxTarget->getHalfAlign();
2315 case BuiltinType::Float:
2316 Width = Target->getFloatWidth();
2317 Align = Target->getFloatAlign();
2319 case BuiltinType::Double:
2320 Width = Target->getDoubleWidth();
2321 Align = Target->getDoubleAlign();
2323 case BuiltinType::Ibm128:
2324 Width = Target->getIbm128Width();
2325 Align = Target->getIbm128Align();
2327 case BuiltinType::LongDouble:
2329 (Target->getLongDoubleWidth() != AuxTarget->getLongDoubleWidth() ||
2330 Target->getLongDoubleAlign() != AuxTarget->getLongDoubleAlign())) {
2331 Width = AuxTarget->getLongDoubleWidth();
2332 Align = AuxTarget->getLongDoubleAlign();
2334 Width = Target->getLongDoubleWidth();
2335 Align = Target->getLongDoubleAlign();
2338 case BuiltinType::Float128:
2339 if (Target->hasFloat128Type() || !
getLangOpts().OpenMP ||
2341 Width = Target->getFloat128Width();
2342 Align = Target->getFloat128Align();
2345 "Expected OpenMP device compilation.");
2346 Width = AuxTarget->getFloat128Width();
2347 Align = AuxTarget->getFloat128Align();
2350 case BuiltinType::NullPtr:
2355 case BuiltinType::ObjCId:
2356 case BuiltinType::ObjCClass:
2357 case BuiltinType::ObjCSel:
2361 case BuiltinType::OCLSampler:
2362 case BuiltinType::OCLEvent:
2363 case BuiltinType::OCLClkEvent:
2364 case BuiltinType::OCLQueue:
2365 case BuiltinType::OCLReserveID:
2366#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
2367 case BuiltinType::Id:
2368#include "clang/Basic/OpenCLImageTypes.def"
2369#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
2370 case BuiltinType::Id:
2371#include "clang/Basic/OpenCLExtensionTypes.def"
2373 Width = Target->getPointerWidth(AS);
2374 Align = Target->getPointerAlign(AS);
2384#define SVE_VECTOR_TYPE(Name, MangledName, Id, SingletonId) \
2385 case BuiltinType::Id: \
2389#define SVE_PREDICATE_TYPE(Name, MangledName, Id, SingletonId) \
2390 case BuiltinType::Id: \
2394#define SVE_OPAQUE_TYPE(Name, MangledName, Id, SingletonId) \
2395 case BuiltinType::Id: \
2399#define SVE_SCALAR_TYPE(Name, MangledName, Id, SingletonId, Bits) \
2400 case BuiltinType::Id: \
2404#include "clang/Basic/AArch64ACLETypes.def"
2405#define PPC_VECTOR_TYPE(Name, Id, Size) \
2406 case BuiltinType::Id: \
2410#include "clang/Basic/PPCTypes.def"
2411#define RVV_VECTOR_TYPE(Name, Id, SingletonId, ElKind, ElBits, NF, IsSigned, \
2413 case BuiltinType::Id: \
2417#define RVV_PREDICATE_TYPE(Name, Id, SingletonId, ElKind) \
2418 case BuiltinType::Id: \
2422#include "clang/Basic/RISCVVTypes.def"
2423#define WASM_TYPE(Name, Id, SingletonId) \
2424 case BuiltinType::Id: \
2428#include "clang/Basic/WebAssemblyReferenceTypes.def"
2429#define AMDGPU_TYPE(NAME, ID, SINGLETONID, WIDTH, ALIGN) \
2430 case BuiltinType::ID: \
2434#include "clang/Basic/AMDGPUTypes.def"
2435#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
2436#include "clang/Basic/HLSLIntangibleTypes.def"
2442 case Type::ObjCObjectPointer:
2446 case Type::BlockPointer:
2448 Width = Target->getPointerWidth(AS);
2449 Align = Target->getPointerAlign(AS);
2451 case Type::LValueReference:
2452 case Type::RValueReference:
2456 Width = Target->getPointerWidth(AS);
2457 Align = Target->getPointerAlign(AS);
2461 Width = Target->getPointerWidth(AS);
2462 Align = Target->getPointerAlign(AS);
2464 case Type::MemberPointer: {
2466 CXXABI::MemberPointerInfo MPI = ABI->getMemberPointerInfo(MPT);
2471 case Type::Complex: {
2475 Width = EltInfo.
Width * 2;
2476 Align = EltInfo.
Align;
2479 case Type::ObjCObject:
2481 case Type::Adjusted:
2484 case Type::ObjCInterface: {
2486 if (ObjCI->getDecl()->isInvalidDecl()) {
2496 case Type::BitInt: {
2498 Align = Target->getBitIntAlign(EIT->getNumBits());
2499 Width = Target->getBitIntWidth(EIT->getNumBits());
2505 const TagDecl *TD = TT->getDecl()->getDefinitionOrSelf();
2518 Info.
Align = AttrAlign;
2528 AlignRequirement = RD->
hasAttr<AlignedAttr>()
2534 case Type::SubstTemplateTypeParm:
2536 getReplacementType().getTypePtr());
2539 case Type::DeducedTemplateSpecialization: {
2541 assert(!A->getDeducedType().isNull() &&
2542 "cannot request the size of an undeduced or dependent auto type");
2543 return getTypeInfo(A->getDeducedType().getTypePtr());
2549 case Type::MacroQualified:
2553 case Type::ObjCTypeParam:
2559 case Type::Typedef: {
2561 TypeInfo Info =
getTypeInfo(TT->desugar().getTypePtr());
2565 if (
unsigned AttrAlign = TT->getDecl()->getMaxAlignment()) {
2576 case Type::Attributed:
2580 case Type::CountAttributed:
2583 case Type::BTFTagAttributed:
2587 case Type::OverflowBehavior:
2591 case Type::HLSLAttributedResource:
2595 case Type::HLSLInlineSpirv: {
2598 Width = ST->getSize() * 8;
2599 Align = ST->getAlignment();
2600 if (Width == 0 && Align == 0) {
2608 case Type::Atomic: {
2617 Width = Target->getCharWidth();
2619 }
else if (Width <= Target->getMaxAtomicPromoteWidth()) {
2625 Width = llvm::bit_ceil(Width);
2628 Align =
static_cast<unsigned>(Width);
2633 case Type::PredefinedSugar:
2642 assert(llvm::isPowerOf2_32(Align) &&
"Alignment must be power of 2");
2643 return TypeInfo(Width, Align, AlignRequirement);
2647 UnadjustedAlignMap::iterator I = MemoizedUnadjustedAlign.find(T);
2648 if (I != MemoizedUnadjustedAlign.end())
2651 unsigned UnadjustedAlign;
2652 if (
const auto *RT = T->getAsCanonical<RecordType>()) {
2659 UnadjustedAlign =
getTypeAlign(T->getUnqualifiedDesugaredType());
2662 MemoizedUnadjustedAlign[T] = UnadjustedAlign;
2663 return UnadjustedAlign;
2667 unsigned SimdAlign = llvm::OpenMPIRBuilder::getOpenMPDefaultSimdAlign(
2717 unsigned ABIAlign = TI.
Align;
2719 T = T->getBaseElementTypeUnsafe();
2722 if (T->isMemberPointerType())
2725 if (!Target->allowsLargerPreferedTypeAlignment())
2728 if (
const auto *RD = T->getAsRecordDecl()) {
2737 unsigned PreferredAlign =
static_cast<unsigned>(
2739 assert(PreferredAlign >= ABIAlign &&
2740 "PreferredAlign should be at least as large as ABIAlign.");
2741 return PreferredAlign;
2748 T = CT->getElementType().getTypePtr();
2749 if (
const auto *ED = T->getAsEnumDecl())
2750 T = ED->getIntegerType().getTypePtr();
2751 if (T->isSpecificBuiltinType(BuiltinType::Double) ||
2752 T->isSpecificBuiltinType(BuiltinType::LongLong) ||
2753 T->isSpecificBuiltinType(BuiltinType::ULongLong) ||
2754 (T->isSpecificBuiltinType(BuiltinType::LongDouble) &&
2755 Target->defaultsToAIXPowerAlignment()))
2759 return std::max(ABIAlign, (
unsigned)
getTypeSize(T));
2810 for (
unsigned I = 0, N = Path.size(); I != N; ++I) {
2814 std::swap(
Base, Derived);
2834 llvm::append_range(Ivars, OI->
ivars());
2837 for (
const ObjCIvarDecl *Iv = IDecl->all_declared_ivar_begin(); Iv;
2839 Ivars.push_back(Iv);
2847 if (
const auto *OI = dyn_cast<ObjCInterfaceDecl>(CDecl)) {
2850 for (
auto *Proto : OI->all_referenced_protocols()) {
2855 for (
const auto *Cat : OI->visible_categories())
2861 SD = SD->getSuperClass();
2863 }
else if (
const auto *OC = dyn_cast<ObjCCategoryDecl>(CDecl)) {
2864 for (
auto *Proto : OC->protocols()) {
2867 }
else if (
const auto *OP = dyn_cast<ObjCProtocolDecl>(CDecl)) {
2869 if (!Protocols.insert(
2873 for (
auto *Proto : OP->protocols())
2880 bool CheckIfTriviallyCopyable) {
2881 assert(RD->
isUnion() &&
"Must be union type");
2883 Context.getTypeSizeInChars(Context.getCanonicalTagType(RD));
2885 for (
const auto *Field : RD->
fields()) {
2886 if (!Context.hasUniqueObjectRepresentations(Field->getType(),
2887 CheckIfTriviallyCopyable))
2889 CharUnits FieldSize = Context.getTypeSizeInChars(Field->getType());
2890 if (FieldSize != UnionSize)
2899 return Context.getFieldOffset(Field);
2908static std::optional<int64_t>
2910 const RecordDecl *RD,
2911 bool CheckIfTriviallyCopyable);
2913static std::optional<int64_t>
2915 bool CheckIfTriviallyCopyable) {
2916 if (
const auto *RD = Field->getType()->getAsRecordDecl();
2919 CheckIfTriviallyCopyable);
2923 bool IsBitIntType = Field->getType()->isBitIntType();
2924 if (!Field->getType()->isReferenceType() && !IsBitIntType &&
2925 !Context.hasUniqueObjectRepresentations(Field->getType(),
2926 CheckIfTriviallyCopyable))
2927 return std::nullopt;
2929 int64_t FieldSizeInBits =
2930 Context.toBits(Context.getTypeSizeInChars(Field->getType()));
2931 if (Field->isBitField()) {
2934 if (Field->isUnnamedBitField())
2937 int64_t BitfieldSize = Field->getBitWidthValue();
2939 if ((
unsigned)BitfieldSize >
2941 return std::nullopt;
2942 }
else if (BitfieldSize > FieldSizeInBits) {
2943 return std::nullopt;
2945 FieldSizeInBits = BitfieldSize;
2946 }
else if (IsBitIntType && !Context.hasUniqueObjectRepresentations(
2947 Field->getType(), CheckIfTriviallyCopyable)) {
2948 return std::nullopt;
2950 return FieldSizeInBits;
2953static std::optional<int64_t>
2955 bool CheckIfTriviallyCopyable) {
2957 CheckIfTriviallyCopyable);
2960template <
typename RangeT>
2962 const RangeT &Subobjects, int64_t CurOffsetInBits,
2964 bool CheckIfTriviallyCopyable) {
2965 for (
const auto *Subobject : Subobjects) {
2966 std::optional<int64_t> SizeInBits =
2969 return std::nullopt;
2970 if (*SizeInBits != 0) {
2972 if (Offset != CurOffsetInBits)
2973 return std::nullopt;
2974 CurOffsetInBits += *SizeInBits;
2977 return CurOffsetInBits;
2980static std::optional<int64_t>
2983 bool CheckIfTriviallyCopyable) {
2984 assert(!RD->
isUnion() &&
"Must be struct/class type");
2985 const auto &Layout = Context.getASTRecordLayout(RD);
2987 int64_t CurOffsetInBits = 0;
2988 if (
const auto *ClassDecl = dyn_cast<CXXRecordDecl>(RD)) {
2989 if (ClassDecl->isDynamicClass())
2990 return std::nullopt;
2993 for (
const auto &
Base : ClassDecl->bases()) {
2996 Bases.emplace_back(
Base.getType()->getAsCXXRecordDecl());
3000 return Layout.getBaseClassOffset(L) < Layout.getBaseClassOffset(R);
3003 std::optional<int64_t> OffsetAfterBases =
3005 Bases, CurOffsetInBits, Context, Layout, CheckIfTriviallyCopyable);
3006 if (!OffsetAfterBases)
3007 return std::nullopt;
3008 CurOffsetInBits = *OffsetAfterBases;
3011 std::optional<int64_t> OffsetAfterFields =
3013 RD->
fields(), CurOffsetInBits, Context, Layout,
3014 CheckIfTriviallyCopyable);
3015 if (!OffsetAfterFields)
3016 return std::nullopt;
3017 CurOffsetInBits = *OffsetAfterFields;
3019 return CurOffsetInBits;
3023 QualType Ty,
bool CheckIfTriviallyCopyable)
const {
3040 assert(!Ty.
isNull() &&
"Null QualType sent to unique object rep check");
3045 CheckIfTriviallyCopyable);
3048 "hasUniqueObjectRepresentations should not be called with an "
3072 return !ABI->getMemberPointerInfo(MPT).HasPadding;
3075 if (
Record->isInvalidDecl())
3080 CheckIfTriviallyCopyable);
3083 *
this,
Record, CheckIfTriviallyCopyable);
3085 return StructSize && *StructSize ==
static_cast<int64_t
>(
getTypeSize(Ty));
3106 count += Ext->ivar_size();
3111 count += ImplDecl->ivar_size();
3137 llvm::DenseMap<ObjCContainerDecl*, ObjCImplDecl*>::iterator
3138 I = ObjCImpls.find(D);
3139 if (I != ObjCImpls.end())
3147 llvm::DenseMap<ObjCContainerDecl*, ObjCImplDecl*>::iterator
3148 I = ObjCImpls.find(D);
3149 if (I != ObjCImpls.end())
3157 assert(IFaceD && ImplD &&
"Passed null params");
3158 ObjCImpls[IFaceD] = ImplD;
3164 assert(CatD && ImplD &&
"Passed null params");
3165 ObjCImpls[CatD] = ImplD;
3170 return ObjCMethodRedecls.
lookup(MD);
3176 ObjCMethodRedecls[MD] = Redecl;
3181 if (
const auto *ID = dyn_cast<ObjCInterfaceDecl>(ND->
getDeclContext()))
3183 if (
const auto *CD = dyn_cast<ObjCCategoryDecl>(ND->
getDeclContext()))
3184 return CD->getClassInterface();
3185 if (
const auto *IMD = dyn_cast<ObjCImplDecl>(ND->
getDeclContext()))
3186 return IMD->getClassInterface();
3194 assert(VD &&
"Passed null params");
3195 assert(VD->
hasAttr<BlocksAttr>() &&
3196 "getBlockVarCopyInits - not __block var");
3197 auto I = BlockVarCopyInits.find(VD);
3198 if (I != BlockVarCopyInits.end())
3200 return {
nullptr,
false};
3206 assert(VD && CopyExpr &&
"Passed null params");
3207 assert(VD->
hasAttr<BlocksAttr>() &&
3208 "setBlockVarCopyInits - not __block var");
3209 BlockVarCopyInits[VD].setExprAndFlag(CopyExpr,
CanThrow);
3213 unsigned DataSize)
const {
3218 "incorrect data size provided to CreateTypeSourceInfo!");
3235 return getObjCLayout(D);
3240 bool &AnyNonCanonArgs) {
3242 AnyNonCanonArgs |=
C.canonicalizeTemplateArguments(CanonArgs);
3248 bool AnyNonCanonArgs =
false;
3249 for (
auto &Arg : Args) {
3252 AnyNonCanonArgs |= !Arg.structurallyEquals(OrigArg);
3254 return AnyNonCanonArgs;
3262ASTContext::getExtQualType(
const Type *baseType,
Qualifiers quals)
const {
3267 llvm::FoldingSetNodeID ID;
3269 void *insertPos =
nullptr;
3270 if (
ExtQuals *eq = ExtQualNodes.FindNodeOrInsertPos(ID, insertPos)) {
3271 assert(eq->getQualifiers() == quals);
3280 canon = getExtQualType(canonSplit.
Ty, canonSplit.
Quals);
3283 (void) ExtQualNodes.FindNodeOrInsertPos(ID, insertPos);
3286 auto *eq =
new (*
this,
alignof(ExtQuals)) ExtQuals(baseType, canon, quals);
3287 ExtQualNodes.InsertNode(eq, insertPos);
3288 return QualType(eq, fastQuals);
3292 LangAS AddressSpace)
const {
3305 "Type cannot be in multiple addr spaces!");
3308 return getExtQualType(TypeNode, Quals);
3314 if (!T.hasAddressSpace())
3318 const Type *TypeNode;
3321 if (T.getTypePtr()->isArrayType()) {
3323 TypeNode = T.getTypePtr();
3327 while (T.hasAddressSpace()) {
3328 TypeNode = Quals.
strip(T);
3332 if (!
QualType(TypeNode, 0).hasAddressSpace())
3336 T = T.getSingleStepDesugaredType(*
this);
3346 return getExtQualType(TypeNode, Quals);
3354 "Attempted to get vtable pointer discriminator on a monomorphic type");
3357 llvm::raw_svector_ostream Out(Str);
3358 MC->mangleCXXVTable(RD, Out);
3359 return llvm::getPointerAuthStableSipHash(Str);
3385 switch (T->getTypeClass()) {
3390 case Type::LValueReference:
3395 case Type::RValueReference:
3409 case Type::ObjCObjectPointer:
3410 case Type::BlockPointer:
3419 case Type::VariableArray:
3420 case Type::ConstantArray:
3421 case Type::IncompleteArray:
3422 case Type::ArrayParameter:
3435 case Type::ObjCInterface:
3436 case Type::ObjCObject:
3437 OS <<
"<objc_object>";
3448 Ctx, OS, UnderlyingType.
isNull() ? Ctx.
IntTy : UnderlyingType);
3451 case Type::FunctionNoProto:
3452 case Type::FunctionProto: {
3468 if (
const auto *FPT = dyn_cast<FunctionProtoType>(FuncType)) {
3469 for (
QualType Param : FPT->param_types()) {
3473 if (FPT->isVariadic())
3480 case Type::MemberPointer: {
3484 Ctx, OS,
QualType(MPT->getQualifier().getAsType(), 0));
3488 case Type::ExtVector:
3496 case Type::ConstantMatrix:
3500 case Type::Builtin: {
3502 switch (BTy->getKind()) {
3503#define SIGNED_TYPE(Id, SingletonId) \
3504 case BuiltinType::Id: \
3507#define UNSIGNED_TYPE(Id, SingletonId) \
3508 case BuiltinType::Id: \
3511#define PLACEHOLDER_TYPE(Id, SingletonId) case BuiltinType::Id:
3512#define BUILTIN_TYPE(Id, SingletonId)
3513#include "clang/AST/BuiltinTypes.def"
3514 llvm_unreachable(
"placeholder types should not appear here.");
3516 case BuiltinType::Half:
3519 case BuiltinType::Float:
3522 case BuiltinType::Double:
3525 case BuiltinType::LongDouble:
3528 case BuiltinType::Float16:
3531 case BuiltinType::Float128:
3535 case BuiltinType::Void:
3539 case BuiltinType::ObjCId:
3540 case BuiltinType::ObjCClass:
3541 case BuiltinType::ObjCSel:
3542 case BuiltinType::NullPtr:
3547 case BuiltinType::OCLSampler:
3548 case BuiltinType::OCLEvent:
3549 case BuiltinType::OCLClkEvent:
3550 case BuiltinType::OCLQueue:
3551 case BuiltinType::OCLReserveID:
3552 case BuiltinType::BFloat16:
3553 case BuiltinType::VectorQuad:
3554 case BuiltinType::VectorPair:
3555 case BuiltinType::DMR1024:
3556 case BuiltinType::DMR2048:
3561 case BuiltinType::Ibm128:
3563#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
3564 case BuiltinType::Id: \
3566#include "clang/Basic/OpenCLImageTypes.def"
3567#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
3568 case BuiltinType::Id: \
3570#include "clang/Basic/OpenCLExtensionTypes.def"
3571#define SVE_TYPE(Name, Id, SingletonId) \
3572 case BuiltinType::Id: \
3574#include "clang/Basic/AArch64ACLETypes.def"
3575#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) \
3576 case BuiltinType::Id: \
3578#include "clang/Basic/HLSLIntangibleTypes.def"
3579 case BuiltinType::Dependent:
3580 llvm_unreachable(
"should never get here");
3581#define AMDGPU_TYPE(Name, Id, SingletonId, Width, Align) case BuiltinType::Id:
3582#include "clang/Basic/AMDGPUTypes.def"
3583 case BuiltinType::WasmExternRef:
3584#define RVV_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
3585#include "clang/Basic/RISCVVTypes.def"
3586 llvm_unreachable(
"not yet implemented");
3588 llvm_unreachable(
"should never get here");
3590 case Type::Record: {
3591 const RecordDecl *RD = T->castAsCanonical<RecordType>()->getDecl();
3611 II = Typedef->getDeclName().getAsIdentifierInfo();
3614 OS <<
"<anonymous_record>";
3620 case Type::HLSLAttributedResource:
3621 case Type::HLSLInlineSpirv:
3622 llvm_unreachable(
"should never get here");
3624 case Type::OverflowBehavior:
3625 llvm_unreachable(
"should never get here");
3627 case Type::DeducedTemplateSpecialization:
3629#define NON_CANONICAL_TYPE(Class, Base) case Type::Class:
3630#define DEPENDENT_TYPE(Class, Base) case Type::Class:
3631#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base) case Type::Class:
3632#define ABSTRACT_TYPE(Class, Base)
3633#define TYPE(Class, Base)
3634#include "clang/AST/TypeNodes.inc"
3635 llvm_unreachable(
"unexpected non-canonical or dependent type!");
3641 assert(!T->isDependentType() &&
3642 "cannot compute type discriminator of a dependent type");
3644 llvm::raw_svector_ostream Out(Str);
3646 if (T->isFunctionPointerType() || T->isFunctionReferenceType())
3647 T = T->getPointeeType();
3649 if (T->isFunctionType()) {
3652 T = T.getUnqualifiedType();
3673 if (MPT->isMemberFunctionPointer()) {
3679 MPT->getMostRecentCXXRecordDecl());
3683 MC->mangleCanonicalTypeName(T, Out);
3686 return llvm::getPointerAuthStableSipHash(Str);
3711 "Type cannot have multiple ObjCGCs!");
3714 return getExtQualType(TypeNode, Quals);
3728 QualType WrappedTy,
Expr *CountExpr,
bool CountInBytes,
bool OrNull,
3732 llvm::FoldingSetNodeID ID;
3735 void *InsertPos =
nullptr;
3737 CountAttributedTypes.FindNodeOrInsertPos(ID, InsertPos);
3742 size_t Size = CountAttributedType::totalSizeToAlloc<TypeCoupledDeclRefInfo>(
3743 DependentDecls.size());
3746 OrNull, DependentDecls);
3747 Types.push_back(CATy);
3748 CountAttributedTypes.InsertNode(CATy, InsertPos);
3757 case Type::Attributed: {
3765 case Type::BTFTagAttributed: {
3766 const auto *BTFT = dyn_cast<BTFTagAttributedType>(Orig);
3771 case Type::OverflowBehavior: {
3772 const auto *OB = dyn_cast<OverflowBehaviorType>(Orig);
3774 adjustType(OB->getUnderlyingType(), Adjust));
3781 case Type::Adjusted: {
3787 case Type::MacroQualified: {
3790 MQT->getMacroIdentifier());
3794 return Adjust(Orig);
3800 if (T->getExtInfo() == Info)
3804 if (
const auto *FNPT = dyn_cast<FunctionNoProtoType>(T)) {
3824 FPT->getExtProtoInfo());
3839 L->DeducedReturnType(FD, ResultType);
3850 return getFunctionType(Proto->getReturnType(), Proto->getParamTypes(),
3851 Proto->getExtProtoInfo().withExceptionSpec(ESI));
3867 for (
unsigned i = 0, n = Args.size(); i != n; ++i)
3890 return getFunctionType(Proto->getReturnType(), Proto->param_types(), EPI);
3916 if (TSInfo->getType() != FD->
getType())
3924 "TypeLoc size mismatch from updating exception specification");
3925 TSInfo->overrideType(Updated);
3934 llvm::FoldingSetNodeID ID;
3937 void *InsertPos =
nullptr;
3938 if (
ComplexType *CT = ComplexTypes.FindNodeOrInsertPos(ID, InsertPos))
3944 if (!T.isCanonical()) {
3948 ComplexType *NewIP = ComplexTypes.FindNodeOrInsertPos(ID, InsertPos);
3949 assert(!NewIP &&
"Shouldn't be in the map!"); (void)NewIP;
3952 Types.push_back(
New);
3953 ComplexTypes.InsertNode(
New, InsertPos);
3962 llvm::FoldingSetNodeID ID;
3965 void *InsertPos =
nullptr;
3966 if (
PointerType *PT = PointerTypes.FindNodeOrInsertPos(ID, InsertPos))
3972 if (!T.isCanonical()) {
3976 PointerType *NewIP = PointerTypes.FindNodeOrInsertPos(ID, InsertPos);
3977 assert(!NewIP &&
"Shouldn't be in the map!"); (void)NewIP;
3980 Types.push_back(
New);
3981 PointerTypes.InsertNode(
New, InsertPos);
3986 llvm::FoldingSetNodeID ID;
3988 void *InsertPos =
nullptr;
3989 AdjustedType *AT = AdjustedTypes.FindNodeOrInsertPos(ID, InsertPos);
3996 AT = AdjustedTypes.FindNodeOrInsertPos(ID, InsertPos);
3997 assert(!AT &&
"Shouldn't be in the map!");
4001 Types.push_back(AT);
4002 AdjustedTypes.InsertNode(AT, InsertPos);
4007 llvm::FoldingSetNodeID ID;
4009 void *InsertPos =
nullptr;
4010 AdjustedType *AT = AdjustedTypes.FindNodeOrInsertPos(ID, InsertPos);
4017 AT = AdjustedTypes.FindNodeOrInsertPos(ID, InsertPos);
4018 assert(!AT &&
"Shouldn't be in the map!");
4021 Types.push_back(AT);
4022 AdjustedTypes.InsertNode(AT, InsertPos);
4027 assert((T->isArrayType() || T->isFunctionType()) &&
"T does not decay");
4036 if (T->isArrayType())
4043 if (T->isFunctionType())
4055 llvm::FoldingSetNodeID ID;
4056 ATy->Profile(ID, *
this, ATy->getElementType(), ATy->getZExtSize(),
4057 ATy->getSizeExpr(), ATy->getSizeModifier(),
4058 ATy->getIndexTypeQualifiers().getAsOpaqueValue());
4059 void *InsertPos =
nullptr;
4061 ArrayParameterTypes.FindNodeOrInsertPos(ID, InsertPos);
4070 AT = ArrayParameterTypes.FindNodeOrInsertPos(ID, InsertPos);
4071 assert(!AT &&
"Shouldn't be in the map!");
4076 Types.push_back(AT);
4077 ArrayParameterTypes.InsertNode(AT, InsertPos);
4084 assert(T->isFunctionType() &&
"block of function types only");
4087 llvm::FoldingSetNodeID ID;
4090 void *InsertPos =
nullptr;
4092 BlockPointerTypes.FindNodeOrInsertPos(ID, InsertPos))
4098 if (!T.isCanonical()) {
4103 BlockPointerTypes.FindNodeOrInsertPos(ID, InsertPos);
4104 assert(!NewIP &&
"Shouldn't be in the map!"); (void)NewIP;
4108 Types.push_back(
New);
4109 BlockPointerTypes.InsertNode(
New, InsertPos);
4117 assert((!T->isPlaceholderType() ||
4118 T->isSpecificPlaceholderType(BuiltinType::UnknownAny)) &&
4119 "Unresolved placeholder type");
4123 llvm::FoldingSetNodeID ID;
4126 void *InsertPos =
nullptr;
4128 LValueReferenceTypes.FindNodeOrInsertPos(ID, InsertPos))
4136 if (!SpelledAsLValue || InnerRef || !T.isCanonical()) {
4137 QualType PointeeType = (InnerRef ? InnerRef->getPointeeType() : T);
4142 LValueReferenceTypes.FindNodeOrInsertPos(ID, InsertPos);
4143 assert(!NewIP &&
"Shouldn't be in the map!"); (void)NewIP;
4148 Types.push_back(
New);
4149 LValueReferenceTypes.InsertNode(
New, InsertPos);
4157 assert((!T->isPlaceholderType() ||
4158 T->isSpecificPlaceholderType(BuiltinType::UnknownAny)) &&
4159 "Unresolved placeholder type");
4163 llvm::FoldingSetNodeID ID;
4166 void *InsertPos =
nullptr;
4168 RValueReferenceTypes.FindNodeOrInsertPos(ID, InsertPos))
4176 if (InnerRef || !T.isCanonical()) {
4177 QualType PointeeType = (InnerRef ? InnerRef->getPointeeType() : T);
4182 RValueReferenceTypes.FindNodeOrInsertPos(ID, InsertPos);
4183 assert(!NewIP &&
"Shouldn't be in the map!"); (void)NewIP;
4188 Types.push_back(
New);
4189 RValueReferenceTypes.InsertNode(
New, InsertPos);
4197 assert(Cls &&
"At least one of Qualifier or Cls must be provided");
4200 Cls = Qualifier.getAsRecordDecl();
4204 llvm::FoldingSetNodeID ID;
4207 void *InsertPos =
nullptr;
4209 MemberPointerTypes.FindNodeOrInsertPos(ID, InsertPos))
4214 return Qualifier.getCanonical();
4216 assert(R.isCanonical());
4222 if (!T.isCanonical() || Qualifier != CanonicalQualifier) {
4228 MemberPointerTypes.FindNodeOrInsertPos(ID, InsertPos);
4229 assert(!NewIP &&
"Shouldn't be in the map!");
4233 Types.push_back(
New);
4234 MemberPointerTypes.InsertNode(
New, InsertPos);
4241 const llvm::APInt &ArySizeIn,
4242 const Expr *SizeExpr,
4244 unsigned IndexTypeQuals)
const {
4247 "Constant array of VLAs is illegal!");
4255 llvm::APInt ArySize(ArySizeIn);
4256 ArySize = ArySize.zextOrTrunc(Target->getMaxPointerWidth());
4258 llvm::FoldingSetNodeID ID;
4260 ASM, IndexTypeQuals);
4262 void *InsertPos =
nullptr;
4264 ConstantArrayTypes.FindNodeOrInsertPos(ID, InsertPos))
4275 ASM, IndexTypeQuals);
4280 ConstantArrayTypes.FindNodeOrInsertPos(ID, InsertPos);
4281 assert(!NewIP &&
"Shouldn't be in the map!"); (void)NewIP;
4284 auto *
New = ConstantArrayType::Create(*
this, EltTy, Canon, ArySize, SizeExpr,
4285 ASM, IndexTypeQuals);
4286 ConstantArrayTypes.InsertNode(
New, InsertPos);
4287 Types.push_back(
New);
4296 if (!
type->isVariablyModifiedType())
return type;
4301 const Type *ty = split.
Ty;
4303#define TYPE(Class, Base)
4304#define ABSTRACT_TYPE(Class, Base)
4305#define NON_CANONICAL_TYPE(Class, Base) case Type::Class:
4306#include "clang/AST/TypeNodes.inc"
4307 llvm_unreachable(
"didn't desugar past all non-canonical types?");
4313 case Type::DependentVector:
4314 case Type::ExtVector:
4315 case Type::DependentSizedExtVector:
4316 case Type::ConstantMatrix:
4317 case Type::DependentSizedMatrix:
4318 case Type::DependentAddressSpace:
4319 case Type::ObjCObject:
4320 case Type::ObjCInterface:
4321 case Type::ObjCObjectPointer:
4324 case Type::UnresolvedUsing:
4325 case Type::TypeOfExpr:
4327 case Type::Decltype:
4328 case Type::UnaryTransform:
4329 case Type::DependentName:
4330 case Type::InjectedClassName:
4331 case Type::TemplateSpecialization:
4332 case Type::TemplateTypeParm:
4333 case Type::SubstTemplateTypeParmPack:
4334 case Type::SubstBuiltinTemplatePack:
4336 case Type::DeducedTemplateSpecialization:
4337 case Type::PackExpansion:
4338 case Type::PackIndexing:
4340 case Type::DependentBitInt:
4341 case Type::ArrayParameter:
4342 case Type::HLSLAttributedResource:
4343 case Type::HLSLInlineSpirv:
4344 case Type::OverflowBehavior:
4345 llvm_unreachable(
"type should never be variably-modified");
4349 case Type::FunctionNoProto:
4350 case Type::FunctionProto:
4351 case Type::BlockPointer:
4352 case Type::MemberPointer:
4365 case Type::LValueReference: {
4369 lv->isSpelledAsLValue());
4373 case Type::RValueReference: {
4380 case Type::Atomic: {
4386 case Type::ConstantArray: {
4392 cat->getSizeModifier(),
4393 cat->getIndexTypeCVRQualifiers());
4397 case Type::DependentSizedArray: {
4401 dat->getSizeModifier(), dat->getIndexTypeCVRQualifiers());
4406 case Type::IncompleteArray: {
4411 iat->getIndexTypeCVRQualifiers());
4416 case Type::VariableArray: {
4421 vat->getIndexTypeCVRQualifiers());
4434 unsigned IndexTypeQuals)
const {
4451 VariableArrayTypes.push_back(
New);
4452 Types.push_back(
New);
4462 unsigned elementTypeQuals)
const {
4465 "Size must be type- or value-dependent!");
4469 void *insertPos =
nullptr;
4470 llvm::FoldingSetNodeID ID;
4472 ID, *
this, numElements ?
QualType(canonElementType.
Ty, 0) : elementType,
4473 ASM, elementTypeQuals, numElements);
4477 DependentSizedArrayTypes.FindNodeOrInsertPos(ID, insertPos);
4489 DependentSizedArrayTypes.InsertNode(newType, insertPos);
4490 Types.push_back(newType);
4498 numElements, ASM, elementTypeQuals);
4499 DependentSizedArrayTypes.InsertNode(canonTy, insertPos);
4500 Types.push_back(canonTy);
4505 canonElementType.
Quals);
4509 if (
QualType(canonElementType.
Ty, 0) == elementType &&
4518 Types.push_back(sugaredType);
4524 unsigned elementTypeQuals)
const {
4525 llvm::FoldingSetNodeID ID;
4528 void *insertPos =
nullptr;
4530 IncompleteArrayTypes.FindNodeOrInsertPos(ID, insertPos))
4542 ASM, elementTypeQuals);
4547 IncompleteArrayTypes.FindNodeOrInsertPos(ID, insertPos);
4548 assert(!existing &&
"Shouldn't be in the map!"); (void) existing;
4554 IncompleteArrayTypes.InsertNode(newType, insertPos);
4555 Types.push_back(newType);
4561#define SVE_INT_ELTTY(BITS, ELTS, SIGNED, NUMVECTORS) \
4562 {getIntTypeForBitwidth(BITS, SIGNED), llvm::ElementCount::getScalable(ELTS), \
4565#define SVE_ELTTY(ELTTY, ELTS, NUMVECTORS) \
4566 {ELTTY, llvm::ElementCount::getScalable(ELTS), NUMVECTORS};
4570 llvm_unreachable(
"Unsupported builtin vector type");
4572#define SVE_VECTOR_TYPE_INT(Name, MangledName, Id, SingletonId, NumEls, \
4573 ElBits, NF, IsSigned) \
4574 case BuiltinType::Id: \
4575 return {getIntTypeForBitwidth(ElBits, IsSigned), \
4576 llvm::ElementCount::getScalable(NumEls), NF};
4577#define SVE_VECTOR_TYPE_FLOAT(Name, MangledName, Id, SingletonId, NumEls, \
4579 case BuiltinType::Id: \
4580 return {ElBits == 16 ? HalfTy : (ElBits == 32 ? FloatTy : DoubleTy), \
4581 llvm::ElementCount::getScalable(NumEls), NF};
4582#define SVE_VECTOR_TYPE_BFLOAT(Name, MangledName, Id, SingletonId, NumEls, \
4584 case BuiltinType::Id: \
4585 return {BFloat16Ty, llvm::ElementCount::getScalable(NumEls), NF};
4586#define SVE_VECTOR_TYPE_MFLOAT(Name, MangledName, Id, SingletonId, NumEls, \
4588 case BuiltinType::Id: \
4589 return {MFloat8Ty, llvm::ElementCount::getScalable(NumEls), NF};
4590#define SVE_PREDICATE_TYPE_ALL(Name, MangledName, Id, SingletonId, NumEls, NF) \
4591 case BuiltinType::Id: \
4592 return {BoolTy, llvm::ElementCount::getScalable(NumEls), NF};
4593#include "clang/Basic/AArch64ACLETypes.def"
4595#define RVV_VECTOR_TYPE_INT(Name, Id, SingletonId, NumEls, ElBits, NF, \
4597 case BuiltinType::Id: \
4598 return {getIntTypeForBitwidth(ElBits, IsSigned), \
4599 llvm::ElementCount::getScalable(NumEls), NF};
4600#define RVV_VECTOR_TYPE_FLOAT(Name, Id, SingletonId, NumEls, ElBits, NF) \
4601 case BuiltinType::Id: \
4602 return {ElBits == 16 ? Float16Ty : (ElBits == 32 ? FloatTy : DoubleTy), \
4603 llvm::ElementCount::getScalable(NumEls), NF};
4604#define RVV_VECTOR_TYPE_BFLOAT(Name, Id, SingletonId, NumEls, ElBits, NF) \
4605 case BuiltinType::Id: \
4606 return {BFloat16Ty, llvm::ElementCount::getScalable(NumEls), NF};
4607#define RVV_PREDICATE_TYPE(Name, Id, SingletonId, NumEls) \
4608 case BuiltinType::Id: \
4609 return {BoolTy, llvm::ElementCount::getScalable(NumEls), 1};
4610#include "clang/Basic/RISCVVTypes.def"
4617 if (Target->getTriple().isWasm() && Target->hasFeature(
"reference-types")) {
4618#define WASM_REF_TYPE(Name, MangledName, Id, SingletonId, AS) \
4619 if (BuiltinType::Id == BuiltinType::WasmExternRef) \
4621#include "clang/Basic/WebAssemblyReferenceTypes.def"
4624 "shouldn't try to generate type externref outside WebAssembly target");
4631 unsigned NumFields)
const {
4633 if (
auto It = ScalableVecTyMap.find(K); It != ScalableVecTyMap.end())
4636 if (Target->hasAArch64ACLETypes()) {
4639#define SVE_VECTOR_TYPE_INT(Name, MangledName, Id, SingletonId, NumEls, \
4640 ElBits, NF, IsSigned) \
4641 if (EltTy->hasIntegerRepresentation() && !EltTy->isBooleanType() && \
4642 EltTy->hasSignedIntegerRepresentation() == IsSigned && \
4643 EltTySize == ElBits && NumElts == (NumEls * NF) && NumFields == 1) { \
4644 return ScalableVecTyMap[K] = SingletonId; \
4646#define SVE_VECTOR_TYPE_FLOAT(Name, MangledName, Id, SingletonId, NumEls, \
4648 if (EltTy->hasFloatingRepresentation() && !EltTy->isBFloat16Type() && \
4649 EltTySize == ElBits && NumElts == (NumEls * NF) && NumFields == 1) { \
4650 return ScalableVecTyMap[K] = SingletonId; \
4652#define SVE_VECTOR_TYPE_BFLOAT(Name, MangledName, Id, SingletonId, NumEls, \
4654 if (EltTy->hasFloatingRepresentation() && EltTy->isBFloat16Type() && \
4655 EltTySize == ElBits && NumElts == (NumEls * NF) && NumFields == 1) { \
4656 return ScalableVecTyMap[K] = SingletonId; \
4658#define SVE_VECTOR_TYPE_MFLOAT(Name, MangledName, Id, SingletonId, NumEls, \
4660 if (EltTy->isMFloat8Type() && EltTySize == ElBits && \
4661 NumElts == (NumEls * NF) && NumFields == 1) { \
4662 return ScalableVecTyMap[K] = SingletonId; \
4664#define SVE_PREDICATE_TYPE_ALL(Name, MangledName, Id, SingletonId, NumEls, NF) \
4665 if (EltTy->isBooleanType() && NumElts == (NumEls * NF) && NumFields == 1) \
4666 return ScalableVecTyMap[K] = SingletonId;
4667#include "clang/Basic/AArch64ACLETypes.def"
4668 }
else if (Target->hasRISCVVTypes()) {
4670#define RVV_VECTOR_TYPE(Name, Id, SingletonId, NumEls, ElBits, NF, IsSigned, \
4672 if (!EltTy->isBooleanType() && \
4673 ((EltTy->hasIntegerRepresentation() && \
4674 EltTy->hasSignedIntegerRepresentation() == IsSigned) || \
4675 (EltTy->hasFloatingRepresentation() && !EltTy->isBFloat16Type() && \
4677 (EltTy->hasFloatingRepresentation() && EltTy->isBFloat16Type() && \
4678 IsBF && !IsFP)) && \
4679 EltTySize == ElBits && NumElts == NumEls && NumFields == NF) \
4680 return ScalableVecTyMap[K] = SingletonId;
4681#define RVV_PREDICATE_TYPE(Name, Id, SingletonId, NumEls) \
4682 if (EltTy->isBooleanType() && NumElts == NumEls) \
4683 return ScalableVecTyMap[K] = SingletonId;
4684#include "clang/Basic/RISCVVTypes.def"
4699 llvm::FoldingSetNodeID ID;
4702 void *InsertPos =
nullptr;
4703 if (
VectorType *VTP = VectorTypes.FindNodeOrInsertPos(ID, InsertPos))
4713 VectorType *NewIP = VectorTypes.FindNodeOrInsertPos(ID, InsertPos);
4714 assert(!NewIP &&
"Shouldn't be in the map!"); (void)NewIP;
4717 VectorType(vecType, NumElts, Canonical, VecKind);
4718 VectorTypes.InsertNode(
New, InsertPos);
4719 Types.push_back(
New);
4726 llvm::FoldingSetNodeID ID;
4729 void *InsertPos =
nullptr;
4731 DependentVectorTypes.FindNodeOrInsertPos(ID, InsertPos);
4736 VecType,
QualType(Canon, 0), SizeExpr, AttrLoc, VecKind);
4739 if (CanonVecTy == VecType) {
4744 DependentVectorTypes.FindNodeOrInsertPos(ID, InsertPos);
4745 assert(!CanonCheck &&
4746 "Dependent-sized vector_size canonical type broken");
4748 DependentVectorTypes.InsertNode(
New, InsertPos);
4757 Types.push_back(
New);
4764 unsigned NumElts)
const {
4771 llvm::FoldingSetNodeID ID;
4774 void *InsertPos =
nullptr;
4775 if (
VectorType *VTP = VectorTypes.FindNodeOrInsertPos(ID, InsertPos))
4785 VectorType *NewIP = VectorTypes.FindNodeOrInsertPos(ID, InsertPos);
4786 assert(!NewIP &&
"Shouldn't be in the map!"); (void)NewIP;
4790 VectorTypes.InsertNode(
New, InsertPos);
4791 Types.push_back(
New);
4799 llvm::FoldingSetNodeID ID;
4803 void *InsertPos =
nullptr;
4805 = DependentSizedExtVectorTypes.FindNodeOrInsertPos(ID, InsertPos);
4815 if (CanonVecTy == vecType) {
4820 = DependentSizedExtVectorTypes.FindNodeOrInsertPos(ID, InsertPos);
4821 assert(!CanonCheck &&
"Dependent-sized ext_vector canonical type broken");
4823 DependentSizedExtVectorTypes.InsertNode(
New, InsertPos);
4832 Types.push_back(
New);
4837 unsigned NumColumns)
const {
4838 llvm::FoldingSetNodeID ID;
4840 Type::ConstantMatrix);
4843 "need a valid element type");
4844 assert(NumRows > 0 && NumRows <= LangOpts.MaxMatrixDimension &&
4845 NumColumns > 0 && NumColumns <= LangOpts.MaxMatrixDimension &&
4846 "need valid matrix dimensions");
4847 void *InsertPos =
nullptr;
4857 assert(!NewIP &&
"Matrix type shouldn't already exist in the map");
4863 MatrixTypes.InsertNode(
New, InsertPos);
4864 Types.push_back(
New);
4873 llvm::FoldingSetNodeID ID;
4877 void *InsertPos =
nullptr;
4879 DependentSizedMatrixTypes.FindNodeOrInsertPos(ID, InsertPos);
4884 ColumnExpr, AttrLoc);
4887 DependentSizedMatrixTypes.FindNodeOrInsertPos(ID, InsertPos);
4888 assert(!CanonCheck &&
"Dependent-sized matrix canonical type broken");
4890 DependentSizedMatrixTypes.InsertNode(Canon, InsertPos);
4891 Types.push_back(Canon);
4904 ColumnExpr, AttrLoc);
4905 Types.push_back(
New);
4910 Expr *AddrSpaceExpr,
4916 void *insertPos =
nullptr;
4917 llvm::FoldingSetNodeID ID;
4922 DependentAddressSpaceTypes.FindNodeOrInsertPos(ID, insertPos);
4928 DependentAddressSpaceTypes.InsertNode(canonTy, insertPos);
4929 Types.push_back(canonTy);
4932 if (canonPointeeType == PointeeType &&
4938 AddrSpaceExpr, AttrLoc);
4939 Types.push_back(sugaredType);
4945 return T.isCanonical() &&
4963 llvm::FoldingSetNodeID ID;
4966 void *InsertPos =
nullptr;
4968 FunctionNoProtoTypes.FindNodeOrInsertPos(ID, InsertPos))
4978 FunctionNoProtoTypes.FindNodeOrInsertPos(ID, InsertPos);
4979 assert(!NewIP &&
"Shouldn't be in the map!"); (void)NewIP;
4984 Types.push_back(
New);
4985 FunctionNoProtoTypes.InsertNode(
New, InsertPos);
5001 return CanResultType;
5008 if (!NoexceptInType)
5025 bool AnyPackExpansions =
false;
5029 if (ET->
getAs<PackExpansionType>())
5030 AnyPackExpansions =
true;
5032 return AnyPackExpansions;
5038QualType ASTContext::getFunctionTypeInternal(
5039 QualType ResultTy, ArrayRef<QualType> ArgArray,
5040 const FunctionProtoType::ExtProtoInfo &EPI,
bool OnlyWantCanonical)
const {
5041 size_t NumArgs = ArgArray.size();
5045 llvm::FoldingSetNodeID
ID;
5050 bool Unique =
false;
5052 void *InsertPos =
nullptr;
5053 if (FunctionProtoType *FPT =
5054 FunctionProtoTypes.FindNodeOrInsertPos(ID, InsertPos)) {
5055 QualType Existing = QualType(FPT, 0);
5074 bool IsCanonicalExceptionSpec =
5078 bool isCanonical = !Unique && IsCanonicalExceptionSpec &&
5080 for (
unsigned i = 0; i != NumArgs && isCanonical; ++i)
5081 if (!ArgArray[i].isCanonicalAsParam())
5082 isCanonical =
false;
5084 if (OnlyWantCanonical)
5085 assert(isCanonical &&
5086 "given non-canonical parameters constructing canonical type");
5091 if (!isCanonical && Canonical.
isNull()) {
5092 SmallVector<QualType, 16> CanonicalArgs;
5093 CanonicalArgs.reserve(NumArgs);
5094 for (
unsigned i = 0; i != NumArgs; ++i)
5097 llvm::SmallVector<QualType, 8> ExceptionTypeStorage;
5098 FunctionProtoType::ExtProtoInfo CanonicalEPI = EPI;
5101 if (IsCanonicalExceptionSpec) {
5103 }
else if (NoexceptInType) {
5116 bool AnyPacks =
false;
5118 if (ET->
getAs<PackExpansionType>())
5139 llvm_unreachable(
"dependent noexcept is already canonical");
5142 CanonicalEPI.
ExceptionSpec = FunctionProtoType::ExceptionSpecInfo();
5148 getFunctionTypeInternal(CanResultTy, CanonicalArgs, CanonicalEPI,
true);
5151 FunctionProtoType *NewIP =
5152 FunctionProtoTypes.FindNodeOrInsertPos(ID, InsertPos);
5153 assert(!NewIP &&
"Shouldn't be in the map!"); (void)NewIP;
5158 auto ESH = FunctionProtoType::getExceptionSpecSize(
5160 size_t Size = FunctionProtoType::totalSizeToAlloc<
5161 QualType, SourceLocation, FunctionType::FunctionTypeExtraBitfields,
5162 FunctionType::FunctionTypeExtraAttributeInfo,
5163 FunctionType::FunctionTypeArmAttributes, FunctionType::ExceptionType,
5164 Expr *, FunctionDecl *, FunctionProtoType::ExtParameterInfo, Qualifiers,
5165 FunctionEffect, EffectConditionExpr>(
5169 ESH.NumExprPtr, ESH.NumFunctionDeclPtr,
5174 auto *FTP = (FunctionProtoType *)
Allocate(Size,
alignof(FunctionProtoType));
5175 FunctionProtoType::ExtProtoInfo newEPI = EPI;
5176 new (FTP) FunctionProtoType(ResultTy, ArgArray, Canonical, newEPI);
5177 Types.push_back(FTP);
5179 FunctionProtoTypes.InsertNode(FTP, InsertPos);
5181 AnyFunctionEffects =
true;
5182 return QualType(FTP, 0);
5185QualType ASTContext::getPipeType(QualType T,
bool ReadOnly)
const {
5186 llvm::FoldingSetNodeID
ID;
5189 void *InsertPos =
nullptr;
5190 if (PipeType *PT = PipeTypes.FindNodeOrInsertPos(ID, InsertPos))
5191 return QualType(PT, 0);
5200 PipeType *NewIP = PipeTypes.FindNodeOrInsertPos(ID, InsertPos);
5201 assert(!NewIP &&
"Shouldn't be in the map!");
5204 auto *
New =
new (*
this,
alignof(PipeType)) PipeType(T, Canonical, ReadOnly);
5205 Types.push_back(
New);
5206 PipeTypes.InsertNode(
New, InsertPos);
5207 return QualType(
New, 0);
5217 return getPipeType(T,
true);
5221 return getPipeType(T,
false);
5225 llvm::FoldingSetNodeID ID;
5228 void *InsertPos =
nullptr;
5229 if (
BitIntType *EIT = BitIntTypes.FindNodeOrInsertPos(ID, InsertPos))
5233 BitIntTypes.InsertNode(
New, InsertPos);
5234 Types.push_back(
New);
5239 Expr *NumBitsExpr)
const {
5241 llvm::FoldingSetNodeID ID;
5244 void *InsertPos =
nullptr;
5246 DependentBitIntTypes.FindNodeOrInsertPos(ID, InsertPos))
5251 DependentBitIntTypes.InsertNode(
New, InsertPos);
5253 Types.push_back(
New);
5261 if (
auto *Target = PredefinedSugarTypes[llvm::to_underlying(KD)];
5273 return Ctx.getFromTargetType(Ctx.Target->
getSizeType());
5274 case Kind::SignedSizeT:
5276 case Kind::PtrdiffT:
5279 llvm_unreachable(
"unexpected kind");
5284 Types.push_back(
New);
5285 PredefinedSugarTypes[llvm::to_underlying(KD)] =
New;
5292 if (
auto *Tag = dyn_cast<TagDecl>(
Decl))
5295 if (
auto *
Typedef = dyn_cast<TypedefNameDecl>(
Decl))
5297 if (
auto *UD = dyn_cast<UnresolvedUsingTypenameDecl>(
Decl))
5306 if (
auto *Tag = dyn_cast<TagDecl>(TD))
5308 if (
auto *TN = dyn_cast<TypedefNameDecl>(TD))
5310 if (
const auto *UD = dyn_cast<UnresolvedUsingTypenameDecl>(TD))
5312 assert(TD->TypeForDecl);
5317 if (
const auto *TD = dyn_cast<TagDecl>(
Decl))
5319 if (
const auto *TD = dyn_cast<TypedefNameDecl>(
Decl);
5320 isa_and_nonnull<TypedefDecl, TypeAliasDecl>(TD))
5323 if (
const auto *Using = dyn_cast<UnresolvedUsingTypenameDecl>(
Decl))
5326 assert(
Decl->TypeForDecl);
5336 std::optional<bool> TypeMatchesDeclOrNone)
const {
5337 if (!TypeMatchesDeclOrNone) {
5338 QualType DeclUnderlyingType =
Decl->getUnderlyingType();
5339 assert(!DeclUnderlyingType.
isNull());
5340 if (UnderlyingType.
isNull())
5341 UnderlyingType = DeclUnderlyingType;
5343 assert(
hasSameType(UnderlyingType, DeclUnderlyingType));
5344 TypeMatchesDeclOrNone = UnderlyingType == DeclUnderlyingType;
5348 assert(!UnderlyingType.
isNull());
5352 *TypeMatchesDeclOrNone) {
5353 if (
Decl->TypeForDecl)
5358 !*TypeMatchesDeclOrNone);
5360 Types.push_back(NewType);
5361 Decl->TypeForDecl = NewType;
5365 llvm::FoldingSetNodeID ID;
5367 *TypeMatchesDeclOrNone ?
QualType() : UnderlyingType);
5369 void *InsertPos =
nullptr;
5371 TypedefTypes.FindNodeOrInsertPos(ID, InsertPos))
5372 return QualType(Placeholder->getType(), 0);
5377 1, !!Qualifier, !*TypeMatchesDeclOrNone),
5381 UnderlyingType, !*TypeMatchesDeclOrNone);
5382 auto *Placeholder =
new (NewType->getFoldingSetPlaceholder())
5384 TypedefTypes.InsertNode(Placeholder, InsertPos);
5385 Types.push_back(NewType);
5394 if (UnderlyingType.
isNull()) {
5402 llvm::FoldingSetNodeID ID;
5405 void *InsertPos =
nullptr;
5406 if (
const UsingType *T = UsingTypes.FindNodeOrInsertPos(ID, InsertPos))
5416 Allocate(UsingType::totalSizeToAlloc<NestedNameSpecifier>(!!Qualifier),
5420 UsingTypes.InsertNode(T, InsertPos);
5426 const TagDecl *TD,
bool OwnsTag,
5428 const Type *CanonicalType,
5429 bool WithFoldingSetNode)
const {
5430 auto [TC, Size] = [&] {
5433 static_assert(
alignof(EnumType) ==
alignof(TagType));
5434 return std::make_tuple(Type::Enum,
sizeof(EnumType));
5435 case Decl::ClassTemplatePartialSpecialization:
5436 case Decl::ClassTemplateSpecialization:
5437 case Decl::CXXRecord:
5438 static_assert(
alignof(RecordType) ==
alignof(TagType));
5439 static_assert(
alignof(InjectedClassNameType) ==
alignof(TagType));
5441 return std::make_tuple(Type::InjectedClassName,
5442 sizeof(InjectedClassNameType));
5445 return std::make_tuple(Type::Record,
sizeof(RecordType));
5447 llvm_unreachable(
"unexpected decl kind");
5457 if (WithFoldingSetNode) {
5465 sizeof(TagTypeFoldingSetPlaceholder) +
5466 TagTypeFoldingSetPlaceholder::getOffset() + Size,
5467 std::max(
alignof(TagTypeFoldingSetPlaceholder),
alignof(TagType)));
5468 auto *T =
new (Mem) TagTypeFoldingSetPlaceholder();
5469 Mem = T->getTagType();
5471 Mem =
Allocate(Size,
alignof(TagType));
5474 auto *T = [&, TC = TC]() -> TagType * {
5478 auto *T =
new (Mem) EnumType(TC,
Keyword, Qualifier, TD, OwnsTag,
5479 IsInjected, CanonicalType);
5480 assert(
reinterpret_cast<void *
>(T) ==
5481 reinterpret_cast<void *
>(
static_cast<TagType *
>(T)) &&
5482 "TagType must be the first base of EnumType");
5485 case Type::Record: {
5487 auto *T =
new (Mem) RecordType(TC,
Keyword, Qualifier, TD, OwnsTag,
5488 IsInjected, CanonicalType);
5489 assert(
reinterpret_cast<void *
>(T) ==
5490 reinterpret_cast<void *
>(
static_cast<TagType *
>(T)) &&
5491 "TagType must be the first base of RecordType");
5494 case Type::InjectedClassName: {
5495 auto *T =
new (Mem) InjectedClassNameType(
Keyword, Qualifier, TD,
5496 IsInjected, CanonicalType);
5497 assert(
reinterpret_cast<void *
>(T) ==
5498 reinterpret_cast<void *
>(
static_cast<TagType *
>(T)) &&
5499 "TagType must be the first base of InjectedClassNameType");
5503 llvm_unreachable(
"unexpected type class");
5506 assert(T->getKeyword() ==
Keyword);
5507 assert(T->getQualifier() == Qualifier);
5508 assert(T->getDecl() == TD);
5509 assert(T->isInjected() == IsInjected);
5510 assert(T->isTagOwned() == OwnsTag);
5519 if (
const auto *RD = dyn_cast<CXXRecordDecl>(TD);
5520 RD && RD->isInjectedClassName())
5527 if (TD->TypeForDecl)
5528 return TD->TypeForDecl->getCanonicalTypeUnqualified();
5530 const Type *CanonicalType = getTagTypeInternal(
5533 false,
false,
nullptr,
5535 TD->TypeForDecl = CanonicalType;
5541 const TagDecl *TD,
bool OwnsTag)
const {
5544 bool IsInjected = TD != NonInjectedTD;
5551 if (
Keyword == PreferredKeyword && !Qualifier && !OwnsTag) {
5552 if (
const Type *T = TD->TypeForDecl; T && !T->isCanonicalUnqualified())
5558 std::nullopt, NonInjectedTD,
5559 false, IsInjected, CanonicalType,
5561 TD->TypeForDecl = T;
5565 llvm::FoldingSetNodeID ID;
5566 TagTypeFoldingSetPlaceholder::Profile(ID,
Keyword, Qualifier, NonInjectedTD,
5567 OwnsTag, IsInjected);
5569 void *InsertPos =
nullptr;
5570 if (TagTypeFoldingSetPlaceholder *T =
5571 TagTypes.FindNodeOrInsertPos(ID, InsertPos))
5572 return QualType(T->getTagType(), 0);
5576 getTagTypeInternal(
Keyword, Qualifier, NonInjectedTD, OwnsTag, IsInjected,
5577 CanonicalType,
true);
5578 TagTypes.InsertNode(TagTypeFoldingSetPlaceholder::fromTagType(T), InsertPos);
5583 unsigned NumPositiveBits,
5586 unsigned IntWidth = Target->getIntWidth();
5587 unsigned CharWidth = Target->getCharWidth();
5588 unsigned ShortWidth = Target->getShortWidth();
5589 bool EnumTooLarge =
false;
5591 if (NumNegativeBits) {
5595 if (IsPacked && NumNegativeBits <= CharWidth &&
5596 NumPositiveBits < CharWidth) {
5598 BestWidth = CharWidth;
5599 }
else if (IsPacked && NumNegativeBits <= ShortWidth &&
5600 NumPositiveBits < ShortWidth) {
5602 BestWidth = ShortWidth;
5603 }
else if (NumNegativeBits <= IntWidth && NumPositiveBits < IntWidth) {
5605 BestWidth = IntWidth;
5607 BestWidth = Target->getLongWidth();
5609 if (NumNegativeBits <= BestWidth && NumPositiveBits < BestWidth) {
5612 BestWidth = Target->getLongLongWidth();
5614 if (NumNegativeBits > BestWidth || NumPositiveBits >= BestWidth)
5615 EnumTooLarge =
true;
5619 BestPromotionType = (BestWidth <= IntWidth ?
IntTy : BestType);
5624 if (IsPacked && NumPositiveBits <= CharWidth) {
5626 BestPromotionType =
IntTy;
5627 BestWidth = CharWidth;
5628 }
else if (IsPacked && NumPositiveBits <= ShortWidth) {
5630 BestPromotionType =
IntTy;
5631 BestWidth = ShortWidth;
5632 }
else if (NumPositiveBits <= IntWidth) {
5634 BestWidth = IntWidth;
5635 BestPromotionType = (NumPositiveBits == BestWidth || !LangOpts.CPlusPlus)
5638 }
else if (NumPositiveBits <= (BestWidth = Target->getLongWidth())) {
5640 BestPromotionType = (NumPositiveBits == BestWidth || !LangOpts.CPlusPlus)
5644 BestWidth = Target->getLongLongWidth();
5645 if (NumPositiveBits > BestWidth) {
5650 EnumTooLarge =
true;
5653 BestPromotionType = (NumPositiveBits == BestWidth || !LangOpts.CPlusPlus)
5658 return EnumTooLarge;
5662 assert((T->isIntegralType(*
this) || T->isEnumeralType()) &&
5663 "Integral type required!");
5666 if (
Value.isUnsigned() ||
Value.isNonNegative()) {
5667 if (T->isSignedIntegerOrEnumerationType())
5669 return Value.getActiveBits() <= BitWidth;
5671 return Value.getSignificantBits() <= BitWidth;
5677 const Type *CanonicalType)
const {
5679 UnresolvedUsingType::totalSizeToAlloc<
5681 !!InsertPos, !!Qualifier),
5685 auto *Placeholder =
new (T->getFoldingSetPlaceholder())
5687 TypedefTypes.InsertNode(Placeholder, InsertPos);
5697 return D->TypeForDecl->getCanonicalTypeUnqualified();
5699 const Type *CanonicalType = getUnresolvedUsingTypeInternal(
5703 D->TypeForDecl = CanonicalType;
5712 if (
const Type *T = D->TypeForDecl; T && !T->isCanonicalUnqualified())
5719 nullptr, CanonicalType);
5724 llvm::FoldingSetNodeID ID;
5727 void *InsertPos =
nullptr;
5729 UnresolvedUsingTypes.FindNodeOrInsertPos(ID, InsertPos))
5730 return QualType(Placeholder->getType(), 0);
5734 const Type *T = getUnresolvedUsingTypeInternal(
Keyword, Qualifier, D,
5735 InsertPos, CanonicalType);
5743 llvm::FoldingSetNodeID id;
5744 AttributedType::Profile(
id, attrKind, modifiedType, equivalentType,
attr);
5746 void *insertPos =
nullptr;
5747 AttributedType *
type = AttributedTypes.FindNodeOrInsertPos(
id, insertPos);
5750 assert(!
attr ||
attr->getKind() == attrKind);
5753 type =
new (*
this,
alignof(AttributedType))
5754 AttributedType(canon, attrKind,
attr, modifiedType, equivalentType);
5756 Types.push_back(
type);
5757 AttributedTypes.InsertNode(
type, insertPos);
5770 switch (nullability) {
5786 llvm_unreachable(
"Unknown nullability kind");
5791 llvm::FoldingSetNodeID ID;
5792 BTFTagAttributedType::Profile(ID, Wrapped, BTFAttr);
5794 void *InsertPos =
nullptr;
5795 BTFTagAttributedType *Ty =
5796 BTFTagAttributedTypes.FindNodeOrInsertPos(ID, InsertPos);
5801 Ty =
new (*
this,
alignof(BTFTagAttributedType))
5802 BTFTagAttributedType(Canon, Wrapped, BTFAttr);
5804 Types.push_back(Ty);
5805 BTFTagAttributedTypes.InsertNode(Ty, InsertPos);
5813 StringRef IdentName = II->
getName();
5814 OverflowBehaviorType::OverflowBehaviorKind Kind;
5815 if (IdentName ==
"wrap") {
5816 Kind = OverflowBehaviorType::OverflowBehaviorKind::Wrap;
5817 }
else if (IdentName ==
"trap") {
5818 Kind = OverflowBehaviorType::OverflowBehaviorKind::Trap;
5827 OverflowBehaviorType::OverflowBehaviorKind Kind,
5830 "Cannot have underlying types that are themselves OBTs");
5831 llvm::FoldingSetNodeID ID;
5832 OverflowBehaviorType::Profile(ID, Underlying, Kind);
5833 void *InsertPos =
nullptr;
5835 if (OverflowBehaviorType *OBT =
5836 OverflowBehaviorTypes.FindNodeOrInsertPos(ID, InsertPos)) {
5845 assert(!OverflowBehaviorTypes.FindNodeOrInsertPos(ID, InsertPos) &&
5846 "Shouldn't be in the map");
5849 OverflowBehaviorType *Ty =
new (*
this,
alignof(OverflowBehaviorType))
5850 OverflowBehaviorType(Canonical, Underlying, Kind);
5852 Types.push_back(Ty);
5853 OverflowBehaviorTypes.InsertNode(Ty, InsertPos);
5859 const HLSLAttributedResourceType::Attributes &Attrs) {
5861 llvm::FoldingSetNodeID ID;
5862 HLSLAttributedResourceType::Profile(ID, Wrapped, Contained, Attrs);
5864 void *InsertPos =
nullptr;
5865 HLSLAttributedResourceType *Ty =
5866 HLSLAttributedResourceTypes.FindNodeOrInsertPos(ID, InsertPos);
5870 Ty =
new (*
this,
alignof(HLSLAttributedResourceType))
5871 HLSLAttributedResourceType(Wrapped, Contained, Attrs);
5873 Types.push_back(Ty);
5874 HLSLAttributedResourceTypes.InsertNode(Ty, InsertPos);
5882 llvm::FoldingSetNodeID ID;
5883 HLSLInlineSpirvType::Profile(ID, Opcode, Size, Alignment, Operands);
5885 void *InsertPos =
nullptr;
5886 HLSLInlineSpirvType *Ty =
5887 HLSLInlineSpirvTypes.FindNodeOrInsertPos(ID, InsertPos);
5892 HLSLInlineSpirvType::totalSizeToAlloc<SpirvOperand>(Operands.size()),
5893 alignof(HLSLInlineSpirvType));
5895 Ty =
new (Mem) HLSLInlineSpirvType(Opcode, Size, Alignment, Operands);
5897 Types.push_back(Ty);
5898 HLSLInlineSpirvTypes.InsertNode(Ty, InsertPos);
5905 Decl *AssociatedDecl,
5909 llvm::FoldingSetNodeID ID;
5910 SubstTemplateTypeParmType::Profile(ID, Replacement, AssociatedDecl, Index,
5912 void *InsertPos =
nullptr;
5913 SubstTemplateTypeParmType *SubstParm =
5914 SubstTemplateTypeParmTypes.FindNodeOrInsertPos(ID, InsertPos);
5917 void *Mem =
Allocate(SubstTemplateTypeParmType::totalSizeToAlloc<QualType>(
5918 !Replacement.isCanonical()),
5919 alignof(SubstTemplateTypeParmType));
5920 SubstParm =
new (Mem) SubstTemplateTypeParmType(Replacement, AssociatedDecl,
5921 Index, PackIndex, Final);
5922 Types.push_back(SubstParm);
5923 SubstTemplateTypeParmTypes.InsertNode(SubstParm, InsertPos);
5931 unsigned Index,
bool Final,
5938 llvm::FoldingSetNodeID ID;
5939 SubstTemplateTypeParmPackType::Profile(ID, AssociatedDecl, Index, Final,
5941 void *InsertPos =
nullptr;
5942 if (SubstTemplateTypeParmPackType *SubstParm =
5943 SubstTemplateTypeParmPackTypes.FindNodeOrInsertPos(ID, InsertPos))
5953 [[maybe_unused]]
const auto *Nothing =
5954 SubstTemplateTypeParmPackTypes.FindNodeOrInsertPos(ID, InsertPos);
5959 auto *SubstParm =
new (*
this,
alignof(SubstTemplateTypeParmPackType))
5960 SubstTemplateTypeParmPackType(Canon, AssociatedDecl, Index, Final,
5962 Types.push_back(SubstParm);
5963 SubstTemplateTypeParmPackTypes.InsertNode(SubstParm, InsertPos);
5971 return P.getKind() == TemplateArgument::Type;
5973 "Pack contains a non-type");
5975 llvm::FoldingSetNodeID ID;
5976 SubstBuiltinTemplatePackType::Profile(ID, ArgPack);
5978 void *InsertPos =
nullptr;
5980 SubstBuiltinTemplatePackTypes.FindNodeOrInsertPos(ID, InsertPos))
5989 [[maybe_unused]]
const auto *Nothing =
5990 SubstBuiltinTemplatePackTypes.FindNodeOrInsertPos(ID, InsertPos);
5994 auto *PackType =
new (*
this,
alignof(SubstBuiltinTemplatePackType))
5995 SubstBuiltinTemplatePackType(Canon, ArgPack);
5996 Types.push_back(PackType);
5997 SubstBuiltinTemplatePackTypes.InsertNode(PackType, InsertPos);
6007 assert(Depth >= 0 &&
"Depth must be non-negative");
6008 assert(Index >= 0 &&
"Index must be non-negative");
6010 llvm::FoldingSetNodeID ID;
6011 TemplateTypeParmType::Profile(ID, Depth, Index, ParameterPack, TTPDecl);
6012 void *InsertPos =
nullptr;
6013 TemplateTypeParmType *TypeParm
6014 = TemplateTypeParmTypes.FindNodeOrInsertPos(ID, InsertPos);
6021 TypeParm =
new (*
this,
alignof(TemplateTypeParmType))
6022 TemplateTypeParmType(Depth, Index, ParameterPack, TTPDecl, Canon);
6024 TemplateTypeParmType *TypeCheck
6025 = TemplateTypeParmTypes.FindNodeOrInsertPos(ID, InsertPos);
6026 assert(!TypeCheck &&
"Template type parameter canonical type broken");
6029 TypeParm =
new (*
this,
alignof(TemplateTypeParmType)) TemplateTypeParmType(
6030 Depth, Index, ParameterPack,
nullptr,
QualType());
6032 Types.push_back(TypeParm);
6033 TemplateTypeParmTypes.InsertNode(TypeParm, InsertPos);
6059 llvm_unreachable(
"unexpected keyword kind");
6073 ElaboratedKeywordLoc, QualifierLoc, TemplateKeywordLoc, NameLoc,
6083 SpecifiedArgVec.reserve(SpecifiedArgs.size());
6085 SpecifiedArgVec.push_back(Arg.getArgument());
6088 CanonicalArgs, Underlying);
6091[[maybe_unused]]
static bool
6094 if (Arg.isPackExpansion())
6105 Template.getAsDependentTemplateName()));
6107 for (
const auto &Arg : Args)
6111 llvm::FoldingSetNodeID ID;
6114 void *InsertPos =
nullptr;
6115 if (
auto *T = TemplateSpecializationTypes.FindNodeOrInsertPos(ID, InsertPos))
6118 void *Mem =
Allocate(
sizeof(TemplateSpecializationType) +
6120 alignof(TemplateSpecializationType));
6124 assert(Spec->isDependentType() &&
6125 "canonical template specialization must be dependent");
6126 Types.push_back(Spec);
6127 TemplateSpecializationTypes.InsertNode(Spec, InsertPos);
6135 const auto *TD =
Template.getAsTemplateDecl(
true);
6136 bool IsTypeAlias = TD && TD->isTypeAlias();
6137 if (Underlying.
isNull()) {
6144 bool NonCanonical =
Template != CanonTemplate ||
Keyword != CanonKeyword;
6146 if (CanonicalArgs.empty()) {
6149 CanonicalArgs = CanonArgsVec;
6151 NonCanonical |= !llvm::equal(
6152 SpecifiedArgs, CanonicalArgs,
6161 assert((!isa_and_nonnull<TypeAliasTemplateDecl>(TD) ||
6163 "Caller must compute aliased type");
6164 IsTypeAlias =
false;
6167 CanonKeyword, CanonTemplate, CanonicalArgs);
6171 void *Mem =
Allocate(
sizeof(TemplateSpecializationType) +
6173 (IsTypeAlias ?
sizeof(
QualType) : 0),
6174 alignof(TemplateSpecializationType));
6175 auto *Spec =
new (Mem) TemplateSpecializationType(
6177 Types.push_back(Spec);
6183 llvm::FoldingSetNodeID ID;
6186 void *InsertPos =
nullptr;
6187 ParenType *T = ParenTypes.FindNodeOrInsertPos(ID, InsertPos);
6194 ParenType *CheckT = ParenTypes.FindNodeOrInsertPos(ID, InsertPos);
6195 assert(!CheckT &&
"Paren canonical type broken");
6201 ParenTypes.InsertNode(T, InsertPos);
6214 Types.push_back(newType);
6221 llvm::FoldingSetNodeID ID;
6222 DependentNameType::Profile(ID,
Keyword, NNS, Name);
6224 void *InsertPos =
nullptr;
6225 if (DependentNameType *T =
6226 DependentNameTypes.FindNodeOrInsertPos(ID, InsertPos))
6234 if (CanonKeyword !=
Keyword || CanonNNS != NNS) {
6236 [[maybe_unused]] DependentNameType *T =
6237 DependentNameTypes.FindNodeOrInsertPos(ID, InsertPos);
6238 assert(!T &&
"broken canonicalization");
6242 DependentNameType *T =
new (*
this,
alignof(DependentNameType))
6243 DependentNameType(
Keyword, NNS, Name, Canon);
6245 DependentNameTypes.InsertNode(T, InsertPos);
6251 if (
const auto *TTP = dyn_cast<TemplateTypeParmDecl>(Param)) {
6253 if (TTP->isParameterPack())
6257 }
else if (
auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(Param)) {
6259 NTTP->getType().getNonPackExpansionType().getNonLValueExprType(*
this);
6265 if (T->isRecordType()) {
6274 Expr *E =
new (*this)
6276 T,
VK, NTTP->getLocation());
6278 if (NTTP->isParameterPack())
6284 std::nullopt,
false,
6286 if (TTP->isParameterPack())
6292 if (Param->isTemplateParameterPack())
6301 bool ExpectPackInType)
const {
6303 "Pack expansions must expand one or more parameter packs");
6305 llvm::FoldingSetNodeID ID;
6306 PackExpansionType::Profile(ID, Pattern, NumExpansions);
6308 void *InsertPos =
nullptr;
6309 PackExpansionType *T = PackExpansionTypes.FindNodeOrInsertPos(ID, InsertPos);
6320 PackExpansionTypes.FindNodeOrInsertPos(ID, InsertPos);
6323 T =
new (*
this,
alignof(PackExpansionType))
6324 PackExpansionType(Pattern, Canon, NumExpansions);
6326 PackExpansionTypes.InsertNode(T, InsertPos);
6338 if (Protocols.empty())
return true;
6343 for (
unsigned i = 1; i != Protocols.size(); ++i)
6353 llvm::array_pod_sort(Protocols.begin(), Protocols.end(),
CmpProtocolNames);
6357 P = P->getCanonicalDecl();
6360 auto ProtocolsEnd = llvm::unique(Protocols);
6361 Protocols.erase(ProtocolsEnd, Protocols.end());
6366 unsigned NumProtocols)
const {
6375 bool isKindOf)
const {
6378 if (typeArgs.empty() && protocols.empty() && !isKindOf &&
6383 llvm::FoldingSetNodeID ID;
6384 ObjCObjectTypeImpl::Profile(ID, baseType, typeArgs, protocols, isKindOf);
6385 void *InsertPos =
nullptr;
6386 if (
ObjCObjectType *QT = ObjCObjectTypes.FindNodeOrInsertPos(ID, InsertPos))
6393 if (effectiveTypeArgs.empty()) {
6395 effectiveTypeArgs = baseObject->getTypeArgs();
6402 bool typeArgsAreCanonical = llvm::all_of(
6405 if (!typeArgsAreCanonical || !protocolsSorted || !baseType.
isCanonical()) {
6409 if (!typeArgsAreCanonical) {
6410 canonTypeArgsVec.reserve(effectiveTypeArgs.size());
6411 for (
auto typeArg : effectiveTypeArgs)
6413 canonTypeArgs = canonTypeArgsVec;
6415 canonTypeArgs = effectiveTypeArgs;
6420 if (!protocolsSorted) {
6421 canonProtocolsVec.append(protocols.begin(), protocols.end());
6423 canonProtocols = canonProtocolsVec;
6425 canonProtocols = protocols;
6429 canonProtocols, isKindOf);
6432 ObjCObjectTypes.FindNodeOrInsertPos(ID, InsertPos);
6435 unsigned size =
sizeof(ObjCObjectTypeImpl);
6436 size += typeArgs.size() *
sizeof(
QualType);
6438 void *mem =
Allocate(size,
alignof(ObjCObjectTypeImpl));
6440 new (mem) ObjCObjectTypeImpl(canonical, baseType, typeArgs, protocols,
6444 ObjCObjectTypes.InsertNode(T, InsertPos);
6454 bool allowOnPointerType)
const {
6457 if (
const auto *objT = dyn_cast<ObjCTypeParamType>(
type.getTypePtr())) {
6462 if (allowOnPointerType) {
6463 if (
const auto *objPtr =
6464 dyn_cast<ObjCObjectPointerType>(
type.getTypePtr())) {
6468 protocolsVec.append(objT->qual_begin(),
6470 protocolsVec.append(protocols.begin(), protocols.end());
6473 objT->getBaseType(),
6474 objT->getTypeArgsAsWritten(),
6476 objT->isKindOfTypeAsWritten());
6482 if (
const auto *objT = dyn_cast<ObjCObjectType>(
type.getTypePtr())){
6487 objT->getTypeArgsAsWritten(),
6489 objT->isKindOfTypeAsWritten());
6493 if (
type->isObjCObjectType()) {
6503 if (
type->isObjCIdType()) {
6506 objPtr->isKindOfType());
6511 if (
type->isObjCClassType()) {
6514 objPtr->isKindOfType());
6526 llvm::FoldingSetNodeID ID;
6527 ObjCTypeParamType::Profile(ID,
Decl,
Decl->getUnderlyingType(), protocols);
6528 void *InsertPos =
nullptr;
6529 if (ObjCTypeParamType *TypeParam =
6530 ObjCTypeParamTypes.FindNodeOrInsertPos(ID, InsertPos))
6535 if (!protocols.empty()) {
6539 Canonical, protocols, hasError,
true ));
6540 assert(!hasError &&
"Error when apply protocol qualifier to bound type");
6543 unsigned size =
sizeof(ObjCTypeParamType);
6545 void *mem =
Allocate(size,
alignof(ObjCTypeParamType));
6546 auto *newType =
new (mem) ObjCTypeParamType(
Decl, Canonical, protocols);
6548 Types.push_back(newType);
6549 ObjCTypeParamTypes.InsertNode(newType, InsertPos);
6559 protocols.append(NewTypeParamTy->qual_begin(), NewTypeParamTy->qual_end());
6574 for (
auto *Proto : OPT->quals()) {
6597 if (InheritedProtocols.empty())
6601 bool Conforms =
false;
6602 for (
auto *Proto : OPT->quals()) {
6604 for (
auto *PI : InheritedProtocols) {
6616 for (
auto *PI : InheritedProtocols) {
6618 bool Adopts =
false;
6619 for (
auto *Proto : OPT->quals()) {
6633 llvm::FoldingSetNodeID ID;
6636 void *InsertPos =
nullptr;
6638 ObjCObjectPointerTypes.FindNodeOrInsertPos(ID, InsertPos))
6647 ObjCObjectPointerTypes.FindNodeOrInsertPos(ID, InsertPos);
6656 Types.push_back(QType);
6657 ObjCObjectPointerTypes.InsertNode(QType, InsertPos);
6665 if (
Decl->TypeForDecl)
6669 assert(PrevDecl->TypeForDecl &&
"previous decl has no TypeForDecl");
6670 Decl->TypeForDecl = PrevDecl->TypeForDecl;
6671 return QualType(PrevDecl->TypeForDecl, 0);
6680 Decl->TypeForDecl = T;
6693 llvm::FoldingSetNodeID ID;
6697 void *InsertPos =
nullptr;
6699 DependentTypeOfExprTypes.FindNodeOrInsertPos(ID, InsertPos);
6709 DependentTypeOfExprTypes.InsertNode(Canon, InsertPos);
6717 Types.push_back(toe);
6728 auto *tot =
new (*
this,
alignof(TypeOfType))
6729 TypeOfType(*
this, tofType, Canonical, Kind);
6730 Types.push_back(tot);
6754 llvm_unreachable(
"Unknown value kind");
6769 }
else if (!UnderlyingType.
isNull()) {
6772 llvm::FoldingSetNodeID ID;
6773 DependentDecltypeType::Profile(ID, *
this, E);
6775 void *InsertPos =
nullptr;
6776 if (DependentDecltypeType *Canon =
6777 DependentDecltypeTypes.FindNodeOrInsertPos(ID, InsertPos))
6782 new (*
this,
alignof(DependentDecltypeType)) DependentDecltypeType(E);
6783 DependentDecltypeTypes.InsertNode(DT, InsertPos);
6784 Types.push_back(DT);
6787 auto *DT =
new (*
this,
alignof(DecltypeType))
6788 DecltypeType(E, UnderlyingType, CanonType);
6789 Types.push_back(DT);
6794 bool FullySubstituted,
6798 if (FullySubstituted && Index) {
6801 llvm::FoldingSetNodeID ID;
6802 PackIndexingType::Profile(ID, *
this, Pattern.
getCanonicalType(), IndexExpr,
6803 FullySubstituted, Expansions);
6804 void *InsertPos =
nullptr;
6805 PackIndexingType *Canon =
6806 DependentPackIndexingTypes.FindNodeOrInsertPos(ID, InsertPos);
6809 PackIndexingType::totalSizeToAlloc<QualType>(Expansions.size()),
6813 IndexExpr, FullySubstituted, Expansions);
6814 DependentPackIndexingTypes.InsertNode(Canon, InsertPos);
6820 Allocate(PackIndexingType::totalSizeToAlloc<QualType>(Expansions.size()),
6822 auto *T =
new (Mem) PackIndexingType(Canonical, Pattern, IndexExpr,
6823 FullySubstituted, Expansions);
6832 UnaryTransformType::UTTKind Kind)
const {
6834 llvm::FoldingSetNodeID ID;
6835 UnaryTransformType::Profile(ID, BaseType, UnderlyingType, Kind);
6837 void *InsertPos =
nullptr;
6838 if (UnaryTransformType *UT =
6839 UnaryTransformTypes.FindNodeOrInsertPos(ID, InsertPos))
6843 if (!BaseType->isDependentType()) {
6846 assert(UnderlyingType.
isNull() || BaseType == UnderlyingType);
6849 BaseType != CanonBase) {
6854 [[maybe_unused]] UnaryTransformType *UT =
6855 UnaryTransformTypes.FindNodeOrInsertPos(ID, InsertPos);
6856 assert(!UT &&
"broken canonicalization");
6860 auto *UT =
new (*
this,
alignof(UnaryTransformType))
6861 UnaryTransformType(BaseType, UnderlyingType, Kind, CanonType);
6862 UnaryTransformTypes.InsertNode(UT, InsertPos);
6863 Types.push_back(UT);
6876 !TypeConstraintConcept) {
6877 assert(DeducedAsType.
isNull() &&
"");
6878 assert(TypeConstraintArgs.empty() &&
"");
6883 llvm::FoldingSetNodeID ID;
6884 AutoType::Profile(ID, *
this, DK, DeducedAsType,
Keyword,
6885 TypeConstraintConcept, TypeConstraintArgs);
6886 if (
auto const AT_iter = AutoTypes.find(ID); AT_iter != AutoTypes.end())
6887 return QualType(AT_iter->getSecond(), 0);
6890 assert(!DeducedAsType.
isNull() &&
"deduced type must be provided");
6892 assert(DeducedAsType.
isNull() &&
"deduced type must not be provided");
6893 if (TypeConstraintConcept) {
6894 bool AnyNonCanonArgs =
false;
6895 auto *CanonicalConcept =
6898 *
this, TypeConstraintArgs, AnyNonCanonArgs);
6899 if (TypeConstraintConcept != CanonicalConcept || AnyNonCanonArgs)
6901 CanonicalConceptArgs);
6905 void *Mem =
Allocate(
sizeof(AutoType) +
6908 auto *AT =
new (Mem) AutoType(DK, DeducedAsType,
Keyword,
6909 TypeConstraintConcept, TypeConstraintArgs);
6911 llvm::FoldingSetNodeID InsertedID;
6912 AT->Profile(InsertedID, *
this);
6913 assert(InsertedID == ID &&
"ID does not match");
6915 Types.push_back(AT);
6916 AutoTypes.try_emplace(ID, AT);
6924 if (
auto *AT = CanonT->
getAs<AutoType>()) {
6925 if (!AT->isConstrained())
6949 "unexpected DeducedAsPack for DeducedTemplateSpecializationType");
6952 void *InsertPos =
nullptr;
6953 llvm::FoldingSetNodeID ID;
6954 DeducedTemplateSpecializationType::Profile(ID, DK, DeducedAsType,
Keyword,
6956 if (DeducedTemplateSpecializationType *DTST =
6957 DeducedTemplateSpecializationTypes.FindNodeOrInsertPos(ID, InsertPos))
6961 assert(!DeducedAsType.
isNull() &&
"deduced type must be provided");
6963 assert(DeducedAsType.
isNull() &&
"deduced type must not be provided");
6972 [[maybe_unused]] DeducedTemplateSpecializationType *DTST =
6973 DeducedTemplateSpecializationTypes.FindNodeOrInsertPos(ID, InsertPos);
6974 assert(!DTST &&
"broken canonicalization");
6978 auto *DTST =
new (*
this,
alignof(DeducedTemplateSpecializationType))
6979 DeducedTemplateSpecializationType(DK, DeducedAsType,
Keyword,
Template);
6982 llvm::FoldingSetNodeID TempID;
6983 DTST->Profile(TempID);
6984 assert(ID == TempID &&
"ID does not match");
6986 Types.push_back(DTST);
6987 DeducedTemplateSpecializationTypes.InsertNode(DTST, InsertPos);
6996 llvm::FoldingSetNodeID ID;
6999 void *InsertPos =
nullptr;
7000 if (
AtomicType *AT = AtomicTypes.FindNodeOrInsertPos(ID, InsertPos))
7006 if (!T.isCanonical()) {
7010 AtomicType *NewIP = AtomicTypes.FindNodeOrInsertPos(ID, InsertPos);
7011 assert(!NewIP &&
"Shouldn't be in the map!"); (void)NewIP;
7014 Types.push_back(
New);
7015 AtomicTypes.InsertNode(
New, InsertPos);
7047 return getFromTargetType(Target->getSizeType());
7066 return getFromTargetType(Target->getUnsignedPtrDiffType(
LangAS::Default));
7071 return getFromTargetType(Target->getIntMaxType());
7076 return getFromTargetType(Target->getUIntMaxType());
7094 return getFromTargetType(Target->getIntPtrType());
7104 return getFromTargetType(Target->getProcessIDType());
7116 const Type *Ty = T.getTypePtr();
7144 quals = splitType.
Quals;
7149 QualType elementType = AT->getElementType();
7154 if (elementType == unqualElementType) {
7155 assert(quals.
empty());
7156 quals = splitType.
Quals;
7164 if (
const auto *CAT = dyn_cast<ConstantArrayType>(AT)) {
7166 CAT->getSizeExpr(), CAT->getSizeModifier(), 0);
7169 if (
const auto *IAT = dyn_cast<IncompleteArrayType>(AT)) {
7173 if (
const auto *VAT = dyn_cast<VariableArrayType>(AT)) {
7175 VAT->getSizeModifier(),
7176 VAT->getIndexTypeCVRQualifiers());
7181 DSAT->getSizeModifier(), 0);
7191 bool AllowPiMismatch)
const {
7206 if (
auto *CAT1 = dyn_cast<ConstantArrayType>(AT1)) {
7207 auto *CAT2 = dyn_cast<ConstantArrayType>(AT2);
7208 if (!((CAT2 && CAT1->getSize() == CAT2->getSize()) ||
7221 T1 = AT1->getElementType();
7222 T2 = AT2->getElementType();
7242 bool AllowPiMismatch)
const {
7247 if (T1PtrType && T2PtrType) {
7255 T1MPType && T2MPType) {
7258 if (T1MPType->getQualifier() != T2MPType->getQualifier())
7270 if (T1OPType && T2OPType) {
7302 if (Quals1 != Quals2)
7372 llvm_unreachable(
"bad template name kind!");
7378 if (!TP->hasDefaultArgument())
7380 return &TP->getDefaultArgument().getArgument();
7383 case NamedDecl::TemplateTypeParm:
7385 case NamedDecl::NonTypeTemplateParm:
7387 case NamedDecl::TemplateTemplateParm:
7390 llvm_unreachable(
"Unexpected template parameter kind");
7395 bool IgnoreDeduced)
const {
7396 while (std::optional<TemplateName> UnderlyingOrNone =
7398 Name = *UnderlyingOrNone;
7403 if (
auto *TTP = dyn_cast<TemplateTemplateParmDecl>(
Template))
7415 llvm_unreachable(
"cannot canonicalize overloaded template");
7419 assert(DTN &&
"Non-dependent template names must refer to template decls.");
7438 assert(IgnoreDeduced ==
false);
7445 bool NonCanonical = CanonUnderlying != Underlying;
7451 assert(CanonArgs.size() <= Params.size());
7457 for (
int I = CanonArgs.size() - 1; I >= 0; --I) {
7466 if (I ==
int(CanonArgs.size() - 1))
7467 CanonArgs.pop_back();
7468 NonCanonical =
true;
7478 llvm_unreachable(
"always sugar node");
7481 llvm_unreachable(
"bad template name!");
7486 bool IgnoreDeduced)
const {
7507 llvm::FoldingSetNodeID XCEID, YCEID;
7508 XCE->
Profile(XCEID, *
this,
true,
true);
7509 YCE->
Profile(YCEID, *
this,
true,
true);
7510 return XCEID == YCEID;
7559 if (
auto *TX = dyn_cast<TemplateTypeParmDecl>(
X)) {
7561 if (TX->isParameterPack() != TY->isParameterPack())
7563 if (TX->hasTypeConstraint() != TY->hasTypeConstraint())
7566 TY->getTypeConstraint());
7569 if (
auto *TX = dyn_cast<NonTypeTemplateParmDecl>(
X)) {
7571 return TX->isParameterPack() == TY->isParameterPack() &&
7572 TX->getASTContext().hasSameType(TX->getType(), TY->getType()) &&
7574 TY->getPlaceholderTypeConstraint());
7579 return TX->isParameterPack() == TY->isParameterPack() &&
7581 TY->getTemplateParameters());
7586 if (
X->size() != Y->
size())
7589 for (
unsigned I = 0, N =
X->size(); I != N; ++I)
7603 if (
auto *TTPX = dyn_cast<TemplateTypeParmDecl>(
X)) {
7605 if (!TTPX->hasDefaultArgument() || !TTPY->hasDefaultArgument())
7608 return hasSameType(TTPX->getDefaultArgument().getArgument().getAsType(),
7609 TTPY->getDefaultArgument().getArgument().getAsType());
7612 if (
auto *NTTPX = dyn_cast<NonTypeTemplateParmDecl>(
X)) {
7614 if (!NTTPX->hasDefaultArgument() || !NTTPY->hasDefaultArgument())
7617 Expr *DefaultArgumentX =
7618 NTTPX->getDefaultArgument().getArgument().getAsExpr()->
IgnoreImpCasts();
7619 Expr *DefaultArgumentY =
7620 NTTPY->getDefaultArgument().getArgument().getAsExpr()->
IgnoreImpCasts();
7621 llvm::FoldingSetNodeID XID, YID;
7622 DefaultArgumentX->
Profile(XID, *
this,
true);
7623 DefaultArgumentY->
Profile(YID, *
this,
true);
7630 if (!TTPX->hasDefaultArgument() || !TTPY->hasDefaultArgument())
7645 auto Kind =
X.getKind();
7653 auto [NamespaceX, PrefixX] =
X.getAsNamespaceAndPrefix();
7656 NamespaceY->getNamespace()))
7661 const auto *TX =
X.getAsType(), *TY = Y.
getAsType();
7662 if (TX->getCanonicalTypeInternal() != TY->getCanonicalTypeInternal())
7671 llvm_unreachable(
"unhandled qualifier kind");
7677 if (A->
hasAttr<CUDADeviceAttr>() != B->
hasAttr<CUDADeviceAttr>())
7679 if (A->
hasAttr<CUDADeviceAttr>() && B->
hasAttr<CUDADeviceAttr>())
7691 llvm::FoldingSetNodeID Cand1ID, Cand2ID;
7695 for (
auto Pair : zip_longest(AEnableIfAttrs, BEnableIfAttrs)) {
7696 std::optional<EnableIfAttr *> Cand1A = std::get<0>(Pair);
7697 std::optional<EnableIfAttr *> Cand2A = std::get<1>(Pair);
7700 if (!Cand1A || !Cand2A)
7706 (*Cand1A)->getCond()->Profile(Cand1ID, A->
getASTContext(),
true);
7707 (*Cand2A)->getCond()->Profile(Cand2ID, B->
getASTContext(),
true);
7711 if (Cand1ID != Cand2ID)
7745 if (
const auto *TypedefX = dyn_cast<TypedefNameDecl>(
X))
7746 if (
const auto *TypedefY = dyn_cast<TypedefNameDecl>(Y))
7748 TypedefY->getUnderlyingType());
7765 if (
const auto *TagX = dyn_cast<TagDecl>(
X)) {
7767 return (TagX->getTagKind() == TagY->getTagKind()) ||
7779 if (
const auto *FuncX = dyn_cast<FunctionDecl>(
X)) {
7781 if (
const auto *CtorX = dyn_cast<CXXConstructorDecl>(
X)) {
7783 if (CtorX->getInheritedConstructor() &&
7784 !
isSameEntity(CtorX->getInheritedConstructor().getConstructor(),
7785 CtorY->getInheritedConstructor().getConstructor()))
7789 if (FuncX->isMultiVersion() != FuncY->isMultiVersion())
7794 if (FuncX->isMultiVersion()) {
7795 const auto *TAX = FuncX->getAttr<TargetAttr>();
7796 const auto *TAY = FuncY->getAttr<TargetAttr>();
7797 assert(TAX && TAY &&
"Multiversion Function without target attribute");
7799 if (TAX->getFeaturesStr() != TAY->getFeaturesStr())
7805 if ((FuncX->isMemberLikeConstrainedFriend() ||
7806 FuncY->isMemberLikeConstrainedFriend()) &&
7807 !FuncX->getLexicalDeclContext()->Equals(
7808 FuncY->getLexicalDeclContext())) {
7813 FuncY->getTrailingRequiresClause()))
7821 FD = FD->getCanonicalDecl();
7822 return FD->getTypeSourceInfo() ? FD->getTypeSourceInfo()->getType()
7825 QualType XT = GetTypeAsWritten(FuncX), YT = GetTypeAsWritten(FuncY);
7840 return FuncX->getLinkageInternal() == FuncY->getLinkageInternal() &&
7845 if (
const auto *VarX = dyn_cast<VarDecl>(
X)) {
7847 if (VarX->getLinkageInternal() == VarY->getLinkageInternal()) {
7850 if (VarX->getType().isNull() || VarY->getType().isNull())
7853 if (
hasSameType(VarX->getType(), VarY->getType()))
7863 if (!VarXTy || !VarYTy)
7872 if (
const auto *NamespaceX = dyn_cast<NamespaceDecl>(
X)) {
7874 return NamespaceX->isInline() == NamespaceY->isInline();
7879 if (
const auto *TemplateX = dyn_cast<TemplateDecl>(
X)) {
7883 if (
const auto *ConceptX = dyn_cast<ConceptDecl>(
X)) {
7886 ConceptY->getConstraintExpr()))
7891 TemplateY->getTemplatedDecl()) &&
7893 TemplateY->getTemplateParameters());
7897 if (
const auto *FDX = dyn_cast<FieldDecl>(
X)) {
7900 return hasSameType(FDX->getType(), FDY->getType());
7904 if (
const auto *IFDX = dyn_cast<IndirectFieldDecl>(
X)) {
7906 return IFDX->getAnonField()->getCanonicalDecl() ==
7907 IFDY->getAnonField()->getCanonicalDecl();
7916 if (
const auto *USX = dyn_cast<UsingShadowDecl>(
X)) {
7923 if (
const auto *UX = dyn_cast<UsingDecl>(
X)) {
7926 UX->hasTypename() == UY->hasTypename() &&
7927 UX->isAccessDeclaration() == UY->isAccessDeclaration();
7929 if (
const auto *UX = dyn_cast<UnresolvedUsingValueDecl>(
X)) {
7932 UX->isAccessDeclaration() == UY->isAccessDeclaration();
7934 if (
const auto *UX = dyn_cast<UnresolvedUsingTypenameDecl>(
X)) {
7942 if (
const auto *UX = dyn_cast<UsingPackDecl>(
X)) {
7944 UX->getInstantiatedFromUsingDecl(),
7949 if (
const auto *NAX = dyn_cast<NamespaceAliasDecl>(
X)) {
7951 return NAX->getNamespace()->Equals(NAY->getNamespace());
7999 bool AnyNonCanonArgs =
false;
8002 if (!AnyNonCanonArgs)
8012 llvm_unreachable(
"Unhandled template argument kind");
8022 llvm_unreachable(
"Comparing NULL template argument");
8047 llvm::FoldingSetNodeID ID1, ID2;
8057 return isSameTemplateArgument(Arg1, Arg2);
8061 llvm_unreachable(
"Unhandled template argument kind");
8066 if (!T.hasLocalQualifiers()) {
8068 if (
const auto *AT = dyn_cast<ArrayType>(T))
8088 const auto *ATy = dyn_cast<ArrayType>(split.
Ty);
8089 if (!ATy || qs.
empty())
8096 if (
const auto *CAT = dyn_cast<ConstantArrayType>(ATy))
8099 CAT->getSizeModifier(),
8100 CAT->getIndexTypeCVRQualifiers()));
8101 if (
const auto *IAT = dyn_cast<IncompleteArrayType>(ATy))
8103 IAT->getSizeModifier(),
8104 IAT->getIndexTypeCVRQualifiers()));
8106 if (
const auto *DSAT = dyn_cast<DependentSizedArrayType>(ATy))
8108 NewEltTy, DSAT->getSizeExpr(), DSAT->getSizeModifier(),
8109 DSAT->getIndexTypeCVRQualifiers()));
8114 VAT->getIndexTypeCVRQualifiers()));
8122 if (T->isArrayType() || T->isFunctionType())
8130 return T.getUnqualifiedType();
8141 if (T->isArrayType() || T->isFunctionType())
8143 return T.getUnqualifiedType();
8158 assert(PrettyArrayType &&
"Not an array type!");
8195 uint64_t ElementCount = 1;
8198 CA = dyn_cast_or_null<ConstantArrayType>(
8201 return ElementCount;
8209 uint64_t ElementCount = 1;
8213 AILE = dyn_cast<ArrayInitLoopExpr>(AILE->
getSubExpr());
8216 return ElementCount;
8226 default: llvm_unreachable(
"getFloatingRank(): not a floating type");
8228 case BuiltinType::Half:
return HalfRank;
8229 case BuiltinType::Float:
return FloatRank;
8262unsigned ASTContext::getIntegerRank(
const Type *T)
const {
8263 assert(T->isCanonicalUnqualified() &&
"T should be canonicalized");
8267 if (
const auto *EIT = dyn_cast<BitIntType>(T))
8268 return 0 + (EIT->getNumBits() << 3);
8270 if (
const auto *OBT = dyn_cast<OverflowBehaviorType>(T))
8271 return getIntegerRank(OBT->getUnderlyingType().getTypePtr());
8274 default: llvm_unreachable(
"getIntegerRank(): not a built-in integer");
8275 case BuiltinType::Bool:
8277 case BuiltinType::Char_S:
8278 case BuiltinType::Char_U:
8279 case BuiltinType::SChar:
8280 case BuiltinType::UChar:
8282 case BuiltinType::Short:
8283 case BuiltinType::UShort:
8285 case BuiltinType::Int:
8286 case BuiltinType::UInt:
8288 case BuiltinType::Long:
8289 case BuiltinType::ULong:
8291 case BuiltinType::LongLong:
8292 case BuiltinType::ULongLong:
8294 case BuiltinType::Int128:
8295 case BuiltinType::UInt128:
8300 case BuiltinType::Char8:
8302 case BuiltinType::Char16:
8303 return getIntegerRank(
8305 case BuiltinType::Char32:
8306 return getIntegerRank(
8308 case BuiltinType::WChar_S:
8309 case BuiltinType::WChar_U:
8310 return getIntegerRank(
8340 uint64_t BitWidth = Field->getBitWidthValue();
8366 if (BitWidth < IntSize)
8369 if (BitWidth == IntSize)
8384 assert(!Promotable.
isNull());
8387 return ED->getPromotionType();
8391 if (
const auto *OBT = Promotable->
getAs<OverflowBehaviorType>()) {
8404 if (BT->getKind() == BuiltinType::WChar_S ||
8405 BT->getKind() == BuiltinType::WChar_U ||
8406 BT->getKind() == BuiltinType::Char8 ||
8407 BT->getKind() == BuiltinType::Char16 ||
8408 BT->getKind() == BuiltinType::Char32) {
8409 bool FromIsSigned = BT->getKind() == BuiltinType::WChar_S;
8413 for (
const auto &PT : PromoteTypes) {
8415 if (FromSize < ToSize ||
8416 (FromSize == ToSize && FromIsSigned == PT->isSignedIntegerType()))
8419 llvm_unreachable(
"char type should fit into long long");
8426 uint64_t PromotableSize =
getIntWidth(Promotable);
8435 while (!T.isNull()) {
8437 return T.getObjCLifetime();
8438 if (T->isArrayType())
8440 else if (
const auto *PT = T->getAs<
PointerType>())
8441 T = PT->getPointeeType();
8443 T = RT->getPointeeType();
8468 if (
const auto *ET = dyn_cast<EnumType>(LHSC))
8470 if (
const auto *ET = dyn_cast<EnumType>(RHSC))
8473 if (LHSC == RHSC)
return 0;
8478 unsigned LHSRank = getIntegerRank(LHSC);
8479 unsigned RHSRank = getIntegerRank(RHSC);
8481 if (LHSUnsigned == RHSUnsigned) {
8482 if (LHSRank == RHSRank)
return 0;
8483 return LHSRank > RHSRank ? 1 : -1;
8489 if (LHSRank >= RHSRank)
8499 if (RHSRank >= LHSRank)
8509 if (CFConstantStringTypeDecl)
8510 return CFConstantStringTypeDecl;
8512 assert(!CFConstantStringTagDecl &&
8513 "tag and typedef should be initialized together");
8515 CFConstantStringTagDecl->startDefinition();
8553 if (
static_cast<unsigned>(CFRuntime) <
8556 Fields[Count++] = {
IntTy,
"flags" };
8558 Fields[Count++] = {
LongTy,
"length" };
8562 Fields[Count++] = { getFromTargetType(Target->getUInt64Type()),
"_swift_rc" };
8566 Fields[Count++] = {
IntTy,
"_ptr" };
8572 for (
unsigned i = 0; i < Count; ++i) {
8576 Fields[i].Type,
nullptr,
8579 CFConstantStringTagDecl->addDecl(Field);
8582 CFConstantStringTagDecl->completeDefinition();
8586 CFConstantStringTypeDecl =
8589 return CFConstantStringTypeDecl;
8593 if (!CFConstantStringTagDecl)
8595 return CFConstantStringTagDecl;
8605 if (ObjCSuperType.isNull()) {
8610 return ObjCSuperType;
8616 CFConstantStringTagDecl = TT->castAsRecordDecl();
8620 if (BlockDescriptorType)
8633 static const char *
const FieldNames[] = {
8638 for (
size_t i = 0; i < 2; ++i) {
8641 &
Idents.get(FieldNames[i]), FieldTypes[i],
nullptr,
8649 BlockDescriptorType = RD;
8655 if (BlockDescriptorExtendedType)
8670 static const char *
const FieldNames[] = {
8677 for (
size_t i = 0; i < 4; ++i) {
8680 &
Idents.get(FieldNames[i]), FieldTypes[i],
nullptr,
8689 BlockDescriptorExtendedType = RD;
8694 const auto *BT = dyn_cast<BuiltinType>(T);
8703 switch (BT->getKind()) {
8704#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
8705 case BuiltinType::Id: \
8707#include "clang/Basic/OpenCLImageTypes.def"
8709 case BuiltinType::OCLClkEvent:
8712 case BuiltinType::OCLEvent:
8715 case BuiltinType::OCLQueue:
8718 case BuiltinType::OCLReserveID:
8721 case BuiltinType::OCLSampler:
8740 if (!copyExpr && record->hasTrivialDestructor())
return false;
8771 llvm_unreachable(
"impossible");
8773 llvm_unreachable(
"fell out of lifetime switch!");
8781 bool &HasByrefExtendedLayout)
const {
8786 HasByrefExtendedLayout =
false;
8788 HasByrefExtendedLayout =
true;
8802 assert(Target &&
"Expected target to be initialized");
8803 const llvm::Triple &T = Target->getTriple();
8805 if (T.isOSWindows() && T.isArch64Bit())
8811 assert(Target &&
"Expected target to be initialized");
8812 const llvm::Triple &T = Target->getTriple();
8814 if (T.isOSWindows() && T.isArch64Bit())
8820 if (!ObjCInstanceTypeDecl)
8821 ObjCInstanceTypeDecl =
8823 return ObjCInstanceTypeDecl;
8829 if (
const auto *TT = dyn_cast<TypedefType>(T))
8831 return II->isStr(
"BOOL");
8839 if (!
type->isIncompleteArrayType() &&
type->isIncompleteType())
8848 else if (
type->isArrayType())
8867 if (
First->isInlineSpecified() || !
First->isStaticDataMember())
8874 !D->isInlineSpecified() && (D->isConstexpr() ||
First->isConstexpr()))
8905 for (
auto *PI :
Decl->parameters()) {
8910 assert(sz.
isPositive() &&
"BlockExpr - Incomplete param type");
8919 ParmOffset = PtrSize;
8920 for (
auto *PVDecl :
Decl->parameters()) {
8921 QualType PType = PVDecl->getOriginalType();
8922 if (
const auto *AT =
8927 PType = PVDecl->getType();
8929 PType = PVDecl->getType();
8949 for (
auto *PI :
Decl->parameters()) {
8956 "getObjCEncodingForFunctionDecl - Incomplete param type");
8963 for (
auto *PVDecl :
Decl->parameters()) {
8964 QualType PType = PVDecl->getOriginalType();
8965 if (
const auto *AT =
8970 PType = PVDecl->getType();
8972 PType = PVDecl->getType();
8986 bool Extended)
const {
8990 ObjCEncOptions Options = ObjCEncOptions()
8991 .setExpandPointedToStructures()
8992 .setExpandStructures()
8993 .setIsOutermostType();
8995 Options.setEncodeBlockParameters().setEncodeClassNames();
8996 getObjCEncodingForTypeImpl(T, S, Options,
nullptr);
9002 bool Extended)
const {
9007 Decl->getReturnType(), S, Extended);
9016 E =
Decl->sel_param_end(); PI != E; ++PI) {
9023 "getObjCEncodingForMethodDecl - Incomplete param type");
9031 ParmOffset = 2 * PtrSize;
9033 E =
Decl->sel_param_end(); PI != E; ++PI) {
9036 if (
const auto *AT =
9045 PType, S, Extended);
9056 const Decl *Container)
const {
9059 if (
const auto *CID = dyn_cast<ObjCCategoryImplDecl>(Container)) {
9060 for (
auto *PID : CID->property_impls())
9061 if (PID->getPropertyDecl() == PD)
9065 for (
auto *PID : OID->property_impls())
9066 if (PID->getPropertyDecl() == PD)
9100 const Decl *Container)
const {
9102 bool Dynamic =
false;
9110 SynthesizePID = PropertyImpDecl;
9114 std::string S =
"T";
9159 if (SynthesizePID) {
9176 if (BT->getKind() == BuiltinType::ULong &&
getIntWidth(PointeeTy) == 32)
9179 if (BT->getKind() == BuiltinType::Long &&
getIntWidth(PointeeTy) == 32)
9192 getObjCEncodingForTypeImpl(T, S,
9194 .setExpandPointedToStructures()
9195 .setExpandStructures()
9196 .setIsOutermostType(),
9197 Field, NotEncodedT);
9201 std::string& S)
const {
9205 getObjCEncodingForTypeImpl(T, S,
9207 .setExpandPointedToStructures()
9208 .setExpandStructures()
9209 .setIsOutermostType()
9210 .setEncodingProperty(),
9218 case BuiltinType::Void:
return 'v';
9219 case BuiltinType::Bool:
return 'B';
9220 case BuiltinType::Char8:
9221 case BuiltinType::Char_U:
9222 case BuiltinType::UChar:
return 'C';
9223 case BuiltinType::Char16:
9224 case BuiltinType::UShort:
return 'S';
9225 case BuiltinType::Char32:
9226 case BuiltinType::UInt:
return 'I';
9227 case BuiltinType::ULong:
9228 return C->getTargetInfo().getLongWidth() == 32 ?
'L' :
'Q';
9229 case BuiltinType::UInt128:
return 'T';
9230 case BuiltinType::ULongLong:
return 'Q';
9231 case BuiltinType::Char_S:
9232 case BuiltinType::SChar:
return 'c';
9233 case BuiltinType::Short:
return 's';
9234 case BuiltinType::WChar_S:
9235 case BuiltinType::WChar_U:
9236 case BuiltinType::Int:
return 'i';
9237 case BuiltinType::Long:
9238 return C->getTargetInfo().getLongWidth() == 32 ?
'l' :
'q';
9239 case BuiltinType::LongLong:
return 'q';
9240 case BuiltinType::Int128:
return 't';
9241 case BuiltinType::Float:
return 'f';
9242 case BuiltinType::Double:
return 'd';
9243 case BuiltinType::LongDouble:
return 'D';
9244 case BuiltinType::NullPtr:
return '*';
9246 case BuiltinType::BFloat16:
9247 case BuiltinType::Float16:
9248 case BuiltinType::Float128:
9249 case BuiltinType::Ibm128:
9250 case BuiltinType::Half:
9251 case BuiltinType::ShortAccum:
9252 case BuiltinType::Accum:
9253 case BuiltinType::LongAccum:
9254 case BuiltinType::UShortAccum:
9255 case BuiltinType::UAccum:
9256 case BuiltinType::ULongAccum:
9257 case BuiltinType::ShortFract:
9258 case BuiltinType::Fract:
9259 case BuiltinType::LongFract:
9260 case BuiltinType::UShortFract:
9261 case BuiltinType::UFract:
9262 case BuiltinType::ULongFract:
9263 case BuiltinType::SatShortAccum:
9264 case BuiltinType::SatAccum:
9265 case BuiltinType::SatLongAccum:
9266 case BuiltinType::SatUShortAccum:
9267 case BuiltinType::SatUAccum:
9268 case BuiltinType::SatULongAccum:
9269 case BuiltinType::SatShortFract:
9270 case BuiltinType::SatFract:
9271 case BuiltinType::SatLongFract:
9272 case BuiltinType::SatUShortFract:
9273 case BuiltinType::SatUFract:
9274 case BuiltinType::SatULongFract:
9278#define SVE_TYPE(Name, Id, SingletonId) \
9279 case BuiltinType::Id:
9280#include "clang/Basic/AArch64ACLETypes.def"
9281#define RVV_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
9282#include "clang/Basic/RISCVVTypes.def"
9283#define WASM_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
9284#include "clang/Basic/WebAssemblyReferenceTypes.def"
9285#define AMDGPU_TYPE(Name, Id, SingletonId, Width, Align) case BuiltinType::Id:
9286#include "clang/Basic/AMDGPUTypes.def"
9289 Diags.
Report(diag::err_unsupported_objc_primitive_encoding)
9294 case BuiltinType::ObjCId:
9295 case BuiltinType::ObjCClass:
9296 case BuiltinType::ObjCSel:
9297 llvm_unreachable(
"@encoding ObjC primitive type");
9300#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
9301 case BuiltinType::Id:
9302#include "clang/Basic/OpenCLImageTypes.def"
9303#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
9304 case BuiltinType::Id:
9305#include "clang/Basic/OpenCLExtensionTypes.def"
9306 case BuiltinType::OCLEvent:
9307 case BuiltinType::OCLClkEvent:
9308 case BuiltinType::OCLQueue:
9309 case BuiltinType::OCLReserveID:
9310 case BuiltinType::OCLSampler:
9311 case BuiltinType::Dependent:
9312#define PPC_VECTOR_TYPE(Name, Id, Size) \
9313 case BuiltinType::Id:
9314#include "clang/Basic/PPCTypes.def"
9315#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
9316#include "clang/Basic/HLSLIntangibleTypes.def"
9317#define BUILTIN_TYPE(KIND, ID)
9318#define PLACEHOLDER_TYPE(KIND, ID) \
9319 case BuiltinType::KIND:
9320#include "clang/AST/BuiltinTypes.def"
9321 llvm_unreachable(
"invalid builtin type for @encode");
9323 llvm_unreachable(
"invalid BuiltinType::Kind value");
9330 if (!
Enum->isFixed())
9340 assert(FD->
isBitField() &&
"not a bitfield - getObjCEncodingForTypeImpl");
9360 if (
const auto *IVD = dyn_cast<ObjCIvarDecl>(FD)) {
9368 S += llvm::utostr(Offset);
9383 bool VisitBasesAndFields) {
9384 T = T->getBaseElementTypeUnsafe();
9388 PT->getPointeeType().getTypePtr(),
false);
9390 auto *CXXRD = T->getAsCXXRecordDecl();
9398 if (!CXXRD->hasDefinition() || !VisitBasesAndFields)
9401 for (
const auto &B : CXXRD->bases())
9406 for (
auto *FD : CXXRD->fields())
9415void ASTContext::getObjCEncodingForTypeImpl(QualType T, std::string &S,
9416 const ObjCEncOptions Options,
9417 const FieldDecl *FD,
9418 QualType *NotEncodedT)
const {
9420 switch (CT->getTypeClass()) {
9425 if (
const auto *BT = dyn_cast<BuiltinType>(CT))
9433 getObjCEncodingForTypeImpl(T->
castAs<ComplexType>()->getElementType(), S,
9440 getObjCEncodingForTypeImpl(T->
castAs<AtomicType>()->getValueType(), S,
9447 case Type::LValueReference:
9448 case Type::RValueReference: {
9451 const auto *PT = T->
castAs<PointerType>();
9452 if (PT->isObjCSelType()) {
9461 bool isReadOnly =
false;
9466 if (T->
getAs<TypedefType>()) {
9471 }
else if (Options.IsOutermostType()) {
9472 QualType P = PointeeTy;
9473 while (
auto PT = P->
getAs<PointerType>())
9484 if (StringRef(S).ends_with(
"nr"))
9485 S.replace(S.end()-2, S.end(),
"rn");
9495 }
else if (
const auto *RTy = PointeeTy->
getAsCanonical<RecordType>()) {
9496 const IdentifierInfo *II = RTy->getDecl()->getIdentifier();
9498 if (II == &
Idents.get(
"objc_class")) {
9503 if (II == &
Idents.get(
"objc_object")) {
9512 RTy, Options.ExpandPointedToStructures()))) {
9521 ObjCEncOptions NewOptions;
9522 if (Options.ExpandPointedToStructures())
9523 NewOptions.setExpandStructures();
9524 getObjCEncodingForTypeImpl(PointeeTy, S, NewOptions,
9525 nullptr, NotEncodedT);
9529 case Type::ConstantArray:
9530 case Type::IncompleteArray:
9531 case Type::VariableArray: {
9538 getObjCEncodingForTypeImpl(
9539 AT->getElementType(), S,
9540 Options.keepingOnly(ObjCEncOptions().setExpandStructures()), FD);
9544 if (
const auto *CAT = dyn_cast<ConstantArrayType>(AT))
9545 S += llvm::utostr(CAT->getZExtSize());
9549 "Unknown array type!");
9553 getObjCEncodingForTypeImpl(
9554 AT->getElementType(), S,
9555 Options.keepingOnly(ObjCEncOptions().setExpandStructures()), FD,
9562 case Type::FunctionNoProto:
9563 case Type::FunctionProto:
9567 case Type::Record: {
9569 S += RDecl->
isUnion() ?
'(' :
'{';
9573 if (
const auto *Spec = dyn_cast<ClassTemplateSpecializationDecl>(RDecl)) {
9574 const TemplateArgumentList &TemplateArgs = Spec->getTemplateArgs();
9575 llvm::raw_string_ostream
OS(S);
9576 printTemplateArgumentList(OS, TemplateArgs.
asArray(),
9582 if (Options.ExpandStructures()) {
9585 getObjCEncodingForStructureImpl(RDecl, S, FD,
true, NotEncodedT);
9587 for (
const auto *Field : RDecl->
fields()) {
9590 S +=
Field->getNameAsString();
9595 if (
Field->isBitField()) {
9596 getObjCEncodingForTypeImpl(
Field->getType(), S,
9597 ObjCEncOptions().setExpandStructures(),
9600 QualType qt =
Field->getType();
9602 getObjCEncodingForTypeImpl(
9604 ObjCEncOptions().setExpandStructures().setIsStructField(), FD,
9610 S += RDecl->
isUnion() ?
')' :
'}';
9614 case Type::BlockPointer: {
9615 const auto *BT = T->
castAs<BlockPointerType>();
9617 if (Options.EncodeBlockParameters()) {
9618 const auto *FT = BT->getPointeeType()->castAs<FunctionType>();
9622 getObjCEncodingForTypeImpl(FT->getReturnType(), S,
9623 Options.forComponentType(), FD, NotEncodedT);
9627 if (
const auto *FPT = dyn_cast<FunctionProtoType>(FT)) {
9628 for (
const auto &I : FPT->param_types())
9629 getObjCEncodingForTypeImpl(I, S, Options.forComponentType(), FD,
9637 case Type::ObjCObject: {
9641 S +=
"{objc_object=}";
9645 S +=
"{objc_class=}";
9652 case Type::ObjCInterface: {
9655 ObjCInterfaceDecl *OI = T->
castAs<ObjCObjectType>()->getInterface();
9658 if (Options.ExpandStructures()) {
9660 SmallVector<const ObjCIvarDecl*, 32> Ivars;
9662 for (
unsigned i = 0, e = Ivars.size(); i != e; ++i) {
9663 const FieldDecl *
Field = Ivars[i];
9664 if (
Field->isBitField())
9665 getObjCEncodingForTypeImpl(
Field->getType(), S,
9666 ObjCEncOptions().setExpandStructures(),
9669 getObjCEncodingForTypeImpl(
Field->getType(), S,
9670 ObjCEncOptions().setExpandStructures(), FD,
9678 case Type::ObjCObjectPointer: {
9679 const auto *OPT = T->
castAs<ObjCObjectPointerType>();
9680 if (OPT->isObjCIdType()) {
9685 if (OPT->isObjCClassType() || OPT->isObjCQualifiedClassType()) {
9693 if (OPT->isObjCQualifiedIdType()) {
9694 getObjCEncodingForTypeImpl(
9696 Options.keepingOnly(ObjCEncOptions()
9697 .setExpandPointedToStructures()
9698 .setExpandStructures()),
9700 if (FD || Options.EncodingProperty() || Options.EncodeClassNames()) {
9704 for (
const auto *I : OPT->quals()) {
9706 S += I->getObjCRuntimeNameAsString();
9715 if (OPT->getInterfaceDecl() &&
9716 (FD || Options.EncodingProperty() || Options.EncodeClassNames())) {
9718 S += OPT->getInterfaceDecl()->getObjCRuntimeNameAsString();
9719 for (
const auto *I : OPT->quals()) {
9721 S += I->getObjCRuntimeNameAsString();
9731 case Type::MemberPointer:
9735 case Type::ExtVector:
9741 case Type::ConstantMatrix:
9754 case Type::DeducedTemplateSpecialization:
9757 case Type::HLSLAttributedResource:
9758 case Type::HLSLInlineSpirv:
9759 case Type::OverflowBehavior:
9760 llvm_unreachable(
"unexpected type");
9762 case Type::ArrayParameter:
9764#define ABSTRACT_TYPE(KIND, BASE)
9765#define TYPE(KIND, BASE)
9766#define DEPENDENT_TYPE(KIND, BASE) \
9768#define NON_CANONICAL_TYPE(KIND, BASE) \
9770#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(KIND, BASE) \
9772#include "clang/AST/TypeNodes.inc"
9773 llvm_unreachable(
"@encode for dependent type!");
9775 llvm_unreachable(
"bad type kind!");
9778void ASTContext::getObjCEncodingForStructureImpl(RecordDecl *RDecl,
9780 const FieldDecl *FD,
9782 QualType *NotEncodedT)
const {
9783 assert(RDecl &&
"Expected non-null RecordDecl");
9784 assert(!RDecl->
isUnion() &&
"Should not be called for unions");
9788 const auto *CXXRec = dyn_cast<CXXRecordDecl>(RDecl);
9789 std::multimap<uint64_t, NamedDecl *> FieldOrBaseOffsets;
9793 for (
const auto &BI : CXXRec->bases()) {
9794 if (!BI.isVirtual()) {
9799 FieldOrBaseOffsets.insert(FieldOrBaseOffsets.upper_bound(offs),
9800 std::make_pair(offs, base));
9805 for (FieldDecl *Field : RDecl->
fields()) {
9806 if (!
Field->isZeroLengthBitField() &&
Field->isZeroSize(*
this))
9809 FieldOrBaseOffsets.insert(FieldOrBaseOffsets.upper_bound(offs),
9810 std::make_pair(offs, Field));
9813 if (CXXRec && includeVBases) {
9814 for (
const auto &BI : CXXRec->vbases()) {
9820 FieldOrBaseOffsets.find(offs) == FieldOrBaseOffsets.end())
9821 FieldOrBaseOffsets.insert(FieldOrBaseOffsets.end(),
9822 std::make_pair(offs, base));
9836 std::multimap<uint64_t, NamedDecl *>::iterator
9837 CurLayObj = FieldOrBaseOffsets.begin();
9839 if (CXXRec && CXXRec->isDynamicClass() &&
9840 (CurLayObj == FieldOrBaseOffsets.end() || CurLayObj->first != 0)) {
9843 std::string recname = CXXRec->getNameAsString();
9844 if (recname.empty()) recname =
"?";
9857 FieldOrBaseOffsets.insert(FieldOrBaseOffsets.upper_bound(offs),
9858 std::make_pair(offs,
nullptr));
9861 for (; CurLayObj != FieldOrBaseOffsets.end(); ++CurLayObj) {
9863 assert(CurOffs <= CurLayObj->first);
9864 if (CurOffs < CurLayObj->first) {
9865 uint64_t padding = CurLayObj->first - CurOffs;
9877 NamedDecl *dcl = CurLayObj->second;
9881 if (
auto *base = dyn_cast<CXXRecordDecl>(dcl)) {
9886 getObjCEncodingForStructureImpl(base, S, FD,
false,
9896 S += field->getNameAsString();
9900 if (field->isBitField()) {
9903 CurOffs += field->getBitWidthValue();
9906 QualType qt = field->getType();
9908 getObjCEncodingForTypeImpl(
9909 qt, S, ObjCEncOptions().setExpandStructures().setIsStructField(),
9920 std::string& S)
const {
9953 if (!ObjCClassDecl) {
9958 return ObjCClassDecl;
9962 if (!ObjCProtocolClassDecl) {
9963 ObjCProtocolClassDecl
9972 return ObjCProtocolClassDecl;
9993 QualType T = Context->getPointerType(Context->CharTy);
9994 return Context->buildImplicitTypedef(T, Name);
10007 QualType T = Context->getPointerType(Context->VoidTy);
10008 return Context->buildImplicitTypedef(T,
"__builtin_va_list");
10011static TypedefDecl *
10015 if (Context->getLangOpts().CPlusPlus) {
10020 &Context->Idents.get(
"std"),
10028 const size_t NumFields = 5;
10030 const char *FieldNames[NumFields];
10033 FieldTypes[0] = Context->getPointerType(Context->VoidTy);
10034 FieldNames[0] =
"__stack";
10037 FieldTypes[1] = Context->getPointerType(Context->VoidTy);
10038 FieldNames[1] =
"__gr_top";
10041 FieldTypes[2] = Context->getPointerType(Context->VoidTy);
10042 FieldNames[2] =
"__vr_top";
10045 FieldTypes[3] = Context->IntTy;
10046 FieldNames[3] =
"__gr_offs";
10049 FieldTypes[4] = Context->IntTy;
10050 FieldNames[4] =
"__vr_offs";
10053 for (
unsigned i = 0; i < NumFields; ++i) {
10058 &Context->Idents.get(FieldNames[i]),
10059 FieldTypes[i],
nullptr,
10071 return Context->buildImplicitTypedef(VaListTagType,
"__builtin_va_list");
10078 VaListTagDecl = Context->buildImplicitRecord(
"__va_list_tag");
10081 const size_t NumFields = 5;
10083 const char *FieldNames[NumFields];
10086 FieldTypes[0] = Context->UnsignedCharTy;
10087 FieldNames[0] =
"gpr";
10090 FieldTypes[1] = Context->UnsignedCharTy;
10091 FieldNames[1] =
"fpr";
10094 FieldTypes[2] = Context->UnsignedShortTy;
10095 FieldNames[2] =
"reserved";
10098 FieldTypes[3] = Context->getPointerType(Context->VoidTy);
10099 FieldNames[3] =
"overflow_arg_area";
10102 FieldTypes[4] = Context->getPointerType(Context->VoidTy);
10103 FieldNames[4] =
"reg_save_area";
10106 for (
unsigned i = 0; i < NumFields; ++i) {
10110 &Context->Idents.get(FieldNames[i]),
10111 FieldTypes[i],
nullptr,
10124 Context->buildImplicitTypedef(VaListTagType,
"__va_list_tag");
10128 std::nullopt, VaListTagTypedefDecl);
10131 llvm::APInt Size(Context->getTypeSize(Context->getSizeType()), 1);
10132 QualType VaListTagArrayType = Context->getConstantArrayType(
10134 return Context->buildImplicitTypedef(VaListTagArrayType,
"__builtin_va_list");
10137static TypedefDecl *
10141 VaListTagDecl = Context->buildImplicitRecord(
"__va_list_tag");
10144 const size_t NumFields = 4;
10146 const char *FieldNames[NumFields];
10149 FieldTypes[0] = Context->UnsignedIntTy;
10150 FieldNames[0] =
"gp_offset";
10153 FieldTypes[1] = Context->UnsignedIntTy;
10154 FieldNames[1] =
"fp_offset";
10157 FieldTypes[2] = Context->getPointerType(Context->VoidTy);
10158 FieldNames[2] =
"overflow_arg_area";
10161 FieldTypes[3] = Context->getPointerType(Context->VoidTy);
10162 FieldNames[3] =
"reg_save_area";
10165 for (
unsigned i = 0; i < NumFields; ++i) {
10170 &Context->Idents.get(FieldNames[i]),
10171 FieldTypes[i],
nullptr,
10185 llvm::APInt Size(Context->getTypeSize(Context->getSizeType()), 1);
10186 QualType VaListTagArrayType = Context->getConstantArrayType(
10188 return Context->buildImplicitTypedef(VaListTagArrayType,
"__builtin_va_list");
10191static TypedefDecl *
10194 RecordDecl *VaListDecl = Context->buildImplicitRecord(
"__va_list");
10195 if (Context->getLangOpts().CPlusPlus) {
10214 &Context->Idents.get(
"__ap"),
10215 Context->getPointerType(Context->VoidTy),
10225 Context->VaListTagDecl = VaListDecl;
10228 CanQualType T = Context->getCanonicalTagType(VaListDecl);
10229 return Context->buildImplicitTypedef(T,
"__builtin_va_list");
10232static TypedefDecl *
10236 VaListTagDecl = Context->buildImplicitRecord(
"__va_list_tag");
10239 const size_t NumFields = 4;
10241 const char *FieldNames[NumFields];
10244 FieldTypes[0] = Context->LongTy;
10245 FieldNames[0] =
"__gpr";
10248 FieldTypes[1] = Context->LongTy;
10249 FieldNames[1] =
"__fpr";
10252 FieldTypes[2] = Context->getPointerType(Context->VoidTy);
10253 FieldNames[2] =
"__overflow_arg_area";
10256 FieldTypes[3] = Context->getPointerType(Context->VoidTy);
10257 FieldNames[3] =
"__reg_save_area";
10260 for (
unsigned i = 0; i < NumFields; ++i) {
10265 &Context->Idents.get(FieldNames[i]),
10266 FieldTypes[i],
nullptr,
10280 llvm::APInt Size(Context->getTypeSize(Context->getSizeType()), 1);
10281 QualType VaListTagArrayType = Context->getConstantArrayType(
10284 return Context->buildImplicitTypedef(VaListTagArrayType,
"__builtin_va_list");
10290 VaListTagDecl = Context->buildImplicitRecord(
"__va_list_tag");
10293 const size_t NumFields = 3;
10295 const char *FieldNames[NumFields];
10298 FieldTypes[0] = Context->getPointerType(Context->VoidTy);
10299 FieldNames[0] =
"__current_saved_reg_area_pointer";
10302 FieldTypes[1] = Context->getPointerType(Context->VoidTy);
10303 FieldNames[1] =
"__saved_reg_area_end_pointer";
10306 FieldTypes[2] = Context->getPointerType(Context->VoidTy);
10307 FieldNames[2] =
"__overflow_area_pointer";
10310 for (
unsigned i = 0; i < NumFields; ++i) {
10313 SourceLocation(), &Context->Idents.get(FieldNames[i]), FieldTypes[i],
10326 Context->buildImplicitTypedef(VaListTagType,
"__va_list_tag");
10330 std::nullopt, VaListTagTypedefDecl);
10333 llvm::APInt Size(Context->getTypeSize(Context->getSizeType()), 1);
10334 QualType VaListTagArrayType = Context->getConstantArrayType(
10337 return Context->buildImplicitTypedef(VaListTagArrayType,
"__builtin_va_list");
10340static TypedefDecl *
10350 constexpr size_t NumFields = 3;
10351 QualType FieldTypes[NumFields] = {Context->getPointerType(Context->IntTy),
10352 Context->getPointerType(Context->IntTy),
10354 const char *FieldNames[NumFields] = {
"__va_stk",
"__va_reg",
"__va_ndx"};
10357 for (
unsigned i = 0; i < NumFields; ++i) {
10360 &Context->Idents.get(FieldNames[i]), FieldTypes[i],
nullptr,
10372 Context->buildImplicitTypedef(VaListTagType,
"__builtin_va_list");
10374 return VaListTagTypedefDecl;
10400 llvm_unreachable(
"Unhandled __builtin_va_list type kind");
10404 if (!BuiltinVaListDecl) {
10405 BuiltinVaListDecl =
CreateVaListDecl(
this, Target->getBuiltinVaListKind());
10406 assert(BuiltinVaListDecl->isImplicit());
10409 return BuiltinVaListDecl;
10422 if (!BuiltinMSVaListDecl)
10425 return BuiltinMSVaListDecl;
10442 assert(ObjCConstantStringType.isNull() &&
10443 "'NSConstantString' type already set!");
10453 unsigned size = End - Begin;
10454 assert(size > 1 &&
"set is not overloaded!");
10460 NamedDecl **Storage = OT->getStorage();
10483 bool TemplateKeyword,
10488 if (
Template.getAsTemplateDecl()->getKind() == Decl::TemplateTemplateParm) {
10489 assert(!Qualifier &&
"unexpected qualified template template parameter");
10490 assert(TemplateKeyword ==
false);
10495 llvm::FoldingSetNodeID ID;
10498 void *InsertPos =
nullptr;
10500 QualifiedTemplateNames.FindNodeOrInsertPos(ID, InsertPos);
10504 QualifiedTemplateNames.InsertNode(QTN, InsertPos);
10514 llvm::FoldingSetNodeID ID;
10517 void *InsertPos =
nullptr;
10519 DependentTemplateNames.FindNodeOrInsertPos(ID, InsertPos))
10524 DependentTemplateNames.InsertNode(QTN, InsertPos);
10529 Decl *AssociatedDecl,
10532 bool Final)
const {
10533 llvm::FoldingSetNodeID ID;
10535 Index, PackIndex, Final);
10537 void *insertPos =
nullptr;
10539 = SubstTemplateTemplateParms.FindNodeOrInsertPos(ID, insertPos);
10543 Replacement, AssociatedDecl, Index, PackIndex, Final);
10544 SubstTemplateTemplateParms.InsertNode(subst, insertPos);
10552 Decl *AssociatedDecl,
10553 unsigned Index,
bool Final)
const {
10555 llvm::FoldingSetNodeID ID;
10557 AssociatedDecl, Index, Final);
10559 void *InsertPos =
nullptr;
10561 = SubstTemplateTemplateParmPacks.FindNodeOrInsertPos(ID, InsertPos);
10566 SubstTemplateTemplateParmPacks.InsertNode(Subst, InsertPos);
10580 llvm::FoldingSetNodeID ID;
10583 void *InsertPos =
nullptr;
10585 DeducedTemplates.FindNodeOrInsertPos(ID, InsertPos);
10591 DeducedTemplates.InsertNode(DTS, InsertPos);
10614 llvm_unreachable(
"Unhandled TargetInfo::IntType value");
10644 while (
const auto *AT = dyn_cast<ArrayType>(CT))
10645 CT = AT->getElementType();
10677 assert(FirstVec->
isVectorType() &&
"FirstVec should be a vector type");
10678 assert(SecondVec->
isVectorType() &&
"SecondVec should be a vector type");
10735 const auto *LHSOBT = LHS->
getAs<OverflowBehaviorType>();
10736 const auto *RHSOBT = RHS->
getAs<OverflowBehaviorType>();
10738 if (!LHSOBT && !RHSOBT)
10741 if (LHSOBT && RHSOBT) {
10742 if (LHSOBT->getBehaviorKind() != RHSOBT->getBehaviorKind())
10747 QualType LHSUnderlying = LHSOBT ? LHSOBT->desugar() : LHS;
10748 QualType RHSUnderlying = RHSOBT ? RHSOBT->desugar() : RHS;
10750 if (RHSOBT && !LHSOBT) {
10761 auto VScale = Context.getTargetInfo().getVScaleRange(
10768 uint64_t EltSize = Context.getTypeSize(Info.
ElementType);
10772 uint64_t MinElts = Info.
EC.getKnownMinValue();
10773 return VScale->first * MinElts * EltSize;
10781 "Expected RVV builtin type and vector type!");
10821 return IsValidCast(FirstType, SecondType) ||
10822 IsValidCast(SecondType, FirstType);
10830 "Expected RVV builtin type and vector type!");
10837 if (!BT->isRVVVLSBuiltinType())
10857 return VecTy->getElementType().getCanonicalType()->isIntegerType() &&
10864 return IsLaxCompatible(FirstType, SecondType) ||
10865 IsLaxCompatible(SecondType, FirstType);
10871 if (
const AttributedType *
Attr = dyn_cast<AttributedType>(Ty)) {
10872 if (
Attr->getAttrKind() == attr::ObjCOwnership)
10875 Ty =
Attr->getModifiedType();
10879 Ty =
Paren->getInnerType();
10911 for (
auto *lhsProto : lhs->
quals()) {
10912 bool match =
false;
10913 for (
auto *rhsProto : rhs->
quals()) {
10944 for (
auto *I : lhs->
quals()) {
10948 if (!rhsID->ClassImplementsProtocol(I,
true))
10956 for (
auto *lhsProto : lhs->
quals()) {
10957 bool match =
false;
10962 for (
auto *rhsProto : rhs->
quals()) {
10972 for (
auto *I : lhs->
quals()) {
10976 if (rhsID->ClassImplementsProtocol(I,
true)) {
10993 for (
auto *lhsProto : lhs->
quals()) {
10994 bool match =
false;
11001 for (
auto *rhsProto : rhs->
quals()) {
11020 if (LHSInheritedProtocols.empty() && lhs->
qual_empty())
11022 for (
auto *lhsProto : LHSInheritedProtocols) {
11023 bool match =
false;
11024 for (
auto *rhsProto : rhs->
quals()) {
11049 if (LHS->isObjCUnqualifiedId() || RHS->isObjCUnqualifiedId())
11054 auto finish = [&](
bool succeeded) ->
bool {
11058 if (!RHS->isKindOfType())
11069 if (LHS->isObjCQualifiedId() || RHS->isObjCQualifiedId()) {
11074 if (LHS->isObjCQualifiedClass() && RHS->isObjCQualifiedClass()) {
11079 if (LHS->isObjCClass() && RHS->isObjCClass()) {
11084 if (LHS->getInterface() && RHS->getInterface()) {
11099 bool BlockReturnType) {
11103 auto finish = [&](
bool succeeded) ->
bool {
11128 if (
getLangOpts().CompatibilityQualifiedIdBlockParamTypeChecking)
11132 (!BlockReturnType &&
11136 (BlockReturnType ? LHSOPT : RHSOPT),
11137 (BlockReturnType ? RHSOPT : LHSOPT),
false));
11145 return finish(BlockReturnType);
11147 return finish(!BlockReturnType);
11159 return (*lhs)->getName().compare((*rhs)->getName());
11176 assert(LHS->getInterface() &&
"LHS must have an interface base");
11177 assert(RHS->getInterface() &&
"RHS must have an interface base");
11183 for (
auto *proto : LHS->quals()) {
11184 Context.CollectInheritedProtocols(proto, LHSProtocolSet);
11188 Context.CollectInheritedProtocols(LHS->getInterface(), LHSProtocolSet);
11194 for (
auto *proto : RHS->quals()) {
11195 Context.CollectInheritedProtocols(proto, RHSProtocolSet);
11199 Context.CollectInheritedProtocols(RHS->getInterface(), RHSProtocolSet);
11202 for (
auto *proto : LHSProtocolSet) {
11203 if (RHSProtocolSet.count(proto))
11204 IntersectionSet.push_back(proto);
11210 Context.CollectInheritedProtocols(CommonBase, ImpliedProtocols);
11213 if (!ImpliedProtocols.empty()) {
11215 return ImpliedProtocols.contains(proto);
11220 llvm::array_pod_sort(IntersectionSet.begin(), IntersectionSet.end(),
11230 if (lhsOPT && rhsOPT)
11236 if (lhsBlock && rhsBlock)
11241 if ((lhsOPT && lhsOPT->isObjCIdType() && rhsBlock) ||
11253 bool stripKindOf) {
11254 if (lhsArgs.size() != rhsArgs.size())
11261 for (
unsigned i = 0, n = lhsArgs.size(); i != n; ++i) {
11267 if (!stripKindOf ||
11268 !ctx.
hasSameType(lhsArgs[i].stripObjCKindOfType(ctx),
11269 rhsArgs[i].stripObjCKindOfType(ctx))) {
11297 if (!LDecl || !RDecl)
11303 bool anyKindOf = LHS->isKindOfType() || RHS->isKindOfType();
11307 llvm::SmallDenseMap<const ObjCInterfaceDecl *, const ObjCObjectType *, 4>
11312 LHSAncestors[LHS->getInterface()->getCanonicalDecl()] = LHS;
11317 bool anyChanges =
false;
11318 if (LHS->isSpecialized() && RHS->isSpecialized()) {
11321 LHS->getTypeArgs(), RHS->getTypeArgs(),
11324 }
else if (LHS->isSpecialized() != RHS->isSpecialized()) {
11335 if (!Protocols.empty())
11341 if (anyChanges || LHS->isKindOfType() != anyKindOf) {
11344 anyKindOf || LHS->isKindOfType());
11352 QualType LHSSuperType = LHS->getSuperClassType();
11353 if (LHSSuperType.
isNull())
11362 auto KnownLHS = LHSAncestors.find(RHS->getInterface()->getCanonicalDecl());
11363 if (KnownLHS != LHSAncestors.end()) {
11364 LHS = KnownLHS->second;
11368 bool anyChanges =
false;
11369 if (LHS->isSpecialized() && RHS->isSpecialized()) {
11372 LHS->getTypeArgs(), RHS->getTypeArgs(),
11375 }
else if (LHS->isSpecialized() != RHS->isSpecialized()) {
11386 if (!Protocols.empty())
11391 if (anyChanges || RHS->isKindOfType() != anyKindOf) {
11394 anyKindOf || RHS->isKindOfType());
11402 QualType RHSSuperType = RHS->getSuperClassType();
11403 if (RHSSuperType.
isNull())
11414 assert(LHS->getInterface() &&
"LHS is not an interface type");
11415 assert(RHS->getInterface() &&
"RHS is not an interface type");
11420 bool IsSuperClass = LHSInterface->
isSuperClassOf(RHS->getInterface());
11427 if (LHS->getNumProtocols() > 0) {
11436 for (
auto *RHSPI : RHS->quals())
11439 if (SuperClassInheritedProtocols.empty())
11442 for (
const auto *LHSProto : LHS->quals()) {
11443 bool SuperImplementsProtocol =
false;
11444 for (
auto *SuperClassProto : SuperClassInheritedProtocols)
11445 if (SuperClassProto->lookupProtocolNamed(LHSProto->getIdentifier())) {
11446 SuperImplementsProtocol =
true;
11449 if (!SuperImplementsProtocol)
11455 if (LHS->isSpecialized()) {
11460 RHSSuper = RHSSuper->getSuperClassType()->castAs<
ObjCObjectType>();
11463 if (RHSSuper->isSpecialized() &&
11465 LHS->getTypeArgs(), RHSSuper->getTypeArgs(),
11479 if (!LHSOPT || !RHSOPT)
11497 bool CompareUnqualified) {
11516 bool OfBlockPointer,
11518 if (
const RecordType *UT = T->getAsUnionType()) {
11520 if (UD->
hasAttr<TransparentUnionAttr>()) {
11521 for (
const auto *I : UD->
fields()) {
11522 QualType ET = I->getType().getUnqualifiedType();
11536 bool OfBlockPointer,
11557 bool IsConditionalOperator) {
11560 const auto *lproto = dyn_cast<FunctionProtoType>(lbase);
11561 const auto *rproto = dyn_cast<FunctionProtoType>(rbase);
11562 bool allLTypes =
true;
11563 bool allRTypes =
true;
11567 if (OfBlockPointer) {
11569 QualType LHS = lbase->getReturnType();
11571 if (!UnqualifiedResult)
11573 retType =
mergeTypes(LHS, RHS,
true, UnqualifiedResult,
true);
11638 bool NoReturn = IsConditionalOperator
11648 std::optional<FunctionEffectSet> MergedFX;
11650 if (lproto && rproto) {
11651 assert((AllowCXX ||
11652 (!lproto->hasExceptionSpec() && !rproto->hasExceptionSpec())) &&
11653 "C++ shouldn't be here");
11655 if (lproto->getNumParams() != rproto->getNumParams())
11659 if (lproto->isVariadic() != rproto->isVariadic())
11662 if (lproto->getMethodQuals() != rproto->getMethodQuals())
11666 if (lproto->getExtraAttributeInfo().CFISalt !=
11667 rproto->getExtraAttributeInfo().CFISalt)
11673 if (LHSFX != RHSFX) {
11674 if (IsConditionalOperator)
11683 if (*MergedFX != LHSFX)
11685 if (*MergedFX != RHSFX)
11690 bool canUseLeft, canUseRight;
11702 for (
unsigned i = 0, n = lproto->getNumParams(); i < n; i++) {
11703 QualType lParamType = lproto->getParamType(i).getUnqualifiedType();
11704 QualType rParamType = rproto->getParamType(i).getUnqualifiedType();
11706 lParamType, rParamType, OfBlockPointer,
Unqualified);
11713 types.push_back(paramType);
11725 if (allLTypes)
return lhs;
11726 if (allRTypes)
return rhs;
11731 newParamInfos.empty() ?
nullptr : newParamInfos.data();
11737 if (lproto) allRTypes =
false;
11738 if (rproto) allLTypes =
false;
11742 assert((AllowCXX || !proto->
hasExceptionSpec()) &&
"C++ shouldn't be here");
11750 for (
unsigned i = 0, n = proto->
getNumParams(); i < n; ++i) {
11756 paramTy = ED->getIntegerType();
11766 if (allLTypes)
return lhs;
11767 if (allRTypes)
return rhs;
11776 if (allLTypes)
return lhs;
11777 if (allRTypes)
return rhs;
11783 QualType other,
bool isBlockReturnType) {
11789 ET->getDecl()->getDefinitionOrSelf()->getIntegerType();
11790 if (underlyingType.
isNull())
11792 if (Context.hasSameType(underlyingType, other))
11798 Context.getTypeSize(underlyingType) == Context.getTypeSize(other))
11807 if (LangOpts.CPlusPlus || !LangOpts.C23)
11828 bool BlockReturnType,
bool IsConditionalOperator) {
11829 const auto *LHSOBT = LHS->
getAs<OverflowBehaviorType>();
11830 const auto *RHSOBT = RHS->
getAs<OverflowBehaviorType>();
11832 if (!LHSOBT && !RHSOBT)
11833 return std::nullopt;
11837 if (LHSOBT->getBehaviorKind() != RHSOBT->getBehaviorKind())
11841 LHSOBT->getUnderlyingType(), RHSOBT->getUnderlyingType(),
11842 OfBlockPointer,
Unqualified, BlockReturnType, IsConditionalOperator);
11844 if (MergedUnderlying.
isNull())
11848 if (LHSOBT->getUnderlyingType() == RHSOBT->getUnderlyingType())
11851 LHSOBT->getBehaviorKind(),
11860 return mergeTypes(LHSOBT->getUnderlyingType(), RHS, OfBlockPointer,
11861 Unqualified, BlockReturnType, IsConditionalOperator);
11864 return mergeTypes(LHS, RHSOBT->getUnderlyingType(), OfBlockPointer,
11865 Unqualified, BlockReturnType, IsConditionalOperator);
11870 bool IsConditionalOperator) {
11881 if (LangOpts.OpenMP && LHSRefTy && RHSRefTy &&
11885 if (LHSRefTy || RHSRefTy)
11888 if (std::optional<QualType> MergedOBT =
11890 BlockReturnType, IsConditionalOperator))
11902 if (LHSCan == RHSCan)
11907 Qualifiers RQuals = RHSCan.getLocalQualifiers();
11908 if (LQuals != RQuals) {
11925 assert((GC_L != GC_R) &&
"unequal qualifier sets had only equal elements");
11946 if (LHSClass == Type::FunctionProto) LHSClass = Type::FunctionNoProto;
11947 if (RHSClass == Type::FunctionProto) RHSClass = Type::FunctionNoProto;
11950 if (LHSClass == Type::VariableArray || LHSClass == Type::IncompleteArray)
11951 LHSClass = Type::ConstantArray;
11952 if (RHSClass == Type::VariableArray || RHSClass == Type::IncompleteArray)
11953 RHSClass = Type::ConstantArray;
11956 if (LHSClass == Type::ObjCInterface) LHSClass = Type::ObjCObject;
11957 if (RHSClass == Type::ObjCInterface) RHSClass = Type::ObjCObject;
11960 if (LHSClass == Type::ExtVector) LHSClass = Type::Vector;
11961 if (RHSClass == Type::ExtVector) RHSClass = Type::Vector;
11964 if (LHSClass != RHSClass) {
11974 if (OfBlockPointer && !BlockReturnType) {
11982 if (
const auto *AT = LHS->
getAs<AutoType>()) {
11983 if (!AT->isDeduced() && AT->isGNUAutoType())
11986 if (
const auto *AT = RHS->
getAs<AutoType>()) {
11987 if (!AT->isDeduced() && AT->isGNUAutoType())
11994 switch (LHSClass) {
11995#define TYPE(Class, Base)
11996#define ABSTRACT_TYPE(Class, Base)
11997#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base) case Type::Class:
11998#define NON_CANONICAL_TYPE(Class, Base) case Type::Class:
11999#define DEPENDENT_TYPE(Class, Base) case Type::Class:
12000#include "clang/AST/TypeNodes.inc"
12001 llvm_unreachable(
"Non-canonical and dependent types shouldn't get here");
12004 case Type::DeducedTemplateSpecialization:
12005 case Type::LValueReference:
12006 case Type::RValueReference:
12007 case Type::MemberPointer:
12008 llvm_unreachable(
"C++ should never be in mergeTypes");
12010 case Type::ObjCInterface:
12011 case Type::IncompleteArray:
12012 case Type::VariableArray:
12013 case Type::FunctionProto:
12014 case Type::ExtVector:
12015 case Type::OverflowBehavior:
12016 llvm_unreachable(
"Types are eliminated above");
12018 case Type::Pointer:
12029 if (ResultType.
isNull())
12037 case Type::BlockPointer:
12062 if (ResultType.
isNull())
12081 if (ResultType.
isNull())
12089 case Type::ConstantArray:
12104 if (ResultType.
isNull())
12112 if (LVAT || RVAT) {
12115 -> std::pair<bool,llvm::APInt> {
12117 std::optional<llvm::APSInt> TheInt;
12120 return std::make_pair(
true, *TheInt);
12121 return std::make_pair(
false, llvm::APSInt());
12124 return std::make_pair(
true, CAT->getSize());
12125 return std::make_pair(
false, llvm::APInt());
12128 bool HaveLSize, HaveRSize;
12129 llvm::APInt LSize, RSize;
12130 std::tie(HaveLSize, LSize) = SizeFetch(LVAT, LCAT);
12131 std::tie(HaveRSize, RSize) = SizeFetch(RVAT, RCAT);
12132 if (HaveLSize && HaveRSize && !llvm::APInt::isSameValue(LSize, RSize))
12166 case Type::FunctionNoProto:
12168 false, IsConditionalOperator);
12172 case Type::Builtin:
12175 case Type::Complex:
12184 case Type::ConstantMatrix:
12189 case Type::ObjCObject: {
12198 case Type::ObjCObjectPointer:
12199 if (OfBlockPointer) {
12211 assert(LHS != RHS &&
12212 "Equivalent pipe types should have already been handled!");
12214 case Type::ArrayParameter:
12215 assert(LHS != RHS &&
12216 "Equivalent ArrayParameter types should have already been handled!");
12218 case Type::BitInt: {
12226 if (LHSUnsigned != RHSUnsigned)
12229 if (LHSBits != RHSBits)
12233 case Type::HLSLAttributedResource: {
12234 const HLSLAttributedResourceType *LHSTy =
12235 LHS->
castAs<HLSLAttributedResourceType>();
12236 const HLSLAttributedResourceType *RHSTy =
12237 RHS->
castAs<HLSLAttributedResourceType>();
12238 assert(LHSTy->getWrappedType() == RHSTy->getWrappedType() &&
12239 LHSTy->getWrappedType()->isHLSLResourceType() &&
12240 "HLSLAttributedResourceType should always wrap __hlsl_resource_t");
12242 if (LHSTy->getAttrs() == RHSTy->getAttrs() &&
12243 LHSTy->getContainedType() == RHSTy->getContainedType())
12247 case Type::HLSLInlineSpirv:
12248 const HLSLInlineSpirvType *LHSTy = LHS->
castAs<HLSLInlineSpirvType>();
12249 const HLSLInlineSpirvType *RHSTy = RHS->
castAs<HLSLInlineSpirvType>();
12251 if (LHSTy->getOpcode() == RHSTy->getOpcode() &&
12252 LHSTy->getSize() == RHSTy->getSize() &&
12253 LHSTy->getAlignment() == RHSTy->getAlignment()) {
12254 for (
size_t I = 0; I < LHSTy->getOperands().size(); I++)
12255 if (LHSTy->getOperands()[I] != RHSTy->getOperands()[I])
12263 llvm_unreachable(
"Invalid Type::Class!");
12268 bool &CanUseFirst,
bool &CanUseSecond,
12270 assert(NewParamInfos.empty() &&
"param info list not empty");
12271 CanUseFirst = CanUseSecond =
true;
12277 if (!FirstHasInfo && !SecondHasInfo)
12280 bool NeedParamInfo =
false;
12284 for (
size_t I = 0; I < E; ++I) {
12295 bool FirstNoEscape = FirstParam.
isNoEscape();
12296 bool SecondNoEscape = SecondParam.
isNoEscape();
12297 bool IsNoEscape = FirstNoEscape && SecondNoEscape;
12299 if (NewParamInfos.back().getOpaqueValue())
12300 NeedParamInfo =
true;
12301 if (FirstNoEscape != IsNoEscape)
12302 CanUseFirst =
false;
12303 if (SecondNoEscape != IsNoEscape)
12304 CanUseSecond =
false;
12307 if (!NeedParamInfo)
12308 NewParamInfos.clear();
12314 if (
auto It = ObjCLayouts.find(D); It != ObjCLayouts.end()) {
12315 It->second =
nullptr;
12316 for (
auto *SubClass : ObjCSubClasses.lookup(D))
12328 if (LHSCan == RHSCan)
12330 if (RHSCan->isFunctionType()) {
12339 if (ResReturnType.
isNull())
12341 if (ResReturnType == NewReturnType || ResReturnType == OldReturnType) {
12358 Qualifiers RQuals = RHSCan.getLocalQualifiers();
12359 if (LQuals != RQuals) {
12372 assert((GC_L != GC_R) &&
"unequal qualifier sets had only equal elements");
12388 if (ResQT == LHSBaseQT)
12390 if (ResQT == RHSBaseQT)
12401 if (
const auto *ED = T->getAsEnumDecl())
12402 T = ED->getIntegerType();
12403 if (T->isBooleanType())
12405 if (
const auto *EIT = T->getAs<
BitIntType>())
12406 return EIT->getNumBits();
12412 assert((T->hasIntegerRepresentation() || T->isEnumeralType() ||
12413 T->isFixedPointType()) &&
12414 "Unexpected type");
12417 if (
const auto *VTy = T->getAs<
VectorType>())
12419 VTy->getNumElements(), VTy->getVectorKind());
12422 if (
const auto *EITy = T->getAs<
BitIntType>())
12426 if (
const auto *OBT = T->getAs<OverflowBehaviorType>())
12428 OBT->getBehaviorKind(),
12433 if (
const auto *ED = T->getAsEnumDecl())
12434 T = ED->getIntegerType();
12437 case BuiltinType::Char_U:
12439 case BuiltinType::Char_S:
12440 case BuiltinType::SChar:
12441 case BuiltinType::Char8:
12443 case BuiltinType::Short:
12445 case BuiltinType::Int:
12447 case BuiltinType::Long:
12449 case BuiltinType::LongLong:
12451 case BuiltinType::Int128:
12456 case BuiltinType::WChar_S:
12459 case BuiltinType::ShortAccum:
12461 case BuiltinType::Accum:
12463 case BuiltinType::LongAccum:
12465 case BuiltinType::SatShortAccum:
12467 case BuiltinType::SatAccum:
12469 case BuiltinType::SatLongAccum:
12471 case BuiltinType::ShortFract:
12473 case BuiltinType::Fract:
12475 case BuiltinType::LongFract:
12477 case BuiltinType::SatShortFract:
12479 case BuiltinType::SatFract:
12481 case BuiltinType::SatLongFract:
12484 assert((T->hasUnsignedIntegerRepresentation() ||
12485 T->isUnsignedFixedPointType()) &&
12486 "Unexpected signed integer or fixed point type");
12492 assert((T->hasIntegerRepresentation() || T->isEnumeralType() ||
12493 T->isFixedPointType()) &&
12494 "Unexpected type");
12497 if (
const auto *VTy = T->getAs<
VectorType>())
12499 VTy->getNumElements(), VTy->getVectorKind());
12502 if (
const auto *EITy = T->getAs<
BitIntType>())
12507 if (
const auto *ED = T->getAsEnumDecl())
12508 T = ED->getIntegerType();
12511 case BuiltinType::Char_S:
12513 case BuiltinType::Char_U:
12514 case BuiltinType::UChar:
12515 case BuiltinType::Char8:
12517 case BuiltinType::UShort:
12519 case BuiltinType::UInt:
12521 case BuiltinType::ULong:
12523 case BuiltinType::ULongLong:
12525 case BuiltinType::UInt128:
12530 case BuiltinType::WChar_U:
12533 case BuiltinType::UShortAccum:
12535 case BuiltinType::UAccum:
12537 case BuiltinType::ULongAccum:
12539 case BuiltinType::SatUShortAccum:
12541 case BuiltinType::SatUAccum:
12543 case BuiltinType::SatULongAccum:
12545 case BuiltinType::UShortFract:
12547 case BuiltinType::UFract:
12549 case BuiltinType::ULongFract:
12551 case BuiltinType::SatUShortFract:
12553 case BuiltinType::SatUFract:
12555 case BuiltinType::SatULongFract:
12559 (T->hasSignedIntegerRepresentation() || T->isSignedFixedPointType()) &&
12560 "Unexpected signed integer or fixed point type");
12585 bool AllowTypeModifiers) {
12589 RequiresICE =
false;
12594 bool IsSpecial =
false;
12598 default: Done =
true; --Str;
break;
12600 RequiresICE =
true;
12603 assert(!
Unsigned &&
"Can't use both 'S' and 'U' modifiers!");
12604 assert(!
Signed &&
"Can't use 'S' modifier multiple times!");
12608 assert(!
Signed &&
"Can't use both 'S' and 'U' modifiers!");
12609 assert(!
Unsigned &&
"Can't use 'U' modifier multiple times!");
12613 assert(!IsSpecial &&
"Can't use 'L' with 'W', 'N', 'Z' or 'O' modifiers");
12614 assert(HowLong <= 2 &&
"Can't have LLLL modifier");
12619 assert(!IsSpecial &&
"Can't use two 'N', 'W', 'Z' or 'O' modifiers!");
12620 assert(HowLong == 0 &&
"Can't use both 'L' and 'N' modifiers!");
12624 if (Context.getTargetInfo().getLongWidth() == 32)
12629 assert(!IsSpecial &&
"Can't use two 'N', 'W', 'Z' or 'O' modifiers!");
12630 assert(HowLong == 0 &&
"Can't use both 'L' and 'W' modifiers!");
12634 switch (Context.getTargetInfo().getInt64Type()) {
12636 llvm_unreachable(
"Unexpected integer type");
12647 assert(!IsSpecial &&
"Can't use two 'N', 'W', 'Z' or 'O' modifiers!");
12648 assert(HowLong == 0 &&
"Can't use both 'L' and 'Z' modifiers!");
12652 switch (Context.getTargetInfo().getIntTypeByWidth(32,
true)) {
12654 llvm_unreachable(
"Unexpected integer type");
12667 assert(!IsSpecial &&
"Can't use two 'N', 'W', 'Z' or 'O' modifiers!");
12668 assert(HowLong == 0 &&
"Can't use both 'L' and 'O' modifiers!");
12672 if (Context.getLangOpts().OpenCL)
12685 llvm_unreachable(
"Unknown builtin type letter!");
12688 "Bad modifiers used with 'x'!");
12689 Type = Context.Float16Ty;
12693 "Bad modifiers used with 'y'!");
12694 Type = Context.BFloat16Ty;
12698 "Bad modifiers used with 'v'!");
12699 Type = Context.VoidTy;
12703 "Bad modifiers used with 'h'!");
12704 Type = Context.HalfTy;
12708 "Bad modifiers used with 'f'!");
12709 Type = Context.FloatTy;
12713 "Bad modifiers used with 'd'!");
12715 Type = Context.LongDoubleTy;
12716 else if (HowLong == 2)
12717 Type = Context.Float128Ty;
12719 Type = Context.DoubleTy;
12722 assert(HowLong == 0 &&
"Bad modifiers used with 's'!");
12724 Type = Context.UnsignedShortTy;
12726 Type = Context.ShortTy;
12730 Type =
Unsigned ? Context.UnsignedInt128Ty : Context.Int128Ty;
12731 else if (HowLong == 2)
12732 Type =
Unsigned ? Context.UnsignedLongLongTy : Context.LongLongTy;
12733 else if (HowLong == 1)
12734 Type =
Unsigned ? Context.UnsignedLongTy : Context.LongTy;
12736 Type =
Unsigned ? Context.UnsignedIntTy : Context.IntTy;
12739 assert(HowLong == 0 &&
"Bad modifiers used with 'c'!");
12741 Type = Context.SignedCharTy;
12743 Type = Context.UnsignedCharTy;
12745 Type = Context.CharTy;
12748 assert(HowLong == 0 && !
Signed && !
Unsigned &&
"Bad modifiers for 'b'!");
12749 Type = Context.BoolTy;
12752 assert(HowLong == 0 && !
Signed && !
Unsigned &&
"Bad modifiers for 'z'!");
12753 Type = Context.getSizeType();
12756 assert(HowLong == 0 && !
Signed && !
Unsigned &&
"Bad modifiers for 'w'!");
12757 Type = Context.getWideCharType();
12760 Type = Context.getCFConstantStringType();
12763 Type = Context.getObjCIdType();
12766 Type = Context.getObjCSelType();
12769 Type = Context.getObjCSuperType();
12772 Type = Context.getBuiltinVaListType();
12773 assert(!
Type.isNull() &&
"builtin va list type not initialized!");
12784 Type = Context.getBuiltinVaListType();
12785 assert(!
Type.isNull() &&
"builtin va list type not initialized!");
12787 Type = Context.getArrayDecayedType(
Type);
12789 Type = Context.getLValueReferenceType(
Type);
12793 unsigned NumElements = strtoul(Str, &End, 10);
12794 assert(End != Str &&
"Missing vector size");
12798 RequiresICE,
false);
12799 assert(!RequiresICE &&
"Can't require vector ICE");
12801 Type = Context.getScalableVectorType(ElementType, NumElements);
12807 Type = Context.SveCountTy;
12811 Type = Context.AMDGPUBufferRsrcTy;
12815 Type = Context.AMDGPUFeaturePredicateTy;
12819 Type = Context.AMDGPUTextureTy;
12823 Type = Context.HLSLResourceTy;
12827 llvm_unreachable(
"Unexpected target builtin type");
12833 unsigned NumElements = strtoul(Str, &End, 10);
12834 assert(End != Str &&
"Missing vector size");
12838 RequiresICE,
false);
12839 assert(!RequiresICE &&
"Can't require vector ICE");
12848 unsigned NumElements = strtoul(Str, &End, 10);
12849 assert(End != Str &&
"Missing vector size");
12855 Type = Context.getExtVectorType(ElementType, NumElements);
12861 assert(!RequiresICE &&
"Can't require complex ICE");
12862 Type = Context.getComplexType(ElementType);
12866 Type = Context.getPointerDiffType();
12869 Type = Context.getFILEType();
12870 if (
Type.isNull()) {
12877 Type = Context.getsigjmp_bufType();
12879 Type = Context.getjmp_bufType();
12881 if (
Type.isNull()) {
12887 assert(HowLong == 0 && !
Signed && !
Unsigned &&
"Bad modifiers for 'K'!");
12888 Type = Context.getucontext_tType();
12890 if (
Type.isNull()) {
12896 Type = Context.getProcessIDType();
12899 Type = Context.MFloat8Ty;
12904 Done = !AllowTypeModifiers;
12906 switch (
char c = *Str++) {
12907 default: Done =
true; --Str;
break;
12913 unsigned AddrSpace = strtoul(Str, &End, 10);
12916 Type = Context.getAddrSpaceQualType(
12918 Context.getLangASForBuiltinAddressSpace(AddrSpace));
12922 Type = Context.getPointerType(
Type);
12924 Type = Context.getLValueReferenceType(
Type);
12932 Type = Context.getVolatileType(
Type);
12941 "Integer constant 'I' type must be an integer");
12954 bool AllowTypeModifiers)
const {
12961 unsigned *IntegerConstantArgs)
const {
12962 const char *TypeStr =
BuiltinInfo.getTypeString(Id);
12963 if (TypeStr[0] ==
'\0') {
12970 bool RequiresICE =
false;
12973 RequiresICE,
true);
12977 assert(!RequiresICE &&
"Result of intrinsic cannot be required to be an ICE");
12979 while (TypeStr[0] && TypeStr[0] !=
'.') {
12986 if (RequiresICE && IntegerConstantArgs)
12987 *IntegerConstantArgs |= 1 << ArgTypes.size();
12993 ArgTypes.push_back(Ty);
12996 if (Id == Builtin::BI__GetExceptionInfo)
12999 assert((TypeStr[0] !=
'.' || TypeStr[1] == 0) &&
13000 "'.' should only occur at end of builtin type list!");
13002 bool Variadic = (TypeStr[0] ==
'.');
13009 if (ArgTypes.empty() && Variadic && !
getLangOpts().requiresStrictPrototypes())
13059 if ((!Context.getLangOpts().CPlusPlus &&
13060 !Context.getTargetInfo().getCXXABI().isMicrosoft() &&
13061 !FD->
hasAttr<DLLExportAttr>()) ||
13062 FD->
hasAttr<GNUInlineAttr>()) {
13080 if (Context.getTargetInfo().getCXXABI().isMicrosoft() &&
13083 !FD->
hasAttr<DLLExportAttr>()) {
13104 if (D->
hasAttr<DLLImportAttr>()) {
13107 }
else if (D->
hasAttr<DLLExportAttr>()) {
13110 }
else if (Context.getLangOpts().CUDA && Context.getLangOpts().CUDAIsDevice) {
13113 if (D->
hasAttr<CUDAGlobalAttr>() &&
13122 if (Context.shouldExternalize(D))
13137 switch (Source->hasExternalDefinitions(D)) {
13164 if (Context.getLangOpts().CPlusPlus &&
13165 Context.getLangOpts().IncrementalExtensions &&
13181 if (!LexicalContext)
13186 auto StaticLocalLinkage =
13198 return StaticLocalLinkage;
13204 if (Context.isMSStaticDataMemberInlineDefinition(VD))
13210 switch (Context.getInlineVariableDefinitionKind(VD)) {
13225 return StrongLinkage;
13228 return Context.getTargetInfo().getCXXABI().isMicrosoft() &&
13243 llvm_unreachable(
"Invalid Linkage!");
13253 if (
const auto *VD = dyn_cast<VarDecl>(D)) {
13254 if (!VD->isFileVarDecl())
13259 if (VD->getDescribedVarTemplate() ||
13262 }
else if (
const auto *FD = dyn_cast<FunctionDecl>(D)) {
13288 if (D->
hasAttr<WeakRefAttr>())
13295 if (LangOpts.SYCLIsDevice)
13297 D->
hasAttr<SYCLExternalAttr>());
13303 if (
const auto *FD = dyn_cast<FunctionDecl>(D)) {
13305 if (!FD->doesThisDeclarationHaveABody())
13306 return FD->doesDeclarationForceExternallyVisibleDefinition();
13309 if (FD->
hasAttr<ConstructorAttr>() || FD->
hasAttr<DestructorAttr>())
13314 if (
getTargetInfo().getCXXABI().canKeyFunctionBeInline()) {
13315 if (
const auto *MD = dyn_cast<CXXMethodDecl>(FD)) {
13334 assert(VD->isFileVarDecl() &&
"Expected file scoped var");
13338 if (LangOpts.OpenMP &&
13339 OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(VD))
13346 if (VD->shouldEmitInExternalSource())
13359 if (VD->needsDestruction(*
this))
13363 if (VD->hasInitWithSideEffects())
13368 if (
const auto *DD = dyn_cast<DecompositionDecl>(VD)) {
13369 for (
const auto *BD : DD->flat_bindings())
13370 if (
const auto *BindingVD = BD->getHoldingVar())
13380 llvm::function_ref<
void(
FunctionDecl *)> Pred)
const {
13381 assert(FD->
isMultiVersion() &&
"Only valid for multiversioned functions");
13382 llvm::SmallDenseSet<const FunctionDecl*, 4> SeenDecls;
13387 for (
auto *CurDecl :
13391 SeenDecls.insert(CurFD).second) {
13398 bool IsCXXMethod)
const {
13401 return ABI->getDefaultMethodCallConv(IsVariadic);
13403 switch (LangOpts.getDefaultCallingConv()) {
13431 return Target->getDefaultCallingConv();
13436 return ABI->isNearlyEmpty(RD);
13441 auto ABI = Target->getCXXABI();
13442 if (ABI.isMicrosoft())
13448 return VTContext.get();
13454 switch (T->getCXXABI().getKind()) {
13455 case TargetCXXABI::AppleARM64:
13456 case TargetCXXABI::Fuchsia:
13457 case TargetCXXABI::GenericAArch64:
13458 case TargetCXXABI::GenericItanium:
13459 case TargetCXXABI::GenericARM:
13460 case TargetCXXABI::GenericMIPS:
13461 case TargetCXXABI::iOS:
13462 case TargetCXXABI::WebAssembly:
13463 case TargetCXXABI::WatchOS:
13464 case TargetCXXABI::XL:
13466 case TargetCXXABI::Microsoft:
13469 llvm_unreachable(
"Unsupported ABI");
13473 assert(T.getCXXABI().getKind() != TargetCXXABI::Microsoft &&
13474 "Device mangle context does not support Microsoft mangling.");
13475 switch (T.getCXXABI().getKind()) {
13476 case TargetCXXABI::AppleARM64:
13477 case TargetCXXABI::Fuchsia:
13478 case TargetCXXABI::GenericAArch64:
13479 case TargetCXXABI::GenericItanium:
13480 case TargetCXXABI::GenericARM:
13481 case TargetCXXABI::GenericMIPS:
13482 case TargetCXXABI::iOS:
13483 case TargetCXXABI::WebAssembly:
13484 case TargetCXXABI::WatchOS:
13485 case TargetCXXABI::XL:
13489 if (
const auto *RD = dyn_cast<CXXRecordDecl>(ND))
13490 return RD->getDeviceLambdaManglingNumber();
13491 return std::nullopt;
13494 case TargetCXXABI::Microsoft:
13498 llvm_unreachable(
"Unsupported ABI");
13516 return ASTRecordLayouts.getMemorySize() +
13517 llvm::capacity_in_bytes(ObjCLayouts) +
13518 llvm::capacity_in_bytes(KeyFunctions) +
13519 llvm::capacity_in_bytes(ObjCImpls) +
13520 llvm::capacity_in_bytes(BlockVarCopyInits) +
13521 llvm::capacity_in_bytes(DeclAttrs) +
13522 llvm::capacity_in_bytes(TemplateOrInstantiation) +
13523 llvm::capacity_in_bytes(InstantiatedFromUsingDecl) +
13524 llvm::capacity_in_bytes(InstantiatedFromUsingShadowDecl) +
13525 llvm::capacity_in_bytes(InstantiatedFromUnnamedFieldDecl) +
13526 llvm::capacity_in_bytes(OverriddenMethods) +
13527 llvm::capacity_in_bytes(Types) +
13528 llvm::capacity_in_bytes(VariableArrayTypes);
13536 unsigned Signed)
const {
13539 if (!QualTy && DestWidth == 128)
13568 llvm_unreachable(
"Unhandled TargetInfo::RealType value");
13575 MangleNumbers[ND] = Number;
13578 Listener->AddedManglingNumber(ND, Number);
13582 bool ForAuxTarget)
const {
13583 auto I = MangleNumbers.find(ND);
13584 unsigned Res = I != MangleNumbers.end() ? I->second : 1;
13587 if (LangOpts.CUDA && !LangOpts.CUDAIsDevice) {
13588 Res = ForAuxTarget ? Res >> 16 : Res & 0xFFFF;
13590 assert(!ForAuxTarget &&
"Only CUDA/HIP host compilation supports mangling "
13591 "number for aux target");
13593 return Res > 1 ? Res : 1;
13600 StaticLocalNumbers[VD] = Number;
13603 Listener->AddedStaticLocalNumbers(VD, Number);
13607 auto I = StaticLocalNumbers.find(VD);
13608 return I != StaticLocalNumbers.end() ? I->second : 1;
13612 bool IsDestroying) {
13613 if (!IsDestroying) {
13625 bool IsTypeAware) {
13626 if (!IsTypeAware) {
13665 return GlobalOperatorDeletesForVirtualDtor.contains(
13668 return ArrayOperatorDeletesForVirtualDtor.contains(
13671 return GlobalArrayOperatorDeletesForVirtualDtor.contains(
13683 if (OperatorDeletesForVirtualDtor.contains(Canon))
13684 return OperatorDeletesForVirtualDtor[Canon];
13687 if (GlobalOperatorDeletesForVirtualDtor.contains(Canon))
13688 return GlobalOperatorDeletesForVirtualDtor[Canon];
13691 if (ArrayOperatorDeletesForVirtualDtor.contains(Canon))
13692 return ArrayOperatorDeletesForVirtualDtor[Canon];
13695 if (GlobalArrayOperatorDeletesForVirtualDtor.contains(Canon))
13696 return GlobalArrayOperatorDeletesForVirtualDtor[Canon];
13707 return MaybeRequireVectorDeletingDtor.count(RD);
13715 MaybeRequireVectorDeletingDtor.insert(RD);
13720 assert(LangOpts.CPlusPlus);
13721 std::unique_ptr<MangleNumberingContext> &MCtx = MangleNumberingContexts[DC];
13729 assert(LangOpts.CPlusPlus);
13730 std::unique_ptr<MangleNumberingContext> &MCtx =
13731 ExtraMangleNumberingContexts[D];
13737std::unique_ptr<MangleNumberingContext>
13739 return ABI->createMangleNumberingContext();
13744 return ABI->getCopyConstructorForExceptionObject(
13750 return ABI->addCopyConstructorForExceptionObject(
13757 return ABI->addTypedefNameForUnnamedTagDecl(TD, DD);
13762 return ABI->getTypedefNameForUnnamedTagDecl(TD);
13767 return ABI->addDeclaratorForUnnamedTagDecl(TD, DD);
13771 return ABI->getDeclaratorForUnnamedTagDecl(TD);
13775 ParamIndices[D] =
index;
13779 ParameterIndexTable::const_iterator I = ParamIndices.find(D);
13780 assert(I != ParamIndices.end() &&
13781 "ParmIndices lacks entry set by ParmVarDecl");
13786 unsigned Length)
const {
13812 assert(
MSGuidTagDecl &&
"building MS GUID without MS extensions?");
13814 llvm::FoldingSetNodeID ID;
13818 if (
MSGuidDecl *Existing = MSGuidDecls.FindNodeOrInsertPos(ID, InsertPos))
13822 MSGuidDecl *
New = MSGuidDecl::Create(*
this, GUIDType, Parts);
13823 MSGuidDecls.InsertNode(
New, InsertPos);
13829 const APValue &APVal)
const {
13830 llvm::FoldingSetNodeID ID;
13835 UnnamedGlobalConstantDecls.FindNodeOrInsertPos(ID, InsertPos))
13839 UnnamedGlobalConstantDecl::Create(*
this, Ty, APVal);
13840 UnnamedGlobalConstantDecls.InsertNode(
New, InsertPos);
13846 assert(T->isRecordType() &&
"template param object of unexpected type");
13852 llvm::FoldingSetNodeID ID;
13857 TemplateParamObjectDecls.FindNodeOrInsertPos(ID, InsertPos))
13861 TemplateParamObjectDecls.InsertNode(
New, InsertPos);
13867 if (!T.isOSDarwin())
13870 if (!(T.isiOS() && T.isOSVersionLT(7)) &&
13871 !(T.isMacOSX() && T.isOSVersionLT(10, 9)))
13880 return (Size != Align ||
toBits(sizeChars) > MaxInlineWidthInBits);
13887 if (MethodDecl->
hasAttr<UnavailableAttr>()
13888 || MethodDecl->
hasAttr<DeprecatedAttr>())
13902 IM != EM && IF != EF; ++IM, ++IF) {
13933 llvm::FoldingSetNodeID IDX, IDY;
13934 X->Profile(IDX, *
this,
true);
13935 Y->
Profile(IDY, *
this,
true);
13949 for (
const Decl *DX :
X->redecls()) {
13954 if (DX->isFirstDecl())
13957 llvm_unreachable(
"Corrupt redecls chain");
13960template <
class T, std::enable_if_t<std::is_base_of_v<Decl, T>,
bool> = true>
13962 return cast_or_null<T>(
13964 const_cast<Decl *
>(cast_or_null<Decl>(Y))));
13967template <
class T, std::enable_if_t<std::is_base_of_v<Decl, T>,
bool> = true>
13975 bool IgnoreDeduced =
false) {
13990 bool IgnoreDeduced) {
13992 assert(R.getAsVoidPointer() !=
nullptr);
13998 assert(Xs.size() == Ys.size());
14000 for (
size_t I = 0; I < Rs.size(); ++I)
14007 return X->getAttributeLoc() == Y->getAttributeLoc() ?
X->getAttributeLoc()
14017 switch (
X.getKind()) {
14047 auto NExpX =
X.getNumTemplateExpansions();
14061 if (Xs.size() != Ys.size())
14063 R.resize(Xs.size());
14064 for (
size_t I = 0; I < R.size(); ++I) {
14077 assert(!Different);
14105 assert(!IsSame &&
"Should be the same NestedNameSpecifier");
14107 return std::nullopt;
14112 assert(Kind == NNS2.
getKind());
14117 auto Kind = Namespace1->getKind();
14118 if (Kind != Namespace2->getKind() ||
14119 (Kind == Decl::NamespaceAlias &&
14124 Namespace2->getNamespace()),
14158 llvm_unreachable(
"singletons did not compare equal");
14160 assert(R.getCanonical() == Canon);
14166 const T *Y,
bool IsSame) {
14167 return ::getCommonNNS(Ctx,
X->getQualifier(), Y->getQualifier(), IsSame);
14187 QX +=
X.getQualifiers() - RQ;
14197 Y->getElementType(), QX, QY);
14208 assert(Ctx.
hasSameExpr(
X->getSizeExpr(), Y->getSizeExpr()));
14209 return X->getSizeExpr();
14214 return X->getSizeModifier();
14220 return X->getIndexTypeCVRQualifiers();
14230 llvm::DenseMap<QualType, unsigned>
Found;
14231 for (
auto Ts : {
X, Y}) {
14238 Out.emplace_back(T);
14244FunctionProtoType::ExceptionSpecInfo
14248 bool AcceptDependent)
const {
14274 assert(AcceptDependent &&
14275 "computing composite pointer type of dependent types");
14290 llvm_unreachable(
"These ESTs should be handled above");
14295 assert(EST2 ==
EST_Dynamic &&
"other cases should already be handled");
14299 Result.Exceptions = ExceptionTypeStorage;
14306 llvm_unreachable(
"shouldn't see unresolved exception specifications here");
14309 llvm_unreachable(
"invalid ExceptionSpecificationType");
14318#define UNEXPECTED_TYPE(Class, Kind) \
14319 case Type::Class: \
14320 llvm_unreachable("Unexpected " Kind ": " #Class);
14322#define NON_CANONICAL_TYPE(Class, Base) UNEXPECTED_TYPE(Class, "non-canonical")
14323#define TYPE(Class, Base)
14324#include "clang/AST/TypeNodes.inc"
14326#define SUGAR_FREE_TYPE(Class) UNEXPECTED_TYPE(Class, "sugar-free")
14337#undef SUGAR_FREE_TYPE
14338#define NON_UNIQUE_TYPE(Class) UNEXPECTED_TYPE(Class, "non-unique")
14341#undef NON_UNIQUE_TYPE
14345#undef UNEXPECTED_TYPE
14349 assert(AX->getDeducedKind() == AY->getDeducedKind());
14351 assert(AX->getKeyword() == AY->getKeyword());
14353 AY->getTypeConstraintConcept());
14357 AY->getTypeConstraintArguments())) {
14364 case Type::IncompleteArray: {
14371 case Type::DependentSizedArray: {
14379 case Type::ConstantArray: {
14382 assert(AX->getSize() == AY->getSize());
14383 const Expr *SizeExpr = Ctx.
hasSameExpr(AX->getSizeExpr(), AY->getSizeExpr())
14384 ? AX->getSizeExpr()
14390 case Type::ArrayParameter: {
14393 assert(AX->getSize() == AY->getSize());
14394 const Expr *SizeExpr = Ctx.
hasSameExpr(AX->getSizeExpr(), AY->getSizeExpr())
14395 ? AX->getSizeExpr()
14402 case Type::Atomic: {
14407 case Type::Complex: {
14411 case Type::Pointer: {
14415 case Type::BlockPointer: {
14419 case Type::ObjCObjectPointer: {
14424 case Type::MemberPointer: {
14428 PY->getMostRecentCXXRecordDecl()));
14432 PX->getMostRecentCXXRecordDecl());
14434 case Type::LValueReference: {
14439 PX->isSpelledAsLValue() ||
14440 PY->isSpelledAsLValue());
14442 case Type::RValueReference: {
14448 case Type::DependentAddressSpace: {
14451 assert(Ctx.
hasSameExpr(PX->getAddrSpaceExpr(), PY->getAddrSpaceExpr()));
14453 PX->getAddrSpaceExpr(),
14456 case Type::FunctionNoProto: {
14459 assert(FX->getExtInfo() == FY->getExtInfo());
14464 case Type::FunctionProto: {
14468 EPIY = FY->getExtProtoInfo();
14469 assert(EPIX.
ExtInfo == EPIY.ExtInfo);
14476 assert(EPIX.
TypeQuals == EPIY.TypeQuals);
14477 assert(EPIX.
Variadic == EPIY.Variadic);
14486 auto P =
getCommonTypes(Ctx, FX->param_types(), FY->param_types(),
14494 case Type::ObjCObject: {
14497 std::equal(OX->getProtocols().begin(), OX->getProtocols().end(),
14498 OY->getProtocols().begin(), OY->getProtocols().end(),
14500 return P0->getCanonicalDecl() == P1->getCanonicalDecl();
14502 "protocol lists must be the same");
14504 OY->getTypeArgsAsWritten());
14507 OX->getProtocols(),
14508 OX->isKindOfTypeAsWritten() && OY->isKindOfTypeAsWritten());
14510 case Type::ConstantMatrix: {
14513 assert(MX->getNumRows() == MY->getNumRows());
14514 assert(MX->getNumColumns() == MY->getNumColumns());
14516 MX->getNumRows(), MX->getNumColumns());
14518 case Type::DependentSizedMatrix: {
14521 assert(Ctx.
hasSameExpr(MX->getRowExpr(), MY->getRowExpr()));
14522 assert(Ctx.
hasSameExpr(MX->getColumnExpr(), MY->getColumnExpr()));
14527 case Type::Vector: {
14529 assert(VX->getNumElements() == VY->getNumElements());
14530 assert(VX->getVectorKind() == VY->getVectorKind());
14532 VX->getNumElements(), VX->getVectorKind());
14534 case Type::ExtVector: {
14536 assert(VX->getNumElements() == VY->getNumElements());
14538 VX->getNumElements());
14540 case Type::DependentSizedExtVector: {
14547 case Type::DependentVector: {
14550 assert(VX->getVectorKind() == VY->getVectorKind());
14557 case Type::InjectedClassName: {
14564 case Type::TemplateSpecialization: {
14568 TY->template_arguments());
14572 TY->getTemplateName(),
14574 As, {},
X->getCanonicalTypeInternal());
14576 case Type::Decltype: {
14579 assert(DX->isDependentType());
14580 assert(DY->isDependentType());
14581 assert(Ctx.
hasSameExpr(DX->getUnderlyingExpr(), DY->getUnderlyingExpr()));
14585 case Type::PackIndexing: {
14588 assert(DX->isDependentType());
14589 assert(DY->isDependentType());
14590 assert(Ctx.
hasSameExpr(DX->getIndexExpr(), DY->getIndexExpr()));
14593 case Type::DependentName: {
14596 assert(NX->getIdentifier() == NY->getIdentifier());
14601 case Type::OverflowBehavior: {
14604 assert(NX->getBehaviorKind() == NY->getBehaviorKind());
14606 NX->getBehaviorKind(),
14608 NY->getUnderlyingType(), QX, QY));
14610 case Type::UnaryTransform: {
14613 assert(TX->getUTTKind() == TY->getUTTKind());
14617 TY->getUnderlyingType()),
14620 case Type::PackExpansion: {
14623 assert(PX->getNumExpansions() == PY->getNumExpansions());
14626 PX->getNumExpansions(),
false);
14630 assert(PX->isReadOnly() == PY->isReadOnly());
14635 case Type::TemplateTypeParm: {
14638 assert(TX->getDepth() == TY->getDepth());
14639 assert(TX->getIndex() == TY->getIndex());
14640 assert(TX->isParameterPack() == TY->isParameterPack());
14642 TX->getDepth(), TX->getIndex(), TX->isParameterPack(),
14646 llvm_unreachable(
"Unknown Type Class");
14656#define UNEXPECTED_TYPE(Class, Kind) \
14657 case Type::Class: \
14658 llvm_unreachable("Unexpected " Kind ": " #Class);
14659#define TYPE(Class, Base)
14660#define DEPENDENT_TYPE(Class, Base) UNEXPECTED_TYPE(Class, "dependent")
14661#include "clang/AST/TypeNodes.inc"
14663#define CANONICAL_TYPE(Class) UNEXPECTED_TYPE(Class, "canonical")
14690#undef CANONICAL_TYPE
14692#undef UNEXPECTED_TYPE
14694 case Type::Adjusted: {
14696 QualType OX = AX->getOriginalType(), OY = AY->getOriginalType();
14703 case Type::Decayed: {
14705 QualType OX = DX->getOriginalType(), OY = DY->getOriginalType();
14712 case Type::Attributed: {
14714 AttributedType::Kind Kind = AX->getAttrKind();
14715 if (Kind != AY->getAttrKind())
14717 QualType MX = AX->getModifiedType(), MY = AY->getModifiedType();
14725 case Type::BTFTagAttributed: {
14727 const BTFTypeTagAttr *AX = BX->getAttr();
14729 if (AX->getBTFTypeTag() !=
14740 if (KW != AY->getKeyword())
14744 AY->getTypeConstraintConcept());
14748 AY->getTypeConstraintArguments())) {
14759 case Type::PackIndexing:
14760 case Type::Decltype:
14762 case Type::DeducedTemplateSpecialization:
14765 case Type::MacroQualified: {
14769 if (IX != MY->getMacroIdentifier())
14773 case Type::SubstTemplateTypeParm: {
14780 unsigned Index = SX->getIndex();
14781 if (Index != SY->getIndex())
14783 auto PackIndex = SX->getPackIndex();
14784 if (PackIndex != SY->getPackIndex())
14787 CD, Index, PackIndex,
14788 SX->getFinal() && SY->getFinal());
14790 case Type::ObjCTypeParam:
14796 case Type::TemplateSpecialization: {
14801 TY->getTemplateName(),
true);
14806 TY->template_arguments()))
14812 case Type::Typedef: {
14822 case Type::TypeOf: {
14833 case Type::TypeOfExpr:
14836 case Type::UnaryTransform: {
14839 UnaryTransformType::UTTKind KX = UX->getUTTKind();
14840 if (KX != UY->getUTTKind())
14842 QualType BX = UX->getBaseType(), BY = UY->getBaseType();
14849 case Type::Using: {
14858 case Type::MemberPointer: {
14862 assert(Cls == PY->getMostRecentCXXRecordDecl());
14867 case Type::CountAttributed: {
14870 if (DX->isCountInBytes() != DY->isCountInBytes())
14872 if (DX->isOrNull() != DY->isOrNull())
14874 Expr *CEX = DX->getCountExpr();
14875 Expr *CEY = DY->getCountExpr();
14879 DX->isCountInBytes(), DX->isOrNull(),
14890 DX->isCountInBytes(), DX->isOrNull(),
14893 case Type::PredefinedSugar:
14898 llvm_unreachable(
"Unhandled Type Class");
14920 if (
X.isCanonical())
14947 bool KeepCommonQualifiers =
14950 if (SX.
Ty != SY.Ty) {
14958 while (!Xs.empty() && !Ys.empty() && Xs.back().Ty == Ys.back().Ty) {
14961 SX = Xs.pop_back_val();
14962 SY = Ys.pop_back_val();
14965 if (KeepCommonQualifiers)
14972 while (!Xs.empty() && !Ys.empty()) {
14975 SX = Xs.pop_back_val();
14976 SY = Ys.pop_back_val();
14981 SX.
Ty = Underlying.Ty;
14984 QX -= Underlying.Quals;
15002 llvm_unreachable(
"Not a saturated fixed point type!");
15003 case BuiltinType::SatShortAccum:
15005 case BuiltinType::SatAccum:
15007 case BuiltinType::SatLongAccum:
15009 case BuiltinType::SatUShortAccum:
15011 case BuiltinType::SatUAccum:
15013 case BuiltinType::SatULongAccum:
15015 case BuiltinType::SatShortFract:
15017 case BuiltinType::SatFract:
15019 case BuiltinType::SatLongFract:
15021 case BuiltinType::SatUShortFract:
15023 case BuiltinType::SatUFract:
15025 case BuiltinType::SatULongFract:
15037 llvm_unreachable(
"Not a fixed point type!");
15038 case BuiltinType::ShortAccum:
15040 case BuiltinType::Accum:
15042 case BuiltinType::LongAccum:
15044 case BuiltinType::UShortAccum:
15046 case BuiltinType::UAccum:
15048 case BuiltinType::ULongAccum:
15050 case BuiltinType::ShortFract:
15052 case BuiltinType::Fract:
15054 case BuiltinType::LongFract:
15056 case BuiltinType::UShortFract:
15058 case BuiltinType::UFract:
15060 case BuiltinType::ULongFract:
15066 if (LangOpts.OpenCL)
15090 llvm_unreachable(
"Not a fixed point type!");
15091 case BuiltinType::ShortAccum:
15092 case BuiltinType::SatShortAccum:
15093 return Target.getShortAccumScale();
15094 case BuiltinType::Accum:
15095 case BuiltinType::SatAccum:
15096 return Target.getAccumScale();
15097 case BuiltinType::LongAccum:
15098 case BuiltinType::SatLongAccum:
15099 return Target.getLongAccumScale();
15100 case BuiltinType::UShortAccum:
15101 case BuiltinType::SatUShortAccum:
15102 return Target.getUnsignedShortAccumScale();
15103 case BuiltinType::UAccum:
15104 case BuiltinType::SatUAccum:
15105 return Target.getUnsignedAccumScale();
15106 case BuiltinType::ULongAccum:
15107 case BuiltinType::SatULongAccum:
15108 return Target.getUnsignedLongAccumScale();
15109 case BuiltinType::ShortFract:
15110 case BuiltinType::SatShortFract:
15111 return Target.getShortFractScale();
15112 case BuiltinType::Fract:
15113 case BuiltinType::SatFract:
15114 return Target.getFractScale();
15115 case BuiltinType::LongFract:
15116 case BuiltinType::SatLongFract:
15117 return Target.getLongFractScale();
15118 case BuiltinType::UShortFract:
15119 case BuiltinType::SatUShortFract:
15120 return Target.getUnsignedShortFractScale();
15121 case BuiltinType::UFract:
15122 case BuiltinType::SatUFract:
15123 return Target.getUnsignedFractScale();
15124 case BuiltinType::ULongFract:
15125 case BuiltinType::SatULongFract:
15126 return Target.getUnsignedLongFractScale();
15136 llvm_unreachable(
"Not a fixed point type!");
15137 case BuiltinType::ShortAccum:
15138 case BuiltinType::SatShortAccum:
15139 return Target.getShortAccumIBits();
15140 case BuiltinType::Accum:
15141 case BuiltinType::SatAccum:
15142 return Target.getAccumIBits();
15143 case BuiltinType::LongAccum:
15144 case BuiltinType::SatLongAccum:
15145 return Target.getLongAccumIBits();
15146 case BuiltinType::UShortAccum:
15147 case BuiltinType::SatUShortAccum:
15148 return Target.getUnsignedShortAccumIBits();
15149 case BuiltinType::UAccum:
15150 case BuiltinType::SatUAccum:
15151 return Target.getUnsignedAccumIBits();
15152 case BuiltinType::ULongAccum:
15153 case BuiltinType::SatULongAccum:
15154 return Target.getUnsignedLongAccumIBits();
15155 case BuiltinType::ShortFract:
15156 case BuiltinType::SatShortFract:
15157 case BuiltinType::Fract:
15158 case BuiltinType::SatFract:
15159 case BuiltinType::LongFract:
15160 case BuiltinType::SatLongFract:
15161 case BuiltinType::UShortFract:
15162 case BuiltinType::SatUShortFract:
15163 case BuiltinType::UFract:
15164 case BuiltinType::SatUFract:
15165 case BuiltinType::ULongFract:
15166 case BuiltinType::SatULongFract:
15171llvm::FixedPointSemantics
15174 "Can only get the fixed point semantics for a "
15175 "fixed point or integer type.");
15177 return llvm::FixedPointSemantics::GetIntegerSemantics(
15181 return llvm::FixedPointSemantics(
15184 !isSigned &&
getTargetInfo().doUnsignedFixedPointTypesHavePadding());
15199 "Expected unsigned fixed point type");
15202 case BuiltinType::UShortAccum:
15204 case BuiltinType::UAccum:
15206 case BuiltinType::ULongAccum:
15208 case BuiltinType::SatUShortAccum:
15210 case BuiltinType::SatUAccum:
15212 case BuiltinType::SatULongAccum:
15214 case BuiltinType::UShortFract:
15216 case BuiltinType::UFract:
15218 case BuiltinType::ULongFract:
15220 case BuiltinType::SatUShortFract:
15222 case BuiltinType::SatUFract:
15224 case BuiltinType::SatULongFract:
15227 llvm_unreachable(
"Unexpected unsigned fixed point type");
15235 std::vector<std::string> BackendFeats;
15236 llvm::AArch64::ExtensionSet FeatureBits;
15237 for (StringRef F : FMVFeatStrings)
15238 if (
auto FMVExt = llvm::AArch64::parseFMVExtension(F))
15240 FeatureBits.enable(*FMVExt->ID);
15241 FeatureBits.toLLVMFeatureList(BackendFeats);
15242 return BackendFeats;
15247 assert(TD !=
nullptr);
15250 llvm::erase_if(
ParsedAttr.Features, [&](
const std::string &Feat) {
15251 return !Target->isValidFeatureName(StringRef{Feat}.substr(1));
15262 Target->getTargetOpts().CPU,
15263 Target->getTargetOpts().Features);
15270 StringRef TargetCPU = Target->getTargetOpts().CPU;
15272 if (
const auto *TD = FD->
getAttr<TargetAttr>()) {
15278 if (!Target->getTriple().isAArch64())
15281 Target->getTargetOpts().FeaturesAsWritten.begin(),
15282 Target->getTargetOpts().FeaturesAsWritten.end());
15293 }
else if (
const auto *SD = FD->
getAttr<CPUSpecificAttr>()) {
15295 Target->getCPUSpecificCPUDispatchFeatures(
15297 std::vector<std::string> Features(FeaturesTmp.begin(), FeaturesTmp.end());
15298 Features.insert(Features.begin(),
15299 Target->getTargetOpts().FeaturesAsWritten.begin(),
15300 Target->getTargetOpts().FeaturesAsWritten.end());
15301 Target->initFeatureMap(FeatureMap,
getDiagnostics(), TargetCPU, Features);
15302 }
else if (
const auto *TC = FD->
getAttr<TargetClonesAttr>()) {
15303 if (Target->getTriple().isAArch64()) {
15307 Features.insert(Features.begin(),
15308 Target->getTargetOpts().FeaturesAsWritten.begin(),
15309 Target->getTargetOpts().FeaturesAsWritten.end());
15310 Target->initFeatureMap(FeatureMap,
getDiagnostics(), TargetCPU, Features);
15311 }
else if (Target->getTriple().isRISCV()) {
15313 std::vector<std::string> Features;
15314 if (VersionStr !=
"default") {
15316 Features.insert(Features.begin(),
ParsedAttr.Features.begin(),
15319 Features.insert(Features.begin(),
15320 Target->getTargetOpts().FeaturesAsWritten.begin(),
15321 Target->getTargetOpts().FeaturesAsWritten.end());
15322 Target->initFeatureMap(FeatureMap,
getDiagnostics(), TargetCPU, Features);
15323 }
else if (Target->getTriple().isOSAIX()) {
15324 std::vector<std::string> Features;
15326 if (VersionStr.starts_with(
"cpu="))
15327 TargetCPU = VersionStr.drop_front(
sizeof(
"cpu=") - 1);
15329 assert(VersionStr ==
"default");
15330 Target->initFeatureMap(FeatureMap,
getDiagnostics(), TargetCPU, Features);
15332 std::vector<std::string> Features;
15334 if (VersionStr.starts_with(
"arch="))
15335 TargetCPU = VersionStr.drop_front(
sizeof(
"arch=") - 1);
15336 else if (VersionStr !=
"default")
15337 Features.push_back((StringRef{
"+"} + VersionStr).str());
15338 Target->initFeatureMap(FeatureMap,
getDiagnostics(), TargetCPU, Features);
15340 }
else if (
const auto *TV = FD->
getAttr<TargetVersionAttr>()) {
15341 std::vector<std::string> Features;
15342 if (Target->getTriple().isRISCV()) {
15344 Features.insert(Features.begin(),
ParsedAttr.Features.begin(),
15347 assert(Target->getTriple().isAArch64());
15349 TV->getFeatures(Feats);
15352 Features.insert(Features.begin(),
15353 Target->getTargetOpts().FeaturesAsWritten.begin(),
15354 Target->getTargetOpts().FeaturesAsWritten.end());
15355 Target->initFeatureMap(FeatureMap,
getDiagnostics(), TargetCPU, Features);
15357 FeatureMap = Target->getTargetOpts().FeatureMap;
15368 auto DeviceDiscriminatorOverrider =
15370 if (
const auto *RD = dyn_cast<CXXRecordDecl>(ND))
15372 return RD->getDeviceLambdaManglingNumber();
15373 return std::nullopt;
15376 Context, Context.getDiagnostics(), DeviceDiscriminatorOverrider)};
15384 std::string Buffer;
15385 Buffer.reserve(128);
15386 llvm::raw_string_ostream Out(Buffer);
15387 MC->mangleCanonicalTypeName(KernelNameType, Out);
15388 std::string KernelName = Out.str();
15390 return {KernelNameType, FD, KernelName};
15399 const auto *SKEPAttr = FD->
getAttr<SYCLKernelEntryPointAttr>();
15400 assert(SKEPAttr &&
"Missing sycl_kernel_entry_point attribute");
15409 "SYCL kernel name conflict");
15424 return &IT->second;
15430 return *OMPTraitInfoVector.back();
15437 return DB << Section.
Decl;
15438 return DB <<
"a prior #pragma section";
15442 bool IsInternalVar =
15445 bool IsExplicitDeviceVar = (D->
hasAttr<CUDADeviceAttr>() &&
15446 !D->
getAttr<CUDADeviceAttr>()->isImplicit()) ||
15447 (D->
hasAttr<CUDAConstantAttr>() &&
15448 !D->
getAttr<CUDAConstantAttr>()->isImplicit());
15452 return (IsInternalVar &&
15453 (D->
hasAttr<HIPManagedAttr>() || IsExplicitDeviceVar)) ||
15454 (D->
hasAttr<CUDAGlobalAttr>() &&
15461 (D->
hasAttr<HIPManagedAttr>() || D->
hasAttr<CUDAGlobalAttr>() ||
15466 if (!CUIDHash.empty())
15468 if (LangOpts.CUID.empty())
15469 return StringRef();
15470 CUIDHash = llvm::utohexstr(llvm::MD5Hash(LangOpts.CUID),
true);
15480 assert(PrimaryBase);
15483 auto Base = Layout.getPrimaryBase();
15484 if (!
Base ||
Base == PrimaryBase || !
Base->isPolymorphic())
15486 PrimaryBase =
Base;
15488 return PrimaryBase;
15492 StringRef MangledName) {
15494 assert(
Method->isVirtual());
15495 bool DefaultIncludesPointerAuth =
15496 LangOpts.PointerAuthCalls || LangOpts.PointerAuthIntrinsics;
15498 if (!DefaultIncludesPointerAuth)
15501 auto Existing = ThunksToBeAbbreviated.find(VirtualMethodDecl);
15502 if (Existing != ThunksToBeAbbreviated.end())
15503 return Existing->second.contains(MangledName.str());
15506 llvm::StringMap<llvm::SmallVector<std::string, 2>> Thunks;
15508 if (
const auto *ThunkInfos = VtableContext->getThunkInfo(VirtualMethodDecl)) {
15510 for (
const auto &Thunk : *ThunkInfos) {
15512 llvm::raw_svector_ostream ElidedNameStream(ElidedName);
15518 Mangler->mangleThunk(
Method, Thunk,
true,
15521 llvm::raw_svector_ostream mangledNameStream(MangledName);
15525 mangledNameStream);
15527 Mangler->mangleThunk(
Method, Thunk,
false,
15528 mangledNameStream);
15530 Thunks[ElidedName].push_back(std::string(MangledName));
15533 llvm::StringSet<> SimplifiedThunkNames;
15534 for (
auto &ThunkList : Thunks) {
15535 llvm::sort(ThunkList.second);
15536 SimplifiedThunkNames.insert(ThunkList.second[0]);
15538 bool Result = SimplifiedThunkNames.contains(MangledName);
15539 ThunksToBeAbbreviated[VirtualMethodDecl] = std::move(SimplifiedThunkNames);
15557 std::vector<PFPField> &Fields,
bool IncludeVBases) {
15559 if (
auto *ElemDecl = AT->getElementType()->getAsCXXRecordDecl()) {
15561 for (
unsigned i = 0; i != AT->getSize(); ++i)
15578 Fields.push_back({FieldOffset, Field});
15585 if (
Base.isVirtual())
15592 if (IncludeVBases) {
15603 std::vector<PFPField> PFPFields;
15613 if (
auto *RD = dyn_cast<CXXRecordDecl>(FD->
getParent()))
15615 !FD->
hasAttr<NoFieldProtectionAttr>();
15620 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.
__device__ __2f16 float c
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.
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.
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.
@ DeducedAsPack
Same as above, but additionally this represents a case where the deduced entity itself is a pack.
const Decl & adjustDeclToTemplate(const Decl &D)
If we have a 'templated' declaration for a template, adjust 'D' to refer to the actual template.
bool isPtrSizeAddressSpace(LangAS AS)
ExprValueKind
The categorization of expression values, currently following the C++11 scheme.
@ VK_PRValue
A pr-value expression (in the C++11 taxonomy) produces a temporary value.
@ VK_XValue
An x-value expression is a reference to an object with independent storage but which can be "moved",...
@ VK_LValue
An l-value expression is a reference to an object with independent storage.
bool declaresSameEntity(const Decl *D1, const Decl *D2)
Determine whether two declarations declare the same entity.
const StreamingDiagnostic & operator<<(const StreamingDiagnostic &DB, const ConceptReference *C)
Insertion operator for diagnostics.
TemplateSpecializationKind
Describes the kind of template specialization that a particular template specialization declaration r...
@ TSK_ExplicitInstantiationDefinition
This template specialization was instantiated from a template due to an explicit instantiation defini...
@ TSK_ExplicitInstantiationDeclaration
This template specialization was instantiated from a template due to an explicit instantiation declar...
@ TSK_ExplicitSpecialization
This template specialization was declared or defined by an explicit specialization (C++ [temp....
@ TSK_ImplicitInstantiation
This template specialization was implicitly instantiated from a template.
@ TSK_Undeclared
This template specialization was formed from a template-id but has not yet been declared,...
CallingConv
CallingConv - Specifies the calling convention that a function uses.
@ Invariant
The parameter is invariant: must match exactly.
@ Contravariant
The parameter is contravariant, e.g., X<T> is a subtype of X when the type parameter is covariant and...
@ Covariant
The parameter is covariant, e.g., X<T> is a subtype of X when the type parameter is covariant and T i...
@ AltiVecBool
is AltiVec 'vector bool ...'
@ SveFixedLengthData
is AArch64 SVE fixed-length data vector
@ AltiVecPixel
is AltiVec 'vector Pixel'
@ Generic
not a target-specific vector type
@ RVVFixedLengthData
is RISC-V RVV fixed-length data vector
@ RVVFixedLengthMask
is RISC-V RVV fixed-length mask vector
@ SveFixedLengthPredicate
is AArch64 SVE fixed-length predicate vector
U cast(CodeGen::Address addr)
LangAS getLangASFromTargetAS(unsigned TargetAS)
@ None
The alignment was not explicit in code.
@ RequiredByEnum
The alignment comes from an alignment attribute on a enum type.
@ RequiredByTypedef
The alignment comes from an alignment attribute on a typedef.
@ RequiredByRecord
The alignment comes from an alignment attribute on a record type.
ElaboratedTypeKeyword
The elaboration keyword that precedes a qualified type name or introduces an elaborated-type-specifie...
@ Interface
The "__interface" keyword introduces the elaborated-type-specifier.
@ None
No keyword precedes the qualified type name.
@ Struct
The "struct" keyword introduces the elaborated-type-specifier.
@ Class
The "class" keyword introduces the elaborated-type-specifier.
@ Union
The "union" keyword introduces the elaborated-type-specifier.
@ Enum
The "enum" keyword introduces the elaborated-type-specifier.
@ Typename
The "typename" keyword precedes the qualified type name, e.g., typename T::type.
ExceptionSpecificationType
The various types of exception specifications that exist in C++11.
@ EST_DependentNoexcept
noexcept(expression), value-dependent
@ EST_Uninstantiated
not instantiated yet
@ EST_Unparsed
not parsed yet
@ EST_NoThrow
Microsoft __declspec(nothrow) extension.
@ EST_None
no exception specification
@ EST_MSAny
Microsoft throw(...) extension.
@ EST_BasicNoexcept
noexcept
@ EST_NoexceptFalse
noexcept(expression), evals to 'false'
@ EST_Unevaluated
not evaluated yet, for special member function
@ EST_NoexceptTrue
noexcept(expression), evals to 'true'
@ EST_Dynamic
throw(T1, T2)
unsigned NumTemplateArgs
The number of template arguments in TemplateArgs.
const Expr * ConstraintExpr
UnsignedOrNone ArgPackSubstIndex
Copy initialization expr of a __block variable and a boolean flag that indicates whether the expressi...
Expr * getCopyExpr() const
DeclarationNameInfo - A collector data type for bundling together a DeclarationName and the correspon...
ArrayRef< TemplateArgument > Args
Holds information about the various types of exception specification.
ExceptionSpecificationType Type
The kind of exception specification this is.
ArrayRef< QualType > Exceptions
Explicitly-specified list of exception types.
Expr * NoexceptExpr
Noexcept expression, if this is a computed noexcept specification.
Extra information about a function prototype.
ExceptionSpecInfo ExceptionSpec
bool requiresFunctionProtoTypeArmAttributes() const
FunctionEffectsRef FunctionEffects
const ExtParameterInfo * ExtParameterInfos
RefQualifierKind RefQualifier
bool requiresFunctionProtoTypeExtraAttributeInfo() const
unsigned HasTrailingReturn
bool requiresFunctionProtoTypeExtraBitfields() const
FunctionType::ExtInfo ExtInfo
const IdentifierInfo * getIdentifier() const
Returns the identifier to which this template name refers.
OverloadedOperatorKind getOperator() const
Return the overloaded operator to which this template name refers.
static ElaboratedTypeKeyword getKeywordForTagTypeKind(TagTypeKind Tag)
Converts a TagTypeKind into an elaborated type keyword.
A lazy value (of type T) that is within an AST node of type Owner, where the value might change in la...
Contains information gathered from parsing the contents of TargetAttr.
A std::pair-like structure for storing a qualified type split into its local qualifiers and its local...
const Type * Ty
The locally-unqualified type.
Qualifiers Quals
The local qualifiers.
llvm::DenseSet< std::tuple< Decl *, Decl *, int > > NonEquivalentDeclSet
Store declaration pairs already found to be non-equivalent.
bool IsEquivalent(Decl *D1, Decl *D2)
Determine whether the two declarations are structurally equivalent.
A this pointer adjustment.
IntType
===-— Target Data Type Query Methods ----------------------------—===//
AlignRequirementKind AlignRequirement
AlignRequirementKind AlignRequirement