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