1 //===- ASTContext.h - Context to hold long-lived AST nodes ------*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 /// \file 10 /// Defines the clang::ASTContext interface. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #ifndef LLVM_CLANG_AST_ASTCONTEXT_H 15 #define LLVM_CLANG_AST_ASTCONTEXT_H 16 17 #include "clang/AST/ASTFwd.h" 18 #include "clang/AST/CanonicalType.h" 19 #include "clang/AST/CommentCommandTraits.h" 20 #include "clang/AST/ComparisonCategories.h" 21 #include "clang/AST/Decl.h" 22 #include "clang/AST/DeclarationName.h" 23 #include "clang/AST/ExternalASTSource.h" 24 #include "clang/AST/PrettyPrinter.h" 25 #include "clang/AST/RawCommentList.h" 26 #include "clang/AST/SYCLKernelInfo.h" 27 #include "clang/AST/TemplateName.h" 28 #include "clang/Basic/LLVM.h" 29 #include "clang/Basic/PartialDiagnostic.h" 30 #include "clang/Basic/SourceLocation.h" 31 #include "llvm/ADT/DenseMap.h" 32 #include "llvm/ADT/DenseSet.h" 33 #include "llvm/ADT/FoldingSet.h" 34 #include "llvm/ADT/IntrusiveRefCntPtr.h" 35 #include "llvm/ADT/MapVector.h" 36 #include "llvm/ADT/PointerIntPair.h" 37 #include "llvm/ADT/PointerUnion.h" 38 #include "llvm/ADT/SetVector.h" 39 #include "llvm/ADT/SmallVector.h" 40 #include "llvm/ADT/StringMap.h" 41 #include "llvm/ADT/StringRef.h" 42 #include "llvm/ADT/StringSet.h" 43 #include "llvm/ADT/TinyPtrVector.h" 44 #include "llvm/Support/TypeSize.h" 45 #include <optional> 46 47 namespace llvm { 48 49 class APFixedPoint; 50 class FixedPointSemantics; 51 struct fltSemantics; 52 template <typename T, unsigned N> class SmallPtrSet; 53 54 } // namespace llvm 55 56 namespace clang { 57 58 class APValue; 59 class ASTMutationListener; 60 class ASTRecordLayout; 61 class AtomicExpr; 62 class BlockExpr; 63 struct BlockVarCopyInit; 64 class BuiltinTemplateDecl; 65 class CharUnits; 66 class ConceptDecl; 67 class CXXABI; 68 class CXXConstructorDecl; 69 class CXXMethodDecl; 70 class CXXRecordDecl; 71 class DiagnosticsEngine; 72 class DynTypedNodeList; 73 class Expr; 74 enum class FloatModeKind; 75 class GlobalDecl; 76 class IdentifierTable; 77 class LangOptions; 78 class MangleContext; 79 class MangleNumberingContext; 80 class MemberSpecializationInfo; 81 class Module; 82 struct MSGuidDeclParts; 83 class NestedNameSpecifier; 84 class NoSanitizeList; 85 class ObjCCategoryDecl; 86 class ObjCCategoryImplDecl; 87 class ObjCContainerDecl; 88 class ObjCImplDecl; 89 class ObjCImplementationDecl; 90 class ObjCInterfaceDecl; 91 class ObjCIvarDecl; 92 class ObjCMethodDecl; 93 class ObjCPropertyDecl; 94 class ObjCPropertyImplDecl; 95 class ObjCProtocolDecl; 96 class ObjCTypeParamDecl; 97 class OMPTraitInfo; 98 class ParentMapContext; 99 struct ParsedTargetAttr; 100 class Preprocessor; 101 class ProfileList; 102 class StoredDeclsMap; 103 class TargetAttr; 104 class TargetInfo; 105 class TemplateDecl; 106 class TemplateParameterList; 107 class TemplateTemplateParmDecl; 108 class TemplateTypeParmDecl; 109 class TypeConstraint; 110 class UnresolvedSetIterator; 111 class UsingShadowDecl; 112 class VarTemplateDecl; 113 class VTableContextBase; 114 class XRayFunctionFilter; 115 116 /// A simple array of base specifiers. 117 typedef SmallVector<CXXBaseSpecifier *, 4> CXXCastPath; 118 119 namespace Builtin { 120 121 class Context; 122 123 } // namespace Builtin 124 125 enum BuiltinTemplateKind : int; 126 enum OpenCLTypeKind : uint8_t; 127 128 namespace comments { 129 130 class FullComment; 131 132 } // namespace comments 133 134 namespace interp { 135 136 class Context; 137 138 } // namespace interp 139 140 namespace serialization { 141 template <class> class AbstractTypeReader; 142 } // namespace serialization 143 144 enum class AlignRequirementKind { 145 /// The alignment was not explicit in code. 146 None, 147 148 /// The alignment comes from an alignment attribute on a typedef. 149 RequiredByTypedef, 150 151 /// The alignment comes from an alignment attribute on a record type. 152 RequiredByRecord, 153 154 /// The alignment comes from an alignment attribute on a enum type. 155 RequiredByEnum, 156 }; 157 158 struct TypeInfo { 159 uint64_t Width = 0; 160 unsigned Align = 0; 161 AlignRequirementKind AlignRequirement; 162 163 TypeInfo() : AlignRequirement(AlignRequirementKind::None) {} 164 TypeInfo(uint64_t Width, unsigned Align, 165 AlignRequirementKind AlignRequirement) 166 : Width(Width), Align(Align), AlignRequirement(AlignRequirement) {} 167 bool isAlignRequired() { 168 return AlignRequirement != AlignRequirementKind::None; 169 } 170 }; 171 172 struct TypeInfoChars { 173 CharUnits Width; 174 CharUnits Align; 175 AlignRequirementKind AlignRequirement; 176 177 TypeInfoChars() : AlignRequirement(AlignRequirementKind::None) {} 178 TypeInfoChars(CharUnits Width, CharUnits Align, 179 AlignRequirementKind AlignRequirement) 180 : Width(Width), Align(Align), AlignRequirement(AlignRequirement) {} 181 bool isAlignRequired() { 182 return AlignRequirement != AlignRequirementKind::None; 183 } 184 }; 185 186 /// Holds long-lived AST nodes (such as types and decls) that can be 187 /// referred to throughout the semantic analysis of a file. 188 class ASTContext : public RefCountedBase<ASTContext> { 189 friend class NestedNameSpecifier; 190 191 mutable SmallVector<Type *, 0> Types; 192 mutable llvm::FoldingSet<ExtQuals> ExtQualNodes; 193 mutable llvm::FoldingSet<ComplexType> ComplexTypes; 194 mutable llvm::FoldingSet<PointerType> PointerTypes{GeneralTypesLog2InitSize}; 195 mutable llvm::FoldingSet<AdjustedType> AdjustedTypes; 196 mutable llvm::FoldingSet<BlockPointerType> BlockPointerTypes; 197 mutable llvm::FoldingSet<LValueReferenceType> LValueReferenceTypes; 198 mutable llvm::FoldingSet<RValueReferenceType> RValueReferenceTypes; 199 mutable llvm::FoldingSet<MemberPointerType> MemberPointerTypes; 200 mutable llvm::ContextualFoldingSet<ConstantArrayType, ASTContext &> 201 ConstantArrayTypes; 202 mutable llvm::FoldingSet<IncompleteArrayType> IncompleteArrayTypes; 203 mutable std::vector<VariableArrayType*> VariableArrayTypes; 204 mutable llvm::ContextualFoldingSet<DependentSizedArrayType, ASTContext &> 205 DependentSizedArrayTypes; 206 mutable llvm::ContextualFoldingSet<DependentSizedExtVectorType, ASTContext &> 207 DependentSizedExtVectorTypes; 208 mutable llvm::ContextualFoldingSet<DependentAddressSpaceType, ASTContext &> 209 DependentAddressSpaceTypes; 210 mutable llvm::FoldingSet<VectorType> VectorTypes; 211 mutable llvm::ContextualFoldingSet<DependentVectorType, ASTContext &> 212 DependentVectorTypes; 213 mutable llvm::FoldingSet<ConstantMatrixType> MatrixTypes; 214 mutable llvm::ContextualFoldingSet<DependentSizedMatrixType, ASTContext &> 215 DependentSizedMatrixTypes; 216 mutable llvm::FoldingSet<FunctionNoProtoType> FunctionNoProtoTypes; 217 mutable llvm::ContextualFoldingSet<FunctionProtoType, ASTContext&> 218 FunctionProtoTypes; 219 mutable llvm::ContextualFoldingSet<DependentTypeOfExprType, ASTContext &> 220 DependentTypeOfExprTypes; 221 mutable llvm::ContextualFoldingSet<DependentDecltypeType, ASTContext &> 222 DependentDecltypeTypes; 223 224 mutable llvm::FoldingSet<PackIndexingType> DependentPackIndexingTypes; 225 226 mutable llvm::FoldingSet<TemplateTypeParmType> TemplateTypeParmTypes; 227 mutable llvm::FoldingSet<ObjCTypeParamType> ObjCTypeParamTypes; 228 mutable llvm::FoldingSet<SubstTemplateTypeParmType> 229 SubstTemplateTypeParmTypes; 230 mutable llvm::FoldingSet<SubstTemplateTypeParmPackType> 231 SubstTemplateTypeParmPackTypes; 232 mutable llvm::ContextualFoldingSet<TemplateSpecializationType, ASTContext&> 233 TemplateSpecializationTypes; 234 mutable llvm::FoldingSet<ParenType> ParenTypes{GeneralTypesLog2InitSize}; 235 mutable llvm::FoldingSet<UsingType> UsingTypes; 236 mutable llvm::FoldingSet<TypedefType> TypedefTypes; 237 mutable llvm::FoldingSet<ElaboratedType> ElaboratedTypes{ 238 GeneralTypesLog2InitSize}; 239 mutable llvm::FoldingSet<DependentNameType> DependentNameTypes; 240 mutable llvm::ContextualFoldingSet<DependentTemplateSpecializationType, 241 ASTContext&> 242 DependentTemplateSpecializationTypes; 243 mutable llvm::FoldingSet<PackExpansionType> PackExpansionTypes; 244 mutable llvm::FoldingSet<ObjCObjectTypeImpl> ObjCObjectTypes; 245 mutable llvm::FoldingSet<ObjCObjectPointerType> ObjCObjectPointerTypes; 246 mutable llvm::FoldingSet<DependentUnaryTransformType> 247 DependentUnaryTransformTypes; 248 // An AutoType can have a dependency on another AutoType via its template 249 // arguments. Since both dependent and dependency are on the same set, 250 // we can end up in an infinite recursion when looking for a node if we used 251 // a `FoldingSet`, since both could end up in the same bucket. 252 mutable llvm::DenseMap<llvm::FoldingSetNodeID, AutoType *> AutoTypes; 253 mutable llvm::FoldingSet<DeducedTemplateSpecializationType> 254 DeducedTemplateSpecializationTypes; 255 mutable llvm::FoldingSet<AtomicType> AtomicTypes; 256 mutable llvm::FoldingSet<AttributedType> AttributedTypes; 257 mutable llvm::FoldingSet<PipeType> PipeTypes; 258 mutable llvm::FoldingSet<BitIntType> BitIntTypes; 259 mutable llvm::ContextualFoldingSet<DependentBitIntType, ASTContext &> 260 DependentBitIntTypes; 261 mutable llvm::FoldingSet<BTFTagAttributedType> BTFTagAttributedTypes; 262 llvm::FoldingSet<HLSLAttributedResourceType> HLSLAttributedResourceTypes; 263 264 mutable llvm::FoldingSet<CountAttributedType> CountAttributedTypes; 265 266 mutable llvm::FoldingSet<QualifiedTemplateName> QualifiedTemplateNames; 267 mutable llvm::FoldingSet<DependentTemplateName> DependentTemplateNames; 268 mutable llvm::FoldingSet<SubstTemplateTemplateParmStorage> 269 SubstTemplateTemplateParms; 270 mutable llvm::ContextualFoldingSet<SubstTemplateTemplateParmPackStorage, 271 ASTContext&> 272 SubstTemplateTemplateParmPacks; 273 mutable llvm::ContextualFoldingSet<DeducedTemplateStorage, ASTContext &> 274 DeducedTemplates; 275 276 mutable llvm::ContextualFoldingSet<ArrayParameterType, ASTContext &> 277 ArrayParameterTypes; 278 279 /// The set of nested name specifiers. 280 /// 281 /// This set is managed by the NestedNameSpecifier class. 282 mutable llvm::FoldingSet<NestedNameSpecifier> NestedNameSpecifiers; 283 mutable NestedNameSpecifier *GlobalNestedNameSpecifier = nullptr; 284 285 /// A cache mapping from RecordDecls to ASTRecordLayouts. 286 /// 287 /// This is lazily created. This is intentionally not serialized. 288 mutable llvm::DenseMap<const RecordDecl*, const ASTRecordLayout*> 289 ASTRecordLayouts; 290 mutable llvm::DenseMap<const ObjCContainerDecl*, const ASTRecordLayout*> 291 ObjCLayouts; 292 293 /// A cache from types to size and alignment information. 294 using TypeInfoMap = llvm::DenseMap<const Type *, struct TypeInfo>; 295 mutable TypeInfoMap MemoizedTypeInfo; 296 297 /// A cache from types to unadjusted alignment information. Only ARM and 298 /// AArch64 targets need this information, keeping it separate prevents 299 /// imposing overhead on TypeInfo size. 300 using UnadjustedAlignMap = llvm::DenseMap<const Type *, unsigned>; 301 mutable UnadjustedAlignMap MemoizedUnadjustedAlign; 302 303 /// A cache mapping from CXXRecordDecls to key functions. 304 llvm::DenseMap<const CXXRecordDecl*, LazyDeclPtr> KeyFunctions; 305 306 /// Mapping from ObjCContainers to their ObjCImplementations. 307 llvm::DenseMap<ObjCContainerDecl*, ObjCImplDecl*> ObjCImpls; 308 309 /// Mapping from ObjCMethod to its duplicate declaration in the same 310 /// interface. 311 llvm::DenseMap<const ObjCMethodDecl*,const ObjCMethodDecl*> ObjCMethodRedecls; 312 313 /// Mapping from __block VarDecls to BlockVarCopyInit. 314 llvm::DenseMap<const VarDecl *, BlockVarCopyInit> BlockVarCopyInits; 315 316 /// Mapping from GUIDs to the corresponding MSGuidDecl. 317 mutable llvm::FoldingSet<MSGuidDecl> MSGuidDecls; 318 319 /// Mapping from APValues to the corresponding UnnamedGlobalConstantDecl. 320 mutable llvm::FoldingSet<UnnamedGlobalConstantDecl> 321 UnnamedGlobalConstantDecls; 322 323 /// Mapping from APValues to the corresponding TemplateParamObjects. 324 mutable llvm::FoldingSet<TemplateParamObjectDecl> TemplateParamObjectDecls; 325 326 /// A cache mapping a string value to a StringLiteral object with the same 327 /// value. 328 /// 329 /// This is lazily created. This is intentionally not serialized. 330 mutable llvm::StringMap<StringLiteral *> StringLiteralCache; 331 332 /// The next string literal "version" to allocate during constant evaluation. 333 /// This is used to distinguish between repeated evaluations of the same 334 /// string literal. 335 /// 336 /// We don't need to serialize this because constants get re-evaluated in the 337 /// current file before they are compared locally. 338 unsigned NextStringLiteralVersion = 0; 339 340 /// MD5 hash of CUID. It is calculated when first used and cached by this 341 /// data member. 342 mutable std::string CUIDHash; 343 344 /// Representation of a "canonical" template template parameter that 345 /// is used in canonical template names. 346 class CanonicalTemplateTemplateParm : public llvm::FoldingSetNode { 347 TemplateTemplateParmDecl *Parm; 348 349 public: 350 CanonicalTemplateTemplateParm(TemplateTemplateParmDecl *Parm) 351 : Parm(Parm) {} 352 353 TemplateTemplateParmDecl *getParam() const { return Parm; } 354 355 void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &C) { 356 Profile(ID, C, Parm); 357 } 358 359 static void Profile(llvm::FoldingSetNodeID &ID, 360 const ASTContext &C, 361 TemplateTemplateParmDecl *Parm); 362 }; 363 mutable llvm::ContextualFoldingSet<CanonicalTemplateTemplateParm, 364 const ASTContext&> 365 CanonTemplateTemplateParms; 366 367 TemplateTemplateParmDecl * 368 getCanonicalTemplateTemplateParmDecl(TemplateTemplateParmDecl *TTP) const; 369 370 /// The typedef for the __int128_t type. 371 mutable TypedefDecl *Int128Decl = nullptr; 372 373 /// The typedef for the __uint128_t type. 374 mutable TypedefDecl *UInt128Decl = nullptr; 375 376 /// The typedef for the target specific predefined 377 /// __builtin_va_list type. 378 mutable TypedefDecl *BuiltinVaListDecl = nullptr; 379 380 /// The typedef for the predefined \c __builtin_ms_va_list type. 381 mutable TypedefDecl *BuiltinMSVaListDecl = nullptr; 382 383 /// The typedef for the predefined \c id type. 384 mutable TypedefDecl *ObjCIdDecl = nullptr; 385 386 /// The typedef for the predefined \c SEL type. 387 mutable TypedefDecl *ObjCSelDecl = nullptr; 388 389 /// The typedef for the predefined \c Class type. 390 mutable TypedefDecl *ObjCClassDecl = nullptr; 391 392 /// The typedef for the predefined \c Protocol class in Objective-C. 393 mutable ObjCInterfaceDecl *ObjCProtocolClassDecl = nullptr; 394 395 /// The typedef for the predefined 'BOOL' type. 396 mutable TypedefDecl *BOOLDecl = nullptr; 397 398 // Typedefs which may be provided defining the structure of Objective-C 399 // pseudo-builtins 400 QualType ObjCIdRedefinitionType; 401 QualType ObjCClassRedefinitionType; 402 QualType ObjCSelRedefinitionType; 403 404 /// The identifier 'bool'. 405 mutable IdentifierInfo *BoolName = nullptr; 406 407 /// The identifier 'NSObject'. 408 mutable IdentifierInfo *NSObjectName = nullptr; 409 410 /// The identifier 'NSCopying'. 411 IdentifierInfo *NSCopyingName = nullptr; 412 413 /// The identifier '__make_integer_seq'. 414 mutable IdentifierInfo *MakeIntegerSeqName = nullptr; 415 416 /// The identifier '__type_pack_element'. 417 mutable IdentifierInfo *TypePackElementName = nullptr; 418 419 /// The identifier '__builtin_common_type'. 420 mutable IdentifierInfo *BuiltinCommonTypeName = nullptr; 421 422 QualType ObjCConstantStringType; 423 mutable RecordDecl *CFConstantStringTagDecl = nullptr; 424 mutable TypedefDecl *CFConstantStringTypeDecl = nullptr; 425 426 mutable QualType ObjCSuperType; 427 428 QualType ObjCNSStringType; 429 430 /// The typedef declaration for the Objective-C "instancetype" type. 431 TypedefDecl *ObjCInstanceTypeDecl = nullptr; 432 433 /// The type for the C FILE type. 434 TypeDecl *FILEDecl = nullptr; 435 436 /// The type for the C jmp_buf type. 437 TypeDecl *jmp_bufDecl = nullptr; 438 439 /// The type for the C sigjmp_buf type. 440 TypeDecl *sigjmp_bufDecl = nullptr; 441 442 /// The type for the C ucontext_t type. 443 TypeDecl *ucontext_tDecl = nullptr; 444 445 /// Type for the Block descriptor for Blocks CodeGen. 446 /// 447 /// Since this is only used for generation of debug info, it is not 448 /// serialized. 449 mutable RecordDecl *BlockDescriptorType = nullptr; 450 451 /// Type for the Block descriptor for Blocks CodeGen. 452 /// 453 /// Since this is only used for generation of debug info, it is not 454 /// serialized. 455 mutable RecordDecl *BlockDescriptorExtendedType = nullptr; 456 457 /// Declaration for the CUDA cudaConfigureCall function. 458 FunctionDecl *cudaConfigureCallDecl = nullptr; 459 460 /// Keeps track of all declaration attributes. 461 /// 462 /// Since so few decls have attrs, we keep them in a hash map instead of 463 /// wasting space in the Decl class. 464 llvm::DenseMap<const Decl*, AttrVec*> DeclAttrs; 465 466 /// A mapping from non-redeclarable declarations in modules that were 467 /// merged with other declarations to the canonical declaration that they were 468 /// merged into. 469 llvm::DenseMap<Decl*, Decl*> MergedDecls; 470 471 /// A mapping from a defining declaration to a list of modules (other 472 /// than the owning module of the declaration) that contain merged 473 /// definitions of that entity. 474 llvm::DenseMap<NamedDecl*, llvm::TinyPtrVector<Module*>> MergedDefModules; 475 476 /// Initializers for a module, in order. Each Decl will be either 477 /// something that has a semantic effect on startup (such as a variable with 478 /// a non-constant initializer), or an ImportDecl (which recursively triggers 479 /// initialization of another module). 480 struct PerModuleInitializers { 481 llvm::SmallVector<Decl*, 4> Initializers; 482 llvm::SmallVector<GlobalDeclID, 4> LazyInitializers; 483 484 void resolve(ASTContext &Ctx); 485 }; 486 llvm::DenseMap<Module*, PerModuleInitializers*> ModuleInitializers; 487 488 /// This is the top-level (C++20) Named module we are building. 489 Module *CurrentCXXNamedModule = nullptr; 490 491 /// Help structures to decide whether two `const Module *` belongs 492 /// to the same conceptual module to avoid the expensive to string comparison 493 /// if possible. 494 /// 495 /// Not serialized intentionally. 496 llvm::StringMap<const Module *> PrimaryModuleNameMap; 497 llvm::DenseMap<const Module *, const Module *> SameModuleLookupSet; 498 499 static constexpr unsigned ConstantArrayTypesLog2InitSize = 8; 500 static constexpr unsigned GeneralTypesLog2InitSize = 9; 501 static constexpr unsigned FunctionProtoTypesLog2InitSize = 12; 502 503 ASTContext &this_() { return *this; } 504 505 public: 506 /// A type synonym for the TemplateOrInstantiation mapping. 507 using TemplateOrSpecializationInfo = 508 llvm::PointerUnion<VarTemplateDecl *, MemberSpecializationInfo *>; 509 510 private: 511 friend class ASTDeclReader; 512 friend class ASTReader; 513 friend class ASTWriter; 514 template <class> friend class serialization::AbstractTypeReader; 515 friend class CXXRecordDecl; 516 friend class IncrementalParser; 517 518 /// A mapping to contain the template or declaration that 519 /// a variable declaration describes or was instantiated from, 520 /// respectively. 521 /// 522 /// For non-templates, this value will be NULL. For variable 523 /// declarations that describe a variable template, this will be a 524 /// pointer to a VarTemplateDecl. For static data members 525 /// of class template specializations, this will be the 526 /// MemberSpecializationInfo referring to the member variable that was 527 /// instantiated or specialized. Thus, the mapping will keep track of 528 /// the static data member templates from which static data members of 529 /// class template specializations were instantiated. 530 /// 531 /// Given the following example: 532 /// 533 /// \code 534 /// template<typename T> 535 /// struct X { 536 /// static T value; 537 /// }; 538 /// 539 /// template<typename T> 540 /// T X<T>::value = T(17); 541 /// 542 /// int *x = &X<int>::value; 543 /// \endcode 544 /// 545 /// This mapping will contain an entry that maps from the VarDecl for 546 /// X<int>::value to the corresponding VarDecl for X<T>::value (within the 547 /// class template X) and will be marked TSK_ImplicitInstantiation. 548 llvm::DenseMap<const VarDecl *, TemplateOrSpecializationInfo> 549 TemplateOrInstantiation; 550 551 /// Keeps track of the declaration from which a using declaration was 552 /// created during instantiation. 553 /// 554 /// The source and target declarations are always a UsingDecl, an 555 /// UnresolvedUsingValueDecl, or an UnresolvedUsingTypenameDecl. 556 /// 557 /// For example: 558 /// \code 559 /// template<typename T> 560 /// struct A { 561 /// void f(); 562 /// }; 563 /// 564 /// template<typename T> 565 /// struct B : A<T> { 566 /// using A<T>::f; 567 /// }; 568 /// 569 /// template struct B<int>; 570 /// \endcode 571 /// 572 /// This mapping will contain an entry that maps from the UsingDecl in 573 /// B<int> to the UnresolvedUsingDecl in B<T>. 574 llvm::DenseMap<NamedDecl *, NamedDecl *> InstantiatedFromUsingDecl; 575 576 /// Like InstantiatedFromUsingDecl, but for using-enum-declarations. Maps 577 /// from the instantiated using-enum to the templated decl from whence it 578 /// came. 579 /// Note that using-enum-declarations cannot be dependent and 580 /// thus will never be instantiated from an "unresolved" 581 /// version thereof (as with using-declarations), so each mapping is from 582 /// a (resolved) UsingEnumDecl to a (resolved) UsingEnumDecl. 583 llvm::DenseMap<UsingEnumDecl *, UsingEnumDecl *> 584 InstantiatedFromUsingEnumDecl; 585 586 /// Simlarly maps instantiated UsingShadowDecls to their origin. 587 llvm::DenseMap<UsingShadowDecl*, UsingShadowDecl*> 588 InstantiatedFromUsingShadowDecl; 589 590 llvm::DenseMap<FieldDecl *, FieldDecl *> InstantiatedFromUnnamedFieldDecl; 591 592 /// Mapping that stores the methods overridden by a given C++ 593 /// member function. 594 /// 595 /// Since most C++ member functions aren't virtual and therefore 596 /// don't override anything, we store the overridden functions in 597 /// this map on the side rather than within the CXXMethodDecl structure. 598 using CXXMethodVector = llvm::TinyPtrVector<const CXXMethodDecl *>; 599 llvm::DenseMap<const CXXMethodDecl *, CXXMethodVector> OverriddenMethods; 600 601 /// Mapping from each declaration context to its corresponding 602 /// mangling numbering context (used for constructs like lambdas which 603 /// need to be consistently numbered for the mangler). 604 llvm::DenseMap<const DeclContext *, std::unique_ptr<MangleNumberingContext>> 605 MangleNumberingContexts; 606 llvm::DenseMap<const Decl *, std::unique_ptr<MangleNumberingContext>> 607 ExtraMangleNumberingContexts; 608 609 /// Side-table of mangling numbers for declarations which rarely 610 /// need them (like static local vars). 611 llvm::MapVector<const NamedDecl *, unsigned> MangleNumbers; 612 llvm::MapVector<const VarDecl *, unsigned> StaticLocalNumbers; 613 /// Mapping the associated device lambda mangling number if present. 614 mutable llvm::DenseMap<const CXXRecordDecl *, unsigned> 615 DeviceLambdaManglingNumbers; 616 617 /// Mapping that stores parameterIndex values for ParmVarDecls when 618 /// that value exceeds the bitfield size of ParmVarDeclBits.ParameterIndex. 619 using ParameterIndexTable = llvm::DenseMap<const VarDecl *, unsigned>; 620 ParameterIndexTable ParamIndices; 621 622 ImportDecl *FirstLocalImport = nullptr; 623 ImportDecl *LastLocalImport = nullptr; 624 625 TranslationUnitDecl *TUDecl = nullptr; 626 mutable ExternCContextDecl *ExternCContext = nullptr; 627 mutable BuiltinTemplateDecl *MakeIntegerSeqDecl = nullptr; 628 mutable BuiltinTemplateDecl *TypePackElementDecl = nullptr; 629 mutable BuiltinTemplateDecl *BuiltinCommonTypeDecl = nullptr; 630 631 /// The associated SourceManager object. 632 SourceManager &SourceMgr; 633 634 /// The language options used to create the AST associated with 635 /// this ASTContext object. 636 LangOptions &LangOpts; 637 638 /// NoSanitizeList object that is used by sanitizers to decide which 639 /// entities should not be instrumented. 640 std::unique_ptr<NoSanitizeList> NoSanitizeL; 641 642 /// Function filtering mechanism to determine whether a given function 643 /// should be imbued with the XRay "always" or "never" attributes. 644 std::unique_ptr<XRayFunctionFilter> XRayFilter; 645 646 /// ProfileList object that is used by the profile instrumentation 647 /// to decide which entities should be instrumented. 648 std::unique_ptr<ProfileList> ProfList; 649 650 /// The allocator used to create AST objects. 651 /// 652 /// AST objects are never destructed; rather, all memory associated with the 653 /// AST objects will be released when the ASTContext itself is destroyed. 654 mutable llvm::BumpPtrAllocator BumpAlloc; 655 656 /// Allocator for partial diagnostics. 657 PartialDiagnostic::DiagStorageAllocator DiagAllocator; 658 659 /// The current C++ ABI. 660 std::unique_ptr<CXXABI> ABI; 661 CXXABI *createCXXABI(const TargetInfo &T); 662 663 /// Address space map mangling must be used with language specific 664 /// address spaces (e.g. OpenCL/CUDA) 665 bool AddrSpaceMapMangling; 666 667 /// For performance, track whether any function effects are in use. 668 mutable bool AnyFunctionEffects = false; 669 670 const TargetInfo *Target = nullptr; 671 const TargetInfo *AuxTarget = nullptr; 672 clang::PrintingPolicy PrintingPolicy; 673 std::unique_ptr<interp::Context> InterpContext; 674 std::unique_ptr<ParentMapContext> ParentMapCtx; 675 676 /// Keeps track of the deallocated DeclListNodes for future reuse. 677 DeclListNode *ListNodeFreeList = nullptr; 678 679 public: 680 IdentifierTable &Idents; 681 SelectorTable &Selectors; 682 Builtin::Context &BuiltinInfo; 683 const TranslationUnitKind TUKind; 684 mutable DeclarationNameTable DeclarationNames; 685 IntrusiveRefCntPtr<ExternalASTSource> ExternalSource; 686 ASTMutationListener *Listener = nullptr; 687 688 /// Returns the clang bytecode interpreter context. 689 interp::Context &getInterpContext(); 690 691 struct CUDAConstantEvalContext { 692 /// Do not allow wrong-sided variables in constant expressions. 693 bool NoWrongSidedVars = false; 694 } CUDAConstantEvalCtx; 695 struct CUDAConstantEvalContextRAII { 696 ASTContext &Ctx; 697 CUDAConstantEvalContext SavedCtx; 698 CUDAConstantEvalContextRAII(ASTContext &Ctx_, bool NoWrongSidedVars) 699 : Ctx(Ctx_), SavedCtx(Ctx_.CUDAConstantEvalCtx) { 700 Ctx_.CUDAConstantEvalCtx.NoWrongSidedVars = NoWrongSidedVars; 701 } 702 ~CUDAConstantEvalContextRAII() { Ctx.CUDAConstantEvalCtx = SavedCtx; } 703 }; 704 705 /// Returns the dynamic AST node parent map context. 706 ParentMapContext &getParentMapContext(); 707 708 // A traversal scope limits the parts of the AST visible to certain analyses. 709 // RecursiveASTVisitor only visits specified children of TranslationUnitDecl. 710 // getParents() will only observe reachable parent edges. 711 // 712 // The scope is defined by a set of "top-level" declarations which will be 713 // visible under the TranslationUnitDecl. 714 // Initially, it is the entire TU, represented by {getTranslationUnitDecl()}. 715 // 716 // After setTraversalScope({foo, bar}), the exposed AST looks like: 717 // TranslationUnitDecl 718 // - foo 719 // - ... 720 // - bar 721 // - ... 722 // All other siblings of foo and bar are pruned from the tree. 723 // (However they are still accessible via TranslationUnitDecl->decls()) 724 // 725 // Changing the scope clears the parent cache, which is expensive to rebuild. 726 std::vector<Decl *> getTraversalScope() const { return TraversalScope; } 727 void setTraversalScope(const std::vector<Decl *> &); 728 729 /// Forwards to get node parents from the ParentMapContext. New callers should 730 /// use ParentMapContext::getParents() directly. 731 template <typename NodeT> DynTypedNodeList getParents(const NodeT &Node); 732 733 const clang::PrintingPolicy &getPrintingPolicy() const { 734 return PrintingPolicy; 735 } 736 737 void setPrintingPolicy(const clang::PrintingPolicy &Policy) { 738 PrintingPolicy = Policy; 739 } 740 741 SourceManager& getSourceManager() { return SourceMgr; } 742 const SourceManager& getSourceManager() const { return SourceMgr; } 743 744 // Cleans up some of the data structures. This allows us to do cleanup 745 // normally done in the destructor earlier. Renders much of the ASTContext 746 // unusable, mostly the actual AST nodes, so should be called when we no 747 // longer need access to the AST. 748 void cleanup(); 749 750 llvm::BumpPtrAllocator &getAllocator() const { 751 return BumpAlloc; 752 } 753 754 void *Allocate(size_t Size, unsigned Align = 8) const { 755 return BumpAlloc.Allocate(Size, Align); 756 } 757 template <typename T> T *Allocate(size_t Num = 1) const { 758 return static_cast<T *>(Allocate(Num * sizeof(T), alignof(T))); 759 } 760 void Deallocate(void *Ptr) const {} 761 762 llvm::StringRef backupStr(llvm::StringRef S) const { 763 char *Buf = new (*this) char[S.size()]; 764 std::copy(S.begin(), S.end(), Buf); 765 return llvm::StringRef(Buf, S.size()); 766 } 767 768 /// Allocates a \c DeclListNode or returns one from the \c ListNodeFreeList 769 /// pool. 770 DeclListNode *AllocateDeclListNode(clang::NamedDecl *ND) { 771 if (DeclListNode *Alloc = ListNodeFreeList) { 772 ListNodeFreeList = dyn_cast_if_present<DeclListNode *>(Alloc->Rest); 773 Alloc->D = ND; 774 Alloc->Rest = nullptr; 775 return Alloc; 776 } 777 return new (*this) DeclListNode(ND); 778 } 779 /// Deallcates a \c DeclListNode by returning it to the \c ListNodeFreeList 780 /// pool. 781 void DeallocateDeclListNode(DeclListNode *N) { 782 N->Rest = ListNodeFreeList; 783 ListNodeFreeList = N; 784 } 785 786 /// Return the total amount of physical memory allocated for representing 787 /// AST nodes and type information. 788 size_t getASTAllocatedMemory() const { 789 return BumpAlloc.getTotalMemory(); 790 } 791 792 /// Return the total memory used for various side tables. 793 size_t getSideTableAllocatedMemory() const; 794 795 PartialDiagnostic::DiagStorageAllocator &getDiagAllocator() { 796 return DiagAllocator; 797 } 798 799 const TargetInfo &getTargetInfo() const { return *Target; } 800 const TargetInfo *getAuxTargetInfo() const { return AuxTarget; } 801 802 const QualType GetHigherPrecisionFPType(QualType ElementType) const { 803 const auto *CurrentBT = cast<BuiltinType>(ElementType); 804 switch (CurrentBT->getKind()) { 805 case BuiltinType::Kind::Half: 806 case BuiltinType::Kind::Float16: 807 return FloatTy; 808 case BuiltinType::Kind::Float: 809 case BuiltinType::Kind::BFloat16: 810 return DoubleTy; 811 case BuiltinType::Kind::Double: 812 return LongDoubleTy; 813 default: 814 return ElementType; 815 } 816 return ElementType; 817 } 818 819 /// getIntTypeForBitwidth - 820 /// sets integer QualTy according to specified details: 821 /// bitwidth, signed/unsigned. 822 /// Returns empty type if there is no appropriate target types. 823 QualType getIntTypeForBitwidth(unsigned DestWidth, 824 unsigned Signed) const; 825 826 /// getRealTypeForBitwidth - 827 /// sets floating point QualTy according to specified bitwidth. 828 /// Returns empty type if there is no appropriate target types. 829 QualType getRealTypeForBitwidth(unsigned DestWidth, 830 FloatModeKind ExplicitType) const; 831 832 bool AtomicUsesUnsupportedLibcall(const AtomicExpr *E) const; 833 834 const LangOptions& getLangOpts() const { return LangOpts; } 835 836 // If this condition is false, typo correction must be performed eagerly 837 // rather than delayed in many places, as it makes use of dependent types. 838 // the condition is false for clang's C-only codepath, as it doesn't support 839 // dependent types yet. 840 bool isDependenceAllowed() const { 841 return LangOpts.CPlusPlus || LangOpts.RecoveryAST; 842 } 843 844 const NoSanitizeList &getNoSanitizeList() const { return *NoSanitizeL; } 845 846 bool isTypeIgnoredBySanitizer(const SanitizerMask &Mask, 847 const QualType &Ty) const; 848 849 const XRayFunctionFilter &getXRayFilter() const { 850 return *XRayFilter; 851 } 852 853 const ProfileList &getProfileList() const { return *ProfList; } 854 855 DiagnosticsEngine &getDiagnostics() const; 856 857 FullSourceLoc getFullLoc(SourceLocation Loc) const { 858 return FullSourceLoc(Loc,SourceMgr); 859 } 860 861 /// Return the C++ ABI kind that should be used. The C++ ABI can be overriden 862 /// at compile time with `-fc++-abi=`. If this is not provided, we instead use 863 /// the default ABI set by the target. 864 TargetCXXABI::Kind getCXXABIKind() const; 865 866 /// All comments in this translation unit. 867 RawCommentList Comments; 868 869 /// True if comments are already loaded from ExternalASTSource. 870 mutable bool CommentsLoaded = false; 871 872 /// Mapping from declaration to directly attached comment. 873 /// 874 /// Raw comments are owned by Comments list. This mapping is populated 875 /// lazily. 876 mutable llvm::DenseMap<const Decl *, const RawComment *> DeclRawComments; 877 878 /// Mapping from canonical declaration to the first redeclaration in chain 879 /// that has a comment attached. 880 /// 881 /// Raw comments are owned by Comments list. This mapping is populated 882 /// lazily. 883 mutable llvm::DenseMap<const Decl *, const Decl *> RedeclChainComments; 884 885 /// Keeps track of redeclaration chains that don't have any comment attached. 886 /// Mapping from canonical declaration to redeclaration chain that has no 887 /// comments attached to any redeclaration. Specifically it's mapping to 888 /// the last redeclaration we've checked. 889 /// 890 /// Shall not contain declarations that have comments attached to any 891 /// redeclaration in their chain. 892 mutable llvm::DenseMap<const Decl *, const Decl *> CommentlessRedeclChains; 893 894 /// Mapping from declarations to parsed comments attached to any 895 /// redeclaration. 896 mutable llvm::DenseMap<const Decl *, comments::FullComment *> ParsedComments; 897 898 /// Attaches \p Comment to \p OriginalD and to its redeclaration chain 899 /// and removes the redeclaration chain from the set of commentless chains. 900 /// 901 /// Don't do anything if a comment has already been attached to \p OriginalD 902 /// or its redeclaration chain. 903 void cacheRawCommentForDecl(const Decl &OriginalD, 904 const RawComment &Comment) const; 905 906 /// \returns searches \p CommentsInFile for doc comment for \p D. 907 /// 908 /// \p RepresentativeLocForDecl is used as a location for searching doc 909 /// comments. \p CommentsInFile is a mapping offset -> comment of files in the 910 /// same file where \p RepresentativeLocForDecl is. 911 RawComment *getRawCommentForDeclNoCacheImpl( 912 const Decl *D, const SourceLocation RepresentativeLocForDecl, 913 const std::map<unsigned, RawComment *> &CommentsInFile) const; 914 915 /// Return the documentation comment attached to a given declaration, 916 /// without looking into cache. 917 RawComment *getRawCommentForDeclNoCache(const Decl *D) const; 918 919 public: 920 void addComment(const RawComment &RC); 921 922 /// Return the documentation comment attached to a given declaration. 923 /// Returns nullptr if no comment is attached. 924 /// 925 /// \param OriginalDecl if not nullptr, is set to declaration AST node that 926 /// had the comment, if the comment we found comes from a redeclaration. 927 const RawComment * 928 getRawCommentForAnyRedecl(const Decl *D, 929 const Decl **OriginalDecl = nullptr) const; 930 931 /// Searches existing comments for doc comments that should be attached to \p 932 /// Decls. If any doc comment is found, it is parsed. 933 /// 934 /// Requirement: All \p Decls are in the same file. 935 /// 936 /// If the last comment in the file is already attached we assume 937 /// there are not comments left to be attached to \p Decls. 938 void attachCommentsToJustParsedDecls(ArrayRef<Decl *> Decls, 939 const Preprocessor *PP); 940 941 /// Return parsed documentation comment attached to a given declaration. 942 /// Returns nullptr if no comment is attached. 943 /// 944 /// \param PP the Preprocessor used with this TU. Could be nullptr if 945 /// preprocessor is not available. 946 comments::FullComment *getCommentForDecl(const Decl *D, 947 const Preprocessor *PP) const; 948 949 /// Return parsed documentation comment attached to a given declaration. 950 /// Returns nullptr if no comment is attached. Does not look at any 951 /// redeclarations of the declaration. 952 comments::FullComment *getLocalCommentForDeclUncached(const Decl *D) const; 953 954 comments::FullComment *cloneFullComment(comments::FullComment *FC, 955 const Decl *D) const; 956 957 private: 958 mutable comments::CommandTraits CommentCommandTraits; 959 960 /// Iterator that visits import declarations. 961 class import_iterator { 962 ImportDecl *Import = nullptr; 963 964 public: 965 using value_type = ImportDecl *; 966 using reference = ImportDecl *; 967 using pointer = ImportDecl *; 968 using difference_type = int; 969 using iterator_category = std::forward_iterator_tag; 970 971 import_iterator() = default; 972 explicit import_iterator(ImportDecl *Import) : Import(Import) {} 973 974 reference operator*() const { return Import; } 975 pointer operator->() const { return Import; } 976 977 import_iterator &operator++() { 978 Import = ASTContext::getNextLocalImport(Import); 979 return *this; 980 } 981 982 import_iterator operator++(int) { 983 import_iterator Other(*this); 984 ++(*this); 985 return Other; 986 } 987 988 friend bool operator==(import_iterator X, import_iterator Y) { 989 return X.Import == Y.Import; 990 } 991 992 friend bool operator!=(import_iterator X, import_iterator Y) { 993 return X.Import != Y.Import; 994 } 995 }; 996 997 public: 998 comments::CommandTraits &getCommentCommandTraits() const { 999 return CommentCommandTraits; 1000 } 1001 1002 /// Retrieve the attributes for the given declaration. 1003 AttrVec& getDeclAttrs(const Decl *D); 1004 1005 /// Erase the attributes corresponding to the given declaration. 1006 void eraseDeclAttrs(const Decl *D); 1007 1008 /// If this variable is an instantiated static data member of a 1009 /// class template specialization, returns the templated static data member 1010 /// from which it was instantiated. 1011 // FIXME: Remove ? 1012 MemberSpecializationInfo *getInstantiatedFromStaticDataMember( 1013 const VarDecl *Var); 1014 1015 /// Note that the static data member \p Inst is an instantiation of 1016 /// the static data member template \p Tmpl of a class template. 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 /// If the given using decl \p Inst is an instantiation of 1028 /// another (possibly unresolved) using decl, return it. 1029 NamedDecl *getInstantiatedFromUsingDecl(NamedDecl *Inst); 1030 1031 /// Remember that the using decl \p Inst is an instantiation 1032 /// of the using decl \p Pattern of a class template. 1033 void setInstantiatedFromUsingDecl(NamedDecl *Inst, NamedDecl *Pattern); 1034 1035 /// If the given using-enum decl \p Inst is an instantiation of 1036 /// another using-enum decl, return it. 1037 UsingEnumDecl *getInstantiatedFromUsingEnumDecl(UsingEnumDecl *Inst); 1038 1039 /// Remember that the using enum decl \p Inst is an instantiation 1040 /// of the using enum decl \p Pattern of a class template. 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 // Access to the set of methods overridden by the given C++ method. 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 /// Note that the given C++ \p Method overrides the given \p 1068 /// Overridden method. 1069 void addOverriddenMethod(const CXXMethodDecl *Method, 1070 const CXXMethodDecl *Overridden); 1071 1072 /// Return C++ or ObjC overridden methods for the given \p Method. 1073 /// 1074 /// An ObjC method is considered to override any method in the class's 1075 /// base classes, its protocols, or its categories' protocols, that has 1076 /// the same selector and is of the same kind (class or instance). 1077 /// A method in an implementation is not considered as overriding the same 1078 /// method in the interface or its categories. 1079 void getOverriddenMethods( 1080 const NamedDecl *Method, 1081 SmallVectorImpl<const NamedDecl *> &Overridden) const; 1082 1083 /// Notify the AST context that a new import declaration has been 1084 /// parsed or implicitly created within this translation unit. 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 /// Note that the definition \p ND has been merged into module \p M, 1106 /// and should be visible whenever \p M is visible. 1107 void mergeDefinitionIntoModule(NamedDecl *ND, Module *M, 1108 bool NotifyListeners = true); 1109 1110 /// Clean up the merged definition list. Call this if you might have 1111 /// added duplicates into the list. 1112 void deduplicateMergedDefinitonsFor(NamedDecl *ND); 1113 1114 /// Get the additional modules in which the definition \p Def has 1115 /// been merged. 1116 ArrayRef<Module*> getModulesWithMergedDefinition(const NamedDecl *Def); 1117 1118 /// Add a declaration to the list of declarations that are initialized 1119 /// for a module. This will typically be a global variable (with internal 1120 /// linkage) that runs module initializers, such as the iostream initializer, 1121 /// or an ImportDecl nominating another module that has initializers. 1122 void addModuleInitializer(Module *M, Decl *Init); 1123 1124 void addLazyModuleInitializers(Module *M, ArrayRef<GlobalDeclID> IDs); 1125 1126 /// Get the initializations to perform when importing a module, if any. 1127 ArrayRef<Decl*> getModuleInitializers(Module *M); 1128 1129 /// Set the (C++20) module we are building. 1130 void setCurrentNamedModule(Module *M); 1131 1132 /// Get module under construction, nullptr if this is not a C++20 module. 1133 Module *getCurrentNamedModule() const { return CurrentCXXNamedModule; } 1134 1135 /// If the two module \p M1 and \p M2 are in the same module. 1136 /// 1137 /// FIXME: The signature may be confusing since `clang::Module` means to 1138 /// a module fragment or a module unit but not a C++20 module. 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 // Builtin Types. 1160 CanQualType VoidTy; 1161 CanQualType BoolTy; 1162 CanQualType CharTy; 1163 CanQualType WCharTy; // [C++ 3.9.1p5]. 1164 CanQualType WideCharTy; // Same as WCharTy in C++, integer type in C99. 1165 CanQualType WIntTy; // [C99 7.24.1], integer type unchanged by default promotions. 1166 CanQualType Char8Ty; // [C++20 proposal] 1167 CanQualType Char16Ty; // [C++0x 3.9.1p5], integer type in C99. 1168 CanQualType Char32Ty; // [C++0x 3.9.1p5], integer type in C99. 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; // ISO/IEC JTC1 SC22 WG14 N1169 Extension 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; // [OpenCL 6.1.1.1], ARM NEON 1185 CanQualType BFloat16Ty; 1186 CanQualType Float16Ty; // C11 extension ISO/IEC TS 18661-3 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 // Types for deductions in C++0x [stmt.ranged]'s desugaring. Built on demand. 1223 mutable QualType AutoDeductTy; // Deduction against 'auto'. 1224 mutable QualType AutoRRefDeductTy; // Deduction against 'auto &&'. 1225 1226 // Decl used to help define __builtin_va_list for some targets. 1227 // The decl is built when constructing 'BuiltinVaListDecl'. 1228 mutable Decl *VaListTagDecl = nullptr; 1229 1230 // Implicitly-declared type 'struct _GUID'. 1231 mutable TagDecl *MSGuidTagDecl = nullptr; 1232 1233 /// Keep track of CUDA/HIP device-side variables ODR-used by host code. 1234 /// This does not include extern shared variables used by device host 1235 /// functions as addresses of shared variables are per warp, therefore 1236 /// cannot be accessed by host code. 1237 llvm::DenseSet<const VarDecl *> CUDADeviceVarODRUsedByHost; 1238 1239 /// Keep track of CUDA/HIP external kernels or device variables ODR-used by 1240 /// host code. SetVector is used to maintain the order. 1241 llvm::SetVector<const ValueDecl *> CUDAExternalDeviceDeclODRUsedByHost; 1242 1243 /// Keep track of CUDA/HIP implicit host device functions used on device side 1244 /// in device compilation. 1245 llvm::DenseSet<const FunctionDecl *> CUDAImplicitHostDeviceFunUsedByDevice; 1246 1247 /// Map of SYCL kernels indexed by the unique type used to name the kernel. 1248 /// Entries are not serialized but are recreated on deserialization of a 1249 /// sycl_kernel_entry_point attributed function declaration. 1250 llvm::DenseMap<CanQualType, SYCLKernelInfo> SYCLKernels; 1251 1252 /// For capturing lambdas with an explicit object parameter whose type is 1253 /// derived from the lambda type, we need to perform derived-to-base 1254 /// conversion so we can access the captures; the cast paths for that 1255 /// are stored here. 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 /// Attach an external AST source to the AST context. 1266 /// 1267 /// The external AST source provides the ability to load parts of 1268 /// the abstract syntax tree as needed from some external storage, 1269 /// e.g., a precompiled header. 1270 void setExternalSource(IntrusiveRefCntPtr<ExternalASTSource> Source); 1271 1272 /// Retrieve a pointer to the external AST source associated 1273 /// with this AST context, if any. 1274 ExternalASTSource *getExternalSource() const { 1275 return ExternalSource.get(); 1276 } 1277 1278 /// Attach an AST mutation listener to the AST context. 1279 /// 1280 /// The AST mutation listener provides the ability to track modifications to 1281 /// the abstract syntax tree entities committed after they were initially 1282 /// created. 1283 void setASTMutationListener(ASTMutationListener *Listener) { 1284 this->Listener = Listener; 1285 } 1286 1287 /// Retrieve a pointer to the AST mutation listener associated 1288 /// with this AST context, if any. 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 /// Create a new implicit TU-level CXXRecordDecl or RecordDecl 1298 /// declaration. 1299 RecordDecl *buildImplicitRecord( 1300 StringRef Name, 1301 RecordDecl::TagKind TK = RecordDecl::TagKind::Struct) const; 1302 1303 /// Create a new implicit TU-level typedef declaration. 1304 TypedefDecl *buildImplicitTypedef(QualType T, StringRef Name) const; 1305 1306 /// Retrieve the declaration for the 128-bit signed integer type. 1307 TypedefDecl *getInt128Decl() const; 1308 1309 /// Retrieve the declaration for the 128-bit unsigned integer type. 1310 TypedefDecl *getUInt128Decl() const; 1311 1312 //===--------------------------------------------------------------------===// 1313 // Type Constructors 1314 //===--------------------------------------------------------------------===// 1315 1316 private: 1317 /// Return a type with extended qualifiers. 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 /// Return the uniqued reference to the type for an address space 1326 /// qualified type with the specified type and address space. 1327 /// 1328 /// The resulting type has a union of the qualifiers from T and the address 1329 /// space. If T already has an address space specifier, it is silently 1330 /// replaced. 1331 QualType getAddrSpaceQualType(QualType T, LangAS AddressSpace) const; 1332 1333 /// Remove any existing address space on the type and returns the type 1334 /// with qualifiers intact (or that's the idea anyway) 1335 /// 1336 /// The return type should be T with all prior qualifiers minus the address 1337 /// space. 1338 QualType removeAddrSpaceQualType(QualType T) const; 1339 1340 /// Return the "other" discriminator used for the pointer auth schema used for 1341 /// vtable pointers in instances of the requested type. 1342 uint16_t 1343 getPointerAuthVTablePointerDiscriminator(const CXXRecordDecl *RD); 1344 1345 /// Return the "other" type-specific discriminator for the given type. 1346 uint16_t getPointerAuthTypeDiscriminator(QualType T); 1347 1348 /// Apply Objective-C protocol qualifiers to the given type. 1349 /// \param allowOnPointerType specifies if we can apply protocol 1350 /// qualifiers on ObjCObjectPointerType. It can be set to true when 1351 /// constructing the canonical type of a Objective-C type parameter. 1352 QualType applyObjCProtocolQualifiers(QualType type, 1353 ArrayRef<ObjCProtocolDecl *> protocols, bool &hasError, 1354 bool allowOnPointerType = false) const; 1355 1356 /// Return the uniqued reference to the type for an Objective-C 1357 /// gc-qualified type. 1358 /// 1359 /// The resulting type has a union of the qualifiers from T and the gc 1360 /// attribute. 1361 QualType getObjCGCQualType(QualType T, Qualifiers::GC gcAttr) const; 1362 1363 /// Remove the existing address space on the type if it is a pointer size 1364 /// address space and return the type with qualifiers intact. 1365 QualType removePtrSizeAddrSpace(QualType T) const; 1366 1367 /// Return the uniqued reference to the type for a \c restrict 1368 /// qualified type. 1369 /// 1370 /// The resulting type has a union of the qualifiers from \p T and 1371 /// \c restrict. 1372 QualType getRestrictType(QualType T) const { 1373 return T.withFastQualifiers(Qualifiers::Restrict); 1374 } 1375 1376 /// Return the uniqued reference to the type for a \c volatile 1377 /// qualified type. 1378 /// 1379 /// The resulting type has a union of the qualifiers from \p T and 1380 /// \c volatile. 1381 QualType getVolatileType(QualType T) const { 1382 return T.withFastQualifiers(Qualifiers::Volatile); 1383 } 1384 1385 /// Return the uniqued reference to the type for a \c const 1386 /// qualified type. 1387 /// 1388 /// The resulting type has a union of the qualifiers from \p T and \c const. 1389 /// 1390 /// It can be reasonably expected that this will always be equivalent to 1391 /// calling T.withConst(). 1392 QualType getConstType(QualType T) const { return T.withConst(); } 1393 1394 /// Rebuild a type, preserving any existing type sugar. For function types, 1395 /// you probably want to just use \c adjustFunctionResultType and friends 1396 /// instead. 1397 QualType adjustType(QualType OldType, 1398 llvm::function_ref<QualType(QualType)> Adjust) const; 1399 1400 /// Change the ExtInfo on a function type. 1401 const FunctionType *adjustFunctionType(const FunctionType *Fn, 1402 FunctionType::ExtInfo EInfo); 1403 1404 /// Change the result type of a function type, preserving sugar such as 1405 /// attributed types. 1406 QualType adjustFunctionResultType(QualType FunctionType, 1407 QualType NewResultType); 1408 1409 /// Adjust the given function result type. 1410 CanQualType getCanonicalFunctionResultType(QualType ResultType) const; 1411 1412 /// Change the result type of a function type once it is deduced. 1413 void adjustDeducedFunctionResultType(FunctionDecl *FD, QualType ResultType); 1414 1415 /// Get a function type and produce the equivalent function type with the 1416 /// specified exception specification. Type sugar that can be present on a 1417 /// declaration of a function with an exception specification is permitted 1418 /// and preserved. Other type sugar (for instance, typedefs) is not. 1419 QualType getFunctionTypeWithExceptionSpec( 1420 QualType Orig, const FunctionProtoType::ExceptionSpecInfo &ESI) const; 1421 1422 /// Determine whether two function types are the same, ignoring 1423 /// exception specifications in cases where they're part of the type. 1424 bool hasSameFunctionTypeIgnoringExceptionSpec(QualType T, QualType U) const; 1425 1426 /// Change the exception specification on a function once it is 1427 /// delay-parsed, instantiated, or computed. 1428 void adjustExceptionSpec(FunctionDecl *FD, 1429 const FunctionProtoType::ExceptionSpecInfo &ESI, 1430 bool AsWritten = false); 1431 1432 /// Get a function type and produce the equivalent function type where 1433 /// pointer size address spaces in the return type and parameter types are 1434 /// replaced with the default address space. 1435 QualType getFunctionTypeWithoutPtrSizes(QualType T); 1436 1437 /// Determine whether two function types are the same, ignoring pointer sizes 1438 /// in the return type and parameter types. 1439 bool hasSameFunctionTypeIgnoringPtrSizes(QualType T, QualType U); 1440 1441 /// Get or construct a function type that is equivalent to the input type 1442 /// except that the parameter ABI annotations are stripped. 1443 QualType getFunctionTypeWithoutParamABIs(QualType T) const; 1444 1445 /// Determine if two function types are the same, ignoring parameter ABI 1446 /// annotations. 1447 bool hasSameFunctionTypeIgnoringParamABI(QualType T, QualType U) const; 1448 1449 /// Return the uniqued reference to the type for a complex 1450 /// number with the specified element type. 1451 QualType getComplexType(QualType T) const; 1452 CanQualType getComplexType(CanQualType T) const { 1453 return CanQualType::CreateUnsafe(getComplexType((QualType) T)); 1454 } 1455 1456 /// Return the uniqued reference to the type for a pointer to 1457 /// the specified type. 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 /// Return the uniqued reference to a type adjusted from the original 1469 /// type to a new type. 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 /// Return the uniqued reference to the decayed version of the given 1477 /// type. Can only be called on array and function types which decay to 1478 /// pointer types. 1479 QualType getDecayedType(QualType T) const; 1480 CanQualType getDecayedType(CanQualType T) const { 1481 return CanQualType::CreateUnsafe(getDecayedType((QualType) T)); 1482 } 1483 /// Return the uniqued reference to a specified decay from the original 1484 /// type to the decayed type. 1485 QualType getDecayedType(QualType Orig, QualType Decayed) const; 1486 1487 /// Return the uniqued reference to a specified array parameter type from the 1488 /// original array type. 1489 QualType getArrayParameterType(QualType Ty) const; 1490 1491 /// Return the uniqued reference to the atomic type for the specified 1492 /// type. 1493 QualType getAtomicType(QualType T) const; 1494 1495 /// Return the uniqued reference to the type for a block of the 1496 /// specified type. 1497 QualType getBlockPointerType(QualType T) const; 1498 1499 /// Gets the struct used to keep track of the descriptor for pointer to 1500 /// blocks. 1501 QualType getBlockDescriptorType() const; 1502 1503 /// Return a read_only pipe type for the specified type. 1504 QualType getReadPipeType(QualType T) const; 1505 1506 /// Return a write_only pipe type for the specified type. 1507 QualType getWritePipeType(QualType T) const; 1508 1509 /// Return a bit-precise integer type with the specified signedness and bit 1510 /// count. 1511 QualType getBitIntType(bool Unsigned, unsigned NumBits) const; 1512 1513 /// Return a dependent bit-precise integer type with the specified signedness 1514 /// and bit count. 1515 QualType getDependentBitIntType(bool Unsigned, Expr *BitsExpr) const; 1516 1517 /// Gets the struct used to keep track of the extended descriptor for 1518 /// pointer to blocks. 1519 QualType getBlockDescriptorExtendedType() const; 1520 1521 /// Map an AST Type to an OpenCLTypeKind enum value. 1522 OpenCLTypeKind getOpenCLTypeKind(const Type *T) const; 1523 1524 /// Get address space for OpenCL type. 1525 LangAS getOpenCLTypeAddrSpace(const Type *T) const; 1526 1527 /// Returns default address space based on OpenCL version and enabled features 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 /// Returns true iff we need copy/dispose helpers for the given type. 1542 bool BlockRequiresCopying(QualType Ty, const VarDecl *D); 1543 1544 /// Returns true, if given type has a known lifetime. HasByrefExtendedLayout 1545 /// is set to false in this case. If HasByrefExtendedLayout returns true, 1546 /// byref variable has extended lifetime. 1547 bool getByrefLifetime(QualType Ty, 1548 Qualifiers::ObjCLifetime &Lifetime, 1549 bool &HasByrefExtendedLayout) const; 1550 1551 /// Return the uniqued reference to the type for an lvalue reference 1552 /// to the specified type. 1553 QualType getLValueReferenceType(QualType T, bool SpelledAsLValue = true) 1554 const; 1555 1556 /// Return the uniqued reference to the type for an rvalue reference 1557 /// to the specified type. 1558 QualType getRValueReferenceType(QualType T) const; 1559 1560 /// Return the uniqued reference to the type for a member pointer to 1561 /// the specified type in the specified class. 1562 /// 1563 /// The class \p Cls is a \c Type because it could be a dependent name. 1564 QualType getMemberPointerType(QualType T, const Type *Cls) const; 1565 1566 /// Return a non-unique reference to the type for a variable array of 1567 /// the specified element type. 1568 QualType getVariableArrayType(QualType EltTy, Expr *NumElts, 1569 ArraySizeModifier ASM, unsigned IndexTypeQuals, 1570 SourceRange Brackets) const; 1571 1572 /// Return a non-unique reference to the type for a dependently-sized 1573 /// array of the specified element type. 1574 /// 1575 /// FIXME: We will need these to be uniqued, or at least comparable, at some 1576 /// point. 1577 QualType getDependentSizedArrayType(QualType EltTy, Expr *NumElts, 1578 ArraySizeModifier ASM, 1579 unsigned IndexTypeQuals, 1580 SourceRange Brackets) const; 1581 1582 /// Return a unique reference to the type for an incomplete array of 1583 /// the specified element type. 1584 QualType getIncompleteArrayType(QualType EltTy, ArraySizeModifier ASM, 1585 unsigned IndexTypeQuals) const; 1586 1587 /// Return the unique reference to the type for a constant array of 1588 /// the specified element type. 1589 QualType getConstantArrayType(QualType EltTy, const llvm::APInt &ArySize, 1590 const Expr *SizeExpr, ArraySizeModifier ASM, 1591 unsigned IndexTypeQuals) const; 1592 1593 /// Return a type for a constant array for a string literal of the 1594 /// specified element type and length. 1595 QualType getStringLiteralArrayType(QualType EltTy, unsigned Length) const; 1596 1597 /// Returns a vla type where known sizes are replaced with [*]. 1598 QualType getVariableArrayDecayedType(QualType Ty) const; 1599 1600 // Convenience struct to return information about a builtin vector type. 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 /// Returns the element type, element count and number of vectors 1611 /// (in case of tuple) for a builtin vector type. 1612 BuiltinVectorTypeInfo 1613 getBuiltinVectorTypeInfo(const BuiltinType *VecTy) const; 1614 1615 /// Return the unique reference to a scalable vector type of the specified 1616 /// element type and scalable number of elements. 1617 /// For RISC-V, number of fields is also provided when it fetching for 1618 /// tuple type. 1619 /// 1620 /// \pre \p EltTy must be a built-in type. 1621 QualType getScalableVectorType(QualType EltTy, unsigned NumElts, 1622 unsigned NumFields = 1) const; 1623 1624 /// Return a WebAssembly externref type. 1625 QualType getWebAssemblyExternrefType() const; 1626 1627 /// Return the unique reference to a vector type of the specified 1628 /// element type and size. 1629 /// 1630 /// \pre \p VectorType must be a built-in type. 1631 QualType getVectorType(QualType VectorType, unsigned NumElts, 1632 VectorKind VecKind) const; 1633 /// Return the unique reference to the type for a dependently sized vector of 1634 /// the specified element type. 1635 QualType getDependentVectorType(QualType VectorType, Expr *SizeExpr, 1636 SourceLocation AttrLoc, 1637 VectorKind VecKind) const; 1638 1639 /// Return the unique reference to an extended vector type 1640 /// of the specified element type and size. 1641 /// 1642 /// \pre \p VectorType must be a built-in type. 1643 QualType getExtVectorType(QualType VectorType, unsigned NumElts) const; 1644 1645 /// \pre Return a non-unique reference to the type for a dependently-sized 1646 /// vector of the specified element type. 1647 /// 1648 /// FIXME: We will need these to be uniqued, or at least comparable, at some 1649 /// point. 1650 QualType getDependentSizedExtVectorType(QualType VectorType, 1651 Expr *SizeExpr, 1652 SourceLocation AttrLoc) const; 1653 1654 /// Return the unique reference to the matrix type of the specified element 1655 /// type and size 1656 /// 1657 /// \pre \p ElementType must be a valid matrix element type (see 1658 /// MatrixType::isValidElementType). 1659 QualType getConstantMatrixType(QualType ElementType, unsigned NumRows, 1660 unsigned NumColumns) const; 1661 1662 /// Return the unique reference to the matrix type of the specified element 1663 /// type and size 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 /// Return a K&R style C function type like 'int()'. 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 /// Return a normal function type with a typed argument list. 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 /// Return a normal function type with a typed argument list. 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 /// Return the unique reference to the type for the specified type 1702 /// declaration. 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 /// Return the unique reference to the type for the specified 1721 /// typedef-name decl. 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 /// Compute BestType and BestPromotionType for an enum based on the highest 1730 /// number of negative and positive bits of its elements. 1731 /// Returns true if enum width is too large. 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 /// Form a pack expansion type with the given pattern. 1813 /// \param NumExpansions The number of expansions for the pack, if known. 1814 /// \param ExpectPackInType If \c false, we should not expect \p Pattern to 1815 /// contain an unexpanded pack. This only makes sense if the pack 1816 /// expansion is used in a context where the arity is inferred from 1817 /// elsewhere, such as if the pattern contains a placeholder type or 1818 /// if this is the canonical type of another pack expansion type. 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 /// Legacy interface: cannot provide type arguments or __kindof. 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 /// QIdProtocolsAdoptObjCObjectProtocols - Checks that protocols in 1844 /// QT's qualified-id protocol list adopt all protocols in IDecl's list 1845 /// of protocols. 1846 bool QIdProtocolsAdoptObjCObjectProtocols(QualType QT, 1847 ObjCInterfaceDecl *IDecl); 1848 1849 /// Return a ObjCObjectPointerType type for the given ObjCObjectType. 1850 QualType getObjCObjectPointerType(QualType OIT) const; 1851 1852 /// C23 feature and GCC extension. 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 /// C++11 decltype. 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 /// Unary type transforms 1867 QualType getUnaryTransformType(QualType BaseType, QualType UnderlyingType, 1868 UnaryTransformType::UTTKind UKind) const; 1869 1870 /// C++11 deduced auto type. 1871 QualType getAutoType(QualType DeducedType, AutoTypeKeyword Keyword, 1872 bool IsDependent, bool IsPack = false, 1873 ConceptDecl *TypeConstraintConcept = nullptr, 1874 ArrayRef<TemplateArgument> TypeConstraintArgs ={}) const; 1875 1876 /// C++11 deduction pattern for 'auto' type. 1877 QualType getAutoDeductType() const; 1878 1879 /// C++11 deduction pattern for 'auto &&' type. 1880 QualType getAutoRRefDeductType() const; 1881 1882 /// Remove any type constraints from a template parameter type, for 1883 /// equivalence comparison of template parameters. 1884 QualType getUnconstrainedType(QualType T) const; 1885 1886 /// C++17 deduced class template specialization type. 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 /// Return the unique reference to the type for the specified TagDecl 1899 /// (struct/union/class/enum) decl. 1900 QualType getTagDeclType(const TagDecl *Decl) const; 1901 1902 /// Return the unique type for "size_t" (C99 7.17), defined in 1903 /// <stddef.h>. 1904 /// 1905 /// The sizeof operator requires this (C99 6.5.3.4p4). 1906 CanQualType getSizeType() const; 1907 1908 /// Return the unique signed counterpart of 1909 /// the integer type corresponding to size_t. 1910 CanQualType getSignedSizeType() const; 1911 1912 /// Return the unique type for "intmax_t" (C99 7.18.1.5), defined in 1913 /// <stdint.h>. 1914 CanQualType getIntMaxType() const; 1915 1916 /// Return the unique type for "uintmax_t" (C99 7.18.1.5), defined in 1917 /// <stdint.h>. 1918 CanQualType getUIntMaxType() const; 1919 1920 /// Return the unique wchar_t type available in C++ (and available as 1921 /// __wchar_t as a Microsoft extension). 1922 QualType getWCharType() const { return WCharTy; } 1923 1924 /// Return the type of wide characters. In C++, this returns the 1925 /// unique wchar_t type. In C99, this returns a type compatible with the type 1926 /// defined in <stddef.h> as defined by the target. 1927 QualType getWideCharType() const { return WideCharTy; } 1928 1929 /// Return the type of "signed wchar_t". 1930 /// 1931 /// Used when in C++, as a GCC extension. 1932 QualType getSignedWCharType() const; 1933 1934 /// Return the type of "unsigned wchar_t". 1935 /// 1936 /// Used when in C++, as a GCC extension. 1937 QualType getUnsignedWCharType() const; 1938 1939 /// In C99, this returns a type compatible with the type 1940 /// defined in <stddef.h> as defined by the target. 1941 QualType getWIntType() const { return WIntTy; } 1942 1943 /// Return a type compatible with "intptr_t" (C99 7.18.1.4), 1944 /// as defined by the target. 1945 QualType getIntPtrType() const; 1946 1947 /// Return a type compatible with "uintptr_t" (C99 7.18.1.4), 1948 /// as defined by the target. 1949 QualType getUIntPtrType() const; 1950 1951 /// Return the unique type for "ptrdiff_t" (C99 7.17) defined in 1952 /// <stddef.h>. Pointer - pointer requires this (C99 6.5.6p9). 1953 QualType getPointerDiffType() const; 1954 1955 /// Return the unique unsigned counterpart of "ptrdiff_t" 1956 /// integer type. The standard (C11 7.21.6.1p7) refers to this type 1957 /// in the definition of %tu format specifier. 1958 QualType getUnsignedPointerDiffType() const; 1959 1960 /// Return the unique type for "pid_t" defined in 1961 /// <sys/types.h>. We need this to compute the correct type for vfork(). 1962 QualType getProcessIDType() const; 1963 1964 /// Return the C structure type used to represent constant CFStrings. 1965 QualType getCFConstantStringType() const; 1966 1967 /// Returns the C struct type for objc_super 1968 QualType getObjCSuperType() const; 1969 void setObjCSuperType(QualType ST) { ObjCSuperType = ST; } 1970 1971 /// Get the structure type used to representation CFStrings, or NULL 1972 /// if it hasn't yet been built. 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 // This setter/getter represents the ObjC type for an NSConstantString. 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 /// Retrieve the type that \c id has been defined to, which may be 1997 /// different from the built-in \c id if \c id has been typedef'd. 1998 QualType getObjCIdRedefinitionType() const { 1999 if (ObjCIdRedefinitionType.isNull()) 2000 return getObjCIdType(); 2001 return ObjCIdRedefinitionType; 2002 } 2003 2004 /// Set the user-written type that redefines \c id. 2005 void setObjCIdRedefinitionType(QualType RedefType) { 2006 ObjCIdRedefinitionType = RedefType; 2007 } 2008 2009 /// Retrieve the type that \c Class has been defined to, which may be 2010 /// different from the built-in \c Class if \c Class has been typedef'd. 2011 QualType getObjCClassRedefinitionType() const { 2012 if (ObjCClassRedefinitionType.isNull()) 2013 return getObjCClassType(); 2014 return ObjCClassRedefinitionType; 2015 } 2016 2017 /// Set the user-written type that redefines 'SEL'. 2018 void setObjCClassRedefinitionType(QualType RedefType) { 2019 ObjCClassRedefinitionType = RedefType; 2020 } 2021 2022 /// Retrieve the type that 'SEL' has been defined to, which may be 2023 /// different from the built-in 'SEL' if 'SEL' has been typedef'd. 2024 QualType getObjCSelRedefinitionType() const { 2025 if (ObjCSelRedefinitionType.isNull()) 2026 return getObjCSelType(); 2027 return ObjCSelRedefinitionType; 2028 } 2029 2030 /// Set the user-written type that redefines 'SEL'. 2031 void setObjCSelRedefinitionType(QualType RedefType) { 2032 ObjCSelRedefinitionType = RedefType; 2033 } 2034 2035 /// Retrieve the identifier 'NSObject'. 2036 IdentifierInfo *getNSObjectName() const { 2037 if (!NSObjectName) { 2038 NSObjectName = &Idents.get("NSObject"); 2039 } 2040 2041 return NSObjectName; 2042 } 2043 2044 /// Retrieve the identifier 'NSCopying'. 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 /// Retrieve the identifier 'bool'. 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 /// Retrieve the Objective-C "instancetype" type, if already known; 2083 /// otherwise, returns a NULL type; 2084 QualType getObjCInstanceType() { 2085 return getTypeDeclType(getObjCInstanceTypeDecl()); 2086 } 2087 2088 /// Retrieve the typedef declaration corresponding to the Objective-C 2089 /// "instancetype" type. 2090 TypedefDecl *getObjCInstanceTypeDecl(); 2091 2092 /// Set the type for the C FILE type. 2093 void setFILEDecl(TypeDecl *FILEDecl) { this->FILEDecl = FILEDecl; } 2094 2095 /// Retrieve the C FILE type. 2096 QualType getFILEType() const { 2097 if (FILEDecl) 2098 return getTypeDeclType(FILEDecl); 2099 return QualType(); 2100 } 2101 2102 /// Set the type for the C jmp_buf type. 2103 void setjmp_bufDecl(TypeDecl *jmp_bufDecl) { 2104 this->jmp_bufDecl = jmp_bufDecl; 2105 } 2106 2107 /// Retrieve the C jmp_buf type. 2108 QualType getjmp_bufType() const { 2109 if (jmp_bufDecl) 2110 return getTypeDeclType(jmp_bufDecl); 2111 return QualType(); 2112 } 2113 2114 /// Set the type for the C sigjmp_buf type. 2115 void setsigjmp_bufDecl(TypeDecl *sigjmp_bufDecl) { 2116 this->sigjmp_bufDecl = sigjmp_bufDecl; 2117 } 2118 2119 /// Retrieve the C sigjmp_buf type. 2120 QualType getsigjmp_bufType() const { 2121 if (sigjmp_bufDecl) 2122 return getTypeDeclType(sigjmp_bufDecl); 2123 return QualType(); 2124 } 2125 2126 /// Set the type for the C ucontext_t type. 2127 void setucontext_tDecl(TypeDecl *ucontext_tDecl) { 2128 this->ucontext_tDecl = ucontext_tDecl; 2129 } 2130 2131 /// Retrieve the C ucontext_t type. 2132 QualType getucontext_tType() const { 2133 if (ucontext_tDecl) 2134 return getTypeDeclType(ucontext_tDecl); 2135 return QualType(); 2136 } 2137 2138 /// The result type of logical operations, '<', '>', '!=', etc. 2139 QualType getLogicalOperationType() const { 2140 return getLangOpts().CPlusPlus ? BoolTy : IntTy; 2141 } 2142 2143 /// Emit the Objective-CC type encoding for the given type \p T into 2144 /// \p S. 2145 /// 2146 /// If \p Field is specified then record field names are also encoded. 2147 void getObjCEncodingForType(QualType T, std::string &S, 2148 const FieldDecl *Field=nullptr, 2149 QualType *NotEncodedT=nullptr) const; 2150 2151 /// Emit the Objective-C property type encoding for the given 2152 /// type \p T into \p S. 2153 void getObjCEncodingForPropertyType(QualType T, std::string &S) const; 2154 2155 void getLegacyIntegralTypeEncoding(QualType &t) const; 2156 2157 /// Put the string version of the type qualifiers \p QT into \p S. 2158 void getObjCEncodingForTypeQualifier(Decl::ObjCDeclQualifier QT, 2159 std::string &S) const; 2160 2161 /// Emit the encoded type for the function \p Decl into \p S. 2162 /// 2163 /// This is in the same format as Objective-C method encodings. 2164 /// 2165 /// \returns true if an error occurred (e.g., because one of the parameter 2166 /// types is incomplete), false otherwise. 2167 std::string getObjCEncodingForFunctionDecl(const FunctionDecl *Decl) const; 2168 2169 /// Emit the encoded type for the method declaration \p Decl into 2170 /// \p S. 2171 std::string getObjCEncodingForMethodDecl(const ObjCMethodDecl *Decl, 2172 bool Extended = false) const; 2173 2174 /// Return the encoded type for this block declaration. 2175 std::string getObjCEncodingForBlock(const BlockExpr *blockExpr) const; 2176 2177 /// getObjCEncodingForPropertyDecl - Return the encoded type for 2178 /// this method declaration. If non-NULL, Container must be either 2179 /// an ObjCCategoryImplDecl or ObjCImplementationDecl; it should 2180 /// only be NULL when getting encodings for protocol properties. 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 /// Return the size of type \p T for Objective-C encoding purpose, 2192 /// in characters. 2193 CharUnits getObjCEncodingTypeSize(QualType T) const; 2194 2195 /// Retrieve the typedef corresponding to the predefined \c id type 2196 /// in Objective-C. 2197 TypedefDecl *getObjCIdDecl() const; 2198 2199 /// Represents the Objective-CC \c id type. 2200 /// 2201 /// This is set up lazily, by Sema. \c id is always a (typedef for a) 2202 /// pointer type, a pointer to a struct. 2203 QualType getObjCIdType() const { 2204 return getTypeDeclType(getObjCIdDecl()); 2205 } 2206 2207 /// Retrieve the typedef corresponding to the predefined 'SEL' type 2208 /// in Objective-C. 2209 TypedefDecl *getObjCSelDecl() const; 2210 2211 /// Retrieve the type that corresponds to the predefined Objective-C 2212 /// 'SEL' type. 2213 QualType getObjCSelType() const { 2214 return getTypeDeclType(getObjCSelDecl()); 2215 } 2216 2217 /// Retrieve the typedef declaration corresponding to the predefined 2218 /// Objective-C 'Class' type. 2219 TypedefDecl *getObjCClassDecl() const; 2220 2221 /// Represents the Objective-C \c Class type. 2222 /// 2223 /// This is set up lazily, by Sema. \c Class is always a (typedef for a) 2224 /// pointer type, a pointer to a struct. 2225 QualType getObjCClassType() const { 2226 return getTypeDeclType(getObjCClassDecl()); 2227 } 2228 2229 /// Retrieve the Objective-C class declaration corresponding to 2230 /// the predefined \c Protocol class. 2231 ObjCInterfaceDecl *getObjCProtocolDecl() const; 2232 2233 /// Retrieve declaration of 'BOOL' typedef 2234 TypedefDecl *getBOOLDecl() const { 2235 return BOOLDecl; 2236 } 2237 2238 /// Save declaration of 'BOOL' typedef 2239 void setBOOLDecl(TypedefDecl *TD) { 2240 BOOLDecl = TD; 2241 } 2242 2243 /// type of 'BOOL' type. 2244 QualType getBOOLType() const { 2245 return getTypeDeclType(getBOOLDecl()); 2246 } 2247 2248 /// Retrieve the type of the Objective-C \c Protocol class. 2249 QualType getObjCProtoType() const { 2250 return getObjCInterfaceType(getObjCProtocolDecl()); 2251 } 2252 2253 /// Retrieve the C type declaration corresponding to the predefined 2254 /// \c __builtin_va_list type. 2255 TypedefDecl *getBuiltinVaListDecl() const; 2256 2257 /// Retrieve the type of the \c __builtin_va_list type. 2258 QualType getBuiltinVaListType() const { 2259 return getTypeDeclType(getBuiltinVaListDecl()); 2260 } 2261 2262 /// Retrieve the C type declaration corresponding to the predefined 2263 /// \c __va_list_tag type used to help define the \c __builtin_va_list type 2264 /// for some targets. 2265 Decl *getVaListTagDecl() const; 2266 2267 /// Retrieve the C type declaration corresponding to the predefined 2268 /// \c __builtin_ms_va_list type. 2269 TypedefDecl *getBuiltinMSVaListDecl() const; 2270 2271 /// Retrieve the type of the \c __builtin_ms_va_list type. 2272 QualType getBuiltinMSVaListType() const { 2273 return getTypeDeclType(getBuiltinMSVaListDecl()); 2274 } 2275 2276 /// Retrieve the implicitly-predeclared 'struct _GUID' declaration. 2277 TagDecl *getMSGuidTagDecl() const { return MSGuidTagDecl; } 2278 2279 /// Retrieve the implicitly-predeclared 'struct _GUID' type. 2280 QualType getMSGuidType() const { 2281 assert(MSGuidTagDecl && "asked for GUID type but MS extensions disabled"); 2282 return getTagDeclType(MSGuidTagDecl); 2283 } 2284 2285 /// Return whether a declaration to a builtin is allowed to be 2286 /// overloaded/redeclared. 2287 bool canBuiltinBeRedeclared(const FunctionDecl *) const; 2288 2289 /// Return a type with additional \c const, \c volatile, or 2290 /// \c restrict qualifiers. 2291 QualType getCVRQualifiedType(QualType T, unsigned CVR) const { 2292 return getQualifiedType(T, Qualifiers::fromCVRMask(CVR)); 2293 } 2294 2295 /// Un-split a SplitQualType. 2296 QualType getQualifiedType(SplitQualType split) const { 2297 return getQualifiedType(split.Ty, split.Quals); 2298 } 2299 2300 /// Return a type with additional qualifiers. 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 /// Return a type with additional qualifiers. 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 /// Return a type with the given lifetime qualifier. 2317 /// 2318 /// \pre Neither type.ObjCLifetime() nor \p lifetime may be \c OCL_None. 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 /// getUnqualifiedObjCPointerType - Returns version of 2330 /// Objective-C pointer type with lifetime qualifier removed. 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 /// \brief Return a type with the given __ptrauth qualifier. 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 /// Represents a TemplateName which had some of its default arguments 2381 /// deduced. This both represents this default argument deduction as sugar, 2382 /// and provides the support for it's equivalences through canonicalization. 2383 /// For example DeducedTemplateNames which have the same set of default 2384 /// arguments are equivalent, and are also equivalent to the underlying 2385 /// template when the deduced template arguments are the same. 2386 TemplateName getDeducedTemplateName(TemplateName Underlying, 2387 DefaultArguments DefaultArgs) const; 2388 2389 enum GetBuiltinTypeError { 2390 /// No error 2391 GE_None, 2392 2393 /// Missing a type 2394 GE_Missing_type, 2395 2396 /// Missing a type from <stdio.h> 2397 GE_Missing_stdio, 2398 2399 /// Missing a type from <setjmp.h> 2400 GE_Missing_setjmp, 2401 2402 /// Missing a type from <ucontext.h> 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 /// Return the type for the specified builtin. 2411 /// 2412 /// If \p IntegerConstantArgs is non-null, it is filled in with a bitmask of 2413 /// arguments to the builtin that are required to be integer constant 2414 /// expressions. 2415 QualType GetBuiltinType(unsigned ID, GetBuiltinTypeError &Error, 2416 unsigned *IntegerConstantArgs = nullptr) const; 2417 2418 /// Types and expressions required to build C++2a three-way comparisons 2419 /// using operator<=>, including the values return by builtin <=> operators. 2420 ComparisonCategories CompCategories; 2421 2422 private: 2423 CanQualType getFromTargetType(unsigned Type) const; 2424 TypeInfo getTypeInfoImpl(const Type *T) const; 2425 2426 //===--------------------------------------------------------------------===// 2427 // Type Predicates. 2428 //===--------------------------------------------------------------------===// 2429 2430 public: 2431 /// Return one of the GCNone, Weak or Strong Objective-C garbage 2432 /// collection attributes. 2433 Qualifiers::GC getObjCGCAttrKind(QualType Ty) const; 2434 2435 /// Return true if the given vector types are of the same unqualified 2436 /// type or if they are equivalent to the same GCC vector type. 2437 /// 2438 /// \note This ignores whether they are target-specific (AltiVec or Neon) 2439 /// types. 2440 bool areCompatibleVectorTypes(QualType FirstVec, QualType SecondVec); 2441 2442 /// Return true if the given types are an SVE builtin and a VectorType that 2443 /// is a fixed-length representation of the SVE builtin for a specific 2444 /// vector-length. 2445 bool areCompatibleSveTypes(QualType FirstType, QualType SecondType); 2446 2447 /// Return true if the given vector types are lax-compatible SVE vector types, 2448 /// false otherwise. 2449 bool areLaxCompatibleSveTypes(QualType FirstType, QualType SecondType); 2450 2451 /// Return true if the given types are an RISC-V vector builtin type and a 2452 /// VectorType that is a fixed-length representation of the RISC-V vector 2453 /// builtin type for a specific vector-length. 2454 bool areCompatibleRVVTypes(QualType FirstType, QualType SecondType); 2455 2456 /// Return true if the given vector types are lax-compatible RISC-V vector 2457 /// types as defined by -flax-vector-conversions=, which permits implicit 2458 /// conversions between vectors with different number of elements and/or 2459 /// incompatible element types, false otherwise. 2460 bool areLaxCompatibleRVVTypes(QualType FirstType, QualType SecondType); 2461 2462 /// Return true if the type has been explicitly qualified with ObjC ownership. 2463 /// A type may be implicitly qualified with ownership under ObjC ARC, and in 2464 /// some cases the compiler treats these differently. 2465 bool hasDirectOwnershipQualifier(QualType Ty) const; 2466 2467 /// Return true if this is an \c NSObject object with its \c NSObject 2468 /// attribute set. 2469 static bool isObjCNSObjectType(QualType Ty) { 2470 return Ty->isObjCNSObjectType(); 2471 } 2472 2473 //===--------------------------------------------------------------------===// 2474 // Type Sizing and Analysis 2475 //===--------------------------------------------------------------------===// 2476 2477 /// Return the APFloat 'semantics' for the specified scalar floating 2478 /// point type. 2479 const llvm::fltSemantics &getFloatTypeSemantics(QualType T) const; 2480 2481 /// Get the size and alignment of the specified complete type in bits. 2482 TypeInfo getTypeInfo(const Type *T) const; 2483 TypeInfo getTypeInfo(QualType T) const { return getTypeInfo(T.getTypePtr()); } 2484 2485 /// Get default simd alignment of the specified complete type in bits. 2486 unsigned getOpenMPDefaultSimdAlign(QualType T) const; 2487 2488 /// Return the size of the specified (complete) type \p T, in bits. 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 /// Return the size of the character type, in bits. 2493 uint64_t getCharWidth() const { 2494 return getTypeSize(CharTy); 2495 } 2496 2497 /// Convert a size in bits to a size in characters. 2498 CharUnits toCharUnitsFromBits(int64_t BitSize) const; 2499 2500 /// Convert a size in characters to a size in bits. 2501 int64_t toBits(CharUnits CharSize) const; 2502 2503 /// Return the size of the specified (complete) type \p T, in 2504 /// characters. 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 /// Return the ABI-specified alignment of a (complete) type \p T, in 2519 /// bits. 2520 unsigned getTypeAlign(QualType T) const { return getTypeInfo(T).Align; } 2521 unsigned getTypeAlign(const Type *T) const { return getTypeInfo(T).Align; } 2522 2523 /// Return the ABI-specified natural alignment of a (complete) type \p T, 2524 /// before alignment adjustments, in bits. 2525 /// 2526 /// This alignment is curently used only by ARM and AArch64 when passing 2527 /// arguments of a composite type. 2528 unsigned getTypeUnadjustedAlign(QualType T) const { 2529 return getTypeUnadjustedAlign(T.getTypePtr()); 2530 } 2531 unsigned getTypeUnadjustedAlign(const Type *T) const; 2532 2533 /// Return the alignment of a type, in bits, or 0 if 2534 /// the type is incomplete and we cannot determine the alignment (for 2535 /// example, from alignment attributes). The returned alignment is the 2536 /// Preferred alignment if NeedsPreferredAlignment is true, otherwise is the 2537 /// ABI alignment. 2538 unsigned getTypeAlignIfKnown(QualType T, 2539 bool NeedsPreferredAlignment = false) const; 2540 2541 /// Return the ABI-specified alignment of a (complete) type \p T, in 2542 /// characters. 2543 CharUnits getTypeAlignInChars(QualType T) const; 2544 CharUnits getTypeAlignInChars(const Type *T) const; 2545 2546 /// Return the PreferredAlignment of a (complete) type \p T, in 2547 /// characters. 2548 CharUnits getPreferredTypeAlignInChars(QualType T) const { 2549 return toCharUnitsFromBits(getPreferredTypeAlign(T)); 2550 } 2551 2552 /// getTypeUnadjustedAlignInChars - Return the ABI-specified alignment of a type, 2553 /// in characters, before alignment adjustments. This method does not work on 2554 /// incomplete types. 2555 CharUnits getTypeUnadjustedAlignInChars(QualType T) const; 2556 CharUnits getTypeUnadjustedAlignInChars(const Type *T) const; 2557 2558 // getTypeInfoDataSizeInChars - Return the size of a type, in chars. If the 2559 // type is a record, its data size is returned. 2560 TypeInfoChars getTypeInfoDataSizeInChars(QualType T) const; 2561 2562 TypeInfoChars getTypeInfoInChars(const Type *T) const; 2563 TypeInfoChars getTypeInfoInChars(QualType T) const; 2564 2565 /// Determine if the alignment the type has was required using an 2566 /// alignment attribute. 2567 bool isAlignmentRequired(const Type *T) const; 2568 bool isAlignmentRequired(QualType T) const; 2569 2570 /// More type predicates useful for type checking/promotion 2571 bool isPromotableIntegerType(QualType T) const; // C99 6.3.1.1p2 2572 2573 /// Return the "preferred" alignment of the specified type \p T for 2574 /// the current target, in bits. 2575 /// 2576 /// This can be different than the ABI alignment in cases where it is 2577 /// beneficial for performance or backwards compatibility preserving to 2578 /// overalign a data type. (Note: despite the name, the preferred alignment 2579 /// is ABI-impacting, and not an optimization.) 2580 unsigned getPreferredTypeAlign(QualType T) const { 2581 return getPreferredTypeAlign(T.getTypePtr()); 2582 } 2583 unsigned getPreferredTypeAlign(const Type *T) const; 2584 2585 /// Return the default alignment for __attribute__((aligned)) on 2586 /// this target, to be used if no alignment value is specified. 2587 unsigned getTargetDefaultAlignForAttributeAligned() const; 2588 2589 /// Return the alignment in bits that should be given to a 2590 /// global variable with type \p T. If \p VD is non-null it will be 2591 /// considered specifically for the query. 2592 unsigned getAlignOfGlobalVar(QualType T, const VarDecl *VD) const; 2593 2594 /// Return the alignment in characters that should be given to a 2595 /// global variable with type \p T. If \p VD is non-null it will be 2596 /// considered specifically for the query. 2597 CharUnits getAlignOfGlobalVarInChars(QualType T, const VarDecl *VD) const; 2598 2599 /// Return the minimum alignement as specified by the target. If \p VD is 2600 /// non-null it may be used to identify external or weak variables. 2601 unsigned getMinGlobalAlignOfVar(uint64_t Size, const VarDecl *VD) const; 2602 2603 /// Return a conservative estimate of the alignment of the specified 2604 /// decl \p D. 2605 /// 2606 /// \pre \p D must not be a bitfield type, as bitfields do not have a valid 2607 /// alignment. 2608 /// 2609 /// If \p ForAlignof, references are treated like their underlying type 2610 /// and large arrays don't get any special treatment. If not \p ForAlignof 2611 /// it computes the value expected by CodeGen: references are treated like 2612 /// pointers and large arrays get extra alignment. 2613 CharUnits getDeclAlign(const Decl *D, bool ForAlignof = false) const; 2614 2615 /// Return the alignment (in bytes) of the thrown exception object. This is 2616 /// only meaningful for targets that allocate C++ exceptions in a system 2617 /// runtime, such as those using the Itanium C++ ABI. 2618 CharUnits getExnObjectAlignment() const; 2619 2620 /// Get or compute information about the layout of the specified 2621 /// record (struct/union/class) \p D, which indicates its size and field 2622 /// position information. 2623 const ASTRecordLayout &getASTRecordLayout(const RecordDecl *D) const; 2624 2625 /// Get or compute information about the layout of the specified 2626 /// Objective-C interface. 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 /// Get or compute information about the layout of the specified 2634 /// Objective-C implementation. 2635 /// 2636 /// This may differ from the interface if synthesized ivars are present. 2637 const ASTRecordLayout & 2638 getASTObjCImplementationLayout(const ObjCImplementationDecl *D) const; 2639 2640 /// Get our current best idea for the key function of the 2641 /// given record decl, or nullptr if there isn't one. 2642 /// 2643 /// The key function is, according to the Itanium C++ ABI section 5.2.3: 2644 /// ...the first non-pure virtual function that is not inline at the 2645 /// point of class definition. 2646 /// 2647 /// Other ABIs use the same idea. However, the ARM C++ ABI ignores 2648 /// virtual functions that are defined 'inline', which means that 2649 /// the result of this computation can change. 2650 const CXXMethodDecl *getCurrentKeyFunction(const CXXRecordDecl *RD); 2651 2652 /// Observe that the given method cannot be a key function. 2653 /// Checks the key-function cache for the method's class and clears it 2654 /// if matches the given declaration. 2655 /// 2656 /// This is used in ABIs where out-of-line definitions marked 2657 /// inline are not considered to be key functions. 2658 /// 2659 /// \param method should be the declaration from the class definition 2660 void setNonKeyFunction(const CXXMethodDecl *method); 2661 2662 /// Loading virtual member pointers using the virtual inheritance model 2663 /// always results in an adjustment using the vbtable even if the index is 2664 /// zero. 2665 /// 2666 /// This is usually OK because the first slot in the vbtable points 2667 /// backwards to the top of the MDC. However, the MDC might be reusing a 2668 /// vbptr from an nv-base. In this case, the first slot in the vbtable 2669 /// points to the start of the nv-base which introduced the vbptr and *not* 2670 /// the MDC. Modify the NonVirtualBaseAdjustment to account for this. 2671 CharUnits getOffsetOfBaseWithVBPtr(const CXXRecordDecl *RD) const; 2672 2673 /// Get the offset of a FieldDecl or IndirectFieldDecl, in bits. 2674 uint64_t getFieldOffset(const ValueDecl *FD) const; 2675 2676 /// Get the offset of an ObjCIvarDecl in bits. 2677 uint64_t lookupFieldBitOffset(const ObjCInterfaceDecl *OID, 2678 const ObjCImplementationDecl *ID, 2679 const ObjCIvarDecl *Ivar) const; 2680 2681 /// Find the 'this' offset for the member path in a pointer-to-member 2682 /// APValue. 2683 CharUnits getMemberPointerPathAdjustment(const APValue &MP) const; 2684 2685 bool isNearlyEmpty(const CXXRecordDecl *RD) const; 2686 2687 VTableContextBase *getVTableContext(); 2688 2689 /// If \p T is null pointer, assume the target in ASTContext. 2690 MangleContext *createMangleContext(const TargetInfo *T = nullptr); 2691 2692 /// Creates a device mangle context to correctly mangle lambdas in a mixed 2693 /// architecture compile by setting the lambda mangling number source to the 2694 /// DeviceLambdaManglingNumber. Currently this asserts that the TargetInfo 2695 /// (from the AuxTargetInfo) is a an itanium target. 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 /// Return true if the specified type has unique object representations 2706 /// according to (C++17 [meta.unary.prop]p9) 2707 bool 2708 hasUniqueObjectRepresentations(QualType Ty, 2709 bool CheckIfTriviallyCopyable = true) const; 2710 2711 //===--------------------------------------------------------------------===// 2712 // Type Operators 2713 //===--------------------------------------------------------------------===// 2714 2715 /// Return the canonical (structural) type corresponding to the 2716 /// specified potentially non-canonical type \p T. 2717 /// 2718 /// The non-canonical version of a type may have many "decorated" versions of 2719 /// types. Decorators can include typedefs, 'typeof' operators, etc. The 2720 /// returned type is guaranteed to be free of any of these, allowing two 2721 /// canonical types to be compared for exact equality with a simple pointer 2722 /// comparison. 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 /// Return the canonical parameter type corresponding to the specific 2732 /// potentially non-canonical one. 2733 /// 2734 /// Qualifiers are stripped off, functions are turned into function 2735 /// pointers, and arrays decay one level into pointers. 2736 CanQualType getCanonicalParamType(QualType T) const; 2737 2738 /// Determine whether the given types \p T1 and \p T2 are equivalent. 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 /// Determine whether the given expressions \p X and \p Y are equivalent. 2747 bool hasSameExpr(const Expr *X, const Expr *Y) const; 2748 2749 /// Return this type as a completely-unqualified array type, 2750 /// capturing the qualifiers in \p Quals. 2751 /// 2752 /// This will remove the minimal amount of sugaring from the types, similar 2753 /// to the behavior of QualType::getUnqualifiedType(). 2754 /// 2755 /// \param T is the qualified type, which may be an ArrayType 2756 /// 2757 /// \param Quals will receive the full set of qualifiers that were 2758 /// applied to the array. 2759 /// 2760 /// \returns if this is an array type, the completely unqualified array type 2761 /// that corresponds to it. Otherwise, returns T.getUnqualifiedType(). 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 /// Determine whether the given types are equivalent after 2769 /// cvr-qualifiers have been removed. 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 // Neither has nullability; return true 2781 if (!SubTnullability) 2782 return true; 2783 // Both have nullability qualifier. 2784 if (*SubTnullability == *SuperTnullability || 2785 *SubTnullability == NullabilityKind::Unspecified || 2786 *SuperTnullability == NullabilityKind::Unspecified) 2787 return true; 2788 2789 if (IsParam) { 2790 // Ok for the superclass method parameter to be "nonnull" and the subclass 2791 // method parameter to be "nullable" 2792 return (*SuperTnullability == NullabilityKind::NonNull && 2793 *SubTnullability == NullabilityKind::Nullable); 2794 } 2795 // For the return type, it's okay for the superclass method to specify 2796 // "nullable" and the subclass method specify "nonnull" 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 /// Determine if two types are similar, according to the C++ rules. That is, 2812 /// determine if they are the same other than qualifiers on the initial 2813 /// sequence of pointer / pointer-to-member / array (and in Clang, object 2814 /// pointer) types and their element types. 2815 /// 2816 /// Clang offers a number of qualifiers in addition to the C++ qualifiers; 2817 /// those qualifiers are also ignored in the 'similarity' check. 2818 bool hasSimilarType(QualType T1, QualType T2) const; 2819 2820 /// Determine if two types are similar, ignoring only CVR qualifiers. 2821 bool hasCvrSimilarType(QualType T1, QualType T2); 2822 2823 /// Retrieves the "canonical" nested name specifier for a 2824 /// given nested name specifier. 2825 /// 2826 /// The canonical nested name specifier is a nested name specifier 2827 /// that uniquely identifies a type or namespace within the type 2828 /// system. For example, given: 2829 /// 2830 /// \code 2831 /// namespace N { 2832 /// struct S { 2833 /// template<typename T> struct X { typename T* type; }; 2834 /// }; 2835 /// } 2836 /// 2837 /// template<typename T> struct Y { 2838 /// typename N::S::X<T>::type member; 2839 /// }; 2840 /// \endcode 2841 /// 2842 /// Here, the nested-name-specifier for N::S::X<T>:: will be 2843 /// S::X<template-param-0-0>, since 'S' and 'X' are uniquely defined 2844 /// by declarations in the type system and the canonical type for 2845 /// the template type parameter 'T' is template-param-0-0. 2846 NestedNameSpecifier * 2847 getCanonicalNestedNameSpecifier(NestedNameSpecifier *NNS) const; 2848 2849 /// Retrieves the default calling convention for the current target. 2850 CallingConv getDefaultCallingConvention(bool IsVariadic, 2851 bool IsCXXMethod, 2852 bool IsBuiltin = false) const; 2853 2854 /// Retrieves the "canonical" template name that refers to a 2855 /// given template. 2856 /// 2857 /// The canonical template name is the simplest expression that can 2858 /// be used to refer to a given template. For most templates, this 2859 /// expression is just the template declaration itself. For example, 2860 /// the template std::vector can be referred to via a variety of 2861 /// names---std::vector, \::std::vector, vector (if vector is in 2862 /// scope), etc.---but all of these names map down to the same 2863 /// TemplateDecl, which is used to form the canonical template name. 2864 /// 2865 /// Dependent template names are more interesting. Here, the 2866 /// template name could be something like T::template apply or 2867 /// std::allocator<T>::template rebind, where the nested name 2868 /// specifier itself is dependent. In this case, the canonical 2869 /// template name uses the shortest form of the dependent 2870 /// nested-name-specifier, which itself contains all canonical 2871 /// types, values, and templates. 2872 TemplateName getCanonicalTemplateName(TemplateName Name, 2873 bool IgnoreDeduced = false) const; 2874 2875 /// Determine whether the given template names refer to the same 2876 /// template. 2877 bool hasSameTemplateName(const TemplateName &X, const TemplateName &Y, 2878 bool IgnoreDeduced = false) const; 2879 2880 /// Determine whether the two declarations refer to the same entity. 2881 bool isSameEntity(const NamedDecl *X, const NamedDecl *Y) const; 2882 2883 /// Determine whether two template parameter lists are similar enough 2884 /// that they may be used in declarations of the same template. 2885 bool isSameTemplateParameterList(const TemplateParameterList *X, 2886 const TemplateParameterList *Y) const; 2887 2888 /// Determine whether two template parameters are similar enough 2889 /// that they may be used in declarations of the same template. 2890 bool isSameTemplateParameter(const NamedDecl *X, const NamedDecl *Y) const; 2891 2892 /// Determine whether two 'requires' expressions are similar enough that they 2893 /// may be used in re-declarations. 2894 /// 2895 /// Use of 'requires' isn't mandatory, works with constraints expressed in 2896 /// other ways too. 2897 bool isSameConstraintExpr(const Expr *XCE, const Expr *YCE) const; 2898 2899 /// Determine whether two type contraint are similar enough that they could 2900 /// used in declarations of the same template. 2901 bool isSameTypeConstraint(const TypeConstraint *XTC, 2902 const TypeConstraint *YTC) const; 2903 2904 /// Determine whether two default template arguments are similar enough 2905 /// that they may be used in declarations of the same template. 2906 bool isSameDefaultTemplateArgument(const NamedDecl *X, 2907 const NamedDecl *Y) const; 2908 2909 /// Retrieve the "canonical" template argument. 2910 /// 2911 /// The canonical template argument is the simplest template argument 2912 /// (which may be a type, value, expression, or declaration) that 2913 /// expresses the value of the argument. 2914 TemplateArgument getCanonicalTemplateArgument(const TemplateArgument &Arg) 2915 const; 2916 2917 /// Type Query functions. If the type is an instance of the specified class, 2918 /// return the Type pointer for the underlying maximally pretty type. This 2919 /// is a member of ASTContext because this may need to do some amount of 2920 /// canonicalization, e.g. to move type qualifiers into the element type. 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 /// Return the innermost element type of an array type. 2937 /// 2938 /// For example, will return "int" for int[m][n] 2939 QualType getBaseElementType(const ArrayType *VAT) const; 2940 2941 /// Return the innermost element type of a type (which needn't 2942 /// actually be an array type). 2943 QualType getBaseElementType(QualType QT) const; 2944 2945 /// Return number of constant array elements. 2946 uint64_t getConstantArrayElementCount(const ConstantArrayType *CA) const; 2947 2948 /// Return number of elements initialized in an ArrayInitLoopExpr. 2949 uint64_t 2950 getArrayInitLoopExprElementCount(const ArrayInitLoopExpr *AILE) const; 2951 2952 /// Perform adjustment on the parameter type of a function. 2953 /// 2954 /// This routine adjusts the given parameter type @p T to the actual 2955 /// parameter type used by semantic analysis (C99 6.7.5.3p[7,8], 2956 /// C++ [dcl.fct]p3). The adjusted parameter type is returned. 2957 QualType getAdjustedParameterType(QualType T) const; 2958 2959 /// Retrieve the parameter type as adjusted for use in the signature 2960 /// of a function, decaying array and function types and removing top-level 2961 /// cv-qualifiers. 2962 QualType getSignatureParameterType(QualType T) const; 2963 2964 QualType getExceptionObjectType(QualType T) const; 2965 2966 /// Return the properly qualified result of decaying the specified 2967 /// array type to a pointer. 2968 /// 2969 /// This operation is non-trivial when handling typedefs etc. The canonical 2970 /// type of \p T must be an array type, this returns a pointer to a properly 2971 /// qualified element of the array. 2972 /// 2973 /// See C99 6.7.5.3p7 and C99 6.3.2.1p3. 2974 QualType getArrayDecayedType(QualType T) const; 2975 2976 /// Return the type that \p PromotableType will promote to: C99 2977 /// 6.3.1.1p2, assuming that \p PromotableType is a promotable integer type. 2978 QualType getPromotedIntegerType(QualType PromotableType) const; 2979 2980 /// Recurses in pointer/array types until it finds an Objective-C 2981 /// retainable type and returns its ownership. 2982 Qualifiers::ObjCLifetime getInnerObjCOwnership(QualType T) const; 2983 2984 /// Whether this is a promotable bitfield reference according 2985 /// to C99 6.3.1.1p2, bullet 2 (and GCC extensions). 2986 /// 2987 /// \returns the type this bit-field will promote to, or NULL if no 2988 /// promotion occurs. 2989 QualType isPromotableBitField(Expr *E) const; 2990 2991 /// Return the highest ranked integer type, see C99 6.3.1.8p1. 2992 /// 2993 /// If \p LHS > \p RHS, returns 1. If \p LHS == \p RHS, returns 0. If 2994 /// \p LHS < \p RHS, return -1. 2995 int getIntegerTypeOrder(QualType LHS, QualType RHS) const; 2996 2997 /// Compare the rank of the two specified floating point types, 2998 /// ignoring the domain of the type (i.e. 'double' == '_Complex double'). 2999 /// 3000 /// If \p LHS > \p RHS, returns 1. If \p LHS == \p RHS, returns 0. If 3001 /// \p LHS < \p RHS, return -1. 3002 int getFloatingTypeOrder(QualType LHS, QualType RHS) const; 3003 3004 /// Compare the rank of two floating point types as above, but compare equal 3005 /// if both types have the same floating-point semantics on the target (i.e. 3006 /// long double and double on AArch64 will return 0). 3007 int getFloatingTypeSemanticOrder(QualType LHS, QualType RHS) const; 3008 3009 unsigned getTargetAddressSpace(LangAS AS) const; 3010 3011 LangAS getLangASForBuiltinAddressSpace(unsigned AS) const; 3012 3013 /// Get target-dependent integer value for null pointer which is used for 3014 /// constant folding. 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 // Merges two exception specifications, such that the resulting 3024 // exception spec is the union of both. For example, if either 3025 // of them can throw something, the result can throw it as well. 3026 FunctionProtoType::ExceptionSpecInfo 3027 mergeExceptionSpecs(FunctionProtoType::ExceptionSpecInfo ESI1, 3028 FunctionProtoType::ExceptionSpecInfo ESI2, 3029 SmallVectorImpl<QualType> &ExceptionTypeStorage, 3030 bool AcceptDependent); 3031 3032 // For two "same" types, return a type which has 3033 // the common sugar between them. If Unqualified is true, 3034 // both types need only be the same unqualified type. 3035 // The result will drop the qualifiers which do not occur 3036 // in both types. 3037 QualType getCommonSugaredType(QualType X, QualType Y, 3038 bool Unqualified = false); 3039 3040 private: 3041 // Helper for integer ordering 3042 unsigned getIntegerRank(const Type *T) const; 3043 3044 public: 3045 //===--------------------------------------------------------------------===// 3046 // Type Compatibility Predicates 3047 //===--------------------------------------------------------------------===// 3048 3049 /// Compatibility predicates used to check assignment expressions. 3050 bool typesAreCompatible(QualType T1, QualType T2, 3051 bool CompareUnqualified = false); // C99 6.2.7p1 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 // Check the safety of assignment from LHS to RHS 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 // Functions for calculating composite types 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 /// This function merges the ExtParameterInfo lists of two functions. It 3112 /// returns true if the lists are compatible. The merged list is returned in 3113 /// NewParamInfos. 3114 /// 3115 /// \param FirstFnType The type of the first function. 3116 /// 3117 /// \param SecondFnType The type of the second function. 3118 /// 3119 /// \param CanUseFirst This flag is set to true if the first function's 3120 /// ExtParameterInfo list can be used as the composite list of 3121 /// ExtParameterInfo. 3122 /// 3123 /// \param CanUseSecond This flag is set to true if the second function's 3124 /// ExtParameterInfo list can be used as the composite list of 3125 /// ExtParameterInfo. 3126 /// 3127 /// \param NewParamInfos The composite list of ExtParameterInfo. The list is 3128 /// empty if none of the flags are set. 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 // Integer Predicates 3140 //===--------------------------------------------------------------------===// 3141 3142 // The width of an integer, as defined in C99 6.2.6.2. This is the number 3143 // of bits in an integer type excluding any padding bits. 3144 unsigned getIntWidth(QualType T) const; 3145 3146 // Per C99 6.2.5p6, for every signed integer type, there is a corresponding 3147 // unsigned integer type. This method takes a signed type, and returns the 3148 // corresponding unsigned integer type. 3149 // With the introduction of fixed point types in ISO N1169, this method also 3150 // accepts fixed point types and returns the corresponding unsigned type for 3151 // a given fixed point type. 3152 QualType getCorrespondingUnsignedType(QualType T) const; 3153 3154 // Per C99 6.2.5p6, for every signed integer type, there is a corresponding 3155 // unsigned integer type. This method takes an unsigned type, and returns the 3156 // corresponding signed integer type. 3157 // With the introduction of fixed point types in ISO N1169, this method also 3158 // accepts fixed point types and returns the corresponding signed type for 3159 // a given fixed point type. 3160 QualType getCorrespondingSignedType(QualType T) const; 3161 3162 // Per ISO N1169, this method accepts fixed point types and returns the 3163 // corresponding saturated type for a given fixed point type. 3164 QualType getCorrespondingSaturatedType(QualType Ty) const; 3165 3166 // Per ISO N1169, this method accepts fixed point types and returns the 3167 // corresponding non-saturated type for a given fixed point type. 3168 QualType getCorrespondingUnsaturatedType(QualType Ty) const; 3169 3170 // This method accepts fixed point types and returns the corresponding signed 3171 // type. Unlike getCorrespondingUnsignedType(), this only accepts unsigned 3172 // fixed point types because there are unsigned integer types like bool and 3173 // char8_t that don't have signed equivalents. 3174 QualType getCorrespondingSignedFixedPointType(QualType Ty) const; 3175 3176 //===--------------------------------------------------------------------===// 3177 // Integer Values 3178 //===--------------------------------------------------------------------===// 3179 3180 /// Make an APSInt of the appropriate width and signedness for the 3181 /// given \p Value and integer \p Type. 3182 llvm::APSInt MakeIntValue(uint64_t Value, QualType Type) const { 3183 // If Type is a signed integer type larger than 64 bits, we need to be sure 3184 // to sign extend Res appropriately. 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 /// Get the implementation of the ObjCInterfaceDecl \p D, or nullptr if 3196 /// none exists. 3197 ObjCImplementationDecl *getObjCImplementation(ObjCInterfaceDecl *D); 3198 3199 /// Get the implementation of the ObjCCategoryDecl \p D, or nullptr if 3200 /// none exists. 3201 ObjCCategoryImplDecl *getObjCImplementation(ObjCCategoryDecl *D); 3202 3203 /// Return true if there is at least one \@implementation in the TU. 3204 bool AnyObjCImplementation() { 3205 return !ObjCImpls.empty(); 3206 } 3207 3208 /// Set the implementation of ObjCInterfaceDecl. 3209 void setObjCImplementation(ObjCInterfaceDecl *IFaceD, 3210 ObjCImplementationDecl *ImplD); 3211 3212 /// Set the implementation of ObjCCategoryDecl. 3213 void setObjCImplementation(ObjCCategoryDecl *CatD, 3214 ObjCCategoryImplDecl *ImplD); 3215 3216 /// Get the duplicate declaration of a ObjCMethod in the same 3217 /// interface, or null if none exists. 3218 const ObjCMethodDecl * 3219 getObjCMethodRedeclaration(const ObjCMethodDecl *MD) const; 3220 3221 void setObjCMethodRedeclaration(const ObjCMethodDecl *MD, 3222 const ObjCMethodDecl *Redecl); 3223 3224 /// Returns the Objective-C interface that \p ND belongs to if it is 3225 /// an Objective-C method/property/ivar etc. that is part of an interface, 3226 /// otherwise returns null. 3227 const ObjCInterfaceDecl *getObjContainingInterface(const NamedDecl *ND) const; 3228 3229 /// Set the copy initialization expression of a block var decl. \p CanThrow 3230 /// indicates whether the copy expression can throw or not. 3231 void setBlockVarCopyInit(const VarDecl* VD, Expr *CopyExpr, bool CanThrow); 3232 3233 /// Get the copy initialization expression of the VarDecl \p VD, or 3234 /// nullptr if none exists. 3235 BlockVarCopyInit getBlockVarCopyInit(const VarDecl* VD) const; 3236 3237 /// Allocate an uninitialized TypeSourceInfo. 3238 /// 3239 /// The caller should initialize the memory held by TypeSourceInfo using 3240 /// the TypeLoc wrappers. 3241 /// 3242 /// \param T the type that will be the basis for type source info. This type 3243 /// should refer to how the declarator was written in source code, not to 3244 /// what type semantic analysis resolved the declarator to. 3245 /// 3246 /// \param Size the size of the type info to create, or 0 if the size 3247 /// should be calculated based on the type. 3248 TypeSourceInfo *CreateTypeSourceInfo(QualType T, unsigned Size = 0) const; 3249 3250 /// Allocate a TypeSourceInfo where all locations have been 3251 /// initialized to a given location, which defaults to the empty 3252 /// location. 3253 TypeSourceInfo * 3254 getTrivialTypeSourceInfo(QualType T, 3255 SourceLocation Loc = SourceLocation()) const; 3256 3257 /// Add a deallocation callback that will be invoked when the 3258 /// ASTContext is destroyed. 3259 /// 3260 /// \param Callback A callback function that will be invoked on destruction. 3261 /// 3262 /// \param Data Pointer data that will be provided to the callback function 3263 /// when it is called. 3264 void AddDeallocation(void (*Callback)(void *), void *Data) const; 3265 3266 /// If T isn't trivially destructible, calls AddDeallocation to register it 3267 /// for destruction. 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 /// Determines if the decl can be CodeGen'ed or deserialized from PCH 3279 /// lazily, only when used; this is only relevant for function or file scoped 3280 /// var definitions. 3281 /// 3282 /// \returns true if the function/var must be CodeGen'ed/deserialized even if 3283 /// it is not used. 3284 bool DeclMustBeEmitted(const Decl *D); 3285 3286 /// Visits all versions of a multiversioned function with the passed 3287 /// predicate. 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 /// Retrieve the context for computing mangling numbers in the given 3314 /// DeclContext. 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 /// Used by ParmVarDecl to store on the side the 3323 /// index of the parameter when it exceeds the size of the normal bitfield. 3324 void setParameterIndex(const ParmVarDecl *D, unsigned index); 3325 3326 /// Used by ParmVarDecl to retrieve on the side the 3327 /// index of the parameter when it exceeds the size of the normal bitfield. 3328 unsigned getParameterIndex(const ParmVarDecl *D) const; 3329 3330 /// Return a string representing the human readable name for the specified 3331 /// function declaration or file name. Used by SourceLocExpr and 3332 /// PredefinedExpr to cache evaluated results. 3333 StringLiteral *getPredefinedStringLiteralFromCache(StringRef Key) const; 3334 3335 /// Return the next version number to be used for a string literal evaluated 3336 /// as part of constant evaluation. 3337 unsigned getNextStringLiteralVersion() { return NextStringLiteralVersion++; } 3338 3339 /// Return a declaration for the global GUID object representing the given 3340 /// GUID value. 3341 MSGuidDecl *getMSGuidDecl(MSGuidDeclParts Parts) const; 3342 3343 /// Return a declaration for a uniquified anonymous global constant 3344 /// corresponding to a given APValue. 3345 UnnamedGlobalConstantDecl * 3346 getUnnamedGlobalConstantDecl(QualType Ty, const APValue &Value) const; 3347 3348 /// Return the template parameter object of the given type with the given 3349 /// value. 3350 TemplateParamObjectDecl *getTemplateParamObjectDecl(QualType T, 3351 const APValue &V) const; 3352 3353 /// Parses the target attributes passed in, and returns only the ones that are 3354 /// valid feature names. 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 /// Generates and stores SYCL kernel metadata for the provided 3363 /// SYCL kernel entry point function. The provided function must have 3364 /// an attached sycl_kernel_entry_point attribute that specifies a unique 3365 /// type for the name of a SYCL kernel. Callers are required to detect 3366 /// conflicting SYCL kernel names and issue a diagnostic prior to calling 3367 /// this function. 3368 void registerSYCLEntryPointFunction(FunctionDecl *FD); 3369 3370 /// Given a type used as a SYCL kernel name, returns a reference to the 3371 /// metadata generated from the corresponding SYCL kernel entry point. 3372 /// Aborts if the provided type is not a registered SYCL kernel name. 3373 const SYCLKernelInfo &getSYCLKernelInfo(QualType T) const; 3374 3375 /// Returns a pointer to the metadata generated from the corresponding 3376 /// SYCLkernel entry point if the provided type corresponds to a registered 3377 /// SYCL kernel name. Returns a null pointer otherwise. 3378 const SYCLKernelInfo *findSYCLKernelInfo(QualType T) const; 3379 3380 //===--------------------------------------------------------------------===// 3381 // Statistics 3382 //===--------------------------------------------------------------------===// 3383 3384 /// The number of implicitly-declared default constructors. 3385 unsigned NumImplicitDefaultConstructors = 0; 3386 3387 /// The number of implicitly-declared default constructors for 3388 /// which declarations were built. 3389 unsigned NumImplicitDefaultConstructorsDeclared = 0; 3390 3391 /// The number of implicitly-declared copy constructors. 3392 unsigned NumImplicitCopyConstructors = 0; 3393 3394 /// The number of implicitly-declared copy constructors for 3395 /// which declarations were built. 3396 unsigned NumImplicitCopyConstructorsDeclared = 0; 3397 3398 /// The number of implicitly-declared move constructors. 3399 unsigned NumImplicitMoveConstructors = 0; 3400 3401 /// The number of implicitly-declared move constructors for 3402 /// which declarations were built. 3403 unsigned NumImplicitMoveConstructorsDeclared = 0; 3404 3405 /// The number of implicitly-declared copy assignment operators. 3406 unsigned NumImplicitCopyAssignmentOperators = 0; 3407 3408 /// The number of implicitly-declared copy assignment operators for 3409 /// which declarations were built. 3410 unsigned NumImplicitCopyAssignmentOperatorsDeclared = 0; 3411 3412 /// The number of implicitly-declared move assignment operators. 3413 unsigned NumImplicitMoveAssignmentOperators = 0; 3414 3415 /// The number of implicitly-declared move assignment operators for 3416 /// which declarations were built. 3417 unsigned NumImplicitMoveAssignmentOperatorsDeclared = 0; 3418 3419 /// The number of implicitly-declared destructors. 3420 unsigned NumImplicitDestructors = 0; 3421 3422 /// The number of implicitly-declared destructors for which 3423 /// declarations were built. 3424 unsigned NumImplicitDestructorsDeclared = 0; 3425 3426 public: 3427 /// Initialize built-in types. 3428 /// 3429 /// This routine may only be invoked once for a given ASTContext object. 3430 /// It is normally invoked after ASTContext construction. 3431 /// 3432 /// \param Target The target 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 // Return the Objective-C type encoding for a given type. 3479 void getObjCEncodingForTypeImpl(QualType t, std::string &S, 3480 ObjCEncOptions Options, 3481 const FieldDecl *Field, 3482 QualType *NotEncodedT = nullptr) const; 3483 3484 // Adds the encoding of the structure's members. 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 // Adds the encoding of a method parameter or return type. 3492 void getObjCEncodingForMethodParameter(Decl::ObjCDeclQualifier QT, 3493 QualType T, std::string& S, 3494 bool Extended) const; 3495 3496 /// Returns true if this is an inline-initialized static data member 3497 /// which is treated as a definition for MSVC compatibility. 3498 bool isMSStaticDataMemberInlineDefinition(const VarDecl *VD) const; 3499 3500 enum class InlineVariableDefinitionKind { 3501 /// Not an inline variable. 3502 None, 3503 3504 /// Weak definition of inline variable. 3505 Weak, 3506 3507 /// Weak for now, might become strong later in this TU. 3508 WeakUnknown, 3509 3510 /// Strong definition. 3511 Strong 3512 }; 3513 3514 /// Determine whether a definition of this inline variable should 3515 /// be treated as a weak or strong definition. For compatibility with 3516 /// C++14 and before, for a constexpr static data member, if there is an 3517 /// out-of-line declaration of the member, we may promote it from weak to 3518 /// strong. 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 /// A set of deallocations that should be performed when the 3531 /// ASTContext is destroyed. 3532 // FIXME: We really should have a better mechanism in the ASTContext to 3533 // manage running destructors for types which do variable sized allocation 3534 // within the AST. In some places we thread the AST bump pointer allocator 3535 // into the datastructures which avoids this mess during deallocation but is 3536 // wasteful of memory, and here we require a lot of error prone book keeping 3537 // in order to track and run destructors while we're tearing things down. 3538 using DeallocationFunctionsAndArguments = 3539 llvm::SmallVector<std::pair<void (*)(void *), void *>, 16>; 3540 mutable DeallocationFunctionsAndArguments Deallocations; 3541 3542 // FIXME: This currently contains the set of StoredDeclMaps used 3543 // by DeclContext objects. This probably should not be in ASTContext, 3544 // but we include it here so that ASTContext can quickly deallocate them. 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 /// Return a new OMPTraitInfo object owned by this context. 3579 OMPTraitInfo &getNewOMPTraitInfo(); 3580 3581 /// Whether a C++ static variable or CUDA/HIP kernel may be externalized. 3582 bool mayExternalize(const Decl *D) const; 3583 3584 /// Whether a C++ static variable or CUDA/HIP kernel should be externalized. 3585 bool shouldExternalize(const Decl *D) const; 3586 3587 /// Resolve the root record to be used to derive the vtable pointer 3588 /// authentication policy for the specified record. 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 /// All OMPTraitInfo objects live in this collection, one per 3598 /// `pragma omp [begin] declare variant` directive. 3599 SmallVector<std::unique_ptr<OMPTraitInfo>, 4> OMPTraitInfoVector; 3600 3601 llvm::DenseMap<GlobalDecl, llvm::StringSet<>> ThunksToBeAbbreviated; 3602 }; 3603 3604 /// Insertion operator for diagnostics. 3605 const StreamingDiagnostic &operator<<(const StreamingDiagnostic &DB, 3606 const ASTContext::SectionInfo &Section); 3607 3608 /// Utility function for constructing a nullary selector. 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 /// Utility function for constructing an unary selector. 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 } // namespace clang 3621 3622 // operator new and delete aren't allowed inside namespaces. 3623 3624 /// Placement new for using the ASTContext's allocator. 3625 /// 3626 /// This placement form of operator new uses the ASTContext's allocator for 3627 /// obtaining memory. 3628 /// 3629 /// IMPORTANT: These are also declared in clang/AST/ASTContextAllocate.h! 3630 /// Any changes here need to also be made there. 3631 /// 3632 /// We intentionally avoid using a nothrow specification here so that the calls 3633 /// to this operator will not perform a null check on the result -- the 3634 /// underlying allocator never returns null pointers. 3635 /// 3636 /// Usage looks like this (assuming there's an ASTContext 'Context' in scope): 3637 /// @code 3638 /// // Default alignment (8) 3639 /// IntegerLiteral *Ex = new (Context) IntegerLiteral(arguments); 3640 /// // Specific alignment 3641 /// IntegerLiteral *Ex2 = new (Context, 4) IntegerLiteral(arguments); 3642 /// @endcode 3643 /// Memory allocated through this placement new operator does not need to be 3644 /// explicitly freed, as ASTContext will free all of this memory when it gets 3645 /// destroyed. Please note that you cannot use delete on the pointer. 3646 /// 3647 /// @param Bytes The number of bytes to allocate. Calculated by the compiler. 3648 /// @param C The ASTContext that provides the allocator. 3649 /// @param Alignment The alignment of the allocated memory (if the underlying 3650 /// allocator supports it). 3651 /// @return The allocated memory. Could be nullptr. 3652 inline void *operator new(size_t Bytes, const clang::ASTContext &C, 3653 size_t Alignment /* = 8 */) { 3654 return C.Allocate(Bytes, Alignment); 3655 } 3656 3657 /// Placement delete companion to the new above. 3658 /// 3659 /// This operator is just a companion to the new above. There is no way of 3660 /// invoking it directly; see the new operator for more details. This operator 3661 /// is called implicitly by the compiler if a placement new expression using 3662 /// the ASTContext throws in the object constructor. 3663 inline void operator delete(void *Ptr, const clang::ASTContext &C, size_t) { 3664 C.Deallocate(Ptr); 3665 } 3666 3667 /// This placement form of operator new[] uses the ASTContext's allocator for 3668 /// obtaining memory. 3669 /// 3670 /// We intentionally avoid using a nothrow specification here so that the calls 3671 /// to this operator will not perform a null check on the result -- the 3672 /// underlying allocator never returns null pointers. 3673 /// 3674 /// Usage looks like this (assuming there's an ASTContext 'Context' in scope): 3675 /// @code 3676 /// // Default alignment (8) 3677 /// char *data = new (Context) char[10]; 3678 /// // Specific alignment 3679 /// char *data = new (Context, 4) char[10]; 3680 /// @endcode 3681 /// Memory allocated through this placement new[] operator does not need to be 3682 /// explicitly freed, as ASTContext will free all of this memory when it gets 3683 /// destroyed. Please note that you cannot use delete on the pointer. 3684 /// 3685 /// @param Bytes The number of bytes to allocate. Calculated by the compiler. 3686 /// @param C The ASTContext that provides the allocator. 3687 /// @param Alignment The alignment of the allocated memory (if the underlying 3688 /// allocator supports it). 3689 /// @return The allocated memory. Could be nullptr. 3690 inline void *operator new[](size_t Bytes, const clang::ASTContext& C, 3691 size_t Alignment /* = 8 */) { 3692 return C.Allocate(Bytes, Alignment); 3693 } 3694 3695 /// Placement delete[] companion to the new[] above. 3696 /// 3697 /// This operator is just a companion to the new[] above. There is no way of 3698 /// invoking it directly; see the new[] operator for more details. This operator 3699 /// is called implicitly by the compiler if a placement new[] expression using 3700 /// the ASTContext throws in the object constructor. 3701 inline void operator delete[](void *Ptr, const clang::ASTContext &C, size_t) { 3702 C.Deallocate(Ptr); 3703 } 3704 3705 /// Create the representation of a LazyGenerationalUpdatePtr. 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 // Note, this is implemented here so that ExternalASTSource.h doesn't need to 3712 // include ASTContext.h. We explicitly instantiate it for all relevant types 3713 // in ASTContext.cpp. 3714 if (auto *Source = Ctx.getExternalSource()) 3715 return new (Ctx) LazyData(Source, Value); 3716 return Value; 3717 } 3718 3719 #endif // LLVM_CLANG_AST_ASTCONTEXT_H 3720