clang 23.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"
28#include "clang/AST/Type.h"
30#include "clang/Basic/LLVM.h"
33#include "llvm/ADT/DenseMap.h"
34#include "llvm/ADT/DenseMapInfo.h"
35#include "llvm/ADT/DenseSet.h"
36#include "llvm/ADT/FoldingSet.h"
37#include "llvm/ADT/IntrusiveRefCntPtr.h"
38#include "llvm/ADT/MapVector.h"
39#include "llvm/ADT/PointerIntPair.h"
40#include "llvm/ADT/PointerUnion.h"
41#include "llvm/ADT/SetVector.h"
42#include "llvm/ADT/SmallVector.h"
43#include "llvm/ADT/StringMap.h"
44#include "llvm/ADT/StringRef.h"
45#include "llvm/ADT/StringSet.h"
46#include "llvm/ADT/TinyPtrVector.h"
47#include "llvm/Support/TypeSize.h"
48#include <optional>
49
50namespace llvm {
51
52class APFixedPoint;
54struct fltSemantics;
55template <typename T, unsigned N> class SmallPtrSet;
56
59 unsigned NumElts;
60 unsigned NumFields;
61
62 bool operator==(const ScalableVecTyKey &RHS) const {
63 return EltTy == RHS.EltTy && NumElts == RHS.NumElts &&
64 NumFields == RHS.NumFields;
65 }
66};
67
68// Provide a DenseMapInfo specialization so that ScalableVecTyKey can be used
69// as a key in DenseMap.
70template <> struct DenseMapInfo<ScalableVecTyKey> {
71 static inline ScalableVecTyKey getEmptyKey() {
72 return {DenseMapInfo<clang::QualType>::getEmptyKey(), ~0U, ~0U};
73 }
75 return {DenseMapInfo<clang::QualType>::getTombstoneKey(), ~0U, ~0U};
76 }
77 static unsigned getHashValue(const ScalableVecTyKey &Val) {
78 return hash_combine(DenseMapInfo<clang::QualType>::getHashValue(Val.EltTy),
79 Val.NumElts, Val.NumFields);
80 }
81 static bool isEqual(const ScalableVecTyKey &LHS,
82 const ScalableVecTyKey &RHS) {
83 return LHS == RHS;
84 }
85};
86
87} // namespace llvm
88
89namespace clang {
90
91class APValue;
93class ASTRecordLayout;
94class AtomicExpr;
95class BlockExpr;
96struct BlockVarCopyInit;
98class CharUnits;
99class ConceptDecl;
100class CXXABI;
102class CXXMethodDecl;
103class CXXRecordDecl;
105class DynTypedNodeList;
106class Expr;
108enum class FloatModeKind;
109class GlobalDecl;
110class IdentifierTable;
111class LangOptions;
112class MangleContext;
115class Module;
116struct MSGuidDeclParts;
118class NoSanitizeList;
119class ObjCCategoryDecl;
122class ObjCImplDecl;
125class ObjCIvarDecl;
126class ObjCMethodDecl;
127class ObjCPropertyDecl;
129class ObjCProtocolDecl;
131class OMPTraitInfo;
132class ParentMapContext;
133struct ParsedTargetAttr;
134class Preprocessor;
135class ProfileList;
136class StoredDeclsMap;
137class TargetAttr;
138class TargetInfo;
139class TemplateDecl;
143class TypeConstraint;
145class UsingShadowDecl;
146class VarTemplateDecl;
149
150/// A simple array of base specifiers.
152
153namespace Builtin {
154
155class Context;
156
157} // namespace Builtin
158
160enum OpenCLTypeKind : uint8_t;
161
162namespace comments {
163
164class FullComment;
165
166} // namespace comments
167
168namespace interp {
169
170class Context;
171
172} // namespace interp
173
174namespace serialization {
175template <class> class AbstractTypeReader;
176} // namespace serialization
177
179 /// The alignment was not explicit in code.
181
182 /// The alignment comes from an alignment attribute on a typedef.
184
185 /// The alignment comes from an alignment attribute on a record type.
187
188 /// The alignment comes from an alignment attribute on a enum type.
190};
191
205
219
224
225/// Holds long-lived AST nodes (such as types and decls) that can be
226/// referred to throughout the semantic analysis of a file.
227class ASTContext : public RefCountedBase<ASTContext> {
229
230 mutable SmallVector<Type *, 0> Types;
231 mutable llvm::FoldingSet<ExtQuals> ExtQualNodes;
232 mutable llvm::FoldingSet<ComplexType> ComplexTypes;
233 mutable llvm::FoldingSet<PointerType> PointerTypes{GeneralTypesLog2InitSize};
234 mutable llvm::FoldingSet<AdjustedType> AdjustedTypes;
235 mutable llvm::FoldingSet<BlockPointerType> BlockPointerTypes;
236 mutable llvm::FoldingSet<LValueReferenceType> LValueReferenceTypes;
237 mutable llvm::FoldingSet<RValueReferenceType> RValueReferenceTypes;
238 mutable llvm::FoldingSet<MemberPointerType> MemberPointerTypes;
239 mutable llvm::ContextualFoldingSet<ConstantArrayType, ASTContext &>
240 ConstantArrayTypes;
241 mutable llvm::FoldingSet<IncompleteArrayType> IncompleteArrayTypes;
242 mutable std::vector<VariableArrayType*> VariableArrayTypes;
243 mutable llvm::ContextualFoldingSet<DependentSizedArrayType, ASTContext &>
244 DependentSizedArrayTypes;
245 mutable llvm::ContextualFoldingSet<DependentSizedExtVectorType, ASTContext &>
246 DependentSizedExtVectorTypes;
247 mutable llvm::ContextualFoldingSet<DependentAddressSpaceType, ASTContext &>
248 DependentAddressSpaceTypes;
249 mutable llvm::FoldingSet<VectorType> VectorTypes;
250 mutable llvm::ContextualFoldingSet<DependentVectorType, ASTContext &>
251 DependentVectorTypes;
252 mutable llvm::FoldingSet<ConstantMatrixType> MatrixTypes;
253 mutable llvm::ContextualFoldingSet<DependentSizedMatrixType, ASTContext &>
254 DependentSizedMatrixTypes;
255 mutable llvm::FoldingSet<FunctionNoProtoType> FunctionNoProtoTypes;
256 mutable llvm::ContextualFoldingSet<FunctionProtoType, ASTContext&>
257 FunctionProtoTypes;
258 mutable llvm::ContextualFoldingSet<DependentTypeOfExprType, ASTContext &>
259 DependentTypeOfExprTypes;
260 mutable llvm::ContextualFoldingSet<DependentDecltypeType, ASTContext &>
261 DependentDecltypeTypes;
262
263 mutable llvm::ContextualFoldingSet<PackIndexingType, ASTContext &>
264 DependentPackIndexingTypes;
265
266 mutable llvm::FoldingSet<TemplateTypeParmType> TemplateTypeParmTypes;
267 mutable llvm::FoldingSet<ObjCTypeParamType> ObjCTypeParamTypes;
268 mutable llvm::FoldingSet<SubstTemplateTypeParmType>
269 SubstTemplateTypeParmTypes;
270 mutable llvm::FoldingSet<SubstTemplateTypeParmPackType>
271 SubstTemplateTypeParmPackTypes;
272 mutable llvm::FoldingSet<SubstBuiltinTemplatePackType>
273 SubstBuiltinTemplatePackTypes;
274 mutable llvm::ContextualFoldingSet<TemplateSpecializationType, ASTContext&>
275 TemplateSpecializationTypes;
276 mutable llvm::FoldingSet<ParenType> ParenTypes{GeneralTypesLog2InitSize};
277 mutable llvm::FoldingSet<TagTypeFoldingSetPlaceholder> TagTypes;
278 mutable llvm::FoldingSet<FoldingSetPlaceholder<UnresolvedUsingType>>
279 UnresolvedUsingTypes;
280 mutable llvm::FoldingSet<UsingType> UsingTypes;
281 mutable llvm::FoldingSet<FoldingSetPlaceholder<TypedefType>> TypedefTypes;
282 mutable llvm::FoldingSet<DependentNameType> DependentNameTypes;
283 mutable llvm::FoldingSet<PackExpansionType> PackExpansionTypes;
284 mutable llvm::FoldingSet<ObjCObjectTypeImpl> ObjCObjectTypes;
285 mutable llvm::FoldingSet<ObjCObjectPointerType> ObjCObjectPointerTypes;
286 mutable llvm::FoldingSet<UnaryTransformType> UnaryTransformTypes;
287 // An AutoType can have a dependency on another AutoType via its template
288 // arguments. Since both dependent and dependency are on the same set,
289 // we can end up in an infinite recursion when looking for a node if we used
290 // a `FoldingSet`, since both could end up in the same bucket.
291 mutable llvm::DenseMap<llvm::FoldingSetNodeID, AutoType *> AutoTypes;
292 mutable llvm::FoldingSet<DeducedTemplateSpecializationType>
293 DeducedTemplateSpecializationTypes;
294 mutable llvm::FoldingSet<AtomicType> AtomicTypes;
295 mutable llvm::FoldingSet<AttributedType> AttributedTypes;
296 mutable llvm::FoldingSet<PipeType> PipeTypes;
297 mutable llvm::FoldingSet<BitIntType> BitIntTypes;
298 mutable llvm::ContextualFoldingSet<DependentBitIntType, ASTContext &>
299 DependentBitIntTypes;
300 mutable llvm::FoldingSet<BTFTagAttributedType> BTFTagAttributedTypes;
301 mutable llvm::FoldingSet<OverflowBehaviorType> OverflowBehaviorTypes;
302 llvm::FoldingSet<HLSLAttributedResourceType> HLSLAttributedResourceTypes;
303 llvm::FoldingSet<HLSLInlineSpirvType> HLSLInlineSpirvTypes;
304
305 mutable llvm::FoldingSet<CountAttributedType> CountAttributedTypes;
306
307 mutable llvm::FoldingSet<QualifiedTemplateName> QualifiedTemplateNames;
308 mutable llvm::FoldingSet<DependentTemplateName> DependentTemplateNames;
309 mutable llvm::FoldingSet<SubstTemplateTemplateParmStorage>
310 SubstTemplateTemplateParms;
311 mutable llvm::ContextualFoldingSet<SubstTemplateTemplateParmPackStorage,
312 ASTContext&>
313 SubstTemplateTemplateParmPacks;
314 mutable llvm::ContextualFoldingSet<DeducedTemplateStorage, ASTContext &>
315 DeducedTemplates;
316
317 mutable llvm::ContextualFoldingSet<ArrayParameterType, ASTContext &>
318 ArrayParameterTypes;
319
320 /// Store the unique Type corresponding to each Kind.
321 mutable std::array<Type *,
322 llvm::to_underlying(PredefinedSugarType::Kind::Last) + 1>
323 PredefinedSugarTypes{};
324
325 /// Internal storage for NestedNameSpecifiers.
326 ///
327 /// This set is managed by the NestedNameSpecifier class.
328 mutable llvm::FoldingSet<NamespaceAndPrefixStorage>
329 NamespaceAndPrefixStorages;
330
331 /// A cache mapping from RecordDecls to ASTRecordLayouts.
332 ///
333 /// This is lazily created. This is intentionally not serialized.
334 mutable llvm::DenseMap<const RecordDecl*, const ASTRecordLayout*>
335 ASTRecordLayouts;
336 mutable llvm::DenseMap<const ObjCInterfaceDecl *, const ASTRecordLayout *>
337 ObjCLayouts;
338
339 /// A cache from types to size and alignment information.
340 using TypeInfoMap = llvm::DenseMap<const Type *, struct TypeInfo>;
341 mutable TypeInfoMap MemoizedTypeInfo;
342
343 /// A cache from types to unadjusted alignment information. Only ARM and
344 /// AArch64 targets need this information, keeping it separate prevents
345 /// imposing overhead on TypeInfo size.
346 using UnadjustedAlignMap = llvm::DenseMap<const Type *, unsigned>;
347 mutable UnadjustedAlignMap MemoizedUnadjustedAlign;
348
349 /// A cache mapping from CXXRecordDecls to key functions.
350 llvm::DenseMap<const CXXRecordDecl*, LazyDeclPtr> KeyFunctions;
351
352 /// Mapping from ObjCContainers to their ObjCImplementations.
353 llvm::DenseMap<ObjCContainerDecl*, ObjCImplDecl*> ObjCImpls;
354
355 /// Mapping from ObjCMethod to its duplicate declaration in the same
356 /// interface.
357 llvm::DenseMap<const ObjCMethodDecl*,const ObjCMethodDecl*> ObjCMethodRedecls;
358
359 /// Mapping from __block VarDecls to BlockVarCopyInit.
360 llvm::DenseMap<const VarDecl *, BlockVarCopyInit> BlockVarCopyInits;
361
362 /// Mapping from GUIDs to the corresponding MSGuidDecl.
363 mutable llvm::FoldingSet<MSGuidDecl> MSGuidDecls;
364
365 /// Mapping from APValues to the corresponding UnnamedGlobalConstantDecl.
366 mutable llvm::FoldingSet<UnnamedGlobalConstantDecl>
367 UnnamedGlobalConstantDecls;
368
369 /// Mapping from APValues to the corresponding TemplateParamObjects.
370 mutable llvm::FoldingSet<TemplateParamObjectDecl> TemplateParamObjectDecls;
371
372 /// A cache mapping a string value to a StringLiteral object with the same
373 /// value.
374 ///
375 /// This is lazily created. This is intentionally not serialized.
376 mutable llvm::StringMap<StringLiteral *> StringLiteralCache;
377
378 mutable llvm::DenseSet<const FunctionDecl *> DestroyingOperatorDeletes;
379 mutable llvm::DenseSet<const FunctionDecl *> TypeAwareOperatorNewAndDeletes;
380
381 /// Global and array operators delete are only required for MSVC deleting
382 /// destructors support. Store them here to avoid keeping 4 pointers that are
383 /// not always used in each redeclaration of the destructor.
384 mutable llvm::DenseMap<const CXXDestructorDecl *, FunctionDecl *>
385 OperatorDeletesForVirtualDtor;
386 mutable llvm::DenseMap<const CXXDestructorDecl *, FunctionDecl *>
387 GlobalOperatorDeletesForVirtualDtor;
388 mutable llvm::DenseMap<const CXXDestructorDecl *, FunctionDecl *>
389 ArrayOperatorDeletesForVirtualDtor;
390 mutable llvm::DenseMap<const CXXDestructorDecl *, FunctionDecl *>
391 GlobalArrayOperatorDeletesForVirtualDtor;
392
393 /// To remember for which types we met new[] call, these potentially require a
394 /// vector deleting dtor.
395 llvm::DenseSet<const CXXRecordDecl *> MaybeRequireVectorDeletingDtor;
396
397 /// The next string literal "version" to allocate during constant evaluation.
398 /// This is used to distinguish between repeated evaluations of the same
399 /// string literal.
400 ///
401 /// We don't need to serialize this because constants get re-evaluated in the
402 /// current file before they are compared locally.
403 unsigned NextStringLiteralVersion = 0;
404
405 /// MD5 hash of CUID. It is calculated when first used and cached by this
406 /// data member.
407 mutable std::string CUIDHash;
408
409 /// Representation of a "canonical" template template parameter that
410 /// is used in canonical template names.
411 class CanonicalTemplateTemplateParm : public llvm::FoldingSetNode {
412 TemplateTemplateParmDecl *Parm;
413
414 public:
415 CanonicalTemplateTemplateParm(TemplateTemplateParmDecl *Parm)
416 : Parm(Parm) {}
417
418 TemplateTemplateParmDecl *getParam() const { return Parm; }
419
420 void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &C) {
421 Profile(ID, C, Parm);
422 }
423
424 static void Profile(llvm::FoldingSetNodeID &ID,
425 const ASTContext &C,
426 TemplateTemplateParmDecl *Parm);
427 };
428 mutable llvm::ContextualFoldingSet<CanonicalTemplateTemplateParm,
429 const ASTContext&>
430 CanonTemplateTemplateParms;
431
432 /// The typedef for the __int128_t type.
433 mutable TypedefDecl *Int128Decl = nullptr;
434
435 /// The typedef for the __uint128_t type.
436 mutable TypedefDecl *UInt128Decl = nullptr;
437
438 /// The typedef for the target specific predefined
439 /// __builtin_va_list type.
440 mutable TypedefDecl *BuiltinVaListDecl = nullptr;
441
442 /// The typedef for the predefined \c __builtin_ms_va_list type.
443 mutable TypedefDecl *BuiltinMSVaListDecl = nullptr;
444
445 /// The typedef for the predefined \c id type.
446 mutable TypedefDecl *ObjCIdDecl = nullptr;
447
448 /// The typedef for the predefined \c SEL type.
449 mutable TypedefDecl *ObjCSelDecl = nullptr;
450
451 /// The typedef for the predefined \c Class type.
452 mutable TypedefDecl *ObjCClassDecl = nullptr;
453
454 /// The typedef for the predefined \c Protocol class in Objective-C.
455 mutable ObjCInterfaceDecl *ObjCProtocolClassDecl = nullptr;
456
457 /// The typedef for the predefined 'BOOL' type.
458 mutable TypedefDecl *BOOLDecl = nullptr;
459
460 // Typedefs which may be provided defining the structure of Objective-C
461 // pseudo-builtins
462 QualType ObjCIdRedefinitionType;
463 QualType ObjCClassRedefinitionType;
464 QualType ObjCSelRedefinitionType;
465
466 /// The identifier 'bool'.
467 mutable IdentifierInfo *BoolName = nullptr;
468
469 /// The identifier 'NSObject'.
470 mutable IdentifierInfo *NSObjectName = nullptr;
471
472 /// The identifier 'NSCopying'.
473 IdentifierInfo *NSCopyingName = nullptr;
474
475#define BuiltinTemplate(BTName) mutable IdentifierInfo *Name##BTName = nullptr;
476#include "clang/Basic/BuiltinTemplates.inc"
477
478 QualType ObjCConstantStringType;
479 mutable RecordDecl *CFConstantStringTagDecl = nullptr;
480 mutable TypedefDecl *CFConstantStringTypeDecl = nullptr;
481
482 mutable QualType ObjCSuperType;
483
484 QualType ObjCNSStringType;
485
486 /// The typedef declaration for the Objective-C "instancetype" type.
487 TypedefDecl *ObjCInstanceTypeDecl = nullptr;
488
489 /// The type for the C FILE type.
490 TypeDecl *FILEDecl = nullptr;
491
492 /// The type for the C jmp_buf type.
493 TypeDecl *jmp_bufDecl = nullptr;
494
495 /// The type for the C sigjmp_buf type.
496 TypeDecl *sigjmp_bufDecl = nullptr;
497
498 /// The type for the C ucontext_t type.
499 TypeDecl *ucontext_tDecl = nullptr;
500
501 /// Type for the Block descriptor for Blocks CodeGen.
502 ///
503 /// Since this is only used for generation of debug info, it is not
504 /// serialized.
505 mutable RecordDecl *BlockDescriptorType = nullptr;
506
507 /// Type for the Block descriptor for Blocks CodeGen.
508 ///
509 /// Since this is only used for generation of debug info, it is not
510 /// serialized.
511 mutable RecordDecl *BlockDescriptorExtendedType = nullptr;
512
513 /// Declaration for the CUDA cudaConfigureCall function.
514 FunctionDecl *cudaConfigureCallDecl = nullptr;
515 /// Declaration for the CUDA cudaGetParameterBuffer function.
516 FunctionDecl *cudaGetParameterBufferDecl = nullptr;
517 /// Declaration for the CUDA cudaLaunchDevice function.
518 FunctionDecl *cudaLaunchDeviceDecl = nullptr;
519
520 /// Keeps track of all declaration attributes.
521 ///
522 /// Since so few decls have attrs, we keep them in a hash map instead of
523 /// wasting space in the Decl class.
524 llvm::DenseMap<const Decl*, AttrVec*> DeclAttrs;
525
526 /// A mapping from non-redeclarable declarations in modules that were
527 /// merged with other declarations to the canonical declaration that they were
528 /// merged into.
529 llvm::DenseMap<Decl*, Decl*> MergedDecls;
530
531 /// A mapping from a defining declaration to a list of modules (other
532 /// than the owning module of the declaration) that contain merged
533 /// definitions of that entity.
534 llvm::DenseMap<NamedDecl*, llvm::TinyPtrVector<Module*>> MergedDefModules;
535
536 /// Initializers for a module, in order. Each Decl will be either
537 /// something that has a semantic effect on startup (such as a variable with
538 /// a non-constant initializer), or an ImportDecl (which recursively triggers
539 /// initialization of another module).
540 struct PerModuleInitializers {
541 llvm::SmallVector<Decl*, 4> Initializers;
542 llvm::SmallVector<GlobalDeclID, 4> LazyInitializers;
543
544 void resolve(ASTContext &Ctx);
545 };
546 llvm::DenseMap<Module*, PerModuleInitializers*> ModuleInitializers;
547
548 /// This is the top-level (C++20) Named module we are building.
549 Module *CurrentCXXNamedModule = nullptr;
550
551 /// Help structures to decide whether two `const Module *` belongs
552 /// to the same conceptual module to avoid the expensive to string comparison
553 /// if possible.
554 ///
555 /// Not serialized intentionally.
556 mutable llvm::StringMap<const Module *> PrimaryModuleNameMap;
557 mutable llvm::DenseMap<const Module *, const Module *> SameModuleLookupSet;
558
559 static constexpr unsigned ConstantArrayTypesLog2InitSize = 8;
560 static constexpr unsigned GeneralTypesLog2InitSize = 9;
561 static constexpr unsigned FunctionProtoTypesLog2InitSize = 12;
562
563 /// A mapping from an ObjC class to its subclasses.
564 llvm::DenseMap<const ObjCInterfaceDecl *,
565 SmallVector<const ObjCInterfaceDecl *, 4>>
566 ObjCSubClasses;
567
568 // A mapping from Scalable Vector Type keys to their corresponding QualType.
569 mutable llvm::DenseMap<llvm::ScalableVecTyKey, QualType> ScalableVecTyMap;
570
571 ASTContext &this_() { return *this; }
572
573public:
574 /// A type synonym for the TemplateOrInstantiation mapping.
576 llvm::PointerUnion<VarTemplateDecl *, MemberSpecializationInfo *>;
577
578private:
579 friend class ASTDeclReader;
580 friend class ASTReader;
581 friend class ASTWriter;
582 template <class> friend class serialization::AbstractTypeReader;
583 friend class CXXRecordDecl;
584 friend class IncrementalParser;
585
586 /// A mapping to contain the template or declaration that
587 /// a variable declaration describes or was instantiated from,
588 /// respectively.
589 ///
590 /// For non-templates, this value will be NULL. For variable
591 /// declarations that describe a variable template, this will be a
592 /// pointer to a VarTemplateDecl. For static data members
593 /// of class template specializations, this will be the
594 /// MemberSpecializationInfo referring to the member variable that was
595 /// instantiated or specialized. Thus, the mapping will keep track of
596 /// the static data member templates from which static data members of
597 /// class template specializations were instantiated.
598 ///
599 /// Given the following example:
600 ///
601 /// \code
602 /// template<typename T>
603 /// struct X {
604 /// static T value;
605 /// };
606 ///
607 /// template<typename T>
608 /// T X<T>::value = T(17);
609 ///
610 /// int *x = &X<int>::value;
611 /// \endcode
612 ///
613 /// This mapping will contain an entry that maps from the VarDecl for
614 /// X<int>::value to the corresponding VarDecl for X<T>::value (within the
615 /// class template X) and will be marked TSK_ImplicitInstantiation.
616 llvm::DenseMap<const VarDecl *, TemplateOrSpecializationInfo>
617 TemplateOrInstantiation;
618
619 /// Keeps track of the declaration from which a using declaration was
620 /// created during instantiation.
621 ///
622 /// The source and target declarations are always a UsingDecl, an
623 /// UnresolvedUsingValueDecl, or an UnresolvedUsingTypenameDecl.
624 ///
625 /// For example:
626 /// \code
627 /// template<typename T>
628 /// struct A {
629 /// void f();
630 /// };
631 ///
632 /// template<typename T>
633 /// struct B : A<T> {
634 /// using A<T>::f;
635 /// };
636 ///
637 /// template struct B<int>;
638 /// \endcode
639 ///
640 /// This mapping will contain an entry that maps from the UsingDecl in
641 /// B<int> to the UnresolvedUsingDecl in B<T>.
642 llvm::DenseMap<NamedDecl *, NamedDecl *> InstantiatedFromUsingDecl;
643
644 /// Like InstantiatedFromUsingDecl, but for using-enum-declarations. Maps
645 /// from the instantiated using-enum to the templated decl from whence it
646 /// came.
647 /// Note that using-enum-declarations cannot be dependent and
648 /// thus will never be instantiated from an "unresolved"
649 /// version thereof (as with using-declarations), so each mapping is from
650 /// a (resolved) UsingEnumDecl to a (resolved) UsingEnumDecl.
651 llvm::DenseMap<UsingEnumDecl *, UsingEnumDecl *>
652 InstantiatedFromUsingEnumDecl;
653
654 /// Similarly maps instantiated UsingShadowDecls to their origin.
655 llvm::DenseMap<UsingShadowDecl*, UsingShadowDecl*>
656 InstantiatedFromUsingShadowDecl;
657
658 llvm::DenseMap<FieldDecl *, FieldDecl *> InstantiatedFromUnnamedFieldDecl;
659
660 /// Maps a canonical specialization Decl to all ExplicitInstantiationDecls
661 /// that reference it (declarations and definitions).
662 llvm::DenseMap<const NamedDecl *,
663 llvm::TinyPtrVector<ExplicitInstantiationDecl *>>
664 ExplicitInstantiations;
665
666 /// Mapping that stores the methods overridden by a given C++
667 /// member function.
668 ///
669 /// Since most C++ member functions aren't virtual and therefore
670 /// don't override anything, we store the overridden functions in
671 /// this map on the side rather than within the CXXMethodDecl structure.
672 using CXXMethodVector = llvm::TinyPtrVector<const CXXMethodDecl *>;
673 llvm::DenseMap<const CXXMethodDecl *, CXXMethodVector> OverriddenMethods;
674
675 /// Mapping from each declaration context to its corresponding
676 /// mangling numbering context (used for constructs like lambdas which
677 /// need to be consistently numbered for the mangler).
678 llvm::DenseMap<const DeclContext *, std::unique_ptr<MangleNumberingContext>>
679 MangleNumberingContexts;
680 llvm::DenseMap<const Decl *, std::unique_ptr<MangleNumberingContext>>
681 ExtraMangleNumberingContexts;
682
683 /// Side-table of mangling numbers for declarations which rarely
684 /// need them (like static local vars).
685 llvm::MapVector<const NamedDecl *, unsigned> MangleNumbers;
686 llvm::MapVector<const VarDecl *, unsigned> StaticLocalNumbers;
687 /// Mapping the associated device lambda mangling number if present.
688 mutable llvm::DenseMap<const CXXRecordDecl *, unsigned>
689 DeviceLambdaManglingNumbers;
690
691 /// Mapping that stores parameterIndex values for ParmVarDecls when
692 /// that value exceeds the bitfield size of ParmVarDeclBits.ParameterIndex.
693 using ParameterIndexTable = llvm::DenseMap<const VarDecl *, unsigned>;
694 ParameterIndexTable ParamIndices;
695
696public:
700 std::optional<CXXRecordDeclRelocationInfo>
704
705 /// Examines a given type, and returns whether the type itself
706 /// is address discriminated, or any transitively embedded types
707 /// contain data that is address discriminated. This includes
708 /// implicitly authenticated values like vtable pointers, as well as
709 /// explicitly qualified fields.
711 if (!isPointerAuthenticationAvailable())
712 return false;
713 return findPointerAuthContent(T) != PointerAuthContent::None;
714 }
715
716 /// Examines a given type, and returns whether the type itself
717 /// or any data it transitively contains has a pointer authentication
718 /// schema that is not safely relocatable. e.g. any data or fields
719 /// with address discrimination other than any otherwise similar
720 /// vtable pointers.
722 if (!isPointerAuthenticationAvailable())
723 return false;
724 return findPointerAuthContent(T) != PointerAuthContent::None;
725 }
726
727private:
728 llvm::DenseMap<const CXXRecordDecl *, CXXRecordDeclRelocationInfo>
729 RelocatableClasses;
730
731 // FIXME: store in RecordDeclBitfields in future?
732 enum class PointerAuthContent : uint8_t {
733 None,
734 AddressDiscriminatedVTable,
735 AddressDiscriminatedData
736 };
737
738 // A simple helper function to short circuit pointer auth checks.
739 bool isPointerAuthenticationAvailable() const {
740 return LangOpts.PointerAuthCalls || LangOpts.PointerAuthIntrinsics;
741 }
742 PointerAuthContent findPointerAuthContent(QualType T) const;
743 mutable llvm::DenseMap<const RecordDecl *, PointerAuthContent>
744 RecordContainsAddressDiscriminatedPointerAuth;
745
746 ImportDecl *FirstLocalImport = nullptr;
747 ImportDecl *LastLocalImport = nullptr;
748
749 TranslationUnitDecl *TUDecl = nullptr;
750 mutable ExternCContextDecl *ExternCContext = nullptr;
751
752#define BuiltinTemplate(BTName) \
753 mutable BuiltinTemplateDecl *Decl##BTName = nullptr;
754#include "clang/Basic/BuiltinTemplates.inc"
755
756 /// The associated SourceManager object.
757 SourceManager &SourceMgr;
758
759 /// The language options used to create the AST associated with
760 /// this ASTContext object.
761 LangOptions &LangOpts;
762
763 /// NoSanitizeList object that is used by sanitizers to decide which
764 /// entities should not be instrumented.
765 std::unique_ptr<NoSanitizeList> NoSanitizeL;
766
767 /// Function filtering mechanism to determine whether a given function
768 /// should be imbued with the XRay "always" or "never" attributes.
769 std::unique_ptr<XRayFunctionFilter> XRayFilter;
770
771 /// ProfileList object that is used by the profile instrumentation
772 /// to decide which entities should be instrumented.
773 std::unique_ptr<ProfileList> ProfList;
774
775 /// The allocator used to create AST objects.
776 ///
777 /// AST objects are never destructed; rather, all memory associated with the
778 /// AST objects will be released when the ASTContext itself is destroyed.
779 mutable llvm::BumpPtrAllocator BumpAlloc;
780
781 /// Allocator for partial diagnostics.
783
784 /// The current C++ ABI.
785 std::unique_ptr<CXXABI> ABI;
786 CXXABI *createCXXABI(const TargetInfo &T);
787
788 /// Address space map mangling must be used with language specific
789 /// address spaces (e.g. OpenCL/CUDA)
790 bool AddrSpaceMapMangling;
791
792 /// For performance, track whether any function effects are in use.
793 mutable bool AnyFunctionEffects = false;
794
795 const TargetInfo *Target = nullptr;
796 const TargetInfo *AuxTarget = nullptr;
797 clang::PrintingPolicy PrintingPolicy;
798 mutable std::unique_ptr<interp::Context> InterpContext;
799 std::unique_ptr<ParentMapContext> ParentMapCtx;
800
801 /// Keeps track of the deallocated DeclListNodes for future reuse.
802 DeclListNode *ListNodeFreeList = nullptr;
803
804public:
812
813 /// Returns the clang bytecode interpreter context.
815
817 /// Do not allow wrong-sided variables in constant expressions.
818 bool NoWrongSidedVars = false;
829
830 /// Returns the dynamic AST node parent map context.
832
833 // A traversal scope limits the parts of the AST visible to certain analyses.
834 // RecursiveASTVisitor only visits specified children of TranslationUnitDecl.
835 // getParents() will only observe reachable parent edges.
836 //
837 // The scope is defined by a set of "top-level" declarations which will be
838 // visible under the TranslationUnitDecl.
839 // Initially, it is the entire TU, represented by {getTranslationUnitDecl()}.
840 //
841 // After setTraversalScope({foo, bar}), the exposed AST looks like:
842 // TranslationUnitDecl
843 // - foo
844 // - ...
845 // - bar
846 // - ...
847 // All other siblings of foo and bar are pruned from the tree.
848 // (However they are still accessible via TranslationUnitDecl->decls())
849 //
850 // Changing the scope clears the parent cache, which is expensive to rebuild.
851 ArrayRef<Decl *> getTraversalScope() const { return TraversalScope; }
852 void setTraversalScope(const std::vector<Decl *> &);
853
854 /// Forwards to get node parents from the ParentMapContext. New callers should
855 /// use ParentMapContext::getParents() directly.
856 template <typename NodeT> DynTypedNodeList getParents(const NodeT &Node);
857
859 return PrintingPolicy;
860 }
861
863 PrintingPolicy = Policy;
864 }
865
866 SourceManager& getSourceManager() { return SourceMgr; }
867 const SourceManager& getSourceManager() const { return SourceMgr; }
868
869 // Cleans up some of the data structures. This allows us to do cleanup
870 // normally done in the destructor earlier. Renders much of the ASTContext
871 // unusable, mostly the actual AST nodes, so should be called when we no
872 // longer need access to the AST.
873 void cleanup();
874
875 llvm::BumpPtrAllocator &getAllocator() const {
876 return BumpAlloc;
877 }
878
879 void *Allocate(size_t Size, unsigned Align = 8) const {
880 return BumpAlloc.Allocate(Size, Align);
881 }
882 template <typename T> T *Allocate(size_t Num = 1) const {
883 return static_cast<T *>(Allocate(Num * sizeof(T), alignof(T)));
884 }
885 void Deallocate(void *Ptr) const {}
886
887 llvm::StringRef backupStr(llvm::StringRef S) const {
888 char *Buf = new (*this) char[S.size()];
889 llvm::copy(S, Buf);
890 return llvm::StringRef(Buf, S.size());
891 }
892
893 /// Allocates a \c DeclListNode or returns one from the \c ListNodeFreeList
894 /// pool.
896 if (DeclListNode *Alloc = ListNodeFreeList) {
897 ListNodeFreeList = dyn_cast_if_present<DeclListNode *>(Alloc->Rest);
898 Alloc->D = ND;
899 Alloc->Rest = nullptr;
900 return Alloc;
901 }
902 return new (*this) DeclListNode(ND);
903 }
904 /// Deallocates a \c DeclListNode by returning it to the \c ListNodeFreeList
905 /// pool.
907 N->Rest = ListNodeFreeList;
908 ListNodeFreeList = N;
909 }
910
911 /// Return the total amount of physical memory allocated for representing
912 /// AST nodes and type information.
913 size_t getASTAllocatedMemory() const {
914 return BumpAlloc.getTotalMemory();
915 }
916
917 /// Return the total memory used for various side tables.
918 size_t getSideTableAllocatedMemory() const;
919
921 return DiagAllocator;
922 }
923
924 const TargetInfo &getTargetInfo() const { return *Target; }
925 const TargetInfo *getAuxTargetInfo() const { return AuxTarget; }
926
927 const QualType GetHigherPrecisionFPType(QualType ElementType) const {
928 const auto *CurrentBT = cast<BuiltinType>(ElementType);
929 switch (CurrentBT->getKind()) {
930 case BuiltinType::Kind::Half:
931 case BuiltinType::Kind::Float16:
932 return FloatTy;
933 case BuiltinType::Kind::Float:
934 case BuiltinType::Kind::BFloat16:
935 return DoubleTy;
936 case BuiltinType::Kind::Double:
937 return LongDoubleTy;
938 default:
939 return ElementType;
940 }
941 return ElementType;
942 }
943
944 /// getIntTypeForBitwidth -
945 /// sets integer QualTy according to specified details:
946 /// bitwidth, signed/unsigned.
947 /// Returns empty type if there is no appropriate target types.
948 QualType getIntTypeForBitwidth(unsigned DestWidth,
949 unsigned Signed) const;
950
951 /// getRealTypeForBitwidth -
952 /// sets floating point QualTy according to specified bitwidth.
953 /// Returns empty type if there is no appropriate target types.
954 QualType getRealTypeForBitwidth(unsigned DestWidth,
955 FloatModeKind ExplicitType) const;
956
957 bool AtomicUsesUnsupportedLibcall(const AtomicExpr *E) const;
958
959 const LangOptions& getLangOpts() const { return LangOpts; }
960
961 // If this condition is false, typo correction must be performed eagerly
962 // rather than delayed in many places, as it makes use of dependent types.
963 // the condition is false for clang's C-only codepath, as it doesn't support
964 // dependent types yet.
965 bool isDependenceAllowed() const {
966 return LangOpts.CPlusPlus || LangOpts.RecoveryAST;
967 }
968
969 const NoSanitizeList &getNoSanitizeList() const { return *NoSanitizeL; }
970
972 const QualType &Ty) const;
973
975
977 return *XRayFilter;
978 }
979
980 const ProfileList &getProfileList() const { return *ProfList; }
981
983
985 return FullSourceLoc(Loc,SourceMgr);
986 }
987
988 /// Return the C++ ABI kind that should be used. The C++ ABI can be overriden
989 /// at compile time with `-fc++-abi=`. If this is not provided, we instead use
990 /// the default ABI set by the target.
992
993 /// All comments in this translation unit.
995
996 /// True if comments are already loaded from ExternalASTSource.
997 mutable bool CommentsLoaded = false;
998
999 /// Mapping from declaration to directly attached comment.
1000 ///
1001 /// Raw comments are owned by Comments list. This mapping is populated
1002 /// lazily.
1003 mutable llvm::DenseMap<const Decl *, const RawComment *> DeclRawComments;
1004
1005 /// Mapping from canonical declaration to the first redeclaration in chain
1006 /// that has a comment attached.
1007 ///
1008 /// Raw comments are owned by Comments list. This mapping is populated
1009 /// lazily.
1010 mutable llvm::DenseMap<const Decl *, const Decl *> RedeclChainComments;
1011
1012 /// Keeps track of redeclaration chains that don't have any comment attached.
1013 /// Mapping from canonical declaration to redeclaration chain that has no
1014 /// comments attached to any redeclaration. Specifically it's mapping to
1015 /// the last redeclaration we've checked.
1016 ///
1017 /// Shall not contain declarations that have comments attached to any
1018 /// redeclaration in their chain.
1019 mutable llvm::DenseMap<const Decl *, const Decl *> CommentlessRedeclChains;
1020
1021 /// Mapping from declarations to parsed comments attached to any
1022 /// redeclaration.
1023 mutable llvm::DenseMap<const Decl *, comments::FullComment *> ParsedComments;
1024
1025 /// Attaches \p Comment to \p OriginalD and to its redeclaration chain
1026 /// and removes the redeclaration chain from the set of commentless chains.
1027 ///
1028 /// Don't do anything if a comment has already been attached to \p OriginalD
1029 /// or its redeclaration chain.
1030 void cacheRawCommentForDecl(const Decl &OriginalD,
1031 const RawComment &Comment) const;
1032
1033 /// \returns searches \p CommentsInFile for doc comment for \p D.
1034 ///
1035 /// \p RepresentativeLocForDecl is used as a location for searching doc
1036 /// comments. \p CommentsInFile is a mapping offset -> comment of files in the
1037 /// same file where \p RepresentativeLocForDecl is.
1039 const Decl *D, const SourceLocation RepresentativeLocForDecl,
1040 const std::map<unsigned, RawComment *> &CommentsInFile) const;
1041
1042 /// Return the documentation comment attached to a given declaration,
1043 /// without looking into cache.
1045
1046public:
1047 void addComment(const RawComment &RC);
1048
1049 /// Return the documentation comment attached to a given declaration.
1050 /// Returns nullptr if no comment is attached.
1051 ///
1052 /// \param OriginalDecl if not nullptr, is set to declaration AST node that
1053 /// had the comment, if the comment we found comes from a redeclaration.
1054 const RawComment *
1056 const Decl **OriginalDecl = nullptr) const;
1057
1058 /// Searches existing comments for doc comments that should be attached to \p
1059 /// Decls. If any doc comment is found, it is parsed.
1060 ///
1061 /// Requirement: All \p Decls are in the same file.
1062 ///
1063 /// If the last comment in the file is already attached we assume
1064 /// there are not comments left to be attached to \p Decls.
1066 const Preprocessor *PP);
1067
1068 /// Return parsed documentation comment attached to a given declaration.
1069 /// Returns nullptr if no comment is attached.
1070 ///
1071 /// \param PP the Preprocessor used with this TU. Could be nullptr if
1072 /// preprocessor is not available.
1074 const Preprocessor *PP) const;
1075
1076 /// Attempts to merge two types that may be OverflowBehaviorTypes.
1077 ///
1078 /// \returns A QualType if the types were handled, std::nullopt otherwise.
1079 /// A null QualType indicates an incompatible merge.
1080 std::optional<QualType>
1081 tryMergeOverflowBehaviorTypes(QualType LHS, QualType RHS, bool OfBlockPointer,
1082 bool Unqualified, bool BlockReturnType,
1083 bool IsConditionalOperator);
1084
1085 /// Return parsed documentation comment attached to a given declaration.
1086 /// Returns nullptr if no comment is attached. Does not look at any
1087 /// redeclarations of the declaration.
1089
1091 const Decl *D) const;
1092
1093private:
1094 mutable comments::CommandTraits CommentCommandTraits;
1095
1096 /// Iterator that visits import declarations.
1097 class import_iterator {
1098 ImportDecl *Import = nullptr;
1099
1100 public:
1101 using value_type = ImportDecl *;
1102 using reference = ImportDecl *;
1103 using pointer = ImportDecl *;
1104 using difference_type = int;
1105 using iterator_category = std::forward_iterator_tag;
1106
1107 import_iterator() = default;
1108 explicit import_iterator(ImportDecl *Import) : Import(Import) {}
1109
1110 reference operator*() const { return Import; }
1111 pointer operator->() const { return Import; }
1112
1113 import_iterator &operator++() {
1114 Import = ASTContext::getNextLocalImport(Import);
1115 return *this;
1116 }
1117
1118 import_iterator operator++(int) {
1119 import_iterator Other(*this);
1120 ++(*this);
1121 return Other;
1122 }
1123
1124 friend bool operator==(import_iterator X, import_iterator Y) {
1125 return X.Import == Y.Import;
1126 }
1127
1128 friend bool operator!=(import_iterator X, import_iterator Y) {
1129 return X.Import != Y.Import;
1130 }
1131 };
1132
1133public:
1135 return CommentCommandTraits;
1136 }
1137
1138 /// Retrieve the attributes for the given declaration.
1139 AttrVec& getDeclAttrs(const Decl *D);
1140
1141 /// Erase the attributes corresponding to the given declaration.
1142 void eraseDeclAttrs(const Decl *D);
1143
1144 /// Get all ExplicitInstantiationDecls for a given specialization.
1146 getExplicitInstantiationDecls(const NamedDecl *Spec) const;
1147
1148 /// Add an ExplicitInstantiationDecl for a given specialization.
1149 void addExplicitInstantiationDecl(const NamedDecl *Spec,
1151
1152 /// If this variable is an instantiated static data member of a
1153 /// class template specialization, returns the templated static data member
1154 /// from which it was instantiated.
1155 // FIXME: Remove ?
1157 const VarDecl *Var);
1158
1159 /// Note that the static data member \p Inst is an instantiation of
1160 /// the static data member template \p Tmpl of a class template.
1163 SourceLocation PointOfInstantiation = SourceLocation());
1164
1167
1170
1171 /// If the given using decl \p Inst is an instantiation of
1172 /// another (possibly unresolved) using decl, return it.
1174
1175 /// Remember that the using decl \p Inst is an instantiation
1176 /// of the using decl \p Pattern of a class template.
1177 void setInstantiatedFromUsingDecl(NamedDecl *Inst, NamedDecl *Pattern);
1178
1179 /// If the given using-enum decl \p Inst is an instantiation of
1180 /// another using-enum decl, return it.
1182
1183 /// Remember that the using enum decl \p Inst is an instantiation
1184 /// of the using enum decl \p Pattern of a class template.
1186 UsingEnumDecl *Pattern);
1187
1190 UsingShadowDecl *Pattern);
1191
1193
1195
1196 // Access to the set of methods overridden by the given C++ method.
1197 using overridden_cxx_method_iterator = CXXMethodVector::const_iterator;
1200
1203
1204 unsigned overridden_methods_size(const CXXMethodDecl *Method) const;
1205
1207 llvm::iterator_range<overridden_cxx_method_iterator>;
1208
1210
1211 /// Note that the given C++ \p Method overrides the given \p
1212 /// Overridden method.
1214 const CXXMethodDecl *Overridden);
1215
1216 /// Return C++ or ObjC overridden methods for the given \p Method.
1217 ///
1218 /// An ObjC method is considered to override any method in the class's
1219 /// base classes, its protocols, or its categories' protocols, that has
1220 /// the same selector and is of the same kind (class or instance).
1221 /// A method in an implementation is not considered as overriding the same
1222 /// method in the interface or its categories.
1224 const NamedDecl *Method,
1225 SmallVectorImpl<const NamedDecl *> &Overridden) const;
1226
1227 /// Notify the AST context that a new import declaration has been
1228 /// parsed or implicitly created within this translation unit.
1229 void addedLocalImportDecl(ImportDecl *Import);
1230
1232 return Import->getNextLocalImport();
1233 }
1234
1235 using import_range = llvm::iterator_range<import_iterator>;
1236
1238 return import_range(import_iterator(FirstLocalImport), import_iterator());
1239 }
1240
1242 Decl *Result = MergedDecls.lookup(D);
1243 return Result ? Result : D;
1244 }
1245 void setPrimaryMergedDecl(Decl *D, Decl *Primary) {
1246 MergedDecls[D] = Primary;
1247 }
1248
1249 /// Note that the definition \p ND has been merged into module \p M,
1250 /// and should be visible whenever \p M is visible.
1252 bool NotifyListeners = true);
1253
1254 /// Clean up the merged definition list. Call this if you might have
1255 /// added duplicates into the list.
1257
1258 /// Get the additional modules in which the definition \p Def has
1259 /// been merged.
1261
1262 /// Add a declaration to the list of declarations that are initialized
1263 /// for a module. This will typically be a global variable (with internal
1264 /// linkage) that runs module initializers, such as the iostream initializer,
1265 /// or an ImportDecl nominating another module that has initializers.
1267
1269
1270 /// Get the initializations to perform when importing a module, if any.
1272
1273 /// Set the (C++20) module we are building.
1275
1276 /// Get module under construction, nullptr if this is not a C++20 module.
1277 Module *getCurrentNamedModule() const { return CurrentCXXNamedModule; }
1278
1279 /// If the two module \p M1 and \p M2 are in the same module.
1280 ///
1281 /// FIXME: The signature may be confusing since `clang::Module` means to
1282 /// a module fragment or a module unit but not a C++20 module.
1283 bool isInSameModule(const Module *M1, const Module *M2) const;
1284
1286 assert(TUDecl && "TUDecl might have been reset by 'cleanup' likely because "
1287 "'CodeGenOpts.ClearASTBeforeBackend' was set.");
1288 assert(TUDecl->getMostRecentDecl() == TUDecl &&
1289 "The active TU is not current one!");
1290 return TUDecl->getMostRecentDecl();
1291 }
1293 assert(!TUDecl || TUKind == TU_Incremental);
1295 if (TraversalScope.empty() || TraversalScope.back() == TUDecl)
1296 TraversalScope = {NewTUDecl};
1297 if (TUDecl)
1298 NewTUDecl->setPreviousDecl(TUDecl);
1299 TUDecl = NewTUDecl;
1300 }
1301
1303
1304#define BuiltinTemplate(BTName) BuiltinTemplateDecl *get##BTName##Decl() const;
1305#include "clang/Basic/BuiltinTemplates.inc"
1306
1307 // Builtin Types.
1311 CanQualType WCharTy; // [C++ 3.9.1p5].
1312 CanQualType WideCharTy; // Same as WCharTy in C++, integer type in C99.
1313 CanQualType WIntTy; // [C99 7.24.1], integer type unchanged by default promotions.
1314 CanQualType Char8Ty; // [C++20 proposal]
1315 CanQualType Char16Ty; // [C++0x 3.9.1p5], integer type in C99.
1316 CanQualType Char32Ty; // [C++0x 3.9.1p5], integer type in C99.
1322 LongAccumTy; // ISO/IEC JTC1 SC22 WG14 N1169 Extension
1332 CanQualType HalfTy; // [OpenCL 6.1.1.1], ARM NEON
1334 CanQualType Float16Ty; // C11 extension ISO/IEC TS 18661-3
1342#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
1343 CanQualType SingletonId;
1344#include "clang/Basic/OpenCLImageTypes.def"
1350#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
1351 CanQualType Id##Ty;
1352#include "clang/Basic/OpenCLExtensionTypes.def"
1353#define SVE_TYPE(Name, Id, SingletonId) \
1354 CanQualType SingletonId;
1355#include "clang/Basic/AArch64ACLETypes.def"
1356#define PPC_VECTOR_TYPE(Name, Id, Size) \
1357 CanQualType Id##Ty;
1358#include "clang/Basic/PPCTypes.def"
1359#define RVV_TYPE(Name, Id, SingletonId) \
1360 CanQualType SingletonId;
1361#include "clang/Basic/RISCVVTypes.def"
1362#define WASM_TYPE(Name, Id, SingletonId) CanQualType SingletonId;
1363#include "clang/Basic/WebAssemblyReferenceTypes.def"
1364#define AMDGPU_TYPE(Name, Id, SingletonId, Width, Align) \
1365 CanQualType SingletonId;
1366#include "clang/Basic/AMDGPUTypes.def"
1367#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) CanQualType SingletonId;
1368#include "clang/Basic/HLSLIntangibleTypes.def"
1369
1370 // Types for deductions in C++0x [stmt.ranged]'s desugaring. Built on demand.
1371 mutable QualType AutoDeductTy; // Deduction against 'auto'.
1372 mutable QualType AutoRRefDeductTy; // Deduction against 'auto &&'.
1373
1374 // Decl used to help define __builtin_va_list for some targets.
1375 // The decl is built when constructing 'BuiltinVaListDecl'.
1376 mutable Decl *VaListTagDecl = nullptr;
1377
1378 // Implicitly-declared type 'struct _GUID'.
1379 mutable TagDecl *MSGuidTagDecl = nullptr;
1380
1381 // Implicitly-declared type 'struct type_info'.
1382 mutable TagDecl *MSTypeInfoTagDecl = nullptr;
1383
1384 /// Keep track of CUDA/HIP device-side variables ODR-used by host code.
1385 /// This does not include extern shared variables used by device host
1386 /// functions as addresses of shared variables are per warp, therefore
1387 /// cannot be accessed by host code.
1388 llvm::SetVector<const VarDecl *> CUDADeviceVarODRUsedByHost;
1389
1390 /// Keep track of CUDA/HIP external kernels or device variables ODR-used by
1391 /// host code. SetVector is used to maintain the order.
1392 llvm::SetVector<const ValueDecl *> CUDAExternalDeviceDeclODRUsedByHost;
1393
1394 /// Keep track of CUDA/HIP implicit host device functions used on device side
1395 /// in device compilation.
1396 llvm::DenseSet<const FunctionDecl *> CUDAImplicitHostDeviceFunUsedByDevice;
1397
1398 /// Map of SYCL kernels indexed by the unique type used to name the kernel.
1399 /// Entries are not serialized but are recreated on deserialization of a
1400 /// sycl_kernel_entry_point attributed function declaration.
1401 llvm::DenseMap<CanQualType, SYCLKernelInfo> SYCLKernels;
1402
1403 /// For capturing lambdas with an explicit object parameter whose type is
1404 /// derived from the lambda type, we need to perform derived-to-base
1405 /// conversion so we can access the captures; the cast paths for that
1406 /// are stored here.
1407 llvm::DenseMap<const CXXMethodDecl *, CXXCastPath> LambdaCastPaths;
1408
1410 SelectorTable &sels, Builtin::Context &builtins,
1412 ASTContext(const ASTContext &) = delete;
1413 ASTContext &operator=(const ASTContext &) = delete;
1414 ~ASTContext();
1415
1416 /// Attach an external AST source to the AST context.
1417 ///
1418 /// The external AST source provides the ability to load parts of
1419 /// the abstract syntax tree as needed from some external storage,
1420 /// e.g., a precompiled header.
1422
1423 /// Retrieve a pointer to the external AST source associated
1424 /// with this AST context, if any.
1426 return ExternalSource.get();
1427 }
1428
1429 /// Retrieve a pointer to the external AST source associated
1430 /// with this AST context, if any. Returns as an IntrusiveRefCntPtr.
1434
1435 /// Attach an AST mutation listener to the AST context.
1436 ///
1437 /// The AST mutation listener provides the ability to track modifications to
1438 /// the abstract syntax tree entities committed after they were initially
1439 /// created.
1441 this->Listener = Listener;
1442 }
1443
1444 /// Retrieve a pointer to the AST mutation listener associated
1445 /// with this AST context, if any.
1447
1448 void PrintStats() const;
1449 const SmallVectorImpl<Type *>& getTypes() const { return Types; }
1450
1452 const IdentifierInfo *II) const;
1453
1454 /// Create a new implicit TU-level CXXRecordDecl or RecordDecl
1455 /// declaration.
1457 StringRef Name,
1458 RecordDecl::TagKind TK = RecordDecl::TagKind::Struct) const;
1459
1460 /// Create a new implicit TU-level typedef declaration.
1461 TypedefDecl *buildImplicitTypedef(QualType T, StringRef Name) const;
1462
1463 /// Retrieve the declaration for the 128-bit signed integer type.
1464 TypedefDecl *getInt128Decl() const;
1465
1466 /// Retrieve the declaration for the 128-bit unsigned integer type.
1467 TypedefDecl *getUInt128Decl() const;
1468
1469 //===--------------------------------------------------------------------===//
1470 // Type Constructors
1471 //===--------------------------------------------------------------------===//
1472
1473private:
1474 /// Return a type with extended qualifiers.
1475 QualType getExtQualType(const Type *Base, Qualifiers Quals) const;
1476
1477 QualType getPipeType(QualType T, bool ReadOnly) const;
1478
1479public:
1480 /// Return the uniqued reference to the type for an address space
1481 /// qualified type with the specified type and address space.
1482 ///
1483 /// The resulting type has a union of the qualifiers from T and the address
1484 /// space. If T already has an address space specifier, it is silently
1485 /// replaced.
1486 QualType getAddrSpaceQualType(QualType T, LangAS AddressSpace) const;
1487
1488 /// Remove any existing address space on the type and returns the type
1489 /// with qualifiers intact (or that's the idea anyway)
1490 ///
1491 /// The return type should be T with all prior qualifiers minus the address
1492 /// space.
1494
1495 /// Return the "other" discriminator used for the pointer auth schema used for
1496 /// vtable pointers in instances of the requested type.
1497 uint16_t
1499
1500 /// Return the "other" type-specific discriminator for the given type.
1502
1503 /// Apply Objective-C protocol qualifiers to the given type.
1504 /// \param allowOnPointerType specifies if we can apply protocol
1505 /// qualifiers on ObjCObjectPointerType. It can be set to true when
1506 /// constructing the canonical type of a Objective-C type parameter.
1508 ArrayRef<ObjCProtocolDecl *> protocols, bool &hasError,
1509 bool allowOnPointerType = false) const;
1510
1511 /// Return the uniqued reference to the type for an Objective-C
1512 /// gc-qualified type.
1513 ///
1514 /// The resulting type has a union of the qualifiers from T and the gc
1515 /// attribute.
1517
1518 /// Remove the existing address space on the type if it is a pointer size
1519 /// address space and return the type with qualifiers intact.
1521
1522 /// Return the uniqued reference to the type for a \c restrict
1523 /// qualified type.
1524 ///
1525 /// The resulting type has a union of the qualifiers from \p T and
1526 /// \c restrict.
1530
1531 /// Return the uniqued reference to the type for a \c volatile
1532 /// qualified type.
1533 ///
1534 /// The resulting type has a union of the qualifiers from \p T and
1535 /// \c volatile.
1539
1540 /// Return the uniqued reference to the type for a \c const
1541 /// qualified type.
1542 ///
1543 /// The resulting type has a union of the qualifiers from \p T and \c const.
1544 ///
1545 /// It can be reasonably expected that this will always be equivalent to
1546 /// calling T.withConst().
1547 QualType getConstType(QualType T) const { return T.withConst(); }
1548
1549 /// Rebuild a type, preserving any existing type sugar. For function types,
1550 /// you probably want to just use \c adjustFunctionResultType and friends
1551 /// instead.
1553 llvm::function_ref<QualType(QualType)> Adjust) const;
1554
1555 /// Change the ExtInfo on a function type.
1557 FunctionType::ExtInfo EInfo);
1558
1559 /// Change the result type of a function type, preserving sugar such as
1560 /// attributed types.
1562 QualType NewResultType);
1563
1564 /// Adjust the given function result type.
1566
1567 /// Change the result type of a function type once it is deduced.
1569
1570 /// Get a function type and produce the equivalent function type with the
1571 /// specified exception specification. Type sugar that can be present on a
1572 /// declaration of a function with an exception specification is permitted
1573 /// and preserved. Other type sugar (for instance, typedefs) is not.
1575 QualType Orig, const FunctionProtoType::ExceptionSpecInfo &ESI) const;
1576
1577 /// Determine whether two function types are the same, ignoring
1578 /// exception specifications in cases where they're part of the type.
1580
1581 /// Change the exception specification on a function once it is
1582 /// delay-parsed, instantiated, or computed.
1585 bool AsWritten = false);
1586
1587 /// Get a function type and produce the equivalent function type where
1588 /// pointer size address spaces in the return type and parameter types are
1589 /// replaced with the default address space.
1591
1592 /// Determine whether two function types are the same, ignoring pointer sizes
1593 /// in the return type and parameter types.
1595
1596 /// Get or construct a function type that is equivalent to the input type
1597 /// except that the parameter ABI annotations are stripped.
1599
1600 /// Determine if two function types are the same, ignoring parameter ABI
1601 /// annotations.
1603
1604 /// Return the uniqued reference to the type for a complex
1605 /// number with the specified element type.
1610
1611 /// Return the uniqued reference to the type for a pointer to
1612 /// the specified type.
1617
1618 QualType
1619 getCountAttributedType(QualType T, Expr *CountExpr, bool CountInBytes,
1620 bool OrNull,
1621 ArrayRef<TypeCoupledDeclRefInfo> DependentDecls) const;
1622
1623 /// Return the uniqued reference to a type adjusted from the original
1624 /// type to a new type.
1630
1631 /// Return the uniqued reference to the decayed version of the given
1632 /// type. Can only be called on array and function types which decay to
1633 /// pointer types.
1638 /// Return the uniqued reference to a specified decay from the original
1639 /// type to the decayed type.
1640 QualType getDecayedType(QualType Orig, QualType Decayed) const;
1641
1642 /// Return the uniqued reference to a specified array parameter type from the
1643 /// original array type.
1645
1646 /// Return the uniqued reference to the atomic type for the specified
1647 /// type.
1649
1650 /// Return the uniqued reference to the type for a block of the
1651 /// specified type.
1653
1654 /// Gets the struct used to keep track of the descriptor for pointer to
1655 /// blocks.
1657
1658 /// Return a read_only pipe type for the specified type.
1660
1661 /// Return a write_only pipe type for the specified type.
1663
1664 /// Return a bit-precise integer type with the specified signedness and bit
1665 /// count.
1666 QualType getBitIntType(bool Unsigned, unsigned NumBits) const;
1667
1668 /// Return a dependent bit-precise integer type with the specified signedness
1669 /// and bit count.
1670 QualType getDependentBitIntType(bool Unsigned, Expr *BitsExpr) const;
1671
1673
1674 /// Gets the struct used to keep track of the extended descriptor for
1675 /// pointer to blocks.
1677
1678 /// Map an AST Type to an OpenCLTypeKind enum value.
1679 OpenCLTypeKind getOpenCLTypeKind(const Type *T) const;
1680
1681 /// Get address space for OpenCL type.
1682 LangAS getOpenCLTypeAddrSpace(const Type *T) const;
1683
1684 /// Returns default address space based on OpenCL version and enabled features
1686 return LangOpts.OpenCLGenericAddressSpace ? LangAS::opencl_generic
1688 }
1689
1691 cudaConfigureCallDecl = FD;
1692 }
1693
1695 return cudaConfigureCallDecl;
1696 }
1697
1699 cudaGetParameterBufferDecl = FD;
1700 }
1701
1703 return cudaGetParameterBufferDecl;
1704 }
1705
1706 void setcudaLaunchDeviceDecl(FunctionDecl *FD) { cudaLaunchDeviceDecl = FD; }
1707
1708 FunctionDecl *getcudaLaunchDeviceDecl() { return cudaLaunchDeviceDecl; }
1709
1710 /// Returns true iff we need copy/dispose helpers for the given type.
1711 bool BlockRequiresCopying(QualType Ty, const VarDecl *D);
1712
1713 /// Returns true, if given type has a known lifetime. HasByrefExtendedLayout
1714 /// is set to false in this case. If HasByrefExtendedLayout returns true,
1715 /// byref variable has extended lifetime.
1716 bool getByrefLifetime(QualType Ty,
1717 Qualifiers::ObjCLifetime &Lifetime,
1718 bool &HasByrefExtendedLayout) const;
1719
1720 /// Return the uniqued reference to the type for an lvalue reference
1721 /// to the specified type.
1722 QualType getLValueReferenceType(QualType T, bool SpelledAsLValue = true)
1723 const;
1724
1725 /// Return the uniqued reference to the type for an rvalue reference
1726 /// to the specified type.
1728
1729 /// Return the uniqued reference to the type for a member pointer to
1730 /// the specified type in the specified nested name.
1732 const CXXRecordDecl *Cls) const;
1733
1734 /// Return a non-unique reference to the type for a variable array of
1735 /// the specified element type.
1738 unsigned IndexTypeQuals) const;
1739
1740 /// Return a non-unique reference to the type for a dependently-sized
1741 /// array of the specified element type.
1742 ///
1743 /// FIXME: We will need these to be uniqued, or at least comparable, at some
1744 /// point.
1747 unsigned IndexTypeQuals) const;
1748
1749 /// Return a unique reference to the type for an incomplete array of
1750 /// the specified element type.
1752 unsigned IndexTypeQuals) const;
1753
1754 /// Return the unique reference to the type for a constant array of
1755 /// the specified element type.
1756 QualType getConstantArrayType(QualType EltTy, const llvm::APInt &ArySize,
1757 const Expr *SizeExpr, ArraySizeModifier ASM,
1758 unsigned IndexTypeQuals) const;
1759
1760 /// Return a type for a constant array for a string literal of the
1761 /// specified element type and length.
1762 QualType getStringLiteralArrayType(QualType EltTy, unsigned Length) const;
1763
1764 /// Returns a vla type where known sizes are replaced with [*].
1766
1767 // Convenience struct to return information about a builtin vector type.
1776
1777 /// Returns the element type, element count and number of vectors
1778 /// (in case of tuple) for a builtin vector type.
1779 BuiltinVectorTypeInfo
1780 getBuiltinVectorTypeInfo(const BuiltinType *VecTy) const;
1781
1782 /// Return the unique reference to a scalable vector type of the specified
1783 /// element type and scalable number of elements.
1784 /// For RISC-V, number of fields is also provided when it fetching for
1785 /// tuple type.
1786 ///
1787 /// \pre \p EltTy must be a built-in type.
1788 QualType getScalableVectorType(QualType EltTy, unsigned NumElts,
1789 unsigned NumFields = 1) const;
1790
1791 /// Return a WebAssembly externref type.
1793
1794 /// Return the unique reference to a vector type of the specified
1795 /// element type and size.
1796 ///
1797 /// \pre \p VectorType must be a built-in type.
1798 QualType getVectorType(QualType VectorType, unsigned NumElts,
1799 VectorKind VecKind) const;
1800 /// Return the unique reference to the type for a dependently sized vector of
1801 /// the specified element type.
1803 SourceLocation AttrLoc,
1804 VectorKind VecKind) const;
1805
1806 /// Return the unique reference to an extended vector type
1807 /// of the specified element type and size.
1808 ///
1809 /// \pre \p VectorType must be a built-in type.
1810 QualType getExtVectorType(QualType VectorType, unsigned NumElts) const;
1811
1812 /// \pre Return a non-unique reference to the type for a dependently-sized
1813 /// vector of the specified element type.
1814 ///
1815 /// FIXME: We will need these to be uniqued, or at least comparable, at some
1816 /// point.
1818 Expr *SizeExpr,
1819 SourceLocation AttrLoc) const;
1820
1821 /// Return the unique reference to the matrix type of the specified element
1822 /// type and size
1823 ///
1824 /// \pre \p ElementType must be a valid matrix element type (see
1825 /// MatrixType::isValidElementType).
1826 QualType getConstantMatrixType(QualType ElementType, unsigned NumRows,
1827 unsigned NumColumns) const;
1828
1829 /// Return the unique reference to the matrix type of the specified element
1830 /// type and size
1831 QualType getDependentSizedMatrixType(QualType ElementType, Expr *RowExpr,
1832 Expr *ColumnExpr,
1833 SourceLocation AttrLoc) const;
1834
1836 Expr *AddrSpaceExpr,
1837 SourceLocation AttrLoc) const;
1838
1839 /// Return a K&R style C function type like 'int()'.
1841 const FunctionType::ExtInfo &Info) const;
1842
1846
1847 /// Return a normal function type with a typed argument list.
1849 const FunctionProtoType::ExtProtoInfo &EPI) const {
1850 return getFunctionTypeInternal(ResultTy, Args, EPI, false);
1851 }
1852
1854
1855private:
1856 /// Return a normal function type with a typed argument list.
1857 QualType getFunctionTypeInternal(QualType ResultTy, ArrayRef<QualType> Args,
1859 bool OnlyWantCanonical) const;
1860
1861public:
1863 NestedNameSpecifier Qualifier,
1864 const TypeDecl *Decl) const;
1865
1866 /// Return the unique reference to the type for the specified type
1867 /// declaration.
1868 QualType getTypeDeclType(const TypeDecl *Decl) const;
1869
1870 /// Use the normal 'getFooBarType' constructors to obtain these types.
1871 QualType getTypeDeclType(const TagDecl *) const = delete;
1872 QualType getTypeDeclType(const TypedefDecl *) const = delete;
1873 QualType getTypeDeclType(const TypeAliasDecl *) const = delete;
1875
1877
1879 NestedNameSpecifier Qualifier, const UsingShadowDecl *D,
1880 QualType UnderlyingType = QualType()) const;
1881
1882 /// Return the unique reference to the type for the specified
1883 /// typedef-name decl.
1884 /// FIXME: TypeMatchesDeclOrNone is a workaround for a serialization issue:
1885 /// The decl underlying type might still not be available.
1888 const TypedefNameDecl *Decl, QualType UnderlyingType = QualType(),
1889 std::optional<bool> TypeMatchesDeclOrNone = std::nullopt) const;
1890
1891 CanQualType getCanonicalTagType(const TagDecl *TD) const;
1893 NestedNameSpecifier Qualifier, const TagDecl *TD,
1894 bool OwnsTag) const;
1895
1896private:
1897 UnresolvedUsingType *getUnresolvedUsingTypeInternal(
1899 const UnresolvedUsingTypenameDecl *D, void *InsertPos,
1900 const Type *CanonicalType) const;
1901
1902 TagType *getTagTypeInternal(ElaboratedTypeKeyword Keyword,
1903 NestedNameSpecifier Qualifier, const TagDecl *Tag,
1904 bool OwnsTag, bool IsInjected,
1905 const Type *CanonicalType,
1906 bool WithFoldingSetNode) const;
1907
1908public:
1909 /// Compute BestType and BestPromotionType for an enum based on the highest
1910 /// number of negative and positive bits of its elements.
1911 /// Returns true if enum width is too large.
1912 bool computeBestEnumTypes(bool IsPacked, unsigned NumNegativeBits,
1913 unsigned NumPositiveBits, QualType &BestType,
1914 QualType &BestPromotionType);
1915
1916 /// Determine whether the given integral value is representable within
1917 /// the given type T.
1918 bool isRepresentableIntegerValue(llvm::APSInt &Value, QualType T);
1919
1920 /// Compute NumNegativeBits and NumPositiveBits for an enum based on
1921 /// the constant values of its enumerators.
1922 template <typename RangeT>
1923 bool computeEnumBits(RangeT EnumConstants, unsigned &NumNegativeBits,
1924 unsigned &NumPositiveBits) {
1925 NumNegativeBits = 0;
1926 NumPositiveBits = 0;
1927 bool MembersRepresentableByInt = true;
1928 for (auto *Elem : EnumConstants) {
1929 EnumConstantDecl *ECD = cast_or_null<EnumConstantDecl>(Elem);
1930 if (!ECD)
1931 continue; // Already issued a diagnostic.
1932
1933 llvm::APSInt InitVal = ECD->getInitVal();
1934 if (InitVal.isUnsigned() || InitVal.isNonNegative()) {
1935 // If the enumerator is zero that should still be counted as a positive
1936 // bit since we need a bit to store the value zero.
1937 unsigned ActiveBits = InitVal.getActiveBits();
1938 NumPositiveBits = std::max({NumPositiveBits, ActiveBits, 1u});
1939 } else {
1940 NumNegativeBits =
1941 std::max(NumNegativeBits, InitVal.getSignificantBits());
1942 }
1943
1944 MembersRepresentableByInt &= isRepresentableIntegerValue(InitVal, IntTy);
1945 }
1946
1947 // If we have an empty set of enumerators we still need one bit.
1948 // From [dcl.enum]p8
1949 // If the enumerator-list is empty, the values of the enumeration are as if
1950 // the enumeration had a single enumerator with value 0
1951 if (!NumPositiveBits && !NumNegativeBits)
1952 NumPositiveBits = 1;
1953
1954 return MembersRepresentableByInt;
1955 }
1956
1960 NestedNameSpecifier Qualifier,
1961 const UnresolvedUsingTypenameDecl *D) const;
1962
1963 QualType getAttributedType(attr::Kind attrKind, QualType modifiedType,
1964 QualType equivalentType,
1965 const Attr *attr = nullptr) const;
1966
1967 QualType getAttributedType(const Attr *attr, QualType modifiedType,
1968 QualType equivalentType) const;
1969
1970 QualType getAttributedType(NullabilityKind nullability, QualType modifiedType,
1971 QualType equivalentType);
1972
1973 QualType getBTFTagAttributedType(const BTFTypeTagAttr *BTFAttr,
1974 QualType Wrapped) const;
1975
1976 QualType getOverflowBehaviorType(const OverflowBehaviorAttr *Attr,
1977 QualType Wrapped) const;
1978
1979 QualType
1980 getOverflowBehaviorType(OverflowBehaviorType::OverflowBehaviorKind Kind,
1981 QualType Wrapped) const;
1982
1984 QualType Wrapped, QualType Contained,
1985 const HLSLAttributedResourceType::Attributes &Attrs);
1986
1987 QualType getHLSLInlineSpirvType(uint32_t Opcode, uint32_t Size,
1988 uint32_t Alignment,
1989 ArrayRef<SpirvOperand> Operands);
1990
1992 Decl *AssociatedDecl, unsigned Index,
1993 UnsignedOrNone PackIndex,
1994 bool Final) const;
1996 unsigned Index, bool Final,
1997 const TemplateArgument &ArgPack);
1999
2000 QualType
2001 getTemplateTypeParmType(unsigned Depth, unsigned Index,
2002 bool ParameterPack,
2003 TemplateTypeParmDecl *ParmDecl = nullptr) const;
2004
2007 ArrayRef<TemplateArgument> CanonicalArgs) const;
2008
2009 QualType
2011 ArrayRef<TemplateArgument> SpecifiedArgs,
2012 ArrayRef<TemplateArgument> CanonicalArgs,
2013 QualType Underlying = QualType()) const;
2014
2015 QualType
2017 ArrayRef<TemplateArgumentLoc> SpecifiedArgs,
2018 ArrayRef<TemplateArgument> CanonicalArgs,
2019 QualType Canon = QualType()) const;
2020
2022 ElaboratedTypeKeyword Keyword, SourceLocation ElaboratedKeywordLoc,
2023 NestedNameSpecifierLoc QualifierLoc, SourceLocation TemplateKeywordLoc,
2025 const TemplateArgumentListInfo &SpecifiedArgs,
2026 ArrayRef<TemplateArgument> CanonicalArgs,
2027 QualType Canon = QualType()) const;
2028
2029 QualType getParenType(QualType NamedType) const;
2030
2032 const IdentifierInfo *MacroII) const;
2033
2036 const IdentifierInfo *Name) const;
2037
2039
2040 /// Form a pack expansion type with the given pattern.
2041 /// \param NumExpansions The number of expansions for the pack, if known.
2042 /// \param ExpectPackInType If \c false, we should not expect \p Pattern to
2043 /// contain an unexpanded pack. This only makes sense if the pack
2044 /// expansion is used in a context where the arity is inferred from
2045 /// elsewhere, such as if the pattern contains a placeholder type or
2046 /// if this is the canonical type of another pack expansion type.
2048 bool ExpectPackInType = true) const;
2049
2051 ObjCInterfaceDecl *PrevDecl = nullptr) const;
2052
2053 /// Legacy interface: cannot provide type arguments or __kindof.
2055 ObjCProtocolDecl * const *Protocols,
2056 unsigned NumProtocols) const;
2057
2059 ArrayRef<QualType> typeArgs,
2061 bool isKindOf) const;
2062
2064 ArrayRef<ObjCProtocolDecl *> protocols) const;
2066 ObjCTypeParamDecl *New) const;
2067
2069
2070 /// QIdProtocolsAdoptObjCObjectProtocols - Checks that protocols in
2071 /// QT's qualified-id protocol list adopt all protocols in IDecl's list
2072 /// of protocols.
2074 ObjCInterfaceDecl *IDecl);
2075
2076 /// Return a ObjCObjectPointerType type for the given ObjCObjectType.
2078
2079 /// C23 feature and GCC extension.
2080 QualType getTypeOfExprType(Expr *E, TypeOfKind Kind) const;
2081 QualType getTypeOfType(QualType QT, TypeOfKind Kind) const;
2082
2083 QualType getReferenceQualifiedType(const Expr *e) const;
2084
2085 /// C++11 decltype.
2086 QualType getDecltypeType(Expr *e, QualType UnderlyingType) const;
2087
2088 QualType getPackIndexingType(QualType Pattern, Expr *IndexExpr,
2089 bool FullySubstituted = false,
2090 ArrayRef<QualType> Expansions = {},
2091 UnsignedOrNone Index = std::nullopt) const;
2092
2093 /// Unary type transforms
2094 QualType getUnaryTransformType(QualType BaseType, QualType UnderlyingType,
2095 UnaryTransformType::UTTKind UKind) const;
2096
2097 /// C++11 deduced auto type.
2098 QualType
2099 getAutoType(DeducedKind DK, QualType DeducedAsType, AutoTypeKeyword Keyword,
2100 TemplateDecl *TypeConstraintConcept = nullptr,
2101 ArrayRef<TemplateArgument> TypeConstraintArgs = {}) const;
2102
2103 /// C++11 deduction pattern for 'auto' type.
2104 QualType getAutoDeductType() const;
2105
2106 /// C++11 deduction pattern for 'auto &&' type.
2107 QualType getAutoRRefDeductType() const;
2108
2109 /// Remove any type constraints from a template parameter type, for
2110 /// equivalence comparison of template parameters.
2111 QualType getUnconstrainedType(QualType T) const;
2112
2113 /// C++17 deduced class template specialization type.
2115 QualType DeducedAsType,
2117 TemplateName Template) const;
2118
2119 /// Return the unique type for "size_t" (C99 7.17), defined in
2120 /// <stddef.h>.
2121 ///
2122 /// The sizeof operator requires this (C99 6.5.3.4p4).
2123 QualType getSizeType() const;
2124
2126
2127 /// Return the unique signed counterpart of
2128 /// the integer type corresponding to size_t.
2129 QualType getSignedSizeType() const;
2130
2131 /// Return the unique type for "intmax_t" (C99 7.18.1.5), defined in
2132 /// <stdint.h>.
2133 CanQualType getIntMaxType() const;
2134
2135 /// Return the unique type for "uintmax_t" (C99 7.18.1.5), defined in
2136 /// <stdint.h>.
2138
2139 /// Return the unique wchar_t type available in C++ (and available as
2140 /// __wchar_t as a Microsoft extension).
2141 QualType getWCharType() const { return WCharTy; }
2142
2143 /// Return the type of wide characters. In C++, this returns the
2144 /// unique wchar_t type. In C99, this returns a type compatible with the type
2145 /// defined in <stddef.h> as defined by the target.
2147
2148 /// Return the type of "signed wchar_t".
2149 ///
2150 /// Used when in C++, as a GCC extension.
2152
2153 /// Return the type of "unsigned wchar_t".
2154 ///
2155 /// Used when in C++, as a GCC extension.
2157
2158 /// In C99, this returns a type compatible with the type
2159 /// defined in <stddef.h> as defined by the target.
2160 QualType getWIntType() const { return WIntTy; }
2161
2162 /// Return a type compatible with "intptr_t" (C99 7.18.1.4),
2163 /// as defined by the target.
2164 QualType getIntPtrType() const;
2165
2166 /// Return a type compatible with "uintptr_t" (C99 7.18.1.4),
2167 /// as defined by the target.
2168 QualType getUIntPtrType() const;
2169
2170 /// Return the unique type for "ptrdiff_t" (C99 7.17) defined in
2171 /// <stddef.h>. Pointer - pointer requires this (C99 6.5.6p9).
2173
2174 /// Return the unique unsigned counterpart of "ptrdiff_t"
2175 /// integer type. The standard (C11 7.21.6.1p7) refers to this type
2176 /// in the definition of %tu format specifier.
2178
2179 /// Return the unique type for "pid_t" defined in
2180 /// <sys/types.h>. We need this to compute the correct type for vfork().
2181 QualType getProcessIDType() const;
2182
2183 /// Return the C structure type used to represent constant CFStrings.
2185
2186 /// Returns the C struct type for objc_super
2187 QualType getObjCSuperType() const;
2188 void setObjCSuperType(QualType ST) { ObjCSuperType = ST; }
2189
2190 /// Get the structure type used to representation CFStrings, or NULL
2191 /// if it hasn't yet been built.
2193 if (CFConstantStringTypeDecl)
2195 /*Qualifier=*/std::nullopt,
2196 CFConstantStringTypeDecl);
2197 return QualType();
2198 }
2202
2203 // This setter/getter represents the ObjC type for an NSConstantString.
2206 return ObjCConstantStringType;
2207 }
2208
2210 return ObjCNSStringType;
2211 }
2212
2214 ObjCNSStringType = T;
2215 }
2216
2217 /// Retrieve the type that \c id has been defined to, which may be
2218 /// different from the built-in \c id if \c id has been typedef'd.
2220 if (ObjCIdRedefinitionType.isNull())
2221 return getObjCIdType();
2222 return ObjCIdRedefinitionType;
2223 }
2224
2225 /// Set the user-written type that redefines \c id.
2227 ObjCIdRedefinitionType = RedefType;
2228 }
2229
2230 /// Retrieve the type that \c Class has been defined to, which may be
2231 /// different from the built-in \c Class if \c Class has been typedef'd.
2233 if (ObjCClassRedefinitionType.isNull())
2234 return getObjCClassType();
2235 return ObjCClassRedefinitionType;
2236 }
2237
2238 /// Set the user-written type that redefines 'SEL'.
2240 ObjCClassRedefinitionType = RedefType;
2241 }
2242
2243 /// Retrieve the type that 'SEL' has been defined to, which may be
2244 /// different from the built-in 'SEL' if 'SEL' has been typedef'd.
2246 if (ObjCSelRedefinitionType.isNull())
2247 return getObjCSelType();
2248 return ObjCSelRedefinitionType;
2249 }
2250
2251 /// Set the user-written type that redefines 'SEL'.
2253 ObjCSelRedefinitionType = RedefType;
2254 }
2255
2256 /// Retrieve the identifier 'NSObject'.
2258 if (!NSObjectName) {
2259 NSObjectName = &Idents.get("NSObject");
2260 }
2261
2262 return NSObjectName;
2263 }
2264
2265 /// Retrieve the identifier 'NSCopying'.
2267 if (!NSCopyingName) {
2268 NSCopyingName = &Idents.get("NSCopying");
2269 }
2270
2271 return NSCopyingName;
2272 }
2273
2275
2277
2278 /// Retrieve the identifier 'bool'.
2280 if (!BoolName)
2281 BoolName = &Idents.get("bool");
2282 return BoolName;
2283 }
2284
2285#define BuiltinTemplate(BTName) \
2286 IdentifierInfo *get##BTName##Name() const { \
2287 if (!Name##BTName) \
2288 Name##BTName = &Idents.get(#BTName); \
2289 return Name##BTName; \
2290 }
2291#include "clang/Basic/BuiltinTemplates.inc"
2292
2293 /// Retrieve the Objective-C "instancetype" type.
2296 /*Qualifier=*/std::nullopt,
2298 }
2299
2300 /// Retrieve the typedef declaration corresponding to the Objective-C
2301 /// "instancetype" type.
2303
2304 /// Set the type for the C FILE type.
2305 void setFILEDecl(TypeDecl *FILEDecl) { this->FILEDecl = FILEDecl; }
2306
2307 /// Retrieve the C FILE type.
2309 if (FILEDecl)
2311 /*Qualifier=*/std::nullopt, FILEDecl);
2312 return QualType();
2313 }
2314
2315 /// Set the type for the C jmp_buf type.
2316 void setjmp_bufDecl(TypeDecl *jmp_bufDecl) {
2317 this->jmp_bufDecl = jmp_bufDecl;
2318 }
2319
2320 /// Retrieve the C jmp_buf type.
2322 if (jmp_bufDecl)
2324 /*Qualifier=*/std::nullopt, jmp_bufDecl);
2325 return QualType();
2326 }
2327
2328 /// Set the type for the C sigjmp_buf type.
2329 void setsigjmp_bufDecl(TypeDecl *sigjmp_bufDecl) {
2330 this->sigjmp_bufDecl = sigjmp_bufDecl;
2331 }
2332
2333 /// Retrieve the C sigjmp_buf type.
2335 if (sigjmp_bufDecl)
2337 /*Qualifier=*/std::nullopt, sigjmp_bufDecl);
2338 return QualType();
2339 }
2340
2341 /// Set the type for the C ucontext_t type.
2342 void setucontext_tDecl(TypeDecl *ucontext_tDecl) {
2343 this->ucontext_tDecl = ucontext_tDecl;
2344 }
2345
2346 /// Retrieve the C ucontext_t type.
2348 if (ucontext_tDecl)
2350 /*Qualifier=*/std::nullopt, ucontext_tDecl);
2351 return QualType();
2352 }
2353
2354 /// The result type of logical operations, '<', '>', '!=', etc.
2356 return getLangOpts().CPlusPlus ? BoolTy : IntTy;
2357 }
2358
2359 /// Emit the Objective-CC type encoding for the given type \p T into
2360 /// \p S.
2361 ///
2362 /// If \p Field is specified then record field names are also encoded.
2363 void getObjCEncodingForType(QualType T, std::string &S,
2364 const FieldDecl *Field=nullptr,
2365 QualType *NotEncodedT=nullptr) const;
2366
2367 /// Emit the Objective-C property type encoding for the given
2368 /// type \p T into \p S.
2369 void getObjCEncodingForPropertyType(QualType T, std::string &S) const;
2370
2372
2373 /// Put the string version of the type qualifiers \p QT into \p S.
2375 std::string &S) const;
2376
2377 /// Emit the encoded type for the function \p Decl into \p S.
2378 ///
2379 /// This is in the same format as Objective-C method encodings.
2380 ///
2381 /// \returns true if an error occurred (e.g., because one of the parameter
2382 /// types is incomplete), false otherwise.
2383 std::string getObjCEncodingForFunctionDecl(const FunctionDecl *Decl) const;
2384
2385 /// Emit the encoded type for the method declaration \p Decl into
2386 /// \p S.
2388 bool Extended = false) const;
2389
2390 /// Return the encoded type for this block declaration.
2391 std::string getObjCEncodingForBlock(const BlockExpr *blockExpr) const;
2392
2393 /// getObjCEncodingForPropertyDecl - Return the encoded type for
2394 /// this method declaration. If non-NULL, Container must be either
2395 /// an ObjCCategoryImplDecl or ObjCImplementationDecl; it should
2396 /// only be NULL when getting encodings for protocol properties.
2398 const Decl *Container) const;
2399
2401 ObjCProtocolDecl *rProto) const;
2402
2404 const ObjCPropertyDecl *PD,
2405 const Decl *Container) const;
2406
2407 /// Return the size of type \p T for Objective-C encoding purpose,
2408 /// in characters.
2410
2411 /// Retrieve the typedef corresponding to the predefined \c id type
2412 /// in Objective-C.
2413 TypedefDecl *getObjCIdDecl() const;
2414
2415 /// Represents the Objective-CC \c id type.
2416 ///
2417 /// This is set up lazily, by Sema. \c id is always a (typedef for a)
2418 /// pointer type, a pointer to a struct.
2421 /*Qualifier=*/std::nullopt, getObjCIdDecl());
2422 }
2423
2424 /// Retrieve the typedef corresponding to the predefined 'SEL' type
2425 /// in Objective-C.
2426 TypedefDecl *getObjCSelDecl() const;
2427
2428 /// Retrieve the type that corresponds to the predefined Objective-C
2429 /// 'SEL' type.
2432 /*Qualifier=*/std::nullopt, getObjCSelDecl());
2433 }
2434
2436
2437 /// Retrieve the typedef declaration corresponding to the predefined
2438 /// Objective-C 'Class' type.
2440
2441 /// Represents the Objective-C \c Class type.
2442 ///
2443 /// This is set up lazily, by Sema. \c Class is always a (typedef for a)
2444 /// pointer type, a pointer to a struct.
2447 /*Qualifier=*/std::nullopt, getObjCClassDecl());
2448 }
2449
2450 /// Retrieve the Objective-C class declaration corresponding to
2451 /// the predefined \c Protocol class.
2453
2454 /// Retrieve declaration of 'BOOL' typedef
2456 return BOOLDecl;
2457 }
2458
2459 /// Save declaration of 'BOOL' typedef
2461 BOOLDecl = TD;
2462 }
2463
2464 /// type of 'BOOL' type.
2467 /*Qualifier=*/std::nullopt, getBOOLDecl());
2468 }
2469
2470 /// Retrieve the type of the Objective-C \c Protocol class.
2474
2475 /// Retrieve the C type declaration corresponding to the predefined
2476 /// \c __builtin_va_list type.
2478
2479 /// Retrieve the type of the \c __builtin_va_list type.
2482 /*Qualifier=*/std::nullopt, getBuiltinVaListDecl());
2483 }
2484
2485 /// Retrieve the C type declaration corresponding to the predefined
2486 /// \c __va_list_tag type used to help define the \c __builtin_va_list type
2487 /// for some targets.
2488 Decl *getVaListTagDecl() const;
2489
2490 /// Retrieve the C type declaration corresponding to the predefined
2491 /// \c __builtin_ms_va_list type.
2493
2494 /// Retrieve the type of the \c __builtin_ms_va_list type.
2497 /*Qualifier=*/std::nullopt, getBuiltinMSVaListDecl());
2498 }
2499
2500 /// Retrieve the implicitly-predeclared 'struct _GUID' declaration.
2502
2503 /// Retrieve the implicitly-predeclared 'struct _GUID' type.
2505 assert(MSGuidTagDecl && "asked for GUID type but MS extensions disabled");
2507 }
2508
2509 /// Retrieve the implicitly-predeclared 'struct type_info' declaration.
2511 // Lazily create this type on demand - it's only needed for MS builds.
2512 if (!MSTypeInfoTagDecl)
2514 return MSTypeInfoTagDecl;
2515 }
2516
2517 /// Return whether a declaration to a builtin is allowed to be
2518 /// overloaded/redeclared.
2519 bool canBuiltinBeRedeclared(const FunctionDecl *) const;
2520
2521 /// Return a type with additional \c const, \c volatile, or
2522 /// \c restrict qualifiers.
2523 QualType getCVRQualifiedType(QualType T, unsigned CVR) const {
2525 }
2526
2527 /// Un-split a SplitQualType.
2529 return getQualifiedType(split.Ty, split.Quals);
2530 }
2531
2532 /// Return a type with additional qualifiers.
2534 if (!Qs.hasNonFastQualifiers())
2536 QualifierCollector Qc(Qs);
2537 const Type *Ptr = Qc.strip(T);
2538 return getExtQualType(Ptr, Qc);
2539 }
2540
2541 /// Return a type with additional qualifiers.
2543 if (!Qs.hasNonFastQualifiers())
2544 return QualType(T, Qs.getFastQualifiers());
2545 return getExtQualType(T, Qs);
2546 }
2547
2548 /// Return a type with the given lifetime qualifier.
2549 ///
2550 /// \pre Neither type.ObjCLifetime() nor \p lifetime may be \c OCL_None.
2552 Qualifiers::ObjCLifetime lifetime) {
2553 assert(type.getObjCLifetime() == Qualifiers::OCL_None);
2554 assert(lifetime != Qualifiers::OCL_None);
2555
2556 Qualifiers qs;
2557 qs.addObjCLifetime(lifetime);
2558 return getQualifiedType(type, qs);
2559 }
2560
2561 /// getUnqualifiedObjCPointerType - Returns version of
2562 /// Objective-C pointer type with lifetime qualifier removed.
2564 if (!type.getTypePtr()->isObjCObjectPointerType() ||
2565 !type.getQualifiers().hasObjCLifetime())
2566 return type;
2567 Qualifiers Qs = type.getQualifiers();
2568 Qs.removeObjCLifetime();
2569 return getQualifiedType(type.getUnqualifiedType(), Qs);
2570 }
2571
2572 /// \brief Return a type with the given __ptrauth qualifier.
2574 assert(!Ty.getPointerAuth());
2575 assert(PointerAuth);
2576
2577 Qualifiers Qs;
2578 Qs.setPointerAuth(PointerAuth);
2579 return getQualifiedType(Ty, Qs);
2580 }
2581
2582 unsigned char getFixedPointScale(QualType Ty) const;
2583 unsigned char getFixedPointIBits(QualType Ty) const;
2584 llvm::FixedPointSemantics getFixedPointSemantics(QualType Ty) const;
2585 llvm::APFixedPoint getFixedPointMax(QualType Ty) const;
2586 llvm::APFixedPoint getFixedPointMin(QualType Ty) const;
2587
2589 SourceLocation NameLoc) const;
2590
2592 UnresolvedSetIterator End) const;
2594
2596 bool TemplateKeyword,
2597 TemplateName Template) const;
2600
2602 Decl *AssociatedDecl,
2603 unsigned Index,
2604 UnsignedOrNone PackIndex,
2605 bool Final) const;
2607 Decl *AssociatedDecl,
2608 unsigned Index,
2609 bool Final) const;
2610
2611 /// Represents a TemplateName which had some of its default arguments
2612 /// deduced. This both represents this default argument deduction as sugar,
2613 /// and provides the support for it's equivalences through canonicalization.
2614 /// For example DeducedTemplateNames which have the same set of default
2615 /// arguments are equivalent, and are also equivalent to the underlying
2616 /// template when the deduced template arguments are the same.
2618 DefaultArguments DefaultArgs) const;
2619
2621 /// No error
2623
2624 /// Missing a type
2626
2627 /// Missing a type from <stdio.h>
2629
2630 /// Missing a type from <setjmp.h>
2632
2633 /// Missing a type from <ucontext.h>
2635 };
2636
2637 QualType DecodeTypeStr(const char *&Str, const ASTContext &Context,
2639 bool &RequireICE, bool AllowTypeModifiers) const;
2640
2641 /// Return the type for the specified builtin.
2642 ///
2643 /// If \p IntegerConstantArgs is non-null, it is filled in with a bitmask of
2644 /// arguments to the builtin that are required to be integer constant
2645 /// expressions.
2647 unsigned *IntegerConstantArgs = nullptr) const;
2648
2649 /// Types and expressions required to build C++2a three-way comparisons
2650 /// using operator<=>, including the values return by builtin <=> operators.
2652
2653private:
2654 CanQualType getFromTargetType(unsigned Type) const;
2655 TypeInfo getTypeInfoImpl(const Type *T) const;
2656
2657 //===--------------------------------------------------------------------===//
2658 // Type Predicates.
2659 //===--------------------------------------------------------------------===//
2660
2661public:
2662 /// Return one of the GCNone, Weak or Strong Objective-C garbage
2663 /// collection attributes.
2665
2666 /// Return true if the given vector types are of the same unqualified
2667 /// type or if they are equivalent to the same GCC vector type.
2668 ///
2669 /// \note This ignores whether they are target-specific (AltiVec or Neon)
2670 /// types.
2671 bool areCompatibleVectorTypes(QualType FirstVec, QualType SecondVec);
2672
2673 /// Return true if two OverflowBehaviorTypes are compatible for assignment.
2674 /// This checks both the underlying type compatibility and the overflow
2675 /// behavior kind (trap vs wrap).
2677
2678 enum class OBTAssignResult {
2679 Compatible, // No OBT issues
2680 IncompatibleKinds, // __ob_trap vs __ob_wrap (error)
2681 Discards, // OBT -> non-OBT on integer types (warning)
2682 NotApplicable // Not both integers, fall through to normal checking
2683 };
2684
2685 /// Check overflow behavior type compatibility for assignments.
2686 /// Returns detailed information about OBT compatibility for assignment
2687 /// checking.
2689
2690 /// Return true if the given types are an RISC-V vector builtin type and a
2691 /// VectorType that is a fixed-length representation of the RISC-V vector
2692 /// builtin type for a specific vector-length.
2693 bool areCompatibleRVVTypes(QualType FirstType, QualType SecondType);
2694
2695 /// Return true if the given vector types are lax-compatible RISC-V vector
2696 /// types as defined by -flax-vector-conversions=, which permits implicit
2697 /// conversions between vectors with different number of elements and/or
2698 /// incompatible element types, false otherwise.
2699 bool areLaxCompatibleRVVTypes(QualType FirstType, QualType SecondType);
2700
2701 /// Return true if the type has been explicitly qualified with ObjC ownership.
2702 /// A type may be implicitly qualified with ownership under ObjC ARC, and in
2703 /// some cases the compiler treats these differently.
2705
2706 /// Return true if this is an \c NSObject object with its \c NSObject
2707 /// attribute set.
2709 return Ty->isObjCNSObjectType();
2710 }
2711
2712 //===--------------------------------------------------------------------===//
2713 // Type Sizing and Analysis
2714 //===--------------------------------------------------------------------===//
2715
2716 /// Return the APFloat 'semantics' for the specified scalar floating
2717 /// point type.
2718 const llvm::fltSemantics &getFloatTypeSemantics(QualType T) const;
2719
2720 /// Get the size and alignment of the specified complete type in bits.
2721 TypeInfo getTypeInfo(const Type *T) const;
2722 TypeInfo getTypeInfo(QualType T) const { return getTypeInfo(T.getTypePtr()); }
2723
2724 /// Get default simd alignment of the specified complete type in bits.
2725 unsigned getOpenMPDefaultSimdAlign(QualType T) const;
2726
2727 /// Return the size of the specified (complete) type \p T, in bits.
2728 uint64_t getTypeSize(QualType T) const { return getTypeInfo(T).Width; }
2729 uint64_t getTypeSize(const Type *T) const { return getTypeInfo(T).Width; }
2730
2731 /// Return the size of the character type, in bits.
2732 uint64_t getCharWidth() const {
2733 return getTypeSize(CharTy);
2734 }
2735
2736 /// Convert a size in bits to a size in characters.
2737 CharUnits toCharUnitsFromBits(int64_t BitSize) const;
2738
2739 /// Convert a size in characters to a size in bits.
2740 int64_t toBits(CharUnits CharSize) const;
2741
2742 /// Return the size of the specified (complete) type \p T, in
2743 /// characters.
2745 CharUnits getTypeSizeInChars(const Type *T) const;
2746
2747 std::optional<CharUnits> getTypeSizeInCharsIfKnown(QualType Ty) const {
2748 if (Ty->isIncompleteType() || Ty->isDependentType() ||
2749 Ty->isUndeducedType() || Ty->isSizelessType())
2750 return std::nullopt;
2751 return getTypeSizeInChars(Ty);
2752 }
2753
2754 std::optional<CharUnits> getTypeSizeInCharsIfKnown(const Type *Ty) const {
2755 return getTypeSizeInCharsIfKnown(QualType(Ty, 0));
2756 }
2757
2758 /// Return the ABI-specified alignment of a (complete) type \p T, in
2759 /// bits.
2760 unsigned getTypeAlign(QualType T) const { return getTypeInfo(T).Align; }
2761 unsigned getTypeAlign(const Type *T) const { return getTypeInfo(T).Align; }
2762
2763 /// Return the ABI-specified natural alignment of a (complete) type \p T,
2764 /// before alignment adjustments, in bits.
2765 ///
2766 /// This alignment is currently used only by ARM and AArch64 when passing
2767 /// arguments of a composite type.
2769 return getTypeUnadjustedAlign(T.getTypePtr());
2770 }
2771 unsigned getTypeUnadjustedAlign(const Type *T) const;
2772
2773 /// Return the alignment of a type, in bits, or 0 if
2774 /// the type is incomplete and we cannot determine the alignment (for
2775 /// example, from alignment attributes). The returned alignment is the
2776 /// Preferred alignment if NeedsPreferredAlignment is true, otherwise is the
2777 /// ABI alignment.
2778 unsigned getTypeAlignIfKnown(QualType T,
2779 bool NeedsPreferredAlignment = false) const;
2780
2781 /// Return the ABI-specified alignment of a (complete) type \p T, in
2782 /// characters.
2784 CharUnits getTypeAlignInChars(const Type *T) const;
2785
2786 /// Return the PreferredAlignment of a (complete) type \p T, in
2787 /// characters.
2791
2792 /// getTypeUnadjustedAlignInChars - Return the ABI-specified alignment of a type,
2793 /// in characters, before alignment adjustments. This method does not work on
2794 /// incomplete types.
2797
2798 // getTypeInfoDataSizeInChars - Return the size of a type, in chars. If the
2799 // type is a record, its data size is returned.
2801
2802 TypeInfoChars getTypeInfoInChars(const Type *T) const;
2804
2805 /// Determine if the alignment the type has was required using an
2806 /// alignment attribute.
2807 bool isAlignmentRequired(const Type *T) const;
2808 bool isAlignmentRequired(QualType T) const;
2809
2810 /// More type predicates useful for type checking/promotion
2811 bool isPromotableIntegerType(QualType T) const; // C99 6.3.1.1p2
2812
2813 /// Return the "preferred" alignment of the specified type \p T for
2814 /// the current target, in bits.
2815 ///
2816 /// This can be different than the ABI alignment in cases where it is
2817 /// beneficial for performance or backwards compatibility preserving to
2818 /// overalign a data type. (Note: despite the name, the preferred alignment
2819 /// is ABI-impacting, and not an optimization.)
2821 return getPreferredTypeAlign(T.getTypePtr());
2822 }
2823 unsigned getPreferredTypeAlign(const Type *T) const;
2824
2825 /// Return the default alignment for __attribute__((aligned)) on
2826 /// this target, to be used if no alignment value is specified.
2828
2829 /// Return the alignment in bits that should be given to a
2830 /// global variable with type \p T. If \p VD is non-null it will be
2831 /// considered specifically for the query.
2832 unsigned getAlignOfGlobalVar(QualType T, const VarDecl *VD) const;
2833
2834 /// Return the alignment in characters that should be given to a
2835 /// global variable with type \p T. If \p VD is non-null it will be
2836 /// considered specifically for the query.
2838
2839 /// Return the minimum alignment as specified by the target. If \p VD is
2840 /// non-null it may be used to identify external or weak variables.
2841 unsigned getMinGlobalAlignOfVar(uint64_t Size, const VarDecl *VD) const;
2842
2843 /// Return a conservative estimate of the alignment of the specified
2844 /// decl \p D.
2845 ///
2846 /// \pre \p D must not be a bitfield type, as bitfields do not have a valid
2847 /// alignment.
2848 ///
2849 /// If \p ForAlignof, references are treated like their underlying type
2850 /// and large arrays don't get any special treatment. If not \p ForAlignof
2851 /// it computes the value expected by CodeGen: references are treated like
2852 /// pointers and large arrays get extra alignment.
2853 CharUnits getDeclAlign(const Decl *D, bool ForAlignof = false) const;
2854
2855 /// Return the alignment (in bytes) of the thrown exception object. This is
2856 /// only meaningful for targets that allocate C++ exceptions in a system
2857 /// runtime, such as those using the Itanium C++ ABI.
2859
2860 /// Return whether unannotated records are treated as if they have
2861 /// [[gnu::ms_struct]].
2862 bool defaultsToMsStruct() const;
2863
2864 /// Get or compute information about the layout of the specified
2865 /// record (struct/union/class) \p D, which indicates its size and field
2866 /// position information.
2867 const ASTRecordLayout &getASTRecordLayout(const RecordDecl *D) const;
2868
2869 /// Get or compute information about the layout of the specified
2870 /// Objective-C interface.
2872 const;
2873
2874 void DumpRecordLayout(const RecordDecl *RD, raw_ostream &OS,
2875 bool Simple = false) const;
2876
2877 /// Get our current best idea for the key function of the
2878 /// given record decl, or nullptr if there isn't one.
2879 ///
2880 /// The key function is, according to the Itanium C++ ABI section 5.2.3:
2881 /// ...the first non-pure virtual function that is not inline at the
2882 /// point of class definition.
2883 ///
2884 /// Other ABIs use the same idea. However, the ARM C++ ABI ignores
2885 /// virtual functions that are defined 'inline', which means that
2886 /// the result of this computation can change.
2888
2889 /// Observe that the given method cannot be a key function.
2890 /// Checks the key-function cache for the method's class and clears it
2891 /// if matches the given declaration.
2892 ///
2893 /// This is used in ABIs where out-of-line definitions marked
2894 /// inline are not considered to be key functions.
2895 ///
2896 /// \param method should be the declaration from the class definition
2897 void setNonKeyFunction(const CXXMethodDecl *method);
2898
2899 /// Loading virtual member pointers using the virtual inheritance model
2900 /// always results in an adjustment using the vbtable even if the index is
2901 /// zero.
2902 ///
2903 /// This is usually OK because the first slot in the vbtable points
2904 /// backwards to the top of the MDC. However, the MDC might be reusing a
2905 /// vbptr from an nv-base. In this case, the first slot in the vbtable
2906 /// points to the start of the nv-base which introduced the vbptr and *not*
2907 /// the MDC. Modify the NonVirtualBaseAdjustment to account for this.
2909
2910 /// Get the offset of a FieldDecl or IndirectFieldDecl, in bits.
2911 uint64_t getFieldOffset(const ValueDecl *FD) const;
2912
2913 /// Get the offset of an ObjCIvarDecl in bits.
2914 uint64_t lookupFieldBitOffset(const ObjCInterfaceDecl *OID,
2915 const ObjCIvarDecl *Ivar) const;
2916
2917 /// Find the 'this' offset for the member path in a pointer-to-member
2918 /// APValue.
2920
2921 bool isNearlyEmpty(const CXXRecordDecl *RD) const;
2922
2924
2925 /// If \p T is null pointer, assume the target in ASTContext.
2926 MangleContext *createMangleContext(const TargetInfo *T = nullptr);
2927
2928 /// Creates a device mangle context to correctly mangle lambdas in a mixed
2929 /// architecture compile by setting the lambda mangling number source to the
2930 /// DeviceLambdaManglingNumber. Currently this asserts that the TargetInfo
2931 /// (from the AuxTargetInfo) is a an itanium target.
2933
2935
2936 void DeepCollectObjCIvars(const ObjCInterfaceDecl *OI, bool leafClass,
2938
2939 unsigned CountNonClassIvars(const ObjCInterfaceDecl *OI) const;
2940 void CollectInheritedProtocols(const Decl *CDecl,
2942
2943 /// Return true if the specified type has unique object representations
2944 /// according to (C++17 [meta.unary.prop]p9)
2945 bool
2947 bool CheckIfTriviallyCopyable = true) const;
2948
2949 //===--------------------------------------------------------------------===//
2950 // Type Operators
2951 //===--------------------------------------------------------------------===//
2952
2953 /// Return the canonical (structural) type corresponding to the
2954 /// specified potentially non-canonical type \p T.
2955 ///
2956 /// The non-canonical version of a type may have many "decorated" versions of
2957 /// types. Decorators can include typedefs, 'typeof' operators, etc. The
2958 /// returned type is guaranteed to be free of any of these, allowing two
2959 /// canonical types to be compared for exact equality with a simple pointer
2960 /// comparison.
2962 return CanQualType::CreateUnsafe(T.getCanonicalType());
2963 }
2964
2965 static const Type *getCanonicalType(const Type *T) {
2967 }
2968
2969 /// Return the canonical parameter type corresponding to the specific
2970 /// potentially non-canonical one.
2971 ///
2972 /// Qualifiers are stripped off, functions are turned into function
2973 /// pointers, and arrays decay one level into pointers.
2975
2976 /// Determine whether the given types \p T1 and \p T2 are equivalent.
2977 static bool hasSameType(QualType T1, QualType T2) {
2978 return getCanonicalType(T1) == getCanonicalType(T2);
2979 }
2980 static bool hasSameType(const Type *T1, const Type *T2) {
2981 return getCanonicalType(T1) == getCanonicalType(T2);
2982 }
2983
2984 /// Determine whether the given expressions \p X and \p Y are equivalent.
2985 bool hasSameExpr(const Expr *X, const Expr *Y) const;
2986
2987 /// Return this type as a completely-unqualified array type,
2988 /// capturing the qualifiers in \p Quals.
2989 ///
2990 /// This will remove the minimal amount of sugaring from the types, similar
2991 /// to the behavior of QualType::getUnqualifiedType().
2992 ///
2993 /// \param T is the qualified type, which may be an ArrayType
2994 ///
2995 /// \param Quals will receive the full set of qualifiers that were
2996 /// applied to the array.
2997 ///
2998 /// \returns if this is an array type, the completely unqualified array type
2999 /// that corresponds to it. Otherwise, returns T.getUnqualifiedType().
3002 Qualifiers Quals;
3003 return getUnqualifiedArrayType(T, Quals);
3004 }
3005
3006 /// Determine whether the given types are equivalent after
3007 /// cvr-qualifiers have been removed.
3009 return getCanonicalType(T1).getTypePtr() ==
3011 }
3012
3014 bool IsParam) const {
3015 auto SubTnullability = SubT->getNullability();
3016 auto SuperTnullability = SuperT->getNullability();
3017 if (SubTnullability.has_value() == SuperTnullability.has_value()) {
3018 // Neither has nullability; return true
3019 if (!SubTnullability)
3020 return true;
3021 // Both have nullability qualifier.
3022 if (*SubTnullability == *SuperTnullability ||
3023 *SubTnullability == NullabilityKind::Unspecified ||
3024 *SuperTnullability == NullabilityKind::Unspecified)
3025 return true;
3026
3027 if (IsParam) {
3028 // Ok for the superclass method parameter to be "nonnull" and the subclass
3029 // method parameter to be "nullable"
3030 return (*SuperTnullability == NullabilityKind::NonNull &&
3031 *SubTnullability == NullabilityKind::Nullable);
3032 }
3033 // For the return type, it's okay for the superclass method to specify
3034 // "nullable" and the subclass method specify "nonnull"
3035 return (*SuperTnullability == NullabilityKind::Nullable &&
3036 *SubTnullability == NullabilityKind::NonNull);
3037 }
3038 return true;
3039 }
3040
3041 bool ObjCMethodsAreEqual(const ObjCMethodDecl *MethodDecl,
3042 const ObjCMethodDecl *MethodImp);
3043
3044 bool UnwrapSimilarTypes(QualType &T1, QualType &T2,
3045 bool AllowPiMismatch = true) const;
3047 bool AllowPiMismatch = true) const;
3048
3049 /// Determine if two types are similar, according to the C++ rules. That is,
3050 /// determine if they are the same other than qualifiers on the initial
3051 /// sequence of pointer / pointer-to-member / array (and in Clang, object
3052 /// pointer) types and their element types.
3053 ///
3054 /// Clang offers a number of qualifiers in addition to the C++ qualifiers;
3055 /// those qualifiers are also ignored in the 'similarity' check.
3056 bool hasSimilarType(QualType T1, QualType T2) const;
3057
3058 /// Determine if two types are similar, ignoring only CVR qualifiers.
3059 bool hasCvrSimilarType(QualType T1, QualType T2);
3060
3061 /// Retrieves the default calling convention for the current context.
3062 ///
3063 /// The context's default calling convention may differ from the current
3064 /// target's default calling convention if the -fdefault-calling-conv option
3065 /// is used; to get the target's default calling convention, e.g. for built-in
3066 /// functions, call getTargetInfo().getDefaultCallingConv() instead.
3068 bool IsCXXMethod) const;
3069
3070 /// Retrieves the "canonical" template name that refers to a
3071 /// given template.
3072 ///
3073 /// The canonical template name is the simplest expression that can
3074 /// be used to refer to a given template. For most templates, this
3075 /// expression is just the template declaration itself. For example,
3076 /// the template std::vector can be referred to via a variety of
3077 /// names---std::vector, \::std::vector, vector (if vector is in
3078 /// scope), etc.---but all of these names map down to the same
3079 /// TemplateDecl, which is used to form the canonical template name.
3080 ///
3081 /// Dependent template names are more interesting. Here, the
3082 /// template name could be something like T::template apply or
3083 /// std::allocator<T>::template rebind, where the nested name
3084 /// specifier itself is dependent. In this case, the canonical
3085 /// template name uses the shortest form of the dependent
3086 /// nested-name-specifier, which itself contains all canonical
3087 /// types, values, and templates.
3089 bool IgnoreDeduced = false) const;
3090
3091 /// Return the default argument of a template parameter, if one exists.
3092 const TemplateArgument *
3094
3095 /// Determine whether the given template names refer to the same
3096 /// template.
3097 bool hasSameTemplateName(const TemplateName &X, const TemplateName &Y,
3098 bool IgnoreDeduced = false) const;
3099
3100 /// Determine whether the two declarations refer to the same entity.
3101 bool isSameEntity(const NamedDecl *X, const NamedDecl *Y) const;
3102
3103 /// Determine whether two template parameter lists are similar enough
3104 /// that they may be used in declarations of the same template.
3106 const TemplateParameterList *Y) const;
3107
3108 /// Determine whether two template parameters are similar enough
3109 /// that they may be used in declarations of the same template.
3110 bool isSameTemplateParameter(const NamedDecl *X, const NamedDecl *Y) const;
3111
3112 /// Determine whether two 'requires' expressions are similar enough that they
3113 /// may be used in re-declarations.
3114 ///
3115 /// Use of 'requires' isn't mandatory, works with constraints expressed in
3116 /// other ways too.
3118 const AssociatedConstraint &ACY) const;
3119
3120 /// Determine whether two 'requires' expressions are similar enough that they
3121 /// may be used in re-declarations.
3122 ///
3123 /// Use of 'requires' isn't mandatory, works with constraints expressed in
3124 /// other ways too.
3125 bool isSameConstraintExpr(const Expr *XCE, const Expr *YCE) const;
3126
3127 /// Determine whether two type contraint are similar enough that they could
3128 /// used in declarations of the same template.
3129 bool isSameTypeConstraint(const TypeConstraint *XTC,
3130 const TypeConstraint *YTC) const;
3131
3132 /// Determine whether two default template arguments are similar enough
3133 /// that they may be used in declarations of the same template.
3135 const NamedDecl *Y) const;
3136
3137 /// Retrieve the "canonical" template argument.
3138 ///
3139 /// The canonical template argument is the simplest template argument
3140 /// (which may be a type, value, expression, or declaration) that
3141 /// expresses the value of the argument.
3143 const;
3144
3145 /// Canonicalize the given template argument list.
3146 ///
3147 /// Returns true if any arguments were non-canonical, false otherwise.
3148 bool
3150
3151 /// Canonicalize the given TemplateTemplateParmDecl.
3154
3156 TemplateTemplateParmDecl *TTP) const;
3158 TemplateTemplateParmDecl *CanonTTP) const;
3159
3160 /// Determine whether the given template arguments \p Arg1 and \p Arg2 are
3161 /// equivalent.
3163 const TemplateArgument &Arg2) const;
3164
3165 /// Type Query functions. If the type is an instance of the specified class,
3166 /// return the Type pointer for the underlying maximally pretty type. This
3167 /// is a member of ASTContext because this may need to do some amount of
3168 /// canonicalization, e.g. to move type qualifiers into the element type.
3169 const ArrayType *getAsArrayType(QualType T) const;
3171 return dyn_cast_or_null<ConstantArrayType>(getAsArrayType(T));
3172 }
3174 return dyn_cast_or_null<VariableArrayType>(getAsArrayType(T));
3175 }
3177 return dyn_cast_or_null<IncompleteArrayType>(getAsArrayType(T));
3178 }
3180 const {
3181 return dyn_cast_or_null<DependentSizedArrayType>(getAsArrayType(T));
3182 }
3183
3184 /// Return the innermost element type of an array type.
3185 ///
3186 /// For example, will return "int" for int[m][n]
3187 QualType getBaseElementType(const ArrayType *VAT) const;
3188
3189 /// Return the innermost element type of a type (which needn't
3190 /// actually be an array type).
3192
3193 /// Return number of constant array elements.
3194 uint64_t getConstantArrayElementCount(const ConstantArrayType *CA) const;
3195
3196 /// Return number of elements initialized in an ArrayInitLoopExpr.
3197 uint64_t
3199
3200 /// Perform adjustment on the parameter type of a function.
3201 ///
3202 /// This routine adjusts the given parameter type @p T to the actual
3203 /// parameter type used by semantic analysis (C99 6.7.5.3p[7,8],
3204 /// C++ [dcl.fct]p3). The adjusted parameter type is returned.
3206
3207 /// Retrieve the parameter type as adjusted for use in the signature
3208 /// of a function, decaying array and function types and removing top-level
3209 /// cv-qualifiers.
3211
3213
3214 /// Return the properly qualified result of decaying the specified
3215 /// array type to a pointer.
3216 ///
3217 /// This operation is non-trivial when handling typedefs etc. The canonical
3218 /// type of \p T must be an array type, this returns a pointer to a properly
3219 /// qualified element of the array.
3220 ///
3221 /// See C99 6.7.5.3p7 and C99 6.3.2.1p3.
3223
3224 /// Return the type that \p PromotableType will promote to: C99
3225 /// 6.3.1.1p2, assuming that \p PromotableType is a promotable integer type.
3226 QualType getPromotedIntegerType(QualType PromotableType) const;
3227
3228 /// Recurses in pointer/array types until it finds an Objective-C
3229 /// retainable type and returns its ownership.
3231
3232 /// Whether this is a promotable bitfield reference according
3233 /// to C99 6.3.1.1p2, bullet 2 (and GCC extensions).
3234 ///
3235 /// \returns the type this bit-field will promote to, or NULL if no
3236 /// promotion occurs.
3238
3239 /// Return the highest ranked integer type, see C99 6.3.1.8p1.
3240 ///
3241 /// If \p LHS > \p RHS, returns 1. If \p LHS == \p RHS, returns 0. If
3242 /// \p LHS < \p RHS, return -1.
3243 int getIntegerTypeOrder(QualType LHS, QualType RHS) const;
3244
3245 /// Compare the rank of the two specified floating point types,
3246 /// ignoring the domain of the type (i.e. 'double' == '_Complex double').
3247 ///
3248 /// If \p LHS > \p RHS, returns 1. If \p LHS == \p RHS, returns 0. If
3249 /// \p LHS < \p RHS, return -1.
3250 int getFloatingTypeOrder(QualType LHS, QualType RHS) const;
3251
3252 /// Compare the rank of two floating point types as above, but compare equal
3253 /// if both types have the same floating-point semantics on the target (i.e.
3254 /// long double and double on AArch64 will return 0).
3256
3257 unsigned getTargetAddressSpace(LangAS AS) const;
3258
3259 LangAS getLangASForBuiltinAddressSpace(unsigned AS) const;
3260
3261 /// Get target-dependent integer value for null pointer which is used for
3262 /// constant folding.
3263 uint64_t getTargetNullPointerValue(QualType QT) const;
3264
3266 return AddrSpaceMapMangling || isTargetAddressSpace(AS);
3267 }
3268
3269 bool hasAnyFunctionEffects() const { return AnyFunctionEffects; }
3270
3271 // Merges two exception specifications, such that the resulting
3272 // exception spec is the union of both. For example, if either
3273 // of them can throw something, the result can throw it as well.
3277 SmallVectorImpl<QualType> &ExceptionTypeStorage,
3278 bool AcceptDependent) const;
3279
3280 // For two "same" types, return a type which has
3281 // the common sugar between them. If Unqualified is true,
3282 // both types need only be the same unqualified type.
3283 // The result will drop the qualifiers which do not occur
3284 // in both types.
3286 bool Unqualified = false) const;
3287
3288private:
3289 // Helper for integer ordering
3290 unsigned getIntegerRank(const Type *T) const;
3291
3292public:
3293 //===--------------------------------------------------------------------===//
3294 // Type Compatibility Predicates
3295 //===--------------------------------------------------------------------===//
3296
3297 /// Compatibility predicates used to check assignment expressions.
3299 bool CompareUnqualified = false); // C99 6.2.7p1
3300
3303
3304 bool isObjCIdType(QualType T) const { return T == getObjCIdType(); }
3305
3306 bool isObjCClassType(QualType T) const { return T == getObjCClassType(); }
3307
3308 bool isObjCSelType(QualType T) const { return T == getObjCSelType(); }
3309
3311 const ObjCObjectPointerType *RHS,
3312 bool ForCompare);
3313
3315 const ObjCObjectPointerType *RHS);
3316
3317 // Check the safety of assignment from LHS to RHS
3319 const ObjCObjectPointerType *RHSOPT);
3321 const ObjCObjectType *RHS);
3323 const ObjCObjectPointerType *LHSOPT,
3324 const ObjCObjectPointerType *RHSOPT,
3325 bool BlockReturnType);
3328 const ObjCObjectPointerType *RHSOPT);
3330
3331 // Functions for calculating composite types
3332 QualType mergeTypes(QualType, QualType, bool OfBlockPointer = false,
3333 bool Unqualified = false, bool BlockReturnType = false,
3334 bool IsConditionalOperator = false);
3335 QualType mergeFunctionTypes(QualType, QualType, bool OfBlockPointer = false,
3336 bool Unqualified = false, bool AllowCXX = false,
3337 bool IsConditionalOperator = false);
3339 bool OfBlockPointer = false,
3340 bool Unqualified = false);
3342 bool OfBlockPointer=false,
3343 bool Unqualified = false);
3345
3347
3348 /// This function merges the ExtParameterInfo lists of two functions. It
3349 /// returns true if the lists are compatible. The merged list is returned in
3350 /// NewParamInfos.
3351 ///
3352 /// \param FirstFnType The type of the first function.
3353 ///
3354 /// \param SecondFnType The type of the second function.
3355 ///
3356 /// \param CanUseFirst This flag is set to true if the first function's
3357 /// ExtParameterInfo list can be used as the composite list of
3358 /// ExtParameterInfo.
3359 ///
3360 /// \param CanUseSecond This flag is set to true if the second function's
3361 /// ExtParameterInfo list can be used as the composite list of
3362 /// ExtParameterInfo.
3363 ///
3364 /// \param NewParamInfos The composite list of ExtParameterInfo. The list is
3365 /// empty if none of the flags are set.
3366 ///
3368 const FunctionProtoType *FirstFnType,
3369 const FunctionProtoType *SecondFnType,
3370 bool &CanUseFirst, bool &CanUseSecond,
3372
3373 void ResetObjCLayout(const ObjCInterfaceDecl *D);
3374
3376 const ObjCInterfaceDecl *SubClass) {
3377 ObjCSubClasses[D].push_back(SubClass);
3378 }
3379
3380 //===--------------------------------------------------------------------===//
3381 // Integer Predicates
3382 //===--------------------------------------------------------------------===//
3383
3384 // The width of an integer, as defined in C99 6.2.6.2. This is the number
3385 // of bits in an integer type excluding any padding bits.
3386 unsigned getIntWidth(QualType T) const;
3387
3388 // Per C99 6.2.5p6, for every signed integer type, there is a corresponding
3389 // unsigned integer type. This method takes a signed type, and returns the
3390 // corresponding unsigned integer type.
3391 // With the introduction of fixed point types in ISO N1169, this method also
3392 // accepts fixed point types and returns the corresponding unsigned type for
3393 // a given fixed point type.
3395
3396 // Per C99 6.2.5p6, for every signed integer type, there is a corresponding
3397 // unsigned integer type. This method takes an unsigned type, and returns the
3398 // corresponding signed integer type.
3399 // With the introduction of fixed point types in ISO N1169, this method also
3400 // accepts fixed point types and returns the corresponding signed type for
3401 // a given fixed point type.
3403
3404 // Per ISO N1169, this method accepts fixed point types and returns the
3405 // corresponding saturated type for a given fixed point type.
3407
3408 // Per ISO N1169, this method accepts fixed point types and returns the
3409 // corresponding non-saturated type for a given fixed point type.
3411
3412 // This method accepts fixed point types and returns the corresponding signed
3413 // type. Unlike getCorrespondingUnsignedType(), this only accepts unsigned
3414 // fixed point types because there are unsigned integer types like bool and
3415 // char8_t that don't have signed equivalents.
3417
3418 //===--------------------------------------------------------------------===//
3419 // Integer Values
3420 //===--------------------------------------------------------------------===//
3421
3422 /// Make an APSInt of the appropriate width and signedness for the
3423 /// given \p Value and integer \p Type.
3424 llvm::APSInt MakeIntValue(uint64_t Value, QualType Type) const {
3425 // If Type is a signed integer type larger than 64 bits, we need to be sure
3426 // to sign extend Res appropriately.
3427 llvm::APSInt Res(64, !Type->isSignedIntegerOrEnumerationType());
3428 Res = Value;
3429 unsigned Width = getIntWidth(Type);
3430 if (Width != Res.getBitWidth())
3431 return Res.extOrTrunc(Width);
3432 return Res;
3433 }
3434
3435 bool isSentinelNullExpr(const Expr *E);
3436
3437 /// Get the implementation of the ObjCInterfaceDecl \p D, or nullptr if
3438 /// none exists.
3440
3441 /// Get the implementation of the ObjCCategoryDecl \p D, or nullptr if
3442 /// none exists.
3444
3445 /// Return true if there is at least one \@implementation in the TU.
3447 return !ObjCImpls.empty();
3448 }
3449
3450 /// Set the implementation of ObjCInterfaceDecl.
3452 ObjCImplementationDecl *ImplD);
3453
3454 /// Set the implementation of ObjCCategoryDecl.
3456 ObjCCategoryImplDecl *ImplD);
3457
3458 /// Get the duplicate declaration of a ObjCMethod in the same
3459 /// interface, or null if none exists.
3460 const ObjCMethodDecl *
3462
3464 const ObjCMethodDecl *Redecl);
3465
3466 /// Returns the Objective-C interface that \p ND belongs to if it is
3467 /// an Objective-C method/property/ivar etc. that is part of an interface,
3468 /// otherwise returns null.
3470
3471 /// Set the copy initialization expression of a block var decl. \p CanThrow
3472 /// indicates whether the copy expression can throw or not.
3473 void setBlockVarCopyInit(const VarDecl* VD, Expr *CopyExpr, bool CanThrow);
3474
3475 /// Get the copy initialization expression of the VarDecl \p VD, or
3476 /// nullptr if none exists.
3478
3479 /// Allocate an uninitialized TypeSourceInfo.
3480 ///
3481 /// The caller should initialize the memory held by TypeSourceInfo using
3482 /// the TypeLoc wrappers.
3483 ///
3484 /// \param T the type that will be the basis for type source info. This type
3485 /// should refer to how the declarator was written in source code, not to
3486 /// what type semantic analysis resolved the declarator to.
3487 ///
3488 /// \param Size the size of the type info to create, or 0 if the size
3489 /// should be calculated based on the type.
3490 TypeSourceInfo *CreateTypeSourceInfo(QualType T, unsigned Size = 0) const;
3491
3492 /// Allocate a TypeSourceInfo where all locations have been
3493 /// initialized to a given location, which defaults to the empty
3494 /// location.
3497 SourceLocation Loc = SourceLocation()) const;
3498
3499 /// Add a deallocation callback that will be invoked when the
3500 /// ASTContext is destroyed.
3501 ///
3502 /// \param Callback A callback function that will be invoked on destruction.
3503 ///
3504 /// \param Data Pointer data that will be provided to the callback function
3505 /// when it is called.
3506 void AddDeallocation(void (*Callback)(void *), void *Data) const;
3507
3508 /// If T isn't trivially destructible, calls AddDeallocation to register it
3509 /// for destruction.
3510 template <typename T> void addDestruction(T *Ptr) const {
3511 if (!std::is_trivially_destructible<T>::value) {
3512 auto DestroyPtr = [](void *V) { static_cast<T *>(V)->~T(); };
3513 AddDeallocation(DestroyPtr, Ptr);
3514 }
3515 }
3516
3519
3520 /// Determines if the decl can be CodeGen'ed or deserialized from PCH
3521 /// lazily, only when used; this is only relevant for function or file scoped
3522 /// var definitions.
3523 ///
3524 /// \returns true if the function/var must be CodeGen'ed/deserialized even if
3525 /// it is not used.
3526 bool DeclMustBeEmitted(const Decl *D);
3527
3528 /// Visits all versions of a multiversioned function with the passed
3529 /// predicate.
3531 const FunctionDecl *FD,
3532 llvm::function_ref<void(FunctionDecl *)> Pred) const;
3533
3534 const CXXConstructorDecl *
3536
3538 CXXConstructorDecl *CD);
3539
3541
3543
3545
3547
3548 void setManglingNumber(const NamedDecl *ND, unsigned Number);
3549 unsigned getManglingNumber(const NamedDecl *ND,
3550 bool ForAuxTarget = false) const;
3551
3552 void setStaticLocalNumber(const VarDecl *VD, unsigned Number);
3553 unsigned getStaticLocalNumber(const VarDecl *VD) const;
3554
3556 return !TypeAwareOperatorNewAndDeletes.empty();
3557 }
3558 void setIsDestroyingOperatorDelete(const FunctionDecl *FD, bool IsDestroying);
3559 bool isDestroyingOperatorDelete(const FunctionDecl *FD) const;
3561 bool IsTypeAware);
3562 bool isTypeAwareOperatorNewOrDelete(const FunctionDecl *FD) const;
3563
3565
3567 FunctionDecl *OperatorDelete,
3568 OperatorDeleteKind K) const;
3570 OperatorDeleteKind K) const;
3572 OperatorDeleteKind K) const;
3575
3576 /// Retrieve the context for computing mangling numbers in the given
3577 /// DeclContext.
3581 const Decl *D);
3582
3583 std::unique_ptr<MangleNumberingContext> createMangleNumberingContext() const;
3584
3585 /// Used by ParmVarDecl to store on the side the
3586 /// index of the parameter when it exceeds the size of the normal bitfield.
3587 void setParameterIndex(const ParmVarDecl *D, unsigned index);
3588
3589 /// Used by ParmVarDecl to retrieve on the side the
3590 /// index of the parameter when it exceeds the size of the normal bitfield.
3591 unsigned getParameterIndex(const ParmVarDecl *D) const;
3592
3593 /// Return a string representing the human readable name for the specified
3594 /// function declaration or file name. Used by SourceLocExpr and
3595 /// PredefinedExpr to cache evaluated results.
3597
3598 /// Return the next version number to be used for a string literal evaluated
3599 /// as part of constant evaluation.
3600 unsigned getNextStringLiteralVersion() { return NextStringLiteralVersion++; }
3601
3602 /// Return a declaration for the global GUID object representing the given
3603 /// GUID value.
3605
3606 /// Return a declaration for a uniquified anonymous global constant
3607 /// corresponding to a given APValue.
3610
3611 /// Return the template parameter object of the given type with the given
3612 /// value.
3614 const APValue &V) const;
3615
3616 /// Parses the target attributes passed in, and returns only the ones that are
3617 /// valid feature names.
3618 ParsedTargetAttr filterFunctionTargetAttrs(const TargetAttr *TD) const;
3619
3620 void getFunctionFeatureMap(llvm::StringMap<bool> &FeatureMap,
3621 const FunctionDecl *) const;
3622 void getFunctionFeatureMap(llvm::StringMap<bool> &FeatureMap,
3623 GlobalDecl GD) const;
3624
3625 /// Generates and stores SYCL kernel metadata for the provided
3626 /// SYCL kernel entry point function. The provided function must have
3627 /// an attached sycl_kernel_entry_point attribute that specifies a unique
3628 /// type for the name of a SYCL kernel. Callers are required to detect
3629 /// conflicting SYCL kernel names and issue a diagnostic prior to calling
3630 /// this function.
3632
3633 /// Given a type used as a SYCL kernel name, returns a reference to the
3634 /// metadata generated from the corresponding SYCL kernel entry point.
3635 /// Aborts if the provided type is not a registered SYCL kernel name.
3637
3638 /// Returns a pointer to the metadata generated from the corresponding
3639 /// SYCLkernel entry point if the provided type corresponds to a registered
3640 /// SYCL kernel name. Returns a null pointer otherwise.
3642
3643 //===--------------------------------------------------------------------===//
3644 // Statistics
3645 //===--------------------------------------------------------------------===//
3646
3647 /// The number of implicitly-declared default constructors.
3649
3650 /// The number of implicitly-declared default constructors for
3651 /// which declarations were built.
3653
3654 /// The number of implicitly-declared copy constructors.
3656
3657 /// The number of implicitly-declared copy constructors for
3658 /// which declarations were built.
3660
3661 /// The number of implicitly-declared move constructors.
3663
3664 /// The number of implicitly-declared move constructors for
3665 /// which declarations were built.
3667
3668 /// The number of implicitly-declared copy assignment operators.
3670
3671 /// The number of implicitly-declared copy assignment operators for
3672 /// which declarations were built.
3674
3675 /// The number of implicitly-declared move assignment operators.
3677
3678 /// The number of implicitly-declared move assignment operators for
3679 /// which declarations were built.
3681
3682 /// The number of implicitly-declared destructors.
3684
3685 /// The number of implicitly-declared destructors for which
3686 /// declarations were built.
3688
3689public:
3690 /// Initialize built-in types.
3691 ///
3692 /// This routine may only be invoked once for a given ASTContext object.
3693 /// It is normally invoked after ASTContext construction.
3694 ///
3695 /// \param Target The target
3696 void InitBuiltinTypes(const TargetInfo &Target,
3697 const TargetInfo *AuxTarget = nullptr);
3698
3699private:
3700 void InitBuiltinType(CanQualType &R, BuiltinType::Kind K);
3701
3702 class ObjCEncOptions {
3703 unsigned Bits;
3704
3705 ObjCEncOptions(unsigned Bits) : Bits(Bits) {}
3706
3707 public:
3708 ObjCEncOptions() : Bits(0) {}
3709
3710#define OPT_LIST(V) \
3711 V(ExpandPointedToStructures, 0) \
3712 V(ExpandStructures, 1) \
3713 V(IsOutermostType, 2) \
3714 V(EncodingProperty, 3) \
3715 V(IsStructField, 4) \
3716 V(EncodeBlockParameters, 5) \
3717 V(EncodeClassNames, 6) \
3718
3719#define V(N,I) ObjCEncOptions& set##N() { Bits |= 1 << I; return *this; }
3720OPT_LIST(V)
3721#undef V
3722
3723#define V(N,I) bool N() const { return Bits & 1 << I; }
3724OPT_LIST(V)
3725#undef V
3726
3727#undef OPT_LIST
3728
3729 [[nodiscard]] ObjCEncOptions keepingOnly(ObjCEncOptions Mask) const {
3730 return Bits & Mask.Bits;
3731 }
3732
3733 [[nodiscard]] ObjCEncOptions forComponentType() const {
3734 ObjCEncOptions Mask = ObjCEncOptions()
3735 .setIsOutermostType()
3736 .setIsStructField();
3737 return Bits & ~Mask.Bits;
3738 }
3739 };
3740
3741 // Return the Objective-C type encoding for a given type.
3742 void getObjCEncodingForTypeImpl(QualType t, std::string &S,
3743 ObjCEncOptions Options,
3744 const FieldDecl *Field,
3745 QualType *NotEncodedT = nullptr) const;
3746
3747 // Adds the encoding of the structure's members.
3748 void getObjCEncodingForStructureImpl(RecordDecl *RD, std::string &S,
3749 const FieldDecl *Field,
3750 bool includeVBases = true,
3751 QualType *NotEncodedT=nullptr) const;
3752
3753public:
3754 // Adds the encoding of a method parameter or return type.
3756 QualType T, std::string& S,
3757 bool Extended) const;
3758
3759 /// Returns true if this is an inline-initialized static data member
3760 /// which is treated as a definition for MSVC compatibility.
3761 bool isMSStaticDataMemberInlineDefinition(const VarDecl *VD) const;
3762
3764 /// Not an inline variable.
3765 None,
3766
3767 /// Weak definition of inline variable.
3769
3770 /// Weak for now, might become strong later in this TU.
3772
3773 /// Strong definition.
3775 };
3776
3777 /// Determine whether a definition of this inline variable should
3778 /// be treated as a weak or strong definition. For compatibility with
3779 /// C++14 and before, for a constexpr static data member, if there is an
3780 /// out-of-line declaration of the member, we may promote it from weak to
3781 /// strong.
3784
3785private:
3787 friend class DeclContext;
3788
3789 const ASTRecordLayout &getObjCLayout(const ObjCInterfaceDecl *D) const;
3790
3791 /// A set of deallocations that should be performed when the
3792 /// ASTContext is destroyed.
3793 // FIXME: We really should have a better mechanism in the ASTContext to
3794 // manage running destructors for types which do variable sized allocation
3795 // within the AST. In some places we thread the AST bump pointer allocator
3796 // into the datastructures which avoids this mess during deallocation but is
3797 // wasteful of memory, and here we require a lot of error prone book keeping
3798 // in order to track and run destructors while we're tearing things down.
3799 using DeallocationFunctionsAndArguments =
3800 llvm::SmallVector<std::pair<void (*)(void *), void *>, 16>;
3801 mutable DeallocationFunctionsAndArguments Deallocations;
3802
3803 // FIXME: This currently contains the set of StoredDeclMaps used
3804 // by DeclContext objects. This probably should not be in ASTContext,
3805 // but we include it here so that ASTContext can quickly deallocate them.
3806 llvm::PointerIntPair<StoredDeclsMap *, 1> LastSDM;
3807
3808 std::vector<Decl *> TraversalScope;
3809
3810 std::unique_ptr<VTableContextBase> VTContext;
3811
3812 void ReleaseDeclContextMaps();
3813
3814public:
3815 enum PragmaSectionFlag : unsigned {
3822 PSF_Invalid = 0x80000000U,
3823 };
3824
3836
3837 llvm::StringMap<SectionInfo> SectionInfos;
3838
3839 /// Return a new OMPTraitInfo object owned by this context.
3841
3842 /// Whether a C++ static variable or CUDA/HIP kernel may be externalized.
3843 bool mayExternalize(const Decl *D) const;
3844
3845 /// Whether a C++ static variable or CUDA/HIP kernel should be externalized.
3846 bool shouldExternalize(const Decl *D) const;
3847
3848 /// Resolve the root record to be used to derive the vtable pointer
3849 /// authentication policy for the specified record.
3850 const CXXRecordDecl *
3851 baseForVTableAuthentication(const CXXRecordDecl *ThisClass) const;
3852
3853 bool useAbbreviatedThunkName(GlobalDecl VirtualMethodDecl,
3854 StringRef MangledName);
3855
3856 StringRef getCUIDHash() const;
3857
3858 /// Returns a list of PFP fields for the given type, including subfields in
3859 /// bases or other fields, except for fields contained within fields of union
3860 /// type.
3861 std::vector<PFPField> findPFPFields(QualType Ty) const;
3862
3863 bool hasPFPFields(QualType Ty) const;
3864 bool isPFPField(const FieldDecl *Field) const;
3865
3866 /// Returns whether this record's PFP fields (if any) are trivially
3867 /// copyable (i.e. may be memcpy'd). This may also return true if the
3868 /// record does not have any PFP fields, so it may be necessary for the caller
3869 /// to check for PFP fields, e.g. by calling hasPFPFields().
3870 bool arePFPFieldsTriviallyCopyable(const RecordDecl *RD) const;
3871
3872 llvm::SetVector<const FieldDecl *> PFPFieldsWithEvaluatedOffset;
3875
3876private:
3877 /// All OMPTraitInfo objects live in this collection, one per
3878 /// `pragma omp [begin] declare variant` directive.
3879 SmallVector<std::unique_ptr<OMPTraitInfo>, 4> OMPTraitInfoVector;
3880
3881 llvm::DenseMap<GlobalDecl, llvm::StringSet<>> ThunksToBeAbbreviated;
3882};
3883
3884/// Insertion operator for diagnostics.
3886 const ASTContext::SectionInfo &Section);
3887
3888/// Utility function for constructing a nullary selector.
3889inline Selector GetNullarySelector(StringRef name, ASTContext &Ctx) {
3890 const IdentifierInfo *II = &Ctx.Idents.get(name);
3891 return Ctx.Selectors.getSelector(0, &II);
3892}
3893
3894/// Utility function for constructing an unary selector.
3895inline Selector GetUnarySelector(StringRef name, ASTContext &Ctx) {
3896 const IdentifierInfo *II = &Ctx.Idents.get(name);
3897 return Ctx.Selectors.getSelector(1, &II);
3898}
3899
3900} // namespace clang
3901
3902// operator new and delete aren't allowed inside namespaces.
3903
3904/// Placement new for using the ASTContext's allocator.
3905///
3906/// This placement form of operator new uses the ASTContext's allocator for
3907/// obtaining memory.
3908///
3909/// IMPORTANT: These are also declared in clang/AST/ASTContextAllocate.h!
3910/// Any changes here need to also be made there.
3911///
3912/// We intentionally avoid using a nothrow specification here so that the calls
3913/// to this operator will not perform a null check on the result -- the
3914/// underlying allocator never returns null pointers.
3915///
3916/// Usage looks like this (assuming there's an ASTContext 'Context' in scope):
3917/// @code
3918/// // Default alignment (8)
3919/// IntegerLiteral *Ex = new (Context) IntegerLiteral(arguments);
3920/// // Specific alignment
3921/// IntegerLiteral *Ex2 = new (Context, 4) IntegerLiteral(arguments);
3922/// @endcode
3923/// Memory allocated through this placement new operator does not need to be
3924/// explicitly freed, as ASTContext will free all of this memory when it gets
3925/// destroyed. Please note that you cannot use delete on the pointer.
3926///
3927/// @param Bytes The number of bytes to allocate. Calculated by the compiler.
3928/// @param C The ASTContext that provides the allocator.
3929/// @param Alignment The alignment of the allocated memory (if the underlying
3930/// allocator supports it).
3931/// @return The allocated memory. Could be nullptr.
3932inline void *operator new(size_t Bytes, const clang::ASTContext &C,
3933 size_t Alignment /* = 8 */) {
3934 return C.Allocate(Bytes, Alignment);
3935}
3936
3937/// Placement delete companion to the new above.
3938///
3939/// This operator is just a companion to the new above. There is no way of
3940/// invoking it directly; see the new operator for more details. This operator
3941/// is called implicitly by the compiler if a placement new expression using
3942/// the ASTContext throws in the object constructor.
3943inline void operator delete(void *Ptr, const clang::ASTContext &C, size_t) {
3944 C.Deallocate(Ptr);
3945}
3946
3947/// This placement form of operator new[] uses the ASTContext's allocator for
3948/// obtaining memory.
3949///
3950/// We intentionally avoid using a nothrow specification here so that the calls
3951/// to this operator will not perform a null check on the result -- the
3952/// underlying allocator never returns null pointers.
3953///
3954/// Usage looks like this (assuming there's an ASTContext 'Context' in scope):
3955/// @code
3956/// // Default alignment (8)
3957/// char *data = new (Context) char[10];
3958/// // Specific alignment
3959/// char *data = new (Context, 4) char[10];
3960/// @endcode
3961/// Memory allocated through this placement new[] operator does not need to be
3962/// explicitly freed, as ASTContext will free all of this memory when it gets
3963/// destroyed. Please note that you cannot use delete on the pointer.
3964///
3965/// @param Bytes The number of bytes to allocate. Calculated by the compiler.
3966/// @param C The ASTContext that provides the allocator.
3967/// @param Alignment The alignment of the allocated memory (if the underlying
3968/// allocator supports it).
3969/// @return The allocated memory. Could be nullptr.
3970inline void *operator new[](size_t Bytes, const clang::ASTContext& C,
3971 size_t Alignment /* = 8 */) {
3972 return C.Allocate(Bytes, Alignment);
3973}
3974
3975/// Placement delete[] companion to the new[] above.
3976///
3977/// This operator is just a companion to the new[] above. There is no way of
3978/// invoking it directly; see the new[] operator for more details. This operator
3979/// is called implicitly by the compiler if a placement new[] expression using
3980/// the ASTContext throws in the object constructor.
3981inline void operator delete[](void *Ptr, const clang::ASTContext &C, size_t) {
3982 C.Deallocate(Ptr);
3983}
3984
3985/// Create the representation of a LazyGenerationalUpdatePtr.
3986template <typename Owner, typename T,
3987 void (clang::ExternalASTSource::*Update)(Owner)>
3990 const clang::ASTContext &Ctx, T Value) {
3991 // Note, this is implemented here so that ExternalASTSource.h doesn't need to
3992 // include ASTContext.h. We explicitly instantiate it for all relevant types
3993 // in ASTContext.cpp.
3994 if (auto *Source = Ctx.getExternalSource())
3995 return new (Ctx) LazyData(Source, Value);
3996 return Value;
3997}
3998template <> struct llvm::DenseMapInfo<llvm::FoldingSetNodeID> {
3999 static FoldingSetNodeID getEmptyKey() { return FoldingSetNodeID{}; }
4000
4001 static FoldingSetNodeID getTombstoneKey() {
4002 FoldingSetNodeID ID;
4003 for (size_t I = 0; I < sizeof(ID) / sizeof(unsigned); ++I) {
4004 ID.AddInteger(std::numeric_limits<unsigned>::max());
4005 }
4006 return ID;
4007 }
4008
4009 static unsigned getHashValue(const FoldingSetNodeID &Val) {
4010 return Val.ComputeHash();
4011 }
4012
4013 static bool isEqual(const FoldingSetNodeID &LHS,
4014 const FoldingSetNodeID &RHS) {
4015 return LHS == RHS;
4016 }
4017};
4018
4019#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:2848
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.
C Language Family Type Representation.
__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:227
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:227
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:866
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:581
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:980
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:906
DeclListNode * AllocateDeclListNode(clang::NamedDecl *ND)
Allocates a DeclListNode or returns one from the ListNodeFreeList pool.
Definition ASTContext.h:895
bool isPFPField(const FieldDecl *Field) const
QualType adjustFunctionResultType(QualType FunctionType, QualType NewResultType)
Change the result type of a function type, preserving sugar such as attributed types.
void setTemplateOrSpecializationInfo(VarDecl *Inst, TemplateOrSpecializationInfo TSI)
bool isTypeAwareOperatorNewOrDelete(const FunctionDecl *FD) const
bool ProtocolCompatibleWithProtocol(ObjCProtocolDecl *lProto, ObjCProtocolDecl *rProto) const
ProtocolCompatibleWithProtocol - return 'true' if 'lProto' is in the inheritance hierarchy of 'rProto...
TypedefDecl * buildImplicitTypedef(QualType T, StringRef Name) const
Create a new implicit TU-level typedef declaration.
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:809
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:721
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.
const TemplateArgument * getDefaultTemplateArgumentOrNone(const NamedDecl *P) const
Return the default argument of a template parameter, if one exists.
QualType getAttributedType(attr::Kind attrKind, QualType modifiedType, QualType equivalentType, const Attr *attr=nullptr) const
TypedefDecl * getObjCIdDecl() const
Retrieve the typedef corresponding to the predefined id type in Objective-C.
void setCurrentNamedModule(Module *M)
Set the (C++20) module we are building.
QualType 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:851
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:810
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:584
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:984
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:976
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.
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)
void setClassMaybeNeedsVectorDeletingDestructor(const CXXRecordDecl *RD)
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:885
QualType getLValueReferenceType(QualType T, bool SpelledAsLValue=true) const
Return the uniqued reference to the type for an lvalue reference to the specified type.
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
std::optional< QualType > tryMergeOverflowBehaviorTypes(QualType LHS, QualType RHS, bool OfBlockPointer, bool Unqualified, bool BlockReturnType, bool IsConditionalOperator)
Attempts to merge two types that may be OverflowBehaviorTypes.
CanQualType WideCharTy
CanQualType OMPIteratorTy
IdentifierTable & Idents
Definition ASTContext.h:805
Builtin::Context & BuiltinInfo
Definition ASTContext.h:807
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:959
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:710
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:806
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:994
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:920
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:927
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:580
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 getAutoType(DeducedKind DK, QualType DeducedAsType, AutoTypeKeyword Keyword, TemplateDecl *TypeConstraintConcept=nullptr, ArrayRef< TemplateArgument > TypeConstraintArgs={}) const
C++11 deduced auto type.
QualType getBaseElementType(const ArrayType *VAT) const
Return the innermost element type of an array type.
llvm::SetVector< const VarDecl * > CUDADeviceVarODRUsedByHost
Keep track of CUDA/HIP device-side variables ODR-used by host code.
QualType getPointerDiffType() const
Return the unique type for "ptrdiff_t" (C99 7.17) defined in <stddef.h>.
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:875
void setStaticLocalNumber(const VarDecl *VD, unsigned Number)
friend class ASTDeclReader
Definition ASTContext.h:579
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:969
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:925
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:583
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:808
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 arePFPFieldsTriviallyCopyable(const RecordDecl *RD) const
Returns whether this record's PFP fields (if any) are trivially copyable (i.e.
bool isSameEntity(const NamedDecl *X, const NamedDecl *Y) const
Determine whether the two declarations refer to the same entity.
QualType 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:997
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
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:228
void PrintStats() const
MangleContext * cudaNVInitDeviceMC()
unsigned getAlignOfGlobalVar(QualType T, const VarDecl *VD) const
Return the alignment in bits that should be given to a global variable with type T.
bool areCompatibleOverflowBehaviorTypes(QualType LHS, QualType RHS)
Return true if two OverflowBehaviorTypes are compatible for assignment.
TypeInfoChars getTypeInfoDataSizeInChars(QualType T) const
MangleNumberingContext & getManglingNumberContext(const DeclContext *DC)
Retrieve the context for computing mangling numbers in the given DeclContext.
comments::FullComment * getLocalCommentForDeclUncached(const Decl *D) const
Return parsed documentation comment attached to a given declaration.
unsigned NumImplicitDestructors
The number of implicitly-declared destructors.
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:811
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.
interp::Context & getInterpContext() const
Returns the clang bytecode interpreter context.
const SourceManager & getSourceManager() const
Definition ASTContext.h:867
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.
bool hasPFPFields(QualType Ty) const
const clang::PrintingPolicy & getPrintingPolicy() const
Definition ASTContext.h:858
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:575
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.
CanQualType OCLSamplerTy
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:879
ArrayRef< ExplicitInstantiationDecl * > getExplicitInstantiationDecls(const NamedDecl *Spec) const
Get all ExplicitInstantiationDecls for a given specialization.
bool canBuiltinBeRedeclared(const FunctionDecl *) const
Return whether a declaration to a builtin is allowed to be overloaded/redeclared.
CanQualType UnsignedIntTy
unsigned NumImplicitMoveConstructors
The number of implicitly-declared move constructors.
QualType getTypedefType(ElaboratedTypeKeyword Keyword, NestedNameSpecifier Qualifier, const TypedefNameDecl *Decl, QualType UnderlyingType=QualType(), std::optional< bool > TypeMatchesDeclOrNone=std::nullopt) const
Return the unique reference to the type for the specified typedef-name decl.
QualType getObjCTypeParamType(const ObjCTypeParamDecl *Decl, ArrayRef< ObjCProtocolDecl * > protocols) const
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:913
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 classMaybeNeedsVectorDeletingDestructor(const CXXRecordDecl *RD)
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:887
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
CanQualType Char32Ty
void recordOffsetOfEvaluation(const OffsetOfExpr *E)
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:924
void setInstantiatedFromUnnamedFieldDecl(FieldDecl *Inst, FieldDecl *Tmpl)
CanQualType OCLQueueTy
CanQualType LongFractTy
OBTAssignResult checkOBTAssignmentCompatibility(QualType LHS, QualType RHS)
Check overflow behavior type compatibility for assignments.
CanQualType SatShortAccumTy
QualType getAutoDeductType() const
C++11 deduction pattern for 'auto' type.
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.
void addExplicitInstantiationDecl(const NamedDecl *Spec, ExplicitInstantiationDecl *EID)
Add an ExplicitInstantiationDecl for a given specialization.
QualType getOverflowBehaviorType(const OverflowBehaviorAttr *Attr, QualType Wrapped) const
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
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
std::vector< PFPField > findPFPFields(QualType Ty) const
Returns a list of PFP fields for the given type, including subfields in bases or other fields,...
QualType 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:882
llvm::DenseMap< const Decl *, const Decl * > RedeclChainComments
Mapping from canonical declaration to the first redeclaration in chain that has a comment attached.
void adjustDeducedFunctionResultType(FunctionDecl *FD, QualType ResultType)
Change the result type of a function type once it is deduced.
QualType getObjCGCQualType(QualType T, Qualifiers::GC gcAttr) const
Return the uniqued reference to the type for an Objective-C gc-qualified type.
QualType 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.
llvm::SetVector< const FieldDecl * > PFPFieldsWithEvaluatedOffset
bool canonicalizeTemplateArguments(MutableArrayRef< TemplateArgument > Args) const
Canonicalize the given template argument list.
QualType getTypeOfExprType(Expr *E, TypeOfKind Kind) const
C23 feature and GCC extension.
CanQualType Char8Ty
bool isUnaryOverflowPatternExcluded(const UnaryOperator *UO)
QualType getSignedWCharType() const
Return the type of "signed wchar_t".
QualType getUnqualifiedArrayType(QualType T, Qualifiers &Quals) const
Return this type as a completely-unqualified array type, capturing the qualifiers in Quals.
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:965
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:862
void AddDeallocation(void(*Callback)(void *), void *Data) const
Add a deallocation callback that will be invoked when the ASTContext is destroyed.
AttrVec & getDeclAttrs(const Decl *D)
Retrieve the attributes for the given declaration.
QualType getDeducedTemplateSpecializationType(DeducedKind DK, QualType DeducedAsType, ElaboratedTypeKeyword Keyword, TemplateName Template) const
C++17 deduced class template specialization type.
CXXMethodVector::const_iterator overridden_cxx_method_iterator
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)
void recordMemberDataPointerEvaluation(const ValueDecl *VD)
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:5971
Represents an array type, per C99 6.7.5.2 - Array Declarators.
Definition TypeBase.h:3777
AtomicExpr - Variadic atomic builtins: __atomic_exchange, __atomic_fetch_*, __atomic_load,...
Definition Expr.h:6927
Attr - This represents one attribute.
Definition Attr.h:46
BlockExpr - Adaptor class for mixing a BlockDecl with expressions.
Definition Expr.h:6671
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:3219
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:2624
Represents a C++ destructor within a class.
Definition DeclCXX.h:2889
Represents a static or instance method of a struct/union/class.
Definition DeclCXX.h:2136
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:3815
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
Definition DeclBase.h:1462
A list storing NamedDecls in the lookup tables.
Definition DeclBase.h:1342
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:4066
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:233
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:3438
llvm::APSInt getInitVal() const
Definition Decl.h:3458
Represents an explicit instantiation of a template entity in source code.
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:3175
A SourceLocation and its associated SourceManager.
Represents a function declaration or definition.
Definition Decl.h:2015
Represents a prototype with parameter type info, e.g.
Definition TypeBase.h:5362
A class which abstracts out some details necessary for making a call.
Definition TypeBase.h:4669
FunctionType - C99 6.7.5.3 - Function Declarators.
Definition TypeBase.h:4558
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:5070
Represents a C array with an unspecified size.
Definition TypeBase.h:3964
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:4414
MangleContext - Context for tracking state which persists across multiple calls to the C++ name mangl...
Definition Mangle.h:56
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:237
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>::".
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:8054
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
OffsetOfExpr - [C99 7.17] - This represents an expression of the form offsetof(record-type,...
Definition Expr.h:2530
Represents a parameter to a function.
Definition Decl.h:1805
Pointer-authentication qualifiers.
Definition TypeBase.h:152
PredefinedSugarKind Kind
Definition TypeBase.h:8347
Engages in a tight little dance with the lexer to efficiently preprocess tokens.
A (possibly-)qualified type.
Definition TypeBase.h:937
QualType withFastQualifiers(unsigned TQs) const
Definition TypeBase.h:1212
PointerAuthQualifier getPointerAuth() const
Definition TypeBase.h:1464
QualType withConst() const
Definition TypeBase.h:1170
const Type * getTypePtr() const
Retrieves a pointer to the underlying (unqualified) type.
Definition TypeBase.h:8436
A qualifier set is used to build a set of qualifiers.
Definition TypeBase.h:8376
const Type * strip(QualType type)
Collect any qualifiers on the given type and return an unqualified type.
Definition TypeBase.h:8383
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:4342
void setPreviousDecl(decl_type *PrevDecl)
Set the previous declaration.
Definition Decl.h:5347
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:1802
Represents the declaration of a struct/union/class/enum.
Definition Decl.h:3732
TagTypeKind TagKind
Definition Decl.h:3737
Kind
The basic C++ ABI kind.
Exposes information about the current target.
Definition TargetInfo.h:227
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:5455
Represents the declaration of a typedef-name via a C++11 alias-declaration.
Definition Decl.h:3703
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:3528
A container of type source information.
Definition TypeBase.h:8407
The base class of the type hierarchy.
Definition TypeBase.h:1871
bool isSizelessType() const
As an extension, we classify types as one of "sized" or "sizeless"; every type is one or the other.
Definition Type.cpp:2649
bool isSignedIntegerOrEnumerationType() const
Determines whether this is an integer type that is signed or an enumeration types whose underlying ty...
Definition Type.cpp:2289
bool isObjCNSObjectType() const
Definition Type.cpp:5392
bool isDependentType() const
Whether this type is a dependent type, meaning that its definition somehow depends on a template para...
Definition TypeBase.h:2837
QualType getCanonicalTypeInternal() const
Definition TypeBase.h:3174
bool isUndeducedType() const
Determine whether this type is an undeduced type, meaning that it somehow involves a C++11 'auto' typ...
Definition TypeBase.h:9182
bool isIncompleteType(NamedDecl **Def=nullptr) const
Types are partitioned into 3 broad categories (C99 6.2.5p1): object types, function types,...
Definition Type.cpp:2515
NullabilityKindOrNone getNullability() const
Determine the nullability of the given type.
Definition Type.cpp:5135
Represents the declaration of a typedef-name via the 'typedef' type specifier.
Definition Decl.h:3682
Base class for declarations which introduce a typedef-name.
Definition Decl.h:3577
UnaryOperator - This represents the unary-expression's (except sizeof and alignof),...
Definition Expr.h:2247
An artificial decl, representing a global anonymous constant value which is uniquified by value withi...
Definition DeclCXX.h:4471
The iterator over UnresolvedSets.
Represents the dependent type named by a dependently-scoped typename using declaration,...
Definition TypeBase.h:6078
Represents a dependent using declaration which was marked with typename.
Definition DeclCXX.h:4053
Represents a C++ using-enum-declaration.
Definition DeclCXX.h:3808
Represents a shadow declaration implicitly introduced into a scope by a (resolved) using-declaration ...
Definition DeclCXX.h:3415
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:4021
Represents a GCC generic vector type.
Definition TypeBase.h:4230
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:47
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:56
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:1830
bool isTargetAddressSpace(LangAS AS)
OpenCLTypeKind
OpenCL type kinds.
Definition TargetInfo.h:213
NullabilityKind
Describes the nullability of a particular type.
Definition Specifiers.h:349
@ Nullable
Values of this type can be null.
Definition Specifiers.h:353
@ Unspecified
Whether values of this type can be null is (explicitly) unspecified.
Definition Specifiers.h:358
@ NonNull
Values of this type can never be null.
Definition Specifiers.h:351
@ 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:3774
OptionalUnsigned< unsigned > UnsignedOrNone
@ 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:5997
BuiltinTemplateKind
Kinds of BuiltinTemplateDecl.
Definition Builtins.h:490
@ Keyword
The name has been typo-corrected to a keyword.
Definition Sema.h:562
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.
DeducedKind
Definition TypeBase.h:1803
FloatModeKind
Definition TargetInfo.h:75
SmallVector< CXXBaseSpecifier *, 4 > CXXCastPath
A simple array of base specifiers.
Definition ASTContext.h:151
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:189
CallingConv
CallingConv - Specifies the calling convention that a function uses.
Definition Specifiers.h:279
U cast(CodeGen::Address addr)
Definition Address.h:327
AlignRequirementKind
Definition ASTContext.h:178
@ None
The alignment was not explicit in code.
Definition ASTContext.h:180
@ RequiredByEnum
The alignment comes from an alignment attribute on a enum type.
Definition ASTContext.h:189
@ RequiredByTypedef
The alignment comes from an alignment attribute on a typedef.
Definition ASTContext.h:183
@ RequiredByRecord
The alignment comes from an alignment attribute on a record type.
Definition ASTContext.h:186
ElaboratedTypeKeyword
The elaboration keyword that precedes a qualified type name or introduces an elaborated-type-specifie...
Definition TypeBase.h:5961
@ None
No keyword precedes the qualified type name.
Definition TypeBase.h:5982
@ Other
Other implicit parameter.
Definition Decl.h:1761
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:823
BuiltinVectorTypeInfo(QualType ElementType, llvm::ElementCount EC, unsigned NumVectors)
CUDAConstantEvalContextRAII(ASTContext &Ctx_, bool NoWrongSidedVars)
Definition ASTContext.h:823
bool NoWrongSidedVars
Do not allow wrong-sided variables in constant expressions.
Definition ASTContext.h:818
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:6717
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:5419
Extra information about a function prototype.
Definition TypeBase.h:5447
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:4389
FieldDecl * Field
Definition ASTContext.h:222
CharUnits Offset
Definition ASTContext.h:221
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:209
TypeInfoChars(CharUnits Width, CharUnits Align, AlignRequirementKind AlignRequirement)
Definition ASTContext.h:212
bool isAlignRequired()
Definition ASTContext.h:201
AlignRequirementKind AlignRequirement
Definition ASTContext.h:195
TypeInfo(uint64_t Width, unsigned Align, AlignRequirementKind AlignRequirement)
Definition ASTContext.h:198
static ScalableVecTyKey getTombstoneKey()
Definition ASTContext.h:74
static ScalableVecTyKey getEmptyKey()
Definition ASTContext.h:71
static bool isEqual(const ScalableVecTyKey &LHS, const ScalableVecTyKey &RHS)
Definition ASTContext.h:81
static unsigned getHashValue(const ScalableVecTyKey &Val)
Definition ASTContext.h:77
static bool isEqual(const FoldingSetNodeID &LHS, const FoldingSetNodeID &RHS)
static FoldingSetNodeID getTombstoneKey()
static unsigned getHashValue(const FoldingSetNodeID &Val)
clang::QualType EltTy
Definition ASTContext.h:58
bool operator==(const ScalableVecTyKey &RHS) const
Definition ASTContext.h:62