17#ifndef LLVM_CLANG_AST_TYPE_BASE_H
18#define LLVM_CLANG_AST_TYPE_BASE_H
35#include "llvm/ADT/APInt.h"
36#include "llvm/ADT/APSInt.h"
37#include "llvm/ADT/ArrayRef.h"
38#include "llvm/ADT/FoldingSet.h"
39#include "llvm/ADT/PointerIntPair.h"
40#include "llvm/ADT/PointerUnion.h"
41#include "llvm/ADT/STLForwardCompat.h"
42#include "llvm/ADT/StringRef.h"
43#include "llvm/ADT/Twine.h"
44#include "llvm/ADT/iterator_range.h"
45#include "llvm/Support/Casting.h"
46#include "llvm/Support/Compiler.h"
47#include "llvm/Support/DXILABI.h"
48#include "llvm/Support/ErrorHandling.h"
49#include "llvm/Support/PointerLikeTypeTraits.h"
50#include "llvm/Support/TrailingObjects.h"
51#include "llvm/Support/type_traits.h"
79namespace serialization {
80 template <
class T>
class AbstractTypeReader;
117template <
typename>
class CanQual;
122class ExtQualsTypeCommonBase;
124class FunctionEffectsRef;
125class FunctionEffectKindSet;
126class FunctionEffectSet;
129class ObjCInterfaceDecl;
130class ObjCProtocolDecl;
131class ObjCTypeParamDecl;
132struct PrintingPolicy;
136class ClassTemplateDecl;
137class TemplateArgument;
138class TemplateArgumentListInfo;
139class TemplateArgumentLoc;
140class TemplateTypeParmDecl;
141class TypedefNameDecl;
142class UnresolvedUsingTypenameDecl;
143class UsingShadowDecl;
148#define TYPE(Class, Base) class Class##Type;
149#include "clang/AST/TypeNodes.inc"
152class PointerAuthQualifier {
156 EnabledMask = 1 << EnabledShift,
157 AddressDiscriminatedShift = EnabledShift + EnabledBits,
158 AddressDiscriminatedBits = 1,
159 AddressDiscriminatedMask = 1 << AddressDiscriminatedShift,
160 AuthenticationModeShift =
161 AddressDiscriminatedShift + AddressDiscriminatedBits,
162 AuthenticationModeBits = 2,
163 AuthenticationModeMask = ((1 << AuthenticationModeBits) - 1)
164 << AuthenticationModeShift,
165 IsaPointerShift = AuthenticationModeShift + AuthenticationModeBits,
167 IsaPointerMask = ((1 << IsaPointerBits) - 1) << IsaPointerShift,
168 AuthenticatesNullValuesShift = IsaPointerShift + IsaPointerBits,
169 AuthenticatesNullValuesBits = 1,
170 AuthenticatesNullValuesMask = ((1 << AuthenticatesNullValuesBits) - 1)
171 << AuthenticatesNullValuesShift,
172 KeyShift = AuthenticatesNullValuesShift + AuthenticatesNullValuesBits,
174 KeyMask = ((1 << KeyBits) - 1) << KeyShift,
175 DiscriminatorShift = KeyShift + KeyBits,
176 DiscriminatorBits = 16,
177 DiscriminatorMask = ((1u << DiscriminatorBits) - 1) << DiscriminatorShift,
188 static_assert((EnabledBits + AddressDiscriminatedBits +
189 AuthenticationModeBits + IsaPointerBits +
190 AuthenticatesNullValuesBits + KeyBits + DiscriminatorBits) ==
192 "PointerAuthQualifier should be exactly 32 bits");
193 static_assert((EnabledMask + AddressDiscriminatedMask +
194 AuthenticationModeMask + IsaPointerMask +
195 AuthenticatesNullValuesMask + KeyMask + DiscriminatorMask) ==
197 "All masks should cover the entire bits");
198 static_assert((EnabledMask ^ AddressDiscriminatedMask ^
199 AuthenticationModeMask ^ IsaPointerMask ^
200 AuthenticatesNullValuesMask ^ KeyMask ^ DiscriminatorMask) ==
202 "All masks should cover the entire bits");
205 unsigned ExtraDiscriminator,
207 bool IsIsaPointer,
bool AuthenticatesNullValues)
209 (IsAddressDiscriminated
210 ? llvm::to_underlying(AddressDiscriminatedMask)
213 (llvm::to_underlying(AuthenticationMode)
214 << AuthenticationModeShift) |
215 (ExtraDiscriminator << DiscriminatorShift) |
216 (IsIsaPointer << IsaPointerShift) |
217 (AuthenticatesNullValues << AuthenticatesNullValuesShift)) {
220 assert((Data == 0) ==
238 static PointerAuthQualifier
239 Create(
unsigned Key,
bool IsAddressDiscriminated,
unsigned ExtraDiscriminator,
241 bool AuthenticatesNullValues) {
246 AuthenticationMode, IsIsaPointer,
247 AuthenticatesNullValues);
251 assert((Data == 0) ==
260 return (Data & KeyMask) >> KeyShift;
267 return (Data & AddressDiscriminatedMask) >> AddressDiscriminatedShift;
272 return (Data >> DiscriminatorShift);
277 AuthenticationModeShift);
282 return (Data & IsaPointerMask) >> IsaPointerShift;
287 return (Data & AuthenticatesNullValuesMask) >> AuthenticatesNullValuesShift;
294 friend bool operator==(PointerAuthQualifier Lhs, PointerAuthQualifier Rhs) {
295 return Lhs.Data == Rhs.Data;
297 friend bool operator!=(PointerAuthQualifier Lhs, PointerAuthQualifier Rhs) {
298 return Lhs.Data != Rhs.Data;
309 PointerAuthQualifier
Result;
311 assert((
Result.Data == 0) ==
322 void Profile(llvm::FoldingSetNodeID &ID)
const { ID.AddInteger(Data); }
389 LPtrAuth == R.getPointerAuth()) {
393 R.setPointerAuth(
Empty);
398 Q.Mask = L.Mask & R.Mask;
407 R.removeCVRQualifiers(CommonCRV);
412 R.removeObjCGCAttr();
418 R.removeObjCLifetime();
424 R.removeAddressSpace();
492 assert(!(mask & ~
CVRMask) &&
"bitmask contains non-CVR bits");
496 assert(!(mask & ~
CVRMask) &&
"bitmask contains non-CVR bits");
497 Mask &= ~static_cast<uint64_t>(mask);
503 assert(!(mask & ~
CVRMask) &&
"bitmask contains non-CVR bits");
507 assert(!(mask & ~
CVRMask & ~UMask) &&
"bitmask contains non-CVRU bits");
513 Mask = (Mask & ~UMask) | (flag ? UMask : 0);
521 Mask = (Mask & ~GCAttrMask) | (
type << GCAttrShift);
546 return ObjCLifetime((Mask & LifetimeMask) >> LifetimeShift);
549 Mask = (Mask & ~LifetimeMask) | (
type << LifetimeShift);
555 Mask |= (
type << LifetimeShift);
572 return static_cast<LangAS>((Mask & AddressSpaceMask) >> AddressSpaceShift);
593 Mask = (Mask & ~AddressSpaceMask)
594 | (((uint32_t) space) << AddressSpaceShift);
607 Mask = (Mask & ~PtrAuthMask) |
621 assert(!(mask & ~
FastMask) &&
"bitmask contains non-fast qualifier bits");
625 assert(!(mask & ~
FastMask) &&
"bitmask contains non-fast qualifier bits");
626 Mask &= ~static_cast<uint64_t>(mask);
632 assert(!(mask & ~
FastMask) &&
"bitmask contains non-fast qualifier bits");
647 bool empty()
const {
return !Mask; }
802 bool appendSpaceIfNonEmpty =
false)
const;
804 void Profile(llvm::FoldingSetNodeID &ID)
const { ID.AddInteger(Mask); }
811 "PointerAuthQualifier must be 32 bits");
813 static constexpr uint64_t PtrAuthShift = 32;
814 static constexpr uint64_t PtrAuthMask = UINT64_C(0xffffffff) << PtrAuthShift;
816 static constexpr uint64_t UMask = 0x8;
817 static constexpr uint64_t UShift = 3;
818 static constexpr uint64_t GCAttrMask = 0x30;
819 static constexpr uint64_t GCAttrShift = 4;
820 static constexpr uint64_t LifetimeMask = 0x1C0;
821 static constexpr uint64_t LifetimeShift = 6;
822 static constexpr uint64_t AddressSpaceMask =
823 ~(
CVRMask | UMask | GCAttrMask | LifetimeMask | PtrAuthMask);
824 static constexpr uint64_t AddressSpaceShift = 9;
834 : Quals(Quals), HasAtomic(HasAtomic) {}
854 return {Quals.withVolatile(), HasAtomic};
858 return {Quals.withRestrict(), HasAtomic};
883 std::pair<const Type *,Qualifiers>
asPair()
const {
884 return std::pair<const Type *, Qualifiers>(
Ty,
Quals);
888 return a.
Ty ==
b.Ty && a.
Quals ==
b.Quals;
891 return a.
Ty !=
b.Ty || a.
Quals !=
b.Quals;
941 llvm::PointerIntPair<llvm::PointerUnion<const Type *, const ExtQuals *>,
944 const ExtQuals *getExtQualsUnsafe()
const {
948 const Type *getTypePtrUnsafe()
const {
952 const ExtQualsTypeCommonBase *getCommonPtr()
const {
953 assert(!
isNull() &&
"Cannot retrieve a NULL type pointer");
954 auto CommonPtrVal =
reinterpret_cast<uintptr_t>(
Value.getOpaqueValue());
956 return reinterpret_cast<ExtQualsTypeCommonBase*
>(CommonPtrVal);
988 T.Value.setFromOpaqueValue(
const_cast<void*
>(Ptr));
1005 return Value.getPointer().isNull();
1032 std::optional<NonConstantStorageReason>
1191 &&
"non-fast qualifier bits set in mask!");
1192 Value.setInt(Value.getInt() | TQs);
1202 Value.setInt(Value.getInt() & ~Mask);
1209 T.addFastQualifiers(TQs);
1222 T.removeLocalFastQualifiers();
1316 return getSingleStepDesugaredTypeImpl(*
this, Context);
1329 return LHS.Value == RHS.Value;
1332 return LHS.Value != RHS.Value;
1335 return LHS.Value < RHS.Value;
1349 const Twine &PlaceHolder = Twine(),
1350 unsigned Indentation = 0)
const;
1354 unsigned Indentation = 0) {
1355 return print(
split.Ty,
split.Quals, OS, policy, PlaceHolder, Indentation);
1360 const Twine &PlaceHolder,
1361 unsigned Indentation = 0);
1378 const Twine &PlaceHolder;
1379 unsigned Indentation;
1383 const Twine &PlaceHolder,
unsigned Indentation)
1384 : T(T), Policy(Policy), PlaceHolder(PlaceHolder),
1385 Indentation(Indentation) {}
1389 SQT.T.
print(OS, SQT.Policy, SQT.PlaceHolder, SQT.Indentation);
1395 const Twine &PlaceHolder = Twine(),
1396 unsigned Indentation = 0)
const {
1400 void dump(
const char *
s)
const;
1402 void dump(llvm::raw_ostream &OS,
const ASTContext &Context)
const;
1465 return PtrAuth.isAddressDiscriminated();
1552 return isDestructedTypeImpl(*
this);
1654raw_ostream &
operator<<(raw_ostream &OS, QualType QT);
1692class ExtQualsTypeCommonBase {
1703 const Type *
const BaseType;
1708 ExtQualsTypeCommonBase(
const Type *baseType,
QualType canon)
1709 : BaseType(baseType), CanonicalType(canon) {}
1722class alignas(TypeAlignment)
ExtQuals :
public ExtQualsTypeCommonBase,
1723 public llvm::FoldingSetNode {
1745 : ExtQualsTypeCommonBase(baseType,
1746 canon.isNull() ?
QualType(this_(), 0) : canon),
1748 assert(Quals.hasNonFastQualifiers()
1749 &&
"ExtQuals created with no fast qualifiers");
1750 assert(!Quals.hasFastQualifiers()
1751 &&
"ExtQuals created with fast qualifiers");
1761 return Quals.getObjCLifetime();
1775 const Type *BaseType,
1777 assert(!Quals.hasFastQualifiers() &&
"fast qualifiers in ExtQuals hash!");
1778 ID.AddPointer(BaseType);
1836enum class ArraySizeModifier;
1837enum class ElaboratedTypeKeyword;
1838enum class VectorKind;
1866class alignas(TypeAlignment)
Type :
public ExtQualsTypeCommonBase {
1869#define TYPE(Class, Base) Class,
1870#define LAST_TYPE(Class) TypeLast = Class
1871#define ABSTRACT_TYPE(Class, Base)
1872#include "clang/AST/TypeNodes.inc"
1877 class TypeBitfields {
1879 template <
class T>
friend class TypePropertyCache;
1882 LLVM_PREFERRED_TYPE(TypeClass)
1887 unsigned Dependence : llvm::BitWidth<TypeDependence>;
1891 LLVM_PREFERRED_TYPE(
bool)
1892 mutable unsigned CacheValid : 1;
1896 mutable unsigned CachedLinkage : 3;
1899 LLVM_PREFERRED_TYPE(
bool)
1900 mutable unsigned CachedLocalOrUnnamed : 1;
1903 LLVM_PREFERRED_TYPE(
bool)
1904 mutable unsigned FromAST : 1;
1906 bool isCacheValid()
const {
1911 assert(isCacheValid() &&
"getting linkage from invalid cache");
1912 return static_cast<Linkage>(CachedLinkage);
1915 bool hasLocalOrUnnamedType()
const {
1916 assert(isCacheValid() &&
"getting linkage from invalid cache");
1917 return CachedLocalOrUnnamed;
1920 enum { NumTypeBits = 8 + llvm::BitWidth<TypeDependence> + 6 };
1929 LLVM_PREFERRED_TYPE(TypeBitfields)
1935 unsigned IndexTypeQuals : 3;
1940 unsigned SizeModifier : 3;
1951 LLVM_PREFERRED_TYPE(
bool)
1952 unsigned HasExternalSize : 1;
1954 LLVM_PREFERRED_TYPE(
unsigned)
1955 unsigned SizeWidth : 5;
1961 LLVM_PREFERRED_TYPE(TypeBitfields)
1965 static constexpr unsigned NumOfBuiltinTypeBits = 9;
1966 unsigned Kind : NumOfBuiltinTypeBits;
1981 LLVM_PREFERRED_TYPE(TypeBitfields)
1988 unsigned RefQualifier : 2;
1999 LLVM_PREFERRED_TYPE(
bool)
2000 unsigned HasExtQuals : 1;
2004 unsigned ExceptionSpecType : 4;
2007 LLVM_PREFERRED_TYPE(
bool)
2008 unsigned HasExtParameterInfos : 1;
2011 LLVM_PREFERRED_TYPE(
bool)
2012 unsigned HasExtraBitfields : 1;
2015 LLVM_PREFERRED_TYPE(
bool)
2016 unsigned Variadic : 1;
2019 LLVM_PREFERRED_TYPE(
bool)
2020 unsigned HasTrailingReturn : 1;
2023 LLVM_PREFERRED_TYPE(
bool)
2024 unsigned CFIUncheckedCallee : 1;
2029 unsigned ExtInfo : 14;
2041 LLVM_PREFERRED_TYPE(TypeBitfields)
2045 unsigned NumTypeArgs : 7;
2048 unsigned NumProtocols : 6;
2051 LLVM_PREFERRED_TYPE(
bool)
2052 unsigned IsKindOf : 1;
2058 LLVM_PREFERRED_TYPE(TypeBitfields)
2072 LLVM_PREFERRED_TYPE(
bool)
2073 unsigned SpelledAsLValue : 1;
2077 LLVM_PREFERRED_TYPE(
bool)
2078 unsigned InnerRef : 1;
2084 LLVM_PREFERRED_TYPE(TypeBitfields)
2089 unsigned Keyword : 8;
2101 LLVM_PREFERRED_TYPE(
bool)
2102 unsigned HasQualifier : 1;
2105 LLVM_PREFERRED_TYPE(
bool)
2106 unsigned OwnsTag : 1;
2109 LLVM_PREFERRED_TYPE(
bool)
2110 unsigned IsInjected : 1;
2117 LLVM_PREFERRED_TYPE(TypeBitfields)
2123 unsigned VecKind : 4;
2125 uint32_t NumElements;
2131 LLVM_PREFERRED_TYPE(TypeBitfields)
2135 unsigned AttrKind : 32 - NumTypeBits;
2161 unsigned Keyword : 2;
2177 LLVM_PREFERRED_TYPE(TypeBitfields)
2190 LLVM_PREFERRED_TYPE(
bool)
2191 unsigned hasQualifier : 1;
2201 LLVM_PREFERRED_TYPE(
bool)
2202 unsigned hasQualifier : 1;
2212 LLVM_PREFERRED_TYPE(
bool)
2213 unsigned hasQualifier : 1;
2216 LLVM_PREFERRED_TYPE(
bool)
2217 unsigned hasTypeDifferentFromDecl : 1;
2223 LLVM_PREFERRED_TYPE(TypeBitfields)
2227 unsigned Depth : 15;
2230 LLVM_PREFERRED_TYPE(
bool)
2231 unsigned ParameterPack : 1;
2234 unsigned Index : 16;
2240 LLVM_PREFERRED_TYPE(TypeBitfields)
2243 LLVM_PREFERRED_TYPE(
bool)
2244 unsigned HasNonCanonicalUnderlyingType : 1;
2247 unsigned Index : 15;
2249 LLVM_PREFERRED_TYPE(
bool)
2257 unsigned PackIndex : 15;
2264 LLVM_PREFERRED_TYPE(TypeBitfields)
2271 unsigned NumArgs : 16;
2277 unsigned SubstTemplTypeParmPackIndex : 16;
2287 LLVM_PREFERRED_TYPE(
bool)
2288 unsigned TypeAlias : 1;
2303 LLVM_PREFERRED_TYPE(TypeBitfields)
2317 unsigned NumExpansions;
2337 LLVM_PREFERRED_TYPE(TypeBitfields)
2347 LLVM_PREFERRED_TYPE(TypeBitfields)
2350 static constexpr unsigned NumCoupledDeclsBits = 4;
2351 unsigned NumCoupledDecls : NumCoupledDeclsBits;
2352 LLVM_PREFERRED_TYPE(
bool)
2353 unsigned CountInBytes : 1;
2354 LLVM_PREFERRED_TYPE(
bool)
2355 unsigned OrNull : 1;
2390 void setFromAST(
bool V =
true)
const {
2398 : ExtQualsTypeCommonBase(this,
2400 static_assert(
sizeof(*this) <=
2401 alignof(
decltype(*this)) +
sizeof(ExtQualsTypeCommonBase),
2402 "changing bitfields changed sizeof(Type)!");
2403 static_assert(
alignof(
decltype(*this)) %
TypeAlignment == 0,
2404 "Insufficient alignment!");
2408 TypeBits.CachedLocalOrUnnamed =
false;
2417 TypeBits.Dependence =
static_cast<unsigned>(D);
2460 return CanonicalType ==
QualType(
this, 0);
2466 QualType getLocallyUnqualifiedSingleStepDesugaredType()
const;
2474 bool isSizelessType()
const;
2475 bool isSizelessBuiltinType()
const;
2478 bool isSizelessVectorType()
const;
2481 bool isSVESizelessBuiltinType()
const;
2484 bool isRVVSizelessBuiltinType()
const;
2487 bool isWebAssemblyExternrefType()
const;
2492 bool isWebAssemblyTableType()
const;
2497 bool isSveVLSBuiltinType()
const;
2507 bool isRVVVLSBuiltinType()
const;
2529 bool isIncompleteType(
NamedDecl **Def =
nullptr)
const;
2555 bool isAlwaysIncompleteType()
const;
2567 bool isLiteralType(
const ASTContext &Ctx)
const;
2570 bool isStructuralType()
const;
2574 bool isStandardLayoutType()
const;
2580 bool isBuiltinType()
const;
2583 bool isSpecificBuiltinType(
unsigned K)
const;
2588 bool isPlaceholderType()
const;
2592 bool isSpecificPlaceholderType(
unsigned K)
const;
2596 bool isNonOverloadPlaceholderType()
const;
2600 bool isIntegerType()
const;
2601 bool isEnumeralType()
const;
2604 bool isScopedEnumeralType()
const;
2606 bool isCharType()
const;
2607 bool isWideCharType()
const;
2608 bool isChar8Type()
const;
2609 bool isChar16Type()
const;
2610 bool isChar32Type()
const;
2611 bool isAnyCharacterType()
const;
2612 bool isUnicodeCharacterType()
const;
2613 bool isIntegralType(
const ASTContext &Ctx)
const;
2616 bool isIntegralOrEnumerationType()
const;
2619 bool isIntegralOrUnscopedEnumerationType()
const;
2620 bool isUnscopedEnumerationType()
const;
2623 bool isRealFloatingType()
const;
2626 bool isComplexType()
const;
2627 bool isAnyComplexType()
const;
2628 bool isFloatingType()
const;
2629 bool isHalfType()
const;
2630 bool isFloat16Type()
const;
2631 bool isFloat32Type()
const;
2632 bool isDoubleType()
const;
2633 bool isBFloat16Type()
const;
2634 bool isMFloat8Type()
const;
2635 bool isFloat128Type()
const;
2636 bool isIbm128Type()
const;
2637 bool isRealType()
const;
2638 bool isArithmeticType()
const;
2639 bool isVoidType()
const;
2640 bool isScalarType()
const;
2641 bool isAggregateType()
const;
2642 bool isFundamentalType()
const;
2643 bool isCompoundType()
const;
2647 bool isFunctionType()
const;
2650 bool isPointerType()
const;
2651 bool isPointerOrReferenceType()
const;
2652 bool isSignableType(
const ASTContext &Ctx)
const;
2653 bool isSignablePointerType()
const;
2654 bool isSignableIntegerType(
const ASTContext &Ctx)
const;
2655 bool isAnyPointerType()
const;
2656 bool isCountAttributedType()
const;
2657 bool isCFIUncheckedCalleeFunctionType()
const;
2658 bool hasPointeeToCFIUncheckedCalleeFunctionType()
const;
2659 bool isBlockPointerType()
const;
2660 bool isVoidPointerType()
const;
2661 bool isReferenceType()
const;
2662 bool isLValueReferenceType()
const;
2663 bool isRValueReferenceType()
const;
2664 bool isObjectPointerType()
const;
2665 bool isFunctionPointerType()
const;
2666 bool isFunctionReferenceType()
const;
2667 bool isMemberPointerType()
const;
2668 bool isMemberFunctionPointerType()
const;
2669 bool isMemberDataPointerType()
const;
2670 bool isArrayType()
const;
2671 bool isConstantArrayType()
const;
2672 bool isIncompleteArrayType()
const;
2673 bool isVariableArrayType()
const;
2674 bool isArrayParameterType()
const;
2675 bool isDependentSizedArrayType()
const;
2677 bool isClassType()
const;
2678 bool isStructureType()
const;
2679 bool isStructureTypeWithFlexibleArrayMember()
const;
2680 bool isObjCBoxableRecordType()
const;
2681 bool isInterfaceType()
const;
2682 bool isStructureOrClassType()
const;
2683 bool isUnionType()
const;
2684 bool isComplexIntegerType()
const;
2685 bool isVectorType()
const;
2686 bool isExtVectorType()
const;
2687 bool isExtVectorBoolType()
const;
2688 bool isConstantMatrixBoolType()
const;
2691 bool isPackedVectorBoolType(
const ASTContext &ctx)
const;
2692 bool isSubscriptableVectorType()
const;
2693 bool isMatrixType()
const;
2694 bool isConstantMatrixType()
const;
2695 bool isOverflowBehaviorType()
const;
2696 bool isDependentAddressSpaceType()
const;
2697 bool isObjCObjectPointerType()
const;
2698 bool isObjCRetainableType()
const;
2699 bool isObjCLifetimeType()
const;
2700 bool isObjCIndirectLifetimeType()
const;
2701 bool isObjCNSObjectType()
const;
2702 bool isObjCIndependentClassType()
const;
2705 bool isObjCObjectType()
const;
2706 bool isObjCQualifiedInterfaceType()
const;
2707 bool isObjCQualifiedIdType()
const;
2708 bool isObjCQualifiedClassType()
const;
2709 bool isObjCObjectOrInterfaceType()
const;
2710 bool isObjCIdType()
const;
2711 bool isDecltypeType()
const;
2719 return hasAttr(attr::ObjCInertUnsafeUnretained);
2729 bool isObjCIdOrObjectKindOfType(
const ASTContext &ctx,
2732 bool isObjCClassType()
const;
2740 bool isObjCClassOrClassKindOfType()
const;
2742 bool isBlockCompatibleObjCPointerType(
ASTContext &ctx)
const;
2743 bool isObjCSelType()
const;
2744 bool isObjCBuiltinType()
const;
2745 bool isObjCARCBridgableType()
const;
2746 bool isCARCBridgableType()
const;
2747 bool isTemplateTypeParmType()
const;
2748 bool isNullPtrType()
const;
2750 bool isNothrowT()
const;
2751 bool isAlignValT()
const;
2752 bool isStdByteType()
const;
2753 bool isAtomicType()
const;
2754 bool isUndeducedAutoType()
const;
2756 bool isTypedefNameType()
const;
2758#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
2759 bool is##Id##Type() const;
2760#include "clang/Basic/OpenCLImageTypes.def"
2762 bool isImageType()
const;
2764 bool isSamplerT()
const;
2765 bool isEventT()
const;
2766 bool isClkEventT()
const;
2767 bool isQueueT()
const;
2768 bool isReserveIDT()
const;
2770#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
2771 bool is##Id##Type() const;
2772#include "clang/Basic/OpenCLExtensionTypes.def"
2774 bool isOCLIntelSubgroupAVCType()
const;
2775 bool isOCLExtOpaqueType()
const;
2777 bool isPipeType()
const;
2778 bool isBitIntType()
const;
2779 bool isOpenCLSpecificType()
const;
2781#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) bool is##Id##Type() const;
2782#include "clang/Basic/HLSLIntangibleTypes.def"
2783 bool isHLSLSpecificType()
const;
2784 bool isHLSLBuiltinIntangibleType()
const;
2785 bool isHLSLAttributedResourceType()
const;
2786 bool isHLSLInlineSpirvType()
const;
2787 bool isHLSLResourceRecord()
const;
2788 bool isHLSLResourceRecordArray()
const;
2789 bool isHLSLIntangibleType()
2795 bool isObjCARCImplicitlyUnretainedType()
const;
2798 bool isCUDADeviceBuiltinSurfaceType()
const;
2800 bool isCUDADeviceBuiltinTextureType()
const;
2803 Qualifiers::ObjCLifetime getObjCARCImplicitLifetime()
const;
2819 ScalarTypeKind getScalarTypeKind()
const;
2847 bool isUndeducedType()
const;
2856 bool hasSizedVLAType()
const;
2859 bool hasUnnamedOrLocalType()
const;
2861 bool isOverloadableType()
const;
2864 bool isElaboratedTypeSpecifier()
const;
2866 bool canDecayToPointerType()
const;
2871 bool hasPointerRepresentation()
const;
2875 bool hasObjCPointerRepresentation()
const;
2879 bool hasIntegerRepresentation()
const;
2883 bool hasSignedIntegerRepresentation()
const;
2887 bool hasUnsignedIntegerRepresentation()
const;
2891 bool hasFloatingRepresentation()
const;
2896 bool hasBooleanRepresentation()
const;
2901 const RecordType *getAsStructureType()
const;
2903 const RecordType *getAsUnionType()
const;
2904 const ComplexType *getAsComplexIntegerType()
const;
2925 inline EnumDecl *getAsEnumDecl()
const;
2926 inline EnumDecl *castAsEnumDecl()
const;
2931 inline TagDecl *getAsTagDecl()
const;
2932 inline TagDecl *castAsTagDecl()
const;
2944 DeducedType *getContainedDeducedType()
const;
2956 bool hasAutoForTrailingReturnType()
const;
2967 template <
typename T>
const T *getAs()
const;
2972 return dyn_cast<T>(CanonicalType);
2979 return cast<T>(CanonicalType);
2983#define TYPE(Class, Base)
2984#define NEVER_CANONICAL_TYPE(Class) \
2985 template <> inline const Class##Type *Type::getAsCanonical() const = delete; \
2986 template <> inline const Class##Type *Type::castAsCanonical() const = delete;
2987#include "clang/AST/TypeNodes.inc"
2993 const TemplateSpecializationType *
2994 getAsNonAliasTemplateSpecializationType()
const;
2996 const TemplateSpecializationType *
2999 assert(TST &&
"not a TemplateSpecializationType");
3008 template <
typename T>
const T *getAsAdjusted()
const;
3012 const ArrayType *getAsArrayTypeUnsafe()
const;
3020 template <
typename T>
const T *castAs()
const;
3024 const ArrayType *castAsArrayTypeUnsafe()
const;
3038 const Type *getBaseElementTypeUnsafe()
const;
3043 const Type *getArrayElementTypeNoTypeQual()
const;
3048 const Type *getPointeeOrArrayElementType()
const;
3056 const Type *getUnqualifiedDesugaredType()
const;
3061 bool isSignedIntegerType()
const;
3066 bool isUnsignedIntegerType()
const;
3070 bool isSignedIntegerOrEnumerationType()
const;
3074 bool isUnsignedIntegerOrEnumerationType()
const;
3078 bool isFixedPointType()
const;
3081 bool isFixedPointOrIntegerType()
const;
3084 bool isConvertibleToFixedPointType()
const;
3088 bool isSaturatedFixedPointType()
const;
3092 bool isUnsaturatedFixedPointType()
const;
3096 bool isSignedFixedPointType()
const;
3100 bool isUnsignedFixedPointType()
const;
3105 bool isConstantSizeType()
const;
3109 bool isSpecifierType()
const;
3129 bool isLinkageValid()
const;
3136 std::optional<NullabilityKind> getNullability()
const;
3143 bool canHaveNullability(
bool ResultIfUnknown =
true)
const;
3160 std::optional<ArrayRef<QualType>>
3161 getObjCSubstitutions(
const DeclContext *dc)
const;
3165 bool acceptsObjCTypeParams()
const;
3167 const char *getTypeClassName()
const;
3170 return CanonicalType;
3175 void dump(llvm::raw_ostream &OS,
const ASTContext &Context)
const;
3202#define TYPE(Class, Base)
3203#define ALWAYS_CANONICAL_TYPE(Class) \
3204 template <> inline const Class##Type *Type::getAs() const { \
3205 return dyn_cast<Class##Type>(CanonicalType); \
3207 template <> inline const Class##Type *Type::castAs() const { \
3208 return cast<Class##Type>(CanonicalType); \
3210#include "clang/AST/TypeNodes.inc"
3218#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) Id,
3219#include "clang/Basic/OpenCLImageTypes.def"
3221#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) Id,
3222#include "clang/Basic/OpenCLExtensionTypes.def"
3224#define SVE_TYPE(Name, Id, SingletonId) Id,
3225#include "clang/Basic/AArch64ACLETypes.def"
3227#define PPC_VECTOR_TYPE(Name, Id, Size) Id,
3228#include "clang/Basic/PPCTypes.def"
3230#define RVV_TYPE(Name, Id, SingletonId) Id,
3231#include "clang/Basic/RISCVVTypes.def"
3233#define WASM_TYPE(Name, Id, SingletonId) Id,
3234#include "clang/Basic/WebAssemblyReferenceTypes.def"
3236#define AMDGPU_TYPE(Name, Id, SingletonId, Width, Align) Id,
3237#include "clang/Basic/AMDGPUTypes.def"
3239#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) Id,
3240#include "clang/Basic/HLSLIntangibleTypes.def"
3242#define BUILTIN_TYPE(Id, SingletonId) Id,
3243#define LAST_BUILTIN_TYPE(Id) LastKind = Id
3244#include "clang/AST/BuiltinTypes.def"
3254 static_assert(Kind::LastKind <
3255 (1 << BuiltinTypeBitfields::NumOfBuiltinTypeBits) &&
3256 "Defined builtin type exceeds the allocated space for serial "
3267 StringRef str =
getName(Policy);
3268 assert(!str.empty() && str.data()[str.size()] ==
'\0');
3325class ComplexType :
public Type,
public llvm::FoldingSetNode {
3332 ElementType(Element) {}
3352class ParenType :
public Type,
public llvm::FoldingSetNode {
3378class PointerType :
public Type,
public llvm::FoldingSetNode {
3385 PointeeType(Pointee) {}
3408 using BaseTy = llvm::PointerIntPair<ValueDecl *, 1, unsigned>;
3423 bool isDeref()
const;
3425 unsigned getInt()
const;
3426 void *getOpaqueValue()
const;
3428 void setFromOpaqueValue(
void *
V);
3466 bool referencesFieldDecls()
const;
3472 switch (T->getTypeClass()) {
3473 case CountAttributed:
3483class CountAttributedType final
3485 public llvm::TrailingObjects<CountAttributedType,
3486 TypeCoupledDeclRefInfo> {
3497 bool CountInBytes,
bool OrNull,
3500 unsigned numTrailingObjects(OverloadToken<TypeCoupledDeclRefInfo>)
const {
3526 static void Profile(llvm::FoldingSetNodeID &ID,
QualType WrappedTy,
3530 return T->getTypeClass() == CountAttributed;
3533 StringRef getAttributeName(
bool WithMacroPrefix)
const;
3548 :
Type(TC, CanonicalPtr,
3551 OriginalTy(OriginalTy), AdjustedTy(AdjustedTy) {}
3561 Profile(ID, OriginalTy, AdjustedTy);
3566 ID.AddPointer(
New.getAsOpaquePtr());
3570 return T->getTypeClass() == Adjusted || T->getTypeClass() == Decayed;
3586 static bool classof(
const Type *T) {
return T->getTypeClass() == Decayed; }
3592class BlockPointerType :
public Type,
public llvm::FoldingSetNode {
3600 PointeeType(Pointee) {}
3618 return T->getTypeClass() == BlockPointer;
3628 bool SpelledAsLValue)
3630 PointeeType(Referencee) {
3644 while (T->isInnerRef())
3646 return T->PointeeType;
3655 bool SpelledAsLValue) {
3657 ID.AddBoolean(SpelledAsLValue);
3661 return T->getTypeClass() == LValueReference ||
3662 T->getTypeClass() == RValueReference;
3671 bool SpelledAsLValue)
3680 return T->getTypeClass() == LValueReference;
3696 return T->getTypeClass() == RValueReference;
3703class MemberPointerType :
public Type,
public llvm::FoldingSetNode {
3714 :
Type(MemberPointer, CanonicalPtr,
3718 PointeeType(Pointee), Qualifier(Qualifier) {}
3726 return PointeeType->isFunctionProtoType();
3732 return !PointeeType->isFunctionProtoType();
3741 bool isSugared()
const;
3753 static void Profile(llvm::FoldingSetNodeID &ID,
QualType Pointee,
3758 return T->getTypeClass() == MemberPointer;
3781 unsigned tq,
const Expr *sz =
nullptr);
3799 return T->getTypeClass() == ConstantArray ||
3800 T->getTypeClass() == VariableArray ||
3801 T->getTypeClass() == IncompleteArray ||
3802 T->getTypeClass() == DependentSizedArray ||
3803 T->getTypeClass() == ArrayParameter;
3813 struct ExternalSize {
3814 ExternalSize(
const llvm::APInt &Sz,
const Expr *SE)
3815 :
Size(Sz), SizeExpr(SE) {}
3817 const Expr *SizeExpr;
3828 ConstantArrayTypeBits.HasExternalSize =
false;
3829 ConstantArrayTypeBits.SizeWidth = Width / 8;
3832 assert(Width < 0xFF &&
"Type width in bits must be less than 8 bits");
3835 ConstantArrayType(QualType Et, QualType Can, ExternalSize *SzPtr,
3836 ArraySizeModifier
SM,
unsigned TQ)
3837 : ArrayType(ConstantArray, Et, Can,
SM, TQ, SzPtr->SizeExpr),
3839 ConstantArrayTypeBits.HasExternalSize =
true;
3840 ConstantArrayTypeBits.SizeWidth = 0;
3842 assert((SzPtr->SizeExpr ==
nullptr || !Can.isNull()) &&
3843 "canonical constant array should not have size expression");
3846 static ConstantArrayType *
Create(
const ASTContext &Ctx, QualType ET,
3847 QualType Can,
const llvm::APInt &Sz,
3848 const Expr *SzExpr, ArraySizeModifier SzMod,
3858 ConstantArrayTypeBits.SizeWidth = ATy->ConstantArrayTypeBits.SizeWidth;
3894 :
static_cast<int64_t
>(
Size);
3901 ?
SizePtr->Size.getLimitedValue()
3915 static unsigned getNumAddressingBits(
const ASTContext &Context,
3917 const llvm::APInt &NumElements);
3919 unsigned getNumAddressingBits(
const ASTContext &Context)
const;
3923 static unsigned getMaxSizeBits(
const ASTContext &Context);
3930 static void Profile(llvm::FoldingSetNodeID &ID,
const ASTContext &Ctx,
3935 return T->getTypeClass() == ConstantArray ||
3936 T->getTypeClass() == ArrayParameter;
3942class ArrayParameterType :
public ConstantArrayType {
3945 ArrayParameterType(
const ConstantArrayType *ATy,
QualType CanTy)
3946 : ConstantArrayType(ArrayParameter, ATy, CanTy) {}
3950 return T->getTypeClass() == ArrayParameter;
3964 :
ArrayType(IncompleteArray, et, can, sm, tq) {}
3973 return T->getTypeClass() == IncompleteArray;
3984 ID.AddInteger(llvm::to_underlying(SizeMod));
3985 ID.AddInteger(TypeQuals);
4025 :
ArrayType(VariableArray, et, can, sm, tq, e), SizeExpr((
Stmt *)e) {}
4033 return (
Expr*) SizeExpr;
4040 return T->getTypeClass() == VariableArray;
4044 llvm_unreachable(
"Cannot unique VariableArrayTypes.");
4080 return (
Expr*) SizeExpr;
4087 return T->getTypeClass() == DependentSizedArray;
4095 static void Profile(llvm::FoldingSetNodeID &ID,
const ASTContext &Context,
4097 unsigned TypeQuals,
Expr *E);
4111class DependentAddressSpaceType :
public Type,
public llvm::FoldingSetNode {
4114 Expr *AddrSpaceExpr;
4130 return T->getTypeClass() == DependentAddressSpace;
4137 static void Profile(llvm::FoldingSetNodeID &ID,
const ASTContext &Context,
4151class DependentSizedExtVectorType :
public Type,
public llvm::FoldingSetNode {
4173 return T->getTypeClass() == DependentSizedExtVector;
4180 static void Profile(llvm::FoldingSetNodeID &ID,
const ASTContext &Context,
4258 ID.AddInteger(NumElements);
4260 ID.AddInteger(llvm::to_underlying(VecKind));
4264 return T->getTypeClass() ==
Vector || T->getTypeClass() == ExtVector;
4277class DependentVectorType :
public Type,
public llvm::FoldingSetNode {
4299 return T->getTypeClass() == DependentVector;
4306 static void Profile(llvm::FoldingSetNodeID &ID,
const ASTContext &Context,
4321 :
VectorType(ExtVector, vecType, nElements, canonType,
4328 case 'x':
case 'r':
return 0;
4329 case 'y':
case 'g':
return 1;
4330 case 'z':
case 'b':
return 2;
4331 case 'w':
case 'a':
return 3;
4349 case 'a':
return 10;
4351 case 'b':
return 11;
4353 case 'c':
return 12;
4355 case 'd':
return 13;
4357 case 'e':
return 14;
4359 case 'f':
return 15;
4364 if (isNumericAccessor)
4380 return T->getTypeClass() == ExtVector;
4397 const Expr *RowExpr =
nullptr,
const Expr *ColumnExpr =
nullptr);
4410 if (T->isDependentType())
4414 if (T->isEnumeralType())
4420 return T->isRealType();
4424 return T->isRealType() && !T->isBooleanType();
4431 return T->getTypeClass() == ConstantMatrix ||
4432 T->getTypeClass() == DependentSizedMatrix;
4446 unsigned NColumns,
QualType CanonElementType);
4449 unsigned NColumns,
QualType CanonElementType);
4480 bool IsRowMajor =
false)
const {
4490 unsigned Row = ColumnMajorIdx %
NumRows;
4517 return T->getTypeClass() == ConstantMatrix;
4540 return T->getTypeClass() == DependentSizedMatrix;
4547 static void Profile(llvm::FoldingSetNodeID &ID,
const ASTContext &Context,
4583 HasPassObjSize = 0x20,
4586 unsigned char Data = 0;
4595 copy.Data = (copy.Data & ~ABIMask) |
unsigned(
kind);
4605 copy.Data |= IsConsumed;
4607 copy.Data &= ~IsConsumed;
4614 Copy.Data |= HasPassObjSize;
4622 Copy.Data |= IsNoEscape;
4624 Copy.Data &= ~IsNoEscape;
4636 return lhs.Data == rhs.Data;
4640 return lhs.Data != rhs.Data;
4675 enum { CallConvMask = 0x3F };
4676 enum { NoReturnMask = 0x40 };
4677 enum { ProducesResultMask = 0x80 };
4678 enum { NoCallerSavedRegsMask = 0x100 };
4679 enum { RegParmMask = 0xe00, RegParmOffset = 9 };
4680 enum { NoCfCheckMask = 0x1000 };
4681 enum { CmseNSCallMask = 0x2000 };
4682 uint16_t Bits =
CC_C;
4684 ExtInfo(
unsigned Bits) : Bits(static_cast<uint16_t>(Bits)) {}
4690 bool producesResult,
bool noCallerSavedRegs,
bool NoCfCheck,
4692 assert((!hasRegParm || regParm < 7) &&
"Invalid regparm value");
4693 Bits = ((
unsigned)cc) | (noReturn ? NoReturnMask : 0) |
4694 (producesResult ? ProducesResultMask : 0) |
4695 (noCallerSavedRegs ? NoCallerSavedRegsMask : 0) |
4696 (hasRegParm ? ((regParm + 1) << RegParmOffset) : 0) |
4697 (NoCfCheck ? NoCfCheckMask : 0) |
4698 (cmseNSCall ? CmseNSCallMask : 0);
4714 bool getHasRegParm()
const {
return ((Bits & RegParmMask) >> RegParmOffset) != 0; }
4717 unsigned RegParm = (Bits & RegParmMask) >> RegParmOffset;
4726 return Bits ==
Other.Bits;
4729 return Bits !=
Other.Bits;
4737 return ExtInfo(Bits | NoReturnMask);
4739 return ExtInfo(Bits & ~NoReturnMask);
4744 return ExtInfo(Bits | ProducesResultMask);
4746 return ExtInfo(Bits & ~ProducesResultMask);
4751 return ExtInfo(Bits | CmseNSCallMask);
4753 return ExtInfo(Bits & ~CmseNSCallMask);
4757 if (noCallerSavedRegs)
4758 return ExtInfo(Bits | NoCallerSavedRegsMask);
4760 return ExtInfo(Bits & ~NoCallerSavedRegsMask);
4765 return ExtInfo(Bits | NoCfCheckMask);
4767 return ExtInfo(Bits & ~NoCfCheckMask);
4771 assert(RegParm < 7 &&
"Invalid regparm value");
4772 return ExtInfo((Bits & ~RegParmMask) |
4773 ((RegParm + 1) << RegParmOffset));
4777 return ExtInfo((Bits & ~CallConvMask) | (
unsigned) cc);
4781 ID.AddInteger(Bits);
4799 LLVM_PREFERRED_TYPE(
bool)
4802 LLVM_PREFERRED_TYPE(
bool)
4805 LLVM_PREFERRED_TYPE(
bool)
4905 bool getCFIUncheckedCalleeAttr()
const;
4912 "Const, volatile and restrict are assumed to be a subset of "
4913 "the fast qualifiers.");
4925 static StringRef getNameForCallConv(
CallingConv CC);
4928 return T->getTypeClass() == FunctionNoProto ||
4929 T->getTypeClass() == FunctionProto;
4935class FunctionNoProtoType :
public FunctionType,
public llvm::FoldingSetNode {
4958 ID.AddPointer(ResultType.getAsOpaquePtr());
4962 return T->getTypeClass() == FunctionNoProto;
5012 Kind oppositeKind()
const;
5035 llvm_unreachable(
"unknown effect kind");
5039 StringRef name()
const;
5043 OS << Effect.
name();
5053 std::optional<FunctionEffect>
5054 effectProhibitingInference(
const Decl &Callee,
5061 bool shouldDiagnoseFunctionCall(
bool Direct,
5065 return LHS.FKind == RHS.FKind;
5068 return !(LHS == RHS);
5071 return LHS.FKind < RHS.FKind;
5078 Expr *Cond =
nullptr;
5087 return Cond == RHS.Cond;
5102 std::string description()
const;
5104 friend raw_ostream &
operator<<(raw_ostream &OS,
5113 const Container *Outer =
nullptr;
5120 return Idx ==
Other.Idx;
5123 return Idx !=
Other.Idx;
5132 assert(Outer !=
nullptr &&
"invalid FunctionEffectIterator");
5133 bool HasConds = !Outer->Conditions.empty();
5135 HasConds ? Outer->Conditions[Idx]
5157class FunctionEffectsRef {
5162 friend FunctionProtoType;
5163 friend FunctionEffectSet;
5174 : Effects(FX), Conditions(Conds) {}
5187 bool empty()
const {
return Effects.empty(); }
5188 size_t size()
const {
return Effects.size(); }
5199 const FunctionEffectsRef &RHS) {
5200 return LHS.Effects == RHS.Effects && LHS.Conditions == RHS.Conditions;
5203 const FunctionEffectsRef &RHS) {
5204 return !(LHS == RHS);
5207 void dump(llvm::raw_ostream &OS)
const;
5211class FunctionEffectKindSet {
5214 using KindBitsT = std::bitset<EndBitPos>;
5216 KindBitsT KindBits{};
5218 explicit FunctionEffectKindSet(KindBitsT KB) : KindBits(KB) {}
5224 return static_cast<size_t>(K);
5233 const FunctionEffectKindSet *Outer =
nullptr;
5238 void advanceToNextSetBit() {
5239 while (Idx < EndBitPos && !Outer->KindBits.test(Idx))
5245 iterator(
const FunctionEffectKindSet &O,
size_t I) : Outer(&O), Idx(I) {
5246 advanceToNextSetBit();
5251 iterator operator++() {
5253 advanceToNextSetBit();
5258 assert(Idx < EndBitPos &&
"Dereference of end iterator");
5267 iterator
begin()
const {
return iterator(*
this, 0); }
5268 iterator
end()
const {
return iterator(*
this, EndBitPos); }
5277 bool empty()
const {
return KindBits.none(); }
5279 return KindBits.test(kindToPos(EK));
5281 void dump(llvm::raw_ostream &OS)
const;
5283 static FunctionEffectKindSet
difference(FunctionEffectKindSet LHS,
5284 FunctionEffectKindSet RHS) {
5285 return FunctionEffectKindSet(LHS.KindBits & ~RHS.KindBits);
5301 : Effects(FX.effects()), Conditions(FX.conditions()) {}
5303 bool empty()
const {
return Effects.empty(); }
5304 size_t size()
const {
return Effects.size(); }
5313 void dump(llvm::raw_ostream &OS)
const;
5348class FunctionProtoType final
5350 public llvm::FoldingSetNode,
5351 private llvm::TrailingObjects<
5352 FunctionProtoType, QualType, SourceLocation,
5353 FunctionType::FunctionTypeExtraBitfields,
5354 FunctionType::FunctionTypeExtraAttributeInfo,
5355 FunctionType::FunctionTypeArmAttributes, FunctionType::ExceptionType,
5356 Expr *, FunctionDecl *, FunctionType::ExtParameterInfo, Qualifiers,
5357 FunctionEffect, EffectConditionExpr> {
5359 friend TrailingObjects;
5452 LLVM_PREFERRED_TYPE(
bool)
5454 LLVM_PREFERRED_TYPE(
bool)
5456 LLVM_PREFERRED_TYPE(
bool)
5471 Result.ExceptionSpec = ESI;
5505 unsigned numTrailingObjects(OverloadToken<QualType>)
const {
5506 return getNumParams();
5509 unsigned numTrailingObjects(OverloadToken<SourceLocation>)
const {
5510 return isVariadic();
5513 unsigned numTrailingObjects(OverloadToken<FunctionTypeArmAttributes>)
const {
5514 return hasArmTypeAttributes();
5517 unsigned numTrailingObjects(OverloadToken<FunctionTypeExtraBitfields>)
const {
5518 return hasExtraBitfields();
5522 numTrailingObjects(OverloadToken<FunctionTypeExtraAttributeInfo>)
const {
5523 return hasExtraAttributeInfo();
5526 unsigned numTrailingObjects(OverloadToken<ExceptionType>)
const {
5527 return getExceptionSpecSize().NumExceptionType;
5530 unsigned numTrailingObjects(OverloadToken<Expr *>)
const {
5531 return getExceptionSpecSize().NumExprPtr;
5534 unsigned numTrailingObjects(OverloadToken<FunctionDecl *>)
const {
5535 return getExceptionSpecSize().NumFunctionDeclPtr;
5538 unsigned numTrailingObjects(OverloadToken<ExtParameterInfo>)
const {
5539 return hasExtParameterInfos() ? getNumParams() : 0;
5542 unsigned numTrailingObjects(OverloadToken<Qualifiers>)
const {
5543 return hasExtQualifiers() ? 1 : 0;
5546 unsigned numTrailingObjects(OverloadToken<FunctionEffect>)
const {
5547 return getNumFunctionEffects();
5552 static bool containsAnyUnexpandedParameterPack(
const QualType *ArgArray,
5554 for (
unsigned Idx = 0; Idx < numArgs; ++Idx)
5555 if (ArgArray[Idx]->containsUnexpandedParameterPack())
5561 FunctionProtoType(QualType result, ArrayRef<QualType> params,
5562 QualType canonical,
const ExtProtoInfo &epi);
5567 struct ExceptionSpecSizeHolder {
5568 unsigned NumExceptionType;
5569 unsigned NumExprPtr;
5570 unsigned NumFunctionDeclPtr;
5575 static ExceptionSpecSizeHolder
5576 getExceptionSpecSize(ExceptionSpecificationType EST,
unsigned NumExceptions) {
5587 return {NumExceptions, 0, 0};
5600 llvm_unreachable(
"bad exception specification kind");
5605 ExceptionSpecSizeHolder getExceptionSpecSize()
const {
5606 return getExceptionSpecSize(getExceptionSpecType(), getNumExceptions());
5610 bool hasExtraBitfields()
const {
5611 assert((getExceptionSpecType() != EST_Dynamic ||
5612 FunctionTypeBits.HasExtraBitfields) &&
5613 "ExtraBitfields are required for given ExceptionSpecType");
5614 return FunctionTypeBits.HasExtraBitfields;
5618 bool hasExtraAttributeInfo()
const {
5619 return FunctionTypeBits.HasExtraBitfields &&
5620 getTrailingObjects<FunctionTypeExtraBitfields>()
5621 ->HasExtraAttributeInfo;
5624 bool hasArmTypeAttributes()
const {
5625 return FunctionTypeBits.HasExtraBitfields &&
5626 getTrailingObjects<FunctionTypeExtraBitfields>()
5627 ->HasArmTypeAttributes;
5630 bool hasExtQualifiers()
const {
5631 return FunctionTypeBits.HasExtQuals;
5638 assert(i <
getNumParams() &&
"invalid parameter index");
5683 bool hasDependentExceptionSpec()
const;
5687 bool hasInstantiationDependentExceptionSpec()
const;
5709 ? getTrailingObjects<FunctionTypeExtraBitfields>()
5725 return *getTrailingObjects<Expr *>();
5736 return getTrailingObjects<FunctionDecl *>()[0];
5746 return getTrailingObjects<FunctionDecl *>()[1];
5764 return isVariadic() ? *getTrailingObjects<SourceLocation>()
5774 bool isTemplateVariadic()
const;
5784 if (hasExtQualifiers())
5785 return *getTrailingObjects<Qualifiers>();
5802 return getTrailingObjects<QualType>();
5817 getTrailingObjects<ExceptionType>());
5842 return getTrailingObjects<ExtParameterInfo>();
5847 if (hasExtraAttributeInfo())
5848 return *getTrailingObjects<FunctionTypeExtraAttributeInfo>();
5855 if (!hasArmTypeAttributes())
5857 return getTrailingObjects<FunctionTypeArmAttributes>()
5858 ->AArch64SMEAttributes;
5862 assert(I <
getNumParams() &&
"parameter index out of range");
5864 return getTrailingObjects<ExtParameterInfo>()[I];
5869 assert(I <
getNumParams() &&
"parameter index out of range");
5871 return getTrailingObjects<ExtParameterInfo>()[I].getABI();
5876 assert(I <
getNumParams() &&
"parameter index out of range");
5878 return getTrailingObjects<ExtParameterInfo>()[I].isConsumed();
5883 return hasExtraBitfields()
5884 ? getTrailingObjects<FunctionTypeExtraBitfields>()
5885 ->NumFunctionEffects
5891 if (hasExtraBitfields()) {
5892 const auto *Bitfields = getTrailingObjects<FunctionTypeExtraBitfields>();
5893 if (Bitfields->NumFunctionEffects > 0)
5894 return getTrailingObjects<FunctionEffect>(
5895 Bitfields->NumFunctionEffects);
5901 if (hasExtraBitfields()) {
5902 const auto *Bitfields = getTrailingObjects<FunctionTypeExtraBitfields>();
5903 if (Bitfields->EffectsHaveConditions)
5904 return Bitfields->NumFunctionEffects;
5911 if (hasExtraBitfields()) {
5912 const auto *Bitfields = getTrailingObjects<FunctionTypeExtraBitfields>();
5913 if (Bitfields->EffectsHaveConditions)
5914 return getTrailingObjects<EffectConditionExpr>(
5915 Bitfields->NumFunctionEffects);
5922 if (hasExtraBitfields()) {
5923 const auto *Bitfields = getTrailingObjects<FunctionTypeExtraBitfields>();
5924 if (Bitfields->NumFunctionEffects > 0) {
5925 const size_t NumConds = Bitfields->EffectsHaveConditions
5926 ? Bitfields->NumFunctionEffects
5929 getTrailingObjects<FunctionEffect>(Bitfields->NumFunctionEffects),
5930 {NumConds ? getTrailingObjects<EffectConditionExpr>() : nullptr,
5940 void printExceptionSpecification(raw_ostream &OS,
5944 return T->getTypeClass() == FunctionProto;
5947 void Profile(llvm::FoldingSetNodeID &ID,
const ASTContext &Ctx);
6027 template <
class... As>
6030 this->KeywordWrapperBits.Keyword = llvm::to_underlying(
Keyword);
6055 constexpr unsigned long Offset =
6057 const auto *
Addr =
reinterpret_cast<const T *
>(
6058 reinterpret_cast<const char *
>(
this) - Offset);
6059 assert(llvm::isAddrAligned(llvm::Align(
alignof(T)),
Addr));
6069class UnresolvedUsingType final
6071 private llvm::TrailingObjects<UnresolvedUsingType,
6072 FoldingSetPlaceholder<UnresolvedUsingType>,
6073 NestedNameSpecifier> {
6075 friend TrailingObjects;
6079 unsigned numTrailingObjects(
6087 assert(numTrailingObjects(
6090 return getTrailingObjects<FoldingSetPlaceholder<UnresolvedUsingType>>();
6093 UnresolvedUsingType(ElaboratedTypeKeyword Keyword,
6094 NestedNameSpecifier Qualifier,
6095 const UnresolvedUsingTypenameDecl *D,
6096 const Type *CanonicalType);
6101 ? *getTrailingObjects<NestedNameSpecifier>()
6116 Qualifier.Profile(ID);
6124 return T->getTypeClass() == UnresolvedUsing;
6129 public llvm::FoldingSetNode,
6130 llvm::TrailingObjects<UsingType, NestedNameSpecifier> {
6135 friend TrailingObjects;
6142 return UsingBits.hasQualifier ? *getTrailingObjects() : std::nullopt;
6155 UnderlyingType.Profile(ID);
6157 Qualifier.Profile(ID);
6163 static bool classof(
const Type *T) {
return T->getTypeClass() == Using; }
6166class TypedefType final
6168 private llvm::TrailingObjects<TypedefType,
6169 FoldingSetPlaceholder<TypedefType>,
6170 NestedNameSpecifier, QualType> {
6173 friend TrailingObjects;
6182 unsigned numTrailingObjects(OverloadToken<NestedNameSpecifier>)
const {
6183 return TypedefBits.hasQualifier;
6186 TypedefType(TypeClass TC, ElaboratedTypeKeyword Keyword,
6187 NestedNameSpecifier Qualifier,
const TypedefNameDecl *D,
6188 QualType UnderlyingType,
bool HasTypeDifferentFromDecl);
6190 FoldingSetPlaceholder<TypedefType> *getFoldingSetPlaceholder() {
6191 assert(numTrailingObjects(
6192 OverloadToken<FoldingSetPlaceholder<TypedefType>>{}) == 1);
6193 return getTrailingObjects<FoldingSetPlaceholder<TypedefType>>();
6198 return TypedefBits.hasQualifier ? *getTrailingObjects<NestedNameSpecifier>()
6219 ID.AddInteger(llvm::to_underlying(
Keyword));
6221 Qualifier.Profile(ID);
6222 if (!Underlying.
isNull())
6236class MacroQualifiedType :
public Type {
6245 UnderlyingTy(UnderlyingTy), MacroII(MacroII) {
6247 "Expected a macro qualified type to only wrap attributed types.");
6262 return T->getTypeClass() == MacroQualified;
6290 bool isSugared()
const;
6292 static bool classof(
const Type *T) {
return T->getTypeClass() == TypeOfExpr; }
6302 public llvm::FoldingSetNode {
6312 static void Profile(llvm::FoldingSetNodeID &ID,
const ASTContext &Context,
6313 Expr *E,
bool IsUnqual);
6318class TypeOfType :
public Type {
6324 TypeOfType(
const ASTContext &Context, QualType T, QualType Can,
6328 QualType getUnmodifiedType()
const {
return TOType; }
6331 QualType desugar()
const;
6334 bool isSugared()
const {
return true; }
6338 return static_cast<TypeOfKind>(TypeOfBits.Kind);
6341 static bool classof(
const Type *T) {
return T->getTypeClass() == TypeOf; }
6345class DecltypeType :
public Type {
6347 QualType UnderlyingType;
6350 friend class ASTContext;
6352 DecltypeType(Expr *E, QualType underlyingType, QualType can = QualType());
6355 Expr *getUnderlyingExpr()
const {
return E; }
6359 QualType desugar()
const;
6362 bool isSugared()
const;
6364 static bool classof(
const Type *T) {
return T->getTypeClass() == Decltype; }
6373class DependentDecltypeType :
public DecltypeType,
public llvm::FoldingSetNode {
6375 DependentDecltypeType(Expr *E);
6377 void Profile(llvm::FoldingSetNodeID &ID,
const ASTContext &Context) {
6378 Profile(ID, Context, getUnderlyingExpr());
6381 static void Profile(llvm::FoldingSetNodeID &ID,
const ASTContext &Context,
6385class PackIndexingType final
6387 public llvm::FoldingSetNode,
6388 private llvm::TrailingObjects<PackIndexingType, QualType> {
6389 friend TrailingObjects;
6396 LLVM_PREFERRED_TYPE(
bool)
6397 unsigned FullySubstituted : 1;
6400 friend class ASTContext;
6401 PackIndexingType(QualType Canonical, QualType Pattern, Expr *IndexExpr,
6402 bool FullySubstituted, ArrayRef<QualType> Expansions = {});
6405 Expr *getIndexExpr()
const {
return IndexExpr; }
6406 QualType getPattern()
const {
return Pattern; }
6408 bool isSugared()
const {
return hasSelectedType(); }
6410 QualType desugar()
const {
6411 if (hasSelectedType())
6412 return getSelectedType();
6413 return QualType(
this, 0);
6416 QualType getSelectedType()
const {
6417 assert(hasSelectedType() &&
"Type is dependant");
6418 return *(getExpansionsPtr() + *getSelectedIndex());
6421 UnsignedOrNone getSelectedIndex()
const;
6423 bool hasSelectedType()
const {
return getSelectedIndex() != std::nullopt; }
6425 bool isFullySubstituted()
const {
return FullySubstituted; }
6427 bool expandsToEmptyPack()
const {
return isFullySubstituted() &&
Size == 0; }
6429 ArrayRef<QualType> getExpansions()
const {
6430 return {getExpansionsPtr(),
Size};
6433 static bool classof(
const Type *T) {
6434 return T->getTypeClass() == PackIndexing;
6437 void Profile(llvm::FoldingSetNodeID &ID,
const ASTContext &Context);
6438 static void Profile(llvm::FoldingSetNodeID &ID,
const ASTContext &Context,
6439 QualType Pattern, Expr *E,
bool FullySubstituted,
6440 ArrayRef<QualType> Expansions);
6443 const QualType *getExpansionsPtr()
const {
return getTrailingObjects(); }
6446 ArrayRef<QualType> Expansions = {});
6450class UnaryTransformType :
public Type,
public llvm::FoldingSetNode {
6453#define TRANSFORM_TYPE_TRAIT_DEF(Enum, _) Enum,
6454#include "clang/Basic/TransformTypeTraits.def"
6462 QualType UnderlyingType;
6467 friend class ASTContext;
6469 UnaryTransformType(QualType BaseTy, QualType UnderlyingTy, UTTKind UKind,
6470 QualType CanonicalTy);
6473 bool isSugared()
const {
return !isDependentType(); }
6474 QualType desugar()
const {
return UnderlyingType; }
6479 UTTKind getUTTKind()
const {
return UKind; }
6481 static bool classof(
const Type *T) {
6482 return T->getTypeClass() == UnaryTransform;
6485 void Profile(llvm::FoldingSetNodeID &ID) {
6489 static void Profile(llvm::FoldingSetNodeID &ID, QualType BaseType,
6490 QualType UnderlyingType, UTTKind UKind) {
6491 BaseType.Profile(ID);
6492 UnderlyingType.Profile(ID);
6493 ID.AddInteger(UKind);
6497class TagType :
public TypeWithKeyword {
6498 friend class ASTContext;
6504 void *getTrailingPointer()
const;
6505 NestedNameSpecifier &getTrailingQualifier()
const;
6508 TagType(TypeClass TC, ElaboratedTypeKeyword Keyword,
6509 NestedNameSpecifier Qualifier,
const TagDecl *TD,
bool OwnsTag,
6510 bool IsInjected,
const Type *CanonicalType);
6513 TagDecl *getDecl()
const {
return decl; }
6514 [[deprecated(
"Use getDecl instead")]] TagDecl *getOriginalDecl()
const {
6518 NestedNameSpecifier getQualifier()
const;
6521 bool isTagOwned()
const {
return TagTypeBits.OwnsTag; }
6523 bool isInjected()
const {
return TagTypeBits.IsInjected; }
6525 ClassTemplateDecl *getTemplateDecl()
const;
6526 TemplateName getTemplateName(
const ASTContext &Ctx)
const;
6527 ArrayRef<TemplateArgument> getTemplateArgs(
const ASTContext &Ctx)
const;
6529 bool isSugared()
const {
return false; }
6530 QualType desugar()
const {
return getCanonicalTypeInternal(); }
6532 static bool classof(
const Type *T) {
6533 return T->getTypeClass() ==
Enum || T->getTypeClass() ==
Record ||
6534 T->getTypeClass() == InjectedClassName;
6538struct TagTypeFoldingSetPlaceholder :
public llvm::FoldingSetNode {
6539 static constexpr size_t getOffset() {
6540 return alignof(TagType) -
6541 (
sizeof(TagTypeFoldingSetPlaceholder) %
alignof(TagType));
6544 static void Profile(llvm::FoldingSetNodeID &ID, ElaboratedTypeKeyword Keyword,
6545 NestedNameSpecifier Qualifier,
const TagDecl *Tag,
6546 bool OwnsTag,
bool IsInjected) {
6547 ID.AddInteger(
uintptr_t(Tag) | OwnsTag | (IsInjected << 1) |
6548 ((Keyword != ElaboratedTypeKeyword::None) << 2));
6549 if (Keyword != ElaboratedTypeKeyword::None)
6550 ID.AddInteger(llvm::to_underlying(Keyword));
6555 void Profile(llvm::FoldingSetNodeID &ID)
const {
6556 const TagType *T = getTagType();
6557 Profile(ID, T->getKeyword(), T->getQualifier(), T->getDecl(),
6558 T->isTagOwned(), T->isInjected());
6561 TagType *getTagType() {
6562 return reinterpret_cast<TagType *
>(
reinterpret_cast<char *
>(
this + 1) +
6565 const TagType *getTagType()
const {
6566 return const_cast<TagTypeFoldingSetPlaceholder *
>(
this)->getTagType();
6568 static TagTypeFoldingSetPlaceholder *fromTagType(TagType *T) {
6569 return reinterpret_cast<TagTypeFoldingSetPlaceholder *
>(
6570 reinterpret_cast<char *
>(T) - getOffset()) -
6577class RecordType final :
public TagType {
6578 using TagType::TagType;
6581 RecordDecl *getDecl()
const {
6582 return reinterpret_cast<RecordDecl *
>(TagType::getDecl());
6584 [[deprecated(
"Use getDecl instead")]] RecordDecl *getOriginalDecl()
const {
6590 bool hasConstFields()
const;
6592 static bool classof(
const Type *T) {
return T->getTypeClass() ==
Record; }
6597class EnumType final :
public TagType {
6598 using TagType::TagType;
6601 EnumDecl *getDecl()
const {
6602 return reinterpret_cast<EnumDecl *
>(TagType::getDecl());
6604 [[deprecated(
"Use getDecl instead")]] EnumDecl *getOriginalDecl()
const {
6608 static bool classof(
const Type *T) {
return T->getTypeClass() ==
Enum; }
6628class InjectedClassNameType final :
public TagType {
6629 friend class ASTContext;
6631 InjectedClassNameType(ElaboratedTypeKeyword Keyword,
6632 NestedNameSpecifier Qualifier,
const TagDecl *TD,
6633 bool IsInjected,
const Type *CanonicalType);
6636 CXXRecordDecl *getDecl()
const {
6637 return reinterpret_cast<CXXRecordDecl *
>(TagType::getDecl());
6639 [[deprecated(
"Use getDecl instead")]] CXXRecordDecl *getOriginalDecl()
const {
6643 static bool classof(
const Type *T) {
6644 return T->getTypeClass() == InjectedClassName;
6662 using Kind = attr::Kind;
6665 friend class ASTContext;
6667 const Attr *Attribute;
6669 QualType ModifiedType;
6670 QualType EquivalentType;
6672 AttributedType(QualType canon, attr::Kind attrKind, QualType modified,
6673 QualType equivalent)
6676 AttributedType(QualType canon,
const Attr *attr, QualType modified,
6677 QualType equivalent);
6680 AttributedType(QualType canon, attr::Kind attrKind,
const Attr *attr,
6681 QualType modified, QualType equivalent);
6684 Kind getAttrKind()
const {
6685 return static_cast<Kind>(AttributedTypeBits.AttrKind);
6688 const Attr *getAttr()
const {
return Attribute; }
6690 QualType getModifiedType()
const {
return ModifiedType; }
6691 QualType getEquivalentType()
const {
return EquivalentType; }
6693 bool isSugared()
const {
return true; }
6694 QualType desugar()
const {
return getEquivalentType(); }
6711 bool isQualifier()
const;
6713 bool isMSTypeSpec()
const;
6715 bool isWebAssemblyFuncrefSpec()
const;
6717 bool isCallingConv()
const;
6719 std::optional<NullabilityKind> getImmediateNullability()
const;
6730 static std::optional<NullabilityKind> stripOuterNullability(QualType &T);
6732 void Profile(llvm::FoldingSetNodeID &ID) {
6733 Profile(ID, getAttrKind(), ModifiedType, EquivalentType, Attribute);
6736 static void Profile(llvm::FoldingSetNodeID &ID, Kind attrKind,
6737 QualType modified, QualType equivalent,
6739 ID.AddInteger(attrKind);
6740 ID.AddPointer(modified.getAsOpaquePtr());
6741 ID.AddPointer(equivalent.getAsOpaquePtr());
6742 ID.AddPointer(attr);
6745 static bool classof(
const Type *T) {
6746 return T->getTypeClass() == Attributed;
6750class BTFTagAttributedType :
public Type,
public llvm::FoldingSetNode {
6752 friend class ASTContext;
6754 QualType WrappedType;
6755 const BTFTypeTagAttr *BTFAttr;
6757 BTFTagAttributedType(QualType Canon, QualType Wrapped,
6758 const BTFTypeTagAttr *BTFAttr)
6759 : Type(BTFTagAttributed, Canon, Wrapped->getDependence()),
6760 WrappedType(Wrapped), BTFAttr(BTFAttr) {}
6763 QualType getWrappedType()
const {
return WrappedType; }
6764 const BTFTypeTagAttr *getAttr()
const {
return BTFAttr; }
6766 bool isSugared()
const {
return true; }
6767 QualType desugar()
const {
return getWrappedType(); }
6769 void Profile(llvm::FoldingSetNodeID &ID) {
6770 Profile(ID, WrappedType, BTFAttr);
6773 static void Profile(llvm::FoldingSetNodeID &ID, QualType Wrapped,
6774 const BTFTypeTagAttr *BTFAttr) {
6775 ID.AddPointer(Wrapped.getAsOpaquePtr());
6776 ID.AddPointer(BTFAttr);
6779 static bool classof(
const Type *T) {
6780 return T->getTypeClass() == BTFTagAttributed;
6784class OverflowBehaviorType :
public Type,
public llvm::FoldingSetNode {
6786 enum OverflowBehaviorKind { Wrap, Trap };
6789 friend class ASTContext;
6791 QualType UnderlyingType;
6792 OverflowBehaviorKind BehaviorKind;
6794 OverflowBehaviorType(QualType Canon, QualType Underlying,
6795 OverflowBehaviorKind Kind);
6799 OverflowBehaviorKind getBehaviorKind()
const {
return BehaviorKind; }
6801 bool isWrapKind()
const {
return BehaviorKind == OverflowBehaviorKind::Wrap; }
6802 bool isTrapKind()
const {
return BehaviorKind == OverflowBehaviorKind::Trap; }
6804 bool isSugared()
const {
return false; }
6807 void Profile(llvm::FoldingSetNodeID &ID) {
6808 Profile(ID, UnderlyingType, BehaviorKind);
6811 static void Profile(llvm::FoldingSetNodeID &ID, QualType Underlying,
6812 OverflowBehaviorKind Kind) {
6813 ID.AddPointer(Underlying.getAsOpaquePtr());
6814 ID.AddInteger((
int)Kind);
6817 static bool classof(
const Type *T) {
6822class HLSLAttributedResourceType :
public Type,
public llvm::FoldingSetNode {
6827 llvm::dxil::ResourceDimension ResourceDimension;
6829 LLVM_PREFERRED_TYPE(
bool)
6832 LLVM_PREFERRED_TYPE(
bool)
6833 uint8_t RawBuffer : 1;
6835 LLVM_PREFERRED_TYPE(
bool)
6836 uint8_t IsCounter : 1;
6839 llvm::dxil::ResourceDimension ResourceDimension,
6840 bool IsROV =
false,
bool RawBuffer =
false,
6841 bool IsCounter =
false)
6843 IsROV(IsROV), RawBuffer(RawBuffer), IsCounter(IsCounter) {}
6853 friend bool operator==(
const Attributes &LHS,
const Attributes &RHS) {
6854 return std::tie(LHS.ResourceClass, LHS.ResourceDimension, LHS.IsROV,
6855 LHS.RawBuffer, LHS.IsCounter) ==
6856 std::tie(RHS.ResourceClass, RHS.ResourceDimension, RHS.IsROV,
6857 RHS.RawBuffer, RHS.IsCounter);
6859 friend bool operator!=(
const Attributes &LHS,
const Attributes &RHS) {
6860 return !(LHS == RHS);
6865 friend class ASTContext;
6867 QualType WrappedType;
6868 QualType ContainedType;
6869 const Attributes Attrs;
6871 HLSLAttributedResourceType(QualType Wrapped, QualType Contained,
6872 const Attributes &Attrs)
6873 : Type(HLSLAttributedResource, QualType(),
6875 : Contained->getDependence()),
6876 WrappedType(Wrapped), ContainedType(Contained), Attrs(Attrs) {}
6879 QualType getWrappedType()
const {
return WrappedType; }
6880 QualType getContainedType()
const {
return ContainedType; }
6881 bool hasContainedType()
const {
return !ContainedType.isNull(); }
6882 const Attributes &getAttrs()
const {
return Attrs; }
6883 bool isRaw()
const {
return Attrs.RawBuffer; }
6884 bool isStructured()
const {
return !ContainedType->isChar8Type(); }
6886 bool isSugared()
const {
return false; }
6887 QualType desugar()
const {
return QualType(
this, 0); }
6889 void Profile(llvm::FoldingSetNodeID &ID) {
6890 Profile(ID, WrappedType, ContainedType, Attrs);
6893 static void Profile(llvm::FoldingSetNodeID &ID, QualType Wrapped,
6894 QualType Contained,
const Attributes &Attrs) {
6895 ID.AddPointer(Wrapped.getAsOpaquePtr());
6896 ID.AddPointer(Contained.getAsOpaquePtr());
6897 ID.AddInteger(
static_cast<uint32_t>(Attrs.ResourceClass));
6898 ID.AddInteger(
static_cast<uint32_t>(Attrs.ResourceDimension));
6899 ID.AddBoolean(Attrs.IsROV);
6900 ID.AddBoolean(Attrs.RawBuffer);
6901 ID.AddBoolean(Attrs.IsCounter);
6904 static bool classof(
const Type *T) {
6905 return T->getTypeClass() == HLSLAttributedResource;
6909 static const HLSLAttributedResourceType *
6910 findHandleTypeOnResource(
const Type *RT);
6916 enum SpirvOperandKind :
unsigned char {
6929 QualType ResultType;
6935 SpirvOperand(SpirvOperandKind Kind, QualType ResultType, llvm::APInt
Value)
6938 SpirvOperand(
const SpirvOperand &Other) =
default;
6939 ~SpirvOperand() =
default;
6940 SpirvOperand &operator=(
const SpirvOperand &Other) =
default;
6942 bool operator==(
const SpirvOperand &Other)
const {
6947 bool operator!=(
const SpirvOperand &Other)
const {
return !(*
this ==
Other); }
6952 bool isConstant()
const {
return Kind == ConstantId; }
6954 bool isType()
const {
return Kind == TypeId; }
6956 llvm::APInt getValue()
const {
6958 "This is not an operand with a value!");
6962 QualType getResultType()
const {
6963 assert((isConstant() || isType()) &&
6964 "This is not an operand with a result type!");
6968 static SpirvOperand createConstant(QualType ResultType, llvm::APInt Val) {
6969 return SpirvOperand(ConstantId, ResultType, std::move(Val));
6972 static SpirvOperand createLiteral(llvm::APInt Val) {
6973 return SpirvOperand(Literal, QualType(), std::move(Val));
6976 static SpirvOperand createType(QualType T) {
6977 return SpirvOperand(TypeId, T, llvm::APSInt());
6980 void Profile(llvm::FoldingSetNodeID &ID)
const {
6981 ID.AddInteger(Kind);
6982 ID.AddPointer(ResultType.getAsOpaquePtr());
6988class HLSLInlineSpirvType final
6990 public llvm::FoldingSetNode,
6991 private llvm::TrailingObjects<HLSLInlineSpirvType, SpirvOperand> {
6992 friend class ASTContext;
6993 friend TrailingObjects;
7001 HLSLInlineSpirvType(uint32_t Opcode, uint32_t Size, uint32_t Alignment,
7002 ArrayRef<SpirvOperand> Operands)
7004 Size(
Size), Alignment(Alignment), NumOperands(Operands.size()) {
7005 for (
size_t I = 0; I < NumOperands; I++) {
7008 auto *
Operand =
new (&getTrailingObjects()[I]) SpirvOperand();
7016 uint32_t getAlignment()
const {
return Alignment; }
7017 ArrayRef<SpirvOperand> getOperands()
const {
7018 return getTrailingObjects(NumOperands);
7021 bool isSugared()
const {
return false; }
7022 QualType desugar()
const {
return QualType(
this, 0); }
7024 void Profile(llvm::FoldingSetNodeID &ID) {
7025 Profile(ID, Opcode, Size, Alignment, getOperands());
7028 static void Profile(llvm::FoldingSetNodeID &ID, uint32_t Opcode,
7029 uint32_t Size, uint32_t Alignment,
7030 ArrayRef<SpirvOperand> Operands) {
7031 ID.AddInteger(Opcode);
7032 ID.AddInteger(Size);
7033 ID.AddInteger(Alignment);
7034 for (
auto &Operand : Operands)
7038 static bool classof(
const Type *T) {
7039 return T->getTypeClass() == HLSLInlineSpirv;
7043class TemplateTypeParmType :
public Type,
public llvm::FoldingSetNode {
7044 friend class ASTContext;
7047 TemplateTypeParmDecl *TTPDecl;
7049 TemplateTypeParmType(
unsigned D,
unsigned I,
bool PP,
7050 TemplateTypeParmDecl *TTPDecl, QualType Canon)
7055 assert(!TTPDecl == Canon.isNull());
7056 TemplateTypeParmTypeBits.Depth = D;
7057 TemplateTypeParmTypeBits.Index = I;
7058 TemplateTypeParmTypeBits.ParameterPack = PP;
7062 unsigned getDepth()
const {
return TemplateTypeParmTypeBits.Depth; }
7063 unsigned getIndex()
const {
return TemplateTypeParmTypeBits.Index; }
7065 return TemplateTypeParmTypeBits.ParameterPack;
7068 TemplateTypeParmDecl *getDecl()
const {
return TTPDecl; }
7072 bool isSugared()
const {
return false; }
7073 QualType desugar()
const {
return QualType(
this, 0); }
7075 void Profile(llvm::FoldingSetNodeID &ID) {
7079 static void Profile(llvm::FoldingSetNodeID &ID,
unsigned Depth,
7080 unsigned Index,
bool ParameterPack,
7081 TemplateTypeParmDecl *TTPDecl) {
7082 ID.AddInteger(Depth);
7083 ID.AddInteger(Index);
7084 ID.AddBoolean(ParameterPack);
7085 ID.AddPointer(TTPDecl);
7088 static bool classof(
const Type *T) {
7100class SubstTemplateTypeParmType final
7102 public llvm::FoldingSetNode,
7103 private llvm::TrailingObjects<SubstTemplateTypeParmType, QualType> {
7104 friend class ASTContext;
7105 friend class llvm::TrailingObjects<SubstTemplateTypeParmType, QualType>;
7107 Decl *AssociatedDecl;
7109 SubstTemplateTypeParmType(QualType Replacement, Decl *AssociatedDecl,
7110 unsigned Index, UnsignedOrNone PackIndex,
7116 QualType getReplacementType()
const {
7117 return SubstTemplateTypeParmTypeBits.HasNonCanonicalUnderlyingType
7118 ? *getTrailingObjects()
7119 : getCanonicalTypeInternal();
7125 Decl *getAssociatedDecl()
const {
return AssociatedDecl; }
7128 const TemplateTypeParmDecl *getReplacedParameter()
const;
7132 unsigned getIndex()
const {
return SubstTemplateTypeParmTypeBits.Index; }
7136 unsigned getFinal()
const {
return SubstTemplateTypeParmTypeBits.Final; }
7138 UnsignedOrNone getPackIndex()
const {
7139 return UnsignedOrNone::fromInternalRepresentation(
7140 SubstTemplateTypeParmTypeBits.PackIndex);
7143 bool isSugared()
const {
return true; }
7144 QualType desugar()
const {
return getReplacementType(); }
7146 void Profile(llvm::FoldingSetNodeID &ID) {
7147 Profile(ID, getReplacementType(), getAssociatedDecl(),
getIndex(),
7148 getPackIndex(), getFinal());
7151 static void Profile(llvm::FoldingSetNodeID &ID, QualType Replacement,
7152 const Decl *AssociatedDecl,
unsigned Index,
7153 UnsignedOrNone PackIndex,
bool Final);
7155 static bool classof(
const Type *T) {
7156 return T->getTypeClass() == SubstTemplateTypeParm;
7166class SubstPackType :
public Type,
public llvm::FoldingSetNode {
7167 friend class ASTContext;
7174 SubstPackType(TypeClass Derived, QualType Canon,
7175 const TemplateArgument &ArgPack);
7178 unsigned getNumArgs()
const {
return SubstPackTypeBits.NumArgs; }
7180 TemplateArgument getArgumentPack()
const;
7182 void Profile(llvm::FoldingSetNodeID &ID);
7183 static void Profile(llvm::FoldingSetNodeID &ID,
7184 const TemplateArgument &ArgPack);
7186 static bool classof(
const Type *T) {
7187 return T->getTypeClass() == SubstTemplateTypeParmPack ||
7188 T->getTypeClass() == SubstBuiltinTemplatePack;
7193class SubstBuiltinTemplatePackType :
public SubstPackType {
7194 friend class ASTContext;
7196 SubstBuiltinTemplatePackType(QualType Canon,
const TemplateArgument &ArgPack);
7199 bool isSugared()
const {
return false; }
7200 QualType desugar()
const {
return QualType(
this, 0); }
7203 using SubstPackType::Profile;
7205 static bool classof(
const Type *T) {
7206 return T->getTypeClass() == SubstBuiltinTemplatePack;
7222class SubstTemplateTypeParmPackType :
public SubstPackType {
7223 friend class ASTContext;
7225 llvm::PointerIntPair<Decl *, 1, bool> AssociatedDeclAndFinal;
7227 SubstTemplateTypeParmPackType(QualType Canon, Decl *AssociatedDecl,
7228 unsigned Index,
bool Final,
7229 const TemplateArgument &ArgPack);
7237 Decl *getAssociatedDecl()
const;
7240 const TemplateTypeParmDecl *getReplacedParameter()
const;
7245 return SubstPackTypeBits.SubstTemplTypeParmPackIndex;
7250 bool getFinal()
const;
7252 bool isSugared()
const {
return false; }
7253 QualType desugar()
const {
return QualType(
this, 0); }
7255 void Profile(llvm::FoldingSetNodeID &ID);
7256 static void Profile(llvm::FoldingSetNodeID &ID,
const Decl *AssociatedDecl,
7257 unsigned Index,
bool Final,
7258 const TemplateArgument &ArgPack);
7260 static bool classof(
const Type *T) {
7261 return T->getTypeClass() == SubstTemplateTypeParmPack;
7273class DeducedType :
public Type {
7274 QualType DeducedAsType;
7277 DeducedType(TypeClass TC, DeducedKind DK, QualType DeducedAsTypeOrCanon);
7279 static void Profile(llvm::FoldingSetNodeID &ID, DeducedKind DK,
7281 ID.AddInteger(llvm::to_underlying(DK));
7287 return static_cast<DeducedKind>(DeducedTypeBits.Kind);
7290 bool isSugared()
const {
return getDeducedKind() == DeducedKind::Deduced; }
7291 QualType desugar()
const {
7292 return isSugared() ? DeducedAsType : QualType(
this, 0);
7297 QualType getDeducedType()
const {
return DeducedAsType; }
7298 bool isDeduced()
const {
return getDeducedKind() != DeducedKind::Undeduced; }
7300 static bool classof(
const Type *T) {
7301 return T->getTypeClass() ==
Auto ||
7302 T->getTypeClass() == DeducedTemplateSpecialization;
7308class AutoType :
public DeducedType,
public llvm::FoldingSetNode {
7309 friend class ASTContext;
7311 TemplateDecl *TypeConstraintConcept;
7313 AutoType(DeducedKind DK, QualType DeducedAsTypeOrCanon,
7314 AutoTypeKeyword Keyword, TemplateDecl *TypeConstraintConcept,
7315 ArrayRef<TemplateArgument> TypeConstraintArgs);
7318 ArrayRef<TemplateArgument> getTypeConstraintArguments()
const {
7319 return {
reinterpret_cast<const TemplateArgument *
>(
this + 1),
7320 AutoTypeBits.NumArgs};
7323 TemplateDecl *getTypeConstraintConcept()
const {
7324 return TypeConstraintConcept;
7327 bool isConstrained()
const {
7328 return TypeConstraintConcept !=
nullptr;
7331 bool isDecltypeAuto()
const {
7332 return getKeyword() == AutoTypeKeyword::DecltypeAuto;
7335 bool isGNUAutoType()
const {
7336 return getKeyword() == AutoTypeKeyword::GNUAutoType;
7340 return (AutoTypeKeyword)AutoTypeBits.Keyword;
7343 void Profile(llvm::FoldingSetNodeID &ID,
const ASTContext &Context);
7344 static void Profile(llvm::FoldingSetNodeID &ID,
const ASTContext &Context,
7345 DeducedKind DK, QualType Deduced, AutoTypeKeyword Keyword,
7346 TemplateDecl *CD, ArrayRef<TemplateArgument> Arguments);
7348 static bool classof(
const Type *T) {
7349 return T->getTypeClass() ==
Auto;
7354class DeducedTemplateSpecializationType :
public KeywordWrapper<DeducedType>,
7355 public llvm::FoldingSetNode {
7356 friend class ASTContext;
7361 DeducedTemplateSpecializationType(DeducedKind DK,
7362 QualType DeducedAsTypeOrCanon,
7363 ElaboratedTypeKeyword Keyword,
7364 TemplateName Template)
7365 : KeywordWrapper(
Keyword, DeducedTemplateSpecialization, DK,
7366 DeducedAsTypeOrCanon),
7370 if (DK == DeducedKind::Deduced)
7379 void Profile(llvm::FoldingSetNodeID &ID)
const {
7380 Profile(ID, getDeducedKind(), getDeducedType(), getKeyword(),
7384 static void Profile(llvm::FoldingSetNodeID &ID, DeducedKind DK,
7385 QualType Deduced, ElaboratedTypeKeyword Keyword,
7386 TemplateName Template) {
7387 DeducedType::Profile(ID, DK, Deduced);
7388 ID.AddInteger(llvm::to_underlying(Keyword));
7392 static bool classof(
const Type *T) {
7393 return T->getTypeClass() == DeducedTemplateSpecialization;
7417class TemplateSpecializationType :
public TypeWithKeyword,
7418 public llvm::FoldingSetNode {
7419 friend class ASTContext;
7430 TemplateSpecializationType(ElaboratedTypeKeyword Keyword, TemplateName T,
7431 bool IsAlias, ArrayRef<TemplateArgument> Args,
7432 QualType Underlying);
7447 anyDependentTemplateArguments(ArrayRef<TemplateArgumentLoc> Args,
7448 ArrayRef<TemplateArgument> Converted);
7450 anyDependentTemplateArguments(
const TemplateArgumentListInfo &,
7451 ArrayRef<TemplateArgument> Converted);
7452 static bool anyInstantiationDependentTemplateArguments(
7453 ArrayRef<TemplateArgumentLoc> Args);
7457 bool isCurrentInstantiation()
const {
7458 return isa<InjectedClassNameType>(getCanonicalTypeInternal());
7476 bool isTypeAlias()
const {
return TemplateSpecializationTypeBits.TypeAlias; }
7480 QualType getAliasedType()
const;
7485 ArrayRef<TemplateArgument> template_arguments()
const {
7486 return {
reinterpret_cast<const TemplateArgument *
>(
this + 1),
7487 TemplateSpecializationTypeBits.NumArgs};
7490 bool isSugared()
const;
7492 QualType desugar()
const {
7493 return isTypeAlias() ? getAliasedType() : getCanonicalTypeInternal();
7496 void Profile(llvm::FoldingSetNodeID &ID,
const ASTContext &Ctx);
7497 static void Profile(llvm::FoldingSetNodeID &ID, ElaboratedTypeKeyword Keyword,
7498 TemplateName T, ArrayRef<TemplateArgument> Args,
7499 QualType Underlying,
const ASTContext &Context);
7501 static bool classof(
const Type *T) {
7508void printTemplateArgumentList(raw_ostream &OS,
7509 ArrayRef<TemplateArgument> Args,
7510 const PrintingPolicy &Policy,
7511 const TemplateParameterList *TPL =
nullptr);
7513void printTemplateArgumentList(raw_ostream &OS,
7514 ArrayRef<TemplateArgumentLoc> Args,
7515 const PrintingPolicy &Policy,
7516 const TemplateParameterList *TPL =
nullptr);
7518void printTemplateArgumentList(raw_ostream &OS,
7519 const TemplateArgumentListInfo &Args,
7520 const PrintingPolicy &Policy,
7521 const TemplateParameterList *TPL =
nullptr);
7525bool isSubstitutedDefaultArgument(ASTContext &Ctx, TemplateArgument Arg,
7526 const NamedDecl *Param,
7527 ArrayRef<TemplateArgument> Args,
7542class DependentNameType :
public TypeWithKeyword,
public llvm::FoldingSetNode {
7543 friend class ASTContext;
7546 NestedNameSpecifier NNS;
7549 const IdentifierInfo *Name;
7551 DependentNameType(ElaboratedTypeKeyword Keyword, NestedNameSpecifier NNS,
7552 const IdentifierInfo *Name, QualType CanonType)
7553 : TypeWithKeyword(
Keyword, DependentName, CanonType,
7557 NNS(NNS), Name(Name) {
7563 NestedNameSpecifier getQualifier()
const {
return NNS; }
7571 bool isSugared()
const {
return false; }
7572 QualType desugar()
const {
return QualType(
this, 0); }
7574 void Profile(llvm::FoldingSetNodeID &ID) {
7575 Profile(ID, getKeyword(), NNS, Name);
7578 static void Profile(llvm::FoldingSetNodeID &ID, ElaboratedTypeKeyword Keyword,
7579 NestedNameSpecifier NNS,
const IdentifierInfo *Name) {
7580 ID.AddInteger(llvm::to_underlying(Keyword));
7582 ID.AddPointer(Name);
7585 static bool classof(
const Type *T) {
7586 return T->getTypeClass() == DependentName;
7612class PackExpansionType :
public Type,
public llvm::FoldingSetNode {
7613 friend class ASTContext;
7618 PackExpansionType(QualType Pattern, QualType Canon,
7619 UnsignedOrNone NumExpansions)
7620 : Type(PackExpansion, Canon,
7625 PackExpansionTypeBits.NumExpansions =
7626 NumExpansions ? *NumExpansions + 1 : 0;
7633 QualType getPattern()
const {
return Pattern; }
7637 UnsignedOrNone getNumExpansions()
const {
7638 if (PackExpansionTypeBits.NumExpansions)
7639 return PackExpansionTypeBits.NumExpansions - 1;
7640 return std::nullopt;
7643 bool isSugared()
const {
return false; }
7644 QualType desugar()
const {
return QualType(
this, 0); }
7646 void Profile(llvm::FoldingSetNodeID &ID) {
7647 Profile(ID, getPattern(), getNumExpansions());
7650 static void Profile(llvm::FoldingSetNodeID &ID, QualType Pattern,
7651 UnsignedOrNone NumExpansions) {
7652 ID.AddPointer(Pattern.getAsOpaquePtr());
7653 ID.AddInteger(NumExpansions.toInternalRepresentation());
7656 static bool classof(
const Type *T) {
7657 return T->getTypeClass() == PackExpansion;
7664class ObjCProtocolQualifiers {
7666 ObjCProtocolQualifiers() =
default;
7668 ObjCProtocolDecl *
const *getProtocolStorage()
const {
7669 return const_cast<ObjCProtocolQualifiers*
>(
this)->getProtocolStorage();
7672 ObjCProtocolDecl **getProtocolStorage() {
7673 return static_cast<T*
>(
this)->getProtocolStorageImpl();
7676 void setNumProtocols(
unsigned N) {
7677 static_cast<T*
>(
this)->setNumProtocolsImpl(N);
7680 void initialize(ArrayRef<ObjCProtocolDecl *> protocols) {
7681 setNumProtocols(protocols.size());
7682 assert(getNumProtocols() == protocols.size() &&
7683 "bitfield overflow in protocol count");
7684 if (!protocols.empty())
7685 memcpy(getProtocolStorage(), protocols.data(),
7686 protocols.size() *
sizeof(ObjCProtocolDecl*));
7690 using qual_iterator = ObjCProtocolDecl *
const *;
7691 using qual_range = llvm::iterator_range<qual_iterator>;
7693 qual_range quals()
const {
return qual_range(qual_begin(), qual_end()); }
7694 qual_iterator qual_begin()
const {
return getProtocolStorage(); }
7695 qual_iterator qual_end()
const {
return qual_begin() + getNumProtocols(); }
7697 bool qual_empty()
const {
return getNumProtocols() == 0; }
7701 unsigned getNumProtocols()
const {
7702 return static_cast<const T*
>(
this)->getNumProtocolsImpl();
7706 ObjCProtocolDecl *getProtocol(
unsigned I)
const {
7707 assert(I < getNumProtocols() &&
"Out-of-range protocol access");
7708 return qual_begin()[I];
7712 ArrayRef<ObjCProtocolDecl *> getProtocols()
const {
7713 return ArrayRef<ObjCProtocolDecl *>(qual_begin(), getNumProtocols());
7719class ObjCTypeParamType :
public Type,
7720 public ObjCProtocolQualifiers<ObjCTypeParamType>,
7721 public llvm::FoldingSetNode {
7722 friend class ASTContext;
7723 friend class ObjCProtocolQualifiers<ObjCTypeParamType>;
7726 unsigned NumProtocols : 6;
7728 ObjCTypeParamDecl *OTPDecl;
7733 ObjCProtocolDecl **getProtocolStorageImpl();
7737 unsigned getNumProtocolsImpl()
const {
7738 return NumProtocols;
7741 void setNumProtocolsImpl(
unsigned N) {
7745 ObjCTypeParamType(
const ObjCTypeParamDecl *D,
7747 ArrayRef<ObjCProtocolDecl *> protocols);
7750 bool isSugared()
const {
return true; }
7751 QualType desugar()
const {
return getCanonicalTypeInternal(); }
7753 static bool classof(
const Type *T) {
7754 return T->getTypeClass() == ObjCTypeParam;
7757 void Profile(llvm::FoldingSetNodeID &ID);
7758 static void Profile(llvm::FoldingSetNodeID &ID,
7759 const ObjCTypeParamDecl *OTPDecl,
7760 QualType CanonicalType,
7761 ArrayRef<ObjCProtocolDecl *> protocols);
7763 ObjCTypeParamDecl *getDecl()
const {
return OTPDecl; }
7794class ObjCObjectType :
public Type,
7795 public ObjCProtocolQualifiers<ObjCObjectType> {
7796 friend class ObjCProtocolQualifiers<ObjCObjectType>;
7814 mutable llvm::PointerIntPair<const ObjCObjectType *, 1, bool>
7815 CachedSuperClassType;
7817 QualType *getTypeArgStorage();
7818 const QualType *getTypeArgStorage()
const {
7819 return const_cast<ObjCObjectType *
>(
this)->getTypeArgStorage();
7822 ObjCProtocolDecl **getProtocolStorageImpl();
7825 unsigned getNumProtocolsImpl()
const {
7826 return ObjCObjectTypeBits.NumProtocols;
7828 void setNumProtocolsImpl(
unsigned N) {
7829 ObjCObjectTypeBits.NumProtocols = N;
7833 enum Nonce_ObjCInterface { Nonce_ObjCInterface };
7835 ObjCObjectType(QualType Canonical, QualType Base,
7836 ArrayRef<QualType> typeArgs,
7837 ArrayRef<ObjCProtocolDecl *> protocols,
7840 ObjCObjectType(
enum Nonce_ObjCInterface)
7842 BaseType(QualType(this_(), 0)) {
7843 ObjCObjectTypeBits.NumProtocols = 0;
7844 ObjCObjectTypeBits.NumTypeArgs = 0;
7845 ObjCObjectTypeBits.IsKindOf = 0;
7848 void computeSuperClassTypeSlow()
const;
7859 bool isObjCId()
const {
7860 return getBaseType()->isSpecificBuiltinType(BuiltinType::ObjCId);
7863 bool isObjCClass()
const {
7864 return getBaseType()->isSpecificBuiltinType(BuiltinType::ObjCClass);
7867 bool isObjCUnqualifiedId()
const {
return qual_empty() && isObjCId(); }
7868 bool isObjCUnqualifiedClass()
const {
return qual_empty() && isObjCClass(); }
7869 bool isObjCUnqualifiedIdOrClass()
const {
7870 if (!qual_empty())
return false;
7871 if (
const BuiltinType *T =
getBaseType()->getAs<BuiltinType>())
7872 return T->getKind() == BuiltinType::ObjCId ||
7873 T->getKind() == BuiltinType::ObjCClass;
7876 bool isObjCQualifiedId()
const {
return !qual_empty() && isObjCId(); }
7877 bool isObjCQualifiedClass()
const {
return !qual_empty() && isObjCClass(); }
7881 ObjCInterfaceDecl *getInterface()
const;
7885 bool isSpecialized()
const;
7888 bool isSpecializedAsWritten()
const {
7889 return ObjCObjectTypeBits.NumTypeArgs > 0;
7894 bool isUnspecialized()
const {
return !isSpecialized(); }
7898 bool isUnspecializedAsWritten()
const {
return !isSpecializedAsWritten(); }
7901 ArrayRef<QualType> getTypeArgs()
const;
7905 ArrayRef<QualType> getTypeArgsAsWritten()
const {
7906 return {getTypeArgStorage(), ObjCObjectTypeBits.NumTypeArgs};
7910 bool isKindOfTypeAsWritten()
const {
return ObjCObjectTypeBits.IsKindOf; }
7913 bool isKindOfType()
const;
7921 QualType getSuperClassType()
const {
7922 if (!CachedSuperClassType.getInt())
7923 computeSuperClassTypeSlow();
7925 assert(CachedSuperClassType.getInt() &&
"Superclass not set?");
7926 return QualType(CachedSuperClassType.getPointer(), 0);
7931 QualType stripObjCKindOfTypeAndQuals(
const ASTContext &ctx)
const;
7933 bool isSugared()
const {
return false; }
7934 QualType desugar()
const {
return QualType(
this, 0); }
7936 static bool classof(
const Type *T) {
7937 return T->getTypeClass() == ObjCObject ||
7938 T->getTypeClass() == ObjCInterface;
7946class ObjCObjectTypeImpl :
public ObjCObjectType,
public llvm::FoldingSetNode {
7947 friend class ASTContext;
7952 ObjCObjectTypeImpl(QualType Canonical, QualType Base,
7953 ArrayRef<QualType> typeArgs,
7954 ArrayRef<ObjCProtocolDecl *> protocols,
7956 : ObjCObjectType(Canonical,
Base, typeArgs, protocols, isKindOf) {}
7959 void Profile(llvm::FoldingSetNodeID &ID);
7960 static void Profile(llvm::FoldingSetNodeID &ID,
7962 ArrayRef<QualType> typeArgs,
7963 ArrayRef<ObjCProtocolDecl *> protocols,
7967inline QualType *ObjCObjectType::getTypeArgStorage() {
7968 return reinterpret_cast<QualType *
>(
static_cast<ObjCObjectTypeImpl*
>(
this)+1);
7971inline ObjCProtocolDecl **ObjCObjectType::getProtocolStorageImpl() {
7972 return reinterpret_cast<ObjCProtocolDecl**
>(
7973 getTypeArgStorage() + ObjCObjectTypeBits.NumTypeArgs);
7976inline ObjCProtocolDecl **ObjCTypeParamType::getProtocolStorageImpl() {
7977 return reinterpret_cast<ObjCProtocolDecl**
>(
7978 static_cast<ObjCTypeParamType*
>(
this)+1);
8012 return T->getTypeClass() == ObjCInterface;
8028inline ObjCInterfaceDecl *ObjCObjectType::getInterface()
const {
8029 QualType baseType = getBaseType();
8031 if (
const auto *T = dyn_cast<ObjCInterfaceType>(ObjT))
8032 return T->getDecl();
8034 baseType = ObjT->getBaseType();
8049class ObjCObjectPointerType :
public Type,
public llvm::FoldingSetNode {
8056 PointeeType(Pointee) {}
8199 QualType getSuperClassType()
const;
8211 ID.AddPointer(T.getAsOpaquePtr());
8215 return T->getTypeClass() == ObjCObjectPointer;
8219class AtomicType :
public Type,
public llvm::FoldingSetNode {
8240 ID.AddPointer(T.getAsOpaquePtr());
8244 return T->getTypeClass() ==
Atomic;
8249class PipeType :
public Type,
public llvm::FoldingSetNode {
8257 ElementType(elemType), isRead(isRead) {}
8271 ID.AddPointer(T.getAsOpaquePtr());
8272 ID.AddBoolean(isRead);
8276 return T->getTypeClass() ==
Pipe;
8285 LLVM_PREFERRED_TYPE(
bool)
8286 unsigned IsUnsigned : 1;
8287 unsigned NumBits : 24;
8304 static void Profile(llvm::FoldingSetNodeID &ID,
bool IsUnsigned,
8306 ID.AddBoolean(IsUnsigned);
8307 ID.AddInteger(NumBits);
8315 llvm::PointerIntPair<Expr*, 1, bool> ExprAndUnsigned;
8323 Expr *getNumBitsExpr()
const;
8331 static void Profile(llvm::FoldingSetNodeID &ID,
const ASTContext &Context,
8332 bool IsUnsigned,
Expr *NumBitsExpr);
8335 return T->getTypeClass() == DependentBitInt;
8339class PredefinedSugarType final :
public Type {
8352 static StringRef getName(Kind KD);
8366 return T->getTypeClass() == PredefinedSugar;
8380 if (!
type.hasLocalNonFastQualifiers())
8381 return type.getTypePtrUnsafe();
8402class alignas(8) TypeSourceInfo {
8409 TypeSourceInfo(
QualType ty,
size_t DataSize);
8426 Ty->getLocallyUnqualifiedSingleStepDesugaredType().split();
8432 return getCommonPtr()->BaseType;
8436 return (
isNull() ?
nullptr : getCommonPtr()->BaseType);
8444 if (
Self.isObjectType() ||
Self.isReferenceType())
8447 return F->getMethodQuals().empty() && F->getRefQualifier() ==
RQ_None;
8457 const ExtQuals *eq = getExtQualsUnsafe();
8466 Quals = getExtQualsUnsafe()->getQualifiers();
8472 Qualifiers quals = getCommonPtr()->CanonicalType.getLocalQualifiers();
8478 unsigned cvr = getCommonPtr()->CanonicalType.getLocalCVRQualifiers();
8484 QualType canon = getCommonPtr()->CanonicalType;
8489 return getTypePtr()->isCanonicalUnqualified();
8497 if (T->isVariablyModifiedType() && T->hasSizedVLAType())
8506 getCommonPtr()->CanonicalType.isLocalConstQualified();
8511 getCommonPtr()->CanonicalType.isLocalRestrictQualified();
8517 getCommonPtr()->CanonicalType.isLocalVolatileQualified();
8522 getCommonPtr()->CanonicalType.hasLocalQualifiers();
8529 return QualType(getSplitUnqualifiedTypeImpl(*this).Ty, 0);
8536 return getSplitUnqualifiedTypeImpl(*
this);
8568 if (
const auto *FT = PT->getPointeeType()->getAs<
FunctionType>())
8569 return FT->getExtInfo();
8571 return FT->getExtInfo();
8618 return RefType->getPointeeType();
8709 return !T->getPointeeType()->isFunctionType();
8716 return Fn->hasCFIUncheckedCallee();
8737 return T->getPointeeType()->isFunctionType();
8744 return T->getPointeeType()->isFunctionType();
8755 return T->isMemberFunctionPointer();
8762 return T->isMemberDataPointer();
8822 if (
auto *CMT = dyn_cast<ConstantMatrixType>(CanonicalType))
8823 return CMT->getElementType()->isBooleanType();
8870 return OPT->isObjCQualifiedIdType();
8876 return OPT->isObjCQualifiedClassType();
8882 return OPT->isObjCIdType();
8888 return OPT->isObjCClassType();
8894 return OPT->getPointeeType()->isSpecificBuiltinType(BuiltinType::ObjCSel);
8906#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
8907 inline bool Type::is##Id##Type() const { \
8908 return isSpecificBuiltinType(BuiltinType::Id); \
8910#include "clang/Basic/OpenCLImageTypes.def"
8933#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) is##Id##Type() ||
8935#include "clang/Basic/OpenCLImageTypes.def"
8947#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
8948 inline bool Type::is##Id##Type() const { \
8949 return isSpecificBuiltinType(BuiltinType::Id); \
8951#include "clang/Basic/OpenCLExtensionTypes.def"
8954#define INTEL_SUBGROUP_AVC_TYPE(ExtType, Id) \
8955 isOCLIntelSubgroupAVC##Id##Type() ||
8957#include "clang/Basic/OpenCLExtensionTypes.def"
8962#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) is##Id##Type() ||
8964#include "clang/Basic/OpenCLExtensionTypes.def"
8973#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) \
8974 inline bool Type::is##Id##Type() const { \
8975 return isSpecificBuiltinType(BuiltinType::Id); \
8977#include "clang/Basic/HLSLIntangibleTypes.def"
8980#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) is##Id##Type() ||
8982#include "clang/Basic/HLSLIntangibleTypes.def"
9011 if (
const auto *BT = dyn_cast<BuiltinType>(
this))
9012 return BT->isPlaceholderType();
9017 if (
const auto *BT = dyn_cast<BuiltinType>(
this))
9018 if (BT->isPlaceholderType())
9029 if (
const auto *BT = dyn_cast<BuiltinType>(
this))
9030 return BT->isNonOverloadPlaceholderType();
9079 if (
const auto *BT = dyn_cast<BuiltinType>(CanonicalType))
9080 return BT->isInteger();
9081 if (
const EnumType *ET = dyn_cast<EnumType>(CanonicalType)) {
9088 if (
const auto *OT = dyn_cast<OverflowBehaviorType>(CanonicalType))
9089 return OT->getUnderlyingType()->isIntegerType();
9095 if (
const auto *BT = dyn_cast<BuiltinType>(CanonicalType)) {
9096 return BT->getKind() >= BuiltinType::ShortAccum &&
9097 BT->getKind() <= BuiltinType::SatULongFract;
9111 if (
const auto *BT = dyn_cast<BuiltinType>(CanonicalType)) {
9112 return BT->getKind() >= BuiltinType::SatShortAccum &&
9113 BT->getKind() <= BuiltinType::SatULongFract;
9123 if (
const auto *BT = dyn_cast<BuiltinType>(CanonicalType)) {
9124 return ((BT->getKind() >= BuiltinType::ShortAccum &&
9125 BT->getKind() <= BuiltinType::LongAccum) ||
9126 (BT->getKind() >= BuiltinType::ShortFract &&
9127 BT->getKind() <= BuiltinType::LongFract) ||
9128 (BT->getKind() >= BuiltinType::SatShortAccum &&
9129 BT->getKind() <= BuiltinType::SatLongAccum) ||
9130 (BT->getKind() >= BuiltinType::SatShortFract &&
9131 BT->getKind() <= BuiltinType::SatLongFract));
9141 if (
const auto *BT = dyn_cast<BuiltinType>(CanonicalType))
9142 return BT->getKind() > BuiltinType::Void &&
9143 BT->getKind() <= BuiltinType::NullPtr;
9144 if (
const EnumType *ET = dyn_cast<EnumType>(CanonicalType))
9157 if (
const auto *BT = dyn_cast<BuiltinType>(CanonicalType))
9158 return BT->isInteger();
9162 if (
const auto *ET = dyn_cast<EnumType>(CanonicalType))
9165 if (
const auto *OBT = dyn_cast<OverflowBehaviorType>(CanonicalType))
9166 return OBT->getUnderlyingType()->isIntegralOrEnumerationType();
9172 if (
const auto *BT = dyn_cast<BuiltinType>(CanonicalType))
9173 return BT->getKind() == BuiltinType::Bool;
9179 return DT && !DT->isDeduced();
9196 return TST->isTypeAlias();
9223 if (
type->isAnyPointerType())
9224 return type->getPointeeType().getTypePtr();
9225 else if (
type->isArrayType())
9226 return type->getBaseElementTypeUnsafe();
9251 PD.
AddTaggedVal(
reinterpret_cast<uint64_t
>(T.getAsOpaquePtr()),
9263 "ArrayType cannot be used with getAs!");
9266 if (
const auto *Ty = dyn_cast<T>(
this))
9270 if (!
isa<T>(CanonicalType))
9282 if (
const auto *Ty = dyn_cast<T>(
this))
9286 if (!
isa<T>(CanonicalType))
9291 const Type *Ty =
this;
9293 if (
const auto *A = dyn_cast<AttributedType>(Ty))
9294 Ty = A->getModifiedType().getTypePtr();
9295 else if (
const auto *A = dyn_cast<BTFTagAttributedType>(Ty))
9296 Ty = A->getWrappedType().getTypePtr();
9297 else if (
const auto *A = dyn_cast<HLSLAttributedResourceType>(Ty))
9298 Ty = A->getWrappedType().getTypePtr();
9299 else if (
const auto *P = dyn_cast<ParenType>(Ty))
9300 Ty = P->desugar().getTypePtr();
9301 else if (
const auto *A = dyn_cast<AdjustedType>(Ty))
9302 Ty = A->desugar().getTypePtr();
9303 else if (
const auto *M = dyn_cast<MacroQualifiedType>(Ty))
9304 Ty = M->desugar().getTypePtr();
9311 return dyn_cast<T>(Ty);
9316 if (
const auto *arr = dyn_cast<ArrayType>(
this))
9330 "ArrayType cannot be used with castAs!");
9332 if (
const auto *ty = dyn_cast<T>(
this))
return ty;
9333 assert(
isa<T>(CanonicalType));
9339 if (
const auto *arr = dyn_cast<ArrayType>(
this))
return arr;
9345 :
AdjustedType(Decayed, OriginalType, DecayedPtr, CanonicalPtr) {
9347 QualType Adjusted = getAdjustedType();
9348 (void)AttributedType::stripOuterNullability(Adjusted);
9355 (void)AttributedType::stripOuterNullability(Decayed);
9370 TypePtr = Pointee.getTypePtr();
9376 if (
const auto *FPT = TypePtr->
getAs<FunctionProtoType>())
9377 return FPT->getFunctionEffects();
Provides definitions for the various language-specific address spaces.
static bool isUnsigned(SValBuilder &SVB, NonLoc Value)
Defines the clang::attr::Kind enum.
Defines the Diagnostic-related interfaces.
static bool isBooleanType(QualType Ty)
llvm::dxil::ResourceClass ResourceClass
static std::optional< NonLoc > getIndex(ProgramStateRef State, const ElementRegion *ER, CharKind CK)
clang::CharUnits operator*(clang::CharUnits::QuantityType Scale, const clang::CharUnits &CU)
static void dump(llvm::raw_ostream &OS, StringRef FunctionName, ArrayRef< CounterExpression > Expressions, ArrayRef< CounterMappingRegion > Regions)
static Decl::Kind getKind(const Decl *D)
Defines the ExceptionSpecificationType enumeration and various utility functions.
static QualType getObjectType(APValue::LValueBase B)
Retrieves the "underlying object type" of the given expression, as used by __builtin_object_size.
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified.
Defines the clang::LangOptions interface.
llvm::MachO::Record Record
*collection of selector each with an associated kind and an ordered *collection of selectors A selector has a kind
llvm::raw_ostream & operator<<(llvm::raw_ostream &OS, const OMPTraitInfo &TI)
static StringRef getIdentifier(const Token &Tok)
Implements a partial diagnostic that can be emitted anwyhere in a DiagnosticBuilder stream.
static QualType getUnderlyingType(const SubRegion *R)
static bool hasAttr(const Decl *D, bool IgnoreImplicitAttr)
static RecordDecl * getAsRecordDecl(QualType BaseType, HeuristicResolver &Resolver)
static bool isRecordType(QualType T)
static bool isParameterPack(Expr *PackExpression)
Defines the clang::SourceLocation class and associated facilities.
Defines various enumerations that describe declaration and type specifiers.
static OMPAtomicDirective * Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc, ArrayRef< OMPClause * > Clauses, Stmt *AssociatedStmt, Expressions Exprs)
Creates directive with a list of Clauses and 'x', 'v' and 'expr' parts of the atomic construct (see S...
static bool classof(const Stmt *T)
static QualType getPointeeType(const MemRegion *R)
Defines the clang::Visibility enumeration and various utility functions.
__DEVICE__ void * memcpy(void *__a, const void *__b, size_t __c)
__device__ __2f16 float __ockl_bool s
__device__ __2f16 float c
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
Represents a type which was implicitly adjusted by the semantic engine for arbitrary reasons.
static bool classof(const Type *T)
static void Profile(llvm::FoldingSetNodeID &ID, QualType Orig, QualType New)
AdjustedType(TypeClass TC, QualType OriginalTy, QualType AdjustedTy, QualType CanonicalPtr)
QualType getAdjustedType() const
void Profile(llvm::FoldingSetNodeID &ID)
QualType getOriginalType() const
static bool classof(const Type *T)
Represents an array type, per C99 6.7.5.2 - Array Declarators.
ArraySizeModifier getSizeModifier() const
Qualifiers getIndexTypeQualifiers() const
static bool classof(const Type *T)
QualType getElementType() const
ArrayType(TypeClass tc, QualType et, QualType can, ArraySizeModifier sm, unsigned tq, const Expr *sz=nullptr)
unsigned getIndexTypeCVRQualifiers() const
static void Profile(llvm::FoldingSetNodeID &ID, QualType T)
QualType getValueType() const
Gets the type contained by this atomic type, i.e.
void Profile(llvm::FoldingSetNodeID &ID)
static bool classof(const Type *T)
Attr - This represents one attribute.
static bool classof(const Type *T)
BitIntType(bool isUnsigned, unsigned NumBits)
static void Profile(llvm::FoldingSetNodeID &ID, bool IsUnsigned, unsigned NumBits)
void Profile(llvm::FoldingSetNodeID &ID) const
unsigned getNumBits() const
void Profile(llvm::FoldingSetNodeID &ID)
QualType getPointeeType() const
static bool classof(const Type *T)
static void Profile(llvm::FoldingSetNodeID &ID, QualType Pointee)
[BoundsSafety] Represents a parent type class for CountAttributedType and similar sugar types that wi...
decl_iterator dependent_decl_begin() const
decl_iterator dependent_decl_end() const
unsigned getNumCoupledDecls() const
BoundsAttributedType(TypeClass TC, QualType Wrapped, QualType Canon)
const TypeCoupledDeclRefInfo * decl_iterator
decl_range dependent_decls() const
ArrayRef< TypeCoupledDeclRefInfo > getCoupledDecls() const
llvm::iterator_range< decl_iterator > decl_range
static bool classof(const Type *T)
ArrayRef< TypeCoupledDeclRefInfo > Decls
This class is used for builtin types like 'int'.
bool isPlaceholderType() const
Determines whether this type is a placeholder type, i.e.
bool isNonOverloadPlaceholderType() const
Determines whether this type is a placeholder type other than Overload.
bool isFloatingPoint() const
static bool classof(const Type *T)
bool isSignedInteger() const
bool isUnsignedInteger() const
static bool isPlaceholderTypeKind(Kind K)
Determines whether the given kind corresponds to a placeholder type.
StringRef getName(const PrintingPolicy &Policy) const
const char * getNameAsCString(const PrintingPolicy &Policy) const
Represents a C++ struct/union/class.
Complex values, per C99 6.2.5p11.
QualType getElementType() const
static void Profile(llvm::FoldingSetNodeID &ID, QualType Element)
static bool classof(const Type *T)
void Profile(llvm::FoldingSetNodeID &ID)
Declaration of a C++20 concept.
Represents the canonical version of C arrays with a specified constant size.
unsigned getSizeBitWidth() const
Return the bit width of the size type.
ConstantArrayType(TypeClass Tc, const ConstantArrayType *ATy, QualType Can)
uint64_t getLimitedSize() const
Return the size zero-extended to uint64_t or UINT64_MAX if the value is larger than UINT64_MAX.
bool isZeroSize() const
Return true if the size is zero.
int64_t getSExtSize() const
Return the size sign-extended as a uint64_t.
const Expr * getSizeExpr() const
Return a pointer to the size expression.
static bool classof(const Type *T)
llvm::APInt getSize() const
Return the constant array size as an APInt.
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Ctx)
uint64_t getZExtSize() const
Return the size zero-extended as a uint64_t.
unsigned getNumColumns() const
Returns the number of columns in the matrix.
static void Profile(llvm::FoldingSetNodeID &ID, QualType ElementType, unsigned NumRows, unsigned NumColumns, TypeClass TypeClass)
void Profile(llvm::FoldingSetNodeID &ID)
unsigned getRowMajorFlattenedIndex(unsigned Row, unsigned Column) const
Returns the row-major flattened index of a matrix element located at row Row, and column Column.
unsigned getNumRows() const
Returns the number of rows in the matrix.
unsigned getNumElementsFlattened() const
Returns the number of elements required to embed the matrix into a vector.
unsigned getFlattenedIndex(unsigned Row, unsigned Column, bool IsRowMajor=false) const
Returns the flattened index of a matrix element located at row Row, and column Column.
ConstantMatrixType(QualType MatrixElementType, unsigned NRows, unsigned NColumns, QualType CanonElementType)
unsigned mapColumnMajorToRowMajorFlattenedIndex(unsigned ColumnMajorIdx) const
Given a column-major flattened index ColumnMajorIdx, return the equivalent row-major flattened index.
unsigned mapRowMajorToColumnMajorFlattenedIndex(unsigned RowMajorIdx) const
Given a row-major flattened index RowMajorIdx, return the equivalent column-major flattened index.
unsigned getColumnMajorFlattenedIndex(unsigned Row, unsigned Column) const
Returns the column-major flattened index of a matrix element located at row Row, and column Column.
unsigned NumRows
Number of rows and columns.
static bool classof(const Type *T)
Represents a sugar type with __counted_by or __sized_by annotations, including their _or_null variant...
void Profile(llvm::FoldingSetNodeID &ID)
static bool classof(const Type *T)
bool isCountInBytes() const
Expr * getCountExpr() const
DynamicCountPointerKind getKind() const
QualType getPointeeType() const
static bool classof(const Type *T)
QualType getDecayedType() const
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
Decl - This represents one declaration (or definition), e.g.
Expr * getAddrSpaceExpr() const
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context)
QualType getPointeeType() const
static bool classof(const Type *T)
SourceLocation getAttributeLoc() const
Expr * getNumBitsExpr() const
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context)
DependentBitIntType(bool IsUnsigned, Expr *NumBits)
static bool classof(const Type *T)
friend class StmtIteratorBase
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context)
static bool classof(const Type *T)
Expr * getSizeExpr() const
Expr * getSizeExpr() const
static bool classof(const Type *T)
SourceLocation getAttributeLoc() const
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context)
QualType getElementType() const
Expr * getColumnExpr() const
Expr * getRowExpr() const
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context)
SourceLocation getAttributeLoc() const
static bool classof(const Type *T)
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context)
DependentTypeOfExprType(const ASTContext &Context, Expr *E, TypeOfKind Kind)
Expr * getSizeExpr() const
VectorKind getVectorKind() const
SourceLocation getAttributeLoc() const
QualType getElementType() const
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context)
static bool classof(const Type *T)
@ ak_addrspace
address space
Wrap a function effect's condition expression in another struct so that FunctionProtoType's TrailingO...
EffectConditionExpr(Expr *E)
Expr * getCondition() const
bool operator==(const EffectConditionExpr &RHS) const
EffectConditionExpr()=default
This represents one expression.
We can encode up to four bits in the low bits of a type pointer, but there are many more type qualifi...
Qualifiers::ObjCLifetime getObjCLifetime() const
static void Profile(llvm::FoldingSetNodeID &ID, const Type *BaseType, Qualifiers Quals)
void Profile(llvm::FoldingSetNodeID &ID) const
ExtQuals(const Type *baseType, QualType canon, Qualifiers quals)
bool hasObjCGCAttr() const
Qualifiers::GC getObjCGCAttr() const
bool hasAddressSpace() const
const Type * getBaseType() const
Qualifiers getQualifiers() const
LangAS getAddressSpace() const
bool hasObjCLifetime() const
bool isAccessorWithinNumElements(char c, bool isNumericAccessor) const
static int getNumericAccessorIdx(char c)
static bool classof(const Type *T)
static int getPointAccessorIdx(char c)
static int getAccessorIdx(char c, bool isNumericAccessor)
Represents a function declaration or definition.
Support iteration in parallel through a pair of FunctionEffect and EffectConditionExpr containers.
bool operator==(const FunctionEffectIterator &Other) const
bool operator!=(const FunctionEffectIterator &Other) const
FunctionEffectIterator operator++()
FunctionEffectIterator(const Container &O, size_t I)
FunctionEffectWithCondition operator*() const
A mutable set of FunctionEffect::Kind.
static FunctionEffectKindSet difference(FunctionEffectKindSet LHS, FunctionEffectKindSet RHS)
bool contains(const FunctionEffect::Kind EK) const
FunctionEffectKindSet()=default
FunctionEffectKindSet(FunctionEffectsRef FX)
void insert(FunctionEffectKindSet Set)
void insert(FunctionEffectsRef FX)
void insert(FunctionEffect Effect)
FunctionEffectSet(const FunctionEffectsRef &FX)
FunctionEffectSet()=default
FunctionEffectIterator< FunctionEffectSet > iterator
bool insert(const FunctionEffectWithCondition &NewEC, Conflicts &Errs)
SmallVector< Conflict > Conflicts
static FunctionEffectSet getIntersection(FunctionEffectsRef LHS, FunctionEffectsRef RHS)
static FunctionEffectSet getUnion(FunctionEffectsRef LHS, FunctionEffectsRef RHS, Conflicts &Errs)
Represents an abstract function effect, using just an enumeration describing its kind.
Kind kind() const
The kind of the effect.
unsigned Flags
Flags describing some behaviors of the effect.
static constexpr size_t KindCount
friend bool operator<(FunctionEffect LHS, FunctionEffect RHS)
friend bool operator==(FunctionEffect LHS, FunctionEffect RHS)
uint32_t toOpaqueInt32() const
For serialization.
@ FE_ExcludeStaticLocalVars
@ FE_ExcludeThreadLocalVars
@ FE_ExcludeObjCMessageSend
friend bool operator!=(FunctionEffect LHS, FunctionEffect RHS)
Kind
Identifies the particular effect.
Flags flags() const
Flags describing some behaviors of the effect.
StringRef name() const
The description printed in diagnostics, e.g. 'nonblocking'.
static FunctionEffect fromOpaqueInt32(uint32_t Value)
friend raw_ostream & operator<<(raw_ostream &OS, const FunctionEffect &Effect)
An immutable set of FunctionEffects and possibly conditions attached to them.
ArrayRef< FunctionEffect > effects() const
ArrayRef< EffectConditionExpr > conditions() const
static FunctionEffectsRef create(ArrayRef< FunctionEffect > FX, ArrayRef< EffectConditionExpr > Conds)
Asserts invariants.
FunctionEffectIterator< FunctionEffectsRef > iterator
FunctionEffectsRef()=default
friend bool operator==(const FunctionEffectsRef &LHS, const FunctionEffectsRef &RHS)
static FunctionEffectsRef get(QualType QT)
Extract the effects from a Type if it is a function, block, or member function pointer,...
friend bool operator!=(const FunctionEffectsRef &LHS, const FunctionEffectsRef &RHS)
static void Profile(llvm::FoldingSetNodeID &ID, QualType ResultType, ExtInfo Info)
static bool classof(const Type *T)
void Profile(llvm::FoldingSetNodeID &ID)
Represents a prototype with parameter type info, e.g.
param_type_iterator param_type_begin() const
unsigned getNumFunctionEffectConditions() const
ExtParameterInfo getExtParameterInfo(unsigned I) const
ArrayRef< EffectConditionExpr > getFunctionEffectConditions() const
ExceptionSpecificationType getExceptionSpecType() const
Get the kind of exception specification on this function.
ArrayRef< FunctionEffect > getFunctionEffectsWithoutConditions() const
bool isParamConsumed(unsigned I) const
exception_iterator exception_end() const
const ExtParameterInfo * getExtParameterInfosOrNull() const
Return a pointer to the beginning of the array of extra parameter information, if present,...
unsigned getNumParams() const
bool hasTrailingReturn() const
Whether this function prototype has a trailing return type.
ExceptionSpecInfo getExceptionSpecInfo() const
Return all the available information about this type's exception spec.
const QualType * param_type_iterator
Qualifiers getMethodQuals() const
const QualType * exception_iterator
static bool classof(const Type *T)
QualType getParamType(unsigned i) const
FunctionEffectsRef getFunctionEffects() const
unsigned getAArch64SMEAttributes() const
Return a bitmask describing the SME attributes on the function type, see AArch64SMETypeAttributes for...
QualType getExceptionType(unsigned i) const
Return the ith exception type, where 0 <= i < getNumExceptions().
static void Profile(llvm::FoldingSetNodeID &ID, QualType Result, param_type_iterator ArgTys, unsigned NumArgs, const ExtProtoInfo &EPI, const ASTContext &Context, bool Canonical)
SourceLocation getEllipsisLoc() const
unsigned getNumFunctionEffects() const
bool hasCFIUncheckedCallee() const
unsigned getNumExceptions() const
Return the number of types in the exception specification.
bool hasExceptionSpec() const
Return whether this function has any kind of exception spec.
CanThrowResult canThrow() const
Determine whether this function type has a non-throwing exception specification.
bool hasDynamicExceptionSpec() const
Return whether this function has a dynamic (throw) exception spec.
bool hasNoexceptExceptionSpec() const
Return whether this function has a noexcept exception spec.
bool isVariadic() const
Whether this function prototype is variadic.
ExtProtoInfo getExtProtoInfo() const
Expr * getNoexceptExpr() const
Return the expression inside noexcept(expression), or a null pointer if there is none (because the ex...
param_type_iterator param_type_end() const
FunctionDecl * getExceptionSpecTemplate() const
If this function type has an uninstantiated exception specification, this is the function whose excep...
FunctionTypeExtraAttributeInfo getExtraAttributeInfo() const
Return the extra attribute information.
bool isNothrow(bool ResultIfDependent=false) const
Determine whether this function type has a non-throwing exception specification.
ArrayRef< QualType > getParamTypes() const
ArrayRef< QualType > exceptions() const
ParameterABI getParameterABI(unsigned I) const
ArrayRef< QualType > param_types() const
exception_iterator exception_begin() const
ArrayRef< ExtParameterInfo > getExtParameterInfos() const
bool hasExtParameterInfos() const
Is there any interesting extra information for any of the parameters of this function type?
RefQualifierKind getRefQualifier() const
Retrieve the ref-qualifier associated with this function type.
FunctionDecl * getExceptionSpecDecl() const
If this function type has an exception specification which hasn't been determined yet (either because...
A class which abstracts out some details necessary for making a call.
ExtInfo withNoCfCheck(bool noCfCheck) const
ExtInfo withCallingConv(CallingConv cc) const
CallingConv getCC() const
ExtInfo withProducesResult(bool producesResult) const
ExtInfo(bool noReturn, bool hasRegParm, unsigned regParm, CallingConv cc, bool producesResult, bool noCallerSavedRegs, bool NoCfCheck, bool cmseNSCall)
bool getCmseNSCall() const
bool getNoCfCheck() const
unsigned getRegParm() const
void Profile(llvm::FoldingSetNodeID &ID) const
bool getNoCallerSavedRegs() const
ExtInfo withNoReturn(bool noReturn) const
bool getHasRegParm() const
friend class FunctionType
bool operator==(ExtInfo Other) const
bool getProducesResult() const
ExtInfo withNoCallerSavedRegs(bool noCallerSavedRegs) const
ExtInfo withCmseNSCall(bool cmseNSCall) const
ExtInfo withRegParm(unsigned RegParm) const
bool operator!=(ExtInfo Other) const
Interesting information about a specific parameter that can't simply be reflected in parameter's type...
friend bool operator==(ExtParameterInfo lhs, ExtParameterInfo rhs)
friend bool operator!=(ExtParameterInfo lhs, ExtParameterInfo rhs)
ExtParameterInfo()=default
bool hasPassObjectSize() const
ExtParameterInfo withHasPassObjectSize() const
unsigned char getOpaqueValue() const
bool isConsumed() const
Is this parameter considered "consumed" by Objective-C ARC?
ParameterABI getABI() const
Return the ABI treatment of this parameter.
ExtParameterInfo withIsConsumed(bool consumed) const
ExtParameterInfo withIsNoEscape(bool NoEscape) const
ExtParameterInfo withABI(ParameterABI kind) const
static ExtParameterInfo getFromOpaqueValue(unsigned char data)
FunctionType - C99 6.7.5.3 - Function Declarators.
ExtInfo getExtInfo() const
AArch64SMETypeAttributes
The AArch64 SME ACLE (Arm C/C++ Language Extensions) define a number of function type attributes that...
@ SME_PStateSMEnabledMask
@ SME_PStateSMCompatibleMask
@ SME_AgnosticZAStateShift
@ SME_AgnosticZAStateMask
static ArmStateValue getArmZT0State(unsigned AttrBits)
bool getNoReturnAttr() const
Determine whether this function type includes the GNU noreturn attribute.
static ArmStateValue getArmZAState(unsigned AttrBits)
unsigned getRegParmType() const
CallingConv getCallConv() const
QualType getReturnType() const
FunctionType(TypeClass tc, QualType res, QualType Canonical, TypeDependence Dependence, ExtInfo Info)
static bool classof(const Type *T)
bool getCmseNSCallAttr() const
bool getHasRegParm() const
Qualifiers getFastTypeQuals() const
QualType getCallResultType(const ASTContext &Context) const
Determine the type of an expression that calls a function of this type.
One of these records is kept for each identifier that is lexed.
void Profile(llvm::FoldingSetNodeID &ID)
static void Profile(llvm::FoldingSetNodeID &ID, QualType ET, ArraySizeModifier SizeMod, unsigned TypeQuals)
friend class StmtIteratorBase
static bool classof(const Type *T)
KeywordWrapper(ElaboratedTypeKeyword Keyword, As &&...as)
ElaboratedTypeKeyword getKeyword() const
static CannotCastToThisType classof(const T *)
static bool classof(const Type *T)
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
static bool classof(const Type *T)
QualType getUnderlyingType() const
const IdentifierInfo * getMacroIdentifier() const
static bool isValidElementType(QualType T, const LangOptions &LangOpts)
Valid elements types are the following:
QualType getElementType() const
Returns type of the elements being stored in the matrix.
MatrixType(QualType ElementTy, QualType CanonElementTy)
QualType ElementType
The element type of the matrix.
static bool classof(const Type *T)
NestedNameSpecifier getQualifier() const
void Profile(llvm::FoldingSetNodeID &ID)
QualType getPointeeType() const
bool isMemberFunctionPointer() const
Returns true if the member type (i.e.
bool isMemberDataPointer() const
Returns true if the member type (i.e.
static bool classof(const Type *T)
This represents a decl that may have a name.
Represents a C++ nested name specifier, such as "\::std::vector<int>::".
Represents an ObjC class declaration.
Represents typeof(type), a C23 feature and GCC extension, or `typeof_unqual(type),...
static bool classof(const Type *T)
Represents a pointer to an Objective C object.
unsigned getNumProtocols() const
Return the number of qualifying protocols on the object type.
bool isSpecialized() const
Whether this type is specialized, meaning that it has type arguments.
qual_iterator qual_end() const
bool isObjCQualifiedClassType() const
True if this is equivalent to 'Class.
static void Profile(llvm::FoldingSetNodeID &ID, QualType T)
bool isObjCQualifiedIdType() const
True if this is equivalent to 'id.
bool isSpecializedAsWritten() const
Whether this type is specialized, meaning that it has type arguments.
bool isUnspecializedAsWritten() const
Determine whether this object type is "unspecialized" as written, meaning that it has no type argumen...
ArrayRef< QualType > getTypeArgsAsWritten() const
Retrieve the type arguments for this type.
void Profile(llvm::FoldingSetNodeID &ID)
const ObjCObjectType * getObjectType() const
Gets the type pointed to by this ObjC pointer.
ObjCObjectType::qual_iterator qual_iterator
An iterator over the qualifiers on the object type.
llvm::iterator_range< qual_iterator > qual_range
static bool classof(const Type *T)
bool isUnspecialized() const
Whether this type is unspecialized, meaning that is has no type arguments.
bool isObjCIdType() const
True if this is equivalent to the 'id' type, i.e.
ObjCProtocolDecl * getProtocol(unsigned I) const
Retrieve a qualifying protocol by index on the object type.
QualType getPointeeType() const
Gets the type pointed to by this ObjC pointer.
ObjCInterfaceDecl * getInterfaceDecl() const
If this pointer points to an Objective @interface type, gets the declaration for that interface.
bool isObjCClassType() const
True if this is equivalent to the 'Class' type, i.e.
bool isObjCIdOrClassType() const
True if this is equivalent to the 'id' or 'Class' type,.
ArrayRef< QualType > getTypeArgs() const
Retrieve the type arguments for this type.
qual_iterator qual_begin() const
bool isKindOfType() const
Whether this is a "__kindof" type.
Represents an Objective-C protocol declaration.
void Profile(llvm::FoldingSetNodeID &ID)
static bool classof(const Type *T)
static void Profile(llvm::FoldingSetNodeID &ID, QualType Inner)
QualType getInnerType() const
static void Profile(llvm::FoldingSetNodeID &ID, QualType T, bool isRead)
QualType getElementType() const
void Profile(llvm::FoldingSetNodeID &ID)
static bool classof(const Type *T)
Pointer-authentication qualifiers.
static PointerAuthQualifier fromOpaqueValue(uint32_t Opaque)
friend bool operator==(PointerAuthQualifier Lhs, PointerAuthQualifier Rhs)
bool isIsaPointer() const
static PointerAuthQualifier Create(unsigned Key, bool IsAddressDiscriminated, unsigned ExtraDiscriminator, PointerAuthenticationMode AuthenticationMode, bool IsIsaPointer, bool AuthenticatesNullValues)
friend bool operator!=(PointerAuthQualifier Lhs, PointerAuthQualifier Rhs)
bool authenticatesNullValues() const
bool isEquivalent(PointerAuthQualifier Other) const
@ MaxDiscriminator
The maximum supported pointer-authentication discriminator.
@ MaxKey
The maximum supported pointer-authentication key.
void Profile(llvm::FoldingSetNodeID &ID) const
bool isAddressDiscriminated() const
PointerAuthQualifier withoutKeyNone() const
unsigned getExtraDiscriminator() const
void print(raw_ostream &OS, const PrintingPolicy &Policy) const
PointerAuthenticationMode getAuthenticationMode() const
bool isEmptyWhenPrinted(const PrintingPolicy &Policy) const
std::string getAsString() const
uint32_t getAsOpaqueValue() const
PointerAuthQualifier()=default
PointerType - C99 6.7.5.1 - Pointer Declarators.
QualType getPointeeType() const
static bool classof(const Type *T)
void Profile(llvm::FoldingSetNodeID &ID)
static void Profile(llvm::FoldingSetNodeID &ID, QualType Pointee)
static bool classof(const Type *T)
const IdentifierInfo * getIdentifier() const
StreamedQualTypeHelper(const QualType &T, const PrintingPolicy &Policy, const Twine &PlaceHolder, unsigned Indentation)
friend raw_ostream & operator<<(raw_ostream &OS, const StreamedQualTypeHelper &SQT)
A (possibly-)qualified type.
void addRestrict()
Add the restrict qualifier to this QualType.
QualType(const ExtQuals *Ptr, unsigned Quals)
bool hasAddressDiscriminatedPointerAuth() const
bool isLocalConstQualified() const
Determine whether this particular QualType instance has the "const" qualifier set,...
bool isLocalRestrictQualified() const
Determine whether this particular QualType instance has the "restrict" qualifier set,...
bool isVolatileQualified() const
Determine whether this type is volatile-qualified.
bool isRestrictQualified() const
Determine whether this type is restrict-qualified.
bool isTriviallyCopyableType(const ASTContext &Context) const
Return true if this is a trivially copyable type (C++0x [basic.types]p9)
QualType IgnoreParens() const
Returns the specified type after dropping any outer-level parentheses.
Qualifiers::GC getObjCGCAttr() const
Returns gc attribute of this type.
friend bool operator==(const QualType &LHS, const QualType &RHS)
Indicate whether the specified types and qualifiers are identical.
bool hasQualifiers() const
Determine whether this type has any qualifiers.
QualType withFastQualifiers(unsigned TQs) const
QualType withRestrict() const
bool hasNonTrivialToPrimitiveCopyCUnion() const
Check if this is or contains a C union that is non-trivial to copy, which is a union that has a membe...
PointerAuthQualifier getPointerAuth() const
void addFastQualifiers(unsigned TQs)
bool isWebAssemblyFuncrefType() const
Returns true if it is a WebAssembly Funcref Type.
QualType getNonLValueExprType(const ASTContext &Context) const
Determine the type of a (typically non-lvalue) expression with the specified result type.
@ DK_objc_strong_lifetime
PrimitiveDefaultInitializeKind
@ PDIK_ARCWeak
The type is an Objective-C retainable pointer type that is qualified with the ARC __weak qualifier.
@ PDIK_Trivial
The type does not fall into any of the following categories.
@ PDIK_ARCStrong
The type is an Objective-C retainable pointer type that is qualified with the ARC __strong qualifier.
@ PDIK_Struct
The type is a struct containing a field whose type is not PCK_Trivial.
bool mayBeDynamicClass() const
Returns true if it is a class and it might be dynamic.
bool hasLocalNonFastQualifiers() const
Determine whether this particular QualType instance has any "non-fast" qualifiers,...
bool isNonWeakInMRRWithObjCWeak(const ASTContext &Context) const
const IdentifierInfo * getBaseTypeIdentifier() const
Retrieves a pointer to the name of the base type.
bool isBitwiseCloneableType(const ASTContext &Context) const
Return true if the type is safe to bitwise copy using memcpy/memmove.
QualType withoutLocalFastQualifiers() const
void Profile(llvm::FoldingSetNodeID &ID) const
bool isAddressSpaceOverlapping(QualType T, const ASTContext &Ctx) const
Returns true if address space qualifiers overlap with T address space qualifiers.
QualType getDesugaredType(const ASTContext &Context) const
Return the specified type with any "sugar" removed from the type.
void removeLocalFastQualifiers(unsigned Mask)
QualType withConst() const
QualType getLocalUnqualifiedType() const
Return this type with all of the instance-specific qualifiers removed, but without removing any quali...
void addConst()
Add the const type qualifier to this QualType.
bool hasLocalQualifiers() const
Determine whether this particular QualType instance has any qualifiers, without looking through any t...
bool isTriviallyCopyConstructibleType(const ASTContext &Context) const
Return true if this is a trivially copyable type.
bool isTrivialType(const ASTContext &Context) const
Return true if this is a trivial type per (C++0x [basic.types]p9)
bool isNull() const
Return true if this QualType doesn't point to a type yet.
PrimitiveCopyKind isNonTrivialToPrimitiveCopy() const
Check if this is a non-trivial type that would cause a C struct transitively containing this type to ...
const Type * getTypePtr() const
Retrieves a pointer to the underlying (unqualified) type.
LangAS getAddressSpace() const
Return the address space of this type.
bool isConstant(const ASTContext &Ctx) const
static QualType getFromOpaquePtr(const void *Ptr)
QualType withVolatile() const
bool hasNonTrivialToPrimitiveDestructCUnion() const
Check if this is or contains a C union that is non-trivial to destruct, which is a union that has a m...
Qualifiers getQualifiers() const
Retrieve the set of qualifiers applied to this type.
const Type * operator->() const
void setLocalFastQualifiers(unsigned Quals)
bool isCXX98PODType(const ASTContext &Context) const
Return true if this is a POD type according to the rules of the C++98 standard, regardless of the cur...
Qualifiers::ObjCLifetime getObjCLifetime() const
Returns lifetime attribute of this type.
QualType stripObjCKindOfType(const ASTContext &ctx) const
Strip Objective-C "__kindof" types from the given type.
void print(raw_ostream &OS, const PrintingPolicy &Policy, const Twine &PlaceHolder=Twine(), unsigned Indentation=0) const
void getAsStringInternal(std::string &Str, const PrintingPolicy &Policy) const
bool isReferenceable() const
QualType getNonReferenceType() const
If Type is a reference type (e.g., const int&), returns the type that the reference refers to ("const...
QualType getCanonicalType() const
QualType getUnqualifiedType() const
Retrieve the unqualified variant of the given type, removing as little sugar as possible.
void removeLocalVolatile()
QualType substObjCMemberType(QualType objectType, const DeclContext *dc, ObjCSubstitutionContext context) const
Substitute type arguments from an object type for the Objective-C type parameters used in the subject...
bool isWebAssemblyReferenceType() const
Returns true if it is a WebAssembly Reference Type.
SplitQualType getSplitDesugaredType() const
std::optional< NonConstantStorageReason > isNonConstantStorage(const ASTContext &Ctx, bool ExcludeCtor, bool ExcludeDtor)
Determine whether instances of this type can be placed in immutable storage.
QualType withCVRQualifiers(unsigned CVR) const
bool isTrapType() const
Returns true if it is a OverflowBehaviorType of Trap kind.
unsigned getLocalCVRQualifiers() const
Retrieve the set of CVR (const-volatile-restrict) qualifiers local to this particular QualType instan...
SplitQualType split() const
Divides a QualType into its unqualified type and a set of local qualifiers.
bool UseExcessPrecision(const ASTContext &Ctx)
void addVolatile()
Add the volatile type qualifier to this QualType.
bool isCForbiddenLValueType() const
Determine whether expressions of the given type are forbidden from being lvalues in C.
PrimitiveDefaultInitializeKind isNonTrivialToPrimitiveDefaultInitialize() const
Functions to query basic properties of non-trivial C struct types.
bool isObjCGCStrong() const
true when Type is objc's strong.
std::string getAsString() const
void * getAsOpaquePtr() const
static void print(SplitQualType split, raw_ostream &OS, const PrintingPolicy &policy, const Twine &PlaceHolder, unsigned Indentation=0)
bool isMoreQualifiedThan(QualType Other, const ASTContext &Ctx) const
Determine whether this type is more qualified than the other given type, requiring exact equality for...
bool isCanonicalAsParam() const
void removeLocalRestrict()
bool isWebAssemblyExternrefType() const
Returns true if it is a WebAssembly Externref Type.
QualType(const Type *Ptr, unsigned Quals)
QualType getNonPackExpansionType() const
Remove an outer pack expansion type (if any) from this type.
SplitQualType getSplitUnqualifiedType() const
Retrieve the unqualified variant of the given type, removing as little sugar as possible.
bool isCXX11PODType(const ASTContext &Context) const
Return true if this is a POD type according to the more relaxed rules of the C++11 standard,...
bool mayBeNotDynamicClass() const
Returns true if it is not a class or if the class might not be dynamic.
bool isConstQualified() const
Determine whether this type is const-qualified.
bool hasAddressSpace() const
Check if this type has any address space qualifier.
bool isObjCGCWeak() const
true when Type is objc's weak.
QualType substObjCTypeArgs(ASTContext &ctx, ArrayRef< QualType > typeArgs, ObjCSubstitutionContext context) const
Substitute type arguments for the Objective-C type parameters used in the subject type.
unsigned getLocalFastQualifiers() const
void removeLocalFastQualifiers()
QualType getAtomicUnqualifiedType() const
Remove all qualifiers including _Atomic.
DestructionKind isDestructedType() const
Returns a nonzero value if objects of this type require non-trivial work to clean up after.
friend bool operator<(const QualType &LHS, const QualType &RHS)
friend bool operator!=(const QualType &LHS, const QualType &RHS)
StreamedQualTypeHelper stream(const PrintingPolicy &Policy, const Twine &PlaceHolder=Twine(), unsigned Indentation=0) const
bool isLocalVolatileQualified() const
Determine whether this particular QualType instance has the "volatile" qualifier set,...
bool isConstantStorage(const ASTContext &Ctx, bool ExcludeCtor, bool ExcludeDtor)
unsigned getCVRQualifiers() const
Retrieve the set of CVR (const-volatile-restrict) qualifiers applied to this type.
static void getAsStringInternal(SplitQualType split, std::string &out, const PrintingPolicy &policy)
QualType getSingleStepDesugaredType(const ASTContext &Context) const
Return the specified type with one level of "sugar" removed from the type.
const Type * getTypePtrOrNull() const
bool isWrapType() const
Returns true if it is a OverflowBehaviorType of Wrap kind.
static std::string getAsString(SplitQualType split, const PrintingPolicy &Policy)
bool hasNonTrivialObjCLifetime() const
bool isPODType(const ASTContext &Context) const
Determine whether this is a Plain Old Data (POD) type (C++ 3.9p10).
bool isAtLeastAsQualifiedAs(QualType Other, const ASTContext &Ctx) const
Determine whether this type is at least as qualified as the other given type, requiring exact equalit...
friend class QualifierCollector
bool hasStrongOrWeakObjCLifetime() const
PrimitiveCopyKind isNonTrivialToPrimitiveDestructiveMove() const
Check if this is a non-trivial type that would cause a C struct transitively containing this type to ...
QualType withExactLocalFastQualifiers(unsigned TQs) const
@ NonConstNonReferenceType
@ PCK_Struct
The type is a struct containing a field whose type is neither PCK_Trivial nor PCK_VolatileTrivial.
@ PCK_Trivial
The type does not fall into any of the following categories.
@ PCK_ARCStrong
The type is an Objective-C retainable pointer type that is qualified with the ARC __strong qualifier.
@ PCK_VolatileTrivial
The type would be trivial except that it is volatile-qualified.
@ PCK_PtrAuth
The type is an address-discriminated signed pointer type.
@ PCK_ARCWeak
The type is an Objective-C retainable pointer type that is qualified with the ARC __weak qualifier.
const Type & operator*() const
Qualifiers getLocalQualifiers() const
Retrieve the set of qualifiers local to this particular QualType instance, not including any qualifie...
bool hasNonTrivialToPrimitiveDefaultInitializeCUnion() const
Check if this is or contains a C union that is non-trivial to default-initialize, which is a union th...
const Type * strip(QualType type)
Collect any qualifiers on the given type and return an unqualified type.
QualifierCollector(Qualifiers Qs=Qualifiers())
QualifiersAndAtomic & operator+=(Qualifiers RHS)
QualifiersAndAtomic withVolatile()
QualifiersAndAtomic withAtomic()
QualifiersAndAtomic withConst()
QualifiersAndAtomic(Qualifiers Quals, bool HasAtomic)
QualifiersAndAtomic withRestrict()
The collection of all-type qualifiers we support.
unsigned getCVRQualifiers() const
void removeCVRQualifiers(unsigned mask)
friend Qualifiers operator-(Qualifiers L, Qualifiers R)
Compute the difference between two qualifier sets.
static Qualifiers fromFastMask(unsigned Mask)
void setFastQualifiers(unsigned mask)
void addAddressSpace(LangAS space)
static Qualifiers removeCommonQualifiers(Qualifiers &L, Qualifiers &R)
Returns the common set of qualifiers while removing them from the given sets.
bool hasOnlyConst() const
@ OCL_Strong
Assigning into this object requires the old value to be released and the new value to be retained.
@ OCL_ExplicitNone
This object can be modified without requiring retains or releases.
@ OCL_None
There is no lifetime qualification on this type.
@ OCL_Weak
Reading or writing from this object requires a barrier call.
@ OCL_Autoreleasing
Assigning into this object requires a lifetime extension.
void removeObjCLifetime()
bool hasTargetSpecificAddressSpace() const
bool isStrictSupersetOf(Qualifiers Other) const
Determine whether this set of qualifiers is a strict superset of another set of qualifiers,...
bool hasNonFastQualifiers() const
Return true if the set contains any qualifiers which require an ExtQuals node to be allocated.
void Profile(llvm::FoldingSetNodeID &ID) const
bool operator!=(Qualifiers Other) const
bool hasNonTrivialObjCLifetime() const
True if the lifetime is neither None or ExplicitNone.
void addCVRQualifiers(unsigned mask)
bool hasCVRQualifiers() const
void addConsistentQualifiers(Qualifiers qs)
Add the qualifiers from the given set to this set, given that they don't conflict.
void removeFastQualifiers(unsigned mask)
static bool isTargetAddressSpaceSupersetOf(LangAS A, LangAS B, const ASTContext &Ctx)
Qualifiers & operator+=(Qualifiers R)
void removeFastQualifiers()
bool hasQualifiers() const
Return true if the set contains any qualifiers.
void removeCVRQualifiers()
Qualifiers withVolatile() const
void addCVRUQualifiers(unsigned mask)
Qualifiers & operator-=(Qualifiers R)
bool compatiblyIncludes(Qualifiers other, const ASTContext &Ctx) const
Determines if these qualifiers compatibly include another set.
bool hasUnaligned() const
unsigned getAddressSpaceAttributePrintValue() const
Get the address space attribute value to be printed by diagnostics.
bool hasAddressSpace() const
static bool isAddressSpaceSupersetOf(LangAS A, LangAS B, const ASTContext &Ctx)
Returns true if address space A is equal to or a superset of B.
Qualifiers withoutAddressSpace() const
unsigned getFastQualifiers() const
void print(raw_ostream &OS, const PrintingPolicy &Policy, bool appendSpaceIfNonEmpty=false) const
void removeAddressSpace()
void addQualifiers(Qualifiers Q)
Add the qualifiers from the given set to this set.
static Qualifiers fromCVRMask(unsigned CVR)
void setAddressSpace(LangAS space)
unsigned getCVRUQualifiers() const
bool isEmptyWhenPrinted(const PrintingPolicy &Policy) const
PointerAuthQualifier getPointerAuth() const
void setObjCGCAttr(GC type)
Qualifiers withConst() const
bool hasObjCGCAttr() const
uint64_t getAsOpaqueValue() const
void setCVRQualifiers(unsigned mask)
bool hasObjCLifetime() const
ObjCLifetime getObjCLifetime() const
Qualifiers withoutObjCLifetime() const
Qualifiers withoutObjCGCAttr() const
static Qualifiers fromCVRUMask(unsigned CVRU)
friend Qualifiers operator+(Qualifiers L, Qualifiers R)
void setUnaligned(bool flag)
void addFastQualifiers(unsigned mask)
std::string getAsString() const
Qualifiers withRestrict() const
void addPointerAuth(PointerAuthQualifier Q)
void addObjCGCAttr(GC type)
bool hasPointerAuth() const
bool operator==(Qualifiers Other) const
void removeQualifiers(Qualifiers Q)
Remove the qualifiers from the given set from this set.
LangAS getAddressSpace() const
bool hasOnlyVolatile() const
void setPointerAuth(PointerAuthQualifier Q)
bool compatiblyIncludesObjCLifetime(Qualifiers other) const
Determines if these qualifiers compatibly include another set of qualifiers from the narrow perspecti...
Qualifiers getNonFastQualifiers() const
static Qualifiers fromOpaqueValue(uint64_t opaque)
bool hasStrongOrWeakObjCLifetime() const
True if the lifetime is either strong or weak.
static std::string getAddrSpaceAsString(LangAS AS)
@ FastWidth
The width of the "fast" qualifier mask.
@ MaxAddressSpace
The maximum supported address space number.
@ FastMask
The fast qualifier mask.
bool hasFastQualifiers() const
bool hasOnlyRestrict() const
bool isAddressSpaceSupersetOf(Qualifiers other, const ASTContext &Ctx) const
Returns true if the address space in these qualifiers is equal to or a superset of the address space ...
void addObjCLifetime(ObjCLifetime type)
void setObjCLifetime(ObjCLifetime type)
static bool classof(const Type *T)
Represents a struct/union/class.
Base for LValueReferenceType and RValueReferenceType.
QualType getPointeeType() const
ReferenceType(TypeClass tc, QualType Referencee, QualType CanonicalRef, bool SpelledAsLValue)
static bool classof(const Type *T)
QualType getPointeeTypeAsWritten() const
bool isSpelledAsLValue() const
void Profile(llvm::FoldingSetNodeID &ID)
static void Profile(llvm::FoldingSetNodeID &ID, QualType Referencee, bool SpelledAsLValue)
Encodes a location in the source.
Stmt - This represents one statement.
The streaming interface shared between DiagnosticBuilder and PartialDiagnostic.
void AddTaggedVal(uint64_t V, DiagnosticsEngine::ArgumentKind Kind) const
Represents the declaration of a struct/union/class/enum.
Stores a list of template parameters for a TemplateDecl and its derived classes.
[BoundsSafety] Represents information of declarations referenced by the arguments of the counted_by a...
TypeCoupledDeclRefInfo(ValueDecl *D=nullptr, bool Deref=false)
D is to a declaration referenced by the argument of attribute.
llvm::PointerIntPair< ValueDecl *, 1, unsigned > BaseTy
Base wrapper for a particular "section" of type source info.
static bool classof(const Type *T)
TypeOfKind getKind() const
Returns the kind of 'typeof' type this is.
TypeOfExprType(const ASTContext &Context, Expr *E, TypeOfKind Kind, QualType Can=QualType())
Expr * getUnderlyingExpr() const
QualType getType() const
Return the type wrapped by this type source info.
void overrideType(QualType T)
Override the type stored in this TypeSourceInfo. Use with caution!
TypeWithKeyword(ElaboratedTypeKeyword Keyword, TypeClass tc, QualType Canonical, TypeDependence Dependence)
friend class AttributedType
friend class ConstantArrayType
friend class CountAttributedType
FunctionTypeBitfields store various bits belonging to FunctionProtoType.
friend class FunctionProtoType
friend class FunctionType
friend class KeywordWrapper
friend class ObjCObjectType
friend class PackExpansionType
friend class PredefinedSugarType
friend class ReferenceType
friend class SubstTemplateTypeParmPackType
friend class SubstPackType
friend class SubstTemplateTypeParmType
friend class TemplateSpecializationType
friend class TemplateTypeParmType
friend class TypeOfExprType
friend class UnresolvedUsingType
friend class DependentVectorType
The base class of the type hierarchy.
bool isIncompleteOrObjectType() const
Return true if this is an incomplete or object type, in other words, not a function type.
bool isDecltypeType() const
bool isDependentSizedArrayType() const
bool isFixedPointOrIntegerType() const
Return true if this is a fixed point or integer type.
bool isBlockPointerType() const
TypedefBitfields TypedefBits
bool isBooleanType() const
bool isFunctionReferenceType() const
bool isSignableType(const ASTContext &Ctx) const
Type(const Type &)=delete
bool isObjCBuiltinType() const
const TemplateSpecializationType * getAsNonAliasTemplateSpecializationType() const
Look through sugar for an instance of TemplateSpecializationType which is not a type alias,...
bool isMFloat8Type() const
const Type * getPointeeOrArrayElementType() const
If this is a pointer type, return the pointee type.
bool isIncompleteArrayType() const
bool isPlaceholderType() const
Test for a type which does not represent an actual type-system type but is instead used as a placehol...
bool isFloat16Type() const
ReferenceTypeBitfields ReferenceTypeBits
bool isSignablePointerType() const
ArrayTypeBitfields ArrayTypeBits
const ArrayType * castAsArrayTypeUnsafe() const
A variant of castAs<> for array type which silently discards qualifiers from the outermost type.
static constexpr int NumDeducedTypeBits
bool isDependentAddressSpaceType() const
bool isUndeducedAutoType() const
bool isRValueReferenceType() const
bool isFundamentalType() const
Tests whether the type is categorized as a fundamental type.
VectorTypeBitfields VectorTypeBits
SubstPackTypeBitfields SubstPackTypeBits
bool isConstantArrayType() const
bool canDecayToPointerType() const
Determines whether this type can decay to a pointer type.
bool isFunctionPointerType() const
bool isHLSLInlineSpirvType() const
bool isConvertibleToFixedPointType() const
Return true if this can be converted to (or from) a fixed point type.
bool isArithmeticType() const
PredefinedSugarTypeBitfields PredefinedSugarTypeBits
bool isConstantMatrixType() const
bool isHLSLBuiltinIntangibleType() const
bool isPointerType() const
const TemplateSpecializationType * castAsNonAliasTemplateSpecializationType() const
bool isArrayParameterType() const
TypeOfBitfields TypeOfBits
static constexpr int FunctionTypeNumParamsLimit
bool isIntegerType() const
isIntegerType() does not include complex integers (a GCC extension).
bool isObjCSelType() const
const T * castAs() const
Member-template castAs<specific type>.
BuiltinTypeBitfields BuiltinTypeBits
bool isSpecificPlaceholderType(unsigned K) const
Test for a specific placeholder type.
bool isReferenceType() const
bool isSignedFixedPointType() const
Return true if this is a fixed point type that is signed according to ISO/IEC JTC1 SC22 WG14 N1169.
bool isObjectPointerType() const
bool isEnumeralType() const
bool isVisibilityExplicit() const
Return true if the visibility was explicitly set is the code.
void addDependence(TypeDependence D)
ConstantArrayTypeBitfields ConstantArrayTypeBits
Type(TypeClass tc, QualType canon, TypeDependence Dependence)
bool isScalarType() const
bool isVariableArrayType() const
bool isFloat128Type() const
bool isSveVLSBuiltinType() const
Determines if this is a sizeless type supported by the 'arm_sve_vector_bits' type attribute,...
CountAttributedTypeBitfields CountAttributedTypeBits
bool isObjCQualifiedIdType() const
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.
LinkageInfo getLinkageAndVisibility() const
Determine the linkage and visibility of this type.
bool isIntegralOrEnumerationType() const
Determine whether this type is an integral or enumeration type.
bool isExtVectorType() const
bool isExtVectorBoolType() const
Type & operator=(const Type &)=delete
bool isObjCObjectOrInterfaceType() const
bool isNonOverloadPlaceholderType() const
Test for a placeholder type other than Overload; see BuiltinType::isNonOverloadPlaceholderType.
bool isOCLIntelSubgroupAVCType() const
AutoType * getContainedAutoType() const
Get the AutoType whose type will be deduced for a variable with an initializer of this type.
bool isInstantiationDependentType() const
Determine whether this type is an instantiation-dependent type, meaning that the type involves a temp...
bool isMemberDataPointerType() const
bool isLValueReferenceType() const
bool isBitIntType() const
bool isSpecificBuiltinType(unsigned K) const
Test for a particular builtin type.
bool isBuiltinType() const
Helper methods to distinguish type categories.
bool isOpenCLSpecificType() const
bool isConstantMatrixBoolType() const
bool isDependentType() const
Whether this type is a dependent type, meaning that its definition somehow depends on a template para...
bool isSignableIntegerType(const ASTContext &Ctx) const
bool isFloat32Type() const
bool isAnyComplexType() const
bool isFixedPointType() const
Return true if this is a fixed point type according to ISO/IEC JTC1 SC22 WG14 N1169.
friend class TypePropertyCache
DeducedType * getContainedDeducedType() const
Get the DeducedType whose type will be deduced for a variable with an initializer of this type.
bool isSaturatedFixedPointType() const
Return true if this is a saturated fixed point type according to ISO/IEC JTC1 SC22 WG14 N1169.
bool containsUnexpandedParameterPack() const
Whether this type is or contains an unexpanded parameter pack, used to support C++0x variadic templat...
bool hasPointeeToCFIUncheckedCalleeFunctionType() const
const BuiltinType * getAsPlaceholderType() const
QualType getCanonicalTypeInternal() const
bool isHLSLSpecificType() const
bool isTemplateTypeParmType() const
@ PtrdiffT
The "ptrdiff_t" type.
@ SizeT
The "size_t" type.
@ SignedSizeT
The signed integer type corresponding to "size_t".
bool isCompoundType() const
Tests whether the type is categorized as a compound type.
bool containsErrors() const
Whether this type is an error type.
const Type * getBaseElementTypeUnsafe() const
Get the base element type of this type, potentially discarding type qualifiers.
bool isMemberPointerType() const
bool isAtomicType() const
AttributedTypeBitfields AttributedTypeBits
bool isFunctionProtoType() const
bool isIbm128Type() const
bool isOverloadableType() const
Determines whether this is a type for which one can define an overloaded operator.
bool isObjCIdType() const
bool isMatrixType() const
TagTypeBitfields TagTypeBits
bool isOverflowBehaviorType() const
PackExpansionTypeBitfields PackExpansionTypeBits
bool isVariablyModifiedType() const
Whether this type is a variably-modified type (C99 6.7.5).
bool isUnsaturatedFixedPointType() const
Return true if this is a saturated fixed point type according to ISO/IEC JTC1 SC22 WG14 N1169.
UnresolvedUsingBitfields UnresolvedUsingBits
bool isObjCObjectType() const
bool isFromAST() const
Whether this type comes from an AST file.
const ArrayType * getAsArrayTypeUnsafe() const
A variant of getAs<> for array types which silently discards qualifiers from the outermost type.
bool isUndeducedType() const
Determine whether this type is an undeduced type, meaning that it somehow involves a C++11 'auto' typ...
bool isObjectType() const
Determine whether this type is an object type.
bool isDoubleType() const
bool isPointerOrReferenceType() const
KeywordWrapperBitfields KeywordWrapperBits
FunctionTypeBitfields FunctionTypeBits
bool isBFloat16Type() const
void setDependence(TypeDependence D)
const T * getAsAdjusted() const
Member-template getAsAdjusted<specific type>.
bool isFunctionType() const
bool isObjCObjectPointerType() const
SubstTemplateTypeParmTypeBitfields SubstTemplateTypeParmTypeBits
TypeDependence getDependence() const
Visibility getVisibility() const
Determine the visibility of this type.
bool isMemberFunctionPointerType() const
bool isUnsignedFixedPointType() const
Return true if this is a fixed point type that is unsigned according to ISO/IEC JTC1 SC22 WG14 N1169.
bool isVectorType() const
bool isObjCQualifiedClassType() const
bool isObjCClassType() const
bool isObjCInertUnsafeUnretainedType() const
Was this type written with the special inert-in-ARC __unsafe_unretained qualifier?
bool isRealFloatingType() const
Floating point categories.
const T * getAsCanonical() const
If this type is canonically the specified type, return its canonical type cast to that specified type...
bool isHLSLAttributedResourceType() const
ObjCObjectTypeBitfields ObjCObjectTypeBits
TemplateTypeParmTypeBitfields TemplateTypeParmTypeBits
bool isOCLExtOpaqueType() const
const T * castAsCanonical() const
Return this type's canonical type cast to the specified type.
bool isAnyPointerType() const
TypeClass getTypeClass() const
bool isCanonicalUnqualified() const
Determines if this type would be canonical if it had no further qualification.
bool isSubscriptableVectorType() const
const T * getAs() const
Member-template getAs<specific type>'.
const Type * getUnqualifiedDesugaredType() const
Return the specified type with any "sugar" removed from the type, removing any typedefs,...
bool isNullPtrType() const
bool isRecordType() const
TemplateSpecializationTypeBitfields TemplateSpecializationTypeBits
bool isTypedefNameType() const
Determines whether this type is written as a typedef-name.
static constexpr int FunctionTypeNumParamsWidth
bool isFunctionNoProtoType() const
bool isReserveIDT() const
bool hasObjCPointerRepresentation() const
Whether this type can represent an objective pointer type for the purpose of GC'ability.
bool hasPointerRepresentation() const
Whether this type is represented natively as a pointer.
DeducedTypeBitfields DeducedTypeBits
AutoTypeBitfields AutoTypeBits
bool isCFIUncheckedCalleeFunctionType() const
Type & operator=(Type &&)=delete
Base class for declarations which introduce a typedef-name.
TypedefNameDecl * getDecl() const
NestedNameSpecifier getQualifier() const
static void Profile(llvm::FoldingSetNodeID &ID, ElaboratedTypeKeyword Keyword, NestedNameSpecifier Qualifier, const TypedefNameDecl *Decl, QualType Underlying)
static bool classof(const Type *T)
bool typeMatchesDecl() const
void Profile(llvm::FoldingSetNodeID &ID) const
void Profile(llvm::FoldingSetNodeID &ID) const
NestedNameSpecifier getQualifier() const
UnresolvedUsingTypenameDecl * getDecl() const
static void Profile(llvm::FoldingSetNodeID &ID, ElaboratedTypeKeyword Keyword, NestedNameSpecifier Qualifier, const UnresolvedUsingTypenameDecl *D)
static bool classof(const Type *T)
Represents a dependent using declaration which was marked with typename.
Represents a shadow declaration implicitly introduced into a scope by a (resolved) using-declaration ...
UsingShadowDecl * getDecl() const
void Profile(llvm::FoldingSetNodeID &ID) const
NestedNameSpecifier getQualifier() const
static void Profile(llvm::FoldingSetNodeID &ID, ElaboratedTypeKeyword Keyword, NestedNameSpecifier Qualifier, const UsingShadowDecl *D, QualType UnderlyingType)
static bool classof(const Type *T)
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
static bool classof(const Type *T)
friend class StmtIteratorBase
void Profile(llvm::FoldingSetNodeID &ID)
Expr * getSizeExpr() const
unsigned getNumElements() const
VectorType(QualType vecType, unsigned nElements, QualType canonType, VectorKind vecKind)
void Profile(llvm::FoldingSetNodeID &ID)
static void Profile(llvm::FoldingSetNodeID &ID, QualType ElementType, unsigned NumElements, TypeClass TypeClass, VectorKind VecKind)
VectorKind getVectorKind() const
QualType ElementType
The element type of the vector.
QualType getElementType() const
static bool classof(const Type *T)
Defines the Linkage enumeration and various utility functions.
mlir::Type getBaseType(mlir::Value varPtr)
@ AttributedType
The l-value was considered opaque, so the alignment was determined from a type, but that type was an ...
bool operator!=(const CommonEntityInfo &LHS, const CommonEntityInfo &RHS)
const internal::VariadicAllOfMatcher< Type > type
Matches Types in the clang AST.
const AstTypeMatcher< ArrayType > arrayType
const internal::VariadicAllOfMatcher< Decl > decl
Matches declarations.
uint32_t Literal
Literals are represented as positive integers.
std::variant< struct RequiresDecl, struct HeaderDecl, struct UmbrellaDirDecl, struct ModuleDecl, struct ExcludeDecl, struct ExportDecl, struct ExportAsDecl, struct ExternModuleDecl, struct UseDecl, struct LinkDecl, struct ConfigMacrosDecl, struct ConflictDecl > Decl
All declarations that can appear in a module declaration.
bool operator==(const ValueType &a, const ValueType &b)
bool isLiteral(TokenKind K)
Return true if this is a "literal" kind, like a numeric constant, string, etc.
The JSON file list parser is used to communicate input to InstallAPI.
CanQual< Type > CanQualType
Represents a canonical, potentially-qualified type.
@ Overload
This is a legitimate overload: the existing declarations are functions or function templates with dif...
bool isa(CodeGen::Address addr)
AutoTypeKeyword
Which keyword(s) were used to create an AutoType.
@ GNUAutoType
__auto_type (GNU extension)
@ DecltypeAuto
decltype(auto)
bool isTargetAddressSpace(LangAS AS)
CanThrowResult
Possible results from evaluation of a noexcept expression.
FunctionType::ExtInfo getFunctionExtInfo(const Type &t)
bool isDynamicExceptionSpec(ExceptionSpecificationType ESpecType)
TypeDependenceScope::TypeDependence TypeDependence
void initialize(TemplateInstantiationCallbackPtrs &Callbacks, const Sema &TheSema)
@ Nullable
Values of this type can be null.
RefQualifierKind
The kind of C++11 ref-qualifier associated with a function type.
@ RQ_None
No ref-qualifier was provided.
@ RQ_LValue
An lvalue ref-qualifier was provided (&).
@ RQ_RValue
An rvalue ref-qualifier was provided (&&).
@ TemplateName
The identifier is a template name. FIXME: Add an annotation for that.
bool IsEnumDeclComplete(EnumDecl *ED)
Check if the given decl is complete.
ExprDependence computeDependence(FullExpr *E)
@ Vector
'vector' clause, allowed on 'loop', Combined, and 'routine' directives.
@ Self
'self' clause, allowed on Compute and Combined Constructs, plus 'update'.
TypeOfKind
The kind of 'typeof' expression we're after.
bool operator==(const CallGraphNode::CallRecord &LHS, const CallGraphNode::CallRecord &RHS)
nullptr
This class represents a compute construct, representing a 'Kind' of ‘parallel’, 'serial',...
TypeDependence toTypeDependence(ExprDependence D)
@ Dependent
Parse the block as a dependent block, which may be used in some template instantiations but not other...
unsigned toTargetAddressSpace(LangAS AS)
Linkage
Describes the different kinds of linkage (C++ [basic.link], C99 6.2.2) that an entity may have.
ObjCSubstitutionContext
The kind of type we are substituting Objective-C type arguments into.
@ Superclass
The superclass of a type.
@ Property
The type of a property.
@ Parameter
The parameter type of a method or function.
@ Result
The result type of a method or function.
ArraySizeModifier
Capture whether this is a normal array (e.g.
ParameterABI
Kinds of parameter ABI.
@ Ordinary
This parameter uses ordinary ABI rules for its type.
bool isComputedNoexcept(ExceptionSpecificationType ESpecType)
@ Template
We are parsing a template declaration.
bool isNoexceptExceptionSpec(ExceptionSpecificationType ESpecType)
TagTypeKind
The kind of a tag type.
constexpr unsigned PointerAuthKeyNone
bool IsEnumDeclScoped(EnumDecl *ED)
Check if the given decl is scoped.
std::is_base_of< ArrayType, T > TypeIsArrayType
@ Keyword
The name has been typo-corrected to a keyword.
LangAS
Defines the address space values used by the address space qualifier of QualType.
void FixedPointValueToString(SmallVectorImpl< char > &Str, llvm::APSInt Val, unsigned Scale)
bool operator!=(CanQual< T > x, CanQual< U > y)
@ Deduced
The normal deduced case.
@ Undeduced
Not deduced yet. This is for example an 'auto' which was just parsed.
@ DeducedAsPack
Same as above, but additionally this represents a case where the deduced entity itself is a pack.
@ DeducedAsDependent
This is a special case where the initializer is dependent, so we can't deduce a type yet.
PointerAuthenticationMode
const StreamingDiagnostic & operator<<(const StreamingDiagnostic &DB, const ConceptReference *C)
Insertion operator for diagnostics.
CallingConv
CallingConv - Specifies the calling convention that a function uses.
@ AltiVecBool
is AltiVec 'vector bool ...'
@ SveFixedLengthData
is AArch64 SVE fixed-length data vector
@ AltiVecVector
is AltiVec vector
@ AltiVecPixel
is AltiVec 'vector Pixel'
@ Generic
not a target-specific vector type
@ RVVFixedLengthData
is RISC-V RVV fixed-length data vector
@ RVVFixedLengthMask
is RISC-V RVV fixed-length mask vector
@ NeonPoly
is ARM Neon polynomial vector
@ SveFixedLengthPredicate
is AArch64 SVE fixed-length predicate vector
U cast(CodeGen::Address addr)
@ None
The alignment was not explicit in code.
ElaboratedTypeKeyword
The elaboration keyword that precedes a qualified type name or introduces an elaborated-type-specifie...
@ Interface
The "__interface" keyword introduces the elaborated-type-specifier.
@ None
No keyword precedes the qualified type name.
@ Struct
The "struct" keyword introduces the elaborated-type-specifier.
@ Class
The "class" keyword introduces the elaborated-type-specifier.
@ Union
The "union" keyword introduces the elaborated-type-specifier.
@ Enum
The "enum" keyword introduces the elaborated-type-specifier.
@ Typename
The "typename" keyword precedes the qualified type name, e.g., typename T::type.
TypeDependence toSyntacticDependence(TypeDependence D)
@ Other
Other implicit parameter.
ExceptionSpecificationType
The various types of exception specifications that exist in C++11.
@ EST_DependentNoexcept
noexcept(expression), value-dependent
@ EST_Uninstantiated
not instantiated yet
@ EST_Unparsed
not parsed yet
@ EST_NoThrow
Microsoft __declspec(nothrow) extension.
@ EST_None
no exception specification
@ EST_MSAny
Microsoft throw(...) extension.
@ EST_BasicNoexcept
noexcept
@ EST_NoexceptFalse
noexcept(expression), evals to 'false'
@ EST_Unevaluated
not evaluated yet, for special member function
@ EST_NoexceptTrue
noexcept(expression), evals to 'true'
@ EST_Dynamic
throw(T1, T2)
Visibility
Describes the different kinds of visibility that a declaration may have.
Diagnostic wrappers for TextAPI types for error reporting.
__UINTPTR_TYPE__ uintptr_t
An unsigned integer type with the property that any valid pointer to void can be converted to this ty...
void Profile(llvm::FoldingSetNodeID &ID)
const T * getType() const
FunctionEffectWithCondition Rejected
FunctionEffectWithCondition Kept
A FunctionEffect plus a potential boolean expression determining whether the effect is declared (e....
FunctionEffectWithCondition(FunctionEffect E, const EffectConditionExpr &C)
Holds information about the various types of exception specification.
FunctionDecl * SourceDecl
The function whose exception specification this is, for EST_Unevaluated and EST_Uninstantiated.
ExceptionSpecInfo(ExceptionSpecificationType EST)
FunctionDecl * SourceTemplate
The function template whose exception specification this is instantiated from, for EST_Uninstantiated...
ExceptionSpecificationType Type
The kind of exception specification this is.
ArrayRef< QualType > Exceptions
Explicitly-specified list of exception types.
Expr * NoexceptExpr
Noexcept expression, if this is a computed noexcept specification.
ExceptionSpecInfo()=default
Extra information about a function prototype.
ExceptionSpecInfo ExceptionSpec
FunctionTypeExtraAttributeInfo ExtraAttributeInfo
bool requiresFunctionProtoTypeArmAttributes() const
unsigned AArch64SMEAttributes
SourceLocation EllipsisLoc
FunctionEffectsRef FunctionEffects
unsigned CFIUncheckedCallee
const ExtParameterInfo * ExtParameterInfos
RefQualifierKind RefQualifier
bool requiresFunctionProtoTypeExtraAttributeInfo() const
ExtProtoInfo withCFIUncheckedCallee(bool CFIUncheckedCallee)
ExtProtoInfo(CallingConv CC)
unsigned HasTrailingReturn
bool requiresFunctionProtoTypeExtraBitfields() const
void setArmSMEAttribute(AArch64SMETypeAttributes Kind, bool Enable=true)
ExtProtoInfo withExceptionSpec(const ExceptionSpecInfo &ESI)
FunctionType::ExtInfo ExtInfo
A simple holder for a QualType representing a type in an exception specification.
FunctionTypeArmAttributes()
unsigned AArch64SMEAttributes
Any AArch64 SME ACLE type attributes that need to be propagated on declarations and function pointers...
Provides a few static helpers for converting and printing elaborated type keyword and tag type kind e...
static StringRef getTagTypeKindName(TagTypeKind Kind)
static StringRef getKeywordName(ElaboratedTypeKeyword Keyword)
static ElaboratedTypeKeyword getKeywordForTagTypeKind(TagTypeKind Tag)
Converts a TagTypeKind into an elaborated type keyword.
static TagTypeKind getTagTypeKindForKeyword(ElaboratedTypeKeyword Keyword)
Converts an elaborated type keyword into a TagTypeKind.
static TagTypeKind getTagTypeKindForTypeSpec(unsigned TypeSpec)
Converts a type specifier (DeclSpec::TST) into a tag type kind.
static bool KeywordIsTagTypeKind(ElaboratedTypeKeyword Keyword)
static ElaboratedTypeKeyword getKeywordForTypeSpec(unsigned TypeSpec)
Converts a type specifier (DeclSpec::TST) into an elaborated type keyword.
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...
SplitQualType(const Type *ty, Qualifiers qs)
SplitQualType getSingleStepDesugaredType() const
friend bool operator==(SplitQualType a, SplitQualType b)
const Type * Ty
The locally-unqualified type.
friend bool operator!=(SplitQualType a, SplitQualType b)
std::pair< const Type *, Qualifiers > asPair() const
Qualifiers Quals
The local qualifiers.
static inline ::clang::ExtQuals * getFromVoidPointer(void *P)
static void * getAsVoidPointer(::clang::ExtQuals *P)
static constexpr int NumLowBitsAvailable
static void * getAsVoidPointer(::clang::Type *P)
static constexpr int NumLowBitsAvailable
static inline ::clang::Type * getFromVoidPointer(void *P)
static void * getAsVoidPointer(clang::QualType P)
static clang::QualType getFromVoidPointer(void *P)
static constexpr int NumLowBitsAvailable
static SimpleType getSimplifiedValue(::clang::QualType Val)
const ::clang::Type * SimpleType