clang 22.0.0git
ASTContext.h
Go to the documentation of this file.
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"
21#include "clang/AST/Decl.h"
29#include "clang/Basic/LLVM.h"
32#include "llvm/ADT/DenseMap.h"
33#include "llvm/ADT/DenseMapInfo.h"
34#include "llvm/ADT/DenseSet.h"
35#include "llvm/ADT/FoldingSet.h"
36#include "llvm/ADT/IntrusiveRefCntPtr.h"
37#include "llvm/ADT/MapVector.h"
38#include "llvm/ADT/PointerIntPair.h"
39#include "llvm/ADT/PointerUnion.h"
40#include "llvm/ADT/SetVector.h"
41#include "llvm/ADT/SmallVector.h"
42#include "llvm/ADT/StringMap.h"
43#include "llvm/ADT/StringRef.h"
44#include "llvm/ADT/StringSet.h"
45#include "llvm/ADT/TinyPtrVector.h"
46#include "llvm/Support/TypeSize.h"
47#include <optional>
48
49namespace llvm {
50
51class APFixedPoint;
53struct fltSemantics;
54template <typename T, unsigned N> class SmallPtrSet;
55
58 unsigned NumElts;
59 unsigned NumFields;
60
61 bool operator==(const ScalableVecTyKey &RHS) const {
62 return EltTy == RHS.EltTy && NumElts == RHS.NumElts &&
63 NumFields == RHS.NumFields;
64 }
65};
66
67// Provide a DenseMapInfo specialization so that ScalableVecTyKey can be used
68// as a key in DenseMap.
69template <> struct DenseMapInfo<ScalableVecTyKey> {
70 static inline ScalableVecTyKey getEmptyKey() {
71 return {DenseMapInfo<clang::QualType>::getEmptyKey(), ~0U, ~0U};
72 }
74 return {DenseMapInfo<clang::QualType>::getTombstoneKey(), ~0U, ~0U};
75 }
76 static unsigned getHashValue(const ScalableVecTyKey &Val) {
77 return hash_combine(DenseMapInfo<clang::QualType>::getHashValue(Val.EltTy),
78 Val.NumElts, Val.NumFields);
79 }
80 static bool isEqual(const ScalableVecTyKey &LHS,
81 const ScalableVecTyKey &RHS) {
82 return LHS == RHS;
83 }
84};
85
86} // namespace llvm
87
88namespace clang {
89
90class APValue;
92class ASTRecordLayout;
93class AtomicExpr;
94class BlockExpr;
95struct BlockVarCopyInit;
97class CharUnits;
98class ConceptDecl;
99class CXXABI;
101class CXXMethodDecl;
102class CXXRecordDecl;
104class DynTypedNodeList;
105class Expr;
106enum class FloatModeKind;
107class GlobalDecl;
108class IdentifierTable;
109class LangOptions;
110class MangleContext;
113class Module;
114struct MSGuidDeclParts;
116class NoSanitizeList;
117class ObjCCategoryDecl;
120class ObjCImplDecl;
123class ObjCIvarDecl;
124class ObjCMethodDecl;
125class ObjCPropertyDecl;
127class ObjCProtocolDecl;
129class OMPTraitInfo;
130class ParentMapContext;
131struct ParsedTargetAttr;
132class Preprocessor;
133class ProfileList;
134class StoredDeclsMap;
135class TargetAttr;
136class TargetInfo;
137class TemplateDecl;
141class TypeConstraint;
143class UsingShadowDecl;
144class VarTemplateDecl;
147
148/// A simple array of base specifiers.
150
151namespace Builtin {
152
153class Context;
154
155} // namespace Builtin
156
158enum OpenCLTypeKind : uint8_t;
159
160namespace comments {
161
162class FullComment;
163
164} // namespace comments
165
166namespace interp {
167
168class Context;
169
170} // namespace interp
171
172namespace serialization {
173template <class> class AbstractTypeReader;
174} // namespace serialization
175
177 /// The alignment was not explicit in code.
179
180 /// The alignment comes from an alignment attribute on a typedef.
182
183 /// The alignment comes from an alignment attribute on a record type.
185
186 /// The alignment comes from an alignment attribute on a enum type.
188};
189
203
217
218/// Holds long-lived AST nodes (such as types and decls) that can be
219/// referred to throughout the semantic analysis of a file.
220class ASTContext : public RefCountedBase<ASTContext> {
222
223 mutable SmallVector<Type *, 0> Types;
224 mutable llvm::FoldingSet<ExtQuals> ExtQualNodes;
225 mutable llvm::FoldingSet<ComplexType> ComplexTypes;
226 mutable llvm::FoldingSet<PointerType> PointerTypes{GeneralTypesLog2InitSize};
227 mutable llvm::FoldingSet<AdjustedType> AdjustedTypes;
228 mutable llvm::FoldingSet<BlockPointerType> BlockPointerTypes;
229 mutable llvm::FoldingSet<LValueReferenceType> LValueReferenceTypes;
230 mutable llvm::FoldingSet<RValueReferenceType> RValueReferenceTypes;
231 mutable llvm::FoldingSet<MemberPointerType> MemberPointerTypes;
232 mutable llvm::ContextualFoldingSet<ConstantArrayType, ASTContext &>
233 ConstantArrayTypes;
234 mutable llvm::FoldingSet<IncompleteArrayType> IncompleteArrayTypes;
235 mutable std::vector<VariableArrayType*> VariableArrayTypes;
236 mutable llvm::ContextualFoldingSet<DependentSizedArrayType, ASTContext &>
237 DependentSizedArrayTypes;
238 mutable llvm::ContextualFoldingSet<DependentSizedExtVectorType, ASTContext &>
239 DependentSizedExtVectorTypes;
240 mutable llvm::ContextualFoldingSet<DependentAddressSpaceType, ASTContext &>
241 DependentAddressSpaceTypes;
242 mutable llvm::FoldingSet<VectorType> VectorTypes;
243 mutable llvm::ContextualFoldingSet<DependentVectorType, ASTContext &>
244 DependentVectorTypes;
245 mutable llvm::FoldingSet<ConstantMatrixType> MatrixTypes;
246 mutable llvm::ContextualFoldingSet<DependentSizedMatrixType, ASTContext &>
247 DependentSizedMatrixTypes;
248 mutable llvm::FoldingSet<FunctionNoProtoType> FunctionNoProtoTypes;
249 mutable llvm::ContextualFoldingSet<FunctionProtoType, ASTContext&>
250 FunctionProtoTypes;
251 mutable llvm::ContextualFoldingSet<DependentTypeOfExprType, ASTContext &>
252 DependentTypeOfExprTypes;
253 mutable llvm::ContextualFoldingSet<DependentDecltypeType, ASTContext &>
254 DependentDecltypeTypes;
255
256 mutable llvm::ContextualFoldingSet<PackIndexingType, ASTContext &>
257 DependentPackIndexingTypes;
258
259 mutable llvm::FoldingSet<TemplateTypeParmType> TemplateTypeParmTypes;
260 mutable llvm::FoldingSet<ObjCTypeParamType> ObjCTypeParamTypes;
261 mutable llvm::FoldingSet<SubstTemplateTypeParmType>
262 SubstTemplateTypeParmTypes;
263 mutable llvm::FoldingSet<SubstTemplateTypeParmPackType>
264 SubstTemplateTypeParmPackTypes;
265 mutable llvm::FoldingSet<SubstBuiltinTemplatePackType>
266 SubstBuiltinTemplatePackTypes;
267 mutable llvm::ContextualFoldingSet<TemplateSpecializationType, ASTContext&>
268 TemplateSpecializationTypes;
269 mutable llvm::FoldingSet<ParenType> ParenTypes{GeneralTypesLog2InitSize};
270 mutable llvm::FoldingSet<TagTypeFoldingSetPlaceholder> TagTypes;
271 mutable llvm::FoldingSet<FoldingSetPlaceholder<UnresolvedUsingType>>
272 UnresolvedUsingTypes;
273 mutable llvm::FoldingSet<UsingType> UsingTypes;
274 mutable llvm::FoldingSet<FoldingSetPlaceholder<TypedefType>> TypedefTypes;
275 mutable llvm::FoldingSet<DependentNameType> DependentNameTypes;
276 mutable llvm::FoldingSet<PackExpansionType> PackExpansionTypes;
277 mutable llvm::FoldingSet<ObjCObjectTypeImpl> ObjCObjectTypes;
278 mutable llvm::FoldingSet<ObjCObjectPointerType> ObjCObjectPointerTypes;
279 mutable llvm::FoldingSet<UnaryTransformType> UnaryTransformTypes;
280 // An AutoType can have a dependency on another AutoType via its template
281 // arguments. Since both dependent and dependency are on the same set,
282 // we can end up in an infinite recursion when looking for a node if we used
283 // a `FoldingSet`, since both could end up in the same bucket.
284 mutable llvm::DenseMap<llvm::FoldingSetNodeID, AutoType *> AutoTypes;
285 mutable llvm::FoldingSet<DeducedTemplateSpecializationType>
286 DeducedTemplateSpecializationTypes;
287 mutable llvm::FoldingSet<AtomicType> AtomicTypes;
288 mutable llvm::FoldingSet<AttributedType> AttributedTypes;
289 mutable llvm::FoldingSet<PipeType> PipeTypes;
290 mutable llvm::FoldingSet<BitIntType> BitIntTypes;
291 mutable llvm::ContextualFoldingSet<DependentBitIntType, ASTContext &>
292 DependentBitIntTypes;
293 mutable llvm::FoldingSet<BTFTagAttributedType> BTFTagAttributedTypes;
294 llvm::FoldingSet<HLSLAttributedResourceType> HLSLAttributedResourceTypes;
295 llvm::FoldingSet<HLSLInlineSpirvType> HLSLInlineSpirvTypes;
296
297 mutable llvm::FoldingSet<CountAttributedType> CountAttributedTypes;
298
299 mutable llvm::FoldingSet<QualifiedTemplateName> QualifiedTemplateNames;
300 mutable llvm::FoldingSet<DependentTemplateName> DependentTemplateNames;
301 mutable llvm::FoldingSet<SubstTemplateTemplateParmStorage>
302 SubstTemplateTemplateParms;
303 mutable llvm::ContextualFoldingSet<SubstTemplateTemplateParmPackStorage,
304 ASTContext&>
305 SubstTemplateTemplateParmPacks;
306 mutable llvm::ContextualFoldingSet<DeducedTemplateStorage, ASTContext &>
307 DeducedTemplates;
308
309 mutable llvm::ContextualFoldingSet<ArrayParameterType, ASTContext &>
310 ArrayParameterTypes;
311
312 /// Store the unique Type corresponding to each Kind.
313 mutable std::array<Type *,
314 llvm::to_underlying(PredefinedSugarType::Kind::Last) + 1>
315 PredefinedSugarTypes{};
316
317 /// Internal storage for NestedNameSpecifiers.
318 ///
319 /// This set is managed by the NestedNameSpecifier class.
320 mutable llvm::FoldingSet<NamespaceAndPrefixStorage>
321 NamespaceAndPrefixStorages;
322
323 /// A cache mapping from RecordDecls to ASTRecordLayouts.
324 ///
325 /// This is lazily created. This is intentionally not serialized.
326 mutable llvm::DenseMap<const RecordDecl*, const ASTRecordLayout*>
327 ASTRecordLayouts;
328 mutable llvm::DenseMap<const ObjCInterfaceDecl *, const ASTRecordLayout *>
329 ObjCLayouts;
330
331 /// A cache from types to size and alignment information.
332 using TypeInfoMap = llvm::DenseMap<const Type *, struct TypeInfo>;
333 mutable TypeInfoMap MemoizedTypeInfo;
334
335 /// A cache from types to unadjusted alignment information. Only ARM and
336 /// AArch64 targets need this information, keeping it separate prevents
337 /// imposing overhead on TypeInfo size.
338 using UnadjustedAlignMap = llvm::DenseMap<const Type *, unsigned>;
339 mutable UnadjustedAlignMap MemoizedUnadjustedAlign;
340
341 /// A cache mapping from CXXRecordDecls to key functions.
342 llvm::DenseMap<const CXXRecordDecl*, LazyDeclPtr> KeyFunctions;
343
344 /// Mapping from ObjCContainers to their ObjCImplementations.
345 llvm::DenseMap<ObjCContainerDecl*, ObjCImplDecl*> ObjCImpls;
346
347 /// Mapping from ObjCMethod to its duplicate declaration in the same
348 /// interface.
349 llvm::DenseMap<const ObjCMethodDecl*,const ObjCMethodDecl*> ObjCMethodRedecls;
350
351 /// Mapping from __block VarDecls to BlockVarCopyInit.
352 llvm::DenseMap<const VarDecl *, BlockVarCopyInit> BlockVarCopyInits;
353
354 /// Mapping from GUIDs to the corresponding MSGuidDecl.
355 mutable llvm::FoldingSet<MSGuidDecl> MSGuidDecls;
356
357 /// Mapping from APValues to the corresponding UnnamedGlobalConstantDecl.
358 mutable llvm::FoldingSet<UnnamedGlobalConstantDecl>
359 UnnamedGlobalConstantDecls;
360
361 /// Mapping from APValues to the corresponding TemplateParamObjects.
362 mutable llvm::FoldingSet<TemplateParamObjectDecl> TemplateParamObjectDecls;
363
364 /// A cache mapping a string value to a StringLiteral object with the same
365 /// value.
366 ///
367 /// This is lazily created. This is intentionally not serialized.
368 mutable llvm::StringMap<StringLiteral *> StringLiteralCache;
369
370 mutable llvm::DenseSet<const FunctionDecl *> DestroyingOperatorDeletes;
371 mutable llvm::DenseSet<const FunctionDecl *> TypeAwareOperatorNewAndDeletes;
372
373 /// Global and array operators delete are only required for MSVC deleting
374 /// destructors support. Store them here to avoid keeping 4 pointers that are
375 /// not always used in each redeclaration of the destructor.
376 mutable llvm::DenseMap<const CXXDestructorDecl *, FunctionDecl *>
377 OperatorDeletesForVirtualDtor;
378 mutable llvm::DenseMap<const CXXDestructorDecl *, FunctionDecl *>
379 GlobalOperatorDeletesForVirtualDtor;
380 mutable llvm::DenseMap<const CXXDestructorDecl *, FunctionDecl *>
381 ArrayOperatorDeletesForVirtualDtor;
382 mutable llvm::DenseMap<const CXXDestructorDecl *, FunctionDecl *>
383 GlobalArrayOperatorDeletesForVirtualDtor;
384
385 /// To remember which types did require a vector deleting dtor.
386 llvm::DenseSet<const CXXRecordDecl *> RequireVectorDeletingDtor;
387
388 /// The next string literal "version" to allocate during constant evaluation.
389 /// This is used to distinguish between repeated evaluations of the same
390 /// string literal.
391 ///
392 /// We don't need to serialize this because constants get re-evaluated in the
393 /// current file before they are compared locally.
394 unsigned NextStringLiteralVersion = 0;
395
396 /// MD5 hash of CUID. It is calculated when first used and cached by this
397 /// data member.
398 mutable std::string CUIDHash;
399
400 /// Representation of a "canonical" template template parameter that
401 /// is used in canonical template names.
402 class CanonicalTemplateTemplateParm : public llvm::FoldingSetNode {
403 TemplateTemplateParmDecl *Parm;
404
405 public:
406 CanonicalTemplateTemplateParm(TemplateTemplateParmDecl *Parm)
407 : Parm(Parm) {}
408
409 TemplateTemplateParmDecl *getParam() const { return Parm; }
410
411 void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &C) {
412 Profile(ID, C, Parm);
413 }
414
415 static void Profile(llvm::FoldingSetNodeID &ID,
416 const ASTContext &C,
417 TemplateTemplateParmDecl *Parm);
418 };
419 mutable llvm::ContextualFoldingSet<CanonicalTemplateTemplateParm,
420 const ASTContext&>
421 CanonTemplateTemplateParms;
422
423 /// The typedef for the __int128_t type.
424 mutable TypedefDecl *Int128Decl = nullptr;
425
426 /// The typedef for the __uint128_t type.
427 mutable TypedefDecl *UInt128Decl = nullptr;
428
429 /// The typedef for the target specific predefined
430 /// __builtin_va_list type.
431 mutable TypedefDecl *BuiltinVaListDecl = nullptr;
432
433 /// The typedef for the predefined \c __builtin_ms_va_list type.
434 mutable TypedefDecl *BuiltinMSVaListDecl = nullptr;
435
436 /// The typedef for the predefined \c id type.
437 mutable TypedefDecl *ObjCIdDecl = nullptr;
438
439 /// The typedef for the predefined \c SEL type.
440 mutable TypedefDecl *ObjCSelDecl = nullptr;
441
442 /// The typedef for the predefined \c Class type.
443 mutable TypedefDecl *ObjCClassDecl = nullptr;
444
445 /// The typedef for the predefined \c Protocol class in Objective-C.
446 mutable ObjCInterfaceDecl *ObjCProtocolClassDecl = nullptr;
447
448 /// The typedef for the predefined 'BOOL' type.
449 mutable TypedefDecl *BOOLDecl = nullptr;
450
451 // Typedefs which may be provided defining the structure of Objective-C
452 // pseudo-builtins
453 QualType ObjCIdRedefinitionType;
454 QualType ObjCClassRedefinitionType;
455 QualType ObjCSelRedefinitionType;
456
457 /// The identifier 'bool'.
458 mutable IdentifierInfo *BoolName = nullptr;
459
460 /// The identifier 'NSObject'.
461 mutable IdentifierInfo *NSObjectName = nullptr;
462
463 /// The identifier 'NSCopying'.
464 IdentifierInfo *NSCopyingName = nullptr;
465
466#define BuiltinTemplate(BTName) mutable IdentifierInfo *Name##BTName = nullptr;
467#include "clang/Basic/BuiltinTemplates.inc"
468
469 QualType ObjCConstantStringType;
470 mutable RecordDecl *CFConstantStringTagDecl = nullptr;
471 mutable TypedefDecl *CFConstantStringTypeDecl = nullptr;
472
473 mutable QualType ObjCSuperType;
474
475 QualType ObjCNSStringType;
476
477 /// The typedef declaration for the Objective-C "instancetype" type.
478 TypedefDecl *ObjCInstanceTypeDecl = nullptr;
479
480 /// The type for the C FILE type.
481 TypeDecl *FILEDecl = nullptr;
482
483 /// The type for the C jmp_buf type.
484 TypeDecl *jmp_bufDecl = nullptr;
485
486 /// The type for the C sigjmp_buf type.
487 TypeDecl *sigjmp_bufDecl = nullptr;
488
489 /// The type for the C ucontext_t type.
490 TypeDecl *ucontext_tDecl = nullptr;
491
492 /// Type for the Block descriptor for Blocks CodeGen.
493 ///
494 /// Since this is only used for generation of debug info, it is not
495 /// serialized.
496 mutable RecordDecl *BlockDescriptorType = nullptr;
497
498 /// Type for the Block descriptor for Blocks CodeGen.
499 ///
500 /// Since this is only used for generation of debug info, it is not
501 /// serialized.
502 mutable RecordDecl *BlockDescriptorExtendedType = nullptr;
503
504 /// Declaration for the CUDA cudaConfigureCall function.
505 FunctionDecl *cudaConfigureCallDecl = nullptr;
506 /// Declaration for the CUDA cudaGetParameterBuffer function.
507 FunctionDecl *cudaGetParameterBufferDecl = nullptr;
508 /// Declaration for the CUDA cudaLaunchDevice function.
509 FunctionDecl *cudaLaunchDeviceDecl = nullptr;
510
511 /// Keeps track of all declaration attributes.
512 ///
513 /// Since so few decls have attrs, we keep them in a hash map instead of
514 /// wasting space in the Decl class.
515 llvm::DenseMap<const Decl*, AttrVec*> DeclAttrs;
516
517 /// A mapping from non-redeclarable declarations in modules that were
518 /// merged with other declarations to the canonical declaration that they were
519 /// merged into.
520 llvm::DenseMap<Decl*, Decl*> MergedDecls;
521
522 /// A mapping from a defining declaration to a list of modules (other
523 /// than the owning module of the declaration) that contain merged
524 /// definitions of that entity.
525 llvm::DenseMap<NamedDecl*, llvm::TinyPtrVector<Module*>> MergedDefModules;
526
527 /// Initializers for a module, in order. Each Decl will be either
528 /// something that has a semantic effect on startup (such as a variable with
529 /// a non-constant initializer), or an ImportDecl (which recursively triggers
530 /// initialization of another module).
531 struct PerModuleInitializers {
532 llvm::SmallVector<Decl*, 4> Initializers;
533 llvm::SmallVector<GlobalDeclID, 4> LazyInitializers;
534
535 void resolve(ASTContext &Ctx);
536 };
537 llvm::DenseMap<Module*, PerModuleInitializers*> ModuleInitializers;
538
539 /// This is the top-level (C++20) Named module we are building.
540 Module *CurrentCXXNamedModule = nullptr;
541
542 /// Help structures to decide whether two `const Module *` belongs
543 /// to the same conceptual module to avoid the expensive to string comparison
544 /// if possible.
545 ///
546 /// Not serialized intentionally.
547 mutable llvm::StringMap<const Module *> PrimaryModuleNameMap;
548 mutable llvm::DenseMap<const Module *, const Module *> SameModuleLookupSet;
549
550 static constexpr unsigned ConstantArrayTypesLog2InitSize = 8;
551 static constexpr unsigned GeneralTypesLog2InitSize = 9;
552 static constexpr unsigned FunctionProtoTypesLog2InitSize = 12;
553
554 /// A mapping from an ObjC class to its subclasses.
555 llvm::DenseMap<const ObjCInterfaceDecl *,
556 SmallVector<const ObjCInterfaceDecl *, 4>>
557 ObjCSubClasses;
558
559 // A mapping from Scalable Vector Type keys to their corresponding QualType.
560 mutable llvm::DenseMap<llvm::ScalableVecTyKey, QualType> ScalableVecTyMap;
561
562 ASTContext &this_() { return *this; }
563
564public:
565 /// A type synonym for the TemplateOrInstantiation mapping.
567 llvm::PointerUnion<VarTemplateDecl *, MemberSpecializationInfo *>;
568
569private:
570 friend class ASTDeclReader;
571 friend class ASTReader;
572 friend class ASTWriter;
573 template <class> friend class serialization::AbstractTypeReader;
574 friend class CXXRecordDecl;
575 friend class IncrementalParser;
576
577 /// A mapping to contain the template or declaration that
578 /// a variable declaration describes or was instantiated from,
579 /// respectively.
580 ///
581 /// For non-templates, this value will be NULL. For variable
582 /// declarations that describe a variable template, this will be a
583 /// pointer to a VarTemplateDecl. For static data members
584 /// of class template specializations, this will be the
585 /// MemberSpecializationInfo referring to the member variable that was
586 /// instantiated or specialized. Thus, the mapping will keep track of
587 /// the static data member templates from which static data members of
588 /// class template specializations were instantiated.
589 ///
590 /// Given the following example:
591 ///
592 /// \code
593 /// template<typename T>
594 /// struct X {
595 /// static T value;
596 /// };
597 ///
598 /// template<typename T>
599 /// T X<T>::value = T(17);
600 ///
601 /// int *x = &X<int>::value;
602 /// \endcode
603 ///
604 /// This mapping will contain an entry that maps from the VarDecl for
605 /// X<int>::value to the corresponding VarDecl for X<T>::value (within the
606 /// class template X) and will be marked TSK_ImplicitInstantiation.
607 llvm::DenseMap<const VarDecl *, TemplateOrSpecializationInfo>
608 TemplateOrInstantiation;
609
610 /// Keeps track of the declaration from which a using declaration was
611 /// created during instantiation.
612 ///
613 /// The source and target declarations are always a UsingDecl, an
614 /// UnresolvedUsingValueDecl, or an UnresolvedUsingTypenameDecl.
615 ///
616 /// For example:
617 /// \code
618 /// template<typename T>
619 /// struct A {
620 /// void f();
621 /// };
622 ///
623 /// template<typename T>
624 /// struct B : A<T> {
625 /// using A<T>::f;
626 /// };
627 ///
628 /// template struct B<int>;
629 /// \endcode
630 ///
631 /// This mapping will contain an entry that maps from the UsingDecl in
632 /// B<int> to the UnresolvedUsingDecl in B<T>.
633 llvm::DenseMap<NamedDecl *, NamedDecl *> InstantiatedFromUsingDecl;
634
635 /// Like InstantiatedFromUsingDecl, but for using-enum-declarations. Maps
636 /// from the instantiated using-enum to the templated decl from whence it
637 /// came.
638 /// Note that using-enum-declarations cannot be dependent and
639 /// thus will never be instantiated from an "unresolved"
640 /// version thereof (as with using-declarations), so each mapping is from
641 /// a (resolved) UsingEnumDecl to a (resolved) UsingEnumDecl.
642 llvm::DenseMap<UsingEnumDecl *, UsingEnumDecl *>
643 InstantiatedFromUsingEnumDecl;
644
645 /// Similarly maps instantiated UsingShadowDecls to their origin.
646 llvm::DenseMap<UsingShadowDecl*, UsingShadowDecl*>
647 InstantiatedFromUsingShadowDecl;
648
649 llvm::DenseMap<FieldDecl *, FieldDecl *> InstantiatedFromUnnamedFieldDecl;
650
651 /// Mapping that stores the methods overridden by a given C++
652 /// member function.
653 ///
654 /// Since most C++ member functions aren't virtual and therefore
655 /// don't override anything, we store the overridden functions in
656 /// this map on the side rather than within the CXXMethodDecl structure.
657 using CXXMethodVector = llvm::TinyPtrVector<const CXXMethodDecl *>;
658 llvm::DenseMap<const CXXMethodDecl *, CXXMethodVector> OverriddenMethods;
659
660 /// Mapping from each declaration context to its corresponding
661 /// mangling numbering context (used for constructs like lambdas which
662 /// need to be consistently numbered for the mangler).
663 llvm::DenseMap<const DeclContext *, std::unique_ptr<MangleNumberingContext>>
664 MangleNumberingContexts;
665 llvm::DenseMap<const Decl *, std::unique_ptr<MangleNumberingContext>>
666 ExtraMangleNumberingContexts;
667
668 /// Side-table of mangling numbers for declarations which rarely
669 /// need them (like static local vars).
670 llvm::MapVector<const NamedDecl *, unsigned> MangleNumbers;
671 llvm::MapVector<const VarDecl *, unsigned> StaticLocalNumbers;
672 /// Mapping the associated device lambda mangling number if present.
673 mutable llvm::DenseMap<const CXXRecordDecl *, unsigned>
674 DeviceLambdaManglingNumbers;
675
676 /// Mapping that stores parameterIndex values for ParmVarDecls when
677 /// that value exceeds the bitfield size of ParmVarDeclBits.ParameterIndex.
678 using ParameterIndexTable = llvm::DenseMap<const VarDecl *, unsigned>;
679 ParameterIndexTable ParamIndices;
680
681public:
686 std::optional<CXXRecordDeclRelocationInfo>
690
691 /// Examines a given type, and returns whether the type itself
692 /// is address discriminated, or any transitively embedded types
693 /// contain data that is address discriminated. This includes
694 /// implicitly authenticated values like vtable pointers, as well as
695 /// explicitly qualified fields.
697 if (!isPointerAuthenticationAvailable())
698 return false;
699 return findPointerAuthContent(T) != PointerAuthContent::None;
700 }
701
702 /// Examines a given type, and returns whether the type itself
703 /// or any data it transitively contains has a pointer authentication
704 /// schema that is not safely relocatable. e.g. any data or fields
705 /// with address discrimination other than any otherwise similar
706 /// vtable pointers.
708 if (!isPointerAuthenticationAvailable())
709 return false;
710 return findPointerAuthContent(T) != PointerAuthContent::None;
711 }
712
713private:
714 llvm::DenseMap<const CXXRecordDecl *, CXXRecordDeclRelocationInfo>
715 RelocatableClasses;
716
717 // FIXME: store in RecordDeclBitfields in future?
718 enum class PointerAuthContent : uint8_t {
719 None,
720 AddressDiscriminatedVTable,
721 AddressDiscriminatedData
722 };
723
724 // A simple helper function to short circuit pointer auth checks.
725 bool isPointerAuthenticationAvailable() const {
726 return LangOpts.PointerAuthCalls || LangOpts.PointerAuthIntrinsics;
727 }
728 PointerAuthContent findPointerAuthContent(QualType T) const;
729 mutable llvm::DenseMap<const RecordDecl *, PointerAuthContent>
730 RecordContainsAddressDiscriminatedPointerAuth;
731
732 ImportDecl *FirstLocalImport = nullptr;
733 ImportDecl *LastLocalImport = nullptr;
734
735 TranslationUnitDecl *TUDecl = nullptr;
736 mutable ExternCContextDecl *ExternCContext = nullptr;
737
738#define BuiltinTemplate(BTName) \
739 mutable BuiltinTemplateDecl *Decl##BTName = nullptr;
740#include "clang/Basic/BuiltinTemplates.inc"
741
742 /// The associated SourceManager object.
743 SourceManager &SourceMgr;
744
745 /// The language options used to create the AST associated with
746 /// this ASTContext object.
747 LangOptions &LangOpts;
748
749 /// NoSanitizeList object that is used by sanitizers to decide which
750 /// entities should not be instrumented.
751 std::unique_ptr<NoSanitizeList> NoSanitizeL;
752
753 /// Function filtering mechanism to determine whether a given function
754 /// should be imbued with the XRay "always" or "never" attributes.
755 std::unique_ptr<XRayFunctionFilter> XRayFilter;
756
757 /// ProfileList object that is used by the profile instrumentation
758 /// to decide which entities should be instrumented.
759 std::unique_ptr<ProfileList> ProfList;
760
761 /// The allocator used to create AST objects.
762 ///
763 /// AST objects are never destructed; rather, all memory associated with the
764 /// AST objects will be released when the ASTContext itself is destroyed.
765 mutable llvm::BumpPtrAllocator BumpAlloc;
766
767 /// Allocator for partial diagnostics.
769
770 /// The current C++ ABI.
771 std::unique_ptr<CXXABI> ABI;
772 CXXABI *createCXXABI(const TargetInfo &T);
773
774 /// Address space map mangling must be used with language specific
775 /// address spaces (e.g. OpenCL/CUDA)
776 bool AddrSpaceMapMangling;
777
778 /// For performance, track whether any function effects are in use.
779 mutable bool AnyFunctionEffects = false;
780
781 const TargetInfo *Target = nullptr;
782 const TargetInfo *AuxTarget = nullptr;
783 clang::PrintingPolicy PrintingPolicy;
784 std::unique_ptr<interp::Context> InterpContext;
785 std::unique_ptr<ParentMapContext> ParentMapCtx;
786
787 /// Keeps track of the deallocated DeclListNodes for future reuse.
788 DeclListNode *ListNodeFreeList = nullptr;
789
790public:
798
799 /// Returns the clang bytecode interpreter context.
801
803 /// Do not allow wrong-sided variables in constant expressions.
804 bool NoWrongSidedVars = false;
815
816 /// Returns the dynamic AST node parent map context.
818
819 // A traversal scope limits the parts of the AST visible to certain analyses.
820 // RecursiveASTVisitor only visits specified children of TranslationUnitDecl.
821 // getParents() will only observe reachable parent edges.
822 //
823 // The scope is defined by a set of "top-level" declarations which will be
824 // visible under the TranslationUnitDecl.
825 // Initially, it is the entire TU, represented by {getTranslationUnitDecl()}.
826 //
827 // After setTraversalScope({foo, bar}), the exposed AST looks like:
828 // TranslationUnitDecl
829 // - foo
830 // - ...
831 // - bar
832 // - ...
833 // All other siblings of foo and bar are pruned from the tree.
834 // (However they are still accessible via TranslationUnitDecl->decls())
835 //
836 // Changing the scope clears the parent cache, which is expensive to rebuild.
837 ArrayRef<Decl *> getTraversalScope() const { return TraversalScope; }
838 void setTraversalScope(const std::vector<Decl *> &);
839
840 /// Forwards to get node parents from the ParentMapContext. New callers should
841 /// use ParentMapContext::getParents() directly.
842 template <typename NodeT> DynTypedNodeList getParents(const NodeT &Node);
843
845 return PrintingPolicy;
846 }
847
849 PrintingPolicy = Policy;
850 }
851
852 SourceManager& getSourceManager() { return SourceMgr; }
853 const SourceManager& getSourceManager() const { return SourceMgr; }
854
855 // Cleans up some of the data structures. This allows us to do cleanup
856 // normally done in the destructor earlier. Renders much of the ASTContext
857 // unusable, mostly the actual AST nodes, so should be called when we no
858 // longer need access to the AST.
859 void cleanup();
860
861 llvm::BumpPtrAllocator &getAllocator() const {
862 return BumpAlloc;
863 }
864
865 void *Allocate(size_t Size, unsigned Align = 8) const {
866 return BumpAlloc.Allocate(Size, Align);
867 }
868 template <typename T> T *Allocate(size_t Num = 1) const {
869 return static_cast<T *>(Allocate(Num * sizeof(T), alignof(T)));
870 }
871 void Deallocate(void *Ptr) const {}
872
873 llvm::StringRef backupStr(llvm::StringRef S) const {
874 char *Buf = new (*this) char[S.size()];
875 llvm::copy(S, Buf);
876 return llvm::StringRef(Buf, S.size());
877 }
878
879 /// Allocates a \c DeclListNode or returns one from the \c ListNodeFreeList
880 /// pool.
882 if (DeclListNode *Alloc = ListNodeFreeList) {
883 ListNodeFreeList = dyn_cast_if_present<DeclListNode *>(Alloc->Rest);
884 Alloc->D = ND;
885 Alloc->Rest = nullptr;
886 return Alloc;
887 }
888 return new (*this) DeclListNode(ND);
889 }
890 /// Deallocates a \c DeclListNode by returning it to the \c ListNodeFreeList
891 /// pool.
893 N->Rest = ListNodeFreeList;
894 ListNodeFreeList = N;
895 }
896
897 /// Return the total amount of physical memory allocated for representing
898 /// AST nodes and type information.
899 size_t getASTAllocatedMemory() const {
900 return BumpAlloc.getTotalMemory();
901 }
902
903 /// Return the total memory used for various side tables.
904 size_t getSideTableAllocatedMemory() const;
905
907 return DiagAllocator;
908 }
909
910 const TargetInfo &getTargetInfo() const { return *Target; }
911 const TargetInfo *getAuxTargetInfo() const { return AuxTarget; }
912
913 const QualType GetHigherPrecisionFPType(QualType ElementType) const {
914 const auto *CurrentBT = cast<BuiltinType>(ElementType);
915 switch (CurrentBT->getKind()) {
916 case BuiltinType::Kind::Half:
917 case BuiltinType::Kind::Float16:
918 return FloatTy;
919 case BuiltinType::Kind::Float:
920 case BuiltinType::Kind::BFloat16:
921 return DoubleTy;
922 case BuiltinType::Kind::Double:
923 return LongDoubleTy;
924 default:
925 return ElementType;
926 }
927 return ElementType;
928 }
929
930 /// getIntTypeForBitwidth -
931 /// sets integer QualTy according to specified details:
932 /// bitwidth, signed/unsigned.
933 /// Returns empty type if there is no appropriate target types.
934 QualType getIntTypeForBitwidth(unsigned DestWidth,
935 unsigned Signed) const;
936
937 /// getRealTypeForBitwidth -
938 /// sets floating point QualTy according to specified bitwidth.
939 /// Returns empty type if there is no appropriate target types.
940 QualType getRealTypeForBitwidth(unsigned DestWidth,
941 FloatModeKind ExplicitType) const;
942
943 bool AtomicUsesUnsupportedLibcall(const AtomicExpr *E) const;
944
945 const LangOptions& getLangOpts() const { return LangOpts; }
946
947 // If this condition is false, typo correction must be performed eagerly
948 // rather than delayed in many places, as it makes use of dependent types.
949 // the condition is false for clang's C-only codepath, as it doesn't support
950 // dependent types yet.
951 bool isDependenceAllowed() const {
952 return LangOpts.CPlusPlus || LangOpts.RecoveryAST;
953 }
954
955 const NoSanitizeList &getNoSanitizeList() const { return *NoSanitizeL; }
956
958 const QualType &Ty) const;
959
961 return *XRayFilter;
962 }
963
964 const ProfileList &getProfileList() const { return *ProfList; }
965
967
969 return FullSourceLoc(Loc,SourceMgr);
970 }
971
972 /// Return the C++ ABI kind that should be used. The C++ ABI can be overriden
973 /// at compile time with `-fc++-abi=`. If this is not provided, we instead use
974 /// the default ABI set by the target.
976
977 /// All comments in this translation unit.
979
980 /// True if comments are already loaded from ExternalASTSource.
981 mutable bool CommentsLoaded = false;
982
983 /// Mapping from declaration to directly attached comment.
984 ///
985 /// Raw comments are owned by Comments list. This mapping is populated
986 /// lazily.
987 mutable llvm::DenseMap<const Decl *, const RawComment *> DeclRawComments;
988
989 /// Mapping from canonical declaration to the first redeclaration in chain
990 /// that has a comment attached.
991 ///
992 /// Raw comments are owned by Comments list. This mapping is populated
993 /// lazily.
994 mutable llvm::DenseMap<const Decl *, const Decl *> RedeclChainComments;
995
996 /// Keeps track of redeclaration chains that don't have any comment attached.
997 /// Mapping from canonical declaration to redeclaration chain that has no
998 /// comments attached to any redeclaration. Specifically it's mapping to
999 /// the last redeclaration we've checked.
1000 ///
1001 /// Shall not contain declarations that have comments attached to any
1002 /// redeclaration in their chain.
1003 mutable llvm::DenseMap<const Decl *, const Decl *> CommentlessRedeclChains;
1004
1005 /// Mapping from declarations to parsed comments attached to any
1006 /// redeclaration.
1007 mutable llvm::DenseMap<const Decl *, comments::FullComment *> ParsedComments;
1008
1009 /// Attaches \p Comment to \p OriginalD and to its redeclaration chain
1010 /// and removes the redeclaration chain from the set of commentless chains.
1011 ///
1012 /// Don't do anything if a comment has already been attached to \p OriginalD
1013 /// or its redeclaration chain.
1014 void cacheRawCommentForDecl(const Decl &OriginalD,
1015 const RawComment &Comment) const;
1016
1017 /// \returns searches \p CommentsInFile for doc comment for \p D.
1018 ///
1019 /// \p RepresentativeLocForDecl is used as a location for searching doc
1020 /// comments. \p CommentsInFile is a mapping offset -> comment of files in the
1021 /// same file where \p RepresentativeLocForDecl is.
1023 const Decl *D, const SourceLocation RepresentativeLocForDecl,
1024 const std::map<unsigned, RawComment *> &CommentsInFile) const;
1025
1026 /// Return the documentation comment attached to a given declaration,
1027 /// without looking into cache.
1029
1030public:
1031 void addComment(const RawComment &RC);
1032
1033 /// Return the documentation comment attached to a given declaration.
1034 /// Returns nullptr if no comment is attached.
1035 ///
1036 /// \param OriginalDecl if not nullptr, is set to declaration AST node that
1037 /// had the comment, if the comment we found comes from a redeclaration.
1038 const RawComment *
1040 const Decl **OriginalDecl = nullptr) const;
1041
1042 /// Searches existing comments for doc comments that should be attached to \p
1043 /// Decls. If any doc comment is found, it is parsed.
1044 ///
1045 /// Requirement: All \p Decls are in the same file.
1046 ///
1047 /// If the last comment in the file is already attached we assume
1048 /// there are not comments left to be attached to \p Decls.
1050 const Preprocessor *PP);
1051
1052 /// Return parsed documentation comment attached to a given declaration.
1053 /// Returns nullptr if no comment is attached.
1054 ///
1055 /// \param PP the Preprocessor used with this TU. Could be nullptr if
1056 /// preprocessor is not available.
1058 const Preprocessor *PP) const;
1059
1060 /// Return parsed documentation comment attached to a given declaration.
1061 /// Returns nullptr if no comment is attached. Does not look at any
1062 /// redeclarations of the declaration.
1064
1066 const Decl *D) const;
1067
1068private:
1069 mutable comments::CommandTraits CommentCommandTraits;
1070
1071 /// Iterator that visits import declarations.
1072 class import_iterator {
1073 ImportDecl *Import = nullptr;
1074
1075 public:
1076 using value_type = ImportDecl *;
1077 using reference = ImportDecl *;
1078 using pointer = ImportDecl *;
1079 using difference_type = int;
1080 using iterator_category = std::forward_iterator_tag;
1081
1082 import_iterator() = default;
1083 explicit import_iterator(ImportDecl *Import) : Import(Import) {}
1084
1085 reference operator*() const { return Import; }
1086 pointer operator->() const { return Import; }
1087
1088 import_iterator &operator++() {
1089 Import = ASTContext::getNextLocalImport(Import);
1090 return *this;
1091 }
1092
1093 import_iterator operator++(int) {
1094 import_iterator Other(*this);
1095 ++(*this);
1096 return Other;
1097 }
1098
1099 friend bool operator==(import_iterator X, import_iterator Y) {
1100 return X.Import == Y.Import;
1101 }
1102
1103 friend bool operator!=(import_iterator X, import_iterator Y) {
1104 return X.Import != Y.Import;
1105 }
1106 };
1107
1108public:
1110 return CommentCommandTraits;
1111 }
1112
1113 /// Retrieve the attributes for the given declaration.
1114 AttrVec& getDeclAttrs(const Decl *D);
1115
1116 /// Erase the attributes corresponding to the given declaration.
1117 void eraseDeclAttrs(const Decl *D);
1118
1119 /// If this variable is an instantiated static data member of a
1120 /// class template specialization, returns the templated static data member
1121 /// from which it was instantiated.
1122 // FIXME: Remove ?
1124 const VarDecl *Var);
1125
1126 /// Note that the static data member \p Inst is an instantiation of
1127 /// the static data member template \p Tmpl of a class template.
1130 SourceLocation PointOfInstantiation = SourceLocation());
1131
1134
1137
1138 /// If the given using decl \p Inst is an instantiation of
1139 /// another (possibly unresolved) using decl, return it.
1141
1142 /// Remember that the using decl \p Inst is an instantiation
1143 /// of the using decl \p Pattern of a class template.
1144 void setInstantiatedFromUsingDecl(NamedDecl *Inst, NamedDecl *Pattern);
1145
1146 /// If the given using-enum decl \p Inst is an instantiation of
1147 /// another using-enum decl, return it.
1149
1150 /// Remember that the using enum decl \p Inst is an instantiation
1151 /// of the using enum decl \p Pattern of a class template.
1153 UsingEnumDecl *Pattern);
1154
1157 UsingShadowDecl *Pattern);
1158
1160
1162
1163 // Access to the set of methods overridden by the given C++ method.
1164 using overridden_cxx_method_iterator = CXXMethodVector::const_iterator;
1167
1170
1171 unsigned overridden_methods_size(const CXXMethodDecl *Method) const;
1172
1174 llvm::iterator_range<overridden_cxx_method_iterator>;
1175
1177
1178 /// Note that the given C++ \p Method overrides the given \p
1179 /// Overridden method.
1181 const CXXMethodDecl *Overridden);
1182
1183 /// Return C++ or ObjC overridden methods for the given \p Method.
1184 ///
1185 /// An ObjC method is considered to override any method in the class's
1186 /// base classes, its protocols, or its categories' protocols, that has
1187 /// the same selector and is of the same kind (class or instance).
1188 /// A method in an implementation is not considered as overriding the same
1189 /// method in the interface or its categories.
1191 const NamedDecl *Method,
1192 SmallVectorImpl<const NamedDecl *> &Overridden) const;
1193
1194 /// Notify the AST context that a new import declaration has been
1195 /// parsed or implicitly created within this translation unit.
1196 void addedLocalImportDecl(ImportDecl *Import);
1197
1199 return Import->getNextLocalImport();
1200 }
1201
1202 using import_range = llvm::iterator_range<import_iterator>;
1203
1205 return import_range(import_iterator(FirstLocalImport), import_iterator());
1206 }
1207
1209 Decl *Result = MergedDecls.lookup(D);
1210 return Result ? Result : D;
1211 }
1212 void setPrimaryMergedDecl(Decl *D, Decl *Primary) {
1213 MergedDecls[D] = Primary;
1214 }
1215
1216 /// Note that the definition \p ND has been merged into module \p M,
1217 /// and should be visible whenever \p M is visible.
1219 bool NotifyListeners = true);
1220
1221 /// Clean up the merged definition list. Call this if you might have
1222 /// added duplicates into the list.
1224
1225 /// Get the additional modules in which the definition \p Def has
1226 /// been merged.
1228
1229 /// Add a declaration to the list of declarations that are initialized
1230 /// for a module. This will typically be a global variable (with internal
1231 /// linkage) that runs module initializers, such as the iostream initializer,
1232 /// or an ImportDecl nominating another module that has initializers.
1234
1236
1237 /// Get the initializations to perform when importing a module, if any.
1239
1240 /// Set the (C++20) module we are building.
1242
1243 /// Get module under construction, nullptr if this is not a C++20 module.
1244 Module *getCurrentNamedModule() const { return CurrentCXXNamedModule; }
1245
1246 /// If the two module \p M1 and \p M2 are in the same module.
1247 ///
1248 /// FIXME: The signature may be confusing since `clang::Module` means to
1249 /// a module fragment or a module unit but not a C++20 module.
1250 bool isInSameModule(const Module *M1, const Module *M2) const;
1251
1253 assert(TUDecl->getMostRecentDecl() == TUDecl &&
1254 "The active TU is not current one!");
1255 return TUDecl->getMostRecentDecl();
1256 }
1258 assert(!TUDecl || TUKind == TU_Incremental);
1260 if (TraversalScope.empty() || TraversalScope.back() == TUDecl)
1261 TraversalScope = {NewTUDecl};
1262 if (TUDecl)
1263 NewTUDecl->setPreviousDecl(TUDecl);
1264 TUDecl = NewTUDecl;
1265 }
1266
1268
1269#define BuiltinTemplate(BTName) BuiltinTemplateDecl *get##BTName##Decl() const;
1270#include "clang/Basic/BuiltinTemplates.inc"
1271
1272 // Builtin Types.
1276 CanQualType WCharTy; // [C++ 3.9.1p5].
1277 CanQualType WideCharTy; // Same as WCharTy in C++, integer type in C99.
1278 CanQualType WIntTy; // [C99 7.24.1], integer type unchanged by default promotions.
1279 CanQualType Char8Ty; // [C++20 proposal]
1280 CanQualType Char16Ty; // [C++0x 3.9.1p5], integer type in C99.
1281 CanQualType Char32Ty; // [C++0x 3.9.1p5], integer type in C99.
1287 LongAccumTy; // ISO/IEC JTC1 SC22 WG14 N1169 Extension
1297 CanQualType HalfTy; // [OpenCL 6.1.1.1], ARM NEON
1299 CanQualType Float16Ty; // C11 extension ISO/IEC TS 18661-3
1307#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
1308 CanQualType SingletonId;
1309#include "clang/Basic/OpenCLImageTypes.def"
1315#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
1316 CanQualType Id##Ty;
1317#include "clang/Basic/OpenCLExtensionTypes.def"
1318#define SVE_TYPE(Name, Id, SingletonId) \
1319 CanQualType SingletonId;
1320#include "clang/Basic/AArch64ACLETypes.def"
1321#define PPC_VECTOR_TYPE(Name, Id, Size) \
1322 CanQualType Id##Ty;
1323#include "clang/Basic/PPCTypes.def"
1324#define RVV_TYPE(Name, Id, SingletonId) \
1325 CanQualType SingletonId;
1326#include "clang/Basic/RISCVVTypes.def"
1327#define WASM_TYPE(Name, Id, SingletonId) CanQualType SingletonId;
1328#include "clang/Basic/WebAssemblyReferenceTypes.def"
1329#define AMDGPU_TYPE(Name, Id, SingletonId, Width, Align) \
1330 CanQualType SingletonId;
1331#include "clang/Basic/AMDGPUTypes.def"
1332#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) CanQualType SingletonId;
1333#include "clang/Basic/HLSLIntangibleTypes.def"
1334
1335 // Types for deductions in C++0x [stmt.ranged]'s desugaring. Built on demand.
1336 mutable QualType AutoDeductTy; // Deduction against 'auto'.
1337 mutable QualType AutoRRefDeductTy; // Deduction against 'auto &&'.
1338
1339 // Decl used to help define __builtin_va_list for some targets.
1340 // The decl is built when constructing 'BuiltinVaListDecl'.
1341 mutable Decl *VaListTagDecl = nullptr;
1342
1343 // Implicitly-declared type 'struct _GUID'.
1344 mutable TagDecl *MSGuidTagDecl = nullptr;
1345
1346 // Implicitly-declared type 'struct type_info'.
1347 mutable TagDecl *MSTypeInfoTagDecl = nullptr;
1348
1349 /// Keep track of CUDA/HIP device-side variables ODR-used by host code.
1350 /// This does not include extern shared variables used by device host
1351 /// functions as addresses of shared variables are per warp, therefore
1352 /// cannot be accessed by host code.
1353 llvm::DenseSet<const VarDecl *> CUDADeviceVarODRUsedByHost;
1354
1355 /// Keep track of CUDA/HIP external kernels or device variables ODR-used by
1356 /// host code. SetVector is used to maintain the order.
1357 llvm::SetVector<const ValueDecl *> CUDAExternalDeviceDeclODRUsedByHost;
1358
1359 /// Keep track of CUDA/HIP implicit host device functions used on device side
1360 /// in device compilation.
1361 llvm::DenseSet<const FunctionDecl *> CUDAImplicitHostDeviceFunUsedByDevice;
1362
1363 /// Map of SYCL kernels indexed by the unique type used to name the kernel.
1364 /// Entries are not serialized but are recreated on deserialization of a
1365 /// sycl_kernel_entry_point attributed function declaration.
1366 llvm::DenseMap<CanQualType, SYCLKernelInfo> SYCLKernels;
1367
1368 /// For capturing lambdas with an explicit object parameter whose type is
1369 /// derived from the lambda type, we need to perform derived-to-base
1370 /// conversion so we can access the captures; the cast paths for that
1371 /// are stored here.
1372 llvm::DenseMap<const CXXMethodDecl *, CXXCastPath> LambdaCastPaths;
1373
1375 SelectorTable &sels, Builtin::Context &builtins,
1377 ASTContext(const ASTContext &) = delete;
1378 ASTContext &operator=(const ASTContext &) = delete;
1379 ~ASTContext();
1380
1381 /// Attach an external AST source to the AST context.
1382 ///
1383 /// The external AST source provides the ability to load parts of
1384 /// the abstract syntax tree as needed from some external storage,
1385 /// e.g., a precompiled header.
1387
1388 /// Retrieve a pointer to the external AST source associated
1389 /// with this AST context, if any.
1391 return ExternalSource.get();
1392 }
1393
1394 /// Retrieve a pointer to the external AST source associated
1395 /// with this AST context, if any. Returns as an IntrusiveRefCntPtr.
1399
1400 /// Attach an AST mutation listener to the AST context.
1401 ///
1402 /// The AST mutation listener provides the ability to track modifications to
1403 /// the abstract syntax tree entities committed after they were initially
1404 /// created.
1406 this->Listener = Listener;
1407 }
1408
1409 /// Retrieve a pointer to the AST mutation listener associated
1410 /// with this AST context, if any.
1412
1413 void PrintStats() const;
1414 const SmallVectorImpl<Type *>& getTypes() const { return Types; }
1415
1417 const IdentifierInfo *II) const;
1418
1419 /// Create a new implicit TU-level CXXRecordDecl or RecordDecl
1420 /// declaration.
1422 StringRef Name,
1423 RecordDecl::TagKind TK = RecordDecl::TagKind::Struct) const;
1424
1425 /// Create a new implicit TU-level typedef declaration.
1426 TypedefDecl *buildImplicitTypedef(QualType T, StringRef Name) const;
1427
1428 /// Retrieve the declaration for the 128-bit signed integer type.
1429 TypedefDecl *getInt128Decl() const;
1430
1431 /// Retrieve the declaration for the 128-bit unsigned integer type.
1432 TypedefDecl *getUInt128Decl() const;
1433
1434 //===--------------------------------------------------------------------===//
1435 // Type Constructors
1436 //===--------------------------------------------------------------------===//
1437
1438private:
1439 /// Return a type with extended qualifiers.
1440 QualType getExtQualType(const Type *Base, Qualifiers Quals) const;
1441
1442 QualType getPipeType(QualType T, bool ReadOnly) const;
1443
1444public:
1445 /// Return the uniqued reference to the type for an address space
1446 /// qualified type with the specified type and address space.
1447 ///
1448 /// The resulting type has a union of the qualifiers from T and the address
1449 /// space. If T already has an address space specifier, it is silently
1450 /// replaced.
1451 QualType getAddrSpaceQualType(QualType T, LangAS AddressSpace) const;
1452
1453 /// Remove any existing address space on the type and returns the type
1454 /// with qualifiers intact (or that's the idea anyway)
1455 ///
1456 /// The return type should be T with all prior qualifiers minus the address
1457 /// space.
1459
1460 /// Return the "other" discriminator used for the pointer auth schema used for
1461 /// vtable pointers in instances of the requested type.
1462 uint16_t
1464
1465 /// Return the "other" type-specific discriminator for the given type.
1467
1468 /// Apply Objective-C protocol qualifiers to the given type.
1469 /// \param allowOnPointerType specifies if we can apply protocol
1470 /// qualifiers on ObjCObjectPointerType. It can be set to true when
1471 /// constructing the canonical type of a Objective-C type parameter.
1473 ArrayRef<ObjCProtocolDecl *> protocols, bool &hasError,
1474 bool allowOnPointerType = false) const;
1475
1476 /// Return the uniqued reference to the type for an Objective-C
1477 /// gc-qualified type.
1478 ///
1479 /// The resulting type has a union of the qualifiers from T and the gc
1480 /// attribute.
1482
1483 /// Remove the existing address space on the type if it is a pointer size
1484 /// address space and return the type with qualifiers intact.
1486
1487 /// Return the uniqued reference to the type for a \c restrict
1488 /// qualified type.
1489 ///
1490 /// The resulting type has a union of the qualifiers from \p T and
1491 /// \c restrict.
1493 return T.withFastQualifiers(Qualifiers::Restrict);
1494 }
1495
1496 /// Return the uniqued reference to the type for a \c volatile
1497 /// qualified type.
1498 ///
1499 /// The resulting type has a union of the qualifiers from \p T and
1500 /// \c volatile.
1502 return T.withFastQualifiers(Qualifiers::Volatile);
1503 }
1504
1505 /// Return the uniqued reference to the type for a \c const
1506 /// qualified type.
1507 ///
1508 /// The resulting type has a union of the qualifiers from \p T and \c const.
1509 ///
1510 /// It can be reasonably expected that this will always be equivalent to
1511 /// calling T.withConst().
1512 QualType getConstType(QualType T) const { return T.withConst(); }
1513
1514 /// Rebuild a type, preserving any existing type sugar. For function types,
1515 /// you probably want to just use \c adjustFunctionResultType and friends
1516 /// instead.
1518 llvm::function_ref<QualType(QualType)> Adjust) const;
1519
1520 /// Change the ExtInfo on a function type.
1522 FunctionType::ExtInfo EInfo);
1523
1524 /// Change the result type of a function type, preserving sugar such as
1525 /// attributed types.
1527 QualType NewResultType);
1528
1529 /// Adjust the given function result type.
1531
1532 /// Change the result type of a function type once it is deduced.
1534
1535 /// Get a function type and produce the equivalent function type with the
1536 /// specified exception specification. Type sugar that can be present on a
1537 /// declaration of a function with an exception specification is permitted
1538 /// and preserved. Other type sugar (for instance, typedefs) is not.
1540 QualType Orig, const FunctionProtoType::ExceptionSpecInfo &ESI) const;
1541
1542 /// Determine whether two function types are the same, ignoring
1543 /// exception specifications in cases where they're part of the type.
1545
1546 /// Change the exception specification on a function once it is
1547 /// delay-parsed, instantiated, or computed.
1550 bool AsWritten = false);
1551
1552 /// Get a function type and produce the equivalent function type where
1553 /// pointer size address spaces in the return type and parameter types are
1554 /// replaced with the default address space.
1556
1557 /// Determine whether two function types are the same, ignoring pointer sizes
1558 /// in the return type and parameter types.
1560
1561 /// Get or construct a function type that is equivalent to the input type
1562 /// except that the parameter ABI annotations are stripped.
1564
1565 /// Determine if two function types are the same, ignoring parameter ABI
1566 /// annotations.
1568
1569 /// Return the uniqued reference to the type for a complex
1570 /// number with the specified element type.
1575
1576 /// Return the uniqued reference to the type for a pointer to
1577 /// the specified type.
1582
1583 QualType
1584 getCountAttributedType(QualType T, Expr *CountExpr, bool CountInBytes,
1585 bool OrNull,
1586 ArrayRef<TypeCoupledDeclRefInfo> DependentDecls) const;
1587
1588 /// Return the uniqued reference to a type adjusted from the original
1589 /// type to a new type.
1595
1596 /// Return the uniqued reference to the decayed version of the given
1597 /// type. Can only be called on array and function types which decay to
1598 /// pointer types.
1603 /// Return the uniqued reference to a specified decay from the original
1604 /// type to the decayed type.
1605 QualType getDecayedType(QualType Orig, QualType Decayed) const;
1606
1607 /// Return the uniqued reference to a specified array parameter type from the
1608 /// original array type.
1610
1611 /// Return the uniqued reference to the atomic type for the specified
1612 /// type.
1614
1615 /// Return the uniqued reference to the type for a block of the
1616 /// specified type.
1618
1619 /// Gets the struct used to keep track of the descriptor for pointer to
1620 /// blocks.
1622
1623 /// Return a read_only pipe type for the specified type.
1625
1626 /// Return a write_only pipe type for the specified type.
1628
1629 /// Return a bit-precise integer type with the specified signedness and bit
1630 /// count.
1631 QualType getBitIntType(bool Unsigned, unsigned NumBits) const;
1632
1633 /// Return a dependent bit-precise integer type with the specified signedness
1634 /// and bit count.
1635 QualType getDependentBitIntType(bool Unsigned, Expr *BitsExpr) const;
1636
1638
1639 /// Gets the struct used to keep track of the extended descriptor for
1640 /// pointer to blocks.
1642
1643 /// Map an AST Type to an OpenCLTypeKind enum value.
1644 OpenCLTypeKind getOpenCLTypeKind(const Type *T) const;
1645
1646 /// Get address space for OpenCL type.
1647 LangAS getOpenCLTypeAddrSpace(const Type *T) const;
1648
1649 /// Returns default address space based on OpenCL version and enabled features
1651 return LangOpts.OpenCLGenericAddressSpace ? LangAS::opencl_generic
1653 }
1654
1656 cudaConfigureCallDecl = FD;
1657 }
1658
1660 return cudaConfigureCallDecl;
1661 }
1662
1664 cudaGetParameterBufferDecl = FD;
1665 }
1666
1668 return cudaGetParameterBufferDecl;
1669 }
1670
1671 void setcudaLaunchDeviceDecl(FunctionDecl *FD) { cudaLaunchDeviceDecl = FD; }
1672
1673 FunctionDecl *getcudaLaunchDeviceDecl() { return cudaLaunchDeviceDecl; }
1674
1675 /// Returns true iff we need copy/dispose helpers for the given type.
1676 bool BlockRequiresCopying(QualType Ty, const VarDecl *D);
1677
1678 /// Returns true, if given type has a known lifetime. HasByrefExtendedLayout
1679 /// is set to false in this case. If HasByrefExtendedLayout returns true,
1680 /// byref variable has extended lifetime.
1681 bool getByrefLifetime(QualType Ty,
1682 Qualifiers::ObjCLifetime &Lifetime,
1683 bool &HasByrefExtendedLayout) const;
1684
1685 /// Return the uniqued reference to the type for an lvalue reference
1686 /// to the specified type.
1687 QualType getLValueReferenceType(QualType T, bool SpelledAsLValue = true)
1688 const;
1689
1690 /// Return the uniqued reference to the type for an rvalue reference
1691 /// to the specified type.
1693
1694 /// Return the uniqued reference to the type for a member pointer to
1695 /// the specified type in the specified nested name.
1697 const CXXRecordDecl *Cls) const;
1698
1699 /// Return a non-unique reference to the type for a variable array of
1700 /// the specified element type.
1703 unsigned IndexTypeQuals) const;
1704
1705 /// Return a non-unique reference to the type for a dependently-sized
1706 /// array of the specified element type.
1707 ///
1708 /// FIXME: We will need these to be uniqued, or at least comparable, at some
1709 /// point.
1712 unsigned IndexTypeQuals) const;
1713
1714 /// Return a unique reference to the type for an incomplete array of
1715 /// the specified element type.
1717 unsigned IndexTypeQuals) const;
1718
1719 /// Return the unique reference to the type for a constant array of
1720 /// the specified element type.
1721 QualType getConstantArrayType(QualType EltTy, const llvm::APInt &ArySize,
1722 const Expr *SizeExpr, ArraySizeModifier ASM,
1723 unsigned IndexTypeQuals) const;
1724
1725 /// Return a type for a constant array for a string literal of the
1726 /// specified element type and length.
1727 QualType getStringLiteralArrayType(QualType EltTy, unsigned Length) const;
1728
1729 /// Returns a vla type where known sizes are replaced with [*].
1731
1732 // Convenience struct to return information about a builtin vector type.
1741
1742 /// Returns the element type, element count and number of vectors
1743 /// (in case of tuple) for a builtin vector type.
1744 BuiltinVectorTypeInfo
1745 getBuiltinVectorTypeInfo(const BuiltinType *VecTy) const;
1746
1747 /// Return the unique reference to a scalable vector type of the specified
1748 /// element type and scalable number of elements.
1749 /// For RISC-V, number of fields is also provided when it fetching for
1750 /// tuple type.
1751 ///
1752 /// \pre \p EltTy must be a built-in type.
1753 QualType getScalableVectorType(QualType EltTy, unsigned NumElts,
1754 unsigned NumFields = 1) const;
1755
1756 /// Return a WebAssembly externref type.
1758
1759 /// Return the unique reference to a vector type of the specified
1760 /// element type and size.
1761 ///
1762 /// \pre \p VectorType must be a built-in type.
1763 QualType getVectorType(QualType VectorType, unsigned NumElts,
1764 VectorKind VecKind) const;
1765 /// Return the unique reference to the type for a dependently sized vector of
1766 /// the specified element type.
1768 SourceLocation AttrLoc,
1769 VectorKind VecKind) const;
1770
1771 /// Return the unique reference to an extended vector type
1772 /// of the specified element type and size.
1773 ///
1774 /// \pre \p VectorType must be a built-in type.
1775 QualType getExtVectorType(QualType VectorType, unsigned NumElts) const;
1776
1777 /// \pre Return a non-unique reference to the type for a dependently-sized
1778 /// vector of the specified element type.
1779 ///
1780 /// FIXME: We will need these to be uniqued, or at least comparable, at some
1781 /// point.
1783 Expr *SizeExpr,
1784 SourceLocation AttrLoc) const;
1785
1786 /// Return the unique reference to the matrix type of the specified element
1787 /// type and size
1788 ///
1789 /// \pre \p ElementType must be a valid matrix element type (see
1790 /// MatrixType::isValidElementType).
1791 QualType getConstantMatrixType(QualType ElementType, unsigned NumRows,
1792 unsigned NumColumns) const;
1793
1794 /// Return the unique reference to the matrix type of the specified element
1795 /// type and size
1796 QualType getDependentSizedMatrixType(QualType ElementType, Expr *RowExpr,
1797 Expr *ColumnExpr,
1798 SourceLocation AttrLoc) const;
1799
1801 Expr *AddrSpaceExpr,
1802 SourceLocation AttrLoc) const;
1803
1804 /// Return a K&R style C function type like 'int()'.
1806 const FunctionType::ExtInfo &Info) const;
1807
1811
1812 /// Return a normal function type with a typed argument list.
1814 const FunctionProtoType::ExtProtoInfo &EPI) const {
1815 return getFunctionTypeInternal(ResultTy, Args, EPI, false);
1816 }
1817
1819
1820private:
1821 /// Return a normal function type with a typed argument list.
1822 QualType getFunctionTypeInternal(QualType ResultTy, ArrayRef<QualType> Args,
1824 bool OnlyWantCanonical) const;
1825 QualType
1826 getAutoTypeInternal(QualType DeducedType, AutoTypeKeyword Keyword,
1827 bool IsDependent, bool IsPack = false,
1828 TemplateDecl *TypeConstraintConcept = nullptr,
1829 ArrayRef<TemplateArgument> TypeConstraintArgs = {},
1830 bool IsCanon = false) const;
1831
1832public:
1834 NestedNameSpecifier Qualifier,
1835 const TypeDecl *Decl) const;
1836
1837 /// Return the unique reference to the type for the specified type
1838 /// declaration.
1839 QualType getTypeDeclType(const TypeDecl *Decl) const;
1840
1841 /// Use the normal 'getFooBarType' constructors to obtain these types.
1842 QualType getTypeDeclType(const TagDecl *) const = delete;
1843 QualType getTypeDeclType(const TypedefDecl *) const = delete;
1844 QualType getTypeDeclType(const TypeAliasDecl *) const = delete;
1846
1848
1850 NestedNameSpecifier Qualifier, const UsingShadowDecl *D,
1851 QualType UnderlyingType = QualType()) const;
1852
1853 /// Return the unique reference to the type for the specified
1854 /// typedef-name decl.
1855 /// FIXME: TypeMatchesDeclOrNone is a workaround for a serialization issue:
1856 /// The decl underlying type might still not be available.
1859 const TypedefNameDecl *Decl, QualType UnderlyingType = QualType(),
1860 std::optional<bool> TypeMatchesDeclOrNone = std::nullopt) const;
1861
1862 CanQualType getCanonicalTagType(const TagDecl *TD) const;
1864 NestedNameSpecifier Qualifier, const TagDecl *TD,
1865 bool OwnsTag) const;
1866
1867private:
1868 UnresolvedUsingType *getUnresolvedUsingTypeInternal(
1870 const UnresolvedUsingTypenameDecl *D, void *InsertPos,
1871 const Type *CanonicalType) const;
1872
1873 TagType *getTagTypeInternal(ElaboratedTypeKeyword Keyword,
1874 NestedNameSpecifier Qualifier, const TagDecl *Tag,
1875 bool OwnsTag, bool IsInjected,
1876 const Type *CanonicalType,
1877 bool WithFoldingSetNode) const;
1878
1879public:
1880 /// Compute BestType and BestPromotionType for an enum based on the highest
1881 /// number of negative and positive bits of its elements.
1882 /// Returns true if enum width is too large.
1883 bool computeBestEnumTypes(bool IsPacked, unsigned NumNegativeBits,
1884 unsigned NumPositiveBits, QualType &BestType,
1885 QualType &BestPromotionType);
1886
1887 /// Determine whether the given integral value is representable within
1888 /// the given type T.
1889 bool isRepresentableIntegerValue(llvm::APSInt &Value, QualType T);
1890
1891 /// Compute NumNegativeBits and NumPositiveBits for an enum based on
1892 /// the constant values of its enumerators.
1893 template <typename RangeT>
1894 bool computeEnumBits(RangeT EnumConstants, unsigned &NumNegativeBits,
1895 unsigned &NumPositiveBits) {
1896 NumNegativeBits = 0;
1897 NumPositiveBits = 0;
1898 bool MembersRepresentableByInt = true;
1899 for (auto *Elem : EnumConstants) {
1900 EnumConstantDecl *ECD = cast_or_null<EnumConstantDecl>(Elem);
1901 if (!ECD)
1902 continue; // Already issued a diagnostic.
1903
1904 llvm::APSInt InitVal = ECD->getInitVal();
1905 if (InitVal.isUnsigned() || InitVal.isNonNegative()) {
1906 // If the enumerator is zero that should still be counted as a positive
1907 // bit since we need a bit to store the value zero.
1908 unsigned ActiveBits = InitVal.getActiveBits();
1909 NumPositiveBits = std::max({NumPositiveBits, ActiveBits, 1u});
1910 } else {
1911 NumNegativeBits =
1912 std::max(NumNegativeBits, InitVal.getSignificantBits());
1913 }
1914
1915 MembersRepresentableByInt &= isRepresentableIntegerValue(InitVal, IntTy);
1916 }
1917
1918 // If we have an empty set of enumerators we still need one bit.
1919 // From [dcl.enum]p8
1920 // If the enumerator-list is empty, the values of the enumeration are as if
1921 // the enumeration had a single enumerator with value 0
1922 if (!NumPositiveBits && !NumNegativeBits)
1923 NumPositiveBits = 1;
1924
1925 return MembersRepresentableByInt;
1926 }
1927
1931 NestedNameSpecifier Qualifier,
1932 const UnresolvedUsingTypenameDecl *D) const;
1933
1934 QualType getAttributedType(attr::Kind attrKind, QualType modifiedType,
1935 QualType equivalentType,
1936 const Attr *attr = nullptr) const;
1937
1938 QualType getAttributedType(const Attr *attr, QualType modifiedType,
1939 QualType equivalentType) const;
1940
1941 QualType getAttributedType(NullabilityKind nullability, QualType modifiedType,
1942 QualType equivalentType);
1943
1944 QualType getBTFTagAttributedType(const BTFTypeTagAttr *BTFAttr,
1945 QualType Wrapped) const;
1946
1948 QualType Wrapped, QualType Contained,
1949 const HLSLAttributedResourceType::Attributes &Attrs);
1950
1951 QualType getHLSLInlineSpirvType(uint32_t Opcode, uint32_t Size,
1952 uint32_t Alignment,
1953 ArrayRef<SpirvOperand> Operands);
1954
1956 Decl *AssociatedDecl, unsigned Index,
1957 UnsignedOrNone PackIndex,
1958 bool Final) const;
1960 unsigned Index, bool Final,
1961 const TemplateArgument &ArgPack);
1963
1964 QualType
1965 getTemplateTypeParmType(unsigned Depth, unsigned Index,
1966 bool ParameterPack,
1967 TemplateTypeParmDecl *ParmDecl = nullptr) const;
1968
1971 ArrayRef<TemplateArgument> CanonicalArgs) const;
1972
1973 QualType
1975 ArrayRef<TemplateArgument> SpecifiedArgs,
1976 ArrayRef<TemplateArgument> CanonicalArgs,
1977 QualType Underlying = QualType()) const;
1978
1979 QualType
1981 ArrayRef<TemplateArgumentLoc> SpecifiedArgs,
1982 ArrayRef<TemplateArgument> CanonicalArgs,
1983 QualType Canon = QualType()) const;
1984
1986 ElaboratedTypeKeyword Keyword, SourceLocation ElaboratedKeywordLoc,
1987 NestedNameSpecifierLoc QualifierLoc, SourceLocation TemplateKeywordLoc,
1989 const TemplateArgumentListInfo &SpecifiedArgs,
1990 ArrayRef<TemplateArgument> CanonicalArgs,
1991 QualType Canon = QualType()) const;
1992
1993 QualType getParenType(QualType NamedType) const;
1994
1996 const IdentifierInfo *MacroII) const;
1997
2000 const IdentifierInfo *Name) const;
2001
2003
2004 /// Form a pack expansion type with the given pattern.
2005 /// \param NumExpansions The number of expansions for the pack, if known.
2006 /// \param ExpectPackInType If \c false, we should not expect \p Pattern to
2007 /// contain an unexpanded pack. This only makes sense if the pack
2008 /// expansion is used in a context where the arity is inferred from
2009 /// elsewhere, such as if the pattern contains a placeholder type or
2010 /// if this is the canonical type of another pack expansion type.
2012 bool ExpectPackInType = true) const;
2013
2015 ObjCInterfaceDecl *PrevDecl = nullptr) const;
2016
2017 /// Legacy interface: cannot provide type arguments or __kindof.
2019 ObjCProtocolDecl * const *Protocols,
2020 unsigned NumProtocols) const;
2021
2023 ArrayRef<QualType> typeArgs,
2025 bool isKindOf) const;
2026
2028 ArrayRef<ObjCProtocolDecl *> protocols) const;
2030 ObjCTypeParamDecl *New) const;
2031
2033
2034 /// QIdProtocolsAdoptObjCObjectProtocols - Checks that protocols in
2035 /// QT's qualified-id protocol list adopt all protocols in IDecl's list
2036 /// of protocols.
2038 ObjCInterfaceDecl *IDecl);
2039
2040 /// Return a ObjCObjectPointerType type for the given ObjCObjectType.
2042
2043 /// C23 feature and GCC extension.
2044 QualType getTypeOfExprType(Expr *E, TypeOfKind Kind) const;
2045 QualType getTypeOfType(QualType QT, TypeOfKind Kind) const;
2046
2047 QualType getReferenceQualifiedType(const Expr *e) const;
2048
2049 /// C++11 decltype.
2050 QualType getDecltypeType(Expr *e, QualType UnderlyingType) const;
2051
2052 QualType getPackIndexingType(QualType Pattern, Expr *IndexExpr,
2053 bool FullySubstituted = false,
2054 ArrayRef<QualType> Expansions = {},
2055 UnsignedOrNone Index = std::nullopt) const;
2056
2057 /// Unary type transforms
2058 QualType getUnaryTransformType(QualType BaseType, QualType UnderlyingType,
2059 UnaryTransformType::UTTKind UKind) const;
2060
2061 /// C++11 deduced auto type.
2062 QualType
2063 getAutoType(QualType DeducedType, AutoTypeKeyword Keyword, bool IsDependent,
2064 bool IsPack = false,
2065 TemplateDecl *TypeConstraintConcept = nullptr,
2066 ArrayRef<TemplateArgument> TypeConstraintArgs = {}) const;
2067
2068 /// C++11 deduction pattern for 'auto' type.
2069 QualType getAutoDeductType() const;
2070
2071 /// C++11 deduction pattern for 'auto &&' type.
2072 QualType getAutoRRefDeductType() const;
2073
2074 /// Remove any type constraints from a template parameter type, for
2075 /// equivalence comparison of template parameters.
2076 QualType getUnconstrainedType(QualType T) const;
2077
2078 /// C++17 deduced class template specialization type.
2081 QualType DeducedType,
2082 bool IsDependent) const;
2083
2084private:
2085 QualType getDeducedTemplateSpecializationTypeInternal(
2087 QualType DeducedType, bool IsDependent, QualType Canon) const;
2088
2089public:
2090 /// Return the unique type for "size_t" (C99 7.17), defined in
2091 /// <stddef.h>.
2092 ///
2093 /// The sizeof operator requires this (C99 6.5.3.4p4).
2094 QualType getSizeType() const;
2095
2097
2098 /// Return the unique signed counterpart of
2099 /// the integer type corresponding to size_t.
2100 QualType getSignedSizeType() const;
2101
2102 /// Return the unique type for "intmax_t" (C99 7.18.1.5), defined in
2103 /// <stdint.h>.
2104 CanQualType getIntMaxType() const;
2105
2106 /// Return the unique type for "uintmax_t" (C99 7.18.1.5), defined in
2107 /// <stdint.h>.
2109
2110 /// Return the unique wchar_t type available in C++ (and available as
2111 /// __wchar_t as a Microsoft extension).
2112 QualType getWCharType() const { return WCharTy; }
2113
2114 /// Return the type of wide characters. In C++, this returns the
2115 /// unique wchar_t type. In C99, this returns a type compatible with the type
2116 /// defined in <stddef.h> as defined by the target.
2118
2119 /// Return the type of "signed wchar_t".
2120 ///
2121 /// Used when in C++, as a GCC extension.
2123
2124 /// Return the type of "unsigned wchar_t".
2125 ///
2126 /// Used when in C++, as a GCC extension.
2128
2129 /// In C99, this returns a type compatible with the type
2130 /// defined in <stddef.h> as defined by the target.
2131 QualType getWIntType() const { return WIntTy; }
2132
2133 /// Return a type compatible with "intptr_t" (C99 7.18.1.4),
2134 /// as defined by the target.
2135 QualType getIntPtrType() const;
2136
2137 /// Return a type compatible with "uintptr_t" (C99 7.18.1.4),
2138 /// as defined by the target.
2139 QualType getUIntPtrType() const;
2140
2141 /// Return the unique type for "ptrdiff_t" (C99 7.17) defined in
2142 /// <stddef.h>. Pointer - pointer requires this (C99 6.5.6p9).
2144
2145 /// Return the unique unsigned counterpart of "ptrdiff_t"
2146 /// integer type. The standard (C11 7.21.6.1p7) refers to this type
2147 /// in the definition of %tu format specifier.
2149
2150 /// Return the unique type for "pid_t" defined in
2151 /// <sys/types.h>. We need this to compute the correct type for vfork().
2152 QualType getProcessIDType() const;
2153
2154 /// Return the C structure type used to represent constant CFStrings.
2156
2157 /// Returns the C struct type for objc_super
2158 QualType getObjCSuperType() const;
2159 void setObjCSuperType(QualType ST) { ObjCSuperType = ST; }
2160
2161 /// Get the structure type used to representation CFStrings, or NULL
2162 /// if it hasn't yet been built.
2164 if (CFConstantStringTypeDecl)
2166 /*Qualifier=*/std::nullopt,
2167 CFConstantStringTypeDecl);
2168 return QualType();
2169 }
2173
2174 // This setter/getter represents the ObjC type for an NSConstantString.
2177 return ObjCConstantStringType;
2178 }
2179
2181 return ObjCNSStringType;
2182 }
2183
2185 ObjCNSStringType = T;
2186 }
2187
2188 /// Retrieve the type that \c id has been defined to, which may be
2189 /// different from the built-in \c id if \c id has been typedef'd.
2191 if (ObjCIdRedefinitionType.isNull())
2192 return getObjCIdType();
2193 return ObjCIdRedefinitionType;
2194 }
2195
2196 /// Set the user-written type that redefines \c id.
2198 ObjCIdRedefinitionType = RedefType;
2199 }
2200
2201 /// Retrieve the type that \c Class has been defined to, which may be
2202 /// different from the built-in \c Class if \c Class has been typedef'd.
2204 if (ObjCClassRedefinitionType.isNull())
2205 return getObjCClassType();
2206 return ObjCClassRedefinitionType;
2207 }
2208
2209 /// Set the user-written type that redefines 'SEL'.
2211 ObjCClassRedefinitionType = RedefType;
2212 }
2213
2214 /// Retrieve the type that 'SEL' has been defined to, which may be
2215 /// different from the built-in 'SEL' if 'SEL' has been typedef'd.
2217 if (ObjCSelRedefinitionType.isNull())
2218 return getObjCSelType();
2219 return ObjCSelRedefinitionType;
2220 }
2221
2222 /// Set the user-written type that redefines 'SEL'.
2224 ObjCSelRedefinitionType = RedefType;
2225 }
2226
2227 /// Retrieve the identifier 'NSObject'.
2229 if (!NSObjectName) {
2230 NSObjectName = &Idents.get("NSObject");
2231 }
2232
2233 return NSObjectName;
2234 }
2235
2236 /// Retrieve the identifier 'NSCopying'.
2238 if (!NSCopyingName) {
2239 NSCopyingName = &Idents.get("NSCopying");
2240 }
2241
2242 return NSCopyingName;
2243 }
2244
2246
2248
2249 /// Retrieve the identifier 'bool'.
2251 if (!BoolName)
2252 BoolName = &Idents.get("bool");
2253 return BoolName;
2254 }
2255
2256#define BuiltinTemplate(BTName) \
2257 IdentifierInfo *get##BTName##Name() const { \
2258 if (!Name##BTName) \
2259 Name##BTName = &Idents.get(#BTName); \
2260 return Name##BTName; \
2261 }
2262#include "clang/Basic/BuiltinTemplates.inc"
2263
2264 /// Retrieve the Objective-C "instancetype" type.
2267 /*Qualifier=*/std::nullopt,
2269 }
2270
2271 /// Retrieve the typedef declaration corresponding to the Objective-C
2272 /// "instancetype" type.
2274
2275 /// Set the type for the C FILE type.
2276 void setFILEDecl(TypeDecl *FILEDecl) { this->FILEDecl = FILEDecl; }
2277
2278 /// Retrieve the C FILE type.
2280 if (FILEDecl)
2282 /*Qualifier=*/std::nullopt, FILEDecl);
2283 return QualType();
2284 }
2285
2286 /// Set the type for the C jmp_buf type.
2287 void setjmp_bufDecl(TypeDecl *jmp_bufDecl) {
2288 this->jmp_bufDecl = jmp_bufDecl;
2289 }
2290
2291 /// Retrieve the C jmp_buf type.
2293 if (jmp_bufDecl)
2295 /*Qualifier=*/std::nullopt, jmp_bufDecl);
2296 return QualType();
2297 }
2298
2299 /// Set the type for the C sigjmp_buf type.
2300 void setsigjmp_bufDecl(TypeDecl *sigjmp_bufDecl) {
2301 this->sigjmp_bufDecl = sigjmp_bufDecl;
2302 }
2303
2304 /// Retrieve the C sigjmp_buf type.
2306 if (sigjmp_bufDecl)
2308 /*Qualifier=*/std::nullopt, sigjmp_bufDecl);
2309 return QualType();
2310 }
2311
2312 /// Set the type for the C ucontext_t type.
2313 void setucontext_tDecl(TypeDecl *ucontext_tDecl) {
2314 this->ucontext_tDecl = ucontext_tDecl;
2315 }
2316
2317 /// Retrieve the C ucontext_t type.
2319 if (ucontext_tDecl)
2321 /*Qualifier=*/std::nullopt, ucontext_tDecl);
2322 return QualType();
2323 }
2324
2325 /// The result type of logical operations, '<', '>', '!=', etc.
2327 return getLangOpts().CPlusPlus ? BoolTy : IntTy;
2328 }
2329
2330 /// Emit the Objective-CC type encoding for the given type \p T into
2331 /// \p S.
2332 ///
2333 /// If \p Field is specified then record field names are also encoded.
2334 void getObjCEncodingForType(QualType T, std::string &S,
2335 const FieldDecl *Field=nullptr,
2336 QualType *NotEncodedT=nullptr) const;
2337
2338 /// Emit the Objective-C property type encoding for the given
2339 /// type \p T into \p S.
2340 void getObjCEncodingForPropertyType(QualType T, std::string &S) const;
2341
2343
2344 /// Put the string version of the type qualifiers \p QT into \p S.
2346 std::string &S) const;
2347
2348 /// Emit the encoded type for the function \p Decl into \p S.
2349 ///
2350 /// This is in the same format as Objective-C method encodings.
2351 ///
2352 /// \returns true if an error occurred (e.g., because one of the parameter
2353 /// types is incomplete), false otherwise.
2354 std::string getObjCEncodingForFunctionDecl(const FunctionDecl *Decl) const;
2355
2356 /// Emit the encoded type for the method declaration \p Decl into
2357 /// \p S.
2359 bool Extended = false) const;
2360
2361 /// Return the encoded type for this block declaration.
2362 std::string getObjCEncodingForBlock(const BlockExpr *blockExpr) const;
2363
2364 /// getObjCEncodingForPropertyDecl - Return the encoded type for
2365 /// this method declaration. If non-NULL, Container must be either
2366 /// an ObjCCategoryImplDecl or ObjCImplementationDecl; it should
2367 /// only be NULL when getting encodings for protocol properties.
2369 const Decl *Container) const;
2370
2372 ObjCProtocolDecl *rProto) const;
2373
2375 const ObjCPropertyDecl *PD,
2376 const Decl *Container) const;
2377
2378 /// Return the size of type \p T for Objective-C encoding purpose,
2379 /// in characters.
2381
2382 /// Retrieve the typedef corresponding to the predefined \c id type
2383 /// in Objective-C.
2384 TypedefDecl *getObjCIdDecl() const;
2385
2386 /// Represents the Objective-CC \c id type.
2387 ///
2388 /// This is set up lazily, by Sema. \c id is always a (typedef for a)
2389 /// pointer type, a pointer to a struct.
2392 /*Qualifier=*/std::nullopt, getObjCIdDecl());
2393 }
2394
2395 /// Retrieve the typedef corresponding to the predefined 'SEL' type
2396 /// in Objective-C.
2397 TypedefDecl *getObjCSelDecl() const;
2398
2399 /// Retrieve the type that corresponds to the predefined Objective-C
2400 /// 'SEL' type.
2403 /*Qualifier=*/std::nullopt, getObjCSelDecl());
2404 }
2405
2407
2408 /// Retrieve the typedef declaration corresponding to the predefined
2409 /// Objective-C 'Class' type.
2411
2412 /// Represents the Objective-C \c Class type.
2413 ///
2414 /// This is set up lazily, by Sema. \c Class is always a (typedef for a)
2415 /// pointer type, a pointer to a struct.
2418 /*Qualifier=*/std::nullopt, getObjCClassDecl());
2419 }
2420
2421 /// Retrieve the Objective-C class declaration corresponding to
2422 /// the predefined \c Protocol class.
2424
2425 /// Retrieve declaration of 'BOOL' typedef
2427 return BOOLDecl;
2428 }
2429
2430 /// Save declaration of 'BOOL' typedef
2432 BOOLDecl = TD;
2433 }
2434
2435 /// type of 'BOOL' type.
2438 /*Qualifier=*/std::nullopt, getBOOLDecl());
2439 }
2440
2441 /// Retrieve the type of the Objective-C \c Protocol class.
2445
2446 /// Retrieve the C type declaration corresponding to the predefined
2447 /// \c __builtin_va_list type.
2449
2450 /// Retrieve the type of the \c __builtin_va_list type.
2453 /*Qualifier=*/std::nullopt, getBuiltinVaListDecl());
2454 }
2455
2456 /// Retrieve the C type declaration corresponding to the predefined
2457 /// \c __va_list_tag type used to help define the \c __builtin_va_list type
2458 /// for some targets.
2459 Decl *getVaListTagDecl() const;
2460
2461 /// Retrieve the C type declaration corresponding to the predefined
2462 /// \c __builtin_ms_va_list type.
2464
2465 /// Retrieve the type of the \c __builtin_ms_va_list type.
2468 /*Qualifier=*/std::nullopt, getBuiltinMSVaListDecl());
2469 }
2470
2471 /// Retrieve the implicitly-predeclared 'struct _GUID' declaration.
2473
2474 /// Retrieve the implicitly-predeclared 'struct _GUID' type.
2476 assert(MSGuidTagDecl && "asked for GUID type but MS extensions disabled");
2478 }
2479
2480 /// Retrieve the implicitly-predeclared 'struct type_info' declaration.
2482 // Lazily create this type on demand - it's only needed for MS builds.
2483 if (!MSTypeInfoTagDecl)
2485 return MSTypeInfoTagDecl;
2486 }
2487
2488 /// Return whether a declaration to a builtin is allowed to be
2489 /// overloaded/redeclared.
2490 bool canBuiltinBeRedeclared(const FunctionDecl *) const;
2491
2492 /// Return a type with additional \c const, \c volatile, or
2493 /// \c restrict qualifiers.
2496 }
2497
2498 /// Un-split a SplitQualType.
2500 return getQualifiedType(split.Ty, split.Quals);
2501 }
2502
2503 /// Return a type with additional qualifiers.
2505 if (!Qs.hasNonFastQualifiers())
2506 return T.withFastQualifiers(Qs.getFastQualifiers());
2507 QualifierCollector Qc(Qs);
2508 const Type *Ptr = Qc.strip(T);
2509 return getExtQualType(Ptr, Qc);
2510 }
2511
2512 /// Return a type with additional qualifiers.
2514 if (!Qs.hasNonFastQualifiers())
2515 return QualType(T, Qs.getFastQualifiers());
2516 return getExtQualType(T, Qs);
2517 }
2518
2519 /// Return a type with the given lifetime qualifier.
2520 ///
2521 /// \pre Neither type.ObjCLifetime() nor \p lifetime may be \c OCL_None.
2523 Qualifiers::ObjCLifetime lifetime) {
2524 assert(type.getObjCLifetime() == Qualifiers::OCL_None);
2525 assert(lifetime != Qualifiers::OCL_None);
2526
2527 Qualifiers qs;
2528 qs.addObjCLifetime(lifetime);
2529 return getQualifiedType(type, qs);
2530 }
2531
2532 /// getUnqualifiedObjCPointerType - Returns version of
2533 /// Objective-C pointer type with lifetime qualifier removed.
2535 if (!type.getTypePtr()->isObjCObjectPointerType() ||
2536 !type.getQualifiers().hasObjCLifetime())
2537 return type;
2538 Qualifiers Qs = type.getQualifiers();
2539 Qs.removeObjCLifetime();
2540 return getQualifiedType(type.getUnqualifiedType(), Qs);
2541 }
2542
2543 /// \brief Return a type with the given __ptrauth qualifier.
2545 assert(!Ty.getPointerAuth());
2546 assert(PointerAuth);
2547
2548 Qualifiers Qs;
2549 Qs.setPointerAuth(PointerAuth);
2550 return getQualifiedType(Ty, Qs);
2551 }
2552
2553 unsigned char getFixedPointScale(QualType Ty) const;
2554 unsigned char getFixedPointIBits(QualType Ty) const;
2555 llvm::FixedPointSemantics getFixedPointSemantics(QualType Ty) const;
2556 llvm::APFixedPoint getFixedPointMax(QualType Ty) const;
2557 llvm::APFixedPoint getFixedPointMin(QualType Ty) const;
2558
2560 SourceLocation NameLoc) const;
2561
2563 UnresolvedSetIterator End) const;
2565
2567 bool TemplateKeyword,
2568 TemplateName Template) const;
2571
2573 Decl *AssociatedDecl,
2574 unsigned Index,
2575 UnsignedOrNone PackIndex,
2576 bool Final) const;
2578 Decl *AssociatedDecl,
2579 unsigned Index,
2580 bool Final) const;
2581
2582 /// Represents a TemplateName which had some of its default arguments
2583 /// deduced. This both represents this default argument deduction as sugar,
2584 /// and provides the support for it's equivalences through canonicalization.
2585 /// For example DeducedTemplateNames which have the same set of default
2586 /// arguments are equivalent, and are also equivalent to the underlying
2587 /// template when the deduced template arguments are the same.
2589 DefaultArguments DefaultArgs) const;
2590
2592 /// No error
2594
2595 /// Missing a type
2597
2598 /// Missing a type from <stdio.h>
2600
2601 /// Missing a type from <setjmp.h>
2603
2604 /// Missing a type from <ucontext.h>
2606 };
2607
2608 QualType DecodeTypeStr(const char *&Str, const ASTContext &Context,
2610 bool &RequireICE, bool AllowTypeModifiers) const;
2611
2612 /// Return the type for the specified builtin.
2613 ///
2614 /// If \p IntegerConstantArgs is non-null, it is filled in with a bitmask of
2615 /// arguments to the builtin that are required to be integer constant
2616 /// expressions.
2618 unsigned *IntegerConstantArgs = nullptr) const;
2619
2620 /// Types and expressions required to build C++2a three-way comparisons
2621 /// using operator<=>, including the values return by builtin <=> operators.
2623
2624private:
2625 CanQualType getFromTargetType(unsigned Type) const;
2626 TypeInfo getTypeInfoImpl(const Type *T) const;
2627
2628 //===--------------------------------------------------------------------===//
2629 // Type Predicates.
2630 //===--------------------------------------------------------------------===//
2631
2632public:
2633 /// Return one of the GCNone, Weak or Strong Objective-C garbage
2634 /// collection attributes.
2636
2637 /// Return true if the given vector types are of the same unqualified
2638 /// type or if they are equivalent to the same GCC vector type.
2639 ///
2640 /// \note This ignores whether they are target-specific (AltiVec or Neon)
2641 /// types.
2642 bool areCompatibleVectorTypes(QualType FirstVec, QualType SecondVec);
2643
2644 /// Return true if the given types are an RISC-V vector builtin type and a
2645 /// VectorType that is a fixed-length representation of the RISC-V vector
2646 /// builtin type for a specific vector-length.
2647 bool areCompatibleRVVTypes(QualType FirstType, QualType SecondType);
2648
2649 /// Return true if the given vector types are lax-compatible RISC-V vector
2650 /// types as defined by -flax-vector-conversions=, which permits implicit
2651 /// conversions between vectors with different number of elements and/or
2652 /// incompatible element types, false otherwise.
2653 bool areLaxCompatibleRVVTypes(QualType FirstType, QualType SecondType);
2654
2655 /// Return true if the type has been explicitly qualified with ObjC ownership.
2656 /// A type may be implicitly qualified with ownership under ObjC ARC, and in
2657 /// some cases the compiler treats these differently.
2659
2660 /// Return true if this is an \c NSObject object with its \c NSObject
2661 /// attribute set.
2663 return Ty->isObjCNSObjectType();
2664 }
2665
2666 //===--------------------------------------------------------------------===//
2667 // Type Sizing and Analysis
2668 //===--------------------------------------------------------------------===//
2669
2670 /// Return the APFloat 'semantics' for the specified scalar floating
2671 /// point type.
2672 const llvm::fltSemantics &getFloatTypeSemantics(QualType T) const;
2673
2674 /// Get the size and alignment of the specified complete type in bits.
2675 TypeInfo getTypeInfo(const Type *T) const;
2676 TypeInfo getTypeInfo(QualType T) const { return getTypeInfo(T.getTypePtr()); }
2677
2678 /// Get default simd alignment of the specified complete type in bits.
2679 unsigned getOpenMPDefaultSimdAlign(QualType T) const;
2680
2681 /// Return the size of the specified (complete) type \p T, in bits.
2682 uint64_t getTypeSize(QualType T) const { return getTypeInfo(T).Width; }
2683 uint64_t getTypeSize(const Type *T) const { return getTypeInfo(T).Width; }
2684
2685 /// Return the size of the character type, in bits.
2686 uint64_t getCharWidth() const {
2687 return getTypeSize(CharTy);
2688 }
2689
2690 /// Convert a size in bits to a size in characters.
2691 CharUnits toCharUnitsFromBits(int64_t BitSize) const;
2692
2693 /// Convert a size in characters to a size in bits.
2694 int64_t toBits(CharUnits CharSize) const;
2695
2696 /// Return the size of the specified (complete) type \p T, in
2697 /// characters.
2699 CharUnits getTypeSizeInChars(const Type *T) const;
2700
2701 std::optional<CharUnits> getTypeSizeInCharsIfKnown(QualType Ty) const {
2702 if (Ty->isIncompleteType() || Ty->isDependentType())
2703 return std::nullopt;
2704 return getTypeSizeInChars(Ty);
2705 }
2706
2707 std::optional<CharUnits> getTypeSizeInCharsIfKnown(const Type *Ty) const {
2708 return getTypeSizeInCharsIfKnown(QualType(Ty, 0));
2709 }
2710
2711 /// Return the ABI-specified alignment of a (complete) type \p T, in
2712 /// bits.
2713 unsigned getTypeAlign(QualType T) const { return getTypeInfo(T).Align; }
2714 unsigned getTypeAlign(const Type *T) const { return getTypeInfo(T).Align; }
2715
2716 /// Return the ABI-specified natural alignment of a (complete) type \p T,
2717 /// before alignment adjustments, in bits.
2718 ///
2719 /// This alignment is currently used only by ARM and AArch64 when passing
2720 /// arguments of a composite type.
2722 return getTypeUnadjustedAlign(T.getTypePtr());
2723 }
2724 unsigned getTypeUnadjustedAlign(const Type *T) const;
2725
2726 /// Return the alignment of a type, in bits, or 0 if
2727 /// the type is incomplete and we cannot determine the alignment (for
2728 /// example, from alignment attributes). The returned alignment is the
2729 /// Preferred alignment if NeedsPreferredAlignment is true, otherwise is the
2730 /// ABI alignment.
2732 bool NeedsPreferredAlignment = false) const;
2733
2734 /// Return the ABI-specified alignment of a (complete) type \p T, in
2735 /// characters.
2737 CharUnits getTypeAlignInChars(const Type *T) const;
2738
2739 /// Return the PreferredAlignment of a (complete) type \p T, in
2740 /// characters.
2744
2745 /// getTypeUnadjustedAlignInChars - Return the ABI-specified alignment of a type,
2746 /// in characters, before alignment adjustments. This method does not work on
2747 /// incomplete types.
2750
2751 // getTypeInfoDataSizeInChars - Return the size of a type, in chars. If the
2752 // type is a record, its data size is returned.
2754
2755 TypeInfoChars getTypeInfoInChars(const Type *T) const;
2757
2758 /// Determine if the alignment the type has was required using an
2759 /// alignment attribute.
2760 bool isAlignmentRequired(const Type *T) const;
2761 bool isAlignmentRequired(QualType T) const;
2762
2763 /// More type predicates useful for type checking/promotion
2764 bool isPromotableIntegerType(QualType T) const; // C99 6.3.1.1p2
2765
2766 /// Return the "preferred" alignment of the specified type \p T for
2767 /// the current target, in bits.
2768 ///
2769 /// This can be different than the ABI alignment in cases where it is
2770 /// beneficial for performance or backwards compatibility preserving to
2771 /// overalign a data type. (Note: despite the name, the preferred alignment
2772 /// is ABI-impacting, and not an optimization.)
2774 return getPreferredTypeAlign(T.getTypePtr());
2775 }
2776 unsigned getPreferredTypeAlign(const Type *T) const;
2777
2778 /// Return the default alignment for __attribute__((aligned)) on
2779 /// this target, to be used if no alignment value is specified.
2781
2782 /// Return the alignment in bits that should be given to a
2783 /// global variable with type \p T. If \p VD is non-null it will be
2784 /// considered specifically for the query.
2785 unsigned getAlignOfGlobalVar(QualType T, const VarDecl *VD) const;
2786
2787 /// Return the alignment in characters that should be given to a
2788 /// global variable with type \p T. If \p VD is non-null it will be
2789 /// considered specifically for the query.
2791
2792 /// Return the minimum alignment as specified by the target. If \p VD is
2793 /// non-null it may be used to identify external or weak variables.
2794 unsigned getMinGlobalAlignOfVar(uint64_t Size, const VarDecl *VD) const;
2795
2796 /// Return a conservative estimate of the alignment of the specified
2797 /// decl \p D.
2798 ///
2799 /// \pre \p D must not be a bitfield type, as bitfields do not have a valid
2800 /// alignment.
2801 ///
2802 /// If \p ForAlignof, references are treated like their underlying type
2803 /// and large arrays don't get any special treatment. If not \p ForAlignof
2804 /// it computes the value expected by CodeGen: references are treated like
2805 /// pointers and large arrays get extra alignment.
2806 CharUnits getDeclAlign(const Decl *D, bool ForAlignof = false) const;
2807
2808 /// Return the alignment (in bytes) of the thrown exception object. This is
2809 /// only meaningful for targets that allocate C++ exceptions in a system
2810 /// runtime, such as those using the Itanium C++ ABI.
2812
2813 /// Return whether unannotated records are treated as if they have
2814 /// [[gnu::ms_struct]].
2815 bool defaultsToMsStruct() const;
2816
2817 /// Get or compute information about the layout of the specified
2818 /// record (struct/union/class) \p D, which indicates its size and field
2819 /// position information.
2820 const ASTRecordLayout &getASTRecordLayout(const RecordDecl *D) const;
2821
2822 /// Get or compute information about the layout of the specified
2823 /// Objective-C interface.
2825 const;
2826
2827 void DumpRecordLayout(const RecordDecl *RD, raw_ostream &OS,
2828 bool Simple = false) const;
2829
2830 /// Get our current best idea for the key function of the
2831 /// given record decl, or nullptr if there isn't one.
2832 ///
2833 /// The key function is, according to the Itanium C++ ABI section 5.2.3:
2834 /// ...the first non-pure virtual function that is not inline at the
2835 /// point of class definition.
2836 ///
2837 /// Other ABIs use the same idea. However, the ARM C++ ABI ignores
2838 /// virtual functions that are defined 'inline', which means that
2839 /// the result of this computation can change.
2841
2842 /// Observe that the given method cannot be a key function.
2843 /// Checks the key-function cache for the method's class and clears it
2844 /// if matches the given declaration.
2845 ///
2846 /// This is used in ABIs where out-of-line definitions marked
2847 /// inline are not considered to be key functions.
2848 ///
2849 /// \param method should be the declaration from the class definition
2850 void setNonKeyFunction(const CXXMethodDecl *method);
2851
2852 /// Loading virtual member pointers using the virtual inheritance model
2853 /// always results in an adjustment using the vbtable even if the index is
2854 /// zero.
2855 ///
2856 /// This is usually OK because the first slot in the vbtable points
2857 /// backwards to the top of the MDC. However, the MDC might be reusing a
2858 /// vbptr from an nv-base. In this case, the first slot in the vbtable
2859 /// points to the start of the nv-base which introduced the vbptr and *not*
2860 /// the MDC. Modify the NonVirtualBaseAdjustment to account for this.
2862
2863 /// Get the offset of a FieldDecl or IndirectFieldDecl, in bits.
2864 uint64_t getFieldOffset(const ValueDecl *FD) const;
2865
2866 /// Get the offset of an ObjCIvarDecl in bits.
2867 uint64_t lookupFieldBitOffset(const ObjCInterfaceDecl *OID,
2868 const ObjCIvarDecl *Ivar) const;
2869
2870 /// Find the 'this' offset for the member path in a pointer-to-member
2871 /// APValue.
2873
2874 bool isNearlyEmpty(const CXXRecordDecl *RD) const;
2875
2877
2878 /// If \p T is null pointer, assume the target in ASTContext.
2879 MangleContext *createMangleContext(const TargetInfo *T = nullptr);
2880
2881 /// Creates a device mangle context to correctly mangle lambdas in a mixed
2882 /// architecture compile by setting the lambda mangling number source to the
2883 /// DeviceLambdaManglingNumber. Currently this asserts that the TargetInfo
2884 /// (from the AuxTargetInfo) is a an itanium target.
2886
2887 void DeepCollectObjCIvars(const ObjCInterfaceDecl *OI, bool leafClass,
2889
2890 unsigned CountNonClassIvars(const ObjCInterfaceDecl *OI) const;
2891 void CollectInheritedProtocols(const Decl *CDecl,
2893
2894 /// Return true if the specified type has unique object representations
2895 /// according to (C++17 [meta.unary.prop]p9)
2896 bool
2898 bool CheckIfTriviallyCopyable = true) const;
2899
2900 //===--------------------------------------------------------------------===//
2901 // Type Operators
2902 //===--------------------------------------------------------------------===//
2903
2904 /// Return the canonical (structural) type corresponding to the
2905 /// specified potentially non-canonical type \p T.
2906 ///
2907 /// The non-canonical version of a type may have many "decorated" versions of
2908 /// types. Decorators can include typedefs, 'typeof' operators, etc. The
2909 /// returned type is guaranteed to be free of any of these, allowing two
2910 /// canonical types to be compared for exact equality with a simple pointer
2911 /// comparison.
2913 return CanQualType::CreateUnsafe(T.getCanonicalType());
2914 }
2915
2916 static const Type *getCanonicalType(const Type *T) {
2917 return T->getCanonicalTypeInternal().getTypePtr();
2918 }
2919
2920 /// Return the canonical parameter type corresponding to the specific
2921 /// potentially non-canonical one.
2922 ///
2923 /// Qualifiers are stripped off, functions are turned into function
2924 /// pointers, and arrays decay one level into pointers.
2926
2927 /// Determine whether the given types \p T1 and \p T2 are equivalent.
2928 static bool hasSameType(QualType T1, QualType T2) {
2929 return getCanonicalType(T1) == getCanonicalType(T2);
2930 }
2931 static bool hasSameType(const Type *T1, const Type *T2) {
2932 return getCanonicalType(T1) == getCanonicalType(T2);
2933 }
2934
2935 /// Determine whether the given expressions \p X and \p Y are equivalent.
2936 bool hasSameExpr(const Expr *X, const Expr *Y) const;
2937
2938 /// Return this type as a completely-unqualified array type,
2939 /// capturing the qualifiers in \p Quals.
2940 ///
2941 /// This will remove the minimal amount of sugaring from the types, similar
2942 /// to the behavior of QualType::getUnqualifiedType().
2943 ///
2944 /// \param T is the qualified type, which may be an ArrayType
2945 ///
2946 /// \param Quals will receive the full set of qualifiers that were
2947 /// applied to the array.
2948 ///
2949 /// \returns if this is an array type, the completely unqualified array type
2950 /// that corresponds to it. Otherwise, returns T.getUnqualifiedType().
2953 Qualifiers Quals;
2954 return getUnqualifiedArrayType(T, Quals);
2955 }
2956
2957 /// Determine whether the given types are equivalent after
2958 /// cvr-qualifiers have been removed.
2960 return getCanonicalType(T1).getTypePtr() ==
2962 }
2963
2965 bool IsParam) const {
2966 auto SubTnullability = SubT->getNullability();
2967 auto SuperTnullability = SuperT->getNullability();
2968 if (SubTnullability.has_value() == SuperTnullability.has_value()) {
2969 // Neither has nullability; return true
2970 if (!SubTnullability)
2971 return true;
2972 // Both have nullability qualifier.
2973 if (*SubTnullability == *SuperTnullability ||
2974 *SubTnullability == NullabilityKind::Unspecified ||
2975 *SuperTnullability == NullabilityKind::Unspecified)
2976 return true;
2977
2978 if (IsParam) {
2979 // Ok for the superclass method parameter to be "nonnull" and the subclass
2980 // method parameter to be "nullable"
2981 return (*SuperTnullability == NullabilityKind::NonNull &&
2982 *SubTnullability == NullabilityKind::Nullable);
2983 }
2984 // For the return type, it's okay for the superclass method to specify
2985 // "nullable" and the subclass method specify "nonnull"
2986 return (*SuperTnullability == NullabilityKind::Nullable &&
2987 *SubTnullability == NullabilityKind::NonNull);
2988 }
2989 return true;
2990 }
2991
2992 bool ObjCMethodsAreEqual(const ObjCMethodDecl *MethodDecl,
2993 const ObjCMethodDecl *MethodImp);
2994
2995 bool UnwrapSimilarTypes(QualType &T1, QualType &T2,
2996 bool AllowPiMismatch = true) const;
2998 bool AllowPiMismatch = true) const;
2999
3000 /// Determine if two types are similar, according to the C++ rules. That is,
3001 /// determine if they are the same other than qualifiers on the initial
3002 /// sequence of pointer / pointer-to-member / array (and in Clang, object
3003 /// pointer) types and their element types.
3004 ///
3005 /// Clang offers a number of qualifiers in addition to the C++ qualifiers;
3006 /// those qualifiers are also ignored in the 'similarity' check.
3007 bool hasSimilarType(QualType T1, QualType T2) const;
3008
3009 /// Determine if two types are similar, ignoring only CVR qualifiers.
3010 bool hasCvrSimilarType(QualType T1, QualType T2);
3011
3012 /// Retrieves the default calling convention for the current context.
3013 ///
3014 /// The context's default calling convention may differ from the current
3015 /// target's default calling convention if the -fdefault-calling-conv option
3016 /// is used; to get the target's default calling convention, e.g. for built-in
3017 /// functions, call getTargetInfo().getDefaultCallingConv() instead.
3019 bool IsCXXMethod) const;
3020
3021 /// Retrieves the "canonical" template name that refers to a
3022 /// given template.
3023 ///
3024 /// The canonical template name is the simplest expression that can
3025 /// be used to refer to a given template. For most templates, this
3026 /// expression is just the template declaration itself. For example,
3027 /// the template std::vector can be referred to via a variety of
3028 /// names---std::vector, \::std::vector, vector (if vector is in
3029 /// scope), etc.---but all of these names map down to the same
3030 /// TemplateDecl, which is used to form the canonical template name.
3031 ///
3032 /// Dependent template names are more interesting. Here, the
3033 /// template name could be something like T::template apply or
3034 /// std::allocator<T>::template rebind, where the nested name
3035 /// specifier itself is dependent. In this case, the canonical
3036 /// template name uses the shortest form of the dependent
3037 /// nested-name-specifier, which itself contains all canonical
3038 /// types, values, and templates.
3040 bool IgnoreDeduced = false) const;
3041
3042 /// Determine whether the given template names refer to the same
3043 /// template.
3044 bool hasSameTemplateName(const TemplateName &X, const TemplateName &Y,
3045 bool IgnoreDeduced = false) const;
3046
3047 /// Determine whether the two declarations refer to the same entity.
3048 bool isSameEntity(const NamedDecl *X, const NamedDecl *Y) const;
3049
3050 /// Determine whether two template parameter lists are similar enough
3051 /// that they may be used in declarations of the same template.
3053 const TemplateParameterList *Y) const;
3054
3055 /// Determine whether two template parameters are similar enough
3056 /// that they may be used in declarations of the same template.
3057 bool isSameTemplateParameter(const NamedDecl *X, const NamedDecl *Y) const;
3058
3059 /// Determine whether two 'requires' expressions are similar enough that they
3060 /// may be used in re-declarations.
3061 ///
3062 /// Use of 'requires' isn't mandatory, works with constraints expressed in
3063 /// other ways too.
3065 const AssociatedConstraint &ACY) const;
3066
3067 /// Determine whether two 'requires' expressions are similar enough that they
3068 /// may be used in re-declarations.
3069 ///
3070 /// Use of 'requires' isn't mandatory, works with constraints expressed in
3071 /// other ways too.
3072 bool isSameConstraintExpr(const Expr *XCE, const Expr *YCE) const;
3073
3074 /// Determine whether two type contraint are similar enough that they could
3075 /// used in declarations of the same template.
3076 bool isSameTypeConstraint(const TypeConstraint *XTC,
3077 const TypeConstraint *YTC) const;
3078
3079 /// Determine whether two default template arguments are similar enough
3080 /// that they may be used in declarations of the same template.
3082 const NamedDecl *Y) const;
3083
3084 /// Retrieve the "canonical" template argument.
3085 ///
3086 /// The canonical template argument is the simplest template argument
3087 /// (which may be a type, value, expression, or declaration) that
3088 /// expresses the value of the argument.
3090 const;
3091
3092 /// Canonicalize the given template argument list.
3093 ///
3094 /// Returns true if any arguments were non-canonical, false otherwise.
3095 bool
3097
3098 /// Canonicalize the given TemplateTemplateParmDecl.
3101
3103 TemplateTemplateParmDecl *TTP) const;
3105 TemplateTemplateParmDecl *CanonTTP) const;
3106
3107 /// Determine whether the given template arguments \p Arg1 and \p Arg2 are
3108 /// equivalent.
3110 const TemplateArgument &Arg2) const;
3111
3112 /// Type Query functions. If the type is an instance of the specified class,
3113 /// return the Type pointer for the underlying maximally pretty type. This
3114 /// is a member of ASTContext because this may need to do some amount of
3115 /// canonicalization, e.g. to move type qualifiers into the element type.
3116 const ArrayType *getAsArrayType(QualType T) const;
3118 return dyn_cast_or_null<ConstantArrayType>(getAsArrayType(T));
3119 }
3121 return dyn_cast_or_null<VariableArrayType>(getAsArrayType(T));
3122 }
3124 return dyn_cast_or_null<IncompleteArrayType>(getAsArrayType(T));
3125 }
3127 const {
3128 return dyn_cast_or_null<DependentSizedArrayType>(getAsArrayType(T));
3129 }
3130
3131 /// Return the innermost element type of an array type.
3132 ///
3133 /// For example, will return "int" for int[m][n]
3134 QualType getBaseElementType(const ArrayType *VAT) const;
3135
3136 /// Return the innermost element type of a type (which needn't
3137 /// actually be an array type).
3139
3140 /// Return number of constant array elements.
3141 uint64_t getConstantArrayElementCount(const ConstantArrayType *CA) const;
3142
3143 /// Return number of elements initialized in an ArrayInitLoopExpr.
3144 uint64_t
3146
3147 /// Perform adjustment on the parameter type of a function.
3148 ///
3149 /// This routine adjusts the given parameter type @p T to the actual
3150 /// parameter type used by semantic analysis (C99 6.7.5.3p[7,8],
3151 /// C++ [dcl.fct]p3). The adjusted parameter type is returned.
3153
3154 /// Retrieve the parameter type as adjusted for use in the signature
3155 /// of a function, decaying array and function types and removing top-level
3156 /// cv-qualifiers.
3158
3160
3161 /// Return the properly qualified result of decaying the specified
3162 /// array type to a pointer.
3163 ///
3164 /// This operation is non-trivial when handling typedefs etc. The canonical
3165 /// type of \p T must be an array type, this returns a pointer to a properly
3166 /// qualified element of the array.
3167 ///
3168 /// See C99 6.7.5.3p7 and C99 6.3.2.1p3.
3170
3171 /// Return the type that \p PromotableType will promote to: C99
3172 /// 6.3.1.1p2, assuming that \p PromotableType is a promotable integer type.
3173 QualType getPromotedIntegerType(QualType PromotableType) const;
3174
3175 /// Recurses in pointer/array types until it finds an Objective-C
3176 /// retainable type and returns its ownership.
3178
3179 /// Whether this is a promotable bitfield reference according
3180 /// to C99 6.3.1.1p2, bullet 2 (and GCC extensions).
3181 ///
3182 /// \returns the type this bit-field will promote to, or NULL if no
3183 /// promotion occurs.
3185
3186 /// Return the highest ranked integer type, see C99 6.3.1.8p1.
3187 ///
3188 /// If \p LHS > \p RHS, returns 1. If \p LHS == \p RHS, returns 0. If
3189 /// \p LHS < \p RHS, return -1.
3190 int getIntegerTypeOrder(QualType LHS, QualType RHS) const;
3191
3192 /// Compare the rank of the two specified floating point types,
3193 /// ignoring the domain of the type (i.e. 'double' == '_Complex double').
3194 ///
3195 /// If \p LHS > \p RHS, returns 1. If \p LHS == \p RHS, returns 0. If
3196 /// \p LHS < \p RHS, return -1.
3197 int getFloatingTypeOrder(QualType LHS, QualType RHS) const;
3198
3199 /// Compare the rank of two floating point types as above, but compare equal
3200 /// if both types have the same floating-point semantics on the target (i.e.
3201 /// long double and double on AArch64 will return 0).
3203
3204 unsigned getTargetAddressSpace(LangAS AS) const;
3205
3206 LangAS getLangASForBuiltinAddressSpace(unsigned AS) const;
3207
3208 /// Get target-dependent integer value for null pointer which is used for
3209 /// constant folding.
3210 uint64_t getTargetNullPointerValue(QualType QT) const;
3211
3213 return AddrSpaceMapMangling || isTargetAddressSpace(AS);
3214 }
3215
3216 bool hasAnyFunctionEffects() const { return AnyFunctionEffects; }
3217
3218 // Merges two exception specifications, such that the resulting
3219 // exception spec is the union of both. For example, if either
3220 // of them can throw something, the result can throw it as well.
3224 SmallVectorImpl<QualType> &ExceptionTypeStorage,
3225 bool AcceptDependent) const;
3226
3227 // For two "same" types, return a type which has
3228 // the common sugar between them. If Unqualified is true,
3229 // both types need only be the same unqualified type.
3230 // The result will drop the qualifiers which do not occur
3231 // in both types.
3233 bool Unqualified = false) const;
3234
3235private:
3236 // Helper for integer ordering
3237 unsigned getIntegerRank(const Type *T) const;
3238
3239public:
3240 //===--------------------------------------------------------------------===//
3241 // Type Compatibility Predicates
3242 //===--------------------------------------------------------------------===//
3243
3244 /// Compatibility predicates used to check assignment expressions.
3246 bool CompareUnqualified = false); // C99 6.2.7p1
3247
3250
3251 bool isObjCIdType(QualType T) const { return T == getObjCIdType(); }
3252
3253 bool isObjCClassType(QualType T) const { return T == getObjCClassType(); }
3254
3255 bool isObjCSelType(QualType T) const { return T == getObjCSelType(); }
3256
3258 const ObjCObjectPointerType *RHS,
3259 bool ForCompare);
3260
3262 const ObjCObjectPointerType *RHS);
3263
3264 // Check the safety of assignment from LHS to RHS
3266 const ObjCObjectPointerType *RHSOPT);
3268 const ObjCObjectType *RHS);
3270 const ObjCObjectPointerType *LHSOPT,
3271 const ObjCObjectPointerType *RHSOPT,
3272 bool BlockReturnType);
3275 const ObjCObjectPointerType *RHSOPT);
3277
3278 // Functions for calculating composite types
3279 QualType mergeTypes(QualType, QualType, bool OfBlockPointer = false,
3280 bool Unqualified = false, bool BlockReturnType = false,
3281 bool IsConditionalOperator = false);
3282 QualType mergeFunctionTypes(QualType, QualType, bool OfBlockPointer = false,
3283 bool Unqualified = false, bool AllowCXX = false,
3284 bool IsConditionalOperator = false);
3286 bool OfBlockPointer = false,
3287 bool Unqualified = false);
3289 bool OfBlockPointer=false,
3290 bool Unqualified = false);
3292
3294
3295 /// This function merges the ExtParameterInfo lists of two functions. It
3296 /// returns true if the lists are compatible. The merged list is returned in
3297 /// NewParamInfos.
3298 ///
3299 /// \param FirstFnType The type of the first function.
3300 ///
3301 /// \param SecondFnType The type of the second function.
3302 ///
3303 /// \param CanUseFirst This flag is set to true if the first function's
3304 /// ExtParameterInfo list can be used as the composite list of
3305 /// ExtParameterInfo.
3306 ///
3307 /// \param CanUseSecond This flag is set to true if the second function's
3308 /// ExtParameterInfo list can be used as the composite list of
3309 /// ExtParameterInfo.
3310 ///
3311 /// \param NewParamInfos The composite list of ExtParameterInfo. The list is
3312 /// empty if none of the flags are set.
3313 ///
3315 const FunctionProtoType *FirstFnType,
3316 const FunctionProtoType *SecondFnType,
3317 bool &CanUseFirst, bool &CanUseSecond,
3319
3320 void ResetObjCLayout(const ObjCInterfaceDecl *D);
3321
3323 const ObjCInterfaceDecl *SubClass) {
3324 ObjCSubClasses[D].push_back(SubClass);
3325 }
3326
3327 //===--------------------------------------------------------------------===//
3328 // Integer Predicates
3329 //===--------------------------------------------------------------------===//
3330
3331 // The width of an integer, as defined in C99 6.2.6.2. This is the number
3332 // of bits in an integer type excluding any padding bits.
3333 unsigned getIntWidth(QualType T) const;
3334
3335 // Per C99 6.2.5p6, for every signed integer type, there is a corresponding
3336 // unsigned integer type. This method takes a signed type, and returns the
3337 // corresponding unsigned integer type.
3338 // With the introduction of fixed point types in ISO N1169, this method also
3339 // accepts fixed point types and returns the corresponding unsigned type for
3340 // a given fixed point type.
3342
3343 // Per C99 6.2.5p6, for every signed integer type, there is a corresponding
3344 // unsigned integer type. This method takes an unsigned type, and returns the
3345 // corresponding signed integer type.
3346 // With the introduction of fixed point types in ISO N1169, this method also
3347 // accepts fixed point types and returns the corresponding signed type for
3348 // a given fixed point type.
3350
3351 // Per ISO N1169, this method accepts fixed point types and returns the
3352 // corresponding saturated type for a given fixed point type.
3354
3355 // Per ISO N1169, this method accepts fixed point types and returns the
3356 // corresponding non-saturated type for a given fixed point type.
3358
3359 // This method accepts fixed point types and returns the corresponding signed
3360 // type. Unlike getCorrespondingUnsignedType(), this only accepts unsigned
3361 // fixed point types because there are unsigned integer types like bool and
3362 // char8_t that don't have signed equivalents.
3364
3365 //===--------------------------------------------------------------------===//
3366 // Integer Values
3367 //===--------------------------------------------------------------------===//
3368
3369 /// Make an APSInt of the appropriate width and signedness for the
3370 /// given \p Value and integer \p Type.
3371 llvm::APSInt MakeIntValue(uint64_t Value, QualType Type) const {
3372 // If Type is a signed integer type larger than 64 bits, we need to be sure
3373 // to sign extend Res appropriately.
3374 llvm::APSInt Res(64, !Type->isSignedIntegerOrEnumerationType());
3375 Res = Value;
3376 unsigned Width = getIntWidth(Type);
3377 if (Width != Res.getBitWidth())
3378 return Res.extOrTrunc(Width);
3379 return Res;
3380 }
3381
3382 bool isSentinelNullExpr(const Expr *E);
3383
3384 /// Get the implementation of the ObjCInterfaceDecl \p D, or nullptr if
3385 /// none exists.
3387
3388 /// Get the implementation of the ObjCCategoryDecl \p D, or nullptr if
3389 /// none exists.
3391
3392 /// Return true if there is at least one \@implementation in the TU.
3394 return !ObjCImpls.empty();
3395 }
3396
3397 /// Set the implementation of ObjCInterfaceDecl.
3399 ObjCImplementationDecl *ImplD);
3400
3401 /// Set the implementation of ObjCCategoryDecl.
3403 ObjCCategoryImplDecl *ImplD);
3404
3405 /// Get the duplicate declaration of a ObjCMethod in the same
3406 /// interface, or null if none exists.
3407 const ObjCMethodDecl *
3409
3411 const ObjCMethodDecl *Redecl);
3412
3413 /// Returns the Objective-C interface that \p ND belongs to if it is
3414 /// an Objective-C method/property/ivar etc. that is part of an interface,
3415 /// otherwise returns null.
3417
3418 /// Set the copy initialization expression of a block var decl. \p CanThrow
3419 /// indicates whether the copy expression can throw or not.
3420 void setBlockVarCopyInit(const VarDecl* VD, Expr *CopyExpr, bool CanThrow);
3421
3422 /// Get the copy initialization expression of the VarDecl \p VD, or
3423 /// nullptr if none exists.
3425
3426 /// Allocate an uninitialized TypeSourceInfo.
3427 ///
3428 /// The caller should initialize the memory held by TypeSourceInfo using
3429 /// the TypeLoc wrappers.
3430 ///
3431 /// \param T the type that will be the basis for type source info. This type
3432 /// should refer to how the declarator was written in source code, not to
3433 /// what type semantic analysis resolved the declarator to.
3434 ///
3435 /// \param Size the size of the type info to create, or 0 if the size
3436 /// should be calculated based on the type.
3437 TypeSourceInfo *CreateTypeSourceInfo(QualType T, unsigned Size = 0) const;
3438
3439 /// Allocate a TypeSourceInfo where all locations have been
3440 /// initialized to a given location, which defaults to the empty
3441 /// location.
3444 SourceLocation Loc = SourceLocation()) const;
3445
3446 /// Add a deallocation callback that will be invoked when the
3447 /// ASTContext is destroyed.
3448 ///
3449 /// \param Callback A callback function that will be invoked on destruction.
3450 ///
3451 /// \param Data Pointer data that will be provided to the callback function
3452 /// when it is called.
3453 void AddDeallocation(void (*Callback)(void *), void *Data) const;
3454
3455 /// If T isn't trivially destructible, calls AddDeallocation to register it
3456 /// for destruction.
3457 template <typename T> void addDestruction(T *Ptr) const {
3458 if (!std::is_trivially_destructible<T>::value) {
3459 auto DestroyPtr = [](void *V) { static_cast<T *>(V)->~T(); };
3460 AddDeallocation(DestroyPtr, Ptr);
3461 }
3462 }
3463
3466
3467 /// Determines if the decl can be CodeGen'ed or deserialized from PCH
3468 /// lazily, only when used; this is only relevant for function or file scoped
3469 /// var definitions.
3470 ///
3471 /// \returns true if the function/var must be CodeGen'ed/deserialized even if
3472 /// it is not used.
3473 bool DeclMustBeEmitted(const Decl *D);
3474
3475 /// Visits all versions of a multiversioned function with the passed
3476 /// predicate.
3478 const FunctionDecl *FD,
3479 llvm::function_ref<void(FunctionDecl *)> Pred) const;
3480
3481 const CXXConstructorDecl *
3483
3485 CXXConstructorDecl *CD);
3486
3488
3490
3492
3494
3495 void setManglingNumber(const NamedDecl *ND, unsigned Number);
3496 unsigned getManglingNumber(const NamedDecl *ND,
3497 bool ForAuxTarget = false) const;
3498
3499 void setStaticLocalNumber(const VarDecl *VD, unsigned Number);
3500 unsigned getStaticLocalNumber(const VarDecl *VD) const;
3501
3503 return !TypeAwareOperatorNewAndDeletes.empty();
3504 }
3505 void setIsDestroyingOperatorDelete(const FunctionDecl *FD, bool IsDestroying);
3506 bool isDestroyingOperatorDelete(const FunctionDecl *FD) const;
3508 bool IsTypeAware);
3509 bool isTypeAwareOperatorNewOrDelete(const FunctionDecl *FD) const;
3510
3512
3514 FunctionDecl *OperatorDelete,
3515 OperatorDeleteKind K) const;
3517 OperatorDeleteKind K) const;
3519 OperatorDeleteKind K) const;
3522
3523 /// Retrieve the context for computing mangling numbers in the given
3524 /// DeclContext.
3528 const Decl *D);
3529
3530 std::unique_ptr<MangleNumberingContext> createMangleNumberingContext() const;
3531
3532 /// Used by ParmVarDecl to store on the side the
3533 /// index of the parameter when it exceeds the size of the normal bitfield.
3534 void setParameterIndex(const ParmVarDecl *D, unsigned index);
3535
3536 /// Used by ParmVarDecl to retrieve on the side the
3537 /// index of the parameter when it exceeds the size of the normal bitfield.
3538 unsigned getParameterIndex(const ParmVarDecl *D) const;
3539
3540 /// Return a string representing the human readable name for the specified
3541 /// function declaration or file name. Used by SourceLocExpr and
3542 /// PredefinedExpr to cache evaluated results.
3544
3545 /// Return the next version number to be used for a string literal evaluated
3546 /// as part of constant evaluation.
3547 unsigned getNextStringLiteralVersion() { return NextStringLiteralVersion++; }
3548
3549 /// Return a declaration for the global GUID object representing the given
3550 /// GUID value.
3552
3553 /// Return a declaration for a uniquified anonymous global constant
3554 /// corresponding to a given APValue.
3557
3558 /// Return the template parameter object of the given type with the given
3559 /// value.
3561 const APValue &V) const;
3562
3563 /// Parses the target attributes passed in, and returns only the ones that are
3564 /// valid feature names.
3565 ParsedTargetAttr filterFunctionTargetAttrs(const TargetAttr *TD) const;
3566
3567 void getFunctionFeatureMap(llvm::StringMap<bool> &FeatureMap,
3568 const FunctionDecl *) const;
3569 void getFunctionFeatureMap(llvm::StringMap<bool> &FeatureMap,
3570 GlobalDecl GD) const;
3571
3572 /// Generates and stores SYCL kernel metadata for the provided
3573 /// SYCL kernel entry point function. The provided function must have
3574 /// an attached sycl_kernel_entry_point attribute that specifies a unique
3575 /// type for the name of a SYCL kernel. Callers are required to detect
3576 /// conflicting SYCL kernel names and issue a diagnostic prior to calling
3577 /// this function.
3579
3580 /// Given a type used as a SYCL kernel name, returns a reference to the
3581 /// metadata generated from the corresponding SYCL kernel entry point.
3582 /// Aborts if the provided type is not a registered SYCL kernel name.
3584
3585 /// Returns a pointer to the metadata generated from the corresponding
3586 /// SYCLkernel entry point if the provided type corresponds to a registered
3587 /// SYCL kernel name. Returns a null pointer otherwise.
3589
3590 //===--------------------------------------------------------------------===//
3591 // Statistics
3592 //===--------------------------------------------------------------------===//
3593
3594 /// The number of implicitly-declared default constructors.
3596
3597 /// The number of implicitly-declared default constructors for
3598 /// which declarations were built.
3600
3601 /// The number of implicitly-declared copy constructors.
3603
3604 /// The number of implicitly-declared copy constructors for
3605 /// which declarations were built.
3607
3608 /// The number of implicitly-declared move constructors.
3610
3611 /// The number of implicitly-declared move constructors for
3612 /// which declarations were built.
3614
3615 /// The number of implicitly-declared copy assignment operators.
3617
3618 /// The number of implicitly-declared copy assignment operators for
3619 /// which declarations were built.
3621
3622 /// The number of implicitly-declared move assignment operators.
3624
3625 /// The number of implicitly-declared move assignment operators for
3626 /// which declarations were built.
3628
3629 /// The number of implicitly-declared destructors.
3631
3632 /// The number of implicitly-declared destructors for which
3633 /// declarations were built.
3635
3636public:
3637 /// Initialize built-in types.
3638 ///
3639 /// This routine may only be invoked once for a given ASTContext object.
3640 /// It is normally invoked after ASTContext construction.
3641 ///
3642 /// \param Target The target
3643 void InitBuiltinTypes(const TargetInfo &Target,
3644 const TargetInfo *AuxTarget = nullptr);
3645
3646private:
3647 void InitBuiltinType(CanQualType &R, BuiltinType::Kind K);
3648
3649 class ObjCEncOptions {
3650 unsigned Bits;
3651
3652 ObjCEncOptions(unsigned Bits) : Bits(Bits) {}
3653
3654 public:
3655 ObjCEncOptions() : Bits(0) {}
3656
3657#define OPT_LIST(V) \
3658 V(ExpandPointedToStructures, 0) \
3659 V(ExpandStructures, 1) \
3660 V(IsOutermostType, 2) \
3661 V(EncodingProperty, 3) \
3662 V(IsStructField, 4) \
3663 V(EncodeBlockParameters, 5) \
3664 V(EncodeClassNames, 6) \
3665
3666#define V(N,I) ObjCEncOptions& set##N() { Bits |= 1 << I; return *this; }
3667OPT_LIST(V)
3668#undef V
3669
3670#define V(N,I) bool N() const { return Bits & 1 << I; }
3671OPT_LIST(V)
3672#undef V
3673
3674#undef OPT_LIST
3675
3676 [[nodiscard]] ObjCEncOptions keepingOnly(ObjCEncOptions Mask) const {
3677 return Bits & Mask.Bits;
3678 }
3679
3680 [[nodiscard]] ObjCEncOptions forComponentType() const {
3681 ObjCEncOptions Mask = ObjCEncOptions()
3682 .setIsOutermostType()
3683 .setIsStructField();
3684 return Bits & ~Mask.Bits;
3685 }
3686 };
3687
3688 // Return the Objective-C type encoding for a given type.
3689 void getObjCEncodingForTypeImpl(QualType t, std::string &S,
3690 ObjCEncOptions Options,
3691 const FieldDecl *Field,
3692 QualType *NotEncodedT = nullptr) const;
3693
3694 // Adds the encoding of the structure's members.
3695 void getObjCEncodingForStructureImpl(RecordDecl *RD, std::string &S,
3696 const FieldDecl *Field,
3697 bool includeVBases = true,
3698 QualType *NotEncodedT=nullptr) const;
3699
3700public:
3701 // Adds the encoding of a method parameter or return type.
3703 QualType T, std::string& S,
3704 bool Extended) const;
3705
3706 /// Returns true if this is an inline-initialized static data member
3707 /// which is treated as a definition for MSVC compatibility.
3708 bool isMSStaticDataMemberInlineDefinition(const VarDecl *VD) const;
3709
3711 /// Not an inline variable.
3712 None,
3713
3714 /// Weak definition of inline variable.
3716
3717 /// Weak for now, might become strong later in this TU.
3719
3720 /// Strong definition.
3722 };
3723
3724 /// Determine whether a definition of this inline variable should
3725 /// be treated as a weak or strong definition. For compatibility with
3726 /// C++14 and before, for a constexpr static data member, if there is an
3727 /// out-of-line declaration of the member, we may promote it from weak to
3728 /// strong.
3731
3732private:
3734 friend class DeclContext;
3735
3736 const ASTRecordLayout &getObjCLayout(const ObjCInterfaceDecl *D) const;
3737
3738 /// A set of deallocations that should be performed when the
3739 /// ASTContext is destroyed.
3740 // FIXME: We really should have a better mechanism in the ASTContext to
3741 // manage running destructors for types which do variable sized allocation
3742 // within the AST. In some places we thread the AST bump pointer allocator
3743 // into the datastructures which avoids this mess during deallocation but is
3744 // wasteful of memory, and here we require a lot of error prone book keeping
3745 // in order to track and run destructors while we're tearing things down.
3746 using DeallocationFunctionsAndArguments =
3747 llvm::SmallVector<std::pair<void (*)(void *), void *>, 16>;
3748 mutable DeallocationFunctionsAndArguments Deallocations;
3749
3750 // FIXME: This currently contains the set of StoredDeclMaps used
3751 // by DeclContext objects. This probably should not be in ASTContext,
3752 // but we include it here so that ASTContext can quickly deallocate them.
3753 llvm::PointerIntPair<StoredDeclsMap *, 1> LastSDM;
3754
3755 std::vector<Decl *> TraversalScope;
3756
3757 std::unique_ptr<VTableContextBase> VTContext;
3758
3759 void ReleaseDeclContextMaps();
3760
3761public:
3762 enum PragmaSectionFlag : unsigned {
3769 PSF_Invalid = 0x80000000U,
3770 };
3771
3783
3784 llvm::StringMap<SectionInfo> SectionInfos;
3785
3786 /// Return a new OMPTraitInfo object owned by this context.
3788
3789 /// Whether a C++ static variable or CUDA/HIP kernel may be externalized.
3790 bool mayExternalize(const Decl *D) const;
3791
3792 /// Whether a C++ static variable or CUDA/HIP kernel should be externalized.
3793 bool shouldExternalize(const Decl *D) const;
3794
3795 /// Resolve the root record to be used to derive the vtable pointer
3796 /// authentication policy for the specified record.
3797 const CXXRecordDecl *
3798 baseForVTableAuthentication(const CXXRecordDecl *ThisClass) const;
3799
3800 bool useAbbreviatedThunkName(GlobalDecl VirtualMethodDecl,
3801 StringRef MangledName);
3802
3803 StringRef getCUIDHash() const;
3804
3805private:
3806 /// All OMPTraitInfo objects live in this collection, one per
3807 /// `pragma omp [begin] declare variant` directive.
3808 SmallVector<std::unique_ptr<OMPTraitInfo>, 4> OMPTraitInfoVector;
3809
3810 llvm::DenseMap<GlobalDecl, llvm::StringSet<>> ThunksToBeAbbreviated;
3811};
3812
3813/// Insertion operator for diagnostics.
3815 const ASTContext::SectionInfo &Section);
3816
3817/// Utility function for constructing a nullary selector.
3818inline Selector GetNullarySelector(StringRef name, ASTContext &Ctx) {
3819 const IdentifierInfo *II = &Ctx.Idents.get(name);
3820 return Ctx.Selectors.getSelector(0, &II);
3821}
3822
3823/// Utility function for constructing an unary selector.
3824inline Selector GetUnarySelector(StringRef name, ASTContext &Ctx) {
3825 const IdentifierInfo *II = &Ctx.Idents.get(name);
3826 return Ctx.Selectors.getSelector(1, &II);
3827}
3828
3829} // namespace clang
3830
3831// operator new and delete aren't allowed inside namespaces.
3832
3833/// Placement new for using the ASTContext's allocator.
3834///
3835/// This placement form of operator new uses the ASTContext's allocator for
3836/// obtaining memory.
3837///
3838/// IMPORTANT: These are also declared in clang/AST/ASTContextAllocate.h!
3839/// Any changes here need to also be made there.
3840///
3841/// We intentionally avoid using a nothrow specification here so that the calls
3842/// to this operator will not perform a null check on the result -- the
3843/// underlying allocator never returns null pointers.
3844///
3845/// Usage looks like this (assuming there's an ASTContext 'Context' in scope):
3846/// @code
3847/// // Default alignment (8)
3848/// IntegerLiteral *Ex = new (Context) IntegerLiteral(arguments);
3849/// // Specific alignment
3850/// IntegerLiteral *Ex2 = new (Context, 4) IntegerLiteral(arguments);
3851/// @endcode
3852/// Memory allocated through this placement new operator does not need to be
3853/// explicitly freed, as ASTContext will free all of this memory when it gets
3854/// destroyed. Please note that you cannot use delete on the pointer.
3855///
3856/// @param Bytes The number of bytes to allocate. Calculated by the compiler.
3857/// @param C The ASTContext that provides the allocator.
3858/// @param Alignment The alignment of the allocated memory (if the underlying
3859/// allocator supports it).
3860/// @return The allocated memory. Could be nullptr.
3861inline void *operator new(size_t Bytes, const clang::ASTContext &C,
3862 size_t Alignment /* = 8 */) {
3863 return C.Allocate(Bytes, Alignment);
3864}
3865
3866/// Placement delete companion to the new above.
3867///
3868/// This operator is just a companion to the new above. There is no way of
3869/// invoking it directly; see the new operator for more details. This operator
3870/// is called implicitly by the compiler if a placement new expression using
3871/// the ASTContext throws in the object constructor.
3872inline void operator delete(void *Ptr, const clang::ASTContext &C, size_t) {
3873 C.Deallocate(Ptr);
3874}
3875
3876/// This placement form of operator new[] uses the ASTContext's allocator for
3877/// obtaining memory.
3878///
3879/// We intentionally avoid using a nothrow specification here so that the calls
3880/// to this operator will not perform a null check on the result -- the
3881/// underlying allocator never returns null pointers.
3882///
3883/// Usage looks like this (assuming there's an ASTContext 'Context' in scope):
3884/// @code
3885/// // Default alignment (8)
3886/// char *data = new (Context) char[10];
3887/// // Specific alignment
3888/// char *data = new (Context, 4) char[10];
3889/// @endcode
3890/// Memory allocated through this placement new[] operator does not need to be
3891/// explicitly freed, as ASTContext will free all of this memory when it gets
3892/// destroyed. Please note that you cannot use delete on the pointer.
3893///
3894/// @param Bytes The number of bytes to allocate. Calculated by the compiler.
3895/// @param C The ASTContext that provides the allocator.
3896/// @param Alignment The alignment of the allocated memory (if the underlying
3897/// allocator supports it).
3898/// @return The allocated memory. Could be nullptr.
3899inline void *operator new[](size_t Bytes, const clang::ASTContext& C,
3900 size_t Alignment /* = 8 */) {
3901 return C.Allocate(Bytes, Alignment);
3902}
3903
3904/// Placement delete[] companion to the new[] above.
3905///
3906/// This operator is just a companion to the new[] above. There is no way of
3907/// invoking it directly; see the new[] operator for more details. This operator
3908/// is called implicitly by the compiler if a placement new[] expression using
3909/// the ASTContext throws in the object constructor.
3910inline void operator delete[](void *Ptr, const clang::ASTContext &C, size_t) {
3911 C.Deallocate(Ptr);
3912}
3913
3914/// Create the representation of a LazyGenerationalUpdatePtr.
3915template <typename Owner, typename T,
3916 void (clang::ExternalASTSource::*Update)(Owner)>
3919 const clang::ASTContext &Ctx, T Value) {
3920 // Note, this is implemented here so that ExternalASTSource.h doesn't need to
3921 // include ASTContext.h. We explicitly instantiate it for all relevant types
3922 // in ASTContext.cpp.
3923 if (auto *Source = Ctx.getExternalSource())
3924 return new (Ctx) LazyData(Source, Value);
3925 return Value;
3926}
3927template <> struct llvm::DenseMapInfo<llvm::FoldingSetNodeID> {
3928 static FoldingSetNodeID getEmptyKey() { return FoldingSetNodeID{}; }
3929
3930 static FoldingSetNodeID getTombstoneKey() {
3931 FoldingSetNodeID ID;
3932 for (size_t I = 0; I < sizeof(ID) / sizeof(unsigned); ++I) {
3933 ID.AddInteger(std::numeric_limits<unsigned>::max());
3934 }
3935 return ID;
3936 }
3937
3938 static unsigned getHashValue(const FoldingSetNodeID &Val) {
3939 return Val.ComputeHash();
3940 }
3941
3942 static bool isEqual(const FoldingSetNodeID &LHS,
3943 const FoldingSetNodeID &RHS) {
3944 return LHS == RHS;
3945 }
3946};
3947
3948#endif // LLVM_CLANG_AST_ASTCONTEXT_H
#define OPT_LIST(V)
#define V(N, I)
Forward declaration of all AST node types.
static bool CanThrow(Expr *E, ASTContext &Ctx)
Definition CFG.cpp:2788
clang::CharUnits operator*(clang::CharUnits::QuantityType Scale, const clang::CharUnits &CU)
Definition CharUnits.h:225
#define X(type, name)
Definition Value.h:97
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified.
#define SM(sm)
Implements a partial diagnostic that can be emitted anwyhere in a DiagnosticBuilder stream.
This file declares types used to describe SYCL kernels.
Defines the clang::SourceLocation class and associated facilities.
#define CXXABI(Name, Str)
Allows QualTypes to be sorted and hence used in maps and sets.
__SIZE_TYPE__ size_t
The unsigned integer type of the result of the sizeof operator.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
Definition ASTContext.h:220
ASTContext(LangOptions &LOpts, SourceManager &SM, IdentifierTable &idents, SelectorTable &sels, Builtin::Context &builtins, TranslationUnitKind TUKind)
APValue - This class implements a discriminated union of [uninitialized] [APSInt] [APFloat],...
Definition APValue.h:122
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
Definition ASTContext.h:220
bool getByrefLifetime(QualType Ty, Qualifiers::ObjCLifetime &Lifetime, bool &HasByrefExtendedLayout) const
Returns true, if given type has a known lifetime.
MSGuidDecl * getMSGuidDecl(MSGuidDeclParts Parts) const
Return a declaration for the global GUID object representing the given GUID value.
CanQualType AccumTy
BuiltinVectorTypeInfo getBuiltinVectorTypeInfo(const BuiltinType *VecTy) const
Returns the element type, element count and number of vectors (in case of tuple) for a builtin vector...
bool ObjCMethodsAreEqual(const ObjCMethodDecl *MethodDecl, const ObjCMethodDecl *MethodImp)
CanQualType ObjCBuiltinSelTy
SourceManager & getSourceManager()
Definition ASTContext.h:852
TranslationUnitDecl * getTranslationUnitDecl() const
const ConstantArrayType * getAsConstantArrayType(QualType T) const
CanQualType getCanonicalFunctionResultType(QualType ResultType) const
Adjust the given function result type.
QualType getAtomicType(QualType T) const
Return the uniqued reference to the atomic type for the specified type.
LangAS getOpenCLTypeAddrSpace(const Type *T) const
Get address space for OpenCL type.
friend class ASTWriter
Definition ASTContext.h:572
CharUnits getTypeAlignInChars(QualType T) const
Return the ABI-specified alignment of a (complete) type T, in characters.
void InitBuiltinTypes(const TargetInfo &Target, const TargetInfo *AuxTarget=nullptr)
Initialize built-in types.
ParentMapContext & getParentMapContext()
Returns the dynamic AST node parent map context.
QualType getParenType(QualType NamedType) const
size_t getSideTableAllocatedMemory() const
Return the total memory used for various side tables.
MemberSpecializationInfo * getInstantiatedFromStaticDataMember(const VarDecl *Var)
If this variable is an instantiated static data member of a class template specialization,...
QualType getRValueReferenceType(QualType T) const
Return the uniqued reference to the type for an rvalue reference to the specified type.
CanQualType ARCUnbridgedCastTy
uint64_t getTypeSize(const Type *T) const
QualType getDependentSizedMatrixType(QualType ElementType, Expr *RowExpr, Expr *ColumnExpr, SourceLocation AttrLoc) const
Return the unique reference to the matrix type of the specified element type and size.
QualType getBTFTagAttributedType(const BTFTypeTagAttr *BTFAttr, QualType Wrapped) const
llvm::DenseMap< const Decl *, comments::FullComment * > ParsedComments
Mapping from declarations to parsed comments attached to any redeclaration.
unsigned getManglingNumber(const NamedDecl *ND, bool ForAuxTarget=false) const
static const Type * getCanonicalType(const Type *T)
CanQualType LongTy
const SmallVectorImpl< Type * > & getTypes() const
unsigned getIntWidth(QualType T) const
CanQualType getCanonicalParamType(QualType T) const
Return the canonical parameter type corresponding to the specific potentially non-canonical one.
const FunctionType * adjustFunctionType(const FunctionType *Fn, FunctionType::ExtInfo EInfo)
Change the ExtInfo on a function type.
TemplateOrSpecializationInfo getTemplateOrSpecializationInfo(const VarDecl *Var)
CanQualType WIntTy
@ Weak
Weak definition of inline variable.
@ WeakUnknown
Weak for now, might become strong later in this TU.
bool dtorHasOperatorDelete(const CXXDestructorDecl *Dtor, OperatorDeleteKind K) const
const ProfileList & getProfileList() const
Definition ASTContext.h:964
void setObjCConstantStringInterface(ObjCInterfaceDecl *Decl)
TypedefDecl * getObjCClassDecl() const
Retrieve the typedef declaration corresponding to the predefined Objective-C 'Class' type.
TypedefNameDecl * getTypedefNameForUnnamedTagDecl(const TagDecl *TD)
QualType getTypeDeclType(const UnresolvedUsingTypenameDecl *) const =delete
TypedefDecl * getCFConstantStringDecl() const
CanQualType Int128Ty
CanQualType SatUnsignedFractTy
CanQualType getAdjustedType(CanQualType Orig, CanQualType New) const
void setInstantiatedFromUsingDecl(NamedDecl *Inst, NamedDecl *Pattern)
Remember that the using decl Inst is an instantiation of the using decl Pattern of a class template.
bool areCompatibleRVVTypes(QualType FirstType, QualType SecondType)
Return true if the given types are an RISC-V vector builtin type and a VectorType that is a fixed-len...
ExternCContextDecl * getExternCContextDecl() const
const llvm::fltSemantics & getFloatTypeSemantics(QualType T) const
Return the APFloat 'semantics' for the specified scalar floating point type.
ParsedTargetAttr filterFunctionTargetAttrs(const TargetAttr *TD) const
Parses the target attributes passed in, and returns only the ones that are valid feature names.
QualType areCommonBaseCompatible(const ObjCObjectPointerType *LHSOPT, const ObjCObjectPointerType *RHSOPT)
TypedefDecl * getObjCSelDecl() const
Retrieve the typedef corresponding to the predefined 'SEL' type in Objective-C.
llvm::iterator_range< import_iterator > import_range
bool AnyObjCImplementation()
Return true if there is at least one @implementation in the TU.
CanQualType UnsignedShortAccumTy
TypedefDecl * getObjCInstanceTypeDecl()
Retrieve the typedef declaration corresponding to the Objective-C "instancetype" type.
uint64_t getFieldOffset(const ValueDecl *FD) const
Get the offset of a FieldDecl or IndirectFieldDecl, in bits.
void DeallocateDeclListNode(DeclListNode *N)
Deallocates a DeclListNode by returning it to the ListNodeFreeList pool.
Definition ASTContext.h:892
DeclListNode * AllocateDeclListNode(clang::NamedDecl *ND)
Allocates a DeclListNode or returns one from the ListNodeFreeList pool.
Definition ASTContext.h:881
QualType adjustFunctionResultType(QualType FunctionType, QualType NewResultType)
Change the result type of a function type, preserving sugar such as attributed types.
void setTemplateOrSpecializationInfo(VarDecl *Inst, TemplateOrSpecializationInfo TSI)
bool isTypeAwareOperatorNewOrDelete(const FunctionDecl *FD) const
bool ProtocolCompatibleWithProtocol(ObjCProtocolDecl *lProto, ObjCProtocolDecl *rProto) const
ProtocolCompatibleWithProtocol - return 'true' if 'lProto' is in the inheritance hierarchy of 'rProto...
TypedefDecl * buildImplicitTypedef(QualType T, StringRef Name) const
Create a new implicit TU-level typedef declaration.
unsigned getTypeAlign(const Type *T) const
QualType getCanonicalTemplateSpecializationType(ElaboratedTypeKeyword Keyword, TemplateName T, ArrayRef< TemplateArgument > CanonicalArgs) const
QualType getObjCInterfaceType(const ObjCInterfaceDecl *Decl, ObjCInterfaceDecl *PrevDecl=nullptr) const
getObjCInterfaceType - Return the unique reference to the type for the specified ObjC interface decl.
void adjustObjCTypeParamBoundType(const ObjCTypeParamDecl *Orig, ObjCTypeParamDecl *New) const
llvm::StringMap< SectionInfo > SectionInfos
QualType getBlockPointerType(QualType T) const
Return the uniqued reference to the type for a block of the specified type.
TemplateArgument getCanonicalTemplateArgument(const TemplateArgument &Arg) const
Retrieve the "canonical" template argument.
QualType getAutoRRefDeductType() const
C++11 deduction pattern for 'auto &&' type.
TypedefDecl * getBuiltinMSVaListDecl() const
Retrieve the C type declaration corresponding to the predefined __builtin_ms_va_list type.
bool ObjCQualifiedIdTypesAreCompatible(const ObjCObjectPointerType *LHS, const ObjCObjectPointerType *RHS, bool ForCompare)
ObjCQualifiedIdTypesAreCompatible - We know that one of lhs/rhs is an ObjCQualifiedIDType.
static CanQualType getCanonicalType(QualType T)
Return the canonical (structural) type corresponding to the specified potentially non-canonical type ...
QualType getBuiltinVaListType() const
Retrieve the type of the __builtin_va_list type.
QualType mergeFunctionTypes(QualType, QualType, bool OfBlockPointer=false, bool Unqualified=false, bool AllowCXX=false, bool IsConditionalOperator=false)
NamedDecl * getInstantiatedFromUsingDecl(NamedDecl *Inst)
If the given using decl Inst is an instantiation of another (possibly unresolved) using decl,...
DeclarationNameTable DeclarationNames
Definition ASTContext.h:795
comments::FullComment * cloneFullComment(comments::FullComment *FC, const Decl *D) const
bool containsNonRelocatablePointerAuth(QualType T)
Examines a given type, and returns whether the type itself or any data it transitively contains has a...
Definition ASTContext.h:707
CharUnits getObjCEncodingTypeSize(QualType T) const
Return the size of type T for Objective-C encoding purpose, in characters.
int getIntegerTypeOrder(QualType LHS, QualType RHS) const
Return the highest ranked integer type, see C99 6.3.1.8p1.
QualType getObjCClassType() const
Represents the Objective-C Class type.
QualType getAttributedType(attr::Kind attrKind, QualType modifiedType, QualType equivalentType, const Attr *attr=nullptr) const
TypedefDecl * getObjCIdDecl() const
Retrieve the typedef corresponding to the predefined id type in Objective-C.
void setCurrentNamedModule(Module *M)
Set the (C++20) module we are building.
QualType getRawCFConstantStringType() const
Get the structure type used to representation CFStrings, or NULL if it hasn't yet been built.
QualType getProcessIDType() const
Return the unique type for "pid_t" defined in <sys/types.h>.
CharUnits getMemberPointerPathAdjustment(const APValue &MP) const
Find the 'this' offset for the member path in a pointer-to-member APValue.
bool mayExternalize(const Decl *D) const
Whether a C++ static variable or CUDA/HIP kernel may be externalized.
std::unique_ptr< MangleNumberingContext > createMangleNumberingContext() const
CanQualType SatAccumTy
QualType getUnsignedPointerDiffType() const
Return the unique unsigned counterpart of "ptrdiff_t" integer type.
QualType getucontext_tType() const
Retrieve the C ucontext_t type.
std::optional< CharUnits > getTypeSizeInCharsIfKnown(const Type *Ty) const
QualType getScalableVectorType(QualType EltTy, unsigned NumElts, unsigned NumFields=1) const
Return the unique reference to a scalable vector type of the specified element type and scalable numb...
bool hasSameExpr(const Expr *X, const Expr *Y) const
Determine whether the given expressions X and Y are equivalent.
void getObjCEncodingForType(QualType T, std::string &S, const FieldDecl *Field=nullptr, QualType *NotEncodedT=nullptr) const
Emit the Objective-CC type encoding for the given type T into S.
QualType getBuiltinMSVaListType() const
Retrieve the type of the __builtin_ms_va_list type.
MangleContext * createMangleContext(const TargetInfo *T=nullptr)
If T is null pointer, assume the target in ASTContext.
QualType getRealTypeForBitwidth(unsigned DestWidth, FloatModeKind ExplicitType) const
getRealTypeForBitwidth - sets floating point QualTy according to specified bitwidth.
ArrayRef< Decl * > getTraversalScope() const
Definition ASTContext.h:837
QualType getFunctionNoProtoType(QualType ResultTy, const FunctionType::ExtInfo &Info) const
Return a K&R style C function type like 'int()'.
CanQualType ShortAccumTy
ASTMutationListener * getASTMutationListener() const
Retrieve a pointer to the AST mutation listener associated with this AST context, if any.
unsigned NumImplicitCopyAssignmentOperatorsDeclared
The number of implicitly-declared copy assignment operators for which declarations were built.
uint64_t getTargetNullPointerValue(QualType QT) const
Get target-dependent integer value for null pointer which is used for constant folding.
unsigned getTypeUnadjustedAlign(QualType T) const
Return the ABI-specified natural alignment of a (complete) type T, before alignment adjustments,...
unsigned char getFixedPointIBits(QualType Ty) const
QualType getSubstBuiltinTemplatePack(const TemplateArgument &ArgPack)
QualType getCorrespondingSignedFixedPointType(QualType Ty) const
IntrusiveRefCntPtr< ExternalASTSource > ExternalSource
Definition ASTContext.h:796
CanQualType FloatTy
QualType getArrayParameterType(QualType Ty) const
Return the uniqued reference to a specified array parameter type from the original array type.
QualType getCountAttributedType(QualType T, Expr *CountExpr, bool CountInBytes, bool OrNull, ArrayRef< TypeCoupledDeclRefInfo > DependentDecls) const
void setObjCIdRedefinitionType(QualType RedefType)
Set the user-written type that redefines id.
bool isObjCIdType(QualType T) const
const ASTRecordLayout & getASTRecordLayout(const RecordDecl *D) const
Get or compute information about the layout of the specified record (struct/union/class) D,...
DynTypedNodeList getParents(const NodeT &Node)
Forwards to get node parents from the ParentMapContext.
friend class IncrementalParser
Definition ASTContext.h:575
unsigned NumImplicitDestructorsDeclared
The number of implicitly-declared destructors for which declarations were built.
bool isObjCClassType(QualType T) const
void setObjCNSStringType(QualType T)
bool mergeExtParameterInfo(const FunctionProtoType *FirstFnType, const FunctionProtoType *SecondFnType, bool &CanUseFirst, bool &CanUseSecond, SmallVectorImpl< FunctionProtoType::ExtParameterInfo > &NewParamInfos)
This function merges the ExtParameterInfo lists of two functions.
bool ObjCQualifiedClassTypesAreCompatible(const ObjCObjectPointerType *LHS, const ObjCObjectPointerType *RHS)
ObjCQualifiedClassTypesAreCompatible - compare Class<pr,...> and Class<pr1, ...>.
bool shouldExternalize(const Decl *D) const
Whether a C++ static variable or CUDA/HIP kernel should be externalized.
FullSourceLoc getFullLoc(SourceLocation Loc) const
Definition ASTContext.h:968
bool propertyTypesAreCompatible(QualType, QualType)
void setInstantiatedFromUsingShadowDecl(UsingShadowDecl *Inst, UsingShadowDecl *Pattern)
CanQualType DoubleTy
QualType getDependentVectorType(QualType VectorType, Expr *SizeExpr, SourceLocation AttrLoc, VectorKind VecKind) const
Return the unique reference to the type for a dependently sized vector of the specified element type.
comments::CommandTraits & getCommentCommandTraits() const
CanQualType SatLongAccumTy
const XRayFunctionFilter & getXRayFilter() const
Definition ASTContext.h:960
CanQualType getIntMaxType() const
Return the unique type for "intmax_t" (C99 7.18.1.5), defined in <stdint.h>.
QualType getVectorType(QualType VectorType, unsigned NumElts, VectorKind VecKind) const
Return the unique reference to a vector type of the specified element type and size.
OpenCLTypeKind getOpenCLTypeKind(const Type *T) const
Map an AST Type to an OpenCLTypeKind enum value.
FunctionDecl * getcudaGetParameterBufferDecl()
TemplateName getDependentTemplateName(const DependentTemplateStorage &Name) const
Retrieve the template name that represents a dependent template name such as MetaFun::template operat...
QualType getFILEType() const
Retrieve the C FILE type.
ArrayRef< Decl * > getModuleInitializers(Module *M)
Get the initializations to perform when importing a module, if any.
void getObjCEncodingForTypeQualifier(Decl::ObjCDeclQualifier QT, std::string &S) const
Put the string version of the type qualifiers QT into S.
unsigned getPreferredTypeAlign(QualType T) const
Return the "preferred" alignment of the specified type T for the current target, in bits.
void setsigjmp_bufDecl(TypeDecl *sigjmp_bufDecl)
Set the type for the C sigjmp_buf type.
std::string getObjCEncodingForMethodDecl(const ObjCMethodDecl *Decl, bool Extended=false) const
Emit the encoded type for the method declaration Decl into S.
bool classNeedsVectorDeletingDestructor(const CXXRecordDecl *RD)
void DumpRecordLayout(const RecordDecl *RD, raw_ostream &OS, bool Simple=false) const
bool DeclMustBeEmitted(const Decl *D)
Determines if the decl can be CodeGen'ed or deserialized from PCH lazily, only when used; this is onl...
CanQualType LongDoubleTy
CanQualType OMPArrayShapingTy
ASTContext(LangOptions &LOpts, SourceManager &SM, IdentifierTable &idents, SelectorTable &sels, Builtin::Context &builtins, TranslationUnitKind TUKind)
QualType getReadPipeType(QualType T) const
Return a read_only pipe type for the specified type.
std::string getObjCEncodingForPropertyDecl(const ObjCPropertyDecl *PD, const Decl *Container) const
getObjCEncodingForPropertyDecl - Return the encoded type for this method declaration.
CanQualType Char16Ty
TemplateName getCanonicalTemplateName(TemplateName Name, bool IgnoreDeduced=false) const
Retrieves the "canonical" template name that refers to a given template.
unsigned getStaticLocalNumber(const VarDecl *VD) const
QualType getObjCSelRedefinitionType() const
Retrieve the type that 'SEL' has been defined to, which may be different from the built-in 'SEL' if '...
void addComment(const RawComment &RC)
void getLegacyIntegralTypeEncoding(QualType &t) const
getLegacyIntegralTypeEncoding - Another legacy compatibility encoding: 32-bit longs are encoded as 'l...
bool isSameTypeConstraint(const TypeConstraint *XTC, const TypeConstraint *YTC) const
Determine whether two type contraint are similar enough that they could used in declarations of the s...
void setRelocationInfoForCXXRecord(const CXXRecordDecl *, CXXRecordDeclRelocationInfo)
QualType getSubstTemplateTypeParmType(QualType Replacement, Decl *AssociatedDecl, unsigned Index, UnsignedOrNone PackIndex, bool Final) const
Retrieve a substitution-result type.
RecordDecl * buildImplicitRecord(StringRef Name, RecordDecl::TagKind TK=RecordDecl::TagKind::Struct) const
Create a new implicit TU-level CXXRecordDecl or RecordDecl declaration.
void setObjCSelRedefinitionType(QualType RedefType)
Set the user-written type that redefines 'SEL'.
void setFILEDecl(TypeDecl *FILEDecl)
Set the type for the C FILE type.
QualType getPointerType(QualType T) const
Return the uniqued reference to the type for a pointer to the specified type.
const IncompleteArrayType * getAsIncompleteArrayType(QualType T) const
bool defaultsToMsStruct() const
Return whether unannotated records are treated as if they have [[gnu::ms_struct]].
const CXXMethodDecl * getCurrentKeyFunction(const CXXRecordDecl *RD)
Get our current best idea for the key function of the given record decl, or nullptr if there isn't on...
CanQualType UnsignedLongFractTy
QualType mergeTagDefinitions(QualType, QualType)
overridden_method_range overridden_methods(const CXXMethodDecl *Method) const
void setIsTypeAwareOperatorNewOrDelete(const FunctionDecl *FD, bool IsTypeAware)
bool hasSeenTypeAwareOperatorNewOrDelete() const
QualType getDependentBitIntType(bool Unsigned, Expr *BitsExpr) const
Return a dependent bit-precise integer type with the specified signedness and bit count.
void setObjCImplementation(ObjCInterfaceDecl *IFaceD, ObjCImplementationDecl *ImplD)
Set the implementation of ObjCInterfaceDecl.
StringRef getCUIDHash() const
bool isMSStaticDataMemberInlineDefinition(const VarDecl *VD) const
Returns true if this is an inline-initialized static data member which is treated as a definition for...
bool canAssignObjCInterfaces(const ObjCObjectPointerType *LHSOPT, const ObjCObjectPointerType *RHSOPT)
canAssignObjCInterfaces - Return true if the two interface types are compatible for assignment from R...
CanQualType VoidPtrTy
QualType getReferenceQualifiedType(const Expr *e) const
getReferenceQualifiedType - Given an expr, will return the type for that expression,...
bool hasSameFunctionTypeIgnoringExceptionSpec(QualType T, QualType U) const
Determine whether two function types are the same, ignoring exception specifications in cases where t...
bool isObjCSelType(QualType T) const
QualType getBlockDescriptorExtendedType() const
Gets the struct used to keep track of the extended descriptor for pointer to blocks.
void Deallocate(void *Ptr) const
Definition ASTContext.h:871
QualType getLValueReferenceType(QualType T, bool SpelledAsLValue=true) const
Return the uniqued reference to the type for an lvalue reference to the specified type.
void setClassNeedsVectorDeletingDestructor(const CXXRecordDecl *RD)
CanQualType DependentTy
bool QIdProtocolsAdoptObjCObjectProtocols(QualType QT, ObjCInterfaceDecl *IDecl)
QIdProtocolsAdoptObjCObjectProtocols - Checks that protocols in QT's qualified-id protocol list adopt...
FunctionProtoType::ExceptionSpecInfo mergeExceptionSpecs(FunctionProtoType::ExceptionSpecInfo ESI1, FunctionProtoType::ExceptionSpecInfo ESI2, SmallVectorImpl< QualType > &ExceptionTypeStorage, bool AcceptDependent) const
void addLazyModuleInitializers(Module *M, ArrayRef< GlobalDeclID > IDs)
bool isSameConstraintExpr(const Expr *XCE, const Expr *YCE) const
Determine whether two 'requires' expressions are similar enough that they may be used in re-declarati...
bool BlockRequiresCopying(QualType Ty, const VarDecl *D)
Returns true iff we need copy/dispose helpers for the given type.
QualType getTypeDeclType(const TypeAliasDecl *) const =delete
CanQualType NullPtrTy
QualType getUsingType(ElaboratedTypeKeyword Keyword, NestedNameSpecifier Qualifier, const UsingShadowDecl *D, QualType UnderlyingType=QualType()) const
CanQualType WideCharTy
CanQualType OMPIteratorTy
IdentifierTable & Idents
Definition ASTContext.h:791
Builtin::Context & BuiltinInfo
Definition ASTContext.h:793
bool computeEnumBits(RangeT EnumConstants, unsigned &NumNegativeBits, unsigned &NumPositiveBits)
Compute NumNegativeBits and NumPositiveBits for an enum based on the constant values of its enumerato...
QualType getConstantArrayType(QualType EltTy, const llvm::APInt &ArySize, const Expr *SizeExpr, ArraySizeModifier ASM, unsigned IndexTypeQuals) const
Return the unique reference to the type for a constant array of the specified element type.
void addModuleInitializer(Module *M, Decl *Init)
Add a declaration to the list of declarations that are initialized for a module.
const LangOptions & getLangOpts() const
Definition ASTContext.h:945
QualType getConstType(QualType T) const
Return the uniqued reference to the type for a const qualified type.
bool containsAddressDiscriminatedPointerAuth(QualType T) const
Examines a given type, and returns whether the type itself is address discriminated,...
Definition ASTContext.h:696
QualType getFunctionTypeWithoutPtrSizes(QualType T)
Get a function type and produce the equivalent function type where pointer size address spaces in the...
uint64_t lookupFieldBitOffset(const ObjCInterfaceDecl *OID, const ObjCIvarDecl *Ivar) const
Get the offset of an ObjCIvarDecl in bits.
CanQualType getLogicalOperationType() const
The result type of logical operations, '<', '>', '!=', etc.
SelectorTable & Selectors
Definition ASTContext.h:792
bool isTypeIgnoredBySanitizer(const SanitizerMask &Mask, const QualType &Ty) const
Check if a type can have its sanitizer instrumentation elided based on its presence within an ignorel...
unsigned getMinGlobalAlignOfVar(uint64_t Size, const VarDecl *VD) const
Return the minimum alignment as specified by the target.
RawCommentList Comments
All comments in this translation unit.
Definition ASTContext.h:978
bool isSameDefaultTemplateArgument(const NamedDecl *X, const NamedDecl *Y) const
Determine whether two default template arguments are similar enough that they may be used in declarat...
QualType applyObjCProtocolQualifiers(QualType type, ArrayRef< ObjCProtocolDecl * > protocols, bool &hasError, bool allowOnPointerType=false) const
Apply Objective-C protocol qualifiers to the given type.
QualType getMacroQualifiedType(QualType UnderlyingTy, const IdentifierInfo *MacroII) const
QualType removePtrSizeAddrSpace(QualType T) const
Remove the existing address space on the type if it is a pointer size address space and return the ty...
bool areLaxCompatibleRVVTypes(QualType FirstType, QualType SecondType)
Return true if the given vector types are lax-compatible RISC-V vector types as defined by -flax-vect...
void setObjCSuperType(QualType ST)
TagDecl * MSTypeInfoTagDecl
TypedefDecl * getBOOLDecl() const
Retrieve declaration of 'BOOL' typedef.
CanQualType SatShortFractTy
QualType getDecayedType(QualType T) const
Return the uniqued reference to the decayed version of the given type.
CallingConv getDefaultCallingConvention(bool IsVariadic, bool IsCXXMethod) const
Retrieves the default calling convention for the current context.
bool canBindObjCObjectType(QualType To, QualType From)
unsigned getNextStringLiteralVersion()
Return the next version number to be used for a string literal evaluated as part of constant evaluati...
TemplateTemplateParmDecl * insertCanonicalTemplateTemplateParmDeclInternal(TemplateTemplateParmDecl *CanonTTP) const
int getFloatingTypeSemanticOrder(QualType LHS, QualType RHS) const
Compare the rank of two floating point types as above, but compare equal if both types have the same ...
QualType getUIntPtrType() const
Return a type compatible with "uintptr_t" (C99 7.18.1.4), as defined by the target.
void setParameterIndex(const ParmVarDecl *D, unsigned index)
Used by ParmVarDecl to store on the side the index of the parameter when it exceeds the size of the n...
QualType getFunctionTypeWithExceptionSpec(QualType Orig, const FunctionProtoType::ExceptionSpecInfo &ESI) const
Get a function type and produce the equivalent function type with the specified exception specificati...
QualType getObjCInstanceType()
Retrieve the Objective-C "instancetype" type.
QualType getDependentNameType(ElaboratedTypeKeyword Keyword, NestedNameSpecifier NNS, const IdentifierInfo *Name) const
Qualifiers::GC getObjCGCAttrKind(QualType Ty) const
Return one of the GCNone, Weak or Strong Objective-C garbage collection attributes.
PartialDiagnostic::DiagStorageAllocator & getDiagAllocator()
Definition ASTContext.h:906
static bool hasSameType(const Type *T1, const Type *T2)
CanQualType Ibm128Ty
void setASTMutationListener(ASTMutationListener *Listener)
Attach an AST mutation listener to the AST context.
bool hasUniqueObjectRepresentations(QualType Ty, bool CheckIfTriviallyCopyable=true) const
Return true if the specified type has unique object representations according to (C++17 [meta....
const QualType GetHigherPrecisionFPType(QualType ElementType) const
Definition ASTContext.h:913
CanQualType getCanonicalSizeType() const
bool typesAreBlockPointerCompatible(QualType, QualType)
CanQualType SatUnsignedAccumTy
bool useAbbreviatedThunkName(GlobalDecl VirtualMethodDecl, StringRef MangledName)
const ASTRecordLayout & getASTObjCInterfaceLayout(const ObjCInterfaceDecl *D) const
Get or compute information about the layout of the specified Objective-C interface.
friend class ASTReader
Definition ASTContext.h:571
QualType getObjCProtoType() const
Retrieve the type of the Objective-C Protocol class.
void forEachMultiversionedFunctionVersion(const FunctionDecl *FD, llvm::function_ref< void(FunctionDecl *)> Pred) const
Visits all versions of a multiversioned function with the passed predicate.
void setInstantiatedFromUsingEnumDecl(UsingEnumDecl *Inst, UsingEnumDecl *Pattern)
Remember that the using enum decl Inst is an instantiation of the using enum decl Pattern of a class ...
QualType getBaseElementType(const ArrayType *VAT) const
Return the innermost element type of an array type.
QualType getPointerDiffType() const
Return the unique type for "ptrdiff_t" (C99 7.17) defined in <stddef.h>.
Decl * getPrimaryMergedDecl(Decl *D)
QualType getSignatureParameterType(QualType T) const
Retrieve the parameter type as adjusted for use in the signature of a function, decaying array and fu...
CanQualType ArraySectionTy
CanQualType ObjCBuiltinIdTy
overridden_cxx_method_iterator overridden_methods_end(const CXXMethodDecl *Method) const
VTableContextBase * getVTableContext()
void setBOOLDecl(TypedefDecl *TD)
Save declaration of 'BOOL' typedef.
llvm::SetVector< const ValueDecl * > CUDAExternalDeviceDeclODRUsedByHost
Keep track of CUDA/HIP external kernels or device variables ODR-used by host code.
ComparisonCategories CompCategories
Types and expressions required to build C++2a three-way comparisons using operator<=>,...
int getFloatingTypeOrder(QualType LHS, QualType RHS) const
Compare the rank of the two specified floating point types, ignoring the domain of the type (i....
unsigned CountNonClassIvars(const ObjCInterfaceDecl *OI) const
ASTContext(const ASTContext &)=delete
ObjCPropertyImplDecl * getObjCPropertyImplDeclForPropertyDecl(const ObjCPropertyDecl *PD, const Decl *Container) const
bool isNearlyEmpty(const CXXRecordDecl *RD) const
PointerAuthQualifier getObjCMemberSelTypePtrAuth()
QualType AutoDeductTy
CanQualType BoolTy
void setcudaLaunchDeviceDecl(FunctionDecl *FD)
void cacheRawCommentForDecl(const Decl &OriginalD, const RawComment &Comment) const
Attaches Comment to OriginalD and to its redeclaration chain and removes the redeclaration chain from...
void attachCommentsToJustParsedDecls(ArrayRef< Decl * > Decls, const Preprocessor *PP)
Searches existing comments for doc comments that should be attached to Decls.
QualType getIntTypeForBitwidth(unsigned DestWidth, unsigned Signed) const
getIntTypeForBitwidth - sets integer QualTy according to specified details: bitwidth,...
llvm::BumpPtrAllocator & getAllocator() const
Definition ASTContext.h:861
void setStaticLocalNumber(const VarDecl *VD, unsigned Number)
friend class ASTDeclReader
Definition ASTContext.h:570
QualType getCFConstantStringType() const
Return the C structure type used to represent constant CFStrings.
void eraseDeclAttrs(const Decl *D)
Erase the attributes corresponding to the given declaration.
const NoSanitizeList & getNoSanitizeList() const
Definition ASTContext.h:955
struct clang::ASTContext::CUDAConstantEvalContext CUDAConstantEvalCtx
IdentifierInfo * getNSObjectName() const
Retrieve the identifier 'NSObject'.
UsingEnumDecl * getInstantiatedFromUsingEnumDecl(UsingEnumDecl *Inst)
If the given using-enum decl Inst is an instantiation of another using-enum decl, return it.
RecordDecl * getCFConstantStringTagDecl() const
QualType getObjCSelType() const
Retrieve the type that corresponds to the predefined Objective-C 'SEL' type.
std::string getObjCEncodingForFunctionDecl(const FunctionDecl *Decl) const
Emit the encoded type for the function Decl into S.
TypeSourceInfo * getTemplateSpecializationTypeInfo(ElaboratedTypeKeyword Keyword, SourceLocation ElaboratedKeywordLoc, NestedNameSpecifierLoc QualifierLoc, SourceLocation TemplateKeywordLoc, TemplateName T, SourceLocation TLoc, const TemplateArgumentListInfo &SpecifiedArgs, ArrayRef< TemplateArgument > CanonicalArgs, QualType Canon=QualType()) const
QualType getTemplateTypeParmType(unsigned Depth, unsigned Index, bool ParameterPack, TemplateTypeParmDecl *ParmDecl=nullptr) const
Retrieve the template type parameter type for a template parameter or parameter pack with the given d...
bool addressSpaceMapManglingFor(LangAS AS) const
CanQualType UnsignedFractTy
QualType getjmp_bufType() const
Retrieve the C jmp_buf type.
GVALinkage GetGVALinkageForFunction(const FunctionDecl *FD) const
QualType mergeFunctionParameterTypes(QualType, QualType, bool OfBlockPointer=false, bool Unqualified=false)
mergeFunctionParameterTypes - merge two types which appear as function parameter types
QualType getsigjmp_bufType() const
Retrieve the C sigjmp_buf type.
void addOverriddenMethod(const CXXMethodDecl *Method, const CXXMethodDecl *Overridden)
Note that the given C++ Method overrides the given Overridden method.
TemplateTemplateParmDecl * findCanonicalTemplateTemplateParmDeclInternal(TemplateTemplateParmDecl *TTP) const
const TargetInfo * getAuxTargetInfo() const
Definition ASTContext.h:911
CanQualType Float128Ty
CanQualType ObjCBuiltinClassTy
unsigned NumImplicitDefaultConstructorsDeclared
The number of implicitly-declared default constructors for which declarations were built.
CanQualType UnresolvedTemplateTy
void setucontext_tDecl(TypeDecl *ucontext_tDecl)
Set the type for the C ucontext_t type.
OMPTraitInfo & getNewOMPTraitInfo()
Return a new OMPTraitInfo object owned by this context.
friend class CXXRecordDecl
Definition ASTContext.h:574
CanQualType UnsignedLongTy
llvm::DenseSet< const FunctionDecl * > CUDAImplicitHostDeviceFunUsedByDevice
Keep track of CUDA/HIP implicit host device functions used on device side in device compilation.
void DeepCollectObjCIvars(const ObjCInterfaceDecl *OI, bool leafClass, SmallVectorImpl< const ObjCIvarDecl * > &Ivars) const
DeepCollectObjCIvars - This routine first collects all declared, but not synthesized,...
bool computeBestEnumTypes(bool IsPacked, unsigned NumNegativeBits, unsigned NumPositiveBits, QualType &BestType, QualType &BestPromotionType)
Compute BestType and BestPromotionType for an enum based on the highest number of negative and positi...
llvm::APFixedPoint getFixedPointMin(QualType Ty) const
TypeSourceInfo * getTrivialTypeSourceInfo(QualType T, SourceLocation Loc=SourceLocation()) const
Allocate a TypeSourceInfo where all locations have been initialized to a given location,...
QualType adjustType(QualType OldType, llvm::function_ref< QualType(QualType)> Adjust) const
Rebuild a type, preserving any existing type sugar.
void addedLocalImportDecl(ImportDecl *Import)
Notify the AST context that a new import declaration has been parsed or implicitly created within thi...
bool hasAnyFunctionEffects() const
const TranslationUnitKind TUKind
Definition ASTContext.h:794
QualType getQualifiedType(const Type *T, Qualifiers Qs) const
Return a type with additional qualifiers.
CanQualType UnsignedLongAccumTy
QualType AutoRRefDeductTy
QualType getRestrictType(QualType T) const
Return the uniqued reference to the type for a restrict qualified type.
TypeInfo getTypeInfo(const Type *T) const
Get the size and alignment of the specified complete type in bits.
CanQualType ShortFractTy
QualType getStringLiteralArrayType(QualType EltTy, unsigned Length) const
Return a type for a constant array for a string literal of the specified element type and length.
QualType getCorrespondingSaturatedType(QualType Ty) const
bool isSameEntity(const NamedDecl *X, const NamedDecl *Y) const
Determine whether the two declarations refer to the same entity.
QualType getBOOLType() const
type of 'BOOL' type.
QualType getSubstTemplateTypeParmPackType(Decl *AssociatedDecl, unsigned Index, bool Final, const TemplateArgument &ArgPack)
llvm::DenseMap< const CXXMethodDecl *, CXXCastPath > LambdaCastPaths
For capturing lambdas with an explicit object parameter whose type is derived from the lambda type,...
CanQualType BoundMemberTy
CanQualType SatUnsignedShortFractTy
CanQualType CharTy
QualType removeAddrSpaceQualType(QualType T) const
Remove any existing address space on the type and returns the type with qualifiers intact (or that's ...
bool hasSameFunctionTypeIgnoringParamABI(QualType T, QualType U) const
Determine if two function types are the same, ignoring parameter ABI annotations.
TypedefDecl * getInt128Decl() const
Retrieve the declaration for the 128-bit signed integer type.
unsigned getOpenMPDefaultSimdAlign(QualType T) const
Get default simd alignment of the specified complete type in bits.
QualType getObjCSuperType() const
Returns the C struct type for objc_super.
QualType getBlockDescriptorType() const
Gets the struct used to keep track of the descriptor for pointer to blocks.
bool CommentsLoaded
True if comments are already loaded from ExternalASTSource.
Definition ASTContext.h:981
BlockVarCopyInit getBlockVarCopyInit(const VarDecl *VD) const
Get the copy initialization expression of the VarDecl VD, or nullptr if none exists.
QualType getHLSLInlineSpirvType(uint32_t Opcode, uint32_t Size, uint32_t Alignment, ArrayRef< SpirvOperand > Operands)
unsigned NumImplicitMoveConstructorsDeclared
The number of implicitly-declared move constructors for which declarations were built.
bool isInSameModule(const Module *M1, const Module *M2) const
If the two module M1 and M2 are in the same module.
unsigned NumImplicitCopyConstructorsDeclared
The number of implicitly-declared copy constructors for which declarations were built.
CanQualType IntTy
llvm::DenseSet< const VarDecl * > CUDADeviceVarODRUsedByHost
Keep track of CUDA/HIP device-side variables ODR-used by host code.
CanQualType PseudoObjectTy
QualType getWebAssemblyExternrefType() const
Return a WebAssembly externref type.
void setTraversalScope(const std::vector< Decl * > &)
CharUnits getTypeUnadjustedAlignInChars(QualType T) const
getTypeUnadjustedAlignInChars - Return the ABI-specified alignment of a type, in characters,...
QualType getAdjustedType(QualType Orig, QualType New) const
Return the uniqued reference to a type adjusted from the original type to a new type.
CanQualType getComplexType(CanQualType T) const
friend class NestedNameSpecifier
Definition ASTContext.h:221
void PrintStats() const
unsigned getAlignOfGlobalVar(QualType T, const VarDecl *VD) const
Return the alignment in bits that should be given to a global variable with type T.
TypeInfoChars getTypeInfoDataSizeInChars(QualType T) const
MangleNumberingContext & getManglingNumberContext(const DeclContext *DC)
Retrieve the context for computing mangling numbers in the given DeclContext.
comments::FullComment * getLocalCommentForDeclUncached(const Decl *D) const
Return parsed documentation comment attached to a given declaration.
unsigned NumImplicitDestructors
The number of implicitly-declared destructors.
CanQualType Float16Ty
QualType getQualifiedType(SplitQualType split) const
Un-split a SplitQualType.
bool isAlignmentRequired(const Type *T) const
Determine if the alignment the type has was required using an alignment attribute.
TagDecl * MSGuidTagDecl
bool areComparableObjCPointerTypes(QualType LHS, QualType RHS)
MangleContext * createDeviceMangleContext(const TargetInfo &T)
Creates a device mangle context to correctly mangle lambdas in a mixed architecture compile by settin...
CharUnits getExnObjectAlignment() const
Return the alignment (in bytes) of the thrown exception object.
CanQualType SignedCharTy
QualType getObjCObjectPointerType(QualType OIT) const
Return a ObjCObjectPointerType type for the given ObjCObjectType.
ASTMutationListener * Listener
Definition ASTContext.h:797
void setNonKeyFunction(const CXXMethodDecl *method)
Observe that the given method cannot be a key function.
CanQualType ObjCBuiltinBoolTy
TypeInfoChars getTypeInfoInChars(const Type *T) const
QualType getPredefinedSugarType(PredefinedSugarType::Kind KD) const
QualType getObjCObjectType(QualType Base, ObjCProtocolDecl *const *Protocols, unsigned NumProtocols) const
Legacy interface: cannot provide type arguments or __kindof.
LangAS getDefaultOpenCLPointeeAddrSpace()
Returns default address space based on OpenCL version and enabled features.
TemplateParamObjectDecl * getTemplateParamObjectDecl(QualType T, const APValue &V) const
Return the template parameter object of the given type with the given value.
const SourceManager & getSourceManager() const
Definition ASTContext.h:853
CanQualType OverloadTy
CharUnits getDeclAlign(const Decl *D, bool ForAlignof=false) const
Return a conservative estimate of the alignment of the specified decl D.
int64_t toBits(CharUnits CharSize) const
Convert a size in characters to a size in bits.
TemplateTemplateParmDecl * getCanonicalTemplateTemplateParmDecl(TemplateTemplateParmDecl *TTP) const
Canonicalize the given TemplateTemplateParmDecl.
CanQualType OCLClkEventTy
void adjustExceptionSpec(FunctionDecl *FD, const FunctionProtoType::ExceptionSpecInfo &ESI, bool AsWritten=false)
Change the exception specification on a function once it is delay-parsed, instantiated,...
TypedefDecl * getUInt128Decl() const
Retrieve the declaration for the 128-bit unsigned integer type.
CharUnits getPreferredTypeAlignInChars(QualType T) const
Return the PreferredAlignment of a (complete) type T, in characters.
const clang::PrintingPolicy & getPrintingPolicy() const
Definition ASTContext.h:844
void ResetObjCLayout(const ObjCInterfaceDecl *D)
ArrayRef< Module * > getModulesWithMergedDefinition(const NamedDecl *Def)
Get the additional modules in which the definition Def has been merged.
static ImportDecl * getNextLocalImport(ImportDecl *Import)
llvm::FixedPointSemantics getFixedPointSemantics(QualType Ty) const
CanQualType SatUnsignedShortAccumTy
QualType mergeTypes(QualType, QualType, bool OfBlockPointer=false, bool Unqualified=false, bool BlockReturnType=false, bool IsConditionalOperator=false)
const RawComment * getRawCommentForAnyRedecl(const Decl *D, const Decl **OriginalDecl=nullptr) const
Return the documentation comment attached to a given declaration.
CharUnits getAlignOfGlobalVarInChars(QualType T, const VarDecl *VD) const
Return the alignment in characters that should be given to a global variable with type T.
const ObjCMethodDecl * getObjCMethodRedeclaration(const ObjCMethodDecl *MD) const
Get the duplicate declaration of a ObjCMethod in the same interface, or null if none exists.
QualType getPackIndexingType(QualType Pattern, Expr *IndexExpr, bool FullySubstituted=false, ArrayRef< QualType > Expansions={}, UnsignedOrNone Index=std::nullopt) const
static bool isObjCNSObjectType(QualType Ty)
Return true if this is an NSObject object with its NSObject attribute set.
GVALinkage GetGVALinkageForVariable(const VarDecl *VD) const
llvm::PointerUnion< VarTemplateDecl *, MemberSpecializationInfo * > TemplateOrSpecializationInfo
A type synonym for the TemplateOrInstantiation mapping.
Definition ASTContext.h:566
UsingShadowDecl * getInstantiatedFromUsingShadowDecl(UsingShadowDecl *Inst)
QualType getWCharType() const
Return the unique wchar_t type available in C++ (and available as __wchar_t as a Microsoft extension)...
QualType getVariableArrayType(QualType EltTy, Expr *NumElts, ArraySizeModifier ASM, unsigned IndexTypeQuals) const
Return a non-unique reference to the type for a variable array of the specified element type.
QualType getObjCIdType() const
Represents the Objective-CC id type.
Decl * getVaListTagDecl() const
Retrieve the C type declaration corresponding to the predefined __va_list_tag type used to help defin...
QualType getUnsignedWCharType() const
Return the type of "unsigned wchar_t".
QualType getFunctionTypeWithoutParamABIs(QualType T) const
Get or construct a function type that is equivalent to the input type except that the parameter ABI a...
QualType getCorrespondingUnsaturatedType(QualType Ty) const
comments::FullComment * getCommentForDecl(const Decl *D, const Preprocessor *PP) const
Return parsed documentation comment attached to a given declaration.
TemplateArgument getInjectedTemplateArg(NamedDecl *ParamDecl) const
unsigned getTargetDefaultAlignForAttributeAligned() const
Return the default alignment for attribute((aligned)) on this target, to be used if no alignment valu...
const ArrayType * getAsArrayType(QualType T) const
Type Query functions.
llvm::DenseMap< CanQualType, SYCLKernelInfo > SYCLKernels
Map of SYCL kernels indexed by the unique type used to name the kernel.
bool isSameTemplateParameterList(const TemplateParameterList *X, const TemplateParameterList *Y) const
Determine whether two template parameter lists are similar enough that they may be used in declaratio...
QualType getWritePipeType(QualType T) const
Return a write_only pipe type for the specified type.
QualType getTypeDeclType(ElaboratedTypeKeyword Keyword, NestedNameSpecifier Qualifier, const TypeDecl *Decl) const
bool isDestroyingOperatorDelete(const FunctionDecl *FD) const
uint64_t getTypeSize(QualType T) const
Return the size of the specified (complete) type T, in bits.
CanQualType UnsignedInt128Ty
CanQualType BuiltinFnTy
ObjCInterfaceDecl * getObjCProtocolDecl() const
Retrieve the Objective-C class declaration corresponding to the predefined Protocol class.
unsigned NumImplicitDefaultConstructors
The number of implicitly-declared default constructors.
CharUnits getTypeSizeInChars(QualType T) const
Return the size of the specified (complete) type T, in characters.
llvm::iterator_range< overridden_cxx_method_iterator > overridden_method_range
unsigned NumImplicitMoveAssignmentOperatorsDeclared
The number of implicitly-declared move assignment operators for which declarations were built.
void setManglingNumber(const NamedDecl *ND, unsigned Number)
llvm::DenseMap< const Decl *, const RawComment * > DeclRawComments
Mapping from declaration to directly attached comment.
Definition ASTContext.h:987
CanQualType OCLSamplerTy
QualType getAutoType(QualType DeducedType, AutoTypeKeyword Keyword, bool IsDependent, bool IsPack=false, TemplateDecl *TypeConstraintConcept=nullptr, ArrayRef< TemplateArgument > TypeConstraintArgs={}) const
C++11 deduced auto type.
TypedefDecl * getBuiltinVaListDecl() const
Retrieve the C type declaration corresponding to the predefined __builtin_va_list type.
TypeInfo getTypeInfo(QualType T) const
CanQualType getCanonicalTypeDeclType(const TypeDecl *TD) const
CanQualType VoidTy
QualType getPackExpansionType(QualType Pattern, UnsignedOrNone NumExpansions, bool ExpectPackInType=true) const
Form a pack expansion type with the given pattern.
CanQualType UnsignedCharTy
CanQualType UnsignedShortFractTy
BuiltinTemplateDecl * buildBuiltinTemplateDecl(BuiltinTemplateKind BTK, const IdentifierInfo *II) const
void * Allocate(size_t Size, unsigned Align=8) const
Definition ASTContext.h:865
bool canBuiltinBeRedeclared(const FunctionDecl *) const
Return whether a declaration to a builtin is allowed to be overloaded/redeclared.
CanQualType UnsignedIntTy
unsigned NumImplicitMoveConstructors
The number of implicitly-declared move constructors.
QualType getTypedefType(ElaboratedTypeKeyword Keyword, NestedNameSpecifier Qualifier, const TypedefNameDecl *Decl, QualType UnderlyingType=QualType(), std::optional< bool > TypeMatchesDeclOrNone=std::nullopt) const
Return the unique reference to the type for the specified typedef-name decl.
QualType getObjCTypeParamType(const ObjCTypeParamDecl *Decl, ArrayRef< ObjCProtocolDecl * > protocols) const
QualType getVolatileType(QualType T) const
Return the uniqued reference to the type for a volatile qualified type.
void getObjCEncodingForMethodParameter(Decl::ObjCDeclQualifier QT, QualType T, std::string &S, bool Extended) const
getObjCEncodingForMethodParameter - Return the encoded type for a single method parameter or return t...
void addDeclaratorForUnnamedTagDecl(TagDecl *TD, DeclaratorDecl *DD)
unsigned overridden_methods_size(const CXXMethodDecl *Method) const
std::string getObjCEncodingForBlock(const BlockExpr *blockExpr) const
Return the encoded type for this block declaration.
QualType getTemplateSpecializationType(ElaboratedTypeKeyword Keyword, TemplateName T, ArrayRef< TemplateArgument > SpecifiedArgs, ArrayRef< TemplateArgument > CanonicalArgs, QualType Underlying=QualType()) const
TypeSourceInfo * CreateTypeSourceInfo(QualType T, unsigned Size=0) const
Allocate an uninitialized TypeSourceInfo.
TagDecl * getMSTypeInfoTagDecl() const
Retrieve the implicitly-predeclared 'struct type_info' declaration.
TemplateName getQualifiedTemplateName(NestedNameSpecifier Qualifier, bool TemplateKeyword, TemplateName Template) const
Retrieve the template name that represents a qualified template name such as std::vector.
QualType getObjCClassRedefinitionType() const
Retrieve the type that Class has been defined to, which may be different from the built-in Class if C...
TagDecl * getMSGuidTagDecl() const
Retrieve the implicitly-predeclared 'struct _GUID' declaration.
bool isSameAssociatedConstraint(const AssociatedConstraint &ACX, const AssociatedConstraint &ACY) const
Determine whether two 'requires' expressions are similar enough that they may be used in re-declarati...
QualType getExceptionObjectType(QualType T) const
CanQualType UnknownAnyTy
void setInstantiatedFromStaticDataMember(VarDecl *Inst, VarDecl *Tmpl, TemplateSpecializationKind TSK, SourceLocation PointOfInstantiation=SourceLocation())
Note that the static data member Inst is an instantiation of the static data member template Tmpl of ...
FieldDecl * getInstantiatedFromUnnamedFieldDecl(FieldDecl *Field) const
DeclaratorDecl * getDeclaratorForUnnamedTagDecl(const TagDecl *TD)
bool ObjCObjectAdoptsQTypeProtocols(QualType QT, ObjCInterfaceDecl *Decl)
ObjCObjectAdoptsQTypeProtocols - Checks that protocols in IC's protocol list adopt all protocols in Q...
QualType getFunctionNoProtoType(QualType ResultTy) const
CanQualType UnsignedLongLongTy
QualType GetBuiltinType(unsigned ID, GetBuiltinTypeError &Error, unsigned *IntegerConstantArgs=nullptr) const
Return the type for the specified builtin.
CanQualType OCLReserveIDTy
bool isSameTemplateParameter(const NamedDecl *X, const NamedDecl *Y) const
Determine whether two template parameters are similar enough that they may be used in declarations of...
void registerSYCLEntryPointFunction(FunctionDecl *FD)
Generates and stores SYCL kernel metadata for the provided SYCL kernel entry point function.
QualType getTypeDeclType(const TagDecl *) const =delete
Use the normal 'getFooBarType' constructors to obtain these types.
size_t getASTAllocatedMemory() const
Return the total amount of physical memory allocated for representing AST nodes and type information.
Definition ASTContext.h:899
QualType getArrayDecayedType(QualType T) const
Return the properly qualified result of decaying the specified array type to a pointer.
overridden_cxx_method_iterator overridden_methods_begin(const CXXMethodDecl *Method) const
CanQualType UnsignedShortTy
FunctionDecl * getOperatorDeleteForVDtor(const CXXDestructorDecl *Dtor, OperatorDeleteKind K) const
unsigned getTypeAlignIfKnown(QualType T, bool NeedsPreferredAlignment=false) const
Return the alignment of a type, in bits, or 0 if the type is incomplete and we cannot determine the a...
void UnwrapSimilarArrayTypes(QualType &T1, QualType &T2, bool AllowPiMismatch=true) const
Attempt to unwrap two types that may both be array types with the same bound (or both be array types ...
QualType getObjCConstantStringInterface() const
bool isRepresentableIntegerValue(llvm::APSInt &Value, QualType T)
Determine whether the given integral value is representable within the given type T.
bool AtomicUsesUnsupportedLibcall(const AtomicExpr *E) const
QualType getFunctionType(QualType ResultTy, ArrayRef< QualType > Args, const FunctionProtoType::ExtProtoInfo &EPI) const
Return a normal function type with a typed argument list.
const SYCLKernelInfo & getSYCLKernelInfo(QualType T) const
Given a type used as a SYCL kernel name, returns a reference to the metadata generated from the corre...
bool canAssignObjCInterfacesInBlockPointer(const ObjCObjectPointerType *LHSOPT, const ObjCObjectPointerType *RHSOPT, bool BlockReturnType)
canAssignObjCInterfacesInBlockPointer - This routine is specifically written for providing type-safet...
CanQualType SatUnsignedLongFractTy
QualType getMemberPointerType(QualType T, NestedNameSpecifier Qualifier, const CXXRecordDecl *Cls) const
Return the uniqued reference to the type for a member pointer to the specified type in the specified ...
void setcudaConfigureCallDecl(FunctionDecl *FD)
CanQualType getDecayedType(CanQualType T) const
static bool hasSameType(QualType T1, QualType T2)
Determine whether the given types T1 and T2 are equivalent.
QualType getObjCIdRedefinitionType() const
Retrieve the type that id has been defined to, which may be different from the built-in id if id has ...
const CXXConstructorDecl * getCopyConstructorForExceptionObject(CXXRecordDecl *RD)
QualType getDependentAddressSpaceType(QualType PointeeType, Expr *AddrSpaceExpr, SourceLocation AttrLoc) const
RawComment * getRawCommentForDeclNoCache(const Decl *D) const
Return the documentation comment attached to a given declaration, without looking into cache.
QualType getTagType(ElaboratedTypeKeyword Keyword, NestedNameSpecifier Qualifier, const TagDecl *TD, bool OwnsTag) const
QualType getPromotedIntegerType(QualType PromotableType) const
Return the type that PromotableType will promote to: C99 6.3.1.1p2, assuming that PromotableType is a...
llvm::APSInt MakeIntValue(uint64_t Value, QualType Type) const
Make an APSInt of the appropriate width and signedness for the given Value and integer Type.
CanQualType getMSGuidType() const
Retrieve the implicitly-predeclared 'struct _GUID' type.
const VariableArrayType * getAsVariableArrayType(QualType T) const
QualType getUnaryTransformType(QualType BaseType, QualType UnderlyingType, UnaryTransformType::UTTKind UKind) const
Unary type transforms.
void setExternalSource(IntrusiveRefCntPtr< ExternalASTSource > Source)
Attach an external AST source to the AST context.
const ObjCInterfaceDecl * getObjContainingInterface(const NamedDecl *ND) const
Returns the Objective-C interface that ND belongs to if it is an Objective-C method/property/ivar etc...
CanQualType ShortTy
StringLiteral * getPredefinedStringLiteralFromCache(StringRef Key) const
Return a string representing the human readable name for the specified function declaration or file n...
CanQualType getCanonicalUnresolvedUsingType(const UnresolvedUsingTypenameDecl *D) const
bool hasSimilarType(QualType T1, QualType T2) const
Determine if two types are similar, according to the C++ rules.
llvm::APFixedPoint getFixedPointMax(QualType Ty) const
QualType getComplexType(QualType T) const
Return the uniqued reference to the type for a complex number with the specified element type.
void setObjCClassRedefinitionType(QualType RedefType)
Set the user-written type that redefines 'SEL'.
bool hasDirectOwnershipQualifier(QualType Ty) const
Return true if the type has been explicitly qualified with ObjC ownership.
CanQualType FractTy
Qualifiers::ObjCLifetime getInnerObjCOwnership(QualType T) const
Recurses in pointer/array types until it finds an Objective-C retainable type and returns its ownersh...
void addCopyConstructorForExceptionObject(CXXRecordDecl *RD, CXXConstructorDecl *CD)
void deduplicateMergedDefinitionsFor(NamedDecl *ND)
Clean up the merged definition list.
FunctionDecl * getcudaConfigureCallDecl()
DiagnosticsEngine & getDiagnostics() const
llvm::StringRef backupStr(llvm::StringRef S) const
Definition ASTContext.h:873
QualType getAdjustedParameterType(QualType T) const
Perform adjustment on the parameter type of a function.
QualType getUnqualifiedObjCPointerType(QualType type) const
getUnqualifiedObjCPointerType - Returns version of Objective-C pointer type with lifetime qualifier r...
CanQualType LongAccumTy
interp::Context & getInterpContext()
Returns the clang bytecode interpreter context.
CanQualType Char32Ty
QualType getSizeType() const
Return the unique type for "size_t" (C99 7.17), defined in <stddef.h>.
QualType getCVRQualifiedType(QualType T, unsigned CVR) const
Return a type with additional const, volatile, or restrict qualifiers.
UnnamedGlobalConstantDecl * getUnnamedGlobalConstantDecl(QualType Ty, const APValue &Value) const
Return a declaration for a uniquified anonymous global constant corresponding to a given APValue.
CanQualType SatFractTy
QualType getExtVectorType(QualType VectorType, unsigned NumElts) const
Return the unique reference to an extended vector type of the specified element type and size.
QualType getUnresolvedUsingType(ElaboratedTypeKeyword Keyword, NestedNameSpecifier Qualifier, const UnresolvedUsingTypenameDecl *D) const
bool areCompatibleVectorTypes(QualType FirstVec, QualType SecondVec)
Return true if the given vector types are of the same unqualified type or if they are equivalent to t...
void getOverriddenMethods(const NamedDecl *Method, SmallVectorImpl< const NamedDecl * > &Overridden) const
Return C++ or ObjC overridden methods for the given Method.
DeclarationNameInfo getNameForTemplate(TemplateName Name, SourceLocation NameLoc) const
bool hasSameTemplateName(const TemplateName &X, const TemplateName &Y, bool IgnoreDeduced=false) const
Determine whether the given template names refer to the same template.
CanQualType SatLongFractTy
const TargetInfo & getTargetInfo() const
Definition ASTContext.h:910
void setInstantiatedFromUnnamedFieldDecl(FieldDecl *Inst, FieldDecl *Tmpl)
CanQualType OCLQueueTy
CanQualType LongFractTy
CanQualType SatShortAccumTy
QualType getAutoDeductType() const
C++11 deduction pattern for 'auto' type.
CanQualType BFloat16Ty
unsigned NumImplicitCopyConstructors
The number of implicitly-declared copy constructors.
CharUnits toCharUnitsFromBits(int64_t BitSize) const
Convert a size in bits to a size in characters.
CanQualType IncompleteMatrixIdxTy
std::optional< CharUnits > getTypeSizeInCharsIfKnown(QualType Ty) const
friend class DeclarationNameTable
void getFunctionFeatureMap(llvm::StringMap< bool > &FeatureMap, const FunctionDecl *) const
CanQualType getNSIntegerType() const
QualType getCorrespondingUnsignedType(QualType T) const
void setBlockVarCopyInit(const VarDecl *VD, Expr *CopyExpr, bool CanThrow)
Set the copy initialization expression of a block var decl.
QualType getLifetimeQualifiedType(QualType type, Qualifiers::ObjCLifetime lifetime)
Return a type with the given lifetime qualifier.
TemplateName getOverloadedTemplateName(UnresolvedSetIterator Begin, UnresolvedSetIterator End) const
Retrieve the template name that corresponds to a non-empty lookup.
bool typesAreCompatible(QualType T1, QualType T2, bool CompareUnqualified=false)
Compatibility predicates used to check assignment expressions.
TemplateName getSubstTemplateTemplateParmPack(const TemplateArgument &ArgPack, Decl *AssociatedDecl, unsigned Index, bool Final) const
QualType getObjCNSStringType() const
QualType getDeducedTemplateSpecializationType(ElaboratedTypeKeyword Keyword, TemplateName Template, QualType DeducedType, bool IsDependent) const
C++17 deduced class template specialization type.
TargetCXXABI::Kind getCXXABIKind() const
Return the C++ ABI kind that should be used.
void setjmp_bufDecl(TypeDecl *jmp_bufDecl)
Set the type for the C jmp_buf type.
QualType getHLSLAttributedResourceType(QualType Wrapped, QualType Contained, const HLSLAttributedResourceType::Attributes &Attrs)
void addDestruction(T *Ptr) const
If T isn't trivially destructible, calls AddDeallocation to register it for destruction.
bool UnwrapSimilarTypes(QualType &T1, QualType &T2, bool AllowPiMismatch=true) const
Attempt to unwrap two types that may be similar (C++ [conv.qual]).
IntrusiveRefCntPtr< ExternalASTSource > getExternalSourcePtr() const
Retrieve a pointer to the external AST source associated with this AST context, if any.
QualType getAddrSpaceQualType(QualType T, LangAS AddressSpace) const
Return the uniqued reference to the type for an address space qualified type with the specified type ...
QualType getSignedSizeType() const
Return the unique signed counterpart of the integer type corresponding to size_t.
ExternalASTSource * getExternalSource() const
Retrieve a pointer to the external AST source associated with this AST context, if any.
uint64_t getConstantArrayElementCount(const ConstantArrayType *CA) const
Return number of constant array elements.
void setcudaGetParameterBufferDecl(FunctionDecl *FD)
CanQualType SatUnsignedLongAccumTy
QualType getUnconstrainedType(QualType T) const
Remove any type constraints from a template parameter type, for equivalence comparison of template pa...
CanQualType LongLongTy
CanQualType getCanonicalTagType(const TagDecl *TD) const
bool isSameTemplateArgument(const TemplateArgument &Arg1, const TemplateArgument &Arg2) const
Determine whether the given template arguments Arg1 and Arg2 are equivalent.
QualType getTypeOfType(QualType QT, TypeOfKind Kind) const
getTypeOfType - Unlike many "get<Type>" functions, we don't unique TypeOfType nodes.
QualType getCorrespondingSignedType(QualType T) const
QualType mergeObjCGCQualifiers(QualType, QualType)
mergeObjCGCQualifiers - This routine merges ObjC's GC attribute of 'LHS' and 'RHS' attributes and ret...
QualType getQualifiedType(QualType T, Qualifiers Qs) const
Return a type with additional qualifiers.
llvm::DenseMap< const Decl *, const Decl * > CommentlessRedeclChains
Keeps track of redeclaration chains that don't have any comment attached.
uint64_t getArrayInitLoopExprElementCount(const ArrayInitLoopExpr *AILE) const
Return number of elements initialized in an ArrayInitLoopExpr.
unsigned getTargetAddressSpace(LangAS AS) const
QualType getWideCharType() const
Return the type of wide characters.
QualType getIntPtrType() const
Return a type compatible with "intptr_t" (C99 7.18.1.4), as defined by the target.
void mergeDefinitionIntoModule(NamedDecl *ND, Module *M, bool NotifyListeners=true)
Note that the definition ND has been merged into module M, and should be visible whenever M is visibl...
QualType getDependentSizedArrayType(QualType EltTy, Expr *NumElts, ArraySizeModifier ASM, unsigned IndexTypeQuals) const
Return a non-unique reference to the type for a dependently-sized array of the specified element type...
void addTranslationUnitDecl()
CanQualType WCharTy
bool hasSameNullabilityTypeQualifier(QualType SubT, QualType SuperT, bool IsParam) const
void getObjCEncodingForPropertyType(QualType T, std::string &S) const
Emit the Objective-C property type encoding for the given type T into S.
unsigned NumImplicitCopyAssignmentOperators
The number of implicitly-declared copy assignment operators.
void CollectInheritedProtocols(const Decl *CDecl, llvm::SmallPtrSet< ObjCProtocolDecl *, 8 > &Protocols)
CollectInheritedProtocols - Collect all protocols in current class and those inherited by it.
bool isPromotableIntegerType(QualType T) const
More type predicates useful for type checking/promotion.
T * Allocate(size_t Num=1) const
Definition ASTContext.h:868
llvm::DenseMap< const Decl *, const Decl * > RedeclChainComments
Mapping from canonical declaration to the first redeclaration in chain that has a comment attached.
Definition ASTContext.h:994
void adjustDeducedFunctionResultType(FunctionDecl *FD, QualType ResultType)
Change the result type of a function type once it is deduced.
QualType getObjCGCQualType(QualType T, Qualifiers::GC gcAttr) const
Return the uniqued reference to the type for an Objective-C gc-qualified type.
QualType getPointerAuthType(QualType Ty, PointerAuthQualifier PointerAuth)
Return a type with the given __ptrauth qualifier.
QualType getDecltypeType(Expr *e, QualType UnderlyingType) const
C++11 decltype.
std::optional< CXXRecordDeclRelocationInfo > getRelocationInfoForCXXRecord(const CXXRecordDecl *) const
static bool hasSameUnqualifiedType(QualType T1, QualType T2)
Determine whether the given types are equivalent after cvr-qualifiers have been removed.
InlineVariableDefinitionKind getInlineVariableDefinitionKind(const VarDecl *VD) const
Determine whether a definition of this inline variable should be treated as a weak or strong definiti...
void setPrimaryMergedDecl(Decl *D, Decl *Primary)
TemplateName getSubstTemplateTemplateParm(TemplateName replacement, Decl *AssociatedDecl, unsigned Index, UnsignedOrNone PackIndex, bool Final) const
CanQualType getUIntMaxType() const
Return the unique type for "uintmax_t" (C99 7.18.1.5), defined in <stdint.h>.
IdentifierInfo * getBoolName() const
Retrieve the identifier 'bool'.
friend class DeclContext
uint16_t getPointerAuthVTablePointerDiscriminator(const CXXRecordDecl *RD)
Return the "other" discriminator used for the pointer auth schema used for vtable pointers in instanc...
CharUnits getOffsetOfBaseWithVBPtr(const CXXRecordDecl *RD) const
Loading virtual member pointers using the virtual inheritance model always results in an adjustment u...
LangAS getLangASForBuiltinAddressSpace(unsigned AS) const
bool hasSameFunctionTypeIgnoringPtrSizes(QualType T, QualType U)
Determine whether two function types are the same, ignoring pointer sizes in the return type and para...
void addOperatorDeleteForVDtor(const CXXDestructorDecl *Dtor, FunctionDecl *OperatorDelete, OperatorDeleteKind K) const
unsigned char getFixedPointScale(QualType Ty) const
QualType getIncompleteArrayType(QualType EltTy, ArraySizeModifier ASM, unsigned IndexTypeQuals) const
Return a unique reference to the type for an incomplete array of the specified element type.
QualType getDependentSizedExtVectorType(QualType VectorType, Expr *SizeExpr, SourceLocation AttrLoc) const
QualType DecodeTypeStr(const char *&Str, const ASTContext &Context, ASTContext::GetBuiltinTypeError &Error, bool &RequireICE, bool AllowTypeModifiers) const
void addObjCSubClass(const ObjCInterfaceDecl *D, const ObjCInterfaceDecl *SubClass)
TemplateName getAssumedTemplateName(DeclarationName Name) const
Retrieve a template name representing an unqualified-id that has been assumed to name a template for ...
@ GE_None
No error.
@ GE_Missing_stdio
Missing a type from <stdio.h>
@ GE_Missing_type
Missing a type.
@ GE_Missing_ucontext
Missing a type from <ucontext.h>
@ GE_Missing_setjmp
Missing a type from <setjmp.h>
QualType adjustStringLiteralBaseType(QualType StrLTy) const
uint16_t getPointerAuthTypeDiscriminator(QualType T)
Return the "other" type-specific discriminator for the given type.
bool canonicalizeTemplateArguments(MutableArrayRef< TemplateArgument > Args) const
Canonicalize the given template argument list.
QualType getTypeOfExprType(Expr *E, TypeOfKind Kind) const
C23 feature and GCC extension.
CanQualType Char8Ty
QualType getSignedWCharType() const
Return the type of "signed wchar_t".
QualType getUnqualifiedArrayType(QualType T, Qualifiers &Quals) const
Return this type as a completely-unqualified array type, capturing the qualifiers in Quals.
QualType getTypeDeclType(const TypedefDecl *) const =delete
bool hasCvrSimilarType(QualType T1, QualType T2)
Determine if two types are similar, ignoring only CVR qualifiers.
TemplateName getDeducedTemplateName(TemplateName Underlying, DefaultArguments DefaultArgs) const
Represents a TemplateName which had some of its default arguments deduced.
ObjCImplementationDecl * getObjCImplementation(ObjCInterfaceDecl *D)
Get the implementation of the ObjCInterfaceDecl D, or nullptr if none exists.
CanQualType HalfTy
CanQualType UnsignedAccumTy
void setObjCMethodRedeclaration(const ObjCMethodDecl *MD, const ObjCMethodDecl *Redecl)
void addTypedefNameForUnnamedTagDecl(TagDecl *TD, TypedefNameDecl *TND)
bool isDependenceAllowed() const
Definition ASTContext.h:951
QualType getConstantMatrixType(QualType ElementType, unsigned NumRows, unsigned NumColumns) const
Return the unique reference to the matrix type of the specified element type and size.
QualType getWIntType() const
In C99, this returns a type compatible with the type defined in <stddef.h> as defined by the target.
const CXXRecordDecl * baseForVTableAuthentication(const CXXRecordDecl *ThisClass) const
Resolve the root record to be used to derive the vtable pointer authentication policy for the specifi...
QualType getVariableArrayDecayedType(QualType Ty) const
Returns a vla type where known sizes are replaced with [*].
void setCFConstantStringType(QualType T)
const SYCLKernelInfo * findSYCLKernelInfo(QualType T) const
Returns a pointer to the metadata generated from the corresponding SYCLkernel entry point if the prov...
ASTContext & operator=(const ASTContext &)=delete
Module * getCurrentNamedModule() const
Get module under construction, nullptr if this is not a C++20 module.
unsigned getParameterIndex(const ParmVarDecl *D) const
Used by ParmVarDecl to retrieve on the side the index of the parameter when it exceeds the size of th...
QualType getCommonSugaredType(QualType X, QualType Y, bool Unqualified=false) const
CanQualType OCLEventTy
void setPrintingPolicy(const clang::PrintingPolicy &Policy)
Definition ASTContext.h:848
void AddDeallocation(void(*Callback)(void *), void *Data) const
Add a deallocation callback that will be invoked when the ASTContext is destroyed.
AttrVec & getDeclAttrs(const Decl *D)
Retrieve the attributes for the given declaration.
CXXMethodVector::const_iterator overridden_cxx_method_iterator
RawComment * getRawCommentForDeclNoCacheImpl(const Decl *D, const SourceLocation RepresentativeLocForDecl, const std::map< unsigned, RawComment * > &CommentsInFile) const
unsigned getTypeAlign(QualType T) const
Return the ABI-specified alignment of a (complete) type T, in bits.
QualType mergeTransparentUnionType(QualType, QualType, bool OfBlockPointer=false, bool Unqualified=false)
mergeTransparentUnionType - if T is a transparent union type and a member of T is compatible with Sub...
QualType isPromotableBitField(Expr *E) const
Whether this is a promotable bitfield reference according to C99 6.3.1.1p2, bullet 2 (and GCC extensi...
bool isSentinelNullExpr(const Expr *E)
CanQualType getNSUIntegerType() const
IdentifierInfo * getNSCopyingName()
Retrieve the identifier 'NSCopying'.
void setIsDestroyingOperatorDelete(const FunctionDecl *FD, bool IsDestroying)
uint64_t getCharWidth() const
Return the size of the character type, in bits.
CanQualType getPointerType(CanQualType T) const
QualType getUnqualifiedArrayType(QualType T) const
import_range local_imports() const
QualType getBitIntType(bool Unsigned, unsigned NumBits) const
Return a bit-precise integer type with the specified signedness and bit count.
const DependentSizedArrayType * getAsDependentSizedArrayType(QualType T) const
unsigned NumImplicitMoveAssignmentOperators
The number of implicitly-declared move assignment operators.
FunctionDecl * getcudaLaunchDeviceDecl()
An abstract interface that should be implemented by listeners that want to be notified when an AST en...
ASTRecordLayout - This class contains layout information for one RecordDecl, which is a struct/union/...
Represents a loop initializing the elements of an array.
Definition Expr.h:5902
Represents an array type, per C99 6.7.5.2 - Array Declarators.
Definition TypeBase.h:3722
AtomicExpr - Variadic atomic builtins: __atomic_exchange, __atomic_fetch_*, __atomic_load,...
Definition Expr.h:6814
Attr - This represents one attribute.
Definition Attr.h:45
BlockExpr - Adaptor class for mixing a BlockDecl with expressions.
Definition Expr.h:6558
Represents the builtin template declaration which is used to implement __make_integer_seq and other b...
This class is used for builtin types like 'int'.
Definition TypeBase.h:3164
Holds information about both target-independent and target-specific builtins, allowing easy queries b...
Definition Builtins.h:235
Implements C++ ABI-specific semantic analysis functions.
Definition CXXABI.h:29
Represents a C++ constructor within a class.
Definition DeclCXX.h:2604
Represents a C++ destructor within a class.
Definition DeclCXX.h:2869
Represents a static or instance method of a struct/union/class.
Definition DeclCXX.h:2129
Represents a C++ struct/union/class.
Definition DeclCXX.h:258
static CanQual< Type > CreateUnsafe(QualType Other)
const T * getTypePtr() const
Retrieve the underlying type pointer, which refers to a canonical type.
CharUnits - This is an opaque type for sizes expressed in character units.
Definition CharUnits.h:38
Declaration of a C++20 concept.
Represents the canonical version of C arrays with a specified constant size.
Definition TypeBase.h:3760
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
Definition DeclBase.h:1449
A list storing NamedDecls in the lookup tables.
Definition DeclBase.h:1329
Decl - This represents one declaration (or definition), e.g.
Definition DeclBase.h:86
ObjCDeclQualifier
ObjCDeclQualifier - 'Qualifiers' written next to the return and parameter types in method declaration...
Definition DeclBase.h:198
The name of a declaration.
Represents a ValueDecl that came out of a declarator.
Definition Decl.h:780
Represents an array type in C++ whose size is a value-dependent expression.
Definition TypeBase.h:4011
Represents a dependent template name that cannot be resolved prior to template instantiation.
Concrete class used by the front-end to report problems and issues.
Definition Diagnostic.h:232
Container for either a single DynTypedNode or for an ArrayRef to DynTypedNode.
An instance of this object exists for each enum constant that is defined.
Definition Decl.h:3423
llvm::APSInt getInitVal() const
Definition Decl.h:3443
This represents one expression.
Definition Expr.h:112
Declaration context for names declared as extern "C" in C++.
Definition Decl.h:247
Abstract interface for external sources of AST nodes.
Represents a member of a struct/union/class.
Definition Decl.h:3160
A SourceLocation and its associated SourceManager.
Represents a function declaration or definition.
Definition Decl.h:2000
Represents a prototype with parameter type info, e.g.
Definition TypeBase.h:5254
A class which abstracts out some details necessary for making a call.
Definition TypeBase.h:4561
FunctionType - C99 6.7.5.3 - Function Declarators.
Definition TypeBase.h:4450
GlobalDecl - represents a global declaration.
Definition GlobalDecl.h:57
One of these records is kept for each identifier that is lexed.
Implements an efficient mapping from strings to IdentifierInfo nodes.
IdentifierInfo & get(StringRef Name)
Return the identifier token info for the specified named identifier.
Describes a module import declaration, which makes the contents of the named module visible in the cu...
Definition Decl.h:5049
Represents a C array with an unspecified size.
Definition TypeBase.h:3909
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
A global _GUID constant.
Definition DeclCXX.h:4394
MangleContext - Context for tracking state which persists across multiple calls to the C++ name mangl...
Definition Mangle.h:52
Keeps track of the mangled names of lambda expressions and block literals within a particular context...
Provides information a specialization of a member of a class template, which may be a member function...
Describes a module or submodule.
Definition Module.h:144
This represents a decl that may have a name.
Definition Decl.h:274
A C++ nested-name-specifier augmented with source location information.
Represents a C++ nested name specifier, such as "\::std::vector<int>::".
Helper data structure representing the traits in a match clause of an declare variant or metadirectiv...
ObjCCategoryDecl - Represents a category declaration.
Definition DeclObjC.h:2329
ObjCCategoryImplDecl - An object of this class encapsulates a category @implementation declaration.
Definition DeclObjC.h:2545
ObjCContainerDecl - Represents a container for method declarations.
Definition DeclObjC.h:948
ObjCImplementationDecl - Represents a class definition - this is where method definitions are specifi...
Definition DeclObjC.h:2597
Represents an ObjC class declaration.
Definition DeclObjC.h:1154
ObjCIvarDecl - Represents an ObjC instance variable.
Definition DeclObjC.h:1952
ObjCMethodDecl - Represents an instance or class method declaration.
Definition DeclObjC.h:140
Represents a pointer to an Objective C object.
Definition TypeBase.h:7896
Represents one property declaration in an Objective-C interface.
Definition DeclObjC.h:731
ObjCPropertyImplDecl - Represents implementation declaration of a property in a class or category imp...
Definition DeclObjC.h:2805
Represents an Objective-C protocol declaration.
Definition DeclObjC.h:2084
Represents the declaration of an Objective-C type parameter.
Definition DeclObjC.h:578
Represents a parameter to a function.
Definition Decl.h:1790
Pointer-authentication qualifiers.
Definition TypeBase.h:152
PredefinedSugarKind Kind
Definition TypeBase.h:8189
Engages in a tight little dance with the lexer to efficiently preprocess tokens.
A (possibly-)qualified type.
Definition TypeBase.h:937
PointerAuthQualifier getPointerAuth() const
Definition TypeBase.h:1453
A qualifier set is used to build a set of qualifiers.
Definition TypeBase.h:8218
const Type * strip(QualType type)
Collect any qualifiers on the given type and return an unqualified type.
Definition TypeBase.h:8225
The collection of all-type qualifiers we support.
Definition TypeBase.h:331
@ OCL_None
There is no lifetime qualification on this type.
Definition TypeBase.h:350
void removeObjCLifetime()
Definition TypeBase.h:551
bool hasNonFastQualifiers() const
Return true if the set contains any qualifiers which require an ExtQuals node to be allocated.
Definition TypeBase.h:638
unsigned getFastQualifiers() const
Definition TypeBase.h:619
static Qualifiers fromCVRMask(unsigned CVR)
Definition TypeBase.h:435
void setPointerAuth(PointerAuthQualifier Q)
Definition TypeBase.h:606
void addObjCLifetime(ObjCLifetime type)
Definition TypeBase.h:552
This class represents all comments included in the translation unit, sorted in order of appearance in...
Represents a struct/union/class.
Definition Decl.h:4321
void setPreviousDecl(decl_type *PrevDecl)
Set the previous declaration.
Definition Decl.h:5326
This table allows us to fully hide how we implement multi-keyword caching.
Selector getSelector(unsigned NumArgs, const IdentifierInfo **IIV)
Can create any sort of selector.
Smart pointer class that efficiently represents Objective-C method names.
Encodes a location in the source.
This class handles loading and caching of source files into memory.
The streaming interface shared between DiagnosticBuilder and PartialDiagnostic.
clang::DiagStorageAllocator DiagStorageAllocator
StringLiteral - This represents a string literal expression, e.g.
Definition Expr.h:1799
Represents the declaration of a struct/union/class/enum.
Definition Decl.h:3717
TagTypeKind TagKind
Definition Decl.h:3722
Kind
The basic C++ ABI kind.
Exposes information about the current target.
Definition TargetInfo.h:226
A convenient class for passing around template argument information.
Represents a template argument.
The base class of all kinds of template declarations (e.g., class, function, etc.).
Represents a C++ template name within the type system.
A template parameter object.
Stores a list of template parameters for a TemplateDecl and its derived classes.
TemplateTemplateParmDecl - Declares a template template parameter, e.g., "T" in.
Declaration of a template type parameter.
The top declaration context.
Definition Decl.h:105
static TranslationUnitDecl * Create(ASTContext &C)
Definition Decl.cpp:5423
Represents the declaration of a typedef-name via a C++11 alias-declaration.
Definition Decl.h:3688
Models the abbreviated syntax to constrain a template type parameter: template <convertible_to<string...
Definition ASTConcept.h:227
Represents a declaration of a type.
Definition Decl.h:3513
A container of type source information.
Definition TypeBase.h:8249
The base class of the type hierarchy.
Definition TypeBase.h:1833
bool isSignedIntegerOrEnumerationType() const
Determines whether this is an integer type that is signed or an enumeration types whose underlying ty...
Definition Type.cpp:2225
bool isObjCNSObjectType() const
Definition Type.cpp:5271
bool isDependentType() const
Whether this type is a dependent type, meaning that its definition somehow depends on a template para...
Definition TypeBase.h:2782
bool isIncompleteType(NamedDecl **Def=nullptr) const
Types are partitioned into 3 broad categories (C99 6.2.5p1): object types, function types,...
Definition Type.cpp:2435
std::optional< NullabilityKind > getNullability() const
Determine the nullability of the given type.
Definition Type.cpp:5014
Represents the declaration of a typedef-name via the 'typedef' type specifier.
Definition Decl.h:3667
Base class for declarations which introduce a typedef-name.
Definition Decl.h:3562
An artificial decl, representing a global anonymous constant value which is uniquified by value withi...
Definition DeclCXX.h:4451
The iterator over UnresolvedSets.
Represents the dependent type named by a dependently-scoped typename using declaration,...
Definition TypeBase.h:5970
Represents a dependent using declaration which was marked with typename.
Definition DeclCXX.h:4033
Represents a C++ using-enum-declaration.
Definition DeclCXX.h:3788
Represents a shadow declaration implicitly introduced into a scope by a (resolved) using-declaration ...
Definition DeclCXX.h:3395
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
Definition Decl.h:712
Represents a variable declaration or definition.
Definition Decl.h:926
Declaration of a variable template.
Represents a C array with a specified size that is not an integer-constant-expression.
Definition TypeBase.h:3966
Represents a GCC generic vector type.
Definition TypeBase.h:4175
This class provides information about commands that can be used in comments.
A full comment attached to a declaration, contains block content.
Definition Comment.h:1104
Holds all information required to evaluate constexpr code in a module.
Definition Context.h:41
const internal::VariadicAllOfMatcher< Type > type
Matches Types in the clang AST.
const internal::VariadicDynCastAllOfMatcher< Stmt, BlockExpr > blockExpr
Matches a reference to a block.
llvm::FixedPointSemantics FixedPointSemantics
Definition Interp.h:42
The JSON file list parser is used to communicate input to InstallAPI.
CanQual< Type > CanQualType
Represents a canonical, potentially-qualified type.
GVALinkage
A more specific kind of linkage than enum Linkage.
Definition Linkage.h:72
AutoTypeKeyword
Which keyword(s) were used to create an AutoType.
Definition TypeBase.h:1792
bool isTargetAddressSpace(LangAS AS)
OpenCLTypeKind
OpenCL type kinds.
Definition TargetInfo.h:212
NullabilityKind
Describes the nullability of a particular type.
Definition Specifiers.h:348
@ Nullable
Values of this type can be null.
Definition Specifiers.h:352
@ Unspecified
Whether values of this type can be null is (explicitly) unspecified.
Definition Specifiers.h:357
@ NonNull
Values of this type can never be null.
Definition Specifiers.h:350
@ TemplateName
The identifier is a template name. FIXME: Add an annotation for that.
Definition Parser.h:61
TypeOfKind
The kind of 'typeof' expression we're after.
Definition TypeBase.h:918
SmallVector< Attr *, 4 > AttrVec
AttrVec - A vector of Attr, which is how they are stored on the AST.
@ Module
Module linkage, which indicates that the entity can be referred to from other translation units withi...
Definition Linkage.h:54
Selector GetUnarySelector(StringRef name, ASTContext &Ctx)
Utility function for constructing an unary selector.
@ Result
The result type of a method or function.
Definition TypeBase.h:905
ArraySizeModifier
Capture whether this is a normal array (e.g.
Definition TypeBase.h:3719
const FunctionProtoType * T
@ Template
We are parsing a template declaration.
Definition Parser.h:81
Selector GetNullarySelector(StringRef name, ASTContext &Ctx)
Utility function for constructing a nullary selector.
@ Class
The "class" keyword.
Definition TypeBase.h:5889
BuiltinTemplateKind
Kinds of BuiltinTemplateDecl.
Definition Builtins.h:490
@ Keyword
The name has been typo-corrected to a keyword.
Definition Sema.h:560
LangAS
Defines the address space values used by the address space qualifier of QualType.
TranslationUnitKind
Describes the kind of translation unit being processed.
@ TU_Incremental
The translation unit is a is a complete translation unit that we might incrementally extend later.
FloatModeKind
Definition TargetInfo.h:75
SmallVector< CXXBaseSpecifier *, 4 > CXXCastPath
A simple array of base specifiers.
Definition ASTContext.h:149
const StreamingDiagnostic & operator<<(const StreamingDiagnostic &DB, const ConceptReference *C)
Insertion operator for diagnostics.
TemplateSpecializationKind
Describes the kind of template specialization that a particular template specialization declaration r...
Definition Specifiers.h:188
CallingConv
CallingConv - Specifies the calling convention that a function uses.
Definition Specifiers.h:278
U cast(CodeGen::Address addr)
Definition Address.h:327
AlignRequirementKind
Definition ASTContext.h:176
@ None
The alignment was not explicit in code.
Definition ASTContext.h:178
@ RequiredByEnum
The alignment comes from an alignment attribute on a enum type.
Definition ASTContext.h:187
@ RequiredByTypedef
The alignment comes from an alignment attribute on a typedef.
Definition ASTContext.h:181
@ RequiredByRecord
The alignment comes from an alignment attribute on a record type.
Definition ASTContext.h:184
ElaboratedTypeKeyword
The elaboration keyword that precedes a qualified type name or introduces an elaborated-type-specifie...
Definition TypeBase.h:5853
@ None
No keyword precedes the qualified type name.
Definition TypeBase.h:5874
@ Other
Other implicit parameter.
Definition Decl.h:1746
Diagnostic wrappers for TextAPI types for error reporting.
Definition Dominators.h:30
BuiltinVectorTypeInfo(QualType ElementType, llvm::ElementCount EC, unsigned NumVectors)
CUDAConstantEvalContextRAII(ASTContext &Ctx_, bool NoWrongSidedVars)
Definition ASTContext.h:809
BuiltinVectorTypeInfo(QualType ElementType, llvm::ElementCount EC, unsigned NumVectors)
CUDAConstantEvalContextRAII(ASTContext &Ctx_, bool NoWrongSidedVars)
Definition ASTContext.h:809
bool NoWrongSidedVars
Do not allow wrong-sided variables in constant expressions.
Definition ASTContext.h:804
SourceLocation PragmaSectionLocation
SectionInfo(NamedDecl *Decl, SourceLocation PragmaSectionLocation, int SectionFlags)
Copy initialization expr of a __block variable and a boolean flag that indicates whether the expressi...
Definition Expr.h:6604
DeclarationNameInfo - A collector data type for bundling together a DeclarationName and the correspon...
Holds information about the various types of exception specification.
Definition TypeBase.h:5311
Extra information about a function prototype.
Definition TypeBase.h:5339
A cache of the value of this pointer, in the most recent generation in which we queried it.
static ValueType makeValue(const ASTContext &Ctx, T Value)
Create the representation of a LazyGenerationalUpdatePtr.
llvm::PointerUnion< T, LazyData * > ValueType
Parts of a decomposed MSGuidDecl.
Definition DeclCXX.h:4369
Contains information gathered from parsing the contents of TargetAttr.
Definition TargetInfo.h:60
Describes how types, statements, expressions, and declarations should be printed.
A std::pair-like structure for storing a qualified type split into its local qualifiers and its local...
Definition TypeBase.h:870
const Type * Ty
The locally-unqualified type.
Definition TypeBase.h:872
Qualifiers Quals
The local qualifiers.
Definition TypeBase.h:875
AlignRequirementKind AlignRequirement
Definition ASTContext.h:207
TypeInfoChars(CharUnits Width, CharUnits Align, AlignRequirementKind AlignRequirement)
Definition ASTContext.h:210
bool isAlignRequired()
Definition ASTContext.h:199
AlignRequirementKind AlignRequirement
Definition ASTContext.h:193
TypeInfo(uint64_t Width, unsigned Align, AlignRequirementKind AlignRequirement)
Definition ASTContext.h:196
static ScalableVecTyKey getTombstoneKey()
Definition ASTContext.h:73
static ScalableVecTyKey getEmptyKey()
Definition ASTContext.h:70
static bool isEqual(const ScalableVecTyKey &LHS, const ScalableVecTyKey &RHS)
Definition ASTContext.h:80
static unsigned getHashValue(const ScalableVecTyKey &Val)
Definition ASTContext.h:76
static bool isEqual(const FoldingSetNodeID &LHS, const FoldingSetNodeID &RHS)
static FoldingSetNodeID getTombstoneKey()
static unsigned getHashValue(const FoldingSetNodeID &Val)
clang::QualType EltTy
Definition ASTContext.h:57
bool operator==(const ScalableVecTyKey &RHS) const
Definition ASTContext.h:61