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