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"
80namespace serialization {
81 template <
class T>
class AbstractTypeReader;
118template <
typename>
class CanQual;
123class ExtQualsTypeCommonBase;
125class FunctionEffectsRef;
126class FunctionEffectKindSet;
127class FunctionEffectSet;
130class ObjCInterfaceDecl;
131class ObjCProtocolDecl;
132class ObjCTypeParamDecl;
133struct PrintingPolicy;
137class ClassTemplateDecl;
138class TemplateArgument;
139class TemplateArgumentListInfo;
140class TemplateArgumentLoc;
141class TemplateTypeParmDecl;
142class TypedefNameDecl;
143class UnresolvedUsingTypenameDecl;
144class UsingShadowDecl;
149#define TYPE(Class, Base) class Class##Type;
150#include "clang/AST/TypeNodes.inc"
153class PointerAuthQualifier {
157 EnabledMask = 1 << EnabledShift,
158 AddressDiscriminatedShift = EnabledShift + EnabledBits,
159 AddressDiscriminatedBits = 1,
160 AddressDiscriminatedMask = 1 << AddressDiscriminatedShift,
161 AuthenticationModeShift =
162 AddressDiscriminatedShift + AddressDiscriminatedBits,
163 AuthenticationModeBits = 2,
164 AuthenticationModeMask = ((1 << AuthenticationModeBits) - 1)
165 << AuthenticationModeShift,
166 IsaPointerShift = AuthenticationModeShift + AuthenticationModeBits,
168 IsaPointerMask = ((1 << IsaPointerBits) - 1) << IsaPointerShift,
169 AuthenticatesNullValuesShift = IsaPointerShift + IsaPointerBits,
170 AuthenticatesNullValuesBits = 1,
171 AuthenticatesNullValuesMask = ((1 << AuthenticatesNullValuesBits) - 1)
172 << AuthenticatesNullValuesShift,
173 KeyShift = AuthenticatesNullValuesShift + AuthenticatesNullValuesBits,
175 KeyMask = ((1 << KeyBits) - 1) << KeyShift,
176 DiscriminatorShift = KeyShift + KeyBits,
177 DiscriminatorBits = 16,
178 DiscriminatorMask = ((1u << DiscriminatorBits) - 1) << DiscriminatorShift,
189 static_assert((EnabledBits + AddressDiscriminatedBits +
190 AuthenticationModeBits + IsaPointerBits +
191 AuthenticatesNullValuesBits + KeyBits + DiscriminatorBits) ==
193 "PointerAuthQualifier should be exactly 32 bits");
194 static_assert((EnabledMask + AddressDiscriminatedMask +
195 AuthenticationModeMask + IsaPointerMask +
196 AuthenticatesNullValuesMask + KeyMask + DiscriminatorMask) ==
198 "All masks should cover the entire bits");
199 static_assert((EnabledMask ^ AddressDiscriminatedMask ^
200 AuthenticationModeMask ^ IsaPointerMask ^
201 AuthenticatesNullValuesMask ^ KeyMask ^ DiscriminatorMask) ==
203 "All masks should cover the entire bits");
206 unsigned ExtraDiscriminator,
208 bool IsIsaPointer,
bool AuthenticatesNullValues)
210 (IsAddressDiscriminated
211 ? llvm::to_underlying(AddressDiscriminatedMask)
214 (llvm::to_underlying(AuthenticationMode)
215 << AuthenticationModeShift) |
216 (ExtraDiscriminator << DiscriminatorShift) |
217 (IsIsaPointer << IsaPointerShift) |
218 (AuthenticatesNullValues << AuthenticatesNullValuesShift)) {
221 assert((Data == 0) ==
239 static PointerAuthQualifier
240 Create(
unsigned Key,
bool IsAddressDiscriminated,
unsigned ExtraDiscriminator,
242 bool AuthenticatesNullValues) {
247 AuthenticationMode, IsIsaPointer,
248 AuthenticatesNullValues);
252 assert((Data == 0) ==
261 return (Data & KeyMask) >> KeyShift;
268 return (Data & AddressDiscriminatedMask) >> AddressDiscriminatedShift;
273 return (Data >> DiscriminatorShift);
278 AuthenticationModeShift);
283 return (Data & IsaPointerMask) >> IsaPointerShift;
288 return (Data & AuthenticatesNullValuesMask) >> AuthenticatesNullValuesShift;
295 friend bool operator==(PointerAuthQualifier Lhs, PointerAuthQualifier Rhs) {
296 return Lhs.Data == Rhs.Data;
298 friend bool operator!=(PointerAuthQualifier Lhs, PointerAuthQualifier Rhs) {
299 return Lhs.Data != Rhs.Data;
310 PointerAuthQualifier
Result;
312 assert((
Result.Data == 0) ==
323 void Profile(llvm::FoldingSetNodeID &ID)
const { ID.AddInteger(Data); }
390 LPtrAuth == R.getPointerAuth()) {
394 R.setPointerAuth(
Empty);
399 Q.Mask = L.Mask & R.Mask;
408 R.removeCVRQualifiers(CommonCRV);
413 R.removeObjCGCAttr();
419 R.removeObjCLifetime();
425 R.removeAddressSpace();
493 assert(!(mask & ~
CVRMask) &&
"bitmask contains non-CVR bits");
497 assert(!(mask & ~
CVRMask) &&
"bitmask contains non-CVR bits");
498 Mask &= ~static_cast<uint64_t>(mask);
504 assert(!(mask & ~
CVRMask) &&
"bitmask contains non-CVR bits");
508 assert(!(mask & ~
CVRMask & ~UMask) &&
"bitmask contains non-CVRU bits");
514 Mask = (Mask & ~UMask) | (flag ? UMask : 0);
522 Mask = (Mask & ~GCAttrMask) | (
type << GCAttrShift);
547 return ObjCLifetime((Mask & LifetimeMask) >> LifetimeShift);
550 Mask = (Mask & ~LifetimeMask) | (
type << LifetimeShift);
556 Mask |= (
type << LifetimeShift);
573 return static_cast<LangAS>((Mask & AddressSpaceMask) >> AddressSpaceShift);
594 Mask = (Mask & ~AddressSpaceMask)
595 | (((
uint32_t) space) << AddressSpaceShift);
608 Mask = (Mask & ~PtrAuthMask) |
622 assert(!(mask & ~
FastMask) &&
"bitmask contains non-fast qualifier bits");
626 assert(!(mask & ~
FastMask) &&
"bitmask contains non-fast qualifier bits");
627 Mask &= ~static_cast<uint64_t>(mask);
633 assert(!(mask & ~
FastMask) &&
"bitmask contains non-fast qualifier bits");
648 bool empty()
const {
return !Mask; }
803 bool appendSpaceIfNonEmpty =
false)
const;
805 void Profile(llvm::FoldingSetNodeID &ID)
const { ID.AddInteger(Mask); }
812 "PointerAuthQualifier must be 32 bits");
814 static constexpr uint64_t PtrAuthShift = 32;
815 static constexpr uint64_t PtrAuthMask = UINT64_C(0xffffffff) << PtrAuthShift;
817 static constexpr uint64_t UMask = 0x8;
818 static constexpr uint64_t UShift = 3;
819 static constexpr uint64_t GCAttrMask = 0x30;
820 static constexpr uint64_t GCAttrShift = 4;
821 static constexpr uint64_t LifetimeMask = 0x1C0;
822 static constexpr uint64_t LifetimeShift = 6;
823 static constexpr uint64_t AddressSpaceMask =
824 ~(
CVRMask | UMask | GCAttrMask | LifetimeMask | PtrAuthMask);
825 static constexpr uint64_t AddressSpaceShift = 9;
835 : Quals(Quals), HasAtomic(HasAtomic) {}
855 return {Quals.withVolatile(), HasAtomic};
859 return {Quals.withRestrict(), HasAtomic};
884 std::pair<const Type *,Qualifiers>
asPair()
const {
885 return std::pair<const Type *, Qualifiers>(
Ty,
Quals);
942 llvm::PointerIntPair<llvm::PointerUnion<const Type *, const ExtQuals *>,
945 const ExtQuals *getExtQualsUnsafe()
const {
949 const Type *getTypePtrUnsafe()
const {
953 const ExtQualsTypeCommonBase *getCommonPtr()
const {
954 assert(!
isNull() &&
"Cannot retrieve a NULL type pointer");
955 auto CommonPtrVal =
reinterpret_cast<uintptr_t>(
Value.getOpaqueValue());
957 return reinterpret_cast<ExtQualsTypeCommonBase*
>(CommonPtrVal);
989 T.Value.setFromOpaqueValue(
const_cast<void*
>(Ptr));
1006 return Value.getPointer().isNull();
1033 std::optional<NonConstantStorageReason>
1201 &&
"non-fast qualifier bits set in mask!");
1202 Value.setInt(Value.getInt() | TQs);
1212 Value.setInt(Value.getInt() & ~Mask);
1219 T.addFastQualifiers(TQs);
1232 T.removeLocalFastQualifiers();
1326 return getSingleStepDesugaredTypeImpl(*
this, Context);
1339 return LHS.Value == RHS.Value;
1342 return LHS.Value != RHS.Value;
1345 return LHS.Value < RHS.Value;
1359 const Twine &PlaceHolder = Twine(),
1360 unsigned Indentation = 0)
const;
1364 unsigned Indentation = 0) {
1365 return print(
split.Ty,
split.Quals, OS, policy, PlaceHolder, Indentation);
1370 const Twine &PlaceHolder,
1371 unsigned Indentation = 0);
1388 const Twine &PlaceHolder;
1389 unsigned Indentation;
1393 const Twine &PlaceHolder,
unsigned Indentation)
1394 : T(T), Policy(Policy), PlaceHolder(PlaceHolder),
1395 Indentation(Indentation) {}
1399 SQT.T.
print(OS, SQT.Policy, SQT.PlaceHolder, SQT.Indentation);
1405 const Twine &PlaceHolder = Twine(),
1406 unsigned Indentation = 0)
const {
1410 void dump(
const char *s)
const;
1412 void dump(llvm::raw_ostream &OS,
const ASTContext &Context)
const;
1475 return PtrAuth.isAddressDiscriminated();
1562 return isDestructedTypeImpl(*
this);
1664raw_ostream &
operator<<(raw_ostream &OS, QualType QT);
1702class ExtQualsTypeCommonBase {
1713 const Type *
const BaseType;
1718 ExtQualsTypeCommonBase(
const Type *baseType,
QualType canon)
1719 : BaseType(baseType), CanonicalType(canon) {}
1732class alignas(TypeAlignment)
ExtQuals :
public ExtQualsTypeCommonBase,
1733 public llvm::FoldingSetNode {
1755 : ExtQualsTypeCommonBase(baseType,
1756 canon.isNull() ?
QualType(this_(), 0) : canon),
1758 assert(Quals.hasNonFastQualifiers()
1759 &&
"ExtQuals created with no fast qualifiers");
1760 assert(!Quals.hasFastQualifiers()
1761 &&
"ExtQuals created with fast qualifiers");
1771 return Quals.getObjCLifetime();
1785 const Type *BaseType,
1787 assert(!Quals.hasFastQualifiers() &&
"fast qualifiers in ExtQuals hash!");
1788 ID.AddPointer(BaseType);
1846enum class ArraySizeModifier;
1847enum class ElaboratedTypeKeyword;
1848enum class VectorKind;
1876class alignas(TypeAlignment)
Type :
public ExtQualsTypeCommonBase {
1879#define TYPE(Class, Base) Class,
1880#define LAST_TYPE(Class) TypeLast = Class
1881#define ABSTRACT_TYPE(Class, Base)
1882#include "clang/AST/TypeNodes.inc"
1887 class TypeBitfields {
1889 template <
class T>
friend class TypePropertyCache;
1892 LLVM_PREFERRED_TYPE(TypeClass)
1897 unsigned Dependence : llvm::BitWidth<TypeDependence>;
1901 LLVM_PREFERRED_TYPE(
bool)
1902 mutable unsigned CacheValid : 1;
1906 mutable unsigned CachedLinkage : 3;
1909 LLVM_PREFERRED_TYPE(
bool)
1910 mutable unsigned CachedLocalOrUnnamed : 1;
1913 LLVM_PREFERRED_TYPE(
bool)
1914 mutable unsigned FromAST : 1;
1916 bool isCacheValid()
const {
1921 assert(isCacheValid() &&
"getting linkage from invalid cache");
1922 return static_cast<Linkage>(CachedLinkage);
1925 bool hasLocalOrUnnamedType()
const {
1926 assert(isCacheValid() &&
"getting linkage from invalid cache");
1927 return CachedLocalOrUnnamed;
1930 enum { NumTypeBits = 8 + llvm::BitWidth<TypeDependence> + 6 };
1939 LLVM_PREFERRED_TYPE(TypeBitfields)
1945 unsigned IndexTypeQuals : 3;
1950 unsigned SizeModifier : 3;
1961 LLVM_PREFERRED_TYPE(
bool)
1962 unsigned HasExternalSize : 1;
1964 LLVM_PREFERRED_TYPE(
unsigned)
1965 unsigned SizeWidth : 5;
1971 LLVM_PREFERRED_TYPE(TypeBitfields)
1975 static constexpr unsigned NumOfBuiltinTypeBits = 10;
1976 unsigned Kind : NumOfBuiltinTypeBits;
1991 LLVM_PREFERRED_TYPE(TypeBitfields)
1998 unsigned RefQualifier : 2;
2009 LLVM_PREFERRED_TYPE(
bool)
2010 unsigned HasExtQuals : 1;
2014 unsigned ExceptionSpecType : 4;
2017 LLVM_PREFERRED_TYPE(
bool)
2018 unsigned HasExtParameterInfos : 1;
2021 LLVM_PREFERRED_TYPE(
bool)
2022 unsigned HasExtraBitfields : 1;
2025 LLVM_PREFERRED_TYPE(
bool)
2026 unsigned Variadic : 1;
2029 LLVM_PREFERRED_TYPE(
bool)
2030 unsigned HasTrailingReturn : 1;
2033 LLVM_PREFERRED_TYPE(
bool)
2034 unsigned CFIUncheckedCallee : 1;
2039 unsigned ExtInfo : 14;
2051 LLVM_PREFERRED_TYPE(TypeBitfields)
2055 unsigned NumTypeArgs : 7;
2058 unsigned NumProtocols : 6;
2061 LLVM_PREFERRED_TYPE(
bool)
2062 unsigned IsKindOf : 1;
2068 LLVM_PREFERRED_TYPE(TypeBitfields)
2082 LLVM_PREFERRED_TYPE(
bool)
2083 unsigned SpelledAsLValue : 1;
2087 LLVM_PREFERRED_TYPE(
bool)
2088 unsigned InnerRef : 1;
2094 LLVM_PREFERRED_TYPE(TypeBitfields)
2099 unsigned Keyword : 8;
2111 LLVM_PREFERRED_TYPE(
bool)
2112 unsigned HasQualifier : 1;
2115 LLVM_PREFERRED_TYPE(
bool)
2116 unsigned OwnsTag : 1;
2119 LLVM_PREFERRED_TYPE(
bool)
2120 unsigned IsInjected : 1;
2127 LLVM_PREFERRED_TYPE(TypeBitfields)
2133 unsigned VecKind : 4;
2141 LLVM_PREFERRED_TYPE(TypeBitfields)
2145 unsigned AttrKind : 32 - NumTypeBits;
2171 unsigned Keyword : 2;
2187 LLVM_PREFERRED_TYPE(TypeBitfields)
2200 LLVM_PREFERRED_TYPE(
bool)
2201 unsigned hasQualifier : 1;
2211 LLVM_PREFERRED_TYPE(
bool)
2212 unsigned hasQualifier : 1;
2222 LLVM_PREFERRED_TYPE(
bool)
2223 unsigned hasQualifier : 1;
2226 LLVM_PREFERRED_TYPE(
bool)
2227 unsigned hasTypeDifferentFromDecl : 1;
2236 LLVM_PREFERRED_TYPE(TypeBitfields)
2243 LLVM_PREFERRED_TYPE(
bool)
2244 unsigned ParameterPack : 1;
2253 LLVM_PREFERRED_TYPE(TypeBitfields)
2256 LLVM_PREFERRED_TYPE(
bool)
2257 unsigned HasNonCanonicalUnderlyingType : 1;
2260 unsigned Index : 15;
2262 LLVM_PREFERRED_TYPE(
bool)
2270 unsigned PackIndex : 15;
2277 LLVM_PREFERRED_TYPE(TypeBitfields)
2284 unsigned NumArgs : 16;
2290 unsigned SubstTemplTypeParmPackIndex : 16;
2300 LLVM_PREFERRED_TYPE(
bool)
2301 unsigned TypeAlias : 1;
2316 LLVM_PREFERRED_TYPE(TypeBitfields)
2330 unsigned NumExpansions;
2350 LLVM_PREFERRED_TYPE(TypeBitfields)
2360 LLVM_PREFERRED_TYPE(TypeBitfields)
2363 static constexpr unsigned NumCoupledDeclsBits = 4;
2364 unsigned NumCoupledDecls : NumCoupledDeclsBits;
2365 LLVM_PREFERRED_TYPE(
bool)
2366 unsigned CountInBytes : 1;
2367 LLVM_PREFERRED_TYPE(
bool)
2368 unsigned OrNull : 1;
2403 void setFromAST(
bool V =
true)
const {
2411 : ExtQualsTypeCommonBase(this,
2413 static_assert(
sizeof(*this) <=
2414 alignof(
decltype(*this)) +
sizeof(ExtQualsTypeCommonBase),
2415 "changing bitfields changed sizeof(Type)!");
2416 static_assert(
alignof(
decltype(*this)) %
TypeAlignment == 0,
2417 "Insufficient alignment!");
2421 TypeBits.CachedLocalOrUnnamed =
false;
2430 TypeBits.Dependence =
static_cast<unsigned>(D);
2473 return CanonicalType ==
QualType(
this, 0);
2479 QualType getLocallyUnqualifiedSingleStepDesugaredType()
const;
2487 bool isSizelessType()
const;
2488 bool isSizelessBuiltinType()
const;
2491 bool isSizelessVectorType()
const;
2494 bool isSVESizelessBuiltinType()
const;
2497 bool isRVVSizelessBuiltinType()
const;
2500 bool isWebAssemblyExternrefType()
const;
2505 bool isWebAssemblyTableType()
const;
2510 bool isSveVLSBuiltinType()
const;
2520 bool isRVVVLSBuiltinType()
const;
2542 bool isIncompleteType(
NamedDecl **Def =
nullptr)
const;
2568 bool isAlwaysIncompleteType()
const;
2580 bool isLiteralType(
const ASTContext &Ctx)
const;
2583 bool isStructuralType()
const;
2587 bool isStandardLayoutType()
const;
2593 bool isBuiltinType()
const;
2596 bool isSpecificBuiltinType(
unsigned K)
const;
2601 bool isPlaceholderType()
const;
2605 bool isSpecificPlaceholderType(
unsigned K)
const;
2609 bool isNonOverloadPlaceholderType()
const;
2613 bool isIntegerType()
const;
2614 bool isEnumeralType()
const;
2617 bool isScopedEnumeralType()
const;
2619 bool isCharType()
const;
2620 bool isWideCharType()
const;
2621 bool isChar8Type()
const;
2622 bool isChar16Type()
const;
2623 bool isChar32Type()
const;
2624 bool isAnyCharacterType()
const;
2625 bool isUnicodeCharacterType()
const;
2626 bool isIntegralType(
const ASTContext &Ctx)
const;
2629 bool isIntegralOrEnumerationType()
const;
2632 bool isIntegralOrUnscopedEnumerationType()
const;
2633 bool isUnscopedEnumerationType()
const;
2636 bool isRealFloatingType()
const;
2639 bool isComplexType()
const;
2640 bool isAnyComplexType()
const;
2641 bool isFloatingType()
const;
2642 bool isHalfType()
const;
2643 bool isFloat16Type()
const;
2644 bool isFloat32Type()
const;
2645 bool isDoubleType()
const;
2646 bool isBFloat16Type()
const;
2647 bool isMFloat8Type()
const;
2648 bool isFloat128Type()
const;
2649 bool isIbm128Type()
const;
2650 bool isRealType()
const;
2651 bool isArithmeticType()
const;
2652 bool isVoidType()
const;
2653 bool isScalarType()
const;
2654 bool isAggregateType()
const;
2655 bool isFundamentalType()
const;
2656 bool isCompoundType()
const;
2660 bool isFunctionType()
const;
2663 bool isPointerType()
const;
2664 bool isPointerOrReferenceType()
const;
2665 bool isSignableType(
const ASTContext &Ctx)
const;
2666 bool isSignablePointerType()
const;
2667 bool isSignableIntegerType(
const ASTContext &Ctx)
const;
2668 bool isAnyPointerType()
const;
2669 bool isCountAttributedType()
const;
2670 bool isCFIUncheckedCalleeFunctionType()
const;
2671 bool hasPointeeToCFIUncheckedCalleeFunctionType()
const;
2672 bool isBlockPointerType()
const;
2673 bool isVoidPointerType()
const;
2674 bool isReferenceType()
const;
2675 bool isLValueReferenceType()
const;
2676 bool isRValueReferenceType()
const;
2677 bool isObjectPointerType()
const;
2678 bool isFunctionPointerType()
const;
2679 bool isFunctionReferenceType()
const;
2680 bool isMemberPointerType()
const;
2681 bool isMemberFunctionPointerType()
const;
2682 bool isMemberDataPointerType()
const;
2683 bool isArrayType()
const;
2684 bool isConstantArrayType()
const;
2685 bool isIncompleteArrayType()
const;
2686 bool isVariableArrayType()
const;
2687 bool isArrayParameterType()
const;
2688 bool isDependentSizedArrayType()
const;
2690 bool isClassType()
const;
2691 bool isStructureType()
const;
2692 bool isStructureTypeWithFlexibleArrayMember()
const;
2693 bool isObjCBoxableRecordType()
const;
2694 bool isInterfaceType()
const;
2695 bool isStructureOrClassType()
const;
2696 bool isUnionType()
const;
2697 bool isComplexIntegerType()
const;
2698 bool isVectorType()
const;
2699 bool isExtVectorType()
const;
2700 bool isExtVectorBoolType()
const;
2701 bool isConstantMatrixBoolType()
const;
2704 bool isPackedVectorBoolType(
const ASTContext &ctx)
const;
2705 bool isSubscriptableVectorType()
const;
2706 bool isMatrixType()
const;
2707 bool isConstantMatrixType()
const;
2708 bool isOverflowBehaviorType()
const;
2709 bool isDependentAddressSpaceType()
const;
2710 bool isObjCObjectPointerType()
const;
2711 bool isObjCRetainableType()
const;
2712 bool isObjCLifetimeType()
const;
2713 bool isObjCIndirectLifetimeType()
const;
2714 bool isObjCNSObjectType()
const;
2715 bool isObjCIndependentClassType()
const;
2718 bool isObjCObjectType()
const;
2719 bool isObjCQualifiedInterfaceType()
const;
2720 bool isObjCQualifiedIdType()
const;
2721 bool isObjCQualifiedClassType()
const;
2722 bool isObjCObjectOrInterfaceType()
const;
2723 bool isObjCIdType()
const;
2724 bool isDecltypeType()
const;
2732 return hasAttr(attr::ObjCInertUnsafeUnretained);
2742 bool isObjCIdOrObjectKindOfType(
const ASTContext &ctx,
2745 bool isObjCClassType()
const;
2753 bool isObjCClassOrClassKindOfType()
const;
2755 bool isBlockCompatibleObjCPointerType(
ASTContext &ctx)
const;
2756 bool isObjCSelType()
const;
2757 bool isObjCBuiltinType()
const;
2758 bool isObjCARCBridgableType()
const;
2759 bool isCARCBridgableType()
const;
2760 bool isTemplateTypeParmType()
const;
2761 bool isNullPtrType()
const;
2763 bool isNothrowT()
const;
2764 bool isAlignValT()
const;
2765 bool isStdByteType()
const;
2766 bool isAtomicType()
const;
2767 bool isUndeducedAutoType()
const;
2769 bool isTypedefNameType()
const;
2771#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
2772 bool is##Id##Type() const;
2773#include "clang/Basic/OpenCLImageTypes.def"
2775 bool isImageType()
const;
2777 bool isSamplerT()
const;
2778 bool isEventT()
const;
2779 bool isClkEventT()
const;
2780 bool isQueueT()
const;
2781 bool isReserveIDT()
const;
2783#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
2784 bool is##Id##Type() const;
2785#include "clang/Basic/OpenCLExtensionTypes.def"
2787 bool isOCLIntelSubgroupAVCType()
const;
2788 bool isOCLExtOpaqueType()
const;
2790 bool isPipeType()
const;
2791 bool isBitIntType()
const;
2792 bool isOpenCLSpecificType()
const;
2794#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) bool is##Id##Type() const;
2795#include "clang/Basic/HLSLIntangibleTypes.def"
2796 bool isHLSLSpecificType()
const;
2797 bool isHLSLBuiltinIntangibleType()
const;
2798 bool isHLSLAttributedResourceType()
const;
2799 bool isHLSLInlineSpirvType()
const;
2800 bool isHLSLResourceRecord()
const;
2801 bool isHLSLResourceRecordArray()
const;
2803 bool isHLSLIntangibleType()
const;
2805 bool isHLSLStandardLayoutRecordOrArrayOf()
const;
2810 bool isObjCARCImplicitlyUnretainedType()
const;
2813 bool isCUDADeviceBuiltinSurfaceType()
const;
2815 bool isCUDADeviceBuiltinTextureType()
const;
2818 bool isAMDGPUNamedBarrierType()
const;
2821 bool isAMDGPUNamedBarrierTypeOrWrapper()
const;
2824 Qualifiers::ObjCLifetime getObjCARCImplicitLifetime()
const;
2840 ScalarTypeKind getScalarTypeKind()
const;
2868 bool isUndeducedType()
const;
2877 bool hasSizedVLAType()
const;
2880 bool hasUnnamedOrLocalType()
const;
2882 bool isOverloadableType()
const;
2885 bool isElaboratedTypeSpecifier()
const;
2887 bool canDecayToPointerType()
const;
2892 bool hasPointerRepresentation()
const;
2896 bool hasObjCPointerRepresentation()
const;
2900 bool hasIntegerRepresentation()
const;
2904 bool hasSignedIntegerRepresentation()
const;
2908 bool hasUnsignedIntegerRepresentation()
const;
2912 bool hasFloatingRepresentation()
const;
2917 bool hasBooleanRepresentation()
const;
2922 const RecordType *getAsStructureType()
const;
2924 const RecordType *getAsUnionType()
const;
2925 const ComplexType *getAsComplexIntegerType()
const;
2946 inline EnumDecl *getAsEnumDecl()
const;
2947 inline EnumDecl *castAsEnumDecl()
const;
2952 inline TagDecl *getAsTagDecl()
const;
2953 inline TagDecl *castAsTagDecl()
const;
2965 DeducedType *getContainedDeducedType()
const;
2977 bool hasAutoForTrailingReturnType()
const;
2988 template <
typename T>
const T *getAs()
const;
2993 return dyn_cast<T>(CanonicalType);
3000 return cast<T>(CanonicalType);
3004#define TYPE(Class, Base)
3005#define NEVER_CANONICAL_TYPE(Class) \
3006 template <> inline const Class##Type *Type::getAsCanonical() const = delete; \
3007 template <> inline const Class##Type *Type::castAsCanonical() const = delete;
3008#include "clang/AST/TypeNodes.inc"
3014 const TemplateSpecializationType *
3015 getAsNonAliasTemplateSpecializationType()
const;
3017 const TemplateSpecializationType *
3020 assert(TST &&
"not a TemplateSpecializationType");
3029 template <
typename T>
const T *getAsAdjusted()
const;
3033 const ArrayType *getAsArrayTypeUnsafe()
const;
3041 template <
typename T>
const T *castAs()
const;
3045 const ArrayType *castAsArrayTypeUnsafe()
const;
3059 const Type *getBaseElementTypeUnsafe()
const;
3064 const Type *getArrayElementTypeNoTypeQual()
const;
3069 const Type *getPointeeOrArrayElementType()
const;
3077 const Type *getUnqualifiedDesugaredType()
const;
3082 bool isSignedIntegerType()
const;
3087 bool isUnsignedIntegerType()
const;
3091 bool isSignedIntegerOrEnumerationType()
const;
3095 bool isUnsignedIntegerOrEnumerationType()
const;
3099 bool isFixedPointType()
const;
3102 bool isFixedPointOrIntegerType()
const;
3105 bool isConvertibleToFixedPointType()
const;
3109 bool isSaturatedFixedPointType()
const;
3113 bool isUnsaturatedFixedPointType()
const;
3117 bool isSignedFixedPointType()
const;
3121 bool isUnsignedFixedPointType()
const;
3126 bool isConstantSizeType()
const;
3130 bool isSpecifierType()
const;
3150 bool isLinkageValid()
const;
3164 bool canHaveNullability(
bool ResultIfUnknown =
true)
const;
3181 std::optional<ArrayRef<QualType>>
3182 getObjCSubstitutions(
const DeclContext *dc)
const;
3186 bool acceptsObjCTypeParams()
const;
3188 const char *getTypeClassName()
const;
3191 return CanonicalType;
3196 void dump(llvm::raw_ostream &OS,
const ASTContext &Context)
const;
3223#define TYPE(Class, Base)
3224#define ALWAYS_CANONICAL_TYPE(Class) \
3225 template <> inline const Class##Type *Type::getAs() const { \
3226 return dyn_cast<Class##Type>(CanonicalType); \
3228 template <> inline const Class##Type *Type::castAs() const { \
3229 return cast<Class##Type>(CanonicalType); \
3231#include "clang/AST/TypeNodes.inc"
3239#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) Id,
3240#include "clang/Basic/OpenCLImageTypes.def"
3242#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) Id,
3243#include "clang/Basic/OpenCLExtensionTypes.def"
3245#define SVE_TYPE(Name, Id, SingletonId) Id,
3246#include "clang/Basic/AArch64ACLETypes.def"
3248#define PPC_VECTOR_TYPE(Name, Id, Size) Id,
3249#include "clang/Basic/PPCTypes.def"
3251#define RVV_TYPE(Name, Id, SingletonId) Id,
3252#include "clang/Basic/RISCVVTypes.def"
3254#define WASM_TYPE(Name, Id, SingletonId) Id,
3255#include "clang/Basic/WebAssemblyReferenceTypes.def"
3257#define AMDGPU_TYPE(Name, Id, SingletonId, Width, Align) Id,
3258#include "clang/Basic/AMDGPUTypes.def"
3260#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) Id,
3261#include "clang/Basic/HLSLIntangibleTypes.def"
3263#define BUILTIN_TYPE(Id, SingletonId) Id,
3264#define LAST_BUILTIN_TYPE(Id) LastKind = Id
3265#include "clang/AST/BuiltinTypes.def"
3275 static_assert(Kind::LastKind <
3276 (1 << BuiltinTypeBitfields::NumOfBuiltinTypeBits) &&
3277 "Defined builtin type exceeds the allocated space for serial "
3288 StringRef str =
getName(Policy);
3289 assert(!str.empty() && str.data()[str.size()] ==
'\0');
3346class ComplexType :
public Type,
public llvm::FoldingSetNode {
3353 ElementType(Element) {}
3373class ParenType :
public Type,
public llvm::FoldingSetNode {
3399class PointerType :
public Type,
public llvm::FoldingSetNode {
3406 PointeeType(Pointee) {}
3429 using BaseTy = llvm::PointerIntPair<ValueDecl *, 1, unsigned>;
3444 bool isDeref()
const;
3446 unsigned getInt()
const;
3447 void *getOpaqueValue()
const;
3449 void setFromOpaqueValue(
void *
V);
3487 bool referencesFieldDecls()
const;
3493 switch (
T->getTypeClass()) {
3494 case CountAttributed:
3504class CountAttributedType final
3506 public llvm::TrailingObjects<CountAttributedType,
3507 TypeCoupledDeclRefInfo> {
3518 bool CountInBytes,
bool OrNull,
3521 unsigned numTrailingObjects(OverloadToken<TypeCoupledDeclRefInfo>)
const {
3547 static void Profile(llvm::FoldingSetNodeID &ID,
QualType WrappedTy,
3551 return T->getTypeClass() == CountAttributed;
3554 StringRef getAttributeName(
bool WithMacroPrefix)
const;
3566class LateParsedAttrType :
public Type {
3575 WrappedTy(Wrapped), LateParsedTypeAttr(
Attr) {}
3580 return LateParsedTypeAttr;
3587 return T->getTypeClass() == LateParsedAttr;
3603 :
Type(TC, CanonicalPtr,
3606 OriginalTy(OriginalTy), AdjustedTy(AdjustedTy) {}
3616 Profile(ID, OriginalTy, AdjustedTy);
3621 ID.AddPointer(
New.getAsOpaquePtr());
3625 return T->getTypeClass() == Adjusted ||
T->getTypeClass() == Decayed;
3647class BlockPointerType :
public Type,
public llvm::FoldingSetNode {
3655 PointeeType(Pointee) {}
3673 return T->getTypeClass() == BlockPointer;
3683 bool SpelledAsLValue)
3685 PointeeType(Referencee) {
3699 while (
T->isInnerRef())
3701 return T->PointeeType;
3710 bool SpelledAsLValue) {
3712 ID.AddBoolean(SpelledAsLValue);
3716 return T->getTypeClass() == LValueReference ||
3717 T->getTypeClass() == RValueReference;
3726 bool SpelledAsLValue)
3735 return T->getTypeClass() == LValueReference;
3751 return T->getTypeClass() == RValueReference;
3758class MemberPointerType :
public Type,
public llvm::FoldingSetNode {
3769 :
Type(MemberPointer, CanonicalPtr,
3773 PointeeType(Pointee), Qualifier(Qualifier) {}
3781 return PointeeType->isFunctionProtoType();
3787 return !PointeeType->isFunctionProtoType();
3796 bool isSugared()
const;
3808 static void Profile(llvm::FoldingSetNodeID &ID,
QualType Pointee,
3813 return T->getTypeClass() == MemberPointer;
3836 unsigned tq,
const Expr *sz =
nullptr);
3854 return T->getTypeClass() == ConstantArray ||
3855 T->getTypeClass() == VariableArray ||
3856 T->getTypeClass() == IncompleteArray ||
3857 T->getTypeClass() == DependentSizedArray ||
3858 T->getTypeClass() == ArrayParameter;
3868 struct ExternalSize {
3869 ExternalSize(
const llvm::APInt &Sz,
const Expr *SE)
3870 :
Size(Sz), SizeExpr(SE) {}
3872 const Expr *SizeExpr;
3883 ConstantArrayTypeBits.HasExternalSize =
false;
3884 ConstantArrayTypeBits.SizeWidth = Width / 8;
3887 assert(Width < 0xFF &&
"Type width in bits must be less than 8 bits");
3890 ConstantArrayType(QualType Et, QualType Can, ExternalSize *SzPtr,
3891 ArraySizeModifier SM,
unsigned TQ)
3892 : ArrayType(ConstantArray, Et, Can, SM, TQ, SzPtr->SizeExpr),
3894 ConstantArrayTypeBits.HasExternalSize =
true;
3895 ConstantArrayTypeBits.SizeWidth = 0;
3897 assert((SzPtr->SizeExpr ==
nullptr || !Can.isNull()) &&
3898 "canonical constant array should not have size expression");
3901 static ConstantArrayType *
Create(
const ASTContext &Ctx, QualType ET,
3902 QualType Can,
const llvm::APInt &Sz,
3903 const Expr *SzExpr, ArraySizeModifier SzMod,
3913 ConstantArrayTypeBits.SizeWidth = ATy->ConstantArrayTypeBits.SizeWidth;
3949 :
static_cast<int64_t
>(
Size);
3956 ?
SizePtr->Size.getLimitedValue()
3970 static unsigned getNumAddressingBits(
const ASTContext &Context,
3972 const llvm::APInt &NumElements);
3974 unsigned getNumAddressingBits(
const ASTContext &Context)
const;
3978 static unsigned getMaxSizeBits(
const ASTContext &Context);
3985 static void Profile(llvm::FoldingSetNodeID &ID,
const ASTContext &Ctx,
3990 return T->getTypeClass() == ConstantArray ||
3991 T->getTypeClass() == ArrayParameter;
3997class ArrayParameterType :
public ConstantArrayType {
4000 ArrayParameterType(
const ConstantArrayType *ATy,
QualType CanTy)
4001 : ConstantArrayType(ArrayParameter, ATy, CanTy) {}
4005 return T->getTypeClass() == ArrayParameter;
4019 :
ArrayType(IncompleteArray, et, can, sm, tq) {}
4028 return T->getTypeClass() == IncompleteArray;
4039 ID.AddInteger(llvm::to_underlying(SizeMod));
4040 ID.AddInteger(TypeQuals);
4080 :
ArrayType(VariableArray, et, can, sm, tq, e), SizeExpr((
Stmt *)e) {}
4088 return (
Expr*) SizeExpr;
4095 return T->getTypeClass() == VariableArray;
4099 llvm_unreachable(
"Cannot unique VariableArrayTypes.");
4135 return (
Expr*) SizeExpr;
4142 return T->getTypeClass() == DependentSizedArray;
4150 static void Profile(llvm::FoldingSetNodeID &ID,
const ASTContext &Context,
4152 unsigned TypeQuals,
Expr *E);
4166class DependentAddressSpaceType :
public Type,
public llvm::FoldingSetNode {
4169 Expr *AddrSpaceExpr;
4185 return T->getTypeClass() == DependentAddressSpace;
4192 static void Profile(llvm::FoldingSetNodeID &ID,
const ASTContext &Context,
4206class DependentSizedExtVectorType :
public Type,
public llvm::FoldingSetNode {
4228 return T->getTypeClass() == DependentSizedExtVector;
4235 static void Profile(llvm::FoldingSetNodeID &ID,
const ASTContext &Context,
4313 ID.AddInteger(NumElements);
4315 ID.AddInteger(llvm::to_underlying(VecKind));
4319 return T->getTypeClass() ==
Vector ||
T->getTypeClass() == ExtVector;
4332class DependentVectorType :
public Type,
public llvm::FoldingSetNode {
4354 return T->getTypeClass() == DependentVector;
4361 static void Profile(llvm::FoldingSetNodeID &ID,
const ASTContext &Context,
4376 :
VectorType(ExtVector, vecType, nElements, canonType,
4383 case 'x':
case 'r':
return 0;
4384 case 'y':
case 'g':
return 1;
4385 case 'z':
case 'b':
return 2;
4386 case 'w':
case 'a':
return 3;
4404 case 'a':
return 10;
4406 case 'b':
return 11;
4408 case 'c':
return 12;
4410 case 'd':
return 13;
4412 case 'e':
return 14;
4414 case 'f':
return 15;
4419 if (isNumericAccessor)
4435 return T->getTypeClass() == ExtVector;
4452 const Expr *RowExpr =
nullptr,
const Expr *ColumnExpr =
nullptr);
4465 if (
T->isDependentType())
4469 if (
T->isEnumeralType())
4475 return T->isRealType();
4479 return T->isRealType() && !
T->isBooleanType();
4486 return T->getTypeClass() == ConstantMatrix ||
4487 T->getTypeClass() == DependentSizedMatrix;
4501 unsigned NColumns,
QualType CanonElementType);
4504 unsigned NColumns,
QualType CanonElementType);
4535 bool IsRowMajor =
false)
const {
4545 unsigned Row = ColumnMajorIdx %
NumRows;
4572 return T->getTypeClass() == ConstantMatrix;
4595 return T->getTypeClass() == DependentSizedMatrix;
4602 static void Profile(llvm::FoldingSetNodeID &ID,
const ASTContext &Context,
4638 HasPassObjSize = 0x20,
4641 unsigned char Data = 0;
4650 copy.Data = (copy.Data & ~ABIMask) |
unsigned(
kind);
4660 copy.Data |= IsConsumed;
4662 copy.Data &= ~IsConsumed;
4669 Copy.Data |= HasPassObjSize;
4677 Copy.Data |= IsNoEscape;
4679 Copy.Data &= ~IsNoEscape;
4691 return lhs.Data == rhs.Data;
4695 return lhs.Data != rhs.Data;
4730 enum { CallConvMask = 0x3F };
4731 enum { NoReturnMask = 0x40 };
4732 enum { ProducesResultMask = 0x80 };
4733 enum { NoCallerSavedRegsMask = 0x100 };
4734 enum { RegParmMask = 0xe00, RegParmOffset = 9 };
4735 enum { NoCfCheckMask = 0x1000 };
4736 enum { CmseNSCallMask = 0x2000 };
4739 ExtInfo(
unsigned Bits) : Bits(static_cast<
uint16_t>(Bits)) {}
4745 bool producesResult,
bool noCallerSavedRegs,
bool NoCfCheck,
4747 assert((!hasRegParm || regParm < 7) &&
"Invalid regparm value");
4748 Bits = ((
unsigned)cc) | (noReturn ? NoReturnMask : 0) |
4749 (producesResult ? ProducesResultMask : 0) |
4750 (noCallerSavedRegs ? NoCallerSavedRegsMask : 0) |
4751 (hasRegParm ? ((regParm + 1) << RegParmOffset) : 0) |
4752 (NoCfCheck ? NoCfCheckMask : 0) |
4753 (cmseNSCall ? CmseNSCallMask : 0);
4769 bool getHasRegParm()
const {
return ((Bits & RegParmMask) >> RegParmOffset) != 0; }
4772 unsigned RegParm = (Bits & RegParmMask) >> RegParmOffset;
4781 return Bits ==
Other.Bits;
4784 return Bits !=
Other.Bits;
4792 return ExtInfo(Bits | NoReturnMask);
4794 return ExtInfo(Bits & ~NoReturnMask);
4799 return ExtInfo(Bits | ProducesResultMask);
4801 return ExtInfo(Bits & ~ProducesResultMask);
4806 return ExtInfo(Bits | CmseNSCallMask);
4808 return ExtInfo(Bits & ~CmseNSCallMask);
4812 if (noCallerSavedRegs)
4813 return ExtInfo(Bits | NoCallerSavedRegsMask);
4815 return ExtInfo(Bits & ~NoCallerSavedRegsMask);
4820 return ExtInfo(Bits | NoCfCheckMask);
4822 return ExtInfo(Bits & ~NoCfCheckMask);
4826 assert(RegParm < 7 &&
"Invalid regparm value");
4827 return ExtInfo((Bits & ~RegParmMask) |
4828 ((RegParm + 1) << RegParmOffset));
4832 return ExtInfo((Bits & ~CallConvMask) | (
unsigned) cc);
4836 ID.AddInteger(Bits);
4854 LLVM_PREFERRED_TYPE(
bool)
4857 LLVM_PREFERRED_TYPE(
bool)
4860 LLVM_PREFERRED_TYPE(
bool)
4960 bool getCFIUncheckedCalleeAttr()
const;
4967 "Const, volatile and restrict are assumed to be a subset of "
4968 "the fast qualifiers.");
4980 static StringRef getNameForCallConv(
CallingConv CC);
4983 return T->getTypeClass() == FunctionNoProto ||
4984 T->getTypeClass() == FunctionProto;
4990class FunctionNoProtoType :
public FunctionType,
public llvm::FoldingSetNode {
5013 ID.AddPointer(ResultType.getAsOpaquePtr());
5017 return T->getTypeClass() == FunctionNoProto;
5067 Kind oppositeKind()
const;
5090 llvm_unreachable(
"unknown effect kind");
5094 StringRef name()
const;
5098 OS << Effect.
name();
5108 std::optional<FunctionEffect>
5109 effectProhibitingInference(
const Decl &Callee,
5116 bool shouldDiagnoseFunctionCall(
bool Direct,
5120 return LHS.FKind == RHS.FKind;
5123 return !(LHS == RHS);
5126 return LHS.FKind < RHS.FKind;
5133 Expr *Cond =
nullptr;
5142 return Cond == RHS.Cond;
5157 std::string description()
const;
5159 friend raw_ostream &
operator<<(raw_ostream &OS,
5168 const Container *Outer =
nullptr;
5175 return Idx ==
Other.Idx;
5178 return Idx !=
Other.Idx;
5187 assert(Outer !=
nullptr &&
"invalid FunctionEffectIterator");
5188 bool HasConds = !Outer->Conditions.empty();
5190 HasConds ? Outer->Conditions[Idx]
5212class FunctionEffectsRef {
5217 friend FunctionProtoType;
5218 friend FunctionEffectSet;
5229 : Effects(FX), Conditions(Conds) {}
5242 bool empty()
const {
return Effects.empty(); }
5243 size_t size()
const {
return Effects.size(); }
5254 const FunctionEffectsRef &RHS) {
5255 return LHS.Effects == RHS.Effects && LHS.Conditions == RHS.Conditions;
5258 const FunctionEffectsRef &RHS) {
5259 return !(LHS == RHS);
5262 void dump(llvm::raw_ostream &OS)
const;
5266class FunctionEffectKindSet {
5269 using KindBitsT = std::bitset<EndBitPos>;
5271 KindBitsT KindBits{};
5273 explicit FunctionEffectKindSet(KindBitsT KB) : KindBits(KB) {}
5279 return static_cast<size_t>(K);
5288 const FunctionEffectKindSet *Outer =
nullptr;
5293 void advanceToNextSetBit() {
5294 while (Idx < EndBitPos && !Outer->KindBits.test(Idx))
5300 iterator(
const FunctionEffectKindSet &O,
size_t I) : Outer(&O), Idx(I) {
5301 advanceToNextSetBit();
5306 iterator operator++() {
5308 advanceToNextSetBit();
5313 assert(Idx < EndBitPos &&
"Dereference of end iterator");
5322 iterator
begin()
const {
return iterator(*
this, 0); }
5323 iterator
end()
const {
return iterator(*
this, EndBitPos); }
5332 bool empty()
const {
return KindBits.none(); }
5334 return KindBits.test(kindToPos(EK));
5336 void dump(llvm::raw_ostream &OS)
const;
5338 static FunctionEffectKindSet
difference(FunctionEffectKindSet LHS,
5339 FunctionEffectKindSet RHS) {
5340 return FunctionEffectKindSet(LHS.KindBits & ~RHS.KindBits);
5356 : Effects(FX.effects()), Conditions(FX.conditions()) {}
5358 bool empty()
const {
return Effects.empty(); }
5359 size_t size()
const {
return Effects.size(); }
5368 void dump(llvm::raw_ostream &OS)
const;
5403class FunctionProtoType final
5405 public llvm::FoldingSetNode,
5406 private llvm::TrailingObjects<
5407 FunctionProtoType, QualType, SourceLocation,
5408 FunctionType::FunctionTypeExtraBitfields,
5409 FunctionType::FunctionTypeExtraAttributeInfo,
5410 FunctionType::FunctionTypeArmAttributes, FunctionType::ExceptionType,
5411 Expr *, FunctionDecl *, FunctionType::ExtParameterInfo, Qualifiers,
5412 FunctionEffect, EffectConditionExpr> {
5414 friend TrailingObjects;
5507 LLVM_PREFERRED_TYPE(
bool)
5509 LLVM_PREFERRED_TYPE(
bool)
5511 LLVM_PREFERRED_TYPE(
bool)
5526 Result.ExceptionSpec = ESI;
5560 unsigned numTrailingObjects(OverloadToken<QualType>)
const {
5561 return getNumParams();
5564 unsigned numTrailingObjects(OverloadToken<SourceLocation>)
const {
5565 return isVariadic();
5568 unsigned numTrailingObjects(OverloadToken<FunctionTypeArmAttributes>)
const {
5569 return hasArmTypeAttributes();
5572 unsigned numTrailingObjects(OverloadToken<FunctionTypeExtraBitfields>)
const {
5573 return hasExtraBitfields();
5577 numTrailingObjects(OverloadToken<FunctionTypeExtraAttributeInfo>)
const {
5578 return hasExtraAttributeInfo();
5581 unsigned numTrailingObjects(OverloadToken<ExceptionType>)
const {
5582 return getExceptionSpecSize().NumExceptionType;
5585 unsigned numTrailingObjects(OverloadToken<Expr *>)
const {
5586 return getExceptionSpecSize().NumExprPtr;
5589 unsigned numTrailingObjects(OverloadToken<FunctionDecl *>)
const {
5590 return getExceptionSpecSize().NumFunctionDeclPtr;
5593 unsigned numTrailingObjects(OverloadToken<ExtParameterInfo>)
const {
5594 return hasExtParameterInfos() ? getNumParams() : 0;
5597 unsigned numTrailingObjects(OverloadToken<Qualifiers>)
const {
5598 return hasExtQualifiers() ? 1 : 0;
5601 unsigned numTrailingObjects(OverloadToken<FunctionEffect>)
const {
5602 return getNumFunctionEffects();
5607 static bool containsAnyUnexpandedParameterPack(
const QualType *ArgArray,
5609 for (
unsigned Idx = 0; Idx < numArgs; ++Idx)
5610 if (ArgArray[Idx]->containsUnexpandedParameterPack())
5616 FunctionProtoType(QualType result, ArrayRef<QualType> params,
5617 QualType canonical,
const ExtProtoInfo &epi);
5622 struct ExceptionSpecSizeHolder {
5623 unsigned NumExceptionType;
5624 unsigned NumExprPtr;
5625 unsigned NumFunctionDeclPtr;
5630 static ExceptionSpecSizeHolder
5631 getExceptionSpecSize(ExceptionSpecificationType EST,
unsigned NumExceptions) {
5642 return {NumExceptions, 0, 0};
5655 llvm_unreachable(
"bad exception specification kind");
5660 ExceptionSpecSizeHolder getExceptionSpecSize()
const {
5661 return getExceptionSpecSize(getExceptionSpecType(), getNumExceptions());
5665 bool hasExtraBitfields()
const {
5666 assert((getExceptionSpecType() != EST_Dynamic ||
5667 FunctionTypeBits.HasExtraBitfields) &&
5668 "ExtraBitfields are required for given ExceptionSpecType");
5669 return FunctionTypeBits.HasExtraBitfields;
5673 bool hasExtraAttributeInfo()
const {
5674 return FunctionTypeBits.HasExtraBitfields &&
5675 getTrailingObjects<FunctionTypeExtraBitfields>()
5676 ->HasExtraAttributeInfo;
5679 bool hasArmTypeAttributes()
const {
5680 return FunctionTypeBits.HasExtraBitfields &&
5681 getTrailingObjects<FunctionTypeExtraBitfields>()
5682 ->HasArmTypeAttributes;
5685 bool hasExtQualifiers()
const {
5686 return FunctionTypeBits.HasExtQuals;
5693 assert(i <
getNumParams() &&
"invalid parameter index");
5738 bool hasDependentExceptionSpec()
const;
5742 bool hasInstantiationDependentExceptionSpec()
const;
5764 ? getTrailingObjects<FunctionTypeExtraBitfields>()
5780 return *getTrailingObjects<Expr *>();
5791 return getTrailingObjects<FunctionDecl *>()[0];
5801 return getTrailingObjects<FunctionDecl *>()[1];
5819 return isVariadic() ? *getTrailingObjects<SourceLocation>()
5829 bool isTemplateVariadic()
const;
5839 if (hasExtQualifiers())
5840 return *getTrailingObjects<Qualifiers>();
5857 return getTrailingObjects<QualType>();
5872 getTrailingObjects<ExceptionType>());
5897 return getTrailingObjects<ExtParameterInfo>();
5902 if (hasExtraAttributeInfo())
5903 return *getTrailingObjects<FunctionTypeExtraAttributeInfo>();
5910 if (!hasArmTypeAttributes())
5912 return getTrailingObjects<FunctionTypeArmAttributes>()
5913 ->AArch64SMEAttributes;
5917 assert(I <
getNumParams() &&
"parameter index out of range");
5919 return getTrailingObjects<ExtParameterInfo>()[I];
5924 assert(I <
getNumParams() &&
"parameter index out of range");
5926 return getTrailingObjects<ExtParameterInfo>()[I].getABI();
5931 assert(I <
getNumParams() &&
"parameter index out of range");
5933 return getTrailingObjects<ExtParameterInfo>()[I].isConsumed();
5938 return hasExtraBitfields()
5939 ? getTrailingObjects<FunctionTypeExtraBitfields>()
5940 ->NumFunctionEffects
5946 if (hasExtraBitfields()) {
5947 const auto *Bitfields = getTrailingObjects<FunctionTypeExtraBitfields>();
5948 if (Bitfields->NumFunctionEffects > 0)
5949 return getTrailingObjects<FunctionEffect>(
5950 Bitfields->NumFunctionEffects);
5956 if (hasExtraBitfields()) {
5957 const auto *Bitfields = getTrailingObjects<FunctionTypeExtraBitfields>();
5958 if (Bitfields->EffectsHaveConditions)
5959 return Bitfields->NumFunctionEffects;
5966 if (hasExtraBitfields()) {
5967 const auto *Bitfields = getTrailingObjects<FunctionTypeExtraBitfields>();
5968 if (Bitfields->EffectsHaveConditions)
5969 return getTrailingObjects<EffectConditionExpr>(
5970 Bitfields->NumFunctionEffects);
5977 if (hasExtraBitfields()) {
5978 const auto *Bitfields = getTrailingObjects<FunctionTypeExtraBitfields>();
5979 if (Bitfields->NumFunctionEffects > 0) {
5980 const size_t NumConds = Bitfields->EffectsHaveConditions
5981 ? Bitfields->NumFunctionEffects
5984 getTrailingObjects<FunctionEffect>(Bitfields->NumFunctionEffects),
5985 {NumConds ? getTrailingObjects<EffectConditionExpr>() : nullptr,
5995 void printExceptionSpecification(raw_ostream &OS,
5999 return T->getTypeClass() == FunctionProto;
6002 void Profile(llvm::FoldingSetNodeID &ID,
const ASTContext &Ctx);
6082 template <
class... As>
6085 this->KeywordWrapperBits.Keyword = llvm::to_underlying(
Keyword);
6110 constexpr unsigned long Offset =
6112 const auto *
Addr =
reinterpret_cast<const T *
>(
6113 reinterpret_cast<const char *
>(
this) - Offset);
6114 assert(llvm::isAddrAligned(llvm::Align(
alignof(
T)),
Addr));
6124class UnresolvedUsingType final
6126 private llvm::TrailingObjects<UnresolvedUsingType,
6127 FoldingSetPlaceholder<UnresolvedUsingType>,
6128 NestedNameSpecifier> {
6130 friend TrailingObjects;
6134 unsigned numTrailingObjects(
6142 assert(numTrailingObjects(
6145 return getTrailingObjects<FoldingSetPlaceholder<UnresolvedUsingType>>();
6148 UnresolvedUsingType(ElaboratedTypeKeyword Keyword,
6149 NestedNameSpecifier Qualifier,
6150 const UnresolvedUsingTypenameDecl *D,
6151 const Type *CanonicalType);
6156 ? *getTrailingObjects<NestedNameSpecifier>()
6171 Qualifier.Profile(ID);
6179 return T->getTypeClass() == UnresolvedUsing;
6184 public llvm::FoldingSetNode,
6185 llvm::TrailingObjects<UsingType, NestedNameSpecifier> {
6190 friend TrailingObjects;
6197 return UsingBits.hasQualifier ? *getTrailingObjects() : std::nullopt;
6210 UnderlyingType.Profile(ID);
6212 Qualifier.Profile(ID);
6221class TypedefType final
6223 private llvm::TrailingObjects<TypedefType,
6224 FoldingSetPlaceholder<TypedefType>,
6225 NestedNameSpecifier, QualType> {
6228 friend TrailingObjects;
6237 unsigned numTrailingObjects(OverloadToken<NestedNameSpecifier>)
const {
6238 return TypedefBits.hasQualifier;
6241 TypedefType(TypeClass TC, ElaboratedTypeKeyword Keyword,
6242 NestedNameSpecifier Qualifier,
const TypedefNameDecl *D,
6243 QualType UnderlyingType,
bool HasTypeDifferentFromDecl);
6245 FoldingSetPlaceholder<TypedefType> *getFoldingSetPlaceholder() {
6246 assert(numTrailingObjects(
6247 OverloadToken<FoldingSetPlaceholder<TypedefType>>{}) == 1);
6248 return getTrailingObjects<FoldingSetPlaceholder<TypedefType>>();
6253 return TypedefBits.hasQualifier ? *getTrailingObjects<NestedNameSpecifier>()
6274 ID.AddInteger(llvm::to_underlying(
Keyword));
6276 Qualifier.Profile(ID);
6277 if (!Underlying.
isNull())
6291class MacroQualifiedType :
public Type {
6300 UnderlyingTy(UnderlyingTy), MacroII(MacroII) {
6302 "Expected a macro qualified type to only wrap attributed types.");
6317 return T->getTypeClass() == MacroQualified;
6345 bool isSugared()
const;
6357 public llvm::FoldingSetNode {
6367 static void Profile(llvm::FoldingSetNodeID &ID,
const ASTContext &Context,
6368 Expr *E,
bool IsUnqual);
6373class TypeOfType :
public Type {
6379 TypeOfType(
const ASTContext &Context, QualType T, QualType Can,
6383 QualType getUnmodifiedType()
const {
return TOType; }
6386 QualType desugar()
const;
6389 bool isSugared()
const {
return true; }
6393 return static_cast<TypeOfKind>(TypeOfBits.Kind);
6400class DecltypeType :
public Type {
6402 QualType UnderlyingType;
6405 friend class ASTContext;
6407 DecltypeType(Expr *E, QualType underlyingType, QualType can = QualType());
6410 Expr *getUnderlyingExpr()
const {
return E; }
6414 QualType desugar()
const;
6417 bool isSugared()
const;
6428class DependentDecltypeType :
public DecltypeType,
public llvm::FoldingSetNode {
6430 DependentDecltypeType(Expr *E);
6432 void Profile(llvm::FoldingSetNodeID &ID,
const ASTContext &Context) {
6433 Profile(ID, Context, getUnderlyingExpr());
6436 static void Profile(llvm::FoldingSetNodeID &ID,
const ASTContext &Context,
6440class PackIndexingType final
6442 public llvm::FoldingSetNode,
6443 private llvm::TrailingObjects<PackIndexingType, QualType> {
6444 friend TrailingObjects;
6451 LLVM_PREFERRED_TYPE(
bool)
6452 unsigned FullySubstituted : 1;
6455 friend class ASTContext;
6456 PackIndexingType(QualType Canonical, QualType Pattern, Expr *IndexExpr,
6457 bool FullySubstituted, ArrayRef<QualType> Expansions = {});
6460 Expr *getIndexExpr()
const {
return IndexExpr; }
6461 QualType getPattern()
const {
return Pattern; }
6463 bool isSugared()
const {
return hasSelectedType(); }
6465 QualType desugar()
const {
6466 if (hasSelectedType())
6467 return getSelectedType();
6468 return QualType(
this, 0);
6471 QualType getSelectedType()
const {
6472 assert(hasSelectedType() &&
"Type is dependant");
6473 return *(getExpansionsPtr() + *getSelectedIndex());
6478 bool hasSelectedType()
const {
return getSelectedIndex() != std::nullopt; }
6480 bool isFullySubstituted()
const {
return FullySubstituted; }
6482 bool expandsToEmptyPack()
const {
return isFullySubstituted() &&
Size == 0; }
6484 ArrayRef<QualType> getExpansions()
const {
6485 return {getExpansionsPtr(),
Size};
6488 static bool classof(
const Type *T) {
6492 void Profile(llvm::FoldingSetNodeID &ID,
const ASTContext &Context);
6493 static void Profile(llvm::FoldingSetNodeID &ID,
const ASTContext &Context,
6494 QualType Pattern, Expr *E,
bool FullySubstituted,
6495 ArrayRef<QualType> Expansions);
6498 const QualType *getExpansionsPtr()
const {
return getTrailingObjects(); }
6501 ArrayRef<QualType> Expansions = {});
6505class UnaryTransformType :
public Type,
public llvm::FoldingSetNode {
6508#define TRANSFORM_TYPE_TRAIT_DEF(Enum, _) Enum,
6509#include "clang/Basic/Traits.inc"
6517 QualType UnderlyingType;
6522 friend class ASTContext;
6524 UnaryTransformType(QualType BaseTy, QualType UnderlyingTy, UTTKind UKind,
6525 QualType CanonicalTy);
6528 bool isSugared()
const {
return !isDependentType(); }
6529 QualType desugar()
const {
return UnderlyingType; }
6534 UTTKind getUTTKind()
const {
return UKind; }
6536 static bool classof(
const Type *T) {
6540 void Profile(llvm::FoldingSetNodeID &ID) {
6544 static void Profile(llvm::FoldingSetNodeID &ID, QualType BaseType,
6545 QualType UnderlyingType, UTTKind UKind) {
6546 BaseType.Profile(ID);
6547 UnderlyingType.Profile(ID);
6548 ID.AddInteger(UKind);
6552class TagType :
public TypeWithKeyword {
6553 friend class ASTContext;
6559 void *getTrailingPointer()
const;
6560 NestedNameSpecifier &getTrailingQualifier()
const;
6563 TagType(TypeClass TC, ElaboratedTypeKeyword Keyword,
6564 NestedNameSpecifier Qualifier,
const TagDecl *TD,
bool OwnsTag,
6565 bool IsInjected,
const Type *CanonicalType);
6568 TagDecl *getDecl()
const {
return decl; }
6569 [[deprecated(
"Use getDecl instead")]] TagDecl *getOriginalDecl()
const {
6573 NestedNameSpecifier getQualifier()
const;
6576 bool isTagOwned()
const {
return TagTypeBits.OwnsTag; }
6578 bool isInjected()
const {
return TagTypeBits.IsInjected; }
6580 ClassTemplateDecl *getTemplateDecl()
const;
6581 TemplateName getTemplateName(
const ASTContext &Ctx)
const;
6582 ArrayRef<TemplateArgument> getTemplateArgs(
const ASTContext &Ctx)
const;
6584 bool isSugared()
const {
return false; }
6585 QualType desugar()
const {
return getCanonicalTypeInternal(); }
6587 static bool classof(
const Type *T) {
6593struct TagTypeFoldingSetPlaceholder :
public llvm::FoldingSetNode {
6594 static constexpr size_t getOffset() {
6595 return alignof(TagType) -
6596 (
sizeof(TagTypeFoldingSetPlaceholder) %
alignof(TagType));
6599 static void Profile(llvm::FoldingSetNodeID &ID, ElaboratedTypeKeyword Keyword,
6600 NestedNameSpecifier Qualifier,
const TagDecl *Tag,
6601 bool OwnsTag,
bool IsInjected) {
6602 ID.AddInteger(
uintptr_t(Tag) | OwnsTag | (IsInjected << 1) |
6603 ((Keyword != ElaboratedTypeKeyword::None) << 2));
6604 if (Keyword != ElaboratedTypeKeyword::None)
6605 ID.AddInteger(llvm::to_underlying(Keyword));
6610 void Profile(llvm::FoldingSetNodeID &ID)
const {
6611 const TagType *
T = getTagType();
6612 Profile(ID,
T->getKeyword(),
T->getQualifier(),
T->getDecl(),
6613 T->isTagOwned(),
T->isInjected());
6616 TagType *getTagType() {
6617 return reinterpret_cast<TagType *
>(
reinterpret_cast<char *
>(
this + 1) +
6620 const TagType *getTagType()
const {
6621 return const_cast<TagTypeFoldingSetPlaceholder *
>(
this)->getTagType();
6623 static TagTypeFoldingSetPlaceholder *fromTagType(TagType *T) {
6624 return reinterpret_cast<TagTypeFoldingSetPlaceholder *
>(
6625 reinterpret_cast<char *
>(
T) - getOffset()) -
6632class RecordType final :
public TagType {
6633 using TagType::TagType;
6636 RecordDecl *getDecl()
const {
6637 return reinterpret_cast<RecordDecl *
>(TagType::getDecl());
6639 [[deprecated(
"Use getDecl instead")]] RecordDecl *getOriginalDecl()
const {
6645 bool hasConstFields()
const;
6652class EnumType final :
public TagType {
6653 using TagType::TagType;
6656 EnumDecl *getDecl()
const {
6657 return reinterpret_cast<EnumDecl *
>(TagType::getDecl());
6659 [[deprecated(
"Use getDecl instead")]] EnumDecl *getOriginalDecl()
const {
6683class InjectedClassNameType final :
public TagType {
6684 friend class ASTContext;
6686 InjectedClassNameType(ElaboratedTypeKeyword Keyword,
6687 NestedNameSpecifier Qualifier,
const TagDecl *TD,
6688 bool IsInjected,
const Type *CanonicalType);
6691 CXXRecordDecl *getDecl()
const {
6692 return reinterpret_cast<CXXRecordDecl *
>(TagType::getDecl());
6694 [[deprecated(
"Use getDecl instead")]] CXXRecordDecl *getOriginalDecl()
const {
6698 static bool classof(
const Type *T) {
6717 using Kind = attr::Kind;
6720 friend class ASTContext;
6722 const Attr *Attribute;
6724 QualType ModifiedType;
6725 QualType EquivalentType;
6727 AttributedType(QualType canon, attr::Kind attrKind, QualType modified,
6728 QualType equivalent)
6731 AttributedType(QualType canon,
const Attr *attr, QualType modified,
6732 QualType equivalent);
6735 AttributedType(QualType canon, attr::Kind attrKind,
const Attr *attr,
6736 QualType modified, QualType equivalent);
6739 Kind getAttrKind()
const {
6740 return static_cast<Kind>(AttributedTypeBits.AttrKind);
6743 const Attr *getAttr()
const {
return Attribute; }
6745 QualType getModifiedType()
const {
return ModifiedType; }
6746 QualType getEquivalentType()
const {
return EquivalentType; }
6748 bool isSugared()
const {
return true; }
6749 QualType desugar()
const {
return getEquivalentType(); }
6766 bool isQualifier()
const;
6768 bool isMSTypeSpec()
const;
6770 bool isWebAssemblyFuncrefSpec()
const;
6772 bool isCallingConv()
const;
6787 void Profile(llvm::FoldingSetNodeID &ID,
const ASTContext &Ctx) {
6788 Profile(ID, Ctx, getAttrKind(), ModifiedType, EquivalentType, Attribute);
6791 static void Profile(llvm::FoldingSetNodeID &ID,
const ASTContext &Ctx,
6792 Kind attrKind, QualType modified, QualType equivalent,
6795 static bool classof(
const Type *T) {
6800class BTFTagAttributedType :
public Type,
public llvm::FoldingSetNode {
6802 friend class ASTContext;
6804 QualType WrappedType;
6805 const BTFTypeTagAttr *BTFAttr;
6807 BTFTagAttributedType(QualType Canon, QualType Wrapped,
6808 const BTFTypeTagAttr *BTFAttr)
6809 : Type(BTFTagAttributed, Canon, Wrapped->getDependence()),
6810 WrappedType(Wrapped), BTFAttr(BTFAttr) {}
6813 QualType getWrappedType()
const {
return WrappedType; }
6814 const BTFTypeTagAttr *getAttr()
const {
return BTFAttr; }
6816 bool isSugared()
const {
return true; }
6817 QualType desugar()
const {
return getWrappedType(); }
6819 void Profile(llvm::FoldingSetNodeID &ID) {
6820 Profile(ID, WrappedType, BTFAttr);
6823 static void Profile(llvm::FoldingSetNodeID &ID, QualType Wrapped,
6824 const BTFTypeTagAttr *BTFAttr) {
6825 ID.AddPointer(Wrapped.getAsOpaquePtr());
6826 ID.AddPointer(BTFAttr);
6829 static bool classof(
const Type *T) {
6834class OverflowBehaviorType :
public Type,
public llvm::FoldingSetNode {
6836 enum OverflowBehaviorKind { Wrap, Trap };
6839 friend class ASTContext;
6841 QualType UnderlyingType;
6842 OverflowBehaviorKind BehaviorKind;
6844 OverflowBehaviorType(QualType Canon, QualType Underlying,
6845 OverflowBehaviorKind Kind);
6849 OverflowBehaviorKind getBehaviorKind()
const {
return BehaviorKind; }
6851 bool isWrapKind()
const {
return BehaviorKind == OverflowBehaviorKind::Wrap; }
6852 bool isTrapKind()
const {
return BehaviorKind == OverflowBehaviorKind::Trap; }
6854 bool isSugared()
const {
return false; }
6857 void Profile(llvm::FoldingSetNodeID &ID) {
6858 Profile(ID, UnderlyingType, BehaviorKind);
6861 static void Profile(llvm::FoldingSetNodeID &ID, QualType Underlying,
6862 OverflowBehaviorKind Kind) {
6863 ID.AddPointer(Underlying.getAsOpaquePtr());
6864 ID.AddInteger((
int)Kind);
6867 static bool classof(
const Type *T) {
6872class HLSLAttributedResourceType :
public Type,
public llvm::FoldingSetNode {
6877 llvm::dxil::ResourceDimension ResourceDimension;
6879 LLVM_PREFERRED_TYPE(
bool)
6882 LLVM_PREFERRED_TYPE(
bool)
6885 LLVM_PREFERRED_TYPE(
bool)
6888 LLVM_PREFERRED_TYPE(
bool)
6891 LLVM_PREFERRED_TYPE(
bool)
6895 llvm::dxil::ResourceDimension ResourceDimension,
6896 bool IsROV =
false,
bool RawBuffer =
false,
6897 bool IsCounter =
false,
bool IsArray =
false,
6898 bool IsMultiSampled =
false)
6900 IsROV(IsROV), RawBuffer(RawBuffer), IsCounter(IsCounter),
6901 IsArray(IsArray), IsMultiSampled(IsMultiSampled) {}
6911 friend bool operator==(
const Attributes &LHS,
const Attributes &RHS) {
6912 return std::tie(LHS.ResourceClass, LHS.ResourceDimension, LHS.IsROV,
6913 LHS.RawBuffer, LHS.IsCounter, LHS.IsArray,
6914 LHS.IsMultiSampled) ==
6915 std::tie(RHS.ResourceClass, RHS.ResourceDimension, RHS.IsROV,
6916 RHS.RawBuffer, RHS.IsCounter, RHS.IsArray,
6917 RHS.IsMultiSampled);
6919 friend bool operator!=(
const Attributes &LHS,
const Attributes &RHS) {
6920 return !(LHS == RHS);
6925 friend class ASTContext;
6927 QualType WrappedType;
6928 QualType ContainedType;
6929 const Attributes Attrs;
6931 HLSLAttributedResourceType(QualType Wrapped, QualType Contained,
6932 const Attributes &Attrs)
6933 : Type(HLSLAttributedResource, QualType(),
6935 : Contained->getDependence()),
6936 WrappedType(Wrapped), ContainedType(Contained), Attrs(Attrs) {}
6939 QualType getWrappedType()
const {
return WrappedType; }
6940 QualType getContainedType()
const {
return ContainedType; }
6941 bool hasContainedType()
const {
return !ContainedType.isNull(); }
6942 const Attributes &getAttrs()
const {
return Attrs; }
6943 bool isRaw()
const {
return Attrs.RawBuffer; }
6944 bool isStructured()
const {
return !ContainedType->isChar8Type(); }
6946 bool isSugared()
const {
return false; }
6947 QualType desugar()
const {
return QualType(
this, 0); }
6949 void Profile(llvm::FoldingSetNodeID &ID) {
6950 Profile(ID, WrappedType, ContainedType, Attrs);
6953 static void Profile(llvm::FoldingSetNodeID &ID, QualType Wrapped,
6954 QualType Contained,
const Attributes &Attrs) {
6955 ID.AddPointer(Wrapped.getAsOpaquePtr());
6956 ID.AddPointer(Contained.getAsOpaquePtr());
6957 ID.AddInteger(
static_cast<uint32_t>(Attrs.ResourceClass));
6958 ID.AddInteger(
static_cast<uint32_t>(Attrs.ResourceDimension));
6959 ID.AddBoolean(Attrs.IsROV);
6960 ID.AddBoolean(Attrs.RawBuffer);
6961 ID.AddBoolean(Attrs.IsCounter);
6962 ID.AddBoolean(Attrs.IsArray);
6963 ID.AddBoolean(Attrs.IsMultiSampled);
6966 static bool classof(
const Type *T) {
6971 static const HLSLAttributedResourceType *
6972 findHandleTypeOnResource(
const Type *RT);
6978 enum SpirvOperandKind :
unsigned char {
6991 QualType ResultType;
6997 SpirvOperand(SpirvOperandKind Kind, QualType ResultType, llvm::APInt
Value)
7000 SpirvOperand(
const SpirvOperand &Other) =
default;
7001 ~SpirvOperand() =
default;
7002 SpirvOperand &operator=(
const SpirvOperand &Other) =
default;
7004 bool operator==(
const SpirvOperand &Other)
const {
7009 bool operator!=(
const SpirvOperand &Other)
const {
return !(*
this ==
Other); }
7014 bool isConstant()
const {
return Kind == ConstantId; }
7016 bool isType()
const {
return Kind == TypeId; }
7018 llvm::APInt getValue()
const {
7020 "This is not an operand with a value!");
7024 QualType getResultType()
const {
7025 assert((isConstant() || isType()) &&
7026 "This is not an operand with a result type!");
7030 static SpirvOperand createConstant(QualType ResultType, llvm::APInt Val) {
7031 return SpirvOperand(ConstantId, ResultType, std::move(Val));
7034 static SpirvOperand createLiteral(llvm::APInt Val) {
7035 return SpirvOperand(Literal, QualType(), std::move(Val));
7038 static SpirvOperand createType(QualType T) {
7039 return SpirvOperand(TypeId, T, llvm::APSInt());
7042 void Profile(llvm::FoldingSetNodeID &ID)
const {
7043 ID.AddInteger(Kind);
7044 ID.AddPointer(ResultType.getAsOpaquePtr());
7050class HLSLInlineSpirvType final
7052 public llvm::FoldingSetNode,
7053 private llvm::TrailingObjects<HLSLInlineSpirvType, SpirvOperand> {
7054 friend class ASTContext;
7055 friend TrailingObjects;
7064 ArrayRef<SpirvOperand> Operands)
7066 Size(
Size), Alignment(Alignment), NumOperands(Operands.size()) {
7067 for (
size_t I = 0; I < NumOperands; I++) {
7070 auto *
Operand =
new (&getTrailingObjects()[I]) SpirvOperand();
7078 uint32_t getAlignment()
const {
return Alignment; }
7079 ArrayRef<SpirvOperand> getOperands()
const {
7080 return getTrailingObjects(NumOperands);
7083 bool isSugared()
const {
return false; }
7084 QualType desugar()
const {
return QualType(
this, 0); }
7086 void Profile(llvm::FoldingSetNodeID &ID) {
7087 Profile(ID, Opcode, Size, Alignment, getOperands());
7090 static void Profile(llvm::FoldingSetNodeID &ID,
uint32_t Opcode,
7092 ArrayRef<SpirvOperand> Operands) {
7093 ID.AddInteger(Opcode);
7094 ID.AddInteger(Size);
7095 ID.AddInteger(Alignment);
7096 for (
auto &Operand : Operands)
7100 static bool classof(
const Type *T) {
7105class TemplateTypeParmType :
public Type,
public llvm::FoldingSetNode {
7106 friend class ASTContext;
7109 TemplateTypeParmDecl *TTPDecl;
7111 TemplateTypeParmType(
unsigned D,
unsigned I,
bool PP,
7112 TemplateTypeParmDecl *TTPDecl, QualType Canon)
7117 assert(!TTPDecl == Canon.isNull());
7118 assert(D < (1 << TemplateTypeParmTypeDepthBits) &&
"Depth too large");
7119 assert(I < (1 << TemplateTypeParmTypeIndexBits) &&
"Index too large");
7120 TemplateTypeParmTypeBits.Depth = D;
7121 TemplateTypeParmTypeBits.Index = I;
7122 TemplateTypeParmTypeBits.ParameterPack = PP;
7126 unsigned getDepth()
const {
return TemplateTypeParmTypeBits.Depth; }
7127 unsigned getIndex()
const {
return TemplateTypeParmTypeBits.Index; }
7129 return TemplateTypeParmTypeBits.ParameterPack;
7132 TemplateTypeParmDecl *getDecl()
const {
return TTPDecl; }
7136 bool isSugared()
const {
return false; }
7137 QualType desugar()
const {
return QualType(
this, 0); }
7139 void Profile(llvm::FoldingSetNodeID &ID) {
7143 static void Profile(llvm::FoldingSetNodeID &ID,
unsigned Depth,
7144 unsigned Index,
bool ParameterPack,
7145 TemplateTypeParmDecl *TTPDecl) {
7146 ID.AddInteger(Depth);
7147 ID.AddInteger(Index);
7148 ID.AddBoolean(ParameterPack);
7149 ID.AddPointer(TTPDecl);
7152 static bool classof(
const Type *T) {
7164class SubstTemplateTypeParmType final
7166 public llvm::FoldingSetNode,
7167 private llvm::TrailingObjects<SubstTemplateTypeParmType, QualType> {
7168 friend class ASTContext;
7169 friend class llvm::TrailingObjects<SubstTemplateTypeParmType, QualType>;
7171 Decl *AssociatedDecl;
7173 SubstTemplateTypeParmType(QualType Replacement, Decl *AssociatedDecl,
7174 unsigned Index, UnsignedOrNone PackIndex,
7180 QualType getReplacementType()
const {
7181 return SubstTemplateTypeParmTypeBits.HasNonCanonicalUnderlyingType
7182 ? *getTrailingObjects()
7183 : getCanonicalTypeInternal();
7189 Decl *getAssociatedDecl()
const {
return AssociatedDecl; }
7192 const TemplateTypeParmDecl *getReplacedParameter()
const;
7196 unsigned getIndex()
const {
return SubstTemplateTypeParmTypeBits.Index; }
7200 unsigned getFinal()
const {
return SubstTemplateTypeParmTypeBits.Final; }
7203 return UnsignedOrNone::fromInternalRepresentation(
7204 SubstTemplateTypeParmTypeBits.PackIndex);
7207 bool isSugared()
const {
return true; }
7208 QualType desugar()
const {
return getReplacementType(); }
7210 void Profile(llvm::FoldingSetNodeID &ID) {
7211 Profile(ID, getReplacementType(), getAssociatedDecl(),
getIndex(),
7212 getPackIndex(), getFinal());
7215 static void Profile(llvm::FoldingSetNodeID &ID, QualType Replacement,
7216 const Decl *AssociatedDecl,
unsigned Index,
7217 UnsignedOrNone PackIndex,
bool Final);
7219 static bool classof(
const Type *T) {
7230class SubstPackType :
public Type,
public llvm::FoldingSetNode {
7231 friend class ASTContext;
7238 SubstPackType(TypeClass Derived, QualType Canon,
7239 const TemplateArgument &ArgPack);
7242 unsigned getNumArgs()
const {
return SubstPackTypeBits.NumArgs; }
7244 TemplateArgument getArgumentPack()
const;
7246 void Profile(llvm::FoldingSetNodeID &ID);
7247 static void Profile(llvm::FoldingSetNodeID &ID,
7248 const TemplateArgument &ArgPack);
7250 static bool classof(
const Type *T) {
7257class SubstBuiltinTemplatePackType :
public SubstPackType {
7258 friend class ASTContext;
7260 SubstBuiltinTemplatePackType(QualType Canon,
const TemplateArgument &ArgPack);
7263 bool isSugared()
const {
return false; }
7264 QualType desugar()
const {
return QualType(
this, 0); }
7267 using SubstPackType::Profile;
7269 static bool classof(
const Type *T) {
7286class SubstTemplateTypeParmPackType :
public SubstPackType {
7287 friend class ASTContext;
7289 llvm::PointerIntPair<Decl *, 1, bool> AssociatedDeclAndFinal;
7291 SubstTemplateTypeParmPackType(QualType Canon, Decl *AssociatedDecl,
7292 unsigned Index,
bool Final,
7293 const TemplateArgument &ArgPack);
7301 Decl *getAssociatedDecl()
const;
7304 const TemplateTypeParmDecl *getReplacedParameter()
const;
7309 return SubstPackTypeBits.SubstTemplTypeParmPackIndex;
7314 bool getFinal()
const;
7316 bool isSugared()
const {
return false; }
7317 QualType desugar()
const {
return QualType(
this, 0); }
7319 void Profile(llvm::FoldingSetNodeID &ID);
7320 static void Profile(llvm::FoldingSetNodeID &ID,
const Decl *AssociatedDecl,
7321 unsigned Index,
bool Final,
7322 const TemplateArgument &ArgPack);
7324 static bool classof(
const Type *T) {
7337class DeducedType :
public Type {
7338 QualType DeducedAsType;
7341 DeducedType(TypeClass TC, DeducedKind DK, QualType DeducedAsTypeOrCanon);
7343 static void Profile(llvm::FoldingSetNodeID &ID, DeducedKind DK,
7345 ID.AddInteger(llvm::to_underlying(DK));
7351 return static_cast<DeducedKind>(DeducedTypeBits.Kind);
7354 bool isSugared()
const {
return getDeducedKind() == DeducedKind::Deduced; }
7355 QualType desugar()
const {
7356 return isSugared() ? DeducedAsType : QualType(
this, 0);
7361 QualType getDeducedType()
const {
return DeducedAsType; }
7362 bool isDeduced()
const {
return getDeducedKind() != DeducedKind::Undeduced; }
7364 static bool classof(
const Type *T) {
7372class AutoType :
public DeducedType,
public llvm::FoldingSetNode {
7373 friend class ASTContext;
7375 TemplateDecl *TypeConstraintConcept;
7377 AutoType(DeducedKind DK, QualType DeducedAsTypeOrCanon,
7378 AutoTypeKeyword Keyword, TemplateDecl *TypeConstraintConcept,
7379 ArrayRef<TemplateArgument> TypeConstraintArgs);
7382 ArrayRef<TemplateArgument> getTypeConstraintArguments()
const {
7383 return {
reinterpret_cast<const TemplateArgument *
>(
this + 1),
7384 AutoTypeBits.NumArgs};
7387 TemplateDecl *getTypeConstraintConcept()
const {
7388 return TypeConstraintConcept;
7391 bool isConstrained()
const {
7392 return TypeConstraintConcept !=
nullptr;
7395 bool isDecltypeAuto()
const {
7396 return getKeyword() == AutoTypeKeyword::DecltypeAuto;
7399 bool isGNUAutoType()
const {
7400 return getKeyword() == AutoTypeKeyword::GNUAutoType;
7404 return (AutoTypeKeyword)AutoTypeBits.Keyword;
7407 void Profile(llvm::FoldingSetNodeID &ID,
const ASTContext &Context);
7408 static void Profile(llvm::FoldingSetNodeID &ID,
const ASTContext &Context,
7409 DeducedKind DK, QualType Deduced, AutoTypeKeyword Keyword,
7410 TemplateDecl *CD, ArrayRef<TemplateArgument> Arguments);
7412 static bool classof(
const Type *T) {
7418class DeducedTemplateSpecializationType :
public KeywordWrapper<DeducedType>,
7419 public llvm::FoldingSetNode {
7420 friend class ASTContext;
7425 DeducedTemplateSpecializationType(DeducedKind DK,
7426 QualType DeducedAsTypeOrCanon,
7427 ElaboratedTypeKeyword Keyword,
7428 TemplateName Template)
7429 : KeywordWrapper(
Keyword, DeducedTemplateSpecialization, DK,
7430 DeducedAsTypeOrCanon),
7434 if (DK == DeducedKind::Deduced)
7443 void Profile(llvm::FoldingSetNodeID &ID)
const {
7444 Profile(ID, getDeducedKind(), getDeducedType(), getKeyword(),
7448 static void Profile(llvm::FoldingSetNodeID &ID, DeducedKind DK,
7449 QualType Deduced, ElaboratedTypeKeyword Keyword,
7450 TemplateName Template) {
7451 DeducedType::Profile(ID, DK, Deduced);
7452 ID.AddInteger(llvm::to_underlying(Keyword));
7456 static bool classof(
const Type *T) {
7481class TemplateSpecializationType :
public TypeWithKeyword,
7482 public llvm::FoldingSetNode {
7483 friend class ASTContext;
7494 TemplateSpecializationType(ElaboratedTypeKeyword Keyword, TemplateName T,
7495 bool IsAlias, ArrayRef<TemplateArgument> Args,
7496 QualType Underlying);
7511 anyDependentTemplateArguments(ArrayRef<TemplateArgumentLoc> Args,
7512 ArrayRef<TemplateArgument> Converted);
7514 anyDependentTemplateArguments(
const TemplateArgumentListInfo &,
7515 ArrayRef<TemplateArgument> Converted);
7516 static bool anyInstantiationDependentTemplateArguments(
7517 ArrayRef<TemplateArgumentLoc> Args);
7521 bool isCurrentInstantiation()
const {
7522 return isa<InjectedClassNameType>(getCanonicalTypeInternal());
7540 bool isTypeAlias()
const {
return TemplateSpecializationTypeBits.TypeAlias; }
7544 QualType getAliasedType()
const;
7549 ArrayRef<TemplateArgument> template_arguments()
const {
7550 return {
reinterpret_cast<const TemplateArgument *
>(
this + 1),
7551 TemplateSpecializationTypeBits.NumArgs};
7554 bool isSugared()
const;
7556 QualType desugar()
const {
7557 return isTypeAlias() ? getAliasedType() : getCanonicalTypeInternal();
7560 void Profile(llvm::FoldingSetNodeID &ID,
const ASTContext &Ctx);
7561 static void Profile(llvm::FoldingSetNodeID &ID, ElaboratedTypeKeyword Keyword,
7562 TemplateName T, ArrayRef<TemplateArgument> Args,
7563 QualType Underlying,
const ASTContext &Context);
7565 static bool classof(
const Type *T) {
7572void printTemplateArgumentList(raw_ostream &OS,
7573 ArrayRef<TemplateArgument> Args,
7574 const PrintingPolicy &Policy,
7575 const TemplateParameterList *TPL =
nullptr);
7577void printTemplateArgumentList(raw_ostream &OS,
7578 ArrayRef<TemplateArgumentLoc> Args,
7579 const PrintingPolicy &Policy,
7580 const TemplateParameterList *TPL =
nullptr);
7582void printTemplateArgumentList(raw_ostream &OS,
7583 const TemplateArgumentListInfo &Args,
7584 const PrintingPolicy &Policy,
7585 const TemplateParameterList *TPL =
nullptr);
7589bool isSubstitutedDefaultArgument(ASTContext &Ctx, TemplateArgument Arg,
7590 const NamedDecl *Param,
7591 ArrayRef<TemplateArgument> Args,
7606class DependentNameType :
public TypeWithKeyword,
public llvm::FoldingSetNode {
7607 friend class ASTContext;
7610 NestedNameSpecifier NNS;
7613 const IdentifierInfo *Name;
7615 DependentNameType(ElaboratedTypeKeyword Keyword, NestedNameSpecifier NNS,
7616 const IdentifierInfo *Name, QualType CanonType)
7617 : TypeWithKeyword(
Keyword, DependentName, CanonType,
7621 NNS(NNS), Name(Name) {
7627 NestedNameSpecifier getQualifier()
const {
return NNS; }
7635 bool isSugared()
const {
return false; }
7636 QualType desugar()
const {
return QualType(
this, 0); }
7638 void Profile(llvm::FoldingSetNodeID &ID) {
7639 Profile(ID, getKeyword(), NNS, Name);
7642 static void Profile(llvm::FoldingSetNodeID &ID, ElaboratedTypeKeyword Keyword,
7643 NestedNameSpecifier NNS,
const IdentifierInfo *Name) {
7644 ID.AddInteger(llvm::to_underlying(Keyword));
7646 ID.AddPointer(Name);
7649 static bool classof(
const Type *T) {
7676class PackExpansionType :
public Type,
public llvm::FoldingSetNode {
7677 friend class ASTContext;
7682 PackExpansionType(QualType Pattern, QualType Canon,
7683 UnsignedOrNone NumExpansions)
7684 : Type(PackExpansion, Canon,
7689 PackExpansionTypeBits.NumExpansions =
7690 NumExpansions ? *NumExpansions + 1 : 0;
7697 QualType getPattern()
const {
return Pattern; }
7702 if (PackExpansionTypeBits.NumExpansions)
7703 return PackExpansionTypeBits.NumExpansions - 1;
7704 return std::nullopt;
7707 bool isSugared()
const {
return false; }
7708 QualType desugar()
const {
return QualType(
this, 0); }
7710 void Profile(llvm::FoldingSetNodeID &ID) {
7711 Profile(ID, getPattern(), getNumExpansions());
7714 static void Profile(llvm::FoldingSetNodeID &ID, QualType Pattern,
7715 UnsignedOrNone NumExpansions) {
7716 ID.AddPointer(Pattern.getAsOpaquePtr());
7717 ID.AddInteger(NumExpansions.toInternalRepresentation());
7720 static bool classof(
const Type *T) {
7728class ObjCProtocolQualifiers {
7730 ObjCProtocolQualifiers() =
default;
7732 ObjCProtocolDecl *
const *getProtocolStorage()
const {
7733 return const_cast<ObjCProtocolQualifiers*
>(
this)->getProtocolStorage();
7736 ObjCProtocolDecl **getProtocolStorage() {
7737 return static_cast<T*
>(
this)->getProtocolStorageImpl();
7740 void setNumProtocols(
unsigned N) {
7741 static_cast<T*
>(
this)->setNumProtocolsImpl(N);
7744 void initialize(ArrayRef<ObjCProtocolDecl *> protocols) {
7745 setNumProtocols(protocols.size());
7746 assert(getNumProtocols() == protocols.size() &&
7747 "bitfield overflow in protocol count");
7748 if (!protocols.empty())
7749 memcpy(getProtocolStorage(), protocols.data(),
7750 protocols.size() *
sizeof(ObjCProtocolDecl*));
7754 using qual_iterator = ObjCProtocolDecl *
const *;
7755 using qual_range = llvm::iterator_range<qual_iterator>;
7757 qual_range quals()
const {
return qual_range(qual_begin(), qual_end()); }
7758 qual_iterator qual_begin()
const {
return getProtocolStorage(); }
7759 qual_iterator qual_end()
const {
return qual_begin() + getNumProtocols(); }
7761 bool qual_empty()
const {
return getNumProtocols() == 0; }
7765 unsigned getNumProtocols()
const {
7766 return static_cast<const T*
>(
this)->getNumProtocolsImpl();
7770 ObjCProtocolDecl *getProtocol(
unsigned I)
const {
7771 assert(I < getNumProtocols() &&
"Out-of-range protocol access");
7772 return qual_begin()[I];
7776 ArrayRef<ObjCProtocolDecl *> getProtocols()
const {
7777 return ArrayRef<ObjCProtocolDecl *>(qual_begin(), getNumProtocols());
7783class ObjCTypeParamType :
public Type,
7784 public ObjCProtocolQualifiers<ObjCTypeParamType>,
7785 public llvm::FoldingSetNode {
7786 friend class ASTContext;
7787 friend class ObjCProtocolQualifiers<ObjCTypeParamType>;
7790 unsigned NumProtocols : 6;
7792 ObjCTypeParamDecl *OTPDecl;
7797 ObjCProtocolDecl **getProtocolStorageImpl();
7801 unsigned getNumProtocolsImpl()
const {
7802 return NumProtocols;
7805 void setNumProtocolsImpl(
unsigned N) {
7809 ObjCTypeParamType(
const ObjCTypeParamDecl *D,
7811 ArrayRef<ObjCProtocolDecl *> protocols);
7814 bool isSugared()
const {
return true; }
7815 QualType desugar()
const {
return getCanonicalTypeInternal(); }
7817 static bool classof(
const Type *T) {
7821 void Profile(llvm::FoldingSetNodeID &ID);
7822 static void Profile(llvm::FoldingSetNodeID &ID,
7823 const ObjCTypeParamDecl *OTPDecl,
7824 QualType CanonicalType,
7825 ArrayRef<ObjCProtocolDecl *> protocols);
7827 ObjCTypeParamDecl *getDecl()
const {
return OTPDecl; }
7858class ObjCObjectType :
public Type,
7859 public ObjCProtocolQualifiers<ObjCObjectType> {
7860 friend class ObjCProtocolQualifiers<ObjCObjectType>;
7878 mutable llvm::PointerIntPair<const ObjCObjectType *, 1, bool>
7879 CachedSuperClassType;
7881 QualType *getTypeArgStorage();
7882 const QualType *getTypeArgStorage()
const {
7883 return const_cast<ObjCObjectType *
>(
this)->getTypeArgStorage();
7886 ObjCProtocolDecl **getProtocolStorageImpl();
7889 unsigned getNumProtocolsImpl()
const {
7890 return ObjCObjectTypeBits.NumProtocols;
7892 void setNumProtocolsImpl(
unsigned N) {
7893 ObjCObjectTypeBits.NumProtocols = N;
7897 enum Nonce_ObjCInterface { Nonce_ObjCInterface };
7899 ObjCObjectType(QualType Canonical, QualType Base,
7900 ArrayRef<QualType> typeArgs,
7901 ArrayRef<ObjCProtocolDecl *> protocols,
7904 ObjCObjectType(
enum Nonce_ObjCInterface)
7906 BaseType(QualType(this_(), 0)) {
7907 ObjCObjectTypeBits.NumProtocols = 0;
7908 ObjCObjectTypeBits.NumTypeArgs = 0;
7909 ObjCObjectTypeBits.IsKindOf = 0;
7912 void computeSuperClassTypeSlow()
const;
7923 bool isObjCId()
const {
7924 return getBaseType()->isSpecificBuiltinType(BuiltinType::ObjCId);
7927 bool isObjCClass()
const {
7928 return getBaseType()->isSpecificBuiltinType(BuiltinType::ObjCClass);
7931 bool isObjCUnqualifiedId()
const {
return qual_empty() && isObjCId(); }
7932 bool isObjCUnqualifiedClass()
const {
return qual_empty() && isObjCClass(); }
7933 bool isObjCUnqualifiedIdOrClass()
const {
7934 if (!qual_empty())
return false;
7935 if (
const BuiltinType *T =
getBaseType()->getAs<BuiltinType>())
7936 return T->getKind() == BuiltinType::ObjCId ||
7937 T->getKind() == BuiltinType::ObjCClass;
7940 bool isObjCQualifiedId()
const {
return !qual_empty() && isObjCId(); }
7941 bool isObjCQualifiedClass()
const {
return !qual_empty() && isObjCClass(); }
7945 ObjCInterfaceDecl *getInterface()
const;
7949 bool isSpecialized()
const;
7952 bool isSpecializedAsWritten()
const {
7953 return ObjCObjectTypeBits.NumTypeArgs > 0;
7958 bool isUnspecialized()
const {
return !isSpecialized(); }
7962 bool isUnspecializedAsWritten()
const {
return !isSpecializedAsWritten(); }
7965 ArrayRef<QualType> getTypeArgs()
const;
7969 ArrayRef<QualType> getTypeArgsAsWritten()
const {
7970 return {getTypeArgStorage(), ObjCObjectTypeBits.NumTypeArgs};
7974 bool isKindOfTypeAsWritten()
const {
return ObjCObjectTypeBits.IsKindOf; }
7977 bool isKindOfType()
const;
7985 QualType getSuperClassType()
const {
7986 if (!CachedSuperClassType.getInt())
7987 computeSuperClassTypeSlow();
7989 assert(CachedSuperClassType.getInt() &&
"Superclass not set?");
7990 return QualType(CachedSuperClassType.getPointer(), 0);
7995 QualType stripObjCKindOfTypeAndQuals(
const ASTContext &ctx)
const;
7997 bool isSugared()
const {
return false; }
7998 QualType desugar()
const {
return QualType(
this, 0); }
8000 static bool classof(
const Type *T) {
8010class ObjCObjectTypeImpl :
public ObjCObjectType,
public llvm::FoldingSetNode {
8011 friend class ASTContext;
8016 ObjCObjectTypeImpl(QualType Canonical, QualType Base,
8017 ArrayRef<QualType> typeArgs,
8018 ArrayRef<ObjCProtocolDecl *> protocols,
8020 : ObjCObjectType(Canonical,
Base, typeArgs, protocols, isKindOf) {}
8023 void Profile(llvm::FoldingSetNodeID &ID);
8024 static void Profile(llvm::FoldingSetNodeID &ID,
8026 ArrayRef<QualType> typeArgs,
8027 ArrayRef<ObjCProtocolDecl *> protocols,
8031inline QualType *ObjCObjectType::getTypeArgStorage() {
8032 return reinterpret_cast<QualType *
>(
static_cast<ObjCObjectTypeImpl*
>(
this)+1);
8035inline ObjCProtocolDecl **ObjCObjectType::getProtocolStorageImpl() {
8036 return reinterpret_cast<ObjCProtocolDecl**
>(
8037 getTypeArgStorage() + ObjCObjectTypeBits.NumTypeArgs);
8040inline ObjCProtocolDecl **ObjCTypeParamType::getProtocolStorageImpl() {
8041 return reinterpret_cast<ObjCProtocolDecl**
>(
8042 static_cast<ObjCTypeParamType*
>(
this)+1);
8076 return T->getTypeClass() == ObjCInterface;
8092inline ObjCInterfaceDecl *ObjCObjectType::getInterface()
const {
8093 QualType baseType = getBaseType();
8095 if (
const auto *T = dyn_cast<ObjCInterfaceType>(ObjT))
8096 return T->getDecl();
8098 baseType = ObjT->getBaseType();
8113class ObjCObjectPointerType :
public Type,
public llvm::FoldingSetNode {
8120 PointeeType(Pointee) {}
8263 QualType getSuperClassType()
const;
8275 ID.AddPointer(
T.getAsOpaquePtr());
8279 return T->getTypeClass() == ObjCObjectPointer;
8283class AtomicType :
public Type,
public llvm::FoldingSetNode {
8304 ID.AddPointer(
T.getAsOpaquePtr());
8308 return T->getTypeClass() ==
Atomic;
8313class PipeType :
public Type,
public llvm::FoldingSetNode {
8321 ElementType(elemType), isRead(isRead) {}
8335 ID.AddPointer(
T.getAsOpaquePtr());
8336 ID.AddBoolean(isRead);
8340 return T->getTypeClass() ==
Pipe;
8349 LLVM_PREFERRED_TYPE(
bool)
8350 unsigned IsUnsigned : 1;
8351 unsigned NumBits : 24;
8368 static void Profile(llvm::FoldingSetNodeID &ID,
bool IsUnsigned,
8370 ID.AddBoolean(IsUnsigned);
8371 ID.AddInteger(NumBits);
8379 llvm::PointerIntPair<Expr*, 1, bool> ExprAndUnsigned;
8387 Expr *getNumBitsExpr()
const;
8395 static void Profile(llvm::FoldingSetNodeID &ID,
const ASTContext &Context,
8396 bool IsUnsigned,
Expr *NumBitsExpr);
8399 return T->getTypeClass() == DependentBitInt;
8403class PredefinedSugarType final :
public Type {
8416 static StringRef getName(Kind KD);
8430 return T->getTypeClass() == PredefinedSugar;
8444 if (!
type.hasLocalNonFastQualifiers())
8445 return type.getTypePtrUnsafe();
8466class alignas(8) TypeSourceInfo {
8473 TypeSourceInfo(
QualType ty,
size_t DataSize);
8490 Ty->getLocallyUnqualifiedSingleStepDesugaredType().split();
8496 return getCommonPtr()->BaseType;
8500 return (
isNull() ?
nullptr : getCommonPtr()->BaseType);
8508 if (
Self.isObjectType() ||
Self.isReferenceType())
8511 return F->getMethodQuals().empty() && F->getRefQualifier() ==
RQ_None;
8521 const ExtQuals *eq = getExtQualsUnsafe();
8530 Quals = getExtQualsUnsafe()->getQualifiers();
8536 Qualifiers quals = getCommonPtr()->CanonicalType.getLocalQualifiers();
8542 unsigned cvr = getCommonPtr()->CanonicalType.getLocalCVRQualifiers();
8548 QualType canon = getCommonPtr()->CanonicalType;
8553 return getTypePtr()->isCanonicalUnqualified();
8561 if (
T->isVariablyModifiedType() &&
T->hasSizedVLAType())
8570 getCommonPtr()->CanonicalType.isLocalConstQualified();
8575 getCommonPtr()->CanonicalType.isLocalRestrictQualified();
8581 getCommonPtr()->CanonicalType.isLocalVolatileQualified();
8586 getCommonPtr()->CanonicalType.hasLocalQualifiers();
8593 return QualType(getSplitUnqualifiedTypeImpl(*this).Ty, 0);
8600 return getSplitUnqualifiedTypeImpl(*
this);
8632 if (
const auto *FT = PT->getPointeeType()->getAs<
FunctionType>())
8633 return FT->getExtInfo();
8635 return FT->getExtInfo();
8682 return RefType->getPointeeType();
8773 return !
T->getPointeeType()->isFunctionType();
8780 return Fn->hasCFIUncheckedCallee();
8801 return T->getPointeeType()->isFunctionType();
8808 return T->getPointeeType()->isFunctionType();
8819 return T->isMemberFunctionPointer();
8826 return T->isMemberDataPointer();
8886 if (
auto *CMT = dyn_cast<ConstantMatrixType>(CanonicalType))
8887 return CMT->getElementType()->isBooleanType();
8934 return OPT->isObjCQualifiedIdType();
8940 return OPT->isObjCQualifiedClassType();
8946 return OPT->isObjCIdType();
8952 return OPT->isObjCClassType();
8958 return OPT->getPointeeType()->isSpecificBuiltinType(BuiltinType::ObjCSel);
8970#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
8971 inline bool Type::is##Id##Type() const { \
8972 return isSpecificBuiltinType(BuiltinType::Id); \
8974#include "clang/Basic/OpenCLImageTypes.def"
8997#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) is##Id##Type() ||
8999#include "clang/Basic/OpenCLImageTypes.def"
9011#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
9012 inline bool Type::is##Id##Type() const { \
9013 return isSpecificBuiltinType(BuiltinType::Id); \
9015#include "clang/Basic/OpenCLExtensionTypes.def"
9018#define INTEL_SUBGROUP_AVC_TYPE(ExtType, Id) \
9019 isOCLIntelSubgroupAVC##Id##Type() ||
9021#include "clang/Basic/OpenCLExtensionTypes.def"
9026#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) is##Id##Type() ||
9028#include "clang/Basic/OpenCLExtensionTypes.def"
9037#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) \
9038 inline bool Type::is##Id##Type() const { \
9039 return isSpecificBuiltinType(BuiltinType::Id); \
9041#include "clang/Basic/HLSLIntangibleTypes.def"
9044#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) is##Id##Type() ||
9046#include "clang/Basic/HLSLIntangibleTypes.def"
9075 if (
const auto *BT = dyn_cast<BuiltinType>(
this))
9076 return BT->isPlaceholderType();
9081 if (
const auto *BT = dyn_cast<BuiltinType>(
this))
9082 if (BT->isPlaceholderType())
9093 if (
const auto *BT = dyn_cast<BuiltinType>(
this))
9094 return BT->isNonOverloadPlaceholderType();
9143 if (
const auto *BT = dyn_cast<BuiltinType>(CanonicalType))
9144 return BT->isInteger();
9145 if (
const EnumType *ET = dyn_cast<EnumType>(CanonicalType)) {
9152 if (
const auto *OT = dyn_cast<OverflowBehaviorType>(CanonicalType))
9153 return OT->getUnderlyingType()->isIntegerType();
9159 if (
const auto *BT = dyn_cast<BuiltinType>(CanonicalType)) {
9160 return BT->getKind() >= BuiltinType::ShortAccum &&
9161 BT->getKind() <= BuiltinType::SatULongFract;
9175 if (
const auto *BT = dyn_cast<BuiltinType>(CanonicalType)) {
9176 return BT->getKind() >= BuiltinType::SatShortAccum &&
9177 BT->getKind() <= BuiltinType::SatULongFract;
9187 if (
const auto *BT = dyn_cast<BuiltinType>(CanonicalType)) {
9188 return ((BT->getKind() >= BuiltinType::ShortAccum &&
9189 BT->getKind() <= BuiltinType::LongAccum) ||
9190 (BT->getKind() >= BuiltinType::ShortFract &&
9191 BT->getKind() <= BuiltinType::LongFract) ||
9192 (BT->getKind() >= BuiltinType::SatShortAccum &&
9193 BT->getKind() <= BuiltinType::SatLongAccum) ||
9194 (BT->getKind() >= BuiltinType::SatShortFract &&
9195 BT->getKind() <= BuiltinType::SatLongFract));
9205 if (
const auto *BT = dyn_cast<BuiltinType>(CanonicalType))
9206 return BT->getKind() > BuiltinType::Void &&
9207 BT->getKind() <= BuiltinType::NullPtr;
9208 if (
const EnumType *ET = dyn_cast<EnumType>(CanonicalType))
9221 if (
const auto *BT = dyn_cast<BuiltinType>(CanonicalType))
9222 return BT->isInteger();
9226 if (
const auto *ET = dyn_cast<EnumType>(CanonicalType))
9229 if (
const auto *OBT = dyn_cast<OverflowBehaviorType>(CanonicalType))
9230 return OBT->getUnderlyingType()->isIntegralOrEnumerationType();
9236 if (
const auto *BT = dyn_cast<BuiltinType>(CanonicalType))
9237 return BT->getKind() == BuiltinType::Bool;
9243 return DT && !DT->isDeduced();
9260 return TST->isTypeAlias();
9287 if (
type->isAnyPointerType())
9288 return type->getPointeeType().getTypePtr();
9289 else if (
type->isArrayType())
9290 return type->getBaseElementTypeUnsafe();
9315 PD.
AddTaggedVal(
reinterpret_cast<uint64_t
>(
T.getAsOpaquePtr()),
9327 "ArrayType cannot be used with getAs!");
9330 if (
const auto *Ty = dyn_cast<T>(
this))
9334 if (!
isa<T>(CanonicalType))
9346 if (
const auto *Ty = dyn_cast<T>(
this))
9350 if (!
isa<T>(CanonicalType))
9355 const Type *Ty =
this;
9357 if (
const auto *A = dyn_cast<AttributedType>(Ty))
9358 Ty = A->getModifiedType().getTypePtr();
9359 else if (
const auto *A = dyn_cast<BTFTagAttributedType>(Ty))
9360 Ty = A->getWrappedType().getTypePtr();
9361 else if (
const auto *A = dyn_cast<HLSLAttributedResourceType>(Ty))
9362 Ty = A->getWrappedType().getTypePtr();
9363 else if (
const auto *P = dyn_cast<ParenType>(Ty))
9364 Ty = P->desugar().getTypePtr();
9365 else if (
const auto *A = dyn_cast<AdjustedType>(Ty))
9366 Ty = A->desugar().getTypePtr();
9367 else if (
const auto *M = dyn_cast<MacroQualifiedType>(Ty))
9368 Ty = M->desugar().getTypePtr();
9375 return dyn_cast<T>(Ty);
9380 if (
const auto *arr = dyn_cast<ArrayType>(
this))
9394 "ArrayType cannot be used with castAs!");
9396 if (
const auto *ty = dyn_cast<T>(
this))
return ty;
9397 assert(
isa<T>(CanonicalType));
9403 if (
const auto *arr = dyn_cast<ArrayType>(
this))
return arr;
9409 :
AdjustedType(Decayed, OriginalType, DecayedPtr, CanonicalPtr) {
9411 QualType Adjusted = getAdjustedType();
9412 (void)AttributedType::stripOuterNullability(Adjusted);
9419 (void)AttributedType::stripOuterNullability(Decayed);
9434 TypePtr = Pointee.getTypePtr();
9440 if (
const auto *FPT = TypePtr->
getAs<FunctionProtoType>())
9441 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.
Result
Implement __builtin_bit_cast and related operations.
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)
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...
QualType getWrappedType() const
LateParsedTypeAttribute * getLateParsedAttribute() const
static bool classof(const Type *T)
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...
bool hasPostfixDeclaratorSyntax() const
Returns true if the type uses postfix declarator syntax, i.e.
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.
bool requiresBuiltinLaunder(const ASTContext &Context) const
Returns true if this type requires laundering by checking if it is a dynamic class 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
static constexpr unsigned TemplateTypeParmTypeDepthBits
@ 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.
static constexpr unsigned TemplateTypeParmTypeIndexBits
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
@ 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.
OptionalUnsigned< unsigned > UnsignedOrNone
const FunctionProtoType * T
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)
OptionalUnsigned< NullabilityKind > NullabilityKindOrNone
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...
__packed_splat4 __packed_splat2 __packed_splat8 __packed_splat4 __packed_splat2 uint8_t
__packed_splat4 __packed_splat2 __packed_splat8 __packed_splat4 __packed_splat2 __packed_splat4 uint16_t
__packed_splat4 __packed_splat2 __packed_splat8 __packed_splat4 __packed_splat2 __packed_splat4 __packed_splat2 __packed_splat8 __packed_splat4 uint32_t
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.
A late-parsed attribute that will be applied as a type attribute.
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