69#include "llvm/ADT/APFixedPoint.h"
70#include "llvm/ADT/APInt.h"
71#include "llvm/ADT/APSInt.h"
72#include "llvm/ADT/ArrayRef.h"
73#include "llvm/ADT/DenseMap.h"
74#include "llvm/ADT/DenseSet.h"
75#include "llvm/ADT/FoldingSet.h"
76#include "llvm/ADT/PointerUnion.h"
77#include "llvm/ADT/STLExtras.h"
78#include "llvm/ADT/SmallPtrSet.h"
79#include "llvm/ADT/SmallVector.h"
80#include "llvm/ADT/StringExtras.h"
81#include "llvm/ADT/StringRef.h"
82#include "llvm/Frontend/OpenMP/OMPIRBuilder.h"
83#include "llvm/Support/Capacity.h"
84#include "llvm/Support/Casting.h"
85#include "llvm/Support/Compiler.h"
86#include "llvm/Support/ErrorHandling.h"
87#include "llvm/Support/MD5.h"
88#include "llvm/Support/MathExtras.h"
89#include "llvm/Support/SipHash.h"
90#include "llvm/Support/raw_ostream.h"
91#include "llvm/TargetParser/AArch64TargetParser.h"
92#include "llvm/TargetParser/Triple.h"
105using namespace clang;
129 if (
const auto *FD = dyn_cast<FunctionDecl>(
D)) {
134 if (
const auto *VD = dyn_cast<VarDecl>(
D)) {
135 if (VD->isStaticDataMember() &&
140 if (
const auto *CRD = dyn_cast<CXXRecordDecl>(
D)) {
145 if (
const auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(
D)) {
152 if (
const auto *ED = dyn_cast<EnumDecl>(
D)) {
156 if (
const auto *TD = dyn_cast<TagDecl>(
D)) {
159 if (TD->isEmbeddedInDeclarator() && !TD->isCompleteDefinition())
163 if (isa<ParmVarDecl>(
D))
168 if (isa<TemplateTypeParmDecl>(
D) ||
169 isa<NonTypeTemplateParmDecl>(
D) ||
170 isa<TemplateTemplateParmDecl>(
D))
181 if (isa<ObjCMethodDecl>(
D) || isa<ObjCContainerDecl>(
D) ||
182 isa<ObjCPropertyDecl>(
D) || isa<RedeclarableTemplateDecl>(
D) ||
183 isa<ClassTemplateSpecializationDecl>(
D) ||
191 Locations.emplace_back(BaseLocation);
219 const std::map<unsigned, RawComment *> &CommentsInTheFile)
const {
222 if (RepresentativeLocForDecl.
isInvalid() ||
223 !RepresentativeLocForDecl.
isFileID())
227 if (CommentsInTheFile.empty())
232 const std::pair<FileID, unsigned> DeclLocDecomp =
236 auto OffsetCommentBehindDecl =
237 CommentsInTheFile.lower_bound(DeclLocDecomp.second);
240 if (OffsetCommentBehindDecl != CommentsInTheFile.end()) {
241 RawComment *CommentBehindDecl = OffsetCommentBehindDecl->second;
245 (isa<FieldDecl>(
D) || isa<EnumConstantDecl>(
D) || isa<VarDecl>(
D) ||
246 isa<ObjCMethodDecl>(
D) || isa<ObjCPropertyDecl>(
D))) {
250 if (SourceMgr.
getLineNumber(DeclLocDecomp.first, DeclLocDecomp.second) ==
252 OffsetCommentBehindDecl->first)) {
253 return CommentBehindDecl;
260 if (OffsetCommentBehindDecl == CommentsInTheFile.begin())
263 auto OffsetCommentBeforeDecl = --OffsetCommentBehindDecl;
264 RawComment *CommentBeforeDecl = OffsetCommentBeforeDecl->second;
273 const unsigned CommentEndOffset =
278 const char *Buffer = SourceMgr.
getBufferData(DeclLocDecomp.first,
284 StringRef
Text(Buffer + CommentEndOffset,
285 DeclLocDecomp.second - CommentEndOffset);
289 if (
Text.find_last_of(
";{}#@") != StringRef::npos)
292 return CommentBeforeDecl;
298 for (
const auto DeclLoc : DeclLocs) {
301 if (DeclLoc.isInvalid() || !DeclLoc.isFileID())
317 if (!CommentsInThisFile || CommentsInThisFile->empty())
329 assert(LangOpts.RetainCommentsFromSystemHeaders ||
338 if (
const auto *FD = dyn_cast<FunctionDecl>(&
D)) {
358 if (
const auto *VD = dyn_cast<VarDecl>(&
D)) {
361 if (VD->isStaticDataMember())
367 if (
const auto *CRD = dyn_cast<CXXRecordDecl>(&
D)) {
374 if (
const auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(CRD)) {
382 : *
static_cast<const Decl *
>(
388 CRD->getMemberSpecializationInfo())
389 return *Info->getInstantiatedFrom();
393 if (
const auto *ED = dyn_cast<EnumDecl>(&
D)) {
406 const Decl **OriginalDecl)
const {
409 OriginalDecl =
nullptr;
421 return DeclComment->second;
434 *OriginalDecl = RedeclComment->second;
437 "This decl is supposed to have comment attached.");
438 return CommentAtRedecl->second;
444 auto LastCheckedRedecl = [
this, CanonicalD]() ->
const Decl * {
448 for (
const auto Redecl :
D->
redecls()) {
451 if (LastCheckedRedecl) {
452 if (LastCheckedRedecl == Redecl) {
453 LastCheckedRedecl =
nullptr;
461 *OriginalDecl = Redecl;
462 return RedeclComment;
468 *OriginalDecl =
nullptr;
484 if (
const auto *IMD = dyn_cast<ObjCImplDecl>(DC)) {
489 for (
const auto *Ext : ID->known_extensions()) {
493 Redeclared.push_back(RedeclaredMethod);
504 for (
const Decl *
D : Decls) {
518 if (
File.isInvalid())
522 if (!CommentsInThisFile || CommentsInThisFile->empty() ||
523 CommentsInThisFile->rbegin()->second->isAttached())
533 for (
const Decl *
D : Decls) {
545 for (
const auto DeclLoc : DeclLocs) {
546 if (DeclLoc.isInvalid() || !DeclLoc.isFileID())
550 D, DeclLoc, *CommentsInThisFile)) {
561 const Decl *
D)
const {
564 ThisDeclInfo->IsFilled =
false;
565 ThisDeclInfo->fill();
566 ThisDeclInfo->CommentDecl = FC->
getDecl();
567 if (!ThisDeclInfo->TemplateParameters)
577 return RC ? RC->
parse(*
this,
nullptr,
D) :
nullptr;
588 llvm::DenseMap<const Decl *, comments::FullComment *>::iterator Pos =
592 if (Canonical !=
D) {
600 const Decl *OriginalDecl =
nullptr;
604 if (isa<ObjCMethodDecl>(
D) || isa<FunctionDecl>(
D)) {
606 const auto *OMD = dyn_cast<ObjCMethodDecl>(
D);
607 if (OMD && OMD->isPropertyAccessor())
614 for (
unsigned i = 0, e = Overridden.size(); i < e; i++)
618 else if (
const auto *TD = dyn_cast<TypedefNameDecl>(
D)) {
621 QualType QT = TD->getUnderlyingType();
623 if (
const Decl *TD = TT->getDecl())
627 else if (
const auto *IC = dyn_cast<ObjCInterfaceDecl>(
D)) {
628 while (IC->getSuperClass()) {
629 IC = IC->getSuperClass();
634 else if (
const auto *CD = dyn_cast<ObjCCategoryDecl>(
D)) {
639 else if (
const auto *RD = dyn_cast<CXXRecordDecl>(
D)) {
640 if (!(RD = RD->getDefinition()))
643 for (
const auto &I : RD->bases()) {
644 if (I.isVirtual() || (I.getAccessSpecifier() !=
AS_public))
658 for (
const auto &I : RD->vbases()) {
679 if (
D != OriginalDecl && OriginalDecl)
688ASTContext::CanonicalTemplateTemplateParm::Profile(llvm::FoldingSetNodeID &ID,
696 ID.AddInteger(Params->
size());
698 PEnd = Params->
end();
700 if (
const auto *TTP = dyn_cast<TemplateTypeParmDecl>(*
P)) {
702 ID.AddBoolean(TTP->isParameterPack());
703 if (TTP->isExpandedParameterPack()) {
705 ID.AddInteger(TTP->getNumExpansionParameters());
707 ID.AddBoolean(
false);
711 if (
const auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(*
P)) {
713 ID.AddBoolean(NTTP->isParameterPack());
714 ID.AddPointer(
C.getUnconstrainedType(
C.getCanonicalType(NTTP->getType()))
716 if (NTTP->isExpandedParameterPack()) {
718 ID.AddInteger(NTTP->getNumExpansionTypes());
719 for (
unsigned I = 0, N = NTTP->getNumExpansionTypes(); I != N; ++I) {
721 ID.AddPointer(
T.getCanonicalType().getAsOpaquePtr());
724 ID.AddBoolean(
false);
728 auto *TTP = cast<TemplateTemplateParmDecl>(*
P);
735ASTContext::getCanonicalTemplateTemplateParmDecl(
738 llvm::FoldingSetNodeID
ID;
739 CanonicalTemplateTemplateParm::Profile(ID, *
this, TTP);
740 void *InsertPos =
nullptr;
741 CanonicalTemplateTemplateParm *Canonical
742 = CanonTemplateTemplateParms.FindNodeOrInsertPos(ID, InsertPos);
744 return Canonical->getParam();
749 CanonParams.reserve(Params->
size());
751 PEnd = Params->
end();
755 if (
const auto *TTP = dyn_cast<TemplateTypeParmDecl>(*
P)) {
761 ? std::optional<unsigned>(TTP->getNumExpansionParameters())
763 CanonParams.push_back(NewTTP);
764 }
else if (
const auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(*
P)) {
768 if (NTTP->isExpandedParameterPack()) {
771 for (
unsigned I = 0, N = NTTP->getNumExpansionTypes(); I != N; ++I) {
773 ExpandedTInfos.push_back(
781 NTTP->getPosition(),
nullptr,
791 NTTP->getPosition(),
nullptr,
793 NTTP->isParameterPack(),
796 CanonParams.push_back(Param);
798 CanonParams.push_back(getCanonicalTemplateTemplateParmDecl(
799 cast<TemplateTemplateParmDecl>(*
P)));
810 Canonical = CanonTemplateTemplateParms.FindNodeOrInsertPos(ID, InsertPos);
811 assert(!Canonical &&
"Shouldn't be in the map!");
815 Canonical =
new (*this) CanonicalTemplateTemplateParm(CanonTTP);
816 CanonTemplateTemplateParms.InsertNode(Canonical, InsertPos);
826 if (!LangOpts.CPlusPlus)
return nullptr;
829 case TargetCXXABI::AppleARM64:
830 case TargetCXXABI::Fuchsia:
831 case TargetCXXABI::GenericARM:
832 case TargetCXXABI::iOS:
833 case TargetCXXABI::WatchOS:
834 case TargetCXXABI::GenericAArch64:
835 case TargetCXXABI::GenericMIPS:
836 case TargetCXXABI::GenericItanium:
837 case TargetCXXABI::WebAssembly:
838 case TargetCXXABI::XL:
840 case TargetCXXABI::Microsoft:
843 llvm_unreachable(
"Invalid CXXABI type!");
847 if (!InterpContext) {
850 return *InterpContext.get();
856 return *ParentMapCtx.get();
861 switch (LangOpts.getAddressSpaceMapMangling()) {
869 llvm_unreachable(
"getAddressSpaceMapMangling() doesn't cover anything.");
875 : ConstantArrayTypes(this_(), ConstantArrayTypesLog2InitSize),
876 DependentSizedArrayTypes(this_()), DependentSizedExtVectorTypes(this_()),
877 DependentAddressSpaceTypes(this_()), DependentVectorTypes(this_()),
878 DependentSizedMatrixTypes(this_()),
879 FunctionProtoTypes(this_(), FunctionProtoTypesLog2InitSize),
880 DependentTypeOfExprTypes(this_()), DependentDecltypeTypes(this_()),
881 TemplateSpecializationTypes(this_()),
882 DependentTemplateSpecializationTypes(this_()), AutoTypes(this_()),
883 DependentBitIntTypes(this_()), SubstTemplateTemplateParmPacks(this_()),
884 ArrayParameterTypes(this_()), CanonTemplateTemplateParms(this_()),
885 SourceMgr(
SM), LangOpts(LOpts),
888 LangOpts.XRayNeverInstrumentFiles,
889 LangOpts.XRayAttrListFiles,
SM)),
892 BuiltinInfo(builtins), TUKind(TUKind), DeclarationNames(*this),
893 Comments(
SM), CommentCommandTraits(BumpAlloc, LOpts.CommentOpts),
894 CompCategories(this_()), LastSDM(nullptr, 0) {
901 ReleaseDeclContextMaps();
904 for (
auto &Pair : Deallocations)
905 (Pair.first)(Pair.second);
906 Deallocations.clear();
912 I = ObjCLayouts.begin(),
E = ObjCLayouts.end(); I !=
E; )
918 for (llvm::DenseMap<const RecordDecl*, const ASTRecordLayout*>::iterator
919 I = ASTRecordLayouts.begin(),
E = ASTRecordLayouts.end(); I !=
E; ) {
924 ASTRecordLayouts.clear();
926 for (llvm::DenseMap<const Decl*, AttrVec*>::iterator A = DeclAttrs.begin(),
927 AEnd = DeclAttrs.end();
929 A->second->~AttrVec();
932 for (
const auto &
Value : ModuleInitializers)
933 Value.second->~PerModuleInitializers();
934 ModuleInitializers.
clear();
940 TraversalScope = TopLevelDecls;
945 Deallocations.push_back({Callback,
Data});
954 llvm::errs() <<
"\n*** AST Context Stats:\n";
955 llvm::errs() <<
" " << Types.size() <<
" types total.\n";
957 unsigned counts[] = {
958#define TYPE(Name, Parent) 0,
959#define ABSTRACT_TYPE(Name, Parent)
960#include "clang/AST/TypeNodes.inc"
964 for (
unsigned i = 0, e = Types.size(); i != e; ++i) {
970 unsigned TotalBytes = 0;
971#define TYPE(Name, Parent) \
973 llvm::errs() << " " << counts[Idx] << " " << #Name \
974 << " types, " << sizeof(Name##Type) << " each " \
975 << "(" << counts[Idx] * sizeof(Name##Type) \
977 TotalBytes += counts[Idx] * sizeof(Name##Type); \
979#define ABSTRACT_TYPE(Name, Parent)
980#include "clang/AST/TypeNodes.inc"
982 llvm::errs() <<
"Total bytes = " << TotalBytes <<
"\n";
987 <<
" implicit default constructors created\n";
990 <<
" implicit copy constructors created\n";
994 <<
" implicit move constructors created\n";
997 <<
" implicit copy assignment operators created\n";
1001 <<
" implicit move assignment operators created\n";
1004 <<
" implicit destructors created\n";
1007 llvm::errs() <<
"\n";
1011 BumpAlloc.PrintStats();
1015 bool NotifyListeners) {
1016 if (NotifyListeners)
1025 if (It == MergedDefModules.end())
1028 auto &Merged = It->second;
1029 llvm::DenseSet<Module*>
Found;
1030 for (
Module *&M : Merged)
1031 if (!
Found.insert(M).second)
1033 llvm::erase(Merged,
nullptr);
1040 if (MergedIt == MergedDefModules.end())
1041 return std::nullopt;
1042 return MergedIt->second;
1045void ASTContext::PerModuleInitializers::resolve(
ASTContext &Ctx) {
1046 if (LazyInitializers.empty())
1050 assert(Source &&
"lazy initializers but no external source");
1052 auto LazyInits = std::move(LazyInitializers);
1053 LazyInitializers.clear();
1055 for (
auto ID : LazyInits)
1056 Initializers.push_back(Source->GetExternalDecl(ID));
1058 assert(LazyInitializers.empty() &&
1059 "GetExternalDecl for lazy module initializer added more inits");
1065 if (
const auto *ID = dyn_cast<ImportDecl>(
D)) {
1066 auto It = ModuleInitializers.find(ID->getImportedModule());
1069 if (It == ModuleInitializers.end())
1073 auto &Imported = *It->second;
1074 if (Imported.Initializers.size() + Imported.LazyInitializers.size() == 1) {
1075 Imported.resolve(*
this);
1076 auto *OnlyDecl = Imported.Initializers.front();
1077 if (isa<ImportDecl>(OnlyDecl))
1082 auto *&Inits = ModuleInitializers[M];
1084 Inits =
new (*this) PerModuleInitializers;
1085 Inits->Initializers.push_back(
D);
1090 auto *&Inits = ModuleInitializers[M];
1092 Inits =
new (*this) PerModuleInitializers;
1093 Inits->LazyInitializers.insert(Inits->LazyInitializers.end(),
1094 IDs.begin(), IDs.end());
1098 auto It = ModuleInitializers.find(M);
1099 if (It == ModuleInitializers.end())
1100 return std::nullopt;
1102 auto *Inits = It->second;
1103 Inits->resolve(*
this);
1104 return Inits->Initializers;
1109 assert(!CurrentCXXNamedModule &&
1110 "We should set named module for ASTContext for only once");
1111 CurrentCXXNamedModule = M;
1123 auto GetRepresentativeModule = [
this](
const Module *M) {
1124 auto Iter = SameModuleLookupSet.find(M);
1125 if (
Iter != SameModuleLookupSet.end())
1126 return Iter->second;
1128 const Module *RepresentativeModule =
1129 PrimaryModuleNameMap.try_emplace(M->getPrimaryModuleInterfaceName(), M)
1131 SameModuleLookupSet[M] = RepresentativeModule;
1132 return RepresentativeModule;
1135 assert(M1 &&
"Shouldn't call `isInSameModule` if both M1 and M2 are none.");
1136 return GetRepresentativeModule(M1) == GetRepresentativeModule(M2);
1140 if (!ExternCContext)
1143 return ExternCContext;
1149 auto *BuiltinTemplate =
1151 BuiltinTemplate->setImplicit();
1154 return BuiltinTemplate;
1159 if (!MakeIntegerSeqDecl)
1162 return MakeIntegerSeqDecl;
1167 if (!TypePackElementDecl)
1170 return TypePackElementDecl;
1184 NewDecl->
addAttr(TypeVisibilityAttr::CreateImplicit(
1185 const_cast<ASTContext &
>(*
this), TypeVisibilityAttr::Default));
1190 StringRef Name)
const {
1214 Types.push_back(Ty);
1219 assert((!this->Target || this->Target == &
Target) &&
1220 "Incorrect target reinitialization");
1224 this->AuxTarget = AuxTarget;
1226 ABI.reset(createCXXABI(
Target));
1230 InitBuiltinType(
VoidTy, BuiltinType::Void);
1233 InitBuiltinType(
BoolTy, BuiltinType::Bool);
1235 if (LangOpts.CharIsSigned)
1236 InitBuiltinType(
CharTy, BuiltinType::Char_S);
1238 InitBuiltinType(
CharTy, BuiltinType::Char_U);
1241 InitBuiltinType(
ShortTy, BuiltinType::Short);
1242 InitBuiltinType(
IntTy, BuiltinType::Int);
1243 InitBuiltinType(
LongTy, BuiltinType::Long);
1244 InitBuiltinType(
LongLongTy, BuiltinType::LongLong);
1254 InitBuiltinType(
FloatTy, BuiltinType::Float);
1255 InitBuiltinType(
DoubleTy, BuiltinType::Double);
1256 InitBuiltinType(
LongDoubleTy, BuiltinType::LongDouble);
1259 InitBuiltinType(
Float128Ty, BuiltinType::Float128);
1262 InitBuiltinType(
Ibm128Ty, BuiltinType::Ibm128);
1265 InitBuiltinType(
Float16Ty, BuiltinType::Float16);
1268 InitBuiltinType(
ShortAccumTy, BuiltinType::ShortAccum);
1269 InitBuiltinType(
AccumTy, BuiltinType::Accum);
1270 InitBuiltinType(
LongAccumTy, BuiltinType::LongAccum);
1274 InitBuiltinType(
ShortFractTy, BuiltinType::ShortFract);
1275 InitBuiltinType(
FractTy, BuiltinType::Fract);
1276 InitBuiltinType(
LongFractTy, BuiltinType::LongFract);
1281 InitBuiltinType(
SatAccumTy, BuiltinType::SatAccum);
1287 InitBuiltinType(
SatFractTy, BuiltinType::SatFract);
1294 InitBuiltinType(
Int128Ty, BuiltinType::Int128);
1299 InitBuiltinType(
WCharTy, BuiltinType::WChar_S);
1301 InitBuiltinType(
WCharTy, BuiltinType::WChar_U);
1302 if (LangOpts.CPlusPlus && LangOpts.WChar)
1312 InitBuiltinType(
Char8Ty, BuiltinType::Char8);
1314 if (LangOpts.CPlusPlus)
1315 InitBuiltinType(
Char16Ty, BuiltinType::Char16);
1319 if (LangOpts.CPlusPlus)
1320 InitBuiltinType(
Char32Ty, BuiltinType::Char32);
1329 InitBuiltinType(
DependentTy, BuiltinType::Dependent);
1332 InitBuiltinType(
OverloadTy, BuiltinType::Overload);
1344 InitBuiltinType(
UnknownAnyTy, BuiltinType::UnknownAny);
1350 InitBuiltinType(
BuiltinFnTy, BuiltinType::BuiltinFn);
1353 if (LangOpts.OpenMP) {
1360 if (LangOpts.OpenACC && !LangOpts.OpenMP) {
1363 if (LangOpts.MatrixTypes)
1371 if (LangOpts.OpenCL) {
1372#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
1373 InitBuiltinType(SingletonId, BuiltinType::Id);
1374#include "clang/Basic/OpenCLImageTypes.def"
1376 InitBuiltinType(
OCLSamplerTy, BuiltinType::OCLSampler);
1377 InitBuiltinType(
OCLEventTy, BuiltinType::OCLEvent);
1379 InitBuiltinType(
OCLQueueTy, BuiltinType::OCLQueue);
1382#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
1383 InitBuiltinType(Id##Ty, BuiltinType::Id);
1384#include "clang/Basic/OpenCLExtensionTypes.def"
1387 if (LangOpts.HLSL) {
1388#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) \
1389 InitBuiltinType(SingletonId, BuiltinType::Id);
1390#include "clang/Basic/HLSLIntangibleTypes.def"
1393 if (
Target.hasAArch64SVETypes() ||
1395#define SVE_TYPE(Name, Id, SingletonId) \
1396 InitBuiltinType(SingletonId, BuiltinType::Id);
1397#include "clang/Basic/AArch64SVEACLETypes.def"
1400 if (
Target.getTriple().isPPC64()) {
1401#define PPC_VECTOR_MMA_TYPE(Name, Id, Size) \
1402 InitBuiltinType(Id##Ty, BuiltinType::Id);
1403#include "clang/Basic/PPCTypes.def"
1404#define PPC_VECTOR_VSX_TYPE(Name, Id, Size) \
1405 InitBuiltinType(Id##Ty, BuiltinType::Id);
1406#include "clang/Basic/PPCTypes.def"
1409 if (
Target.hasRISCVVTypes()) {
1410#define RVV_TYPE(Name, Id, SingletonId) \
1411 InitBuiltinType(SingletonId, BuiltinType::Id);
1412#include "clang/Basic/RISCVVTypes.def"
1415 if (
Target.getTriple().isWasm() &&
Target.hasFeature(
"reference-types")) {
1416#define WASM_TYPE(Name, Id, SingletonId) \
1417 InitBuiltinType(SingletonId, BuiltinType::Id);
1418#include "clang/Basic/WebAssemblyReferenceTypes.def"
1421 if (
Target.getTriple().isAMDGPU() ||
1422 (AuxTarget && AuxTarget->
getTriple().isAMDGPU())) {
1423#define AMDGPU_TYPE(Name, Id, SingletonId) \
1424 InitBuiltinType(SingletonId, BuiltinType::Id);
1425#include "clang/Basic/AMDGPUTypes.def"
1432 ObjCConstantStringType =
QualType();
1437 if (LangOpts.OpenCLGenericAddressSpace) {
1447 InitBuiltinType(
NullPtrTy, BuiltinType::NullPtr);
1450 InitBuiltinType(
HalfTy, BuiltinType::Half);
1452 InitBuiltinType(
BFloat16Ty, BuiltinType::BFloat16);
1458 if (LangOpts.MicrosoftExt || LangOpts.Borland) {
1480 llvm::DenseMap<const Decl*, AttrVec*>::iterator Pos = DeclAttrs.find(
D);
1481 if (Pos != DeclAttrs.end()) {
1482 Pos->second->~AttrVec();
1483 DeclAttrs.erase(Pos);
1497 llvm::DenseMap<const VarDecl *, TemplateOrSpecializationInfo>::iterator Pos =
1498 TemplateOrInstantiation.find(Var);
1499 if (Pos == TemplateOrInstantiation.end())
1512 Tmpl, TSK, PointOfInstantiation));
1518 assert(!TemplateOrInstantiation[Inst] &&
1519 "Already noted what the variable was instantiated from");
1520 TemplateOrInstantiation[Inst] = TSI;
1525 return InstantiatedFromUsingDecl.lookup(UUD);
1530 assert((isa<UsingDecl>(Pattern) ||
1531 isa<UnresolvedUsingValueDecl>(Pattern) ||
1532 isa<UnresolvedUsingTypenameDecl>(Pattern)) &&
1533 "pattern decl is not a using decl");
1534 assert((isa<UsingDecl>(Inst) ||
1535 isa<UnresolvedUsingValueDecl>(Inst) ||
1536 isa<UnresolvedUsingTypenameDecl>(Inst)) &&
1537 "instantiation did not produce a using decl");
1538 assert(!InstantiatedFromUsingDecl[Inst] &&
"pattern already exists");
1539 InstantiatedFromUsingDecl[Inst] = Pattern;
1544 return InstantiatedFromUsingEnumDecl.lookup(UUD);
1549 assert(!InstantiatedFromUsingEnumDecl[Inst] &&
"pattern already exists");
1550 InstantiatedFromUsingEnumDecl[Inst] = Pattern;
1555 return InstantiatedFromUsingShadowDecl.lookup(Inst);
1561 assert(!InstantiatedFromUsingShadowDecl[Inst] &&
"pattern already exists");
1562 InstantiatedFromUsingShadowDecl[Inst] = Pattern;
1566 return InstantiatedFromUnnamedFieldDecl.lookup(Field);
1571 assert(!Inst->
getDeclName() &&
"Instantiated field decl is not unnamed");
1572 assert(!Tmpl->
getDeclName() &&
"Template field decl is not unnamed");
1573 assert(!InstantiatedFromUnnamedFieldDecl[Inst] &&
1574 "Already noted what unnamed field was instantiated from");
1576 InstantiatedFromUnnamedFieldDecl[Inst] = Tmpl;
1597 llvm::DenseMap<const CXXMethodDecl *, CXXMethodVector>::const_iterator Pos =
1599 if (Pos == OverriddenMethods.end())
1607 OverriddenMethods[Method].push_back(Overridden);
1615 if (
const auto *CXXMethod = dyn_cast<CXXMethodDecl>(
D)) {
1621 const auto *Method = dyn_cast<ObjCMethodDecl>(
D);
1626 Method->getOverriddenMethods(OverDecls);
1627 Overridden.append(OverDecls.begin(), OverDecls.end());
1631 assert(!Import->getNextLocalImport() &&
1632 "Import declaration already in the chain");
1633 assert(!Import->isFromASTFile() &&
"Non-local import declaration");
1634 if (!FirstLocalImport) {
1635 FirstLocalImport = Import;
1636 LastLocalImport = Import;
1640 LastLocalImport->setNextLocalImport(Import);
1641 LastLocalImport = Import;
1653 llvm_unreachable(
"Not a floating point type!");
1654 case BuiltinType::BFloat16:
1655 return Target->getBFloat16Format();
1656 case BuiltinType::Float16:
1657 return Target->getHalfFormat();
1658 case BuiltinType::Half:
1659 return Target->getHalfFormat();
1660 case BuiltinType::Float:
return Target->getFloatFormat();
1661 case BuiltinType::Double:
return Target->getDoubleFormat();
1662 case BuiltinType::Ibm128:
1663 return Target->getIbm128Format();
1664 case BuiltinType::LongDouble:
1667 return Target->getLongDoubleFormat();
1668 case BuiltinType::Float128:
1671 return Target->getFloat128Format();
1676 unsigned Align =
Target->getCharWidth();
1680 Align = AlignFromAttr;
1688 bool UseAlignAttrOnly;
1689 if (
const FieldDecl *FD = dyn_cast<FieldDecl>(
D))
1691 FD->hasAttr<PackedAttr>() || FD->getParent()->hasAttr<PackedAttr>();
1693 UseAlignAttrOnly = AlignFromAttr != 0;
1696 if (UseAlignAttrOnly) {
1698 }
else if (
const auto *VD = dyn_cast<ValueDecl>(
D)) {
1708 Align = getTypeInfoImpl(
T.getTypePtr()).
Align;
1713 unsigned MinWidth =
Target->getLargeArrayMinWidth();
1714 if (!ForAlignof && MinWidth) {
1716 Align = std::max(Align,
Target->getLargeArrayAlign());
1717 else if (isa<ConstantArrayType>(
arrayType) &&
1719 Align = std::max(Align,
Target->getLargeArrayAlign());
1724 Align =
Target->getCharWidth();
1728 if (
const auto *VD = dyn_cast<VarDecl>(
D))
1729 if (VD->hasGlobalStorage() && !ForAlignof) {
1740 if (
const auto *Field = dyn_cast<FieldDecl>(VD)) {
1743 if (!
Parent->isInvalidDecl()) {
1754 uint64_t LowBitOfOffset = Offset & (~Offset + 1);
1755 if (LowBitOfOffset < FieldAlign)
1756 FieldAlign =
static_cast<unsigned>(LowBitOfOffset);
1759 Align = std::min(Align, FieldAlign);
1767 const auto *VD = dyn_cast<VarDecl>(
D);
1768 if (MaxAlignedAttr && VD && VD->getStorageClass() ==
SC_Static)
1769 Align = std::min(Align, MaxAlignedAttr);
1807 (uint64_t)(-1)/Size) &&
1808 "Overflow in array type char size evaluation");
1813 Width = llvm::alignTo(Width, Align);
1820 if (
const auto *CAT = dyn_cast<ConstantArrayType>(
T))
1838 switch (BT->getKind()) {
1839 case BuiltinType::Bool:
1840 case BuiltinType::Char_S:
1841 case BuiltinType::Char_U:
1842 case BuiltinType::SChar:
1843 case BuiltinType::UChar:
1844 case BuiltinType::Short:
1845 case BuiltinType::UShort:
1846 case BuiltinType::WChar_S:
1847 case BuiltinType::WChar_U:
1848 case BuiltinType::Char8:
1849 case BuiltinType::Char16:
1850 case BuiltinType::Char32:
1860 ET->getDecl()->isScoped())
1878 bool NeedsPreferredAlignment)
const {
1881 if (
unsigned Align = TT->getDecl()->getMaxAlignment())
1892 if (
unsigned Align = TT->getDecl()->getMaxAlignment())
1897 return TT->getDecl()->getMaxAlignment();
1903 TypeInfoMap::iterator I = MemoizedTypeInfo.find(
T);
1904 if (I != MemoizedTypeInfo.end())
1909 MemoizedTypeInfo[
T] = TI;
1925#define TYPE(Class, Base)
1926#define ABSTRACT_TYPE(Class, Base)
1927#define NON_CANONICAL_TYPE(Class, Base)
1928#define DEPENDENT_TYPE(Class, Base) case Type::Class:
1929#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base) \
1931 assert(!T->isDependentType() && "should not see dependent types here"); \
1932 return getTypeInfo(cast<Class##Type>(T)->desugar().getTypePtr());
1933#include "clang/AST/TypeNodes.inc"
1934 llvm_unreachable(
"Should not see dependent types");
1936 case Type::FunctionNoProto:
1937 case Type::FunctionProto:
1943 case Type::IncompleteArray:
1944 case Type::VariableArray:
1945 case Type::ConstantArray:
1946 case Type::ArrayParameter: {
1949 if (
const auto *CAT = dyn_cast<ConstantArrayType>(
T))
1950 Size = CAT->getZExtSize();
1953 assert((Size == 0 || EltInfo.
Width <= (uint64_t)(-1) / Size) &&
1954 "Overflow in array type bit size evaluation");
1955 Width = EltInfo.
Width * Size;
1956 Align = EltInfo.
Align;
1960 Width = llvm::alignTo(Width, Align);
1964 case Type::ExtVector:
1965 case Type::Vector: {
1966 const auto *VT = cast<VectorType>(
T);
1968 Width = VT->isExtVectorBoolType() ? VT->getNumElements()
1969 : EltInfo.
Width * VT->getNumElements();
1971 Width = std::max<unsigned>(8, Width);
1972 Align = std::max<unsigned>(8, Width);
1976 if (Align & (Align-1)) {
1977 Align = llvm::bit_ceil(Align);
1978 Width = llvm::alignTo(Width, Align);
1982 if (TargetVectorAlign && TargetVectorAlign < Align)
1983 Align = TargetVectorAlign;
1997 Align = std::min<unsigned>(64, Width);
2001 case Type::ConstantMatrix: {
2002 const auto *MT = cast<ConstantMatrixType>(
T);
2007 Width = ElementInfo.
Width * MT->getNumRows() * MT->getNumColumns();
2008 Align = ElementInfo.
Align;
2013 switch (cast<BuiltinType>(
T)->
getKind()) {
2014 default: llvm_unreachable(
"Unknown builtin type!");
2015 case BuiltinType::Void:
2020 case BuiltinType::Bool:
2021 Width =
Target->getBoolWidth();
2022 Align =
Target->getBoolAlign();
2024 case BuiltinType::Char_S:
2025 case BuiltinType::Char_U:
2026 case BuiltinType::UChar:
2027 case BuiltinType::SChar:
2028 case BuiltinType::Char8:
2029 Width =
Target->getCharWidth();
2030 Align =
Target->getCharAlign();
2032 case BuiltinType::WChar_S:
2033 case BuiltinType::WChar_U:
2034 Width =
Target->getWCharWidth();
2035 Align =
Target->getWCharAlign();
2037 case BuiltinType::Char16:
2038 Width =
Target->getChar16Width();
2039 Align =
Target->getChar16Align();
2041 case BuiltinType::Char32:
2042 Width =
Target->getChar32Width();
2043 Align =
Target->getChar32Align();
2045 case BuiltinType::UShort:
2046 case BuiltinType::Short:
2047 Width =
Target->getShortWidth();
2048 Align =
Target->getShortAlign();
2050 case BuiltinType::UInt:
2051 case BuiltinType::Int:
2052 Width =
Target->getIntWidth();
2053 Align =
Target->getIntAlign();
2055 case BuiltinType::ULong:
2056 case BuiltinType::Long:
2057 Width =
Target->getLongWidth();
2058 Align =
Target->getLongAlign();
2060 case BuiltinType::ULongLong:
2061 case BuiltinType::LongLong:
2062 Width =
Target->getLongLongWidth();
2063 Align =
Target->getLongLongAlign();
2065 case BuiltinType::Int128:
2066 case BuiltinType::UInt128:
2068 Align =
Target->getInt128Align();
2070 case BuiltinType::ShortAccum:
2071 case BuiltinType::UShortAccum:
2072 case BuiltinType::SatShortAccum:
2073 case BuiltinType::SatUShortAccum:
2074 Width =
Target->getShortAccumWidth();
2075 Align =
Target->getShortAccumAlign();
2077 case BuiltinType::Accum:
2078 case BuiltinType::UAccum:
2079 case BuiltinType::SatAccum:
2080 case BuiltinType::SatUAccum:
2081 Width =
Target->getAccumWidth();
2082 Align =
Target->getAccumAlign();
2084 case BuiltinType::LongAccum:
2085 case BuiltinType::ULongAccum:
2086 case BuiltinType::SatLongAccum:
2087 case BuiltinType::SatULongAccum:
2088 Width =
Target->getLongAccumWidth();
2089 Align =
Target->getLongAccumAlign();
2091 case BuiltinType::ShortFract:
2092 case BuiltinType::UShortFract:
2093 case BuiltinType::SatShortFract:
2094 case BuiltinType::SatUShortFract:
2095 Width =
Target->getShortFractWidth();
2096 Align =
Target->getShortFractAlign();
2098 case BuiltinType::Fract:
2099 case BuiltinType::UFract:
2100 case BuiltinType::SatFract:
2101 case BuiltinType::SatUFract:
2102 Width =
Target->getFractWidth();
2103 Align =
Target->getFractAlign();
2105 case BuiltinType::LongFract:
2106 case BuiltinType::ULongFract:
2107 case BuiltinType::SatLongFract:
2108 case BuiltinType::SatULongFract:
2109 Width =
Target->getLongFractWidth();
2110 Align =
Target->getLongFractAlign();
2112 case BuiltinType::BFloat16:
2113 if (
Target->hasBFloat16Type()) {
2114 Width =
Target->getBFloat16Width();
2115 Align =
Target->getBFloat16Align();
2124 case BuiltinType::Float16:
2125 case BuiltinType::Half:
2128 Width =
Target->getHalfWidth();
2129 Align =
Target->getHalfAlign();
2132 "Expected OpenMP device compilation.");
2137 case BuiltinType::Float:
2138 Width =
Target->getFloatWidth();
2139 Align =
Target->getFloatAlign();
2141 case BuiltinType::Double:
2142 Width =
Target->getDoubleWidth();
2143 Align =
Target->getDoubleAlign();
2145 case BuiltinType::Ibm128:
2146 Width =
Target->getIbm128Width();
2147 Align =
Target->getIbm128Align();
2149 case BuiltinType::LongDouble:
2156 Width =
Target->getLongDoubleWidth();
2157 Align =
Target->getLongDoubleAlign();
2160 case BuiltinType::Float128:
2163 Width =
Target->getFloat128Width();
2164 Align =
Target->getFloat128Align();
2167 "Expected OpenMP device compilation.");
2172 case BuiltinType::NullPtr:
2177 case BuiltinType::ObjCId:
2178 case BuiltinType::ObjCClass:
2179 case BuiltinType::ObjCSel:
2183 case BuiltinType::OCLSampler:
2184 case BuiltinType::OCLEvent:
2185 case BuiltinType::OCLClkEvent:
2186 case BuiltinType::OCLQueue:
2187 case BuiltinType::OCLReserveID:
2188#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
2189 case BuiltinType::Id:
2190#include "clang/Basic/OpenCLImageTypes.def"
2191#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
2192 case BuiltinType::Id:
2193#include "clang/Basic/OpenCLExtensionTypes.def"
2195 Width =
Target->getPointerWidth(AS);
2196 Align =
Target->getPointerAlign(AS);
2206#define SVE_VECTOR_TYPE(Name, MangledName, Id, SingletonId, NumEls, ElBits, \
2207 IsSigned, IsFP, IsBF) \
2208 case BuiltinType::Id: \
2212#define SVE_PREDICATE_TYPE(Name, MangledName, Id, SingletonId, NumEls) \
2213 case BuiltinType::Id: \
2217#define SVE_OPAQUE_TYPE(Name, MangledName, Id, SingletonId) \
2218 case BuiltinType::Id: \
2222#include "clang/Basic/AArch64SVEACLETypes.def"
2223#define PPC_VECTOR_TYPE(Name, Id, Size) \
2224 case BuiltinType::Id: \
2228#include "clang/Basic/PPCTypes.def"
2229#define RVV_VECTOR_TYPE(Name, Id, SingletonId, ElKind, ElBits, NF, IsSigned, \
2231 case BuiltinType::Id: \
2235#define RVV_PREDICATE_TYPE(Name, Id, SingletonId, ElKind) \
2236 case BuiltinType::Id: \
2240#include "clang/Basic/RISCVVTypes.def"
2241#define WASM_TYPE(Name, Id, SingletonId) \
2242 case BuiltinType::Id: \
2246#include "clang/Basic/WebAssemblyReferenceTypes.def"
2247#define AMDGPU_OPAQUE_PTR_TYPE(NAME, MANGLEDNAME, AS, WIDTH, ALIGN, ID, \
2249 case BuiltinType::ID: \
2253#include "clang/Basic/AMDGPUTypes.def"
2254#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
2255#include "clang/Basic/HLSLIntangibleTypes.def"
2261 case Type::ObjCObjectPointer:
2265 case Type::BlockPointer:
2266 AS = cast<BlockPointerType>(
T)->getPointeeType().getAddressSpace();
2267 Width =
Target->getPointerWidth(AS);
2268 Align =
Target->getPointerAlign(AS);
2270 case Type::LValueReference:
2271 case Type::RValueReference:
2274 AS = cast<ReferenceType>(
T)->getPointeeType().getAddressSpace();
2275 Width =
Target->getPointerWidth(AS);
2276 Align =
Target->getPointerAlign(AS);
2279 AS = cast<PointerType>(
T)->getPointeeType().getAddressSpace();
2280 Width =
Target->getPointerWidth(AS);
2281 Align =
Target->getPointerAlign(AS);
2283 case Type::MemberPointer: {
2284 const auto *MPT = cast<MemberPointerType>(
T);
2290 case Type::Complex: {
2294 Width = EltInfo.
Width * 2;
2295 Align = EltInfo.
Align;
2298 case Type::ObjCObject:
2299 return getTypeInfo(cast<ObjCObjectType>(
T)->getBaseType().getTypePtr());
2300 case Type::Adjusted:
2303 case Type::ObjCInterface: {
2304 const auto *ObjCI = cast<ObjCInterfaceType>(
T);
2305 if (ObjCI->getDecl()->isInvalidDecl()) {
2315 case Type::BitInt: {
2316 const auto *EIT = cast<BitIntType>(
T);
2317 Align =
Target->getBitIntAlign(EIT->getNumBits());
2318 Width =
Target->getBitIntWidth(EIT->getNumBits());
2323 const auto *TT = cast<TagType>(
T);
2325 if (TT->getDecl()->isInvalidDecl()) {
2331 if (
const auto *ET = dyn_cast<EnumType>(TT)) {
2332 const EnumDecl *ED = ET->getDecl();
2336 Info.
Align = AttrAlign;
2342 const auto *RT = cast<RecordType>(TT);
2347 AlignRequirement = RD->
hasAttr<AlignedAttr>()
2353 case Type::SubstTemplateTypeParm:
2354 return getTypeInfo(cast<SubstTemplateTypeParmType>(
T)->
2355 getReplacementType().getTypePtr());
2358 case Type::DeducedTemplateSpecialization: {
2359 const auto *A = cast<DeducedType>(
T);
2360 assert(!A->getDeducedType().isNull() &&
2361 "cannot request the size of an undeduced or dependent auto type");
2362 return getTypeInfo(A->getDeducedType().getTypePtr());
2366 return getTypeInfo(cast<ParenType>(
T)->getInnerType().getTypePtr());
2368 case Type::MacroQualified:
2372 case Type::ObjCTypeParam:
2373 return getTypeInfo(cast<ObjCTypeParamType>(
T)->desugar().getTypePtr());
2376 return getTypeInfo(cast<UsingType>(
T)->desugar().getTypePtr());
2378 case Type::Typedef: {
2379 const auto *TT = cast<TypedefType>(
T);
2384 if (
unsigned AttrAlign = TT->getDecl()->getMaxAlignment()) {
2395 case Type::Elaborated:
2396 return getTypeInfo(cast<ElaboratedType>(
T)->getNamedType().getTypePtr());
2398 case Type::Attributed:
2400 cast<AttributedType>(
T)->getEquivalentType().getTypePtr());
2402 case Type::CountAttributed:
2403 return getTypeInfo(cast<CountAttributedType>(
T)->desugar().getTypePtr());
2405 case Type::BTFTagAttributed:
2407 cast<BTFTagAttributedType>(
T)->getWrappedType().getTypePtr());
2409 case Type::Atomic: {
2418 Width =
Target->getCharWidth();
2420 }
else if (Width <= Target->getMaxAtomicPromoteWidth()) {
2426 Width = llvm::bit_ceil(Width);
2429 Align =
static_cast<unsigned>(Width);
2440 assert(llvm::isPowerOf2_32(Align) &&
"Alignment must be power of 2");
2441 return TypeInfo(Width, Align, AlignRequirement);
2445 UnadjustedAlignMap::iterator I = MemoizedUnadjustedAlign.find(
T);
2446 if (I != MemoizedUnadjustedAlign.end())
2449 unsigned UnadjustedAlign;
2461 MemoizedUnadjustedAlign[
T] = UnadjustedAlign;
2462 return UnadjustedAlign;
2466 unsigned SimdAlign = llvm::OpenMPIRBuilder::getOpenMPDefaultSimdAlign(
2516 unsigned ABIAlign = TI.
Align;
2524 if (!
Target->allowsLargerPreferedTypeAlignment())
2538 unsigned PreferredAlign =
static_cast<unsigned>(
2540 assert(PreferredAlign >= ABIAlign &&
2541 "PreferredAlign should be at least as large as ABIAlign.");
2542 return PreferredAlign;
2549 T = CT->getElementType().getTypePtr();
2551 T = ET->getDecl()->getIntegerType().getTypePtr();
2556 Target->defaultsToAIXPowerAlignment()))
2611 for (
unsigned I = 0, N =
Path.size(); I != N; ++I) {
2615 std::swap(
Base, Derived);
2635 llvm::append_range(Ivars, OI->
ivars());
2638 for (
const ObjCIvarDecl *Iv = IDecl->all_declared_ivar_begin(); Iv;
2640 Ivars.push_back(Iv);
2648 if (
const auto *OI = dyn_cast<ObjCInterfaceDecl>(CDecl)) {
2651 for (
auto *Proto : OI->all_referenced_protocols()) {
2656 for (
const auto *Cat : OI->visible_categories())
2662 SD = SD->getSuperClass();
2664 }
else if (
const auto *OC = dyn_cast<ObjCCategoryDecl>(CDecl)) {
2665 for (
auto *Proto : OC->protocols()) {
2668 }
else if (
const auto *OP = dyn_cast<ObjCProtocolDecl>(CDecl)) {
2670 if (!Protocols.insert(
2674 for (
auto *Proto : OP->protocols())
2681 bool CheckIfTriviallyCopyable) {
2682 assert(RD->
isUnion() &&
"Must be union type");
2685 for (
const auto *Field : RD->
fields()) {
2687 CheckIfTriviallyCopyable))
2690 if (FieldSize != UnionSize)
2708static std::optional<int64_t>
2711 bool CheckIfTriviallyCopyable);
2713static std::optional<int64_t>
2715 bool CheckIfTriviallyCopyable) {
2716 if (Field->getType()->isRecordType()) {
2717 const RecordDecl *RD = Field->getType()->getAsRecordDecl();
2720 CheckIfTriviallyCopyable);
2725 bool IsBitIntType = Field->getType()->isBitIntType();
2726 if (!Field->getType()->isReferenceType() && !IsBitIntType &&
2728 CheckIfTriviallyCopyable))
2729 return std::nullopt;
2731 int64_t FieldSizeInBits =
2733 if (Field->isBitField()) {
2736 if (Field->isUnnamedBitField())
2739 int64_t BitfieldSize = Field->getBitWidthValue(Context);
2741 if ((
unsigned)BitfieldSize >
2742 cast<BitIntType>(Field->getType())->getNumBits())
2743 return std::nullopt;
2744 }
else if (BitfieldSize > FieldSizeInBits) {
2745 return std::nullopt;
2747 FieldSizeInBits = BitfieldSize;
2749 Field->getType(), CheckIfTriviallyCopyable)) {
2750 return std::nullopt;
2752 return FieldSizeInBits;
2755static std::optional<int64_t>
2757 bool CheckIfTriviallyCopyable) {
2759 CheckIfTriviallyCopyable);
2762template <
typename RangeT>
2764 const RangeT &Subobjects, int64_t CurOffsetInBits,
2766 bool CheckIfTriviallyCopyable) {
2767 for (
const auto *Subobject : Subobjects) {
2768 std::optional<int64_t> SizeInBits =
2771 return std::nullopt;
2772 if (*SizeInBits != 0) {
2774 if (Offset != CurOffsetInBits)
2775 return std::nullopt;
2776 CurOffsetInBits += *SizeInBits;
2779 return CurOffsetInBits;
2782static std::optional<int64_t>
2785 bool CheckIfTriviallyCopyable) {
2786 assert(!RD->
isUnion() &&
"Must be struct/class type");
2789 int64_t CurOffsetInBits = 0;
2790 if (
const auto *ClassDecl = dyn_cast<CXXRecordDecl>(RD)) {
2791 if (ClassDecl->isDynamicClass())
2792 return std::nullopt;
2795 for (
const auto &
Base : ClassDecl->bases()) {
2798 Bases.emplace_back(
Base.getType()->getAsCXXRecordDecl());
2802 return Layout.getBaseClassOffset(L) < Layout.getBaseClassOffset(R);
2805 std::optional<int64_t> OffsetAfterBases =
2807 Bases, CurOffsetInBits, Context, Layout, CheckIfTriviallyCopyable);
2808 if (!OffsetAfterBases)
2809 return std::nullopt;
2810 CurOffsetInBits = *OffsetAfterBases;
2813 std::optional<int64_t> OffsetAfterFields =
2815 RD->
fields(), CurOffsetInBits, Context, Layout,
2816 CheckIfTriviallyCopyable);
2817 if (!OffsetAfterFields)
2818 return std::nullopt;
2819 CurOffsetInBits = *OffsetAfterFields;
2821 return CurOffsetInBits;
2825 QualType Ty,
bool CheckIfTriviallyCopyable)
const {
2842 assert(!Ty.
isNull() &&
"Null QualType sent to unique object rep check");
2847 CheckIfTriviallyCopyable);
2850 "hasUniqueObjectRepresentations should not be called with an "
2871 return !ABI->getMemberPointerInfo(MPT).HasPadding;
2876 if (
Record->isInvalidDecl())
2881 CheckIfTriviallyCopyable);
2884 *
this,
Record, CheckIfTriviallyCopyable);
2886 return StructSize && *StructSize ==
static_cast<int64_t
>(
getTypeSize(Ty));
2907 count += Ext->ivar_size();
2912 count += ImplDecl->ivar_size();
2930 if (isa<GNUNullExpr>(
E))
return true;
2938 llvm::DenseMap<ObjCContainerDecl*, ObjCImplDecl*>::iterator
2939 I = ObjCImpls.find(
D);
2940 if (I != ObjCImpls.end())
2941 return cast<ObjCImplementationDecl>(I->second);
2948 llvm::DenseMap<ObjCContainerDecl*, ObjCImplDecl*>::iterator
2949 I = ObjCImpls.find(
D);
2950 if (I != ObjCImpls.end())
2951 return cast<ObjCCategoryImplDecl>(I->second);
2958 assert(IFaceD && ImplD &&
"Passed null params");
2959 ObjCImpls[IFaceD] = ImplD;
2965 assert(CatD && ImplD &&
"Passed null params");
2966 ObjCImpls[CatD] = ImplD;
2971 return ObjCMethodRedecls.lookup(MD);
2977 ObjCMethodRedecls[MD] = Redecl;
2982 if (
const auto *ID = dyn_cast<ObjCInterfaceDecl>(ND->
getDeclContext()))
2984 if (
const auto *CD = dyn_cast<ObjCCategoryDecl>(ND->
getDeclContext()))
2985 return CD->getClassInterface();
2986 if (
const auto *IMD = dyn_cast<ObjCImplDecl>(ND->
getDeclContext()))
2987 return IMD->getClassInterface();
2995 assert(VD &&
"Passed null params");
2996 assert(VD->
hasAttr<BlocksAttr>() &&
2997 "getBlockVarCopyInits - not __block var");
2998 auto I = BlockVarCopyInits.find(VD);
2999 if (I != BlockVarCopyInits.end())
3001 return {
nullptr,
false};
3007 assert(VD && CopyExpr &&
"Passed null params");
3008 assert(VD->
hasAttr<BlocksAttr>() &&
3009 "setBlockVarCopyInits - not __block var");
3010 BlockVarCopyInits[VD].setExprAndFlag(CopyExpr,
CanThrow);
3014 unsigned DataSize)
const {
3019 "incorrect data size provided to CreateTypeSourceInfo!");
3036 return getObjCLayout(
D,
nullptr);
3042 return getObjCLayout(
D->getClassInterface(),
D);
3047 bool &AnyNonCanonArgs) {
3049 for (
auto &Arg : CanonArgs) {
3051 Arg =
C.getCanonicalTemplateArgument(Arg);
3052 AnyNonCanonArgs |= !Arg.structurallyEquals(OrigArg);
3062ASTContext::getExtQualType(
const Type *baseType,
Qualifiers quals)
const {
3067 llvm::FoldingSetNodeID
ID;
3069 void *insertPos =
nullptr;
3070 if (
ExtQuals *eq = ExtQualNodes.FindNodeOrInsertPos(ID, insertPos)) {
3071 assert(eq->getQualifiers() == quals);
3080 canon = getExtQualType(canonSplit.
Ty, canonSplit.
Quals);
3083 (void) ExtQualNodes.FindNodeOrInsertPos(ID, insertPos);
3086 auto *eq =
new (*
this,
alignof(
ExtQuals))
ExtQuals(baseType, canon, quals);
3087 ExtQualNodes.InsertNode(eq, insertPos);
3092 LangAS AddressSpace)
const {
3105 "Type cannot be in multiple addr spaces!");
3108 return getExtQualType(TypeNode, Quals);
3114 if (!
T.hasAddressSpace())
3118 const Type *TypeNode;
3123 TypeNode =
T.getTypePtr();
3127 while (
T.hasAddressSpace()) {
3128 TypeNode = Quals.
strip(
T);
3132 if (!
QualType(TypeNode, 0).hasAddressSpace())
3136 T =
T.getSingleStepDesugaredType(*
this);
3146 return getExtQualType(TypeNode, Quals);
3154 "Attempted to get vtable pointer discriminator on a monomorphic type");
3157 llvm::raw_svector_ostream Out(Str);
3158 MC->mangleCXXVTable(RD, Out);
3159 return llvm::getPointerAuthStableSipHash(Str);
3188 Ctx, OS, cast<AtomicType>(
T)->getValueType());
3190 case Type::LValueReference:
3195 case Type::RValueReference:
3209 case Type::ObjCObjectPointer:
3210 case Type::BlockPointer:
3217 Ctx, OS, cast<ComplexType>(
T)->getElementType());
3219 case Type::VariableArray:
3220 case Type::ConstantArray:
3221 case Type::IncompleteArray:
3222 case Type::ArrayParameter:
3233 Ctx, OS, cast<ArrayType>(
T)->getElementType());
3235 case Type::ObjCInterface:
3236 case Type::ObjCObject:
3237 OS <<
"<objc_object>";
3246 QualType UnderlyingType = cast<EnumType>(
T)->getDecl()->getIntegerType();
3248 Ctx, OS, UnderlyingType.
isNull() ? Ctx.
IntTy : UnderlyingType);
3251 case Type::FunctionNoProto:
3252 case Type::FunctionProto: {
3266 const auto *FuncType = cast<FunctionType>(
T);
3268 if (
const auto *FPT = dyn_cast<FunctionProtoType>(FuncType)) {
3269 for (
QualType Param : FPT->param_types()) {
3273 if (FPT->isVariadic())
3280 case Type::MemberPointer: {
3287 case Type::ExtVector:
3295 case Type::ConstantMatrix:
3299 case Type::Builtin: {
3301 switch (BTy->getKind()) {
3302#define SIGNED_TYPE(Id, SingletonId) \
3303 case BuiltinType::Id: \
3306#define UNSIGNED_TYPE(Id, SingletonId) \
3307 case BuiltinType::Id: \
3310#define PLACEHOLDER_TYPE(Id, SingletonId) case BuiltinType::Id:
3311#define BUILTIN_TYPE(Id, SingletonId)
3312#include "clang/AST/BuiltinTypes.def"
3313 llvm_unreachable(
"placeholder types should not appear here.");
3315 case BuiltinType::Half:
3318 case BuiltinType::Float:
3321 case BuiltinType::Double:
3324 case BuiltinType::LongDouble:
3327 case BuiltinType::Float16:
3330 case BuiltinType::Float128:
3334 case BuiltinType::Void:
3338 case BuiltinType::ObjCId:
3339 case BuiltinType::ObjCClass:
3340 case BuiltinType::ObjCSel:
3341 case BuiltinType::NullPtr:
3346 case BuiltinType::OCLSampler:
3347 case BuiltinType::OCLEvent:
3348 case BuiltinType::OCLClkEvent:
3349 case BuiltinType::OCLQueue:
3350 case BuiltinType::OCLReserveID:
3351 case BuiltinType::BFloat16:
3352 case BuiltinType::VectorQuad:
3353 case BuiltinType::VectorPair:
3358 case BuiltinType::Ibm128:
3360#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
3361 case BuiltinType::Id: \
3363#include "clang/Basic/OpenCLImageTypes.def"
3364#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
3365 case BuiltinType::Id: \
3367#include "clang/Basic/OpenCLExtensionTypes.def"
3368#define SVE_TYPE(Name, Id, SingletonId) \
3369 case BuiltinType::Id: \
3371#include "clang/Basic/AArch64SVEACLETypes.def"
3372#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) \
3373 case BuiltinType::Id: \
3375#include "clang/Basic/HLSLIntangibleTypes.def"
3376 case BuiltinType::Dependent:
3377 llvm_unreachable(
"should never get here");
3378 case BuiltinType::AMDGPUBufferRsrc:
3379 case BuiltinType::WasmExternRef:
3380#define RVV_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
3381#include "clang/Basic/RISCVVTypes.def"
3382 llvm_unreachable(
"not yet implemented");
3384 llvm_unreachable(
"should never get here");
3386 case Type::Record: {
3407 II = Typedef->getDeclName().getAsIdentifierInfo();
3410 OS <<
"<anonymous_record>";
3416 case Type::DeducedTemplateSpecialization:
3418#define NON_CANONICAL_TYPE(Class, Base) case Type::Class:
3419#define DEPENDENT_TYPE(Class, Base) case Type::Class:
3420#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base) case Type::Class:
3421#define ABSTRACT_TYPE(Class, Base)
3422#define TYPE(Class, Base)
3423#include "clang/AST/TypeNodes.inc"
3424 llvm_unreachable(
"unexpected non-canonical or dependent type!");
3431 "cannot compute type discriminator of a dependent type");
3434 llvm::raw_svector_ostream Out(Str);
3442 T =
T.getUnqualifiedType();
3444 MC->mangleCanonicalTypeName(
T, Out);
3447 return llvm::getPointerAuthStableSipHash(Str);
3472 "Type cannot have multiple ObjCGCs!");
3475 return getExtQualType(TypeNode, Quals);
3489 QualType WrappedTy,
Expr *CountExpr,
bool CountInBytes,
bool OrNull,
3493 llvm::FoldingSetNodeID ID;
3496 void *InsertPos =
nullptr;
3498 CountAttributedTypes.FindNodeOrInsertPos(ID, InsertPos);
3503 size_t Size = CountAttributedType::totalSizeToAlloc<TypeCoupledDeclRefInfo>(
3504 DependentDecls.size());
3507 OrNull, DependentDecls);
3508 Types.push_back(CATy);
3509 CountAttributedTypes.InsertNode(CATy, InsertPos);
3520 if (
const auto *FNPT = dyn_cast<FunctionNoProtoType>(
T)) {
3523 const auto *FPT = cast<FunctionProtoType>(
T);
3529 return cast<FunctionType>(
Result.getTypePtr());
3545 L->DeducedReturnType(FD, ResultType);
3555 if (
const auto *PT = dyn_cast<ParenType>(Orig))
3560 if (
const auto *MQT = dyn_cast<MacroQualifiedType>(Orig))
3563 MQT->getMacroIdentifier());
3566 if (
const auto *AT = dyn_cast<AttributedType>(Orig))
3576 Proto->getReturnType(), Proto->getParamTypes(),
3577 Proto->getExtProtoInfo().withExceptionSpec(ESI));
3592 for (
unsigned i = 0, n = Args.size(); i != n; ++i)
3626 if (TSInfo->getType() != FD->
getType())
3634 "TypeLoc size mismatch from updating exception specification");
3635 TSInfo->overrideType(Updated);
3644 llvm::FoldingSetNodeID ID;
3647 void *InsertPos =
nullptr;
3648 if (
ComplexType *CT = ComplexTypes.FindNodeOrInsertPos(ID, InsertPos))
3654 if (!
T.isCanonical()) {
3658 ComplexType *NewIP = ComplexTypes.FindNodeOrInsertPos(ID, InsertPos);
3659 assert(!NewIP &&
"Shouldn't be in the map!"); (void)NewIP;
3662 Types.push_back(New);
3663 ComplexTypes.InsertNode(New, InsertPos);
3672 llvm::FoldingSetNodeID ID;
3675 void *InsertPos =
nullptr;
3676 if (
PointerType *PT = PointerTypes.FindNodeOrInsertPos(ID, InsertPos))
3682 if (!
T.isCanonical()) {
3686 PointerType *NewIP = PointerTypes.FindNodeOrInsertPos(ID, InsertPos);
3687 assert(!NewIP &&
"Shouldn't be in the map!"); (void)NewIP;
3690 Types.push_back(New);
3691 PointerTypes.InsertNode(New, InsertPos);
3696 llvm::FoldingSetNodeID ID;
3698 void *InsertPos =
nullptr;
3699 AdjustedType *AT = AdjustedTypes.FindNodeOrInsertPos(ID, InsertPos);
3706 AT = AdjustedTypes.FindNodeOrInsertPos(ID, InsertPos);
3707 assert(!AT &&
"Shouldn't be in the map!");
3711 Types.push_back(AT);
3712 AdjustedTypes.InsertNode(AT, InsertPos);
3717 llvm::FoldingSetNodeID ID;
3719 void *InsertPos =
nullptr;
3720 AdjustedType *AT = AdjustedTypes.FindNodeOrInsertPos(ID, InsertPos);
3727 AT = AdjustedTypes.FindNodeOrInsertPos(ID, InsertPos);
3728 assert(!AT &&
"Shouldn't be in the map!");
3731 Types.push_back(AT);
3732 AdjustedTypes.InsertNode(AT, InsertPos);
3763 const auto *ATy = cast<ConstantArrayType>(Ty);
3764 llvm::FoldingSetNodeID ID;
3765 ATy->Profile(ID, *
this, ATy->getElementType(), ATy->getZExtSize(),
3766 ATy->getSizeExpr(), ATy->getSizeModifier(),
3767 ATy->getIndexTypeQualifiers().getAsOpaqueValue());
3768 void *InsertPos =
nullptr;
3770 ArrayParameterTypes.FindNodeOrInsertPos(ID, InsertPos);
3779 AT = ArrayParameterTypes.FindNodeOrInsertPos(ID, InsertPos);
3780 assert(!AT &&
"Shouldn't be in the map!");
3785 Types.push_back(AT);
3786 ArrayParameterTypes.InsertNode(AT, InsertPos);
3796 llvm::FoldingSetNodeID ID;
3799 void *InsertPos =
nullptr;
3801 BlockPointerTypes.FindNodeOrInsertPos(ID, InsertPos))
3807 if (!
T.isCanonical()) {
3812 BlockPointerTypes.FindNodeOrInsertPos(ID, InsertPos);
3813 assert(!NewIP &&
"Shouldn't be in the map!"); (void)NewIP;
3817 Types.push_back(New);
3818 BlockPointerTypes.InsertNode(New, InsertPos);
3828 "Unresolved placeholder type");
3832 llvm::FoldingSetNodeID ID;
3835 void *InsertPos =
nullptr;
3837 LValueReferenceTypes.FindNodeOrInsertPos(ID, InsertPos))
3845 if (!SpelledAsLValue || InnerRef || !
T.isCanonical()) {
3846 QualType PointeeType = (InnerRef ? InnerRef->getPointeeType() :
T);
3851 LValueReferenceTypes.FindNodeOrInsertPos(ID, InsertPos);
3852 assert(!NewIP &&
"Shouldn't be in the map!"); (void)NewIP;
3857 Types.push_back(New);
3858 LValueReferenceTypes.InsertNode(New, InsertPos);
3868 "Unresolved placeholder type");
3872 llvm::FoldingSetNodeID ID;
3875 void *InsertPos =
nullptr;
3877 RValueReferenceTypes.FindNodeOrInsertPos(ID, InsertPos))
3885 if (InnerRef || !
T.isCanonical()) {
3886 QualType PointeeType = (InnerRef ? InnerRef->getPointeeType() :
T);
3891 RValueReferenceTypes.FindNodeOrInsertPos(ID, InsertPos);
3892 assert(!NewIP &&
"Shouldn't be in the map!"); (void)NewIP;
3897 Types.push_back(New);
3898 RValueReferenceTypes.InsertNode(New, InsertPos);
3907 llvm::FoldingSetNodeID ID;
3910 void *InsertPos =
nullptr;
3912 MemberPointerTypes.FindNodeOrInsertPos(ID, InsertPos))
3923 MemberPointerTypes.FindNodeOrInsertPos(ID, InsertPos);
3924 assert(!NewIP &&
"Shouldn't be in the map!"); (void)NewIP;
3928 Types.push_back(New);
3929 MemberPointerTypes.InsertNode(New, InsertPos);
3936 const llvm::APInt &ArySizeIn,
3937 const Expr *SizeExpr,
3939 unsigned IndexTypeQuals)
const {
3942 "Constant array of VLAs is illegal!");
3950 llvm::APInt ArySize(ArySizeIn);
3951 ArySize = ArySize.zextOrTrunc(
Target->getMaxPointerWidth());
3953 llvm::FoldingSetNodeID ID;
3955 ASM, IndexTypeQuals);
3957 void *InsertPos =
nullptr;
3959 ConstantArrayTypes.FindNodeOrInsertPos(ID, InsertPos))
3970 ASM, IndexTypeQuals);
3975 ConstantArrayTypes.FindNodeOrInsertPos(ID, InsertPos);
3976 assert(!NewIP &&
"Shouldn't be in the map!"); (void)NewIP;
3979 auto *New = ConstantArrayType::Create(*
this, EltTy, Canon, ArySize, SizeExpr,
3980 ASM, IndexTypeQuals);
3981 ConstantArrayTypes.InsertNode(New, InsertPos);
3982 Types.push_back(New);
3991 if (!
type->isVariablyModifiedType())
return type;
3996 const Type *ty = split.
Ty;
3998#define TYPE(Class, Base)
3999#define ABSTRACT_TYPE(Class, Base)
4000#define NON_CANONICAL_TYPE(Class, Base) case Type::Class:
4001#include "clang/AST/TypeNodes.inc"
4002 llvm_unreachable(
"didn't desugar past all non-canonical types?");
4008 case Type::DependentVector:
4009 case Type::ExtVector:
4010 case Type::DependentSizedExtVector:
4011 case Type::ConstantMatrix:
4012 case Type::DependentSizedMatrix:
4013 case Type::DependentAddressSpace:
4014 case Type::ObjCObject:
4015 case Type::ObjCInterface:
4016 case Type::ObjCObjectPointer:
4019 case Type::UnresolvedUsing:
4020 case Type::TypeOfExpr:
4022 case Type::Decltype:
4023 case Type::UnaryTransform:
4024 case Type::DependentName:
4025 case Type::InjectedClassName:
4026 case Type::TemplateSpecialization:
4027 case Type::DependentTemplateSpecialization:
4028 case Type::TemplateTypeParm:
4029 case Type::SubstTemplateTypeParmPack:
4031 case Type::DeducedTemplateSpecialization:
4032 case Type::PackExpansion:
4033 case Type::PackIndexing:
4035 case Type::DependentBitInt:
4036 case Type::ArrayParameter:
4037 llvm_unreachable(
"type should never be variably-modified");
4041 case Type::FunctionNoProto:
4042 case Type::FunctionProto:
4043 case Type::BlockPointer:
4044 case Type::MemberPointer:
4057 case Type::LValueReference: {
4058 const auto *lv = cast<LValueReferenceType>(ty);
4061 lv->isSpelledAsLValue());
4065 case Type::RValueReference: {
4066 const auto *lv = cast<RValueReferenceType>(ty);
4072 case Type::Atomic: {
4073 const auto *at = cast<AtomicType>(ty);
4078 case Type::ConstantArray: {
4079 const auto *cat = cast<ConstantArrayType>(ty);
4084 cat->getSizeModifier(),
4085 cat->getIndexTypeCVRQualifiers());
4089 case Type::DependentSizedArray: {
4090 const auto *dat = cast<DependentSizedArrayType>(ty);
4094 dat->getSizeModifier(),
4095 dat->getIndexTypeCVRQualifiers(),
4096 dat->getBracketsRange());
4101 case Type::IncompleteArray: {
4102 const auto *iat = cast<IncompleteArrayType>(ty);
4111 case Type::VariableArray: {
4112 const auto *vat = cast<VariableArrayType>(ty);
4116 vat->getIndexTypeCVRQualifiers(), vat->getBracketsRange());
4129 unsigned IndexTypeQuals,
4140 IndexTypeQuals, Brackets);
4147 VariableArrayTypes.push_back(New);
4148 Types.push_back(New);
4158 unsigned elementTypeQuals,
4162 "Size must be type- or value-dependent!");
4166 void *insertPos =
nullptr;
4167 llvm::FoldingSetNodeID ID;
4169 ID, *
this, numElements ?
QualType(canonElementType.
Ty, 0) : elementType,
4170 ASM, elementTypeQuals, numElements);
4174 DependentSizedArrayTypes.FindNodeOrInsertPos(ID, insertPos);
4185 elementTypeQuals, brackets);
4186 DependentSizedArrayTypes.InsertNode(newType, insertPos);
4187 Types.push_back(newType);
4195 numElements, ASM, elementTypeQuals, brackets);
4196 DependentSizedArrayTypes.InsertNode(canonTy, insertPos);
4197 Types.push_back(canonTy);
4202 canonElementType.
Quals);
4206 if (
QualType(canonElementType.
Ty, 0) == elementType &&
4214 elementTypeQuals, brackets);
4215 Types.push_back(sugaredType);
4221 unsigned elementTypeQuals)
const {
4222 llvm::FoldingSetNodeID ID;
4225 void *insertPos =
nullptr;
4227 IncompleteArrayTypes.FindNodeOrInsertPos(ID, insertPos))
4239 ASM, elementTypeQuals);
4244 IncompleteArrayTypes.FindNodeOrInsertPos(ID, insertPos);
4245 assert(!existing &&
"Shouldn't be in the map!"); (void) existing;
4251 IncompleteArrayTypes.InsertNode(newType, insertPos);
4252 Types.push_back(newType);
4258#define SVE_INT_ELTTY(BITS, ELTS, SIGNED, NUMVECTORS) \
4259 {getIntTypeForBitwidth(BITS, SIGNED), llvm::ElementCount::getScalable(ELTS), \
4262#define SVE_ELTTY(ELTTY, ELTS, NUMVECTORS) \
4263 {ELTTY, llvm::ElementCount::getScalable(ELTS), NUMVECTORS};
4267 llvm_unreachable(
"Unsupported builtin vector type");
4268 case BuiltinType::SveInt8:
4270 case BuiltinType::SveUint8:
4272 case BuiltinType::SveInt8x2:
4274 case BuiltinType::SveUint8x2:
4276 case BuiltinType::SveInt8x3:
4278 case BuiltinType::SveUint8x3:
4280 case BuiltinType::SveInt8x4:
4282 case BuiltinType::SveUint8x4:
4284 case BuiltinType::SveInt16:
4286 case BuiltinType::SveUint16:
4288 case BuiltinType::SveInt16x2:
4290 case BuiltinType::SveUint16x2:
4292 case BuiltinType::SveInt16x3:
4294 case BuiltinType::SveUint16x3:
4296 case BuiltinType::SveInt16x4:
4298 case BuiltinType::SveUint16x4:
4300 case BuiltinType::SveInt32:
4302 case BuiltinType::SveUint32:
4304 case BuiltinType::SveInt32x2:
4306 case BuiltinType::SveUint32x2:
4308 case BuiltinType::SveInt32x3:
4310 case BuiltinType::SveUint32x3:
4312 case BuiltinType::SveInt32x4:
4314 case BuiltinType::SveUint32x4:
4316 case BuiltinType::SveInt64:
4318 case BuiltinType::SveUint64:
4320 case BuiltinType::SveInt64x2:
4322 case BuiltinType::SveUint64x2:
4324 case BuiltinType::SveInt64x3:
4326 case BuiltinType::SveUint64x3:
4328 case BuiltinType::SveInt64x4:
4330 case BuiltinType::SveUint64x4:
4332 case BuiltinType::SveBool:
4334 case BuiltinType::SveBoolx2:
4336 case BuiltinType::SveBoolx4:
4338 case BuiltinType::SveFloat16:
4340 case BuiltinType::SveFloat16x2:
4342 case BuiltinType::SveFloat16x3:
4344 case BuiltinType::SveFloat16x4:
4346 case BuiltinType::SveFloat32:
4348 case BuiltinType::SveFloat32x2:
4350 case BuiltinType::SveFloat32x3:
4352 case BuiltinType::SveFloat32x4:
4354 case BuiltinType::SveFloat64:
4356 case BuiltinType::SveFloat64x2:
4358 case BuiltinType::SveFloat64x3:
4360 case BuiltinType::SveFloat64x4:
4362 case BuiltinType::SveBFloat16:
4364 case BuiltinType::SveBFloat16x2:
4366 case BuiltinType::SveBFloat16x3:
4368 case BuiltinType::SveBFloat16x4:
4370#define RVV_VECTOR_TYPE_INT(Name, Id, SingletonId, NumEls, ElBits, NF, \
4372 case BuiltinType::Id: \
4373 return {getIntTypeForBitwidth(ElBits, IsSigned), \
4374 llvm::ElementCount::getScalable(NumEls), NF};
4375#define RVV_VECTOR_TYPE_FLOAT(Name, Id, SingletonId, NumEls, ElBits, NF) \
4376 case BuiltinType::Id: \
4377 return {ElBits == 16 ? Float16Ty : (ElBits == 32 ? FloatTy : DoubleTy), \
4378 llvm::ElementCount::getScalable(NumEls), NF};
4379#define RVV_VECTOR_TYPE_BFLOAT(Name, Id, SingletonId, NumEls, ElBits, NF) \
4380 case BuiltinType::Id: \
4381 return {BFloat16Ty, llvm::ElementCount::getScalable(NumEls), NF};
4382#define RVV_PREDICATE_TYPE(Name, Id, SingletonId, NumEls) \
4383 case BuiltinType::Id: \
4384 return {BoolTy, llvm::ElementCount::getScalable(NumEls), 1};
4385#include "clang/Basic/RISCVVTypes.def"
4392 if (
Target->getTriple().isWasm() &&
Target->hasFeature(
"reference-types")) {
4393#define WASM_REF_TYPE(Name, MangledName, Id, SingletonId, AS) \
4394 if (BuiltinType::Id == BuiltinType::WasmExternRef) \
4396#include "clang/Basic/WebAssemblyReferenceTypes.def"
4399 "shouldn't try to generate type externref outside WebAssembly target");
4406 unsigned NumFields)
const {
4407 if (
Target->hasAArch64SVETypes()) {
4409#define SVE_VECTOR_TYPE(Name, MangledName, Id, SingletonId, NumEls, ElBits, \
4410 IsSigned, IsFP, IsBF) \
4411 if (!EltTy->isBooleanType() && \
4412 ((EltTy->hasIntegerRepresentation() && \
4413 EltTy->hasSignedIntegerRepresentation() == IsSigned) || \
4414 (EltTy->hasFloatingRepresentation() && !EltTy->isBFloat16Type() && \
4416 (EltTy->hasFloatingRepresentation() && EltTy->isBFloat16Type() && \
4417 IsBF && !IsFP)) && \
4418 EltTySize == ElBits && NumElts == NumEls) { \
4419 return SingletonId; \
4421#define SVE_PREDICATE_TYPE(Name, MangledName, Id, SingletonId, NumEls) \
4422 if (EltTy->isBooleanType() && NumElts == NumEls) \
4424#define SVE_OPAQUE_TYPE(Name, MangledName, Id, SingleTonId)
4425#include "clang/Basic/AArch64SVEACLETypes.def"
4426 }
else if (
Target->hasRISCVVTypes()) {
4428#define RVV_VECTOR_TYPE(Name, Id, SingletonId, NumEls, ElBits, NF, IsSigned, \
4430 if (!EltTy->isBooleanType() && \
4431 ((EltTy->hasIntegerRepresentation() && \
4432 EltTy->hasSignedIntegerRepresentation() == IsSigned) || \
4433 (EltTy->hasFloatingRepresentation() && !EltTy->isBFloat16Type() && \
4435 (EltTy->hasFloatingRepresentation() && EltTy->isBFloat16Type() && \
4436 IsBF && !IsFP)) && \
4437 EltTySize == ElBits && NumElts == NumEls && NumFields == NF) \
4439#define RVV_PREDICATE_TYPE(Name, Id, SingletonId, NumEls) \
4440 if (EltTy->isBooleanType() && NumElts == NumEls) \
4442#include "clang/Basic/RISCVVTypes.def"
4458 llvm::FoldingSetNodeID ID;
4461 void *InsertPos =
nullptr;
4462 if (
VectorType *VTP = VectorTypes.FindNodeOrInsertPos(ID, InsertPos))
4472 VectorType *NewIP = VectorTypes.FindNodeOrInsertPos(ID, InsertPos);
4473 assert(!NewIP &&
"Shouldn't be in the map!"); (void)NewIP;
4476 VectorType(vecType, NumElts, Canonical, VecKind);
4477 VectorTypes.InsertNode(New, InsertPos);
4478 Types.push_back(New);
4485 llvm::FoldingSetNodeID ID;
4488 void *InsertPos =
nullptr;
4490 DependentVectorTypes.FindNodeOrInsertPos(ID, InsertPos);
4495 VecType,
QualType(Canon, 0), SizeExpr, AttrLoc, VecKind);
4498 if (CanonVecTy == VecType) {
4503 DependentVectorTypes.FindNodeOrInsertPos(ID, InsertPos);
4504 assert(!CanonCheck &&
4505 "Dependent-sized vector_size canonical type broken");
4507 DependentVectorTypes.InsertNode(New, InsertPos);
4516 Types.push_back(New);
4523 unsigned NumElts)
const {
4531 llvm::FoldingSetNodeID ID;
4534 void *InsertPos =
nullptr;
4535 if (
VectorType *VTP = VectorTypes.FindNodeOrInsertPos(ID, InsertPos))
4545 VectorType *NewIP = VectorTypes.FindNodeOrInsertPos(ID, InsertPos);
4546 assert(!NewIP &&
"Shouldn't be in the map!"); (void)NewIP;
4550 VectorTypes.InsertNode(New, InsertPos);
4551 Types.push_back(New);
4559 llvm::FoldingSetNodeID ID;
4563 void *InsertPos =
nullptr;
4565 = DependentSizedExtVectorTypes.FindNodeOrInsertPos(ID, InsertPos);
4575 if (CanonVecTy == vecType) {
4580 = DependentSizedExtVectorTypes.FindNodeOrInsertPos(ID, InsertPos);
4581 assert(!CanonCheck &&
"Dependent-sized ext_vector canonical type broken");
4583 DependentSizedExtVectorTypes.InsertNode(New, InsertPos);
4592 Types.push_back(New);
4597 unsigned NumColumns)
const {
4598 llvm::FoldingSetNodeID ID;
4600 Type::ConstantMatrix);
4603 "need a valid element type");
4606 "need valid matrix dimensions");
4607 void *InsertPos =
nullptr;
4617 assert(!NewIP &&
"Matrix type shouldn't already exist in the map");
4623 MatrixTypes.InsertNode(New, InsertPos);
4624 Types.push_back(New);
4633 llvm::FoldingSetNodeID ID;
4637 void *InsertPos =
nullptr;
4639 DependentSizedMatrixTypes.FindNodeOrInsertPos(ID, InsertPos);
4644 ColumnExpr, AttrLoc);
4647 DependentSizedMatrixTypes.FindNodeOrInsertPos(ID, InsertPos);
4648 assert(!CanonCheck &&
"Dependent-sized matrix canonical type broken");
4650 DependentSizedMatrixTypes.InsertNode(Canon, InsertPos);
4651 Types.push_back(Canon);
4664 ColumnExpr, AttrLoc);
4665 Types.push_back(New);
4670 Expr *AddrSpaceExpr,
4676 void *insertPos =
nullptr;
4677 llvm::FoldingSetNodeID ID;
4682 DependentAddressSpaceTypes.FindNodeOrInsertPos(ID, insertPos);
4688 DependentAddressSpaceTypes.InsertNode(canonTy, insertPos);
4689 Types.push_back(canonTy);
4692 if (canonPointeeType == PointeeType &&
4698 AddrSpaceExpr, AttrLoc);
4699 Types.push_back(sugaredType);
4705 return T.isCanonical() &&
4723 llvm::FoldingSetNodeID ID;
4726 void *InsertPos =
nullptr;
4728 FunctionNoProtoTypes.FindNodeOrInsertPos(ID, InsertPos))
4738 FunctionNoProtoTypes.FindNodeOrInsertPos(ID, InsertPos);
4739 assert(!NewIP &&
"Shouldn't be in the map!"); (void)NewIP;
4744 Types.push_back(New);
4745 FunctionNoProtoTypes.InsertNode(New, InsertPos);
4761 return CanResultType;
4768 if (!NoexceptInType)
4785 bool AnyPackExpansions =
false;
4790 AnyPackExpansions =
true;
4792 return AnyPackExpansions;
4798QualType ASTContext::getFunctionTypeInternal(
4801 size_t NumArgs = ArgArray.size();
4805 llvm::FoldingSetNodeID
ID;
4810 bool Unique =
false;
4812 void *InsertPos =
nullptr;
4814 FunctionProtoTypes.FindNodeOrInsertPos(ID, InsertPos)) {
4834 bool IsCanonicalExceptionSpec =
4838 bool isCanonical = !Unique && IsCanonicalExceptionSpec &&
4840 for (
unsigned i = 0; i != NumArgs && isCanonical; ++i)
4841 if (!ArgArray[i].isCanonicalAsParam())
4842 isCanonical =
false;
4844 if (OnlyWantCanonical)
4845 assert(isCanonical &&
4846 "given non-canonical parameters constructing canonical type");
4851 if (!isCanonical && Canonical.
isNull()) {
4853 CanonicalArgs.reserve(NumArgs);
4854 for (
unsigned i = 0; i != NumArgs; ++i)
4861 if (IsCanonicalExceptionSpec) {
4863 }
else if (NoexceptInType) {
4876 bool AnyPacks =
false;
4899 llvm_unreachable(
"dependent noexcept is already canonical");
4908 getFunctionTypeInternal(CanResultTy, CanonicalArgs, CanonicalEPI,
true);
4912 FunctionProtoTypes.FindNodeOrInsertPos(ID, InsertPos);
4913 assert(!NewIP &&
"Shouldn't be in the map!"); (void)NewIP;
4918 auto ESH = FunctionProtoType::getExceptionSpecSize(
4920 size_t Size = FunctionProtoType::totalSizeToAlloc<
4927 ESH.NumExprPtr, ESH.NumFunctionDeclPtr,
4935 Types.push_back(FTP);
4937 FunctionProtoTypes.InsertNode(FTP, InsertPos);
4939 AnyFunctionEffects =
true;
4944 llvm::FoldingSetNodeID
ID;
4947 void *InsertPos =
nullptr;
4948 if (
PipeType *PT = PipeTypes.FindNodeOrInsertPos(ID, InsertPos))
4954 if (!
T.isCanonical()) {
4958 PipeType *NewIP = PipeTypes.FindNodeOrInsertPos(ID, InsertPos);
4959 assert(!NewIP &&
"Shouldn't be in the map!");
4963 Types.push_back(New);
4964 PipeTypes.InsertNode(New, InsertPos);
4975 return getPipeType(
T,
true);
4979 return getPipeType(
T,
false);
4983 llvm::FoldingSetNodeID ID;
4986 void *InsertPos =
nullptr;
4987 if (
BitIntType *EIT = BitIntTypes.FindNodeOrInsertPos(ID, InsertPos))
4991 BitIntTypes.InsertNode(New, InsertPos);
4992 Types.push_back(New);
4997 Expr *NumBitsExpr)
const {
4999 llvm::FoldingSetNodeID ID;
5002 void *InsertPos =
nullptr;
5004 DependentBitIntTypes.FindNodeOrInsertPos(ID, InsertPos))
5009 DependentBitIntTypes.InsertNode(New, InsertPos);
5011 Types.push_back(New);
5017 if (!isa<CXXRecordDecl>(
D))
return false;
5018 const auto *RD = cast<CXXRecordDecl>(
D);
5019 if (isa<ClassTemplatePartialSpecializationDecl>(RD))
5021 if (RD->getDescribedClassTemplate() &&
5022 !isa<ClassTemplateSpecializationDecl>(RD))
5033 if (
Decl->TypeForDecl) {
5034 assert(isa<InjectedClassNameType>(
Decl->TypeForDecl));
5036 assert(PrevDecl->TypeForDecl &&
"previous declaration has no type");
5037 Decl->TypeForDecl = PrevDecl->TypeForDecl;
5038 assert(isa<InjectedClassNameType>(
Decl->TypeForDecl));
5042 Decl->TypeForDecl = newType;
5043 Types.push_back(newType);
5051 assert(
Decl &&
"Passed null for Decl param");
5052 assert(!
Decl->TypeForDecl &&
"TypeForDecl present in slow case");
5054 if (
const auto *Typedef = dyn_cast<TypedefNameDecl>(
Decl))
5057 assert(!isa<TemplateTypeParmDecl>(
Decl) &&
5058 "Template type parameter types are always available.");
5060 if (
const auto *
Record = dyn_cast<RecordDecl>(
Decl)) {
5061 assert(
Record->isFirstDecl() &&
"struct/union has previous declaration");
5064 }
else if (
const auto *
Enum = dyn_cast<EnumDecl>(
Decl)) {
5065 assert(
Enum->isFirstDecl() &&
"enum has previous declaration");
5067 }
else if (
const auto *Using = dyn_cast<UnresolvedUsingTypenameDecl>(
Decl)) {
5070 llvm_unreachable(
"TypeDecl without a type?");
5079 if (!
Decl->TypeForDecl) {
5081 Underlying =
Decl->getUnderlyingType();
5084 Decl->TypeForDecl = NewType;
5085 Types.push_back(NewType);
5088 if (Underlying.
isNull() ||
Decl->getUnderlyingType() == Underlying)
5092 llvm::FoldingSetNodeID ID;
5095 void *InsertPos =
nullptr;
5096 if (
TypedefType *
T = TypedefTypes.FindNodeOrInsertPos(ID, InsertPos)) {
5097 assert(!
T->typeMatchesDecl() &&
5098 "non-divergent case should be handled with TypeDecl");
5102 void *Mem =
Allocate(TypedefType::totalSizeToAlloc<QualType>(
true),
5104 auto *NewType =
new (Mem)
TypedefType(Type::Typedef,
Decl, Underlying,
5106 TypedefTypes.InsertNode(NewType, InsertPos);
5107 Types.push_back(NewType);
5113 llvm::FoldingSetNodeID ID;
5116 void *InsertPos =
nullptr;
5117 if (
UsingType *
T = UsingTypes.FindNodeOrInsertPos(ID, InsertPos))
5120 const Type *TypeForDecl =
5121 cast<TypeDecl>(
Found->getTargetDecl())->getTypeForDecl();
5130 Allocate(UsingType::totalSizeToAlloc<QualType>(!Underlying.
isNull()),
5133 Types.push_back(NewType);
5134 UsingTypes.InsertNode(NewType, InsertPos);
5142 if (PrevDecl->TypeForDecl)
5143 return QualType(
Decl->TypeForDecl = PrevDecl->TypeForDecl, 0);
5146 Decl->TypeForDecl = newType;
5147 Types.push_back(newType);
5155 if (PrevDecl->TypeForDecl)
5156 return QualType(
Decl->TypeForDecl = PrevDecl->TypeForDecl, 0);
5159 Decl->TypeForDecl = newType;
5160 Types.push_back(newType);
5166 if (
Decl->TypeForDecl)
5171 if (CanonicalDecl->TypeForDecl)
5172 return QualType(
Decl->TypeForDecl = CanonicalDecl->TypeForDecl, 0);
5176 Decl->TypeForDecl = newType;
5177 Types.push_back(newType);
5184 llvm::FoldingSetNodeID id;
5187 void *insertPos =
nullptr;
5195 Types.push_back(
type);
5196 AttributedTypes.InsertNode(
type, insertPos);
5203 llvm::FoldingSetNodeID ID;
5206 void *InsertPos =
nullptr;
5208 BTFTagAttributedTypes.FindNodeOrInsertPos(ID, InsertPos);
5216 Types.push_back(Ty);
5217 BTFTagAttributedTypes.InsertNode(Ty, InsertPos);
5224 QualType Replacement,
Decl *AssociatedDecl,
unsigned Index,
5225 std::optional<unsigned> PackIndex)
const {
5226 llvm::FoldingSetNodeID ID;
5229 void *InsertPos =
nullptr;
5231 SubstTemplateTypeParmTypes.FindNodeOrInsertPos(ID, InsertPos);
5234 void *Mem =
Allocate(SubstTemplateTypeParmType::totalSizeToAlloc<QualType>(
5235 !Replacement.isCanonical()),
5239 Types.push_back(SubstParm);
5240 SubstTemplateTypeParmTypes.InsertNode(SubstParm, InsertPos);
5249 unsigned Index,
bool Final,
5256 llvm::FoldingSetNodeID ID;
5259 void *InsertPos =
nullptr;
5261 SubstTemplateTypeParmPackTypes.FindNodeOrInsertPos(ID, InsertPos))
5271 [[maybe_unused]]
const auto *Nothing =
5272 SubstTemplateTypeParmPackTypes.FindNodeOrInsertPos(ID, InsertPos);
5280 Types.push_back(SubstParm);
5281 SubstTemplateTypeParmPackTypes.InsertNode(SubstParm, InsertPos);
5291 llvm::FoldingSetNodeID ID;
5293 void *InsertPos =
nullptr;
5295 = TemplateTypeParmTypes.FindNodeOrInsertPos(ID, InsertPos);
5306 = TemplateTypeParmTypes.FindNodeOrInsertPos(ID, InsertPos);
5307 assert(!TypeCheck &&
"Template type parameter canonical type broken");
5311 Depth, Index, ParameterPack,
nullptr,
QualType());
5313 Types.push_back(TypeParm);
5314 TemplateTypeParmTypes.InsertNode(TypeParm, InsertPos);
5324 assert(!Name.getAsDependentTemplateName() &&
5325 "No dependent template names here!");
5336 for (
unsigned i = 0, e = TL.
getNumArgs(); i != e; ++i)
5346 "No dependent template names here!");
5349 ArgVec.reserve(Args.size());
5351 ArgVec.push_back(Arg.getArgument());
5359 if (Arg.isPackExpansion())
5371 "No dependent template names here!");
5376 if (!Underlying.
isNull())
5382 "Caller must compute aliased type");
5383 IsTypeAlias =
false;
5392 (IsTypeAlias ?
sizeof(
QualType) : 0),
5396 IsTypeAlias ? Underlying :
QualType());
5398 Types.push_back(Spec);
5405 "No dependent template names here!");
5409 bool AnyNonCanonArgs =
false;
5415 llvm::FoldingSetNodeID ID;
5419 void *InsertPos =
nullptr;
5421 = TemplateSpecializationTypes.FindNodeOrInsertPos(ID, InsertPos);
5431 Types.push_back(Spec);
5432 TemplateSpecializationTypes.InsertNode(Spec, InsertPos);
5436 "Non-dependent template-id type must have a canonical type");
5443 TagDecl *OwnedTagDecl)
const {
5444 llvm::FoldingSetNodeID ID;
5447 void *InsertPos =
nullptr;
5448 ElaboratedType *
T = ElaboratedTypes.FindNodeOrInsertPos(ID, InsertPos);
5455 ElaboratedType *CheckT = ElaboratedTypes.FindNodeOrInsertPos(ID, InsertPos);
5456 assert(!CheckT &&
"Elaborated canonical type broken");
5461 Allocate(ElaboratedType::totalSizeToAlloc<TagDecl *>(!!OwnedTagDecl),
5463 T =
new (Mem)
ElaboratedType(Keyword, NNS, NamedType, Canon, OwnedTagDecl);
5466 ElaboratedTypes.InsertNode(
T, InsertPos);
5472 llvm::FoldingSetNodeID ID;
5475 void *InsertPos =
nullptr;
5476 ParenType *
T = ParenTypes.FindNodeOrInsertPos(ID, InsertPos);
5483 ParenType *CheckT = ParenTypes.FindNodeOrInsertPos(ID, InsertPos);
5484 assert(!CheckT &&
"Paren canonical type broken");
5490 ParenTypes.InsertNode(
T, InsertPos);
5503 Types.push_back(newType);
5513 if (CanonNNS != NNS)
5517 llvm::FoldingSetNodeID ID;
5520 void *InsertPos =
nullptr;
5522 = DependentNameTypes.FindNodeOrInsertPos(ID, InsertPos);
5529 DependentNameTypes.InsertNode(
T, InsertPos);
5538 for (
unsigned I = 0,
E = Args.size(); I !=
E; ++I)
5550 "nested-name-specifier must be dependent");
5552 llvm::FoldingSetNodeID ID;
5556 void *InsertPos =
nullptr;
5558 = DependentTemplateSpecializationTypes.FindNodeOrInsertPos(ID, InsertPos);
5568 bool AnyNonCanonArgs =
false;
5573 if (AnyNonCanonArgs || CanonNNS != NNS || CanonKeyword != Keyword) {
5579 [[maybe_unused]]
auto *Nothing =
5580 DependentTemplateSpecializationTypes.FindNodeOrInsertPos(ID, InsertPos);
5581 assert(!Nothing &&
"canonical type broken");
5590 DependentTemplateSpecializationTypes.InsertNode(
T, InsertPos);
5596 if (
const auto *TTP = dyn_cast<TemplateTypeParmDecl>(Param)) {
5602 }
else if (
auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(Param)) {
5604 NTTP->getType().getNonPackExpansionType().getNonLValueExprType(*
this);
5619 Expr *
E =
new (*this)
5621 T, VK, NTTP->getLocation());
5623 if (NTTP->isParameterPack())
5628 auto *TTP = cast<TemplateTemplateParmDecl>(Param);
5646 Args.reserve(Args.size() + Params->
size());
5653 std::optional<unsigned> NumExpansions,
5654 bool ExpectPackInType) {
5656 "Pack expansions must expand one or more parameter packs");
5658 llvm::FoldingSetNodeID ID;
5661 void *InsertPos =
nullptr;
5673 PackExpansionTypes.FindNodeOrInsertPos(ID, InsertPos);
5679 PackExpansionTypes.InsertNode(
T, InsertPos);
5691 if (Protocols.empty())
return true;
5696 for (
unsigned i = 1; i != Protocols.size(); ++i)
5706 llvm::array_pod_sort(Protocols.begin(), Protocols.end(),
CmpProtocolNames);
5710 P =
P->getCanonicalDecl();
5713 auto ProtocolsEnd = std::unique(Protocols.begin(), Protocols.end());
5714 Protocols.erase(ProtocolsEnd, Protocols.end());
5719 unsigned NumProtocols)
const {
5729 bool isKindOf)
const {
5732 if (typeArgs.empty() && protocols.empty() && !isKindOf &&
5733 isa<ObjCInterfaceType>(baseType))
5737 llvm::FoldingSetNodeID ID;
5739 void *InsertPos =
nullptr;
5740 if (
ObjCObjectType *QT = ObjCObjectTypes.FindNodeOrInsertPos(ID, InsertPos))
5747 if (effectiveTypeArgs.empty()) {
5749 effectiveTypeArgs = baseObject->getTypeArgs();
5756 bool typeArgsAreCanonical = llvm::all_of(
5759 if (!typeArgsAreCanonical || !protocolsSorted || !baseType.
isCanonical()) {
5763 if (!typeArgsAreCanonical) {
5764 canonTypeArgsVec.reserve(effectiveTypeArgs.size());
5765 for (
auto typeArg : effectiveTypeArgs)
5767 canonTypeArgs = canonTypeArgsVec;
5769 canonTypeArgs = effectiveTypeArgs;
5774 if (!protocolsSorted) {
5775 canonProtocolsVec.append(protocols.begin(), protocols.end());
5777 canonProtocols = canonProtocolsVec;
5779 canonProtocols = protocols;
5783 canonProtocols, isKindOf);
5786 ObjCObjectTypes.FindNodeOrInsertPos(ID, InsertPos);
5790 size += typeArgs.size() *
sizeof(
QualType);
5798 ObjCObjectTypes.InsertNode(
T, InsertPos);
5808 bool allowOnPointerType)
const {
5811 if (
const auto *objT = dyn_cast<ObjCTypeParamType>(
type.getTypePtr())) {
5816 if (allowOnPointerType) {
5817 if (
const auto *objPtr =
5818 dyn_cast<ObjCObjectPointerType>(
type.getTypePtr())) {
5824 protocolsVec.append(protocols.begin(), protocols.end());
5836 if (
const auto *objT = dyn_cast<ObjCObjectType>(
type.getTypePtr())){
5841 objT->getTypeArgsAsWritten(),
5843 objT->isKindOfTypeAsWritten());
5847 if (
type->isObjCObjectType()) {
5857 if (
type->isObjCIdType()) {
5860 objPtr->isKindOfType());
5865 if (
type->isObjCClassType()) {
5868 objPtr->isKindOfType());
5880 llvm::FoldingSetNodeID ID;
5882 void *InsertPos =
nullptr;
5884 ObjCTypeParamTypes.FindNodeOrInsertPos(ID, InsertPos))
5889 if (!protocols.empty()) {
5893 Canonical, protocols, hasError,
true ));
5894 assert(!hasError &&
"Error when apply protocol qualifier to bound type");
5902 Types.push_back(newType);
5903 ObjCTypeParamTypes.InsertNode(newType, InsertPos);
5911 auto NewTypeParamTy = cast<ObjCTypeParamType>(New->
getTypeForDecl());
5913 protocols.append(NewTypeParamTy->qual_begin(), NewTypeParamTy->qual_end());
5928 for (
auto *Proto : OPT->quals()) {
5951 if (InheritedProtocols.empty())
5955 bool Conforms =
false;
5956 for (
auto *Proto : OPT->quals()) {
5958 for (
auto *PI : InheritedProtocols) {
5970 for (
auto *PI : InheritedProtocols) {
5972 bool Adopts =
false;
5973 for (
auto *Proto : OPT->quals()) {
5987 llvm::FoldingSetNodeID ID;
5990 void *InsertPos =
nullptr;
5992 ObjCObjectPointerTypes.FindNodeOrInsertPos(ID, InsertPos))
6001 ObjCObjectPointerTypes.FindNodeOrInsertPos(ID, InsertPos);
6010 Types.push_back(QType);
6011 ObjCObjectPointerTypes.InsertNode(QType, InsertPos);
6019 if (
Decl->TypeForDecl)
6023 assert(PrevDecl->TypeForDecl &&
"previous decl has no TypeForDecl");
6024 Decl->TypeForDecl = PrevDecl->TypeForDecl;
6025 return QualType(PrevDecl->TypeForDecl, 0);
6034 Decl->TypeForDecl =
T;
6047 llvm::FoldingSetNodeID ID;
6051 void *InsertPos =
nullptr;
6053 DependentTypeOfExprTypes.FindNodeOrInsertPos(ID, InsertPos);
6063 DependentTypeOfExprTypes.InsertNode(Canon, InsertPos);
6071 Types.push_back(toe);
6084 Types.push_back(tot);
6108 llvm_unreachable(
"Unknown value kind");
6123 llvm::FoldingSetNodeID ID;
6126 void *InsertPos =
nullptr;
6128 = DependentDecltypeTypes.FindNodeOrInsertPos(ID, InsertPos);
6133 DependentDecltypeTypes.InsertNode(Canon, InsertPos);
6141 Types.push_back(dt);
6146 bool FullySubstituted,
6150 if (FullySubstituted && Index != -1) {
6153 llvm::FoldingSetNodeID ID;
6155 void *InsertPos =
nullptr;
6157 DependentPackIndexingTypes.FindNodeOrInsertPos(ID, InsertPos);
6160 PackIndexingType::totalSizeToAlloc<QualType>(Expansions.size()),
6164 DependentPackIndexingTypes.InsertNode(Canon, InsertPos);
6170 Allocate(PackIndexingType::totalSizeToAlloc<QualType>(Expansions.size()),
6188 llvm::FoldingSetNodeID ID;
6191 void *InsertPos =
nullptr;
6193 = DependentUnaryTransformTypes.FindNodeOrInsertPos(ID, InsertPos);
6199 DependentUnaryTransformTypes.InsertNode(Canon, InsertPos);
6208 Types.push_back(ut);
6212QualType ASTContext::getAutoTypeInternal(
6217 !TypeConstraintConcept && !IsDependent)
6221 void *InsertPos =
nullptr;
6222 llvm::FoldingSetNodeID ID;
6224 TypeConstraintConcept, TypeConstraintArgs);
6225 if (
AutoType *AT = AutoTypes.FindNodeOrInsertPos(ID, InsertPos))
6232 }
else if (TypeConstraintConcept) {
6233 bool AnyNonCanonArgs =
false;
6236 *
this, TypeConstraintArgs, AnyNonCanonArgs);
6237 if (CanonicalConcept != TypeConstraintConcept || AnyNonCanonArgs) {
6239 getAutoTypeInternal(
QualType(), Keyword, IsDependent, IsPack,
6240 CanonicalConcept, CanonicalConceptArgs,
true);
6242 [[maybe_unused]]
auto *Nothing =
6243 AutoTypes.FindNodeOrInsertPos(ID, InsertPos);
6244 assert(!Nothing &&
"canonical type broken");
6254 (IsDependent ? TypeDependence::DependentInstantiation
6255 : TypeDependence::None) |
6256 (IsPack ? TypeDependence::UnexpandedPack : TypeDependence::None),
6257 Canon, TypeConstraintConcept, TypeConstraintArgs);
6258 Types.push_back(AT);
6259 AutoTypes.InsertNode(AT, InsertPos);
6268 bool IsDependent,
bool IsPack,
6271 assert((!IsPack || IsDependent) &&
"only use IsPack for a dependent pack");
6273 "A dependent auto should be undeduced");
6274 return getAutoTypeInternal(
DeducedType, Keyword, IsDependent, IsPack,
6275 TypeConstraintConcept, TypeConstraintArgs);
6283 if (!AT->isConstrained())
6287 AT->containsUnexpandedParameterPack()),
6299QualType ASTContext::getDeducedTemplateSpecializationTypeInternal(
6303 void *InsertPos =
nullptr;
6304 llvm::FoldingSetNodeID ID;
6308 DeducedTemplateSpecializationTypes.FindNodeOrInsertPos(ID, InsertPos))
6314 llvm::FoldingSetNodeID TempID;
6315 DTST->Profile(TempID);
6316 assert(ID == TempID &&
"ID does not match");
6317 Types.push_back(DTST);
6318 DeducedTemplateSpecializationTypes.InsertNode(DTST, InsertPos);
6328 ? getDeducedTemplateSpecializationTypeInternal(
6332 return getDeducedTemplateSpecializationTypeInternal(Template,
DeducedType,
6333 IsDependent, Canon);
6341 llvm::FoldingSetNodeID ID;
6344 void *InsertPos =
nullptr;
6345 if (
AtomicType *AT = AtomicTypes.FindNodeOrInsertPos(ID, InsertPos))
6351 if (!
T.isCanonical()) {
6355 AtomicType *NewIP = AtomicTypes.FindNodeOrInsertPos(ID, InsertPos);
6356 assert(!NewIP &&
"Shouldn't be in the map!"); (void)NewIP;
6359 Types.push_back(New);
6360 AtomicTypes.InsertNode(New, InsertPos);
6396 return getFromTargetType(
Target->getSizeType());
6402 return getFromTargetType(
Target->getSignedSizeType());
6407 return getFromTargetType(
Target->getIntMaxType());
6412 return getFromTargetType(
Target->getUIntMaxType());
6430 return getFromTargetType(
Target->getIntPtrType());
6453 return getFromTargetType(
Target->getProcessIDType());
6465 const Type *Ty =
T.getTypePtr();
6469 }
else if (isa<ArrayType>(Ty)) {
6471 }
else if (isa<FunctionType>(Ty)) {
6493 quals = splitType.
Quals;
6498 QualType elementType = AT->getElementType();
6503 if (elementType == unqualElementType) {
6504 assert(quals.
empty());
6505 quals = splitType.
Quals;
6513 if (
const auto *CAT = dyn_cast<ConstantArrayType>(AT)) {
6515 CAT->getSizeExpr(), CAT->getSizeModifier(), 0);
6518 if (
const auto *IAT = dyn_cast<IncompleteArrayType>(AT)) {
6522 if (
const auto *VAT = dyn_cast<VariableArrayType>(AT)) {
6525 VAT->getSizeModifier(),
6526 VAT->getIndexTypeCVRQualifiers(),
6527 VAT->getBracketsRange());
6530 const auto *DSAT = cast<DependentSizedArrayType>(AT);
6532 DSAT->getSizeModifier(), 0,
6543 bool AllowPiMismatch) {
6558 if (
auto *CAT1 = dyn_cast<ConstantArrayType>(AT1)) {
6559 auto *CAT2 = dyn_cast<ConstantArrayType>(AT2);
6560 if (!((CAT2 && CAT1->getSize() == CAT2->getSize()) ||
6562 isa<IncompleteArrayType>(AT2))))
6564 }
else if (isa<IncompleteArrayType>(AT1)) {
6565 if (!(isa<IncompleteArrayType>(AT2) ||
6567 isa<ConstantArrayType>(AT2))))
6573 T1 = AT1->getElementType();
6574 T2 = AT2->getElementType();
6594 bool AllowPiMismatch) {
6599 if (T1PtrType && T2PtrType) {
6607 if (T1MPType && T2MPType &&
6618 if (T1OPType && T2OPType) {
6650 if (Quals1 != Quals2)
6664 switch (Name.getKind()) {
6699 = Name.getAsSubstTemplateTemplateParm();
6706 = Name.getAsSubstTemplateTemplateParmPack();
6715 llvm_unreachable(
"bad template name kind!");
6720 switch (Name.getKind()) {
6725 if (
auto *TTP = dyn_cast<TemplateTemplateParmDecl>(Template))
6726 Template = getCanonicalTemplateTemplateParmDecl(TTP);
6734 llvm_unreachable(
"cannot canonicalize unresolved template");
6738 assert(DTN &&
"Non-dependent template names must refer to template decls.");
6739 return DTN->CanonicalTemplateName;
6744 = Name.getAsSubstTemplateTemplateParm();
6750 Name.getAsSubstTemplateTemplateParmPack();
6759 llvm_unreachable(
"bad template name!");
6775 llvm::FoldingSetNodeID XCEID, YCEID;
6776 XCE->
Profile(XCEID, *
this,
true,
true);
6777 YCE->
Profile(YCEID, *
this,
true,
true);
6778 return XCEID == YCEID;
6827 if (
auto *TX = dyn_cast<TemplateTypeParmDecl>(
X)) {
6828 auto *TY = cast<TemplateTypeParmDecl>(Y);
6829 if (TX->isParameterPack() != TY->isParameterPack())
6831 if (TX->hasTypeConstraint() != TY->hasTypeConstraint())
6834 TY->getTypeConstraint());
6837 if (
auto *TX = dyn_cast<NonTypeTemplateParmDecl>(
X)) {
6838 auto *TY = cast<NonTypeTemplateParmDecl>(Y);
6839 return TX->isParameterPack() == TY->isParameterPack() &&
6840 TX->getASTContext().hasSameType(TX->getType(), TY->getType()) &&
6842 TY->getPlaceholderTypeConstraint());
6845 auto *TX = cast<TemplateTemplateParmDecl>(
X);
6846 auto *TY = cast<TemplateTemplateParmDecl>(Y);
6847 return TX->isParameterPack() == TY->isParameterPack() &&
6849 TY->getTemplateParameters());
6854 if (
X->size() != Y->
size())
6857 for (
unsigned I = 0, N =
X->size(); I != N; ++I)
6871 if (
auto *TTPX = dyn_cast<TemplateTypeParmDecl>(
X)) {
6872 auto *TTPY = cast<TemplateTypeParmDecl>(Y);
6873 if (!TTPX->hasDefaultArgument() || !TTPY->hasDefaultArgument())
6876 return hasSameType(TTPX->getDefaultArgument().getArgument().getAsType(),
6877 TTPY->getDefaultArgument().getArgument().getAsType());
6880 if (
auto *NTTPX = dyn_cast<NonTypeTemplateParmDecl>(
X)) {
6881 auto *NTTPY = cast<NonTypeTemplateParmDecl>(Y);
6882 if (!NTTPX->hasDefaultArgument() || !NTTPY->hasDefaultArgument())
6885 Expr *DefaultArgumentX =
6886 NTTPX->getDefaultArgument().getArgument().getAsExpr()->
IgnoreImpCasts();
6887 Expr *DefaultArgumentY =
6888 NTTPY->getDefaultArgument().getArgument().getAsExpr()->
IgnoreImpCasts();
6889 llvm::FoldingSetNodeID XID, YID;
6890 DefaultArgumentX->
Profile(XID, *
this,
true);
6891 DefaultArgumentY->
Profile(YID, *
this,
true);
6895 auto *TTPX = cast<TemplateTemplateParmDecl>(
X);
6896 auto *TTPY = cast<TemplateTemplateParmDecl>(Y);
6898 if (!TTPX->hasDefaultArgument() || !TTPY->hasDefaultArgument())
6907 if (
auto *NS =
X->getAsNamespace())
6909 if (
auto *NAS =
X->getAsNamespaceAlias())
6910 return NAS->getNamespace();
6918 if (!NSY || NSX->getCanonicalDecl() != NSY->getCanonicalDecl())
6920 }
else if (
X->getKind() != Y->
getKind())
6925 switch (
X->getKind()) {
6936 if (
X->getAsType()->getCanonicalTypeInternal() !=
6946 auto *PX =
X->getPrefix();
6960 llvm::FoldingSetNodeID Cand1ID, Cand2ID;
6964 for (
auto Pair : zip_longest(AEnableIfAttrs, BEnableIfAttrs)) {
6965 std::optional<EnableIfAttr *> Cand1A = std::get<0>(Pair);
6966 std::optional<EnableIfAttr *> Cand2A = std::get<1>(Pair);
6969 if (!Cand1A || !Cand2A)
6975 (*Cand1A)->getCond()->Profile(Cand1ID, A->
getASTContext(),
true);
6976 (*Cand2A)->getCond()->Profile(Cand2ID, B->
getASTContext(),
true);
6980 if (Cand1ID != Cand2ID)
7008 if (
const auto *TypedefX = dyn_cast<TypedefNameDecl>(
X))
7009 if (
const auto *TypedefY = dyn_cast<TypedefNameDecl>(Y))
7011 TypedefY->getUnderlyingType());
7018 if (isa<ObjCInterfaceDecl>(
X) || isa<ObjCProtocolDecl>(
X))
7021 if (isa<ClassTemplateSpecializationDecl>(
X)) {
7028 if (
const auto *TagX = dyn_cast<TagDecl>(
X)) {
7029 const auto *TagY = cast<TagDecl>(Y);
7030 return (TagX->getTagKind() == TagY->getTagKind()) ||
7042 if (
const auto *FuncX = dyn_cast<FunctionDecl>(
X)) {
7043 const auto *FuncY = cast<FunctionDecl>(Y);
7044 if (
const auto *CtorX = dyn_cast<CXXConstructorDecl>(
X)) {
7045 const auto *CtorY = cast<CXXConstructorDecl>(Y);
7046 if (CtorX->getInheritedConstructor() &&
7047 !
isSameEntity(CtorX->getInheritedConstructor().getConstructor(),
7048 CtorY->getInheritedConstructor().getConstructor()))
7052 if (FuncX->isMultiVersion() != FuncY->isMultiVersion())
7057 if (FuncX->isMultiVersion()) {
7058 const auto *TAX = FuncX->getAttr<TargetAttr>();
7059 const auto *TAY = FuncY->getAttr<TargetAttr>();
7060 assert(TAX && TAY &&
"Multiversion Function without target attribute");
7062 if (TAX->getFeaturesStr() != TAY->getFeaturesStr())
7068 if ((FuncX->isMemberLikeConstrainedFriend() ||
7069 FuncY->isMemberLikeConstrainedFriend()) &&
7070 !FuncX->getLexicalDeclContext()->Equals(
7071 FuncY->getLexicalDeclContext())) {
7076 FuncY->getTrailingRequiresClause()))
7084 FD = FD->getCanonicalDecl();
7085 return FD->getTypeSourceInfo() ? FD->getTypeSourceInfo()->getType()
7088 QualType XT = GetTypeAsWritten(FuncX), YT = GetTypeAsWritten(FuncY);
7103 return FuncX->getLinkageInternal() == FuncY->getLinkageInternal() &&
7108 if (
const auto *VarX = dyn_cast<VarDecl>(
X)) {
7109 const auto *VarY = cast<VarDecl>(Y);
7110 if (VarX->getLinkageInternal() == VarY->getLinkageInternal()) {
7113 if (VarX->getType().isNull() || VarY->getType().isNull())
7116 if (
hasSameType(VarX->getType(), VarY->getType()))
7126 if (!VarXTy || !VarYTy)
7135 if (
const auto *NamespaceX = dyn_cast<NamespaceDecl>(
X)) {
7136 const auto *NamespaceY = cast<NamespaceDecl>(Y);
7137 return NamespaceX->isInline() == NamespaceY->isInline();
7142 if (
const auto *TemplateX = dyn_cast<TemplateDecl>(
X)) {
7143 const auto *TemplateY = cast<TemplateDecl>(Y);
7146 if (
const auto *ConceptX = dyn_cast<ConceptDecl>(
X)) {
7147 const auto *ConceptY = cast<ConceptDecl>(Y);
7149 ConceptY->getConstraintExpr()))
7154 TemplateY->getTemplatedDecl()) &&
7156 TemplateY->getTemplateParameters());
7160 if (
const auto *FDX = dyn_cast<FieldDecl>(
X)) {
7161 const auto *FDY = cast<FieldDecl>(Y);
7163 return hasSameType(FDX->getType(), FDY->getType());
7167 if (
const auto *IFDX = dyn_cast<IndirectFieldDecl>(
X)) {
7168 const auto *IFDY = cast<IndirectFieldDecl>(Y);
7169 return IFDX->getAnonField()->getCanonicalDecl() ==
7170 IFDY->getAnonField()->getCanonicalDecl();
7174 if (isa<EnumConstantDecl>(
X))
7179 if (
const auto *USX = dyn_cast<UsingShadowDecl>(
X)) {
7180 const auto *USY = cast<UsingShadowDecl>(Y);
7186 if (
const auto *UX = dyn_cast<UsingDecl>(
X)) {
7187 const auto *UY = cast<UsingDecl>(Y);
7189 UX->hasTypename() == UY->hasTypename() &&
7190 UX->isAccessDeclaration() == UY->isAccessDeclaration();
7192 if (
const auto *UX = dyn_cast<UnresolvedUsingValueDecl>(
X)) {
7193 const auto *UY = cast<UnresolvedUsingValueDecl>(Y);
7195 UX->isAccessDeclaration() == UY->isAccessDeclaration();
7197 if (
const auto *UX = dyn_cast<UnresolvedUsingTypenameDecl>(
X)) {
7200 cast<UnresolvedUsingTypenameDecl>(Y)->getQualifier());
7205 if (
const auto *UX = dyn_cast<UsingPackDecl>(
X)) {
7207 UX->getInstantiatedFromUsingDecl(),
7208 cast<UsingPackDecl>(Y)->getInstantiatedFromUsingDecl());
7212 if (
const auto *NAX = dyn_cast<NamespaceAliasDecl>(
X)) {
7213 const auto *NAY = cast<NamespaceAliasDecl>(Y);
7214 return NAX->getNamespace()->Equals(NAY->getNamespace());
7261 bool AnyNonCanonArgs =
false;
7264 if (!AnyNonCanonArgs)
7272 llvm_unreachable(
"Unhandled template argument kind");
7315 DNT->getIdentifier());
7329 llvm_unreachable(
"Invalid NestedNameSpecifier::Kind!");
7334 if (!
T.hasLocalQualifiers()) {
7336 if (
const auto *AT = dyn_cast<ArrayType>(
T))
7341 if (!isa<ArrayType>(
T.getCanonicalType()))
7356 const auto *ATy = dyn_cast<ArrayType>(split.
Ty);
7357 if (!ATy || qs.
empty())
7364 if (
const auto *CAT = dyn_cast<ConstantArrayType>(ATy))
7367 CAT->getSizeModifier(),
7368 CAT->getIndexTypeCVRQualifiers()));
7369 if (
const auto *IAT = dyn_cast<IncompleteArrayType>(ATy))
7371 IAT->getSizeModifier(),
7372 IAT->getIndexTypeCVRQualifiers()));
7374 if (
const auto *DSAT = dyn_cast<DependentSizedArrayType>(ATy))
7375 return cast<ArrayType>(
7377 DSAT->getSizeExpr(),
7378 DSAT->getSizeModifier(),
7379 DSAT->getIndexTypeCVRQualifiers(),
7380 DSAT->getBracketsRange()));
7382 const auto *VAT = cast<VariableArrayType>(ATy);
7385 VAT->getSizeModifier(),
7386 VAT->getIndexTypeCVRQualifiers(),
7387 VAT->getBracketsRange()));
7401 return T.getUnqualifiedType();
7414 return T.getUnqualifiedType();
7429 assert(PrettyArrayType &&
"Not an array type!");
7466 uint64_t ElementCount = 1;
7469 CA = dyn_cast_or_null<ConstantArrayType>(
7472 return ElementCount;
7480 uint64_t ElementCount = 1;
7484 AILE = dyn_cast<ArrayInitLoopExpr>(AILE->
getSubExpr());
7487 return ElementCount;
7497 default: llvm_unreachable(
"getFloatingRank(): not a floating type");
7499 case BuiltinType::Half:
return HalfRank;
7500 case BuiltinType::Float:
return FloatRank;
7533unsigned ASTContext::getIntegerRank(
const Type *
T)
const {
7538 if (
const auto *EIT = dyn_cast<BitIntType>(
T))
7539 return 0 + (EIT->getNumBits() << 3);
7541 switch (cast<BuiltinType>(
T)->getKind()) {
7542 default: llvm_unreachable(
"getIntegerRank(): not a built-in integer");
7543 case BuiltinType::Bool:
7545 case BuiltinType::Char_S:
7546 case BuiltinType::Char_U:
7547 case BuiltinType::SChar:
7548 case BuiltinType::UChar:
7550 case BuiltinType::Short:
7551 case BuiltinType::UShort:
7553 case BuiltinType::Int:
7554 case BuiltinType::UInt:
7556 case BuiltinType::Long:
7557 case BuiltinType::ULong:
7559 case BuiltinType::LongLong:
7560 case BuiltinType::ULongLong:
7562 case BuiltinType::Int128:
7563 case BuiltinType::UInt128:
7568 case BuiltinType::Char8:
7570 case BuiltinType::Char16:
7571 return getIntegerRank(
7573 case BuiltinType::Char32:
7574 return getIntegerRank(
7576 case BuiltinType::WChar_S:
7577 case BuiltinType::WChar_U:
7578 return getIntegerRank(
7608 uint64_t BitWidth = Field->getBitWidthValue(*
this);
7631 if (
QualType QT = Field->getType(); QT->isBitIntType())
7634 if (BitWidth < IntSize)
7637 if (BitWidth == IntSize)
7652 assert(!Promotable.
isNull());
7655 return ET->getDecl()->getPromotionType();
7664 if (BT->getKind() == BuiltinType::WChar_S ||
7665 BT->getKind() == BuiltinType::WChar_U ||
7666 BT->getKind() == BuiltinType::Char8 ||
7667 BT->getKind() == BuiltinType::Char16 ||
7668 BT->getKind() == BuiltinType::Char32) {
7669 bool FromIsSigned = BT->getKind() == BuiltinType::WChar_S;
7673 for (
const auto &PT : PromoteTypes) {
7675 if (FromSize < ToSize ||
7676 (FromSize == ToSize && FromIsSigned == PT->isSignedIntegerType()))
7679 llvm_unreachable(
"char type should fit into long long");
7686 uint64_t PromotableSize =
getIntWidth(Promotable);
7695 while (!
T.isNull()) {
7697 return T.getObjCLifetime();
7727 if (
const auto *ET = dyn_cast<EnumType>(LHSC))
7729 if (
const auto *ET = dyn_cast<EnumType>(RHSC))
7732 if (LHSC == RHSC)
return 0;
7737 unsigned LHSRank = getIntegerRank(LHSC);
7738 unsigned RHSRank = getIntegerRank(RHSC);
7740 if (LHSUnsigned == RHSUnsigned) {
7741 if (LHSRank == RHSRank)
return 0;
7742 return LHSRank > RHSRank ? 1 : -1;
7748 if (LHSRank >= RHSRank)
7758 if (RHSRank >= LHSRank)
7768 if (CFConstantStringTypeDecl)
7769 return CFConstantStringTypeDecl;
7771 assert(!CFConstantStringTagDecl &&
7772 "tag and typedef should be initialized together");
7812 if (
static_cast<unsigned>(CFRuntime) <
7815 Fields[Count++] = {
IntTy,
"flags" };
7817 Fields[Count++] = {
LongTy,
"length" };
7821 Fields[Count++] = { getFromTargetType(
Target->getUInt64Type()),
"_swift_rc" };
7825 Fields[Count++] = {
IntTy,
"_ptr" };
7831 for (
unsigned i = 0; i < Count; ++i) {
7835 Fields[i].Type,
nullptr,
7838 CFConstantStringTagDecl->
addDecl(Field);
7845 CFConstantStringTypeDecl =
7848 return CFConstantStringTypeDecl;
7852 if (!CFConstantStringTagDecl)
7854 return CFConstantStringTagDecl;
7863 if (ObjCSuperType.
isNull()) {
7868 return ObjCSuperType;
7873 CFConstantStringTypeDecl = cast<TypedefDecl>(TD->getDecl());
7880 if (BlockDescriptorType)
7893 static const char *
const FieldNames[] = {
7898 for (
size_t i = 0; i < 2; ++i) {
7901 &
Idents.
get(FieldNames[i]), FieldTypes[i],
nullptr,
7909 BlockDescriptorType = RD;
7915 if (BlockDescriptorExtendedType)
7930 static const char *
const FieldNames[] = {
7937 for (
size_t i = 0; i < 4; ++i) {
7940 &
Idents.
get(FieldNames[i]), FieldTypes[i],
nullptr,
7949 BlockDescriptorExtendedType = RD;
7954 const auto *BT = dyn_cast<BuiltinType>(
T);
7957 if (isa<PipeType>(
T))
7963 switch (BT->getKind()) {
7964#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
7965 case BuiltinType::Id: \
7967#include "clang/Basic/OpenCLImageTypes.def"
7969 case BuiltinType::OCLClkEvent:
7972 case BuiltinType::OCLEvent:
7975 case BuiltinType::OCLQueue:
7978 case BuiltinType::OCLReserveID:
7981 case BuiltinType::OCLSampler:
8000 if (!copyExpr && record->hasTrivialDestructor())
return false;
8028 llvm_unreachable(
"impossible");
8030 llvm_unreachable(
"fell out of lifetime switch!");
8038 bool &HasByrefExtendedLayout)
const {
8043 HasByrefExtendedLayout =
false;
8045 HasByrefExtendedLayout =
true;
8059 assert(
Target &&
"Expected target to be initialized");
8060 const llvm::Triple &
T =
Target->getTriple();
8062 if (
T.isOSWindows() &&
T.isArch64Bit())
8068 assert(
Target &&
"Expected target to be initialized");
8069 const llvm::Triple &
T =
Target->getTriple();
8071 if (
T.isOSWindows() &&
T.isArch64Bit())
8077 if (!ObjCInstanceTypeDecl)
8078 ObjCInstanceTypeDecl =
8080 return ObjCInstanceTypeDecl;
8086 if (
const auto *TT = dyn_cast<TypedefType>(
T))
8088 return II->isStr(
"BOOL");
8096 if (!
type->isIncompleteArrayType() &&
type->isIncompleteType())
8105 else if (
type->isArrayType())
8124 if (
First->isInlineSpecified() || !
First->isStaticDataMember())
8131 !
D->isInlineSpecified() && (
D->isConstexpr() ||
First->isConstexpr()))
8162 for (
auto *PI :
Decl->parameters()) {
8167 assert(sz.
isPositive() &&
"BlockExpr - Incomplete param type");
8176 ParmOffset = PtrSize;
8177 for (
auto *PVDecl :
Decl->parameters()) {
8178 QualType PType = PVDecl->getOriginalType();
8179 if (
const auto *AT =
8183 if (!isa<ConstantArrayType>(AT))
8184 PType = PVDecl->getType();
8186 PType = PVDecl->getType();
8206 for (
auto *PI :
Decl->parameters()) {
8213 "getObjCEncodingForFunctionDecl - Incomplete param type");
8220 for (
auto *PVDecl :
Decl->parameters()) {
8221 QualType PType = PVDecl->getOriginalType();
8222 if (
const auto *AT =
8226 if (!isa<ConstantArrayType>(AT))
8227 PType = PVDecl->getType();
8229 PType = PVDecl->getType();
8243 bool Extended)
const {
8247 ObjCEncOptions Options = ObjCEncOptions()
8248 .setExpandPointedToStructures()
8249 .setExpandStructures()
8250 .setIsOutermostType();
8252 Options.setEncodeBlockParameters().setEncodeClassNames();
8253 getObjCEncodingForTypeImpl(
T, S, Options,
nullptr);
8259 bool Extended)
const {
8264 Decl->getReturnType(), S, Extended);
8273 E =
Decl->sel_param_end(); PI !=
E; ++PI) {
8280 "getObjCEncodingForMethodDecl - Incomplete param type");
8288 ParmOffset = 2 * PtrSize;
8290 E =
Decl->sel_param_end(); PI !=
E; ++PI) {
8293 if (
const auto *AT =
8297 if (!isa<ConstantArrayType>(AT))
8302 PType, S, Extended);
8313 const Decl *Container)
const {
8316 if (
const auto *CID = dyn_cast<ObjCCategoryImplDecl>(Container)) {
8317 for (
auto *PID : CID->property_impls())
8318 if (PID->getPropertyDecl() == PD)
8321 const auto *OID = cast<ObjCImplementationDecl>(Container);
8322 for (
auto *PID : OID->property_impls())
8323 if (PID->getPropertyDecl() == PD)
8357 const Decl *Container)
const {
8359 bool Dynamic =
false;
8367 SynthesizePID = PropertyImpDecl;
8371 std::string S =
"T";
8416 if (SynthesizePID) {
8433 if (BT->getKind() == BuiltinType::ULong &&
getIntWidth(PointeeTy) == 32)
8436 if (BT->getKind() == BuiltinType::Long &&
getIntWidth(PointeeTy) == 32)
8449 getObjCEncodingForTypeImpl(
T, S,
8451 .setExpandPointedToStructures()
8452 .setExpandStructures()
8453 .setIsOutermostType(),
8454 Field, NotEncodedT);
8458 std::string& S)
const {
8462 getObjCEncodingForTypeImpl(
T, S,
8464 .setExpandPointedToStructures()
8465 .setExpandStructures()
8466 .setIsOutermostType()
8467 .setEncodingProperty(),
8475 case BuiltinType::Void:
return 'v';
8476 case BuiltinType::Bool:
return 'B';
8477 case BuiltinType::Char8:
8478 case BuiltinType::Char_U:
8479 case BuiltinType::UChar:
return 'C';
8480 case BuiltinType::Char16:
8481 case BuiltinType::UShort:
return 'S';
8482 case BuiltinType::Char32:
8483 case BuiltinType::UInt:
return 'I';
8484 case BuiltinType::ULong:
8485 return C->getTargetInfo().getLongWidth() == 32 ?
'L' :
'Q';
8486 case BuiltinType::UInt128:
return 'T';
8487 case BuiltinType::ULongLong:
return 'Q';
8488 case BuiltinType::Char_S:
8489 case BuiltinType::SChar:
return 'c';
8490 case BuiltinType::Short:
return 's';
8491 case BuiltinType::WChar_S:
8492 case BuiltinType::WChar_U:
8493 case BuiltinType::Int:
return 'i';
8494 case BuiltinType::Long:
8495 return C->getTargetInfo().getLongWidth() == 32 ?
'l' :
'q';
8496 case BuiltinType::LongLong:
return 'q';
8497 case BuiltinType::Int128:
return 't';
8498 case BuiltinType::Float:
return 'f';
8499 case BuiltinType::Double:
return 'd';
8500 case BuiltinType::LongDouble:
return 'D';
8501 case BuiltinType::NullPtr:
return '*';
8503 case BuiltinType::BFloat16:
8504 case BuiltinType::Float16:
8505 case BuiltinType::Float128:
8506 case BuiltinType::Ibm128:
8507 case BuiltinType::Half:
8508 case BuiltinType::ShortAccum:
8509 case BuiltinType::Accum:
8510 case BuiltinType::LongAccum:
8511 case BuiltinType::UShortAccum:
8512 case BuiltinType::UAccum:
8513 case BuiltinType::ULongAccum:
8514 case BuiltinType::ShortFract:
8515 case BuiltinType::Fract:
8516 case BuiltinType::LongFract:
8517 case BuiltinType::UShortFract:
8518 case BuiltinType::UFract:
8519 case BuiltinType::ULongFract:
8520 case BuiltinType::SatShortAccum:
8521 case BuiltinType::SatAccum:
8522 case BuiltinType::SatLongAccum:
8523 case BuiltinType::SatUShortAccum:
8524 case BuiltinType::SatUAccum:
8525 case BuiltinType::SatULongAccum:
8526 case BuiltinType::SatShortFract:
8527 case BuiltinType::SatFract:
8528 case BuiltinType::SatLongFract:
8529 case BuiltinType::SatUShortFract:
8530 case BuiltinType::SatUFract:
8531 case BuiltinType::SatULongFract:
8535#define SVE_TYPE(Name, Id, SingletonId) \
8536 case BuiltinType::Id:
8537#include "clang/Basic/AArch64SVEACLETypes.def"
8538#define RVV_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
8539#include "clang/Basic/RISCVVTypes.def"
8540#define WASM_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
8541#include "clang/Basic/WebAssemblyReferenceTypes.def"
8542#define AMDGPU_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
8543#include "clang/Basic/AMDGPUTypes.def"
8547 "cannot yet @encode type %0");
8552 case BuiltinType::ObjCId:
8553 case BuiltinType::ObjCClass:
8554 case BuiltinType::ObjCSel:
8555 llvm_unreachable(
"@encoding ObjC primitive type");
8558#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
8559 case BuiltinType::Id:
8560#include "clang/Basic/OpenCLImageTypes.def"
8561#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
8562 case BuiltinType::Id:
8563#include "clang/Basic/OpenCLExtensionTypes.def"
8564 case BuiltinType::OCLEvent:
8565 case BuiltinType::OCLClkEvent:
8566 case BuiltinType::OCLQueue:
8567 case BuiltinType::OCLReserveID:
8568 case BuiltinType::OCLSampler:
8569 case BuiltinType::Dependent:
8570#define PPC_VECTOR_TYPE(Name, Id, Size) \
8571 case BuiltinType::Id:
8572#include "clang/Basic/PPCTypes.def"
8573#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
8574#include "clang/Basic/HLSLIntangibleTypes.def"
8575#define BUILTIN_TYPE(KIND, ID)
8576#define PLACEHOLDER_TYPE(KIND, ID) \
8577 case BuiltinType::KIND:
8578#include "clang/AST/BuiltinTypes.def"
8579 llvm_unreachable(
"invalid builtin type for @encode");
8581 llvm_unreachable(
"invalid BuiltinType::Kind value");
8588 if (!
Enum->isFixed())
8598 assert(FD->
isBitField() &&
"not a bitfield - getObjCEncodingForTypeImpl");
8618 if (
const auto *IVD = dyn_cast<ObjCIvarDecl>(FD)) {
8627 S += llvm::utostr(Offset);
8642 bool VisitBasesAndFields) {
8647 PT->getPointeeType().getTypePtr(),
false);
8654 if (isa<ClassTemplateSpecializationDecl>(CXXRD))
8657 if (!CXXRD->hasDefinition() || !VisitBasesAndFields)
8660 for (
const auto &B : CXXRD->bases())
8665 for (
auto *FD : CXXRD->fields())
8674void ASTContext::getObjCEncodingForTypeImpl(
QualType T, std::string &S,
8675 const ObjCEncOptions Options,
8679 switch (CT->getTypeClass()) {
8684 if (
const auto *BT = dyn_cast<BuiltinType>(CT))
8706 case Type::LValueReference:
8707 case Type::RValueReference: {
8709 if (isa<PointerType>(CT)) {
8711 if (PT->isObjCSelType()) {
8720 bool isReadOnly =
false;
8726 if (Options.IsOutermostType() &&
T.isConstQualified()) {
8730 }
else if (Options.IsOutermostType()) {
8733 P = PT->getPointeeType();
8734 if (
P.isConstQualified()) {
8743 if (StringRef(S).ends_with(
"nr"))
8744 S.replace(S.end()-2, S.end(),
"rn");
8756 if (RTy->getDecl()->getIdentifier() == &
Idents.
get(
"objc_class")) {
8761 if (RTy->getDecl()->getIdentifier() == &
Idents.
get(
"objc_object")) {
8770 RTy, Options.ExpandPointedToStructures()))) {
8779 ObjCEncOptions NewOptions;
8780 if (Options.ExpandPointedToStructures())
8781 NewOptions.setExpandStructures();
8782 getObjCEncodingForTypeImpl(PointeeTy, S, NewOptions,
8783 nullptr, NotEncodedT);
8787 case Type::ConstantArray:
8788 case Type::IncompleteArray:
8789 case Type::VariableArray: {
8790 const auto *AT = cast<ArrayType>(CT);
8792 if (isa<IncompleteArrayType>(AT) && !Options.IsStructField()) {
8796 getObjCEncodingForTypeImpl(
8797 AT->getElementType(), S,
8798 Options.keepingOnly(ObjCEncOptions().setExpandStructures()), FD);
8802 if (
const auto *CAT = dyn_cast<ConstantArrayType>(AT))
8803 S += llvm::utostr(CAT->getZExtSize());
8806 assert((isa<VariableArrayType>(AT) || isa<IncompleteArrayType>(AT)) &&
8807 "Unknown array type!");
8811 getObjCEncodingForTypeImpl(
8812 AT->getElementType(), S,
8813 Options.keepingOnly(ObjCEncOptions().setExpandStructures()), FD,
8820 case Type::FunctionNoProto:
8821 case Type::FunctionProto:
8825 case Type::Record: {
8826 RecordDecl *RDecl = cast<RecordType>(CT)->getDecl();
8827 S += RDecl->
isUnion() ?
'(' :
'{';
8831 if (
const auto *Spec = dyn_cast<ClassTemplateSpecializationDecl>(RDecl)) {
8833 llvm::raw_string_ostream OS(S);
8840 if (Options.ExpandStructures()) {
8843 getObjCEncodingForStructureImpl(RDecl, S, FD,
true, NotEncodedT);
8845 for (
const auto *Field : RDecl->
fields()) {
8848 S +=
Field->getNameAsString();
8853 if (
Field->isBitField()) {
8854 getObjCEncodingForTypeImpl(
Field->getType(), S,
8855 ObjCEncOptions().setExpandStructures(),
8860 getObjCEncodingForTypeImpl(
8862 ObjCEncOptions().setExpandStructures().setIsStructField(), FD,
8868 S += RDecl->
isUnion() ?
')' :
'}';
8872 case Type::BlockPointer: {
8875 if (Options.EncodeBlockParameters()) {
8876 const auto *FT = BT->getPointeeType()->castAs<
FunctionType>();
8880 getObjCEncodingForTypeImpl(FT->getReturnType(), S,
8881 Options.forComponentType(), FD, NotEncodedT);
8885 if (
const auto *FPT = dyn_cast<FunctionProtoType>(FT)) {
8886 for (
const auto &I : FPT->param_types())
8887 getObjCEncodingForTypeImpl(I, S, Options.forComponentType(), FD,
8895 case Type::ObjCObject: {
8899 S +=
"{objc_object=}";
8903 S +=
"{objc_class=}";
8910 case Type::ObjCInterface: {
8916 if (Options.ExpandStructures()) {
8920 for (
unsigned i = 0, e = Ivars.size(); i != e; ++i) {
8922 if (
Field->isBitField())
8923 getObjCEncodingForTypeImpl(
Field->getType(), S,
8924 ObjCEncOptions().setExpandStructures(),
8927 getObjCEncodingForTypeImpl(
Field->getType(), S,
8928 ObjCEncOptions().setExpandStructures(), FD,
8936 case Type::ObjCObjectPointer: {
8938 if (OPT->isObjCIdType()) {
8943 if (OPT->isObjCClassType() || OPT->isObjCQualifiedClassType()) {
8951 if (OPT->isObjCQualifiedIdType()) {
8952 getObjCEncodingForTypeImpl(
8954 Options.keepingOnly(ObjCEncOptions()
8955 .setExpandPointedToStructures()
8956 .setExpandStructures()),
8958 if (FD || Options.EncodingProperty() || Options.EncodeClassNames()) {
8962 for (
const auto *I : OPT->quals()) {
8964 S += I->getObjCRuntimeNameAsString();
8973 if (OPT->getInterfaceDecl() &&
8974 (FD || Options.EncodingProperty() || Options.EncodeClassNames())) {
8976 S += OPT->getInterfaceDecl()->getObjCRuntimeNameAsString();
8977 for (
const auto *I : OPT->quals()) {
8979 S += I->getObjCRuntimeNameAsString();
8989 case Type::MemberPointer:
8993 case Type::ExtVector:
8999 case Type::ConstantMatrix:
9012 case Type::DeducedTemplateSpecialization:
9015 case Type::ArrayParameter:
9017#define ABSTRACT_TYPE(KIND, BASE)
9018#define TYPE(KIND, BASE)
9019#define DEPENDENT_TYPE(KIND, BASE) \
9021#define NON_CANONICAL_TYPE(KIND, BASE) \
9023#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(KIND, BASE) \
9025#include "clang/AST/TypeNodes.inc"
9026 llvm_unreachable(
"@encode for dependent type!");
9028 llvm_unreachable(
"bad type kind!");
9031void ASTContext::getObjCEncodingForStructureImpl(
RecordDecl *RDecl,
9036 assert(RDecl &&
"Expected non-null RecordDecl");
9037 assert(!RDecl->
isUnion() &&
"Should not be called for unions");
9041 const auto *CXXRec = dyn_cast<CXXRecordDecl>(RDecl);
9042 std::multimap<uint64_t, NamedDecl *> FieldOrBaseOffsets;
9046 for (
const auto &BI : CXXRec->bases()) {
9047 if (!BI.isVirtual()) {
9052 FieldOrBaseOffsets.insert(FieldOrBaseOffsets.upper_bound(offs),
9053 std::make_pair(offs, base));
9059 if (!
Field->isZeroLengthBitField(*
this) &&
Field->isZeroSize(*
this))
9062 FieldOrBaseOffsets.insert(FieldOrBaseOffsets.upper_bound(offs),
9063 std::make_pair(offs, Field));
9066 if (CXXRec && includeVBases) {
9067 for (
const auto &BI : CXXRec->vbases()) {
9073 FieldOrBaseOffsets.find(offs) == FieldOrBaseOffsets.end())
9074 FieldOrBaseOffsets.insert(FieldOrBaseOffsets.end(),
9075 std::make_pair(offs, base));
9089 std::multimap<uint64_t, NamedDecl *>::iterator
9090 CurLayObj = FieldOrBaseOffsets.begin();
9092 if (CXXRec && CXXRec->isDynamicClass() &&
9093 (CurLayObj == FieldOrBaseOffsets.end() || CurLayObj->first != 0)) {
9096 std::string recname = CXXRec->getNameAsString();
9097 if (recname.empty()) recname =
"?";
9110 FieldOrBaseOffsets.insert(FieldOrBaseOffsets.upper_bound(offs),
9111 std::make_pair(offs,
nullptr));
9114 for (; CurLayObj != FieldOrBaseOffsets.end(); ++CurLayObj) {
9116 assert(CurOffs <= CurLayObj->first);
9117 if (CurOffs < CurLayObj->first) {
9118 uint64_t padding = CurLayObj->first - CurOffs;
9134 if (
auto *base = dyn_cast<CXXRecordDecl>(dcl)) {
9139 getObjCEncodingForStructureImpl(base, S, FD,
false,
9146 const auto *field = cast<FieldDecl>(dcl);
9149 S += field->getNameAsString();
9153 if (field->isBitField()) {
9156 CurOffs += field->getBitWidthValue(*
this);
9161 getObjCEncodingForTypeImpl(
9162 qt, S, ObjCEncOptions().setExpandStructures().setIsStructField(),
9173 std::string& S)
const {
9206 if (!ObjCClassDecl) {
9211 return ObjCClassDecl;
9215 if (!ObjCProtocolClassDecl) {
9216 ObjCProtocolClassDecl
9225 return ObjCProtocolClassDecl;
9270 const size_t NumFields = 5;
9272 const char *FieldNames[NumFields];
9276 FieldNames[0] =
"__stack";
9280 FieldNames[1] =
"__gr_top";
9284 FieldNames[2] =
"__vr_top";
9287 FieldTypes[3] = Context->
IntTy;
9288 FieldNames[3] =
"__gr_offs";
9291 FieldTypes[4] = Context->
IntTy;
9292 FieldNames[4] =
"__vr_offs";
9295 for (
unsigned i = 0; i < NumFields; ++i) {
9301 FieldTypes[i],
nullptr,
9306 VaListTagDecl->
addDecl(Field);
9323 const size_t NumFields = 5;
9325 const char *FieldNames[NumFields];
9329 FieldNames[0] =
"gpr";
9333 FieldNames[1] =
"fpr";
9337 FieldNames[2] =
"reserved";
9341 FieldNames[3] =
"overflow_arg_area";
9345 FieldNames[4] =
"reg_save_area";
9348 for (
unsigned i = 0; i < NumFields; ++i) {
9353 FieldTypes[i],
nullptr,
9358 VaListTagDecl->
addDecl(Field);
9385 const size_t NumFields = 4;
9387 const char *FieldNames[NumFields];
9391 FieldNames[0] =
"gp_offset";
9395 FieldNames[1] =
"fp_offset";
9399 FieldNames[2] =
"overflow_arg_area";
9403 FieldNames[3] =
"reg_save_area";
9406 for (
unsigned i = 0; i < NumFields; ++i) {
9412 FieldTypes[i],
nullptr,
9417 VaListTagDecl->
addDecl(Field);
9488 const size_t NumFields = 4;
9490 const char *FieldNames[NumFields];
9493 FieldTypes[0] = Context->
LongTy;
9494 FieldNames[0] =
"__gpr";
9497 FieldTypes[1] = Context->
LongTy;
9498 FieldNames[1] =
"__fpr";
9502 FieldNames[2] =
"__overflow_arg_area";
9506 FieldNames[3] =
"__reg_save_area";
9509 for (
unsigned i = 0; i < NumFields; ++i) {
9515 FieldTypes[i],
nullptr,
9520 VaListTagDecl->
addDecl(Field);
9542 const size_t NumFields = 3;
9544 const char *FieldNames[NumFields];
9548 FieldNames[0] =
"__current_saved_reg_area_pointer";
9552 FieldNames[1] =
"__saved_reg_area_end_pointer";
9556 FieldNames[2] =
"__overflow_area_pointer";
9559 for (
unsigned i = 0; i < NumFields; ++i) {
9567 VaListTagDecl->
addDecl(Field);
9610 llvm_unreachable(
"Unhandled __builtin_va_list type kind");
9614 if (!BuiltinVaListDecl) {
9619 return BuiltinVaListDecl;
9632 if (!BuiltinMSVaListDecl)
9635 return BuiltinMSVaListDecl;
9647 assert(ObjCConstantStringType.
isNull() &&
9648 "'NSConstantString' type already set!");
9658 unsigned size = End -
Begin;
9659 assert(size > 1 &&
"set is not overloaded!");
9668 assert(isa<FunctionTemplateDecl>(
D) ||
9669 isa<UnresolvedUsingValueDecl>(
D) ||
9670 (isa<UsingShadowDecl>(
D) &&
9671 isa<FunctionTemplateDecl>(
D->getUnderlyingDecl())));
9688 bool TemplateKeyword,
9694 llvm::FoldingSetNodeID ID;
9697 void *InsertPos =
nullptr;
9699 QualifiedTemplateNames.FindNodeOrInsertPos(ID, InsertPos);
9703 QualifiedTemplateNames.InsertNode(QTN, InsertPos);
9715 "Nested name specifier must be dependent");
9717 llvm::FoldingSetNodeID ID;
9720 void *InsertPos =
nullptr;
9722 DependentTemplateNames.FindNodeOrInsertPos(ID, InsertPos);
9728 if (CanonNNS == NNS) {
9736 DependentTemplateNames.FindNodeOrInsertPos(ID, InsertPos);
9737 assert(!CheckQTN &&
"Dependent type name canonicalization broken");
9741 DependentTemplateNames.InsertNode(QTN, InsertPos);
9751 "Nested name specifier must be dependent");
9753 llvm::FoldingSetNodeID ID;
9756 void *InsertPos =
nullptr;
9758 = DependentTemplateNames.FindNodeOrInsertPos(ID, InsertPos);
9764 if (CanonNNS == NNS) {
9773 = DependentTemplateNames.FindNodeOrInsertPos(ID, InsertPos);
9774 assert(!CheckQTN &&
"Dependent template name canonicalization broken");
9778 DependentTemplateNames.InsertNode(QTN, InsertPos);
9784 std::optional<unsigned> PackIndex)
const {
9785 llvm::FoldingSetNodeID ID;
9789 void *insertPos =
nullptr;
9791 = SubstTemplateTemplateParms.FindNodeOrInsertPos(ID, insertPos);
9795 Replacement, AssociatedDecl, Index, PackIndex);
9796 SubstTemplateTemplateParms.InsertNode(subst, insertPos);
9804 Decl *AssociatedDecl,
9805 unsigned Index,
bool Final)
const {
9807 llvm::FoldingSetNodeID ID;
9809 AssociatedDecl, Index, Final);
9811 void *InsertPos =
nullptr;
9813 = SubstTemplateTemplateParmPacks.FindNodeOrInsertPos(ID, InsertPos);
9818 SubstTemplateTemplateParmPacks.InsertNode(Subst, InsertPos);
9842 llvm_unreachable(
"Unhandled TargetInfo::IntType value");
9872 while (
const auto *AT = dyn_cast<ArrayType>(CT))
9873 CT = AT->getElementType();
9905 assert(FirstVec->
isVectorType() &&
"FirstVec should be a vector type");
9906 assert(SecondVec->
isVectorType() &&
"SecondVec should be a vector type");
9943 if (Ty->
getKind() == BuiltinType::SveBool ||
9944 Ty->
getKind() == BuiltinType::SveCount)
9957 return BT->getKind() == BuiltinType::SveBool;
9959 return VT->getElementType().getCanonicalType() ==
9970 return IsValidCast(FirstType, SecondType) ||
9971 IsValidCast(SecondType, FirstType);
9989 if (BT->getKind() == BuiltinType::SveBool &&
10010 return VecTy->getElementType().getCanonicalType()->isIntegerType() &&
10017 return IsLaxCompatible(FirstType, SecondType) ||
10018 IsLaxCompatible(SecondType, FirstType);
10034 uint64_t MinElts = Info.
EC.getKnownMinValue();
10035 return VScale->first * MinElts * EltSize;
10043 "Expected RVV builtin type and vector type!");
10083 return IsValidCast(FirstType, SecondType) ||
10084 IsValidCast(SecondType, FirstType);
10092 "Expected RVV builtin type and vector type!");
10099 if (!BT->isRVVVLSBuiltinType())
10119 return VecTy->getElementType().getCanonicalType()->isIntegerType() &&
10126 return IsLaxCompatible(FirstType, SecondType) ||
10127 IsLaxCompatible(SecondType, FirstType);
10134 if (
Attr->getAttrKind() == attr::ObjCOwnership)
10137 Ty =
Attr->getModifiedType();
10141 Ty =
Paren->getInnerType();
10173 for (
auto *lhsProto : lhs->
quals()) {
10174 bool match =
false;
10175 for (
auto *rhsProto : rhs->
quals()) {
10206 for (
auto *I : lhs->
quals()) {
10210 if (!rhsID->ClassImplementsProtocol(I,
true))
10218 for (
auto *lhsProto : lhs->
quals()) {
10219 bool match =
false;
10224 for (
auto *rhsProto : rhs->
quals()) {
10234 for (
auto *I : lhs->
quals()) {
10238 if (rhsID->ClassImplementsProtocol(I,
true)) {
10255 for (
auto *lhsProto : lhs->
quals()) {
10256 bool match =
false;
10263 for (
auto *rhsProto : rhs->
quals()) {
10282 if (LHSInheritedProtocols.empty() && lhs->
qual_empty())
10284 for (
auto *lhsProto : LHSInheritedProtocols) {
10285 bool match =
false;
10286 for (
auto *rhsProto : rhs->
quals()) {
10316 auto finish = [&](
bool succeeded) ->
bool {
10361 bool BlockReturnType) {
10365 auto finish = [&](
bool succeeded) ->
bool {
10390 if (
getLangOpts().CompatibilityQualifiedIdBlockParamTypeChecking)
10394 (!BlockReturnType &&
10398 (BlockReturnType ? LHSOPT : RHSOPT),
10399 (BlockReturnType ? RHSOPT : LHSOPT),
false));
10407 return finish(BlockReturnType);
10409 return finish(!BlockReturnType);
10421 return (*lhs)->getName().compare((*rhs)->getName());
10438 assert(LHS->
getInterface() &&
"LHS must have an interface base");
10439 assert(RHS->
getInterface() &&
"RHS must have an interface base");
10445 for (
auto *proto : LHS->
quals()) {
10456 for (
auto *proto : RHS->
quals()) {
10464 for (
auto *proto : LHSProtocolSet) {
10465 if (RHSProtocolSet.count(proto))
10466 IntersectionSet.push_back(proto);
10475 if (!ImpliedProtocols.empty()) {
10477 return ImpliedProtocols.contains(proto);
10482 llvm::array_pod_sort(IntersectionSet.begin(), IntersectionSet.end(),
10492 if (lhsOPT && rhsOPT)
10498 if (lhsBlock && rhsBlock)
10503 if ((lhsOPT && lhsOPT->isObjCIdType() && rhsBlock) ||
10515 bool stripKindOf) {
10516 if (lhsArgs.size() != rhsArgs.size())
10523 for (
unsigned i = 0, n = lhsArgs.size(); i != n; ++i) {
10529 if (!stripKindOf ||
10530 !ctx.
hasSameType(lhsArgs[i].stripObjCKindOfType(ctx),
10531 rhsArgs[i].stripObjCKindOfType(ctx))) {
10559 if (!LDecl || !RDecl)
10569 llvm::SmallDenseMap<const ObjCInterfaceDecl *, const ObjCObjectType *, 4>
10579 bool anyChanges =
false;
10597 if (!Protocols.empty())
10615 if (LHSSuperType.
isNull())
10625 if (KnownLHS != LHSAncestors.end()) {
10626 LHS = KnownLHS->second;
10630 bool anyChanges =
false;
10648 if (!Protocols.empty())
10665 if (RHSSuperType.
isNull())
10676 assert(LHS->
getInterface() &&
"LHS is not an interface type");
10677 assert(RHS->
getInterface() &&
"RHS is not an interface type");
10698 for (
auto *RHSPI : RHS->
quals())
10701 if (SuperClassInheritedProtocols.empty())
10704 for (
const auto *LHSProto : LHS->
quals()) {
10705 bool SuperImplementsProtocol =
false;
10706 for (
auto *SuperClassProto : SuperClassInheritedProtocols)
10707 if (SuperClassProto->lookupProtocolNamed(LHSProto->getIdentifier())) {
10708 SuperImplementsProtocol =
true;
10711 if (!SuperImplementsProtocol)
10741 if (!LHSOPT || !RHSOPT)
10759 bool CompareUnqualified) {
10778 bool OfBlockPointer,
10782 if (UD->
hasAttr<TransparentUnionAttr>()) {
10783 for (
const auto *I : UD->
fields()) {
10784 QualType ET = I->getType().getUnqualifiedType();
10798 bool OfBlockPointer,
10819 bool IsConditionalOperator) {
10822 const auto *lproto = dyn_cast<FunctionProtoType>(lbase);
10823 const auto *rproto = dyn_cast<FunctionProtoType>(rbase);
10824 bool allLTypes =
true;
10825 bool allRTypes =
true;
10829 if (OfBlockPointer) {
10831 QualType LHS = lbase->getReturnType();
10833 if (!UnqualifiedResult)
10835 retType =
mergeTypes(LHS, RHS,
true, UnqualifiedResult,
true);
10900 bool NoReturn = IsConditionalOperator
10910 std::optional<FunctionEffectSet> MergedFX;
10912 if (lproto && rproto) {
10913 assert((AllowCXX ||
10914 (!lproto->hasExceptionSpec() && !rproto->hasExceptionSpec())) &&
10915 "C++ shouldn't be here");
10917 if (lproto->getNumParams() != rproto->getNumParams())
10921 if (lproto->isVariadic() != rproto->isVariadic())
10924 if (lproto->getMethodQuals() != rproto->getMethodQuals())
10930 if (LHSFX != RHSFX) {
10931 if (IsConditionalOperator)
10940 if (*MergedFX != LHSFX)
10942 if (*MergedFX != RHSFX)
10947 bool canUseLeft, canUseRight;
10959 for (
unsigned i = 0, n = lproto->getNumParams(); i < n; i++) {
10960 QualType lParamType = lproto->getParamType(i).getUnqualifiedType();
10961 QualType rParamType = rproto->getParamType(i).getUnqualifiedType();
10963 lParamType, rParamType, OfBlockPointer,
Unqualified);
10970 types.push_back(paramType);
10982 if (allLTypes)
return lhs;
10983 if (allRTypes)
return rhs;
10988 newParamInfos.empty() ? nullptr : newParamInfos.data();
10994 if (lproto) allRTypes =
false;
10995 if (rproto) allLTypes =
false;
10999 assert((AllowCXX || !proto->
hasExceptionSpec()) &&
"C++ shouldn't be here");
11007 for (
unsigned i = 0, n = proto->
getNumParams(); i < n; ++i) {
11013 paramTy =
Enum->getDecl()->getIntegerType();
11023 if (allLTypes)
return lhs;
11024 if (allRTypes)
return rhs;
11033 if (allLTypes)
return lhs;
11034 if (allRTypes)
return rhs;
11040 QualType other,
bool isBlockReturnType) {
11046 if (underlyingType.
isNull())
11062 bool IsConditionalOperator) {
11073 if (LangOpts.OpenMP && LHSRefTy && RHSRefTy &&
11077 if (LHSRefTy || RHSRefTy)
11089 if (LHSCan == RHSCan)
11094 Qualifiers RQuals = RHSCan.getLocalQualifiers();
11095 if (LQuals != RQuals) {
11111 assert((GC_L != GC_R) &&
"unequal qualifier sets had only equal elements");
11132 if (LHSClass == Type::FunctionProto) LHSClass = Type::FunctionNoProto;
11133 if (RHSClass == Type::FunctionProto) RHSClass = Type::FunctionNoProto;
11136 if (LHSClass == Type::VariableArray || LHSClass == Type::IncompleteArray)
11137 LHSClass = Type::ConstantArray;
11138 if (RHSClass == Type::VariableArray || RHSClass == Type::IncompleteArray)
11139 RHSClass = Type::ConstantArray;
11142 if (LHSClass == Type::ObjCInterface) LHSClass = Type::ObjCObject;
11143 if (RHSClass == Type::ObjCInterface) RHSClass = Type::ObjCObject;
11146 if (LHSClass == Type::ExtVector) LHSClass = Type::Vector;
11147 if (RHSClass == Type::ExtVector) RHSClass = Type::Vector;
11150 if (LHSClass != RHSClass) {
11160 if (OfBlockPointer && !BlockReturnType) {
11169 if (!AT->isDeduced() && AT->isGNUAutoType())
11173 if (!AT->isDeduced() && AT->isGNUAutoType())
11180 switch (LHSClass) {
11181#define TYPE(Class, Base)
11182#define ABSTRACT_TYPE(Class, Base)
11183#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base) case Type::Class:
11184#define NON_CANONICAL_TYPE(Class, Base) case Type::Class:
11185#define DEPENDENT_TYPE(Class, Base) case Type::Class:
11186#include "clang/AST/TypeNodes.inc"
11187 llvm_unreachable(
"Non-canonical and dependent types shouldn't get here");
11190 case Type::DeducedTemplateSpecialization:
11191 case Type::LValueReference:
11192 case Type::RValueReference:
11193 case Type::MemberPointer:
11194 llvm_unreachable(
"C++ should never be in mergeTypes");
11196 case Type::ObjCInterface:
11197 case Type::IncompleteArray:
11198 case Type::VariableArray:
11199 case Type::FunctionProto:
11200 case Type::ExtVector:
11201 llvm_unreachable(
"Types are eliminated above");
11203 case Type::Pointer:
11214 if (ResultType.
isNull())
11222 case Type::BlockPointer:
11247 if (ResultType.
isNull())
11266 if (ResultType.
isNull())
11274 case Type::ConstantArray:
11289 if (ResultType.
isNull())
11297 if (LVAT || RVAT) {
11300 -> std::pair<bool,llvm::APInt> {
11302 std::optional<llvm::APSInt> TheInt;
11305 return std::make_pair(
true, *TheInt);
11306 return std::make_pair(
false, llvm::APSInt());
11309 return std::make_pair(
true, CAT->getSize());
11310 return std::make_pair(
false, llvm::APInt());
11313 bool HaveLSize, HaveRSize;
11314 llvm::APInt LSize, RSize;
11315 std::tie(HaveLSize, LSize) = SizeFetch(LVAT, LCAT);
11316 std::tie(HaveRSize, RSize) = SizeFetch(RVAT, RCAT);
11317 if (HaveLSize && HaveRSize && !llvm::APInt::isSameValue(LSize, RSize))
11351 case Type::FunctionNoProto:
11353 false, IsConditionalOperator);
11357 case Type::Builtin:
11360 case Type::Complex:
11369 case Type::ConstantMatrix:
11374 case Type::ObjCObject: {
11383 case Type::ObjCObjectPointer:
11384 if (OfBlockPointer) {
11396 assert(LHS != RHS &&
11397 "Equivalent pipe types should have already been handled!");
11399 case Type::ArrayParameter:
11400 assert(LHS != RHS &&
11401 "Equivalent ArrayParameter types should have already been handled!");
11403 case Type::BitInt: {
11411 if (LHSUnsigned != RHSUnsigned)
11414 if (LHSBits != RHSBits)
11420 llvm_unreachable(
"Invalid Type::Class!");
11425 bool &CanUseFirst,
bool &CanUseSecond,
11427 assert(NewParamInfos.empty() &&
"param info list not empty");
11428 CanUseFirst = CanUseSecond =
true;
11434 if (!FirstHasInfo && !SecondHasInfo)
11437 bool NeedParamInfo =
false;
11441 for (
size_t I = 0; I <
E; ++I) {
11452 bool FirstNoEscape = FirstParam.
isNoEscape();
11453 bool SecondNoEscape = SecondParam.
isNoEscape();
11454 bool IsNoEscape = FirstNoEscape && SecondNoEscape;
11456 if (NewParamInfos.back().getOpaqueValue())
11457 NeedParamInfo =
true;
11458 if (FirstNoEscape != IsNoEscape)
11459 CanUseFirst =
false;
11460 if (SecondNoEscape != IsNoEscape)
11461 CanUseSecond =
false;
11464 if (!NeedParamInfo)
11465 NewParamInfos.clear();
11471 ObjCLayouts[CD] =
nullptr;
11481 if (LHSCan == RHSCan)
11483 if (RHSCan->isFunctionType()) {
11487 cast<FunctionType>(RHSCan.getTypePtr())->getReturnType();
11489 cast<FunctionType>(LHSCan.
getTypePtr())->getReturnType();
11492 if (ResReturnType.
isNull())
11494 if (ResReturnType == NewReturnType || ResReturnType == OldReturnType) {
11498 if (
const auto *FPT = cast<FunctionProtoType>(F)) {
11511 Qualifiers RQuals = RHSCan.getLocalQualifiers();
11512 if (LQuals != RQuals) {
11525 assert((GC_L != GC_R) &&
"unequal qualifier sets had only equal elements");
11541 if (ResQT == LHSBaseQT)
11543 if (ResQT == RHSBaseQT)
11555 T = ET->getDecl()->getIntegerType();
11559 return EIT->getNumBits();
11567 "Unexpected type");
11572 VTy->getNumElements(), VTy->getVectorKind());
11581 T = ETy->getDecl()->getIntegerType();
11584 case BuiltinType::Char_U:
11586 case BuiltinType::Char_S:
11587 case BuiltinType::SChar:
11588 case BuiltinType::Char8:
11590 case BuiltinType::Short:
11592 case BuiltinType::Int:
11594 case BuiltinType::Long:
11596 case BuiltinType::LongLong:
11598 case BuiltinType::Int128:
11603 case BuiltinType::WChar_S:
11606 case BuiltinType::ShortAccum:
11608 case BuiltinType::Accum:
11610 case BuiltinType::LongAccum:
11612 case BuiltinType::SatShortAccum:
11614 case BuiltinType::SatAccum:
11616 case BuiltinType::SatLongAccum:
11618 case BuiltinType::ShortFract:
11620 case BuiltinType::Fract:
11622 case BuiltinType::LongFract:
11624 case BuiltinType::SatShortFract:
11626 case BuiltinType::SatFract:
11628 case BuiltinType::SatLongFract:
11633 "Unexpected signed integer or fixed point type");
11641 "Unexpected type");
11646 VTy->getNumElements(), VTy->getVectorKind());
11655 T = ETy->getDecl()->getIntegerType();
11658 case BuiltinType::Char_S:
11660 case BuiltinType::Char_U:
11661 case BuiltinType::UChar:
11662 case BuiltinType::Char8:
11664 case BuiltinType::UShort:
11666 case BuiltinType::UInt:
11668 case BuiltinType::ULong:
11670 case BuiltinType::ULongLong:
11672 case BuiltinType::UInt128:
11677 case BuiltinType::WChar_U:
11680 case BuiltinType::UShortAccum:
11682 case BuiltinType::UAccum:
11684 case BuiltinType::ULongAccum:
11686 case BuiltinType::SatUShortAccum:
11688 case BuiltinType::SatUAccum:
11690 case BuiltinType::SatULongAccum:
11692 case BuiltinType::UShortFract:
11694 case BuiltinType::UFract:
11696 case BuiltinType::ULongFract:
11698 case BuiltinType::SatUShortFract:
11700 case BuiltinType::SatUFract:
11702 case BuiltinType::SatULongFract:
11707 "Unexpected signed integer or fixed point type");
11732 bool AllowTypeModifiers) {
11736 RequiresICE =
false;
11741 bool IsSpecial =
false;
11745 default: Done =
true; --Str;
break;
11747 RequiresICE =
true;
11750 assert(!
Unsigned &&
"Can't use both 'S' and 'U' modifiers!");
11751 assert(!
Signed &&
"Can't use 'S' modifier multiple times!");
11755 assert(!
Signed &&
"Can't use both 'S' and 'U' modifiers!");
11756 assert(!
Unsigned &&
"Can't use 'U' modifier multiple times!");
11760 assert(!IsSpecial &&
"Can't use 'L' with 'W', 'N', 'Z' or 'O' modifiers");
11761 assert(HowLong <= 2 &&
"Can't have LLLL modifier");
11766 assert(!IsSpecial &&
"Can't use two 'N', 'W', 'Z' or 'O' modifiers!");
11767 assert(HowLong == 0 &&
"Can't use both 'L' and 'N' modifiers!");
11776 assert(!IsSpecial &&
"Can't use two 'N', 'W', 'Z' or 'O' modifiers!");
11777 assert(HowLong == 0 &&
"Can't use both 'L' and 'W' modifiers!");
11783 llvm_unreachable(
"Unexpected integer type");
11794 assert(!IsSpecial &&
"Can't use two 'N', 'W', 'Z' or 'O' modifiers!");
11795 assert(HowLong == 0 &&
"Can't use both 'L' and 'Z' modifiers!");
11801 llvm_unreachable(
"Unexpected integer type");
11814 assert(!IsSpecial &&
"Can't use two 'N', 'W', 'Z' or 'O' modifiers!");
11815 assert(HowLong == 0 &&
"Can't use both 'L' and 'O' modifiers!");
11831 default: llvm_unreachable(
"Unknown builtin type letter!");
11834 "Bad modifiers used with 'x'!");
11839 "Bad modifiers used with 'y'!");
11844 "Bad modifiers used with 'v'!");
11849 "Bad modifiers used with 'h'!");
11854 "Bad modifiers used with 'f'!");
11859 "Bad modifiers used with 'd'!");
11862 else if (HowLong == 2)
11868 assert(HowLong == 0 &&
"Bad modifiers used with 's'!");
11877 else if (HowLong == 2)
11879 else if (HowLong == 1)
11885 assert(HowLong == 0 &&
"Bad modifiers used with 'c'!");
11894 assert(HowLong == 0 && !
Signed && !
Unsigned &&
"Bad modifiers for 'b'!");
11898 assert(HowLong == 0 && !
Signed && !
Unsigned &&
"Bad modifiers for 'z'!");
11902 assert(HowLong == 0 && !
Signed && !
Unsigned &&
"Bad modifiers for 'w'!");
11919 assert(!
Type.isNull() &&
"builtin va list type not initialized!");
11931 assert(!
Type.isNull() &&
"builtin va list type not initialized!");
11939 unsigned NumElements = strtoul(Str, &End, 10);
11940 assert(End != Str &&
"Missing vector size");
11944 RequiresICE,
false);
11945 assert(!RequiresICE &&
"Can't require vector ICE");
11953 Type = Context.SveCountTy;
11957 Type = Context.AMDGPUBufferRsrcTy;
11961 llvm_unreachable(
"Unexpected target builtin type");
11967 unsigned NumElements = strtoul(Str, &End, 10);
11968 assert(End != Str &&
"Missing vector size");
11972 RequiresICE,
false);
11973 assert(!RequiresICE &&
"Can't require vector ICE");
11982 unsigned NumElements = strtoul(Str, &End, 10);
11983 assert(End != Str &&
"Missing vector size");
11995 assert(!RequiresICE &&
"Can't require complex ICE");
12004 if (
Type.isNull()) {
12015 if (
Type.isNull()) {
12021 assert(HowLong == 0 && !
Signed && !
Unsigned &&
"Bad modifiers for 'K'!");
12024 if (
Type.isNull()) {
12035 Done = !AllowTypeModifiers;
12037 switch (
char c = *Str++) {
12038 default: Done =
true; --Str;
break;
12044 unsigned AddrSpace = strtoul(Str, &End, 10);
12072 "Integer constant 'I' type must be an integer");
12085 bool AllowTypeModifiers)
const {
12092 unsigned *IntegerConstantArgs)
const {
12094 if (TypeStr[0] ==
'\0') {
12101 bool RequiresICE =
false;
12104 RequiresICE,
true);
12108 assert(!RequiresICE &&
"Result of intrinsic cannot be required to be an ICE");
12110 while (TypeStr[0] && TypeStr[0] !=
'.') {
12117 if (RequiresICE && IntegerConstantArgs)
12118 *IntegerConstantArgs |= 1 << ArgTypes.size();
12124 ArgTypes.push_back(Ty);
12127 if (
Id == Builtin::BI__GetExceptionInfo)
12130 assert((TypeStr[0] !=
'.' || TypeStr[1] == 0) &&
12131 "'.' should only occur at end of builtin type list!");
12133 bool Variadic = (TypeStr[0] ==
'.');
12136 Variadic,
false,
true));
12141 if (ArgTypes.empty() && Variadic && !
getLangOpts().requiresStrictPrototypes())
12193 !FD->
hasAttr<DLLExportAttr>()) ||
12194 FD->
hasAttr<GNUInlineAttr>()) {
12213 isa<CXXConstructorDecl>(FD) &&
12214 cast<CXXConstructorDecl>(FD)->isInheritingConstructor())
12227 if (
D->
hasAttr<DLLImportAttr>()) {
12230 }
else if (
D->
hasAttr<DLLExportAttr>()) {
12236 if (
D->
hasAttr<CUDAGlobalAttr>() &&
12299 while (LexicalContext && !isa<FunctionDecl>(LexicalContext))
12304 if (!LexicalContext)
12309 auto StaticLocalLinkage =
12321 return StaticLocalLinkage;
12348 return StrongLinkage;
12366 llvm_unreachable(
"Invalid Linkage!");
12376 if (
const auto *VD = dyn_cast<VarDecl>(
D)) {
12377 if (!VD->isFileVarDecl())
12382 if (VD->getDescribedVarTemplate() ||
12383 isa<VarTemplatePartialSpecializationDecl>(VD))
12385 }
else if (
const auto *FD = dyn_cast<FunctionDecl>(
D)) {
12389 }
else if (isa<PragmaCommentDecl>(
D))
12391 else if (isa<PragmaDetectMismatchDecl>(
D))
12393 else if (isa<OMPRequiresDecl>(
D))
12395 else if (isa<OMPThreadPrivateDecl>(
D))
12397 else if (isa<OMPAllocateDecl>(
D))
12399 else if (isa<OMPDeclareReductionDecl>(
D) || isa<OMPDeclareMapperDecl>(
D))
12401 else if (isa<ImportDecl>(
D))
12418 if (
const auto *FD = dyn_cast<FunctionDecl>(
D)) {
12420 if (!FD->doesThisDeclarationHaveABody())
12421 return FD->doesDeclarationForceExternallyVisibleDefinition();
12424 if (FD->
hasAttr<ConstructorAttr>() || FD->
hasAttr<DestructorAttr>())
12429 if (
getTargetInfo().getCXXABI().canKeyFunctionBeInline()) {
12430 if (
const auto *MD = dyn_cast<CXXMethodDecl>(FD)) {
12448 const auto *VD = cast<VarDecl>(
D);
12449 assert(VD->isFileVarDecl() &&
"Expected file scoped var");
12453 if (LangOpts.OpenMP &&
12454 OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(VD))
12461 if (VD->shouldEmitInExternalSource())
12474 if (VD->needsDestruction(*
this))
12478 if (VD->getInit() && VD->getInit()->HasSideEffects(*
this) &&
12480 (VD->getInit()->isValueDependent() || !VD->evaluateValue()))
12485 if (
const auto *DD = dyn_cast<DecompositionDecl>(VD))
12486 for (
const auto *BD : DD->bindings())
12487 if (
const auto *BindingVD = BD->getHoldingVar())
12496 llvm::function_ref<
void(
FunctionDecl *)> Pred)
const {
12497 assert(FD->
isMultiVersion() &&
"Only valid for multiversioned functions");
12498 llvm::SmallDenseSet<const FunctionDecl*, 4> SeenDecls;
12503 for (
auto *CurDecl :
12507 !SeenDecls.contains(CurFD)) {
12508 SeenDecls.insert(CurFD);
12516 bool IsBuiltin)
const {
12519 return ABI->getDefaultMethodCallConv(IsVariadic);
12524 switch (LangOpts.getDefaultCallingConv()) {
12553 return Target->getDefaultCallingConv();
12558 return ABI->isNearlyEmpty(RD);
12562 if (!VTContext.get()) {
12563 auto ABI =
Target->getCXXABI();
12564 if (ABI.isMicrosoft())
12567 auto ComponentLayout =
getLangOpts().RelativeCXXABIVTables
12573 return VTContext.get();
12579 switch (
T->getCXXABI().getKind()) {
12580 case TargetCXXABI::AppleARM64:
12581 case TargetCXXABI::Fuchsia:
12582 case TargetCXXABI::GenericAArch64:
12583 case TargetCXXABI::GenericItanium:
12584 case TargetCXXABI::GenericARM:
12585 case TargetCXXABI::GenericMIPS:
12586 case TargetCXXABI::iOS:
12587 case TargetCXXABI::WebAssembly:
12588 case TargetCXXABI::WatchOS:
12589 case TargetCXXABI::XL:
12591 case TargetCXXABI::Microsoft:
12594 llvm_unreachable(
"Unsupported ABI");
12598 assert(
T.getCXXABI().getKind() != TargetCXXABI::Microsoft &&
12599 "Device mangle context does not support Microsoft mangling.");
12600 switch (
T.getCXXABI().getKind()) {
12601 case TargetCXXABI::AppleARM64:
12602 case TargetCXXABI::Fuchsia:
12603 case TargetCXXABI::GenericAArch64:
12604 case TargetCXXABI::GenericItanium:
12605 case TargetCXXABI::GenericARM:
12606 case TargetCXXABI::GenericMIPS:
12607 case TargetCXXABI::iOS:
12608 case TargetCXXABI::WebAssembly:
12609 case TargetCXXABI::WatchOS:
12610 case TargetCXXABI::XL:
12614 if (
const auto *RD = dyn_cast<CXXRecordDecl>(ND))
12615 return RD->getDeviceLambdaManglingNumber();
12616 return std::nullopt;
12619 case TargetCXXABI::Microsoft:
12623 llvm_unreachable(
"Unsupported ABI");
12629 return ASTRecordLayouts.getMemorySize() +
12630 llvm::capacity_in_bytes(ObjCLayouts) +
12631 llvm::capacity_in_bytes(KeyFunctions) +
12632 llvm::capacity_in_bytes(ObjCImpls) +
12633 llvm::capacity_in_bytes(BlockVarCopyInits) +
12634 llvm::capacity_in_bytes(DeclAttrs) +
12635 llvm::capacity_in_bytes(TemplateOrInstantiation) +
12636 llvm::capacity_in_bytes(InstantiatedFromUsingDecl) +
12637 llvm::capacity_in_bytes(InstantiatedFromUsingShadowDecl) +
12638 llvm::capacity_in_bytes(InstantiatedFromUnnamedFieldDecl) +
12639 llvm::capacity_in_bytes(OverriddenMethods) +
12640 llvm::capacity_in_bytes(Types) +
12641 llvm::capacity_in_bytes(VariableArrayTypes);
12649 unsigned Signed)
const {
12652 if (!QualTy && DestWidth == 128)
12681 llvm_unreachable(
"Unhandled TargetInfo::RealType value");
12688 MangleNumbers[ND] = Number;
12695 bool ForAuxTarget)
const {
12696 auto I = MangleNumbers.find(ND);
12697 unsigned Res = I != MangleNumbers.end() ? I->second : 1;
12700 if (LangOpts.CUDA && !LangOpts.CUDAIsDevice) {
12701 Res = ForAuxTarget ? Res >> 16 : Res & 0xFFFF;
12703 assert(!ForAuxTarget &&
"Only CUDA/HIP host compilation supports mangling "
12704 "number for aux target");
12706 return Res > 1 ? Res : 1;
12713 StaticLocalNumbers[VD] = Number;
12720 auto I = StaticLocalNumbers.find(VD);
12721 return I != StaticLocalNumbers.end() ? I->second : 1;
12726 assert(LangOpts.CPlusPlus);
12727 std::unique_ptr<MangleNumberingContext> &MCtx = MangleNumberingContexts[DC];
12735 assert(LangOpts.CPlusPlus);
12736 std::unique_ptr<MangleNumberingContext> &MCtx =
12737 ExtraMangleNumberingContexts[
D];
12743std::unique_ptr<MangleNumberingContext>
12745 return ABI->createMangleNumberingContext();
12750 return ABI->getCopyConstructorForExceptionObject(
12756 return ABI->addCopyConstructorForExceptionObject(
12763 return ABI->addTypedefNameForUnnamedTagDecl(TD, DD);
12768 return ABI->getTypedefNameForUnnamedTagDecl(TD);
12773 return ABI->addDeclaratorForUnnamedTagDecl(TD, DD);
12777 return ABI->getDeclaratorForUnnamedTagDecl(TD);
12781 ParamIndices[
D] = index;
12785 ParameterIndexTable::const_iterator I = ParamIndices.find(
D);
12786 assert(I != ParamIndices.end() &&
12787 "ParmIndices lacks entry set by ParmVarDecl");
12792 unsigned Length)
const {
12818 assert(
MSGuidTagDecl &&
"building MS GUID without MS extensions?");
12820 llvm::FoldingSetNodeID ID;
12824 if (
MSGuidDecl *Existing = MSGuidDecls.FindNodeOrInsertPos(ID, InsertPos))
12828 MSGuidDecl *New = MSGuidDecl::Create(*
this, GUIDType, Parts);
12829 MSGuidDecls.InsertNode(New, InsertPos);
12835 const APValue &APVal)
const {
12836 llvm::FoldingSetNodeID ID;
12841 UnnamedGlobalConstantDecls.FindNodeOrInsertPos(ID, InsertPos))
12845 UnnamedGlobalConstantDecl::Create(*
this, Ty, APVal);
12846 UnnamedGlobalConstantDecls.InsertNode(New, InsertPos);
12852 assert(
T->
isRecordType() &&
"template param object of unexpected type");
12858 llvm::FoldingSetNodeID ID;
12863 TemplateParamObjectDecls.FindNodeOrInsertPos(ID, InsertPos))
12867 TemplateParamObjectDecls.InsertNode(New, InsertPos);
12873 if (!
T.isOSDarwin())
12876 if (!(
T.isiOS() &&
T.isOSVersionLT(7)) &&
12877 !(
T.isMacOSX() &&
T.isOSVersionLT(10, 9)))
12886 return (Size != Align ||
toBits(sizeChars) > MaxInlineWidthInBits);
12893 if (MethodDecl->
hasAttr<UnavailableAttr>()
12894 || MethodDecl->
hasAttr<DeprecatedAttr>())
12908 IM != EM && IF != EF; ++IM, ++IF) {
12939 llvm::FoldingSetNodeID IDX, IDY;
12940 X->Profile(IDX, *
this,
true);
12941 Y->
Profile(IDY, *
this,
true);
12955 for (
const Decl *DX :
X->redecls()) {
12960 if (DX->isFirstDecl())
12963 llvm_unreachable(
"Corrupt redecls chain");
12966template <
class T, std::enable_if_t<std::is_base_of_v<Decl, T>,
bool> = true>
12968 return cast_or_null<T>(
12970 const_cast<Decl *
>(cast_or_null<Decl>(Y))));
12973template <
class T, std::enable_if_t<std::is_base_of_v<Decl, T>,
bool> = true>
12976 const_cast<Decl *
>(cast<Decl>(Y))));
13002 assert(Xs.size() == Ys.size());
13004 for (
size_t I = 0; I < Rs.size(); ++I)
13011 return X->getAttributeLoc() == Y->getAttributeLoc() ?
X->getAttributeLoc()
13021 switch (
X.getKind()) {
13051 auto NExpX =
X.getNumTemplateExpansions();
13065 if (Xs.size() != Ys.size())
13067 R.resize(Xs.size());
13068 for (
size_t I = 0; I < R.size(); ++I) {
13081 assert(!Different);
13088 return X->getKeyword() == Y->getKeyword() ?
X->getKeyword()
13096 return X->getQualifier() == Y->getQualifier()
13097 ?
X->getQualifier()
13110 QualType EX =
X->getElementType(), EY = Y->getElementType();
13115 QY += EY.getQualifiers() - RQ;
13125 assert(Ctx.
hasSameExpr(
X->getSizeExpr(), Y->getSizeExpr()));
13126 return X->getSizeExpr();
13131 return X->getSizeModifier();
13137 return X->getIndexTypeCVRQualifiers();
13146 llvm::DenseMap<QualType, unsigned>
Found;
13147 for (
auto Ts : {
X, Y}) {
13154 Out.emplace_back(
T);
13164 bool AcceptDependent) {
13190 assert(AcceptDependent &&
13191 "computing composite pointer type of dependent types");
13206 llvm_unreachable(
"These ESTs should be handled above");
13211 assert(EST2 ==
EST_Dynamic &&
"other cases should already be handled");
13215 Result.Exceptions = ExceptionTypeStorage;
13222 llvm_unreachable(
"shouldn't see unresolved exception specifications here");
13225 llvm_unreachable(
"invalid ExceptionSpecificationType");
13234#define UNEXPECTED_TYPE(Class, Kind) \
13235 case Type::Class: \
13236 llvm_unreachable("Unexpected " Kind ": " #Class);
13238#define NON_CANONICAL_TYPE(Class, Base) UNEXPECTED_TYPE(Class, "non-canonical")
13239#define TYPE(Class, Base)
13240#include "clang/AST/TypeNodes.inc"
13242#define SUGAR_FREE_TYPE(Class) UNEXPECTED_TYPE(Class, "sugar-free")
13252#undef SUGAR_FREE_TYPE
13253#define NON_UNIQUE_TYPE(Class) UNEXPECTED_TYPE(Class, "non-unique")
13256#undef NON_UNIQUE_TYPE
13260#undef UNEXPECTED_TYPE
13263 const auto *AX = cast<AutoType>(
X), *AY = cast<AutoType>(Y);
13264 assert(AX->getDeducedType().isNull());
13265 assert(AY->getDeducedType().isNull());
13266 assert(AX->getKeyword() == AY->getKeyword());
13267 assert(AX->isInstantiationDependentType() ==
13268 AY->isInstantiationDependentType());
13270 AY->getTypeConstraintArguments());
13273 AX->containsUnexpandedParameterPack(),
13275 AY->getTypeConstraintConcept()),
13278 case Type::IncompleteArray: {
13279 const auto *AX = cast<IncompleteArrayType>(
X),
13280 *AY = cast<IncompleteArrayType>(Y);
13285 case Type::DependentSizedArray: {
13286 const auto *AX = cast<DependentSizedArrayType>(
X),
13287 *AY = cast<DependentSizedArrayType>(Y);
13292 AX->getBracketsRange() == AY->getBracketsRange()
13293 ? AX->getBracketsRange()
13296 case Type::ConstantArray: {
13297 const auto *AX = cast<ConstantArrayType>(
X),
13298 *AY = cast<ConstantArrayType>(Y);
13299 assert(AX->getSize() == AY->getSize());
13300 const Expr *SizeExpr = Ctx.
hasSameExpr(AX->getSizeExpr(), AY->getSizeExpr())
13301 ? AX->getSizeExpr()
13307 case Type::ArrayParameter: {
13308 const auto *AX = cast<ArrayParameterType>(
X),
13309 *AY = cast<ArrayParameterType>(Y);
13310 assert(AX->getSize() == AY->getSize());
13311 const Expr *SizeExpr = Ctx.
hasSameExpr(AX->getSizeExpr(), AY->getSizeExpr())
13312 ? AX->getSizeExpr()
13319 case Type::Atomic: {
13320 const auto *AX = cast<AtomicType>(
X), *AY = cast<AtomicType>(Y);
13324 case Type::Complex: {
13325 const auto *CX = cast<ComplexType>(
X), *CY = cast<ComplexType>(Y);
13328 case Type::Pointer: {
13329 const auto *PX = cast<PointerType>(
X), *PY = cast<PointerType>(Y);
13332 case Type::BlockPointer: {
13333 const auto *PX = cast<BlockPointerType>(
X), *PY = cast<BlockPointerType>(Y);
13336 case Type::ObjCObjectPointer: {
13337 const auto *PX = cast<ObjCObjectPointerType>(
X),
13338 *PY = cast<ObjCObjectPointerType>(Y);
13341 case Type::MemberPointer: {
13342 const auto *PX = cast<MemberPointerType>(
X),
13343 *PY = cast<MemberPointerType>(Y);
13350 case Type::LValueReference: {
13351 const auto *PX = cast<LValueReferenceType>(
X),
13352 *PY = cast<LValueReferenceType>(Y);
13355 PX->isSpelledAsLValue() ||
13356 PY->isSpelledAsLValue());
13358 case Type::RValueReference: {
13359 const auto *PX = cast<RValueReferenceType>(
X),
13360 *PY = cast<RValueReferenceType>(Y);
13364 case Type::DependentAddressSpace: {
13365 const auto *PX = cast<DependentAddressSpaceType>(
X),
13366 *PY = cast<DependentAddressSpaceType>(Y);
13367 assert(Ctx.
hasSameExpr(PX->getAddrSpaceExpr(), PY->getAddrSpaceExpr()));
13369 PX->getAddrSpaceExpr(),
13372 case Type::FunctionNoProto: {
13373 const auto *FX = cast<FunctionNoProtoType>(
X),
13374 *FY = cast<FunctionNoProtoType>(Y);
13375 assert(FX->getExtInfo() == FY->getExtInfo());
13380 case Type::FunctionProto: {
13381 const auto *FX = cast<FunctionProtoType>(
X),
13382 *FY = cast<FunctionProtoType>(Y);
13384 EPIY = FY->getExtProtoInfo();
13385 assert(EPIX.
ExtInfo == EPIY.ExtInfo);
13388 assert(EPIX.
TypeQuals == EPIY.TypeQuals);
13389 assert(EPIX.
Variadic == EPIY.Variadic);
13406 case Type::ObjCObject: {
13407 const auto *OX = cast<ObjCObjectType>(
X), *OY = cast<ObjCObjectType>(Y);
13409 std::equal(OX->getProtocols().begin(), OX->getProtocols().end(),
13410 OY->getProtocols().begin(), OY->getProtocols().end(),
13412 return P0->getCanonicalDecl() == P1->getCanonicalDecl();
13414 "protocol lists must be the same");
13416 OY->getTypeArgsAsWritten());
13419 OX->getProtocols(),
13420 OX->isKindOfTypeAsWritten() && OY->isKindOfTypeAsWritten());
13422 case Type::ConstantMatrix: {
13423 const auto *MX = cast<ConstantMatrixType>(
X),
13424 *MY = cast<ConstantMatrixType>(Y);
13425 assert(MX->getNumRows() == MY->getNumRows());
13426 assert(MX->getNumColumns() == MY->getNumColumns());
13428 MX->getNumRows(), MX->getNumColumns());
13430 case Type::DependentSizedMatrix: {
13431 const auto *MX = cast<DependentSizedMatrixType>(
X),
13432 *MY = cast<DependentSizedMatrixType>(Y);
13433 assert(Ctx.
hasSameExpr(MX->getRowExpr(), MY->getRowExpr()));
13434 assert(Ctx.
hasSameExpr(MX->getColumnExpr(), MY->getColumnExpr()));
13439 case Type::Vector: {
13440 const auto *VX = cast<VectorType>(
X), *VY = cast<VectorType>(Y);
13441 assert(VX->getNumElements() == VY->getNumElements());
13442 assert(VX->getVectorKind() == VY->getVectorKind());
13444 VX->getNumElements(), VX->getVectorKind());
13446 case Type::ExtVector: {
13447 const auto *VX = cast<ExtVectorType>(
X), *VY = cast<ExtVectorType>(Y);
13448 assert(VX->getNumElements() == VY->getNumElements());
13450 VX->getNumElements());
13452 case Type::DependentSizedExtVector: {
13453 const auto *VX = cast<DependentSizedExtVectorType>(
X),
13454 *VY = cast<DependentSizedExtVectorType>(Y);
13459 case Type::DependentVector: {
13460 const auto *VX = cast<DependentVectorType>(
X),
13461 *VY = cast<DependentVectorType>(Y);
13462 assert(VX->getVectorKind() == VY->getVectorKind());
13467 case Type::InjectedClassName: {
13468 const auto *IX = cast<InjectedClassNameType>(
X),
13469 *IY = cast<InjectedClassNameType>(Y);
13473 IY->getInjectedSpecializationType()));
13475 case Type::TemplateSpecialization: {
13476 const auto *TX = cast<TemplateSpecializationType>(
X),
13477 *TY = cast<TemplateSpecializationType>(Y);
13479 TY->template_arguments());
13482 TY->getTemplateName()),
13483 As,
X->getCanonicalTypeInternal());
13485 case Type::Decltype: {
13486 const auto *DX = cast<DecltypeType>(
X);
13487 [[maybe_unused]]
const auto *DY = cast<DecltypeType>(Y);
13488 assert(DX->isDependentType());
13489 assert(DY->isDependentType());
13490 assert(Ctx.
hasSameExpr(DX->getUnderlyingExpr(), DY->getUnderlyingExpr()));
13494 case Type::PackIndexing: {
13495 const auto *DX = cast<PackIndexingType>(
X);
13496 [[maybe_unused]]
const auto *DY = cast<PackIndexingType>(Y);
13497 assert(DX->isDependentType());
13498 assert(DY->isDependentType());
13499 assert(Ctx.
hasSameExpr(DX->getIndexExpr(), DY->getIndexExpr()));
13502 case Type::DependentName: {
13503 const auto *NX = cast<DependentNameType>(
X),
13504 *NY = cast<DependentNameType>(Y);
13505 assert(NX->getIdentifier() == NY->getIdentifier());
13508 NX->getIdentifier(), NX->getCanonicalTypeInternal());
13510 case Type::DependentTemplateSpecialization: {
13511 const auto *TX = cast<DependentTemplateSpecializationType>(
X),
13512 *TY = cast<DependentTemplateSpecializationType>(Y);
13513 assert(TX->getIdentifier() == TY->getIdentifier());
13515 TY->template_arguments());
13518 TX->getIdentifier(), As);
13520 case Type::UnaryTransform: {
13521 const auto *TX = cast<UnaryTransformType>(
X),
13522 *TY = cast<UnaryTransformType>(Y);
13523 assert(TX->getUTTKind() == TY->getUTTKind());
13527 TY->getUnderlyingType()),
13530 case Type::PackExpansion: {
13531 const auto *PX = cast<PackExpansionType>(
X),
13532 *PY = cast<PackExpansionType>(Y);
13533 assert(PX->getNumExpansions() == PY->getNumExpansions());
13536 PX->getNumExpansions(),
false);
13539 const auto *PX = cast<PipeType>(
X), *PY = cast<PipeType>(Y);
13540 assert(PX->isReadOnly() == PY->isReadOnly());
13545 case Type::TemplateTypeParm: {
13546 const auto *TX = cast<TemplateTypeParmType>(
X),
13547 *TY = cast<TemplateTypeParmType>(Y);
13548 assert(TX->getDepth() == TY->getDepth());
13549 assert(TX->getIndex() == TY->getIndex());
13550 assert(TX->isParameterPack() == TY->isParameterPack());
13552 TX->getDepth(), TX->getIndex(), TX->isParameterPack(),
13556 llvm_unreachable(
"Unknown Type Class");
13566#define UNEXPECTED_TYPE(Class, Kind) \
13567 case Type::Class: \
13568 llvm_unreachable("Unexpected " Kind ": " #Class);
13569#define TYPE(Class, Base)
13570#define DEPENDENT_TYPE(Class, Base) UNEXPECTED_TYPE(Class, "dependent")
13571#include "clang/AST/TypeNodes.inc"
13573#define CANONICAL_TYPE(Class) UNEXPECTED_TYPE(Class, "canonical")
13598#undef CANONICAL_TYPE
13600#undef UNEXPECTED_TYPE
13602 case Type::Adjusted: {
13603 const auto *AX = cast<AdjustedType>(
X), *AY = cast<AdjustedType>(Y);
13604 QualType OX = AX->getOriginalType(), OY = AY->getOriginalType();
13611 case Type::Decayed: {
13612 const auto *DX = cast<DecayedType>(
X), *DY = cast<DecayedType>(Y);
13613 QualType OX = DX->getOriginalType(), OY = DY->getOriginalType();
13620 case Type::Attributed: {
13621 const auto *AX = cast<AttributedType>(
X), *AY = cast<AttributedType>(Y);
13623 if (Kind != AY->getAttrKind())
13625 QualType MX = AX->getModifiedType(), MY = AY->getModifiedType();
13632 case Type::BTFTagAttributed: {
13633 const auto *BX = cast<BTFTagAttributedType>(
X);
13634 const BTFTypeTagAttr *AX = BX->getAttr();
13636 if (AX->getBTFTypeTag() !=
13637 cast<BTFTagAttributedType>(Y)->getAttr()->getBTFTypeTag())
13642 const auto *AX = cast<AutoType>(
X), *AY = cast<AutoType>(Y);
13645 if (KW != AY->getKeyword())
13649 AY->getTypeConstraintConcept());
13653 AY->getTypeConstraintArguments())) {
13661 false,
false, CD, As);
13663 case Type::PackIndexing:
13664 case Type::Decltype:
13666 case Type::DeducedTemplateSpecialization:
13670 case Type::Elaborated: {
13671 const auto *EX = cast<ElaboratedType>(
X), *EY = cast<ElaboratedType>(Y);
13677 case Type::MacroQualified: {
13678 const auto *MX = cast<MacroQualifiedType>(
X),
13679 *MY = cast<MacroQualifiedType>(Y);
13681 if (IX != MY->getMacroIdentifier())
13685 case Type::SubstTemplateTypeParm: {
13686 const auto *SX = cast<SubstTemplateTypeParmType>(
X),
13687 *SY = cast<SubstTemplateTypeParmType>(Y);
13692 unsigned Index = SX->getIndex();
13693 if (Index != SY->getIndex())
13695 auto PackIndex = SX->getPackIndex();
13696 if (PackIndex != SY->getPackIndex())
13699 CD, Index, PackIndex);
13701 case Type::ObjCTypeParam:
13707 case Type::TemplateSpecialization: {
13708 const auto *TX = cast<TemplateSpecializationType>(
X),
13709 *TY = cast<TemplateSpecializationType>(Y);
13711 TY->getTemplateName());
13716 TY->template_arguments()))
13721 case Type::Typedef: {
13722 const auto *TX = cast<TypedefType>(
X), *TY = cast<TypedefType>(Y);
13728 case Type::TypeOf: {
13734 if (cast<TypeOfType>(
X)->
getKind() == cast<TypeOfType>(Y)->
getKind() &&
13739 case Type::TypeOfExpr:
13742 case Type::UnaryTransform: {
13743 const auto *UX = cast<UnaryTransformType>(
X),
13744 *UY = cast<UnaryTransformType>(Y);
13746 if (KX != UY->getUTTKind())
13748 QualType BX = UX->getBaseType(), BY = UY->getBaseType();
13755 case Type::Using: {
13756 const auto *UX = cast<UsingType>(
X), *UY = cast<UsingType>(Y);
13763 case Type::CountAttributed: {
13764 const auto *DX = cast<CountAttributedType>(
X),
13765 *DY = cast<CountAttributedType>(Y);
13766 if (DX->isCountInBytes() != DY->isCountInBytes())
13768 if (DX->isOrNull() != DY->isOrNull())
13770 Expr *CEX = DX->getCountExpr();
13771 Expr *CEY = DY->getCountExpr();
13775 DX->isCountInBytes(), DX->isOrNull(),
13786 DX->isCountInBytes(), DX->isOrNull(),
13790 llvm_unreachable(
"Unhandled Type Class");
13812 if (
X.isCanonical())
13825 if (SX.
Ty != SY.Ty) {
13833 while (!Xs.empty() && !Ys.empty() && Xs.back().Ty == Ys.back().Ty) {
13836 SX = Xs.pop_back_val();
13837 SY = Ys.pop_back_val();
13847 while (!Xs.empty() && !Ys.empty()) {
13850 SX = Xs.pop_back_val();
13851 SY = Ys.pop_back_val();
13856 SX.
Ty = Underlying.Ty;
13859 QX -= Underlying.Quals;
13877 llvm_unreachable(
"Not a saturated fixed point type!");
13878 case BuiltinType::SatShortAccum:
13880 case BuiltinType::SatAccum:
13882 case BuiltinType::SatLongAccum:
13884 case BuiltinType::SatUShortAccum:
13886 case BuiltinType::SatUAccum:
13888 case BuiltinType::SatULongAccum:
13890 case BuiltinType::SatShortFract:
13892 case BuiltinType::SatFract:
13894 case BuiltinType::SatLongFract:
13896 case BuiltinType::SatUShortFract:
13898 case BuiltinType::SatUFract:
13900 case BuiltinType::SatULongFract:
13912 llvm_unreachable(
"Not a fixed point type!");
13913 case BuiltinType::ShortAccum:
13915 case BuiltinType::Accum:
13917 case BuiltinType::LongAccum:
13919 case BuiltinType::UShortAccum:
13921 case BuiltinType::UAccum:
13923 case BuiltinType::ULongAccum:
13925 case BuiltinType::ShortFract:
13927 case BuiltinType::Fract:
13929 case BuiltinType::LongFract:
13931 case BuiltinType::UShortFract:
13933 case BuiltinType::UFract:
13935 case BuiltinType::ULongFract:
13941 if (LangOpts.OpenCL)
13965 llvm_unreachable(
"Not a fixed point type!");
13966 case BuiltinType::ShortAccum:
13967 case BuiltinType::SatShortAccum:
13968 return Target.getShortAccumScale();
13969 case BuiltinType::Accum:
13970 case BuiltinType::SatAccum:
13971 return Target.getAccumScale();
13972 case BuiltinType::LongAccum:
13973 case BuiltinType::SatLongAccum:
13974 return Target.getLongAccumScale();
13975 case BuiltinType::UShortAccum:
13976 case BuiltinType::SatUShortAccum:
13977 return Target.getUnsignedShortAccumScale();
13978 case BuiltinType::UAccum:
13979 case BuiltinType::SatUAccum:
13980 return Target.getUnsignedAccumScale();
13981 case BuiltinType::ULongAccum:
13982 case BuiltinType::SatULongAccum:
13983 return Target.getUnsignedLongAccumScale();
13984 case BuiltinType::ShortFract:
13985 case BuiltinType::SatShortFract:
13986 return Target.getShortFractScale();
13987 case BuiltinType::Fract:
13988 case BuiltinType::SatFract:
13989 return Target.getFractScale();
13990 case BuiltinType::LongFract:
13991 case BuiltinType::SatLongFract:
13992 return Target.getLongFractScale();
13993 case BuiltinType::UShortFract:
13994 case BuiltinType::SatUShortFract:
13995 return Target.getUnsignedShortFractScale();
13996 case BuiltinType::UFract:
13997 case BuiltinType::SatUFract:
13998 return Target.getUnsignedFractScale();
13999 case BuiltinType::ULongFract:
14000 case BuiltinType::SatULongFract:
14001 return Target.getUnsignedLongFractScale();
14011 llvm_unreachable(
"Not a fixed point type!");
14012 case BuiltinType::ShortAccum:
14013 case BuiltinType::SatShortAccum:
14014 return Target.getShortAccumIBits();
14015 case BuiltinType::Accum:
14016 case BuiltinType::SatAccum:
14017 return Target.getAccumIBits();
14018 case BuiltinType::LongAccum:
14019 case BuiltinType::SatLongAccum:
14020 return Target.getLongAccumIBits();
14021 case BuiltinType::UShortAccum:
14022 case BuiltinType::SatUShortAccum:
14023 return Target.getUnsignedShortAccumIBits();
14024 case BuiltinType::UAccum:
14025 case BuiltinType::SatUAccum:
14026 return Target.getUnsignedAccumIBits();
14027 case BuiltinType::ULongAccum:
14028 case BuiltinType::SatULongAccum:
14029 return Target.getUnsignedLongAccumIBits();
14030 case BuiltinType::ShortFract:
14031 case BuiltinType::SatShortFract:
14032 case BuiltinType::Fract:
14033 case BuiltinType::SatFract:
14034 case BuiltinType::LongFract:
14035 case BuiltinType::SatLongFract:
14036 case BuiltinType::UShortFract:
14037 case BuiltinType::SatUShortFract:
14038 case BuiltinType::UFract:
14039 case BuiltinType::SatUFract:
14040 case BuiltinType::ULongFract:
14041 case BuiltinType::SatULongFract:
14046llvm::FixedPointSemantics
14049 "Can only get the fixed point semantics for a "
14050 "fixed point or integer type.");
14052 return llvm::FixedPointSemantics::GetIntegerSemantics(
14056 return llvm::FixedPointSemantics(
14059 !isSigned &&
getTargetInfo().doUnsignedFixedPointTypesHavePadding());
14074 "Expected unsigned fixed point type");
14077 case BuiltinType::UShortAccum:
14079 case BuiltinType::UAccum:
14081 case BuiltinType::ULongAccum:
14083 case BuiltinType::SatUShortAccum:
14085 case BuiltinType::SatUAccum:
14087 case BuiltinType::SatULongAccum:
14089 case BuiltinType::UShortFract:
14091 case BuiltinType::UFract:
14093 case BuiltinType::ULongFract:
14095 case BuiltinType::SatUShortFract:
14097 case BuiltinType::SatUFract:
14099 case BuiltinType::SatULongFract:
14102 llvm_unreachable(
"Unexpected unsigned fixed point type");
14110 std::vector<std::string> BackendFeats;
14111 for (StringRef F : FMVFeatStrings)
14112 if (
auto FMVExt = llvm::AArch64::parseFMVExtension(F))
14113 for (StringRef F : FMVExt->getImpliedFeatures())
14114 BackendFeats.push_back(F.str());
14115 return BackendFeats;
14120 assert(TD !=
nullptr);
14123 llvm::erase_if(
ParsedAttr.Features, [&](
const std::string &Feat) {
14124 return !Target->isValidFeatureName(StringRef{Feat}.substr(1));
14135 Target->getTargetOpts().CPU,
14136 Target->getTargetOpts().Features);
14143 StringRef TargetCPU =
Target->getTargetOpts().CPU;
14145 if (
const auto *TD = FD->
getAttr<TargetAttr>()) {
14151 if (!
Target->getTriple().isAArch64())
14154 Target->getTargetOpts().FeaturesAsWritten.begin(),
14155 Target->getTargetOpts().FeaturesAsWritten.end());
14166 }
else if (
const auto *SD = FD->
getAttr<CPUSpecificAttr>()) {
14168 Target->getCPUSpecificCPUDispatchFeatures(
14170 std::vector<std::string> Features(FeaturesTmp.begin(), FeaturesTmp.end());
14171 Features.insert(Features.begin(),
14172 Target->getTargetOpts().FeaturesAsWritten.begin(),
14173 Target->getTargetOpts().FeaturesAsWritten.end());
14175 }
else if (
const auto *TC = FD->
getAttr<TargetClonesAttr>()) {
14176 if (
Target->getTriple().isAArch64()) {
14180 Features.insert(Features.begin(),
14181 Target->getTargetOpts().FeaturesAsWritten.begin(),
14182 Target->getTargetOpts().FeaturesAsWritten.end());
14185 std::vector<std::string> Features;
14187 if (VersionStr.starts_with(
"arch="))
14188 TargetCPU = VersionStr.drop_front(
sizeof(
"arch=") - 1);
14189 else if (VersionStr !=
"default")
14190 Features.push_back((StringRef{
"+"} + VersionStr).str());
14193 }
else if (
const auto *TV = FD->
getAttr<TargetVersionAttr>()) {
14195 TV->getFeatures(Feats);
14197 Features.insert(Features.begin(),
14198 Target->getTargetOpts().FeaturesAsWritten.begin(),
14199 Target->getTargetOpts().FeaturesAsWritten.end());
14202 FeatureMap =
Target->getTargetOpts().FeatureMap;
14208 return *OMPTraitInfoVector.back();
14215 return DB << Section.
Decl;
14216 return DB <<
"a prior #pragma section";
14220 bool IsInternalVar =
14223 bool IsExplicitDeviceVar = (
D->
hasAttr<CUDADeviceAttr>() &&
14224 !
D->
getAttr<CUDADeviceAttr>()->isImplicit()) ||
14225 (
D->
hasAttr<CUDAConstantAttr>() &&
14226 !
D->
getAttr<CUDAConstantAttr>()->isImplicit());
14230 return (IsInternalVar &&
14231 (
D->
hasAttr<HIPManagedAttr>() || IsExplicitDeviceVar)) ||
14244 if (!CUIDHash.empty())
14246 if (LangOpts.
CUID.empty())
14247 return StringRef();
14248 CUIDHash = llvm::utohexstr(llvm::MD5Hash(LangOpts.
CUID),
true);
14258 assert(PrimaryBase);
14261 auto Base = Layout.getPrimaryBase();
14262 if (!
Base ||
Base == PrimaryBase || !
Base->isPolymorphic())
14264 PrimaryBase =
Base;
14266 return PrimaryBase;
14270 StringRef MangledName) {
14271 auto *Method = cast<CXXMethodDecl>(VirtualMethodDecl.
getDecl());
14272 assert(Method->isVirtual());
14273 bool DefaultIncludesPointerAuth =
14274 LangOpts.PointerAuthCalls || LangOpts.PointerAuthIntrinsics;
14276 if (!DefaultIncludesPointerAuth)
14279 auto Existing = ThunksToBeAbbreviated.find(VirtualMethodDecl);
14280 if (Existing != ThunksToBeAbbreviated.end())
14281 return Existing->second.contains(MangledName.str());
14284 llvm::StringMap<llvm::SmallVector<std::string, 2>> Thunks;
14286 if (
const auto *ThunkInfos = VtableContext->getThunkInfo(VirtualMethodDecl)) {
14287 auto *
Destructor = dyn_cast<CXXDestructorDecl>(Method);
14288 for (
const auto &Thunk : *ThunkInfos) {
14290 llvm::raw_svector_ostream ElidedNameStream(ElidedName);
14296 Mangler->mangleThunk(Method, Thunk,
true,
14299 llvm::raw_svector_ostream mangledNameStream(MangledName);
14303 mangledNameStream);
14305 Mangler->mangleThunk(Method, Thunk,
false,
14306 mangledNameStream);
14308 if (Thunks.find(ElidedName) == Thunks.end())
14309 Thunks[ElidedName] = {};
14310 Thunks[ElidedName].push_back(std::string(MangledName));
14313 llvm::StringSet<> SimplifiedThunkNames;
14314 for (
auto &ThunkList : Thunks) {
14315 llvm::sort(ThunkList.second);
14316 SimplifiedThunkNames.insert(ThunkList.second[0]);
14318 bool Result = SimplifiedThunkNames.contains(MangledName);
14319 ThunksToBeAbbreviated[VirtualMethodDecl] = std::move(SimplifiedThunkNames);
This file provides AST data structures related to concepts.
static void SortAndUniqueProtocols(SmallVectorImpl< ObjCProtocolDecl * > &Protocols)
static bool isCanonicalExceptionSpecification(const FunctionProtoType::ExceptionSpecInfo &ESI, bool NoexceptInType)
static SourceLocation getCommonAttrLoc(const T *X, const T *Y)
static auto getCommonTypes(ASTContext &Ctx, ArrayRef< QualType > Xs, ArrayRef< QualType > Ys, bool Unqualified=false)
static auto getCanonicalTemplateArguments(const ASTContext &C, ArrayRef< TemplateArgument > Args, bool &AnyNonCanonArgs)
static char getObjCEncodingForPrimitiveType(const ASTContext *C, const BuiltinType *BT)
static bool NeedsInjectedClassNameType(const RecordDecl *D)
#define SVE_ELTTY(ELTTY, ELTS, NUMVECTORS)
static bool unionHasUniqueObjectRepresentations(const ASTContext &Context, const RecordDecl *RD, bool CheckIfTriviallyCopyable)
static NamespaceDecl * getNamespace(const NestedNameSpecifier *X)
static TypedefDecl * CreateHexagonBuiltinVaListDecl(const ASTContext *Context)
#define CANONICAL_TYPE(Class)
static NestedNameSpecifier * getCommonNNS(ASTContext &Ctx, const T *X, const T *Y)
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 uint64_t getSVETypeSize(ASTContext &Context, const BuiltinType *Ty)
getSVETypeSize - Return SVE vector or predicate register size.
#define SUGAR_FREE_TYPE(Class)
static bool getCommonTemplateArguments(ASTContext &Ctx, SmallVectorImpl< TemplateArgument > &R, ArrayRef< TemplateArgument > Xs, ArrayRef< TemplateArgument > Ys)
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 TemplateName getCommonTemplateNameChecked(ASTContext &Ctx, TemplateName X, TemplateName Y)
static const Decl & adjustDeclToTemplate(const Decl &D)
If we have a 'templated' declaration for a template, adjust 'D' to refer to the actual template.
static int CmpProtocolNames(ObjCProtocolDecl *const *LHS, ObjCProtocolDecl *const *RHS)
CmpProtocolNames - Comparison predicate for sorting protocols alphabetically.
static QualType getCommonElementType(ASTContext &Ctx, const T *X, const T *Y)
static TypedefDecl * CreatePowerABIBuiltinVaListDecl(const ASTContext *Context)
static auto getCommonSizeModifier(const ArrayType *X, const ArrayType *Y)
static std::optional< int64_t > structHasUniqueObjectRepresentations(const ASTContext &Context, const RecordDecl *RD, bool CheckIfTriviallyCopyable)
static TemplateName getCommonTemplateName(ASTContext &Ctx, TemplateName X, TemplateName Y)
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 TypedefDecl * CreateVoidPtrBuiltinVaListDecl(const ASTContext *Context)
static int64_t getSubobjectOffset(const FieldDecl *Field, const ASTContext &Context, const clang::ASTRecordLayout &)
static TypedefDecl * CreateAArch64ABIBuiltinVaListDecl(const ASTContext *Context)
static TypedefDecl * CreatePNaClABIBuiltinVaListDecl(const ASTContext *Context)
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 auto getCommonIndexTypeCVRQualifiers(const ArrayType *X, const ArrayType *Y)
#define SVE_INT_ELTTY(BITS, ELTS, SIGNED, NUMVECTORS)
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 void mergeTypeLists(ASTContext &Ctx, SmallVectorImpl< QualType > &Out, ArrayRef< QualType > X, ArrayRef< QualType > Y)
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 TemplateArgument getCommonTemplateArgument(ASTContext &Ctx, const TemplateArgument &X, const TemplateArgument &Y)
static auto * getCommonSizeExpr(ASTContext &Ctx, T *X, T *Y)
static void encodeTypeForFunctionPointerAuth(const ASTContext &Ctx, raw_ostream &OS, QualType QT)
Encode a function type for use in the discriminator of a function pointer type.
static std::optional< int64_t > structSubobjectsHaveUniqueObjectRepresentations(const RangeT &Subobjects, int64_t CurOffsetInBits, const ASTContext &Context, const clang::ASTRecordLayout &Layout, bool CheckIfTriviallyCopyable)
static char ObjCEncodingForEnumType(const ASTContext *C, const EnumType *ET)
static QualType getCommonArrayElementType(ASTContext &Ctx, const T *X, Qualifiers &QX, const T *Y, Qualifiers &QY)
static QualType getCommonPointeeType(ASTContext &Ctx, const T *X, const T *Y)
static uint64_t getRVVTypeSize(ASTContext &Context, const BuiltinType *Ty)
getRVVTypeSize - Return RVV vector register size.
static auto unwrapSugar(SplitQualType &T, Qualifiers &QTotal)
static int compareObjCProtocolsByName(ObjCProtocolDecl *const *lhs, ObjCProtocolDecl *const *rhs)
Comparison routine for Objective-C protocols to be used with llvm::array_pod_sort.
static QualType getCommonNonSugarTypeNode(ASTContext &Ctx, const Type *X, Qualifiers &QX, const Type *Y, Qualifiers &QY)
static QualType getCommonSugarTypeNode(ASTContext &Ctx, const Type *X, const Type *Y, SplitQualType Underlying)
static bool isSameQualifier(const NestedNameSpecifier *X, const NestedNameSpecifier *Y)
static std::string charUnitsToString(const CharUnits &CU)
static bool hasAnyPackExpansions(ArrayRef< TemplateArgument > Args)
static void addRedeclaredMethods(const ObjCMethodDecl *ObjCMethod, SmallVectorImpl< const NamedDecl * > &Redeclared)
static SmallVector< SourceLocation, 2 > getDeclLocsForCommentSearch(const Decl *D, SourceManager &SourceMgr)
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)
#define UNEXPECTED_TYPE(Class, Kind)
static TypedefDecl * CreateVaListDecl(const ASTContext *Context, TargetInfo::BuiltinVaListKind Kind)
static std::vector< std::string > getFMVBackendFeaturesFor(const llvm::SmallVectorImpl< StringRef > &FMVFeatStrings)
static ElaboratedTypeKeyword getCommonTypeKeyword(const T *X, const T *Y)
Defines the clang::ASTContext interface.
Provides definitions for the various language-specific address spaces.
static bool isUnsigned(SValBuilder &SVB, NonLoc Value)
static constexpr Builtin::Info BuiltinInfo[]
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 Expressions and AST nodes for C++2a concepts.
Defines the clang::IdentifierInfo, clang::IdentifierTable, and clang::Selector interfaces.
static const Decl * getCanonicalDecl(const Decl *D)
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified.
Defines the clang::LangOptions interface.
llvm::MachO::Target Target
llvm::MachO::Record Record
static bool hasFeature(StringRef Feature, const LangOptions &LangOpts, const TargetInfo &Target)
Determine whether a translation unit built using the current language options has the given feature.
Defines the clang::Module class, which describes a module in the source code.
Defines types useful for describing an Objective-C runtime.
static bool compare(const PathDiagnostic &X, const PathDiagnostic &Y)
static QualType getUnderlyingType(const SubRegion *R)
Defines the clang::SourceLocation class and associated facilities.
Defines the SourceManager interface.
Defines various enumerations that describe declaration and type specifiers.
This file defines OpenACC AST classes for statement-level contructs.
static QualType getPointeeType(const MemRegion *R)
Defines the TargetCXXABI class, which abstracts details of the C++ ABI that we're targeting.
Defines the clang::TypeLoc interface and its subclasses.
static const TemplateArgument & getArgument(const TemplateArgument &A)
C Language Family Type Representation.
__device__ __2f16 float c
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.
QualType getUsingType(const UsingShadowDecl *Found, QualType Underlying) const
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.
bool areLaxCompatibleSveTypes(QualType FirstType, QualType SecondType)
Return true if the given vector types are lax-compatible SVE vector types, false otherwise.
llvm::PointerUnion< VarTemplateDecl *, MemberSpecializationInfo * > TemplateOrSpecializationInfo
A type synonym for the TemplateOrInstantiation mapping.
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.
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
void UnwrapSimilarArrayTypes(QualType &T1, QualType &T2, bool AllowPiMismatch=true)
Attempt to unwrap two types that may both be array types with the same bound (or both be array types ...
unsigned getIntWidth(QualType T) const
CanQualType getCanonicalParamType(QualType T) const
Return the canonical parameter type corresponding to the specific potentially non-canonical one.
QualType getBTFTagAttributedType(const BTFTypeTagAttr *BTFAttr, QualType Wrapped)
const FunctionType * adjustFunctionType(const FunctionType *Fn, FunctionType::ExtInfo EInfo)
Change the ExtInfo on a function type.
TemplateOrSpecializationInfo getTemplateOrSpecializationInfo(const VarDecl *Var)
QualType getAttributedType(attr::Kind attrKind, QualType modifiedType, QualType equivalentType) const
InlineVariableDefinitionKind
@ None
Not an inline variable.
@ Weak
Weak definition of inline variable.
@ Strong
Strong definition.
@ WeakUnknown
Weak for now, might become strong later in this TU.
void setObjCConstantStringInterface(ObjCInterfaceDecl *Decl)
TypedefDecl * getObjCClassDecl() const
Retrieve the typedef declaration corresponding to the predefined Objective-C 'Class' type.
TypedefNameDecl * getTypedefNameForUnnamedTagDecl(const TagDecl *TD)
TypedefDecl * getCFConstantStringDecl() const
CanQualType SatUnsignedFractTy
BuiltinTemplateDecl * getMakeIntegerSeqDecl() const
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 getAutoType(QualType DeducedType, AutoTypeKeyword Keyword, bool IsDependent, bool IsPack=false, ConceptDecl *TypeConstraintConcept=nullptr, ArrayRef< TemplateArgument > TypeConstraintArgs={}) const
C++11 deduced auto type.
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.
uint64_t getFieldOffset(const ValueDecl *FD) const
Get the offset of a FieldDecl or IndirectFieldDecl, in bits.
QualType getDependentTemplateSpecializationType(ElaboratedTypeKeyword Keyword, NestedNameSpecifier *NNS, const IdentifierInfo *Name, ArrayRef< TemplateArgumentLoc > Args) const
void setTemplateOrSpecializationInfo(VarDecl *Inst, TemplateOrSpecializationInfo TSI)
bool ProtocolCompatibleWithProtocol(ObjCProtocolDecl *lProto, ObjCProtocolDecl *rProto) const
ProtocolCompatibleWithProtocol - return 'true' if 'lProto' is in the inheritance hierarchy of 'rProto...
bool hasSimilarType(QualType T1, QualType T2)
Determine if two types are similar, according to the C++ rules.
TypedefDecl * buildImplicitTypedef(QualType T, StringRef Name) const
Create a new implicit TU-level typedef declaration.
QualType getObjCInterfaceType(const ObjCInterfaceDecl *Decl, ObjCInterfaceDecl *PrevDecl=nullptr) const
getObjCInterfaceType - Return the unique reference to the type for the specified ObjC interface decl.
void adjustObjCTypeParamBoundType(const ObjCTypeParamDecl *Orig, ObjCTypeParamDecl *New) const
QualType getBlockPointerType(QualType T) const
Return the uniqued reference to the type for a block of the specified type.
TemplateArgument getCanonicalTemplateArgument(const TemplateArgument &Arg) const
Retrieve the "canonical" template argument.
QualType getAutoRRefDeductType() const
C++11 deduction pattern for 'auto &&' type.
TypedefDecl * getBuiltinMSVaListDecl() const
Retrieve the C type declaration corresponding to the predefined __builtin_ms_va_list type.
bool ObjCQualifiedIdTypesAreCompatible(const ObjCObjectPointerType *LHS, const ObjCObjectPointerType *RHS, bool ForCompare)
ObjCQualifiedIdTypesAreCompatible - We know that one of lhs/rhs is an ObjCQualifiedIDType.
QualType getTagDeclType(const TagDecl *Decl) const
Return the unique reference to the type for the specified TagDecl (struct/union/class/enum) decl.
QualType getMemberPointerType(QualType T, const Type *Cls) const
Return the uniqued reference to the type for a member pointer to the specified type in the specified ...
QualType getBuiltinVaListType() const
Retrieve the type of the __builtin_va_list 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
TemplateName getCanonicalTemplateName(const TemplateName &Name) const
Retrieves the "canonical" template name that refers to a given template.
QualType getUnresolvedUsingType(const UnresolvedUsingTypenameDecl *Decl) 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.
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.
QualType getTemplateSpecializationType(TemplateName T, ArrayRef< TemplateArgument > Args, QualType Canon=QualType()) const
std::unique_ptr< MangleNumberingContext > createMangleNumberingContext() const
QualType getUnsignedPointerDiffType() const
Return the unique unsigned counterpart of "ptrdiff_t" integer type.
QualType getucontext_tType() const
Retrieve the C ucontext_t type.
QualType getRecordType(const RecordDecl *Decl) const
QualType getScalableVectorType(QualType EltTy, unsigned NumElts, unsigned NumFields=1) const
Return the unique reference to a scalable vector type of the specified element type and scalable numb...
bool hasSameExpr(const Expr *X, const Expr *Y) const
Determine whether the given expressions X and Y are equivalent.
void getObjCEncodingForType(QualType T, std::string &S, const FieldDecl *Field=nullptr, QualType *NotEncodedT=nullptr) const
Emit the Objective-CC type encoding for the given type T into S.
MangleContext * createMangleContext(const TargetInfo *T=nullptr)
If T is null pointer, assume the target in ASTContext.
QualType getRealTypeForBitwidth(unsigned DestWidth, FloatModeKind ExplicitType) const
getRealTypeForBitwidth - sets floating point QualTy according to specified bitwidth.
QualType getInjectedClassNameType(CXXRecordDecl *Decl, QualType TST) const
getInjectedClassNameType - Return the unique reference to the injected class name type for the specif...
QualType getVariableArrayType(QualType EltTy, Expr *NumElts, ArraySizeModifier ASM, unsigned IndexTypeQuals, SourceRange Brackets) const
Return a non-unique reference to the type for a variable array of the specified element type.
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 getCorrespondingSignedFixedPointType(QualType Ty) const
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
QualType getPackExpansionType(QualType Pattern, std::optional< unsigned > NumExpansions, bool ExpectPackInType=true)
Form a pack expansion type with the given pattern.
const ASTRecordLayout & getASTRecordLayout(const RecordDecl *D) const
Get or compute information about the layout of the specified record (struct/union/class) D,...
CanQualType getCanonicalType(QualType T) const
Return the canonical (structural) type corresponding to the specified potentially non-canonical type ...
unsigned NumImplicitDestructorsDeclared
The number of implicitly-declared destructors for which declarations were built.
bool mergeExtParameterInfo(const FunctionProtoType *FirstFnType, const FunctionProtoType *SecondFnType, bool &CanUseFirst, bool &CanUseSecond, SmallVectorImpl< FunctionProtoType::ExtParameterInfo > &NewParamInfos)
This function merges the ExtParameterInfo lists of two functions.
bool ObjCQualifiedClassTypesAreCompatible(const ObjCObjectPointerType *LHS, const ObjCObjectPointerType *RHS)
ObjCQualifiedClassTypesAreCompatible - compare Class<pr,...> and Class<pr1, ...>.
bool shouldExternalize(const Decl *D) const
Whether a C++ static variable or CUDA/HIP kernel should be externalized.
bool hasSameType(QualType T1, QualType T2) const
Determine whether the given types T1 and T2 are equivalent.
bool propertyTypesAreCompatible(QualType, QualType)
void setInstantiatedFromUsingShadowDecl(UsingShadowDecl *Inst, UsingShadowDecl *Pattern)
TemplateName getQualifiedTemplateName(NestedNameSpecifier *NNS, bool TemplateKeyword, TemplateName Template) const
Retrieve the template name that represents a qualified template name such as std::vector.
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.
QualType getFILEType() const
Retrieve the C FILE type.
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.
void getInjectedTemplateArgs(const TemplateParameterList *Params, SmallVectorImpl< TemplateArgument > &Args)
Get a template argument list with one argument per template parameter in a template parameter list,...
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.
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...
CallingConv getDefaultCallingConvention(bool IsVariadic, bool IsCXXMethod, bool IsBuiltin=false) const
Retrieves the default calling convention for the current target.
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.
QualType getMSGuidType() const
Retrieve the implicitly-predeclared 'struct _GUID' 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...
const ASTRecordLayout & getASTObjCImplementationLayout(const ObjCImplementationDecl *D) const
Get or compute information about the layout of the specified Objective-C implementation.
CanQualType UnsignedLongFractTy
QualType getEnumType(const EnumDecl *Decl) const
overridden_method_range overridden_methods(const CXXMethodDecl *Method) const
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.
IdentifierInfo * getMakeIntegerSeqName() const
bool QIdProtocolsAdoptObjCObjectProtocols(QualType QT, ObjCInterfaceDecl *IDecl)
QIdProtocolsAdoptObjCObjectProtocols - Checks that protocols in QT's qualified-id protocol list adopt...
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...
IdentifierInfo * getTypePackElementName() const
bool BlockRequiresCopying(QualType Ty, const VarDecl *D)
Returns true iff we need copy/dispose helpers for the given type.
QualType getTypeDeclType(const TypeDecl *Decl, const TypeDecl *PrevDecl=nullptr) const
Return the unique reference to the type for the specified type declaration.
CanQualType OMPIteratorTy
TemplateName getSubstTemplateTemplateParm(TemplateName replacement, Decl *AssociatedDecl, unsigned Index, std::optional< unsigned > PackIndex) const
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
TemplateArgument getInjectedTemplateArg(NamedDecl *ParamDecl)
QualType getFunctionTypeWithoutPtrSizes(QualType T)
Get a function type and produce the equivalent function type where pointer size address spaces in the...
llvm::iterator_range< overridden_cxx_method_iterator > overridden_method_range
unsigned getMinGlobalAlignOfVar(uint64_t Size, const VarDecl *VD) const
Return the minimum alignement as specified by the target.
RawCommentList Comments
All comments in this translation unit.
bool isSameDefaultTemplateArgument(const NamedDecl *X, const NamedDecl *Y) const
Determine whether two default template arguments are similar enough that they may be used in declarat...
QualType applyObjCProtocolQualifiers(QualType type, ArrayRef< ObjCProtocolDecl * > protocols, bool &hasError, bool allowOnPointerType=false) const
Apply Objective-C protocol qualifiers to the given type.
QualType getMacroQualifiedType(QualType UnderlyingTy, const IdentifierInfo *MacroII) const
QualType removePtrSizeAddrSpace(QualType T) const
Remove the existing address space on the type if it is a pointer size address space and return the ty...
bool areLaxCompatibleRVVTypes(QualType FirstType, QualType SecondType)
Return true if the given vector types are lax-compatible RISC-V vector types as defined by -flax-vect...
CanQualType SatShortFractTy
QualType getDecayedType(QualType T) const
Return the uniqued reference to the decayed version of the given type.
bool canBindObjCObjectType(QualType To, QualType From)
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...
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....
bool typesAreBlockPointerCompatible(QualType, QualType)
CanQualType SatUnsignedAccumTy
bool useAbbreviatedThunkName(GlobalDecl VirtualMethodDecl, StringRef MangledName)
const ASTRecordLayout & getASTObjCInterfaceLayout(const ObjCInterfaceDecl *D) const
Get or compute information about the layout of the specified Objective-C interface.
void forEachMultiversionedFunctionVersion(const FunctionDecl *FD, llvm::function_ref< void(FunctionDecl *)> Pred) const
Visits all versions of a multiversioned function with the passed predicate.
void setInstantiatedFromUsingEnumDecl(UsingEnumDecl *Inst, UsingEnumDecl *Pattern)
Remember that the using enum decl Inst is an instantiation of the using enum decl Pattern of a class ...
QualType getBaseElementType(const ArrayType *VAT) const
Return the innermost element type of an array type.
QualType getPointerDiffType() const
Return the unique type for "ptrdiff_t" (C99 7.17) defined in <stddef.h>.
QualType getSignatureParameterType(QualType T) const
Retrieve the parameter type as adjusted for use in the signature of a function, decaying array and fu...
CanQualType ArraySectionTy
QualType getCanonicalTemplateSpecializationType(TemplateName T, ArrayRef< TemplateArgument > Args) const
CanQualType ObjCBuiltinIdTy
overridden_cxx_method_iterator overridden_methods_end(const CXXMethodDecl *Method) const
VTableContextBase * getVTableContext()
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
void cacheRawCommentForDecl(const Decl &OriginalD, const RawComment &Comment) const
Attaches Comment to OriginalD and to its redeclaration chain and removes the redeclaration chain from...
void attachCommentsToJustParsedDecls(ArrayRef< Decl * > Decls, const Preprocessor *PP)
Searches existing comments for doc comments that should be attached to Decls.
QualType getIntTypeForBitwidth(unsigned DestWidth, unsigned Signed) const
getIntTypeForBitwidth - sets integer QualTy according to specified details: bitwidth,...
void setStaticLocalNumber(const VarDecl *VD, unsigned Number)
QualType getCFConstantStringType() const
Return the C structure type used to represent constant CFStrings.
FieldDecl * getInstantiatedFromUnnamedFieldDecl(FieldDecl *Field)
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
QualType getObjCSelType() const
Retrieve the type that corresponds to the predefined Objective-C 'SEL' type.
QualType getDeducedTemplateSpecializationType(TemplateName Template, QualType DeducedType, bool IsDependent) const
C++17 deduced class template specialization type.
std::string getObjCEncodingForFunctionDecl(const FunctionDecl *Decl) const
Emit the encoded type for the function Decl into S.
QualType getTemplateTypeParmType(unsigned Depth, unsigned Index, bool ParameterPack, TemplateTypeParmDecl *ParmDecl=nullptr) const
Retrieve the template type parameter type for a template parameter or parameter pack with the given d...
CanQualType UnsignedFractTy
QualType getjmp_bufType() const
Retrieve the C jmp_buf type.
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
QualType getsigjmp_bufType() const
Retrieve the C sigjmp_buf type.
void addOverriddenMethod(const CXXMethodDecl *Method, const CXXMethodDecl *Overridden)
Note that the given C++ Method overrides the given Overridden method.
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.
CanQualType UnsignedLongTy
bool hasSameTemplateName(const TemplateName &X, const TemplateName &Y) const
Determine whether the given template names refer to the same template.
void DeepCollectObjCIvars(const ObjCInterfaceDecl *OI, bool leafClass, SmallVectorImpl< const ObjCIvarDecl * > &Ivars) const
DeepCollectObjCIvars - This routine first collects all declared, but not synthesized,...
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,...
void addedLocalImportDecl(ImportDecl *Import)
Notify the AST context that a new import declaration has been parsed or implicitly created within thi...
CanQualType UnsignedLongAccumTy
QualType AutoRRefDeductTy
CanQualType getSizeType() const
Return the unique type for "size_t" (C99 7.17), defined in <stddef.h>.
TypeInfo getTypeInfo(const Type *T) const
Get the size and alignment of the specified complete type in bits.
QualType getStringLiteralArrayType(QualType EltTy, unsigned Length) const
Return a type for a constant array for a string literal of the specified element type and length.
QualType getCorrespondingSaturatedType(QualType Ty) const
bool isSameEntity(const NamedDecl *X, const NamedDecl *Y) const
Determine whether the two declarations refer to the same entity.
TypeSourceInfo * getTemplateSpecializationTypeInfo(TemplateName T, SourceLocation TLoc, const TemplateArgumentListInfo &Args, QualType Canon=QualType()) const
QualType getSubstTemplateTypeParmPackType(Decl *AssociatedDecl, unsigned Index, bool Final, const TemplateArgument &ArgPack)
Retrieve a.
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 ...
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.
unsigned NumImplicitMoveConstructorsDeclared
The number of implicitly-declared move constructors for which declarations were built.
unsigned NumImplicitCopyConstructorsDeclared
The number of implicitly-declared copy constructors for which declarations were built.
llvm::DenseSet< const VarDecl * > CUDADeviceVarODRUsedByHost
Keep track of CUDA/HIP device-side variables ODR-used by host code.
CanQualType PseudoObjectTy
QualType getWebAssemblyExternrefType() const
Return a WebAssembly externref type.
void setTraversalScope(const std::vector< Decl * > &)
CharUnits getTypeUnadjustedAlignInChars(QualType T) const
getTypeUnadjustedAlignInChars - Return the ABI-specified alignment of a type, in characters,...
QualType getAdjustedType(QualType Orig, QualType New) const
Return the uniqued reference to a type adjusted from the original type to a new type.
unsigned getAlignOfGlobalVar(QualType T, const VarDecl *VD) const
Return the alignment in bits that should be given to a global variable with type T.
TypeInfoChars getTypeInfoDataSizeInChars(QualType T) const
MangleNumberingContext & getManglingNumberContext(const DeclContext *DC)
Retrieve the context for computing mangling numbers in the given DeclContext.
comments::FullComment * getLocalCommentForDeclUncached(const Decl *D) const
Return parsed documentation comment attached to a given declaration.
unsigned NumImplicitDestructors
The number of implicitly-declared destructors.
QualType getQualifiedType(SplitQualType split) const
Un-split a SplitQualType.
QualType getElaboratedType(ElaboratedTypeKeyword Keyword, NestedNameSpecifier *NNS, QualType NamedType, TagDecl *OwnedTagDecl=nullptr) const
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 getObjCObjectType(QualType Base, ObjCProtocolDecl *const *Protocols, unsigned NumProtocols) const
Legacy interface: cannot provide type arguments or __kindof.
TemplateParamObjectDecl * getTemplateParamObjectDecl(QualType T, const APValue &V) const
Return the template parameter object of the given type with the given value.
CharUnits getDeclAlign(const Decl *D, bool ForAlignof=false) const
Return a conservative estimate of the alignment of the specified decl D.
int64_t toBits(CharUnits CharSize) const
Convert a size in characters to a size in bits.
CanQualType OCLClkEventTy
void adjustExceptionSpec(FunctionDecl *FD, const FunctionProtoType::ExceptionSpecInfo &ESI, bool AsWritten=false)
Change the exception specification on a function once it is delay-parsed, instantiated,...
TypedefDecl * getUInt128Decl() const
Retrieve the declaration for the 128-bit unsigned integer type.
const clang::PrintingPolicy & getPrintingPolicy() const
ArrayRef< Module * > getModulesWithMergedDefinition(const NamedDecl *Def)
Get the additional modules in which the definition Def has been merged.
llvm::FixedPointSemantics getFixedPointSemantics(QualType Ty) const
QualType getDependentSizedArrayType(QualType EltTy, Expr *NumElts, ArraySizeModifier ASM, unsigned IndexTypeQuals, SourceRange Brackets) const
Return a non-unique reference to the type for a dependently-sized array of the specified element type...
uint64_t lookupFieldBitOffset(const ObjCInterfaceDecl *OID, const ObjCImplementationDecl *ID, const ObjCIvarDecl *Ivar) const
Get the offset of an ObjCIvarDecl in bits.
CanQualType SatUnsignedShortAccumTy
QualType mergeTypes(QualType, QualType, bool OfBlockPointer=false, bool Unqualified=false, bool BlockReturnType=false, bool IsConditionalOperator=false)
const RawComment * getRawCommentForAnyRedecl(const Decl *D, const Decl **OriginalDecl=nullptr) const
Return the documentation comment attached to a given declaration.
CharUnits getAlignOfGlobalVarInChars(QualType T, const VarDecl *VD) const
Return the alignment in characters that should be given to a global variable with type T.
const ObjCMethodDecl * getObjCMethodRedeclaration(const ObjCMethodDecl *MD) const
Get the duplicate declaration of a ObjCMethod in the same interface, or null if none exists.
static bool isObjCNSObjectType(QualType Ty)
Return true if this is an NSObject object with its NSObject attribute set.
GVALinkage GetGVALinkageForVariable(const VarDecl *VD) const
UsingShadowDecl * getInstantiatedFromUsingShadowDecl(UsingShadowDecl *Inst)
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".
bool hasSameUnqualifiedType(QualType T1, QualType T2) const
Determine whether the given types are equivalent after cvr-qualifiers have been removed.
QualType getCorrespondingUnsaturatedType(QualType Ty) const
comments::FullComment * getCommentForDecl(const Decl *D, const Preprocessor *PP) const
Return parsed documentation comment attached to a given declaration.
FunctionProtoType::ExceptionSpecInfo mergeExceptionSpecs(FunctionProtoType::ExceptionSpecInfo ESI1, FunctionProtoType::ExceptionSpecInfo ESI2, SmallVectorImpl< QualType > &ExceptionTypeStorage, bool AcceptDependent)
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.
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.
const CXXRecordDecl * baseForVTableAuthentication(const CXXRecordDecl *ThisClass)
Resolve the root record to be used to derive the vtable pointer authentication policy for the specifi...
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.
unsigned NumImplicitMoveAssignmentOperatorsDeclared
The number of implicitly-declared move assignment operators for which declarations were built.
void setManglingNumber(const NamedDecl *ND, unsigned Number)
llvm::DenseMap< const Decl *, const RawComment * > DeclRawComments
Mapping from declaration to directly attached comment.
TypedefDecl * getBuiltinVaListDecl() const
Retrieve the C type declaration corresponding to the predefined __builtin_va_list type.
CanQualType UnsignedCharTy
CanQualType UnsignedShortFractTy
BuiltinTemplateDecl * buildBuiltinTemplateDecl(BuiltinTemplateKind BTK, const IdentifierInfo *II) const
void * Allocate(size_t Size, unsigned Align=8) const
bool canBuiltinBeRedeclared(const FunctionDecl *) const
Return whether a declaration to a builtin is allowed to be overloaded/redeclared.
CanQualType UnsignedIntTy
TemplateName getDependentTemplateName(NestedNameSpecifier *NNS, const IdentifierInfo *Name) const
Retrieve the template name that represents a dependent template name such as MetaFun::template apply.
unsigned NumImplicitMoveConstructors
The number of implicitly-declared move constructors.
QualType getObjCTypeParamType(const ObjCTypeParamDecl *Decl, ArrayRef< ObjCProtocolDecl * > protocols) const
QualType getVolatileType(QualType T) const
Return the uniqued reference to the type for a volatile qualified type.
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.
TypeSourceInfo * CreateTypeSourceInfo(QualType T, unsigned Size=0) const
Allocate an uninitialized TypeSourceInfo.
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 ...
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.
QualType getCommonSugaredType(QualType X, QualType Y, bool Unqualified=false)
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...
QualType getArrayDecayedType(QualType T) const
Return the properly qualified result of decaying the specified array type to a pointer.
overridden_cxx_method_iterator overridden_methods_begin(const CXXMethodDecl *Method) const
CanQualType UnsignedShortTy
unsigned getTypeAlignIfKnown(QualType T, bool NeedsPreferredAlignment=false) const
Return the alignment of a type, in bits, or 0 if the type is incomplete and we cannot determine the a...
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.
QualType getDependentNameType(ElaboratedTypeKeyword Keyword, NestedNameSpecifier *NNS, const IdentifierInfo *Name, QualType Canon=QualType()) const
bool canAssignObjCInterfacesInBlockPointer(const ObjCObjectPointerType *LHSOPT, const ObjCObjectPointerType *RHSOPT, bool BlockReturnType)
canAssignObjCInterfacesInBlockPointer - This routine is specifically written for providing type-safet...
CanQualType SatUnsignedLongFractTy
const CXXConstructorDecl * getCopyConstructorForExceptionObject(CXXRecordDecl *RD)
QualType getDependentAddressSpaceType(QualType PointeeType, Expr *AddrSpaceExpr, SourceLocation AttrLoc) const
QualType getPackIndexingType(QualType Pattern, Expr *IndexExpr, bool FullySubstituted=false, ArrayRef< QualType > Expansions={}, int Index=-1) const
RawComment * getRawCommentForDeclNoCache(const Decl *D) const
Return the documentation comment attached to a given declaration, without looking into cache.
QualType getPromotedIntegerType(QualType PromotableType) const
Return the type that PromotableType will promote to: C99 6.3.1.1p2, assuming that PromotableType is a...
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...
bool UnwrapSimilarTypes(QualType &T1, QualType &T2, bool AllowPiMismatch=true)
Attempt to unwrap two types that may be similar (C++ [conv.qual]).
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 areCompatibleSveTypes(QualType FirstType, QualType SecondType)
Return true if the given types are an SVE builtin and a VectorType that is a fixed-length representat...
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)
DiagnosticsEngine & getDiagnostics() const
QualType getAdjustedParameterType(QualType T) const
Perform adjustment on the parameter type of a function.
void ResetObjCLayout(const ObjCContainerDecl *CD)
interp::Context & getInterpContext()
Returns the clang bytecode interpreter context.
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.
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
CanQualType SatLongFractTy
const TargetInfo & getTargetInfo() const
void setInstantiatedFromUnnamedFieldDecl(FieldDecl *Inst, FieldDecl *Tmpl)
CanQualType SatShortAccumTy
QualType getAutoDeductType() const
C++11 deduction pattern for 'auto' type.
unsigned NumImplicitCopyConstructors
The number of implicitly-declared copy constructors.
CharUnits toCharUnitsFromBits(int64_t BitSize) const
Convert a size in bits to a size in characters.
CanQualType IncompleteMatrixIdxTy
void getFunctionFeatureMap(llvm::StringMap< bool > &FeatureMap, const FunctionDecl *) const
CanQualType getNSIntegerType() const
QualType getCorrespondingUnsignedType(QualType T) const
void setBlockVarCopyInit(const VarDecl *VD, Expr *CopyExpr, bool CanThrow)
Set the copy initialization expression of a block var decl.
TemplateName getOverloadedTemplateName(UnresolvedSetIterator Begin, UnresolvedSetIterator End) const
Retrieve the template name that corresponds to a non-empty lookup.
bool typesAreCompatible(QualType T1, QualType T2, bool CompareUnqualified=false)
Compatibility predicates used to check assignment expressions.
TemplateName getSubstTemplateTemplateParmPack(const TemplateArgument &ArgPack, Decl *AssociatedDecl, unsigned Index, bool Final) const
TargetCXXABI::Kind getCXXABIKind() const
Return the C++ ABI kind that should be used.
QualType getAddrSpaceQualType(QualType T, LangAS AddressSpace) const
Return the uniqued reference to the type for an address space qualified type with the specified type ...
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.
BuiltinTemplateDecl * getTypePackElementDecl() const
CanQualType SatUnsignedLongAccumTy
QualType getUnconstrainedType(QualType T) const
Remove any type constraints from a template parameter type, for equivalence comparison of template pa...
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.
void deduplicateMergedDefinitonsFor(NamedDecl *ND)
Clean up the merged definition list.
unsigned getTargetAddressSpace(LangAS AS) const
QualType getWideCharType() const
Return the type of wide characters.
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...
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.
CanQualType getSignedSizeType() const
Return the unique signed counterpart of the integer type corresponding to size_t.
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.
NestedNameSpecifier * getCanonicalNestedNameSpecifier(NestedNameSpecifier *NNS) const
Retrieves the "canonical" nested name specifier for a given nested name specifier.
QualType getTypedefType(const TypedefNameDecl *Decl, QualType Underlying=QualType()) const
Return the unique reference to the type for the specified typedef-name decl.
InlineVariableDefinitionKind getInlineVariableDefinitionKind(const VarDecl *VD) const
Determine whether a definition of this inline variable should be treated as a weak or strong definiti...
CanQualType getUIntMaxType() const
Return the unique type for "uintmax_t" (C99 7.18.1.5), defined in <stdint.h>.
QualType getSubstTemplateTypeParmType(QualType Replacement, Decl *AssociatedDecl, unsigned Index, std::optional< unsigned > PackIndex) const
Retrieve a substitution-result type.
uint16_t getPointerAuthVTablePointerDiscriminator(const CXXRecordDecl *RD)
Return the "other" discriminator used for the pointer auth schema used for vtable pointers in instanc...
CharUnits getOffsetOfBaseWithVBPtr(const CXXRecordDecl *RD) const
Loading virtual member pointers using the virtual inheritance model always results in an adjustment u...
LangAS getLangASForBuiltinAddressSpace(unsigned AS) const
bool hasSameFunctionTypeIgnoringPtrSizes(QualType T, QualType U)
Determine whether two function types are the same, ignoring pointer sizes in the return type and para...
unsigned char getFixedPointScale(QualType Ty) const
QualType getIncompleteArrayType(QualType EltTy, ArraySizeModifier ASM, unsigned IndexTypeQuals) const
Return a unique reference to the type for an incomplete array of the specified element type.
QualType getDependentSizedExtVectorType(QualType VectorType, Expr *SizeExpr, SourceLocation AttrLoc) const
QualType DecodeTypeStr(const char *&Str, const ASTContext &Context, ASTContext::GetBuiltinTypeError &Error, bool &RequireICE, bool AllowTypeModifiers) const
TemplateName getAssumedTemplateName(DeclarationName Name) const
Retrieve a template name representing an unqualified-id that has been assumed to name a template for ...
@ GE_Missing_stdio
Missing a type from <stdio.h>
@ GE_Missing_type
Missing a type.
@ GE_Missing_ucontext
Missing a type from <ucontext.h>
@ GE_Missing_setjmp
Missing a type from <setjmp.h>
QualType adjustStringLiteralBaseType(QualType StrLTy) const
uint16_t getPointerAuthTypeDiscriminator(QualType T)
Return the "other" type-specific discriminator for the given type.
QualType getTypeOfExprType(Expr *E, TypeOfKind Kind) const
C23 feature and GCC extension.
QualType getSignedWCharType() const
Return the type of "signed wchar_t".
QualType getUnqualifiedArrayType(QualType T, Qualifiers &Quals) const
Return this type as a completely-unqualified array type, capturing the qualifiers in Quals.
bool hasCvrSimilarType(QualType T1, QualType T2)
Determine if two types are similar, ignoring only CVR qualifiers.
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.
QualType getVariableArrayDecayedType(QualType Ty) const
Returns a vla type where known sizes are replaced with [*].
bool isInSameModule(const Module *M1, const Module *M2)
If the two module M1 and M2 are in the same module.
void setCFConstantStringType(QualType T)
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...
void AddDeallocation(void(*Callback)(void *), void *Data) const
Add a deallocation callback that will be invoked when the ASTContext is destroyed.
AttrVec & getDeclAttrs(const Decl *D)
Retrieve the attributes for the given declaration.
CXXMethodVector::const_iterator overridden_cxx_method_iterator
RawComment * getRawCommentForDeclNoCacheImpl(const Decl *D, const SourceLocation RepresentativeLocForDecl, const std::map< unsigned, RawComment * > &CommentsInFile) const
unsigned getTypeAlign(QualType T) const
Return the ABI-specified alignment of a (complete) type T, in bits.
QualType mergeTransparentUnionType(QualType, QualType, bool OfBlockPointer=false, bool Unqualified=false)
mergeTransparentUnionType - if T is a transparent union type and a member of T is compatible with Sub...
QualType isPromotableBitField(Expr *E) const
Whether this is a promotable bitfield reference according to C99 6.3.1.1p2, bullet 2 (and GCC extensi...
bool isSentinelNullExpr(const Expr *E)
CanQualType getNSUIntegerType() const
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 void AddedStaticLocalNumbers(const Decl *D, unsigned Number)
An static local number was added to a Decl.
virtual ~ASTMutationListener()
virtual void RedefinedHiddenDefinition(const NamedDecl *D, Module *M)
A definition has been made visible by being redefined locally.
virtual void AddedManglingNumber(const Decl *D, unsigned Number)
An mangling number was added to a Decl.
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 adjustement.
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,...
QualType getValueType() const
Gets the type contained by this atomic type, i.e.
void Profile(llvm::FoldingSetNodeID &ID)
Attr - This represents one attribute.
An attributed type is a type to which a type attribute has been applied.
static Kind getNullabilityAttrKind(NullabilityKind kind)
Retrieve the attribute kind corresponding to the given nullability kind.
void Profile(llvm::FoldingSetNodeID &ID)
Represents a C++11 auto or C++14 decltype(auto) type, possibly constrained by a type-constraint.
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context)
bool isConstrained() const
void Profile(llvm::FoldingSetNodeID &ID)
A fixed int type of a specified bitwidth.
void Profile(llvm::FoldingSetNodeID &ID) const
unsigned getNumBits() const
Represents a block literal declaration, which is like an unnamed FunctionDecl.
BlockExpr - Adaptor class for mixing a BlockDecl with expressions.
void Profile(llvm::FoldingSetNodeID &ID)
Represents the builtin template declaration which is used to implement __make_integer_seq and other b...
static BuiltinTemplateDecl * Create(const ASTContext &C, DeclContext *DC, DeclarationName Name, BuiltinTemplateKind BTK)
This class is used for builtin types like 'int'.
StringRef getName(const PrintingPolicy &Policy) const
Holds information about both target-independent and target-specific builtins, allowing easy queries b...
const char * getTypeString(unsigned ID) const
Get the type descriptor string for the specified builtin.
bool hasCustomTypechecking(unsigned ID) const
Determines whether this builtin has custom typechecking.
bool canBeRedeclared(unsigned ID) const
Returns true if this is a builtin that can be redeclared.
bool isNoReturn(unsigned ID) const
Return true if we know this builtin never returns.
bool isNoThrow(unsigned ID) const
Return true if we know this builtin never throws an exception.
Implements C++ ABI-specific semantic analysis functions.
Represents a C++ constructor within a class.
Represents a static or instance method of a struct/union/class.
CXXMethodDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
Represents a C++ struct/union/class.
bool isPolymorphic() const
Whether this class is polymorphic (C++ [class.virtual]), which means that the class contains or inher...
static CXXRecordDecl * Create(const ASTContext &C, TagKind TK, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, IdentifierInfo *Id, CXXRecordDecl *PrevDecl=nullptr, bool DelayTypeCreation=false)
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)
Builds a canonical type from a QualType.
QualType withConst() const
Retrieves a version of this type with const applied.
CanQual< T > getUnqualifiedType() const
Retrieve the unqualified form of this type.
Qualifiers getQualifiers() const
Retrieve all qualifiers.
const T * getTypePtr() const
Retrieve the underlying type pointer, which refers to a canonical type.
CharUnits - This is an opaque type for sizes expressed in character units.
bool isPositive() const
isPositive - Test whether the quantity is greater than zero.
bool isZero() const
isZero - Test whether the quantity equals zero.
QuantityType getQuantity() const
getQuantity - Get the raw integer representation of this quantity.
static CharUnits fromQuantity(QuantityType Quantity)
fromQuantity - Construct a CharUnits quantity from a raw integer type.
static CharUnits Zero()
Zero - Construct a CharUnits quantity of zero.
Declaration of a class template.
llvm::PointerUnion< ClassTemplateDecl *, ClassTemplatePartialSpecializationDecl * > getSpecializedTemplateOrPartial() const
Retrieve the class template or class template partial specialization which was specialized by this.
Complex values, per C99 6.2.5p11.
QualType getElementType() const
void Profile(llvm::FoldingSetNodeID &ID)
Declaration of a C++20 concept.
ConceptDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
bool hasExplicitTemplateArgs() const
Whether or not template arguments were explicitly specified in the concept reference (they might not ...
const ASTTemplateArgumentListInfo * getTemplateArgsAsWritten() const
Represents the canonical version of C arrays with a specified constant size.
const Expr * getSizeExpr() const
Return a pointer to the size expression.
llvm::APInt getSize() const
Return the constant array size as an APInt.
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Ctx)
uint64_t getZExtSize() const
Return the size zero-extended as a uint64_t.
Represents a concrete matrix type with constant number of rows and columns.
unsigned getNumColumns() const
Returns the number of columns in the matrix.
void Profile(llvm::FoldingSetNodeID &ID)
unsigned getNumRows() const
Returns the number of rows in the matrix.
static constexpr bool isDimensionValid(size_t NumElements)
Returns true if NumElements is a valid matrix dimension.
Represents a sugar type with __counted_by or __sized_by annotations, including their _or_null variant...
void Profile(llvm::FoldingSetNodeID &ID)
Represents a pointer type decayed from an array or function type.
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
DeclContext * getParent()
getParent - Returns the containing DeclContext.
bool isFileContext() const
bool isDependentContext() const
Determines whether this context is dependent on a template parameter.
DeclContext * getLexicalParent()
getLexicalParent - Returns the containing lexical DeclContext.
lookup_result lookup(DeclarationName Name) const
lookup - Find the declarations (if any) with the given Name in this context.
DeclContext * getRedeclContext()
getRedeclContext - Retrieve the context in which an entity conflicts with other entities of the same ...
void addDecl(Decl *D)
Add the declaration D into this context.
A reference to a declared variable, function, enum, etc.
Decl - This represents one declaration (or definition), e.g.
Decl * getPreviousDecl()
Retrieve the previous declaration that declares the same entity as this declaration,...
const DeclContext * getParentFunctionOrMethod(bool LexicalParent=false) const
If this decl is defined inside a function/method/block it returns the corresponding DeclContext,...
ASTContext & getASTContext() const LLVM_READONLY
bool isImplicit() const
isImplicit - Indicates whether the declaration was implicitly generated by the implementation.
unsigned getMaxAlignment() const
getMaxAlignment - return the maximum alignment specified by attributes on this decl,...
static Decl * castFromDeclContext(const DeclContext *)
bool isCanonicalDecl() const
Whether this particular Decl is a canonical one.
FunctionDecl * getAsFunction() LLVM_READONLY
Returns the function itself, or the templated function if this is a function template.
ObjCDeclQualifier
ObjCDeclQualifier - 'Qualifiers' written next to the return and parameter types in method declaration...
bool isInvalidDecl() const
llvm::iterator_range< specific_attr_iterator< T > > specific_attrs() const
SourceLocation getLocation() const
bool isTemplateParameterPack() const
isTemplateParameter - Determines whether this declaration is a template parameter pack.
void setImplicit(bool I=true)
redecl_range redecls() const
Returns an iterator range for all the redeclarations of the same decl.
DeclContext * getDeclContext()
SourceLocation getBeginLoc() const LLVM_READONLY
void setDeclContext(DeclContext *DC)
setDeclContext - Set both the semantic and lexical DeclContext to DC.
DeclContext * getLexicalDeclContext()
getLexicalDeclContext - The declaration context where this Decl was lexically declared (LexicalDC).
virtual Decl * getCanonicalDecl()
Retrieves the "canonical" declaration of the given declaration.
DeclarationNameLoc - Additional source/type location info for a declaration name.
static DeclarationNameLoc makeCXXOperatorNameLoc(SourceLocation BeginLoc, SourceLocation EndLoc)
Construct location information for a non-literal C++ operator.
The name of a declaration.
static int compare(DeclarationName LHS, DeclarationName RHS)
Represents a ValueDecl that came out of a declarator.
TypeSourceInfo * getTypeSourceInfo() const
Represents the type decltype(expr) (C++11).
Represents a C++17 deduced template specialization type.
void Profile(llvm::FoldingSetNodeID &ID) const
Common base class for placeholders for types that get replaced by placeholder type deduction: C++11 a...
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)
Internal representation of canonical, dependent decltype(expr) types.
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context)
Represents a qualified type name for which the type name is dependent.
void Profile(llvm::FoldingSetNodeID &ID)
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.
OverloadedOperatorKind getOperator() const
Return the overloaded operator to which this template name refers.
bool isIdentifier() const
Determine whether this template name refers to an identifier.
const IdentifierInfo * getIdentifier() const
Returns the identifier to which this template name refers.
void Profile(llvm::FoldingSetNodeID &ID)
Represents a template specialization type whose template cannot be resolved, e.g.
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context)
Internal representation of canonical, dependent typeof(expr) types.
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context)
Represents a vector type where either the type or size is dependent.
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context)
Concrete class used by the front-end to report problems and issues.
DiagnosticBuilder Report(SourceLocation Loc, unsigned DiagID)
Issue the message to the client.
unsigned getCustomDiagID(Level L, const char(&FormatString)[N])
Return an ID for a diagnostic with the specified format string and level.
Wrap a function effect's condition expression in another struct so that FunctionProtoType's TrailingO...
Represents a type that was referred to using an elaborated type keyword, e.g., struct S,...
void Profile(llvm::FoldingSetNodeID &ID)
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.
QualType getIntegerType() const
Return the integer type this enum decl corresponds to.
EnumDecl * getInstantiatedFromMemberEnum() const
Returns the enumeration (declared within the template) from which this enumeration type was instantia...
A helper class that allows the use of isa/cast/dyncast to detect TagType objects of enums.
EnumDecl * getDecl() const
This represents one expression.
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.
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.
bool isIntegerConstantExpr(const ASTContext &Ctx, SourceLocation *Loc=nullptr) const
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.
std::optional< llvm::APSInt > getIntegerConstantExpr(const ASTContext &Ctx, SourceLocation *Loc=nullptr) const
isIntegerConstantExpr - Return the value if this expression is a valid integer constant expression.
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 ExtKind hasExternalDefinitions(const Decl *D)
virtual void ReadComments()
Loads comment ranges.
virtual void CompleteRedeclChain(const Decl *D)
Gives the external AST source an opportunity to complete the redeclaration chain for a declaration.
virtual void PrintStats()
Print any statistics that have been gathered regarding the external AST source.
Represents a member of a struct/union/class.
bool isBitField() const
Determines whether this field is a bitfield.
unsigned getFieldIndex() const
Returns the index of this field within its record, as appropriate for passing to ASTRecordLayout::get...
unsigned getBitWidthValue(const ASTContext &Ctx) const
Computes the bit width of this field, if this is a bit field.
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.
TemplateSpecializationKind getTemplateSpecializationKind() const
Determine what kind of template instantiation this function represents.
bool isUserProvided() const
True if this method is user-declared and was not deleted or defaulted on its first declaration.
FunctionDecl * getInstantiatedFromMemberFunction() const
If this function is an instantiation of a member function of a class template specialization,...
bool isInlineDefinitionExternallyVisible() const
For an inline function definition in C, or for a gnu_inline function in C++, determine whether the de...
static FunctionEffectSet getIntersection(FunctionEffectsRef LHS, FunctionEffectsRef RHS)
static FunctionEffectSet getUnion(FunctionEffectsRef LHS, FunctionEffectsRef RHS, Conflicts &Errs)
Represents an abstract function effect, using just an enumeration describing its kind.
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.
IdentifierInfo & get(StringRef Name)
Return the identifier token info for the specified named identifier.
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)
The injected class name of a C++ class template or class template partial specialization.
static ItaniumMangleContext * create(ASTContext &Context, DiagnosticsEngine &Diags, bool IsAux=false)
@ Relative
Components in the vtable are relative offsets between the vtable and the other structs/functions.
@ Pointer
Components in the vtable are pointers to other structs/functions.
An lvalue reference type, per C++11 [dcl.ref].
@ Swift
Interoperability with the latest known version of the Swift runtime.
@ Swift4_2
Interoperability with the Swift 4.2 runtime.
@ Swift4_1
Interoperability with the Swift 4.1 runtime.
@ Integer
Permit vector bitcasts between integer vectors with different numbers of elements but the same total ...
@ All
Permit vector bitcasts between all vectors with the same total bit-width.
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
std::optional< TargetCXXABI::Kind > CXXABI
C++ ABI to compile with, if specified by the frontend through -fc++-abi=.
clang::ObjCRuntime ObjCRuntime
CoreFoundationABI CFRuntime
CommentOptions CommentOpts
Options for parsing comments.
std::string CUID
The user provided compilation unit ID, if non-empty.
static void Profile(llvm::FoldingSetNodeID &ID, Parts P)
Sugar type that represents a type that was qualified by a qualifier written as a macro invocation.
MangleContext - Context for tracking state which persists across multiple calls to the C++ name mangl...
Keeps track of the mangled names of lambda expressions and block literals within a particular context...
QualType getElementType() const
Returns type of the elements being stored in the matrix.
static bool isValidElementType(QualType T)
Valid elements types are the following:
A pointer to member type per C++ 8.3.3 - Pointers to members.
void Profile(llvm::FoldingSetNodeID &ID)
QualType getPointeeType() const
const Type * getClass() const
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.
IdentifierInfo * getIdentifier() const
Get the identifier that names this declaration, if there is one.
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
NamespaceDecl * getNamespace()
Retrieve the namespace declaration aliased by this directive.
Represent a C++ namespace.
static NamespaceDecl * Create(ASTContext &C, DeclContext *DC, bool Inline, SourceLocation StartLoc, SourceLocation IdLoc, IdentifierInfo *Id, NamespaceDecl *PrevDecl, bool Nested)
Represents a C++ nested name specifier, such as "\::std::vector<int>::".
bool isDependent() const
Whether this nested name specifier refers to a dependent type or not.
SpecifierKind getKind() const
Determine what kind of nested name specifier is stored.
static NestedNameSpecifier * Create(const ASTContext &Context, NestedNameSpecifier *Prefix, const IdentifierInfo *II)
Builds a specifier combining a prefix and an identifier.
NamespaceAliasDecl * getAsNamespaceAlias() const
Retrieve the namespace alias stored in this nested name specifier.
IdentifierInfo * getAsIdentifier() const
Retrieve the identifier stored in this nested name specifier.
NestedNameSpecifier * getPrefix() const
Return the prefix of this nested name specifier.
@ NamespaceAlias
A namespace alias, stored as a NamespaceAliasDecl*.
@ TypeSpec
A type, stored as a Type*.
@ TypeSpecWithTemplate
A type that was preceded by the 'template' keyword, stored as a Type*.
@ Super
Microsoft's '__super' specifier, stored as a CXXRecordDecl* of the class it appeared in.
@ Identifier
An identifier, stored as an IdentifierInfo*.
@ Global
The global specifier '::'. There is no stored value.
@ Namespace
A namespace, stored as a NamespaceDecl*.
NamespaceDecl * getAsNamespace() const
Retrieve the namespace stored in this nested name specifier.
const Type * getAsType() const
Retrieve the type stored in this nested name specifier.
NonTypeTemplateParmDecl - Declares a non-type template parameter, e.g., "Size" in.
static NonTypeTemplateParmDecl * Create(const ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, unsigned D, unsigned P, const IdentifierInfo *Id, QualType T, bool ParameterPack, TypeSourceInfo *TInfo)
Helper data structure representing the traits in a match clause of an declare variant or metadirectiv...
ObjCCategoryDecl - Represents a category declaration.
ObjCCategoryImplDecl - An object of this class encapsulates a category @implementation declaration.
ObjCContainerDecl - Represents a container for method declarations.
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 * getCanonicalDecl() override
Retrieves the canonical declaration of this Objective-C class.
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
Interfaces are the core concept in Objective-C for object oriented design.
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.
A class providing a concrete implementation of ObjCObjectType, so as to not increase the footprint of...
void Profile(llvm::FoldingSetNodeID &ID)
Represents a class type in Objective C.
bool isKindOfTypeAsWritten() const
Whether this is a "__kindof" type as written.
bool isSpecialized() const
Determine whether this object type is "specialized", meaning that it has type arguments.
ArrayRef< QualType > getTypeArgsAsWritten() const
Retrieve the type arguments of this object type as they were written.
bool isObjCQualifiedClass() const
QualType getBaseType() const
Gets the base type of this object type.
bool isKindOfType() const
Whether this ia a "__kindof" type (semantically).
bool isObjCQualifiedId() const
ArrayRef< QualType > getTypeArgs() const
Retrieve the type arguments of this object type (semantically).
bool isObjCUnqualifiedId() const
ObjCInterfaceDecl * getInterface() const
Gets the interface declaration for this object type, if the base type really is an interface.
QualType getSuperClassType() const
Retrieve the type of the superclass of this object type.
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
unsigned getNumProtocols() const
Return the number of qualifying protocols in this type, or 0 if there are none.
qual_iterator qual_end() const
qual_iterator qual_begin() 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...
Represents a type parameter type in Objective C.
void Profile(llvm::FoldingSetNodeID &ID)
A structure for storing the information associated with an overloaded template name.
Represents a C++11 pack expansion that produces a sequence of expressions.
Represents a pack expansion of types.
void Profile(llvm::FoldingSetNodeID &ID)
void Profile(llvm::FoldingSetNodeID &ID)
Sugar for parentheses used when specifying types.
void Profile(llvm::FoldingSetNodeID &ID)
void clear()
Clear parent maps.
Represents a parameter to a function.
ObjCDeclQualifier getObjCDeclQualifier() const
QualType getOriginalType() const
ParsedAttr - Represents a syntactic attribute.
void Profile(llvm::FoldingSetNodeID &ID)
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 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 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
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
unsigned getFastQualifiers() const
void removeAddressSpace()
void setAddressSpace(LangAS space)
static bool isAddressSpaceSupersetOf(LangAS A, LangAS B)
Returns true if address space A is equal to or a superset of B.
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 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)
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.
A helper class that allows the use of isa/cast/dyncast to detect TagType objects of structs/unions/cl...
RecordDecl * getDecl() const
decl_type * getFirstDecl()
Return the first declaration of this declaration or itself if this is the only declaration.
decl_type * getPreviousDecl()
Return the previous declaration of this declaration or NULL if this is the first declaration.
decl_type * getMostRecentDecl()
Returns the most recent (re)declaration of this declaration.
redecl_range redecls() const
Returns an iterator range for all the redeclarations of the same decl.
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.
DiagnosticsEngine & getDiagnostics() const
StringRef getBufferData(FileID FID, bool *Invalid=nullptr) const
Return a StringRef to the source buffer data for the specified FileID.
SourceLocation getSpellingLoc(SourceLocation Loc) const
Given a SourceLocation object, return the spelling location referenced by the ID.
unsigned getLineNumber(FileID FID, unsigned FilePos, bool *Invalid=nullptr) const
Given a SourceLocation, return the spelling line number for the position indicated.
bool isInSystemHeader(SourceLocation Loc) const
Returns if a SourceLocation is in a system header.
std::pair< FileID, unsigned > getDecomposedLoc(SourceLocation Loc) const
Decompose the specified location into a raw FileID + Offset pair.
SourceLocation getExpansionLoc(SourceLocation Loc) const
Given a SourceLocation object Loc, return the expansion location referenced by the ID.
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, const SourceLocation *Loc, unsigned NumConcatenated)
This is the "fully general" constructor that allows representation of strings formed from multiple co...
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.
TemplateName getReplacement() const
void Profile(llvm::FoldingSetNodeID &ID)
TemplateTemplateParmDecl * getParameter() const
Represents the result of substituting a set of types for a template type parameter pack.
void Profile(llvm::FoldingSetNodeID &ID)
Represents the result of substituting a type for a template type parameter.
void Profile(llvm::FoldingSetNodeID &ID)
Represents the declaration of a struct/union/class/enum.
TypedefNameDecl * getTypedefNameForAnonDecl() const
void startDefinition()
Starts the definition of this tag declaration.
TagDecl * getDecl() const
bool isMicrosoft() const
Is this ABI an MSVC-compatible ABI?
Kind
The basic C++ ABI kind.
static Kind getKind(StringRef Name)
Exposes information about the current target.
TargetOptions & getTargetOpts() const
Retrieve the target options.
const llvm::Triple & getTriple() const
Returns the target triple of the primary target.
IntType getInt64Type() const
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...
unsigned getBFloat16Width() const
getBFloat16Width/Align/Format - Return the size/align/format of '__bf16'.
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....
@ PNaClABIBuiltinVaList
__builtin_va_list as defined by the PNaCl ABI: http://www.chromium.org/nativeclient/pnacl/bitcode-abi...
@ 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.
uint64_t getPointerWidth(LangAS AddrSpace) const
Return the width of pointers on this target, for the specified address space.
static bool isTypeSigned(IntType T)
Returns true if the type is signed; false otherwise.
unsigned getHalfAlign() const
unsigned getBFloat16Align() 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 getHalfWidth() const
getHalfWidth/Align/Format - Return the size/align/format of 'half'.
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
unsigned getFloat128Width() const
getFloat128Width/Align/Format - Return the size/align/format of '__float128'.
const llvm::fltSemantics & getLongDoubleFormat() const
TargetCXXABI getCXXABI() const
Get the C++ ABI currently in use.
bool hasAArch64SVETypes() const
Returns whether or not the AArch64 SVE built-in types are available on this target.
bool useAddressSpaceMapMangling() const
Specify if mangling based on address space map should be used or not for language specific address sp...
unsigned getLongWidth() const
getLongWidth/Align - Return the size of 'signed long' and 'unsigned long' for this target,...
unsigned getFloat128Align() const
virtual bool hasBFloat16Type() const
Determine whether the _BFloat16 type is supported on this target.
const llvm::fltSemantics & getFloat128Format() const
unsigned getLongDoubleWidth() const
getLongDoubleWidth/Align/Format - Return the size/align/format of 'long double'.
unsigned getLongDoubleAlign() const
virtual std::optional< std::pair< unsigned, unsigned > > getVScaleRange(const LangOptions &LangOpts) const
Returns target-specific min and max values VScale_Range.
llvm::StringMap< bool > FeatureMap
The map of which features have been enabled disabled based on the command line.
A convenient class for passing around template argument information.
SourceLocation getRAngleLoc() const
llvm::ArrayRef< TemplateArgumentLoc > arguments() const
SourceLocation getLAngleLoc() const
A template argument list.
ArrayRef< TemplateArgument > asArray() const
Produce this as an array ref.
Location wrapper for a TemplateArgument.
Represents a template argument.
QualType getStructuralValueType() const
Get the type of a StructuralValue.
QualType getParamTypeForDecl() const
Expr * getAsExpr() const
Retrieve the template argument as an expression.
std::optional< unsigned > 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.
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() const
Retrieve the underlying template declaration that this template name refers to, if known.
DependentTemplateName * getAsDependentTemplateName() const
Retrieve the underlying dependent template name structure, if any.
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,...
@ 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.
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.
unsigned getNumArgs() const
void setArgLocInfo(unsigned i, TemplateArgumentLocInfo AI)
void setTemplateKeywordLoc(SourceLocation Loc)
void setTemplateNameLoc(SourceLocation Loc)
void setLAngleLoc(SourceLocation Loc)
void setRAngleLoc(SourceLocation Loc)
Represents a type template specialization; the template must be a class template, a type alias templa...
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Ctx)
TemplateTemplateParmDecl - Declares a template template parameter, e.g., "T" in.
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.
unsigned getDepth() const
Get the nesting depth of the template parameter.
bool isExpandedParameterPack() const
Whether this parameter is a template template parameter pack that has a known list of different templ...
static TemplateTemplateParmDecl * Create(const ASTContext &C, DeclContext *DC, SourceLocation L, unsigned D, unsigned P, bool ParameterPack, IdentifierInfo *Id, bool Typename, TemplateParameterList *Params)
Declaration of a template type parameter.
static TemplateTypeParmDecl * Create(const ASTContext &C, DeclContext *DC, SourceLocation KeyLoc, SourceLocation NameLoc, unsigned D, unsigned P, IdentifierInfo *Id, bool Typename, bool ParameterPack, bool HasTypeConstraint=false, std::optional< unsigned > NumExpanded=std::nullopt)
void Profile(llvm::FoldingSetNodeID &ID)
Models the abbreviated syntax to constrain a template type parameter: template <convertible_to<string...
ConceptDecl * getNamedConcept() const
Expr * getImmediatelyDeclaredConstraint() const
Get the immediately-declared constraint expression introduced by this type-constraint,...
ConceptReference * getConceptReference() const
Represents a declaration of a type.
void setTypeForDecl(const Type *TD)
const Type * getTypeForDecl() const
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...
Represents typeof(type), a C23 feature and GCC extension, or `typeof_unqual(type),...
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.
CXXRecordDecl * getAsCXXRecordDecl() const
Retrieves the CXXRecordDecl that this type refers to, either because the type is a RecordType or beca...
bool isBlockPointerType() const
bool isBooleanType() const
bool isFunctionReferenceType() const
bool isObjCBuiltinType() const
QualType getRVVEltType(const ASTContext &Ctx) const
Returns the representative type for the element of an RVV builtin type.
const RecordType * getAsUnionType() const
NOTE: getAs*ArrayType are methods on ASTContext.
bool isIncompleteArrayType() const
bool isPlaceholderType() const
Test for a type which does not represent an actual type-system type but is instead used as a placehol...
bool isSignedIntegerType() const
Return true if this is an integer type that is signed, according to C99 6.2.5p4 [char,...
bool isConstantArrayType() const
bool hasIntegerRepresentation() const
Determine whether this type has an integer representation of some sort, e.g., it is an integer type o...
bool isConstantSizeType() const
Return true if this is not a variable sized type, according to the rules of C99 6....
QualType getLocallyUnqualifiedSingleStepDesugaredType() const
Pull a single level of sugar off of this locally-unqualified type.
bool isFunctionPointerType() const
bool isPointerType() const
bool isArrayParameterType() const
bool isIntegerType() const
isIntegerType() does not include complex integers (a GCC extension).
const T * castAs() const
Member-template castAs<specific type>.
bool isSpecificPlaceholderType(unsigned K) const
Test for a specific placeholder 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 isSveVLSBuiltinType() const
Determines if this is a sizeless type supported by the 'arm_sve_vector_bits' type attribute,...
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.
bool hasUnsignedIntegerRepresentation() const
Determine whether this type has an unsigned integer representation of some sort, e....
QualType getSveEltType(const ASTContext &Ctx) const
Returns the representative type for the element of an SVE builtin type.
AutoType * getContainedAutoType() const
Get the AutoType whose type will be deduced for a variable with an initializer of this type.
bool isInstantiationDependentType() const
Determine whether this type is an instantiation-dependent type, meaning that the type involves a temp...
bool isBitIntType() const
bool isSpecificBuiltinType(unsigned K) const
Test for a particular builtin type.
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...
bool hasSignedIntegerRepresentation() const
Determine whether this type has an signed integer representation of some sort, e.g....
QualType getCanonicalTypeInternal() const
const Type * getBaseElementTypeUnsafe() const
Get the base element type of this type, potentially discarding type qualifiers.
bool isMemberPointerType() const
bool isObjCIdType() const
bool isUnsaturatedFixedPointType() const
Return true if this is a saturated fixed point type according to ISO/IEC JTC1 SC22 WG14 N1169.
const ArrayType * getAsArrayTypeUnsafe() const
A variant of getAs<> for array types which silently discards qualifiers from the outermost type.
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.
bool isUnsignedIntegerType() const
Return true if this is an integer type that is unsigned, according to C99 6.2.5p6 [which returns true...
bool isAnyPointerType() const
TypeClass getTypeClass() const
bool isCanonicalUnqualified() const
Determines if this type would be canonical if it had no further qualification.
const T * getAs() const
Member-template getAs<specific type>'.
const Type * getUnqualifiedDesugaredType() const
Return the specified type with any "sugar" removed from the type, removing any typedefs,...
bool isNullPtrType() const
bool isRecordType() const
bool isObjCRetainableType() const
std::optional< NullabilityKind > getNullability() const
Determine the nullability of the given type.
Represents the declaration of a typedef-name via the 'typedef' type specifier.
static TypedefDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id, TypeSourceInfo *TInfo)
Base class for declarations which introduce a typedef-name.
QualType getUnderlyingType() const
void setTypeSourceInfo(TypeSourceInfo *newType)
void Profile(llvm::FoldingSetNodeID &ID)
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,...
Represents a dependent using declaration which was marked with typename.
Represents a C++ using-enum-declaration.
Represents a shadow declaration implicitly introduced into a scope by a (resolved) using-declaration ...
void Profile(llvm::FoldingSetNodeID &ID)
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.
bool isStaticLocal() const
Returns true if a variable with function scope is a static local variable.
VarDecl * getInstantiatedFromStaticDataMember() const
If this variable is an instantiated static data member of a class template specialization,...
bool isInline() const
Whether this variable is (C++1z) inline.
@ DeclarationOnly
This declaration is only a declaration.
DefinitionKind hasDefinition(ASTContext &) const
Check whether this variable is defined in this translation unit.
TemplateSpecializationKind getTemplateSpecializationKind() const
If this variable is an instantiation of a variable template or a static data member of a class templa...
Represents a C array with a specified size that is not an integer-constant-expression.
Expr * getSizeExpr() const
Represents a GCC generic vector type.
unsigned getNumElements() const
void Profile(llvm::FoldingSetNodeID &ID)
VectorKind getVectorKind() const
QualType getElementType() const
Holds all information required to evaluate constexpr code in a module.
Defines the Linkage enumeration and various utility functions.
Defines the clang::TargetInfo interface.
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
Matches all kinds of arrays.
const AstTypeMatcher< TagType > tagType
Matches tag types (record and enum types).
The JSON file list parser is used to communicate input to InstallAPI.
@ Vector
'vector' clause, allowed on 'loop', Combined, and 'routine' directives.
@ Self
'self' clause, allowed on Compute and Combined Constructs, plus 'update'.
OverloadedOperatorKind
Enumeration specifying the different kinds of C++ overloaded operators.
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)
@ ICIS_NoInit
No in-class initializer.
CXXABI * CreateMicrosoftCXXABI(ASTContext &Ctx)
TypeOfKind
The kind of 'typeof' expression we're after.
CXXABI * CreateItaniumCXXABI(ASTContext &Ctx)
Creates an instance of a C++ ABI class.
const StreamingDiagnostic & operator<<(const StreamingDiagnostic &DB, const ASTContext::SectionInfo &Section)
Insertion operator for diagnostics.
Linkage
Describes the different kinds of linkage (C++ [basic.link], C99 6.2.2) that an entity may have.
@ External
External linkage, which indicates that the entity can be referred to from other translation units.
@ Result
The result type of a method or function.
ArraySizeModifier
Capture whether this is a normal array (e.g.
bool isComputedNoexcept(ExceptionSpecificationType ESpecType)
TagTypeKind
The kind of a tag type.
@ Interface
The "__interface" keyword.
@ Struct
The "struct" keyword.
@ Class
The "class" keyword.
bool isDiscardableGVALinkage(GVALinkage L)
BuiltinTemplateKind
Kinds of BuiltinTemplateDecl.
@ BTK__type_pack_element
This names the __type_pack_element BuiltinTemplateDecl.
@ BTK__make_integer_seq
This names the __make_integer_seq BuiltinTemplateDecl.
LangAS
Defines the address space values used by the address space qualifier of QualType.
TranslationUnitKind
Describes the kind of translation unit being processed.
bool isPtrSizeAddressSpace(LangAS AS)
ExprValueKind
The categorization of expression values, currently following the C++11 scheme.
@ VK_PRValue
A pr-value expression (in the C++11 taxonomy) produces a temporary value.
@ VK_XValue
An x-value expression is a reference to an object with independent storage but which can be "moved",...
@ VK_LValue
An l-value expression is a reference to an object with independent storage.
const FunctionProtoType * T
void printTemplateArgumentList(raw_ostream &OS, ArrayRef< TemplateArgument > Args, const PrintingPolicy &Policy, const TemplateParameterList *TPL=nullptr)
Print a template argument list, including the '<' and '>' enclosing the template arguments.
bool declaresSameEntity(const Decl *D1, const Decl *D2)
Determine whether two declarations declare the same entity.
TemplateSpecializationKind
Describes the kind of template specialization that a particular template specialization declaration r...
@ TSK_ExplicitInstantiationDefinition
This template specialization was instantiated from a template due to an explicit instantiation defini...
@ TSK_ExplicitInstantiationDeclaration
This template specialization was instantiated from a template due to an explicit instantiation declar...
@ TSK_ExplicitSpecialization
This template specialization was declared or defined by an explicit specialization (C++ [temp....
@ TSK_ImplicitInstantiation
This template specialization was implicitly instantiated from a template.
@ TSK_Undeclared
This template specialization was formed from a template-id but has not yet been declared,...
CallingConv
CallingConv - Specifies the calling convention that a function uses.
@ Invariant
The parameter is invariant: must match exactly.
@ Contravariant
The parameter is contravariant, e.g., X<T> is a subtype of X when the type parameter is covariant and...
@ Covariant
The parameter is covariant, e.g., X<T> is a subtype of X when the type parameter is covariant and T i...
@ AltiVecBool
is AltiVec 'vector bool ...'
@ SveFixedLengthData
is AArch64 SVE fixed-length data vector
@ AltiVecPixel
is AltiVec 'vector Pixel'
@ Generic
not a target-specific vector type
@ RVVFixedLengthData
is RISC-V RVV fixed-length data vector
@ RVVFixedLengthMask
is RISC-V RVV fixed-length mask vector
@ SveFixedLengthPredicate
is AArch64 SVE fixed-length predicate vector
LangAS getLangASFromTargetAS(unsigned TargetAS)
@ None
The alignment was not explicit in code.
@ RequiredByEnum
The alignment comes from an alignment attribute on a enum type.
@ RequiredByTypedef
The alignment comes from an alignment attribute on a typedef.
@ RequiredByRecord
The alignment comes from an alignment attribute on a record type.
ElaboratedTypeKeyword
The elaboration keyword that precedes a qualified type name or introduces an elaborated-type-specifie...
@ None
No keyword precedes the qualified type name.
@ 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.
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...
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
unsigned HasTrailingReturn
bool requiresFunctionProtoTypeExtraBitfields() const
FunctionType::ExtInfo ExtInfo
A simple holder for a QualType representing a type in an exception specification.
A holder for Arm type attributes as described in the Arm C/C++ Language extensions which are not part...
A lazy value (of type T) that is within an AST node of type Owner, where the value might change in la...
Parts of a decomposed MSGuidDecl.
Contains information gathered from parsing the contents of TargetAttr.
Describes how types, statements, expressions, and declarations should be printed.
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.
A this pointer adjustment.
IntType
===-— Target Data Type Query Methods ----------------------------—===//
AlignRequirementKind AlignRequirement
AlignRequirementKind AlignRequirement