clang 19.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"
27#include "clang/Basic/LLVM.h"
30#include "llvm/ADT/DenseMap.h"
31#include "llvm/ADT/DenseSet.h"
32#include "llvm/ADT/FoldingSet.h"
33#include "llvm/ADT/IntrusiveRefCntPtr.h"
34#include "llvm/ADT/MapVector.h"
35#include "llvm/ADT/PointerIntPair.h"
36#include "llvm/ADT/PointerUnion.h"
37#include "llvm/ADT/SmallVector.h"
38#include "llvm/ADT/StringMap.h"
39#include "llvm/ADT/StringRef.h"
40#include "llvm/ADT/TinyPtrVector.h"
41#include "llvm/Support/TypeSize.h"
42#include <optional>
43
44namespace llvm {
45
46class APFixedPoint;
47class FixedPointSemantics;
48struct fltSemantics;
49template <typename T, unsigned N> class SmallPtrSet;
50
51} // namespace llvm
52
53namespace clang {
54
55class APValue;
56class ASTMutationListener;
57class ASTRecordLayout;
58class AtomicExpr;
59class BlockExpr;
60struct BlockVarCopyInit;
61class BuiltinTemplateDecl;
62class CharUnits;
63class ConceptDecl;
64class CXXABI;
65class CXXConstructorDecl;
66class CXXMethodDecl;
67class CXXRecordDecl;
68class DiagnosticsEngine;
69class DynTypedNodeList;
70class Expr;
71enum class FloatModeKind;
72class GlobalDecl;
73class IdentifierTable;
74class LangOptions;
75class MangleContext;
76class MangleNumberingContext;
77class MemberSpecializationInfo;
78class Module;
79struct MSGuidDeclParts;
80class NestedNameSpecifier;
81class NoSanitizeList;
82class ObjCCategoryDecl;
83class ObjCCategoryImplDecl;
84class ObjCContainerDecl;
85class ObjCImplDecl;
86class ObjCImplementationDecl;
87class ObjCInterfaceDecl;
88class ObjCIvarDecl;
89class ObjCMethodDecl;
90class ObjCPropertyDecl;
91class ObjCPropertyImplDecl;
92class ObjCProtocolDecl;
93class ObjCTypeParamDecl;
94class OMPTraitInfo;
95class ParentMapContext;
96struct ParsedTargetAttr;
97class Preprocessor;
98class ProfileList;
99class StoredDeclsMap;
100class TargetAttr;
101class TargetInfo;
102class TemplateDecl;
103class TemplateParameterList;
104class TemplateTemplateParmDecl;
105class TemplateTypeParmDecl;
106class TypeConstraint;
107class UnresolvedSetIterator;
108class UsingShadowDecl;
109class VarTemplateDecl;
110class VTableContextBase;
111class XRayFunctionFilter;
112
113namespace Builtin {
114
115class Context;
116
117} // namespace Builtin
118
120enum OpenCLTypeKind : uint8_t;
121
122namespace comments {
123
124class FullComment;
125
126} // namespace comments
127
128namespace interp {
129
130class Context;
131
132} // namespace interp
133
134namespace serialization {
135template <class> class AbstractTypeReader;
136} // namespace serialization
137
139 /// The alignment was not explicit in code.
140 None,
141
142 /// The alignment comes from an alignment attribute on a typedef.
144
145 /// The alignment comes from an alignment attribute on a record type.
147
148 /// The alignment comes from an alignment attribute on a enum type.
150};
151
152struct TypeInfo {
153 uint64_t Width = 0;
154 unsigned Align = 0;
156
158 TypeInfo(uint64_t Width, unsigned Align,
163 }
164};
165
170
177 }
178};
179
180/// Holds long-lived AST nodes (such as types and decls) that can be
181/// referred to throughout the semantic analysis of a file.
182class ASTContext : public RefCountedBase<ASTContext> {
184
185 mutable SmallVector<Type *, 0> Types;
186 mutable llvm::FoldingSet<ExtQuals> ExtQualNodes;
187 mutable llvm::FoldingSet<ComplexType> ComplexTypes;
188 mutable llvm::FoldingSet<PointerType> PointerTypes{GeneralTypesLog2InitSize};
189 mutable llvm::FoldingSet<AdjustedType> AdjustedTypes;
190 mutable llvm::FoldingSet<BlockPointerType> BlockPointerTypes;
191 mutable llvm::FoldingSet<LValueReferenceType> LValueReferenceTypes;
192 mutable llvm::FoldingSet<RValueReferenceType> RValueReferenceTypes;
193 mutable llvm::FoldingSet<MemberPointerType> MemberPointerTypes;
194 mutable llvm::ContextualFoldingSet<ConstantArrayType, ASTContext &>
195 ConstantArrayTypes;
196 mutable llvm::FoldingSet<IncompleteArrayType> IncompleteArrayTypes;
197 mutable std::vector<VariableArrayType*> VariableArrayTypes;
198 mutable llvm::ContextualFoldingSet<DependentSizedArrayType, ASTContext &>
199 DependentSizedArrayTypes;
200 mutable llvm::ContextualFoldingSet<DependentSizedExtVectorType, ASTContext &>
201 DependentSizedExtVectorTypes;
202 mutable llvm::ContextualFoldingSet<DependentAddressSpaceType, ASTContext &>
203 DependentAddressSpaceTypes;
204 mutable llvm::FoldingSet<VectorType> VectorTypes;
205 mutable llvm::ContextualFoldingSet<DependentVectorType, ASTContext &>
206 DependentVectorTypes;
207 mutable llvm::FoldingSet<ConstantMatrixType> MatrixTypes;
208 mutable llvm::ContextualFoldingSet<DependentSizedMatrixType, ASTContext &>
209 DependentSizedMatrixTypes;
210 mutable llvm::FoldingSet<FunctionNoProtoType> FunctionNoProtoTypes;
211 mutable llvm::ContextualFoldingSet<FunctionProtoType, ASTContext&>
212 FunctionProtoTypes;
213 mutable llvm::ContextualFoldingSet<DependentTypeOfExprType, ASTContext &>
214 DependentTypeOfExprTypes;
215 mutable llvm::ContextualFoldingSet<DependentDecltypeType, ASTContext &>
216 DependentDecltypeTypes;
217
218 mutable llvm::FoldingSet<PackIndexingType> DependentPackIndexingTypes;
219
220 mutable llvm::FoldingSet<TemplateTypeParmType> TemplateTypeParmTypes;
221 mutable llvm::FoldingSet<ObjCTypeParamType> ObjCTypeParamTypes;
222 mutable llvm::FoldingSet<SubstTemplateTypeParmType>
223 SubstTemplateTypeParmTypes;
224 mutable llvm::FoldingSet<SubstTemplateTypeParmPackType>
225 SubstTemplateTypeParmPackTypes;
226 mutable llvm::ContextualFoldingSet<TemplateSpecializationType, ASTContext&>
227 TemplateSpecializationTypes;
228 mutable llvm::FoldingSet<ParenType> ParenTypes{GeneralTypesLog2InitSize};
229 mutable llvm::FoldingSet<UsingType> UsingTypes;
230 mutable llvm::FoldingSet<TypedefType> TypedefTypes;
231 mutable llvm::FoldingSet<ElaboratedType> ElaboratedTypes{
232 GeneralTypesLog2InitSize};
233 mutable llvm::FoldingSet<DependentNameType> DependentNameTypes;
234 mutable llvm::ContextualFoldingSet<DependentTemplateSpecializationType,
235 ASTContext&>
236 DependentTemplateSpecializationTypes;
237 llvm::FoldingSet<PackExpansionType> PackExpansionTypes;
238 mutable llvm::FoldingSet<ObjCObjectTypeImpl> ObjCObjectTypes;
239 mutable llvm::FoldingSet<ObjCObjectPointerType> ObjCObjectPointerTypes;
240 mutable llvm::FoldingSet<DependentUnaryTransformType>
241 DependentUnaryTransformTypes;
242 mutable llvm::ContextualFoldingSet<AutoType, ASTContext&> AutoTypes;
243 mutable llvm::FoldingSet<DeducedTemplateSpecializationType>
244 DeducedTemplateSpecializationTypes;
245 mutable llvm::FoldingSet<AtomicType> AtomicTypes;
246 mutable llvm::FoldingSet<AttributedType> AttributedTypes;
247 mutable llvm::FoldingSet<PipeType> PipeTypes;
248 mutable llvm::FoldingSet<BitIntType> BitIntTypes;
249 mutable llvm::ContextualFoldingSet<DependentBitIntType, ASTContext &>
250 DependentBitIntTypes;
251 llvm::FoldingSet<BTFTagAttributedType> BTFTagAttributedTypes;
252
253 mutable llvm::FoldingSet<CountAttributedType> CountAttributedTypes;
254
255 mutable llvm::FoldingSet<QualifiedTemplateName> QualifiedTemplateNames;
256 mutable llvm::FoldingSet<DependentTemplateName> DependentTemplateNames;
257 mutable llvm::FoldingSet<SubstTemplateTemplateParmStorage>
258 SubstTemplateTemplateParms;
259 mutable llvm::ContextualFoldingSet<SubstTemplateTemplateParmPackStorage,
260 ASTContext&>
261 SubstTemplateTemplateParmPacks;
262
263 mutable llvm::ContextualFoldingSet<ArrayParameterType, ASTContext &>
264 ArrayParameterTypes;
265
266 /// The set of nested name specifiers.
267 ///
268 /// This set is managed by the NestedNameSpecifier class.
269 mutable llvm::FoldingSet<NestedNameSpecifier> NestedNameSpecifiers;
270 mutable NestedNameSpecifier *GlobalNestedNameSpecifier = nullptr;
271
272 /// A cache mapping from RecordDecls to ASTRecordLayouts.
273 ///
274 /// This is lazily created. This is intentionally not serialized.
275 mutable llvm::DenseMap<const RecordDecl*, const ASTRecordLayout*>
276 ASTRecordLayouts;
277 mutable llvm::DenseMap<const ObjCContainerDecl*, const ASTRecordLayout*>
278 ObjCLayouts;
279
280 /// A cache from types to size and alignment information.
281 using TypeInfoMap = llvm::DenseMap<const Type *, struct TypeInfo>;
282 mutable TypeInfoMap MemoizedTypeInfo;
283
284 /// A cache from types to unadjusted alignment information. Only ARM and
285 /// AArch64 targets need this information, keeping it separate prevents
286 /// imposing overhead on TypeInfo size.
287 using UnadjustedAlignMap = llvm::DenseMap<const Type *, unsigned>;
288 mutable UnadjustedAlignMap MemoizedUnadjustedAlign;
289
290 /// A cache mapping from CXXRecordDecls to key functions.
291 llvm::DenseMap<const CXXRecordDecl*, LazyDeclPtr> KeyFunctions;
292
293 /// Mapping from ObjCContainers to their ObjCImplementations.
294 llvm::DenseMap<ObjCContainerDecl*, ObjCImplDecl*> ObjCImpls;
295
296 /// Mapping from ObjCMethod to its duplicate declaration in the same
297 /// interface.
298 llvm::DenseMap<const ObjCMethodDecl*,const ObjCMethodDecl*> ObjCMethodRedecls;
299
300 /// Mapping from __block VarDecls to BlockVarCopyInit.
301 llvm::DenseMap<const VarDecl *, BlockVarCopyInit> BlockVarCopyInits;
302
303 /// Mapping from GUIDs to the corresponding MSGuidDecl.
304 mutable llvm::FoldingSet<MSGuidDecl> MSGuidDecls;
305
306 /// Mapping from APValues to the corresponding UnnamedGlobalConstantDecl.
307 mutable llvm::FoldingSet<UnnamedGlobalConstantDecl>
308 UnnamedGlobalConstantDecls;
309
310 /// Mapping from APValues to the corresponding TemplateParamObjects.
311 mutable llvm::FoldingSet<TemplateParamObjectDecl> TemplateParamObjectDecls;
312
313 /// A cache mapping a string value to a StringLiteral object with the same
314 /// value.
315 ///
316 /// This is lazily created. This is intentionally not serialized.
317 mutable llvm::StringMap<StringLiteral *> StringLiteralCache;
318
319 /// MD5 hash of CUID. It is calculated when first used and cached by this
320 /// data member.
321 mutable std::string CUIDHash;
322
323 /// Representation of a "canonical" template template parameter that
324 /// is used in canonical template names.
325 class CanonicalTemplateTemplateParm : public llvm::FoldingSetNode {
326 TemplateTemplateParmDecl *Parm;
327
328 public:
329 CanonicalTemplateTemplateParm(TemplateTemplateParmDecl *Parm)
330 : Parm(Parm) {}
331
332 TemplateTemplateParmDecl *getParam() const { return Parm; }
333
334 void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &C) {
335 Profile(ID, C, Parm);
336 }
337
338 static void Profile(llvm::FoldingSetNodeID &ID,
339 const ASTContext &C,
340 TemplateTemplateParmDecl *Parm);
341 };
342 mutable llvm::ContextualFoldingSet<CanonicalTemplateTemplateParm,
343 const ASTContext&>
344 CanonTemplateTemplateParms;
345
346 TemplateTemplateParmDecl *
347 getCanonicalTemplateTemplateParmDecl(TemplateTemplateParmDecl *TTP) const;
348
349 /// The typedef for the __int128_t type.
350 mutable TypedefDecl *Int128Decl = nullptr;
351
352 /// The typedef for the __uint128_t type.
353 mutable TypedefDecl *UInt128Decl = nullptr;
354
355 /// The typedef for the target specific predefined
356 /// __builtin_va_list type.
357 mutable TypedefDecl *BuiltinVaListDecl = nullptr;
358
359 /// The typedef for the predefined \c __builtin_ms_va_list type.
360 mutable TypedefDecl *BuiltinMSVaListDecl = nullptr;
361
362 /// The typedef for the predefined \c id type.
363 mutable TypedefDecl *ObjCIdDecl = nullptr;
364
365 /// The typedef for the predefined \c SEL type.
366 mutable TypedefDecl *ObjCSelDecl = nullptr;
367
368 /// The typedef for the predefined \c Class type.
369 mutable TypedefDecl *ObjCClassDecl = nullptr;
370
371 /// The typedef for the predefined \c Protocol class in Objective-C.
372 mutable ObjCInterfaceDecl *ObjCProtocolClassDecl = nullptr;
373
374 /// The typedef for the predefined 'BOOL' type.
375 mutable TypedefDecl *BOOLDecl = nullptr;
376
377 // Typedefs which may be provided defining the structure of Objective-C
378 // pseudo-builtins
379 QualType ObjCIdRedefinitionType;
380 QualType ObjCClassRedefinitionType;
381 QualType ObjCSelRedefinitionType;
382
383 /// The identifier 'bool'.
384 mutable IdentifierInfo *BoolName = nullptr;
385
386 /// The identifier 'NSObject'.
387 mutable IdentifierInfo *NSObjectName = nullptr;
388
389 /// The identifier 'NSCopying'.
390 IdentifierInfo *NSCopyingName = nullptr;
391
392 /// The identifier '__make_integer_seq'.
393 mutable IdentifierInfo *MakeIntegerSeqName = nullptr;
394
395 /// The identifier '__type_pack_element'.
396 mutable IdentifierInfo *TypePackElementName = nullptr;
397
398 QualType ObjCConstantStringType;
399 mutable RecordDecl *CFConstantStringTagDecl = nullptr;
400 mutable TypedefDecl *CFConstantStringTypeDecl = nullptr;
401
402 mutable QualType ObjCSuperType;
403
404 QualType ObjCNSStringType;
405
406 /// The typedef declaration for the Objective-C "instancetype" type.
407 TypedefDecl *ObjCInstanceTypeDecl = nullptr;
408
409 /// The type for the C FILE type.
410 TypeDecl *FILEDecl = nullptr;
411
412 /// The type for the C jmp_buf type.
413 TypeDecl *jmp_bufDecl = nullptr;
414
415 /// The type for the C sigjmp_buf type.
416 TypeDecl *sigjmp_bufDecl = nullptr;
417
418 /// The type for the C ucontext_t type.
419 TypeDecl *ucontext_tDecl = nullptr;
420
421 /// Type for the Block descriptor for Blocks CodeGen.
422 ///
423 /// Since this is only used for generation of debug info, it is not
424 /// serialized.
425 mutable RecordDecl *BlockDescriptorType = nullptr;
426
427 /// Type for the Block descriptor for Blocks CodeGen.
428 ///
429 /// Since this is only used for generation of debug info, it is not
430 /// serialized.
431 mutable RecordDecl *BlockDescriptorExtendedType = nullptr;
432
433 /// Declaration for the CUDA cudaConfigureCall function.
434 FunctionDecl *cudaConfigureCallDecl = nullptr;
435
436 /// Keeps track of all declaration attributes.
437 ///
438 /// Since so few decls have attrs, we keep them in a hash map instead of
439 /// wasting space in the Decl class.
440 llvm::DenseMap<const Decl*, AttrVec*> DeclAttrs;
441
442 /// A mapping from non-redeclarable declarations in modules that were
443 /// merged with other declarations to the canonical declaration that they were
444 /// merged into.
445 llvm::DenseMap<Decl*, Decl*> MergedDecls;
446
447 /// A mapping from a defining declaration to a list of modules (other
448 /// than the owning module of the declaration) that contain merged
449 /// definitions of that entity.
450 llvm::DenseMap<NamedDecl*, llvm::TinyPtrVector<Module*>> MergedDefModules;
451
452 /// Initializers for a module, in order. Each Decl will be either
453 /// something that has a semantic effect on startup (such as a variable with
454 /// a non-constant initializer), or an ImportDecl (which recursively triggers
455 /// initialization of another module).
456 struct PerModuleInitializers {
457 llvm::SmallVector<Decl*, 4> Initializers;
458 llvm::SmallVector<GlobalDeclID, 4> LazyInitializers;
459
460 void resolve(ASTContext &Ctx);
461 };
462 llvm::DenseMap<Module*, PerModuleInitializers*> ModuleInitializers;
463
464 /// This is the top-level (C++20) Named module we are building.
465 Module *CurrentCXXNamedModule = nullptr;
466
467 static constexpr unsigned ConstantArrayTypesLog2InitSize = 8;
468 static constexpr unsigned GeneralTypesLog2InitSize = 9;
469 static constexpr unsigned FunctionProtoTypesLog2InitSize = 12;
470
471 ASTContext &this_() { return *this; }
472
473public:
474 /// A type synonym for the TemplateOrInstantiation mapping.
476 llvm::PointerUnion<VarTemplateDecl *, MemberSpecializationInfo *>;
477
478private:
479 friend class ASTDeclReader;
480 friend class ASTReader;
481 friend class ASTWriter;
482 template <class> friend class serialization::AbstractTypeReader;
483 friend class CXXRecordDecl;
484 friend class IncrementalParser;
485
486 /// A mapping to contain the template or declaration that
487 /// a variable declaration describes or was instantiated from,
488 /// respectively.
489 ///
490 /// For non-templates, this value will be NULL. For variable
491 /// declarations that describe a variable template, this will be a
492 /// pointer to a VarTemplateDecl. For static data members
493 /// of class template specializations, this will be the
494 /// MemberSpecializationInfo referring to the member variable that was
495 /// instantiated or specialized. Thus, the mapping will keep track of
496 /// the static data member templates from which static data members of
497 /// class template specializations were instantiated.
498 ///
499 /// Given the following example:
500 ///
501 /// \code
502 /// template<typename T>
503 /// struct X {
504 /// static T value;
505 /// };
506 ///
507 /// template<typename T>
508 /// T X<T>::value = T(17);
509 ///
510 /// int *x = &X<int>::value;
511 /// \endcode
512 ///
513 /// This mapping will contain an entry that maps from the VarDecl for
514 /// X<int>::value to the corresponding VarDecl for X<T>::value (within the
515 /// class template X) and will be marked TSK_ImplicitInstantiation.
516 llvm::DenseMap<const VarDecl *, TemplateOrSpecializationInfo>
517 TemplateOrInstantiation;
518
519 /// Keeps track of the declaration from which a using declaration was
520 /// created during instantiation.
521 ///
522 /// The source and target declarations are always a UsingDecl, an
523 /// UnresolvedUsingValueDecl, or an UnresolvedUsingTypenameDecl.
524 ///
525 /// For example:
526 /// \code
527 /// template<typename T>
528 /// struct A {
529 /// void f();
530 /// };
531 ///
532 /// template<typename T>
533 /// struct B : A<T> {
534 /// using A<T>::f;
535 /// };
536 ///
537 /// template struct B<int>;
538 /// \endcode
539 ///
540 /// This mapping will contain an entry that maps from the UsingDecl in
541 /// B<int> to the UnresolvedUsingDecl in B<T>.
542 llvm::DenseMap<NamedDecl *, NamedDecl *> InstantiatedFromUsingDecl;
543
544 /// Like InstantiatedFromUsingDecl, but for using-enum-declarations. Maps
545 /// from the instantiated using-enum to the templated decl from whence it
546 /// came.
547 /// Note that using-enum-declarations cannot be dependent and
548 /// thus will never be instantiated from an "unresolved"
549 /// version thereof (as with using-declarations), so each mapping is from
550 /// a (resolved) UsingEnumDecl to a (resolved) UsingEnumDecl.
551 llvm::DenseMap<UsingEnumDecl *, UsingEnumDecl *>
552 InstantiatedFromUsingEnumDecl;
553
554 /// Simlarly maps instantiated UsingShadowDecls to their origin.
555 llvm::DenseMap<UsingShadowDecl*, UsingShadowDecl*>
556 InstantiatedFromUsingShadowDecl;
557
558 llvm::DenseMap<FieldDecl *, FieldDecl *> InstantiatedFromUnnamedFieldDecl;
559
560 /// Mapping that stores the methods overridden by a given C++
561 /// member function.
562 ///
563 /// Since most C++ member functions aren't virtual and therefore
564 /// don't override anything, we store the overridden functions in
565 /// this map on the side rather than within the CXXMethodDecl structure.
566 using CXXMethodVector = llvm::TinyPtrVector<const CXXMethodDecl *>;
567 llvm::DenseMap<const CXXMethodDecl *, CXXMethodVector> OverriddenMethods;
568
569 /// Mapping from each declaration context to its corresponding
570 /// mangling numbering context (used for constructs like lambdas which
571 /// need to be consistently numbered for the mangler).
572 llvm::DenseMap<const DeclContext *, std::unique_ptr<MangleNumberingContext>>
573 MangleNumberingContexts;
574 llvm::DenseMap<const Decl *, std::unique_ptr<MangleNumberingContext>>
575 ExtraMangleNumberingContexts;
576
577 /// Side-table of mangling numbers for declarations which rarely
578 /// need them (like static local vars).
579 llvm::MapVector<const NamedDecl *, unsigned> MangleNumbers;
580 llvm::MapVector<const VarDecl *, unsigned> StaticLocalNumbers;
581 /// Mapping the associated device lambda mangling number if present.
582 mutable llvm::DenseMap<const CXXRecordDecl *, unsigned>
583 DeviceLambdaManglingNumbers;
584
585 /// Mapping that stores parameterIndex values for ParmVarDecls when
586 /// that value exceeds the bitfield size of ParmVarDeclBits.ParameterIndex.
587 using ParameterIndexTable = llvm::DenseMap<const VarDecl *, unsigned>;
588 ParameterIndexTable ParamIndices;
589
590 ImportDecl *FirstLocalImport = nullptr;
591 ImportDecl *LastLocalImport = nullptr;
592
593 TranslationUnitDecl *TUDecl = nullptr;
594 mutable ExternCContextDecl *ExternCContext = nullptr;
595 mutable BuiltinTemplateDecl *MakeIntegerSeqDecl = nullptr;
596 mutable BuiltinTemplateDecl *TypePackElementDecl = nullptr;
597
598 /// The associated SourceManager object.
599 SourceManager &SourceMgr;
600
601 /// The language options used to create the AST associated with
602 /// this ASTContext object.
603 LangOptions &LangOpts;
604
605 /// NoSanitizeList object that is used by sanitizers to decide which
606 /// entities should not be instrumented.
607 std::unique_ptr<NoSanitizeList> NoSanitizeL;
608
609 /// Function filtering mechanism to determine whether a given function
610 /// should be imbued with the XRay "always" or "never" attributes.
611 std::unique_ptr<XRayFunctionFilter> XRayFilter;
612
613 /// ProfileList object that is used by the profile instrumentation
614 /// to decide which entities should be instrumented.
615 std::unique_ptr<ProfileList> ProfList;
616
617 /// The allocator used to create AST objects.
618 ///
619 /// AST objects are never destructed; rather, all memory associated with the
620 /// AST objects will be released when the ASTContext itself is destroyed.
621 mutable llvm::BumpPtrAllocator BumpAlloc;
622
623 /// Allocator for partial diagnostics.
625
626 /// The current C++ ABI.
627 std::unique_ptr<CXXABI> ABI;
629
630 /// Address space map mangling must be used with language specific
631 /// address spaces (e.g. OpenCL/CUDA)
632 bool AddrSpaceMapMangling;
633
634 const TargetInfo *Target = nullptr;
635 const TargetInfo *AuxTarget = nullptr;
637 std::unique_ptr<interp::Context> InterpContext;
638 std::unique_ptr<ParentMapContext> ParentMapCtx;
639
640 /// Keeps track of the deallocated DeclListNodes for future reuse.
641 DeclListNode *ListNodeFreeList = nullptr;
642
643public:
651
652 /// Returns the clang bytecode interpreter context.
654
656 /// Do not allow wrong-sided variables in constant expressions.
657 bool NoWrongSidedVars = false;
662 CUDAConstantEvalContextRAII(ASTContext &Ctx_, bool NoWrongSidedVars)
663 : Ctx(Ctx_), SavedCtx(Ctx_.CUDAConstantEvalCtx) {
664 Ctx_.CUDAConstantEvalCtx.NoWrongSidedVars = NoWrongSidedVars;
665 }
667 };
668
669 /// Returns the dynamic AST node parent map context.
671
672 // A traversal scope limits the parts of the AST visible to certain analyses.
673 // RecursiveASTVisitor only visits specified children of TranslationUnitDecl.
674 // getParents() will only observe reachable parent edges.
675 //
676 // The scope is defined by a set of "top-level" declarations which will be
677 // visible under the TranslationUnitDecl.
678 // Initially, it is the entire TU, represented by {getTranslationUnitDecl()}.
679 //
680 // After setTraversalScope({foo, bar}), the exposed AST looks like:
681 // TranslationUnitDecl
682 // - foo
683 // - ...
684 // - bar
685 // - ...
686 // All other siblings of foo and bar are pruned from the tree.
687 // (However they are still accessible via TranslationUnitDecl->decls())
688 //
689 // Changing the scope clears the parent cache, which is expensive to rebuild.
690 std::vector<Decl *> getTraversalScope() const { return TraversalScope; }
691 void setTraversalScope(const std::vector<Decl *> &);
692
693 /// Forwards to get node parents from the ParentMapContext. New callers should
694 /// use ParentMapContext::getParents() directly.
695 template <typename NodeT> DynTypedNodeList getParents(const NodeT &Node);
696
698 return PrintingPolicy;
699 }
700
702 PrintingPolicy = Policy;
703 }
704
705 SourceManager& getSourceManager() { return SourceMgr; }
706 const SourceManager& getSourceManager() const { return SourceMgr; }
707
708 // Cleans up some of the data structures. This allows us to do cleanup
709 // normally done in the destructor earlier. Renders much of the ASTContext
710 // unusable, mostly the actual AST nodes, so should be called when we no
711 // longer need access to the AST.
712 void cleanup();
713
714 llvm::BumpPtrAllocator &getAllocator() const {
715 return BumpAlloc;
716 }
717
718 void *Allocate(size_t Size, unsigned Align = 8) const {
719 return BumpAlloc.Allocate(Size, Align);
720 }
721 template <typename T> T *Allocate(size_t Num = 1) const {
722 return static_cast<T *>(Allocate(Num * sizeof(T), alignof(T)));
723 }
724 void Deallocate(void *Ptr) const {}
725
726 /// Allocates a \c DeclListNode or returns one from the \c ListNodeFreeList
727 /// pool.
729 if (DeclListNode *Alloc = ListNodeFreeList) {
730 ListNodeFreeList = Alloc->Rest.dyn_cast<DeclListNode*>();
731 Alloc->D = ND;
732 Alloc->Rest = nullptr;
733 return Alloc;
734 }
735 return new (*this) DeclListNode(ND);
736 }
737 /// Deallcates a \c DeclListNode by returning it to the \c ListNodeFreeList
738 /// pool.
740 N->Rest = ListNodeFreeList;
741 ListNodeFreeList = N;
742 }
743
744 /// Return the total amount of physical memory allocated for representing
745 /// AST nodes and type information.
746 size_t getASTAllocatedMemory() const {
747 return BumpAlloc.getTotalMemory();
748 }
749
750 /// Return the total memory used for various side tables.
751 size_t getSideTableAllocatedMemory() const;
752
754 return DiagAllocator;
755 }
756
757 const TargetInfo &getTargetInfo() const { return *Target; }
758 const TargetInfo *getAuxTargetInfo() const { return AuxTarget; }
759
760 /// getIntTypeForBitwidth -
761 /// sets integer QualTy according to specified details:
762 /// bitwidth, signed/unsigned.
763 /// Returns empty type if there is no appropriate target types.
764 QualType getIntTypeForBitwidth(unsigned DestWidth,
765 unsigned Signed) const;
766
767 /// getRealTypeForBitwidth -
768 /// sets floating point QualTy according to specified bitwidth.
769 /// Returns empty type if there is no appropriate target types.
770 QualType getRealTypeForBitwidth(unsigned DestWidth,
771 FloatModeKind ExplicitType) const;
772
773 bool AtomicUsesUnsupportedLibcall(const AtomicExpr *E) const;
774
775 const LangOptions& getLangOpts() const { return LangOpts; }
776
777 // If this condition is false, typo correction must be performed eagerly
778 // rather than delayed in many places, as it makes use of dependent types.
779 // the condition is false for clang's C-only codepath, as it doesn't support
780 // dependent types yet.
781 bool isDependenceAllowed() const {
782 return LangOpts.CPlusPlus || LangOpts.RecoveryAST;
783 }
784
785 const NoSanitizeList &getNoSanitizeList() const { return *NoSanitizeL; }
786
788 return *XRayFilter;
789 }
790
791 const ProfileList &getProfileList() const { return *ProfList; }
792
794
796 return FullSourceLoc(Loc,SourceMgr);
797 }
798
799 /// Return the C++ ABI kind that should be used. The C++ ABI can be overriden
800 /// at compile time with `-fc++-abi=`. If this is not provided, we instead use
801 /// the default ABI set by the target.
803
804 /// All comments in this translation unit.
806
807 /// True if comments are already loaded from ExternalASTSource.
808 mutable bool CommentsLoaded = false;
809
810 /// Mapping from declaration to directly attached comment.
811 ///
812 /// Raw comments are owned by Comments list. This mapping is populated
813 /// lazily.
814 mutable llvm::DenseMap<const Decl *, const RawComment *> DeclRawComments;
815
816 /// Mapping from canonical declaration to the first redeclaration in chain
817 /// that has a comment attached.
818 ///
819 /// Raw comments are owned by Comments list. This mapping is populated
820 /// lazily.
821 mutable llvm::DenseMap<const Decl *, const Decl *> RedeclChainComments;
822
823 /// Keeps track of redeclaration chains that don't have any comment attached.
824 /// Mapping from canonical declaration to redeclaration chain that has no
825 /// comments attached to any redeclaration. Specifically it's mapping to
826 /// the last redeclaration we've checked.
827 ///
828 /// Shall not contain declarations that have comments attached to any
829 /// redeclaration in their chain.
830 mutable llvm::DenseMap<const Decl *, const Decl *> CommentlessRedeclChains;
831
832 /// Mapping from declarations to parsed comments attached to any
833 /// redeclaration.
834 mutable llvm::DenseMap<const Decl *, comments::FullComment *> ParsedComments;
835
836 /// Attaches \p Comment to \p OriginalD and to its redeclaration chain
837 /// and removes the redeclaration chain from the set of commentless chains.
838 ///
839 /// Don't do anything if a comment has already been attached to \p OriginalD
840 /// or its redeclaration chain.
841 void cacheRawCommentForDecl(const Decl &OriginalD,
842 const RawComment &Comment) const;
843
844 /// \returns searches \p CommentsInFile for doc comment for \p D.
845 ///
846 /// \p RepresentativeLocForDecl is used as a location for searching doc
847 /// comments. \p CommentsInFile is a mapping offset -> comment of files in the
848 /// same file where \p RepresentativeLocForDecl is.
850 const Decl *D, const SourceLocation RepresentativeLocForDecl,
851 const std::map<unsigned, RawComment *> &CommentsInFile) const;
852
853 /// Return the documentation comment attached to a given declaration,
854 /// without looking into cache.
856
857public:
858 void addComment(const RawComment &RC);
859
860 /// Return the documentation comment attached to a given declaration.
861 /// Returns nullptr if no comment is attached.
862 ///
863 /// \param OriginalDecl if not nullptr, is set to declaration AST node that
864 /// had the comment, if the comment we found comes from a redeclaration.
865 const RawComment *
867 const Decl **OriginalDecl = nullptr) const;
868
869 /// Searches existing comments for doc comments that should be attached to \p
870 /// Decls. If any doc comment is found, it is parsed.
871 ///
872 /// Requirement: All \p Decls are in the same file.
873 ///
874 /// If the last comment in the file is already attached we assume
875 /// there are not comments left to be attached to \p Decls.
877 const Preprocessor *PP);
878
879 /// Return parsed documentation comment attached to a given declaration.
880 /// Returns nullptr if no comment is attached.
881 ///
882 /// \param PP the Preprocessor used with this TU. Could be nullptr if
883 /// preprocessor is not available.
885 const Preprocessor *PP) const;
886
887 /// Return parsed documentation comment attached to a given declaration.
888 /// Returns nullptr if no comment is attached. Does not look at any
889 /// redeclarations of the declaration.
891
893 const Decl *D) const;
894
895private:
896 mutable comments::CommandTraits CommentCommandTraits;
897
898 /// Iterator that visits import declarations.
899 class import_iterator {
900 ImportDecl *Import = nullptr;
901
902 public:
903 using value_type = ImportDecl *;
904 using reference = ImportDecl *;
905 using pointer = ImportDecl *;
906 using difference_type = int;
907 using iterator_category = std::forward_iterator_tag;
908
909 import_iterator() = default;
910 explicit import_iterator(ImportDecl *Import) : Import(Import) {}
911
912 reference operator*() const { return Import; }
913 pointer operator->() const { return Import; }
914
915 import_iterator &operator++() {
917 return *this;
918 }
919
920 import_iterator operator++(int) {
921 import_iterator Other(*this);
922 ++(*this);
923 return Other;
924 }
925
926 friend bool operator==(import_iterator X, import_iterator Y) {
927 return X.Import == Y.Import;
928 }
929
930 friend bool operator!=(import_iterator X, import_iterator Y) {
931 return X.Import != Y.Import;
932 }
933 };
934
935public:
937 return CommentCommandTraits;
938 }
939
940 /// Retrieve the attributes for the given declaration.
941 AttrVec& getDeclAttrs(const Decl *D);
942
943 /// Erase the attributes corresponding to the given declaration.
944 void eraseDeclAttrs(const Decl *D);
945
946 /// If this variable is an instantiated static data member of a
947 /// class template specialization, returns the templated static data member
948 /// from which it was instantiated.
949 // FIXME: Remove ?
951 const VarDecl *Var);
952
953 /// Note that the static data member \p Inst is an instantiation of
954 /// the static data member template \p Tmpl of a class template.
957 SourceLocation PointOfInstantiation = SourceLocation());
958
961
964
965 /// If the given using decl \p Inst is an instantiation of
966 /// another (possibly unresolved) using decl, return it.
968
969 /// Remember that the using decl \p Inst is an instantiation
970 /// of the using decl \p Pattern of a class template.
972
973 /// If the given using-enum decl \p Inst is an instantiation of
974 /// another using-enum decl, return it.
976
977 /// Remember that the using enum decl \p Inst is an instantiation
978 /// of the using enum decl \p Pattern of a class template.
980 UsingEnumDecl *Pattern);
981
984 UsingShadowDecl *Pattern);
985
987
989
990 // Access to the set of methods overridden by the given C++ method.
991 using overridden_cxx_method_iterator = CXXMethodVector::const_iterator;
993 overridden_methods_begin(const CXXMethodDecl *Method) const;
994
996 overridden_methods_end(const CXXMethodDecl *Method) const;
997
998 unsigned overridden_methods_size(const CXXMethodDecl *Method) const;
999
1001 llvm::iterator_range<overridden_cxx_method_iterator>;
1002
1004
1005 /// Note that the given C++ \p Method overrides the given \p
1006 /// Overridden method.
1007 void addOverriddenMethod(const CXXMethodDecl *Method,
1008 const CXXMethodDecl *Overridden);
1009
1010 /// Return C++ or ObjC overridden methods for the given \p Method.
1011 ///
1012 /// An ObjC method is considered to override any method in the class's
1013 /// base classes, its protocols, or its categories' protocols, that has
1014 /// the same selector and is of the same kind (class or instance).
1015 /// A method in an implementation is not considered as overriding the same
1016 /// method in the interface or its categories.
1018 const NamedDecl *Method,
1019 SmallVectorImpl<const NamedDecl *> &Overridden) const;
1020
1021 /// Notify the AST context that a new import declaration has been
1022 /// parsed or implicitly created within this translation unit.
1023 void addedLocalImportDecl(ImportDecl *Import);
1024
1026 return Import->getNextLocalImport();
1027 }
1028
1029 using import_range = llvm::iterator_range<import_iterator>;
1030
1032 return import_range(import_iterator(FirstLocalImport), import_iterator());
1033 }
1034
1036 Decl *Result = MergedDecls.lookup(D);
1037 return Result ? Result : D;
1038 }
1039 void setPrimaryMergedDecl(Decl *D, Decl *Primary) {
1040 MergedDecls[D] = Primary;
1041 }
1042
1043 /// Note that the definition \p ND has been merged into module \p M,
1044 /// and should be visible whenever \p M is visible.
1046 bool NotifyListeners = true);
1047
1048 /// Clean up the merged definition list. Call this if you might have
1049 /// added duplicates into the list.
1051
1052 /// Get the additional modules in which the definition \p Def has
1053 /// been merged.
1055
1056 /// Add a declaration to the list of declarations that are initialized
1057 /// for a module. This will typically be a global variable (with internal
1058 /// linkage) that runs module initializers, such as the iostream initializer,
1059 /// or an ImportDecl nominating another module that has initializers.
1061
1063
1064 /// Get the initializations to perform when importing a module, if any.
1066
1067 /// Set the (C++20) module we are building.
1069
1070 /// Get module under construction, nullptr if this is not a C++20 module.
1071 Module *getCurrentNamedModule() const { return CurrentCXXNamedModule; }
1072
1074 return TUDecl->getMostRecentDecl();
1075 }
1077 assert(!TUDecl || TUKind == TU_Incremental);
1079 if (TraversalScope.empty() || TraversalScope.back() == TUDecl)
1080 TraversalScope = {NewTUDecl};
1081 if (TUDecl)
1082 NewTUDecl->setPreviousDecl(TUDecl);
1083 TUDecl = NewTUDecl;
1084 }
1085
1089
1090 // Builtin Types.
1094 CanQualType WCharTy; // [C++ 3.9.1p5].
1095 CanQualType WideCharTy; // Same as WCharTy in C++, integer type in C99.
1096 CanQualType WIntTy; // [C99 7.24.1], integer type unchanged by default promotions.
1097 CanQualType Char8Ty; // [C++20 proposal]
1098 CanQualType Char16Ty; // [C++0x 3.9.1p5], integer type in C99.
1099 CanQualType Char32Ty; // [C++0x 3.9.1p5], integer type in C99.
1105 LongAccumTy; // ISO/IEC JTC1 SC22 WG14 N1169 Extension
1115 CanQualType HalfTy; // [OpenCL 6.1.1.1], ARM NEON
1117 CanQualType Float16Ty; // C11 extension ISO/IEC TS 18661-3
1125#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
1126 CanQualType SingletonId;
1127#include "clang/Basic/OpenCLImageTypes.def"
1133#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
1134 CanQualType Id##Ty;
1135#include "clang/Basic/OpenCLExtensionTypes.def"
1136#define SVE_TYPE(Name, Id, SingletonId) \
1137 CanQualType SingletonId;
1138#include "clang/Basic/AArch64SVEACLETypes.def"
1139#define PPC_VECTOR_TYPE(Name, Id, Size) \
1140 CanQualType Id##Ty;
1141#include "clang/Basic/PPCTypes.def"
1142#define RVV_TYPE(Name, Id, SingletonId) \
1143 CanQualType SingletonId;
1144#include "clang/Basic/RISCVVTypes.def"
1145#define WASM_TYPE(Name, Id, SingletonId) CanQualType SingletonId;
1146#include "clang/Basic/WebAssemblyReferenceTypes.def"
1147
1148 // Types for deductions in C++0x [stmt.ranged]'s desugaring. Built on demand.
1149 mutable QualType AutoDeductTy; // Deduction against 'auto'.
1150 mutable QualType AutoRRefDeductTy; // Deduction against 'auto &&'.
1151
1152 // Decl used to help define __builtin_va_list for some targets.
1153 // The decl is built when constructing 'BuiltinVaListDecl'.
1154 mutable Decl *VaListTagDecl = nullptr;
1155
1156 // Implicitly-declared type 'struct _GUID'.
1157 mutable TagDecl *MSGuidTagDecl = nullptr;
1158
1159 /// Keep track of CUDA/HIP device-side variables ODR-used by host code.
1160 /// This does not include extern shared variables used by device host
1161 /// functions as addresses of shared variables are per warp, therefore
1162 /// cannot be accessed by host code.
1164
1165 /// Keep track of CUDA/HIP external kernels or device variables ODR-used by
1166 /// host code.
1168
1169 /// Keep track of CUDA/HIP implicit host device functions used on device side
1170 /// in device compilation.
1172
1174 SelectorTable &sels, Builtin::Context &builtins,
1176 ASTContext(const ASTContext &) = delete;
1177 ASTContext &operator=(const ASTContext &) = delete;
1178 ~ASTContext();
1179
1180 /// Attach an external AST source to the AST context.
1181 ///
1182 /// The external AST source provides the ability to load parts of
1183 /// the abstract syntax tree as needed from some external storage,
1184 /// e.g., a precompiled header.
1186
1187 /// Retrieve a pointer to the external AST source associated
1188 /// with this AST context, if any.
1190 return ExternalSource.get();
1191 }
1192
1193 /// Attach an AST mutation listener to the AST context.
1194 ///
1195 /// The AST mutation listener provides the ability to track modifications to
1196 /// the abstract syntax tree entities committed after they were initially
1197 /// created.
1199 this->Listener = Listener;
1200 }
1201
1202 /// Retrieve a pointer to the AST mutation listener associated
1203 /// with this AST context, if any.
1205
1206 void PrintStats() const;
1207 const SmallVectorImpl<Type *>& getTypes() const { return Types; }
1208
1210 const IdentifierInfo *II) const;
1211
1212 /// Create a new implicit TU-level CXXRecordDecl or RecordDecl
1213 /// declaration.
1215 StringRef Name,
1216 RecordDecl::TagKind TK = RecordDecl::TagKind::Struct) const;
1217
1218 /// Create a new implicit TU-level typedef declaration.
1219 TypedefDecl *buildImplicitTypedef(QualType T, StringRef Name) const;
1220
1221 /// Retrieve the declaration for the 128-bit signed integer type.
1222 TypedefDecl *getInt128Decl() const;
1223
1224 /// Retrieve the declaration for the 128-bit unsigned integer type.
1225 TypedefDecl *getUInt128Decl() const;
1226
1227 //===--------------------------------------------------------------------===//
1228 // Type Constructors
1229 //===--------------------------------------------------------------------===//
1230
1231private:
1232 /// Return a type with extended qualifiers.
1233 QualType getExtQualType(const Type *Base, Qualifiers Quals) const;
1234
1235 QualType getTypeDeclTypeSlow(const TypeDecl *Decl) const;
1236
1237 QualType getPipeType(QualType T, bool ReadOnly) const;
1238
1239public:
1240 /// Return the uniqued reference to the type for an address space
1241 /// qualified type with the specified type and address space.
1242 ///
1243 /// The resulting type has a union of the qualifiers from T and the address
1244 /// space. If T already has an address space specifier, it is silently
1245 /// replaced.
1246 QualType getAddrSpaceQualType(QualType T, LangAS AddressSpace) const;
1247
1248 /// Remove any existing address space on the type and returns the type
1249 /// with qualifiers intact (or that's the idea anyway)
1250 ///
1251 /// The return type should be T with all prior qualifiers minus the address
1252 /// space.
1254
1255 /// Apply Objective-C protocol qualifiers to the given type.
1256 /// \param allowOnPointerType specifies if we can apply protocol
1257 /// qualifiers on ObjCObjectPointerType. It can be set to true when
1258 /// constructing the canonical type of a Objective-C type parameter.
1260 ArrayRef<ObjCProtocolDecl *> protocols, bool &hasError,
1261 bool allowOnPointerType = false) const;
1262
1263 /// Return the uniqued reference to the type for an Objective-C
1264 /// gc-qualified type.
1265 ///
1266 /// The resulting type has a union of the qualifiers from T and the gc
1267 /// attribute.
1269
1270 /// Remove the existing address space on the type if it is a pointer size
1271 /// address space and return the type with qualifiers intact.
1273
1274 /// Return the uniqued reference to the type for a \c restrict
1275 /// qualified type.
1276 ///
1277 /// The resulting type has a union of the qualifiers from \p T and
1278 /// \c restrict.
1280 return T.withFastQualifiers(Qualifiers::Restrict);
1281 }
1282
1283 /// Return the uniqued reference to the type for a \c volatile
1284 /// qualified type.
1285 ///
1286 /// The resulting type has a union of the qualifiers from \p T and
1287 /// \c volatile.
1289 return T.withFastQualifiers(Qualifiers::Volatile);
1290 }
1291
1292 /// Return the uniqued reference to the type for a \c const
1293 /// qualified type.
1294 ///
1295 /// The resulting type has a union of the qualifiers from \p T and \c const.
1296 ///
1297 /// It can be reasonably expected that this will always be equivalent to
1298 /// calling T.withConst().
1299 QualType getConstType(QualType T) const { return T.withConst(); }
1300
1301 /// Change the ExtInfo on a function type.
1303 FunctionType::ExtInfo EInfo);
1304
1305 /// Adjust the given function result type.
1307
1308 /// Change the result type of a function type once it is deduced.
1310
1311 /// Get a function type and produce the equivalent function type with the
1312 /// specified exception specification. Type sugar that can be present on a
1313 /// declaration of a function with an exception specification is permitted
1314 /// and preserved. Other type sugar (for instance, typedefs) is not.
1316 QualType Orig, const FunctionProtoType::ExceptionSpecInfo &ESI) const;
1317
1318 /// Determine whether two function types are the same, ignoring
1319 /// exception specifications in cases where they're part of the type.
1321
1322 /// Change the exception specification on a function once it is
1323 /// delay-parsed, instantiated, or computed.
1326 bool AsWritten = false);
1327
1328 /// Get a function type and produce the equivalent function type where
1329 /// pointer size address spaces in the return type and parameter tyeps are
1330 /// replaced with the default address space.
1332
1333 /// Determine whether two function types are the same, ignoring pointer sizes
1334 /// in the return type and parameter types.
1336
1337 /// Return the uniqued reference to the type for a complex
1338 /// number with the specified element type.
1342 }
1343
1344 /// Return the uniqued reference to the type for a pointer to
1345 /// the specified type.
1349 }
1350
1351 QualType
1352 getCountAttributedType(QualType T, Expr *CountExpr, bool CountInBytes,
1353 bool OrNull,
1354 ArrayRef<TypeCoupledDeclRefInfo> DependentDecls) const;
1355
1356 /// Return the uniqued reference to a type adjusted from the original
1357 /// type to a new type.
1358 QualType getAdjustedType(QualType Orig, QualType New) const;
1361 getAdjustedType((QualType)Orig, (QualType)New));
1362 }
1363
1364 /// Return the uniqued reference to the decayed version of the given
1365 /// type. Can only be called on array and function types which decay to
1366 /// pointer types.
1370 }
1371 /// Return the uniqued reference to a specified decay from the original
1372 /// type to the decayed type.
1373 QualType getDecayedType(QualType Orig, QualType Decayed) const;
1374
1375 /// Return the uniqued reference to a specified array parameter type from the
1376 /// original array type.
1378
1379 /// Return the uniqued reference to the atomic type for the specified
1380 /// type.
1382
1383 /// Return the uniqued reference to the type for a block of the
1384 /// specified type.
1386
1387 /// Gets the struct used to keep track of the descriptor for pointer to
1388 /// blocks.
1390
1391 /// Return a read_only pipe type for the specified type.
1393
1394 /// Return a write_only pipe type for the specified type.
1396
1397 /// Return a bit-precise integer type with the specified signedness and bit
1398 /// count.
1399 QualType getBitIntType(bool Unsigned, unsigned NumBits) const;
1400
1401 /// Return a dependent bit-precise integer type with the specified signedness
1402 /// and bit count.
1403 QualType getDependentBitIntType(bool Unsigned, Expr *BitsExpr) const;
1404
1405 /// Gets the struct used to keep track of the extended descriptor for
1406 /// pointer to blocks.
1408
1409 /// Map an AST Type to an OpenCLTypeKind enum value.
1410 OpenCLTypeKind getOpenCLTypeKind(const Type *T) const;
1411
1412 /// Get address space for OpenCL type.
1413 LangAS getOpenCLTypeAddrSpace(const Type *T) const;
1414
1415 /// Returns default address space based on OpenCL version and enabled features
1417 return LangOpts.OpenCLGenericAddressSpace ? LangAS::opencl_generic
1419 }
1420
1422 cudaConfigureCallDecl = FD;
1423 }
1424
1426 return cudaConfigureCallDecl;
1427 }
1428
1429 /// Returns true iff we need copy/dispose helpers for the given type.
1430 bool BlockRequiresCopying(QualType Ty, const VarDecl *D);
1431
1432 /// Returns true, if given type has a known lifetime. HasByrefExtendedLayout
1433 /// is set to false in this case. If HasByrefExtendedLayout returns true,
1434 /// byref variable has extended lifetime.
1435 bool getByrefLifetime(QualType Ty,
1436 Qualifiers::ObjCLifetime &Lifetime,
1437 bool &HasByrefExtendedLayout) const;
1438
1439 /// Return the uniqued reference to the type for an lvalue reference
1440 /// to the specified type.
1441 QualType getLValueReferenceType(QualType T, bool SpelledAsLValue = true)
1442 const;
1443
1444 /// Return the uniqued reference to the type for an rvalue reference
1445 /// to the specified type.
1447
1448 /// Return the uniqued reference to the type for a member pointer to
1449 /// the specified type in the specified class.
1450 ///
1451 /// The class \p Cls is a \c Type because it could be a dependent name.
1452 QualType getMemberPointerType(QualType T, const Type *Cls) const;
1453
1454 /// Return a non-unique reference to the type for a variable array of
1455 /// the specified element type.
1457 ArraySizeModifier ASM, unsigned IndexTypeQuals,
1458 SourceRange Brackets) const;
1459
1460 /// Return a non-unique reference to the type for a dependently-sized
1461 /// array of the specified element type.
1462 ///
1463 /// FIXME: We will need these to be uniqued, or at least comparable, at some
1464 /// point.
1467 unsigned IndexTypeQuals,
1468 SourceRange Brackets) const;
1469
1470 /// Return a unique reference to the type for an incomplete array of
1471 /// the specified element type.
1473 unsigned IndexTypeQuals) const;
1474
1475 /// Return the unique reference to the type for a constant array of
1476 /// the specified element type.
1477 QualType getConstantArrayType(QualType EltTy, const llvm::APInt &ArySize,
1478 const Expr *SizeExpr, ArraySizeModifier ASM,
1479 unsigned IndexTypeQuals) const;
1480
1481 /// Return a type for a constant array for a string literal of the
1482 /// specified element type and length.
1483 QualType getStringLiteralArrayType(QualType EltTy, unsigned Length) const;
1484
1485 /// Returns a vla type where known sizes are replaced with [*].
1487
1488 // Convenience struct to return information about a builtin vector type.
1491 llvm::ElementCount EC;
1492 unsigned NumVectors;
1494 unsigned NumVectors)
1496 };
1497
1498 /// Returns the element type, element count and number of vectors
1499 /// (in case of tuple) for a builtin vector type.
1500 BuiltinVectorTypeInfo
1501 getBuiltinVectorTypeInfo(const BuiltinType *VecTy) const;
1502
1503 /// Return the unique reference to a scalable vector type of the specified
1504 /// element type and scalable number of elements.
1505 /// For RISC-V, number of fields is also provided when it fetching for
1506 /// tuple type.
1507 ///
1508 /// \pre \p EltTy must be a built-in type.
1509 QualType getScalableVectorType(QualType EltTy, unsigned NumElts,
1510 unsigned NumFields = 1) const;
1511
1512 /// Return a WebAssembly externref type.
1514
1515 /// Return the unique reference to a vector type of the specified
1516 /// element type and size.
1517 ///
1518 /// \pre \p VectorType must be a built-in type.
1519 QualType getVectorType(QualType VectorType, unsigned NumElts,
1520 VectorKind VecKind) const;
1521 /// Return the unique reference to the type for a dependently sized vector of
1522 /// the specified element type.
1524 SourceLocation AttrLoc,
1525 VectorKind VecKind) const;
1526
1527 /// Return the unique reference to an extended vector type
1528 /// of the specified element type and size.
1529 ///
1530 /// \pre \p VectorType must be a built-in type.
1531 QualType getExtVectorType(QualType VectorType, unsigned NumElts) const;
1532
1533 /// \pre Return a non-unique reference to the type for a dependently-sized
1534 /// vector of the specified element type.
1535 ///
1536 /// FIXME: We will need these to be uniqued, or at least comparable, at some
1537 /// point.
1539 Expr *SizeExpr,
1540 SourceLocation AttrLoc) const;
1541
1542 /// Return the unique reference to the matrix type of the specified element
1543 /// type and size
1544 ///
1545 /// \pre \p ElementType must be a valid matrix element type (see
1546 /// MatrixType::isValidElementType).
1547 QualType getConstantMatrixType(QualType ElementType, unsigned NumRows,
1548 unsigned NumColumns) const;
1549
1550 /// Return the unique reference to the matrix type of the specified element
1551 /// type and size
1552 QualType getDependentSizedMatrixType(QualType ElementType, Expr *RowExpr,
1553 Expr *ColumnExpr,
1554 SourceLocation AttrLoc) const;
1555
1557 Expr *AddrSpaceExpr,
1558 SourceLocation AttrLoc) const;
1559
1560 /// Return a K&R style C function type like 'int()'.
1562 const FunctionType::ExtInfo &Info) const;
1563
1566 }
1567
1568 /// Return a normal function type with a typed argument list.
1570 const FunctionProtoType::ExtProtoInfo &EPI) const {
1571 return getFunctionTypeInternal(ResultTy, Args, EPI, false);
1572 }
1573
1575
1576private:
1577 /// Return a normal function type with a typed argument list.
1578 QualType getFunctionTypeInternal(QualType ResultTy, ArrayRef<QualType> Args,
1580 bool OnlyWantCanonical) const;
1581 QualType
1582 getAutoTypeInternal(QualType DeducedType, AutoTypeKeyword Keyword,
1583 bool IsDependent, bool IsPack = false,
1584 ConceptDecl *TypeConstraintConcept = nullptr,
1585 ArrayRef<TemplateArgument> TypeConstraintArgs = {},
1586 bool IsCanon = false) const;
1587
1588public:
1589 /// Return the unique reference to the type for the specified type
1590 /// declaration.
1592 const TypeDecl *PrevDecl = nullptr) const {
1593 assert(Decl && "Passed null for Decl param");
1594 if (Decl->TypeForDecl) return QualType(Decl->TypeForDecl, 0);
1595
1596 if (PrevDecl) {
1597 assert(PrevDecl->TypeForDecl && "previous decl has no TypeForDecl");
1598 Decl->TypeForDecl = PrevDecl->TypeForDecl;
1599 return QualType(PrevDecl->TypeForDecl, 0);
1600 }
1601
1602 return getTypeDeclTypeSlow(Decl);
1603 }
1604
1606 QualType Underlying) const;
1607
1608 /// Return the unique reference to the type for the specified
1609 /// typedef-name decl.
1611 QualType Underlying = QualType()) const;
1612
1613 QualType getRecordType(const RecordDecl *Decl) const;
1614
1615 QualType getEnumType(const EnumDecl *Decl) const;
1616
1617 QualType
1619
1621
1622 QualType getAttributedType(attr::Kind attrKind, QualType modifiedType,
1623 QualType equivalentType) const;
1624
1625 QualType getBTFTagAttributedType(const BTFTypeTagAttr *BTFAttr,
1626 QualType Wrapped);
1627
1628 QualType
1629 getSubstTemplateTypeParmType(QualType Replacement, Decl *AssociatedDecl,
1630 unsigned Index,
1631 std::optional<unsigned> PackIndex) const;
1633 unsigned Index, bool Final,
1634 const TemplateArgument &ArgPack);
1635
1636 QualType
1637 getTemplateTypeParmType(unsigned Depth, unsigned Index,
1638 bool ParameterPack,
1639 TemplateTypeParmDecl *ParmDecl = nullptr) const;
1640
1643 QualType Canon = QualType()) const;
1644
1645 QualType
1647 ArrayRef<TemplateArgument> Args) const;
1648
1651 QualType Canon = QualType()) const;
1652
1655 const TemplateArgumentListInfo &Args,
1656 QualType Canon = QualType()) const;
1657
1658 QualType getParenType(QualType NamedType) const;
1659
1661 const IdentifierInfo *MacroII) const;
1662
1664 NestedNameSpecifier *NNS, QualType NamedType,
1665 TagDecl *OwnedTagDecl = nullptr) const;
1668 const IdentifierInfo *Name,
1669 QualType Canon = QualType()) const;
1670
1673 const IdentifierInfo *Name, ArrayRef<TemplateArgumentLoc> Args) const;
1676 const IdentifierInfo *Name, ArrayRef<TemplateArgument> Args) const;
1677
1679
1680 /// Get a template argument list with one argument per template parameter
1681 /// in a template parameter list, such as for the injected class name of
1682 /// a class template.
1685
1686 /// Form a pack expansion type with the given pattern.
1687 /// \param NumExpansions The number of expansions for the pack, if known.
1688 /// \param ExpectPackInType If \c false, we should not expect \p Pattern to
1689 /// contain an unexpanded pack. This only makes sense if the pack
1690 /// expansion is used in a context where the arity is inferred from
1691 /// elsewhere, such as if the pattern contains a placeholder type or
1692 /// if this is the canonical type of another pack expansion type.
1694 std::optional<unsigned> NumExpansions,
1695 bool ExpectPackInType = true);
1696
1698 ObjCInterfaceDecl *PrevDecl = nullptr) const;
1699
1700 /// Legacy interface: cannot provide type arguments or __kindof.
1702 ObjCProtocolDecl * const *Protocols,
1703 unsigned NumProtocols) const;
1704
1706 ArrayRef<QualType> typeArgs,
1708 bool isKindOf) const;
1709
1711 ArrayRef<ObjCProtocolDecl *> protocols) const;
1713 ObjCTypeParamDecl *New) const;
1714
1716
1717 /// QIdProtocolsAdoptObjCObjectProtocols - Checks that protocols in
1718 /// QT's qualified-id protocol list adopt all protocols in IDecl's list
1719 /// of protocols.
1721 ObjCInterfaceDecl *IDecl);
1722
1723 /// Return a ObjCObjectPointerType type for the given ObjCObjectType.
1725
1726 /// C23 feature and GCC extension.
1727 QualType getTypeOfExprType(Expr *E, TypeOfKind Kind) const;
1728 QualType getTypeOfType(QualType QT, TypeOfKind Kind) const;
1729
1730 QualType getReferenceQualifiedType(const Expr *e) const;
1731
1732 /// C++11 decltype.
1733 QualType getDecltypeType(Expr *e, QualType UnderlyingType) const;
1734
1735 QualType getPackIndexingType(QualType Pattern, Expr *IndexExpr,
1736 bool FullySubstituted = false,
1737 ArrayRef<QualType> Expansions = {},
1738 int Index = -1) const;
1739
1740 /// Unary type transforms
1741 QualType getUnaryTransformType(QualType BaseType, QualType UnderlyingType,
1742 UnaryTransformType::UTTKind UKind) const;
1743
1744 /// C++11 deduced auto type.
1745 QualType getAutoType(QualType DeducedType, AutoTypeKeyword Keyword,
1746 bool IsDependent, bool IsPack = false,
1747 ConceptDecl *TypeConstraintConcept = nullptr,
1748 ArrayRef<TemplateArgument> TypeConstraintArgs ={}) const;
1749
1750 /// C++11 deduction pattern for 'auto' type.
1751 QualType getAutoDeductType() const;
1752
1753 /// C++11 deduction pattern for 'auto &&' type.
1754 QualType getAutoRRefDeductType() const;
1755
1756 /// Remove any type constraints from a template parameter type, for
1757 /// equivalence comparison of template parameters.
1758 QualType getUnconstrainedType(QualType T) const;
1759
1760 /// C++17 deduced class template specialization type.
1761 QualType getDeducedTemplateSpecializationType(TemplateName Template,
1762 QualType DeducedType,
1763 bool IsDependent) const;
1764
1765 /// Return the unique reference to the type for the specified TagDecl
1766 /// (struct/union/class/enum) decl.
1767 QualType getTagDeclType(const TagDecl *Decl) const;
1768
1769 /// Return the unique type for "size_t" (C99 7.17), defined in
1770 /// <stddef.h>.
1771 ///
1772 /// The sizeof operator requires this (C99 6.5.3.4p4).
1773 CanQualType getSizeType() const;
1774
1775 /// Return the unique signed counterpart of
1776 /// the integer type corresponding to size_t.
1778
1779 /// Return the unique type for "intmax_t" (C99 7.18.1.5), defined in
1780 /// <stdint.h>.
1781 CanQualType getIntMaxType() const;
1782
1783 /// Return the unique type for "uintmax_t" (C99 7.18.1.5), defined in
1784 /// <stdint.h>.
1786
1787 /// Return the unique wchar_t type available in C++ (and available as
1788 /// __wchar_t as a Microsoft extension).
1789 QualType getWCharType() const { return WCharTy; }
1790
1791 /// Return the type of wide characters. In C++, this returns the
1792 /// unique wchar_t type. In C99, this returns a type compatible with the type
1793 /// defined in <stddef.h> as defined by the target.
1795
1796 /// Return the type of "signed wchar_t".
1797 ///
1798 /// Used when in C++, as a GCC extension.
1800
1801 /// Return the type of "unsigned wchar_t".
1802 ///
1803 /// Used when in C++, as a GCC extension.
1805
1806 /// In C99, this returns a type compatible with the type
1807 /// defined in <stddef.h> as defined by the target.
1808 QualType getWIntType() const { return WIntTy; }
1809
1810 /// Return a type compatible with "intptr_t" (C99 7.18.1.4),
1811 /// as defined by the target.
1812 QualType getIntPtrType() const;
1813
1814 /// Return a type compatible with "uintptr_t" (C99 7.18.1.4),
1815 /// as defined by the target.
1816 QualType getUIntPtrType() const;
1817
1818 /// Return the unique type for "ptrdiff_t" (C99 7.17) defined in
1819 /// <stddef.h>. Pointer - pointer requires this (C99 6.5.6p9).
1821
1822 /// Return the unique unsigned counterpart of "ptrdiff_t"
1823 /// integer type. The standard (C11 7.21.6.1p7) refers to this type
1824 /// in the definition of %tu format specifier.
1826
1827 /// Return the unique type for "pid_t" defined in
1828 /// <sys/types.h>. We need this to compute the correct type for vfork().
1829 QualType getProcessIDType() const;
1830
1831 /// Return the C structure type used to represent constant CFStrings.
1833
1834 /// Returns the C struct type for objc_super
1835 QualType getObjCSuperType() const;
1836 void setObjCSuperType(QualType ST) { ObjCSuperType = ST; }
1837
1838 /// Get the structure type used to representation CFStrings, or NULL
1839 /// if it hasn't yet been built.
1841 if (CFConstantStringTypeDecl)
1842 return getTypedefType(CFConstantStringTypeDecl);
1843 return QualType();
1844 }
1848
1849 // This setter/getter represents the ObjC type for an NSConstantString.
1852 return ObjCConstantStringType;
1853 }
1854
1856 return ObjCNSStringType;
1857 }
1858
1860 ObjCNSStringType = T;
1861 }
1862
1863 /// Retrieve the type that \c id has been defined to, which may be
1864 /// different from the built-in \c id if \c id has been typedef'd.
1866 if (ObjCIdRedefinitionType.isNull())
1867 return getObjCIdType();
1868 return ObjCIdRedefinitionType;
1869 }
1870
1871 /// Set the user-written type that redefines \c id.
1873 ObjCIdRedefinitionType = RedefType;
1874 }
1875
1876 /// Retrieve the type that \c Class has been defined to, which may be
1877 /// different from the built-in \c Class if \c Class has been typedef'd.
1879 if (ObjCClassRedefinitionType.isNull())
1880 return getObjCClassType();
1881 return ObjCClassRedefinitionType;
1882 }
1883
1884 /// Set the user-written type that redefines 'SEL'.
1886 ObjCClassRedefinitionType = RedefType;
1887 }
1888
1889 /// Retrieve the type that 'SEL' has been defined to, which may be
1890 /// different from the built-in 'SEL' if 'SEL' has been typedef'd.
1892 if (ObjCSelRedefinitionType.isNull())
1893 return getObjCSelType();
1894 return ObjCSelRedefinitionType;
1895 }
1896
1897 /// Set the user-written type that redefines 'SEL'.
1899 ObjCSelRedefinitionType = RedefType;
1900 }
1901
1902 /// Retrieve the identifier 'NSObject'.
1904 if (!NSObjectName) {
1905 NSObjectName = &Idents.get("NSObject");
1906 }
1907
1908 return NSObjectName;
1909 }
1910
1911 /// Retrieve the identifier 'NSCopying'.
1913 if (!NSCopyingName) {
1914 NSCopyingName = &Idents.get("NSCopying");
1915 }
1916
1917 return NSCopyingName;
1918 }
1919
1921
1923
1924 /// Retrieve the identifier 'bool'.
1926 if (!BoolName)
1927 BoolName = &Idents.get("bool");
1928 return BoolName;
1929 }
1930
1932 if (!MakeIntegerSeqName)
1933 MakeIntegerSeqName = &Idents.get("__make_integer_seq");
1934 return MakeIntegerSeqName;
1935 }
1936
1938 if (!TypePackElementName)
1939 TypePackElementName = &Idents.get("__type_pack_element");
1940 return TypePackElementName;
1941 }
1942
1943 /// Retrieve the Objective-C "instancetype" type, if already known;
1944 /// otherwise, returns a NULL type;
1947 }
1948
1949 /// Retrieve the typedef declaration corresponding to the Objective-C
1950 /// "instancetype" type.
1952
1953 /// Set the type for the C FILE type.
1954 void setFILEDecl(TypeDecl *FILEDecl) { this->FILEDecl = FILEDecl; }
1955
1956 /// Retrieve the C FILE type.
1958 if (FILEDecl)
1959 return getTypeDeclType(FILEDecl);
1960 return QualType();
1961 }
1962
1963 /// Set the type for the C jmp_buf type.
1964 void setjmp_bufDecl(TypeDecl *jmp_bufDecl) {
1965 this->jmp_bufDecl = jmp_bufDecl;
1966 }
1967
1968 /// Retrieve the C jmp_buf type.
1970 if (jmp_bufDecl)
1971 return getTypeDeclType(jmp_bufDecl);
1972 return QualType();
1973 }
1974
1975 /// Set the type for the C sigjmp_buf type.
1976 void setsigjmp_bufDecl(TypeDecl *sigjmp_bufDecl) {
1977 this->sigjmp_bufDecl = sigjmp_bufDecl;
1978 }
1979
1980 /// Retrieve the C sigjmp_buf type.
1982 if (sigjmp_bufDecl)
1983 return getTypeDeclType(sigjmp_bufDecl);
1984 return QualType();
1985 }
1986
1987 /// Set the type for the C ucontext_t type.
1988 void setucontext_tDecl(TypeDecl *ucontext_tDecl) {
1989 this->ucontext_tDecl = ucontext_tDecl;
1990 }
1991
1992 /// Retrieve the C ucontext_t type.
1994 if (ucontext_tDecl)
1995 return getTypeDeclType(ucontext_tDecl);
1996 return QualType();
1997 }
1998
1999 /// The result type of logical operations, '<', '>', '!=', etc.
2001 return getLangOpts().CPlusPlus ? BoolTy : IntTy;
2002 }
2003
2004 /// Emit the Objective-CC type encoding for the given type \p T into
2005 /// \p S.
2006 ///
2007 /// If \p Field is specified then record field names are also encoded.
2008 void getObjCEncodingForType(QualType T, std::string &S,
2009 const FieldDecl *Field=nullptr,
2010 QualType *NotEncodedT=nullptr) const;
2011
2012 /// Emit the Objective-C property type encoding for the given
2013 /// type \p T into \p S.
2014 void getObjCEncodingForPropertyType(QualType T, std::string &S) const;
2015
2017
2018 /// Put the string version of the type qualifiers \p QT into \p S.
2020 std::string &S) const;
2021
2022 /// Emit the encoded type for the function \p Decl into \p S.
2023 ///
2024 /// This is in the same format as Objective-C method encodings.
2025 ///
2026 /// \returns true if an error occurred (e.g., because one of the parameter
2027 /// types is incomplete), false otherwise.
2028 std::string getObjCEncodingForFunctionDecl(const FunctionDecl *Decl) const;
2029
2030 /// Emit the encoded type for the method declaration \p Decl into
2031 /// \p S.
2033 bool Extended = false) const;
2034
2035 /// Return the encoded type for this block declaration.
2036 std::string getObjCEncodingForBlock(const BlockExpr *blockExpr) const;
2037
2038 /// getObjCEncodingForPropertyDecl - Return the encoded type for
2039 /// this method declaration. If non-NULL, Container must be either
2040 /// an ObjCCategoryImplDecl or ObjCImplementationDecl; it should
2041 /// only be NULL when getting encodings for protocol properties.
2043 const Decl *Container) const;
2044
2046 ObjCProtocolDecl *rProto) const;
2047
2049 const ObjCPropertyDecl *PD,
2050 const Decl *Container) const;
2051
2052 /// Return the size of type \p T for Objective-C encoding purpose,
2053 /// in characters.
2055
2056 /// Retrieve the typedef corresponding to the predefined \c id type
2057 /// in Objective-C.
2058 TypedefDecl *getObjCIdDecl() const;
2059
2060 /// Represents the Objective-CC \c id type.
2061 ///
2062 /// This is set up lazily, by Sema. \c id is always a (typedef for a)
2063 /// pointer type, a pointer to a struct.
2066 }
2067
2068 /// Retrieve the typedef corresponding to the predefined 'SEL' type
2069 /// in Objective-C.
2070 TypedefDecl *getObjCSelDecl() const;
2071
2072 /// Retrieve the type that corresponds to the predefined Objective-C
2073 /// 'SEL' type.
2076 }
2077
2078 /// Retrieve the typedef declaration corresponding to the predefined
2079 /// Objective-C 'Class' type.
2081
2082 /// Represents the Objective-C \c Class type.
2083 ///
2084 /// This is set up lazily, by Sema. \c Class is always a (typedef for a)
2085 /// pointer type, a pointer to a struct.
2088 }
2089
2090 /// Retrieve the Objective-C class declaration corresponding to
2091 /// the predefined \c Protocol class.
2093
2094 /// Retrieve declaration of 'BOOL' typedef
2096 return BOOLDecl;
2097 }
2098
2099 /// Save declaration of 'BOOL' typedef
2101 BOOLDecl = TD;
2102 }
2103
2104 /// type of 'BOOL' type.
2106 return getTypeDeclType(getBOOLDecl());
2107 }
2108
2109 /// Retrieve the type of the Objective-C \c Protocol class.
2112 }
2113
2114 /// Retrieve the C type declaration corresponding to the predefined
2115 /// \c __builtin_va_list type.
2117
2118 /// Retrieve the type of the \c __builtin_va_list type.
2121 }
2122
2123 /// Retrieve the C type declaration corresponding to the predefined
2124 /// \c __va_list_tag type used to help define the \c __builtin_va_list type
2125 /// for some targets.
2126 Decl *getVaListTagDecl() const;
2127
2128 /// Retrieve the C type declaration corresponding to the predefined
2129 /// \c __builtin_ms_va_list type.
2131
2132 /// Retrieve the type of the \c __builtin_ms_va_list type.
2135 }
2136
2137 /// Retrieve the implicitly-predeclared 'struct _GUID' declaration.
2139
2140 /// Retrieve the implicitly-predeclared 'struct _GUID' type.
2142 assert(MSGuidTagDecl && "asked for GUID type but MS extensions disabled");
2144 }
2145
2146 /// Return whether a declaration to a builtin is allowed to be
2147 /// overloaded/redeclared.
2148 bool canBuiltinBeRedeclared(const FunctionDecl *) const;
2149
2150 /// Return a type with additional \c const, \c volatile, or
2151 /// \c restrict qualifiers.
2154 }
2155
2156 /// Un-split a SplitQualType.
2158 return getQualifiedType(split.Ty, split.Quals);
2159 }
2160
2161 /// Return a type with additional qualifiers.
2163 if (!Qs.hasNonFastQualifiers())
2164 return T.withFastQualifiers(Qs.getFastQualifiers());
2165 QualifierCollector Qc(Qs);
2166 const Type *Ptr = Qc.strip(T);
2167 return getExtQualType(Ptr, Qc);
2168 }
2169
2170 /// Return a type with additional qualifiers.
2172 if (!Qs.hasNonFastQualifiers())
2173 return QualType(T, Qs.getFastQualifiers());
2174 return getExtQualType(T, Qs);
2175 }
2176
2177 /// Return a type with the given lifetime qualifier.
2178 ///
2179 /// \pre Neither type.ObjCLifetime() nor \p lifetime may be \c OCL_None.
2181 Qualifiers::ObjCLifetime lifetime) {
2182 assert(type.getObjCLifetime() == Qualifiers::OCL_None);
2183 assert(lifetime != Qualifiers::OCL_None);
2184
2185 Qualifiers qs;
2186 qs.addObjCLifetime(lifetime);
2187 return getQualifiedType(type, qs);
2188 }
2189
2190 /// getUnqualifiedObjCPointerType - Returns version of
2191 /// Objective-C pointer type with lifetime qualifier removed.
2193 if (!type.getTypePtr()->isObjCObjectPointerType() ||
2194 !type.getQualifiers().hasObjCLifetime())
2195 return type;
2196 Qualifiers Qs = type.getQualifiers();
2197 Qs.removeObjCLifetime();
2198 return getQualifiedType(type.getUnqualifiedType(), Qs);
2199 }
2200
2201 /// \brief Return a type with the given __ptrauth qualifier.
2203 assert(!Ty.getPointerAuth());
2204 assert(PointerAuth);
2205
2206 Qualifiers Qs;
2207 Qs.setPointerAuth(PointerAuth);
2208 return getQualifiedType(Ty, Qs);
2209 }
2210
2211 unsigned char getFixedPointScale(QualType Ty) const;
2212 unsigned char getFixedPointIBits(QualType Ty) const;
2213 llvm::FixedPointSemantics getFixedPointSemantics(QualType Ty) const;
2214 llvm::APFixedPoint getFixedPointMax(QualType Ty) const;
2215 llvm::APFixedPoint getFixedPointMin(QualType Ty) const;
2216
2218 SourceLocation NameLoc) const;
2219
2221 UnresolvedSetIterator End) const;
2223
2225 bool TemplateKeyword,
2226 TemplateName Template) const;
2227
2229 const IdentifierInfo *Name) const;
2231 OverloadedOperatorKind Operator) const;
2233 getSubstTemplateTemplateParm(TemplateName replacement, Decl *AssociatedDecl,
2234 unsigned Index,
2235 std::optional<unsigned> PackIndex) const;
2237 Decl *AssociatedDecl,
2238 unsigned Index,
2239 bool Final) const;
2240
2242 /// No error
2244
2245 /// Missing a type
2247
2248 /// Missing a type from <stdio.h>
2250
2251 /// Missing a type from <setjmp.h>
2253
2254 /// Missing a type from <ucontext.h>
2257
2258 QualType DecodeTypeStr(const char *&Str, const ASTContext &Context,
2260 bool &RequireICE, bool AllowTypeModifiers) const;
2261
2262 /// Return the type for the specified builtin.
2263 ///
2264 /// If \p IntegerConstantArgs is non-null, it is filled in with a bitmask of
2265 /// arguments to the builtin that are required to be integer constant
2266 /// expressions.
2268 unsigned *IntegerConstantArgs = nullptr) const;
2269
2270 /// Types and expressions required to build C++2a three-way comparisons
2271 /// using operator<=>, including the values return by builtin <=> operators.
2273
2274private:
2275 CanQualType getFromTargetType(unsigned Type) const;
2276 TypeInfo getTypeInfoImpl(const Type *T) const;
2277
2278 //===--------------------------------------------------------------------===//
2279 // Type Predicates.
2280 //===--------------------------------------------------------------------===//
2281
2282public:
2283 /// Return one of the GCNone, Weak or Strong Objective-C garbage
2284 /// collection attributes.
2286
2287 /// Return true if the given vector types are of the same unqualified
2288 /// type or if they are equivalent to the same GCC vector type.
2289 ///
2290 /// \note This ignores whether they are target-specific (AltiVec or Neon)
2291 /// types.
2292 bool areCompatibleVectorTypes(QualType FirstVec, QualType SecondVec);
2293
2294 /// Return true if the given types are an SVE builtin and a VectorType that
2295 /// is a fixed-length representation of the SVE builtin for a specific
2296 /// vector-length.
2297 bool areCompatibleSveTypes(QualType FirstType, QualType SecondType);
2298
2299 /// Return true if the given vector types are lax-compatible SVE vector types,
2300 /// false otherwise.
2301 bool areLaxCompatibleSveTypes(QualType FirstType, QualType SecondType);
2302
2303 /// Return true if the given types are an RISC-V vector builtin type and a
2304 /// VectorType that is a fixed-length representation of the RISC-V vector
2305 /// builtin type for a specific vector-length.
2306 bool areCompatibleRVVTypes(QualType FirstType, QualType SecondType);
2307
2308 /// Return true if the given vector types are lax-compatible RISC-V vector
2309 /// types as defined by -flax-vector-conversions=, which permits implicit
2310 /// conversions between vectors with different number of elements and/or
2311 /// incompatible element types, false otherwise.
2312 bool areLaxCompatibleRVVTypes(QualType FirstType, QualType SecondType);
2313
2314 /// Return true if the type has been explicitly qualified with ObjC ownership.
2315 /// A type may be implicitly qualified with ownership under ObjC ARC, and in
2316 /// some cases the compiler treats these differently.
2318
2319 /// Return true if this is an \c NSObject object with its \c NSObject
2320 /// attribute set.
2322 return Ty->isObjCNSObjectType();
2323 }
2324
2325 //===--------------------------------------------------------------------===//
2326 // Type Sizing and Analysis
2327 //===--------------------------------------------------------------------===//
2328
2329 /// Return the APFloat 'semantics' for the specified scalar floating
2330 /// point type.
2331 const llvm::fltSemantics &getFloatTypeSemantics(QualType T) const;
2332
2333 /// Get the size and alignment of the specified complete type in bits.
2334 TypeInfo getTypeInfo(const Type *T) const;
2335 TypeInfo getTypeInfo(QualType T) const { return getTypeInfo(T.getTypePtr()); }
2336
2337 /// Get default simd alignment of the specified complete type in bits.
2338 unsigned getOpenMPDefaultSimdAlign(QualType T) const;
2339
2340 /// Return the size of the specified (complete) type \p T, in bits.
2341 uint64_t getTypeSize(QualType T) const { return getTypeInfo(T).Width; }
2342 uint64_t getTypeSize(const Type *T) const { return getTypeInfo(T).Width; }
2343
2344 /// Return the size of the character type, in bits.
2345 uint64_t getCharWidth() const {
2346 return getTypeSize(CharTy);
2347 }
2348
2349 /// Convert a size in bits to a size in characters.
2350 CharUnits toCharUnitsFromBits(int64_t BitSize) const;
2351
2352 /// Convert a size in characters to a size in bits.
2353 int64_t toBits(CharUnits CharSize) const;
2354
2355 /// Return the size of the specified (complete) type \p T, in
2356 /// characters.
2358 CharUnits getTypeSizeInChars(const Type *T) const;
2359
2360 std::optional<CharUnits> getTypeSizeInCharsIfKnown(QualType Ty) const {
2361 if (Ty->isIncompleteType() || Ty->isDependentType())
2362 return std::nullopt;
2363 return getTypeSizeInChars(Ty);
2364 }
2365
2366 std::optional<CharUnits> getTypeSizeInCharsIfKnown(const Type *Ty) const {
2367 return getTypeSizeInCharsIfKnown(QualType(Ty, 0));
2368 }
2369
2370 /// Return the ABI-specified alignment of a (complete) type \p T, in
2371 /// bits.
2372 unsigned getTypeAlign(QualType T) const { return getTypeInfo(T).Align; }
2373 unsigned getTypeAlign(const Type *T) const { return getTypeInfo(T).Align; }
2374
2375 /// Return the ABI-specified natural alignment of a (complete) type \p T,
2376 /// before alignment adjustments, in bits.
2377 ///
2378 /// This alignment is curently used only by ARM and AArch64 when passing
2379 /// arguments of a composite type.
2381 return getTypeUnadjustedAlign(T.getTypePtr());
2382 }
2383 unsigned getTypeUnadjustedAlign(const Type *T) const;
2384
2385 /// Return the alignment of a type, in bits, or 0 if
2386 /// the type is incomplete and we cannot determine the alignment (for
2387 /// example, from alignment attributes). The returned alignment is the
2388 /// Preferred alignment if NeedsPreferredAlignment is true, otherwise is the
2389 /// ABI alignment.
2391 bool NeedsPreferredAlignment = false) const;
2392
2393 /// Return the ABI-specified alignment of a (complete) type \p T, in
2394 /// characters.
2396 CharUnits getTypeAlignInChars(const Type *T) const;
2397
2398 /// Return the PreferredAlignment of a (complete) type \p T, in
2399 /// characters.
2402 }
2403
2404 /// getTypeUnadjustedAlignInChars - Return the ABI-specified alignment of a type,
2405 /// in characters, before alignment adjustments. This method does not work on
2406 /// incomplete types.
2409
2410 // getTypeInfoDataSizeInChars - Return the size of a type, in chars. If the
2411 // type is a record, its data size is returned.
2413
2414 TypeInfoChars getTypeInfoInChars(const Type *T) const;
2416
2417 /// Determine if the alignment the type has was required using an
2418 /// alignment attribute.
2419 bool isAlignmentRequired(const Type *T) const;
2420 bool isAlignmentRequired(QualType T) const;
2421
2422 /// More type predicates useful for type checking/promotion
2423 bool isPromotableIntegerType(QualType T) const; // C99 6.3.1.1p2
2424
2425 /// Return the "preferred" alignment of the specified type \p T for
2426 /// the current target, in bits.
2427 ///
2428 /// This can be different than the ABI alignment in cases where it is
2429 /// beneficial for performance or backwards compatibility preserving to
2430 /// overalign a data type. (Note: despite the name, the preferred alignment
2431 /// is ABI-impacting, and not an optimization.)
2433 return getPreferredTypeAlign(T.getTypePtr());
2434 }
2435 unsigned getPreferredTypeAlign(const Type *T) const;
2436
2437 /// Return the default alignment for __attribute__((aligned)) on
2438 /// this target, to be used if no alignment value is specified.
2440
2441 /// Return the alignment in bits that should be given to a
2442 /// global variable with type \p T. If \p VD is non-null it will be
2443 /// considered specifically for the query.
2444 unsigned getAlignOfGlobalVar(QualType T, const VarDecl *VD) const;
2445
2446 /// Return the alignment in characters that should be given to a
2447 /// global variable with type \p T. If \p VD is non-null it will be
2448 /// considered specifically for the query.
2450
2451 /// Return the minimum alignement as specified by the target. If \p VD is
2452 /// non-null it may be used to identify external or weak variables.
2453 unsigned getMinGlobalAlignOfVar(uint64_t Size, const VarDecl *VD) const;
2454
2455 /// Return a conservative estimate of the alignment of the specified
2456 /// decl \p D.
2457 ///
2458 /// \pre \p D must not be a bitfield type, as bitfields do not have a valid
2459 /// alignment.
2460 ///
2461 /// If \p ForAlignof, references are treated like their underlying type
2462 /// and large arrays don't get any special treatment. If not \p ForAlignof
2463 /// it computes the value expected by CodeGen: references are treated like
2464 /// pointers and large arrays get extra alignment.
2465 CharUnits getDeclAlign(const Decl *D, bool ForAlignof = false) const;
2466
2467 /// Return the alignment (in bytes) of the thrown exception object. This is
2468 /// only meaningful for targets that allocate C++ exceptions in a system
2469 /// runtime, such as those using the Itanium C++ ABI.
2471
2472 /// Get or compute information about the layout of the specified
2473 /// record (struct/union/class) \p D, which indicates its size and field
2474 /// position information.
2475 const ASTRecordLayout &getASTRecordLayout(const RecordDecl *D) const;
2476
2477 /// Get or compute information about the layout of the specified
2478 /// Objective-C interface.
2480 const;
2481
2482 void DumpRecordLayout(const RecordDecl *RD, raw_ostream &OS,
2483 bool Simple = false) const;
2484
2485 /// Get or compute information about the layout of the specified
2486 /// Objective-C implementation.
2487 ///
2488 /// This may differ from the interface if synthesized ivars are present.
2489 const ASTRecordLayout &
2491
2492 /// Get our current best idea for the key function of the
2493 /// given record decl, or nullptr if there isn't one.
2494 ///
2495 /// The key function is, according to the Itanium C++ ABI section 5.2.3:
2496 /// ...the first non-pure virtual function that is not inline at the
2497 /// point of class definition.
2498 ///
2499 /// Other ABIs use the same idea. However, the ARM C++ ABI ignores
2500 /// virtual functions that are defined 'inline', which means that
2501 /// the result of this computation can change.
2503
2504 /// Observe that the given method cannot be a key function.
2505 /// Checks the key-function cache for the method's class and clears it
2506 /// if matches the given declaration.
2507 ///
2508 /// This is used in ABIs where out-of-line definitions marked
2509 /// inline are not considered to be key functions.
2510 ///
2511 /// \param method should be the declaration from the class definition
2512 void setNonKeyFunction(const CXXMethodDecl *method);
2513
2514 /// Loading virtual member pointers using the virtual inheritance model
2515 /// always results in an adjustment using the vbtable even if the index is
2516 /// zero.
2517 ///
2518 /// This is usually OK because the first slot in the vbtable points
2519 /// backwards to the top of the MDC. However, the MDC might be reusing a
2520 /// vbptr from an nv-base. In this case, the first slot in the vbtable
2521 /// points to the start of the nv-base which introduced the vbptr and *not*
2522 /// the MDC. Modify the NonVirtualBaseAdjustment to account for this.
2524
2525 /// Get the offset of a FieldDecl or IndirectFieldDecl, in bits.
2526 uint64_t getFieldOffset(const ValueDecl *FD) const;
2527
2528 /// Get the offset of an ObjCIvarDecl in bits.
2529 uint64_t lookupFieldBitOffset(const ObjCInterfaceDecl *OID,
2531 const ObjCIvarDecl *Ivar) const;
2532
2533 /// Find the 'this' offset for the member path in a pointer-to-member
2534 /// APValue.
2536
2537 bool isNearlyEmpty(const CXXRecordDecl *RD) const;
2538
2540
2541 /// If \p T is null pointer, assume the target in ASTContext.
2542 MangleContext *createMangleContext(const TargetInfo *T = nullptr);
2543
2544 /// Creates a device mangle context to correctly mangle lambdas in a mixed
2545 /// architecture compile by setting the lambda mangling number source to the
2546 /// DeviceLambdaManglingNumber. Currently this asserts that the TargetInfo
2547 /// (from the AuxTargetInfo) is a an itanium target.
2549
2550 void DeepCollectObjCIvars(const ObjCInterfaceDecl *OI, bool leafClass,
2552
2553 unsigned CountNonClassIvars(const ObjCInterfaceDecl *OI) const;
2554 void CollectInheritedProtocols(const Decl *CDecl,
2556
2557 /// Return true if the specified type has unique object representations
2558 /// according to (C++17 [meta.unary.prop]p9)
2559 bool
2561 bool CheckIfTriviallyCopyable = true) const;
2562
2563 //===--------------------------------------------------------------------===//
2564 // Type Operators
2565 //===--------------------------------------------------------------------===//
2566
2567 /// Return the canonical (structural) type corresponding to the
2568 /// specified potentially non-canonical type \p T.
2569 ///
2570 /// The non-canonical version of a type may have many "decorated" versions of
2571 /// types. Decorators can include typedefs, 'typeof' operators, etc. The
2572 /// returned type is guaranteed to be free of any of these, allowing two
2573 /// canonical types to be compared for exact equality with a simple pointer
2574 /// comparison.
2576 return CanQualType::CreateUnsafe(T.getCanonicalType());
2577 }
2578
2579 const Type *getCanonicalType(const Type *T) const {
2581 }
2582
2583 /// Return the canonical parameter type corresponding to the specific
2584 /// potentially non-canonical one.
2585 ///
2586 /// Qualifiers are stripped off, functions are turned into function
2587 /// pointers, and arrays decay one level into pointers.
2589
2590 /// Determine whether the given types \p T1 and \p T2 are equivalent.
2591 bool hasSameType(QualType T1, QualType T2) const {
2592 return getCanonicalType(T1) == getCanonicalType(T2);
2593 }
2594 bool hasSameType(const Type *T1, const Type *T2) const {
2595 return getCanonicalType(T1) == getCanonicalType(T2);
2596 }
2597
2598 /// Determine whether the given expressions \p X and \p Y are equivalent.
2599 bool hasSameExpr(const Expr *X, const Expr *Y) const;
2600
2601 /// Return this type as a completely-unqualified array type,
2602 /// capturing the qualifiers in \p Quals.
2603 ///
2604 /// This will remove the minimal amount of sugaring from the types, similar
2605 /// to the behavior of QualType::getUnqualifiedType().
2606 ///
2607 /// \param T is the qualified type, which may be an ArrayType
2608 ///
2609 /// \param Quals will receive the full set of qualifiers that were
2610 /// applied to the array.
2611 ///
2612 /// \returns if this is an array type, the completely unqualified array type
2613 /// that corresponds to it. Otherwise, returns T.getUnqualifiedType().
2615
2616 /// Determine whether the given types are equivalent after
2617 /// cvr-qualifiers have been removed.
2619 return getCanonicalType(T1).getTypePtr() ==
2621 }
2622
2624 bool IsParam) const {
2625 auto SubTnullability = SubT->getNullability();
2626 auto SuperTnullability = SuperT->getNullability();
2627 if (SubTnullability.has_value() == SuperTnullability.has_value()) {
2628 // Neither has nullability; return true
2629 if (!SubTnullability)
2630 return true;
2631 // Both have nullability qualifier.
2632 if (*SubTnullability == *SuperTnullability ||
2633 *SubTnullability == NullabilityKind::Unspecified ||
2634 *SuperTnullability == NullabilityKind::Unspecified)
2635 return true;
2636
2637 if (IsParam) {
2638 // Ok for the superclass method parameter to be "nonnull" and the subclass
2639 // method parameter to be "nullable"
2640 return (*SuperTnullability == NullabilityKind::NonNull &&
2641 *SubTnullability == NullabilityKind::Nullable);
2642 }
2643 // For the return type, it's okay for the superclass method to specify
2644 // "nullable" and the subclass method specify "nonnull"
2645 return (*SuperTnullability == NullabilityKind::Nullable &&
2646 *SubTnullability == NullabilityKind::NonNull);
2647 }
2648 return true;
2649 }
2650
2651 bool ObjCMethodsAreEqual(const ObjCMethodDecl *MethodDecl,
2652 const ObjCMethodDecl *MethodImp);
2653
2654 bool UnwrapSimilarTypes(QualType &T1, QualType &T2,
2655 bool AllowPiMismatch = true);
2657 bool AllowPiMismatch = true);
2658
2659 /// Determine if two types are similar, according to the C++ rules. That is,
2660 /// determine if they are the same other than qualifiers on the initial
2661 /// sequence of pointer / pointer-to-member / array (and in Clang, object
2662 /// pointer) types and their element types.
2663 ///
2664 /// Clang offers a number of qualifiers in addition to the C++ qualifiers;
2665 /// those qualifiers are also ignored in the 'similarity' check.
2666 bool hasSimilarType(QualType T1, QualType T2);
2667
2668 /// Determine if two types are similar, ignoring only CVR qualifiers.
2669 bool hasCvrSimilarType(QualType T1, QualType T2);
2670
2671 /// Retrieves the "canonical" nested name specifier for a
2672 /// given nested name specifier.
2673 ///
2674 /// The canonical nested name specifier is a nested name specifier
2675 /// that uniquely identifies a type or namespace within the type
2676 /// system. For example, given:
2677 ///
2678 /// \code
2679 /// namespace N {
2680 /// struct S {
2681 /// template<typename T> struct X { typename T* type; };
2682 /// };
2683 /// }
2684 ///
2685 /// template<typename T> struct Y {
2686 /// typename N::S::X<T>::type member;
2687 /// };
2688 /// \endcode
2689 ///
2690 /// Here, the nested-name-specifier for N::S::X<T>:: will be
2691 /// S::X<template-param-0-0>, since 'S' and 'X' are uniquely defined
2692 /// by declarations in the type system and the canonical type for
2693 /// the template type parameter 'T' is template-param-0-0.
2696
2697 /// Retrieves the default calling convention for the current target.
2699 bool IsCXXMethod,
2700 bool IsBuiltin = false) const;
2701
2702 /// Retrieves the "canonical" template name that refers to a
2703 /// given template.
2704 ///
2705 /// The canonical template name is the simplest expression that can
2706 /// be used to refer to a given template. For most templates, this
2707 /// expression is just the template declaration itself. For example,
2708 /// the template std::vector can be referred to via a variety of
2709 /// names---std::vector, \::std::vector, vector (if vector is in
2710 /// scope), etc.---but all of these names map down to the same
2711 /// TemplateDecl, which is used to form the canonical template name.
2712 ///
2713 /// Dependent template names are more interesting. Here, the
2714 /// template name could be something like T::template apply or
2715 /// std::allocator<T>::template rebind, where the nested name
2716 /// specifier itself is dependent. In this case, the canonical
2717 /// template name uses the shortest form of the dependent
2718 /// nested-name-specifier, which itself contains all canonical
2719 /// types, values, and templates.
2721
2722 /// Determine whether the given template names refer to the same
2723 /// template.
2724 bool hasSameTemplateName(const TemplateName &X, const TemplateName &Y) const;
2725
2726 /// Determine whether the two declarations refer to the same entity.
2727 bool isSameEntity(const NamedDecl *X, const NamedDecl *Y) const;
2728
2729 /// Determine whether two template parameter lists are similar enough
2730 /// that they may be used in declarations of the same template.
2732 const TemplateParameterList *Y) const;
2733
2734 /// Determine whether two template parameters are similar enough
2735 /// that they may be used in declarations of the same template.
2736 bool isSameTemplateParameter(const NamedDecl *X, const NamedDecl *Y) const;
2737
2738 /// Determine whether two 'requires' expressions are similar enough that they
2739 /// may be used in re-declarations.
2740 ///
2741 /// Use of 'requires' isn't mandatory, works with constraints expressed in
2742 /// other ways too.
2743 bool isSameConstraintExpr(const Expr *XCE, const Expr *YCE) const;
2744
2745 /// Determine whether two type contraint are similar enough that they could
2746 /// used in declarations of the same template.
2747 bool isSameTypeConstraint(const TypeConstraint *XTC,
2748 const TypeConstraint *YTC) const;
2749
2750 /// Determine whether two default template arguments are similar enough
2751 /// that they may be used in declarations of the same template.
2753 const NamedDecl *Y) const;
2754
2755 /// Retrieve the "canonical" template argument.
2756 ///
2757 /// The canonical template argument is the simplest template argument
2758 /// (which may be a type, value, expression, or declaration) that
2759 /// expresses the value of the argument.
2761 const;
2762
2763 /// Type Query functions. If the type is an instance of the specified class,
2764 /// return the Type pointer for the underlying maximally pretty type. This
2765 /// is a member of ASTContext because this may need to do some amount of
2766 /// canonicalization, e.g. to move type qualifiers into the element type.
2767 const ArrayType *getAsArrayType(QualType T) const;
2769 return dyn_cast_or_null<ConstantArrayType>(getAsArrayType(T));
2770 }
2772 return dyn_cast_or_null<VariableArrayType>(getAsArrayType(T));
2773 }
2775 return dyn_cast_or_null<IncompleteArrayType>(getAsArrayType(T));
2776 }
2778 const {
2779 return dyn_cast_or_null<DependentSizedArrayType>(getAsArrayType(T));
2780 }
2781
2782 /// Return the innermost element type of an array type.
2783 ///
2784 /// For example, will return "int" for int[m][n]
2785 QualType getBaseElementType(const ArrayType *VAT) const;
2786
2787 /// Return the innermost element type of a type (which needn't
2788 /// actually be an array type).
2790
2791 /// Return number of constant array elements.
2792 uint64_t getConstantArrayElementCount(const ConstantArrayType *CA) const;
2793
2794 /// Return number of elements initialized in an ArrayInitLoopExpr.
2795 uint64_t
2797
2798 /// Perform adjustment on the parameter type of a function.
2799 ///
2800 /// This routine adjusts the given parameter type @p T to the actual
2801 /// parameter type used by semantic analysis (C99 6.7.5.3p[7,8],
2802 /// C++ [dcl.fct]p3). The adjusted parameter type is returned.
2804
2805 /// Retrieve the parameter type as adjusted for use in the signature
2806 /// of a function, decaying array and function types and removing top-level
2807 /// cv-qualifiers.
2809
2811
2812 /// Return the properly qualified result of decaying the specified
2813 /// array type to a pointer.
2814 ///
2815 /// This operation is non-trivial when handling typedefs etc. The canonical
2816 /// type of \p T must be an array type, this returns a pointer to a properly
2817 /// qualified element of the array.
2818 ///
2819 /// See C99 6.7.5.3p7 and C99 6.3.2.1p3.
2821
2822 /// Return the type that \p PromotableType will promote to: C99
2823 /// 6.3.1.1p2, assuming that \p PromotableType is a promotable integer type.
2824 QualType getPromotedIntegerType(QualType PromotableType) const;
2825
2826 /// Recurses in pointer/array types until it finds an Objective-C
2827 /// retainable type and returns its ownership.
2829
2830 /// Whether this is a promotable bitfield reference according
2831 /// to C99 6.3.1.1p2, bullet 2 (and GCC extensions).
2832 ///
2833 /// \returns the type this bit-field will promote to, or NULL if no
2834 /// promotion occurs.
2836
2837 /// Return the highest ranked integer type, see C99 6.3.1.8p1.
2838 ///
2839 /// If \p LHS > \p RHS, returns 1. If \p LHS == \p RHS, returns 0. If
2840 /// \p LHS < \p RHS, return -1.
2841 int getIntegerTypeOrder(QualType LHS, QualType RHS) const;
2842
2843 /// Compare the rank of the two specified floating point types,
2844 /// ignoring the domain of the type (i.e. 'double' == '_Complex double').
2845 ///
2846 /// If \p LHS > \p RHS, returns 1. If \p LHS == \p RHS, returns 0. If
2847 /// \p LHS < \p RHS, return -1.
2848 int getFloatingTypeOrder(QualType LHS, QualType RHS) const;
2849
2850 /// Compare the rank of two floating point types as above, but compare equal
2851 /// if both types have the same floating-point semantics on the target (i.e.
2852 /// long double and double on AArch64 will return 0).
2854
2855 unsigned getTargetAddressSpace(LangAS AS) const;
2856
2857 LangAS getLangASForBuiltinAddressSpace(unsigned AS) const;
2858
2859 /// Get target-dependent integer value for null pointer which is used for
2860 /// constant folding.
2861 uint64_t getTargetNullPointerValue(QualType QT) const;
2862
2864 return AddrSpaceMapMangling || isTargetAddressSpace(AS);
2865 }
2866
2867 // Merges two exception specifications, such that the resulting
2868 // exception spec is the union of both. For example, if either
2869 // of them can throw something, the result can throw it as well.
2873 SmallVectorImpl<QualType> &ExceptionTypeStorage,
2874 bool AcceptDependent);
2875
2876 // For two "same" types, return a type which has
2877 // the common sugar between them. If Unqualified is true,
2878 // both types need only be the same unqualified type.
2879 // The result will drop the qualifiers which do not occur
2880 // in both types.
2882 bool Unqualified = false);
2883
2884private:
2885 // Helper for integer ordering
2886 unsigned getIntegerRank(const Type *T) const;
2887
2888public:
2889 //===--------------------------------------------------------------------===//
2890 // Type Compatibility Predicates
2891 //===--------------------------------------------------------------------===//
2892
2893 /// Compatibility predicates used to check assignment expressions.
2895 bool CompareUnqualified = false); // C99 6.2.7p1
2896
2899
2901 if (const auto *ET = dyn_cast<ElaboratedType>(T))
2902 T = ET->getNamedType();
2903 return T == getObjCIdType();
2904 }
2905
2907 if (const auto *ET = dyn_cast<ElaboratedType>(T))
2908 T = ET->getNamedType();
2909 return T == getObjCClassType();
2910 }
2911
2913 if (const auto *ET = dyn_cast<ElaboratedType>(T))
2914 T = ET->getNamedType();
2915 return T == getObjCSelType();
2916 }
2917
2919 const ObjCObjectPointerType *RHS,
2920 bool ForCompare);
2921
2923 const ObjCObjectPointerType *RHS);
2924
2925 // Check the safety of assignment from LHS to RHS
2927 const ObjCObjectPointerType *RHSOPT);
2929 const ObjCObjectType *RHS);
2931 const ObjCObjectPointerType *LHSOPT,
2932 const ObjCObjectPointerType *RHSOPT,
2933 bool BlockReturnType);
2936 const ObjCObjectPointerType *RHSOPT);
2938
2939 // Functions for calculating composite types
2940 QualType mergeTypes(QualType, QualType, bool OfBlockPointer = false,
2941 bool Unqualified = false, bool BlockReturnType = false,
2942 bool IsConditionalOperator = false);
2943 QualType mergeFunctionTypes(QualType, QualType, bool OfBlockPointer = false,
2944 bool Unqualified = false, bool AllowCXX = false,
2945 bool IsConditionalOperator = false);
2947 bool OfBlockPointer = false,
2948 bool Unqualified = false);
2950 bool OfBlockPointer=false,
2951 bool Unqualified = false);
2952
2954
2955 /// This function merges the ExtParameterInfo lists of two functions. It
2956 /// returns true if the lists are compatible. The merged list is returned in
2957 /// NewParamInfos.
2958 ///
2959 /// \param FirstFnType The type of the first function.
2960 ///
2961 /// \param SecondFnType The type of the second function.
2962 ///
2963 /// \param CanUseFirst This flag is set to true if the first function's
2964 /// ExtParameterInfo list can be used as the composite list of
2965 /// ExtParameterInfo.
2966 ///
2967 /// \param CanUseSecond This flag is set to true if the second function's
2968 /// ExtParameterInfo list can be used as the composite list of
2969 /// ExtParameterInfo.
2970 ///
2971 /// \param NewParamInfos The composite list of ExtParameterInfo. The list is
2972 /// empty if none of the flags are set.
2973 ///
2975 const FunctionProtoType *FirstFnType,
2976 const FunctionProtoType *SecondFnType,
2977 bool &CanUseFirst, bool &CanUseSecond,
2979
2980 void ResetObjCLayout(const ObjCContainerDecl *CD);
2981
2982 //===--------------------------------------------------------------------===//
2983 // Integer Predicates
2984 //===--------------------------------------------------------------------===//
2985
2986 // The width of an integer, as defined in C99 6.2.6.2. This is the number
2987 // of bits in an integer type excluding any padding bits.
2988 unsigned getIntWidth(QualType T) const;
2989
2990 // Per C99 6.2.5p6, for every signed integer type, there is a corresponding
2991 // unsigned integer type. This method takes a signed type, and returns the
2992 // corresponding unsigned integer type.
2993 // With the introduction of fixed point types in ISO N1169, this method also
2994 // accepts fixed point types and returns the corresponding unsigned type for
2995 // a given fixed point type.
2997
2998 // Per C99 6.2.5p6, for every signed integer type, there is a corresponding
2999 // unsigned integer type. This method takes an unsigned type, and returns the
3000 // corresponding signed integer type.
3001 // With the introduction of fixed point types in ISO N1169, this method also
3002 // accepts fixed point types and returns the corresponding signed type for
3003 // a given fixed point type.
3005
3006 // Per ISO N1169, this method accepts fixed point types and returns the
3007 // corresponding saturated type for a given fixed point type.
3009
3010 // Per ISO N1169, this method accepts fixed point types and returns the
3011 // corresponding non-saturated type for a given fixed point type.
3013
3014 // This method accepts fixed point types and returns the corresponding signed
3015 // type. Unlike getCorrespondingUnsignedType(), this only accepts unsigned
3016 // fixed point types because there are unsigned integer types like bool and
3017 // char8_t that don't have signed equivalents.
3019
3020 //===--------------------------------------------------------------------===//
3021 // Integer Values
3022 //===--------------------------------------------------------------------===//
3023
3024 /// Make an APSInt of the appropriate width and signedness for the
3025 /// given \p Value and integer \p Type.
3026 llvm::APSInt MakeIntValue(uint64_t Value, QualType Type) const {
3027 // If Type is a signed integer type larger than 64 bits, we need to be sure
3028 // to sign extend Res appropriately.
3029 llvm::APSInt Res(64, !Type->isSignedIntegerOrEnumerationType());
3030 Res = Value;
3031 unsigned Width = getIntWidth(Type);
3032 if (Width != Res.getBitWidth())
3033 return Res.extOrTrunc(Width);
3034 return Res;
3035 }
3036
3037 bool isSentinelNullExpr(const Expr *E);
3038
3039 /// Get the implementation of the ObjCInterfaceDecl \p D, or nullptr if
3040 /// none exists.
3042
3043 /// Get the implementation of the ObjCCategoryDecl \p D, or nullptr if
3044 /// none exists.
3046
3047 /// Return true if there is at least one \@implementation in the TU.
3049 return !ObjCImpls.empty();
3050 }
3051
3052 /// Set the implementation of ObjCInterfaceDecl.
3054 ObjCImplementationDecl *ImplD);
3055
3056 /// Set the implementation of ObjCCategoryDecl.
3058 ObjCCategoryImplDecl *ImplD);
3059
3060 /// Get the duplicate declaration of a ObjCMethod in the same
3061 /// interface, or null if none exists.
3062 const ObjCMethodDecl *
3064
3066 const ObjCMethodDecl *Redecl);
3067
3068 /// Returns the Objective-C interface that \p ND belongs to if it is
3069 /// an Objective-C method/property/ivar etc. that is part of an interface,
3070 /// otherwise returns null.
3072
3073 /// Set the copy initialization expression of a block var decl. \p CanThrow
3074 /// indicates whether the copy expression can throw or not.
3075 void setBlockVarCopyInit(const VarDecl* VD, Expr *CopyExpr, bool CanThrow);
3076
3077 /// Get the copy initialization expression of the VarDecl \p VD, or
3078 /// nullptr if none exists.
3080
3081 /// Allocate an uninitialized TypeSourceInfo.
3082 ///
3083 /// The caller should initialize the memory held by TypeSourceInfo using
3084 /// the TypeLoc wrappers.
3085 ///
3086 /// \param T the type that will be the basis for type source info. This type
3087 /// should refer to how the declarator was written in source code, not to
3088 /// what type semantic analysis resolved the declarator to.
3089 ///
3090 /// \param Size the size of the type info to create, or 0 if the size
3091 /// should be calculated based on the type.
3092 TypeSourceInfo *CreateTypeSourceInfo(QualType T, unsigned Size = 0) const;
3093
3094 /// Allocate a TypeSourceInfo where all locations have been
3095 /// initialized to a given location, which defaults to the empty
3096 /// location.
3100
3101 /// Add a deallocation callback that will be invoked when the
3102 /// ASTContext is destroyed.
3103 ///
3104 /// \param Callback A callback function that will be invoked on destruction.
3105 ///
3106 /// \param Data Pointer data that will be provided to the callback function
3107 /// when it is called.
3108 void AddDeallocation(void (*Callback)(void *), void *Data) const;
3109
3110 /// If T isn't trivially destructible, calls AddDeallocation to register it
3111 /// for destruction.
3112 template <typename T> void addDestruction(T *Ptr) const {
3113 if (!std::is_trivially_destructible<T>::value) {
3114 auto DestroyPtr = [](void *V) { static_cast<T *>(V)->~T(); };
3115 AddDeallocation(DestroyPtr, Ptr);
3116 }
3117 }
3118
3121
3122 /// Determines if the decl can be CodeGen'ed or deserialized from PCH
3123 /// lazily, only when used; this is only relevant for function or file scoped
3124 /// var definitions.
3125 ///
3126 /// \returns true if the function/var must be CodeGen'ed/deserialized even if
3127 /// it is not used.
3128 bool DeclMustBeEmitted(const Decl *D);
3129
3130 /// Visits all versions of a multiversioned function with the passed
3131 /// predicate.
3133 const FunctionDecl *FD,
3134 llvm::function_ref<void(FunctionDecl *)> Pred) const;
3135
3136 const CXXConstructorDecl *
3138
3140 CXXConstructorDecl *CD);
3141
3143
3145
3147
3149
3150 void setManglingNumber(const NamedDecl *ND, unsigned Number);
3151 unsigned getManglingNumber(const NamedDecl *ND,
3152 bool ForAuxTarget = false) const;
3153
3154 void setStaticLocalNumber(const VarDecl *VD, unsigned Number);
3155 unsigned getStaticLocalNumber(const VarDecl *VD) const;
3156
3157 /// Retrieve the context for computing mangling numbers in the given
3158 /// DeclContext.
3162 const Decl *D);
3163
3164 std::unique_ptr<MangleNumberingContext> createMangleNumberingContext() const;
3165
3166 /// Used by ParmVarDecl to store on the side the
3167 /// index of the parameter when it exceeds the size of the normal bitfield.
3168 void setParameterIndex(const ParmVarDecl *D, unsigned index);
3169
3170 /// Used by ParmVarDecl to retrieve on the side the
3171 /// index of the parameter when it exceeds the size of the normal bitfield.
3172 unsigned getParameterIndex(const ParmVarDecl *D) const;
3173
3174 /// Return a string representing the human readable name for the specified
3175 /// function declaration or file name. Used by SourceLocExpr and
3176 /// PredefinedExpr to cache evaluated results.
3178
3179 /// Return a declaration for the global GUID object representing the given
3180 /// GUID value.
3182
3183 /// Return a declaration for a uniquified anonymous global constant
3184 /// corresponding to a given APValue.
3187
3188 /// Return the template parameter object of the given type with the given
3189 /// value.
3191 const APValue &V) const;
3192
3193 /// Parses the target attributes passed in, and returns only the ones that are
3194 /// valid feature names.
3195 ParsedTargetAttr filterFunctionTargetAttrs(const TargetAttr *TD) const;
3196
3197 std::vector<std::string>
3198 filterFunctionTargetVersionAttrs(const TargetVersionAttr *TV) const;
3199
3200 void getFunctionFeatureMap(llvm::StringMap<bool> &FeatureMap,
3201 const FunctionDecl *) const;
3202 void getFunctionFeatureMap(llvm::StringMap<bool> &FeatureMap,
3203 GlobalDecl GD) const;
3204
3205 //===--------------------------------------------------------------------===//
3206 // Statistics
3207 //===--------------------------------------------------------------------===//
3208
3209 /// The number of implicitly-declared default constructors.
3211
3212 /// The number of implicitly-declared default constructors for
3213 /// which declarations were built.
3215
3216 /// The number of implicitly-declared copy constructors.
3218
3219 /// The number of implicitly-declared copy constructors for
3220 /// which declarations were built.
3222
3223 /// The number of implicitly-declared move constructors.
3225
3226 /// The number of implicitly-declared move constructors for
3227 /// which declarations were built.
3229
3230 /// The number of implicitly-declared copy assignment operators.
3232
3233 /// The number of implicitly-declared copy assignment operators for
3234 /// which declarations were built.
3236
3237 /// The number of implicitly-declared move assignment operators.
3239
3240 /// The number of implicitly-declared move assignment operators for
3241 /// which declarations were built.
3243
3244 /// The number of implicitly-declared destructors.
3246
3247 /// The number of implicitly-declared destructors for which
3248 /// declarations were built.
3250
3251public:
3252 /// Initialize built-in types.
3253 ///
3254 /// This routine may only be invoked once for a given ASTContext object.
3255 /// It is normally invoked after ASTContext construction.
3256 ///
3257 /// \param Target The target
3259 const TargetInfo *AuxTarget = nullptr);
3260
3261private:
3262 void InitBuiltinType(CanQualType &R, BuiltinType::Kind K);
3263
3264 class ObjCEncOptions {
3265 unsigned Bits;
3266
3267 ObjCEncOptions(unsigned Bits) : Bits(Bits) {}
3268
3269 public:
3270 ObjCEncOptions() : Bits(0) {}
3271
3272#define OPT_LIST(V) \
3273 V(ExpandPointedToStructures, 0) \
3274 V(ExpandStructures, 1) \
3275 V(IsOutermostType, 2) \
3276 V(EncodingProperty, 3) \
3277 V(IsStructField, 4) \
3278 V(EncodeBlockParameters, 5) \
3279 V(EncodeClassNames, 6) \
3280
3281#define V(N,I) ObjCEncOptions& set##N() { Bits |= 1 << I; return *this; }
3282OPT_LIST(V)
3283#undef V
3284
3285#define V(N,I) bool N() const { return Bits & 1 << I; }
3286OPT_LIST(V)
3287#undef V
3288
3289#undef OPT_LIST
3290
3291 [[nodiscard]] ObjCEncOptions keepingOnly(ObjCEncOptions Mask) const {
3292 return Bits & Mask.Bits;
3293 }
3294
3295 [[nodiscard]] ObjCEncOptions forComponentType() const {
3296 ObjCEncOptions Mask = ObjCEncOptions()
3297 .setIsOutermostType()
3298 .setIsStructField();
3299 return Bits & ~Mask.Bits;
3300 }
3301 };
3302
3303 // Return the Objective-C type encoding for a given type.
3304 void getObjCEncodingForTypeImpl(QualType t, std::string &S,
3305 ObjCEncOptions Options,
3306 const FieldDecl *Field,
3307 QualType *NotEncodedT = nullptr) const;
3308
3309 // Adds the encoding of the structure's members.
3310 void getObjCEncodingForStructureImpl(RecordDecl *RD, std::string &S,
3311 const FieldDecl *Field,
3312 bool includeVBases = true,
3313 QualType *NotEncodedT=nullptr) const;
3314
3315public:
3316 // Adds the encoding of a method parameter or return type.
3318 QualType T, std::string& S,
3319 bool Extended) const;
3320
3321 /// Returns true if this is an inline-initialized static data member
3322 /// which is treated as a definition for MSVC compatibility.
3323 bool isMSStaticDataMemberInlineDefinition(const VarDecl *VD) const;
3324
3326 /// Not an inline variable.
3327 None,
3328
3329 /// Weak definition of inline variable.
3330 Weak,
3331
3332 /// Weak for now, might become strong later in this TU.
3334
3335 /// Strong definition.
3336 Strong
3337 };
3338
3339 /// Determine whether a definition of this inline variable should
3340 /// be treated as a weak or strong definition. For compatibility with
3341 /// C++14 and before, for a constexpr static data member, if there is an
3342 /// out-of-line declaration of the member, we may promote it from weak to
3343 /// strong.
3346
3347private:
3349 friend class DeclContext;
3350
3351 const ASTRecordLayout &
3352 getObjCLayout(const ObjCInterfaceDecl *D,
3353 const ObjCImplementationDecl *Impl) const;
3354
3355 /// A set of deallocations that should be performed when the
3356 /// ASTContext is destroyed.
3357 // FIXME: We really should have a better mechanism in the ASTContext to
3358 // manage running destructors for types which do variable sized allocation
3359 // within the AST. In some places we thread the AST bump pointer allocator
3360 // into the datastructures which avoids this mess during deallocation but is
3361 // wasteful of memory, and here we require a lot of error prone book keeping
3362 // in order to track and run destructors while we're tearing things down.
3364 llvm::SmallVector<std::pair<void (*)(void *), void *>, 16>;
3365 mutable DeallocationFunctionsAndArguments Deallocations;
3366
3367 // FIXME: This currently contains the set of StoredDeclMaps used
3368 // by DeclContext objects. This probably should not be in ASTContext,
3369 // but we include it here so that ASTContext can quickly deallocate them.
3370 llvm::PointerIntPair<StoredDeclsMap *, 1> LastSDM;
3371
3372 std::vector<Decl *> TraversalScope;
3373
3374 std::unique_ptr<VTableContextBase> VTContext;
3375
3376 void ReleaseDeclContextMaps();
3377
3378public:
3379 enum PragmaSectionFlag : unsigned {
3386 PSF_Invalid = 0x80000000U,
3387 };
3388
3393
3394 SectionInfo() = default;
3396 int SectionFlags)
3399 };
3400
3401 llvm::StringMap<SectionInfo> SectionInfos;
3402
3403 /// Return a new OMPTraitInfo object owned by this context.
3405
3406 /// Whether a C++ static variable or CUDA/HIP kernel may be externalized.
3407 bool mayExternalize(const Decl *D) const;
3408
3409 /// Whether a C++ static variable or CUDA/HIP kernel should be externalized.
3410 bool shouldExternalize(const Decl *D) const;
3411
3412 StringRef getCUIDHash() const;
3413
3414private:
3415 /// All OMPTraitInfo objects live in this collection, one per
3416 /// `pragma omp [begin] declare variant` directive.
3417 SmallVector<std::unique_ptr<OMPTraitInfo>, 4> OMPTraitInfoVector;
3418};
3419
3420/// Insertion operator for diagnostics.
3422 const ASTContext::SectionInfo &Section);
3423
3424/// Utility function for constructing a nullary selector.
3425inline Selector GetNullarySelector(StringRef name, ASTContext &Ctx) {
3426 const IdentifierInfo *II = &Ctx.Idents.get(name);
3427 return Ctx.Selectors.getSelector(0, &II);
3428}
3429
3430/// Utility function for constructing an unary selector.
3431inline Selector GetUnarySelector(StringRef name, ASTContext &Ctx) {
3432 const IdentifierInfo *II = &Ctx.Idents.get(name);
3433 return Ctx.Selectors.getSelector(1, &II);
3434}
3435
3436} // namespace clang
3437
3438// operator new and delete aren't allowed inside namespaces.
3439
3440/// Placement new for using the ASTContext's allocator.
3441///
3442/// This placement form of operator new uses the ASTContext's allocator for
3443/// obtaining memory.
3444///
3445/// IMPORTANT: These are also declared in clang/AST/ASTContextAllocate.h!
3446/// Any changes here need to also be made there.
3447///
3448/// We intentionally avoid using a nothrow specification here so that the calls
3449/// to this operator will not perform a null check on the result -- the
3450/// underlying allocator never returns null pointers.
3451///
3452/// Usage looks like this (assuming there's an ASTContext 'Context' in scope):
3453/// @code
3454/// // Default alignment (8)
3455/// IntegerLiteral *Ex = new (Context) IntegerLiteral(arguments);
3456/// // Specific alignment
3457/// IntegerLiteral *Ex2 = new (Context, 4) IntegerLiteral(arguments);
3458/// @endcode
3459/// Memory allocated through this placement new operator does not need to be
3460/// explicitly freed, as ASTContext will free all of this memory when it gets
3461/// destroyed. Please note that you cannot use delete on the pointer.
3462///
3463/// @param Bytes The number of bytes to allocate. Calculated by the compiler.
3464/// @param C The ASTContext that provides the allocator.
3465/// @param Alignment The alignment of the allocated memory (if the underlying
3466/// allocator supports it).
3467/// @return The allocated memory. Could be nullptr.
3468inline void *operator new(size_t Bytes, const clang::ASTContext &C,
3469 size_t Alignment /* = 8 */) {
3470 return C.Allocate(Bytes, Alignment);
3471}
3472
3473/// Placement delete companion to the new above.
3474///
3475/// This operator is just a companion to the new above. There is no way of
3476/// invoking it directly; see the new operator for more details. This operator
3477/// is called implicitly by the compiler if a placement new expression using
3478/// the ASTContext throws in the object constructor.
3479inline void operator delete(void *Ptr, const clang::ASTContext &C, size_t) {
3480 C.Deallocate(Ptr);
3481}
3482
3483/// This placement form of operator new[] uses the ASTContext's allocator for
3484/// obtaining memory.
3485///
3486/// We intentionally avoid using a nothrow specification here so that the calls
3487/// to this operator will not perform a null check on the result -- the
3488/// underlying allocator never returns null pointers.
3489///
3490/// Usage looks like this (assuming there's an ASTContext 'Context' in scope):
3491/// @code
3492/// // Default alignment (8)
3493/// char *data = new (Context) char[10];
3494/// // Specific alignment
3495/// char *data = new (Context, 4) char[10];
3496/// @endcode
3497/// Memory allocated through this placement new[] operator does not need to be
3498/// explicitly freed, as ASTContext will free all of this memory when it gets
3499/// destroyed. Please note that you cannot use delete on the pointer.
3500///
3501/// @param Bytes The number of bytes to allocate. Calculated by the compiler.
3502/// @param C The ASTContext that provides the allocator.
3503/// @param Alignment The alignment of the allocated memory (if the underlying
3504/// allocator supports it).
3505/// @return The allocated memory. Could be nullptr.
3506inline void *operator new[](size_t Bytes, const clang::ASTContext& C,
3507 size_t Alignment /* = 8 */) {
3508 return C.Allocate(Bytes, Alignment);
3509}
3510
3511/// Placement delete[] companion to the new[] above.
3512///
3513/// This operator is just a companion to the new[] above. There is no way of
3514/// invoking it directly; see the new[] operator for more details. This operator
3515/// is called implicitly by the compiler if a placement new[] expression using
3516/// the ASTContext throws in the object constructor.
3517inline void operator delete[](void *Ptr, const clang::ASTContext &C, size_t) {
3518 C.Deallocate(Ptr);
3519}
3520
3521/// Create the representation of a LazyGenerationalUpdatePtr.
3522template <typename Owner, typename T,
3523 void (clang::ExternalASTSource::*Update)(Owner)>
3526 const clang::ASTContext &Ctx, T Value) {
3527 // Note, this is implemented here so that ExternalASTSource.h doesn't need to
3528 // include ASTContext.h. We explicitly instantiate it for all relevant types
3529 // in ASTContext.cpp.
3530 if (auto *Source = Ctx.getExternalSource())
3531 return new (Ctx) LazyData(Source, Value);
3532 return Value;
3533}
3534
3535#endif // LLVM_CLANG_AST_ASTCONTEXT_H
#define OPT_LIST(V)
Definition: ASTContext.h:3272
#define V(N, I)
Definition: ASTContext.h:3285
Forward declaration of all AST node types.
DynTypedNode Node
static char ID
Definition: Arena.cpp:183
#define SM(sm)
Definition: Cuda.cpp:83
static bool CanThrow(Expr *E, ASTContext &Ctx)
Definition: CFG.cpp:2679
clang::CharUnits operator*(clang::CharUnits::QuantityType Scale, const clang::CharUnits &CU)
Definition: CharUnits.h:225
static CGCXXABI * createCXXABI(CodeGenModule &CGM)
#define X(type, name)
Definition: Value.h:143
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified.
llvm::MachO::Target Target
Definition: MachO.h:50
Implements a partial diagnostic that can be emitted anwyhere in a DiagnosticBuilder stream.
SourceLocation Loc
Definition: SemaObjC.cpp:755
Defines the clang::SourceLocation class and associated facilities.
#define CXXABI(Name, Str)
Definition: TargetCXXABI.h:32
SourceLocation Begin
__device__ int
__SIZE_TYPE__ size_t
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:182
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.
QualType getUsingType(const UsingShadowDecl *Found, QualType Underlying) const
CanQualType AccumTy
Definition: ASTContext.h:1104
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
Definition: ASTContext.h:1123
SourceManager & getSourceManager()
Definition: ASTContext.h:705
TranslationUnitDecl * getTranslationUnitDecl() const
Definition: ASTContext.h:1073
const ConstantArrayType * getAsConstantArrayType(QualType T) const
Definition: ASTContext.h:2768
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.
bool areLaxCompatibleSveTypes(QualType FirstType, QualType SecondType)
Return true if the given vector types are lax-compatible SVE vector types, false otherwise.
llvm::PointerUnion< VarTemplateDecl *, MemberSpecializationInfo * > TemplateOrSpecializationInfo
A type synonym for the TemplateOrInstantiation mapping.
Definition: ASTContext.h:476
LangAS getOpenCLTypeAddrSpace(const Type *T) const
Get address space for OpenCL type.
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.
Definition: ASTContext.cpp:851
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
Definition: ASTContext.h:1122
uint64_t getTypeSize(const Type *T) const
Definition: ASTContext.h:2342
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.
llvm::DenseMap< const Decl *, comments::FullComment * > ParsedComments
Mapping from declarations to parsed comments attached to any redeclaration.
Definition: ASTContext.h:834
unsigned getManglingNumber(const NamedDecl *ND, bool ForAuxTarget=false) const
CanQualType LongTy
Definition: ASTContext.h:1100
void UnwrapSimilarArrayTypes(QualType &T1, QualType &T2, bool AllowPiMismatch=true)
Attempt to unwrap two types that may both be array types with the same bound (or both be array types ...
const SmallVectorImpl< Type * > & getTypes() const
Definition: ASTContext.h:1207
unsigned getIntWidth(QualType T) const
CanQualType getCanonicalParamType(QualType T) const
Return the canonical parameter type corresponding to the specific potentially non-canonical one.
QualType getBTFTagAttributedType(const BTFTypeTagAttr *BTFAttr, QualType Wrapped)
const FunctionType * adjustFunctionType(const FunctionType *Fn, FunctionType::ExtInfo EInfo)
Change the ExtInfo on a function type.
TemplateOrSpecializationInfo getTemplateOrSpecializationInfo(const VarDecl *Var)
CanQualType WIntTy
Definition: ASTContext.h:1096
QualType getAttributedType(attr::Kind attrKind, QualType modifiedType, QualType equivalentType) const
@ Weak
Weak definition of inline variable.
@ WeakUnknown
Weak for now, might become strong later in this TU.
const ProfileList & getProfileList() const
Definition: ASTContext.h:791
void setObjCConstantStringInterface(ObjCInterfaceDecl *Decl)
TypedefDecl * getObjCClassDecl() const
Retrieve the typedef declaration corresponding to the predefined Objective-C 'Class' type.
TypedefNameDecl * getTypedefNameForUnnamedTagDecl(const TagDecl *TD)
TypedefDecl * getCFConstantStringDecl() const
CanQualType Int128Ty
Definition: ASTContext.h:1100
CanQualType SatUnsignedFractTy
Definition: ASTContext.h:1113
CanQualType getAdjustedType(CanQualType Orig, CanQualType New) const
Definition: ASTContext.h:1359
BuiltinTemplateDecl * getMakeIntegerSeqDecl() 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 getAutoType(QualType DeducedType, AutoTypeKeyword Keyword, bool IsDependent, bool IsPack=false, ConceptDecl *TypeConstraintConcept=nullptr, ArrayRef< TemplateArgument > TypeConstraintArgs={}) const
C++11 deduced auto type.
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
Definition: ASTContext.h:1029
bool AnyObjCImplementation()
Return true if there is at least one @implementation in the TU.
Definition: ASTContext.h:3048
CanQualType UnsignedShortAccumTy
Definition: ASTContext.h:1106
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)
Deallcates a DeclListNode by returning it to the ListNodeFreeList pool.
Definition: ASTContext.h:739
DeclListNode * AllocateDeclListNode(clang::NamedDecl *ND)
Allocates a DeclListNode or returns one from the ListNodeFreeList pool.
Definition: ASTContext.h:728
QualType getDependentTemplateSpecializationType(ElaboratedTypeKeyword Keyword, NestedNameSpecifier *NNS, const IdentifierInfo *Name, ArrayRef< TemplateArgumentLoc > Args) const
void setTemplateOrSpecializationInfo(VarDecl *Inst, TemplateOrSpecializationInfo TSI)
bool ProtocolCompatibleWithProtocol(ObjCProtocolDecl *lProto, ObjCProtocolDecl *rProto) const
ProtocolCompatibleWithProtocol - return 'true' if 'lProto' is in the inheritance hierarchy of 'rProto...
bool hasSimilarType(QualType T1, QualType T2)
Determine if two types are similar, according to the C++ rules.
TypedefDecl * buildImplicitTypedef(QualType T, StringRef Name) const
Create a new implicit TU-level typedef declaration.
unsigned getTypeAlign(const Type *T) const
Definition: ASTContext.h:2373
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
Definition: ASTContext.h:3401
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.
QualType getTagDeclType(const TagDecl *Decl) const
Return the unique reference to the type for the specified TagDecl (struct/union/class/enum) decl.
QualType getMemberPointerType(QualType T, const Type *Cls) const
Return the uniqued reference to the type for a member pointer to the specified type in the specified ...
QualType getBuiltinVaListType() const
Retrieve the type of the __builtin_va_list type.
Definition: ASTContext.h:2119
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:648
comments::FullComment * cloneFullComment(comments::FullComment *FC, const Decl *D) const
Definition: ASTContext.cpp:558
TemplateName getCanonicalTemplateName(const TemplateName &Name) const
Retrieves the "canonical" template name that refers to a given template.
QualType getUnresolvedUsingType(const UnresolvedUsingTypenameDecl *Decl) const
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.
Definition: ASTContext.h:2086
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.
Definition: ASTContext.h:1840
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.
QualType getTemplateSpecializationType(TemplateName T, ArrayRef< TemplateArgument > Args, QualType Canon=QualType()) const
std::unique_ptr< MangleNumberingContext > createMangleNumberingContext() const
CanQualType SatAccumTy
Definition: ASTContext.h:1109
QualType getUnsignedPointerDiffType() const
Return the unique unsigned counterpart of "ptrdiff_t" integer type.
QualType getucontext_tType() const
Retrieve the C ucontext_t type.
Definition: ASTContext.h:1993
QualType getRecordType(const RecordDecl *Decl) const
std::optional< CharUnits > getTypeSizeInCharsIfKnown(const Type *Ty) const
Definition: ASTContext.h:2366
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.
Definition: ASTContext.h:2133
MangleContext * createMangleContext(const TargetInfo *T=nullptr)
If T is null pointer, assume the target in ASTContext.
QualType getRealTypeForBitwidth(unsigned DestWidth, FloatModeKind ExplicitType) const
getRealTypeForBitwidth - sets floating point QualTy according to specified bitwidth.
QualType getInjectedClassNameType(CXXRecordDecl *Decl, QualType TST) const
getInjectedClassNameType - Return the unique reference to the injected class name type for the specif...
QualType getVariableArrayType(QualType EltTy, Expr *NumElts, ArraySizeModifier ASM, unsigned IndexTypeQuals, SourceRange Brackets) const
Return a non-unique reference to the type for a variable array of the specified element type.
QualType getFunctionNoProtoType(QualType ResultTy, const FunctionType::ExtInfo &Info) const
Return a K&R style C function type like 'int()'.
CanQualType ShortAccumTy
Definition: ASTContext.h:1104
ASTMutationListener * getASTMutationListener() const
Retrieve a pointer to the AST mutation listener associated with this AST context, if any.
Definition: ASTContext.h:1204
unsigned NumImplicitCopyAssignmentOperatorsDeclared
The number of implicitly-declared copy assignment operators for which declarations were built.
Definition: ASTContext.h:3235
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,...
Definition: ASTContext.h:2380
unsigned char getFixedPointIBits(QualType Ty) const
QualType getCorrespondingSignedFixedPointType(QualType Ty) const
IntrusiveRefCntPtr< ExternalASTSource > ExternalSource
Definition: ASTContext.h:649
CanQualType FloatTy
Definition: ASTContext.h:1103
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.
Definition: ASTContext.h:1872
bool isObjCIdType(QualType T) const
Definition: ASTContext.h:2900
QualType getPackExpansionType(QualType Pattern, std::optional< unsigned > NumExpansions, bool ExpectPackInType=true)
Form a pack expansion type with the given pattern.
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.
CanQualType getCanonicalType(QualType T) const
Return the canonical (structural) type corresponding to the specified potentially non-canonical type ...
Definition: ASTContext.h:2575
unsigned NumImplicitDestructorsDeclared
The number of implicitly-declared destructors for which declarations were built.
Definition: ASTContext.h:3249
bool isObjCClassType(QualType T) const
Definition: ASTContext.h:2906
void setObjCNSStringType(QualType T)
Definition: ASTContext.h:1859
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:795
bool hasSameType(QualType T1, QualType T2) const
Determine whether the given types T1 and T2 are equivalent.
Definition: ASTContext.h:2591
bool propertyTypesAreCompatible(QualType, QualType)
void setInstantiatedFromUsingShadowDecl(UsingShadowDecl *Inst, UsingShadowDecl *Pattern)
CanQualType DoubleTy
Definition: ASTContext.h:1103
TemplateName getQualifiedTemplateName(NestedNameSpecifier *NNS, bool TemplateKeyword, TemplateName Template) const
Retrieve the template name that represents a qualified template name such as std::vector.
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
Definition: ASTContext.h:936
CanQualType SatLongAccumTy
Definition: ASTContext.h:1109
const XRayFunctionFilter & getXRayFilter() const
Definition: ASTContext.h:787
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.
std::vector< std::string > filterFunctionTargetVersionAttrs(const TargetVersionAttr *TV) const
OpenCLTypeKind getOpenCLTypeKind(const Type *T) const
Map an AST Type to an OpenCLTypeKind enum value.
QualType getFILEType() const
Retrieve the C FILE type.
Definition: ASTContext.h:1957
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.
Definition: ASTContext.h:2432
void getInjectedTemplateArgs(const TemplateParameterList *Params, SmallVectorImpl< TemplateArgument > &Args)
Get a template argument list with one argument per template parameter in a template parameter list,...
void setsigjmp_bufDecl(TypeDecl *sigjmp_bufDecl)
Set the type for the C sigjmp_buf type.
Definition: ASTContext.h:1976
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
Definition: ASTContext.h:1103
CanQualType OMPArrayShapingTy
Definition: ASTContext.h:1132
ASTContext(LangOptions &LOpts, SourceManager &SM, IdentifierTable &idents, SelectorTable &sels, Builtin::Context &builtins, TranslationUnitKind TUKind)
Definition: ASTContext.cpp:870
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
Definition: ASTContext.h:1098
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 '...
Definition: ASTContext.h:1891
void addComment(const RawComment &RC)
Definition: ASTContext.cpp:326
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...
CallingConv getDefaultCallingConvention(bool IsVariadic, bool IsCXXMethod, bool IsBuiltin=false) const
Retrieves the default calling convention for the current target.
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'.
Definition: ASTContext.h:1898
void setFILEDecl(TypeDecl *FILEDecl)
Set the type for the C FILE type.
Definition: ASTContext.h:1954
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
Definition: ASTContext.h:2774
QualType getMSGuidType() const
Retrieve the implicitly-predeclared 'struct _GUID' type.
Definition: ASTContext.h:2141
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...
const ASTRecordLayout & getASTObjCImplementationLayout(const ObjCImplementationDecl *D) const
Get or compute information about the layout of the specified Objective-C implementation.
CanQualType UnsignedLongFractTy
Definition: ASTContext.h:1108
QualType getEnumType(const EnumDecl *Decl) const
overridden_method_range overridden_methods(const CXXMethodDecl *Method) 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
Definition: ASTContext.h:1118
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
Definition: ASTContext.h:2912
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:724
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
Definition: ASTContext.h:1119
IdentifierInfo * getMakeIntegerSeqName() const
Definition: ASTContext.h:1931
bool QIdProtocolsAdoptObjCObjectProtocols(QualType QT, ObjCInterfaceDecl *IDecl)
QIdProtocolsAdoptObjCObjectProtocols - Checks that protocols in QT's qualified-id protocol list adopt...
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...
IdentifierInfo * getTypePackElementName() const
Definition: ASTContext.h:1937
bool BlockRequiresCopying(QualType Ty, const VarDecl *D)
Returns true iff we need copy/dispose helpers for the given type.
CanQualType NullPtrTy
Definition: ASTContext.h:1118
QualType getTypeDeclType(const TypeDecl *Decl, const TypeDecl *PrevDecl=nullptr) const
Return the unique reference to the type for the specified type declaration.
Definition: ASTContext.h:1591
CanQualType WideCharTy
Definition: ASTContext.h:1095
CanQualType OMPIteratorTy
Definition: ASTContext.h:1132
IdentifierTable & Idents
Definition: ASTContext.h:644
std::vector< Decl * > getTraversalScope() const
Definition: ASTContext.h:690
TemplateName getSubstTemplateTemplateParm(TemplateName replacement, Decl *AssociatedDecl, unsigned Index, std::optional< unsigned > PackIndex) const
Builtin::Context & BuiltinInfo
Definition: ASTContext.h:646
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:775
QualType getConstType(QualType T) const
Return the uniqued reference to the type for a const qualified type.
Definition: ASTContext.h:1299
TemplateArgument getInjectedTemplateArg(NamedDecl *ParamDecl)
QualType getFunctionTypeWithoutPtrSizes(QualType T)
Get a function type and produce the equivalent function type where pointer size address spaces in the...
llvm::iterator_range< overridden_cxx_method_iterator > overridden_method_range
Definition: ASTContext.h:1001
SelectorTable & Selectors
Definition: ASTContext.h:645
unsigned getMinGlobalAlignOfVar(uint64_t Size, const VarDecl *VD) const
Return the minimum alignement as specified by the target.
RawCommentList Comments
All comments in this translation unit.
Definition: ASTContext.h:805
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)
Definition: ASTContext.h:1836
TypedefDecl * getBOOLDecl() const
Retrieve declaration of 'BOOL' typedef.
Definition: ASTContext.h:2095
CanQualType SatShortFractTy
Definition: ASTContext.h:1112
QualType getDecayedType(QualType T) const
Return the uniqued reference to the decayed version of the given type.
bool canBindObjCObjectType(QualType To, QualType From)
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...
bool hasSameType(const Type *T1, const Type *T2) const
Definition: ASTContext.h:2594
QualType getObjCInstanceType()
Retrieve the Objective-C "instancetype" type, if already known; otherwise, returns a NULL type;.
Definition: ASTContext.h:1945
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:753
CanQualType Ibm128Ty
Definition: ASTContext.h:1103
void setASTMutationListener(ASTMutationListener *Listener)
Attach an AST mutation listener to the AST context.
Definition: ASTContext.h:1198
bool hasUniqueObjectRepresentations(QualType Ty, bool CheckIfTriviallyCopyable=true) const
Return true if the specified type has unique object representations according to (C++17 [meta....
bool typesAreBlockPointerCompatible(QualType, QualType)
CanQualType SatUnsignedAccumTy
Definition: ASTContext.h:1110
const ASTRecordLayout & getASTObjCInterfaceLayout(const ObjCInterfaceDecl *D) const
Get or compute information about the layout of the specified Objective-C interface.
QualType getObjCProtoType() const
Retrieve the type of the Objective-C Protocol class.
Definition: ASTContext.h:2110
void forEachMultiversionedFunctionVersion(const FunctionDecl *FD, llvm::function_ref< void(FunctionDecl *)> Pred) const
Visits all versions of a multiversioned function with the passed predicate.
void setInstantiatedFromUsingEnumDecl(UsingEnumDecl *Inst, UsingEnumDecl *Pattern)
Remember that the using enum decl Inst is an instantiation of the using enum decl Pattern of a class ...
QualType getBaseElementType(const ArrayType *VAT) const
Return the innermost element type of an array type.
QualType getPointerDiffType() const
Return the unique type for "ptrdiff_t" (C99 7.17) defined in <stddef.h>.
Decl * getPrimaryMergedDecl(Decl *D)
Definition: ASTContext.h:1035
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
Definition: ASTContext.h:1131
QualType getCanonicalTemplateSpecializationType(TemplateName T, ArrayRef< TemplateArgument > Args) const
CanQualType ObjCBuiltinIdTy
Definition: ASTContext.h:1123
overridden_cxx_method_iterator overridden_methods_end(const CXXMethodDecl *Method) const
VTableContextBase * getVTableContext()
void setBOOLDecl(TypedefDecl *TD)
Save declaration of 'BOOL' typedef.
Definition: ASTContext.h:2100
ComparisonCategories CompCategories
Types and expressions required to build C++2a three-way comparisons using operator<=>,...
Definition: ASTContext.h:2272
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
QualType AutoDeductTy
Definition: ASTContext.h:1149
CanQualType BoolTy
Definition: ASTContext.h:1092
void cacheRawCommentForDecl(const Decl &OriginalD, const RawComment &Comment) const
Attaches Comment to OriginalD and to its redeclaration chain and removes the redeclaration chain from...
Definition: ASTContext.cpp:470
void attachCommentsToJustParsedDecls(ArrayRef< Decl * > Decls, const Preprocessor *PP)
Searches existing comments for doc comments that should be attached to Decls.
Definition: ASTContext.cpp:496
QualType getIntTypeForBitwidth(unsigned DestWidth, unsigned Signed) const
getIntTypeForBitwidth - sets integer QualTy according to specified details: bitwidth,...
llvm::BumpPtrAllocator & getAllocator() const
Definition: ASTContext.h:714
void setStaticLocalNumber(const VarDecl *VD, unsigned Number)
QualType getCFConstantStringType() const
Return the C structure type used to represent constant CFStrings.
FieldDecl * getInstantiatedFromUnnamedFieldDecl(FieldDecl *Field)
void eraseDeclAttrs(const Decl *D)
Erase the attributes corresponding to the given declaration.
const NoSanitizeList & getNoSanitizeList() const
Definition: ASTContext.h:785
struct clang::ASTContext::CUDAConstantEvalContext CUDAConstantEvalCtx
IdentifierInfo * getNSObjectName() const
Retrieve the identifier 'NSObject'.
Definition: ASTContext.h:1903
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.
Definition: ASTContext.h:2074
QualType getDeducedTemplateSpecializationType(TemplateName Template, QualType DeducedType, bool IsDependent) const
C++17 deduced class template specialization type.
std::string getObjCEncodingForFunctionDecl(const FunctionDecl *Decl) const
Emit the encoded type for the function Decl into S.
QualType getTemplateTypeParmType(unsigned Depth, unsigned Index, bool ParameterPack, TemplateTypeParmDecl *ParmDecl=nullptr) const
Retrieve the template type parameter type for a template parameter or parameter pack with the given d...
bool addressSpaceMapManglingFor(LangAS AS) const
Definition: ASTContext.h:2863
CanQualType UnsignedFractTy
Definition: ASTContext.h:1108
QualType getjmp_bufType() const
Retrieve the C jmp_buf type.
Definition: ASTContext.h:1969
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.
Definition: ASTContext.h:1981
void addOverriddenMethod(const CXXMethodDecl *Method, const CXXMethodDecl *Overridden)
Note that the given C++ Method overrides the given Overridden method.
const TargetInfo * getAuxTargetInfo() const
Definition: ASTContext.h:758
CanQualType Float128Ty
Definition: ASTContext.h:1103
CanQualType ObjCBuiltinClassTy
Definition: ASTContext.h:1123
unsigned NumImplicitDefaultConstructorsDeclared
The number of implicitly-declared default constructors for which declarations were built.
Definition: ASTContext.h:3214
CanQualType UnresolvedTemplateTy
Definition: ASTContext.h:1119
void setucontext_tDecl(TypeDecl *ucontext_tDecl)
Set the type for the C ucontext_t type.
Definition: ASTContext.h:1988
OMPTraitInfo & getNewOMPTraitInfo()
Return a new OMPTraitInfo object owned by this context.
CanQualType UnsignedLongTy
Definition: ASTContext.h:1101
bool hasSameTemplateName(const TemplateName &X, const TemplateName &Y) const
Determine whether the given template names refer to the same template.
llvm::DenseSet< const FunctionDecl * > CUDAImplicitHostDeviceFunUsedByDevice
Keep track of CUDA/HIP implicit host device functions used on device side in device compilation.
Definition: ASTContext.h:1171
void DeepCollectObjCIvars(const ObjCInterfaceDecl *OI, bool leafClass, SmallVectorImpl< const ObjCIvarDecl * > &Ivars) const
DeepCollectObjCIvars - This routine first collects all declared, but not synthesized,...
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,...
void addedLocalImportDecl(ImportDecl *Import)
Notify the AST context that a new import declaration has been parsed or implicitly created within thi...
const TranslationUnitKind TUKind
Definition: ASTContext.h:647
QualType getQualifiedType(const Type *T, Qualifiers Qs) const
Return a type with additional qualifiers.
Definition: ASTContext.h:2171
CanQualType UnsignedLongAccumTy
Definition: ASTContext.h:1106
QualType AutoRRefDeductTy
Definition: ASTContext.h:1150
QualType getRestrictType(QualType T) const
Return the uniqued reference to the type for a restrict qualified type.
Definition: ASTContext.h:1279
CanQualType getSizeType() const
Return the unique type for "size_t" (C99 7.17), defined in <stddef.h>.
TypeInfo getTypeInfo(const Type *T) const
Get the size and alignment of the specified complete type in bits.
CanQualType ShortFractTy
Definition: ASTContext.h:1107
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 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.
Definition: ASTContext.h:2105
TypeSourceInfo * getTemplateSpecializationTypeInfo(TemplateName T, SourceLocation TLoc, const TemplateArgumentListInfo &Args, QualType Canon=QualType()) const
QualType getSubstTemplateTypeParmPackType(Decl *AssociatedDecl, unsigned Index, bool Final, const TemplateArgument &ArgPack)
Retrieve a.
CanQualType BoundMemberTy
Definition: ASTContext.h:1119
CanQualType SatUnsignedShortFractTy
Definition: ASTContext.h:1113
CanQualType CharTy
Definition: ASTContext.h:1093
QualType removeAddrSpaceQualType(QualType T) const
Remove any existing address space on the type and returns the type with qualifiers intact (or that's ...
TypedefDecl * getInt128Decl() const
Retrieve the declaration for the 128-bit signed integer type.
unsigned getOpenMPDefaultSimdAlign(QualType T) const
Get default simd alignment of the specified complete type in bits.
QualType getObjCSuperType() const
Returns the C struct type for objc_super.
QualType getBlockDescriptorType() const
Gets the struct used to keep track of the descriptor for pointer to blocks.
bool CommentsLoaded
True if comments are already loaded from ExternalASTSource.
Definition: ASTContext.h:808
BlockVarCopyInit getBlockVarCopyInit(const VarDecl *VD) const
Get the copy initialization expression of the VarDecl VD, or nullptr if none exists.
unsigned NumImplicitMoveConstructorsDeclared
The number of implicitly-declared move constructors for which declarations were built.
Definition: ASTContext.h:3228
unsigned NumImplicitCopyConstructorsDeclared
The number of implicitly-declared copy constructors for which declarations were built.
Definition: ASTContext.h:3221
CanQualType IntTy
Definition: ASTContext.h:1100
llvm::DenseSet< const VarDecl * > CUDADeviceVarODRUsedByHost
Keep track of CUDA/HIP device-side variables ODR-used by host code.
Definition: ASTContext.h:1163
CanQualType PseudoObjectTy
Definition: ASTContext.h:1122
QualType getWebAssemblyExternrefType() const
Return a WebAssembly externref type.
void setTraversalScope(const std::vector< Decl * > &)
Definition: ASTContext.cpp:937
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
Definition: ASTContext.h:1340
friend class NestedNameSpecifier
Definition: ASTContext.h:183
void PrintStats() const
Definition: ASTContext.cpp:951
unsigned getAlignOfGlobalVar(QualType T, const VarDecl *VD) const
Return the alignment in bits that should be given to a global variable with type T.
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.
Definition: ASTContext.cpp:573
unsigned NumImplicitDestructors
The number of implicitly-declared destructors.
Definition: ASTContext.h:3245
CanQualType Float16Ty
Definition: ASTContext.h:1117
QualType getQualifiedType(SplitQualType split) const
Un-split a SplitQualType.
Definition: ASTContext.h:2157
QualType getElaboratedType(ElaboratedTypeKeyword Keyword, NestedNameSpecifier *NNS, QualType NamedType, TagDecl *OwnedTagDecl=nullptr) const
bool isAlignmentRequired(const Type *T) const
Determine if the alignment the type has was required using an alignment attribute.
TagDecl * MSGuidTagDecl
Definition: ASTContext.h:1157
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.
QualType getUnqualifiedArrayType(QualType T, Qualifiers &Quals)
Return this type as a completely-unqualified array type, capturing the qualifiers in Quals.
CanQualType SignedCharTy
Definition: ASTContext.h:1100
QualType getObjCObjectPointerType(QualType OIT) const
Return a ObjCObjectPointerType type for the given ObjCObjectType.
ASTMutationListener * Listener
Definition: ASTContext.h:650
void setNonKeyFunction(const CXXMethodDecl *method)
Observe that the given method cannot be a key function.
CanQualType ObjCBuiltinBoolTy
Definition: ASTContext.h:1124
TypeInfoChars getTypeInfoInChars(const Type *T) 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.
Definition: ASTContext.h:1416
TemplateParamObjectDecl * getTemplateParamObjectDecl(QualType T, const APValue &V) const
Return the template parameter object of the given type with the given value.
const SourceManager & getSourceManager() const
Definition: ASTContext.h:706
CanQualType OverloadTy
Definition: ASTContext.h:1119
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.
CanQualType OCLClkEventTy
Definition: ASTContext.h:1128
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.
Definition: ASTContext.h:2400
const clang::PrintingPolicy & getPrintingPolicy() const
Definition: ASTContext.h:697
ArrayRef< Module * > getModulesWithMergedDefinition(const NamedDecl *Def)
Get the additional modules in which the definition Def has been merged.
static ImportDecl * getNextLocalImport(ImportDecl *Import)
Definition: ASTContext.h:1025
llvm::FixedPointSemantics getFixedPointSemantics(QualType Ty) const
QualType getDependentSizedArrayType(QualType EltTy, Expr *NumElts, ArraySizeModifier ASM, unsigned IndexTypeQuals, SourceRange Brackets) const
Return a non-unique reference to the type for a dependently-sized array of the specified element type...
uint64_t lookupFieldBitOffset(const ObjCInterfaceDecl *OID, const ObjCImplementationDecl *ID, const ObjCIvarDecl *Ivar) const
Get the offset of an ObjCIvarDecl in bits.
CanQualType SatUnsignedShortAccumTy
Definition: ASTContext.h:1110
QualType mergeTypes(QualType, QualType, bool OfBlockPointer=false, bool Unqualified=false, bool BlockReturnType=false, bool IsConditionalOperator=false)
const RawComment * getRawCommentForAnyRedecl(const Decl *D, const Decl **OriginalDecl=nullptr) const
Return the documentation comment attached to a given declaration.
Definition: ASTContext.cpp:402
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.
static bool isObjCNSObjectType(QualType Ty)
Return true if this is an NSObject object with its NSObject attribute set.
Definition: ASTContext.h:2321
GVALinkage GetGVALinkageForVariable(const VarDecl *VD) const
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)...
Definition: ASTContext.h:1789
QualType getObjCIdType() const
Represents the Objective-CC id type.
Definition: ASTContext.h:2064
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".
llvm::DenseSet< const ValueDecl * > CUDAExternalDeviceDeclODRUsedByHost
Keep track of CUDA/HIP external kernels or device variables ODR-used by host code.
Definition: ASTContext.h:1167
bool hasSameUnqualifiedType(QualType T1, QualType T2) const
Determine whether the given types are equivalent after cvr-qualifiers have been removed.
Definition: ASTContext.h:2618
QualType getCorrespondingUnsaturatedType(QualType Ty) const
comments::FullComment * getCommentForDecl(const Decl *D, const Preprocessor *PP) const
Return parsed documentation comment attached to a given declaration.
Definition: ASTContext.cpp:578
FunctionProtoType::ExceptionSpecInfo mergeExceptionSpecs(FunctionProtoType::ExceptionSpecInfo ESI1, FunctionProtoType::ExceptionSpecInfo ESI2, SmallVectorImpl< QualType > &ExceptionTypeStorage, bool AcceptDependent)
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.
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.
uint64_t getTypeSize(QualType T) const
Return the size of the specified (complete) type T, in bits.
Definition: ASTContext.h:2341
CanQualType UnsignedInt128Ty
Definition: ASTContext.h:1102
CanQualType BuiltinFnTy
Definition: ASTContext.h:1121
ObjCInterfaceDecl * getObjCProtocolDecl() const
Retrieve the Objective-C class declaration corresponding to the predefined Protocol class.
unsigned NumImplicitDefaultConstructors
The number of implicitly-declared default constructors.
Definition: ASTContext.h:3210
CharUnits getTypeSizeInChars(QualType T) const
Return the size of the specified (complete) type T, in characters.
unsigned NumImplicitMoveAssignmentOperatorsDeclared
The number of implicitly-declared move assignment operators for which declarations were built.
Definition: ASTContext.h:3242
void setManglingNumber(const NamedDecl *ND, unsigned Number)
llvm::DenseMap< const Decl *, const RawComment * > DeclRawComments
Mapping from declaration to directly attached comment.
Definition: ASTContext.h:814
CanQualType OCLSamplerTy
Definition: ASTContext.h:1128
TypedefDecl * getBuiltinVaListDecl() const
Retrieve the C type declaration corresponding to the predefined __builtin_va_list type.
TypeInfo getTypeInfo(QualType T) const
Definition: ASTContext.h:2335
CanQualType VoidTy
Definition: ASTContext.h:1091
CanQualType UnsignedCharTy
Definition: ASTContext.h:1101
CanQualType UnsignedShortFractTy
Definition: ASTContext.h:1108
BuiltinTemplateDecl * buildBuiltinTemplateDecl(BuiltinTemplateKind BTK, const IdentifierInfo *II) const
void * Allocate(size_t Size, unsigned Align=8) const
Definition: ASTContext.h:718
bool canBuiltinBeRedeclared(const FunctionDecl *) const
Return whether a declaration to a builtin is allowed to be overloaded/redeclared.
CanQualType UnsignedIntTy
Definition: ASTContext.h:1101
TemplateName getDependentTemplateName(NestedNameSpecifier *NNS, const IdentifierInfo *Name) const
Retrieve the template name that represents a dependent template name such as MetaFun::template apply.
unsigned NumImplicitMoveConstructors
The number of implicitly-declared move constructors.
Definition: ASTContext.h:3224
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.
Definition: ASTContext.h:1288
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.
TypeSourceInfo * CreateTypeSourceInfo(QualType T, unsigned Size=0) const
Allocate an uninitialized TypeSourceInfo.
QualType getObjCClassRedefinitionType() const
Retrieve the type that Class has been defined to, which may be different from the built-in Class if C...
Definition: ASTContext.h:1878
TagDecl * getMSGuidTagDecl() const
Retrieve the implicitly-predeclared 'struct _GUID' declaration.
Definition: ASTContext.h:2138
QualType getExceptionObjectType(QualType T) const
CanQualType UnknownAnyTy
Definition: ASTContext.h:1120
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 ...
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
Definition: ASTContext.h:1564
CanQualType UnsignedLongLongTy
Definition: ASTContext.h:1102
QualType GetBuiltinType(unsigned ID, GetBuiltinTypeError &Error, unsigned *IntegerConstantArgs=nullptr) const
Return the type for the specified builtin.
QualType getCommonSugaredType(QualType X, QualType Y, bool Unqualified=false)
CanQualType OCLReserveIDTy
Definition: ASTContext.h:1129
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...
size_t getASTAllocatedMemory() const
Return the total amount of physical memory allocated for representing AST nodes and type information.
Definition: ASTContext.h:746
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
Definition: ASTContext.h:1101
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...
QualType getObjCConstantStringInterface() const
Definition: ASTContext.h:1851
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.
Definition: ASTContext.h:1569
QualType getDependentNameType(ElaboratedTypeKeyword Keyword, NestedNameSpecifier *NNS, const IdentifierInfo *Name, QualType Canon=QualType()) const
bool canAssignObjCInterfacesInBlockPointer(const ObjCObjectPointerType *LHSOPT, const ObjCObjectPointerType *RHSOPT, bool BlockReturnType)
canAssignObjCInterfacesInBlockPointer - This routine is specifically written for providing type-safet...
CanQualType SatUnsignedLongFractTy
Definition: ASTContext.h:1114
void setcudaConfigureCallDecl(FunctionDecl *FD)
Definition: ASTContext.h:1421
CanQualType getDecayedType(CanQualType T) const
Definition: ASTContext.h:1368
QualType getObjCIdRedefinitionType() const
Retrieve the type that id has been defined to, which may be different from the built-in id if id has ...
Definition: ASTContext.h:1865
const CXXConstructorDecl * getCopyConstructorForExceptionObject(CXXRecordDecl *RD)
QualType getDependentAddressSpaceType(QualType PointeeType, Expr *AddrSpaceExpr, SourceLocation AttrLoc) const
QualType getPackIndexingType(QualType Pattern, Expr *IndexExpr, bool FullySubstituted=false, ArrayRef< QualType > Expansions={}, int Index=-1) const
RawComment * getRawCommentForDeclNoCache(const Decl *D) const
Return the documentation comment attached to a given declaration, without looking into cache.
Definition: ASTContext.cpp:293
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.
Definition: ASTContext.h:3026
const VariableArrayType * getAsVariableArrayType(QualType T) const
Definition: ASTContext.h:2771
QualType getUnaryTransformType(QualType BaseType, QualType UnderlyingType, UnaryTransformType::UTTKind UKind) const
Unary type transforms.
const Type * getCanonicalType(const Type *T) const
Definition: ASTContext.h:2579
void setExternalSource(IntrusiveRefCntPtr< ExternalASTSource > Source)
Attach an external AST source to the AST context.
Definition: ASTContext.cpp:947
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
Definition: ASTContext.h:1100
StringLiteral * getPredefinedStringLiteralFromCache(StringRef Key) const
Return a string representing the human readable name for the specified function declaration or file n...
bool UnwrapSimilarTypes(QualType &T1, QualType &T2, bool AllowPiMismatch=true)
Attempt to unwrap two types that may be similar (C++ [conv.qual]).
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.
bool areCompatibleSveTypes(QualType FirstType, QualType SecondType)
Return true if the given types are an SVE builtin and a VectorType that is a fixed-length representat...
void setObjCClassRedefinitionType(QualType RedefType)
Set the user-written type that redefines 'SEL'.
Definition: ASTContext.h:1885
bool hasDirectOwnershipQualifier(QualType Ty) const
Return true if the type has been explicitly qualified with ObjC ownership.
CanQualType FractTy
Definition: ASTContext.h:1107
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)
FunctionDecl * getcudaConfigureCallDecl()
Definition: ASTContext.h:1425
DiagnosticsEngine & getDiagnostics() const
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...
Definition: ASTContext.h:2192
void ResetObjCLayout(const ObjCContainerDecl *CD)
CanQualType LongAccumTy
Definition: ASTContext.h:1105
interp::Context & getInterpContext()
Returns the clang bytecode interpreter context.
Definition: ASTContext.cpp:844
CanQualType Char32Ty
Definition: ASTContext.h:1099
QualType getCVRQualifiedType(QualType T, unsigned CVR) const
Return a type with additional const, volatile, or restrict qualifiers.
Definition: ASTContext.h:2152
UnnamedGlobalConstantDecl * getUnnamedGlobalConstantDecl(QualType Ty, const APValue &Value) const
Return a declaration for a uniquified anonymous global constant corresponding to a given APValue.
CanQualType SatFractTy
Definition: ASTContext.h:1112
QualType getExtVectorType(QualType VectorType, unsigned NumElts) const
Return the unique reference to an extended vector type of the specified element type and size.
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
CanQualType SatLongFractTy
Definition: ASTContext.h:1112
const TargetInfo & getTargetInfo() const
Definition: ASTContext.h:757
void setInstantiatedFromUnnamedFieldDecl(FieldDecl *Inst, FieldDecl *Tmpl)
CanQualType OCLQueueTy
Definition: ASTContext.h:1129
CanQualType LongFractTy
Definition: ASTContext.h:1107
CanQualType SatShortAccumTy
Definition: ASTContext.h:1109
QualType getAutoDeductType() const
C++11 deduction pattern for 'auto' type.
CanQualType BFloat16Ty
Definition: ASTContext.h:1116
unsigned NumImplicitCopyConstructors
The number of implicitly-declared copy constructors.
Definition: ASTContext.h:3217
CharUnits toCharUnitsFromBits(int64_t BitSize) const
Convert a size in bits to a size in characters.
CanQualType IncompleteMatrixIdxTy
Definition: ASTContext.h:1130
std::optional< CharUnits > getTypeSizeInCharsIfKnown(QualType Ty) const
Definition: ASTContext.h:2360
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.
Definition: ASTContext.h:2180
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
Definition: ASTContext.h:1855
TargetCXXABI::Kind getCXXABIKind() const
Return the C++ ABI kind that should be used.
Definition: ASTContext.cpp:818
void setjmp_bufDecl(TypeDecl *jmp_bufDecl)
Set the type for the C jmp_buf type.
Definition: ASTContext.h:1964
void addDestruction(T *Ptr) const
If T isn't trivially destructible, calls AddDeallocation to register it for destruction.
Definition: ASTContext.h:3112
QualType getAddrSpaceQualType(QualType T, LangAS AddressSpace) const
Return the uniqued reference to the type for an address space qualified type with the specified type ...
ExternalASTSource * getExternalSource() const
Retrieve a pointer to the external AST source associated with this AST context, if any.
Definition: ASTContext.h:1189
uint64_t getConstantArrayElementCount(const ConstantArrayType *CA) const
Return number of constant array elements.
BuiltinTemplateDecl * getTypePackElementDecl() const
CanQualType SatUnsignedLongAccumTy
Definition: ASTContext.h:1111
QualType getUnconstrainedType(QualType T) const
Remove any type constraints from a template parameter type, for equivalence comparison of template pa...
CanQualType LongLongTy
Definition: ASTContext.h:1100
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.
Definition: ASTContext.h:2162
llvm::DenseMap< const Decl *, const Decl * > CommentlessRedeclChains
Keeps track of redeclaration chains that don't have any comment attached.
Definition: ASTContext.h:830
uint64_t getArrayInitLoopExprElementCount(const ArrayInitLoopExpr *AILE) const
Return number of elements initialized in an ArrayInitLoopExpr.
void deduplicateMergedDefinitonsFor(NamedDecl *ND)
Clean up the merged definition list.
unsigned getTargetAddressSpace(LangAS AS) const
QualType getWideCharType() const
Return the type of wide characters.
Definition: ASTContext.h:1794
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...
void addTranslationUnitDecl()
Definition: ASTContext.h:1076
CanQualType WCharTy
Definition: ASTContext.h:1094
bool hasSameNullabilityTypeQualifier(QualType SubT, QualType SuperT, bool IsParam) const
Definition: ASTContext.h:2623
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.
Definition: ASTContext.h:3231
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:721
llvm::DenseMap< const Decl *, const Decl * > RedeclChainComments
Mapping from canonical declaration to the first redeclaration in chain that has a comment attached.
Definition: ASTContext.h:821
CanQualType getSignedSizeType() const
Return the unique signed counterpart of the integer type corresponding to size_t.
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.
Definition: ASTContext.h:2202
QualType getDecltypeType(Expr *e, QualType UnderlyingType) const
C++11 decltype.
QualType getLogicalOperationType() const
The result type of logical operations, '<', '>', '!=', etc.
Definition: ASTContext.h:2000
NestedNameSpecifier * getCanonicalNestedNameSpecifier(NestedNameSpecifier *NNS) const
Retrieves the "canonical" nested name specifier for a given nested name specifier.
QualType getTypedefType(const TypedefNameDecl *Decl, QualType Underlying=QualType()) const
Return the unique reference to the type for the specified typedef-name decl.
InlineVariableDefinitionKind getInlineVariableDefinitionKind(const VarDecl *VD) const
Determine whether a definition of this inline variable should be treated as a weak or strong definiti...
void setPrimaryMergedDecl(Decl *D, Decl *Primary)
Definition: ASTContext.h:1039
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'.
Definition: ASTContext.h:1925
QualType getSubstTemplateTypeParmType(QualType Replacement, Decl *AssociatedDecl, unsigned Index, std::optional< unsigned > PackIndex) const
Retrieve a substitution-result type.
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...
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
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.
Definition: ASTContext.h:2243
@ GE_Missing_stdio
Missing a type from <stdio.h>
Definition: ASTContext.h:2249
@ GE_Missing_type
Missing a type.
Definition: ASTContext.h:2246
@ GE_Missing_ucontext
Missing a type from <ucontext.h>
Definition: ASTContext.h:2255
@ GE_Missing_setjmp
Missing a type from <setjmp.h>
Definition: ASTContext.h:2252
QualType adjustStringLiteralBaseType(QualType StrLTy) const
QualType getTypeOfExprType(Expr *E, TypeOfKind Kind) const
C23 feature and GCC extension.
CanQualType Char8Ty
Definition: ASTContext.h:1097
QualType getSignedWCharType() const
Return the type of "signed wchar_t".
bool hasCvrSimilarType(QualType T1, QualType T2)
Determine if two types are similar, ignoring only CVR qualifiers.
ObjCImplementationDecl * getObjCImplementation(ObjCInterfaceDecl *D)
Get the implementation of the ObjCInterfaceDecl D, or nullptr if none exists.
CanQualType HalfTy
Definition: ASTContext.h:1115
CanQualType UnsignedAccumTy
Definition: ASTContext.h:1106
void setObjCMethodRedeclaration(const ObjCMethodDecl *MD, const ObjCMethodDecl *Redecl)
void addTypedefNameForUnnamedTagDecl(TagDecl *TD, TypedefNameDecl *TND)
bool isDependenceAllowed() const
Definition: ASTContext.h:781
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.
Definition: ASTContext.h:1808
QualType getVariableArrayDecayedType(QualType Ty) const
Returns a vla type where known sizes are replaced with [*].
void setCFConstantStringType(QualType T)
ASTContext & operator=(const ASTContext &)=delete
Module * getCurrentNamedModule() const
Get module under construction, nullptr if this is not a C++20 module.
Definition: ASTContext.h:1071
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...
CanQualType OCLEventTy
Definition: ASTContext.h:1128
void setPrintingPolicy(const clang::PrintingPolicy &Policy)
Definition: ASTContext.h:701
void AddDeallocation(void(*Callback)(void *), void *Data) const
Add a deallocation callback that will be invoked when the ASTContext is destroyed.
Definition: ASTContext.cpp:942
AttrVec & getDeclAttrs(const Decl *D)
Retrieve the attributes for the given declaration.
CXXMethodVector::const_iterator overridden_cxx_method_iterator
Definition: ASTContext.h:991
RawComment * getRawCommentForDeclNoCacheImpl(const Decl *D, const SourceLocation RepresentativeLocForDecl, const std::map< unsigned, RawComment * > &CommentsInFile) const
Definition: ASTContext.cpp:215
unsigned getTypeAlign(QualType T) const
Return the ABI-specified alignment of a (complete) type T, in bits.
Definition: ASTContext.h:2372
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'.
Definition: ASTContext.h:1912
uint64_t getCharWidth() const
Return the size of the character type, in bits.
Definition: ASTContext.h:2345
CanQualType getPointerType(CanQualType T) const
Definition: ASTContext.h:1347
import_range local_imports() const
Definition: ASTContext.h:1031
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
Definition: ASTContext.h:2777
unsigned NumImplicitMoveAssignmentOperators
The number of implicitly-declared move assignment operators.
Definition: ASTContext.h:3238
An abstract interface that should be implemented by listeners that want to be notified when an AST en...
Reads an AST files chain containing the contents of a translation unit.
Definition: ASTReader.h:366
ASTRecordLayout - This class contains layout information for one RecordDecl, which is a struct/union/...
Definition: RecordLayout.h:38
Writes an AST file containing the contents of a translation unit.
Definition: ASTWriter.h:90
Represents a loop initializing the elements of an array.
Definition: Expr.h:5511
Represents an array type, per C99 6.7.5.2 - Array Declarators.
Definition: Type.h:3518
AtomicExpr - Variadic atomic builtins: __atomic_exchange, __atomic_fetch_*, __atomic_load,...
Definition: Expr.h:6437
BlockExpr - Adaptor class for mixing a BlockDecl with expressions.
Definition: Expr.h:6173
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: Type.h:2981
Holds information about both target-independent and target-specific builtins, allowing easy queries b...
Definition: Builtins.h:85
Implements C++ ABI-specific semantic analysis functions.
Definition: CXXABI.h:29
Represents a C++ constructor within a class.
Definition: DeclCXX.h:2535
Represents a static or instance method of a struct/union/class.
Definition: DeclCXX.h:2060
Represents a C++ struct/union/class.
Definition: DeclCXX.h:258
static CanQual< Type > CreateUnsafe(QualType Other)
Builds a canonical type from a QualType.
const T * getTypePtr() const
Retrieve the underlying type pointer, which refers to a canonical type.
Definition: CanonicalType.h:83
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: Type.h:3556
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
Definition: DeclBase.h:1436
A list storing NamedDecls in the lookup tables.
Definition: DeclBase.h:1316
Decl - This represents one declaration (or definition), e.g.
Definition: DeclBase.h:86
Decl * getMostRecentDecl()
Retrieve the most recent declaration that declares the same entity as this declaration (which may be ...
Definition: DeclBase.h:1066
ObjCDeclQualifier
ObjCDeclQualifier - 'Qualifiers' written next to the return and parameter types in method declaration...
Definition: DeclBase.h:198
DeclarationNameTable is used to store and retrieve DeclarationName instances for the various kinds of...
The name of a declaration.
Represents a ValueDecl that came out of a declarator.
Definition: Decl.h:770
Common base class for placeholders for types that get replaced by placeholder type deduction: C++11 a...
Definition: Type.h:5947
Represents an array type in C++ whose size is a value-dependent expression.
Definition: Type.h:3801
Concrete class used by the front-end to report problems and issues.
Definition: Diagnostic.h:192
Container for either a single DynTypedNode or for an ArrayRef to DynTypedNode.
Represents an enum.
Definition: Decl.h:3867
This represents one expression.
Definition: Expr.h:110
Declaration context for names declared as extern "C" in C++.
Definition: Decl.h:222
Abstract interface for external sources of AST nodes.
Represents a member of a struct/union/class.
Definition: Decl.h:3057
A SourceLocation and its associated SourceManager.
Represents a function declaration or definition.
Definition: Decl.h:1971
Represents a prototype with parameter type info, e.g.
Definition: Type.h:4656
A class which abstracts out some details necessary for making a call.
Definition: Type.h:4367
FunctionType - C99 6.7.5.3 - Function Declarators.
Definition: Type.h:4256
GlobalDecl - represents a global declaration.
Definition: GlobalDecl.h:56
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:4799
Represents a C array with an unspecified size.
Definition: Type.h:3703
Provides support for incremental compilation.
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
Definition: LangOptions.h:461
A global _GUID constant.
Definition: DeclCXX.h:4289
MangleContext - Context for tracking state which persists across multiple calls to the C++ name mangl...
Definition: Mangle.h:45
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...
Definition: DeclTemplate.h:615
Describes a module or submodule.
Definition: Module.h:105
This represents a decl that may have a name.
Definition: Decl.h:249
Represents a C++ nested name specifier, such as "\::std::vector<int>::".
Helper data structure representing the traits in a match clause of an declare variant or metadirectiv...
ObjCCategoryDecl - Represents a category declaration.
Definition: DeclObjC.h:2326
ObjCCategoryImplDecl - An object of this class encapsulates a category @implementation declaration.
Definition: DeclObjC.h:2542
ObjCContainerDecl - Represents a container for method declarations.
Definition: DeclObjC.h:947
ObjCImplementationDecl - Represents a class definition - this is where method definitions are specifi...
Definition: DeclObjC.h:2594
Represents an ObjC class declaration.
Definition: DeclObjC.h:1153
ObjCIvarDecl - Represents an ObjC instance variable.
Definition: DeclObjC.h:1950
ObjCMethodDecl - Represents an instance or class method declaration.
Definition: DeclObjC.h:140
Represents a pointer to an Objective C object.
Definition: Type.h:7008
Represents a class type in Objective C.
Definition: Type.h:6754
Represents one property declaration in an Objective-C interface.
Definition: DeclObjC.h:730
ObjCPropertyImplDecl - Represents implementation declaration of a property in a class or category imp...
Definition: DeclObjC.h:2802
Represents an Objective-C protocol declaration.
Definition: DeclObjC.h:2082
Represents the declaration of an Objective-C type parameter.
Definition: DeclObjC.h:578
Represents a parameter to a function.
Definition: Decl.h:1761
Pointer-authentication qualifiers.
Definition: Type.h:145
Engages in a tight little dance with the lexer to efficiently preprocess tokens.
Definition: Preprocessor.h:128
A (possibly-)qualified type.
Definition: Type.h:940
PointerAuthQualifier getPointerAuth() const
Definition: Type.h:1447
const Type * getTypePtr() const
Retrieves a pointer to the underlying (unqualified) type.
Definition: Type.h:7359
A qualifier set is used to build a set of qualifiers.
Definition: Type.h:7299
const Type * strip(QualType type)
Collect any qualifiers on the given type and return an unqualified type.
Definition: Type.h:7306
The collection of all-type qualifiers we support.
Definition: Type.h:318
@ OCL_None
There is no lifetime qualification on this type.
Definition: Type.h:336
void removeObjCLifetime()
Definition: Type.h:537
bool hasNonFastQualifiers() const
Return true if the set contains any qualifiers which require an ExtQuals node to be allocated.
Definition: Type.h:624
unsigned getFastQualifiers() const
Definition: Type.h:605
static Qualifiers fromCVRMask(unsigned CVR)
Definition: Type.h:421
void setPointerAuth(PointerAuthQualifier Q)
Definition: Type.h:592
void addObjCLifetime(ObjCLifetime type)
Definition: Type.h:538
This class represents all comments included in the translation unit, sorted in order of appearance in...
Represents a struct/union/class.
Definition: Decl.h:4168
void setPreviousDecl(decl_type *PrevDecl)
Set the previous declaration.
Definition: Decl.h:4994
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.
A trivial tuple used to represent a source range.
An allocator for DiagnosticStorage objects, which uses a small cache to objects, used to reduce mallo...
Definition: Diagnostic.h:1119
The streaming interface shared between DiagnosticBuilder and PartialDiagnostic.
Definition: Diagnostic.h:1115
StringLiteral - This represents a string literal expression, e.g.
Definition: Expr.h:1773
Represents the declaration of a struct/union/class/enum.
Definition: Decl.h:3584
Kind
The basic C++ ABI kind.
Definition: TargetCXXABI.h:31
Exposes information about the current target.
Definition: TargetInfo.h:218
A convenient class for passing around template argument information.
Definition: TemplateBase.h:632
Represents a template argument.
Definition: TemplateBase.h:61
Represents a C++ template name within the type system.
Definition: TemplateName.h:202
A template parameter object.
Stores a list of template parameters for a TemplateDecl and its derived classes.
Definition: DeclTemplate.h:73
Declaration of a template type parameter.
The top declaration context.
Definition: Decl.h:84
static TranslationUnitDecl * Create(ASTContext &C)
Definition: Decl.cpp:5272
Models the abbreviated syntax to constrain a template type parameter: template <convertible_to<string...
Definition: ASTConcept.h:231
Represents a declaration of a type.
Definition: Decl.h:3390
A container of type source information.
Definition: Type.h:7330
The base class of the type hierarchy.
Definition: Type.h:1813
bool isSignedIntegerOrEnumerationType() const
Determines whether this is an integer type that is signed or an enumeration types whose underlying ty...
Definition: Type.cpp:2156
bool isObjCNSObjectType() const
Definition: Type.cpp:4866
bool isDependentType() const
Whether this type is a dependent type, meaning that its definition somehow depends on a template para...
Definition: Type.h:2653
QualType getCanonicalTypeInternal() const
Definition: Type.h:2936
bool isIncompleteType(NamedDecl **Def=nullptr) const
Types are partitioned into 3 broad categories (C99 6.2.5p1): object types, function types,...
Definition: Type.cpp:2351
std::optional< NullabilityKind > getNullability() const
Determine the nullability of the given type.
Definition: Type.cpp:4625
Represents the declaration of a typedef-name via the 'typedef' type specifier.
Definition: Decl.h:3534
Base class for declarations which introduce a typedef-name.
Definition: Decl.h:3432
An artificial decl, representing a global anonymous constant value which is uniquified by value withi...
Definition: DeclCXX.h:4346
The iterator over UnresolvedSets.
Definition: UnresolvedSet.h:35
Represents a dependent using declaration which was marked with typename.
Definition: DeclCXX.h:3959
Represents a C++ using-enum-declaration.
Definition: DeclCXX.h:3713
Represents a shadow declaration implicitly introduced into a scope by a (resolved) using-declaration ...
Definition: DeclCXX.h:3320
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
Definition: Decl.h:706
Represents a variable declaration or definition.
Definition: Decl.h:918
Represents a C array with a specified size that is not an integer-constant-expression.
Definition: Type.h:3747
Represents a GCC generic vector type.
Definition: Type.h:3969
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:1083
Holds all information required to evaluate constexpr code in a module.
Definition: Context.h:40
bool operator!=(const CommonEntityInfo &LHS, const CommonEntityInfo &RHS)
Definition: Types.h:129
const internal::VariadicAllOfMatcher< Type > type
Matches Types in the clang AST.
const internal::VariadicDynCastAllOfMatcher< Stmt, BlockExpr > blockExpr
Matches a reference to a block.
The JSON file list parser is used to communicate input to InstallAPI.
OverloadedOperatorKind
Enumeration specifying the different kinds of C++ overloaded operators.
Definition: OperatorKinds.h:21
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: Type.h:1772
bool isTargetAddressSpace(LangAS AS)
Definition: AddressSpaces.h:77
OpenCLTypeKind
OpenCL type kinds.
Definition: TargetInfo.h:204
@ Nullable
Values of this type can be null.
@ Unspecified
Whether values of this type can be null is (explicitly) unspecified.
@ NonNull
Values of this type can never be null.
TypeOfKind
The kind of 'typeof' expression we're after.
Definition: Type.h:921
bool operator==(const CallGraphNode::CallRecord &LHS, const CallGraphNode::CallRecord &RHS)
Definition: CallGraph.h:207
CanQual< Type > CanQualType
Represents a canonical, potentially-qualified type.
const StreamingDiagnostic & operator<<(const StreamingDiagnostic &DB, const ASTContext::SectionInfo &Section)
Insertion operator for diagnostics.
@ Module
Module linkage, which indicates that the entity can be referred to from other translation units withi...
Selector GetUnarySelector(StringRef name, ASTContext &Ctx)
Utility function for constructing an unary selector.
Definition: ASTContext.h:3431
@ Result
The result type of a method or function.
ArraySizeModifier
Capture whether this is a normal array (e.g.
Definition: Type.h:3515
Selector GetNullarySelector(StringRef name, ASTContext &Ctx)
Utility function for constructing a nullary selector.
Definition: ASTContext.h:3425
TagTypeKind
The kind of a tag type.
Definition: Type.h:6299
BuiltinTemplateKind
Kinds of BuiltinTemplateDecl.
Definition: Builtins.h:302
LangAS
Defines the address space values used by the address space qualifier of QualType.
Definition: AddressSpaces.h:25
TranslationUnitKind
Describes the kind of translation unit being processed.
Definition: LangOptions.h:1033
@ TU_Incremental
The translation unit is a is a complete translation unit that we might incrementally extend later.
Definition: LangOptions.h:1046
FloatModeKind
Definition: TargetInfo.h:72
const FunctionProtoType * T
TemplateSpecializationKind
Describes the kind of template specialization that a particular template specialization declaration r...
Definition: Specifiers.h:185
CallingConv
CallingConv - Specifies the calling convention that a function uses.
Definition: Specifiers.h:275
VectorKind
Definition: Type.h:3932
AlignRequirementKind
Definition: ASTContext.h:138
@ None
The alignment was not explicit in code.
@ RequiredByEnum
The alignment comes from an alignment attribute on a enum type.
@ RequiredByTypedef
The alignment comes from an alignment attribute on a typedef.
@ RequiredByRecord
The alignment comes from an alignment attribute on a record type.
ElaboratedTypeKeyword
The elaboration keyword that precedes a qualified type name or introduces an elaborated-type-specifie...
Definition: Type.h:6274
@ Other
Other implicit parameter.
Diagnostic wrappers for TextAPI types for error reporting.
Definition: Dominators.h:30
BuiltinVectorTypeInfo(QualType ElementType, llvm::ElementCount EC, unsigned NumVectors)
Definition: ASTContext.h:1493
CUDAConstantEvalContextRAII(ASTContext &Ctx_, bool NoWrongSidedVars)
Definition: ASTContext.h:662
bool NoWrongSidedVars
Do not allow wrong-sided variables in constant expressions.
Definition: ASTContext.h:657
SourceLocation PragmaSectionLocation
Definition: ASTContext.h:3391
SectionInfo(NamedDecl *Decl, SourceLocation PragmaSectionLocation, int SectionFlags)
Definition: ASTContext.h:3395
Copy initialization expr of a __block variable and a boolean flag that indicates whether the expressi...
Definition: Expr.h:6219
DeclarationNameInfo - A collector data type for bundling together a DeclarationName and the correspon...
Holds information about the various types of exception specification.
Definition: Type.h:4707
Extra information about a function prototype.
Definition: Type.h:4735
A cache of the value of this pointer, in the most recent generation in which we queried it.
A lazy value (of type T) that is within an AST node of type Owner, where the value might change in la...
llvm::PointerUnion< T, LazyData * > ValueType
Parts of a decomposed MSGuidDecl.
Definition: DeclCXX.h:4264
Contains information gathered from parsing the contents of TargetAttr.
Definition: TargetInfo.h:57
Describes how types, statements, expressions, and declarations should be printed.
Definition: PrettyPrinter.h:57
A std::pair-like structure for storing a qualified type split into its local qualifiers and its local...
Definition: Type.h:873
const Type * Ty
The locally-unqualified type.
Definition: Type.h:875
Qualifiers Quals
The local qualifiers.
Definition: Type.h:878
AlignRequirementKind AlignRequirement
Definition: ASTContext.h:169
TypeInfoChars(CharUnits Width, CharUnits Align, AlignRequirementKind AlignRequirement)
Definition: ASTContext.h:172
bool isAlignRequired()
Definition: ASTContext.h:161
AlignRequirementKind AlignRequirement
Definition: ASTContext.h:155
uint64_t Width
Definition: ASTContext.h:153
unsigned Align
Definition: ASTContext.h:154
TypeInfo(uint64_t Width, unsigned Align, AlignRequirementKind AlignRequirement)
Definition: ASTContext.h:158