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