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