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) {
710 ID.AddPointer(
T.getCanonicalType().getAsOpaquePtr());
713 ID.AddBoolean(
false);
723TemplateTemplateParmDecl *
727 llvm::FoldingSetNodeID ID;
728 CanonicalTemplateTemplateParm::Profile(ID, *
this, TTP);
729 void *InsertPos =
nullptr;
730 CanonicalTemplateTemplateParm *Canonical
731 = CanonTemplateTemplateParms.FindNodeOrInsertPos(ID, InsertPos);
733 return Canonical->getParam();
738 CanonParams.reserve(Params->
size());
740 PEnd = Params->
end();
744 if (
const auto *TTP = dyn_cast<TemplateTypeParmDecl>(*P)) {
749 TTP->getNumExpansionParameters());
750 CanonParams.push_back(NewTTP);
751 }
else if (
const auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(*P)) {
755 if (NTTP->isExpandedParameterPack()) {
758 for (
unsigned I = 0, N = NTTP->getNumExpansionTypes(); I != N; ++I) {
760 ExpandedTInfos.push_back(
768 NTTP->getPosition(),
nullptr,
778 NTTP->getPosition(),
nullptr,
780 NTTP->isParameterPack(),
783 CanonParams.push_back(Param);
799 Canonical = CanonTemplateTemplateParms.FindNodeOrInsertPos(ID, InsertPos);
800 assert(!Canonical &&
"Shouldn't be in the map!");
804 Canonical =
new (*this) CanonicalTemplateTemplateParm(CanonTTP);
805 CanonTemplateTemplateParms.InsertNode(Canonical, InsertPos);
812 llvm::FoldingSetNodeID ID;
813 CanonicalTemplateTemplateParm::Profile(ID, *
this, TTP);
814 void *InsertPos =
nullptr;
815 CanonicalTemplateTemplateParm *Canonical =
816 CanonTemplateTemplateParms.FindNodeOrInsertPos(ID, InsertPos);
817 return Canonical ? Canonical->getParam() :
nullptr;
823 llvm::FoldingSetNodeID ID;
824 CanonicalTemplateTemplateParm::Profile(ID, *
this, CanonTTP);
825 void *InsertPos =
nullptr;
827 CanonTemplateTemplateParms.FindNodeOrInsertPos(ID, InsertPos))
828 return Existing->getParam();
829 CanonTemplateTemplateParms.InsertNode(
830 new (*
this) CanonicalTemplateTemplateParm(CanonTTP), InsertPos);
851 [](
const DynTypedNode &P) { return P.get<WhileStmt>() != nullptr; });
875 return NoSanitizeL->containsType(Mask, TyName);
884 if (!LangOpts.CPlusPlus)
return nullptr;
887 case TargetCXXABI::AppleARM64:
888 case TargetCXXABI::Fuchsia:
889 case TargetCXXABI::GenericARM:
890 case TargetCXXABI::iOS:
891 case TargetCXXABI::WatchOS:
892 case TargetCXXABI::GenericAArch64:
893 case TargetCXXABI::GenericMIPS:
894 case TargetCXXABI::GenericItanium:
895 case TargetCXXABI::WebAssembly:
896 case TargetCXXABI::XL:
898 case TargetCXXABI::Microsoft:
901 llvm_unreachable(
"Invalid CXXABI type!");
905 if (!InterpContext) {
908 return *InterpContext;
914 return *ParentMapCtx;
919 switch (LangOpts.getAddressSpaceMapMangling()) {
927 llvm_unreachable(
"getAddressSpaceMapMangling() doesn't cover anything.");
933 : ConstantArrayTypes(this_(), ConstantArrayTypesLog2InitSize),
934 DependentSizedArrayTypes(this_()), DependentSizedExtVectorTypes(this_()),
935 DependentAddressSpaceTypes(this_()), DependentVectorTypes(this_()),
936 DependentSizedMatrixTypes(this_()),
937 FunctionProtoTypes(this_(), FunctionProtoTypesLog2InitSize),
938 DependentTypeOfExprTypes(this_()), DependentDecltypeTypes(this_()),
939 DependentPackIndexingTypes(this_()), TemplateSpecializationTypes(this_()),
940 AttributedTypes(this_()), DependentBitIntTypes(this_()),
941 SubstTemplateTemplateParmPacks(this_()), DeducedTemplates(this_()),
942 ArrayParameterTypes(this_()), CanonTemplateTemplateParms(this_()),
943 SourceMgr(
SM), LangOpts(LOpts),
946 LangOpts.XRayNeverInstrumentFiles,
947 LangOpts.XRayAttrListFiles,
SM)),
951 Comments(
SM), CommentCommandTraits(BumpAlloc, LOpts.CommentOpts),
959 ReleaseDeclContextMaps();
962 for (
auto &Pair : Deallocations)
963 (Pair.first)(Pair.second);
964 Deallocations.clear();
970 I = ObjCLayouts.begin(),
971 E = ObjCLayouts.end();
978 for (llvm::DenseMap<const RecordDecl*, const ASTRecordLayout*>::iterator
979 I = ASTRecordLayouts.begin(), E = ASTRecordLayouts.end(); I != E; ) {
984 ASTRecordLayouts.clear();
986 for (llvm::DenseMap<const Decl*, AttrVec*>::iterator A = DeclAttrs.begin(),
987 AEnd = DeclAttrs.end();
989 A->second->~AttrVec();
992 CtorClosureDefaultArgs.clear();
994 for (
const auto &
Value : ModuleInitializers)
995 Value.second->~PerModuleInitializers();
996 ModuleInitializers.
clear();
1000 NoSanitizeL.reset();
1006 TraversalScope = TopLevelDecls;
1011 Deallocations.push_back({Callback,
Data});
1020 llvm::errs() <<
"\n*** AST Context Stats:\n";
1021 llvm::errs() <<
" " << Types.size() <<
" types total.\n";
1023 unsigned counts[] = {
1024#define TYPE(Name, Parent) 0,
1025#define ABSTRACT_TYPE(Name, Parent)
1026#include "clang/AST/TypeNodes.inc"
1030 for (
unsigned i = 0, e = Types.size(); i != e; ++i) {
1036 unsigned TotalBytes = 0;
1037#define TYPE(Name, Parent) \
1039 llvm::errs() << " " << counts[Idx] << " " << #Name \
1040 << " types, " << sizeof(Name##Type) << " each " \
1041 << "(" << counts[Idx] * sizeof(Name##Type) \
1043 TotalBytes += counts[Idx] * sizeof(Name##Type); \
1045#define ABSTRACT_TYPE(Name, Parent)
1046#include "clang/AST/TypeNodes.inc"
1048 llvm::errs() <<
"Total bytes = " << TotalBytes <<
"\n";
1053 <<
" implicit default constructors created\n";
1056 <<
" implicit copy constructors created\n";
1060 <<
" implicit move constructors created\n";
1063 <<
" implicit copy assignment operators created\n";
1067 <<
" implicit move assignment operators created\n";
1070 <<
" implicit destructors created\n";
1073 llvm::errs() <<
"\n";
1077 BumpAlloc.PrintStats();
1081 bool NotifyListeners) {
1082 if (NotifyListeners)
1085 Listener->RedefinedHiddenDefinition(ND, M);
1092 if (It == MergedDefModules.end())
1095 auto &Merged = It->second;
1096 llvm::DenseSet<Module*>
Found;
1097 for (
Module *&M : Merged)
1098 if (!
Found.insert(M).second)
1100 llvm::erase(Merged,
nullptr);
1107 if (MergedIt == MergedDefModules.end())
1109 return MergedIt->second;
1112void ASTContext::PerModuleInitializers::resolve(
ASTContext &Ctx) {
1113 if (LazyInitializers.empty())
1117 assert(Source &&
"lazy initializers but no external source");
1119 auto LazyInits = std::move(LazyInitializers);
1120 LazyInitializers.clear();
1122 for (
auto ID : LazyInits)
1123 Initializers.push_back(Source->GetExternalDecl(ID));
1125 assert(LazyInitializers.empty() &&
1126 "GetExternalDecl for lazy module initializer added more inits");
1132 if (
const auto *ID = dyn_cast<ImportDecl>(D)) {
1133 auto It = ModuleInitializers.find(ID->getImportedModule());
1136 if (It == ModuleInitializers.end())
1140 auto &Imported = *It->second;
1141 if (Imported.Initializers.size() + Imported.LazyInitializers.size() == 1) {
1142 Imported.resolve(*
this);
1143 auto *OnlyDecl = Imported.Initializers.front();
1149 auto *&
Inits = ModuleInitializers[M];
1151 Inits =
new (*this) PerModuleInitializers;
1152 Inits->Initializers.push_back(D);
1157 auto *&
Inits = ModuleInitializers[M];
1159 Inits =
new (*this) PerModuleInitializers;
1160 Inits->LazyInitializers.insert(
Inits->LazyInitializers.end(),
1161 IDs.begin(), IDs.end());
1165 auto It = ModuleInitializers.find(M);
1166 if (It == ModuleInitializers.end())
1169 auto *
Inits = It->second;
1170 Inits->resolve(*
this);
1171 return Inits->Initializers;
1176 assert(!CurrentCXXNamedModule &&
1177 "We should set named module for ASTContext for only once");
1178 CurrentCXXNamedModule = M;
1190 auto GetRepresentativeModule = [
this](
const Module *M) {
1191 auto Iter = SameModuleLookupSet.find(M);
1192 if (Iter != SameModuleLookupSet.end())
1193 return Iter->second;
1195 const Module *RepresentativeModule =
1196 PrimaryModuleNameMap.try_emplace(M->getPrimaryModuleInterfaceName(), M)
1198 SameModuleLookupSet[M] = RepresentativeModule;
1199 return RepresentativeModule;
1202 assert(M1 &&
"Shouldn't call `isInSameModule` if both M1 and M2 are none.");
1203 return GetRepresentativeModule(M1) == GetRepresentativeModule(M2);
1207 if (!ExternCContext)
1210 return ExternCContext;
1224#define BuiltinTemplate(BTName) \
1225 BuiltinTemplateDecl *ASTContext::get##BTName##Decl() const { \
1226 if (!Decl##BTName) \
1228 buildBuiltinTemplateDecl(BTK##BTName, get##BTName##Name()); \
1229 return Decl##BTName; \
1231#include "clang/Basic/BuiltinTemplates.inc"
1244 NewDecl->
addAttr(TypeVisibilityAttr::CreateImplicit(
1245 const_cast<ASTContext &
>(*
this), TypeVisibilityAttr::Default));
1250 StringRef Name)
const {
1274 Types.push_back(Ty);
1279 assert((!this->Target || this->Target == &Target) &&
1280 "Incorrect target reinitialization");
1281 assert(
VoidTy.isNull() &&
"Context reinitialized?");
1283 this->Target = &Target;
1284 this->AuxTarget = AuxTarget;
1286 ABI.reset(createCXXABI(Target));
1290 InitBuiltinType(
VoidTy, BuiltinType::Void);
1293 InitBuiltinType(
BoolTy, BuiltinType::Bool);
1295 if (LangOpts.CharIsSigned)
1296 InitBuiltinType(
CharTy, BuiltinType::Char_S);
1298 InitBuiltinType(
CharTy, BuiltinType::Char_U);
1301 InitBuiltinType(
ShortTy, BuiltinType::Short);
1302 InitBuiltinType(
IntTy, BuiltinType::Int);
1303 InitBuiltinType(
LongTy, BuiltinType::Long);
1304 InitBuiltinType(
LongLongTy, BuiltinType::LongLong);
1314 InitBuiltinType(
FloatTy, BuiltinType::Float);
1315 InitBuiltinType(
DoubleTy, BuiltinType::Double);
1316 InitBuiltinType(
LongDoubleTy, BuiltinType::LongDouble);
1319 InitBuiltinType(
Float128Ty, BuiltinType::Float128);
1322 InitBuiltinType(
Ibm128Ty, BuiltinType::Ibm128);
1325 InitBuiltinType(
Float16Ty, BuiltinType::Float16);
1328 InitBuiltinType(
ShortAccumTy, BuiltinType::ShortAccum);
1329 InitBuiltinType(
AccumTy, BuiltinType::Accum);
1330 InitBuiltinType(
LongAccumTy, BuiltinType::LongAccum);
1334 InitBuiltinType(
ShortFractTy, BuiltinType::ShortFract);
1335 InitBuiltinType(
FractTy, BuiltinType::Fract);
1336 InitBuiltinType(
LongFractTy, BuiltinType::LongFract);
1341 InitBuiltinType(
SatAccumTy, BuiltinType::SatAccum);
1347 InitBuiltinType(
SatFractTy, BuiltinType::SatFract);
1354 InitBuiltinType(
Int128Ty, BuiltinType::Int128);
1359 InitBuiltinType(
WCharTy, BuiltinType::WChar_S);
1361 InitBuiltinType(
WCharTy, BuiltinType::WChar_U);
1362 if (LangOpts.CPlusPlus && LangOpts.WChar)
1366 WideCharTy = getFromTargetType(Target.getWCharType());
1369 WIntTy = getFromTargetType(Target.getWIntType());
1372 InitBuiltinType(
Char8Ty, BuiltinType::Char8);
1374 if (LangOpts.CPlusPlus)
1375 InitBuiltinType(
Char16Ty, BuiltinType::Char16);
1377 Char16Ty = getFromTargetType(Target.getChar16Type());
1379 if (LangOpts.CPlusPlus)
1380 InitBuiltinType(
Char32Ty, BuiltinType::Char32);
1382 Char32Ty = getFromTargetType(Target.getChar32Type());
1389 InitBuiltinType(
DependentTy, BuiltinType::Dependent);
1392 InitBuiltinType(
OverloadTy, BuiltinType::Overload);
1404 InitBuiltinType(
UnknownAnyTy, BuiltinType::UnknownAny);
1410 InitBuiltinType(
BuiltinFnTy, BuiltinType::BuiltinFn);
1413 if (LangOpts.OpenMP) {
1420 if (LangOpts.OpenACC && !LangOpts.OpenMP) {
1423 if (LangOpts.MatrixTypes)
1431 if (LangOpts.OpenCL) {
1432#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
1433 InitBuiltinType(SingletonId, BuiltinType::Id);
1434#include "clang/Basic/OpenCLImageTypes.def"
1436 InitBuiltinType(
OCLSamplerTy, BuiltinType::OCLSampler);
1437 InitBuiltinType(
OCLEventTy, BuiltinType::OCLEvent);
1439 InitBuiltinType(
OCLQueueTy, BuiltinType::OCLQueue);
1442#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
1443 InitBuiltinType(Id##Ty, BuiltinType::Id);
1444#include "clang/Basic/OpenCLExtensionTypes.def"
1447 if (LangOpts.HLSL) {
1448#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) \
1449 InitBuiltinType(SingletonId, BuiltinType::Id);
1450#include "clang/Basic/HLSLIntangibleTypes.def"
1453 if (Target.hasAArch64ACLETypes() ||
1454 (AuxTarget && AuxTarget->hasAArch64ACLETypes())) {
1455#define SVE_TYPE(Name, Id, SingletonId) \
1456 InitBuiltinType(SingletonId, BuiltinType::Id);
1457#include "clang/Basic/AArch64ACLETypes.def"
1460 if (Target.getTriple().isPPC64()) {
1461#define PPC_VECTOR_MMA_TYPE(Name, Id, Size) \
1462 InitBuiltinType(Id##Ty, BuiltinType::Id);
1463#include "clang/Basic/PPCTypes.def"
1464#define PPC_VECTOR_VSX_TYPE(Name, Id, Size) \
1465 InitBuiltinType(Id##Ty, BuiltinType::Id);
1466#include "clang/Basic/PPCTypes.def"
1469 if (Target.hasRISCVVTypes()) {
1470#define RVV_TYPE(Name, Id, SingletonId) \
1471 InitBuiltinType(SingletonId, BuiltinType::Id);
1472#include "clang/Basic/RISCVVTypes.def"
1475 if (Target.getTriple().isWasm() && Target.hasFeature(
"reference-types")) {
1476#define WASM_TYPE(Name, Id, SingletonId) \
1477 InitBuiltinType(SingletonId, BuiltinType::Id);
1478#include "clang/Basic/WebAssemblyReferenceTypes.def"
1481 if (Target.getTriple().isAMDGPU() ||
1482 (Target.getTriple().isSPIRV() &&
1483 Target.getTriple().getVendor() == llvm::Triple::AMD) ||
1485 (AuxTarget->getTriple().isAMDGPU() ||
1486 ((AuxTarget->getTriple().isSPIRV() &&
1487 AuxTarget->getTriple().getVendor() == llvm::Triple::AMD))))) {
1488#define AMDGPU_TYPE(Name, Id, SingletonId, Width, Align) \
1489 InitBuiltinType(SingletonId, BuiltinType::Id);
1490#include "clang/Basic/AMDGPUTypes.def"
1497 ObjCConstantStringType =
QualType();
1502 if (LangOpts.OpenCLGenericAddressSpace) {
1503 auto Q =
VoidTy.getQualifiers();
1512 InitBuiltinType(
NullPtrTy, BuiltinType::NullPtr);
1515 InitBuiltinType(
HalfTy, BuiltinType::Half);
1517 InitBuiltinType(
BFloat16Ty, BuiltinType::BFloat16);
1523 if (LangOpts.MicrosoftExt || LangOpts.Borland) {
1530 return SourceMgr.getDiagnostics();
1545 llvm::DenseMap<const Decl*, AttrVec*>::iterator Pos = DeclAttrs.find(D);
1546 if (Pos != DeclAttrs.end()) {
1547 Pos->second->~AttrVec();
1548 DeclAttrs.erase(Pos);
1554 return CtorClosureDefaultArgs.lookup(CD);
1559 assert(!CtorClosureDefaultArgs.contains(CD));
1560 CtorClosureDefaultArgs[CD] = Args;
1567 if (It != ExplicitInstantiations.end())
1588 llvm::DenseMap<const VarDecl *, TemplateOrSpecializationInfo>::iterator Pos =
1589 TemplateOrInstantiation.find(Var);
1590 if (Pos == TemplateOrInstantiation.end())
1603 Tmpl, TSK, PointOfInstantiation));
1609 assert(!TemplateOrInstantiation[Inst] &&
1610 "Already noted what the variable was instantiated from");
1611 TemplateOrInstantiation[Inst] = TSI;
1616 return InstantiatedFromUsingDecl.lookup(UUD);
1624 "pattern decl is not a using decl");
1628 "instantiation did not produce a using decl");
1629 assert(!InstantiatedFromUsingDecl[Inst] &&
"pattern already exists");
1630 InstantiatedFromUsingDecl[Inst] = Pattern;
1635 return InstantiatedFromUsingEnumDecl.lookup(UUD);
1640 assert(!InstantiatedFromUsingEnumDecl[Inst] &&
"pattern already exists");
1641 InstantiatedFromUsingEnumDecl[Inst] = Pattern;
1646 return InstantiatedFromUsingShadowDecl.lookup(Inst);
1652 assert(!InstantiatedFromUsingShadowDecl[Inst] &&
"pattern already exists");
1653 InstantiatedFromUsingShadowDecl[Inst] = Pattern;
1658 return InstantiatedFromUnnamedFieldDecl.lookup(Field);
1664 "Instantiated field decl is not unnamed");
1666 "Template field decl is not unnamed");
1667 assert(!InstantiatedFromUnnamedFieldDecl[Inst] &&
1668 "Already noted what unnamed field was instantiated from");
1670 InstantiatedFromUnnamedFieldDecl[Inst] = Tmpl;
1686 return Range.end() - Range.begin();
1691 llvm::DenseMap<const CXXMethodDecl *, CXXMethodVector>::const_iterator Pos =
1692 OverriddenMethods.find(
Method->getCanonicalDecl());
1693 if (Pos == OverriddenMethods.end())
1701 OverriddenMethods[
Method].push_back(Overridden);
1709 if (
const auto *CXXMethod = dyn_cast<CXXMethodDecl>(D)) {
1715 const auto *
Method = dyn_cast<ObjCMethodDecl>(D);
1720 Method->getOverriddenMethods(OverDecls);
1721 Overridden.append(OverDecls.begin(), OverDecls.end());
1724std::optional<ASTContext::CXXRecordDeclRelocationInfo>
1728 auto it = RelocatableClasses.find(D);
1729 if (it != RelocatableClasses.end())
1730 return it->getSecond();
1731 return std::nullopt;
1738 assert(RelocatableClasses.find(D) == RelocatableClasses.end());
1739 RelocatableClasses.insert({D, Info});
1744 if (!Class->isPolymorphic())
1746 const CXXRecordDecl *BaseType = Context.baseForVTableAuthentication(Class);
1747 using AuthAttr = VTablePointerAuthenticationAttr;
1748 const AuthAttr *ExplicitAuth = BaseType->
getAttr<AuthAttr>();
1750 return Context.getLangOpts().PointerAuthVTPtrAddressDiscrimination;
1751 AuthAttr::AddressDiscriminationMode AddressDiscrimination =
1752 ExplicitAuth->getAddressDiscrimination();
1753 if (AddressDiscrimination == AuthAttr::DefaultAddressDiscrimination)
1754 return Context.getLangOpts().PointerAuthVTPtrAddressDiscrimination;
1755 return AddressDiscrimination == AuthAttr::AddressDiscrimination;
1758ASTContext::PointerAuthContent
1759ASTContext::findPointerAuthContent(QualType
T)
const {
1760 assert(isPointerAuthenticationAvailable());
1762 T =
T.getCanonicalType();
1764 return PointerAuthContent::None;
1766 if (
T.hasAddressDiscriminatedPointerAuth())
1767 return PointerAuthContent::AddressDiscriminatedData;
1770 return PointerAuthContent::None;
1773 return PointerAuthContent::None;
1775 if (
auto Existing = RecordContainsAddressDiscriminatedPointerAuth.find(RD);
1776 Existing != RecordContainsAddressDiscriminatedPointerAuth.end())
1777 return Existing->second;
1779 PointerAuthContent
Result = PointerAuthContent::None;
1781 auto SaveResultAndReturn = [&]() -> PointerAuthContent {
1782 auto [ResultIter, DidAdd] =
1783 RecordContainsAddressDiscriminatedPointerAuth.try_emplace(RD,
Result);
1789 auto ShouldContinueAfterUpdate = [&](PointerAuthContent NewResult) {
1790 static_assert(PointerAuthContent::None <
1791 PointerAuthContent::AddressDiscriminatedVTable);
1792 static_assert(PointerAuthContent::AddressDiscriminatedVTable <
1793 PointerAuthContent::AddressDiscriminatedData);
1796 return Result != PointerAuthContent::AddressDiscriminatedData;
1798 if (
const CXXRecordDecl *CXXRD = dyn_cast<CXXRecordDecl>(RD)) {
1800 !ShouldContinueAfterUpdate(
1801 PointerAuthContent::AddressDiscriminatedVTable))
1802 return SaveResultAndReturn();
1803 for (
auto Base : CXXRD->bases()) {
1804 if (!ShouldContinueAfterUpdate(findPointerAuthContent(
Base.getType())))
1805 return SaveResultAndReturn();
1808 for (
auto *FieldDecl : RD->
fields()) {
1809 if (!ShouldContinueAfterUpdate(
1810 findPointerAuthContent(FieldDecl->getType())))
1811 return SaveResultAndReturn();
1813 return SaveResultAndReturn();
1817 assert(!Import->getNextLocalImport() &&
1818 "Import declaration already in the chain");
1819 assert(!Import->isFromASTFile() &&
"Non-local import declaration");
1820 if (!FirstLocalImport) {
1821 FirstLocalImport = Import;
1822 LastLocalImport = Import;
1826 LastLocalImport->setNextLocalImport(Import);
1827 LastLocalImport = Import;
1839 llvm_unreachable(
"Not a floating point type!");
1840 case BuiltinType::BFloat16:
1841 return Target->getBFloat16Format();
1842 case BuiltinType::Float16:
1843 return Target->getHalfFormat();
1844 case BuiltinType::Half:
1845 return Target->getHalfFormat();
1846 case BuiltinType::Float:
return Target->getFloatFormat();
1847 case BuiltinType::Double:
return Target->getDoubleFormat();
1848 case BuiltinType::Ibm128:
1849 return Target->getIbm128Format();
1850 case BuiltinType::LongDouble:
1852 return AuxTarget->getLongDoubleFormat();
1853 return Target->getLongDoubleFormat();
1854 case BuiltinType::Float128:
1856 return AuxTarget->getFloat128Format();
1857 return Target->getFloat128Format();
1862 unsigned Align = Target->getCharWidth();
1866 Align = AlignFromAttr;
1874 bool UseAlignAttrOnly;
1875 if (
const FieldDecl *FD = dyn_cast<FieldDecl>(D))
1877 FD->hasAttr<PackedAttr>() || FD->getParent()->hasAttr<PackedAttr>();
1879 UseAlignAttrOnly = AlignFromAttr != 0;
1882 if (UseAlignAttrOnly) {
1884 }
else if (
const auto *VD = dyn_cast<ValueDecl>(D)) {
1888 T = RT->getPointeeType();
1893 if (
T->isFunctionType())
1894 Align = getTypeInfoImpl(
T.getTypePtr()).Align;
1899 unsigned MinWidth = Target->getLargeArrayMinWidth();
1900 if (!ForAlignof && MinWidth) {
1902 Align = std::max(Align, Target->getLargeArrayAlign());
1905 Align = std::max(Align, Target->getLargeArrayAlign());
1910 Align = Target->getCharWidth();
1914 if (
const auto *VD = dyn_cast<VarDecl>(D))
1915 if (VD->hasGlobalStorage() && !ForAlignof) {
1926 if (
const auto *Field = dyn_cast<FieldDecl>(VD)) {
1940 uint64_t LowBitOfOffset = Offset & (~Offset + 1);
1941 if (LowBitOfOffset < FieldAlign)
1942 FieldAlign =
static_cast<unsigned>(LowBitOfOffset);
1945 Align = std::min(Align, FieldAlign);
1953 const auto *VD = dyn_cast<VarDecl>(D);
1954 if (MaxAlignedAttr && VD && VD->getStorageClass() ==
SC_Static)
1955 Align = std::min(Align, MaxAlignedAttr);
1975 if (
const auto *RD =
T->getAsCXXRecordDecl(); RD && !RD->
isInvalidDecl()) {
1992 (uint64_t)(-1)/Size) &&
1993 "Overflow in array type char size evaluation");
1996 if (!Context.getTargetInfo().getCXXABI().isMicrosoft() ||
1998 Width = llvm::alignTo(Width, Align);
2005 if (
const auto *CAT = dyn_cast<ConstantArrayType>(
T))
2023 switch (BT->getKind()) {
2024 case BuiltinType::Bool:
2025 case BuiltinType::Char_S:
2026 case BuiltinType::Char_U:
2027 case BuiltinType::SChar:
2028 case BuiltinType::UChar:
2029 case BuiltinType::Short:
2030 case BuiltinType::UShort:
2031 case BuiltinType::WChar_S:
2032 case BuiltinType::WChar_U:
2033 case BuiltinType::Char8:
2034 case BuiltinType::Char16:
2035 case BuiltinType::Char32:
2043 if (
const auto *ED =
T->getAsEnumDecl()) {
2044 if (
T->isDependentType() || ED->getPromotionType().isNull() ||
2052 if (
const auto *OBT =
T->getAs<OverflowBehaviorType>()) {
2068 bool NeedsPreferredAlignment)
const {
2071 if (
unsigned Align = TT->getDecl()->getMaxAlignment())
2076 if (!
T->isIncompleteType())
2082 if (
unsigned Align = TT->getDecl()->getMaxAlignment())
2086 if (
const auto *TD =
T->getAsTagDecl())
2087 return TD->getMaxAlignment();
2093 TypeInfoMap::iterator I = MemoizedTypeInfo.find(
T);
2094 if (I != MemoizedTypeInfo.end())
2099 MemoizedTypeInfo[
T] = TI;
2114 switch (
T->getTypeClass()) {
2115#define TYPE(Class, Base)
2116#define ABSTRACT_TYPE(Class, Base)
2117#define NON_CANONICAL_TYPE(Class, Base)
2118#define DEPENDENT_TYPE(Class, Base) case Type::Class:
2119#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base) \
2121 assert(!T->isDependentType() && "should not see dependent types here"); \
2122 return getTypeInfo(cast<Class##Type>(T)->desugar().getTypePtr());
2123#include "clang/AST/TypeNodes.inc"
2124 llvm_unreachable(
"Should not see dependent types");
2126 case Type::FunctionNoProto:
2127 case Type::FunctionProto:
2133 case Type::IncompleteArray:
2134 case Type::VariableArray:
2135 case Type::ConstantArray:
2136 case Type::ArrayParameter: {
2139 if (
const auto *CAT = dyn_cast<ConstantArrayType>(
T))
2140 Size = CAT->getZExtSize();
2143 assert((Size == 0 || EltInfo.
Width <= (uint64_t)(-1) / Size) &&
2144 "Overflow in array type bit size evaluation");
2145 Width = EltInfo.
Width * Size;
2146 Align = EltInfo.
Align;
2150 Width = llvm::alignTo(Width, Align);
2154 case Type::ExtVector:
2155 case Type::Vector: {
2158 Width = VT->isPackedVectorBoolType(*
this)
2159 ? VT->getNumElements()
2160 : EltInfo.
Width * VT->getNumElements();
2162 Width = std::max<unsigned>(8, Width);
2163 Align = std::max<unsigned>(
2164 8,
Target->vectorsAreElementAligned() ? EltInfo.
Width : Width);
2168 if (Align & (Align-1)) {
2169 Align = llvm::bit_ceil(Align);
2170 Width = llvm::alignTo(Width, Align);
2173 uint64_t TargetVectorAlign = Target->getMaxVectorAlign();
2174 if (TargetVectorAlign && TargetVectorAlign < Align)
2175 Align = TargetVectorAlign;
2189 Align = std::min<unsigned>(64, Width);
2193 case Type::ConstantMatrix: {
2195 TypeInfo ElementInfo =
getTypeInfo(MT->getElementType());
2199 Width = ElementInfo.
Width * MT->getNumRows() * MT->getNumColumns();
2200 Align = ElementInfo.
Align;
2206 default: llvm_unreachable(
"Unknown builtin type!");
2207 case BuiltinType::Void:
2212 case BuiltinType::Bool:
2213 Width = Target->getBoolWidth();
2214 Align = Target->getBoolAlign();
2216 case BuiltinType::Char_S:
2217 case BuiltinType::Char_U:
2218 case BuiltinType::UChar:
2219 case BuiltinType::SChar:
2220 case BuiltinType::Char8:
2221 Width = Target->getCharWidth();
2222 Align = Target->getCharAlign();
2224 case BuiltinType::WChar_S:
2225 case BuiltinType::WChar_U:
2226 Width = Target->getWCharWidth();
2227 Align = Target->getWCharAlign();
2229 case BuiltinType::Char16:
2230 Width = Target->getChar16Width();
2231 Align = Target->getChar16Align();
2233 case BuiltinType::Char32:
2234 Width = Target->getChar32Width();
2235 Align = Target->getChar32Align();
2237 case BuiltinType::UShort:
2238 case BuiltinType::Short:
2239 Width = Target->getShortWidth();
2240 Align = Target->getShortAlign();
2242 case BuiltinType::UInt:
2243 case BuiltinType::Int:
2244 Width = Target->getIntWidth();
2245 Align = Target->getIntAlign();
2247 case BuiltinType::ULong:
2248 case BuiltinType::Long:
2249 Width = Target->getLongWidth();
2250 Align = Target->getLongAlign();
2252 case BuiltinType::ULongLong:
2253 case BuiltinType::LongLong:
2254 Width = Target->getLongLongWidth();
2255 Align = Target->getLongLongAlign();
2257 case BuiltinType::Int128:
2258 case BuiltinType::UInt128:
2260 Align = Target->getInt128Align();
2262 case BuiltinType::ShortAccum:
2263 case BuiltinType::UShortAccum:
2264 case BuiltinType::SatShortAccum:
2265 case BuiltinType::SatUShortAccum:
2266 Width = Target->getShortAccumWidth();
2267 Align = Target->getShortAccumAlign();
2269 case BuiltinType::Accum:
2270 case BuiltinType::UAccum:
2271 case BuiltinType::SatAccum:
2272 case BuiltinType::SatUAccum:
2273 Width = Target->getAccumWidth();
2274 Align = Target->getAccumAlign();
2276 case BuiltinType::LongAccum:
2277 case BuiltinType::ULongAccum:
2278 case BuiltinType::SatLongAccum:
2279 case BuiltinType::SatULongAccum:
2280 Width = Target->getLongAccumWidth();
2281 Align = Target->getLongAccumAlign();
2283 case BuiltinType::ShortFract:
2284 case BuiltinType::UShortFract:
2285 case BuiltinType::SatShortFract:
2286 case BuiltinType::SatUShortFract:
2287 Width = Target->getShortFractWidth();
2288 Align = Target->getShortFractAlign();
2290 case BuiltinType::Fract:
2291 case BuiltinType::UFract:
2292 case BuiltinType::SatFract:
2293 case BuiltinType::SatUFract:
2294 Width = Target->getFractWidth();
2295 Align = Target->getFractAlign();
2297 case BuiltinType::LongFract:
2298 case BuiltinType::ULongFract:
2299 case BuiltinType::SatLongFract:
2300 case BuiltinType::SatULongFract:
2301 Width = Target->getLongFractWidth();
2302 Align = Target->getLongFractAlign();
2304 case BuiltinType::BFloat16:
2305 if (Target->hasBFloat16Type()) {
2306 Width = Target->getBFloat16Width();
2307 Align = Target->getBFloat16Align();
2311 AuxTarget->hasBFloat16Type()) {
2312 Width = AuxTarget->getBFloat16Width();
2313 Align = AuxTarget->getBFloat16Align();
2316 case BuiltinType::Float16:
2317 case BuiltinType::Half:
2318 if (Target->hasFloat16Type() || !
getLangOpts().OpenMP ||
2320 Width = Target->getHalfWidth();
2321 Align = Target->getHalfAlign();
2324 "Expected OpenMP device compilation.");
2325 Width = AuxTarget->getHalfWidth();
2326 Align = AuxTarget->getHalfAlign();
2329 case BuiltinType::Float:
2330 Width = Target->getFloatWidth();
2331 Align = Target->getFloatAlign();
2333 case BuiltinType::Double:
2334 Width = Target->getDoubleWidth();
2335 Align = Target->getDoubleAlign();
2337 case BuiltinType::Ibm128:
2338 Width = Target->getIbm128Width();
2339 Align = Target->getIbm128Align();
2341 case BuiltinType::LongDouble:
2343 (Target->getLongDoubleWidth() != AuxTarget->getLongDoubleWidth() ||
2344 Target->getLongDoubleAlign() != AuxTarget->getLongDoubleAlign())) {
2345 Width = AuxTarget->getLongDoubleWidth();
2346 Align = AuxTarget->getLongDoubleAlign();
2348 Width = Target->getLongDoubleWidth();
2349 Align = Target->getLongDoubleAlign();
2352 case BuiltinType::Float128:
2353 if (Target->hasFloat128Type() || !
getLangOpts().OpenMP ||
2355 Width = Target->getFloat128Width();
2356 Align = Target->getFloat128Align();
2359 "Expected OpenMP device compilation.");
2360 Width = AuxTarget->getFloat128Width();
2361 Align = AuxTarget->getFloat128Align();
2364 case BuiltinType::NullPtr:
2369 case BuiltinType::ObjCId:
2370 case BuiltinType::ObjCClass:
2371 case BuiltinType::ObjCSel:
2375 case BuiltinType::OCLSampler:
2376 case BuiltinType::OCLEvent:
2377 case BuiltinType::OCLClkEvent:
2378 case BuiltinType::OCLQueue:
2379 case BuiltinType::OCLReserveID:
2380#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
2381 case BuiltinType::Id:
2382#include "clang/Basic/OpenCLImageTypes.def"
2383#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
2384 case BuiltinType::Id:
2385#include "clang/Basic/OpenCLExtensionTypes.def"
2387 Width = Target->getPointerWidth(AS);
2388 Align = Target->getPointerAlign(AS);
2398#define SVE_VECTOR_TYPE(Name, MangledName, Id, SingletonId) \
2399 case BuiltinType::Id: \
2403#define SVE_PREDICATE_TYPE(Name, MangledName, Id, SingletonId) \
2404 case BuiltinType::Id: \
2408#define SVE_OPAQUE_TYPE(Name, MangledName, Id, SingletonId) \
2409 case BuiltinType::Id: \
2413#define SVE_SCALAR_TYPE(Name, MangledName, Id, SingletonId, Bits) \
2414 case BuiltinType::Id: \
2418#include "clang/Basic/AArch64ACLETypes.def"
2419#define PPC_VECTOR_TYPE(Name, Id, Size) \
2420 case BuiltinType::Id: \
2424#include "clang/Basic/PPCTypes.def"
2425#define RVV_VECTOR_TYPE(Name, Id, SingletonId, ElKind, ElBits, NF, IsSigned, \
2427 case BuiltinType::Id: \
2431#define RVV_PREDICATE_TYPE(Name, Id, SingletonId, ElKind) \
2432 case BuiltinType::Id: \
2436#include "clang/Basic/RISCVVTypes.def"
2437#define WASM_TYPE(Name, Id, SingletonId) \
2438 case BuiltinType::Id: \
2442#include "clang/Basic/WebAssemblyReferenceTypes.def"
2443#define AMDGPU_TYPE(NAME, ID, SINGLETONID, WIDTH, ALIGN) \
2444 case BuiltinType::ID: \
2448#include "clang/Basic/AMDGPUTypes.def"
2449#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
2450#include "clang/Basic/HLSLIntangibleTypes.def"
2456 case Type::ObjCObjectPointer:
2460 case Type::BlockPointer:
2462 Width = Target->getPointerWidth(AS);
2463 Align = Target->getPointerAlign(AS);
2465 case Type::LValueReference:
2466 case Type::RValueReference:
2470 Width = Target->getPointerWidth(AS);
2471 Align = Target->getPointerAlign(AS);
2475 Width = Target->getPointerWidth(AS);
2476 Align = Target->getPointerAlign(AS);
2478 case Type::MemberPointer: {
2480 CXXABI::MemberPointerInfo MPI = ABI->getMemberPointerInfo(MPT);
2485 case Type::Complex: {
2489 Width = EltInfo.
Width * 2;
2490 Align = EltInfo.
Align;
2493 case Type::ObjCObject:
2495 case Type::Adjusted:
2498 case Type::ObjCInterface: {
2500 if (ObjCI->getDecl()->isInvalidDecl()) {
2510 case Type::BitInt: {
2512 Align = Target->getBitIntAlign(EIT->getNumBits());
2513 Width = Target->getBitIntWidth(EIT->getNumBits());
2519 const TagDecl *TD = TT->getDecl()->getDefinitionOrSelf();
2532 Info.
Align = AttrAlign;
2542 AlignRequirement = RD->
hasAttr<AlignedAttr>()
2548 case Type::SubstTemplateTypeParm:
2550 getReplacementType().getTypePtr());
2553 case Type::DeducedTemplateSpecialization: {
2555 assert(!A->getDeducedType().isNull() &&
2556 "cannot request the size of an undeduced or dependent auto type");
2557 return getTypeInfo(A->getDeducedType().getTypePtr());
2563 case Type::MacroQualified:
2567 case Type::ObjCTypeParam:
2573 case Type::Typedef: {
2575 TypeInfo Info =
getTypeInfo(TT->desugar().getTypePtr());
2579 if (
unsigned AttrAlign = TT->getDecl()->getMaxAlignment()) {
2590 case Type::Attributed:
2594 case Type::CountAttributed:
2597 case Type::LateParsedAttr:
2600 case Type::BTFTagAttributed:
2604 case Type::OverflowBehavior:
2608 case Type::HLSLAttributedResource:
2612 case Type::HLSLInlineSpirv: {
2615 Width = ST->getSize() * 8;
2616 Align = ST->getAlignment();
2617 if (Width == 0 && Align == 0) {
2625 case Type::Atomic: {
2634 Width = Target->getCharWidth();
2636 }
else if (Width <= Target->getMaxAtomicPromoteWidth()) {
2642 Width = llvm::bit_ceil(Width);
2645 Align =
static_cast<unsigned>(Width);
2650 case Type::PredefinedSugar:
2659 assert(llvm::isPowerOf2_32(Align) &&
"Alignment must be power of 2");
2660 return TypeInfo(Width, Align, AlignRequirement);
2664 UnadjustedAlignMap::iterator I = MemoizedUnadjustedAlign.find(
T);
2665 if (I != MemoizedUnadjustedAlign.end())
2668 unsigned UnadjustedAlign;
2669 if (
const auto *RT =
T->getAsCanonical<RecordType>()) {
2676 UnadjustedAlign =
getTypeAlign(
T->getUnqualifiedDesugaredType());
2679 MemoizedUnadjustedAlign[
T] = UnadjustedAlign;
2680 return UnadjustedAlign;
2684 unsigned SimdAlign = llvm::OpenMPIRBuilder::getOpenMPDefaultSimdAlign(
2734 unsigned ABIAlign = TI.
Align;
2736 T =
T->getBaseElementTypeUnsafe();
2739 if (
T->isMemberPointerType())
2742 if (!Target->allowsLargerPreferedTypeAlignment())
2745 if (
const auto *RD =
T->getAsRecordDecl()) {
2754 unsigned PreferredAlign =
static_cast<unsigned>(
2756 assert(PreferredAlign >= ABIAlign &&
2757 "PreferredAlign should be at least as large as ABIAlign.");
2758 return PreferredAlign;
2765 T = CT->getElementType().getTypePtr();
2766 if (
const auto *ED =
T->getAsEnumDecl())
2767 T = ED->getIntegerType().getTypePtr();
2768 if (
T->isSpecificBuiltinType(BuiltinType::Double) ||
2769 T->isSpecificBuiltinType(BuiltinType::LongLong) ||
2770 T->isSpecificBuiltinType(BuiltinType::ULongLong) ||
2771 (
T->isSpecificBuiltinType(BuiltinType::LongDouble) &&
2772 Target->defaultsToAIXPowerAlignment()))
2827 for (
unsigned I = 0, N = Path.size(); I != N; ++I) {
2831 std::swap(
Base, Derived);
2851 llvm::append_range(Ivars, OI->
ivars());
2854 for (
const ObjCIvarDecl *Iv = IDecl->all_declared_ivar_begin(); Iv;
2856 Ivars.push_back(Iv);
2864 if (
const auto *OI = dyn_cast<ObjCInterfaceDecl>(CDecl)) {
2867 for (
auto *Proto : OI->all_referenced_protocols()) {
2872 for (
const auto *Cat : OI->visible_categories())
2878 SD = SD->getSuperClass();
2880 }
else if (
const auto *OC = dyn_cast<ObjCCategoryDecl>(CDecl)) {
2881 for (
auto *Proto : OC->protocols()) {
2884 }
else if (
const auto *OP = dyn_cast<ObjCProtocolDecl>(CDecl)) {
2886 if (!Protocols.insert(
2890 for (
auto *Proto : OP->protocols())
2897 bool CheckIfTriviallyCopyable) {
2898 assert(RD->
isUnion() &&
"Must be union type");
2900 Context.getTypeSizeInChars(Context.getCanonicalTagType(RD));
2902 for (
const auto *Field : RD->
fields()) {
2903 if (!Context.hasUniqueObjectRepresentations(Field->getType(),
2904 CheckIfTriviallyCopyable))
2906 CharUnits FieldSize = Context.getTypeSizeInChars(Field->getType());
2907 if (FieldSize != UnionSize)
2916 return Context.getFieldOffset(Field);
2925static std::optional<int64_t>
2927 const RecordDecl *RD,
2928 bool CheckIfTriviallyCopyable);
2930static std::optional<int64_t>
2932 bool CheckIfTriviallyCopyable) {
2933 if (
const auto *RD = Field->getType()->getAsRecordDecl();
2936 CheckIfTriviallyCopyable);
2940 bool IsBitIntType = Field->getType()->isBitIntType();
2941 if (!Field->getType()->isReferenceType() && !IsBitIntType &&
2942 !Context.hasUniqueObjectRepresentations(Field->getType(),
2943 CheckIfTriviallyCopyable))
2944 return std::nullopt;
2946 int64_t FieldSizeInBits =
2947 Context.toBits(Context.getTypeSizeInChars(Field->getType()));
2948 if (Field->isBitField()) {
2951 if (Field->isUnnamedBitField())
2954 int64_t BitfieldSize = Field->getBitWidthValue();
2956 if ((
unsigned)BitfieldSize >
2958 return std::nullopt;
2959 }
else if (BitfieldSize > FieldSizeInBits) {
2960 return std::nullopt;
2962 FieldSizeInBits = BitfieldSize;
2963 }
else if (IsBitIntType && !Context.hasUniqueObjectRepresentations(
2964 Field->getType(), CheckIfTriviallyCopyable)) {
2965 return std::nullopt;
2967 return FieldSizeInBits;
2970static std::optional<int64_t>
2972 bool CheckIfTriviallyCopyable) {
2974 CheckIfTriviallyCopyable);
2977template <
typename RangeT>
2979 const RangeT &Subobjects, int64_t CurOffsetInBits,
2981 bool CheckIfTriviallyCopyable) {
2982 for (
const auto *Subobject : Subobjects) {
2983 std::optional<int64_t> SizeInBits =
2986 return std::nullopt;
2987 if (*SizeInBits != 0) {
2989 if (Offset != CurOffsetInBits)
2990 return std::nullopt;
2991 CurOffsetInBits += *SizeInBits;
2994 return CurOffsetInBits;
2997static std::optional<int64_t>
3000 bool CheckIfTriviallyCopyable) {
3001 assert(!RD->
isUnion() &&
"Must be struct/class type");
3002 const auto &Layout = Context.getASTRecordLayout(RD);
3004 int64_t CurOffsetInBits = 0;
3005 if (
const auto *ClassDecl = dyn_cast<CXXRecordDecl>(RD)) {
3006 if (ClassDecl->isDynamicClass())
3007 return std::nullopt;
3010 for (
const auto &
Base : ClassDecl->bases()) {
3013 Bases.emplace_back(
Base.getType()->getAsCXXRecordDecl());
3017 return Layout.getBaseClassOffset(L) < Layout.getBaseClassOffset(R);
3020 std::optional<int64_t> OffsetAfterBases =
3022 Bases, CurOffsetInBits, Context, Layout, CheckIfTriviallyCopyable);
3023 if (!OffsetAfterBases)
3024 return std::nullopt;
3025 CurOffsetInBits = *OffsetAfterBases;
3028 std::optional<int64_t> OffsetAfterFields =
3030 RD->
fields(), CurOffsetInBits, Context, Layout,
3031 CheckIfTriviallyCopyable);
3032 if (!OffsetAfterFields)
3033 return std::nullopt;
3034 CurOffsetInBits = *OffsetAfterFields;
3036 return CurOffsetInBits;
3040 QualType Ty,
bool CheckIfTriviallyCopyable)
const {
3057 assert(!Ty.
isNull() &&
"Null QualType sent to unique object rep check");
3062 CheckIfTriviallyCopyable);
3065 "hasUniqueObjectRepresentations should not be called with an "
3089 return !ABI->getMemberPointerInfo(MPT).HasPadding;
3092 if (
Record->isInvalidDecl())
3097 CheckIfTriviallyCopyable);
3100 *
this,
Record, CheckIfTriviallyCopyable);
3102 return StructSize && *StructSize ==
static_cast<int64_t
>(
getTypeSize(Ty));
3123 count += Ext->ivar_size();
3128 count += ImplDecl->ivar_size();
3154 llvm::DenseMap<ObjCContainerDecl*, ObjCImplDecl*>::iterator
3155 I = ObjCImpls.find(D);
3156 if (I != ObjCImpls.end())
3164 llvm::DenseMap<ObjCContainerDecl*, ObjCImplDecl*>::iterator
3165 I = ObjCImpls.find(D);
3166 if (I != ObjCImpls.end())
3174 assert(IFaceD && ImplD &&
"Passed null params");
3175 ObjCImpls[IFaceD] = ImplD;
3181 assert(CatD && ImplD &&
"Passed null params");
3182 ObjCImpls[CatD] = ImplD;
3187 return ObjCMethodRedecls.
lookup(MD);
3193 ObjCMethodRedecls[MD] = Redecl;
3198 if (
const auto *ID = dyn_cast<ObjCInterfaceDecl>(ND->
getDeclContext()))
3200 if (
const auto *CD = dyn_cast<ObjCCategoryDecl>(ND->
getDeclContext()))
3201 return CD->getClassInterface();
3202 if (
const auto *IMD = dyn_cast<ObjCImplDecl>(ND->
getDeclContext()))
3203 return IMD->getClassInterface();
3211 assert(VD &&
"Passed null params");
3212 assert(VD->
hasAttr<BlocksAttr>() &&
3213 "getBlockVarCopyInits - not __block var");
3214 auto I = BlockVarCopyInits.find(VD);
3215 if (I != BlockVarCopyInits.end())
3217 return {
nullptr,
false};
3223 assert(VD && CopyExpr &&
"Passed null params");
3224 assert(VD->
hasAttr<BlocksAttr>() &&
3225 "setBlockVarCopyInits - not __block var");
3226 BlockVarCopyInits[VD].setExprAndFlag(CopyExpr,
CanThrow);
3230 unsigned DataSize)
const {
3235 "incorrect data size provided to CreateTypeSourceInfo!");
3252 return getObjCLayout(D);
3257 bool &AnyNonCanonArgs) {
3259 AnyNonCanonArgs |=
C.canonicalizeTemplateArguments(CanonArgs);
3265 bool AnyNonCanonArgs =
false;
3266 for (
auto &Arg : Args) {
3269 AnyNonCanonArgs |= !Arg.structurallyEquals(OrigArg);
3271 return AnyNonCanonArgs;
3279ASTContext::getExtQualType(
const Type *baseType,
Qualifiers quals)
const {
3284 llvm::FoldingSetNodeID ID;
3286 void *insertPos =
nullptr;
3287 if (
ExtQuals *eq = ExtQualNodes.FindNodeOrInsertPos(ID, insertPos)) {
3288 assert(eq->getQualifiers() == quals);
3297 canon = getExtQualType(canonSplit.
Ty, canonSplit.
Quals);
3300 (void) ExtQualNodes.FindNodeOrInsertPos(ID, insertPos);
3303 auto *eq =
new (*
this,
alignof(ExtQuals)) ExtQuals(baseType, canon, quals);
3304 ExtQualNodes.InsertNode(eq, insertPos);
3305 return QualType(eq, fastQuals);
3309 LangAS AddressSpace)
const {
3322 "Type cannot be in multiple addr spaces!");
3325 return getExtQualType(TypeNode, Quals);
3331 if (!
T.hasAddressSpace())
3335 const Type *TypeNode;
3338 if (
T.getTypePtr()->isArrayType()) {
3340 TypeNode =
T.getTypePtr();
3344 while (
T.hasAddressSpace()) {
3345 TypeNode = Quals.
strip(
T);
3349 if (!
QualType(TypeNode, 0).hasAddressSpace())
3353 T =
T.getSingleStepDesugaredType(*
this);
3363 return getExtQualType(TypeNode, Quals);
3371 "Attempted to get vtable pointer discriminator on a monomorphic type");
3374 llvm::raw_svector_ostream Out(Str);
3375 MC->mangleCXXVTable(RD, Out);
3376 return llvm::getPointerAuthStableSipHash(Str);
3402 switch (
T->getTypeClass()) {
3407 case Type::LValueReference:
3412 case Type::RValueReference:
3426 case Type::ObjCObjectPointer:
3427 case Type::BlockPointer:
3436 case Type::VariableArray:
3437 case Type::ConstantArray:
3438 case Type::IncompleteArray:
3439 case Type::ArrayParameter:
3452 case Type::ObjCInterface:
3453 case Type::ObjCObject:
3454 OS <<
"<objc_object>";
3463 QualType UnderlyingType =
T->castAsEnumDecl()->getIntegerType();
3465 Ctx, OS, UnderlyingType.
isNull() ? Ctx.
IntTy : UnderlyingType);
3468 case Type::FunctionNoProto:
3469 case Type::FunctionProto: {
3485 if (
const auto *FPT = dyn_cast<FunctionProtoType>(FuncType)) {
3486 for (
QualType Param : FPT->param_types()) {
3490 if (FPT->isVariadic())
3497 case Type::MemberPointer: {
3501 Ctx, OS,
QualType(MPT->getQualifier().getAsType(), 0));
3505 case Type::ExtVector:
3513 case Type::ConstantMatrix:
3517 case Type::Builtin: {
3519 switch (BTy->getKind()) {
3520#define SIGNED_TYPE(Id, SingletonId) \
3521 case BuiltinType::Id: \
3524#define UNSIGNED_TYPE(Id, SingletonId) \
3525 case BuiltinType::Id: \
3528#define PLACEHOLDER_TYPE(Id, SingletonId) case BuiltinType::Id:
3529#define BUILTIN_TYPE(Id, SingletonId)
3530#include "clang/AST/BuiltinTypes.def"
3531 llvm_unreachable(
"placeholder types should not appear here.");
3533 case BuiltinType::Half:
3536 case BuiltinType::Float:
3539 case BuiltinType::Double:
3542 case BuiltinType::LongDouble:
3545 case BuiltinType::Float16:
3548 case BuiltinType::Float128:
3552 case BuiltinType::Void:
3556 case BuiltinType::ObjCId:
3557 case BuiltinType::ObjCClass:
3558 case BuiltinType::ObjCSel:
3559 case BuiltinType::NullPtr:
3564 case BuiltinType::OCLSampler:
3565 case BuiltinType::OCLEvent:
3566 case BuiltinType::OCLClkEvent:
3567 case BuiltinType::OCLQueue:
3568 case BuiltinType::OCLReserveID:
3569 case BuiltinType::BFloat16:
3570 case BuiltinType::VectorQuad:
3571 case BuiltinType::VectorPair:
3572 case BuiltinType::DMR1024:
3573 case BuiltinType::DMR2048:
3578 case BuiltinType::Ibm128:
3580#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
3581 case BuiltinType::Id: \
3583#include "clang/Basic/OpenCLImageTypes.def"
3584#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
3585 case BuiltinType::Id: \
3587#include "clang/Basic/OpenCLExtensionTypes.def"
3588#define SVE_TYPE(Name, Id, SingletonId) \
3589 case BuiltinType::Id: \
3591#include "clang/Basic/AArch64ACLETypes.def"
3592#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) \
3593 case BuiltinType::Id: \
3595#include "clang/Basic/HLSLIntangibleTypes.def"
3596 case BuiltinType::Dependent:
3597 llvm_unreachable(
"should never get here");
3598#define AMDGPU_TYPE(Name, Id, SingletonId, Width, Align) case BuiltinType::Id:
3599#include "clang/Basic/AMDGPUTypes.def"
3600 case BuiltinType::WasmExternRef:
3601#define RVV_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
3602#include "clang/Basic/RISCVVTypes.def"
3603 llvm_unreachable(
"not yet implemented");
3605 llvm_unreachable(
"should never get here");
3607 case Type::Record: {
3608 const RecordDecl *RD =
T->castAsCanonical<RecordType>()->getDecl();
3628 II = Typedef->getDeclName().getAsIdentifierInfo();
3631 OS <<
"<anonymous_record>";
3637 case Type::HLSLAttributedResource:
3638 case Type::HLSLInlineSpirv:
3639 llvm_unreachable(
"should never get here");
3641 case Type::OverflowBehavior:
3642 llvm_unreachable(
"should never get here");
3644 case Type::DeducedTemplateSpecialization:
3646#define NON_CANONICAL_TYPE(Class, Base) case Type::Class:
3647#define DEPENDENT_TYPE(Class, Base) case Type::Class:
3648#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base) case Type::Class:
3649#define ABSTRACT_TYPE(Class, Base)
3650#define TYPE(Class, Base)
3651#include "clang/AST/TypeNodes.inc"
3652 llvm_unreachable(
"unexpected non-canonical or dependent type!");
3658 assert(!
T->isDependentType() &&
3659 "cannot compute type discriminator of a dependent type");
3661 llvm::raw_svector_ostream Out(Str);
3663 if (
T->isFunctionPointerType() ||
T->isFunctionReferenceType())
3664 T =
T->getPointeeType();
3666 if (
T->isFunctionType()) {
3669 T =
T.getUnqualifiedType();
3690 if (MPT->isMemberFunctionPointer()) {
3696 MPT->getMostRecentCXXRecordDecl());
3700 MC->mangleCanonicalTypeName(
T, Out);
3703 return llvm::getPointerAuthStableSipHash(Str);
3728 "Type cannot have multiple ObjCGCs!");
3731 return getExtQualType(TypeNode, Quals);
3745 QualType WrappedTy,
Expr *CountExpr,
bool CountInBytes,
bool OrNull,
3749 llvm::FoldingSetNodeID ID;
3752 void *InsertPos =
nullptr;
3754 CountAttributedTypes.FindNodeOrInsertPos(ID, InsertPos);
3759 size_t Size = CountAttributedType::totalSizeToAlloc<TypeCoupledDeclRefInfo>(
3760 DependentDecls.size());
3763 OrNull, DependentDecls);
3764 Types.push_back(CATy);
3765 CountAttributedTypes.InsertNode(CATy, InsertPos);
3777 Types.push_back(LPATy);
3785 case Type::Attributed: {
3793 case Type::BTFTagAttributed: {
3794 const auto *BTFT = dyn_cast<BTFTagAttributedType>(Orig);
3799 case Type::OverflowBehavior: {
3800 const auto *OB = dyn_cast<OverflowBehaviorType>(Orig);
3802 adjustType(OB->getUnderlyingType(), Adjust));
3809 case Type::Adjusted: {
3815 case Type::MacroQualified: {
3818 MQT->getMacroIdentifier());
3822 return Adjust(Orig);
3828 if (
T->getExtInfo() == Info)
3832 if (
const auto *FNPT = dyn_cast<FunctionNoProtoType>(
T)) {
3852 FPT->getExtProtoInfo());
3867 L->DeducedReturnType(FD, ResultType);
3878 return getFunctionType(Proto->getReturnType(), Proto->getParamTypes(),
3879 Proto->getExtProtoInfo().withExceptionSpec(ESI));
3895 for (
unsigned i = 0, n = Args.size(); i != n; ++i)
3918 return getFunctionType(Proto->getReturnType(), Proto->param_types(), EPI);
3944 if (TSInfo->getType() != FD->
getType())
3952 "TypeLoc size mismatch from updating exception specification");
3953 TSInfo->overrideType(Updated);
3962 llvm::FoldingSetNodeID ID;
3965 void *InsertPos =
nullptr;
3966 if (
ComplexType *CT = ComplexTypes.FindNodeOrInsertPos(ID, InsertPos))
3972 if (!
T.isCanonical()) {
3976 ComplexType *NewIP = ComplexTypes.FindNodeOrInsertPos(ID, InsertPos);
3977 assert(!NewIP &&
"Shouldn't be in the map!"); (void)NewIP;
3980 Types.push_back(
New);
3981 ComplexTypes.InsertNode(
New, InsertPos);
3990 llvm::FoldingSetNodeID ID;
3993 void *InsertPos =
nullptr;
3994 if (
PointerType *PT = PointerTypes.FindNodeOrInsertPos(ID, InsertPos))
4000 if (!
T.isCanonical()) {
4004 PointerType *NewIP = PointerTypes.FindNodeOrInsertPos(ID, InsertPos);
4005 assert(!NewIP &&
"Shouldn't be in the map!"); (void)NewIP;
4008 Types.push_back(
New);
4009 PointerTypes.InsertNode(
New, InsertPos);
4014 llvm::FoldingSetNodeID ID;
4016 void *InsertPos =
nullptr;
4017 AdjustedType *AT = AdjustedTypes.FindNodeOrInsertPos(ID, InsertPos);
4024 AT = AdjustedTypes.FindNodeOrInsertPos(ID, InsertPos);
4025 assert(!AT &&
"Shouldn't be in the map!");
4029 Types.push_back(AT);
4030 AdjustedTypes.InsertNode(AT, InsertPos);
4035 llvm::FoldingSetNodeID ID;
4037 void *InsertPos =
nullptr;
4038 AdjustedType *AT = AdjustedTypes.FindNodeOrInsertPos(ID, InsertPos);
4045 AT = AdjustedTypes.FindNodeOrInsertPos(ID, InsertPos);
4046 assert(!AT &&
"Shouldn't be in the map!");
4049 Types.push_back(AT);
4050 AdjustedTypes.InsertNode(AT, InsertPos);
4055 assert((
T->isArrayType() ||
T->isFunctionType()) &&
"T does not decay");
4064 if (
T->isArrayType())
4071 if (
T->isFunctionType())
4083 llvm::FoldingSetNodeID ID;
4084 ATy->Profile(ID, *
this, ATy->getElementType(), ATy->getZExtSize(),
4085 ATy->getSizeExpr(), ATy->getSizeModifier(),
4086 ATy->getIndexTypeQualifiers().getAsOpaqueValue());
4087 void *InsertPos =
nullptr;
4089 ArrayParameterTypes.FindNodeOrInsertPos(ID, InsertPos);
4098 AT = ArrayParameterTypes.FindNodeOrInsertPos(ID, InsertPos);
4099 assert(!AT &&
"Shouldn't be in the map!");
4104 Types.push_back(AT);
4105 ArrayParameterTypes.InsertNode(AT, InsertPos);
4112 assert(
T->isFunctionType() &&
"block of function types only");
4115 llvm::FoldingSetNodeID ID;
4118 void *InsertPos =
nullptr;
4120 BlockPointerTypes.FindNodeOrInsertPos(ID, InsertPos))
4126 if (!
T.isCanonical()) {
4131 BlockPointerTypes.FindNodeOrInsertPos(ID, InsertPos);
4132 assert(!NewIP &&
"Shouldn't be in the map!"); (void)NewIP;
4136 Types.push_back(
New);
4137 BlockPointerTypes.InsertNode(
New, InsertPos);
4145 assert((!
T->isPlaceholderType() ||
4146 T->isSpecificPlaceholderType(BuiltinType::UnknownAny)) &&
4147 "Unresolved placeholder type");
4151 llvm::FoldingSetNodeID ID;
4154 void *InsertPos =
nullptr;
4156 LValueReferenceTypes.FindNodeOrInsertPos(ID, InsertPos))
4164 if (!SpelledAsLValue || InnerRef || !
T.isCanonical()) {
4165 QualType PointeeType = (InnerRef ? InnerRef->getPointeeType() :
T);
4170 LValueReferenceTypes.FindNodeOrInsertPos(ID, InsertPos);
4171 assert(!NewIP &&
"Shouldn't be in the map!"); (void)NewIP;
4176 Types.push_back(
New);
4177 LValueReferenceTypes.InsertNode(
New, InsertPos);
4185 assert((!
T->isPlaceholderType() ||
4186 T->isSpecificPlaceholderType(BuiltinType::UnknownAny)) &&
4187 "Unresolved placeholder type");
4191 llvm::FoldingSetNodeID ID;
4194 void *InsertPos =
nullptr;
4196 RValueReferenceTypes.FindNodeOrInsertPos(ID, InsertPos))
4204 if (InnerRef || !
T.isCanonical()) {
4205 QualType PointeeType = (InnerRef ? InnerRef->getPointeeType() :
T);
4210 RValueReferenceTypes.FindNodeOrInsertPos(ID, InsertPos);
4211 assert(!NewIP &&
"Shouldn't be in the map!"); (void)NewIP;
4216 Types.push_back(
New);
4217 RValueReferenceTypes.InsertNode(
New, InsertPos);
4225 assert(Cls &&
"At least one of Qualifier or Cls must be provided");
4228 Cls = Qualifier.getAsRecordDecl();
4232 llvm::FoldingSetNodeID ID;
4235 void *InsertPos =
nullptr;
4237 MemberPointerTypes.FindNodeOrInsertPos(ID, InsertPos))
4242 return Qualifier.getCanonical();
4244 assert(R.isCanonical());
4250 if (!
T.isCanonical() || Qualifier != CanonicalQualifier) {
4256 MemberPointerTypes.FindNodeOrInsertPos(ID, InsertPos);
4257 assert(!NewIP &&
"Shouldn't be in the map!");
4261 Types.push_back(
New);
4262 MemberPointerTypes.InsertNode(
New, InsertPos);
4269 const llvm::APInt &ArySizeIn,
4270 const Expr *SizeExpr,
4272 unsigned IndexTypeQuals)
const {
4275 "Constant array of VLAs is illegal!");
4283 llvm::APInt ArySize(ArySizeIn);
4284 ArySize = ArySize.zextOrTrunc(Target->getMaxPointerWidth());
4286 llvm::FoldingSetNodeID ID;
4288 ASM, IndexTypeQuals);
4290 void *InsertPos =
nullptr;
4292 ConstantArrayTypes.FindNodeOrInsertPos(ID, InsertPos))
4303 ASM, IndexTypeQuals);
4308 ConstantArrayTypes.FindNodeOrInsertPos(ID, InsertPos);
4309 assert(!NewIP &&
"Shouldn't be in the map!"); (void)NewIP;
4312 auto *
New = ConstantArrayType::Create(*
this, EltTy, Canon, ArySize, SizeExpr,
4313 ASM, IndexTypeQuals);
4314 ConstantArrayTypes.InsertNode(
New, InsertPos);
4315 Types.push_back(
New);
4324 if (!
type->isVariablyModifiedType())
return type;
4329 const Type *ty = split.
Ty;
4331#define TYPE(Class, Base)
4332#define ABSTRACT_TYPE(Class, Base)
4333#define NON_CANONICAL_TYPE(Class, Base) case Type::Class:
4334#include "clang/AST/TypeNodes.inc"
4335 llvm_unreachable(
"didn't desugar past all non-canonical types?");
4341 case Type::DependentVector:
4342 case Type::ExtVector:
4343 case Type::DependentSizedExtVector:
4344 case Type::ConstantMatrix:
4345 case Type::DependentSizedMatrix:
4346 case Type::DependentAddressSpace:
4347 case Type::ObjCObject:
4348 case Type::ObjCInterface:
4349 case Type::ObjCObjectPointer:
4352 case Type::UnresolvedUsing:
4353 case Type::TypeOfExpr:
4355 case Type::Decltype:
4356 case Type::UnaryTransform:
4357 case Type::DependentName:
4358 case Type::InjectedClassName:
4359 case Type::TemplateSpecialization:
4360 case Type::TemplateTypeParm:
4361 case Type::SubstTemplateTypeParmPack:
4362 case Type::SubstBuiltinTemplatePack:
4364 case Type::DeducedTemplateSpecialization:
4365 case Type::PackExpansion:
4366 case Type::PackIndexing:
4368 case Type::DependentBitInt:
4369 case Type::ArrayParameter:
4370 case Type::HLSLAttributedResource:
4371 case Type::HLSLInlineSpirv:
4372 case Type::OverflowBehavior:
4373 llvm_unreachable(
"type should never be variably-modified");
4377 case Type::FunctionNoProto:
4378 case Type::FunctionProto:
4379 case Type::BlockPointer:
4380 case Type::MemberPointer:
4393 case Type::LValueReference: {
4397 lv->isSpelledAsLValue());
4401 case Type::RValueReference: {
4408 case Type::Atomic: {
4414 case Type::ConstantArray: {
4420 cat->getSizeModifier(),
4421 cat->getIndexTypeCVRQualifiers());
4425 case Type::DependentSizedArray: {
4429 dat->getSizeModifier(), dat->getIndexTypeCVRQualifiers());
4434 case Type::IncompleteArray: {
4439 iat->getIndexTypeCVRQualifiers());
4444 case Type::VariableArray: {
4449 vat->getIndexTypeCVRQualifiers());
4462 unsigned IndexTypeQuals)
const {
4479 VariableArrayTypes.push_back(
New);
4480 Types.push_back(
New);
4490 unsigned elementTypeQuals)
const {
4493 "Size must be type- or value-dependent!");
4497 void *insertPos =
nullptr;
4498 llvm::FoldingSetNodeID ID;
4500 ID, *
this, numElements ?
QualType(canonElementType.
Ty, 0) : elementType,
4501 ASM, elementTypeQuals, numElements);
4505 DependentSizedArrayTypes.FindNodeOrInsertPos(ID, insertPos);
4517 DependentSizedArrayTypes.InsertNode(newType, insertPos);
4518 Types.push_back(newType);
4526 numElements, ASM, elementTypeQuals);
4527 DependentSizedArrayTypes.InsertNode(canonTy, insertPos);
4528 Types.push_back(canonTy);
4533 canonElementType.
Quals);
4537 if (
QualType(canonElementType.
Ty, 0) == elementType &&
4546 Types.push_back(sugaredType);
4552 unsigned elementTypeQuals)
const {
4553 llvm::FoldingSetNodeID ID;
4556 void *insertPos =
nullptr;
4558 IncompleteArrayTypes.FindNodeOrInsertPos(ID, insertPos))
4570 ASM, elementTypeQuals);
4575 IncompleteArrayTypes.FindNodeOrInsertPos(ID, insertPos);
4576 assert(!existing &&
"Shouldn't be in the map!"); (void) existing;
4582 IncompleteArrayTypes.InsertNode(newType, insertPos);
4583 Types.push_back(newType);
4589#define SVE_INT_ELTTY(BITS, ELTS, SIGNED, NUMVECTORS) \
4590 {getIntTypeForBitwidth(BITS, SIGNED), llvm::ElementCount::getScalable(ELTS), \
4593#define SVE_ELTTY(ELTTY, ELTS, NUMVECTORS) \
4594 {ELTTY, llvm::ElementCount::getScalable(ELTS), NUMVECTORS};
4598 llvm_unreachable(
"Unsupported builtin vector type");
4600#define SVE_VECTOR_TYPE_INT(Name, MangledName, Id, SingletonId, NumEls, \
4601 ElBits, NF, IsSigned) \
4602 case BuiltinType::Id: \
4603 return {getIntTypeForBitwidth(ElBits, IsSigned), \
4604 llvm::ElementCount::getScalable(NumEls), NF};
4605#define SVE_VECTOR_TYPE_FLOAT(Name, MangledName, Id, SingletonId, NumEls, \
4607 case BuiltinType::Id: \
4608 return {ElBits == 16 ? HalfTy : (ElBits == 32 ? FloatTy : DoubleTy), \
4609 llvm::ElementCount::getScalable(NumEls), NF};
4610#define SVE_VECTOR_TYPE_BFLOAT(Name, MangledName, Id, SingletonId, NumEls, \
4612 case BuiltinType::Id: \
4613 return {BFloat16Ty, llvm::ElementCount::getScalable(NumEls), NF};
4614#define SVE_VECTOR_TYPE_MFLOAT(Name, MangledName, Id, SingletonId, NumEls, \
4616 case BuiltinType::Id: \
4617 return {MFloat8Ty, llvm::ElementCount::getScalable(NumEls), NF};
4618#define SVE_PREDICATE_TYPE_ALL(Name, MangledName, Id, SingletonId, NumEls, NF) \
4619 case BuiltinType::Id: \
4620 return {BoolTy, llvm::ElementCount::getScalable(NumEls), NF};
4621#include "clang/Basic/AArch64ACLETypes.def"
4623#define RVV_VECTOR_TYPE_INT(Name, Id, SingletonId, NumEls, ElBits, NF, \
4625 case BuiltinType::Id: \
4626 return {getIntTypeForBitwidth(ElBits, IsSigned), \
4627 llvm::ElementCount::getScalable(NumEls), NF};
4628#define RVV_VECTOR_TYPE_FLOAT(Name, Id, SingletonId, NumEls, ElBits, NF) \
4629 case BuiltinType::Id: \
4630 return {ElBits == 16 ? Float16Ty : (ElBits == 32 ? FloatTy : DoubleTy), \
4631 llvm::ElementCount::getScalable(NumEls), NF};
4632#define RVV_VECTOR_TYPE_BFLOAT(Name, Id, SingletonId, NumEls, ElBits, NF) \
4633 case BuiltinType::Id: \
4634 return {BFloat16Ty, llvm::ElementCount::getScalable(NumEls), NF};
4635#define RVV_PREDICATE_TYPE(Name, Id, SingletonId, NumEls) \
4636 case BuiltinType::Id: \
4637 return {BoolTy, llvm::ElementCount::getScalable(NumEls), 1};
4638#include "clang/Basic/RISCVVTypes.def"
4645 if (Target->getTriple().isWasm() && Target->hasFeature(
"reference-types")) {
4646#define WASM_REF_TYPE(Name, MangledName, Id, SingletonId, AS) \
4647 if (BuiltinType::Id == BuiltinType::WasmExternRef) \
4649#include "clang/Basic/WebAssemblyReferenceTypes.def"
4652 "shouldn't try to generate type externref outside WebAssembly target");
4659 unsigned NumFields)
const {
4661 if (
auto It = ScalableVecTyMap.find(K); It != ScalableVecTyMap.end())
4664 if (Target->hasAArch64ACLETypes()) {
4667#define SVE_VECTOR_TYPE_INT(Name, MangledName, Id, SingletonId, NumEls, \
4668 ElBits, NF, IsSigned) \
4669 if (EltTy->hasIntegerRepresentation() && !EltTy->isBooleanType() && \
4670 EltTy->hasSignedIntegerRepresentation() == IsSigned && \
4671 EltTySize == ElBits && NumElts == (NumEls * NF) && NumFields == 1) { \
4672 return ScalableVecTyMap[K] = SingletonId; \
4674#define SVE_VECTOR_TYPE_FLOAT(Name, MangledName, Id, SingletonId, NumEls, \
4676 if (EltTy->hasFloatingRepresentation() && !EltTy->isBFloat16Type() && \
4677 EltTySize == ElBits && NumElts == (NumEls * NF) && NumFields == 1) { \
4678 return ScalableVecTyMap[K] = SingletonId; \
4680#define SVE_VECTOR_TYPE_BFLOAT(Name, MangledName, Id, SingletonId, NumEls, \
4682 if (EltTy->hasFloatingRepresentation() && EltTy->isBFloat16Type() && \
4683 EltTySize == ElBits && NumElts == (NumEls * NF) && NumFields == 1) { \
4684 return ScalableVecTyMap[K] = SingletonId; \
4686#define SVE_VECTOR_TYPE_MFLOAT(Name, MangledName, Id, SingletonId, NumEls, \
4688 if (EltTy->isMFloat8Type() && EltTySize == ElBits && \
4689 NumElts == (NumEls * NF) && NumFields == 1) { \
4690 return ScalableVecTyMap[K] = SingletonId; \
4692#define SVE_PREDICATE_TYPE_ALL(Name, MangledName, Id, SingletonId, NumEls, NF) \
4693 if (EltTy->isBooleanType() && NumElts == (NumEls * NF) && NumFields == 1) \
4694 return ScalableVecTyMap[K] = SingletonId;
4695#include "clang/Basic/AArch64ACLETypes.def"
4696 }
else if (Target->hasRISCVVTypes()) {
4698#define RVV_VECTOR_TYPE(Name, Id, SingletonId, NumEls, ElBits, NF, IsSigned, \
4700 if (!EltTy->isBooleanType() && \
4701 ((EltTy->hasIntegerRepresentation() && \
4702 EltTy->hasSignedIntegerRepresentation() == IsSigned) || \
4703 (EltTy->hasFloatingRepresentation() && !EltTy->isBFloat16Type() && \
4705 (EltTy->hasFloatingRepresentation() && EltTy->isBFloat16Type() && \
4706 IsBF && !IsFP)) && \
4707 EltTySize == ElBits && NumElts == NumEls && NumFields == NF) \
4708 return ScalableVecTyMap[K] = SingletonId;
4709#define RVV_PREDICATE_TYPE(Name, Id, SingletonId, NumEls) \
4710 if (EltTy->isBooleanType() && NumElts == NumEls) \
4711 return ScalableVecTyMap[K] = SingletonId;
4712#include "clang/Basic/RISCVVTypes.def"
4727 llvm::FoldingSetNodeID ID;
4730 void *InsertPos =
nullptr;
4731 if (
VectorType *VTP = VectorTypes.FindNodeOrInsertPos(ID, InsertPos))
4741 VectorType *NewIP = VectorTypes.FindNodeOrInsertPos(ID, InsertPos);
4742 assert(!NewIP &&
"Shouldn't be in the map!"); (void)NewIP;
4745 VectorType(vecType, NumElts, Canonical, VecKind);
4746 VectorTypes.InsertNode(
New, InsertPos);
4747 Types.push_back(
New);
4754 llvm::FoldingSetNodeID ID;
4757 void *InsertPos =
nullptr;
4759 DependentVectorTypes.FindNodeOrInsertPos(ID, InsertPos);
4764 VecType,
QualType(Canon, 0), SizeExpr, AttrLoc, VecKind);
4767 if (CanonVecTy == VecType) {
4772 DependentVectorTypes.FindNodeOrInsertPos(ID, InsertPos);
4773 assert(!CanonCheck &&
4774 "Dependent-sized vector_size canonical type broken");
4776 DependentVectorTypes.InsertNode(
New, InsertPos);
4785 Types.push_back(
New);
4792 unsigned NumElts)
const {
4799 llvm::FoldingSetNodeID ID;
4802 void *InsertPos =
nullptr;
4803 if (
VectorType *VTP = VectorTypes.FindNodeOrInsertPos(ID, InsertPos))
4813 VectorType *NewIP = VectorTypes.FindNodeOrInsertPos(ID, InsertPos);
4814 assert(!NewIP &&
"Shouldn't be in the map!"); (void)NewIP;
4818 VectorTypes.InsertNode(
New, InsertPos);
4819 Types.push_back(
New);
4827 llvm::FoldingSetNodeID ID;
4831 void *InsertPos =
nullptr;
4833 = DependentSizedExtVectorTypes.FindNodeOrInsertPos(ID, InsertPos);
4843 if (CanonVecTy == vecType) {
4848 = DependentSizedExtVectorTypes.FindNodeOrInsertPos(ID, InsertPos);
4849 assert(!CanonCheck &&
"Dependent-sized ext_vector canonical type broken");
4851 DependentSizedExtVectorTypes.InsertNode(
New, InsertPos);
4860 Types.push_back(
New);
4865 unsigned NumColumns)
const {
4866 llvm::FoldingSetNodeID ID;
4868 Type::ConstantMatrix);
4871 "need a valid element type");
4872 assert(NumRows > 0 && NumRows <= LangOpts.MaxMatrixDimension &&
4873 NumColumns > 0 && NumColumns <= LangOpts.MaxMatrixDimension &&
4874 "need valid matrix dimensions");
4875 void *InsertPos =
nullptr;
4885 assert(!NewIP &&
"Matrix type shouldn't already exist in the map");
4891 MatrixTypes.InsertNode(
New, InsertPos);
4892 Types.push_back(
New);
4901 llvm::FoldingSetNodeID ID;
4905 void *InsertPos =
nullptr;
4907 DependentSizedMatrixTypes.FindNodeOrInsertPos(ID, InsertPos);
4912 ColumnExpr, AttrLoc);
4915 DependentSizedMatrixTypes.FindNodeOrInsertPos(ID, InsertPos);
4916 assert(!CanonCheck &&
"Dependent-sized matrix canonical type broken");
4918 DependentSizedMatrixTypes.InsertNode(Canon, InsertPos);
4919 Types.push_back(Canon);
4932 ColumnExpr, AttrLoc);
4933 Types.push_back(
New);
4938 Expr *AddrSpaceExpr,
4944 void *insertPos =
nullptr;
4945 llvm::FoldingSetNodeID ID;
4950 DependentAddressSpaceTypes.FindNodeOrInsertPos(ID, insertPos);
4956 DependentAddressSpaceTypes.InsertNode(canonTy, insertPos);
4957 Types.push_back(canonTy);
4960 if (canonPointeeType == PointeeType &&
4966 AddrSpaceExpr, AttrLoc);
4967 Types.push_back(sugaredType);
4973 return T.isCanonical() &&
4991 llvm::FoldingSetNodeID ID;
4994 void *InsertPos =
nullptr;
4996 FunctionNoProtoTypes.FindNodeOrInsertPos(ID, InsertPos))
5006 FunctionNoProtoTypes.FindNodeOrInsertPos(ID, InsertPos);
5007 assert(!NewIP &&
"Shouldn't be in the map!"); (void)NewIP;
5012 Types.push_back(
New);
5013 FunctionNoProtoTypes.InsertNode(
New, InsertPos);
5029 return CanResultType;
5036 if (!NoexceptInType)
5053 bool AnyPackExpansions =
false;
5057 if (ET->
getAs<PackExpansionType>())
5058 AnyPackExpansions =
true;
5060 return AnyPackExpansions;
5066QualType ASTContext::getFunctionTypeInternal(
5067 QualType ResultTy, ArrayRef<QualType> ArgArray,
5068 const FunctionProtoType::ExtProtoInfo &EPI,
bool OnlyWantCanonical)
const {
5069 size_t NumArgs = ArgArray.size();
5073 llvm::FoldingSetNodeID
ID;
5078 bool Unique =
false;
5080 void *InsertPos =
nullptr;
5081 if (FunctionProtoType *FPT =
5082 FunctionProtoTypes.FindNodeOrInsertPos(ID, InsertPos)) {
5083 QualType Existing = QualType(FPT, 0);
5102 bool IsCanonicalExceptionSpec =
5106 bool isCanonical = !Unique && IsCanonicalExceptionSpec &&
5108 for (
unsigned i = 0; i != NumArgs && isCanonical; ++i)
5109 if (!ArgArray[i].isCanonicalAsParam())
5110 isCanonical =
false;
5112 if (OnlyWantCanonical)
5113 assert(isCanonical &&
5114 "given non-canonical parameters constructing canonical type");
5119 if (!isCanonical && Canonical.
isNull()) {
5120 SmallVector<QualType, 16> CanonicalArgs;
5121 CanonicalArgs.reserve(NumArgs);
5122 for (
unsigned i = 0; i != NumArgs; ++i)
5125 llvm::SmallVector<QualType, 8> ExceptionTypeStorage;
5126 FunctionProtoType::ExtProtoInfo CanonicalEPI = EPI;
5129 if (IsCanonicalExceptionSpec) {
5131 }
else if (NoexceptInType) {
5144 bool AnyPacks =
false;
5146 if (ET->
getAs<PackExpansionType>())
5167 llvm_unreachable(
"dependent noexcept is already canonical");
5170 CanonicalEPI.
ExceptionSpec = FunctionProtoType::ExceptionSpecInfo();
5176 getFunctionTypeInternal(CanResultTy, CanonicalArgs, CanonicalEPI,
true);
5179 FunctionProtoType *NewIP =
5180 FunctionProtoTypes.FindNodeOrInsertPos(ID, InsertPos);
5181 assert(!NewIP &&
"Shouldn't be in the map!"); (void)NewIP;
5186 auto ESH = FunctionProtoType::getExceptionSpecSize(
5188 size_t Size = FunctionProtoType::totalSizeToAlloc<
5189 QualType, SourceLocation, FunctionType::FunctionTypeExtraBitfields,
5190 FunctionType::FunctionTypeExtraAttributeInfo,
5191 FunctionType::FunctionTypeArmAttributes, FunctionType::ExceptionType,
5192 Expr *, FunctionDecl *, FunctionProtoType::ExtParameterInfo, Qualifiers,
5193 FunctionEffect, EffectConditionExpr>(
5197 ESH.NumExprPtr, ESH.NumFunctionDeclPtr,
5202 auto *FTP = (FunctionProtoType *)
Allocate(Size,
alignof(FunctionProtoType));
5203 FunctionProtoType::ExtProtoInfo newEPI = EPI;
5204 new (FTP) FunctionProtoType(ResultTy, ArgArray, Canonical, newEPI);
5205 Types.push_back(FTP);
5207 FunctionProtoTypes.InsertNode(FTP, InsertPos);
5209 AnyFunctionEffects =
true;
5210 return QualType(FTP, 0);
5213QualType ASTContext::getPipeType(QualType
T,
bool ReadOnly)
const {
5214 llvm::FoldingSetNodeID
ID;
5217 void *InsertPos =
nullptr;
5218 if (PipeType *PT = PipeTypes.FindNodeOrInsertPos(ID, InsertPos))
5219 return QualType(PT, 0);
5224 if (!
T.isCanonical()) {
5228 PipeType *NewIP = PipeTypes.FindNodeOrInsertPos(ID, InsertPos);
5229 assert(!NewIP &&
"Shouldn't be in the map!");
5232 auto *
New =
new (*
this,
alignof(PipeType)) PipeType(
T, Canonical, ReadOnly);
5233 Types.push_back(
New);
5234 PipeTypes.InsertNode(
New, InsertPos);
5235 return QualType(
New, 0);
5245 return getPipeType(
T,
true);
5249 return getPipeType(
T,
false);
5253 llvm::FoldingSetNodeID ID;
5256 void *InsertPos =
nullptr;
5257 if (
BitIntType *EIT = BitIntTypes.FindNodeOrInsertPos(ID, InsertPos))
5261 BitIntTypes.InsertNode(
New, InsertPos);
5262 Types.push_back(
New);
5267 Expr *NumBitsExpr)
const {
5269 llvm::FoldingSetNodeID ID;
5272 void *InsertPos =
nullptr;
5274 DependentBitIntTypes.FindNodeOrInsertPos(ID, InsertPos))
5279 DependentBitIntTypes.InsertNode(
New, InsertPos);
5281 Types.push_back(
New);
5289 if (
auto *Target = PredefinedSugarTypes[llvm::to_underlying(KD)];
5301 return Ctx.getFromTargetType(Ctx.Target->
getSizeType());
5302 case Kind::SignedSizeT:
5304 case Kind::PtrdiffT:
5307 llvm_unreachable(
"unexpected kind");
5312 Types.push_back(
New);
5313 PredefinedSugarTypes[llvm::to_underlying(KD)] =
New;
5320 if (
auto *Tag = dyn_cast<TagDecl>(
Decl))
5323 if (
auto *
Typedef = dyn_cast<TypedefNameDecl>(
Decl))
5325 if (
auto *UD = dyn_cast<UnresolvedUsingTypenameDecl>(
Decl))
5334 if (
auto *Tag = dyn_cast<TagDecl>(TD))
5336 if (
auto *TN = dyn_cast<TypedefNameDecl>(TD))
5338 if (
const auto *UD = dyn_cast<UnresolvedUsingTypenameDecl>(TD))
5340 assert(TD->TypeForDecl);
5345 if (
const auto *TD = dyn_cast<TagDecl>(
Decl))
5347 if (
const auto *TD = dyn_cast<TypedefNameDecl>(
Decl);
5348 isa_and_nonnull<TypedefDecl, TypeAliasDecl>(TD))
5351 if (
const auto *Using = dyn_cast<UnresolvedUsingTypenameDecl>(
Decl))
5354 assert(
Decl->TypeForDecl);
5364 std::optional<bool> TypeMatchesDeclOrNone)
const {
5365 if (!TypeMatchesDeclOrNone) {
5366 QualType DeclUnderlyingType =
Decl->getUnderlyingType();
5367 assert(!DeclUnderlyingType.
isNull());
5368 if (UnderlyingType.
isNull())
5369 UnderlyingType = DeclUnderlyingType;
5371 assert(
hasSameType(UnderlyingType, DeclUnderlyingType));
5372 TypeMatchesDeclOrNone = UnderlyingType == DeclUnderlyingType;
5376 assert(!UnderlyingType.
isNull());
5380 *TypeMatchesDeclOrNone) {
5381 if (
Decl->TypeForDecl)
5386 !*TypeMatchesDeclOrNone);
5388 Types.push_back(NewType);
5389 Decl->TypeForDecl = NewType;
5393 llvm::FoldingSetNodeID ID;
5395 *TypeMatchesDeclOrNone ?
QualType() : UnderlyingType);
5397 void *InsertPos =
nullptr;
5399 TypedefTypes.FindNodeOrInsertPos(ID, InsertPos))
5400 return QualType(Placeholder->getType(), 0);
5405 1, !!Qualifier, !*TypeMatchesDeclOrNone),
5409 UnderlyingType, !*TypeMatchesDeclOrNone);
5410 auto *Placeholder =
new (NewType->getFoldingSetPlaceholder())
5412 TypedefTypes.InsertNode(Placeholder, InsertPos);
5413 Types.push_back(NewType);
5422 if (UnderlyingType.
isNull()) {
5430 llvm::FoldingSetNodeID ID;
5433 void *InsertPos =
nullptr;
5434 if (
const UsingType *
T = UsingTypes.FindNodeOrInsertPos(ID, InsertPos))
5444 Allocate(UsingType::totalSizeToAlloc<NestedNameSpecifier>(!!Qualifier),
5448 UsingTypes.InsertNode(
T, InsertPos);
5454 const TagDecl *TD,
bool OwnsTag,
5456 const Type *CanonicalType,
5457 bool WithFoldingSetNode)
const {
5458 auto [TC, Size] = [&] {
5461 static_assert(
alignof(EnumType) ==
alignof(TagType));
5462 return std::make_tuple(Type::Enum,
sizeof(EnumType));
5463 case Decl::ClassTemplatePartialSpecialization:
5464 case Decl::ClassTemplateSpecialization:
5465 case Decl::CXXRecord:
5466 static_assert(
alignof(RecordType) ==
alignof(TagType));
5467 static_assert(
alignof(InjectedClassNameType) ==
alignof(TagType));
5469 return std::make_tuple(Type::InjectedClassName,
5470 sizeof(InjectedClassNameType));
5473 return std::make_tuple(Type::Record,
sizeof(RecordType));
5475 llvm_unreachable(
"unexpected decl kind");
5485 if (WithFoldingSetNode) {
5493 sizeof(TagTypeFoldingSetPlaceholder) +
5494 TagTypeFoldingSetPlaceholder::getOffset() + Size,
5495 std::max(
alignof(TagTypeFoldingSetPlaceholder),
alignof(TagType)));
5496 auto *
T =
new (Mem) TagTypeFoldingSetPlaceholder();
5497 Mem =
T->getTagType();
5499 Mem =
Allocate(Size,
alignof(TagType));
5502 auto *
T = [&, TC = TC]() -> TagType * {
5506 auto *
T =
new (Mem) EnumType(TC,
Keyword, Qualifier, TD, OwnsTag,
5507 IsInjected, CanonicalType);
5508 assert(
reinterpret_cast<void *
>(
T) ==
5509 reinterpret_cast<void *
>(
static_cast<TagType *
>(
T)) &&
5510 "TagType must be the first base of EnumType");
5513 case Type::Record: {
5515 auto *
T =
new (Mem) RecordType(TC,
Keyword, Qualifier, TD, OwnsTag,
5516 IsInjected, CanonicalType);
5517 assert(
reinterpret_cast<void *
>(
T) ==
5518 reinterpret_cast<void *
>(
static_cast<TagType *
>(
T)) &&
5519 "TagType must be the first base of RecordType");
5522 case Type::InjectedClassName: {
5523 auto *
T =
new (Mem) InjectedClassNameType(
Keyword, Qualifier, TD,
5524 IsInjected, CanonicalType);
5525 assert(
reinterpret_cast<void *
>(
T) ==
5526 reinterpret_cast<void *
>(
static_cast<TagType *
>(
T)) &&
5527 "TagType must be the first base of InjectedClassNameType");
5531 llvm_unreachable(
"unexpected type class");
5534 assert(
T->getKeyword() ==
Keyword);
5535 assert(
T->getQualifier() == Qualifier);
5536 assert(
T->getDecl() == TD);
5537 assert(
T->isInjected() == IsInjected);
5538 assert(
T->isTagOwned() == OwnsTag);
5547 if (
const auto *RD = dyn_cast<CXXRecordDecl>(TD);
5548 RD && RD->isInjectedClassName())
5555 if (TD->TypeForDecl)
5556 return TD->TypeForDecl->getCanonicalTypeUnqualified();
5558 const Type *CanonicalType = getTagTypeInternal(
5561 false,
false,
nullptr,
5563 TD->TypeForDecl = CanonicalType;
5569 const TagDecl *TD,
bool OwnsTag)
const {
5572 bool IsInjected = TD != NonInjectedTD;
5579 if (
Keyword == PreferredKeyword && !Qualifier && !OwnsTag) {
5580 if (
const Type *
T = TD->TypeForDecl;
T && !
T->isCanonicalUnqualified())
5586 std::nullopt, NonInjectedTD,
5587 false, IsInjected, CanonicalType,
5589 TD->TypeForDecl =
T;
5593 llvm::FoldingSetNodeID ID;
5594 TagTypeFoldingSetPlaceholder::Profile(ID,
Keyword, Qualifier, NonInjectedTD,
5595 OwnsTag, IsInjected);
5597 void *InsertPos =
nullptr;
5598 if (TagTypeFoldingSetPlaceholder *
T =
5599 TagTypes.FindNodeOrInsertPos(ID, InsertPos))
5604 getTagTypeInternal(
Keyword, Qualifier, NonInjectedTD, OwnsTag, IsInjected,
5605 CanonicalType,
true);
5606 TagTypes.InsertNode(TagTypeFoldingSetPlaceholder::fromTagType(
T), InsertPos);
5611 unsigned NumPositiveBits,
5614 unsigned IntWidth = Target->getIntWidth();
5615 unsigned CharWidth = Target->getCharWidth();
5616 unsigned ShortWidth = Target->getShortWidth();
5617 bool EnumTooLarge =
false;
5619 if (NumNegativeBits) {
5623 if (IsPacked && NumNegativeBits <= CharWidth &&
5624 NumPositiveBits < CharWidth) {
5626 BestWidth = CharWidth;
5627 }
else if (IsPacked && NumNegativeBits <= ShortWidth &&
5628 NumPositiveBits < ShortWidth) {
5630 BestWidth = ShortWidth;
5631 }
else if (NumNegativeBits <= IntWidth && NumPositiveBits < IntWidth) {
5633 BestWidth = IntWidth;
5635 BestWidth = Target->getLongWidth();
5637 if (NumNegativeBits <= BestWidth && NumPositiveBits < BestWidth) {
5640 BestWidth = Target->getLongLongWidth();
5642 if (NumNegativeBits > BestWidth || NumPositiveBits >= BestWidth)
5643 EnumTooLarge =
true;
5647 BestPromotionType = (BestWidth <= IntWidth ?
IntTy : BestType);
5652 if (IsPacked && NumPositiveBits <= CharWidth) {
5654 BestPromotionType =
IntTy;
5655 BestWidth = CharWidth;
5656 }
else if (IsPacked && NumPositiveBits <= ShortWidth) {
5658 BestPromotionType =
IntTy;
5659 BestWidth = ShortWidth;
5660 }
else if (NumPositiveBits <= IntWidth) {
5662 BestWidth = IntWidth;
5663 BestPromotionType = (NumPositiveBits == BestWidth || !LangOpts.CPlusPlus)
5666 }
else if (NumPositiveBits <= (BestWidth = Target->getLongWidth())) {
5668 BestPromotionType = (NumPositiveBits == BestWidth || !LangOpts.CPlusPlus)
5672 BestWidth = Target->getLongLongWidth();
5673 if (NumPositiveBits > BestWidth) {
5678 EnumTooLarge =
true;
5681 BestPromotionType = (NumPositiveBits == BestWidth || !LangOpts.CPlusPlus)
5686 return EnumTooLarge;
5690 assert((
T->isIntegralType(*
this) ||
T->isEnumeralType()) &&
5691 "Integral type required!");
5694 if (
Value.isUnsigned() ||
Value.isNonNegative()) {
5695 if (
T->isSignedIntegerOrEnumerationType())
5697 return Value.getActiveBits() <= BitWidth;
5699 return Value.getSignificantBits() <= BitWidth;
5705 const Type *CanonicalType)
const {
5707 UnresolvedUsingType::totalSizeToAlloc<
5709 !!InsertPos, !!Qualifier),
5713 auto *Placeholder =
new (
T->getFoldingSetPlaceholder())
5715 TypedefTypes.InsertNode(Placeholder, InsertPos);
5725 return D->TypeForDecl->getCanonicalTypeUnqualified();
5727 const Type *CanonicalType = getUnresolvedUsingTypeInternal(
5731 D->TypeForDecl = CanonicalType;
5740 if (
const Type *
T = D->TypeForDecl;
T && !
T->isCanonicalUnqualified())
5747 nullptr, CanonicalType);
5752 llvm::FoldingSetNodeID ID;
5755 void *InsertPos =
nullptr;
5757 UnresolvedUsingTypes.FindNodeOrInsertPos(ID, InsertPos))
5758 return QualType(Placeholder->getType(), 0);
5762 const Type *
T = getUnresolvedUsingTypeInternal(
Keyword, Qualifier, D,
5763 InsertPos, CanonicalType);
5771 llvm::FoldingSetNodeID id;
5772 AttributedType::Profile(
id, *
this, attrKind, modifiedType, equivalentType,
5775 void *insertPos =
nullptr;
5776 AttributedType *
type = AttributedTypes.FindNodeOrInsertPos(
id, insertPos);
5779 assert(!
attr ||
attr->getKind() == attrKind);
5782 type =
new (*
this,
alignof(AttributedType))
5783 AttributedType(canon, attrKind,
attr, modifiedType, equivalentType);
5785 Types.push_back(
type);
5786 AttributedTypes.InsertNode(
type, insertPos);
5799 switch (nullability) {
5815 llvm_unreachable(
"Unknown nullability kind");
5820 llvm::FoldingSetNodeID ID;
5821 BTFTagAttributedType::Profile(ID, Wrapped, BTFAttr);
5823 void *InsertPos =
nullptr;
5824 BTFTagAttributedType *Ty =
5825 BTFTagAttributedTypes.FindNodeOrInsertPos(ID, InsertPos);
5830 Ty =
new (*
this,
alignof(BTFTagAttributedType))
5831 BTFTagAttributedType(Canon, Wrapped, BTFAttr);
5833 Types.push_back(Ty);
5834 BTFTagAttributedTypes.InsertNode(Ty, InsertPos);
5842 StringRef IdentName = II->
getName();
5843 OverflowBehaviorType::OverflowBehaviorKind Kind;
5844 if (IdentName ==
"wrap") {
5845 Kind = OverflowBehaviorType::OverflowBehaviorKind::Wrap;
5846 }
else if (IdentName ==
"trap") {
5847 Kind = OverflowBehaviorType::OverflowBehaviorKind::Trap;
5856 OverflowBehaviorType::OverflowBehaviorKind Kind,
5859 "Cannot have underlying types that are themselves OBTs");
5860 llvm::FoldingSetNodeID ID;
5861 OverflowBehaviorType::Profile(ID, Underlying, Kind);
5862 void *InsertPos =
nullptr;
5864 if (OverflowBehaviorType *OBT =
5865 OverflowBehaviorTypes.FindNodeOrInsertPos(ID, InsertPos)) {
5874 assert(!OverflowBehaviorTypes.FindNodeOrInsertPos(ID, InsertPos) &&
5875 "Shouldn't be in the map");
5878 OverflowBehaviorType *Ty =
new (*
this,
alignof(OverflowBehaviorType))
5879 OverflowBehaviorType(Canonical, Underlying, Kind);
5881 Types.push_back(Ty);
5882 OverflowBehaviorTypes.InsertNode(Ty, InsertPos);
5888 const HLSLAttributedResourceType::Attributes &Attrs) {
5890 llvm::FoldingSetNodeID ID;
5891 HLSLAttributedResourceType::Profile(ID, Wrapped, Contained, Attrs);
5893 void *InsertPos =
nullptr;
5894 HLSLAttributedResourceType *Ty =
5895 HLSLAttributedResourceTypes.FindNodeOrInsertPos(ID, InsertPos);
5899 Ty =
new (*
this,
alignof(HLSLAttributedResourceType))
5900 HLSLAttributedResourceType(Wrapped, Contained, Attrs);
5902 Types.push_back(Ty);
5903 HLSLAttributedResourceTypes.InsertNode(Ty, InsertPos);
5911 llvm::FoldingSetNodeID ID;
5912 HLSLInlineSpirvType::Profile(ID, Opcode, Size, Alignment, Operands);
5914 void *InsertPos =
nullptr;
5915 HLSLInlineSpirvType *Ty =
5916 HLSLInlineSpirvTypes.FindNodeOrInsertPos(ID, InsertPos);
5921 HLSLInlineSpirvType::totalSizeToAlloc<SpirvOperand>(Operands.size()),
5922 alignof(HLSLInlineSpirvType));
5924 Ty =
new (Mem) HLSLInlineSpirvType(Opcode, Size, Alignment, Operands);
5926 Types.push_back(Ty);
5927 HLSLInlineSpirvTypes.InsertNode(Ty, InsertPos);
5934 Decl *AssociatedDecl,
5938 llvm::FoldingSetNodeID ID;
5939 SubstTemplateTypeParmType::Profile(ID, Replacement, AssociatedDecl, Index,
5941 void *InsertPos =
nullptr;
5942 SubstTemplateTypeParmType *SubstParm =
5943 SubstTemplateTypeParmTypes.FindNodeOrInsertPos(ID, InsertPos);
5946 void *Mem =
Allocate(SubstTemplateTypeParmType::totalSizeToAlloc<QualType>(
5947 !Replacement.isCanonical()),
5948 alignof(SubstTemplateTypeParmType));
5949 SubstParm =
new (Mem) SubstTemplateTypeParmType(Replacement, AssociatedDecl,
5951 Types.push_back(SubstParm);
5952 SubstTemplateTypeParmTypes.InsertNode(SubstParm, InsertPos);
5960 unsigned Index,
bool Final,
5967 llvm::FoldingSetNodeID ID;
5968 SubstTemplateTypeParmPackType::Profile(ID, AssociatedDecl, Index, Final,
5970 void *InsertPos =
nullptr;
5971 if (SubstTemplateTypeParmPackType *SubstParm =
5972 SubstTemplateTypeParmPackTypes.FindNodeOrInsertPos(ID, InsertPos))
5982 [[maybe_unused]]
const auto *Nothing =
5983 SubstTemplateTypeParmPackTypes.FindNodeOrInsertPos(ID, InsertPos);
5988 auto *SubstParm =
new (*
this,
alignof(SubstTemplateTypeParmPackType))
5989 SubstTemplateTypeParmPackType(Canon, AssociatedDecl, Index, Final,
5991 Types.push_back(SubstParm);
5992 SubstTemplateTypeParmPackTypes.InsertNode(SubstParm, InsertPos);
6000 return P.getKind() == TemplateArgument::Type;
6002 "Pack contains a non-type");
6004 llvm::FoldingSetNodeID ID;
6005 SubstBuiltinTemplatePackType::Profile(ID, ArgPack);
6007 void *InsertPos =
nullptr;
6009 SubstBuiltinTemplatePackTypes.FindNodeOrInsertPos(ID, InsertPos))
6018 [[maybe_unused]]
const auto *Nothing =
6019 SubstBuiltinTemplatePackTypes.FindNodeOrInsertPos(ID, InsertPos);
6023 auto *PackType =
new (*
this,
alignof(SubstBuiltinTemplatePackType))
6024 SubstBuiltinTemplatePackType(Canon, ArgPack);
6025 Types.push_back(PackType);
6026 SubstBuiltinTemplatePackTypes.InsertNode(PackType, InsertPos);
6036 assert(Depth >= 0 &&
"Depth must be non-negative");
6037 assert(Index >= 0 &&
"Index must be non-negative");
6039 llvm::FoldingSetNodeID ID;
6040 TemplateTypeParmType::Profile(ID, Depth, Index, ParameterPack, TTPDecl);
6041 void *InsertPos =
nullptr;
6042 TemplateTypeParmType *TypeParm
6043 = TemplateTypeParmTypes.FindNodeOrInsertPos(ID, InsertPos);
6050 TypeParm =
new (*
this,
alignof(TemplateTypeParmType))
6051 TemplateTypeParmType(Depth, Index, ParameterPack, TTPDecl, Canon);
6053 TemplateTypeParmType *TypeCheck
6054 = TemplateTypeParmTypes.FindNodeOrInsertPos(ID, InsertPos);
6055 assert(!TypeCheck &&
"Template type parameter canonical type broken");
6058 TypeParm =
new (*
this,
alignof(TemplateTypeParmType)) TemplateTypeParmType(
6059 Depth, Index, ParameterPack,
nullptr,
QualType());
6061 Types.push_back(TypeParm);
6062 TemplateTypeParmTypes.InsertNode(TypeParm, InsertPos);
6088 llvm_unreachable(
"unexpected keyword kind");
6102 ElaboratedKeywordLoc, QualifierLoc, TemplateKeywordLoc, NameLoc,
6112 SpecifiedArgVec.reserve(SpecifiedArgs.size());
6114 SpecifiedArgVec.push_back(Arg.getArgument());
6117 CanonicalArgs, Underlying);
6120[[maybe_unused]]
static bool
6123 if (Arg.isPackExpansion())
6134 Template.getAsDependentTemplateName()));
6136 for (
const auto &Arg : Args)
6140 llvm::FoldingSetNodeID ID;
6143 void *InsertPos =
nullptr;
6144 if (
auto *
T = TemplateSpecializationTypes.FindNodeOrInsertPos(ID, InsertPos))
6147 void *Mem =
Allocate(
sizeof(TemplateSpecializationType) +
6149 alignof(TemplateSpecializationType));
6153 assert(Spec->isDependentType() &&
6154 "canonical template specialization must be dependent");
6155 Types.push_back(Spec);
6156 TemplateSpecializationTypes.InsertNode(Spec, InsertPos);
6164 const auto *TD =
Template.getAsTemplateDecl(
true);
6165 bool IsTypeAlias = TD && TD->isTypeAlias();
6166 if (Underlying.
isNull()) {
6173 bool NonCanonical =
Template != CanonTemplate ||
Keyword != CanonKeyword;
6175 if (CanonicalArgs.empty()) {
6178 CanonicalArgs = CanonArgsVec;
6180 NonCanonical |= !llvm::equal(
6181 SpecifiedArgs, CanonicalArgs,
6190 assert((!isa_and_nonnull<TypeAliasTemplateDecl>(TD) ||
6192 "Caller must compute aliased type");
6193 IsTypeAlias =
false;
6196 CanonKeyword, CanonTemplate, CanonicalArgs);
6200 void *Mem =
Allocate(
sizeof(TemplateSpecializationType) +
6202 (IsTypeAlias ?
sizeof(
QualType) : 0),
6203 alignof(TemplateSpecializationType));
6204 auto *Spec =
new (Mem) TemplateSpecializationType(
6206 Types.push_back(Spec);
6212 llvm::FoldingSetNodeID ID;
6215 void *InsertPos =
nullptr;
6216 ParenType *
T = ParenTypes.FindNodeOrInsertPos(ID, InsertPos);
6223 ParenType *CheckT = ParenTypes.FindNodeOrInsertPos(ID, InsertPos);
6224 assert(!CheckT &&
"Paren canonical type broken");
6230 ParenTypes.InsertNode(
T, InsertPos);
6243 Types.push_back(newType);
6250 llvm::FoldingSetNodeID ID;
6251 DependentNameType::Profile(ID,
Keyword, NNS, Name);
6253 void *InsertPos =
nullptr;
6254 if (DependentNameType *
T =
6255 DependentNameTypes.FindNodeOrInsertPos(ID, InsertPos))
6263 if (CanonKeyword !=
Keyword || CanonNNS != NNS) {
6265 [[maybe_unused]] DependentNameType *
T =
6266 DependentNameTypes.FindNodeOrInsertPos(ID, InsertPos);
6267 assert(!
T &&
"broken canonicalization");
6271 DependentNameType *
T =
new (*
this,
alignof(DependentNameType))
6272 DependentNameType(
Keyword, NNS, Name, Canon);
6274 DependentNameTypes.InsertNode(
T, InsertPos);
6280 if (
const auto *TTP = dyn_cast<TemplateTypeParmDecl>(Param)) {
6282 if (TTP->isParameterPack())
6286 }
else if (
auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(Param)) {
6288 NTTP->getType().getNonPackExpansionType().getNonLValueExprType(*
this);
6294 if (
T->isRecordType()) {
6303 Expr *E =
new (*this)
6305 T,
VK, NTTP->getLocation());
6307 if (NTTP->isParameterPack())
6313 std::nullopt,
false,
6315 if (TTP->isParameterPack())
6321 if (Param->isTemplateParameterPack())
6330 bool ExpectPackInType)
const {
6332 "Pack expansions must expand one or more parameter packs");
6334 llvm::FoldingSetNodeID ID;
6335 PackExpansionType::Profile(ID, Pattern, NumExpansions);
6337 void *InsertPos =
nullptr;
6338 PackExpansionType *
T = PackExpansionTypes.FindNodeOrInsertPos(ID, InsertPos);
6349 PackExpansionTypes.FindNodeOrInsertPos(ID, InsertPos);
6352 T =
new (*
this,
alignof(PackExpansionType))
6353 PackExpansionType(Pattern, Canon, NumExpansions);
6355 PackExpansionTypes.InsertNode(
T, InsertPos);
6367 if (Protocols.empty())
return true;
6372 for (
unsigned i = 1; i != Protocols.size(); ++i)
6382 llvm::array_pod_sort(Protocols.begin(), Protocols.end(),
CmpProtocolNames);
6386 P = P->getCanonicalDecl();
6389 auto ProtocolsEnd = llvm::unique(Protocols);
6390 Protocols.erase(ProtocolsEnd, Protocols.end());
6395 unsigned NumProtocols)
const {
6404 bool isKindOf)
const {
6407 if (typeArgs.empty() && protocols.empty() && !isKindOf &&
6412 llvm::FoldingSetNodeID ID;
6413 ObjCObjectTypeImpl::Profile(ID, baseType, typeArgs, protocols, isKindOf);
6414 void *InsertPos =
nullptr;
6415 if (
ObjCObjectType *QT = ObjCObjectTypes.FindNodeOrInsertPos(ID, InsertPos))
6422 if (effectiveTypeArgs.empty()) {
6424 effectiveTypeArgs = baseObject->getTypeArgs();
6431 bool typeArgsAreCanonical = llvm::all_of(
6434 if (!typeArgsAreCanonical || !protocolsSorted || !baseType.
isCanonical()) {
6438 if (!typeArgsAreCanonical) {
6439 canonTypeArgsVec.reserve(effectiveTypeArgs.size());
6440 for (
auto typeArg : effectiveTypeArgs)
6442 canonTypeArgs = canonTypeArgsVec;
6444 canonTypeArgs = effectiveTypeArgs;
6449 if (!protocolsSorted) {
6450 canonProtocolsVec.append(protocols.begin(), protocols.end());
6452 canonProtocols = canonProtocolsVec;
6454 canonProtocols = protocols;
6458 canonProtocols, isKindOf);
6461 ObjCObjectTypes.FindNodeOrInsertPos(ID, InsertPos);
6464 unsigned size =
sizeof(ObjCObjectTypeImpl);
6465 size += typeArgs.size() *
sizeof(
QualType);
6467 void *mem =
Allocate(size,
alignof(ObjCObjectTypeImpl));
6469 new (mem) ObjCObjectTypeImpl(canonical, baseType, typeArgs, protocols,
6473 ObjCObjectTypes.InsertNode(
T, InsertPos);
6483 bool allowOnPointerType)
const {
6486 if (
const auto *objT = dyn_cast<ObjCTypeParamType>(
type.getTypePtr())) {
6491 if (allowOnPointerType) {
6492 if (
const auto *objPtr =
6493 dyn_cast<ObjCObjectPointerType>(
type.getTypePtr())) {
6497 protocolsVec.append(objT->qual_begin(),
6499 protocolsVec.append(protocols.begin(), protocols.end());
6502 objT->getBaseType(),
6503 objT->getTypeArgsAsWritten(),
6505 objT->isKindOfTypeAsWritten());
6511 if (
const auto *objT = dyn_cast<ObjCObjectType>(
type.getTypePtr())){
6516 objT->getTypeArgsAsWritten(),
6518 objT->isKindOfTypeAsWritten());
6522 if (
type->isObjCObjectType()) {
6532 if (
type->isObjCIdType()) {
6535 objPtr->isKindOfType());
6540 if (
type->isObjCClassType()) {
6543 objPtr->isKindOfType());
6555 llvm::FoldingSetNodeID ID;
6556 ObjCTypeParamType::Profile(ID,
Decl,
Decl->getUnderlyingType(), protocols);
6557 void *InsertPos =
nullptr;
6558 if (ObjCTypeParamType *TypeParam =
6559 ObjCTypeParamTypes.FindNodeOrInsertPos(ID, InsertPos))
6564 if (!protocols.empty()) {
6568 Canonical, protocols, hasError,
true ));
6569 assert(!hasError &&
"Error when apply protocol qualifier to bound type");
6572 unsigned size =
sizeof(ObjCTypeParamType);
6574 void *mem =
Allocate(size,
alignof(ObjCTypeParamType));
6575 auto *newType =
new (mem) ObjCTypeParamType(
Decl, Canonical, protocols);
6577 Types.push_back(newType);
6578 ObjCTypeParamTypes.InsertNode(newType, InsertPos);
6588 protocols.append(NewTypeParamTy->qual_begin(), NewTypeParamTy->qual_end());
6603 for (
auto *Proto : OPT->quals()) {
6626 if (InheritedProtocols.empty())
6630 bool Conforms =
false;
6631 for (
auto *Proto : OPT->quals()) {
6633 for (
auto *PI : InheritedProtocols) {
6645 for (
auto *PI : InheritedProtocols) {
6647 bool Adopts =
false;
6648 for (
auto *Proto : OPT->quals()) {
6662 llvm::FoldingSetNodeID ID;
6665 void *InsertPos =
nullptr;
6667 ObjCObjectPointerTypes.FindNodeOrInsertPos(ID, InsertPos))
6676 ObjCObjectPointerTypes.FindNodeOrInsertPos(ID, InsertPos);
6685 Types.push_back(QType);
6686 ObjCObjectPointerTypes.InsertNode(QType, InsertPos);
6694 if (
Decl->TypeForDecl)
6698 assert(PrevDecl->TypeForDecl &&
"previous decl has no TypeForDecl");
6699 Decl->TypeForDecl = PrevDecl->TypeForDecl;
6700 return QualType(PrevDecl->TypeForDecl, 0);
6709 Decl->TypeForDecl =
T;
6722 llvm::FoldingSetNodeID ID;
6726 void *InsertPos =
nullptr;
6728 DependentTypeOfExprTypes.FindNodeOrInsertPos(ID, InsertPos);
6738 DependentTypeOfExprTypes.InsertNode(Canon, InsertPos);
6746 Types.push_back(toe);
6757 auto *tot =
new (*
this,
alignof(TypeOfType))
6758 TypeOfType(*
this, tofType, Canonical, Kind);
6759 Types.push_back(tot);
6783 llvm_unreachable(
"Unknown value kind");
6798 }
else if (!UnderlyingType.
isNull()) {
6801 llvm::FoldingSetNodeID ID;
6802 DependentDecltypeType::Profile(ID, *
this, E);
6804 void *InsertPos =
nullptr;
6805 if (DependentDecltypeType *Canon =
6806 DependentDecltypeTypes.FindNodeOrInsertPos(ID, InsertPos))
6811 new (*
this,
alignof(DependentDecltypeType)) DependentDecltypeType(E);
6812 DependentDecltypeTypes.InsertNode(DT, InsertPos);
6813 Types.push_back(DT);
6816 auto *DT =
new (*
this,
alignof(DecltypeType))
6817 DecltypeType(E, UnderlyingType, CanonType);
6818 Types.push_back(DT);
6823 bool FullySubstituted,
6827 if (FullySubstituted && Index) {
6830 llvm::FoldingSetNodeID ID;
6831 PackIndexingType::Profile(ID, *
this, Pattern.
getCanonicalType(), IndexExpr,
6832 FullySubstituted, Expansions);
6833 void *InsertPos =
nullptr;
6834 PackIndexingType *Canon =
6835 DependentPackIndexingTypes.FindNodeOrInsertPos(ID, InsertPos);
6838 PackIndexingType::totalSizeToAlloc<QualType>(Expansions.size()),
6842 IndexExpr, FullySubstituted, Expansions);
6843 DependentPackIndexingTypes.InsertNode(Canon, InsertPos);
6849 Allocate(PackIndexingType::totalSizeToAlloc<QualType>(Expansions.size()),
6851 auto *
T =
new (Mem) PackIndexingType(Canonical, Pattern, IndexExpr,
6852 FullySubstituted, Expansions);
6861 UnaryTransformType::UTTKind Kind)
const {
6863 llvm::FoldingSetNodeID ID;
6864 UnaryTransformType::Profile(ID, BaseType, UnderlyingType, Kind);
6866 void *InsertPos =
nullptr;
6867 if (UnaryTransformType *UT =
6868 UnaryTransformTypes.FindNodeOrInsertPos(ID, InsertPos))
6872 if (!BaseType->isDependentType()) {
6875 assert(UnderlyingType.
isNull() || BaseType == UnderlyingType);
6878 BaseType != CanonBase) {
6883 [[maybe_unused]] UnaryTransformType *UT =
6884 UnaryTransformTypes.FindNodeOrInsertPos(ID, InsertPos);
6885 assert(!UT &&
"broken canonicalization");
6889 auto *UT =
new (*
this,
alignof(UnaryTransformType))
6890 UnaryTransformType(BaseType, UnderlyingType, Kind, CanonType);
6891 UnaryTransformTypes.InsertNode(UT, InsertPos);
6892 Types.push_back(UT);
6905 !TypeConstraintConcept) {
6906 assert(DeducedAsType.
isNull() &&
"");
6907 assert(TypeConstraintArgs.empty() &&
"");
6912 llvm::FoldingSetNodeID ID;
6913 AutoType::Profile(ID, *
this, DK, DeducedAsType,
Keyword,
6914 TypeConstraintConcept, TypeConstraintArgs);
6915 if (
auto const AT_iter = AutoTypes.find(ID); AT_iter != AutoTypes.end())
6916 return QualType(AT_iter->getSecond(), 0);
6919 assert(!DeducedAsType.
isNull() &&
"deduced type must be provided");
6921 assert(DeducedAsType.
isNull() &&
"deduced type must not be provided");
6922 if (TypeConstraintConcept) {
6923 bool AnyNonCanonArgs =
false;
6924 auto *CanonicalConcept =
6927 *
this, TypeConstraintArgs, AnyNonCanonArgs);
6928 if (TypeConstraintConcept != CanonicalConcept || AnyNonCanonArgs)
6930 CanonicalConceptArgs);
6934 void *Mem =
Allocate(
sizeof(AutoType) +
6937 auto *AT =
new (Mem) AutoType(DK, DeducedAsType,
Keyword,
6938 TypeConstraintConcept, TypeConstraintArgs);
6940 llvm::FoldingSetNodeID InsertedID;
6941 AT->Profile(InsertedID, *
this);
6942 assert(InsertedID == ID &&
"ID does not match");
6944 Types.push_back(AT);
6945 AutoTypes.try_emplace(ID, AT);
6950 QualType CanonT =
T.getNonPackExpansionType().getCanonicalType();
6953 if (
auto *AT = CanonT->
getAs<AutoType>()) {
6954 if (!AT->isConstrained())
6976 void *InsertPos =
nullptr;
6977 llvm::FoldingSetNodeID ID;
6978 DeducedTemplateSpecializationType::Profile(ID, DK, DeducedAsType,
Keyword,
6980 if (DeducedTemplateSpecializationType *DTST =
6981 DeducedTemplateSpecializationTypes.FindNodeOrInsertPos(ID, InsertPos))
6985 assert(!DeducedAsType.
isNull() &&
"deduced type must be provided");
6987 assert(DeducedAsType.
isNull() &&
"deduced type must not be provided");
6996 [[maybe_unused]] DeducedTemplateSpecializationType *DTST =
6997 DeducedTemplateSpecializationTypes.FindNodeOrInsertPos(ID, InsertPos);
6998 assert(!DTST &&
"broken canonicalization");
7002 auto *DTST =
new (*
this,
alignof(DeducedTemplateSpecializationType))
7003 DeducedTemplateSpecializationType(DK, DeducedAsType,
Keyword,
Template);
7006 llvm::FoldingSetNodeID TempID;
7007 DTST->Profile(TempID);
7008 assert(ID == TempID &&
"ID does not match");
7010 Types.push_back(DTST);
7011 DeducedTemplateSpecializationTypes.InsertNode(DTST, InsertPos);
7020 llvm::FoldingSetNodeID ID;
7023 void *InsertPos =
nullptr;
7024 if (
AtomicType *AT = AtomicTypes.FindNodeOrInsertPos(ID, InsertPos))
7030 if (!
T.isCanonical()) {
7034 AtomicType *NewIP = AtomicTypes.FindNodeOrInsertPos(ID, InsertPos);
7035 assert(!NewIP &&
"Shouldn't be in the map!"); (void)NewIP;
7038 Types.push_back(
New);
7039 AtomicTypes.InsertNode(
New, InsertPos);
7071 return getFromTargetType(Target->getSizeType());
7090 return getFromTargetType(Target->getUnsignedPtrDiffType(
LangAS::Default));
7095 return getFromTargetType(Target->getIntMaxType());
7100 return getFromTargetType(Target->getUIntMaxType());
7118 return getFromTargetType(Target->getIntPtrType());
7128 return getFromTargetType(Target->getProcessIDType());
7140 const Type *Ty =
T.getTypePtr();
7168 quals = splitType.
Quals;
7173 QualType elementType = AT->getElementType();
7178 if (elementType == unqualElementType) {
7179 assert(quals.
empty());
7180 quals = splitType.
Quals;
7188 if (
const auto *CAT = dyn_cast<ConstantArrayType>(AT)) {
7190 CAT->getSizeExpr(), CAT->getSizeModifier(), 0);
7193 if (
const auto *IAT = dyn_cast<IncompleteArrayType>(AT)) {
7197 if (
const auto *VAT = dyn_cast<VariableArrayType>(AT)) {
7199 VAT->getSizeModifier(),
7200 VAT->getIndexTypeCVRQualifiers());
7205 DSAT->getSizeModifier(), 0);
7215 bool AllowPiMismatch)
const {
7230 if (
auto *CAT1 = dyn_cast<ConstantArrayType>(AT1)) {
7231 auto *CAT2 = dyn_cast<ConstantArrayType>(AT2);
7232 if (!((CAT2 && CAT1->getSize() == CAT2->getSize()) ||
7245 T1 = AT1->getElementType();
7246 T2 = AT2->getElementType();
7266 bool AllowPiMismatch)
const {
7271 if (T1PtrType && T2PtrType) {
7279 T1MPType && T2MPType) {
7282 if (T1MPType->getQualifier() != T2MPType->getQualifier())
7294 if (T1OPType && T2OPType) {
7326 if (Quals1 != Quals2)
7396 llvm_unreachable(
"bad template name kind!");
7402 if (!TP->hasDefaultArgument())
7404 return &TP->getDefaultArgument().getArgument();
7407 case NamedDecl::TemplateTypeParm:
7409 case NamedDecl::NonTypeTemplateParm:
7411 case NamedDecl::TemplateTemplateParm:
7414 llvm_unreachable(
"Unexpected template parameter kind");
7419 bool IgnoreDeduced)
const {
7420 while (std::optional<TemplateName> UnderlyingOrNone =
7422 Name = *UnderlyingOrNone;
7427 if (
auto *TTP = dyn_cast<TemplateTemplateParmDecl>(
Template))
7439 llvm_unreachable(
"cannot canonicalize overloaded template");
7443 assert(DTN &&
"Non-dependent template names must refer to template decls.");
7462 assert(IgnoreDeduced ==
false);
7469 bool NonCanonical = CanonUnderlying != Underlying;
7475 assert(CanonArgs.size() <= Params.size());
7481 for (
int I = CanonArgs.size() - 1; I >= 0; --I) {
7490 if (I ==
int(CanonArgs.size() - 1))
7491 CanonArgs.pop_back();
7492 NonCanonical =
true;
7502 llvm_unreachable(
"always sugar node");
7505 llvm_unreachable(
"bad template name!");
7510 bool IgnoreDeduced)
const {
7531 llvm::FoldingSetNodeID XCEID, YCEID;
7532 XCE->
Profile(XCEID, *
this,
true,
true);
7533 YCE->
Profile(YCEID, *
this,
true,
true);
7534 return XCEID == YCEID;
7583 if (
auto *TX = dyn_cast<TemplateTypeParmDecl>(
X)) {
7585 if (TX->isParameterPack() != TY->isParameterPack())
7587 if (TX->hasTypeConstraint() != TY->hasTypeConstraint())
7590 TY->getTypeConstraint());
7593 if (
auto *TX = dyn_cast<NonTypeTemplateParmDecl>(
X)) {
7595 return TX->isParameterPack() == TY->isParameterPack() &&
7596 TX->getASTContext().hasSameType(TX->getType(), TY->getType()) &&
7598 TY->getPlaceholderTypeConstraint());
7603 return TX->isParameterPack() == TY->isParameterPack() &&
7605 TY->getTemplateParameters());
7610 if (
X->size() != Y->
size())
7613 for (
unsigned I = 0, N =
X->size(); I != N; ++I)
7627 if (
auto *TTPX = dyn_cast<TemplateTypeParmDecl>(
X)) {
7629 if (!TTPX->hasDefaultArgument() || !TTPY->hasDefaultArgument())
7632 return hasSameType(TTPX->getDefaultArgument().getArgument().getAsType(),
7633 TTPY->getDefaultArgument().getArgument().getAsType());
7636 if (
auto *NTTPX = dyn_cast<NonTypeTemplateParmDecl>(
X)) {
7638 if (!NTTPX->hasDefaultArgument() || !NTTPY->hasDefaultArgument())
7641 Expr *DefaultArgumentX =
7642 NTTPX->getDefaultArgument().getArgument().getAsExpr()->
IgnoreImpCasts();
7643 Expr *DefaultArgumentY =
7644 NTTPY->getDefaultArgument().getArgument().getAsExpr()->
IgnoreImpCasts();
7645 llvm::FoldingSetNodeID XID, YID;
7646 DefaultArgumentX->
Profile(XID, *
this,
true);
7647 DefaultArgumentY->
Profile(YID, *
this,
true);
7654 if (!TTPX->hasDefaultArgument() || !TTPY->hasDefaultArgument())
7669 auto Kind =
X.getKind();
7677 auto [NamespaceX, PrefixX] =
X.getAsNamespaceAndPrefix();
7680 NamespaceY->getNamespace()))
7685 const auto *TX =
X.getAsType(), *TY = Y.
getAsType();
7686 if (TX->getCanonicalTypeInternal() != TY->getCanonicalTypeInternal())
7695 llvm_unreachable(
"unhandled qualifier kind");
7701 if (A->
hasAttr<CUDADeviceAttr>() != B->
hasAttr<CUDADeviceAttr>())
7703 if (A->
hasAttr<CUDADeviceAttr>() && B->
hasAttr<CUDADeviceAttr>())
7715 llvm::FoldingSetNodeID Cand1ID, Cand2ID;
7719 for (
auto Pair : zip_longest(AEnableIfAttrs, BEnableIfAttrs)) {
7720 std::optional<EnableIfAttr *> Cand1A = std::get<0>(Pair);
7721 std::optional<EnableIfAttr *> Cand2A = std::get<1>(Pair);
7724 if (!Cand1A || !Cand2A)
7730 (*Cand1A)->getCond()->Profile(Cand1ID, A->
getASTContext(),
true);
7731 (*Cand2A)->getCond()->Profile(Cand2ID, B->
getASTContext(),
true);
7735 if (Cand1ID != Cand2ID)
7769 if (
const auto *TypedefX = dyn_cast<TypedefNameDecl>(
X))
7770 if (
const auto *TypedefY = dyn_cast<TypedefNameDecl>(Y))
7772 TypedefY->getUnderlyingType());
7789 if (
const auto *TagX = dyn_cast<TagDecl>(
X)) {
7791 return (TagX->getTagKind() == TagY->getTagKind()) ||
7803 if (
const auto *FuncX = dyn_cast<FunctionDecl>(
X)) {
7805 if (
const auto *CtorX = dyn_cast<CXXConstructorDecl>(
X)) {
7807 if (CtorX->getInheritedConstructor() &&
7808 !
isSameEntity(CtorX->getInheritedConstructor().getConstructor(),
7809 CtorY->getInheritedConstructor().getConstructor()))
7813 if (FuncX->isMultiVersion() != FuncY->isMultiVersion())
7818 if (FuncX->isMultiVersion()) {
7819 const auto *TAX = FuncX->getAttr<TargetAttr>();
7820 const auto *TAY = FuncY->getAttr<TargetAttr>();
7821 assert(TAX && TAY &&
"Multiversion Function without target attribute");
7823 if (TAX->getFeaturesStr() != TAY->getFeaturesStr())
7829 if ((FuncX->isMemberLikeConstrainedFriend() ||
7830 FuncY->isMemberLikeConstrainedFriend()) &&
7831 !FuncX->getLexicalDeclContext()->Equals(
7832 FuncY->getLexicalDeclContext())) {
7837 FuncY->getTrailingRequiresClause()))
7845 FD = FD->getCanonicalDecl();
7846 return FD->getTypeSourceInfo() ? FD->getTypeSourceInfo()->getType()
7849 QualType XT = GetTypeAsWritten(FuncX), YT = GetTypeAsWritten(FuncY);
7864 return FuncX->getLinkageInternal() == FuncY->getLinkageInternal() &&
7869 if (
const auto *VarX = dyn_cast<VarDecl>(
X)) {
7871 if (VarX->getLinkageInternal() == VarY->getLinkageInternal()) {
7874 if (VarX->getType().isNull() || VarY->getType().isNull())
7877 if (
hasSameType(VarX->getType(), VarY->getType()))
7887 if (!VarXTy || !VarYTy)
7896 if (
const auto *NamespaceX = dyn_cast<NamespaceDecl>(
X)) {
7898 return NamespaceX->isInline() == NamespaceY->isInline();
7903 if (
const auto *TemplateX = dyn_cast<TemplateDecl>(
X)) {
7907 if (
const auto *ConceptX = dyn_cast<ConceptDecl>(
X)) {
7910 ConceptY->getConstraintExpr()))
7915 TemplateY->getTemplatedDecl()) &&
7917 TemplateY->getTemplateParameters());
7921 if (
const auto *FDX = dyn_cast<FieldDecl>(
X)) {
7924 return hasSameType(FDX->getType(), FDY->getType());
7928 if (
const auto *IFDX = dyn_cast<IndirectFieldDecl>(
X)) {
7930 return IFDX->getAnonField()->getCanonicalDecl() ==
7931 IFDY->getAnonField()->getCanonicalDecl();
7940 if (
const auto *USX = dyn_cast<UsingShadowDecl>(
X)) {
7947 if (
const auto *UX = dyn_cast<UsingDecl>(
X)) {
7950 UX->hasTypename() == UY->hasTypename() &&
7951 UX->isAccessDeclaration() == UY->isAccessDeclaration();
7953 if (
const auto *UX = dyn_cast<UnresolvedUsingValueDecl>(
X)) {
7956 UX->isAccessDeclaration() == UY->isAccessDeclaration();
7958 if (
const auto *UX = dyn_cast<UnresolvedUsingTypenameDecl>(
X)) {
7966 if (
const auto *UX = dyn_cast<UsingPackDecl>(
X)) {
7968 UX->getInstantiatedFromUsingDecl(),
7973 if (
const auto *NAX = dyn_cast<NamespaceAliasDecl>(
X)) {
7975 return NAX->getNamespace()->Equals(NAY->getNamespace());
7978 if (
const auto *UX = dyn_cast<UsingEnumDecl>(
X)) {
8029 bool AnyNonCanonArgs =
false;
8032 if (!AnyNonCanonArgs)
8042 llvm_unreachable(
"Unhandled template argument kind");
8052 llvm_unreachable(
"Comparing NULL template argument");
8077 llvm::FoldingSetNodeID ID1, ID2;
8087 return isSameTemplateArgument(Arg1, Arg2);
8091 llvm_unreachable(
"Unhandled template argument kind");
8096 if (!
T.hasLocalQualifiers()) {
8098 if (
const auto *AT = dyn_cast<ArrayType>(
T))
8118 const auto *ATy = dyn_cast<ArrayType>(split.
Ty);
8119 if (!ATy || qs.
empty())
8126 if (
const auto *CAT = dyn_cast<ConstantArrayType>(ATy))
8129 CAT->getSizeModifier(),
8130 CAT->getIndexTypeCVRQualifiers()));
8131 if (
const auto *IAT = dyn_cast<IncompleteArrayType>(ATy))
8133 IAT->getSizeModifier(),
8134 IAT->getIndexTypeCVRQualifiers()));
8136 if (
const auto *DSAT = dyn_cast<DependentSizedArrayType>(ATy))
8138 NewEltTy, DSAT->getSizeExpr(), DSAT->getSizeModifier(),
8139 DSAT->getIndexTypeCVRQualifiers()));
8144 VAT->getIndexTypeCVRQualifiers()));
8152 if (
T->isArrayType() ||
T->isFunctionType())
8160 return T.getUnqualifiedType();
8171 if (
T->isArrayType() ||
T->isFunctionType())
8173 return T.getUnqualifiedType();
8188 assert(PrettyArrayType &&
"Not an array type!");
8225 uint64_t ElementCount = 1;
8228 CA = dyn_cast_or_null<ConstantArrayType>(
8231 return ElementCount;
8239 uint64_t ElementCount = 1;
8243 AILE = dyn_cast<ArrayInitLoopExpr>(AILE->
getSubExpr());
8246 return ElementCount;
8256 default: llvm_unreachable(
"getFloatingRank(): not a floating type");
8258 case BuiltinType::Half:
return HalfRank;
8259 case BuiltinType::Float:
return FloatRank;
8292unsigned ASTContext::getIntegerRank(
const Type *
T)
const {
8293 assert(
T->isCanonicalUnqualified() &&
"T should be canonicalized");
8297 if (
const auto *EIT = dyn_cast<BitIntType>(
T))
8298 return 0 + (EIT->getNumBits() << 3);
8300 if (
const auto *OBT = dyn_cast<OverflowBehaviorType>(
T))
8301 return getIntegerRank(OBT->getUnderlyingType().getTypePtr());
8304 default: llvm_unreachable(
"getIntegerRank(): not a built-in integer");
8305 case BuiltinType::Bool:
8307 case BuiltinType::Char_S:
8308 case BuiltinType::Char_U:
8309 case BuiltinType::SChar:
8310 case BuiltinType::UChar:
8312 case BuiltinType::Short:
8313 case BuiltinType::UShort:
8315 case BuiltinType::Int:
8316 case BuiltinType::UInt:
8318 case BuiltinType::Long:
8319 case BuiltinType::ULong:
8321 case BuiltinType::LongLong:
8322 case BuiltinType::ULongLong:
8324 case BuiltinType::Int128:
8325 case BuiltinType::UInt128:
8330 case BuiltinType::Char8:
8332 case BuiltinType::Char16:
8333 return getIntegerRank(
8335 case BuiltinType::Char32:
8336 return getIntegerRank(
8338 case BuiltinType::WChar_S:
8339 case BuiltinType::WChar_U:
8340 return getIntegerRank(
8370 uint64_t BitWidth = Field->getBitWidthValue();
8396 if (BitWidth < IntSize)
8399 if (BitWidth == IntSize)
8414 assert(!Promotable.
isNull());
8417 return ED->getPromotionType();
8421 if (
const auto *OBT = Promotable->
getAs<OverflowBehaviorType>()) {
8434 if (BT->getKind() == BuiltinType::WChar_S ||
8435 BT->getKind() == BuiltinType::WChar_U ||
8436 BT->getKind() == BuiltinType::Char8 ||
8437 BT->getKind() == BuiltinType::Char16 ||
8438 BT->getKind() == BuiltinType::Char32) {
8439 bool FromIsSigned = BT->getKind() == BuiltinType::WChar_S;
8443 for (
const auto &PT : PromoteTypes) {
8445 if (FromSize < ToSize ||
8446 (FromSize == ToSize && FromIsSigned == PT->isSignedIntegerType()))
8449 llvm_unreachable(
"char type should fit into long long");
8456 uint64_t PromotableSize =
getIntWidth(Promotable);
8465 while (!
T.isNull()) {
8467 return T.getObjCLifetime();
8468 if (
T->isArrayType())
8471 T = PT->getPointeeType();
8473 T = RT->getPointeeType();
8498 if (
const auto *ET = dyn_cast<EnumType>(LHSC))
8500 if (
const auto *ET = dyn_cast<EnumType>(RHSC))
8503 if (LHSC == RHSC)
return 0;
8508 unsigned LHSRank = getIntegerRank(LHSC);
8509 unsigned RHSRank = getIntegerRank(RHSC);
8511 if (LHSUnsigned == RHSUnsigned) {
8512 if (LHSRank == RHSRank)
return 0;
8513 return LHSRank > RHSRank ? 1 : -1;
8519 if (LHSRank >= RHSRank)
8529 if (RHSRank >= LHSRank)
8539 if (CFConstantStringTypeDecl)
8540 return CFConstantStringTypeDecl;
8542 assert(!CFConstantStringTagDecl &&
8543 "tag and typedef should be initialized together");
8545 CFConstantStringTagDecl->startDefinition();
8583 if (
static_cast<unsigned>(CFRuntime) <
8586 Fields[Count++] = {
IntTy,
"flags" };
8588 Fields[Count++] = {
LongTy,
"length" };
8592 Fields[Count++] = { getFromTargetType(Target->getUInt64Type()),
"_swift_rc" };
8596 Fields[Count++] = {
IntTy,
"_ptr" };
8602 for (
unsigned i = 0; i < Count; ++i) {
8606 Fields[i].Type,
nullptr,
8609 CFConstantStringTagDecl->addDecl(Field);
8612 CFConstantStringTagDecl->completeDefinition();
8616 CFConstantStringTypeDecl =
8619 return CFConstantStringTypeDecl;
8623 if (!CFConstantStringTagDecl)
8625 return CFConstantStringTagDecl;
8635 if (ObjCSuperType.isNull()) {
8640 return ObjCSuperType;
8646 CFConstantStringTagDecl = TT->castAsRecordDecl();
8650 if (BlockDescriptorType)
8663 static const char *
const FieldNames[] = {
8668 for (
size_t i = 0; i < 2; ++i) {
8671 &
Idents.get(FieldNames[i]), FieldTypes[i],
nullptr,
8679 BlockDescriptorType = RD;
8685 if (BlockDescriptorExtendedType)
8700 static const char *
const FieldNames[] = {
8707 for (
size_t i = 0; i < 4; ++i) {
8710 &
Idents.get(FieldNames[i]), FieldTypes[i],
nullptr,
8719 BlockDescriptorExtendedType = RD;
8724 const auto *BT = dyn_cast<BuiltinType>(
T);
8733 switch (BT->getKind()) {
8734#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
8735 case BuiltinType::Id: \
8737#include "clang/Basic/OpenCLImageTypes.def"
8739 case BuiltinType::OCLClkEvent:
8742 case BuiltinType::OCLEvent:
8745 case BuiltinType::OCLQueue:
8748 case BuiltinType::OCLReserveID:
8751 case BuiltinType::OCLSampler:
8770 if (!copyExpr && record->hasTrivialDestructor())
return false;
8801 llvm_unreachable(
"impossible");
8803 llvm_unreachable(
"fell out of lifetime switch!");
8811 bool &HasByrefExtendedLayout)
const {
8816 HasByrefExtendedLayout =
false;
8818 HasByrefExtendedLayout =
true;
8832 assert(Target &&
"Expected target to be initialized");
8833 const llvm::Triple &
T = Target->getTriple();
8835 if (
T.isOSWindows() &&
T.isArch64Bit())
8841 assert(Target &&
"Expected target to be initialized");
8842 const llvm::Triple &
T = Target->getTriple();
8844 if (
T.isOSWindows() &&
T.isArch64Bit())
8850 if (!ObjCInstanceTypeDecl)
8851 ObjCInstanceTypeDecl =
8853 return ObjCInstanceTypeDecl;
8859 if (
const auto *TT = dyn_cast<TypedefType>(
T))
8861 return II->isStr(
"BOOL");
8869 if (!
type->isIncompleteArrayType() &&
type->isIncompleteType())
8878 else if (
type->isArrayType())
8897 if (
First->isInlineSpecified() || !
First->isStaticDataMember())
8904 !D->isInlineSpecified() && (D->isConstexpr() ||
First->isConstexpr()))
8935 for (
auto *PI :
Decl->parameters()) {
8940 assert(sz.
isPositive() &&
"BlockExpr - Incomplete param type");
8949 ParmOffset = PtrSize;
8950 for (
auto *PVDecl :
Decl->parameters()) {
8951 QualType PType = PVDecl->getOriginalType();
8952 if (
const auto *AT =
8957 PType = PVDecl->getType();
8959 PType = PVDecl->getType();
8979 for (
auto *PI :
Decl->parameters()) {
8986 "getObjCEncodingForFunctionDecl - Incomplete param type");
8993 for (
auto *PVDecl :
Decl->parameters()) {
8994 QualType PType = PVDecl->getOriginalType();
8995 if (
const auto *AT =
9000 PType = PVDecl->getType();
9002 PType = PVDecl->getType();
9016 bool Extended)
const {
9020 ObjCEncOptions Options = ObjCEncOptions()
9021 .setExpandPointedToStructures()
9022 .setExpandStructures()
9023 .setIsOutermostType();
9025 Options.setEncodeBlockParameters().setEncodeClassNames();
9026 getObjCEncodingForTypeImpl(
T, S, Options,
nullptr);
9032 bool Extended)
const {
9037 Decl->getReturnType(), S, Extended);
9046 E =
Decl->sel_param_end(); PI != E; ++PI) {
9053 "getObjCEncodingForMethodDecl - Incomplete param type");
9061 ParmOffset = 2 * PtrSize;
9063 E =
Decl->sel_param_end(); PI != E; ++PI) {
9066 if (
const auto *AT =
9075 PType, S, Extended);
9086 const Decl *Container)
const {
9089 if (
const auto *CID = dyn_cast<ObjCCategoryImplDecl>(Container)) {
9090 for (
auto *PID : CID->property_impls())
9091 if (PID->getPropertyDecl() == PD)
9095 for (
auto *PID : OID->property_impls())
9096 if (PID->getPropertyDecl() == PD)
9130 const Decl *Container)
const {
9132 bool Dynamic =
false;
9140 SynthesizePID = PropertyImpDecl;
9144 std::string S =
"T";
9189 if (SynthesizePID) {
9206 if (BT->getKind() == BuiltinType::ULong &&
getIntWidth(PointeeTy) == 32)
9209 if (BT->getKind() == BuiltinType::Long &&
getIntWidth(PointeeTy) == 32)
9222 getObjCEncodingForTypeImpl(
T, S,
9224 .setExpandPointedToStructures()
9225 .setExpandStructures()
9226 .setIsOutermostType(),
9227 Field, NotEncodedT);
9231 std::string& S)
const {
9235 getObjCEncodingForTypeImpl(
T, S,
9237 .setExpandPointedToStructures()
9238 .setExpandStructures()
9239 .setIsOutermostType()
9240 .setEncodingProperty(),
9248 case BuiltinType::Void:
return 'v';
9249 case BuiltinType::Bool:
return 'B';
9250 case BuiltinType::Char8:
9251 case BuiltinType::Char_U:
9252 case BuiltinType::UChar:
return 'C';
9253 case BuiltinType::Char16:
9254 case BuiltinType::UShort:
return 'S';
9255 case BuiltinType::Char32:
9256 case BuiltinType::UInt:
return 'I';
9257 case BuiltinType::ULong:
9258 return C->getTargetInfo().getLongWidth() == 32 ?
'L' :
'Q';
9259 case BuiltinType::UInt128:
return 'T';
9260 case BuiltinType::ULongLong:
return 'Q';
9261 case BuiltinType::Char_S:
9262 case BuiltinType::SChar:
return 'c';
9263 case BuiltinType::Short:
return 's';
9264 case BuiltinType::WChar_S:
9265 case BuiltinType::WChar_U:
9266 case BuiltinType::Int:
return 'i';
9267 case BuiltinType::Long:
9268 return C->getTargetInfo().getLongWidth() == 32 ?
'l' :
'q';
9269 case BuiltinType::LongLong:
return 'q';
9270 case BuiltinType::Int128:
return 't';
9271 case BuiltinType::Float:
return 'f';
9272 case BuiltinType::Double:
return 'd';
9273 case BuiltinType::LongDouble:
return 'D';
9274 case BuiltinType::NullPtr:
return '*';
9276 case BuiltinType::BFloat16:
9277 case BuiltinType::Float16:
9278 case BuiltinType::Float128:
9279 case BuiltinType::Ibm128:
9280 case BuiltinType::Half:
9281 case BuiltinType::ShortAccum:
9282 case BuiltinType::Accum:
9283 case BuiltinType::LongAccum:
9284 case BuiltinType::UShortAccum:
9285 case BuiltinType::UAccum:
9286 case BuiltinType::ULongAccum:
9287 case BuiltinType::ShortFract:
9288 case BuiltinType::Fract:
9289 case BuiltinType::LongFract:
9290 case BuiltinType::UShortFract:
9291 case BuiltinType::UFract:
9292 case BuiltinType::ULongFract:
9293 case BuiltinType::SatShortAccum:
9294 case BuiltinType::SatAccum:
9295 case BuiltinType::SatLongAccum:
9296 case BuiltinType::SatUShortAccum:
9297 case BuiltinType::SatUAccum:
9298 case BuiltinType::SatULongAccum:
9299 case BuiltinType::SatShortFract:
9300 case BuiltinType::SatFract:
9301 case BuiltinType::SatLongFract:
9302 case BuiltinType::SatUShortFract:
9303 case BuiltinType::SatUFract:
9304 case BuiltinType::SatULongFract:
9308#define SVE_TYPE(Name, Id, SingletonId) \
9309 case BuiltinType::Id:
9310#include "clang/Basic/AArch64ACLETypes.def"
9311#define RVV_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
9312#include "clang/Basic/RISCVVTypes.def"
9313#define WASM_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
9314#include "clang/Basic/WebAssemblyReferenceTypes.def"
9315#define AMDGPU_TYPE(Name, Id, SingletonId, Width, Align) case BuiltinType::Id:
9316#include "clang/Basic/AMDGPUTypes.def"
9319 Diags.
Report(diag::err_unsupported_objc_primitive_encoding)
9324 case BuiltinType::ObjCId:
9325 case BuiltinType::ObjCClass:
9326 case BuiltinType::ObjCSel:
9327 llvm_unreachable(
"@encoding ObjC primitive type");
9330#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
9331 case BuiltinType::Id:
9332#include "clang/Basic/OpenCLImageTypes.def"
9333#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
9334 case BuiltinType::Id:
9335#include "clang/Basic/OpenCLExtensionTypes.def"
9336 case BuiltinType::OCLEvent:
9337 case BuiltinType::OCLClkEvent:
9338 case BuiltinType::OCLQueue:
9339 case BuiltinType::OCLReserveID:
9340 case BuiltinType::OCLSampler:
9341 case BuiltinType::Dependent:
9342#define PPC_VECTOR_TYPE(Name, Id, Size) \
9343 case BuiltinType::Id:
9344#include "clang/Basic/PPCTypes.def"
9345#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
9346#include "clang/Basic/HLSLIntangibleTypes.def"
9347#define BUILTIN_TYPE(KIND, ID)
9348#define PLACEHOLDER_TYPE(KIND, ID) \
9349 case BuiltinType::KIND:
9350#include "clang/AST/BuiltinTypes.def"
9351 llvm_unreachable(
"invalid builtin type for @encode");
9353 llvm_unreachable(
"invalid BuiltinType::Kind value");
9360 if (!
Enum->isFixed())
9370 assert(FD->
isBitField() &&
"not a bitfield - getObjCEncodingForTypeImpl");
9390 if (
const auto *IVD = dyn_cast<ObjCIvarDecl>(FD)) {
9398 S += llvm::utostr(Offset);
9400 if (
const auto *ET =
T->getAsCanonical<EnumType>())
9413 bool VisitBasesAndFields) {
9414 T =
T->getBaseElementTypeUnsafe();
9418 PT->getPointeeType().getTypePtr(),
false);
9420 auto *CXXRD =
T->getAsCXXRecordDecl();
9428 if (!CXXRD->hasDefinition() || !VisitBasesAndFields)
9431 for (
const auto &B : CXXRD->bases())
9436 for (
auto *FD : CXXRD->fields())
9445void ASTContext::getObjCEncodingForTypeImpl(QualType
T, std::string &S,
9446 const ObjCEncOptions Options,
9447 const FieldDecl *FD,
9448 QualType *NotEncodedT)
const {
9450 switch (CT->getTypeClass()) {
9455 if (
const auto *BT = dyn_cast<BuiltinType>(CT))
9463 getObjCEncodingForTypeImpl(
T->
castAs<ComplexType>()->getElementType(), S,
9470 getObjCEncodingForTypeImpl(
T->
castAs<AtomicType>()->getValueType(), S,
9477 case Type::LValueReference:
9478 case Type::RValueReference: {
9481 const auto *PT =
T->
castAs<PointerType>();
9482 if (PT->isObjCSelType()) {
9491 bool isReadOnly =
false;
9496 if (
T->
getAs<TypedefType>()) {
9497 if (Options.IsOutermostType() &&
T.isConstQualified()) {
9501 }
else if (Options.IsOutermostType()) {
9502 QualType P = PointeeTy;
9503 while (
auto PT = P->
getAs<PointerType>())
9514 if (StringRef(S).ends_with(
"nr"))
9515 S.replace(S.end()-2, S.end(),
"rn");
9525 }
else if (
const auto *RTy = PointeeTy->
getAsCanonical<RecordType>()) {
9526 const IdentifierInfo *II = RTy->getDecl()->getIdentifier();
9528 if (II == &
Idents.get(
"objc_class")) {
9533 if (II == &
Idents.get(
"objc_object")) {
9542 RTy, Options.ExpandPointedToStructures()))) {
9551 ObjCEncOptions NewOptions;
9552 if (Options.ExpandPointedToStructures())
9553 NewOptions.setExpandStructures();
9554 getObjCEncodingForTypeImpl(PointeeTy, S, NewOptions,
9555 nullptr, NotEncodedT);
9559 case Type::ConstantArray:
9560 case Type::IncompleteArray:
9561 case Type::VariableArray: {
9568 getObjCEncodingForTypeImpl(
9569 AT->getElementType(), S,
9570 Options.keepingOnly(ObjCEncOptions().setExpandStructures()), FD);
9574 if (
const auto *CAT = dyn_cast<ConstantArrayType>(AT))
9575 S += llvm::utostr(CAT->getZExtSize());
9579 "Unknown array type!");
9583 getObjCEncodingForTypeImpl(
9584 AT->getElementType(), S,
9585 Options.keepingOnly(ObjCEncOptions().setExpandStructures()), FD,
9592 case Type::FunctionNoProto:
9593 case Type::FunctionProto:
9597 case Type::Record: {
9599 S += RDecl->
isUnion() ?
'(' :
'{';
9603 if (
const auto *Spec = dyn_cast<ClassTemplateSpecializationDecl>(RDecl)) {
9604 const TemplateArgumentList &TemplateArgs = Spec->getTemplateArgs();
9605 llvm::raw_string_ostream
OS(S);
9606 printTemplateArgumentList(OS, TemplateArgs.
asArray(),
9612 if (Options.ExpandStructures()) {
9615 getObjCEncodingForStructureImpl(RDecl, S, FD,
true, NotEncodedT);
9617 for (
const auto *Field : RDecl->
fields()) {
9620 S +=
Field->getNameAsString();
9625 if (
Field->isBitField()) {
9626 getObjCEncodingForTypeImpl(
Field->getType(), S,
9627 ObjCEncOptions().setExpandStructures(),
9630 QualType qt =
Field->getType();
9632 getObjCEncodingForTypeImpl(
9634 ObjCEncOptions().setExpandStructures().setIsStructField(), FD,
9640 S += RDecl->
isUnion() ?
')' :
'}';
9644 case Type::BlockPointer: {
9645 const auto *BT =
T->
castAs<BlockPointerType>();
9647 if (Options.EncodeBlockParameters()) {
9648 const auto *FT = BT->getPointeeType()->castAs<FunctionType>();
9652 getObjCEncodingForTypeImpl(FT->getReturnType(), S,
9653 Options.forComponentType(), FD, NotEncodedT);
9657 if (
const auto *FPT = dyn_cast<FunctionProtoType>(FT)) {
9658 for (
const auto &I : FPT->param_types())
9659 getObjCEncodingForTypeImpl(I, S, Options.forComponentType(), FD,
9667 case Type::ObjCObject: {
9671 S +=
"{objc_object=}";
9675 S +=
"{objc_class=}";
9682 case Type::ObjCInterface: {
9685 ObjCInterfaceDecl *OI =
T->
castAs<ObjCObjectType>()->getInterface();
9688 if (Options.ExpandStructures()) {
9690 SmallVector<const ObjCIvarDecl*, 32> Ivars;
9692 for (
unsigned i = 0, e = Ivars.size(); i != e; ++i) {
9693 const FieldDecl *
Field = Ivars[i];
9694 if (
Field->isBitField())
9695 getObjCEncodingForTypeImpl(
Field->getType(), S,
9696 ObjCEncOptions().setExpandStructures(),
9699 getObjCEncodingForTypeImpl(
Field->getType(), S,
9700 ObjCEncOptions().setExpandStructures(), FD,
9708 case Type::ObjCObjectPointer: {
9709 const auto *OPT =
T->
castAs<ObjCObjectPointerType>();
9710 if (OPT->isObjCIdType()) {
9715 if (OPT->isObjCClassType() || OPT->isObjCQualifiedClassType()) {
9723 if (OPT->isObjCQualifiedIdType()) {
9724 getObjCEncodingForTypeImpl(
9726 Options.keepingOnly(ObjCEncOptions()
9727 .setExpandPointedToStructures()
9728 .setExpandStructures()),
9730 if (FD || Options.EncodingProperty() || Options.EncodeClassNames()) {
9734 for (
const auto *I : OPT->quals()) {
9736 S += I->getObjCRuntimeNameAsString();
9745 if (OPT->getInterfaceDecl() &&
9746 (FD || Options.EncodingProperty() || Options.EncodeClassNames())) {
9748 S += OPT->getInterfaceDecl()->getObjCRuntimeNameAsString();
9749 for (
const auto *I : OPT->quals()) {
9751 S += I->getObjCRuntimeNameAsString();
9761 case Type::MemberPointer:
9765 case Type::ExtVector:
9771 case Type::ConstantMatrix:
9784 case Type::DeducedTemplateSpecialization:
9787 case Type::HLSLAttributedResource:
9788 case Type::HLSLInlineSpirv:
9789 case Type::OverflowBehavior:
9790 llvm_unreachable(
"unexpected type");
9792 case Type::ArrayParameter:
9794#define ABSTRACT_TYPE(KIND, BASE)
9795#define TYPE(KIND, BASE)
9796#define DEPENDENT_TYPE(KIND, BASE) \
9798#define NON_CANONICAL_TYPE(KIND, BASE) \
9800#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(KIND, BASE) \
9802#include "clang/AST/TypeNodes.inc"
9803 llvm_unreachable(
"@encode for dependent type!");
9805 llvm_unreachable(
"bad type kind!");
9808void ASTContext::getObjCEncodingForStructureImpl(RecordDecl *RDecl,
9810 const FieldDecl *FD,
9812 QualType *NotEncodedT)
const {
9813 assert(RDecl &&
"Expected non-null RecordDecl");
9814 assert(!RDecl->
isUnion() &&
"Should not be called for unions");
9818 const auto *CXXRec = dyn_cast<CXXRecordDecl>(RDecl);
9819 std::multimap<uint64_t, NamedDecl *> FieldOrBaseOffsets;
9823 for (
const auto &BI : CXXRec->bases()) {
9824 if (!BI.isVirtual()) {
9829 FieldOrBaseOffsets.insert(FieldOrBaseOffsets.upper_bound(offs),
9830 std::make_pair(offs, base));
9835 for (FieldDecl *Field : RDecl->
fields()) {
9836 if (!
Field->isZeroLengthBitField() &&
Field->isZeroSize(*
this))
9839 FieldOrBaseOffsets.insert(FieldOrBaseOffsets.upper_bound(offs),
9840 std::make_pair(offs, Field));
9843 if (CXXRec && includeVBases) {
9844 for (
const auto &BI : CXXRec->vbases()) {
9850 FieldOrBaseOffsets.find(offs) == FieldOrBaseOffsets.end())
9851 FieldOrBaseOffsets.insert(FieldOrBaseOffsets.end(),
9852 std::make_pair(offs, base));
9866 std::multimap<uint64_t, NamedDecl *>::iterator
9867 CurLayObj = FieldOrBaseOffsets.begin();
9869 if (CXXRec && CXXRec->isDynamicClass() &&
9870 (CurLayObj == FieldOrBaseOffsets.end() || CurLayObj->first != 0)) {
9873 std::string recname = CXXRec->getNameAsString();
9874 if (recname.empty()) recname =
"?";
9887 FieldOrBaseOffsets.insert(FieldOrBaseOffsets.upper_bound(offs),
9888 std::make_pair(offs,
nullptr));
9891 for (; CurLayObj != FieldOrBaseOffsets.end(); ++CurLayObj) {
9893 assert(CurOffs <= CurLayObj->first);
9894 if (CurOffs < CurLayObj->first) {
9895 uint64_t padding = CurLayObj->first - CurOffs;
9907 NamedDecl *dcl = CurLayObj->second;
9911 if (
auto *base = dyn_cast<CXXRecordDecl>(dcl)) {
9916 getObjCEncodingForStructureImpl(base, S, FD,
false,
9926 S += field->getNameAsString();
9930 if (field->isBitField()) {
9933 CurOffs += field->getBitWidthValue();
9936 QualType qt = field->getType();
9938 getObjCEncodingForTypeImpl(
9939 qt, S, ObjCEncOptions().setExpandStructures().setIsStructField(),
9950 std::string& S)
const {
9983 if (!ObjCClassDecl) {
9988 return ObjCClassDecl;
9992 if (!ObjCProtocolClassDecl) {
9993 ObjCProtocolClassDecl
10002 return ObjCProtocolClassDecl;
10023 QualType T = Context->getPointerType(Context->CharTy);
10024 return Context->buildImplicitTypedef(
T, Name);
10033 llvm::APInt Size(Context->getTypeSize(Context->getSizeType()), 2);
10034 QualType T = Context->getPointerType(Context->CharTy);
10037 return Context->buildImplicitTypedef(
ArrayType,
"__builtin_zos_va_list");
10046 QualType T = Context->getPointerType(Context->VoidTy);
10047 return Context->buildImplicitTypedef(
T,
"__builtin_va_list");
10050static TypedefDecl *
10054 if (Context->getLangOpts().CPlusPlus) {
10059 &Context->Idents.get(
"std"),
10067 const size_t NumFields = 5;
10069 const char *FieldNames[NumFields];
10072 FieldTypes[0] = Context->getPointerType(Context->VoidTy);
10073 FieldNames[0] =
"__stack";
10076 FieldTypes[1] = Context->getPointerType(Context->VoidTy);
10077 FieldNames[1] =
"__gr_top";
10080 FieldTypes[2] = Context->getPointerType(Context->VoidTy);
10081 FieldNames[2] =
"__vr_top";
10084 FieldTypes[3] = Context->IntTy;
10085 FieldNames[3] =
"__gr_offs";
10088 FieldTypes[4] = Context->IntTy;
10089 FieldNames[4] =
"__vr_offs";
10092 for (
unsigned i = 0; i < NumFields; ++i) {
10097 &Context->Idents.get(FieldNames[i]),
10098 FieldTypes[i],
nullptr,
10110 return Context->buildImplicitTypedef(VaListTagType,
"__builtin_va_list");
10117 VaListTagDecl = Context->buildImplicitRecord(
"__va_list_tag");
10120 const size_t NumFields = 5;
10122 const char *FieldNames[NumFields];
10125 FieldTypes[0] = Context->UnsignedCharTy;
10126 FieldNames[0] =
"gpr";
10129 FieldTypes[1] = Context->UnsignedCharTy;
10130 FieldNames[1] =
"fpr";
10133 FieldTypes[2] = Context->UnsignedShortTy;
10134 FieldNames[2] =
"reserved";
10137 FieldTypes[3] = Context->getPointerType(Context->VoidTy);
10138 FieldNames[3] =
"overflow_arg_area";
10141 FieldTypes[4] = Context->getPointerType(Context->VoidTy);
10142 FieldNames[4] =
"reg_save_area";
10145 for (
unsigned i = 0; i < NumFields; ++i) {
10149 &Context->Idents.get(FieldNames[i]),
10150 FieldTypes[i],
nullptr,
10163 Context->buildImplicitTypedef(VaListTagType,
"__va_list_tag");
10167 std::nullopt, VaListTagTypedefDecl);
10170 llvm::APInt Size(Context->getTypeSize(Context->getSizeType()), 1);
10171 QualType VaListTagArrayType = Context->getConstantArrayType(
10173 return Context->buildImplicitTypedef(VaListTagArrayType,
"__builtin_va_list");
10176static TypedefDecl *
10180 VaListTagDecl = Context->buildImplicitRecord(
"__va_list_tag");
10183 const size_t NumFields = 4;
10185 const char *FieldNames[NumFields];
10188 FieldTypes[0] = Context->UnsignedIntTy;
10189 FieldNames[0] =
"gp_offset";
10192 FieldTypes[1] = Context->UnsignedIntTy;
10193 FieldNames[1] =
"fp_offset";
10196 FieldTypes[2] = Context->getPointerType(Context->VoidTy);
10197 FieldNames[2] =
"overflow_arg_area";
10200 FieldTypes[3] = Context->getPointerType(Context->VoidTy);
10201 FieldNames[3] =
"reg_save_area";
10204 for (
unsigned i = 0; i < NumFields; ++i) {
10209 &Context->Idents.get(FieldNames[i]),
10210 FieldTypes[i],
nullptr,
10224 llvm::APInt Size(Context->getTypeSize(Context->getSizeType()), 1);
10225 QualType VaListTagArrayType = Context->getConstantArrayType(
10227 return Context->buildImplicitTypedef(VaListTagArrayType,
"__builtin_va_list");
10230static TypedefDecl *
10233 RecordDecl *VaListDecl = Context->buildImplicitRecord(
"__va_list");
10234 if (Context->getLangOpts().CPlusPlus) {
10253 &Context->Idents.get(
"__ap"),
10254 Context->getPointerType(Context->VoidTy),
10264 Context->VaListTagDecl = VaListDecl;
10267 CanQualType T = Context->getCanonicalTagType(VaListDecl);
10268 return Context->buildImplicitTypedef(
T,
"__builtin_va_list");
10271static TypedefDecl *
10275 VaListTagDecl = Context->buildImplicitRecord(
"__va_list_tag");
10278 const size_t NumFields = 4;
10280 const char *FieldNames[NumFields];
10283 FieldTypes[0] = Context->LongTy;
10284 FieldNames[0] =
"__gpr";
10287 FieldTypes[1] = Context->LongTy;
10288 FieldNames[1] =
"__fpr";
10291 FieldTypes[2] = Context->getPointerType(Context->VoidTy);
10292 FieldNames[2] =
"__overflow_arg_area";
10295 FieldTypes[3] = Context->getPointerType(Context->VoidTy);
10296 FieldNames[3] =
"__reg_save_area";
10299 for (
unsigned i = 0; i < NumFields; ++i) {
10304 &Context->Idents.get(FieldNames[i]),
10305 FieldTypes[i],
nullptr,
10319 llvm::APInt Size(Context->getTypeSize(Context->getSizeType()), 1);
10320 QualType VaListTagArrayType = Context->getConstantArrayType(
10323 return Context->buildImplicitTypedef(VaListTagArrayType,
"__builtin_va_list");
10329 VaListTagDecl = Context->buildImplicitRecord(
"__va_list_tag");
10332 const size_t NumFields = 3;
10334 const char *FieldNames[NumFields];
10337 FieldTypes[0] = Context->getPointerType(Context->VoidTy);
10338 FieldNames[0] =
"__current_saved_reg_area_pointer";
10341 FieldTypes[1] = Context->getPointerType(Context->VoidTy);
10342 FieldNames[1] =
"__saved_reg_area_end_pointer";
10345 FieldTypes[2] = Context->getPointerType(Context->VoidTy);
10346 FieldNames[2] =
"__overflow_area_pointer";
10349 for (
unsigned i = 0; i < NumFields; ++i) {
10352 SourceLocation(), &Context->Idents.get(FieldNames[i]), FieldTypes[i],
10365 Context->buildImplicitTypedef(VaListTagType,
"__va_list_tag");
10369 std::nullopt, VaListTagTypedefDecl);
10372 llvm::APInt Size(Context->getTypeSize(Context->getSizeType()), 1);
10373 QualType VaListTagArrayType = Context->getConstantArrayType(
10376 return Context->buildImplicitTypedef(VaListTagArrayType,
"__builtin_va_list");
10379static TypedefDecl *
10389 constexpr size_t NumFields = 3;
10390 QualType FieldTypes[NumFields] = {Context->getPointerType(Context->IntTy),
10391 Context->getPointerType(Context->IntTy),
10393 const char *FieldNames[NumFields] = {
"__va_stk",
"__va_reg",
"__va_ndx"};
10396 for (
unsigned i = 0; i < NumFields; ++i) {
10399 &Context->Idents.get(FieldNames[i]), FieldTypes[i],
nullptr,
10411 Context->buildImplicitTypedef(VaListTagType,
"__builtin_va_list");
10413 return VaListTagTypedefDecl;
10439 llvm_unreachable(
"Unhandled __builtin_va_list type kind");
10443 if (!BuiltinVaListDecl) {
10444 BuiltinVaListDecl =
CreateVaListDecl(
this, Target->getBuiltinVaListKind());
10445 assert(BuiltinVaListDecl->isImplicit());
10448 return BuiltinVaListDecl;
10461 if (!BuiltinMSVaListDecl)
10464 return BuiltinMSVaListDecl;
10468 if (!BuiltinZOSVaListDecl)
10471 return BuiltinZOSVaListDecl;
10488 assert(ObjCConstantStringType.isNull() &&
10489 "'NSConstantString' type already set!");
10499 unsigned size = End - Begin;
10500 assert(size > 1 &&
"set is not overloaded!");
10506 NamedDecl **Storage = OT->getStorage();
10529 bool TemplateKeyword,
10534 if (
Template.getAsTemplateDecl()->getKind() == Decl::TemplateTemplateParm) {
10535 assert(!Qualifier &&
"unexpected qualified template template parameter");
10536 assert(TemplateKeyword ==
false);
10541 llvm::FoldingSetNodeID ID;
10544 void *InsertPos =
nullptr;
10546 QualifiedTemplateNames.FindNodeOrInsertPos(ID, InsertPos);
10550 QualifiedTemplateNames.InsertNode(QTN, InsertPos);
10560 llvm::FoldingSetNodeID ID;
10563 void *InsertPos =
nullptr;
10565 DependentTemplateNames.FindNodeOrInsertPos(ID, InsertPos))
10570 DependentTemplateNames.InsertNode(QTN, InsertPos);
10575 Decl *AssociatedDecl,
10578 bool Final)
const {
10579 llvm::FoldingSetNodeID ID;
10583 void *insertPos =
nullptr;
10585 = SubstTemplateTemplateParms.FindNodeOrInsertPos(ID, insertPos);
10589 Replacement, AssociatedDecl, Index,
PackIndex, Final);
10590 SubstTemplateTemplateParms.InsertNode(subst, insertPos);
10598 Decl *AssociatedDecl,
10599 unsigned Index,
bool Final)
const {
10601 llvm::FoldingSetNodeID ID;
10603 AssociatedDecl, Index, Final);
10605 void *InsertPos =
nullptr;
10607 = SubstTemplateTemplateParmPacks.FindNodeOrInsertPos(ID, InsertPos);
10612 SubstTemplateTemplateParmPacks.InsertNode(Subst, InsertPos);
10626 llvm::FoldingSetNodeID ID;
10629 void *InsertPos =
nullptr;
10631 DeducedTemplates.FindNodeOrInsertPos(ID, InsertPos);
10637 DeducedTemplates.InsertNode(DTS, InsertPos);
10660 llvm_unreachable(
"Unhandled TargetInfo::IntType value");
10690 while (
const auto *AT = dyn_cast<ArrayType>(CT))
10691 CT = AT->getElementType();
10723 assert(FirstVec->
isVectorType() &&
"FirstVec should be a vector type");
10724 assert(SecondVec->
isVectorType() &&
"SecondVec should be a vector type");
10781 const auto *LHSOBT = LHS->
getAs<OverflowBehaviorType>();
10782 const auto *RHSOBT = RHS->
getAs<OverflowBehaviorType>();
10784 if (!LHSOBT && !RHSOBT)
10787 if (LHSOBT && RHSOBT) {
10788 if (LHSOBT->getBehaviorKind() != RHSOBT->getBehaviorKind())
10793 QualType LHSUnderlying = LHSOBT ? LHSOBT->desugar() : LHS;
10794 QualType RHSUnderlying = RHSOBT ? RHSOBT->desugar() : RHS;
10796 if (RHSOBT && !LHSOBT) {
10807 auto VScale = Context.getTargetInfo().getVScaleRange(
10814 uint64_t EltSize = Context.getTypeSize(Info.
ElementType);
10818 uint64_t MinElts = Info.
EC.getKnownMinValue();
10819 return VScale->first * MinElts * EltSize;
10827 "Expected RVV builtin type and vector type!");
10867 return IsValidCast(FirstType, SecondType) ||
10868 IsValidCast(SecondType, FirstType);
10876 "Expected RVV builtin type and vector type!");
10883 if (!BT->isRVVVLSBuiltinType())
10903 return VecTy->getElementType().getCanonicalType()->isIntegerType() &&
10910 return IsLaxCompatible(FirstType, SecondType) ||
10911 IsLaxCompatible(SecondType, FirstType);
10917 if (
const AttributedType *
Attr = dyn_cast<AttributedType>(Ty)) {
10918 if (
Attr->getAttrKind() == attr::ObjCOwnership)
10921 Ty =
Attr->getModifiedType();
10925 Ty =
Paren->getInnerType();
10957 for (
auto *lhsProto : lhs->
quals()) {
10958 bool match =
false;
10959 for (
auto *rhsProto : rhs->
quals()) {
10990 for (
auto *I : lhs->
quals()) {
10994 if (!rhsID->ClassImplementsProtocol(I,
true))
11002 for (
auto *lhsProto : lhs->
quals()) {
11003 bool match =
false;
11008 for (
auto *rhsProto : rhs->
quals()) {
11018 for (
auto *I : lhs->
quals()) {
11022 if (rhsID->ClassImplementsProtocol(I,
true)) {
11039 for (
auto *lhsProto : lhs->
quals()) {
11040 bool match =
false;
11047 for (
auto *rhsProto : rhs->
quals()) {
11066 if (LHSInheritedProtocols.empty() && lhs->
qual_empty())
11068 for (
auto *lhsProto : LHSInheritedProtocols) {
11069 bool match =
false;
11070 for (
auto *rhsProto : rhs->
quals()) {
11095 if (LHS->isObjCUnqualifiedId() || RHS->isObjCUnqualifiedId())
11100 auto finish = [&](
bool succeeded) ->
bool {
11104 if (!RHS->isKindOfType())
11115 if (LHS->isObjCQualifiedId() || RHS->isObjCQualifiedId()) {
11120 if (LHS->isObjCQualifiedClass() && RHS->isObjCQualifiedClass()) {
11125 if (LHS->isObjCClass() && RHS->isObjCClass()) {
11130 if (LHS->getInterface() && RHS->getInterface()) {
11145 bool BlockReturnType) {
11149 auto finish = [&](
bool succeeded) ->
bool {
11174 if (
getLangOpts().CompatibilityQualifiedIdBlockParamTypeChecking)
11178 (!BlockReturnType &&
11182 (BlockReturnType ? LHSOPT : RHSOPT),
11183 (BlockReturnType ? RHSOPT : LHSOPT),
false));
11191 return finish(BlockReturnType);
11193 return finish(!BlockReturnType);
11205 return (*lhs)->getName().compare((*rhs)->getName());
11222 assert(LHS->getInterface() &&
"LHS must have an interface base");
11223 assert(RHS->getInterface() &&
"RHS must have an interface base");
11229 for (
auto *proto : LHS->quals()) {
11230 Context.CollectInheritedProtocols(proto, LHSProtocolSet);
11234 Context.CollectInheritedProtocols(LHS->getInterface(), LHSProtocolSet);
11240 for (
auto *proto : RHS->quals()) {
11241 Context.CollectInheritedProtocols(proto, RHSProtocolSet);
11245 Context.CollectInheritedProtocols(RHS->getInterface(), RHSProtocolSet);
11248 for (
auto *proto : LHSProtocolSet) {
11249 if (RHSProtocolSet.count(proto))
11250 IntersectionSet.push_back(proto);
11256 Context.CollectInheritedProtocols(CommonBase, ImpliedProtocols);
11259 if (!ImpliedProtocols.empty()) {
11261 return ImpliedProtocols.contains(proto);
11266 llvm::array_pod_sort(IntersectionSet.begin(), IntersectionSet.end(),
11276 if (lhsOPT && rhsOPT)
11282 if (lhsBlock && rhsBlock)
11287 if ((lhsOPT && lhsOPT->isObjCIdType() && rhsBlock) ||
11299 bool stripKindOf) {
11300 if (lhsArgs.size() != rhsArgs.size())
11307 for (
unsigned i = 0, n = lhsArgs.size(); i != n; ++i) {
11313 if (!stripKindOf ||
11314 !ctx.
hasSameType(lhsArgs[i].stripObjCKindOfType(ctx),
11315 rhsArgs[i].stripObjCKindOfType(ctx))) {
11343 if (!LDecl || !RDecl)
11349 bool anyKindOf = LHS->isKindOfType() || RHS->isKindOfType();
11353 llvm::SmallDenseMap<const ObjCInterfaceDecl *, const ObjCObjectType *, 4>
11358 LHSAncestors[LHS->getInterface()->getCanonicalDecl()] = LHS;
11363 bool anyChanges =
false;
11364 if (LHS->isSpecialized() && RHS->isSpecialized()) {
11367 LHS->getTypeArgs(), RHS->getTypeArgs(),
11370 }
else if (LHS->isSpecialized() != RHS->isSpecialized()) {
11381 if (!Protocols.empty())
11387 if (anyChanges || LHS->isKindOfType() != anyKindOf) {
11390 anyKindOf || LHS->isKindOfType());
11398 QualType LHSSuperType = LHS->getSuperClassType();
11399 if (LHSSuperType.
isNull())
11408 auto KnownLHS = LHSAncestors.find(RHS->getInterface()->getCanonicalDecl());
11409 if (KnownLHS != LHSAncestors.end()) {
11410 LHS = KnownLHS->second;
11414 bool anyChanges =
false;
11415 if (LHS->isSpecialized() && RHS->isSpecialized()) {
11418 LHS->getTypeArgs(), RHS->getTypeArgs(),
11421 }
else if (LHS->isSpecialized() != RHS->isSpecialized()) {
11432 if (!Protocols.empty())
11437 if (anyChanges || RHS->isKindOfType() != anyKindOf) {
11440 anyKindOf || RHS->isKindOfType());
11448 QualType RHSSuperType = RHS->getSuperClassType();
11449 if (RHSSuperType.
isNull())
11460 assert(LHS->getInterface() &&
"LHS is not an interface type");
11461 assert(RHS->getInterface() &&
"RHS is not an interface type");
11466 bool IsSuperClass = LHSInterface->
isSuperClassOf(RHS->getInterface());
11473 if (LHS->getNumProtocols() > 0) {
11482 for (
auto *RHSPI : RHS->quals())
11485 if (SuperClassInheritedProtocols.empty())
11488 for (
const auto *LHSProto : LHS->quals()) {
11489 bool SuperImplementsProtocol =
false;
11490 for (
auto *SuperClassProto : SuperClassInheritedProtocols)
11491 if (SuperClassProto->lookupProtocolNamed(LHSProto->getIdentifier())) {
11492 SuperImplementsProtocol =
true;
11495 if (!SuperImplementsProtocol)
11501 if (LHS->isSpecialized()) {
11506 RHSSuper = RHSSuper->getSuperClassType()->castAs<
ObjCObjectType>();
11509 if (RHSSuper->isSpecialized() &&
11511 LHS->getTypeArgs(), RHSSuper->getTypeArgs(),
11525 if (!LHSOPT || !RHSOPT)
11543 bool CompareUnqualified) {
11562 bool OfBlockPointer,
11564 if (
const RecordType *UT =
T->getAsUnionType()) {
11566 if (UD->
hasAttr<TransparentUnionAttr>()) {
11567 for (
const auto *I : UD->
fields()) {
11568 QualType ET = I->getType().getUnqualifiedType();
11582 bool OfBlockPointer,
11603 bool IsConditionalOperator) {
11606 const auto *lproto = dyn_cast<FunctionProtoType>(lbase);
11607 const auto *rproto = dyn_cast<FunctionProtoType>(rbase);
11608 bool allLTypes =
true;
11609 bool allRTypes =
true;
11613 if (OfBlockPointer) {
11615 QualType LHS = lbase->getReturnType();
11617 if (!UnqualifiedResult)
11619 retType =
mergeTypes(LHS, RHS,
true, UnqualifiedResult,
true);
11684 bool NoReturn = IsConditionalOperator
11694 std::optional<FunctionEffectSet> MergedFX;
11696 if (lproto && rproto) {
11697 assert((AllowCXX ||
11698 (!lproto->hasExceptionSpec() && !rproto->hasExceptionSpec())) &&
11699 "C++ shouldn't be here");
11701 if (lproto->getNumParams() != rproto->getNumParams())
11705 if (lproto->isVariadic() != rproto->isVariadic())
11708 if (lproto->getMethodQuals() != rproto->getMethodQuals())
11712 if (lproto->getExtraAttributeInfo().CFISalt !=
11713 rproto->getExtraAttributeInfo().CFISalt)
11719 if (LHSFX != RHSFX) {
11720 if (IsConditionalOperator)
11729 if (*MergedFX != LHSFX)
11731 if (*MergedFX != RHSFX)
11736 bool canUseLeft, canUseRight;
11748 for (
unsigned i = 0, n = lproto->getNumParams(); i < n; i++) {
11749 QualType lParamType = lproto->getParamType(i).getUnqualifiedType();
11750 QualType rParamType = rproto->getParamType(i).getUnqualifiedType();
11752 lParamType, rParamType, OfBlockPointer,
Unqualified);
11759 types.push_back(paramType);
11771 if (allLTypes)
return lhs;
11772 if (allRTypes)
return rhs;
11777 newParamInfos.empty() ?
nullptr : newParamInfos.data();
11783 if (lproto) allRTypes =
false;
11784 if (rproto) allLTypes =
false;
11788 assert((AllowCXX || !proto->
hasExceptionSpec()) &&
"C++ shouldn't be here");
11796 for (
unsigned i = 0, n = proto->
getNumParams(); i < n; ++i) {
11802 paramTy = ED->getIntegerType();
11812 if (allLTypes)
return lhs;
11813 if (allRTypes)
return rhs;
11822 if (allLTypes)
return lhs;
11823 if (allRTypes)
return rhs;
11829 QualType other,
bool isBlockReturnType) {
11835 ET->getDecl()->getDefinitionOrSelf()->getIntegerType();
11836 if (underlyingType.
isNull())
11838 if (Context.hasSameType(underlyingType, other))
11844 Context.getTypeSize(underlyingType) == Context.getTypeSize(other))
11853 if (LangOpts.CPlusPlus || !LangOpts.C23)
11874 bool BlockReturnType,
bool IsConditionalOperator) {
11875 const auto *LHSOBT = LHS->
getAs<OverflowBehaviorType>();
11876 const auto *RHSOBT = RHS->
getAs<OverflowBehaviorType>();
11878 if (!LHSOBT && !RHSOBT)
11879 return std::nullopt;
11883 if (LHSOBT->getBehaviorKind() != RHSOBT->getBehaviorKind())
11887 LHSOBT->getUnderlyingType(), RHSOBT->getUnderlyingType(),
11888 OfBlockPointer,
Unqualified, BlockReturnType, IsConditionalOperator);
11890 if (MergedUnderlying.
isNull())
11894 if (LHSOBT->getUnderlyingType() == RHSOBT->getUnderlyingType())
11897 LHSOBT->getBehaviorKind(),
11906 return mergeTypes(LHSOBT->getUnderlyingType(), RHS, OfBlockPointer,
11907 Unqualified, BlockReturnType, IsConditionalOperator);
11910 return mergeTypes(LHS, RHSOBT->getUnderlyingType(), OfBlockPointer,
11911 Unqualified, BlockReturnType, IsConditionalOperator);
11916 bool IsConditionalOperator) {
11927 if (LangOpts.OpenMP && LHSRefTy && RHSRefTy &&
11931 if (LHSRefTy || RHSRefTy)
11934 if (std::optional<QualType> MergedOBT =
11936 BlockReturnType, IsConditionalOperator))
11948 if (LHSCan == RHSCan)
11953 Qualifiers RQuals = RHSCan.getLocalQualifiers();
11954 if (LQuals != RQuals) {
11971 assert((GC_L != GC_R) &&
"unequal qualifier sets had only equal elements");
11992 if (LHSClass == Type::FunctionProto) LHSClass = Type::FunctionNoProto;
11993 if (RHSClass == Type::FunctionProto) RHSClass = Type::FunctionNoProto;
11996 if (LHSClass == Type::VariableArray || LHSClass == Type::IncompleteArray)
11997 LHSClass = Type::ConstantArray;
11998 if (RHSClass == Type::VariableArray || RHSClass == Type::IncompleteArray)
11999 RHSClass = Type::ConstantArray;
12002 if (LHSClass == Type::ObjCInterface) LHSClass = Type::ObjCObject;
12003 if (RHSClass == Type::ObjCInterface) RHSClass = Type::ObjCObject;
12006 if (LHSClass == Type::ExtVector) LHSClass = Type::Vector;
12007 if (RHSClass == Type::ExtVector) RHSClass = Type::Vector;
12010 if (LHSClass != RHSClass) {
12020 if (OfBlockPointer && !BlockReturnType) {
12028 if (
const auto *AT = LHS->
getAs<AutoType>()) {
12029 if (!AT->isDeduced() && AT->isGNUAutoType())
12032 if (
const auto *AT = RHS->
getAs<AutoType>()) {
12033 if (!AT->isDeduced() && AT->isGNUAutoType())
12040 switch (LHSClass) {
12041#define TYPE(Class, Base)
12042#define ABSTRACT_TYPE(Class, Base)
12043#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base) case Type::Class:
12044#define NON_CANONICAL_TYPE(Class, Base) case Type::Class:
12045#define DEPENDENT_TYPE(Class, Base) case Type::Class:
12046#include "clang/AST/TypeNodes.inc"
12047 llvm_unreachable(
"Non-canonical and dependent types shouldn't get here");
12050 case Type::DeducedTemplateSpecialization:
12051 case Type::LValueReference:
12052 case Type::RValueReference:
12053 case Type::MemberPointer:
12054 llvm_unreachable(
"C++ should never be in mergeTypes");
12056 case Type::ObjCInterface:
12057 case Type::IncompleteArray:
12058 case Type::VariableArray:
12059 case Type::FunctionProto:
12060 case Type::ExtVector:
12061 case Type::OverflowBehavior:
12062 llvm_unreachable(
"Types are eliminated above");
12064 case Type::Pointer:
12075 if (ResultType.
isNull())
12083 case Type::BlockPointer:
12108 if (ResultType.
isNull())
12127 if (ResultType.
isNull())
12135 case Type::ConstantArray:
12150 if (ResultType.
isNull())
12158 if (LVAT || RVAT) {
12161 -> std::pair<bool,llvm::APInt> {
12163 std::optional<llvm::APSInt> TheInt;
12166 return std::make_pair(
true, *TheInt);
12167 return std::make_pair(
false, llvm::APSInt());
12170 return std::make_pair(
true, CAT->getSize());
12171 return std::make_pair(
false, llvm::APInt());
12174 bool HaveLSize, HaveRSize;
12175 llvm::APInt LSize, RSize;
12176 std::tie(HaveLSize, LSize) = SizeFetch(LVAT, LCAT);
12177 std::tie(HaveRSize, RSize) = SizeFetch(RVAT, RCAT);
12178 if (HaveLSize && HaveRSize && !llvm::APInt::isSameValue(LSize, RSize))
12212 case Type::FunctionNoProto:
12214 false, IsConditionalOperator);
12218 case Type::Builtin:
12221 case Type::Complex:
12230 case Type::ConstantMatrix:
12235 case Type::ObjCObject: {
12244 case Type::ObjCObjectPointer:
12245 if (OfBlockPointer) {
12257 assert(LHS != RHS &&
12258 "Equivalent pipe types should have already been handled!");
12260 case Type::ArrayParameter:
12261 assert(LHS != RHS &&
12262 "Equivalent ArrayParameter types should have already been handled!");
12264 case Type::BitInt: {
12272 if (LHSUnsigned != RHSUnsigned)
12275 if (LHSBits != RHSBits)
12279 case Type::HLSLAttributedResource: {
12280 const HLSLAttributedResourceType *LHSTy =
12281 LHS->
castAs<HLSLAttributedResourceType>();
12282 const HLSLAttributedResourceType *RHSTy =
12283 RHS->
castAs<HLSLAttributedResourceType>();
12284 assert(LHSTy->getWrappedType() == RHSTy->getWrappedType() &&
12285 LHSTy->getWrappedType()->isHLSLResourceType() &&
12286 "HLSLAttributedResourceType should always wrap __hlsl_resource_t");
12288 if (LHSTy->getAttrs() == RHSTy->getAttrs() &&
12289 LHSTy->getContainedType() == RHSTy->getContainedType())
12293 case Type::HLSLInlineSpirv:
12294 const HLSLInlineSpirvType *LHSTy = LHS->
castAs<HLSLInlineSpirvType>();
12295 const HLSLInlineSpirvType *RHSTy = RHS->
castAs<HLSLInlineSpirvType>();
12297 if (LHSTy->getOpcode() == RHSTy->getOpcode() &&
12298 LHSTy->getSize() == RHSTy->getSize() &&
12299 LHSTy->getAlignment() == RHSTy->getAlignment()) {
12300 for (
size_t I = 0; I < LHSTy->getOperands().size(); I++)
12301 if (LHSTy->getOperands()[I] != RHSTy->getOperands()[I])
12309 llvm_unreachable(
"Invalid Type::Class!");
12314 bool &CanUseFirst,
bool &CanUseSecond,
12316 assert(NewParamInfos.empty() &&
"param info list not empty");
12317 CanUseFirst = CanUseSecond =
true;
12323 if (!FirstHasInfo && !SecondHasInfo)
12326 bool NeedParamInfo =
false;
12330 for (
size_t I = 0; I < E; ++I) {
12341 bool FirstNoEscape = FirstParam.
isNoEscape();
12342 bool SecondNoEscape = SecondParam.
isNoEscape();
12343 bool IsNoEscape = FirstNoEscape && SecondNoEscape;
12345 if (NewParamInfos.back().getOpaqueValue())
12346 NeedParamInfo =
true;
12347 if (FirstNoEscape != IsNoEscape)
12348 CanUseFirst =
false;
12349 if (SecondNoEscape != IsNoEscape)
12350 CanUseSecond =
false;
12353 if (!NeedParamInfo)
12354 NewParamInfos.clear();
12360 if (
auto It = ObjCLayouts.find(D); It != ObjCLayouts.end()) {
12361 It->second =
nullptr;
12362 for (
auto *SubClass : ObjCSubClasses.lookup(D))
12374 if (LHSCan == RHSCan)
12376 if (RHSCan->isFunctionType()) {
12385 if (ResReturnType.
isNull())
12387 if (ResReturnType == NewReturnType || ResReturnType == OldReturnType) {
12404 Qualifiers RQuals = RHSCan.getLocalQualifiers();
12405 if (LQuals != RQuals) {
12418 assert((GC_L != GC_R) &&
"unequal qualifier sets had only equal elements");
12434 if (ResQT == LHSBaseQT)
12436 if (ResQT == RHSBaseQT)
12447 if (
const auto *ED =
T->getAsEnumDecl())
12448 T = ED->getIntegerType();
12449 if (
T->isBooleanType())
12452 return EIT->getNumBits();
12458 assert((
T->hasIntegerRepresentation() ||
T->isEnumeralType() ||
12459 T->isFixedPointType()) &&
12460 "Unexpected type");
12465 VTy->getNumElements(), VTy->getVectorKind());
12472 if (
const auto *OBT =
T->getAs<OverflowBehaviorType>())
12474 OBT->getBehaviorKind(),
12479 if (
const auto *ED =
T->getAsEnumDecl())
12480 T = ED->getIntegerType();
12483 case BuiltinType::Char_U:
12485 case BuiltinType::Char_S:
12486 case BuiltinType::SChar:
12487 case BuiltinType::Char8:
12489 case BuiltinType::Short:
12491 case BuiltinType::Int:
12493 case BuiltinType::Long:
12495 case BuiltinType::LongLong:
12497 case BuiltinType::Int128:
12502 case BuiltinType::WChar_S:
12505 case BuiltinType::ShortAccum:
12507 case BuiltinType::Accum:
12509 case BuiltinType::LongAccum:
12511 case BuiltinType::SatShortAccum:
12513 case BuiltinType::SatAccum:
12515 case BuiltinType::SatLongAccum:
12517 case BuiltinType::ShortFract:
12519 case BuiltinType::Fract:
12521 case BuiltinType::LongFract:
12523 case BuiltinType::SatShortFract:
12525 case BuiltinType::SatFract:
12527 case BuiltinType::SatLongFract:
12530 assert((
T->hasUnsignedIntegerRepresentation() ||
12531 T->isUnsignedFixedPointType()) &&
12532 "Unexpected signed integer or fixed point type");
12538 assert((
T->hasIntegerRepresentation() ||
T->isEnumeralType() ||
12539 T->isFixedPointType()) &&
12540 "Unexpected type");
12545 VTy->getNumElements(), VTy->getVectorKind());
12553 if (
const auto *ED =
T->getAsEnumDecl())
12554 T = ED->getIntegerType();
12557 case BuiltinType::Char_S:
12559 case BuiltinType::Char_U:
12560 case BuiltinType::UChar:
12561 case BuiltinType::Char8:
12563 case BuiltinType::UShort:
12565 case BuiltinType::UInt:
12567 case BuiltinType::ULong:
12569 case BuiltinType::ULongLong:
12571 case BuiltinType::UInt128:
12576 case BuiltinType::WChar_U:
12579 case BuiltinType::UShortAccum:
12581 case BuiltinType::UAccum:
12583 case BuiltinType::ULongAccum:
12585 case BuiltinType::SatUShortAccum:
12587 case BuiltinType::SatUAccum:
12589 case BuiltinType::SatULongAccum:
12591 case BuiltinType::UShortFract:
12593 case BuiltinType::UFract:
12595 case BuiltinType::ULongFract:
12597 case BuiltinType::SatUShortFract:
12599 case BuiltinType::SatUFract:
12601 case BuiltinType::SatULongFract:
12605 (
T->hasSignedIntegerRepresentation() ||
T->isSignedFixedPointType()) &&
12606 "Unexpected signed integer or fixed point type");
12631 bool AllowTypeModifiers) {
12635 bool IsChar =
false, IsShort =
false;
12636 RequiresICE =
false;
12641 bool IsSpecial =
false;
12645 default: Done =
true; --Str;
break;
12647 RequiresICE =
true;
12650 assert(!
Unsigned &&
"Can't use both 'S' and 'U' modifiers!");
12651 assert(!
Signed &&
"Can't use 'S' modifier multiple times!");
12655 assert(!
Signed &&
"Can't use both 'S' and 'U' modifiers!");
12656 assert(!
Unsigned &&
"Can't use 'U' modifier multiple times!");
12661 assert(!IsSpecial &&
12662 "Can't use two 'N', 'W', 'Z', 'O', 'B', or 'T' modifiers!");
12663 assert(HowLong == 0 &&
"Can't use both 'L' and 'B' modifiers!");
12671 assert(!IsSpecial &&
12672 "Can't use two 'N', 'W', 'Z', 'O', 'B', or 'T' modifiers!");
12673 assert(HowLong == 0 &&
"Can't use both 'L' and 'T' modifiers!");
12680 assert(!IsSpecial &&
12681 "Can't use 'L' with 'W', 'N', 'Z', 'O', 'B', or 'T' modifiers");
12682 assert(HowLong <= 2 &&
"Can't have LLLL modifier");
12687 assert(!IsSpecial &&
"Can't use two 'N', 'W', 'Z' or 'O' modifiers!");
12688 assert(HowLong == 0 &&
"Can't use both 'L' and 'N' modifiers!");
12692 if (Context.getTargetInfo().getLongWidth() == 32)
12697 assert(!IsSpecial &&
"Can't use two 'N', 'W', 'Z' or 'O' modifiers!");
12698 assert(HowLong == 0 &&
"Can't use both 'L' and 'W' modifiers!");
12702 switch (Context.getTargetInfo().getInt64Type()) {
12704 llvm_unreachable(
"Unexpected integer type");
12715 assert(!IsSpecial &&
"Can't use two 'N', 'W', 'Z' or 'O' modifiers!");
12716 assert(HowLong == 0 &&
"Can't use both 'L' and 'Z' modifiers!");
12720 switch (Context.getTargetInfo().getIntTypeByWidth(32,
true)) {
12722 llvm_unreachable(
"Unexpected integer type");
12735 assert(!IsSpecial &&
"Can't use two 'N', 'W', 'Z' or 'O' modifiers!");
12736 assert(HowLong == 0 &&
"Can't use both 'L' and 'O' modifiers!");
12740 if (Context.getLangOpts().OpenCL)
12753 llvm_unreachable(
"Unknown builtin type letter!");
12756 "Bad modifiers used with 'x'!");
12757 Type = Context.Float16Ty;
12761 "Bad modifiers used with 'y'!");
12762 Type = Context.BFloat16Ty;
12766 "Bad modifiers used with 'v'!");
12767 Type = Context.VoidTy;
12771 "Bad modifiers used with 'h'!");
12772 Type = Context.HalfTy;
12776 "Bad modifiers used with 'f'!");
12777 Type = Context.FloatTy;
12781 "Bad modifiers used with 'd'!");
12783 Type = Context.LongDoubleTy;
12784 else if (HowLong == 2)
12785 Type = Context.Float128Ty;
12787 Type = Context.DoubleTy;
12790 assert(HowLong == 0 &&
"Bad modifiers used with 's'!");
12792 Type = Context.UnsignedShortTy;
12794 Type = Context.ShortTy;
12798 Type =
Unsigned ? Context.UnsignedCharTy : Context.SignedCharTy;
12800 Type =
Unsigned ? Context.UnsignedShortTy : Context.ShortTy;
12801 else if (HowLong == 3)
12802 Type =
Unsigned ? Context.UnsignedInt128Ty : Context.Int128Ty;
12803 else if (HowLong == 2)
12804 Type =
Unsigned ? Context.UnsignedLongLongTy : Context.LongLongTy;
12805 else if (HowLong == 1)
12806 Type =
Unsigned ? Context.UnsignedLongTy : Context.LongTy;
12808 Type =
Unsigned ? Context.UnsignedIntTy : Context.IntTy;
12811 assert(HowLong == 0 &&
"Bad modifiers used with 'c'!");
12813 Type = Context.SignedCharTy;
12815 Type = Context.UnsignedCharTy;
12817 Type = Context.CharTy;
12820 assert(HowLong == 0 && !
Signed && !
Unsigned &&
"Bad modifiers for 'b'!");
12821 Type = Context.BoolTy;
12824 assert(HowLong == 0 && !
Signed && !
Unsigned &&
"Bad modifiers for 'z'!");
12825 Type = Context.getSizeType();
12828 assert(HowLong == 0 && !
Signed && !
Unsigned &&
"Bad modifiers for 'w'!");
12829 Type = Context.getWideCharType();
12832 Type = Context.getCFConstantStringType();
12835 Type = Context.getObjCIdType();
12838 Type = Context.getObjCSelType();
12841 Type = Context.getObjCSuperType();
12844 Type = Context.getBuiltinVaListType();
12845 assert(!
Type.isNull() &&
"builtin va list type not initialized!");
12856 Type = Context.getBuiltinVaListType();
12857 assert(!
Type.isNull() &&
"builtin va list type not initialized!");
12859 Type = Context.getArrayDecayedType(
Type);
12861 Type = Context.getLValueReferenceType(
Type);
12865 unsigned NumElements = strtoul(Str, &End, 10);
12866 assert(End != Str &&
"Missing vector size");
12870 RequiresICE,
false);
12871 assert(!RequiresICE &&
"Can't require vector ICE");
12873 Type = Context.getScalableVectorType(ElementType, NumElements);
12879 Type = Context.SveCountTy;
12883 Type = Context.AMDGPUBufferRsrcTy;
12887 Type = Context.AMDGPUFeaturePredicateTy;
12891 Type = Context.AMDGPUTextureTy;
12895 Type = Context.HLSLResourceTy;
12899 llvm_unreachable(
"Unexpected target builtin type");
12905 unsigned NumElements = strtoul(Str, &End, 10);
12906 assert(End != Str &&
"Missing vector size");
12910 RequiresICE,
false);
12911 assert(!RequiresICE &&
"Can't require vector ICE");
12920 unsigned NumElements = strtoul(Str, &End, 10);
12921 assert(End != Str &&
"Missing vector size");
12927 Type = Context.getExtVectorType(ElementType, NumElements);
12933 assert(!RequiresICE &&
"Can't require complex ICE");
12934 Type = Context.getComplexType(ElementType);
12938 Type = Context.getPointerDiffType();
12941 Type = Context.getFILEType();
12942 if (
Type.isNull()) {
12949 Type = Context.getsigjmp_bufType();
12951 Type = Context.getjmp_bufType();
12953 if (
Type.isNull()) {
12959 assert(HowLong == 0 && !
Signed && !
Unsigned &&
"Bad modifiers for 'K'!");
12960 Type = Context.getucontext_tType();
12962 if (
Type.isNull()) {
12968 Type = Context.getProcessIDType();
12971 Type = Context.MFloat8Ty;
12976 Done = !AllowTypeModifiers;
12978 switch (
char c = *Str++) {
12979 default: Done =
true; --Str;
break;
12985 unsigned AddrSpace = strtoul(Str, &End, 10);
12988 Type = Context.getAddrSpaceQualType(
12990 Context.getLangASForBuiltinAddressSpace(AddrSpace));
12994 Type = Context.getPointerType(
Type);
12996 Type = Context.getLValueReferenceType(
Type);
13004 Type = Context.getVolatileType(
Type);
13013 "Integer constant 'I' type must be an integer");
13026 bool AllowTypeModifiers)
const {
13033 unsigned *IntegerConstantArgs)
const {
13034 const char *TypeStr =
BuiltinInfo.getTypeString(Id);
13035 if (TypeStr[0] ==
'\0') {
13042 bool RequiresICE =
false;
13045 RequiresICE,
true);
13049 assert(!RequiresICE &&
"Result of intrinsic cannot be required to be an ICE");
13051 while (TypeStr[0] && TypeStr[0] !=
'.') {
13058 if (RequiresICE && IntegerConstantArgs)
13059 *IntegerConstantArgs |= 1 << ArgTypes.size();
13065 ArgTypes.push_back(Ty);
13068 if (Id == Builtin::BI__GetExceptionInfo)
13071 assert((TypeStr[0] !=
'.' || TypeStr[1] == 0) &&
13072 "'.' should only occur at end of builtin type list!");
13074 bool Variadic = (TypeStr[0] ==
'.');
13081 if (ArgTypes.empty() && Variadic && !
getLangOpts().requiresStrictPrototypes())
13131 if ((!Context.getLangOpts().CPlusPlus &&
13132 !Context.getTargetInfo().getCXXABI().isMicrosoft() &&
13133 !FD->
hasAttr<DLLExportAttr>()) ||
13134 FD->
hasAttr<GNUInlineAttr>()) {
13153 if (Context.getTargetInfo().getCXXABI().isMicrosoft() &&
13156 !FD->
hasAttr<DLLExportAttr>()) {
13177 if (D->
hasAttr<DLLImportAttr>()) {
13180 }
else if (D->
hasAttr<DLLExportAttr>()) {
13183 }
else if (Context.getLangOpts().CUDA && Context.getLangOpts().CUDAIsDevice) {
13186 if (D->
hasAttr<CUDAGlobalAttr>() &&
13195 if (Context.shouldExternalize(D))
13210 switch (Source->hasExternalDefinitions(D)) {
13237 if (Context.getLangOpts().CPlusPlus &&
13238 Context.getLangOpts().IncrementalExtensions &&
13254 if (!LexicalContext)
13259 auto StaticLocalLinkage =
13271 return StaticLocalLinkage;
13277 if (Context.isMSStaticDataMemberInlineDefinition(VD))
13283 switch (Context.getInlineVariableDefinitionKind(VD)) {
13298 return StrongLinkage;
13301 return Context.getTargetInfo().getCXXABI().isMicrosoft() &&
13316 llvm_unreachable(
"Invalid Linkage!");
13326 if (
const auto *VD = dyn_cast<VarDecl>(D)) {
13327 if (!VD->isFileVarDecl())
13332 if (VD->getDescribedVarTemplate() ||
13335 }
else if (
const auto *FD = dyn_cast<FunctionDecl>(D)) {
13361 if (D->
hasAttr<WeakRefAttr>())
13368 if (LangOpts.SYCLIsDevice)
13370 D->
hasAttr<SYCLExternalAttr>());
13376 if (
const auto *FD = dyn_cast<FunctionDecl>(D)) {
13378 if (!FD->doesThisDeclarationHaveABody())
13379 return FD->doesDeclarationForceExternallyVisibleDefinition();
13382 if (FD->
hasAttr<ConstructorAttr>() || FD->
hasAttr<DestructorAttr>())
13387 if (
getTargetInfo().getCXXABI().canKeyFunctionBeInline()) {
13388 if (
const auto *MD = dyn_cast<CXXMethodDecl>(FD)) {
13407 assert(VD->isFileVarDecl() &&
"Expected file scoped var");
13411 if (LangOpts.OpenMP &&
13412 OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(VD))
13419 if (VD->shouldEmitInExternalSource())
13432 if (VD->needsDestruction(*
this))
13436 if (VD->hasInitWithSideEffects())
13441 if (
const auto *DD = dyn_cast<DecompositionDecl>(VD)) {
13442 for (
const auto *BD : DD->flat_bindings())
13443 if (
const auto *BindingVD = BD->getHoldingVar())
13453 llvm::function_ref<
void(
FunctionDecl *)> Pred)
const {
13454 assert(FD->
isMultiVersion() &&
"Only valid for multiversioned functions");
13455 llvm::SmallDenseSet<const FunctionDecl*, 4> SeenDecls;
13460 for (
auto *CurDecl :
13464 SeenDecls.insert(CurFD).second) {
13471 bool IsCXXMethod)
const {
13474 return ABI->getDefaultMethodCallConv(IsVariadic);
13476 switch (LangOpts.getDefaultCallingConv()) {
13504 return Target->getDefaultCallingConv();
13509 return ABI->isNearlyEmpty(RD);
13514 auto ABI = Target->getCXXABI();
13515 if (ABI.isMicrosoft())
13521 return VTContext.get();
13527 switch (
T->getCXXABI().getKind()) {
13528 case TargetCXXABI::AppleARM64:
13529 case TargetCXXABI::Fuchsia:
13530 case TargetCXXABI::GenericAArch64:
13531 case TargetCXXABI::GenericItanium:
13532 case TargetCXXABI::GenericARM:
13533 case TargetCXXABI::GenericMIPS:
13534 case TargetCXXABI::iOS:
13535 case TargetCXXABI::WebAssembly:
13536 case TargetCXXABI::WatchOS:
13537 case TargetCXXABI::XL:
13539 case TargetCXXABI::Microsoft:
13542 llvm_unreachable(
"Unsupported ABI");
13546 assert(
T.getCXXABI().getKind() != TargetCXXABI::Microsoft &&
13547 "Device mangle context does not support Microsoft mangling.");
13548 switch (
T.getCXXABI().getKind()) {
13549 case TargetCXXABI::AppleARM64:
13550 case TargetCXXABI::Fuchsia:
13551 case TargetCXXABI::GenericAArch64:
13552 case TargetCXXABI::GenericItanium:
13553 case TargetCXXABI::GenericARM:
13554 case TargetCXXABI::GenericMIPS:
13555 case TargetCXXABI::iOS:
13556 case TargetCXXABI::WebAssembly:
13557 case TargetCXXABI::WatchOS:
13558 case TargetCXXABI::XL:
13562 if (
const auto *RD = dyn_cast<CXXRecordDecl>(ND))
13563 return RD->getDeviceLambdaManglingNumber();
13564 return std::nullopt;
13567 case TargetCXXABI::Microsoft:
13571 llvm_unreachable(
"Unsupported ABI");
13589 return ASTRecordLayouts.getMemorySize() +
13590 llvm::capacity_in_bytes(ObjCLayouts) +
13591 llvm::capacity_in_bytes(KeyFunctions) +
13592 llvm::capacity_in_bytes(ObjCImpls) +
13593 llvm::capacity_in_bytes(BlockVarCopyInits) +
13594 llvm::capacity_in_bytes(DeclAttrs) +
13595 llvm::capacity_in_bytes(TemplateOrInstantiation) +
13596 llvm::capacity_in_bytes(InstantiatedFromUsingDecl) +
13597 llvm::capacity_in_bytes(InstantiatedFromUsingShadowDecl) +
13598 llvm::capacity_in_bytes(InstantiatedFromUnnamedFieldDecl) +
13599 llvm::capacity_in_bytes(OverriddenMethods) +
13600 llvm::capacity_in_bytes(Types) +
13601 llvm::capacity_in_bytes(VariableArrayTypes);
13609 unsigned Signed)
const {
13612 if (!QualTy && DestWidth == 128)
13618 unsigned Signed)
const {
13619 return getFromTargetType(
13647 llvm_unreachable(
"Unhandled TargetInfo::RealType value");
13654 MangleNumbers[ND] = Number;
13657 Listener->AddedManglingNumber(ND, Number);
13661 bool ForAuxTarget)
const {
13662 auto I = MangleNumbers.find(ND);
13663 unsigned Res = I != MangleNumbers.end() ? I->second : 1;
13666 if (LangOpts.CUDA && !LangOpts.CUDAIsDevice) {
13667 Res = ForAuxTarget ? Res >> 16 : Res & 0xFFFF;
13669 assert(!ForAuxTarget &&
"Only CUDA/HIP host compilation supports mangling "
13670 "number for aux target");
13672 return Res > 1 ? Res : 1;
13679 StaticLocalNumbers[VD] = Number;
13682 Listener->AddedStaticLocalNumbers(VD, Number);
13686 auto I = StaticLocalNumbers.find(VD);
13687 return I != StaticLocalNumbers.end() ? I->second : 1;
13691 bool IsDestroying) {
13692 if (!IsDestroying) {
13704 bool IsTypeAware) {
13705 if (!IsTypeAware) {
13721 OperatorDeletesForVirtualDtor[Dtor->getCanonicalDecl()] = OperatorDelete;
13724 GlobalOperatorDeletesForVirtualDtor[Dtor->getCanonicalDecl()] =
13728 ArrayOperatorDeletesForVirtualDtor[Dtor->getCanonicalDecl()] =
13732 GlobalArrayOperatorDeletesForVirtualDtor[Dtor->getCanonicalDecl()] =
13742 return OperatorDeletesForVirtualDtor.contains(Dtor->getCanonicalDecl());
13744 return GlobalOperatorDeletesForVirtualDtor.contains(
13745 Dtor->getCanonicalDecl());
13747 return ArrayOperatorDeletesForVirtualDtor.contains(
13748 Dtor->getCanonicalDecl());
13750 return GlobalArrayOperatorDeletesForVirtualDtor.contains(
13751 Dtor->getCanonicalDecl());
13762 if (OperatorDeletesForVirtualDtor.contains(Canon))
13763 return OperatorDeletesForVirtualDtor[Canon];
13766 if (GlobalOperatorDeletesForVirtualDtor.contains(Canon))
13767 return GlobalOperatorDeletesForVirtualDtor[Canon];
13770 if (ArrayOperatorDeletesForVirtualDtor.contains(Canon))
13771 return ArrayOperatorDeletesForVirtualDtor[Canon];
13774 if (GlobalArrayOperatorDeletesForVirtualDtor.contains(Canon))
13775 return GlobalArrayOperatorDeletesForVirtualDtor[Canon];
13786 return MaybeRequireVectorDeletingDtor.count(RD);
13794 MaybeRequireVectorDeletingDtor.insert(RD);
13799 assert(LangOpts.CPlusPlus);
13800 std::unique_ptr<MangleNumberingContext> &MCtx = MangleNumberingContexts[DC];
13808 assert(LangOpts.CPlusPlus);
13809 std::unique_ptr<MangleNumberingContext> &MCtx =
13810 ExtraMangleNumberingContexts[D];
13816std::unique_ptr<MangleNumberingContext>
13818 return ABI->createMangleNumberingContext();
13823 return ABI->getCopyConstructorForExceptionObject(
13829 return ABI->addCopyConstructorForExceptionObject(
13836 return ABI->addTypedefNameForUnnamedTagDecl(TD, DD);
13841 return ABI->getTypedefNameForUnnamedTagDecl(TD);
13846 return ABI->addDeclaratorForUnnamedTagDecl(TD, DD);
13850 return ABI->getDeclaratorForUnnamedTagDecl(TD);
13854 ParamIndices[D] =
index;
13858 ParameterIndexTable::const_iterator I = ParamIndices.find(D);
13859 assert(I != ParamIndices.end() &&
13860 "ParmIndices lacks entry set by ParmVarDecl");
13865 unsigned Length)
const {
13891 assert(
MSGuidTagDecl &&
"building MS GUID without MS extensions?");
13893 llvm::FoldingSetNodeID ID;
13897 if (
MSGuidDecl *Existing = MSGuidDecls.FindNodeOrInsertPos(ID, InsertPos))
13901 MSGuidDecl *
New = MSGuidDecl::Create(*
this, GUIDType, Parts);
13902 MSGuidDecls.InsertNode(
New, InsertPos);
13908 const APValue &APVal)
const {
13909 llvm::FoldingSetNodeID ID;
13914 UnnamedGlobalConstantDecls.FindNodeOrInsertPos(ID, InsertPos))
13918 UnnamedGlobalConstantDecl::Create(*
this, Ty, APVal);
13919 UnnamedGlobalConstantDecls.InsertNode(
New, InsertPos);
13925 assert(
T->isRecordType() &&
"template param object of unexpected type");
13931 llvm::FoldingSetNodeID ID;
13936 TemplateParamObjectDecls.FindNodeOrInsertPos(ID, InsertPos))
13940 TemplateParamObjectDecls.InsertNode(
New, InsertPos);
13946 if (!
T.isOSDarwin())
13949 if (!(
T.isiOS() &&
T.isOSVersionLT(7)) &&
13950 !(
T.isMacOSX() &&
T.isOSVersionLT(10, 9)))
13959 return (Size != Align ||
toBits(sizeChars) > MaxInlineWidthInBits);
13966 if (MethodDecl->
hasAttr<UnavailableAttr>()
13967 || MethodDecl->
hasAttr<DeprecatedAttr>())
13981 IM != EM && IF != EF; ++IM, ++IF) {
14012 llvm::FoldingSetNodeID IDX, IDY;
14013 X->Profile(IDX, *
this,
true);
14014 Y->
Profile(IDY, *
this,
true);
14028 for (
const Decl *DX :
X->redecls()) {
14033 if (DX->isFirstDecl())
14036 llvm_unreachable(
"Corrupt redecls chain");
14039template <
class T, std::enable_if_t<std::is_base_of_v<Decl, T>,
bool> = true>
14041 return cast_or_null<T>(
14043 const_cast<Decl *
>(cast_or_null<Decl>(Y))));
14046template <
class T, std::enable_if_t<std::is_base_of_v<Decl, T>,
bool> = true>
14054 bool IgnoreDeduced =
false) {
14069 bool IgnoreDeduced) {
14071 assert(R.getAsVoidPointer() !=
nullptr);
14077 assert(Xs.size() == Ys.size());
14079 for (
size_t I = 0; I < Rs.size(); ++I)
14086 return X->getAttributeLoc() == Y->getAttributeLoc() ?
X->getAttributeLoc()
14096 switch (
X.getKind()) {
14126 auto NExpX =
X.getNumTemplateExpansions();
14140 if (Xs.size() != Ys.size())
14142 R.resize(Xs.size());
14143 for (
size_t I = 0; I < R.size(); ++I) {
14156 assert(!Different);
14184 assert(!IsSame &&
"Should be the same NestedNameSpecifier");
14186 return std::nullopt;
14191 assert(Kind == NNS2.
getKind());
14196 auto Kind = Namespace1->getKind();
14197 if (Kind != Namespace2->getKind() ||
14198 (Kind == Decl::NamespaceAlias &&
14203 Namespace2->getNamespace()),
14237 llvm_unreachable(
"singletons did not compare equal");
14239 assert(R.getCanonical() == Canon);
14245 const T *Y,
bool IsSame) {
14246 return ::getCommonNNS(Ctx,
X->getQualifier(), Y->getQualifier(), IsSame);
14266 QX +=
X.getQualifiers() - RQ;
14276 Y->getElementType(), QX, QY);
14287 assert(Ctx.
hasSameExpr(
X->getSizeExpr(), Y->getSizeExpr()));
14288 return X->getSizeExpr();
14293 return X->getSizeModifier();
14299 return X->getIndexTypeCVRQualifiers();
14309 llvm::DenseMap<QualType, unsigned>
Found;
14310 for (
auto Ts : {
X, Y}) {
14317 Out.emplace_back(
T);
14323FunctionProtoType::ExceptionSpecInfo
14327 bool AcceptDependent)
const {
14353 assert(AcceptDependent &&
14354 "computing composite pointer type of dependent types");
14369 llvm_unreachable(
"These ESTs should be handled above");
14374 assert(EST2 ==
EST_Dynamic &&
"other cases should already be handled");
14378 Result.Exceptions = ExceptionTypeStorage;
14385 llvm_unreachable(
"shouldn't see unresolved exception specifications here");
14388 llvm_unreachable(
"invalid ExceptionSpecificationType");
14397#define UNEXPECTED_TYPE(Class, Kind) \
14398 case Type::Class: \
14399 llvm_unreachable("Unexpected " Kind ": " #Class);
14401#define NON_CANONICAL_TYPE(Class, Base) UNEXPECTED_TYPE(Class, "non-canonical")
14402#define TYPE(Class, Base)
14403#include "clang/AST/TypeNodes.inc"
14405#define SUGAR_FREE_TYPE(Class) UNEXPECTED_TYPE(Class, "sugar-free")
14416#undef SUGAR_FREE_TYPE
14417#define NON_UNIQUE_TYPE(Class) UNEXPECTED_TYPE(Class, "non-unique")
14420#undef NON_UNIQUE_TYPE
14424#undef UNEXPECTED_TYPE
14428 assert(AX->getDeducedKind() == AY->getDeducedKind());
14430 assert(AX->getKeyword() == AY->getKeyword());
14432 AY->getTypeConstraintConcept());
14436 AY->getTypeConstraintArguments())) {
14443 case Type::IncompleteArray: {
14450 case Type::DependentSizedArray: {
14458 case Type::ConstantArray: {
14461 assert(AX->getSize() == AY->getSize());
14462 const Expr *SizeExpr = Ctx.
hasSameExpr(AX->getSizeExpr(), AY->getSizeExpr())
14463 ? AX->getSizeExpr()
14469 case Type::ArrayParameter: {
14472 assert(AX->getSize() == AY->getSize());
14473 const Expr *SizeExpr = Ctx.
hasSameExpr(AX->getSizeExpr(), AY->getSizeExpr())
14474 ? AX->getSizeExpr()
14481 case Type::Atomic: {
14486 case Type::Complex: {
14490 case Type::Pointer: {
14494 case Type::BlockPointer: {
14498 case Type::ObjCObjectPointer: {
14503 case Type::MemberPointer: {
14507 PY->getMostRecentCXXRecordDecl()));
14511 PX->getMostRecentCXXRecordDecl());
14513 case Type::LValueReference: {
14518 PX->isSpelledAsLValue() ||
14519 PY->isSpelledAsLValue());
14521 case Type::RValueReference: {
14527 case Type::DependentAddressSpace: {
14530 assert(Ctx.
hasSameExpr(PX->getAddrSpaceExpr(), PY->getAddrSpaceExpr()));
14532 PX->getAddrSpaceExpr(),
14535 case Type::FunctionNoProto: {
14538 assert(FX->getExtInfo() == FY->getExtInfo());
14543 case Type::FunctionProto: {
14547 EPIY = FY->getExtProtoInfo();
14548 assert(EPIX.
ExtInfo == EPIY.ExtInfo);
14555 assert(EPIX.
TypeQuals == EPIY.TypeQuals);
14556 assert(EPIX.
Variadic == EPIY.Variadic);
14565 auto P =
getCommonTypes(Ctx, FX->param_types(), FY->param_types(),
14573 case Type::ObjCObject: {
14576 std::equal(OX->getProtocols().begin(), OX->getProtocols().end(),
14577 OY->getProtocols().begin(), OY->getProtocols().end(),
14579 return P0->getCanonicalDecl() == P1->getCanonicalDecl();
14581 "protocol lists must be the same");
14583 OY->getTypeArgsAsWritten());
14586 OX->getProtocols(),
14587 OX->isKindOfTypeAsWritten() && OY->isKindOfTypeAsWritten());
14589 case Type::ConstantMatrix: {
14592 assert(MX->getNumRows() == MY->getNumRows());
14593 assert(MX->getNumColumns() == MY->getNumColumns());
14595 MX->getNumRows(), MX->getNumColumns());
14597 case Type::DependentSizedMatrix: {
14600 assert(Ctx.
hasSameExpr(MX->getRowExpr(), MY->getRowExpr()));
14601 assert(Ctx.
hasSameExpr(MX->getColumnExpr(), MY->getColumnExpr()));
14606 case Type::Vector: {
14608 assert(VX->getNumElements() == VY->getNumElements());
14609 assert(VX->getVectorKind() == VY->getVectorKind());
14611 VX->getNumElements(), VX->getVectorKind());
14613 case Type::ExtVector: {
14615 assert(VX->getNumElements() == VY->getNumElements());
14617 VX->getNumElements());
14619 case Type::DependentSizedExtVector: {
14626 case Type::DependentVector: {
14629 assert(VX->getVectorKind() == VY->getVectorKind());
14636 case Type::InjectedClassName: {
14643 case Type::TemplateSpecialization: {
14647 TY->template_arguments());
14651 TY->getTemplateName(),
14653 As, {},
X->getCanonicalTypeInternal());
14655 case Type::Decltype: {
14658 assert(DX->isDependentType());
14659 assert(DY->isDependentType());
14660 assert(Ctx.
hasSameExpr(DX->getUnderlyingExpr(), DY->getUnderlyingExpr()));
14664 case Type::PackIndexing: {
14667 assert(DX->isDependentType());
14668 assert(DY->isDependentType());
14669 assert(Ctx.
hasSameExpr(DX->getIndexExpr(), DY->getIndexExpr()));
14672 case Type::DependentName: {
14675 assert(NX->getIdentifier() == NY->getIdentifier());
14680 case Type::OverflowBehavior: {
14683 assert(NX->getBehaviorKind() == NY->getBehaviorKind());
14685 NX->getBehaviorKind(),
14687 NY->getUnderlyingType(), QX, QY));
14689 case Type::UnaryTransform: {
14692 assert(TX->getUTTKind() == TY->getUTTKind());
14696 TY->getUnderlyingType()),
14699 case Type::PackExpansion: {
14702 assert(PX->getNumExpansions() == PY->getNumExpansions());
14705 PX->getNumExpansions(),
false);
14709 assert(PX->isReadOnly() == PY->isReadOnly());
14714 case Type::TemplateTypeParm: {
14717 assert(TX->getDepth() == TY->getDepth());
14718 assert(TX->getIndex() == TY->getIndex());
14719 assert(TX->isParameterPack() == TY->isParameterPack());
14721 TX->getDepth(), TX->getIndex(), TX->isParameterPack(),
14725 llvm_unreachable(
"Unknown Type Class");
14735#define UNEXPECTED_TYPE(Class, Kind) \
14736 case Type::Class: \
14737 llvm_unreachable("Unexpected " Kind ": " #Class);
14738#define TYPE(Class, Base)
14739#define DEPENDENT_TYPE(Class, Base) UNEXPECTED_TYPE(Class, "dependent")
14740#include "clang/AST/TypeNodes.inc"
14742#define CANONICAL_TYPE(Class) UNEXPECTED_TYPE(Class, "canonical")
14769#undef CANONICAL_TYPE
14771#undef UNEXPECTED_TYPE
14773 case Type::Adjusted: {
14775 QualType OX = AX->getOriginalType(), OY = AY->getOriginalType();
14782 case Type::Decayed: {
14784 QualType OX = DX->getOriginalType(), OY = DY->getOriginalType();
14791 case Type::Attributed: {
14793 AttributedType::Kind Kind = AX->getAttrKind();
14794 if (Kind != AY->getAttrKind())
14796 QualType MX = AX->getModifiedType(), MY = AY->getModifiedType();
14804 case Type::BTFTagAttributed: {
14806 const BTFTypeTagAttr *AX = BX->getAttr();
14808 if (AX->getBTFTypeTag() !=
14819 if (KW != AY->getKeyword())
14823 AY->getTypeConstraintConcept());
14827 AY->getTypeConstraintArguments())) {
14838 case Type::PackIndexing:
14839 case Type::Decltype:
14841 case Type::DeducedTemplateSpecialization:
14844 case Type::MacroQualified: {
14848 if (IX != MY->getMacroIdentifier())
14852 case Type::SubstTemplateTypeParm: {
14859 unsigned Index = SX->getIndex();
14860 if (Index != SY->getIndex())
14867 SX->getFinal() && SY->getFinal());
14869 case Type::ObjCTypeParam:
14875 case Type::TemplateSpecialization: {
14880 TY->getTemplateName(),
true);
14885 TY->template_arguments()))
14891 case Type::Typedef: {
14901 case Type::TypeOf: {
14912 case Type::TypeOfExpr:
14915 case Type::UnaryTransform: {
14918 UnaryTransformType::UTTKind KX = UX->getUTTKind();
14919 if (KX != UY->getUTTKind())
14921 QualType BX = UX->getBaseType(), BY = UY->getBaseType();
14928 case Type::Using: {
14937 case Type::MemberPointer: {
14941 assert(Cls == PY->getMostRecentCXXRecordDecl());
14946 case Type::CountAttributed: {
14949 if (DX->isCountInBytes() != DY->isCountInBytes())
14951 if (DX->isOrNull() != DY->isOrNull())
14953 Expr *CEX = DX->getCountExpr();
14954 Expr *CEY = DY->getCountExpr();
14958 DX->isCountInBytes(), DX->isOrNull(),
14969 DX->isCountInBytes(), DX->isOrNull(),
14973 case Type::LateParsedAttr:
14976 case Type::PredefinedSugar:
14981 llvm_unreachable(
"Unhandled Type Class");
14988 QualType NT =
T.Ty->getLocallyUnqualifiedSingleStepDesugaredType();
15003 if (
X.isCanonical())
15030 bool KeepCommonQualifiers =
15033 if (SX.
Ty != SY.Ty) {
15041 while (!Xs.empty() && !Ys.empty() && Xs.back().Ty == Ys.back().Ty) {
15044 SX = Xs.pop_back_val();
15045 SY = Ys.pop_back_val();
15048 if (KeepCommonQualifiers)
15055 while (!Xs.empty() && !Ys.empty()) {
15058 SX = Xs.pop_back_val();
15059 SY = Ys.pop_back_val();
15064 SX.
Ty = Underlying.Ty;
15067 QX -= Underlying.Quals;
15085 llvm_unreachable(
"Not a saturated fixed point type!");
15086 case BuiltinType::SatShortAccum:
15088 case BuiltinType::SatAccum:
15090 case BuiltinType::SatLongAccum:
15092 case BuiltinType::SatUShortAccum:
15094 case BuiltinType::SatUAccum:
15096 case BuiltinType::SatULongAccum:
15098 case BuiltinType::SatShortFract:
15100 case BuiltinType::SatFract:
15102 case BuiltinType::SatLongFract:
15104 case BuiltinType::SatUShortFract:
15106 case BuiltinType::SatUFract:
15108 case BuiltinType::SatULongFract:
15120 llvm_unreachable(
"Not a fixed point type!");
15121 case BuiltinType::ShortAccum:
15123 case BuiltinType::Accum:
15125 case BuiltinType::LongAccum:
15127 case BuiltinType::UShortAccum:
15129 case BuiltinType::UAccum:
15131 case BuiltinType::ULongAccum:
15133 case BuiltinType::ShortFract:
15135 case BuiltinType::Fract:
15137 case BuiltinType::LongFract:
15139 case BuiltinType::UShortFract:
15141 case BuiltinType::UFract:
15143 case BuiltinType::ULongFract:
15149 if (LangOpts.OpenCL)
15173 llvm_unreachable(
"Not a fixed point type!");
15174 case BuiltinType::ShortAccum:
15175 case BuiltinType::SatShortAccum:
15176 return Target.getShortAccumScale();
15177 case BuiltinType::Accum:
15178 case BuiltinType::SatAccum:
15179 return Target.getAccumScale();
15180 case BuiltinType::LongAccum:
15181 case BuiltinType::SatLongAccum:
15182 return Target.getLongAccumScale();
15183 case BuiltinType::UShortAccum:
15184 case BuiltinType::SatUShortAccum:
15185 return Target.getUnsignedShortAccumScale();
15186 case BuiltinType::UAccum:
15187 case BuiltinType::SatUAccum:
15188 return Target.getUnsignedAccumScale();
15189 case BuiltinType::ULongAccum:
15190 case BuiltinType::SatULongAccum:
15191 return Target.getUnsignedLongAccumScale();
15192 case BuiltinType::ShortFract:
15193 case BuiltinType::SatShortFract:
15194 return Target.getShortFractScale();
15195 case BuiltinType::Fract:
15196 case BuiltinType::SatFract:
15197 return Target.getFractScale();
15198 case BuiltinType::LongFract:
15199 case BuiltinType::SatLongFract:
15200 return Target.getLongFractScale();
15201 case BuiltinType::UShortFract:
15202 case BuiltinType::SatUShortFract:
15203 return Target.getUnsignedShortFractScale();
15204 case BuiltinType::UFract:
15205 case BuiltinType::SatUFract:
15206 return Target.getUnsignedFractScale();
15207 case BuiltinType::ULongFract:
15208 case BuiltinType::SatULongFract:
15209 return Target.getUnsignedLongFractScale();
15219 llvm_unreachable(
"Not a fixed point type!");
15220 case BuiltinType::ShortAccum:
15221 case BuiltinType::SatShortAccum:
15222 return Target.getShortAccumIBits();
15223 case BuiltinType::Accum:
15224 case BuiltinType::SatAccum:
15225 return Target.getAccumIBits();
15226 case BuiltinType::LongAccum:
15227 case BuiltinType::SatLongAccum:
15228 return Target.getLongAccumIBits();
15229 case BuiltinType::UShortAccum:
15230 case BuiltinType::SatUShortAccum:
15231 return Target.getUnsignedShortAccumIBits();
15232 case BuiltinType::UAccum:
15233 case BuiltinType::SatUAccum:
15234 return Target.getUnsignedAccumIBits();
15235 case BuiltinType::ULongAccum:
15236 case BuiltinType::SatULongAccum:
15237 return Target.getUnsignedLongAccumIBits();
15238 case BuiltinType::ShortFract:
15239 case BuiltinType::SatShortFract:
15240 case BuiltinType::Fract:
15241 case BuiltinType::SatFract:
15242 case BuiltinType::LongFract:
15243 case BuiltinType::SatLongFract:
15244 case BuiltinType::UShortFract:
15245 case BuiltinType::SatUShortFract:
15246 case BuiltinType::UFract:
15247 case BuiltinType::SatUFract:
15248 case BuiltinType::ULongFract:
15249 case BuiltinType::SatULongFract:
15254llvm::FixedPointSemantics
15257 "Can only get the fixed point semantics for a "
15258 "fixed point or integer type.");
15260 return llvm::FixedPointSemantics::GetIntegerSemantics(
15264 return llvm::FixedPointSemantics(
15267 !isSigned &&
getTargetInfo().doUnsignedFixedPointTypesHavePadding());
15282 "Expected unsigned fixed point type");
15285 case BuiltinType::UShortAccum:
15287 case BuiltinType::UAccum:
15289 case BuiltinType::ULongAccum:
15291 case BuiltinType::SatUShortAccum:
15293 case BuiltinType::SatUAccum:
15295 case BuiltinType::SatULongAccum:
15297 case BuiltinType::UShortFract:
15299 case BuiltinType::UFract:
15301 case BuiltinType::ULongFract:
15303 case BuiltinType::SatUShortFract:
15305 case BuiltinType::SatUFract:
15307 case BuiltinType::SatULongFract:
15310 llvm_unreachable(
"Unexpected unsigned fixed point type");
15318 std::vector<std::string> BackendFeats;
15319 llvm::AArch64::ExtensionSet FeatureBits;
15320 for (StringRef F : FMVFeatStrings)
15321 if (
auto FMVExt = llvm::AArch64::parseFMVExtension(F))
15323 FeatureBits.enable(*FMVExt->ID);
15324 FeatureBits.toLLVMFeatureList(BackendFeats);
15325 return BackendFeats;
15330 assert(TD !=
nullptr);
15333 llvm::erase_if(
ParsedAttr.Features, [&](
const std::string &Feat) {
15334 return !Target->isValidFeatureName(StringRef{Feat}.substr(1));
15345 Target->getTargetOpts().CPU,
15346 Target->getTargetOpts().Features);
15353 StringRef TargetCPU = Target->getTargetOpts().CPU;
15355 if (
const auto *TD = FD->
getAttr<TargetAttr>()) {
15361 if (!Target->getTriple().isAArch64())
15364 Target->getTargetOpts().FeaturesAsWritten.begin(),
15365 Target->getTargetOpts().FeaturesAsWritten.end());
15376 }
else if (
const auto *SD = FD->
getAttr<CPUSpecificAttr>()) {
15378 Target->getCPUSpecificCPUDispatchFeatures(
15380 std::vector<std::string> Features(FeaturesTmp.begin(), FeaturesTmp.end());
15381 Features.insert(Features.begin(),
15382 Target->getTargetOpts().FeaturesAsWritten.begin(),
15383 Target->getTargetOpts().FeaturesAsWritten.end());
15384 Target->initFeatureMap(FeatureMap,
getDiagnostics(), TargetCPU, Features);
15385 }
else if (
const auto *TC = FD->
getAttr<TargetClonesAttr>()) {
15386 if (Target->getTriple().isAArch64()) {
15390 Features.insert(Features.begin(),
15391 Target->getTargetOpts().FeaturesAsWritten.begin(),
15392 Target->getTargetOpts().FeaturesAsWritten.end());
15393 Target->initFeatureMap(FeatureMap,
getDiagnostics(), TargetCPU, Features);
15394 }
else if (Target->getTriple().isRISCV()) {
15396 std::vector<std::string> Features;
15397 if (VersionStr !=
"default") {
15399 Features.insert(Features.begin(),
ParsedAttr.Features.begin(),
15402 Features.insert(Features.begin(),
15403 Target->getTargetOpts().FeaturesAsWritten.begin(),
15404 Target->getTargetOpts().FeaturesAsWritten.end());
15405 Target->initFeatureMap(FeatureMap,
getDiagnostics(), TargetCPU, Features);
15406 }
else if (Target->getTriple().isOSAIX()) {
15407 std::vector<std::string> Features;
15409 if (VersionStr.starts_with(
"cpu="))
15410 TargetCPU = VersionStr.drop_front(
sizeof(
"cpu=") - 1);
15412 assert(VersionStr ==
"default");
15413 Target->initFeatureMap(FeatureMap,
getDiagnostics(), TargetCPU, Features);
15415 std::vector<std::string> Features;
15417 if (VersionStr.starts_with(
"arch="))
15418 TargetCPU = VersionStr.drop_front(
sizeof(
"arch=") - 1);
15419 else if (VersionStr !=
"default")
15420 Features.push_back((StringRef{
"+"} + VersionStr).str());
15421 Target->initFeatureMap(FeatureMap,
getDiagnostics(), TargetCPU, Features);
15423 }
else if (
const auto *TV = FD->
getAttr<TargetVersionAttr>()) {
15424 std::vector<std::string> Features;
15425 if (Target->getTriple().isRISCV()) {
15427 Features.insert(Features.begin(),
ParsedAttr.Features.begin(),
15430 assert(Target->getTriple().isAArch64());
15432 TV->getFeatures(Feats);
15435 Features.insert(Features.begin(),
15436 Target->getTargetOpts().FeaturesAsWritten.begin(),
15437 Target->getTargetOpts().FeaturesAsWritten.end());
15438 Target->initFeatureMap(FeatureMap,
getDiagnostics(), TargetCPU, Features);
15440 FeatureMap = Target->getTargetOpts().FeatureMap;
15451 auto DeviceDiscriminatorOverrider =
15453 if (
const auto *RD = dyn_cast<CXXRecordDecl>(ND))
15455 return RD->getDeviceLambdaManglingNumber();
15456 return std::nullopt;
15459 Context, Context.getDiagnostics(), DeviceDiscriminatorOverrider)};
15467 std::string Buffer;
15468 Buffer.reserve(128);
15469 llvm::raw_string_ostream Out(Buffer);
15470 MC->mangleCanonicalTypeName(KernelNameType, Out);
15471 std::string KernelName = Out.str();
15473 return {KernelNameType, FD, KernelName};
15482 const auto *SKEPAttr = FD->
getAttr<SYCLKernelEntryPointAttr>();
15483 assert(SKEPAttr &&
"Missing sycl_kernel_entry_point attribute");
15492 "SYCL kernel name conflict");
15507 return &IT->second;
15513 return *OMPTraitInfoVector.back();
15520 return DB << Section.
Decl;
15521 return DB <<
"a prior #pragma section";
15525 bool IsInternalVar =
15528 bool IsExplicitDeviceVar = (D->
hasAttr<CUDADeviceAttr>() &&
15529 !D->
getAttr<CUDADeviceAttr>()->isImplicit()) ||
15530 (D->
hasAttr<CUDAConstantAttr>() &&
15531 !D->
getAttr<CUDAConstantAttr>()->isImplicit());
15535 return (IsInternalVar &&
15536 (D->
hasAttr<HIPManagedAttr>() || IsExplicitDeviceVar)) ||
15537 (D->
hasAttr<CUDAGlobalAttr>() &&
15544 (D->
hasAttr<HIPManagedAttr>() || D->
hasAttr<CUDAGlobalAttr>() ||
15549 if (!CUIDHash.empty())
15551 if (LangOpts.CUID.empty())
15552 return StringRef();
15553 CUIDHash = llvm::utohexstr(llvm::MD5Hash(LangOpts.CUID),
true);
15563 assert(PrimaryBase);
15566 auto Base = Layout.getPrimaryBase();
15567 if (!
Base ||
Base == PrimaryBase || !
Base->isPolymorphic())
15569 PrimaryBase =
Base;
15571 return PrimaryBase;
15575 StringRef MangledName) {
15577 assert(
Method->isVirtual());
15578 bool DefaultIncludesPointerAuth =
15579 LangOpts.PointerAuthCalls || LangOpts.PointerAuthIntrinsics;
15581 if (!DefaultIncludesPointerAuth)
15584 auto Existing = ThunksToBeAbbreviated.find(VirtualMethodDecl);
15585 if (Existing != ThunksToBeAbbreviated.end())
15586 return Existing->second.contains(MangledName.str());
15589 llvm::StringMap<llvm::SmallVector<std::string, 2>> Thunks;
15591 if (
const auto *ThunkInfos = VtableContext->getThunkInfo(VirtualMethodDecl)) {
15593 for (
const auto &Thunk : *ThunkInfos) {
15595 llvm::raw_svector_ostream ElidedNameStream(ElidedName);
15601 Mangler->mangleThunk(
Method, Thunk,
true,
15604 llvm::raw_svector_ostream mangledNameStream(MangledName);
15608 mangledNameStream);
15610 Mangler->mangleThunk(
Method, Thunk,
false,
15611 mangledNameStream);
15613 Thunks[ElidedName].push_back(std::string(MangledName));
15616 llvm::StringSet<> SimplifiedThunkNames;
15617 for (
auto &ThunkList : Thunks) {
15618 llvm::sort(ThunkList.second);
15619 SimplifiedThunkNames.insert(ThunkList.second[0]);
15621 bool Result = SimplifiedThunkNames.contains(MangledName);
15622 ThunksToBeAbbreviated[VirtualMethodDecl] = std::move(SimplifiedThunkNames);
15640 std::vector<PFPField> &Fields,
bool IncludeVBases) {
15642 if (
auto *ElemDecl = AT->getElementType()->getAsCXXRecordDecl()) {
15644 for (
unsigned i = 0; i != AT->getSize(); ++i)
15661 Fields.push_back({FieldOffset, Field});
15668 if (
Base.isVirtual())
15675 if (IncludeVBases) {
15686 std::vector<PFPField> PFPFields;
15696 if (
auto *RD = dyn_cast<CXXRecordDecl>(FD->
getParent()))
15698 !FD->
hasAttr<NoFieldProtectionAttr>();
15703 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 TypedefDecl * CreateZOSVaListDecl(const ASTContext *Context)
static bool hasAnyPackExpansions(ArrayRef< TemplateArgument > Args)
static char ObjCEncodingForEnumDecl(const ASTContext *C, const EnumDecl *ED)
static void addRedeclaredMethods(const ObjCMethodDecl *ObjCMethod, SmallVectorImpl< const NamedDecl * > &Redeclared)
static QualType getCommonTypeWithQualifierLifting(const ASTContext &Ctx, QualType X, QualType Y, Qualifiers &QX, Qualifiers &QY)
static auto getCommonTypes(const ASTContext &Ctx, ArrayRef< QualType > Xs, ArrayRef< QualType > Ys, bool Unqualified=false)
static bool isCanonicalResultType(QualType T)
Determine whether T is canonical as the result type of a function.
static TypedefDecl * CreateMSVaListDecl(const ASTContext *Context)
static bool areCompatVectorTypes(const VectorType *LHS, const VectorType *RHS)
areCompatVectorTypes - Return true if the two specified vector types are compatible.
static TypedefDecl * CreateCharPtrNamedVaListDecl(const ASTContext *Context, StringRef Name)
static NestedNameSpecifier getCommonQualifier(const ASTContext &Ctx, const T *X, const T *Y, bool IsSame)
#define UNEXPECTED_TYPE(Class, Kind)
static TypedefDecl * CreateVaListDecl(const ASTContext *Context, TargetInfo::BuiltinVaListKind Kind)
static bool primaryBaseHaseAddressDiscriminatedVTableAuthentication(const ASTContext &Context, const CXXRecordDecl *Class)
static std::vector< std::string > getFMVBackendFeaturesFor(const llvm::SmallVectorImpl< StringRef > &FMVFeatStrings)
Defines the clang::ASTContext interface.
#define BuiltinTemplate(BTName)
Provides definitions for the various language-specific address spaces.
static bool isUnsigned(SValBuilder &SVB, NonLoc Value)
Defines enum values for all the target-independent builtin functions.
static bool CanThrow(Expr *E, ASTContext &Ctx)
static Decl::Kind getKind(const Decl *D)
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
This file defines OpenMP nodes for declarative directives.
Defines the C++ template declaration subclasses.
Defines the ExceptionSpecificationType enumeration and various utility functions.
Defines the clang::Expr interface and subclasses for C++ expressions.
Defines the clang::IdentifierInfo, clang::IdentifierTable, and clang::Selector interfaces.
static const Decl * getCanonicalDecl(const Decl *D)
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified.
Defines the clang::LangOptions interface.
llvm::MachO::Target Target
llvm::MachO::Record Record
Defines the clang::MacroInfo and clang::MacroDirective classes.
static bool hasFeature(StringRef Feature, const LangOptions &LangOpts, const TargetInfo &Target)
Determine whether a translation unit built using the current language options has the given feature.
Defines the clang::Module class, which describes a module in the source code.
static StringRef getTriple(const Command &Job)
Defines types useful for describing an Objective-C runtime.
*collection of selector each with an associated kind and an ordered *collection of selectors A selector has a kind
static bool compare(const PathDiagnostic &X, const PathDiagnostic &Y)
static QualType getUnderlyingType(const SubRegion *R)
Defines the clang::SourceLocation class and associated facilities.
Defines the SourceManager interface.
Defines various enumerations that describe declaration and type specifiers.
static QualType getPointeeType(const MemRegion *R)
Defines the TargetCXXABI class, which abstracts details of the C++ ABI that we're targeting.
Defines the clang::TypeLoc interface and its subclasses.
C Language Family Type Representation.
QualType getReadPipeType(QualType T) const
Return a read_only pipe type for the specified type.
llvm::PointerUnion< const Decl *, const MacroInfo * > RawCommentLookupKey
Key used to look up the raw comment attached to a declaration or macro.
RawComment * getRawCommentNoCacheImpl(RawCommentLookupKey Key, const SourceLocation RepresentativeLoc, const std::map< unsigned, RawComment * > &CommentsInFile) const
QualType getWritePipeType(QualType T) const
Return a write_only pipe type for the specified type.
@ GE_Missing_stdio
Missing a type from <stdio.h>
@ GE_Missing_ucontext
Missing a type from <ucontext.h>
@ GE_Missing_setjmp
Missing a type from <setjmp.h>
APValue - This class implements a discriminated union of [uninitialized] [APSInt] [APFloat],...
bool isMemberPointerToDerivedMember() const
const ValueDecl * getMemberPointerDecl() const
ArrayRef< const CXXRecordDecl * > getMemberPointerPath() const
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
bool getByrefLifetime(QualType Ty, Qualifiers::ObjCLifetime &Lifetime, bool &HasByrefExtendedLayout) const
Returns true, if given type has a known lifetime.
MSGuidDecl * getMSGuidDecl(MSGuidDeclParts Parts) const
Return a declaration for the global GUID object representing the given GUID value.
BuiltinVectorTypeInfo getBuiltinVectorTypeInfo(const BuiltinType *VecTy) const
Returns the element type, element count and number of vectors (in case of tuple) for a builtin vector...
bool ObjCMethodsAreEqual(const ObjCMethodDecl *MethodDecl, const ObjCMethodDecl *MethodImp)
CanQualType ObjCBuiltinSelTy
TranslationUnitDecl * getTranslationUnitDecl() const
const ConstantArrayType * getAsConstantArrayType(QualType T) const
CanQualType getCanonicalFunctionResultType(QualType ResultType) const
Adjust the given function result type.
QualType getAtomicType(QualType T) const
Return the uniqued reference to the atomic type for the specified type.
LangAS getOpenCLTypeAddrSpace(const Type *T) const
Get address space for OpenCL type.
CharUnits getTypeAlignInChars(QualType T) const
Return the ABI-specified alignment of a (complete) type T, in characters.
void InitBuiltinTypes(const TargetInfo &Target, const TargetInfo *AuxTarget=nullptr)
Initialize built-in types.
ParentMapContext & getParentMapContext()
Returns the dynamic AST node parent map context.
QualType getParenType(QualType NamedType) const
size_t getSideTableAllocatedMemory() const
Return the total memory used for various side tables.
MemberSpecializationInfo * getInstantiatedFromStaticDataMember(const VarDecl *Var)
If this variable is an instantiated static data member of a class template specialization,...
QualType getRValueReferenceType(QualType T) const
Return the uniqued reference to the type for an rvalue reference to the specified type.
CanQualType ARCUnbridgedCastTy
QualType getDependentSizedMatrixType(QualType ElementType, Expr *RowExpr, Expr *ColumnExpr, SourceLocation AttrLoc) const
Return the unique reference to the matrix type of the specified element type and size.
QualType getBTFTagAttributedType(const BTFTypeTagAttr *BTFAttr, QualType Wrapped) const
llvm::DenseMap< const Decl *, comments::FullComment * > ParsedComments
Mapping from declarations to parsed comments attached to any redeclaration.
unsigned getManglingNumber(const NamedDecl *ND, bool ForAuxTarget=false) const
unsigned getIntWidth(QualType T) const
CanQualType getCanonicalParamType(QualType T) const
Return the canonical parameter type corresponding to the specific potentially non-canonical one.
const FunctionType * adjustFunctionType(const FunctionType *Fn, FunctionType::ExtInfo EInfo)
Change the ExtInfo on a function type.
TemplateOrSpecializationInfo getTemplateOrSpecializationInfo(const VarDecl *Var)
InlineVariableDefinitionKind
@ None
Not an inline variable.
@ Weak
Weak definition of inline variable.
@ Strong
Strong definition.
@ WeakUnknown
Weak for now, might become strong later in this TU.
bool dtorHasOperatorDelete(const CXXDestructorDecl *Dtor, OperatorDeleteKind K) const
void setObjCConstantStringInterface(ObjCInterfaceDecl *Decl)
TypedefDecl * getObjCClassDecl() const
Retrieve the typedef declaration corresponding to the predefined Objective-C 'Class' type.
TypedefNameDecl * getTypedefNameForUnnamedTagDecl(const TagDecl *TD)
TypedefDecl * getCFConstantStringDecl() const
CanQualType SatUnsignedFractTy
void setInstantiatedFromUsingDecl(NamedDecl *Inst, NamedDecl *Pattern)
Remember that the using decl Inst is an instantiation of the using decl Pattern of a class template.
bool areCompatibleRVVTypes(QualType FirstType, QualType SecondType)
Return true if the given types are an RISC-V vector builtin type and a VectorType that is a fixed-len...
ExternCContextDecl * getExternCContextDecl() const
const llvm::fltSemantics & getFloatTypeSemantics(QualType T) const
Return the APFloat 'semantics' for the specified scalar floating point type.
ParsedTargetAttr filterFunctionTargetAttrs(const TargetAttr *TD) const
Parses the target attributes passed in, and returns only the ones that are valid feature names.
QualType areCommonBaseCompatible(const ObjCObjectPointerType *LHSOPT, const ObjCObjectPointerType *RHSOPT)
TypedefDecl * getObjCSelDecl() const
Retrieve the typedef corresponding to the predefined 'SEL' type in Objective-C.
CanQualType UnsignedShortAccumTy
TypedefDecl * getObjCInstanceTypeDecl()
Retrieve the typedef declaration corresponding to the Objective-C "instancetype" type.
bool isPFPField(const FieldDecl *Field) const
QualType adjustFunctionResultType(QualType FunctionType, QualType NewResultType)
Change the result type of a function type, preserving sugar such as attributed types.
void setTemplateOrSpecializationInfo(VarDecl *Inst, TemplateOrSpecializationInfo TSI)
bool isTypeAwareOperatorNewOrDelete(const FunctionDecl *FD) const
bool ProtocolCompatibleWithProtocol(ObjCProtocolDecl *lProto, ObjCProtocolDecl *rProto) const
ProtocolCompatibleWithProtocol - return 'true' if 'lProto' is in the inheritance hierarchy of 'rProto...
TypedefDecl * buildImplicitTypedef(QualType T, StringRef Name) const
Create a new implicit TU-level typedef declaration.
QualType getCanonicalTemplateSpecializationType(ElaboratedTypeKeyword Keyword, TemplateName T, ArrayRef< TemplateArgument > CanonicalArgs) const
QualType getObjCInterfaceType(const ObjCInterfaceDecl *Decl, ObjCInterfaceDecl *PrevDecl=nullptr) const
getObjCInterfaceType - Return the unique reference to the type for the specified ObjC interface decl.
void adjustObjCTypeParamBoundType(const ObjCTypeParamDecl *Orig, ObjCTypeParamDecl *New) const
QualType getBlockPointerType(QualType T) const
Return the uniqued reference to the type for a block of the specified type.
TemplateArgument getCanonicalTemplateArgument(const TemplateArgument &Arg) const
Retrieve the "canonical" template argument.
QualType getAutoRRefDeductType() const
C++11 deduction pattern for 'auto &&' type.
TypedefDecl * getBuiltinMSVaListDecl() const
Retrieve the C type declaration corresponding to the predefined __builtin_ms_va_list type.
bool ObjCQualifiedIdTypesAreCompatible(const ObjCObjectPointerType *LHS, const ObjCObjectPointerType *RHS, bool ForCompare)
ObjCQualifiedIdTypesAreCompatible - We know that one of lhs/rhs is an ObjCQualifiedIDType.
static CanQualType getCanonicalType(QualType T)
Return the canonical (structural) type corresponding to the specified potentially non-canonical type ...
QualType mergeFunctionTypes(QualType, QualType, bool OfBlockPointer=false, bool Unqualified=false, bool AllowCXX=false, bool IsConditionalOperator=false)
NamedDecl * getInstantiatedFromUsingDecl(NamedDecl *Inst)
If the given using decl Inst is an instantiation of another (possibly unresolved) using decl,...
DeclarationNameTable DeclarationNames
comments::FullComment * cloneFullComment(comments::FullComment *FC, const Decl *D) const
CharUnits getObjCEncodingTypeSize(QualType T) const
Return the size of type T for Objective-C encoding purpose, in characters.
int getIntegerTypeOrder(QualType LHS, QualType RHS) const
Return the highest ranked integer type, see C99 6.3.1.8p1.
const TemplateArgument * getDefaultTemplateArgumentOrNone(const NamedDecl *P) const
Return the default argument of a template parameter, if one exists.
QualType getAttributedType(attr::Kind attrKind, QualType modifiedType, QualType equivalentType, const Attr *attr=nullptr) const
TypedefDecl * getObjCIdDecl() const
Retrieve the typedef corresponding to the predefined id type in Objective-C.
void setCurrentNamedModule(Module *M)
Set the (C++20) module we are building.
QualType getProcessIDType() const
Return the unique type for "pid_t" defined in <sys/types.h>.
CharUnits getMemberPointerPathAdjustment(const APValue &MP) const
Find the 'this' offset for the member path in a pointer-to-member APValue.
bool mayExternalize(const Decl *D) const
Whether a C++ static variable or CUDA/HIP kernel may be externalized.
std::unique_ptr< MangleNumberingContext > createMangleNumberingContext() const
ArrayRef< CXXDefaultArgExpr * > getCtorClosureDefaultArgs(const CXXConstructorDecl *CD)
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 getLateParsedAttrType(QualType Wrapped, LateParsedTypeAttribute *LateParsedAttr) const
Return a placeholder type for a late-parsed type attribute.
QualType removePtrSizeAddrSpace(QualType T) const
Remove the existing address space on the type if it is a pointer size address space and return the ty...
bool areLaxCompatibleRVVTypes(QualType FirstType, QualType SecondType)
Return true if the given vector types are lax-compatible RISC-V vector types as defined by -flax-vect...
CanQualType SatShortFractTy
QualType getDecayedType(QualType T) const
Return the uniqued reference to the decayed version of the given type.
CallingConv getDefaultCallingConvention(bool IsVariadic, bool IsCXXMethod) const
Retrieves the default calling convention for the current context.
bool canBindObjCObjectType(QualType To, QualType From)
TemplateTemplateParmDecl * insertCanonicalTemplateTemplateParmDeclInternal(TemplateTemplateParmDecl *CanonTTP) const
int getFloatingTypeSemanticOrder(QualType LHS, QualType RHS) const
Compare the rank of two floating point types as above, but compare equal if both types have the same ...
QualType getUIntPtrType() const
Return a type compatible with "uintptr_t" (C99 7.18.1.4), as defined by the target.
void setParameterIndex(const ParmVarDecl *D, unsigned index)
Used by ParmVarDecl to store on the side the index of the parameter when it exceeds the size of the n...
QualType getFunctionTypeWithExceptionSpec(QualType Orig, const FunctionProtoType::ExceptionSpecInfo &ESI) const
Get a function type and produce the equivalent function type with the specified exception specificati...
QualType getDependentNameType(ElaboratedTypeKeyword Keyword, NestedNameSpecifier NNS, const IdentifierInfo *Name) const
Qualifiers::GC getObjCGCAttrKind(QualType Ty) const
Return one of the GCNone, Weak or Strong Objective-C garbage collection attributes.
bool hasUniqueObjectRepresentations(QualType Ty, bool CheckIfTriviallyCopyable=true) const
Return true if the specified type has unique object representations according to (C++17 [meta....
CanQualType getCanonicalSizeType() const
bool typesAreBlockPointerCompatible(QualType, QualType)
CanQualType SatUnsignedAccumTy
bool useAbbreviatedThunkName(GlobalDecl VirtualMethodDecl, StringRef MangledName)
const ASTRecordLayout & getASTObjCInterfaceLayout(const ObjCInterfaceDecl *D) const
Get or compute information about the layout of the specified Objective-C interface.
void forEachMultiversionedFunctionVersion(const FunctionDecl *FD, llvm::function_ref< void(FunctionDecl *)> Pred) const
Visits all versions of a multiversioned function with the passed predicate.
void setInstantiatedFromUsingEnumDecl(UsingEnumDecl *Inst, UsingEnumDecl *Pattern)
Remember that the using enum decl Inst is an instantiation of the using enum decl Pattern of a class ...
QualType getAutoType(DeducedKind DK, QualType DeducedAsType, AutoTypeKeyword Keyword, TemplateDecl *TypeConstraintConcept=nullptr, ArrayRef< TemplateArgument > TypeConstraintArgs={}) const
C++11 deduced auto type.
QualType getBaseElementType(const ArrayType *VAT) const
Return the innermost element type of an array type.
llvm::SetVector< const VarDecl * > CUDADeviceVarODRUsedByHost
Keep track of CUDA/HIP device-side variables ODR-used by host code.
QualType getPointerDiffType() const
Return the unique type for "ptrdiff_t" (C99 7.17) defined in <stddef.h>.
QualType getSignatureParameterType(QualType T) const
Retrieve the parameter type as adjusted for use in the signature of a function, decaying array and fu...
CanQualType ArraySectionTy
CanQualType ObjCBuiltinIdTy
overridden_cxx_method_iterator overridden_methods_end(const CXXMethodDecl *Method) const
VTableContextBase * getVTableContext()
ComparisonCategories CompCategories
Types and expressions required to build C++2a three-way comparisons using operator<=>,...
int getFloatingTypeOrder(QualType LHS, QualType RHS) const
Compare the rank of the two specified floating point types, ignoring the domain of the type (i....
unsigned CountNonClassIvars(const ObjCInterfaceDecl *OI) const
ObjCPropertyImplDecl * getObjCPropertyImplDeclForPropertyDecl(const ObjCPropertyDecl *PD, const Decl *Container) const
bool isNearlyEmpty(const CXXRecordDecl *RD) const
PointerAuthQualifier getObjCMemberSelTypePtrAuth()
void attachCommentsToJustParsedDecls(ArrayRef< Decl * > Decls, const Preprocessor *PP)
Searches existing comments for doc comments that should be attached to Decls.
QualType getIntTypeForBitwidth(unsigned DestWidth, unsigned Signed) const
getIntTypeForBitwidth - sets integer QualTy according to specified details: bitwidth,...
void setStaticLocalNumber(const VarDecl *VD, unsigned Number)
QualType getCFConstantStringType() const
Return the C structure type used to represent constant CFStrings.
void eraseDeclAttrs(const Decl *D)
Erase the attributes corresponding to the given declaration.
UsingEnumDecl * getInstantiatedFromUsingEnumDecl(UsingEnumDecl *Inst)
If the given using-enum decl Inst is an instantiation of another using-enum decl, return it.
RecordDecl * getCFConstantStringTagDecl() const
std::string getObjCEncodingForFunctionDecl(const FunctionDecl *Decl) const
Emit the encoded type for the function Decl into S.
TypeSourceInfo * getTemplateSpecializationTypeInfo(ElaboratedTypeKeyword Keyword, SourceLocation ElaboratedKeywordLoc, NestedNameSpecifierLoc QualifierLoc, SourceLocation TemplateKeywordLoc, TemplateName T, SourceLocation TLoc, const TemplateArgumentListInfo &SpecifiedArgs, ArrayRef< TemplateArgument > CanonicalArgs, QualType Canon=QualType()) const
CanQualType UnsignedFractTy
GVALinkage GetGVALinkageForFunction(const FunctionDecl *FD) const
QualType mergeFunctionParameterTypes(QualType, QualType, bool OfBlockPointer=false, bool Unqualified=false)
mergeFunctionParameterTypes - merge two types which appear as function parameter types
void addOverriddenMethod(const CXXMethodDecl *Method, const CXXMethodDecl *Overridden)
Note that the given C++ Method overrides the given Overridden method.
TemplateTemplateParmDecl * findCanonicalTemplateTemplateParmDeclInternal(TemplateTemplateParmDecl *TTP) const
const TargetInfo * getAuxTargetInfo() const
CanQualType ObjCBuiltinClassTy
unsigned NumImplicitDefaultConstructorsDeclared
The number of implicitly-declared default constructors for which declarations were built.
CanQualType UnresolvedTemplateTy
OMPTraitInfo & getNewOMPTraitInfo()
Return a new OMPTraitInfo object owned by this context.
friend class CXXRecordDecl
CanQualType UnsignedLongTy
void DeepCollectObjCIvars(const ObjCInterfaceDecl *OI, bool leafClass, SmallVectorImpl< const ObjCIvarDecl * > &Ivars) const
DeepCollectObjCIvars - This routine first collects all declared, but not synthesized,...
bool computeBestEnumTypes(bool IsPacked, unsigned NumNegativeBits, unsigned NumPositiveBits, QualType &BestType, QualType &BestPromotionType)
Compute BestType and BestPromotionType for an enum based on the highest number of negative and positi...
llvm::APFixedPoint getFixedPointMin(QualType Ty) const
TypeSourceInfo * getTrivialTypeSourceInfo(QualType T, SourceLocation Loc=SourceLocation()) const
Allocate a TypeSourceInfo where all locations have been initialized to a given location,...
QualType adjustType(QualType OldType, llvm::function_ref< QualType(QualType)> Adjust) const
Rebuild a type, preserving any existing type sugar.
void addedLocalImportDecl(ImportDecl *Import)
Notify the AST context that a new import declaration has been parsed or implicitly created within thi...
const TranslationUnitKind TUKind
CanQualType UnsignedLongAccumTy
QualType AutoRRefDeductTy
RawComment * getRawCommentNoCacheImpl(RawCommentLookupKey Key, const SourceLocation RepresentativeLoc, const std::map< unsigned, RawComment * > &CommentsInFile) const
TypeInfo getTypeInfo(const Type *T) const
Get the size and alignment of the specified complete type in bits.
QualType getStringLiteralArrayType(QualType EltTy, unsigned Length) const
Return a type for a constant array for a string literal of the specified element type and length.
QualType getCorrespondingSaturatedType(QualType Ty) const
bool arePFPFieldsTriviallyCopyable(const RecordDecl *RD) const
Returns whether this record's PFP fields (if any) are trivially copyable (i.e.
bool isSameEntity(const NamedDecl *X, const NamedDecl *Y) const
Determine whether the two declarations refer to the same entity.
QualType getSubstTemplateTypeParmPackType(Decl *AssociatedDecl, unsigned Index, bool Final, const TemplateArgument &ArgPack)
CanQualType BoundMemberTy
CanQualType SatUnsignedShortFractTy
QualType removeAddrSpaceQualType(QualType T) const
Remove any existing address space on the type and returns the type with qualifiers intact (or that's ...
bool hasSameFunctionTypeIgnoringParamABI(QualType T, QualType U) const
Determine if two function types are the same, ignoring parameter ABI annotations.
TypedefDecl * getInt128Decl() const
Retrieve the declaration for the 128-bit signed integer type.
unsigned getOpenMPDefaultSimdAlign(QualType T) const
Get default simd alignment of the specified complete type in bits.
QualType getObjCSuperType() const
Returns the C struct type for objc_super.
QualType getBlockDescriptorType() const
Gets the struct used to keep track of the descriptor for pointer to blocks.
bool CommentsLoaded
True if comments are already loaded from ExternalASTSource.
BlockVarCopyInit getBlockVarCopyInit(const VarDecl *VD) const
Get the copy initialization expression of the VarDecl VD, or nullptr if none exists.
QualType getHLSLInlineSpirvType(uint32_t Opcode, uint32_t Size, uint32_t Alignment, ArrayRef< SpirvOperand > Operands)
unsigned NumImplicitMoveConstructorsDeclared
The number of implicitly-declared move constructors for which declarations were built.
bool isInSameModule(const Module *M1, const Module *M2) const
If the two module M1 and M2 are in the same module.
unsigned NumImplicitCopyConstructorsDeclared
The number of implicitly-declared copy constructors for which declarations were built.
QualType getLeastIntTypeForBitwidth(unsigned DestWidth, unsigned Signed) const
CanQualType PseudoObjectTy
QualType getWebAssemblyExternrefType() const
Return a WebAssembly externref type.
void setTraversalScope(const std::vector< Decl * > &)
CharUnits getTypeUnadjustedAlignInChars(QualType T) const
getTypeUnadjustedAlignInChars - Return the ABI-specified alignment of a type, in characters,...
QualType getAdjustedType(QualType Orig, QualType New) const
Return the uniqued reference to a type adjusted from the original type to a new type.
friend class NestedNameSpecifier
MangleContext * cudaNVInitDeviceMC()
unsigned getAlignOfGlobalVar(QualType T, const VarDecl *VD) const
Return the alignment in bits that should be given to a global variable with type T.
bool areCompatibleOverflowBehaviorTypes(QualType LHS, QualType RHS)
Return true if two OverflowBehaviorTypes are compatible for assignment.
TypeInfoChars getTypeInfoDataSizeInChars(QualType T) const
MangleNumberingContext & getManglingNumberContext(const DeclContext *DC)
Retrieve the context for computing mangling numbers in the given DeclContext.
comments::FullComment * getLocalCommentForDeclUncached(const Decl *D) const
Return parsed documentation comment attached to a given declaration.
unsigned NumImplicitDestructors
The number of implicitly-declared destructors.
QualType getQualifiedType(SplitQualType split) const
Un-split a SplitQualType.
bool isAlignmentRequired(const Type *T) const
Determine if the alignment the type has was required using an alignment attribute.
bool areComparableObjCPointerTypes(QualType LHS, QualType RHS)
MangleContext * createDeviceMangleContext(const TargetInfo &T)
Creates a device mangle context to correctly mangle lambdas in a mixed architecture compile by settin...
CharUnits getExnObjectAlignment() const
Return the alignment (in bytes) of the thrown exception object.
QualType getObjCObjectPointerType(QualType OIT) const
Return a ObjCObjectPointerType type for the given ObjCObjectType.
ASTMutationListener * Listener
CanQualType ObjCBuiltinBoolTy
TypeInfoChars getTypeInfoInChars(const Type *T) const
QualType getPredefinedSugarType(PredefinedSugarType::Kind KD) const
QualType getObjCObjectType(QualType Base, ObjCProtocolDecl *const *Protocols, unsigned NumProtocols) const
Legacy interface: cannot provide type arguments or __kindof.
TemplateParamObjectDecl * getTemplateParamObjectDecl(QualType T, const APValue &V) const
Return the template parameter object of the given type with the given value.
interp::Context & getInterpContext() const
Returns the clang bytecode interpreter context.
CharUnits getDeclAlign(const Decl *D, bool ForAlignof=false) const
Return a conservative estimate of the alignment of the specified decl D.
int64_t toBits(CharUnits CharSize) const
Convert a size in characters to a size in bits.
TemplateTemplateParmDecl * getCanonicalTemplateTemplateParmDecl(TemplateTemplateParmDecl *TTP) const
Canonicalize the given TemplateTemplateParmDecl.
CanQualType OCLClkEventTy
void adjustExceptionSpec(FunctionDecl *FD, const FunctionProtoType::ExceptionSpecInfo &ESI, bool AsWritten=false)
Change the exception specification on a function once it is delay-parsed, instantiated,...
TypedefDecl * getUInt128Decl() const
Retrieve the declaration for the 128-bit unsigned integer type.
bool hasPFPFields(QualType Ty) const
const clang::PrintingPolicy & getPrintingPolicy() const
void ResetObjCLayout(const ObjCInterfaceDecl *D)
ArrayRef< Module * > getModulesWithMergedDefinition(const NamedDecl *Def)
Get the additional modules in which the definition Def has been merged.
void setCtorClosureDefaultArgs(const CXXConstructorDecl *CD, ArrayRef< CXXDefaultArgExpr * > Args)
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)
TypedefDecl * getBuiltinZOSVaListDecl() const
Retrieve the C type declaration corresponding to the predefined __builtin_zos_va_list type.
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.
Represents a static or instance method of a struct/union/class.
CXXMethodDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
Represents a C++ struct/union/class.
static CXXRecordDecl * Create(const ASTContext &C, TagKind TK, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, IdentifierInfo *Id, CXXRecordDecl *PrevDecl=nullptr)
CXXRecordDecl * getDefinition() const
bool isPolymorphic() const
Whether this class is polymorphic (C++ [class.virtual]), which means that the class contains or inher...
bool isDynamicClass() const
bool isEmpty() const
Determine whether this is an empty class in the sense of (C++11 [meta.unary.prop]).
SplitQualType split() const
static CanQual< Type > CreateUnsafe(QualType Other)
QualType withConst() const
Retrieves a version of this type with const applied.
CanQual< T > getUnqualifiedType() const
Retrieve the unqualified form of this type.
Qualifiers getQualifiers() const
Retrieve all qualifiers.
const T * getTypePtr() const
Retrieve the underlying type pointer, which refers to a canonical type.
CharUnits - This is an opaque type for sizes expressed in character units.
bool isPositive() const
isPositive - Test whether the quantity is greater than zero.
bool isZero() const
isZero - Test whether the quantity equals zero.
QuantityType getQuantity() const
getQuantity - Get the raw integer representation of this quantity.
static CharUnits fromQuantity(QuantityType Quantity)
fromQuantity - Construct a CharUnits quantity from a raw integer type.
static CharUnits Zero()
Zero - Construct a CharUnits quantity of zero.
Complex values, per C99 6.2.5p11.
void Profile(llvm::FoldingSetNodeID &ID)
bool hasExplicitTemplateArgs() const
Whether or not template arguments were explicitly specified in the concept reference (they might not ...
const ASTTemplateArgumentListInfo * getTemplateArgsAsWritten() const
Represents the canonical version of C arrays with a specified constant size.
const Expr * getSizeExpr() const
Return a pointer to the size expression.
llvm::APInt getSize() const
Return the constant array size as an APInt.
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Ctx)
uint64_t getZExtSize() const
Return the size zero-extended as a uint64_t.
Represents a concrete matrix type with constant number of rows and columns.
unsigned getNumColumns() const
Returns the number of columns in the matrix.
void Profile(llvm::FoldingSetNodeID &ID)
unsigned getNumRows() const
Returns the number of rows in the matrix.
Represents a sugar type with __counted_by or __sized_by annotations, including their _or_null variant...
void Profile(llvm::FoldingSetNodeID &ID)
Represents a pointer type decayed from an array or function type.
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
DeclContext * getParent()
getParent - Returns the containing DeclContext.
bool isFileContext() const
bool isDependentContext() const
Determines whether this context is dependent on a template parameter.
DeclContext * getLexicalParent()
getLexicalParent - Returns the containing lexical DeclContext.
lookup_result lookup(DeclarationName Name) const
lookup - Find the declarations (if any) with the given Name in this context.
DeclContext * getRedeclContext()
getRedeclContext - Retrieve the context in which an entity conflicts with other entities of the same ...
void addDecl(Decl *D)
Add the declaration D into this context.
Decl::Kind getDeclKind() const
A reference to a declared variable, function, enum, etc.
Decl - This represents one declaration (or definition), e.g.
const DeclContext * getParentFunctionOrMethod(bool LexicalParent=false) const
If this decl is defined inside a function/method/block it returns the corresponding DeclContext,...
bool isModuleLocal() const
Whether this declaration was a local declaration to a C++20 named module.
ASTContext & getASTContext() const LLVM_READONLY
unsigned getMaxAlignment() const
getMaxAlignment - return the maximum alignment specified by attributes on this decl,...
bool isUnconditionallyVisible() const
Determine whether this declaration is definitely visible to name lookup, independent of whether the o...
static Decl * castFromDeclContext(const DeclContext *)
bool isTemplated() const
Determine whether this declaration is a templated entity (whether it is.
bool isCanonicalDecl() const
Whether this particular Decl is a canonical one.
Module * getOwningModule() const
Get the module that owns this declaration (for visibility purposes).
FunctionDecl * getAsFunction() LLVM_READONLY
Returns the function itself, or the templated function if this is a function template.
ObjCDeclQualifier
ObjCDeclQualifier - 'Qualifiers' written next to the return and parameter types in method declaration...
bool isInvalidDecl() const
llvm::iterator_range< specific_attr_iterator< T > > specific_attrs() const
void setImplicit(bool I=true)
redecl_range redecls() const
Returns an iterator range for all the redeclarations of the same decl.
DeclContext * getDeclContext()
void setDeclContext(DeclContext *DC)
setDeclContext - Set both the semantic and lexical DeclContext to DC.
DeclContext * getLexicalDeclContext()
getLexicalDeclContext - The declaration context where this Decl was lexically declared (LexicalDC).
virtual Decl * getCanonicalDecl()
Retrieves the "canonical" declaration of the given declaration.
DeclarationNameLoc - Additional source/type location info for a declaration name.
static DeclarationNameLoc makeCXXOperatorNameLoc(SourceLocation BeginLoc, SourceLocation EndLoc)
Construct location information for a non-literal C++ operator.
The name of a declaration.
static int compare(DeclarationName LHS, DeclarationName RHS)
Represents a ValueDecl that came out of a declarator.
TypeSourceInfo * getTypeSourceInfo() const
TemplateName getUnderlying() const
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context) const
DefaultArguments getDefaultArguments() const
Represents an extended address space qualifier where the input address space value is dependent.
Expr * getAddrSpaceExpr() const
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context)
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context)
Represents an array type in C++ whose size is a value-dependent expression.
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context)
Expr * getSizeExpr() const
Represents an extended vector type where either the type or size is dependent.
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context)
Represents a matrix type where the type and the number of rows and columns is dependent on a template...
Expr * getRowExpr() const
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context)
Represents a dependent template name that cannot be resolved prior to template instantiation.
void Profile(llvm::FoldingSetNodeID &ID) const
IdentifierOrOverloadedOperator getName() const
NestedNameSpecifier getQualifier() const
Return the nested name specifier that qualifies this name.
bool hasTemplateKeyword() const
Was this template name was preceeded by the template keyword?
Internal representation of canonical, dependent typeof(expr) types.
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context)
Represents a vector type where either the type or size is dependent.
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context)
Concrete class used by the front-end to report problems and issues.
DiagnosticBuilder Report(SourceLocation Loc, unsigned DiagID)
Issue the message to the client.
A dynamically typed AST node container.
bool isScoped() const
Returns true if this is a C++11 scoped enumeration.
bool isComplete() const
Returns true if this can be considered a complete type.
EnumDecl * getDefinitionOrSelf() const
QualType getIntegerType() const
Return the integer type this enum decl corresponds to.
Represents an explicit instantiation of a template entity in source code.
This represents one expression.
bool isIntegerConstantExpr(const ASTContext &Ctx) const
Expr * IgnoreParenCasts() LLVM_READONLY
Skip past any parentheses and casts which might surround this expression until reaching a fixed point...
bool isValueDependent() const
Determines whether the value of this expression depends on.
ExprValueKind getValueKind() const
getValueKind - The value kind that this expression produces.
bool isTypeDependent() const
Determines whether the type of this expression depends on.
std::optional< llvm::APSInt > getIntegerConstantExpr(const ASTContext &Ctx) const
isIntegerConstantExpr - Return the value if this expression is a valid integer constant expression.
FieldDecl * getSourceBitField()
If this expression refers to a bit-field, retrieve the declaration of that bit-field.
@ NPC_ValueDependentIsNull
Specifies that a value-dependent expression of integral or dependent type should be considered a null...
bool isInstantiationDependent() const
Whether this expression is instantiation-dependent, meaning that it depends in some way on.
Expr * IgnoreImpCasts() LLVM_READONLY
Skip past any implicit casts which might surround this expression until reaching a fixed point.
NullPointerConstantKind isNullPointerConstant(ASTContext &Ctx, NullPointerConstantValueDependence NPC) const
isNullPointerConstant - C99 6.3.2.3p3 - Test if this reduces down to a Null pointer constant.
static ExprValueKind getValueKindForType(QualType T)
getValueKindForType - Given a formal return or parameter type, give its value kind.
We can encode up to four bits in the low bits of a type pointer, but there are many more type qualifi...
void Profile(llvm::FoldingSetNodeID &ID) const
ExtVectorType - Extended vector type.
Declaration context for names declared as extern "C" in C++.
static ExternCContextDecl * Create(const ASTContext &C, TranslationUnitDecl *TU)
Abstract interface for external sources of AST nodes.
virtual void CompleteRedeclChain(const Decl *D)
Gives the external AST source an opportunity to complete the redeclaration chain for a declaration.
Represents a member of a struct/union/class.
bool isBitField() const
Determines whether this field is a bitfield.
unsigned getBitWidthValue() const
Computes the bit width of this field, if this is a bit field.
unsigned getFieldIndex() const
Returns the index of this field within its record, as appropriate for passing to ASTRecordLayout::get...
const RecordDecl * getParent() const
Returns the parent of this field declaration, which is the struct in which this field is defined.
static FieldDecl * Create(const ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id, QualType T, TypeSourceInfo *TInfo, Expr *BW, bool Mutable, InClassInitStyle InitStyle)
An opaque identifier used by SourceManager which refers to a source file (MemoryBuffer) along with it...
Represents a function declaration or definition.
bool isMultiVersion() const
True if this function is considered a multiversioned function.
unsigned getBuiltinID(bool ConsiderWrapperFunctions=false) const
Returns a value indicating whether this function corresponds to a builtin function.
bool isInlined() const
Determine whether this function should be inlined, because it is either marked "inline" or "constexpr...
bool isMSExternInline() const
The combination of the extern and inline keywords under MSVC forces the function to be required.
FunctionDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
FunctionDecl * getMostRecentDecl()
Returns the most recent (re)declaration of this declaration.
FunctionDecl * getDefinition()
Get the definition for this declaration.
TemplateSpecializationKind getTemplateSpecializationKind() const
Determine what kind of template instantiation this function represents.
bool isUserProvided() const
True if this method is user-declared and was not deleted or defaulted on its first declaration.
bool isInlineDefinitionExternallyVisible() const
For an inline function definition in C, or for a gnu_inline function in C++, determine whether the de...
FunctionDecl * getPreviousDecl()
Return the previous declaration of this declaration or NULL if this is the first declaration.
SmallVector< Conflict > Conflicts
static FunctionEffectSet getIntersection(FunctionEffectsRef LHS, FunctionEffectsRef RHS)
static FunctionEffectSet getUnion(FunctionEffectsRef LHS, FunctionEffectsRef RHS, Conflicts &Errs)
An immutable set of FunctionEffects and possibly conditions attached to them.
ArrayRef< EffectConditionExpr > conditions() const
Represents a K&R-style 'int foo()' function, which has no information available about its arguments.
void Profile(llvm::FoldingSetNodeID &ID)
Represents a prototype with parameter type info, e.g.
ExtParameterInfo getExtParameterInfo(unsigned I) const
ExceptionSpecificationType getExceptionSpecType() const
Get the kind of exception specification on this function.
unsigned getNumParams() const
QualType getParamType(unsigned i) const
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Ctx)
bool hasExceptionSpec() const
Return whether this function has any kind of exception spec.
bool isVariadic() const
Whether this function prototype is variadic.
ExtProtoInfo getExtProtoInfo() const
ArrayRef< QualType > getParamTypes() const
ArrayRef< ExtParameterInfo > getExtParameterInfos() const
bool hasExtParameterInfos() const
Is there any interesting extra information for any of the parameters of this function type?
Declaration of a template function.
A class which abstracts out some details necessary for making a call.
CallingConv getCC() const
bool getNoCfCheck() const
unsigned getRegParm() const
bool getNoCallerSavedRegs() const
ExtInfo withNoReturn(bool noReturn) const
bool getHasRegParm() const
bool getProducesResult() const
Interesting information about a specific parameter that can't simply be reflected in parameter's type...
ExtParameterInfo withIsNoEscape(bool NoEscape) const
FunctionType - C99 6.7.5.3 - Function Declarators.
ExtInfo getExtInfo() const
QualType getReturnType() const
GlobalDecl - represents a global declaration.
unsigned getMultiVersionIndex() const
CXXDtorType getDtorType() const
const Decl * getDecl() const
One of these records is kept for each identifier that is lexed.
unsigned getLength() const
Efficiently return the length of this identifier info.
StringRef getName() const
Return the actual identifier string.
Implements an efficient mapping from strings to IdentifierInfo nodes.
Describes a module import declaration, which makes the contents of the named module visible in the cu...
Represents a C array with an unspecified size.
void Profile(llvm::FoldingSetNodeID &ID)
static ItaniumMangleContext * create(ASTContext &Context, DiagnosticsEngine &Diags, bool IsAux=false)
An lvalue reference type, per C++11 [dcl.ref].
@ Swift
Interoperability with the latest known version of the Swift runtime.
@ Swift4_2
Interoperability with the Swift 4.2 runtime.
@ Swift4_1
Interoperability with the Swift 4.1 runtime.
@ Integer
Permit vector bitcasts between integer vectors with different numbers of elements but the same total ...
@ All
Permit vector bitcasts between all vectors with the same total bit-width.
@ PostDecrInWhile
while (count–)
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
std::optional< TargetCXXABI::Kind > CXXABI
C++ ABI to compile with, if specified by the frontend through -fc++-abi=.
clang::ObjCRuntime ObjCRuntime
CoreFoundationABI CFRuntime
bool isOverflowPatternExcluded(OverflowPatternExclusionKind Kind) const
Represents a placeholder type for late-parsed type attributes.
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.
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....
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
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
const FunctionProtoType * T
bool isComputedNoexcept(ExceptionSpecificationType ESpecType)
@ Template
We are parsing a template declaration.
@ Interface
The "__interface" keyword.
@ Struct
The "struct" keyword.
@ Class
The "class" keyword.
constexpr uint16_t SelPointerConstantDiscriminator
Constant discriminator to be used with objective-c sel pointers.
bool isDiscardableGVALinkage(GVALinkage L)
BuiltinTemplateKind
Kinds of BuiltinTemplateDecl.
@ Keyword
The name has been typo-corrected to a keyword.
LangAS
Defines the address space values used by the address space qualifier of QualType.
TranslationUnitKind
Describes the kind of translation unit being processed.
@ Deduced
The normal deduced case.
@ Undeduced
Not deduced yet. This is for example an 'auto' which was just parsed.
const Decl & adjustDeclToTemplate(const Decl &D)
If we have a 'templated' declaration for a template, adjust 'D' to refer to the actual template.
bool isPtrSizeAddressSpace(LangAS AS)
ExprValueKind
The categorization of expression values, currently following the C++11 scheme.
@ VK_PRValue
A pr-value expression (in the C++11 taxonomy) produces a temporary value.
@ VK_XValue
An x-value expression is a reference to an object with independent storage but which can be "moved",...
@ VK_LValue
An l-value expression is a reference to an object with independent storage.
bool declaresSameEntity(const Decl *D1, const Decl *D2)
Determine whether two declarations declare the same entity.
const StreamingDiagnostic & operator<<(const StreamingDiagnostic &DB, const ConceptReference *C)
Insertion operator for diagnostics.
TemplateSpecializationKind
Describes the kind of template specialization that a particular template specialization declaration r...
@ TSK_ExplicitInstantiationDefinition
This template specialization was instantiated from a template due to an explicit instantiation defini...
@ TSK_ExplicitInstantiationDeclaration
This template specialization was instantiated from a template due to an explicit instantiation declar...
@ TSK_ExplicitSpecialization
This template specialization was declared or defined by an explicit specialization (C++ [temp....
@ TSK_ImplicitInstantiation
This template specialization was implicitly instantiated from a template.
@ TSK_Undeclared
This template specialization was formed from a template-id but has not yet been declared,...
CallingConv
CallingConv - Specifies the calling convention that a function uses.
@ Invariant
The parameter is invariant: must match exactly.
@ Contravariant
The parameter is contravariant, e.g., X<T> is a subtype of X when the type parameter is covariant and...
@ Covariant
The parameter is covariant, e.g., X<T> is a subtype of X when the type parameter is covariant and T i...
@ AltiVecBool
is AltiVec 'vector bool ...'
@ SveFixedLengthData
is AArch64 SVE fixed-length data vector
@ AltiVecPixel
is AltiVec 'vector Pixel'
@ Generic
not a target-specific vector type
@ RVVFixedLengthData
is RISC-V RVV fixed-length data vector
@ RVVFixedLengthMask
is RISC-V RVV fixed-length mask vector
@ SveFixedLengthPredicate
is AArch64 SVE fixed-length predicate vector
U cast(CodeGen::Address addr)
LangAS getLangASFromTargetAS(unsigned TargetAS)
@ None
The alignment was not explicit in code.
@ RequiredByEnum
The alignment comes from an alignment attribute on a enum type.
@ RequiredByTypedef
The alignment comes from an alignment attribute on a typedef.
@ RequiredByRecord
The alignment comes from an alignment attribute on a record type.
@ PackIndex
Index of a pack indexing expression or specifier.
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 late-parsed attribute that will be applied as a type attribute.
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