File indexing completed on 2026-05-10 08:36:28
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014 #ifndef LLVM_CLANG_AST_ASTCONTEXT_H
0015 #define LLVM_CLANG_AST_ASTCONTEXT_H
0016
0017 #include "clang/AST/ASTFwd.h"
0018 #include "clang/AST/CanonicalType.h"
0019 #include "clang/AST/CommentCommandTraits.h"
0020 #include "clang/AST/ComparisonCategories.h"
0021 #include "clang/AST/Decl.h"
0022 #include "clang/AST/DeclarationName.h"
0023 #include "clang/AST/ExternalASTSource.h"
0024 #include "clang/AST/PrettyPrinter.h"
0025 #include "clang/AST/RawCommentList.h"
0026 #include "clang/AST/SYCLKernelInfo.h"
0027 #include "clang/AST/TemplateName.h"
0028 #include "clang/Basic/LLVM.h"
0029 #include "clang/Basic/PartialDiagnostic.h"
0030 #include "clang/Basic/SourceLocation.h"
0031 #include "llvm/ADT/DenseMap.h"
0032 #include "llvm/ADT/DenseSet.h"
0033 #include "llvm/ADT/FoldingSet.h"
0034 #include "llvm/ADT/IntrusiveRefCntPtr.h"
0035 #include "llvm/ADT/MapVector.h"
0036 #include "llvm/ADT/PointerIntPair.h"
0037 #include "llvm/ADT/PointerUnion.h"
0038 #include "llvm/ADT/SetVector.h"
0039 #include "llvm/ADT/SmallVector.h"
0040 #include "llvm/ADT/StringMap.h"
0041 #include "llvm/ADT/StringRef.h"
0042 #include "llvm/ADT/StringSet.h"
0043 #include "llvm/ADT/TinyPtrVector.h"
0044 #include "llvm/Support/TypeSize.h"
0045 #include <optional>
0046
0047 namespace llvm {
0048
0049 class APFixedPoint;
0050 class FixedPointSemantics;
0051 struct fltSemantics;
0052 template <typename T, unsigned N> class SmallPtrSet;
0053
0054 }
0055
0056 namespace clang {
0057
0058 class APValue;
0059 class ASTMutationListener;
0060 class ASTRecordLayout;
0061 class AtomicExpr;
0062 class BlockExpr;
0063 struct BlockVarCopyInit;
0064 class BuiltinTemplateDecl;
0065 class CharUnits;
0066 class ConceptDecl;
0067 class CXXABI;
0068 class CXXConstructorDecl;
0069 class CXXMethodDecl;
0070 class CXXRecordDecl;
0071 class DiagnosticsEngine;
0072 class DynTypedNodeList;
0073 class Expr;
0074 enum class FloatModeKind;
0075 class GlobalDecl;
0076 class IdentifierTable;
0077 class LangOptions;
0078 class MangleContext;
0079 class MangleNumberingContext;
0080 class MemberSpecializationInfo;
0081 class Module;
0082 struct MSGuidDeclParts;
0083 class NestedNameSpecifier;
0084 class NoSanitizeList;
0085 class ObjCCategoryDecl;
0086 class ObjCCategoryImplDecl;
0087 class ObjCContainerDecl;
0088 class ObjCImplDecl;
0089 class ObjCImplementationDecl;
0090 class ObjCInterfaceDecl;
0091 class ObjCIvarDecl;
0092 class ObjCMethodDecl;
0093 class ObjCPropertyDecl;
0094 class ObjCPropertyImplDecl;
0095 class ObjCProtocolDecl;
0096 class ObjCTypeParamDecl;
0097 class OMPTraitInfo;
0098 class ParentMapContext;
0099 struct ParsedTargetAttr;
0100 class Preprocessor;
0101 class ProfileList;
0102 class StoredDeclsMap;
0103 class TargetAttr;
0104 class TargetInfo;
0105 class TemplateDecl;
0106 class TemplateParameterList;
0107 class TemplateTemplateParmDecl;
0108 class TemplateTypeParmDecl;
0109 class TypeConstraint;
0110 class UnresolvedSetIterator;
0111 class UsingShadowDecl;
0112 class VarTemplateDecl;
0113 class VTableContextBase;
0114 class XRayFunctionFilter;
0115
0116
0117 typedef SmallVector<CXXBaseSpecifier *, 4> CXXCastPath;
0118
0119 namespace Builtin {
0120
0121 class Context;
0122
0123 }
0124
0125 enum BuiltinTemplateKind : int;
0126 enum OpenCLTypeKind : uint8_t;
0127
0128 namespace comments {
0129
0130 class FullComment;
0131
0132 }
0133
0134 namespace interp {
0135
0136 class Context;
0137
0138 }
0139
0140 namespace serialization {
0141 template <class> class AbstractTypeReader;
0142 }
0143
0144 enum class AlignRequirementKind {
0145
0146 None,
0147
0148
0149 RequiredByTypedef,
0150
0151
0152 RequiredByRecord,
0153
0154
0155 RequiredByEnum,
0156 };
0157
0158 struct TypeInfo {
0159 uint64_t Width = 0;
0160 unsigned Align = 0;
0161 AlignRequirementKind AlignRequirement;
0162
0163 TypeInfo() : AlignRequirement(AlignRequirementKind::None) {}
0164 TypeInfo(uint64_t Width, unsigned Align,
0165 AlignRequirementKind AlignRequirement)
0166 : Width(Width), Align(Align), AlignRequirement(AlignRequirement) {}
0167 bool isAlignRequired() {
0168 return AlignRequirement != AlignRequirementKind::None;
0169 }
0170 };
0171
0172 struct TypeInfoChars {
0173 CharUnits Width;
0174 CharUnits Align;
0175 AlignRequirementKind AlignRequirement;
0176
0177 TypeInfoChars() : AlignRequirement(AlignRequirementKind::None) {}
0178 TypeInfoChars(CharUnits Width, CharUnits Align,
0179 AlignRequirementKind AlignRequirement)
0180 : Width(Width), Align(Align), AlignRequirement(AlignRequirement) {}
0181 bool isAlignRequired() {
0182 return AlignRequirement != AlignRequirementKind::None;
0183 }
0184 };
0185
0186
0187
0188 class ASTContext : public RefCountedBase<ASTContext> {
0189 friend class NestedNameSpecifier;
0190
0191 mutable SmallVector<Type *, 0> Types;
0192 mutable llvm::FoldingSet<ExtQuals> ExtQualNodes;
0193 mutable llvm::FoldingSet<ComplexType> ComplexTypes;
0194 mutable llvm::FoldingSet<PointerType> PointerTypes{GeneralTypesLog2InitSize};
0195 mutable llvm::FoldingSet<AdjustedType> AdjustedTypes;
0196 mutable llvm::FoldingSet<BlockPointerType> BlockPointerTypes;
0197 mutable llvm::FoldingSet<LValueReferenceType> LValueReferenceTypes;
0198 mutable llvm::FoldingSet<RValueReferenceType> RValueReferenceTypes;
0199 mutable llvm::FoldingSet<MemberPointerType> MemberPointerTypes;
0200 mutable llvm::ContextualFoldingSet<ConstantArrayType, ASTContext &>
0201 ConstantArrayTypes;
0202 mutable llvm::FoldingSet<IncompleteArrayType> IncompleteArrayTypes;
0203 mutable std::vector<VariableArrayType*> VariableArrayTypes;
0204 mutable llvm::ContextualFoldingSet<DependentSizedArrayType, ASTContext &>
0205 DependentSizedArrayTypes;
0206 mutable llvm::ContextualFoldingSet<DependentSizedExtVectorType, ASTContext &>
0207 DependentSizedExtVectorTypes;
0208 mutable llvm::ContextualFoldingSet<DependentAddressSpaceType, ASTContext &>
0209 DependentAddressSpaceTypes;
0210 mutable llvm::FoldingSet<VectorType> VectorTypes;
0211 mutable llvm::ContextualFoldingSet<DependentVectorType, ASTContext &>
0212 DependentVectorTypes;
0213 mutable llvm::FoldingSet<ConstantMatrixType> MatrixTypes;
0214 mutable llvm::ContextualFoldingSet<DependentSizedMatrixType, ASTContext &>
0215 DependentSizedMatrixTypes;
0216 mutable llvm::FoldingSet<FunctionNoProtoType> FunctionNoProtoTypes;
0217 mutable llvm::ContextualFoldingSet<FunctionProtoType, ASTContext&>
0218 FunctionProtoTypes;
0219 mutable llvm::ContextualFoldingSet<DependentTypeOfExprType, ASTContext &>
0220 DependentTypeOfExprTypes;
0221 mutable llvm::ContextualFoldingSet<DependentDecltypeType, ASTContext &>
0222 DependentDecltypeTypes;
0223
0224 mutable llvm::FoldingSet<PackIndexingType> DependentPackIndexingTypes;
0225
0226 mutable llvm::FoldingSet<TemplateTypeParmType> TemplateTypeParmTypes;
0227 mutable llvm::FoldingSet<ObjCTypeParamType> ObjCTypeParamTypes;
0228 mutable llvm::FoldingSet<SubstTemplateTypeParmType>
0229 SubstTemplateTypeParmTypes;
0230 mutable llvm::FoldingSet<SubstTemplateTypeParmPackType>
0231 SubstTemplateTypeParmPackTypes;
0232 mutable llvm::ContextualFoldingSet<TemplateSpecializationType, ASTContext&>
0233 TemplateSpecializationTypes;
0234 mutable llvm::FoldingSet<ParenType> ParenTypes{GeneralTypesLog2InitSize};
0235 mutable llvm::FoldingSet<UsingType> UsingTypes;
0236 mutable llvm::FoldingSet<TypedefType> TypedefTypes;
0237 mutable llvm::FoldingSet<ElaboratedType> ElaboratedTypes{
0238 GeneralTypesLog2InitSize};
0239 mutable llvm::FoldingSet<DependentNameType> DependentNameTypes;
0240 mutable llvm::ContextualFoldingSet<DependentTemplateSpecializationType,
0241 ASTContext&>
0242 DependentTemplateSpecializationTypes;
0243 mutable llvm::FoldingSet<PackExpansionType> PackExpansionTypes;
0244 mutable llvm::FoldingSet<ObjCObjectTypeImpl> ObjCObjectTypes;
0245 mutable llvm::FoldingSet<ObjCObjectPointerType> ObjCObjectPointerTypes;
0246 mutable llvm::FoldingSet<DependentUnaryTransformType>
0247 DependentUnaryTransformTypes;
0248
0249
0250
0251
0252 mutable llvm::DenseMap<llvm::FoldingSetNodeID, AutoType *> AutoTypes;
0253 mutable llvm::FoldingSet<DeducedTemplateSpecializationType>
0254 DeducedTemplateSpecializationTypes;
0255 mutable llvm::FoldingSet<AtomicType> AtomicTypes;
0256 mutable llvm::FoldingSet<AttributedType> AttributedTypes;
0257 mutable llvm::FoldingSet<PipeType> PipeTypes;
0258 mutable llvm::FoldingSet<BitIntType> BitIntTypes;
0259 mutable llvm::ContextualFoldingSet<DependentBitIntType, ASTContext &>
0260 DependentBitIntTypes;
0261 mutable llvm::FoldingSet<BTFTagAttributedType> BTFTagAttributedTypes;
0262 llvm::FoldingSet<HLSLAttributedResourceType> HLSLAttributedResourceTypes;
0263
0264 mutable llvm::FoldingSet<CountAttributedType> CountAttributedTypes;
0265
0266 mutable llvm::FoldingSet<QualifiedTemplateName> QualifiedTemplateNames;
0267 mutable llvm::FoldingSet<DependentTemplateName> DependentTemplateNames;
0268 mutable llvm::FoldingSet<SubstTemplateTemplateParmStorage>
0269 SubstTemplateTemplateParms;
0270 mutable llvm::ContextualFoldingSet<SubstTemplateTemplateParmPackStorage,
0271 ASTContext&>
0272 SubstTemplateTemplateParmPacks;
0273 mutable llvm::ContextualFoldingSet<DeducedTemplateStorage, ASTContext &>
0274 DeducedTemplates;
0275
0276 mutable llvm::ContextualFoldingSet<ArrayParameterType, ASTContext &>
0277 ArrayParameterTypes;
0278
0279
0280
0281
0282 mutable llvm::FoldingSet<NestedNameSpecifier> NestedNameSpecifiers;
0283 mutable NestedNameSpecifier *GlobalNestedNameSpecifier = nullptr;
0284
0285
0286
0287
0288 mutable llvm::DenseMap<const RecordDecl*, const ASTRecordLayout*>
0289 ASTRecordLayouts;
0290 mutable llvm::DenseMap<const ObjCContainerDecl*, const ASTRecordLayout*>
0291 ObjCLayouts;
0292
0293
0294 using TypeInfoMap = llvm::DenseMap<const Type *, struct TypeInfo>;
0295 mutable TypeInfoMap MemoizedTypeInfo;
0296
0297
0298
0299
0300 using UnadjustedAlignMap = llvm::DenseMap<const Type *, unsigned>;
0301 mutable UnadjustedAlignMap MemoizedUnadjustedAlign;
0302
0303
0304 llvm::DenseMap<const CXXRecordDecl*, LazyDeclPtr> KeyFunctions;
0305
0306
0307 llvm::DenseMap<ObjCContainerDecl*, ObjCImplDecl*> ObjCImpls;
0308
0309
0310
0311 llvm::DenseMap<const ObjCMethodDecl*,const ObjCMethodDecl*> ObjCMethodRedecls;
0312
0313
0314 llvm::DenseMap<const VarDecl *, BlockVarCopyInit> BlockVarCopyInits;
0315
0316
0317 mutable llvm::FoldingSet<MSGuidDecl> MSGuidDecls;
0318
0319
0320 mutable llvm::FoldingSet<UnnamedGlobalConstantDecl>
0321 UnnamedGlobalConstantDecls;
0322
0323
0324 mutable llvm::FoldingSet<TemplateParamObjectDecl> TemplateParamObjectDecls;
0325
0326
0327
0328
0329
0330 mutable llvm::StringMap<StringLiteral *> StringLiteralCache;
0331
0332
0333
0334
0335
0336
0337
0338 unsigned NextStringLiteralVersion = 0;
0339
0340
0341
0342 mutable std::string CUIDHash;
0343
0344
0345
0346 class CanonicalTemplateTemplateParm : public llvm::FoldingSetNode {
0347 TemplateTemplateParmDecl *Parm;
0348
0349 public:
0350 CanonicalTemplateTemplateParm(TemplateTemplateParmDecl *Parm)
0351 : Parm(Parm) {}
0352
0353 TemplateTemplateParmDecl *getParam() const { return Parm; }
0354
0355 void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &C) {
0356 Profile(ID, C, Parm);
0357 }
0358
0359 static void Profile(llvm::FoldingSetNodeID &ID,
0360 const ASTContext &C,
0361 TemplateTemplateParmDecl *Parm);
0362 };
0363 mutable llvm::ContextualFoldingSet<CanonicalTemplateTemplateParm,
0364 const ASTContext&>
0365 CanonTemplateTemplateParms;
0366
0367 TemplateTemplateParmDecl *
0368 getCanonicalTemplateTemplateParmDecl(TemplateTemplateParmDecl *TTP) const;
0369
0370
0371 mutable TypedefDecl *Int128Decl = nullptr;
0372
0373
0374 mutable TypedefDecl *UInt128Decl = nullptr;
0375
0376
0377
0378 mutable TypedefDecl *BuiltinVaListDecl = nullptr;
0379
0380
0381 mutable TypedefDecl *BuiltinMSVaListDecl = nullptr;
0382
0383
0384 mutable TypedefDecl *ObjCIdDecl = nullptr;
0385
0386
0387 mutable TypedefDecl *ObjCSelDecl = nullptr;
0388
0389
0390 mutable TypedefDecl *ObjCClassDecl = nullptr;
0391
0392
0393 mutable ObjCInterfaceDecl *ObjCProtocolClassDecl = nullptr;
0394
0395
0396 mutable TypedefDecl *BOOLDecl = nullptr;
0397
0398
0399
0400 QualType ObjCIdRedefinitionType;
0401 QualType ObjCClassRedefinitionType;
0402 QualType ObjCSelRedefinitionType;
0403
0404
0405 mutable IdentifierInfo *BoolName = nullptr;
0406
0407
0408 mutable IdentifierInfo *NSObjectName = nullptr;
0409
0410
0411 IdentifierInfo *NSCopyingName = nullptr;
0412
0413
0414 mutable IdentifierInfo *MakeIntegerSeqName = nullptr;
0415
0416
0417 mutable IdentifierInfo *TypePackElementName = nullptr;
0418
0419
0420 mutable IdentifierInfo *BuiltinCommonTypeName = nullptr;
0421
0422 QualType ObjCConstantStringType;
0423 mutable RecordDecl *CFConstantStringTagDecl = nullptr;
0424 mutable TypedefDecl *CFConstantStringTypeDecl = nullptr;
0425
0426 mutable QualType ObjCSuperType;
0427
0428 QualType ObjCNSStringType;
0429
0430
0431 TypedefDecl *ObjCInstanceTypeDecl = nullptr;
0432
0433
0434 TypeDecl *FILEDecl = nullptr;
0435
0436
0437 TypeDecl *jmp_bufDecl = nullptr;
0438
0439
0440 TypeDecl *sigjmp_bufDecl = nullptr;
0441
0442
0443 TypeDecl *ucontext_tDecl = nullptr;
0444
0445
0446
0447
0448
0449 mutable RecordDecl *BlockDescriptorType = nullptr;
0450
0451
0452
0453
0454
0455 mutable RecordDecl *BlockDescriptorExtendedType = nullptr;
0456
0457
0458 FunctionDecl *cudaConfigureCallDecl = nullptr;
0459
0460
0461
0462
0463
0464 llvm::DenseMap<const Decl*, AttrVec*> DeclAttrs;
0465
0466
0467
0468
0469 llvm::DenseMap<Decl*, Decl*> MergedDecls;
0470
0471
0472
0473
0474 llvm::DenseMap<NamedDecl*, llvm::TinyPtrVector<Module*>> MergedDefModules;
0475
0476
0477
0478
0479
0480 struct PerModuleInitializers {
0481 llvm::SmallVector<Decl*, 4> Initializers;
0482 llvm::SmallVector<GlobalDeclID, 4> LazyInitializers;
0483
0484 void resolve(ASTContext &Ctx);
0485 };
0486 llvm::DenseMap<Module*, PerModuleInitializers*> ModuleInitializers;
0487
0488
0489 Module *CurrentCXXNamedModule = nullptr;
0490
0491
0492
0493
0494
0495
0496 llvm::StringMap<const Module *> PrimaryModuleNameMap;
0497 llvm::DenseMap<const Module *, const Module *> SameModuleLookupSet;
0498
0499 static constexpr unsigned ConstantArrayTypesLog2InitSize = 8;
0500 static constexpr unsigned GeneralTypesLog2InitSize = 9;
0501 static constexpr unsigned FunctionProtoTypesLog2InitSize = 12;
0502
0503 ASTContext &this_() { return *this; }
0504
0505 public:
0506
0507 using TemplateOrSpecializationInfo =
0508 llvm::PointerUnion<VarTemplateDecl *, MemberSpecializationInfo *>;
0509
0510 private:
0511 friend class ASTDeclReader;
0512 friend class ASTReader;
0513 friend class ASTWriter;
0514 template <class> friend class serialization::AbstractTypeReader;
0515 friend class CXXRecordDecl;
0516 friend class IncrementalParser;
0517
0518
0519
0520
0521
0522
0523
0524
0525
0526
0527
0528
0529
0530
0531
0532
0533
0534
0535
0536
0537
0538
0539
0540
0541
0542
0543
0544
0545
0546
0547
0548 llvm::DenseMap<const VarDecl *, TemplateOrSpecializationInfo>
0549 TemplateOrInstantiation;
0550
0551
0552
0553
0554
0555
0556
0557
0558
0559
0560
0561
0562
0563
0564
0565
0566
0567
0568
0569
0570
0571
0572
0573
0574 llvm::DenseMap<NamedDecl *, NamedDecl *> InstantiatedFromUsingDecl;
0575
0576
0577
0578
0579
0580
0581
0582
0583 llvm::DenseMap<UsingEnumDecl *, UsingEnumDecl *>
0584 InstantiatedFromUsingEnumDecl;
0585
0586
0587 llvm::DenseMap<UsingShadowDecl*, UsingShadowDecl*>
0588 InstantiatedFromUsingShadowDecl;
0589
0590 llvm::DenseMap<FieldDecl *, FieldDecl *> InstantiatedFromUnnamedFieldDecl;
0591
0592
0593
0594
0595
0596
0597
0598 using CXXMethodVector = llvm::TinyPtrVector<const CXXMethodDecl *>;
0599 llvm::DenseMap<const CXXMethodDecl *, CXXMethodVector> OverriddenMethods;
0600
0601
0602
0603
0604 llvm::DenseMap<const DeclContext *, std::unique_ptr<MangleNumberingContext>>
0605 MangleNumberingContexts;
0606 llvm::DenseMap<const Decl *, std::unique_ptr<MangleNumberingContext>>
0607 ExtraMangleNumberingContexts;
0608
0609
0610
0611 llvm::MapVector<const NamedDecl *, unsigned> MangleNumbers;
0612 llvm::MapVector<const VarDecl *, unsigned> StaticLocalNumbers;
0613
0614 mutable llvm::DenseMap<const CXXRecordDecl *, unsigned>
0615 DeviceLambdaManglingNumbers;
0616
0617
0618
0619 using ParameterIndexTable = llvm::DenseMap<const VarDecl *, unsigned>;
0620 ParameterIndexTable ParamIndices;
0621
0622 ImportDecl *FirstLocalImport = nullptr;
0623 ImportDecl *LastLocalImport = nullptr;
0624
0625 TranslationUnitDecl *TUDecl = nullptr;
0626 mutable ExternCContextDecl *ExternCContext = nullptr;
0627 mutable BuiltinTemplateDecl *MakeIntegerSeqDecl = nullptr;
0628 mutable BuiltinTemplateDecl *TypePackElementDecl = nullptr;
0629 mutable BuiltinTemplateDecl *BuiltinCommonTypeDecl = nullptr;
0630
0631
0632 SourceManager &SourceMgr;
0633
0634
0635
0636 LangOptions &LangOpts;
0637
0638
0639
0640 std::unique_ptr<NoSanitizeList> NoSanitizeL;
0641
0642
0643
0644 std::unique_ptr<XRayFunctionFilter> XRayFilter;
0645
0646
0647
0648 std::unique_ptr<ProfileList> ProfList;
0649
0650
0651
0652
0653
0654 mutable llvm::BumpPtrAllocator BumpAlloc;
0655
0656
0657 PartialDiagnostic::DiagStorageAllocator DiagAllocator;
0658
0659
0660 std::unique_ptr<CXXABI> ABI;
0661 CXXABI *createCXXABI(const TargetInfo &T);
0662
0663
0664
0665 bool AddrSpaceMapMangling;
0666
0667
0668 mutable bool AnyFunctionEffects = false;
0669
0670 const TargetInfo *Target = nullptr;
0671 const TargetInfo *AuxTarget = nullptr;
0672 clang::PrintingPolicy PrintingPolicy;
0673 std::unique_ptr<interp::Context> InterpContext;
0674 std::unique_ptr<ParentMapContext> ParentMapCtx;
0675
0676
0677 DeclListNode *ListNodeFreeList = nullptr;
0678
0679 public:
0680 IdentifierTable &Idents;
0681 SelectorTable &Selectors;
0682 Builtin::Context &BuiltinInfo;
0683 const TranslationUnitKind TUKind;
0684 mutable DeclarationNameTable DeclarationNames;
0685 IntrusiveRefCntPtr<ExternalASTSource> ExternalSource;
0686 ASTMutationListener *Listener = nullptr;
0687
0688
0689 interp::Context &getInterpContext();
0690
0691 struct CUDAConstantEvalContext {
0692
0693 bool NoWrongSidedVars = false;
0694 } CUDAConstantEvalCtx;
0695 struct CUDAConstantEvalContextRAII {
0696 ASTContext &Ctx;
0697 CUDAConstantEvalContext SavedCtx;
0698 CUDAConstantEvalContextRAII(ASTContext &Ctx_, bool NoWrongSidedVars)
0699 : Ctx(Ctx_), SavedCtx(Ctx_.CUDAConstantEvalCtx) {
0700 Ctx_.CUDAConstantEvalCtx.NoWrongSidedVars = NoWrongSidedVars;
0701 }
0702 ~CUDAConstantEvalContextRAII() { Ctx.CUDAConstantEvalCtx = SavedCtx; }
0703 };
0704
0705
0706 ParentMapContext &getParentMapContext();
0707
0708
0709
0710
0711
0712
0713
0714
0715
0716
0717
0718
0719
0720
0721
0722
0723
0724
0725
0726 std::vector<Decl *> getTraversalScope() const { return TraversalScope; }
0727 void setTraversalScope(const std::vector<Decl *> &);
0728
0729
0730
0731 template <typename NodeT> DynTypedNodeList getParents(const NodeT &Node);
0732
0733 const clang::PrintingPolicy &getPrintingPolicy() const {
0734 return PrintingPolicy;
0735 }
0736
0737 void setPrintingPolicy(const clang::PrintingPolicy &Policy) {
0738 PrintingPolicy = Policy;
0739 }
0740
0741 SourceManager& getSourceManager() { return SourceMgr; }
0742 const SourceManager& getSourceManager() const { return SourceMgr; }
0743
0744
0745
0746
0747
0748 void cleanup();
0749
0750 llvm::BumpPtrAllocator &getAllocator() const {
0751 return BumpAlloc;
0752 }
0753
0754 void *Allocate(size_t Size, unsigned Align = 8) const {
0755 return BumpAlloc.Allocate(Size, Align);
0756 }
0757 template <typename T> T *Allocate(size_t Num = 1) const {
0758 return static_cast<T *>(Allocate(Num * sizeof(T), alignof(T)));
0759 }
0760 void Deallocate(void *Ptr) const {}
0761
0762 llvm::StringRef backupStr(llvm::StringRef S) const {
0763 char *Buf = new (*this) char[S.size()];
0764 std::copy(S.begin(), S.end(), Buf);
0765 return llvm::StringRef(Buf, S.size());
0766 }
0767
0768
0769
0770 DeclListNode *AllocateDeclListNode(clang::NamedDecl *ND) {
0771 if (DeclListNode *Alloc = ListNodeFreeList) {
0772 ListNodeFreeList = dyn_cast_if_present<DeclListNode *>(Alloc->Rest);
0773 Alloc->D = ND;
0774 Alloc->Rest = nullptr;
0775 return Alloc;
0776 }
0777 return new (*this) DeclListNode(ND);
0778 }
0779
0780
0781 void DeallocateDeclListNode(DeclListNode *N) {
0782 N->Rest = ListNodeFreeList;
0783 ListNodeFreeList = N;
0784 }
0785
0786
0787
0788 size_t getASTAllocatedMemory() const {
0789 return BumpAlloc.getTotalMemory();
0790 }
0791
0792
0793 size_t getSideTableAllocatedMemory() const;
0794
0795 PartialDiagnostic::DiagStorageAllocator &getDiagAllocator() {
0796 return DiagAllocator;
0797 }
0798
0799 const TargetInfo &getTargetInfo() const { return *Target; }
0800 const TargetInfo *getAuxTargetInfo() const { return AuxTarget; }
0801
0802 const QualType GetHigherPrecisionFPType(QualType ElementType) const {
0803 const auto *CurrentBT = cast<BuiltinType>(ElementType);
0804 switch (CurrentBT->getKind()) {
0805 case BuiltinType::Kind::Half:
0806 case BuiltinType::Kind::Float16:
0807 return FloatTy;
0808 case BuiltinType::Kind::Float:
0809 case BuiltinType::Kind::BFloat16:
0810 return DoubleTy;
0811 case BuiltinType::Kind::Double:
0812 return LongDoubleTy;
0813 default:
0814 return ElementType;
0815 }
0816 return ElementType;
0817 }
0818
0819
0820
0821
0822
0823 QualType getIntTypeForBitwidth(unsigned DestWidth,
0824 unsigned Signed) const;
0825
0826
0827
0828
0829 QualType getRealTypeForBitwidth(unsigned DestWidth,
0830 FloatModeKind ExplicitType) const;
0831
0832 bool AtomicUsesUnsupportedLibcall(const AtomicExpr *E) const;
0833
0834 const LangOptions& getLangOpts() const { return LangOpts; }
0835
0836
0837
0838
0839
0840 bool isDependenceAllowed() const {
0841 return LangOpts.CPlusPlus || LangOpts.RecoveryAST;
0842 }
0843
0844 const NoSanitizeList &getNoSanitizeList() const { return *NoSanitizeL; }
0845
0846 bool isTypeIgnoredBySanitizer(const SanitizerMask &Mask,
0847 const QualType &Ty) const;
0848
0849 const XRayFunctionFilter &getXRayFilter() const {
0850 return *XRayFilter;
0851 }
0852
0853 const ProfileList &getProfileList() const { return *ProfList; }
0854
0855 DiagnosticsEngine &getDiagnostics() const;
0856
0857 FullSourceLoc getFullLoc(SourceLocation Loc) const {
0858 return FullSourceLoc(Loc,SourceMgr);
0859 }
0860
0861
0862
0863
0864 TargetCXXABI::Kind getCXXABIKind() const;
0865
0866
0867 RawCommentList Comments;
0868
0869
0870 mutable bool CommentsLoaded = false;
0871
0872
0873
0874
0875
0876 mutable llvm::DenseMap<const Decl *, const RawComment *> DeclRawComments;
0877
0878
0879
0880
0881
0882
0883 mutable llvm::DenseMap<const Decl *, const Decl *> RedeclChainComments;
0884
0885
0886
0887
0888
0889
0890
0891
0892 mutable llvm::DenseMap<const Decl *, const Decl *> CommentlessRedeclChains;
0893
0894
0895
0896 mutable llvm::DenseMap<const Decl *, comments::FullComment *> ParsedComments;
0897
0898
0899
0900
0901
0902
0903 void cacheRawCommentForDecl(const Decl &OriginalD,
0904 const RawComment &Comment) const;
0905
0906
0907
0908
0909
0910
0911 RawComment *getRawCommentForDeclNoCacheImpl(
0912 const Decl *D, const SourceLocation RepresentativeLocForDecl,
0913 const std::map<unsigned, RawComment *> &CommentsInFile) const;
0914
0915
0916
0917 RawComment *getRawCommentForDeclNoCache(const Decl *D) const;
0918
0919 public:
0920 void addComment(const RawComment &RC);
0921
0922
0923
0924
0925
0926
0927 const RawComment *
0928 getRawCommentForAnyRedecl(const Decl *D,
0929 const Decl **OriginalDecl = nullptr) const;
0930
0931
0932
0933
0934
0935
0936
0937
0938 void attachCommentsToJustParsedDecls(ArrayRef<Decl *> Decls,
0939 const Preprocessor *PP);
0940
0941
0942
0943
0944
0945
0946 comments::FullComment *getCommentForDecl(const Decl *D,
0947 const Preprocessor *PP) const;
0948
0949
0950
0951
0952 comments::FullComment *getLocalCommentForDeclUncached(const Decl *D) const;
0953
0954 comments::FullComment *cloneFullComment(comments::FullComment *FC,
0955 const Decl *D) const;
0956
0957 private:
0958 mutable comments::CommandTraits CommentCommandTraits;
0959
0960
0961 class import_iterator {
0962 ImportDecl *Import = nullptr;
0963
0964 public:
0965 using value_type = ImportDecl *;
0966 using reference = ImportDecl *;
0967 using pointer = ImportDecl *;
0968 using difference_type = int;
0969 using iterator_category = std::forward_iterator_tag;
0970
0971 import_iterator() = default;
0972 explicit import_iterator(ImportDecl *Import) : Import(Import) {}
0973
0974 reference operator*() const { return Import; }
0975 pointer operator->() const { return Import; }
0976
0977 import_iterator &operator++() {
0978 Import = ASTContext::getNextLocalImport(Import);
0979 return *this;
0980 }
0981
0982 import_iterator operator++(int) {
0983 import_iterator Other(*this);
0984 ++(*this);
0985 return Other;
0986 }
0987
0988 friend bool operator==(import_iterator X, import_iterator Y) {
0989 return X.Import == Y.Import;
0990 }
0991
0992 friend bool operator!=(import_iterator X, import_iterator Y) {
0993 return X.Import != Y.Import;
0994 }
0995 };
0996
0997 public:
0998 comments::CommandTraits &getCommentCommandTraits() const {
0999 return CommentCommandTraits;
1000 }
1001
1002
1003 AttrVec& getDeclAttrs(const Decl *D);
1004
1005
1006 void eraseDeclAttrs(const Decl *D);
1007
1008
1009
1010
1011
1012 MemberSpecializationInfo *getInstantiatedFromStaticDataMember(
1013 const VarDecl *Var);
1014
1015
1016
1017 void setInstantiatedFromStaticDataMember(VarDecl *Inst, VarDecl *Tmpl,
1018 TemplateSpecializationKind TSK,
1019 SourceLocation PointOfInstantiation = SourceLocation());
1020
1021 TemplateOrSpecializationInfo
1022 getTemplateOrSpecializationInfo(const VarDecl *Var);
1023
1024 void setTemplateOrSpecializationInfo(VarDecl *Inst,
1025 TemplateOrSpecializationInfo TSI);
1026
1027
1028
1029 NamedDecl *getInstantiatedFromUsingDecl(NamedDecl *Inst);
1030
1031
1032
1033 void setInstantiatedFromUsingDecl(NamedDecl *Inst, NamedDecl *Pattern);
1034
1035
1036
1037 UsingEnumDecl *getInstantiatedFromUsingEnumDecl(UsingEnumDecl *Inst);
1038
1039
1040
1041 void setInstantiatedFromUsingEnumDecl(UsingEnumDecl *Inst,
1042 UsingEnumDecl *Pattern);
1043
1044 UsingShadowDecl *getInstantiatedFromUsingShadowDecl(UsingShadowDecl *Inst);
1045 void setInstantiatedFromUsingShadowDecl(UsingShadowDecl *Inst,
1046 UsingShadowDecl *Pattern);
1047
1048 FieldDecl *getInstantiatedFromUnnamedFieldDecl(FieldDecl *Field) const;
1049
1050 void setInstantiatedFromUnnamedFieldDecl(FieldDecl *Inst, FieldDecl *Tmpl);
1051
1052
1053 using overridden_cxx_method_iterator = CXXMethodVector::const_iterator;
1054 overridden_cxx_method_iterator
1055 overridden_methods_begin(const CXXMethodDecl *Method) const;
1056
1057 overridden_cxx_method_iterator
1058 overridden_methods_end(const CXXMethodDecl *Method) const;
1059
1060 unsigned overridden_methods_size(const CXXMethodDecl *Method) const;
1061
1062 using overridden_method_range =
1063 llvm::iterator_range<overridden_cxx_method_iterator>;
1064
1065 overridden_method_range overridden_methods(const CXXMethodDecl *Method) const;
1066
1067
1068
1069 void addOverriddenMethod(const CXXMethodDecl *Method,
1070 const CXXMethodDecl *Overridden);
1071
1072
1073
1074
1075
1076
1077
1078
1079 void getOverriddenMethods(
1080 const NamedDecl *Method,
1081 SmallVectorImpl<const NamedDecl *> &Overridden) const;
1082
1083
1084
1085 void addedLocalImportDecl(ImportDecl *Import);
1086
1087 static ImportDecl *getNextLocalImport(ImportDecl *Import) {
1088 return Import->getNextLocalImport();
1089 }
1090
1091 using import_range = llvm::iterator_range<import_iterator>;
1092
1093 import_range local_imports() const {
1094 return import_range(import_iterator(FirstLocalImport), import_iterator());
1095 }
1096
1097 Decl *getPrimaryMergedDecl(Decl *D) {
1098 Decl *Result = MergedDecls.lookup(D);
1099 return Result ? Result : D;
1100 }
1101 void setPrimaryMergedDecl(Decl *D, Decl *Primary) {
1102 MergedDecls[D] = Primary;
1103 }
1104
1105
1106
1107 void mergeDefinitionIntoModule(NamedDecl *ND, Module *M,
1108 bool NotifyListeners = true);
1109
1110
1111
1112 void deduplicateMergedDefinitonsFor(NamedDecl *ND);
1113
1114
1115
1116 ArrayRef<Module*> getModulesWithMergedDefinition(const NamedDecl *Def);
1117
1118
1119
1120
1121
1122 void addModuleInitializer(Module *M, Decl *Init);
1123
1124 void addLazyModuleInitializers(Module *M, ArrayRef<GlobalDeclID> IDs);
1125
1126
1127 ArrayRef<Decl*> getModuleInitializers(Module *M);
1128
1129
1130 void setCurrentNamedModule(Module *M);
1131
1132
1133 Module *getCurrentNamedModule() const { return CurrentCXXNamedModule; }
1134
1135
1136
1137
1138
1139 bool isInSameModule(const Module *M1, const Module *M2);
1140
1141 TranslationUnitDecl *getTranslationUnitDecl() const {
1142 return TUDecl->getMostRecentDecl();
1143 }
1144 void addTranslationUnitDecl() {
1145 assert(!TUDecl || TUKind == TU_Incremental);
1146 TranslationUnitDecl *NewTUDecl = TranslationUnitDecl::Create(*this);
1147 if (TraversalScope.empty() || TraversalScope.back() == TUDecl)
1148 TraversalScope = {NewTUDecl};
1149 if (TUDecl)
1150 NewTUDecl->setPreviousDecl(TUDecl);
1151 TUDecl = NewTUDecl;
1152 }
1153
1154 ExternCContextDecl *getExternCContextDecl() const;
1155 BuiltinTemplateDecl *getMakeIntegerSeqDecl() const;
1156 BuiltinTemplateDecl *getTypePackElementDecl() const;
1157 BuiltinTemplateDecl *getBuiltinCommonTypeDecl() const;
1158
1159
1160 CanQualType VoidTy;
1161 CanQualType BoolTy;
1162 CanQualType CharTy;
1163 CanQualType WCharTy;
1164 CanQualType WideCharTy;
1165 CanQualType WIntTy;
1166 CanQualType Char8Ty;
1167 CanQualType Char16Ty;
1168 CanQualType Char32Ty;
1169 CanQualType SignedCharTy, ShortTy, IntTy, LongTy, LongLongTy, Int128Ty;
1170 CanQualType UnsignedCharTy, UnsignedShortTy, UnsignedIntTy, UnsignedLongTy;
1171 CanQualType UnsignedLongLongTy, UnsignedInt128Ty;
1172 CanQualType FloatTy, DoubleTy, LongDoubleTy, Float128Ty, Ibm128Ty;
1173 CanQualType ShortAccumTy, AccumTy,
1174 LongAccumTy;
1175 CanQualType UnsignedShortAccumTy, UnsignedAccumTy, UnsignedLongAccumTy;
1176 CanQualType ShortFractTy, FractTy, LongFractTy;
1177 CanQualType UnsignedShortFractTy, UnsignedFractTy, UnsignedLongFractTy;
1178 CanQualType SatShortAccumTy, SatAccumTy, SatLongAccumTy;
1179 CanQualType SatUnsignedShortAccumTy, SatUnsignedAccumTy,
1180 SatUnsignedLongAccumTy;
1181 CanQualType SatShortFractTy, SatFractTy, SatLongFractTy;
1182 CanQualType SatUnsignedShortFractTy, SatUnsignedFractTy,
1183 SatUnsignedLongFractTy;
1184 CanQualType HalfTy;
1185 CanQualType BFloat16Ty;
1186 CanQualType Float16Ty;
1187 CanQualType VoidPtrTy, NullPtrTy;
1188 CanQualType DependentTy, OverloadTy, BoundMemberTy, UnresolvedTemplateTy,
1189 UnknownAnyTy;
1190 CanQualType BuiltinFnTy;
1191 CanQualType PseudoObjectTy, ARCUnbridgedCastTy;
1192 CanQualType ObjCBuiltinIdTy, ObjCBuiltinClassTy, ObjCBuiltinSelTy;
1193 CanQualType ObjCBuiltinBoolTy;
1194 #define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
1195 CanQualType SingletonId;
1196 #include "clang/Basic/OpenCLImageTypes.def"
1197 CanQualType OCLSamplerTy, OCLEventTy, OCLClkEventTy;
1198 CanQualType OCLQueueTy, OCLReserveIDTy;
1199 CanQualType IncompleteMatrixIdxTy;
1200 CanQualType ArraySectionTy;
1201 CanQualType OMPArrayShapingTy, OMPIteratorTy;
1202 #define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
1203 CanQualType Id##Ty;
1204 #include "clang/Basic/OpenCLExtensionTypes.def"
1205 #define SVE_TYPE(Name, Id, SingletonId) \
1206 CanQualType SingletonId;
1207 #include "clang/Basic/AArch64SVEACLETypes.def"
1208 #define PPC_VECTOR_TYPE(Name, Id, Size) \
1209 CanQualType Id##Ty;
1210 #include "clang/Basic/PPCTypes.def"
1211 #define RVV_TYPE(Name, Id, SingletonId) \
1212 CanQualType SingletonId;
1213 #include "clang/Basic/RISCVVTypes.def"
1214 #define WASM_TYPE(Name, Id, SingletonId) CanQualType SingletonId;
1215 #include "clang/Basic/WebAssemblyReferenceTypes.def"
1216 #define AMDGPU_TYPE(Name, Id, SingletonId, Width, Align) \
1217 CanQualType SingletonId;
1218 #include "clang/Basic/AMDGPUTypes.def"
1219 #define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) CanQualType SingletonId;
1220 #include "clang/Basic/HLSLIntangibleTypes.def"
1221
1222
1223 mutable QualType AutoDeductTy;
1224 mutable QualType AutoRRefDeductTy;
1225
1226
1227
1228 mutable Decl *VaListTagDecl = nullptr;
1229
1230
1231 mutable TagDecl *MSGuidTagDecl = nullptr;
1232
1233
1234
1235
1236
1237 llvm::DenseSet<const VarDecl *> CUDADeviceVarODRUsedByHost;
1238
1239
1240
1241 llvm::SetVector<const ValueDecl *> CUDAExternalDeviceDeclODRUsedByHost;
1242
1243
1244
1245 llvm::DenseSet<const FunctionDecl *> CUDAImplicitHostDeviceFunUsedByDevice;
1246
1247
1248
1249
1250 llvm::DenseMap<CanQualType, SYCLKernelInfo> SYCLKernels;
1251
1252
1253
1254
1255
1256 llvm::DenseMap<const CXXMethodDecl *, CXXCastPath> LambdaCastPaths;
1257
1258 ASTContext(LangOptions &LOpts, SourceManager &SM, IdentifierTable &idents,
1259 SelectorTable &sels, Builtin::Context &builtins,
1260 TranslationUnitKind TUKind);
1261 ASTContext(const ASTContext &) = delete;
1262 ASTContext &operator=(const ASTContext &) = delete;
1263 ~ASTContext();
1264
1265
1266
1267
1268
1269
1270 void setExternalSource(IntrusiveRefCntPtr<ExternalASTSource> Source);
1271
1272
1273
1274 ExternalASTSource *getExternalSource() const {
1275 return ExternalSource.get();
1276 }
1277
1278
1279
1280
1281
1282
1283 void setASTMutationListener(ASTMutationListener *Listener) {
1284 this->Listener = Listener;
1285 }
1286
1287
1288
1289 ASTMutationListener *getASTMutationListener() const { return Listener; }
1290
1291 void PrintStats() const;
1292 const SmallVectorImpl<Type *>& getTypes() const { return Types; }
1293
1294 BuiltinTemplateDecl *buildBuiltinTemplateDecl(BuiltinTemplateKind BTK,
1295 const IdentifierInfo *II) const;
1296
1297
1298
1299 RecordDecl *buildImplicitRecord(
1300 StringRef Name,
1301 RecordDecl::TagKind TK = RecordDecl::TagKind::Struct) const;
1302
1303
1304 TypedefDecl *buildImplicitTypedef(QualType T, StringRef Name) const;
1305
1306
1307 TypedefDecl *getInt128Decl() const;
1308
1309
1310 TypedefDecl *getUInt128Decl() const;
1311
1312
1313
1314
1315
1316 private:
1317
1318 QualType getExtQualType(const Type *Base, Qualifiers Quals) const;
1319
1320 QualType getTypeDeclTypeSlow(const TypeDecl *Decl) const;
1321
1322 QualType getPipeType(QualType T, bool ReadOnly) const;
1323
1324 public:
1325
1326
1327
1328
1329
1330
1331 QualType getAddrSpaceQualType(QualType T, LangAS AddressSpace) const;
1332
1333
1334
1335
1336
1337
1338 QualType removeAddrSpaceQualType(QualType T) const;
1339
1340
1341
1342 uint16_t
1343 getPointerAuthVTablePointerDiscriminator(const CXXRecordDecl *RD);
1344
1345
1346 uint16_t getPointerAuthTypeDiscriminator(QualType T);
1347
1348
1349
1350
1351
1352 QualType applyObjCProtocolQualifiers(QualType type,
1353 ArrayRef<ObjCProtocolDecl *> protocols, bool &hasError,
1354 bool allowOnPointerType = false) const;
1355
1356
1357
1358
1359
1360
1361 QualType getObjCGCQualType(QualType T, Qualifiers::GC gcAttr) const;
1362
1363
1364
1365 QualType removePtrSizeAddrSpace(QualType T) const;
1366
1367
1368
1369
1370
1371
1372 QualType getRestrictType(QualType T) const {
1373 return T.withFastQualifiers(Qualifiers::Restrict);
1374 }
1375
1376
1377
1378
1379
1380
1381 QualType getVolatileType(QualType T) const {
1382 return T.withFastQualifiers(Qualifiers::Volatile);
1383 }
1384
1385
1386
1387
1388
1389
1390
1391
1392 QualType getConstType(QualType T) const { return T.withConst(); }
1393
1394
1395
1396
1397 QualType adjustType(QualType OldType,
1398 llvm::function_ref<QualType(QualType)> Adjust) const;
1399
1400
1401 const FunctionType *adjustFunctionType(const FunctionType *Fn,
1402 FunctionType::ExtInfo EInfo);
1403
1404
1405
1406 QualType adjustFunctionResultType(QualType FunctionType,
1407 QualType NewResultType);
1408
1409
1410 CanQualType getCanonicalFunctionResultType(QualType ResultType) const;
1411
1412
1413 void adjustDeducedFunctionResultType(FunctionDecl *FD, QualType ResultType);
1414
1415
1416
1417
1418
1419 QualType getFunctionTypeWithExceptionSpec(
1420 QualType Orig, const FunctionProtoType::ExceptionSpecInfo &ESI) const;
1421
1422
1423
1424 bool hasSameFunctionTypeIgnoringExceptionSpec(QualType T, QualType U) const;
1425
1426
1427
1428 void adjustExceptionSpec(FunctionDecl *FD,
1429 const FunctionProtoType::ExceptionSpecInfo &ESI,
1430 bool AsWritten = false);
1431
1432
1433
1434
1435 QualType getFunctionTypeWithoutPtrSizes(QualType T);
1436
1437
1438
1439 bool hasSameFunctionTypeIgnoringPtrSizes(QualType T, QualType U);
1440
1441
1442
1443 QualType getFunctionTypeWithoutParamABIs(QualType T) const;
1444
1445
1446
1447 bool hasSameFunctionTypeIgnoringParamABI(QualType T, QualType U) const;
1448
1449
1450
1451 QualType getComplexType(QualType T) const;
1452 CanQualType getComplexType(CanQualType T) const {
1453 return CanQualType::CreateUnsafe(getComplexType((QualType) T));
1454 }
1455
1456
1457
1458 QualType getPointerType(QualType T) const;
1459 CanQualType getPointerType(CanQualType T) const {
1460 return CanQualType::CreateUnsafe(getPointerType((QualType) T));
1461 }
1462
1463 QualType
1464 getCountAttributedType(QualType T, Expr *CountExpr, bool CountInBytes,
1465 bool OrNull,
1466 ArrayRef<TypeCoupledDeclRefInfo> DependentDecls) const;
1467
1468
1469
1470 QualType getAdjustedType(QualType Orig, QualType New) const;
1471 CanQualType getAdjustedType(CanQualType Orig, CanQualType New) const {
1472 return CanQualType::CreateUnsafe(
1473 getAdjustedType((QualType)Orig, (QualType)New));
1474 }
1475
1476
1477
1478
1479 QualType getDecayedType(QualType T) const;
1480 CanQualType getDecayedType(CanQualType T) const {
1481 return CanQualType::CreateUnsafe(getDecayedType((QualType) T));
1482 }
1483
1484
1485 QualType getDecayedType(QualType Orig, QualType Decayed) const;
1486
1487
1488
1489 QualType getArrayParameterType(QualType Ty) const;
1490
1491
1492
1493 QualType getAtomicType(QualType T) const;
1494
1495
1496
1497 QualType getBlockPointerType(QualType T) const;
1498
1499
1500
1501 QualType getBlockDescriptorType() const;
1502
1503
1504 QualType getReadPipeType(QualType T) const;
1505
1506
1507 QualType getWritePipeType(QualType T) const;
1508
1509
1510
1511 QualType getBitIntType(bool Unsigned, unsigned NumBits) const;
1512
1513
1514
1515 QualType getDependentBitIntType(bool Unsigned, Expr *BitsExpr) const;
1516
1517
1518
1519 QualType getBlockDescriptorExtendedType() const;
1520
1521
1522 OpenCLTypeKind getOpenCLTypeKind(const Type *T) const;
1523
1524
1525 LangAS getOpenCLTypeAddrSpace(const Type *T) const;
1526
1527
1528 inline LangAS getDefaultOpenCLPointeeAddrSpace() {
1529 return LangOpts.OpenCLGenericAddressSpace ? LangAS::opencl_generic
1530 : LangAS::opencl_private;
1531 }
1532
1533 void setcudaConfigureCallDecl(FunctionDecl *FD) {
1534 cudaConfigureCallDecl = FD;
1535 }
1536
1537 FunctionDecl *getcudaConfigureCallDecl() {
1538 return cudaConfigureCallDecl;
1539 }
1540
1541
1542 bool BlockRequiresCopying(QualType Ty, const VarDecl *D);
1543
1544
1545
1546
1547 bool getByrefLifetime(QualType Ty,
1548 Qualifiers::ObjCLifetime &Lifetime,
1549 bool &HasByrefExtendedLayout) const;
1550
1551
1552
1553 QualType getLValueReferenceType(QualType T, bool SpelledAsLValue = true)
1554 const;
1555
1556
1557
1558 QualType getRValueReferenceType(QualType T) const;
1559
1560
1561
1562
1563
1564 QualType getMemberPointerType(QualType T, const Type *Cls) const;
1565
1566
1567
1568 QualType getVariableArrayType(QualType EltTy, Expr *NumElts,
1569 ArraySizeModifier ASM, unsigned IndexTypeQuals,
1570 SourceRange Brackets) const;
1571
1572
1573
1574
1575
1576
1577 QualType getDependentSizedArrayType(QualType EltTy, Expr *NumElts,
1578 ArraySizeModifier ASM,
1579 unsigned IndexTypeQuals,
1580 SourceRange Brackets) const;
1581
1582
1583
1584 QualType getIncompleteArrayType(QualType EltTy, ArraySizeModifier ASM,
1585 unsigned IndexTypeQuals) const;
1586
1587
1588
1589 QualType getConstantArrayType(QualType EltTy, const llvm::APInt &ArySize,
1590 const Expr *SizeExpr, ArraySizeModifier ASM,
1591 unsigned IndexTypeQuals) const;
1592
1593
1594
1595 QualType getStringLiteralArrayType(QualType EltTy, unsigned Length) const;
1596
1597
1598 QualType getVariableArrayDecayedType(QualType Ty) const;
1599
1600
1601 struct BuiltinVectorTypeInfo {
1602 QualType ElementType;
1603 llvm::ElementCount EC;
1604 unsigned NumVectors;
1605 BuiltinVectorTypeInfo(QualType ElementType, llvm::ElementCount EC,
1606 unsigned NumVectors)
1607 : ElementType(ElementType), EC(EC), NumVectors(NumVectors) {}
1608 };
1609
1610
1611
1612 BuiltinVectorTypeInfo
1613 getBuiltinVectorTypeInfo(const BuiltinType *VecTy) const;
1614
1615
1616
1617
1618
1619
1620
1621 QualType getScalableVectorType(QualType EltTy, unsigned NumElts,
1622 unsigned NumFields = 1) const;
1623
1624
1625 QualType getWebAssemblyExternrefType() const;
1626
1627
1628
1629
1630
1631 QualType getVectorType(QualType VectorType, unsigned NumElts,
1632 VectorKind VecKind) const;
1633
1634
1635 QualType getDependentVectorType(QualType VectorType, Expr *SizeExpr,
1636 SourceLocation AttrLoc,
1637 VectorKind VecKind) const;
1638
1639
1640
1641
1642
1643 QualType getExtVectorType(QualType VectorType, unsigned NumElts) const;
1644
1645
1646
1647
1648
1649
1650 QualType getDependentSizedExtVectorType(QualType VectorType,
1651 Expr *SizeExpr,
1652 SourceLocation AttrLoc) const;
1653
1654
1655
1656
1657
1658
1659 QualType getConstantMatrixType(QualType ElementType, unsigned NumRows,
1660 unsigned NumColumns) const;
1661
1662
1663
1664 QualType getDependentSizedMatrixType(QualType ElementType, Expr *RowExpr,
1665 Expr *ColumnExpr,
1666 SourceLocation AttrLoc) const;
1667
1668 QualType getDependentAddressSpaceType(QualType PointeeType,
1669 Expr *AddrSpaceExpr,
1670 SourceLocation AttrLoc) const;
1671
1672
1673 QualType getFunctionNoProtoType(QualType ResultTy,
1674 const FunctionType::ExtInfo &Info) const;
1675
1676 QualType getFunctionNoProtoType(QualType ResultTy) const {
1677 return getFunctionNoProtoType(ResultTy, FunctionType::ExtInfo());
1678 }
1679
1680
1681 QualType getFunctionType(QualType ResultTy, ArrayRef<QualType> Args,
1682 const FunctionProtoType::ExtProtoInfo &EPI) const {
1683 return getFunctionTypeInternal(ResultTy, Args, EPI, false);
1684 }
1685
1686 QualType adjustStringLiteralBaseType(QualType StrLTy) const;
1687
1688 private:
1689
1690 QualType getFunctionTypeInternal(QualType ResultTy, ArrayRef<QualType> Args,
1691 const FunctionProtoType::ExtProtoInfo &EPI,
1692 bool OnlyWantCanonical) const;
1693 QualType
1694 getAutoTypeInternal(QualType DeducedType, AutoTypeKeyword Keyword,
1695 bool IsDependent, bool IsPack = false,
1696 ConceptDecl *TypeConstraintConcept = nullptr,
1697 ArrayRef<TemplateArgument> TypeConstraintArgs = {},
1698 bool IsCanon = false) const;
1699
1700 public:
1701
1702
1703 QualType getTypeDeclType(const TypeDecl *Decl,
1704 const TypeDecl *PrevDecl = nullptr) const {
1705 assert(Decl && "Passed null for Decl param");
1706 if (Decl->TypeForDecl) return QualType(Decl->TypeForDecl, 0);
1707
1708 if (PrevDecl) {
1709 assert(PrevDecl->TypeForDecl && "previous decl has no TypeForDecl");
1710 Decl->TypeForDecl = PrevDecl->TypeForDecl;
1711 return QualType(PrevDecl->TypeForDecl, 0);
1712 }
1713
1714 return getTypeDeclTypeSlow(Decl);
1715 }
1716
1717 QualType getUsingType(const UsingShadowDecl *Found,
1718 QualType Underlying) const;
1719
1720
1721
1722 QualType getTypedefType(const TypedefNameDecl *Decl,
1723 QualType Underlying = QualType()) const;
1724
1725 QualType getRecordType(const RecordDecl *Decl) const;
1726
1727 QualType getEnumType(const EnumDecl *Decl) const;
1728
1729
1730
1731
1732 bool computeBestEnumTypes(bool IsPacked, unsigned NumNegativeBits,
1733 unsigned NumPositiveBits, QualType &BestType,
1734 QualType &BestPromotionType);
1735
1736 QualType
1737 getUnresolvedUsingType(const UnresolvedUsingTypenameDecl *Decl) const;
1738
1739 QualType getInjectedClassNameType(CXXRecordDecl *Decl, QualType TST) const;
1740
1741 QualType getAttributedType(attr::Kind attrKind, QualType modifiedType,
1742 QualType equivalentType,
1743 const Attr *attr = nullptr) const;
1744
1745 QualType getAttributedType(const Attr *attr, QualType modifiedType,
1746 QualType equivalentType) const;
1747
1748 QualType getAttributedType(NullabilityKind nullability, QualType modifiedType,
1749 QualType equivalentType);
1750
1751 QualType getBTFTagAttributedType(const BTFTypeTagAttr *BTFAttr,
1752 QualType Wrapped) const;
1753
1754 QualType getHLSLAttributedResourceType(
1755 QualType Wrapped, QualType Contained,
1756 const HLSLAttributedResourceType::Attributes &Attrs);
1757
1758 QualType
1759 getSubstTemplateTypeParmType(QualType Replacement, Decl *AssociatedDecl,
1760 unsigned Index,
1761 std::optional<unsigned> PackIndex,
1762 SubstTemplateTypeParmTypeFlag Flag =
1763 SubstTemplateTypeParmTypeFlag::None) const;
1764 QualType getSubstTemplateTypeParmPackType(Decl *AssociatedDecl,
1765 unsigned Index, bool Final,
1766 const TemplateArgument &ArgPack);
1767
1768 QualType
1769 getTemplateTypeParmType(unsigned Depth, unsigned Index,
1770 bool ParameterPack,
1771 TemplateTypeParmDecl *ParmDecl = nullptr) const;
1772
1773 QualType getTemplateSpecializationType(TemplateName T,
1774 ArrayRef<TemplateArgument> Args,
1775 QualType Canon = QualType()) const;
1776
1777 QualType
1778 getCanonicalTemplateSpecializationType(TemplateName T,
1779 ArrayRef<TemplateArgument> Args) const;
1780
1781 QualType getTemplateSpecializationType(TemplateName T,
1782 ArrayRef<TemplateArgumentLoc> Args,
1783 QualType Canon = QualType()) const;
1784
1785 TypeSourceInfo *
1786 getTemplateSpecializationTypeInfo(TemplateName T, SourceLocation TLoc,
1787 const TemplateArgumentListInfo &Args,
1788 QualType Canon = QualType()) const;
1789
1790 QualType getParenType(QualType NamedType) const;
1791
1792 QualType getMacroQualifiedType(QualType UnderlyingTy,
1793 const IdentifierInfo *MacroII) const;
1794
1795 QualType getElaboratedType(ElaboratedTypeKeyword Keyword,
1796 NestedNameSpecifier *NNS, QualType NamedType,
1797 TagDecl *OwnedTagDecl = nullptr) const;
1798 QualType getDependentNameType(ElaboratedTypeKeyword Keyword,
1799 NestedNameSpecifier *NNS,
1800 const IdentifierInfo *Name,
1801 QualType Canon = QualType()) const;
1802
1803 QualType getDependentTemplateSpecializationType(
1804 ElaboratedTypeKeyword Keyword, NestedNameSpecifier *NNS,
1805 const IdentifierInfo *Name, ArrayRef<TemplateArgumentLoc> Args) const;
1806 QualType getDependentTemplateSpecializationType(
1807 ElaboratedTypeKeyword Keyword, NestedNameSpecifier *NNS,
1808 const IdentifierInfo *Name, ArrayRef<TemplateArgument> Args) const;
1809
1810 TemplateArgument getInjectedTemplateArg(NamedDecl *ParamDecl) const;
1811
1812
1813
1814
1815
1816
1817
1818
1819 QualType getPackExpansionType(QualType Pattern,
1820 std::optional<unsigned> NumExpansions,
1821 bool ExpectPackInType = true) const;
1822
1823 QualType getObjCInterfaceType(const ObjCInterfaceDecl *Decl,
1824 ObjCInterfaceDecl *PrevDecl = nullptr) const;
1825
1826
1827 QualType getObjCObjectType(QualType Base,
1828 ObjCProtocolDecl * const *Protocols,
1829 unsigned NumProtocols) const;
1830
1831 QualType getObjCObjectType(QualType Base,
1832 ArrayRef<QualType> typeArgs,
1833 ArrayRef<ObjCProtocolDecl *> protocols,
1834 bool isKindOf) const;
1835
1836 QualType getObjCTypeParamType(const ObjCTypeParamDecl *Decl,
1837 ArrayRef<ObjCProtocolDecl *> protocols) const;
1838 void adjustObjCTypeParamBoundType(const ObjCTypeParamDecl *Orig,
1839 ObjCTypeParamDecl *New) const;
1840
1841 bool ObjCObjectAdoptsQTypeProtocols(QualType QT, ObjCInterfaceDecl *Decl);
1842
1843
1844
1845
1846 bool QIdProtocolsAdoptObjCObjectProtocols(QualType QT,
1847 ObjCInterfaceDecl *IDecl);
1848
1849
1850 QualType getObjCObjectPointerType(QualType OIT) const;
1851
1852
1853 QualType getTypeOfExprType(Expr *E, TypeOfKind Kind) const;
1854 QualType getTypeOfType(QualType QT, TypeOfKind Kind) const;
1855
1856 QualType getReferenceQualifiedType(const Expr *e) const;
1857
1858
1859 QualType getDecltypeType(Expr *e, QualType UnderlyingType) const;
1860
1861 QualType getPackIndexingType(QualType Pattern, Expr *IndexExpr,
1862 bool FullySubstituted = false,
1863 ArrayRef<QualType> Expansions = {},
1864 int Index = -1) const;
1865
1866
1867 QualType getUnaryTransformType(QualType BaseType, QualType UnderlyingType,
1868 UnaryTransformType::UTTKind UKind) const;
1869
1870
1871 QualType getAutoType(QualType DeducedType, AutoTypeKeyword Keyword,
1872 bool IsDependent, bool IsPack = false,
1873 ConceptDecl *TypeConstraintConcept = nullptr,
1874 ArrayRef<TemplateArgument> TypeConstraintArgs ={}) const;
1875
1876
1877 QualType getAutoDeductType() const;
1878
1879
1880 QualType getAutoRRefDeductType() const;
1881
1882
1883
1884 QualType getUnconstrainedType(QualType T) const;
1885
1886
1887 QualType getDeducedTemplateSpecializationType(TemplateName Template,
1888 QualType DeducedType,
1889 bool IsDependent) const;
1890
1891 private:
1892 QualType getDeducedTemplateSpecializationTypeInternal(TemplateName Template,
1893 QualType DeducedType,
1894 bool IsDependent,
1895 QualType Canon) const;
1896
1897 public:
1898
1899
1900 QualType getTagDeclType(const TagDecl *Decl) const;
1901
1902
1903
1904
1905
1906 CanQualType getSizeType() const;
1907
1908
1909
1910 CanQualType getSignedSizeType() const;
1911
1912
1913
1914 CanQualType getIntMaxType() const;
1915
1916
1917
1918 CanQualType getUIntMaxType() const;
1919
1920
1921
1922 QualType getWCharType() const { return WCharTy; }
1923
1924
1925
1926
1927 QualType getWideCharType() const { return WideCharTy; }
1928
1929
1930
1931
1932 QualType getSignedWCharType() const;
1933
1934
1935
1936
1937 QualType getUnsignedWCharType() const;
1938
1939
1940
1941 QualType getWIntType() const { return WIntTy; }
1942
1943
1944
1945 QualType getIntPtrType() const;
1946
1947
1948
1949 QualType getUIntPtrType() const;
1950
1951
1952
1953 QualType getPointerDiffType() const;
1954
1955
1956
1957
1958 QualType getUnsignedPointerDiffType() const;
1959
1960
1961
1962 QualType getProcessIDType() const;
1963
1964
1965 QualType getCFConstantStringType() const;
1966
1967
1968 QualType getObjCSuperType() const;
1969 void setObjCSuperType(QualType ST) { ObjCSuperType = ST; }
1970
1971
1972
1973 QualType getRawCFConstantStringType() const {
1974 if (CFConstantStringTypeDecl)
1975 return getTypedefType(CFConstantStringTypeDecl);
1976 return QualType();
1977 }
1978 void setCFConstantStringType(QualType T);
1979 TypedefDecl *getCFConstantStringDecl() const;
1980 RecordDecl *getCFConstantStringTagDecl() const;
1981
1982
1983 void setObjCConstantStringInterface(ObjCInterfaceDecl *Decl);
1984 QualType getObjCConstantStringInterface() const {
1985 return ObjCConstantStringType;
1986 }
1987
1988 QualType getObjCNSStringType() const {
1989 return ObjCNSStringType;
1990 }
1991
1992 void setObjCNSStringType(QualType T) {
1993 ObjCNSStringType = T;
1994 }
1995
1996
1997
1998 QualType getObjCIdRedefinitionType() const {
1999 if (ObjCIdRedefinitionType.isNull())
2000 return getObjCIdType();
2001 return ObjCIdRedefinitionType;
2002 }
2003
2004
2005 void setObjCIdRedefinitionType(QualType RedefType) {
2006 ObjCIdRedefinitionType = RedefType;
2007 }
2008
2009
2010
2011 QualType getObjCClassRedefinitionType() const {
2012 if (ObjCClassRedefinitionType.isNull())
2013 return getObjCClassType();
2014 return ObjCClassRedefinitionType;
2015 }
2016
2017
2018 void setObjCClassRedefinitionType(QualType RedefType) {
2019 ObjCClassRedefinitionType = RedefType;
2020 }
2021
2022
2023
2024 QualType getObjCSelRedefinitionType() const {
2025 if (ObjCSelRedefinitionType.isNull())
2026 return getObjCSelType();
2027 return ObjCSelRedefinitionType;
2028 }
2029
2030
2031 void setObjCSelRedefinitionType(QualType RedefType) {
2032 ObjCSelRedefinitionType = RedefType;
2033 }
2034
2035
2036 IdentifierInfo *getNSObjectName() const {
2037 if (!NSObjectName) {
2038 NSObjectName = &Idents.get("NSObject");
2039 }
2040
2041 return NSObjectName;
2042 }
2043
2044
2045 IdentifierInfo *getNSCopyingName() {
2046 if (!NSCopyingName) {
2047 NSCopyingName = &Idents.get("NSCopying");
2048 }
2049
2050 return NSCopyingName;
2051 }
2052
2053 CanQualType getNSUIntegerType() const;
2054
2055 CanQualType getNSIntegerType() const;
2056
2057
2058 IdentifierInfo *getBoolName() const {
2059 if (!BoolName)
2060 BoolName = &Idents.get("bool");
2061 return BoolName;
2062 }
2063
2064 IdentifierInfo *getMakeIntegerSeqName() const {
2065 if (!MakeIntegerSeqName)
2066 MakeIntegerSeqName = &Idents.get("__make_integer_seq");
2067 return MakeIntegerSeqName;
2068 }
2069
2070 IdentifierInfo *getTypePackElementName() const {
2071 if (!TypePackElementName)
2072 TypePackElementName = &Idents.get("__type_pack_element");
2073 return TypePackElementName;
2074 }
2075
2076 IdentifierInfo *getBuiltinCommonTypeName() const {
2077 if (!BuiltinCommonTypeName)
2078 BuiltinCommonTypeName = &Idents.get("__builtin_common_type");
2079 return BuiltinCommonTypeName;
2080 }
2081
2082
2083
2084 QualType getObjCInstanceType() {
2085 return getTypeDeclType(getObjCInstanceTypeDecl());
2086 }
2087
2088
2089
2090 TypedefDecl *getObjCInstanceTypeDecl();
2091
2092
2093 void setFILEDecl(TypeDecl *FILEDecl) { this->FILEDecl = FILEDecl; }
2094
2095
2096 QualType getFILEType() const {
2097 if (FILEDecl)
2098 return getTypeDeclType(FILEDecl);
2099 return QualType();
2100 }
2101
2102
2103 void setjmp_bufDecl(TypeDecl *jmp_bufDecl) {
2104 this->jmp_bufDecl = jmp_bufDecl;
2105 }
2106
2107
2108 QualType getjmp_bufType() const {
2109 if (jmp_bufDecl)
2110 return getTypeDeclType(jmp_bufDecl);
2111 return QualType();
2112 }
2113
2114
2115 void setsigjmp_bufDecl(TypeDecl *sigjmp_bufDecl) {
2116 this->sigjmp_bufDecl = sigjmp_bufDecl;
2117 }
2118
2119
2120 QualType getsigjmp_bufType() const {
2121 if (sigjmp_bufDecl)
2122 return getTypeDeclType(sigjmp_bufDecl);
2123 return QualType();
2124 }
2125
2126
2127 void setucontext_tDecl(TypeDecl *ucontext_tDecl) {
2128 this->ucontext_tDecl = ucontext_tDecl;
2129 }
2130
2131
2132 QualType getucontext_tType() const {
2133 if (ucontext_tDecl)
2134 return getTypeDeclType(ucontext_tDecl);
2135 return QualType();
2136 }
2137
2138
2139 QualType getLogicalOperationType() const {
2140 return getLangOpts().CPlusPlus ? BoolTy : IntTy;
2141 }
2142
2143
2144
2145
2146
2147 void getObjCEncodingForType(QualType T, std::string &S,
2148 const FieldDecl *Field=nullptr,
2149 QualType *NotEncodedT=nullptr) const;
2150
2151
2152
2153 void getObjCEncodingForPropertyType(QualType T, std::string &S) const;
2154
2155 void getLegacyIntegralTypeEncoding(QualType &t) const;
2156
2157
2158 void getObjCEncodingForTypeQualifier(Decl::ObjCDeclQualifier QT,
2159 std::string &S) const;
2160
2161
2162
2163
2164
2165
2166
2167 std::string getObjCEncodingForFunctionDecl(const FunctionDecl *Decl) const;
2168
2169
2170
2171 std::string getObjCEncodingForMethodDecl(const ObjCMethodDecl *Decl,
2172 bool Extended = false) const;
2173
2174
2175 std::string getObjCEncodingForBlock(const BlockExpr *blockExpr) const;
2176
2177
2178
2179
2180
2181 std::string getObjCEncodingForPropertyDecl(const ObjCPropertyDecl *PD,
2182 const Decl *Container) const;
2183
2184 bool ProtocolCompatibleWithProtocol(ObjCProtocolDecl *lProto,
2185 ObjCProtocolDecl *rProto) const;
2186
2187 ObjCPropertyImplDecl *getObjCPropertyImplDeclForPropertyDecl(
2188 const ObjCPropertyDecl *PD,
2189 const Decl *Container) const;
2190
2191
2192
2193 CharUnits getObjCEncodingTypeSize(QualType T) const;
2194
2195
2196
2197 TypedefDecl *getObjCIdDecl() const;
2198
2199
2200
2201
2202
2203 QualType getObjCIdType() const {
2204 return getTypeDeclType(getObjCIdDecl());
2205 }
2206
2207
2208
2209 TypedefDecl *getObjCSelDecl() const;
2210
2211
2212
2213 QualType getObjCSelType() const {
2214 return getTypeDeclType(getObjCSelDecl());
2215 }
2216
2217
2218
2219 TypedefDecl *getObjCClassDecl() const;
2220
2221
2222
2223
2224
2225 QualType getObjCClassType() const {
2226 return getTypeDeclType(getObjCClassDecl());
2227 }
2228
2229
2230
2231 ObjCInterfaceDecl *getObjCProtocolDecl() const;
2232
2233
2234 TypedefDecl *getBOOLDecl() const {
2235 return BOOLDecl;
2236 }
2237
2238
2239 void setBOOLDecl(TypedefDecl *TD) {
2240 BOOLDecl = TD;
2241 }
2242
2243
2244 QualType getBOOLType() const {
2245 return getTypeDeclType(getBOOLDecl());
2246 }
2247
2248
2249 QualType getObjCProtoType() const {
2250 return getObjCInterfaceType(getObjCProtocolDecl());
2251 }
2252
2253
2254
2255 TypedefDecl *getBuiltinVaListDecl() const;
2256
2257
2258 QualType getBuiltinVaListType() const {
2259 return getTypeDeclType(getBuiltinVaListDecl());
2260 }
2261
2262
2263
2264
2265 Decl *getVaListTagDecl() const;
2266
2267
2268
2269 TypedefDecl *getBuiltinMSVaListDecl() const;
2270
2271
2272 QualType getBuiltinMSVaListType() const {
2273 return getTypeDeclType(getBuiltinMSVaListDecl());
2274 }
2275
2276
2277 TagDecl *getMSGuidTagDecl() const { return MSGuidTagDecl; }
2278
2279
2280 QualType getMSGuidType() const {
2281 assert(MSGuidTagDecl && "asked for GUID type but MS extensions disabled");
2282 return getTagDeclType(MSGuidTagDecl);
2283 }
2284
2285
2286
2287 bool canBuiltinBeRedeclared(const FunctionDecl *) const;
2288
2289
2290
2291 QualType getCVRQualifiedType(QualType T, unsigned CVR) const {
2292 return getQualifiedType(T, Qualifiers::fromCVRMask(CVR));
2293 }
2294
2295
2296 QualType getQualifiedType(SplitQualType split) const {
2297 return getQualifiedType(split.Ty, split.Quals);
2298 }
2299
2300
2301 QualType getQualifiedType(QualType T, Qualifiers Qs) const {
2302 if (!Qs.hasNonFastQualifiers())
2303 return T.withFastQualifiers(Qs.getFastQualifiers());
2304 QualifierCollector Qc(Qs);
2305 const Type *Ptr = Qc.strip(T);
2306 return getExtQualType(Ptr, Qc);
2307 }
2308
2309
2310 QualType getQualifiedType(const Type *T, Qualifiers Qs) const {
2311 if (!Qs.hasNonFastQualifiers())
2312 return QualType(T, Qs.getFastQualifiers());
2313 return getExtQualType(T, Qs);
2314 }
2315
2316
2317
2318
2319 QualType getLifetimeQualifiedType(QualType type,
2320 Qualifiers::ObjCLifetime lifetime) {
2321 assert(type.getObjCLifetime() == Qualifiers::OCL_None);
2322 assert(lifetime != Qualifiers::OCL_None);
2323
2324 Qualifiers qs;
2325 qs.addObjCLifetime(lifetime);
2326 return getQualifiedType(type, qs);
2327 }
2328
2329
2330
2331 QualType getUnqualifiedObjCPointerType(QualType type) const {
2332 if (!type.getTypePtr()->isObjCObjectPointerType() ||
2333 !type.getQualifiers().hasObjCLifetime())
2334 return type;
2335 Qualifiers Qs = type.getQualifiers();
2336 Qs.removeObjCLifetime();
2337 return getQualifiedType(type.getUnqualifiedType(), Qs);
2338 }
2339
2340
2341 QualType getPointerAuthType(QualType Ty, PointerAuthQualifier PointerAuth) {
2342 assert(!Ty.getPointerAuth());
2343 assert(PointerAuth);
2344
2345 Qualifiers Qs;
2346 Qs.setPointerAuth(PointerAuth);
2347 return getQualifiedType(Ty, Qs);
2348 }
2349
2350 unsigned char getFixedPointScale(QualType Ty) const;
2351 unsigned char getFixedPointIBits(QualType Ty) const;
2352 llvm::FixedPointSemantics getFixedPointSemantics(QualType Ty) const;
2353 llvm::APFixedPoint getFixedPointMax(QualType Ty) const;
2354 llvm::APFixedPoint getFixedPointMin(QualType Ty) const;
2355
2356 DeclarationNameInfo getNameForTemplate(TemplateName Name,
2357 SourceLocation NameLoc) const;
2358
2359 TemplateName getOverloadedTemplateName(UnresolvedSetIterator Begin,
2360 UnresolvedSetIterator End) const;
2361 TemplateName getAssumedTemplateName(DeclarationName Name) const;
2362
2363 TemplateName getQualifiedTemplateName(NestedNameSpecifier *NNS,
2364 bool TemplateKeyword,
2365 TemplateName Template) const;
2366
2367 TemplateName getDependentTemplateName(NestedNameSpecifier *NNS,
2368 const IdentifierInfo *Name) const;
2369 TemplateName getDependentTemplateName(NestedNameSpecifier *NNS,
2370 OverloadedOperatorKind Operator) const;
2371 TemplateName
2372 getSubstTemplateTemplateParm(TemplateName replacement, Decl *AssociatedDecl,
2373 unsigned Index,
2374 std::optional<unsigned> PackIndex) const;
2375 TemplateName getSubstTemplateTemplateParmPack(const TemplateArgument &ArgPack,
2376 Decl *AssociatedDecl,
2377 unsigned Index,
2378 bool Final) const;
2379
2380
2381
2382
2383
2384
2385
2386 TemplateName getDeducedTemplateName(TemplateName Underlying,
2387 DefaultArguments DefaultArgs) const;
2388
2389 enum GetBuiltinTypeError {
2390
2391 GE_None,
2392
2393
2394 GE_Missing_type,
2395
2396
2397 GE_Missing_stdio,
2398
2399
2400 GE_Missing_setjmp,
2401
2402
2403 GE_Missing_ucontext
2404 };
2405
2406 QualType DecodeTypeStr(const char *&Str, const ASTContext &Context,
2407 ASTContext::GetBuiltinTypeError &Error,
2408 bool &RequireICE, bool AllowTypeModifiers) const;
2409
2410
2411
2412
2413
2414
2415 QualType GetBuiltinType(unsigned ID, GetBuiltinTypeError &Error,
2416 unsigned *IntegerConstantArgs = nullptr) const;
2417
2418
2419
2420 ComparisonCategories CompCategories;
2421
2422 private:
2423 CanQualType getFromTargetType(unsigned Type) const;
2424 TypeInfo getTypeInfoImpl(const Type *T) const;
2425
2426
2427
2428
2429
2430 public:
2431
2432
2433 Qualifiers::GC getObjCGCAttrKind(QualType Ty) const;
2434
2435
2436
2437
2438
2439
2440 bool areCompatibleVectorTypes(QualType FirstVec, QualType SecondVec);
2441
2442
2443
2444
2445 bool areCompatibleSveTypes(QualType FirstType, QualType SecondType);
2446
2447
2448
2449 bool areLaxCompatibleSveTypes(QualType FirstType, QualType SecondType);
2450
2451
2452
2453
2454 bool areCompatibleRVVTypes(QualType FirstType, QualType SecondType);
2455
2456
2457
2458
2459
2460 bool areLaxCompatibleRVVTypes(QualType FirstType, QualType SecondType);
2461
2462
2463
2464
2465 bool hasDirectOwnershipQualifier(QualType Ty) const;
2466
2467
2468
2469 static bool isObjCNSObjectType(QualType Ty) {
2470 return Ty->isObjCNSObjectType();
2471 }
2472
2473
2474
2475
2476
2477
2478
2479 const llvm::fltSemantics &getFloatTypeSemantics(QualType T) const;
2480
2481
2482 TypeInfo getTypeInfo(const Type *T) const;
2483 TypeInfo getTypeInfo(QualType T) const { return getTypeInfo(T.getTypePtr()); }
2484
2485
2486 unsigned getOpenMPDefaultSimdAlign(QualType T) const;
2487
2488
2489 uint64_t getTypeSize(QualType T) const { return getTypeInfo(T).Width; }
2490 uint64_t getTypeSize(const Type *T) const { return getTypeInfo(T).Width; }
2491
2492
2493 uint64_t getCharWidth() const {
2494 return getTypeSize(CharTy);
2495 }
2496
2497
2498 CharUnits toCharUnitsFromBits(int64_t BitSize) const;
2499
2500
2501 int64_t toBits(CharUnits CharSize) const;
2502
2503
2504
2505 CharUnits getTypeSizeInChars(QualType T) const;
2506 CharUnits getTypeSizeInChars(const Type *T) const;
2507
2508 std::optional<CharUnits> getTypeSizeInCharsIfKnown(QualType Ty) const {
2509 if (Ty->isIncompleteType() || Ty->isDependentType())
2510 return std::nullopt;
2511 return getTypeSizeInChars(Ty);
2512 }
2513
2514 std::optional<CharUnits> getTypeSizeInCharsIfKnown(const Type *Ty) const {
2515 return getTypeSizeInCharsIfKnown(QualType(Ty, 0));
2516 }
2517
2518
2519
2520 unsigned getTypeAlign(QualType T) const { return getTypeInfo(T).Align; }
2521 unsigned getTypeAlign(const Type *T) const { return getTypeInfo(T).Align; }
2522
2523
2524
2525
2526
2527
2528 unsigned getTypeUnadjustedAlign(QualType T) const {
2529 return getTypeUnadjustedAlign(T.getTypePtr());
2530 }
2531 unsigned getTypeUnadjustedAlign(const Type *T) const;
2532
2533
2534
2535
2536
2537
2538 unsigned getTypeAlignIfKnown(QualType T,
2539 bool NeedsPreferredAlignment = false) const;
2540
2541
2542
2543 CharUnits getTypeAlignInChars(QualType T) const;
2544 CharUnits getTypeAlignInChars(const Type *T) const;
2545
2546
2547
2548 CharUnits getPreferredTypeAlignInChars(QualType T) const {
2549 return toCharUnitsFromBits(getPreferredTypeAlign(T));
2550 }
2551
2552
2553
2554
2555 CharUnits getTypeUnadjustedAlignInChars(QualType T) const;
2556 CharUnits getTypeUnadjustedAlignInChars(const Type *T) const;
2557
2558
2559
2560 TypeInfoChars getTypeInfoDataSizeInChars(QualType T) const;
2561
2562 TypeInfoChars getTypeInfoInChars(const Type *T) const;
2563 TypeInfoChars getTypeInfoInChars(QualType T) const;
2564
2565
2566
2567 bool isAlignmentRequired(const Type *T) const;
2568 bool isAlignmentRequired(QualType T) const;
2569
2570
2571 bool isPromotableIntegerType(QualType T) const;
2572
2573
2574
2575
2576
2577
2578
2579
2580 unsigned getPreferredTypeAlign(QualType T) const {
2581 return getPreferredTypeAlign(T.getTypePtr());
2582 }
2583 unsigned getPreferredTypeAlign(const Type *T) const;
2584
2585
2586
2587 unsigned getTargetDefaultAlignForAttributeAligned() const;
2588
2589
2590
2591
2592 unsigned getAlignOfGlobalVar(QualType T, const VarDecl *VD) const;
2593
2594
2595
2596
2597 CharUnits getAlignOfGlobalVarInChars(QualType T, const VarDecl *VD) const;
2598
2599
2600
2601 unsigned getMinGlobalAlignOfVar(uint64_t Size, const VarDecl *VD) const;
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613 CharUnits getDeclAlign(const Decl *D, bool ForAlignof = false) const;
2614
2615
2616
2617
2618 CharUnits getExnObjectAlignment() const;
2619
2620
2621
2622
2623 const ASTRecordLayout &getASTRecordLayout(const RecordDecl *D) const;
2624
2625
2626
2627 const ASTRecordLayout &getASTObjCInterfaceLayout(const ObjCInterfaceDecl *D)
2628 const;
2629
2630 void DumpRecordLayout(const RecordDecl *RD, raw_ostream &OS,
2631 bool Simple = false) const;
2632
2633
2634
2635
2636
2637 const ASTRecordLayout &
2638 getASTObjCImplementationLayout(const ObjCImplementationDecl *D) const;
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650 const CXXMethodDecl *getCurrentKeyFunction(const CXXRecordDecl *RD);
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660 void setNonKeyFunction(const CXXMethodDecl *method);
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671 CharUnits getOffsetOfBaseWithVBPtr(const CXXRecordDecl *RD) const;
2672
2673
2674 uint64_t getFieldOffset(const ValueDecl *FD) const;
2675
2676
2677 uint64_t lookupFieldBitOffset(const ObjCInterfaceDecl *OID,
2678 const ObjCImplementationDecl *ID,
2679 const ObjCIvarDecl *Ivar) const;
2680
2681
2682
2683 CharUnits getMemberPointerPathAdjustment(const APValue &MP) const;
2684
2685 bool isNearlyEmpty(const CXXRecordDecl *RD) const;
2686
2687 VTableContextBase *getVTableContext();
2688
2689
2690 MangleContext *createMangleContext(const TargetInfo *T = nullptr);
2691
2692
2693
2694
2695
2696 MangleContext *createDeviceMangleContext(const TargetInfo &T);
2697
2698 void DeepCollectObjCIvars(const ObjCInterfaceDecl *OI, bool leafClass,
2699 SmallVectorImpl<const ObjCIvarDecl*> &Ivars) const;
2700
2701 unsigned CountNonClassIvars(const ObjCInterfaceDecl *OI) const;
2702 void CollectInheritedProtocols(const Decl *CDecl,
2703 llvm::SmallPtrSet<ObjCProtocolDecl*, 8> &Protocols);
2704
2705
2706
2707 bool
2708 hasUniqueObjectRepresentations(QualType Ty,
2709 bool CheckIfTriviallyCopyable = true) const;
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723 CanQualType getCanonicalType(QualType T) const {
2724 return CanQualType::CreateUnsafe(T.getCanonicalType());
2725 }
2726
2727 const Type *getCanonicalType(const Type *T) const {
2728 return T->getCanonicalTypeInternal().getTypePtr();
2729 }
2730
2731
2732
2733
2734
2735
2736 CanQualType getCanonicalParamType(QualType T) const;
2737
2738
2739 bool hasSameType(QualType T1, QualType T2) const {
2740 return getCanonicalType(T1) == getCanonicalType(T2);
2741 }
2742 bool hasSameType(const Type *T1, const Type *T2) const {
2743 return getCanonicalType(T1) == getCanonicalType(T2);
2744 }
2745
2746
2747 bool hasSameExpr(const Expr *X, const Expr *Y) const;
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762 QualType getUnqualifiedArrayType(QualType T, Qualifiers &Quals) const;
2763 QualType getUnqualifiedArrayType(QualType T) const {
2764 Qualifiers Quals;
2765 return getUnqualifiedArrayType(T, Quals);
2766 }
2767
2768
2769
2770 bool hasSameUnqualifiedType(QualType T1, QualType T2) const {
2771 return getCanonicalType(T1).getTypePtr() ==
2772 getCanonicalType(T2).getTypePtr();
2773 }
2774
2775 bool hasSameNullabilityTypeQualifier(QualType SubT, QualType SuperT,
2776 bool IsParam) const {
2777 auto SubTnullability = SubT->getNullability();
2778 auto SuperTnullability = SuperT->getNullability();
2779 if (SubTnullability.has_value() == SuperTnullability.has_value()) {
2780
2781 if (!SubTnullability)
2782 return true;
2783
2784 if (*SubTnullability == *SuperTnullability ||
2785 *SubTnullability == NullabilityKind::Unspecified ||
2786 *SuperTnullability == NullabilityKind::Unspecified)
2787 return true;
2788
2789 if (IsParam) {
2790
2791
2792 return (*SuperTnullability == NullabilityKind::NonNull &&
2793 *SubTnullability == NullabilityKind::Nullable);
2794 }
2795
2796
2797 return (*SuperTnullability == NullabilityKind::Nullable &&
2798 *SubTnullability == NullabilityKind::NonNull);
2799 }
2800 return true;
2801 }
2802
2803 bool ObjCMethodsAreEqual(const ObjCMethodDecl *MethodDecl,
2804 const ObjCMethodDecl *MethodImp);
2805
2806 bool UnwrapSimilarTypes(QualType &T1, QualType &T2,
2807 bool AllowPiMismatch = true) const;
2808 void UnwrapSimilarArrayTypes(QualType &T1, QualType &T2,
2809 bool AllowPiMismatch = true) const;
2810
2811
2812
2813
2814
2815
2816
2817
2818 bool hasSimilarType(QualType T1, QualType T2) const;
2819
2820
2821 bool hasCvrSimilarType(QualType T1, QualType T2);
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
2846 NestedNameSpecifier *
2847 getCanonicalNestedNameSpecifier(NestedNameSpecifier *NNS) const;
2848
2849
2850 CallingConv getDefaultCallingConvention(bool IsVariadic,
2851 bool IsCXXMethod,
2852 bool IsBuiltin = false) const;
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872 TemplateName getCanonicalTemplateName(TemplateName Name,
2873 bool IgnoreDeduced = false) const;
2874
2875
2876
2877 bool hasSameTemplateName(const TemplateName &X, const TemplateName &Y,
2878 bool IgnoreDeduced = false) const;
2879
2880
2881 bool isSameEntity(const NamedDecl *X, const NamedDecl *Y) const;
2882
2883
2884
2885 bool isSameTemplateParameterList(const TemplateParameterList *X,
2886 const TemplateParameterList *Y) const;
2887
2888
2889
2890 bool isSameTemplateParameter(const NamedDecl *X, const NamedDecl *Y) const;
2891
2892
2893
2894
2895
2896
2897 bool isSameConstraintExpr(const Expr *XCE, const Expr *YCE) const;
2898
2899
2900
2901 bool isSameTypeConstraint(const TypeConstraint *XTC,
2902 const TypeConstraint *YTC) const;
2903
2904
2905
2906 bool isSameDefaultTemplateArgument(const NamedDecl *X,
2907 const NamedDecl *Y) const;
2908
2909
2910
2911
2912
2913
2914 TemplateArgument getCanonicalTemplateArgument(const TemplateArgument &Arg)
2915 const;
2916
2917
2918
2919
2920
2921 const ArrayType *getAsArrayType(QualType T) const;
2922 const ConstantArrayType *getAsConstantArrayType(QualType T) const {
2923 return dyn_cast_or_null<ConstantArrayType>(getAsArrayType(T));
2924 }
2925 const VariableArrayType *getAsVariableArrayType(QualType T) const {
2926 return dyn_cast_or_null<VariableArrayType>(getAsArrayType(T));
2927 }
2928 const IncompleteArrayType *getAsIncompleteArrayType(QualType T) const {
2929 return dyn_cast_or_null<IncompleteArrayType>(getAsArrayType(T));
2930 }
2931 const DependentSizedArrayType *getAsDependentSizedArrayType(QualType T)
2932 const {
2933 return dyn_cast_or_null<DependentSizedArrayType>(getAsArrayType(T));
2934 }
2935
2936
2937
2938
2939 QualType getBaseElementType(const ArrayType *VAT) const;
2940
2941
2942
2943 QualType getBaseElementType(QualType QT) const;
2944
2945
2946 uint64_t getConstantArrayElementCount(const ConstantArrayType *CA) const;
2947
2948
2949 uint64_t
2950 getArrayInitLoopExprElementCount(const ArrayInitLoopExpr *AILE) const;
2951
2952
2953
2954
2955
2956
2957 QualType getAdjustedParameterType(QualType T) const;
2958
2959
2960
2961
2962 QualType getSignatureParameterType(QualType T) const;
2963
2964 QualType getExceptionObjectType(QualType T) const;
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974 QualType getArrayDecayedType(QualType T) const;
2975
2976
2977
2978 QualType getPromotedIntegerType(QualType PromotableType) const;
2979
2980
2981
2982 Qualifiers::ObjCLifetime getInnerObjCOwnership(QualType T) const;
2983
2984
2985
2986
2987
2988
2989 QualType isPromotableBitField(Expr *E) const;
2990
2991
2992
2993
2994
2995 int getIntegerTypeOrder(QualType LHS, QualType RHS) const;
2996
2997
2998
2999
3000
3001
3002 int getFloatingTypeOrder(QualType LHS, QualType RHS) const;
3003
3004
3005
3006
3007 int getFloatingTypeSemanticOrder(QualType LHS, QualType RHS) const;
3008
3009 unsigned getTargetAddressSpace(LangAS AS) const;
3010
3011 LangAS getLangASForBuiltinAddressSpace(unsigned AS) const;
3012
3013
3014
3015 uint64_t getTargetNullPointerValue(QualType QT) const;
3016
3017 bool addressSpaceMapManglingFor(LangAS AS) const {
3018 return AddrSpaceMapMangling || isTargetAddressSpace(AS);
3019 }
3020
3021 bool hasAnyFunctionEffects() const { return AnyFunctionEffects; }
3022
3023
3024
3025
3026 FunctionProtoType::ExceptionSpecInfo
3027 mergeExceptionSpecs(FunctionProtoType::ExceptionSpecInfo ESI1,
3028 FunctionProtoType::ExceptionSpecInfo ESI2,
3029 SmallVectorImpl<QualType> &ExceptionTypeStorage,
3030 bool AcceptDependent);
3031
3032
3033
3034
3035
3036
3037 QualType getCommonSugaredType(QualType X, QualType Y,
3038 bool Unqualified = false);
3039
3040 private:
3041
3042 unsigned getIntegerRank(const Type *T) const;
3043
3044 public:
3045
3046
3047
3048
3049
3050 bool typesAreCompatible(QualType T1, QualType T2,
3051 bool CompareUnqualified = false);
3052
3053 bool propertyTypesAreCompatible(QualType, QualType);
3054 bool typesAreBlockPointerCompatible(QualType, QualType);
3055
3056 bool isObjCIdType(QualType T) const {
3057 if (const auto *ET = dyn_cast<ElaboratedType>(T))
3058 T = ET->getNamedType();
3059 return T == getObjCIdType();
3060 }
3061
3062 bool isObjCClassType(QualType T) const {
3063 if (const auto *ET = dyn_cast<ElaboratedType>(T))
3064 T = ET->getNamedType();
3065 return T == getObjCClassType();
3066 }
3067
3068 bool isObjCSelType(QualType T) const {
3069 if (const auto *ET = dyn_cast<ElaboratedType>(T))
3070 T = ET->getNamedType();
3071 return T == getObjCSelType();
3072 }
3073
3074 bool ObjCQualifiedIdTypesAreCompatible(const ObjCObjectPointerType *LHS,
3075 const ObjCObjectPointerType *RHS,
3076 bool ForCompare);
3077
3078 bool ObjCQualifiedClassTypesAreCompatible(const ObjCObjectPointerType *LHS,
3079 const ObjCObjectPointerType *RHS);
3080
3081
3082 bool canAssignObjCInterfaces(const ObjCObjectPointerType *LHSOPT,
3083 const ObjCObjectPointerType *RHSOPT);
3084 bool canAssignObjCInterfaces(const ObjCObjectType *LHS,
3085 const ObjCObjectType *RHS);
3086 bool canAssignObjCInterfacesInBlockPointer(
3087 const ObjCObjectPointerType *LHSOPT,
3088 const ObjCObjectPointerType *RHSOPT,
3089 bool BlockReturnType);
3090 bool areComparableObjCPointerTypes(QualType LHS, QualType RHS);
3091 QualType areCommonBaseCompatible(const ObjCObjectPointerType *LHSOPT,
3092 const ObjCObjectPointerType *RHSOPT);
3093 bool canBindObjCObjectType(QualType To, QualType From);
3094
3095
3096 QualType mergeTypes(QualType, QualType, bool OfBlockPointer = false,
3097 bool Unqualified = false, bool BlockReturnType = false,
3098 bool IsConditionalOperator = false);
3099 QualType mergeFunctionTypes(QualType, QualType, bool OfBlockPointer = false,
3100 bool Unqualified = false, bool AllowCXX = false,
3101 bool IsConditionalOperator = false);
3102 QualType mergeFunctionParameterTypes(QualType, QualType,
3103 bool OfBlockPointer = false,
3104 bool Unqualified = false);
3105 QualType mergeTransparentUnionType(QualType, QualType,
3106 bool OfBlockPointer=false,
3107 bool Unqualified = false);
3108
3109 QualType mergeObjCGCQualifiers(QualType, QualType);
3110
3111
3112
3113
3114
3115
3116
3117
3118
3119
3120
3121
3122
3123
3124
3125
3126
3127
3128
3129
3130 bool mergeExtParameterInfo(
3131 const FunctionProtoType *FirstFnType,
3132 const FunctionProtoType *SecondFnType,
3133 bool &CanUseFirst, bool &CanUseSecond,
3134 SmallVectorImpl<FunctionProtoType::ExtParameterInfo> &NewParamInfos);
3135
3136 void ResetObjCLayout(const ObjCContainerDecl *CD);
3137
3138
3139
3140
3141
3142
3143
3144 unsigned getIntWidth(QualType T) const;
3145
3146
3147
3148
3149
3150
3151
3152 QualType getCorrespondingUnsignedType(QualType T) const;
3153
3154
3155
3156
3157
3158
3159
3160 QualType getCorrespondingSignedType(QualType T) const;
3161
3162
3163
3164 QualType getCorrespondingSaturatedType(QualType Ty) const;
3165
3166
3167
3168 QualType getCorrespondingUnsaturatedType(QualType Ty) const;
3169
3170
3171
3172
3173
3174 QualType getCorrespondingSignedFixedPointType(QualType Ty) const;
3175
3176
3177
3178
3179
3180
3181
3182 llvm::APSInt MakeIntValue(uint64_t Value, QualType Type) const {
3183
3184
3185 llvm::APSInt Res(64, !Type->isSignedIntegerOrEnumerationType());
3186 Res = Value;
3187 unsigned Width = getIntWidth(Type);
3188 if (Width != Res.getBitWidth())
3189 return Res.extOrTrunc(Width);
3190 return Res;
3191 }
3192
3193 bool isSentinelNullExpr(const Expr *E);
3194
3195
3196
3197 ObjCImplementationDecl *getObjCImplementation(ObjCInterfaceDecl *D);
3198
3199
3200
3201 ObjCCategoryImplDecl *getObjCImplementation(ObjCCategoryDecl *D);
3202
3203
3204 bool AnyObjCImplementation() {
3205 return !ObjCImpls.empty();
3206 }
3207
3208
3209 void setObjCImplementation(ObjCInterfaceDecl *IFaceD,
3210 ObjCImplementationDecl *ImplD);
3211
3212
3213 void setObjCImplementation(ObjCCategoryDecl *CatD,
3214 ObjCCategoryImplDecl *ImplD);
3215
3216
3217
3218 const ObjCMethodDecl *
3219 getObjCMethodRedeclaration(const ObjCMethodDecl *MD) const;
3220
3221 void setObjCMethodRedeclaration(const ObjCMethodDecl *MD,
3222 const ObjCMethodDecl *Redecl);
3223
3224
3225
3226
3227 const ObjCInterfaceDecl *getObjContainingInterface(const NamedDecl *ND) const;
3228
3229
3230
3231 void setBlockVarCopyInit(const VarDecl* VD, Expr *CopyExpr, bool CanThrow);
3232
3233
3234
3235 BlockVarCopyInit getBlockVarCopyInit(const VarDecl* VD) const;
3236
3237
3238
3239
3240
3241
3242
3243
3244
3245
3246
3247
3248 TypeSourceInfo *CreateTypeSourceInfo(QualType T, unsigned Size = 0) const;
3249
3250
3251
3252
3253 TypeSourceInfo *
3254 getTrivialTypeSourceInfo(QualType T,
3255 SourceLocation Loc = SourceLocation()) const;
3256
3257
3258
3259
3260
3261
3262
3263
3264 void AddDeallocation(void (*Callback)(void *), void *Data) const;
3265
3266
3267
3268 template <typename T> void addDestruction(T *Ptr) const {
3269 if (!std::is_trivially_destructible<T>::value) {
3270 auto DestroyPtr = [](void *V) { static_cast<T *>(V)->~T(); };
3271 AddDeallocation(DestroyPtr, Ptr);
3272 }
3273 }
3274
3275 GVALinkage GetGVALinkageForFunction(const FunctionDecl *FD) const;
3276 GVALinkage GetGVALinkageForVariable(const VarDecl *VD) const;
3277
3278
3279
3280
3281
3282
3283
3284 bool DeclMustBeEmitted(const Decl *D);
3285
3286
3287
3288 void forEachMultiversionedFunctionVersion(
3289 const FunctionDecl *FD,
3290 llvm::function_ref<void(FunctionDecl *)> Pred) const;
3291
3292 const CXXConstructorDecl *
3293 getCopyConstructorForExceptionObject(CXXRecordDecl *RD);
3294
3295 void addCopyConstructorForExceptionObject(CXXRecordDecl *RD,
3296 CXXConstructorDecl *CD);
3297
3298 void addTypedefNameForUnnamedTagDecl(TagDecl *TD, TypedefNameDecl *TND);
3299
3300 TypedefNameDecl *getTypedefNameForUnnamedTagDecl(const TagDecl *TD);
3301
3302 void addDeclaratorForUnnamedTagDecl(TagDecl *TD, DeclaratorDecl *DD);
3303
3304 DeclaratorDecl *getDeclaratorForUnnamedTagDecl(const TagDecl *TD);
3305
3306 void setManglingNumber(const NamedDecl *ND, unsigned Number);
3307 unsigned getManglingNumber(const NamedDecl *ND,
3308 bool ForAuxTarget = false) const;
3309
3310 void setStaticLocalNumber(const VarDecl *VD, unsigned Number);
3311 unsigned getStaticLocalNumber(const VarDecl *VD) const;
3312
3313
3314
3315 MangleNumberingContext &getManglingNumberContext(const DeclContext *DC);
3316 enum NeedExtraManglingDecl_t { NeedExtraManglingDecl };
3317 MangleNumberingContext &getManglingNumberContext(NeedExtraManglingDecl_t,
3318 const Decl *D);
3319
3320 std::unique_ptr<MangleNumberingContext> createMangleNumberingContext() const;
3321
3322
3323
3324 void setParameterIndex(const ParmVarDecl *D, unsigned index);
3325
3326
3327
3328 unsigned getParameterIndex(const ParmVarDecl *D) const;
3329
3330
3331
3332
3333 StringLiteral *getPredefinedStringLiteralFromCache(StringRef Key) const;
3334
3335
3336
3337 unsigned getNextStringLiteralVersion() { return NextStringLiteralVersion++; }
3338
3339
3340
3341 MSGuidDecl *getMSGuidDecl(MSGuidDeclParts Parts) const;
3342
3343
3344
3345 UnnamedGlobalConstantDecl *
3346 getUnnamedGlobalConstantDecl(QualType Ty, const APValue &Value) const;
3347
3348
3349
3350 TemplateParamObjectDecl *getTemplateParamObjectDecl(QualType T,
3351 const APValue &V) const;
3352
3353
3354
3355 ParsedTargetAttr filterFunctionTargetAttrs(const TargetAttr *TD) const;
3356
3357 void getFunctionFeatureMap(llvm::StringMap<bool> &FeatureMap,
3358 const FunctionDecl *) const;
3359 void getFunctionFeatureMap(llvm::StringMap<bool> &FeatureMap,
3360 GlobalDecl GD) const;
3361
3362
3363
3364
3365
3366
3367
3368 void registerSYCLEntryPointFunction(FunctionDecl *FD);
3369
3370
3371
3372
3373 const SYCLKernelInfo &getSYCLKernelInfo(QualType T) const;
3374
3375
3376
3377
3378 const SYCLKernelInfo *findSYCLKernelInfo(QualType T) const;
3379
3380
3381
3382
3383
3384
3385 unsigned NumImplicitDefaultConstructors = 0;
3386
3387
3388
3389 unsigned NumImplicitDefaultConstructorsDeclared = 0;
3390
3391
3392 unsigned NumImplicitCopyConstructors = 0;
3393
3394
3395
3396 unsigned NumImplicitCopyConstructorsDeclared = 0;
3397
3398
3399 unsigned NumImplicitMoveConstructors = 0;
3400
3401
3402
3403 unsigned NumImplicitMoveConstructorsDeclared = 0;
3404
3405
3406 unsigned NumImplicitCopyAssignmentOperators = 0;
3407
3408
3409
3410 unsigned NumImplicitCopyAssignmentOperatorsDeclared = 0;
3411
3412
3413 unsigned NumImplicitMoveAssignmentOperators = 0;
3414
3415
3416
3417 unsigned NumImplicitMoveAssignmentOperatorsDeclared = 0;
3418
3419
3420 unsigned NumImplicitDestructors = 0;
3421
3422
3423
3424 unsigned NumImplicitDestructorsDeclared = 0;
3425
3426 public:
3427
3428
3429
3430
3431
3432
3433 void InitBuiltinTypes(const TargetInfo &Target,
3434 const TargetInfo *AuxTarget = nullptr);
3435
3436 private:
3437 void InitBuiltinType(CanQualType &R, BuiltinType::Kind K);
3438
3439 class ObjCEncOptions {
3440 unsigned Bits;
3441
3442 ObjCEncOptions(unsigned Bits) : Bits(Bits) {}
3443
3444 public:
3445 ObjCEncOptions() : Bits(0) {}
3446
3447 #define OPT_LIST(V) \
3448 V(ExpandPointedToStructures, 0) \
3449 V(ExpandStructures, 1) \
3450 V(IsOutermostType, 2) \
3451 V(EncodingProperty, 3) \
3452 V(IsStructField, 4) \
3453 V(EncodeBlockParameters, 5) \
3454 V(EncodeClassNames, 6) \
3455
3456 #define V(N,I) ObjCEncOptions& set##N() { Bits |= 1 << I; return *this; }
3457 OPT_LIST(V)
3458 #undef V
3459
3460 #define V(N,I) bool N() const { return Bits & 1 << I; }
3461 OPT_LIST(V)
3462 #undef V
3463
3464 #undef OPT_LIST
3465
3466 [[nodiscard]] ObjCEncOptions keepingOnly(ObjCEncOptions Mask) const {
3467 return Bits & Mask.Bits;
3468 }
3469
3470 [[nodiscard]] ObjCEncOptions forComponentType() const {
3471 ObjCEncOptions Mask = ObjCEncOptions()
3472 .setIsOutermostType()
3473 .setIsStructField();
3474 return Bits & ~Mask.Bits;
3475 }
3476 };
3477
3478
3479 void getObjCEncodingForTypeImpl(QualType t, std::string &S,
3480 ObjCEncOptions Options,
3481 const FieldDecl *Field,
3482 QualType *NotEncodedT = nullptr) const;
3483
3484
3485 void getObjCEncodingForStructureImpl(RecordDecl *RD, std::string &S,
3486 const FieldDecl *Field,
3487 bool includeVBases = true,
3488 QualType *NotEncodedT=nullptr) const;
3489
3490 public:
3491
3492 void getObjCEncodingForMethodParameter(Decl::ObjCDeclQualifier QT,
3493 QualType T, std::string& S,
3494 bool Extended) const;
3495
3496
3497
3498 bool isMSStaticDataMemberInlineDefinition(const VarDecl *VD) const;
3499
3500 enum class InlineVariableDefinitionKind {
3501
3502 None,
3503
3504
3505 Weak,
3506
3507
3508 WeakUnknown,
3509
3510
3511 Strong
3512 };
3513
3514
3515
3516
3517
3518
3519 InlineVariableDefinitionKind
3520 getInlineVariableDefinitionKind(const VarDecl *VD) const;
3521
3522 private:
3523 friend class DeclarationNameTable;
3524 friend class DeclContext;
3525
3526 const ASTRecordLayout &
3527 getObjCLayout(const ObjCInterfaceDecl *D,
3528 const ObjCImplementationDecl *Impl) const;
3529
3530
3531
3532
3533
3534
3535
3536
3537
3538 using DeallocationFunctionsAndArguments =
3539 llvm::SmallVector<std::pair<void (*)(void *), void *>, 16>;
3540 mutable DeallocationFunctionsAndArguments Deallocations;
3541
3542
3543
3544
3545 llvm::PointerIntPair<StoredDeclsMap *, 1> LastSDM;
3546
3547 std::vector<Decl *> TraversalScope;
3548
3549 std::unique_ptr<VTableContextBase> VTContext;
3550
3551 void ReleaseDeclContextMaps();
3552
3553 public:
3554 enum PragmaSectionFlag : unsigned {
3555 PSF_None = 0,
3556 PSF_Read = 0x1,
3557 PSF_Write = 0x2,
3558 PSF_Execute = 0x4,
3559 PSF_Implicit = 0x8,
3560 PSF_ZeroInit = 0x10,
3561 PSF_Invalid = 0x80000000U,
3562 };
3563
3564 struct SectionInfo {
3565 NamedDecl *Decl;
3566 SourceLocation PragmaSectionLocation;
3567 int SectionFlags;
3568
3569 SectionInfo() = default;
3570 SectionInfo(NamedDecl *Decl, SourceLocation PragmaSectionLocation,
3571 int SectionFlags)
3572 : Decl(Decl), PragmaSectionLocation(PragmaSectionLocation),
3573 SectionFlags(SectionFlags) {}
3574 };
3575
3576 llvm::StringMap<SectionInfo> SectionInfos;
3577
3578
3579 OMPTraitInfo &getNewOMPTraitInfo();
3580
3581
3582 bool mayExternalize(const Decl *D) const;
3583
3584
3585 bool shouldExternalize(const Decl *D) const;
3586
3587
3588
3589 const CXXRecordDecl *
3590 baseForVTableAuthentication(const CXXRecordDecl *ThisClass);
3591 bool useAbbreviatedThunkName(GlobalDecl VirtualMethodDecl,
3592 StringRef MangledName);
3593
3594 StringRef getCUIDHash() const;
3595
3596 private:
3597
3598
3599 SmallVector<std::unique_ptr<OMPTraitInfo>, 4> OMPTraitInfoVector;
3600
3601 llvm::DenseMap<GlobalDecl, llvm::StringSet<>> ThunksToBeAbbreviated;
3602 };
3603
3604
3605 const StreamingDiagnostic &operator<<(const StreamingDiagnostic &DB,
3606 const ASTContext::SectionInfo &Section);
3607
3608
3609 inline Selector GetNullarySelector(StringRef name, ASTContext &Ctx) {
3610 const IdentifierInfo *II = &Ctx.Idents.get(name);
3611 return Ctx.Selectors.getSelector(0, &II);
3612 }
3613
3614
3615 inline Selector GetUnarySelector(StringRef name, ASTContext &Ctx) {
3616 const IdentifierInfo *II = &Ctx.Idents.get(name);
3617 return Ctx.Selectors.getSelector(1, &II);
3618 }
3619
3620 }
3621
3622
3623
3624
3625
3626
3627
3628
3629
3630
3631
3632
3633
3634
3635
3636
3637
3638
3639
3640
3641
3642
3643
3644
3645
3646
3647
3648
3649
3650
3651
3652 inline void *operator new(size_t Bytes, const clang::ASTContext &C,
3653 size_t Alignment ) {
3654 return C.Allocate(Bytes, Alignment);
3655 }
3656
3657
3658
3659
3660
3661
3662
3663 inline void operator delete(void *Ptr, const clang::ASTContext &C, size_t) {
3664 C.Deallocate(Ptr);
3665 }
3666
3667
3668
3669
3670
3671
3672
3673
3674
3675
3676
3677
3678
3679
3680
3681
3682
3683
3684
3685
3686
3687
3688
3689
3690 inline void *operator new[](size_t Bytes, const clang::ASTContext& C,
3691 size_t Alignment ) {
3692 return C.Allocate(Bytes, Alignment);
3693 }
3694
3695
3696
3697
3698
3699
3700
3701 inline void operator delete[](void *Ptr, const clang::ASTContext &C, size_t) {
3702 C.Deallocate(Ptr);
3703 }
3704
3705
3706 template <typename Owner, typename T,
3707 void (clang::ExternalASTSource::*Update)(Owner)>
3708 typename clang::LazyGenerationalUpdatePtr<Owner, T, Update>::ValueType
3709 clang::LazyGenerationalUpdatePtr<Owner, T, Update>::makeValue(
3710 const clang::ASTContext &Ctx, T Value) {
3711
3712
3713
3714 if (auto *Source = Ctx.getExternalSource())
3715 return new (Ctx) LazyData(Source, Value);
3716 return Value;
3717 }
3718
3719 #endif