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