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);
1667raw_ostream &
operator<<(raw_ostream &OS, QualType QT);
1705class ExtQualsTypeCommonBase {
1716 const Type *
const BaseType;
1721 ExtQualsTypeCommonBase(
const Type *baseType,
QualType canon)
1722 : BaseType(baseType), CanonicalType(canon) {}
1735class alignas(TypeAlignment)
ExtQuals :
public ExtQualsTypeCommonBase,
1736 public llvm::FoldingSetNode {
1758 : ExtQualsTypeCommonBase(baseType,
1759 canon.isNull() ?
QualType(this_(), 0) : canon),
1761 assert(Quals.hasNonFastQualifiers()
1762 &&
"ExtQuals created with no fast qualifiers");
1763 assert(!Quals.hasFastQualifiers()
1764 &&
"ExtQuals created with fast qualifiers");
1774 return Quals.getObjCLifetime();
1788 const Type *BaseType,
1790 assert(!Quals.hasFastQualifiers() &&
"fast qualifiers in ExtQuals hash!");
1791 ID.AddPointer(BaseType);
1849enum class ArraySizeModifier;
1850enum class ElaboratedTypeKeyword;
1851enum class VectorKind;
1879class alignas(TypeAlignment)
Type :
public ExtQualsTypeCommonBase {
1882#define TYPE(Class, Base) Class,
1883#define LAST_TYPE(Class) TypeLast = Class
1884#define ABSTRACT_TYPE(Class, Base)
1885#include "clang/AST/TypeNodes.inc"
1890 class TypeBitfields {
1892 template <
class T>
friend class TypePropertyCache;
1895 LLVM_PREFERRED_TYPE(TypeClass)
1900 unsigned Dependence : llvm::BitWidth<TypeDependence>;
1904 LLVM_PREFERRED_TYPE(
bool)
1905 mutable unsigned CacheValid : 1;
1909 mutable unsigned CachedLinkage : 3;
1912 LLVM_PREFERRED_TYPE(
bool)
1913 mutable unsigned CachedLocalOrUnnamed : 1;
1916 LLVM_PREFERRED_TYPE(
bool)
1917 mutable unsigned FromAST : 1;
1919 bool isCacheValid()
const {
1924 assert(isCacheValid() &&
"getting linkage from invalid cache");
1925 return static_cast<Linkage>(CachedLinkage);
1928 bool hasLocalOrUnnamedType()
const {
1929 assert(isCacheValid() &&
"getting linkage from invalid cache");
1930 return CachedLocalOrUnnamed;
1933 enum { NumTypeBits = 8 + llvm::BitWidth<TypeDependence> + 6 };
1942 LLVM_PREFERRED_TYPE(TypeBitfields)
1948 unsigned IndexTypeQuals : 3;
1953 unsigned SizeModifier : 3;
1964 LLVM_PREFERRED_TYPE(
bool)
1965 unsigned HasExternalSize : 1;
1967 LLVM_PREFERRED_TYPE(
unsigned)
1968 unsigned SizeWidth : 5;
1974 LLVM_PREFERRED_TYPE(TypeBitfields)
1978 static constexpr unsigned NumOfBuiltinTypeBits = 10;
1979 unsigned Kind : NumOfBuiltinTypeBits;
1994 LLVM_PREFERRED_TYPE(TypeBitfields)
2001 unsigned RefQualifier : 2;
2012 LLVM_PREFERRED_TYPE(
bool)
2013 unsigned HasExtQuals : 1;
2017 unsigned ExceptionSpecType : 4;
2020 LLVM_PREFERRED_TYPE(
bool)
2021 unsigned HasExtParameterInfos : 1;
2024 LLVM_PREFERRED_TYPE(
bool)
2025 unsigned HasExtraBitfields : 1;
2028 LLVM_PREFERRED_TYPE(
bool)
2029 unsigned Variadic : 1;
2032 LLVM_PREFERRED_TYPE(
bool)
2033 unsigned HasTrailingReturn : 1;
2036 LLVM_PREFERRED_TYPE(
bool)
2037 unsigned CFIUncheckedCallee : 1;
2042 unsigned ExtInfo : 14;
2054 LLVM_PREFERRED_TYPE(TypeBitfields)
2058 unsigned NumTypeArgs : 7;
2061 unsigned NumProtocols : 6;
2064 LLVM_PREFERRED_TYPE(
bool)
2065 unsigned IsKindOf : 1;
2071 LLVM_PREFERRED_TYPE(TypeBitfields)
2085 LLVM_PREFERRED_TYPE(
bool)
2086 unsigned SpelledAsLValue : 1;
2090 LLVM_PREFERRED_TYPE(
bool)
2091 unsigned InnerRef : 1;
2097 LLVM_PREFERRED_TYPE(TypeBitfields)
2102 unsigned Keyword : 8;
2114 LLVM_PREFERRED_TYPE(
bool)
2115 unsigned HasQualifier : 1;
2118 LLVM_PREFERRED_TYPE(
bool)
2119 unsigned OwnsTag : 1;
2122 LLVM_PREFERRED_TYPE(
bool)
2123 unsigned IsInjected : 1;
2130 LLVM_PREFERRED_TYPE(TypeBitfields)
2136 unsigned VecKind : 6;
2144 LLVM_PREFERRED_TYPE(TypeBitfields)
2148 unsigned AttrKind : 32 - NumTypeBits;
2174 unsigned Keyword : 2;
2190 LLVM_PREFERRED_TYPE(TypeBitfields)
2203 LLVM_PREFERRED_TYPE(
bool)
2204 unsigned hasQualifier : 1;
2214 LLVM_PREFERRED_TYPE(
bool)
2215 unsigned hasQualifier : 1;
2225 LLVM_PREFERRED_TYPE(
bool)
2226 unsigned hasQualifier : 1;
2229 LLVM_PREFERRED_TYPE(
bool)
2230 unsigned hasTypeDifferentFromDecl : 1;
2239 LLVM_PREFERRED_TYPE(TypeBitfields)
2246 LLVM_PREFERRED_TYPE(
bool)
2247 unsigned ParameterPack : 1;
2256 LLVM_PREFERRED_TYPE(TypeBitfields)
2259 LLVM_PREFERRED_TYPE(
bool)
2260 unsigned HasNonCanonicalUnderlyingType : 1;
2263 unsigned Index : 15;
2265 LLVM_PREFERRED_TYPE(
bool)
2273 unsigned PackIndex : 16;
2280 LLVM_PREFERRED_TYPE(TypeBitfields)
2287 unsigned NumArgs : 16;
2293 unsigned SubstTemplTypeParmPackIndex : 16;
2303 LLVM_PREFERRED_TYPE(
bool)
2304 unsigned TypeAlias : 1;
2319 LLVM_PREFERRED_TYPE(TypeBitfields)
2333 unsigned NumExpansions;
2353 LLVM_PREFERRED_TYPE(TypeBitfields)
2363 LLVM_PREFERRED_TYPE(TypeBitfields)
2366 static constexpr unsigned NumCoupledDeclsBits = 4;
2367 unsigned NumCoupledDecls : NumCoupledDeclsBits;
2368 LLVM_PREFERRED_TYPE(
bool)
2369 unsigned CountInBytes : 1;
2370 LLVM_PREFERRED_TYPE(
bool)
2371 unsigned OrNull : 1;
2406 void setFromAST(
bool V =
true)
const {
2414 : ExtQualsTypeCommonBase(this,
2416 static_assert(
sizeof(*this) <=
2417 alignof(
decltype(*this)) +
sizeof(ExtQualsTypeCommonBase),
2418 "changing bitfields changed sizeof(Type)!");
2419 static_assert(
alignof(
decltype(*this)) %
TypeAlignment == 0,
2420 "Insufficient alignment!");
2424 TypeBits.CachedLocalOrUnnamed =
false;
2433 TypeBits.Dependence =
static_cast<unsigned>(D);
2476 return CanonicalType ==
QualType(
this, 0);
2482 QualType getLocallyUnqualifiedSingleStepDesugaredType()
const;
2490 bool isSizelessType()
const;
2491 bool isSizelessBuiltinType()
const;
2494 bool isSizelessVectorType()
const;
2497 bool isSVESizelessBuiltinType()
const;
2500 bool isRVVSizelessBuiltinType()
const;
2503 bool isWebAssemblyExternrefType()
const;
2508 bool isWebAssemblyTableType()
const;
2513 bool isSveVLSBuiltinType()
const;
2523 bool isRVVVLSBuiltinType()
const;
2545 bool isIncompleteType(
NamedDecl **Def =
nullptr)
const;
2571 bool isAlwaysIncompleteType()
const;
2583 bool isLiteralType(
const ASTContext &Ctx)
const;
2586 bool isStructuralType()
const;
2590 bool isStandardLayoutType()
const;
2596 bool isBuiltinType()
const;
2599 bool isSpecificBuiltinType(
unsigned K)
const;
2604 bool isPlaceholderType()
const;
2608 bool isSpecificPlaceholderType(
unsigned K)
const;
2612 bool isNonOverloadPlaceholderType()
const;
2616 bool isIntegerType()
const;
2617 bool isEnumeralType()
const;
2620 bool isScopedEnumeralType()
const;
2622 bool isCharType()
const;
2623 bool isWideCharType()
const;
2624 bool isChar8Type()
const;
2625 bool isChar16Type()
const;
2626 bool isChar32Type()
const;
2627 bool isAnyCharacterType()
const;
2628 bool isUnicodeCharacterType()
const;
2629 bool isIntegralType(
const ASTContext &Ctx)
const;
2632 bool isIntegralOrEnumerationType()
const;
2635 bool isIntegralOrUnscopedEnumerationType()
const;
2636 bool isUnscopedEnumerationType()
const;
2639 bool isRealFloatingType()
const;
2642 bool isComplexType()
const;
2643 bool isAnyComplexType()
const;
2644 bool isFloatingType()
const;
2645 bool isHalfType()
const;
2646 bool isFloat16Type()
const;
2647 bool isFloat32Type()
const;
2648 bool isDoubleType()
const;
2649 bool isBFloat16Type()
const;
2650 bool isMFloat8Type()
const;
2651 bool isFloat128Type()
const;
2652 bool isIbm128Type()
const;
2653 bool isRealType()
const;
2654 bool isArithmeticType()
const;
2655 bool isVoidType()
const;
2656 bool isScalarType()
const;
2657 bool isAggregateType()
const;
2658 bool isFundamentalType()
const;
2659 bool isCompoundType()
const;
2663 bool isFunctionType()
const;
2666 bool isPointerType()
const;
2667 bool isPointerOrReferenceType()
const;
2668 bool isSignableType(
const ASTContext &Ctx)
const;
2669 bool isSignablePointerType()
const;
2670 bool isSignableIntegerType(
const ASTContext &Ctx)
const;
2671 bool isAnyPointerType()
const;
2672 bool isCountAttributedType()
const;
2673 bool isCFIUncheckedCalleeFunctionType()
const;
2674 bool hasPointeeToCFIUncheckedCalleeFunctionType()
const;
2675 bool isBlockPointerType()
const;
2676 bool isVoidPointerType()
const;
2677 bool isReferenceType()
const;
2678 bool isLValueReferenceType()
const;
2679 bool isRValueReferenceType()
const;
2680 bool isObjectPointerType()
const;
2681 bool isFunctionPointerType()
const;
2682 bool isFunctionReferenceType()
const;
2683 bool isMemberPointerType()
const;
2684 bool isMemberFunctionPointerType()
const;
2685 bool isMemberDataPointerType()
const;
2686 bool isArrayType()
const;
2687 bool isConstantArrayType()
const;
2688 bool isIncompleteArrayType()
const;
2689 bool isVariableArrayType()
const;
2690 bool isArrayParameterType()
const;
2691 bool isDependentSizedArrayType()
const;
2693 bool isClassType()
const;
2694 bool isStructureType()
const;
2695 bool isStructureTypeWithFlexibleArrayMember()
const;
2696 bool isObjCBoxableRecordType()
const;
2697 bool isInterfaceType()
const;
2698 bool isStructureOrClassType()
const;
2699 bool isUnionType()
const;
2700 bool isComplexIntegerType()
const;
2701 bool isVectorType()
const;
2702 bool isExtVectorType()
const;
2703 bool isExtVectorBoolType()
const;
2704 bool isConstantMatrixBoolType()
const;
2707 bool isPackedVectorBoolType(
const ASTContext &ctx)
const;
2708 bool isSubscriptableVectorType()
const;
2710 bool isConstantMatrixType()
const;
2711 bool isOverflowBehaviorType()
const;
2712 bool isDependentAddressSpaceType()
const;
2713 bool isObjCObjectPointerType()
const;
2714 bool isObjCRetainableType()
const;
2715 bool isObjCLifetimeType()
const;
2716 bool isObjCIndirectLifetimeType()
const;
2717 bool isObjCNSObjectType()
const;
2718 bool isObjCIndependentClassType()
const;
2721 bool isObjCObjectType()
const;
2722 bool isObjCQualifiedInterfaceType()
const;
2723 bool isObjCQualifiedIdType()
const;
2724 bool isObjCQualifiedClassType()
const;
2725 bool isObjCObjectOrInterfaceType()
const;
2726 bool isObjCIdType()
const;
2727 bool isDecltypeType()
const;
2735 return hasAttr(attr::ObjCInertUnsafeUnretained);
2745 bool isObjCIdOrObjectKindOfType(
const ASTContext &ctx,
2748 bool isObjCClassType()
const;
2756 bool isObjCClassOrClassKindOfType()
const;
2758 bool isBlockCompatibleObjCPointerType(
ASTContext &ctx)
const;
2759 bool isObjCSelType()
const;
2760 bool isObjCBuiltinType()
const;
2761 bool isObjCARCBridgableType()
const;
2762 bool isCARCBridgableType()
const;
2763 bool isTemplateTypeParmType()
const;
2764 bool isNullPtrType()
const;
2766 bool isNothrowT()
const;
2767 bool isAlignValT()
const;
2768 bool isStdByteType()
const;
2769 bool isAtomicType()
const;
2770 bool isUndeducedAutoType()
const;
2772 bool isTypedefNameType()
const;
2773 bool isMetaInfoType()
const;
2775#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
2776 bool is##Id##Type() const;
2777#include "clang/Basic/OpenCLImageTypes.def"
2779 bool isImageType()
const;
2781 bool isSamplerT()
const;
2782 bool isEventT()
const;
2783 bool isClkEventT()
const;
2784 bool isQueueT()
const;
2785 bool isReserveIDT()
const;
2787#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
2788 bool is##Id##Type() const;
2789#include "clang/Basic/OpenCLExtensionTypes.def"
2791 bool isOCLIntelSubgroupAVCType()
const;
2792 bool isOCLExtOpaqueType()
const;
2794 bool isPipeType()
const;
2795 bool isBitIntType()
const;
2796 bool isOpenCLSpecificType()
const;
2798#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) bool is##Id##Type() const;
2799#include "clang/Basic/HLSLIntangibleTypes.def"
2800#define HLSL_PACKED_TYPE(Name, Id, SingletonId) bool is##Id##Type() const;
2801#include "clang/Basic/HLSLPackedTypes.def"
2802 bool isHLSLSpecificType()
const;
2803 bool isHLSLBuiltinIntangibleType()
const;
2804 bool isHLSLBuiltinPackedType()
const;
2805 bool isHLSLAttributedResourceType()
const;
2806 bool isHLSLInlineSpirvType()
const;
2807 bool isHLSLResourceRecord()
const;
2808 bool isHLSLResourceRecordArray()
const;
2810 bool isHLSLIntangibleType()
const;
2812 bool isHLSLStandardLayoutRecordOrArrayOf()
const;
2814#define SPIRV_TYPE(Name, Id, SingletonId) bool is##Id##Type() const;
2815#include "clang/Basic/SPIRVTypes.def"
2820 bool isObjCARCImplicitlyUnretainedType()
const;
2823 bool isCUDADeviceBuiltinSurfaceType()
const;
2825 bool isCUDADeviceBuiltinTextureType()
const;
2828 bool isAMDGPUNamedBarrierType()
const;
2831 bool isAMDGPUNamedBarrierTypeOrWrapper()
const;
2834 Qualifiers::ObjCLifetime getObjCARCImplicitLifetime()
const;
2850 ScalarTypeKind getScalarTypeKind()
const;
2878 bool isUndeducedType()
const;
2887 bool hasSizedVLAType()
const;
2890 bool hasUnnamedOrLocalType()
const;
2892 bool isOverloadableType()
const;
2895 bool isElaboratedTypeSpecifier()
const;
2897 bool canDecayToPointerType()
const;
2902 bool hasPointerRepresentation()
const;
2906 bool hasObjCPointerRepresentation()
const;
2910 bool hasIntegerRepresentation()
const;
2914 bool hasSignedIntegerRepresentation()
const;
2918 bool hasUnsignedIntegerRepresentation()
const;
2922 bool hasFloatingRepresentation()
const;
2927 bool hasBooleanRepresentation()
const;
2932 const RecordType *getAsStructureType()
const;
2934 const RecordType *getAsUnionType()
const;
2935 const ComplexType *getAsComplexIntegerType()
const;
2956 inline EnumDecl *getAsEnumDecl()
const;
2957 inline EnumDecl *castAsEnumDecl()
const;
2962 inline TagDecl *getAsTagDecl()
const;
2963 inline TagDecl *castAsTagDecl()
const;
2975 DeducedType *getContainedDeducedType()
const;
2987 bool hasAutoForTrailingReturnType()
const;
2998 template <
typename T>
const T *getAs()
const;
3003 return dyn_cast<T>(CanonicalType);
3010 return cast<T>(CanonicalType);
3014#define TYPE(Class, Base)
3015#define NEVER_CANONICAL_TYPE(Class) \
3016 template <> inline const Class##Type *Type::getAsCanonical() const = delete; \
3017 template <> inline const Class##Type *Type::castAsCanonical() const = delete;
3018#include "clang/AST/TypeNodes.inc"
3024 const TemplateSpecializationType *
3025 getAsNonAliasTemplateSpecializationType()
const;
3027 const TemplateSpecializationType *
3030 assert(TST &&
"not a TemplateSpecializationType");
3039 template <
typename T>
const T *getAsAdjusted()
const;
3043 const ArrayType *getAsArrayTypeUnsafe()
const;
3051 template <
typename T>
const T *castAs()
const;
3055 const ArrayType *castAsArrayTypeUnsafe()
const;
3069 const Type *getBaseElementTypeUnsafe()
const;
3074 const Type *getArrayElementTypeNoTypeQual()
const;
3079 const Type *getPointeeOrArrayElementType()
const;
3087 const Type *getUnqualifiedDesugaredType()
const;
3092 bool isSignedIntegerType()
const;
3097 bool isUnsignedIntegerType()
const;
3101 bool isSignedIntegerOrEnumerationType()
const;
3105 bool isUnsignedIntegerOrEnumerationType()
const;
3109 bool isFixedPointType()
const;
3112 bool isFixedPointOrIntegerType()
const;
3115 bool isConvertibleToFixedPointType()
const;
3119 bool isSaturatedFixedPointType()
const;
3123 bool isUnsaturatedFixedPointType()
const;
3127 bool isSignedFixedPointType()
const;
3131 bool isUnsignedFixedPointType()
const;
3136 bool isConstantSizeType()
const;
3140 bool isSpecifierType()
const;
3160 bool isLinkageValid()
const;
3174 bool canHaveNullability(
bool ResultIfUnknown =
true)
const;
3191 std::optional<ArrayRef<QualType>>
3192 getObjCSubstitutions(
const DeclContext *dc)
const;
3196 bool acceptsObjCTypeParams()
const;
3198 const char *getTypeClassName()
const;
3201 return CanonicalType;
3206 void dump(llvm::raw_ostream &OS,
const ASTContext &Context)
const;
3233#define TYPE(Class, Base)
3234#define ALWAYS_CANONICAL_TYPE(Class) \
3235 template <> inline const Class##Type *Type::getAs() const { \
3236 return dyn_cast<Class##Type>(CanonicalType); \
3238 template <> inline const Class##Type *Type::castAs() const { \
3239 return cast<Class##Type>(CanonicalType); \
3241#include "clang/AST/TypeNodes.inc"
3249#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) Id,
3250#include "clang/Basic/OpenCLImageTypes.def"
3252#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) Id,
3253#include "clang/Basic/OpenCLExtensionTypes.def"
3255#define SVE_TYPE(Name, Id, SingletonId) Id,
3256#include "clang/Basic/AArch64ACLETypes.def"
3258#define PPC_VECTOR_TYPE(Name, Id, Size) Id,
3259#include "clang/Basic/PPCTypes.def"
3261#define RVV_TYPE(Name, Id, SingletonId) Id,
3262#include "clang/Basic/RISCVVTypes.def"
3264#define WASM_TYPE(Name, Id, SingletonId) Id,
3265#include "clang/Basic/WebAssemblyReferenceTypes.def"
3267#define AMDGPU_TYPE(Name, Id, SingletonId, Width, Align) Id,
3268#include "clang/Basic/AMDGPUTypes.def"
3270#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) Id,
3271#include "clang/Basic/HLSLIntangibleTypes.def"
3273#define HLSL_PACKED_TYPE(Name, Id, SingletonId) Id,
3274#include "clang/Basic/HLSLPackedTypes.def"
3276#define SPIRV_TYPE(Name, Id, SingletonId) Id,
3277#include "clang/Basic/SPIRVTypes.def"
3279#define BUILTIN_TYPE(Id, SingletonId) Id,
3280#define LAST_BUILTIN_TYPE(Id) LastKind = Id
3281#include "clang/AST/BuiltinTypes.def"
3291 static_assert(Kind::LastKind <
3292 (1 << BuiltinTypeBitfields::NumOfBuiltinTypeBits) &&
3293 "Defined builtin type exceeds the allocated space for serial "
3304 StringRef str =
getName(Policy);
3305 assert(!str.empty() && str.data()[str.size()] ==
'\0');
3362class ComplexType :
public Type,
public llvm::FoldingSetNode {
3369 ElementType(Element) {}
3383class ParenType :
public Type,
public llvm::FoldingSetNode {
3403class PointerType :
public Type,
public llvm::FoldingSetNode {
3410 PointeeType(Pointee) {}
3427 using BaseTy = llvm::PointerIntPair<ValueDecl *, 1, unsigned>;
3442 bool isDeref()
const;
3444 unsigned getInt()
const;
3445 void *getOpaqueValue()
const;
3447 void setFromOpaqueValue(
void *
V);
3492 bool referencesFieldDecls()
const;
3498 switch (
T->getTypeClass()) {
3499 case CountAttributed:
3525 bool CountInBytes,
bool OrNull,
3532 static CountAttributedType *
3534 Expr *CountExpr,
bool CountInBytes,
bool OrNull,
3558 static void Profile(llvm::FoldingSetNodeID &ID,
QualType WrappedTy,
3562 return T->getTypeClass() == CountAttributed;
3565 StringRef getAttributeName(
bool WithMacroPrefix)
const;
3577class LateParsedAttrType :
public Type {
3586 WrappedTy(Wrapped), LateParsedTypeAttr(
Attr) {}
3591 return LateParsedTypeAttr;
3598 return T->getTypeClass() == LateParsedAttr;
3614 :
Type(TC, CanonicalPtr,
3617 OriginalTy(OriginalTy), AdjustedTy(AdjustedTy) {}
3626 std::pair<QualType, QualType>
getKey()
const {
3627 return {OriginalTy, AdjustedTy};
3631 return T->getTypeClass() == Adjusted ||
T->getTypeClass() == Decayed;
3653class BlockPointerType :
public Type,
public llvm::FoldingSetNode {
3661 PointeeType(Pointee) {}
3673 return T->getTypeClass() == BlockPointer;
3683 bool SpelledAsLValue)
3685 PointeeType(Referencee) {
3703 while (
T->isInnerRef())
3705 return T->PointeeType;
3709 return T->getTypeClass() == LValueReference ||
3710 T->getTypeClass() == RValueReference;
3719 bool SpelledAsLValue)
3728 return T->getTypeClass() == LValueReference;
3744 return T->getTypeClass() == RValueReference;
3751class MemberPointerType :
public Type,
public llvm::FoldingSetNode {
3762 :
Type(MemberPointer, CanonicalPtr,
3766 PointeeType(Pointee), Qualifier(Qualifier) {}
3774 return PointeeType->isFunctionProtoType();
3780 return !PointeeType->isFunctionProtoType();
3789 bool isSugared()
const;
3801 static void Profile(llvm::FoldingSetNodeID &ID,
QualType Pointee,
3806 return T->getTypeClass() == MemberPointer;
3829 unsigned tq,
const Expr *sz =
nullptr);
3847 return T->getTypeClass() == ConstantArray ||
3848 T->getTypeClass() == VariableArray ||
3849 T->getTypeClass() == IncompleteArray ||
3850 T->getTypeClass() == DependentSizedArray ||
3851 T->getTypeClass() == ArrayParameter;
3861 struct ExternalSize {
3862 ExternalSize(
const llvm::APInt &Sz,
const Expr *SE)
3863 :
Size(Sz), SizeExpr(SE) {}
3865 const Expr *SizeExpr;
3876 ConstantArrayTypeBits.HasExternalSize =
false;
3877 ConstantArrayTypeBits.SizeWidth = Width / 8;
3880 assert(Width < 0xFF &&
"Type width in bits must be less than 8 bits");
3883 ConstantArrayType(QualType Et, QualType Can, ExternalSize *SzPtr,
3884 ArraySizeModifier SM,
unsigned TQ)
3885 : ArrayType(ConstantArray, Et, Can, SM, TQ, SzPtr->SizeExpr),
3887 ConstantArrayTypeBits.HasExternalSize =
true;
3888 ConstantArrayTypeBits.SizeWidth = 0;
3890 assert((SzPtr->SizeExpr ==
nullptr || !Can.isNull()) &&
3891 "canonical constant array should not have size expression");
3894 static ConstantArrayType *
Create(
const ASTContext &Ctx, QualType ET,
3895 QualType Can,
const llvm::APInt &Sz,
3896 const Expr *SzExpr, ArraySizeModifier SzMod,
3906 ConstantArrayTypeBits.SizeWidth = ATy->ConstantArrayTypeBits.SizeWidth;
3949 ?
SizePtr->Size.getLimitedValue()
3963 static unsigned getNumAddressingBits(
const ASTContext &Context,
3965 const llvm::APInt &NumElements);
3967 unsigned getNumAddressingBits(
const ASTContext &Context)
const;
3971 static unsigned getMaxSizeBits(
const ASTContext &Context);
3978 static void Profile(llvm::FoldingSetNodeID &ID,
const ASTContext &Ctx,
3983 return T->getTypeClass() == ConstantArray ||
3984 T->getTypeClass() == ArrayParameter;
3990class ArrayParameterType :
public ConstantArrayType {
3993 ArrayParameterType(
const ConstantArrayType *ATy,
QualType CanTy)
3994 : ConstantArrayType(ArrayParameter, ATy, CanTy) {}
3998 return T->getTypeClass() == ArrayParameter;
4012 :
ArrayType(IncompleteArray, et, can, sm, tq) {}
4021 return T->getTypeClass() == IncompleteArray;
4032 ID.AddInteger(llvm::to_underlying(SizeMod));
4033 ID.AddInteger(TypeQuals);
4073 :
ArrayType(VariableArray, et, can, sm, tq, e), SizeExpr((
Stmt *)e) {}
4081 return (
Expr*) SizeExpr;
4088 return T->getTypeClass() == VariableArray;
4092 llvm_unreachable(
"Cannot unique VariableArrayTypes.");
4128 return (
Expr*) SizeExpr;
4135 return T->getTypeClass() == DependentSizedArray;
4143 static void Profile(llvm::FoldingSetNodeID &ID,
const ASTContext &Context,
4145 unsigned TypeQuals,
Expr *E);
4159class DependentAddressSpaceType :
public Type,
public llvm::FoldingSetNode {
4162 Expr *AddrSpaceExpr;
4178 return T->getTypeClass() == DependentAddressSpace;
4185 static void Profile(llvm::FoldingSetNodeID &ID,
const ASTContext &Context,
4199class DependentSizedExtVectorType :
public Type,
public llvm::FoldingSetNode {
4221 return T->getTypeClass() == DependentSizedExtVector;
4228 static void Profile(llvm::FoldingSetNodeID &ID,
const ASTContext &Context,
4301static_assert(
unsigned(VectorKind::RVVFixedLengthData_M1) ==
4302 unsigned(VectorKind::RVVFixedLengthData_MF8) + 3 &&
4303 unsigned(VectorKind::RVVFixedLengthData_M8) ==
4304 unsigned(VectorKind::RVVFixedLengthData_MF8) + 6,
4305 "unexpected order of the RVV fixed-length data vector kinds");
4306static_assert(
unsigned(VectorKind::RVVFixedLengthMaskRatio1_4) ==
4307 unsigned(VectorKind::RVVFixedLengthMaskRatio1) + 3 &&
4308 unsigned(VectorKind::RVVFixedLengthMaskRatio2) ==
4309 unsigned(VectorKind::RVVFixedLengthMaskRatio1) + 4 &&
4310 unsigned(VectorKind::RVVFixedLengthMaskRatio64_4) ==
4311 unsigned(VectorKind::RVVFixedLengthMaskRatio1) + 27,
4312 "unexpected order of the RVV fixed-length mask vector kinds");
4325 "not an RVV fixed-length data vector kind");
4331 assert(LMulLog2 >= -3 && LMulLog2 <= 3 &&
4332 "LMUL out of range for an RVV type");
4347 "not an RVV fixed-length mask vector kind");
4361 static constexpr const char *LMuls[] = {
"mf8",
"mf4",
"mf2",
"m1",
4365 static constexpr const char *Ratios[] = {
"1",
"2",
"4",
"8",
4374 "not an RVV fixed-length mask vector kind");
4377 return Col ? 1u << (Col - 1) : 0;
4383 unsigned SubByteLanes) {
4384 assert(RatioLog2 < 7 &&
"ratio out of range for an RVV mask type");
4385 assert((SubByteLanes == 0 || SubByteLanes == 1 || SubByteLanes == 2 ||
4386 SubByteLanes == 4) &&
4387 "unexpected sub-byte lane count");
4388 unsigned Col = SubByteLanes == 0 ? 0 : llvm::Log2_32(SubByteLanes) + 1;
4390 RatioLog2 * 4 + Col);
4438 ID.AddInteger(NumElements);
4440 ID.AddInteger(llvm::to_underlying(VecKind));
4444 return T->getTypeClass() ==
Vector ||
T->getTypeClass() == ExtVector;
4457class DependentVectorType :
public Type,
public llvm::FoldingSetNode {
4479 return T->getTypeClass() == DependentVector;
4486 static void Profile(llvm::FoldingSetNodeID &ID,
const ASTContext &Context,
4501 :
VectorType(ExtVector, vecType, nElements, canonType,
4508 case 'x':
case 'r':
return 0;
4509 case 'y':
case 'g':
return 1;
4510 case 'z':
case 'b':
return 2;
4511 case 'w':
case 'a':
return 3;
4529 case 'a':
return 10;
4531 case 'b':
return 11;
4533 case 'c':
return 12;
4535 case 'd':
return 13;
4537 case 'e':
return 14;
4539 case 'f':
return 15;
4544 if (isNumericAccessor)
4560 return T->getTypeClass() == ExtVector;
4582 const Expr *RowExpr =
nullptr,
const Expr *ColumnExpr =
nullptr);
4595 if (
T->isDependentType())
4599 if (
T->isEnumeralType())
4605 return T->isRealType();
4609 return T->isRealType() && !
T->isBooleanType();
4616 return T->getTypeClass() == ConstantMatrix ||
4617 T->getTypeClass() == DependentSizedMatrix;
4632 unsigned NColumns,
QualType CanonElementType,
4633 std::optional<LayoutKind>
Layout);
4636 unsigned NColumns,
QualType CanonElementType,
4637 std::optional<LayoutKind>
Layout);
4670 bool IsRowMajor =
false)
const {
4680 unsigned Row = ColumnMajorIdx %
NumRows;
4700 ID.AddPointer(ElementType.getAsOpaquePtr());
4703 ID.AddInteger(
Layout ? llvm::to_underlying(*
Layout) + 1 : 0);
4708 return T->getTypeClass() == ConstantMatrix;
4731 return T->getTypeClass() == DependentSizedMatrix;
4738 static void Profile(llvm::FoldingSetNodeID &ID,
const ASTContext &Context,
4774 HasPassObjSize = 0x20,
4777 unsigned char Data = 0;
4786 copy.Data = (copy.Data & ~ABIMask) |
unsigned(
kind);
4796 copy.Data |= IsConsumed;
4798 copy.Data &= ~IsConsumed;
4805 Copy.Data |= HasPassObjSize;
4813 Copy.Data |= IsNoEscape;
4815 Copy.Data &= ~IsNoEscape;
4827 return lhs.Data == rhs.Data;
4831 return lhs.Data != rhs.Data;
4866 enum { CallConvMask = 0x3F };
4867 enum { NoReturnMask = 0x40 };
4868 enum { ProducesResultMask = 0x80 };
4869 enum { NoCallerSavedRegsMask = 0x100 };
4870 enum { RegParmMask = 0xe00, RegParmOffset = 9 };
4871 enum { NoCfCheckMask = 0x1000 };
4872 enum { CmseNSCallMask = 0x2000 };
4875 ExtInfo(
unsigned Bits) : Bits(static_cast<
uint16_t>(Bits)) {}
4881 bool producesResult,
bool noCallerSavedRegs,
bool NoCfCheck,
4883 assert((!hasRegParm || regParm < 7) &&
"Invalid regparm value");
4884 Bits = ((
unsigned)cc) | (noReturn ? NoReturnMask : 0) |
4885 (producesResult ? ProducesResultMask : 0) |
4886 (noCallerSavedRegs ? NoCallerSavedRegsMask : 0) |
4887 (hasRegParm ? ((regParm + 1) << RegParmOffset) : 0) |
4888 (NoCfCheck ? NoCfCheckMask : 0) |
4889 (cmseNSCall ? CmseNSCallMask : 0);
4905 bool getHasRegParm()
const {
return ((Bits & RegParmMask) >> RegParmOffset) != 0; }
4908 unsigned RegParm = (Bits & RegParmMask) >> RegParmOffset;
4917 return Bits ==
Other.Bits;
4920 return Bits !=
Other.Bits;
4928 return ExtInfo(Bits | NoReturnMask);
4930 return ExtInfo(Bits & ~NoReturnMask);
4935 return ExtInfo(Bits | ProducesResultMask);
4937 return ExtInfo(Bits & ~ProducesResultMask);
4942 return ExtInfo(Bits | CmseNSCallMask);
4944 return ExtInfo(Bits & ~CmseNSCallMask);
4948 if (noCallerSavedRegs)
4949 return ExtInfo(Bits | NoCallerSavedRegsMask);
4951 return ExtInfo(Bits & ~NoCallerSavedRegsMask);
4956 return ExtInfo(Bits | NoCfCheckMask);
4958 return ExtInfo(Bits & ~NoCfCheckMask);
4962 assert(RegParm < 7 &&
"Invalid regparm value");
4963 return ExtInfo((Bits & ~RegParmMask) |
4964 ((RegParm + 1) << RegParmOffset));
4968 return ExtInfo((Bits & ~CallConvMask) | (
unsigned) cc);
4972 ID.AddInteger(Bits);
4990 LLVM_PREFERRED_TYPE(
bool)
4993 LLVM_PREFERRED_TYPE(
bool)
4996 LLVM_PREFERRED_TYPE(
bool)
5096 bool getCFIUncheckedCalleeAttr()
const;
5103 "Const, volatile and restrict are assumed to be a subset of "
5104 "the fast qualifiers.");
5116 static StringRef getNameForCallConv(
CallingConv CC);
5119 return T->getTypeClass() == FunctionNoProto ||
5120 T->getTypeClass() == FunctionProto;
5126class FunctionNoProtoType :
public FunctionType,
public llvm::FoldingSetNode {
5149 ID.AddPointer(ResultType.getAsOpaquePtr());
5153 return T->getTypeClass() == FunctionNoProto;
5203 Kind oppositeKind()
const;
5226 llvm_unreachable(
"unknown effect kind");
5230 StringRef name()
const;
5234 OS << Effect.
name();
5244 std::optional<FunctionEffect>
5245 effectProhibitingInference(
const Decl &Callee,
5252 bool shouldDiagnoseFunctionCall(
bool Direct,
5256 return LHS.FKind == RHS.FKind;
5259 return !(LHS == RHS);
5262 return LHS.FKind < RHS.FKind;
5269 Expr *Cond =
nullptr;
5278 return Cond == RHS.Cond;
5293 std::string description()
const;
5295 friend raw_ostream &
operator<<(raw_ostream &OS,
5304 const Container *Outer =
nullptr;
5311 return Idx ==
Other.Idx;
5314 return Idx !=
Other.Idx;
5323 assert(Outer !=
nullptr &&
"invalid FunctionEffectIterator");
5324 bool HasConds = !Outer->Conditions.empty();
5326 HasConds ? Outer->Conditions[Idx]
5348class FunctionEffectsRef {
5353 friend FunctionProtoType;
5354 friend FunctionEffectSet;
5365 : Effects(FX), Conditions(Conds) {}
5378 bool empty()
const {
return Effects.empty(); }
5379 size_t size()
const {
return Effects.size(); }
5390 const FunctionEffectsRef &RHS) {
5391 return LHS.Effects == RHS.Effects && LHS.Conditions == RHS.Conditions;
5394 const FunctionEffectsRef &RHS) {
5395 return !(LHS == RHS);
5398 void dump(llvm::raw_ostream &OS)
const;
5402class FunctionEffectKindSet {
5405 using KindBitsT = std::bitset<EndBitPos>;
5407 KindBitsT KindBits{};
5409 explicit FunctionEffectKindSet(KindBitsT KB) : KindBits(KB) {}
5415 return static_cast<size_t>(K);
5424 const FunctionEffectKindSet *Outer =
nullptr;
5429 void advanceToNextSetBit() {
5430 while (Idx < EndBitPos && !Outer->KindBits.test(Idx))
5436 iterator(
const FunctionEffectKindSet &O,
size_t I) : Outer(&O), Idx(I) {
5437 advanceToNextSetBit();
5442 iterator operator++() {
5444 advanceToNextSetBit();
5449 assert(Idx < EndBitPos &&
"Dereference of end iterator");
5458 iterator
begin()
const {
return iterator(*
this, 0); }
5459 iterator
end()
const {
return iterator(*
this, EndBitPos); }
5468 bool empty()
const {
return KindBits.none(); }
5470 return KindBits.test(kindToPos(EK));
5472 void dump(llvm::raw_ostream &OS)
const;
5474 static FunctionEffectKindSet
difference(FunctionEffectKindSet LHS,
5475 FunctionEffectKindSet RHS) {
5476 return FunctionEffectKindSet(LHS.KindBits & ~RHS.KindBits);
5492 : Effects(FX.effects()), Conditions(FX.conditions()) {}
5494 bool empty()
const {
return Effects.empty(); }
5495 size_t size()
const {
return Effects.size(); }
5504 void dump(llvm::raw_ostream &OS)
const;
5539class FunctionProtoType final
5541 public llvm::FoldingSetNode,
5542 private llvm::TrailingObjects<
5543 FunctionProtoType, QualType, SourceLocation,
5544 FunctionType::FunctionTypeExtraBitfields,
5545 FunctionType::FunctionTypeExtraAttributeInfo,
5546 FunctionType::FunctionTypeArmAttributes, FunctionType::ExceptionType,
5547 Expr *, FunctionDecl *, FunctionType::ExtParameterInfo, Qualifiers,
5548 FunctionEffect, EffectConditionExpr> {
5550 friend TrailingObjects;
5643 LLVM_PREFERRED_TYPE(
bool)
5645 LLVM_PREFERRED_TYPE(
bool)
5647 LLVM_PREFERRED_TYPE(
bool)
5662 Result.ExceptionSpec = ESI;
5696 unsigned numTrailingObjects(OverloadToken<QualType>)
const {
5697 return getNumParams();
5700 unsigned numTrailingObjects(OverloadToken<SourceLocation>)
const {
5701 return isVariadic();
5704 unsigned numTrailingObjects(OverloadToken<FunctionTypeArmAttributes>)
const {
5705 return hasArmTypeAttributes();
5708 unsigned numTrailingObjects(OverloadToken<FunctionTypeExtraBitfields>)
const {
5709 return hasExtraBitfields();
5713 numTrailingObjects(OverloadToken<FunctionTypeExtraAttributeInfo>)
const {
5714 return hasExtraAttributeInfo();
5717 unsigned numTrailingObjects(OverloadToken<ExceptionType>)
const {
5718 return getExceptionSpecSize().NumExceptionType;
5721 unsigned numTrailingObjects(OverloadToken<Expr *>)
const {
5722 return getExceptionSpecSize().NumExprPtr;
5725 unsigned numTrailingObjects(OverloadToken<FunctionDecl *>)
const {
5726 return getExceptionSpecSize().NumFunctionDeclPtr;
5729 unsigned numTrailingObjects(OverloadToken<ExtParameterInfo>)
const {
5730 return hasExtParameterInfos() ? getNumParams() : 0;
5733 unsigned numTrailingObjects(OverloadToken<Qualifiers>)
const {
5734 return hasExtQualifiers() ? 1 : 0;
5737 unsigned numTrailingObjects(OverloadToken<FunctionEffect>)
const {
5738 return getNumFunctionEffects();
5743 static bool containsAnyUnexpandedParameterPack(
const QualType *ArgArray,
5745 for (
unsigned Idx = 0; Idx < numArgs; ++Idx)
5746 if (ArgArray[Idx]->containsUnexpandedParameterPack())
5752 FunctionProtoType(QualType result, ArrayRef<QualType> params,
5753 QualType canonical,
const ExtProtoInfo &epi);
5758 struct ExceptionSpecSizeHolder {
5759 unsigned NumExceptionType;
5760 unsigned NumExprPtr;
5761 unsigned NumFunctionDeclPtr;
5766 static ExceptionSpecSizeHolder
5767 getExceptionSpecSize(ExceptionSpecificationType EST,
unsigned NumExceptions) {
5778 return {NumExceptions, 0, 0};
5791 llvm_unreachable(
"bad exception specification kind");
5796 ExceptionSpecSizeHolder getExceptionSpecSize()
const {
5797 return getExceptionSpecSize(getExceptionSpecType(), getNumExceptions());
5801 bool hasExtraBitfields()
const {
5802 assert((getExceptionSpecType() != EST_Dynamic ||
5803 FunctionTypeBits.HasExtraBitfields) &&
5804 "ExtraBitfields are required for given ExceptionSpecType");
5805 return FunctionTypeBits.HasExtraBitfields;
5809 bool hasExtraAttributeInfo()
const {
5810 return FunctionTypeBits.HasExtraBitfields &&
5811 getTrailingObjects<FunctionTypeExtraBitfields>()
5812 ->HasExtraAttributeInfo;
5815 bool hasArmTypeAttributes()
const {
5816 return FunctionTypeBits.HasExtraBitfields &&
5817 getTrailingObjects<FunctionTypeExtraBitfields>()
5818 ->HasArmTypeAttributes;
5821 bool hasExtQualifiers()
const {
5822 return FunctionTypeBits.HasExtQuals;
5829 assert(i <
getNumParams() &&
"invalid parameter index");
5874 bool hasDependentExceptionSpec()
const;
5878 bool hasInstantiationDependentExceptionSpec()
const;
5900 ? getTrailingObjects<FunctionTypeExtraBitfields>()
5916 return *getTrailingObjects<Expr *>();
5927 return getTrailingObjects<FunctionDecl *>()[0];
5937 return getTrailingObjects<FunctionDecl *>()[1];
5955 return isVariadic() ? *getTrailingObjects<SourceLocation>()
5965 bool isTemplateVariadic()
const;
5975 if (hasExtQualifiers())
5976 return *getTrailingObjects<Qualifiers>();
5993 return getTrailingObjects<QualType>();
6008 getTrailingObjects<ExceptionType>());
6033 return getTrailingObjects<ExtParameterInfo>();
6038 if (hasExtraAttributeInfo())
6039 return *getTrailingObjects<FunctionTypeExtraAttributeInfo>();
6046 if (!hasArmTypeAttributes())
6048 return getTrailingObjects<FunctionTypeArmAttributes>()
6049 ->AArch64SMEAttributes;
6053 assert(I <
getNumParams() &&
"parameter index out of range");
6055 return getTrailingObjects<ExtParameterInfo>()[I];
6060 assert(I <
getNumParams() &&
"parameter index out of range");
6062 return getTrailingObjects<ExtParameterInfo>()[I].getABI();
6067 assert(I <
getNumParams() &&
"parameter index out of range");
6069 return getTrailingObjects<ExtParameterInfo>()[I].isConsumed();
6074 return hasExtraBitfields()
6075 ? getTrailingObjects<FunctionTypeExtraBitfields>()
6076 ->NumFunctionEffects
6082 if (hasExtraBitfields()) {
6083 const auto *Bitfields = getTrailingObjects<FunctionTypeExtraBitfields>();
6084 if (Bitfields->NumFunctionEffects > 0)
6085 return getTrailingObjects<FunctionEffect>(
6086 Bitfields->NumFunctionEffects);
6092 if (hasExtraBitfields()) {
6093 const auto *Bitfields = getTrailingObjects<FunctionTypeExtraBitfields>();
6094 if (Bitfields->EffectsHaveConditions)
6095 return Bitfields->NumFunctionEffects;
6102 if (hasExtraBitfields()) {
6103 const auto *Bitfields = getTrailingObjects<FunctionTypeExtraBitfields>();
6104 if (Bitfields->EffectsHaveConditions)
6105 return getTrailingObjects<EffectConditionExpr>(
6106 Bitfields->NumFunctionEffects);
6113 if (hasExtraBitfields()) {
6114 const auto *Bitfields = getTrailingObjects<FunctionTypeExtraBitfields>();
6115 if (Bitfields->NumFunctionEffects > 0) {
6116 const size_t NumConds = Bitfields->EffectsHaveConditions
6117 ? Bitfields->NumFunctionEffects
6120 getTrailingObjects<FunctionEffect>(Bitfields->NumFunctionEffects),
6121 {NumConds ? getTrailingObjects<EffectConditionExpr>() : nullptr,
6131 void printExceptionSpecification(raw_ostream &OS,
6135 return T->getTypeClass() == FunctionProto;
6138 void Profile(llvm::FoldingSetNodeID &ID,
const ASTContext &Ctx);
6217 template <
class... As>
6220 this->KeywordWrapperBits.Keyword = llvm::to_underlying(
Keyword);
6245 constexpr unsigned long Offset =
6247 const auto *
Addr =
reinterpret_cast<const T *
>(
6248 reinterpret_cast<const char *
>(
this) - Offset);
6249 assert(llvm::isAddrAligned(llvm::Align(
alignof(
T)),
Addr));
6259class UnresolvedUsingType final
6261 private llvm::TrailingObjects<UnresolvedUsingType,
6262 FoldingSetPlaceholder<UnresolvedUsingType>,
6263 NestedNameSpecifier> {
6265 friend TrailingObjects;
6269 unsigned numTrailingObjects(
6277 assert(numTrailingObjects(
6280 return getTrailingObjects<FoldingSetPlaceholder<UnresolvedUsingType>>();
6283 UnresolvedUsingType(ElaboratedTypeKeyword Keyword,
6284 NestedNameSpecifier Qualifier,
6285 const UnresolvedUsingTypenameDecl *D,
6286 const Type *CanonicalType);
6291 ? *getTrailingObjects<NestedNameSpecifier>()
6306 Qualifier.Profile(ID);
6314 return T->getTypeClass() == UnresolvedUsing;
6319 public llvm::FoldingSetNode,
6320 llvm::TrailingObjects<UsingType, NestedNameSpecifier> {
6325 friend TrailingObjects;
6332 return UsingBits.hasQualifier ? *getTrailingObjects() : std::nullopt;
6345 UnderlyingType.Profile(ID);
6347 Qualifier.Profile(ID);
6356class TypedefType final
6358 private llvm::TrailingObjects<TypedefType,
6359 FoldingSetPlaceholder<TypedefType>,
6360 NestedNameSpecifier, QualType> {
6363 friend TrailingObjects;
6372 unsigned numTrailingObjects(OverloadToken<NestedNameSpecifier>)
const {
6373 return TypedefBits.hasQualifier;
6376 TypedefType(TypeClass TC, ElaboratedTypeKeyword Keyword,
6377 NestedNameSpecifier Qualifier,
const TypedefNameDecl *D,
6378 QualType UnderlyingType,
bool HasTypeDifferentFromDecl);
6380 FoldingSetPlaceholder<TypedefType> *getFoldingSetPlaceholder() {
6381 assert(numTrailingObjects(
6382 OverloadToken<FoldingSetPlaceholder<TypedefType>>{}) == 1);
6383 return getTrailingObjects<FoldingSetPlaceholder<TypedefType>>();
6388 return TypedefBits.hasQualifier ? *getTrailingObjects<NestedNameSpecifier>()
6409 ID.AddInteger(llvm::to_underlying(
Keyword));
6411 Qualifier.Profile(ID);
6412 if (!Underlying.
isNull())
6426class MacroQualifiedType :
public Type {
6435 UnderlyingTy(UnderlyingTy), MacroII(MacroII) {
6437 "Expected a macro qualified type to only wrap attributed types.");
6452 return T->getTypeClass() == MacroQualified;
6480 bool isSugared()
const;
6492 public llvm::FoldingSetNode {
6502 static void Profile(llvm::FoldingSetNodeID &ID,
const ASTContext &Context,
6503 Expr *E,
bool IsUnqual);
6508class TypeOfType :
public Type {
6514 TypeOfType(
const ASTContext &Context, QualType T, QualType Can,
6518 QualType getUnmodifiedType()
const {
return TOType; }
6521 QualType desugar()
const;
6524 bool isSugared()
const {
return true; }
6528 return static_cast<TypeOfKind>(TypeOfBits.Kind);
6531 static bool classof(
const Type *T) {
return T->
getTypeClass() == TypeOf; }
6535class DecltypeType :
public Type {
6537 QualType UnderlyingType;
6540 friend class ASTContext;
6542 DecltypeType(Expr *E, QualType underlyingType, QualType can = QualType());
6545 Expr *getUnderlyingExpr()
const {
return E; }
6549 QualType desugar()
const;
6552 bool isSugared()
const;
6554 static bool classof(
const Type *T) {
return T->
getTypeClass() == Decltype; }
6563class DependentDecltypeType :
public DecltypeType,
public llvm::FoldingSetNode {
6565 DependentDecltypeType(Expr *E);
6567 void Profile(llvm::FoldingSetNodeID &ID,
const ASTContext &Context) {
6568 Profile(ID, Context, getUnderlyingExpr());
6571 static void Profile(llvm::FoldingSetNodeID &ID,
const ASTContext &Context,
6575class PackIndexingType final
6577 public llvm::FoldingSetNode,
6578 private llvm::TrailingObjects<PackIndexingType, QualType> {
6579 friend TrailingObjects;
6586 LLVM_PREFERRED_TYPE(
bool)
6587 unsigned FullySubstituted : 1;
6590 friend class ASTContext;
6591 PackIndexingType(QualType Canonical, QualType Pattern, Expr *IndexExpr,
6592 bool FullySubstituted, ArrayRef<QualType> Expansions = {});
6595 Expr *getIndexExpr()
const {
return IndexExpr; }
6596 QualType getPattern()
const {
return Pattern; }
6598 bool isSugared()
const {
return hasSelectedType(); }
6600 QualType desugar()
const {
6601 if (hasSelectedType())
6602 return getSelectedType();
6603 return QualType(
this, 0);
6606 QualType getSelectedType()
const {
6607 assert(hasSelectedType() &&
"Type is dependant");
6608 return *(getExpansionsPtr() + *getSelectedIndex());
6613 bool hasSelectedType()
const {
return getSelectedIndex() != std::nullopt; }
6615 bool isFullySubstituted()
const {
return FullySubstituted; }
6617 bool expandsToEmptyPack()
const {
return isFullySubstituted() &&
Size == 0; }
6619 ArrayRef<QualType> getExpansions()
const {
6620 return {getExpansionsPtr(),
Size};
6623 static bool classof(
const Type *T) {
6627 void Profile(llvm::FoldingSetNodeID &ID,
const ASTContext &Context);
6628 static void Profile(llvm::FoldingSetNodeID &ID,
const ASTContext &Context,
6629 QualType Pattern, Expr *E,
bool FullySubstituted,
6630 ArrayRef<QualType> Expansions);
6633 const QualType *getExpansionsPtr()
const {
return getTrailingObjects(); }
6636 ArrayRef<QualType> Expansions = {});
6640class UnaryTransformType :
public Type,
public llvm::FoldingSetNode {
6643#define TRANSFORM_TYPE_TRAIT_DEF(Enum, _) Enum,
6644#include "clang/Basic/BuiltinTraits.inc"
6652 QualType UnderlyingType;
6657 friend class ASTContext;
6659 UnaryTransformType(QualType BaseTy, QualType UnderlyingTy, UTTKind UKind,
6660 QualType CanonicalTy);
6663 bool isSugared()
const {
return !isDependentType(); }
6664 QualType desugar()
const {
return UnderlyingType; }
6669 UTTKind getUTTKind()
const {
return UKind; }
6671 static bool classof(
const Type *T) {
6675 std::tuple<QualType, QualType, UTTKind> getKey()
const {
6680class TagType :
public TypeWithKeyword {
6681 friend class ASTContext;
6687 void *getTrailingPointer()
const;
6688 NestedNameSpecifier &getTrailingQualifier()
const;
6691 TagType(TypeClass TC, ElaboratedTypeKeyword Keyword,
6692 NestedNameSpecifier Qualifier,
const TagDecl *TD,
bool OwnsTag,
6693 bool IsInjected,
const Type *CanonicalType);
6696 TagDecl *getDecl()
const {
return decl; }
6697 [[deprecated(
"Use getDecl instead")]] TagDecl *getOriginalDecl()
const {
6701 NestedNameSpecifier getQualifier()
const;
6704 bool isTagOwned()
const {
return TagTypeBits.OwnsTag; }
6706 bool isInjected()
const {
return TagTypeBits.IsInjected; }
6708 ClassTemplateDecl *getTemplateDecl()
const;
6709 TemplateName getTemplateName(
const ASTContext &Ctx)
const;
6710 ArrayRef<TemplateArgument> getTemplateArgs(
const ASTContext &Ctx)
const;
6712 bool isSugared()
const {
return false; }
6713 QualType desugar()
const {
return getCanonicalTypeInternal(); }
6715 static bool classof(
const Type *T) {
6721struct TagTypeFoldingSetPlaceholder :
public llvm::FoldingSetNode {
6722 static constexpr size_t getOffset() {
6723 return alignof(TagType) -
6724 (
sizeof(TagTypeFoldingSetPlaceholder) %
alignof(TagType));
6727 static void Profile(llvm::FoldingSetNodeID &ID, ElaboratedTypeKeyword Keyword,
6728 NestedNameSpecifier Qualifier,
const TagDecl *Tag,
6729 bool OwnsTag,
bool IsInjected) {
6730 ID.AddInteger(
uintptr_t(Tag) | OwnsTag | (IsInjected << 1) |
6731 ((Keyword != ElaboratedTypeKeyword::None) << 2));
6732 if (Keyword != ElaboratedTypeKeyword::None)
6733 ID.AddInteger(llvm::to_underlying(Keyword));
6738 void Profile(llvm::FoldingSetNodeID &ID)
const {
6739 const TagType *
T = getTagType();
6740 Profile(ID,
T->getKeyword(),
T->getQualifier(),
T->getDecl(),
6741 T->isTagOwned(),
T->isInjected());
6744 TagType *getTagType() {
6745 return reinterpret_cast<TagType *
>(
reinterpret_cast<char *
>(
this + 1) +
6748 const TagType *getTagType()
const {
6749 return const_cast<TagTypeFoldingSetPlaceholder *
>(
this)->getTagType();
6751 static TagTypeFoldingSetPlaceholder *fromTagType(TagType *T) {
6752 return reinterpret_cast<TagTypeFoldingSetPlaceholder *
>(
6753 reinterpret_cast<char *
>(
T) - getOffset()) -
6760class RecordType final :
public TagType {
6761 using TagType::TagType;
6764 RecordDecl *getDecl()
const {
6765 return reinterpret_cast<RecordDecl *
>(TagType::getDecl());
6767 [[deprecated(
"Use getDecl instead")]] RecordDecl *getOriginalDecl()
const {
6773 bool hasConstFields()
const;
6780class EnumType final :
public TagType {
6781 using TagType::TagType;
6784 EnumDecl *getDecl()
const {
6785 return reinterpret_cast<EnumDecl *
>(TagType::getDecl());
6787 [[deprecated(
"Use getDecl instead")]] EnumDecl *getOriginalDecl()
const {
6811class InjectedClassNameType final :
public TagType {
6812 friend class ASTContext;
6814 InjectedClassNameType(ElaboratedTypeKeyword Keyword,
6815 NestedNameSpecifier Qualifier,
const TagDecl *TD,
6816 bool IsInjected,
const Type *CanonicalType);
6819 CXXRecordDecl *getDecl()
const {
6820 return reinterpret_cast<CXXRecordDecl *
>(TagType::getDecl());
6822 [[deprecated(
"Use getDecl instead")]] CXXRecordDecl *getOriginalDecl()
const {
6826 static bool classof(
const Type *T) {
6845 using Kind = attr::Kind;
6848 friend class ASTContext;
6850 const Attr *Attribute;
6852 QualType ModifiedType;
6853 QualType EquivalentType;
6855 AttributedType(QualType canon, attr::Kind attrKind, QualType modified,
6856 QualType equivalent)
6859 AttributedType(QualType canon,
const Attr *attr, QualType modified,
6860 QualType equivalent);
6863 AttributedType(QualType canon, attr::Kind attrKind,
const Attr *attr,
6864 QualType modified, QualType equivalent);
6867 Kind getAttrKind()
const {
6868 return static_cast<Kind>(AttributedTypeBits.AttrKind);
6871 const Attr *getAttr()
const {
return Attribute; }
6873 QualType getModifiedType()
const {
return ModifiedType; }
6874 QualType getEquivalentType()
const {
return EquivalentType; }
6876 bool isSugared()
const {
return true; }
6877 QualType desugar()
const {
return getEquivalentType(); }
6894 bool isQualifier()
const;
6896 bool isMSTypeSpec()
const;
6898 bool isWebAssemblyFuncrefSpec()
const;
6900 bool isCallingConv()
const;
6915 void Profile(llvm::FoldingSetNodeID &ID,
const ASTContext &Ctx) {
6916 Profile(ID, Ctx, getAttrKind(), ModifiedType, EquivalentType, Attribute);
6919 static void Profile(llvm::FoldingSetNodeID &ID,
const ASTContext &Ctx,
6920 Kind attrKind, QualType modified, QualType equivalent,
6923 static bool classof(
const Type *T) {
6928class BTFTagAttributedType :
public Type,
public llvm::FoldingSetNode {
6930 friend class ASTContext;
6932 QualType WrappedType;
6933 const BTFTypeTagAttr *BTFAttr;
6935 BTFTagAttributedType(QualType Canon, QualType Wrapped,
6936 const BTFTypeTagAttr *BTFAttr)
6937 : Type(BTFTagAttributed, Canon, Wrapped->getDependence()),
6938 WrappedType(Wrapped), BTFAttr(BTFAttr) {}
6941 QualType getWrappedType()
const {
return WrappedType; }
6942 const BTFTypeTagAttr *getAttr()
const {
return BTFAttr; }
6944 bool isSugared()
const {
return true; }
6945 QualType desugar()
const {
return getWrappedType(); }
6947 void Profile(llvm::FoldingSetNodeID &ID) {
6948 Profile(ID, WrappedType, BTFAttr);
6951 static void Profile(llvm::FoldingSetNodeID &ID, QualType Wrapped,
6952 const BTFTypeTagAttr *BTFAttr) {
6953 ID.AddPointer(Wrapped.getAsOpaquePtr());
6954 ID.AddPointer(BTFAttr);
6957 static bool classof(
const Type *T) {
6962class OverflowBehaviorType :
public Type,
public llvm::FoldingSetNode {
6964 enum OverflowBehaviorKind { Wrap, Trap };
6967 friend class ASTContext;
6969 QualType UnderlyingType;
6970 OverflowBehaviorKind BehaviorKind;
6971 const ASTContext &Context;
6973 OverflowBehaviorType(
const ASTContext &Context, QualType Canon,
6974 QualType Underlying, OverflowBehaviorKind Kind);
6978 OverflowBehaviorKind getBehaviorKind()
const {
return BehaviorKind; }
6980 bool isWrapKind()
const {
return BehaviorKind == OverflowBehaviorKind::Wrap; }
6981 bool isTrapKind()
const {
return BehaviorKind == OverflowBehaviorKind::Trap; }
6983 bool isSugared()
const {
return false; }
6986 SplitQualType getSplitUnqualifiedType()
const;
6988 std::pair<QualType, OverflowBehaviorKind> getKey()
const {
6989 return {UnderlyingType, BehaviorKind};
6992 static bool classof(
const Type *T) {
6997class HLSLAttributedResourceType :
public Type,
public llvm::FoldingSetNode {
7002 llvm::dxil::ResourceDimension ResourceDimension;
7004 LLVM_PREFERRED_TYPE(
bool)
7007 LLVM_PREFERRED_TYPE(
bool)
7010 LLVM_PREFERRED_TYPE(
bool)
7013 LLVM_PREFERRED_TYPE(
bool)
7020 Expr *SampleCountExpr;
7023 llvm::dxil::ResourceDimension ResourceDimension,
7024 bool IsROV =
false,
bool RawBuffer =
false,
7025 bool IsCounter =
false,
bool IsArray =
false,
7026 Expr *SampleCountExpr =
nullptr)
7028 IsROV(IsROV), RawBuffer(RawBuffer), IsCounter(IsCounter),
7029 IsArray(IsArray), SampleCountExpr(SampleCountExpr) {}
7036 llvm::dxil::ResourceDimension::
Unknown) {}
7038 bool isMultiSampled()
const {
return SampleCountExpr !=
nullptr; }
7040 friend bool operator==(
const Attributes &LHS,
const Attributes &RHS) {
7041 return std::tie(LHS.ResourceClass, LHS.ResourceDimension, LHS.IsROV,
7042 LHS.RawBuffer, LHS.IsCounter, LHS.IsArray,
7043 LHS.SampleCountExpr) ==
7044 std::tie(RHS.ResourceClass, RHS.ResourceDimension, RHS.IsROV,
7045 RHS.RawBuffer, RHS.IsCounter, RHS.IsArray,
7046 RHS.SampleCountExpr);
7048 friend bool operator!=(
const Attributes &LHS,
const Attributes &RHS) {
7049 return !(LHS == RHS);
7054 friend class ASTContext;
7056 QualType WrappedType;
7057 QualType ContainedType;
7058 const Attributes Attrs;
7060 HLSLAttributedResourceType(QualType Wrapped, QualType Contained,
7061 const Attributes &Attrs);
7065 const Attributes &Attrs);
7068 QualType getWrappedType()
const {
return WrappedType; }
7069 QualType getContainedType()
const {
return ContainedType; }
7070 bool hasContainedType()
const {
return !ContainedType.isNull(); }
7071 Expr *getSampleCountExpr()
const {
return Attrs.SampleCountExpr; }
7072 bool isMultiSampled()
const {
return Attrs.isMultiSampled(); }
7073 const Attributes &getAttrs()
const {
return Attrs; }
7074 bool isRaw()
const {
return Attrs.RawBuffer; }
7075 bool isStructured()
const {
return !ContainedType->isChar8Type(); }
7077 bool isSugared()
const {
return false; }
7078 QualType desugar()
const {
return QualType(
this, 0); }
7080 void Profile(llvm::FoldingSetNodeID &ID,
const ASTContext &Ctx) {
7081 Profile(ID, Ctx, WrappedType, ContainedType, Attrs);
7084 static void Profile(llvm::FoldingSetNodeID &ID,
const ASTContext &Ctx,
7085 QualType Wrapped, QualType Contained,
7086 const Attributes &Attrs);
7088 static bool classof(
const Type *T) {
7093 static const HLSLAttributedResourceType *
7094 findHandleTypeOnResource(
const Type *RT);
7100 enum SpirvOperandKind :
unsigned char {
7113 QualType ResultType;
7119 SpirvOperand(SpirvOperandKind Kind, QualType ResultType, llvm::APInt
Value)
7122 SpirvOperand(
const SpirvOperand &Other) =
default;
7123 ~SpirvOperand() =
default;
7124 SpirvOperand &operator=(
const SpirvOperand &Other) =
default;
7126 bool operator==(
const SpirvOperand &Other)
const {
7131 bool operator!=(
const SpirvOperand &Other)
const {
return !(*
this ==
Other); }
7136 bool isConstant()
const {
return Kind == ConstantId; }
7138 bool isType()
const {
return Kind == TypeId; }
7140 llvm::APInt getValue()
const {
7142 "This is not an operand with a value!");
7146 QualType getResultType()
const {
7147 assert((isConstant() || isType()) &&
7148 "This is not an operand with a result type!");
7152 static SpirvOperand createConstant(QualType ResultType, llvm::APInt Val) {
7153 return SpirvOperand(ConstantId, ResultType, std::move(Val));
7156 static SpirvOperand createLiteral(llvm::APInt Val) {
7157 return SpirvOperand(Literal, QualType(), std::move(Val));
7160 static SpirvOperand createType(QualType T) {
7161 return SpirvOperand(TypeId, T, llvm::APSInt());
7164 void Profile(llvm::FoldingSetNodeID &ID)
const {
7165 ID.AddInteger(Kind);
7166 ID.AddPointer(ResultType.getAsOpaquePtr());
7172class HLSLInlineSpirvType final
7174 public llvm::FoldingSetNode,
7175 private llvm::TrailingObjects<HLSLInlineSpirvType, SpirvOperand> {
7176 friend class ASTContext;
7177 friend TrailingObjects;
7186 ArrayRef<SpirvOperand> Operands)
7188 Size(
Size), Alignment(Alignment), NumOperands(Operands.size()) {
7189 for (
size_t I = 0; I < NumOperands; I++) {
7192 auto *
Operand =
new (&getTrailingObjects()[I]) SpirvOperand();
7200 uint32_t getAlignment()
const {
return Alignment; }
7201 ArrayRef<SpirvOperand> getOperands()
const {
7202 return getTrailingObjects(NumOperands);
7205 bool isSugared()
const {
return false; }
7206 QualType desugar()
const {
return QualType(
this, 0); }
7208 void Profile(llvm::FoldingSetNodeID &ID) {
7209 Profile(ID, Opcode, Size, Alignment, getOperands());
7212 static void Profile(llvm::FoldingSetNodeID &ID,
uint32_t Opcode,
7214 ArrayRef<SpirvOperand> Operands) {
7215 ID.AddInteger(Opcode);
7216 ID.AddInteger(Size);
7217 ID.AddInteger(Alignment);
7218 for (
auto &Operand : Operands)
7222 static bool classof(
const Type *T) {
7227class TemplateTypeParmType :
public Type,
public llvm::FoldingSetNode {
7228 friend class ASTContext;
7231 TemplateTypeParmDecl *TTPDecl;
7233 TemplateTypeParmType(
unsigned D,
unsigned I,
bool PP,
7234 TemplateTypeParmDecl *TTPDecl, QualType Canon)
7239 assert(!TTPDecl == Canon.isNull());
7240 assert(D < (1 << TemplateTypeParmTypeDepthBits) &&
"Depth too large");
7241 assert(I < (1 << TemplateTypeParmTypeIndexBits) &&
"Index too large");
7242 TemplateTypeParmTypeBits.Depth = D;
7243 TemplateTypeParmTypeBits.Index = I;
7244 TemplateTypeParmTypeBits.ParameterPack = PP;
7248 unsigned getDepth()
const {
return TemplateTypeParmTypeBits.Depth; }
7249 unsigned getIndex()
const {
return TemplateTypeParmTypeBits.Index; }
7251 return TemplateTypeParmTypeBits.ParameterPack;
7254 TemplateTypeParmDecl *getDecl()
const {
return TTPDecl; }
7258 bool isSugared()
const {
return false; }
7259 QualType desugar()
const {
return QualType(
this, 0); }
7261 std::tuple<unsigned, unsigned, unsigned, TemplateTypeParmDecl *>
7266 static bool classof(
const Type *T) {
7278class SubstTemplateTypeParmType final
7280 public llvm::FoldingSetNode,
7281 private llvm::TrailingObjects<SubstTemplateTypeParmType, QualType> {
7282 friend class ASTContext;
7283 friend class llvm::TrailingObjects<SubstTemplateTypeParmType, QualType>;
7285 Decl *AssociatedDecl;
7287 SubstTemplateTypeParmType(QualType Replacement, Decl *AssociatedDecl,
7288 unsigned Index, UnsignedOrNone PackIndex,
7294 QualType getReplacementType()
const {
7295 return SubstTemplateTypeParmTypeBits.HasNonCanonicalUnderlyingType
7296 ? *getTrailingObjects()
7297 : getCanonicalTypeInternal();
7303 Decl *getAssociatedDecl()
const {
return AssociatedDecl; }
7306 const TemplateTypeParmDecl *getReplacedParameter()
const;
7310 unsigned getIndex()
const {
return SubstTemplateTypeParmTypeBits.Index; }
7314 unsigned getFinal()
const {
return SubstTemplateTypeParmTypeBits.Final; }
7317 return UnsignedOrNone::fromInternalRepresentation(
7318 SubstTemplateTypeParmTypeBits.PackIndex);
7321 bool isSugared()
const {
return true; }
7322 QualType desugar()
const {
return getReplacementType(); }
7324 std::tuple<QualType, Decl *, unsigned, unsigned, unsigned> getKey()
const {
7325 return {getReplacementType(), getAssociatedDecl(),
getIndex(),
7326 SubstTemplateTypeParmTypeBits.PackIndex,
7327 SubstTemplateTypeParmTypeBits.Final};
7330 static bool classof(
const Type *T) {
7341class SubstPackType :
public Type,
public llvm::FoldingSetNode {
7342 friend class ASTContext;
7349 SubstPackType(TypeClass Derived, QualType Canon,
7350 const TemplateArgument &ArgPack);
7353 unsigned getNumArgs()
const {
return SubstPackTypeBits.NumArgs; }
7355 TemplateArgument getArgumentPack()
const;
7357 void Profile(llvm::FoldingSetNodeID &ID);
7358 static void Profile(llvm::FoldingSetNodeID &ID,
7359 const TemplateArgument &ArgPack);
7361 static bool classof(
const Type *T) {
7368class SubstBuiltinTemplatePackType :
public SubstPackType {
7369 friend class ASTContext;
7371 SubstBuiltinTemplatePackType(QualType Canon,
const TemplateArgument &ArgPack);
7374 bool isSugared()
const {
return false; }
7375 QualType desugar()
const {
return QualType(
this, 0); }
7378 using SubstPackType::Profile;
7380 static bool classof(
const Type *T) {
7397class SubstTemplateTypeParmPackType :
public SubstPackType {
7398 friend class ASTContext;
7400 llvm::PointerIntPair<Decl *, 1, bool> AssociatedDeclAndFinal;
7402 SubstTemplateTypeParmPackType(QualType Canon, Decl *AssociatedDecl,
7403 unsigned Index,
bool Final,
7404 const TemplateArgument &ArgPack);
7412 Decl *getAssociatedDecl()
const;
7415 const TemplateTypeParmDecl *getReplacedParameter()
const;
7420 return SubstPackTypeBits.SubstTemplTypeParmPackIndex;
7425 bool getFinal()
const;
7427 bool isSugared()
const {
return false; }
7428 QualType desugar()
const {
return QualType(
this, 0); }
7430 void Profile(llvm::FoldingSetNodeID &ID);
7431 static void Profile(llvm::FoldingSetNodeID &ID,
const Decl *AssociatedDecl,
7432 unsigned Index,
bool Final,
7433 const TemplateArgument &ArgPack);
7435 static bool classof(
const Type *T) {
7448class DeducedType :
public Type {
7449 QualType DeducedAsType;
7452 DeducedType(TypeClass TC, DeducedKind DK, QualType DeducedAsTypeOrCanon);
7454 static void Profile(llvm::FoldingSetNodeID &ID, DeducedKind DK,
7456 ID.AddInteger(llvm::to_underlying(DK));
7462 return static_cast<DeducedKind>(DeducedTypeBits.Kind);
7465 bool isSugared()
const {
return getDeducedKind() == DeducedKind::Deduced; }
7466 QualType desugar()
const {
7467 return isSugared() ? DeducedAsType : QualType(
this, 0);
7472 QualType getDeducedType()
const {
return DeducedAsType; }
7473 bool isDeduced()
const {
return getDeducedKind() != DeducedKind::Undeduced; }
7475 static bool classof(
const Type *T) {
7483class AutoType :
public DeducedType,
public llvm::FoldingSetNode {
7484 friend class ASTContext;
7488 AutoType(DeducedKind DK, QualType DeducedAsTypeOrCanon,
7489 AutoTypeKeyword Keyword, TemplateName TypeConstraintConcept,
7490 ArrayRef<TemplateArgument> TypeConstraintArgs);
7493 ArrayRef<TemplateArgument> getTypeConstraintArguments()
const {
7494 return {
reinterpret_cast<const TemplateArgument *
>(
this + 1),
7495 AutoTypeBits.NumArgs};
7499 return TypeConstraintConcept;
7502 bool isConstrained()
const {
return !TypeConstraintConcept.isNull(); }
7504 bool isDecltypeAuto()
const {
7505 return getKeyword() == AutoTypeKeyword::DecltypeAuto;
7508 bool isGNUAutoType()
const {
7509 return getKeyword() == AutoTypeKeyword::GNUAutoType;
7513 return (AutoTypeKeyword)AutoTypeBits.Keyword;
7516 void Profile(llvm::FoldingSetNodeID &ID,
const ASTContext &Context);
7517 static void Profile(llvm::FoldingSetNodeID &ID,
const ASTContext &Context,
7518 DeducedKind DK, QualType Deduced, AutoTypeKeyword Keyword,
7519 TemplateName CD, ArrayRef<TemplateArgument> Arguments);
7521 static bool classof(
const Type *T) {
7527class DeducedTemplateSpecializationType :
public KeywordWrapper<DeducedType>,
7528 public llvm::FoldingSetNode {
7529 friend class ASTContext;
7534 DeducedTemplateSpecializationType(DeducedKind DK,
7535 QualType DeducedAsTypeOrCanon,
7536 ElaboratedTypeKeyword Keyword,
7537 TemplateName Template)
7538 : KeywordWrapper(
Keyword, DeducedTemplateSpecialization, DK,
7539 DeducedAsTypeOrCanon),
7546 if (DK == DeducedKind::Deduced)
7555 void Profile(llvm::FoldingSetNodeID &ID)
const {
7556 Profile(ID, getDeducedKind(), getDeducedType(), getKeyword(),
7560 static void Profile(llvm::FoldingSetNodeID &ID, DeducedKind DK,
7561 QualType Deduced, ElaboratedTypeKeyword Keyword,
7562 TemplateName Template) {
7563 DeducedType::Profile(ID, DK, Deduced);
7564 ID.AddInteger(llvm::to_underlying(Keyword));
7568 static bool classof(
const Type *T) {
7593class TemplateSpecializationType :
public TypeWithKeyword,
7594 public llvm::FoldingSetNode {
7595 friend class ASTContext;
7606 TemplateSpecializationType(ElaboratedTypeKeyword Keyword, TemplateName T,
7607 bool IsAlias, ArrayRef<TemplateArgument> Args,
7608 QualType Underlying);
7623 anyDependentTemplateArguments(ArrayRef<TemplateArgumentLoc> Args,
7624 ArrayRef<TemplateArgument> Converted);
7626 anyDependentTemplateArguments(
const TemplateArgumentListInfo &,
7627 ArrayRef<TemplateArgument> Converted);
7628 static bool anyInstantiationDependentTemplateArguments(
7629 ArrayRef<TemplateArgumentLoc> Args);
7633 bool isCurrentInstantiation()
const {
7634 return isa<InjectedClassNameType>(getCanonicalTypeInternal());
7652 bool isTypeAlias()
const {
return TemplateSpecializationTypeBits.TypeAlias; }
7656 QualType getAliasedType()
const;
7661 ArrayRef<TemplateArgument> template_arguments()
const {
7662 return {
reinterpret_cast<const TemplateArgument *
>(
this + 1),
7663 TemplateSpecializationTypeBits.NumArgs};
7666 bool isSugared()
const;
7668 QualType desugar()
const {
7669 return isTypeAlias() ? getAliasedType() : getCanonicalTypeInternal();
7672 void Profile(llvm::FoldingSetNodeID &ID,
const ASTContext &Ctx);
7673 static void Profile(llvm::FoldingSetNodeID &ID, ElaboratedTypeKeyword Keyword,
7674 TemplateName T, ArrayRef<TemplateArgument> Args,
7675 QualType Underlying,
const ASTContext &Context);
7677 static bool classof(
const Type *T) {
7684void printTemplateArgumentList(raw_ostream &OS,
7685 ArrayRef<TemplateArgument> Args,
7686 const PrintingPolicy &Policy,
7687 const TemplateParameterList *TPL =
nullptr);
7689void printTemplateArgumentList(raw_ostream &OS,
7690 ArrayRef<TemplateArgumentLoc> Args,
7691 const PrintingPolicy &Policy,
7692 const TemplateParameterList *TPL =
nullptr);
7694void printTemplateArgumentList(raw_ostream &OS,
7695 const TemplateArgumentListInfo &Args,
7696 const PrintingPolicy &Policy,
7697 const TemplateParameterList *TPL =
nullptr);
7701bool isSubstitutedDefaultArgument(ASTContext &Ctx, TemplateArgument Arg,
7702 const NamedDecl *Param,
7703 ArrayRef<TemplateArgument> Args,
7718class DependentNameType :
public TypeWithKeyword,
public llvm::FoldingSetNode {
7719 friend class ASTContext;
7722 NestedNameSpecifier NNS;
7725 const IdentifierInfo *Name;
7727 DependentNameType(ElaboratedTypeKeyword Keyword, NestedNameSpecifier NNS,
7728 const IdentifierInfo *Name, QualType CanonType)
7729 : TypeWithKeyword(
Keyword, DependentName, CanonType,
7733 NNS(NNS), Name(Name) {
7739 NestedNameSpecifier getQualifier()
const {
return NNS; }
7747 bool isSugared()
const {
return false; }
7748 QualType desugar()
const {
return QualType(
this, 0); }
7750 void Profile(llvm::FoldingSetNodeID &ID) {
7751 Profile(ID, getKeyword(), NNS, Name);
7754 static void Profile(llvm::FoldingSetNodeID &ID, ElaboratedTypeKeyword Keyword,
7755 NestedNameSpecifier NNS,
const IdentifierInfo *Name) {
7756 ID.AddInteger(llvm::to_underlying(Keyword));
7758 ID.AddPointer(Name);
7761 static bool classof(
const Type *T) {
7788class PackExpansionType :
public Type,
public llvm::FoldingSetNode {
7789 friend class ASTContext;
7794 PackExpansionType(QualType Pattern, QualType Canon,
7795 UnsignedOrNone NumExpansions)
7796 : Type(PackExpansion, Canon,
7801 PackExpansionTypeBits.NumExpansions =
7802 NumExpansions ? *NumExpansions + 1 : 0;
7809 QualType getPattern()
const {
return Pattern; }
7814 if (PackExpansionTypeBits.NumExpansions)
7815 return PackExpansionTypeBits.NumExpansions - 1;
7816 return std::nullopt;
7819 bool isSugared()
const {
return false; }
7820 QualType desugar()
const {
return QualType(
this, 0); }
7822 std::pair<QualType, unsigned> getKey()
const {
7823 return {getPattern(), getNumExpansions().toInternalRepresentation()};
7826 static bool classof(
const Type *T) {
7834class ObjCProtocolQualifiers {
7836 ObjCProtocolQualifiers() =
default;
7838 ObjCProtocolDecl *
const *getProtocolStorage()
const {
7839 return const_cast<ObjCProtocolQualifiers*
>(
this)->getProtocolStorage();
7842 ObjCProtocolDecl **getProtocolStorage() {
7843 return static_cast<T*
>(
this)->getProtocolStorageImpl();
7846 void setNumProtocols(
unsigned N) {
7847 static_cast<T*
>(
this)->setNumProtocolsImpl(N);
7850 void initialize(ArrayRef<ObjCProtocolDecl *> protocols) {
7851 setNumProtocols(protocols.size());
7852 assert(getNumProtocols() == protocols.size() &&
7853 "bitfield overflow in protocol count");
7854 if (!protocols.empty())
7855 memcpy(getProtocolStorage(), protocols.data(),
7856 protocols.size() *
sizeof(ObjCProtocolDecl*));
7860 using qual_iterator = ObjCProtocolDecl *
const *;
7861 using qual_range = llvm::iterator_range<qual_iterator>;
7863 qual_range quals()
const {
return qual_range(qual_begin(), qual_end()); }
7864 qual_iterator qual_begin()
const {
return getProtocolStorage(); }
7865 qual_iterator qual_end()
const {
return qual_begin() + getNumProtocols(); }
7867 bool qual_empty()
const {
return getNumProtocols() == 0; }
7871 unsigned getNumProtocols()
const {
7872 return static_cast<const T*
>(
this)->getNumProtocolsImpl();
7876 ObjCProtocolDecl *getProtocol(
unsigned I)
const {
7877 assert(I < getNumProtocols() &&
"Out-of-range protocol access");
7878 return qual_begin()[I];
7882 ArrayRef<ObjCProtocolDecl *> getProtocols()
const {
7883 return ArrayRef<ObjCProtocolDecl *>(qual_begin(), getNumProtocols());
7889class ObjCTypeParamType :
public Type,
7890 public ObjCProtocolQualifiers<ObjCTypeParamType>,
7891 public llvm::FoldingSetNode {
7892 friend class ASTContext;
7893 friend class ObjCProtocolQualifiers<ObjCTypeParamType>;
7896 unsigned NumProtocols : 6;
7898 ObjCTypeParamDecl *OTPDecl;
7903 ObjCProtocolDecl **getProtocolStorageImpl();
7907 unsigned getNumProtocolsImpl()
const {
7908 return NumProtocols;
7911 void setNumProtocolsImpl(
unsigned N) {
7915 ObjCTypeParamType(
const ObjCTypeParamDecl *D,
7917 ArrayRef<ObjCProtocolDecl *> protocols);
7920 bool isSugared()
const {
return true; }
7921 QualType desugar()
const {
return getCanonicalTypeInternal(); }
7923 static bool classof(
const Type *T) {
7927 ObjCTypeParamDecl *getDecl()
const {
return OTPDecl; }
7929 std::tuple<const ObjCTypeParamDecl *, QualType, ArrayRef<ObjCProtocolDecl *>>
7931 return {getDecl(), getCanonicalTypeInternal(),
7932 llvm::ArrayRef(qual_begin(), getNumProtocols())};
7964class ObjCObjectType :
public Type,
7965 public ObjCProtocolQualifiers<ObjCObjectType> {
7966 friend class ObjCProtocolQualifiers<ObjCObjectType>;
7984 mutable llvm::PointerIntPair<const ObjCObjectType *, 1, bool>
7985 CachedSuperClassType;
7987 QualType *getTypeArgStorage();
7988 const QualType *getTypeArgStorage()
const {
7989 return const_cast<ObjCObjectType *
>(
this)->getTypeArgStorage();
7992 ObjCProtocolDecl **getProtocolStorageImpl();
7995 unsigned getNumProtocolsImpl()
const {
7996 return ObjCObjectTypeBits.NumProtocols;
7998 void setNumProtocolsImpl(
unsigned N) {
7999 ObjCObjectTypeBits.NumProtocols = N;
8003 enum Nonce_ObjCInterface { Nonce_ObjCInterface };
8005 ObjCObjectType(QualType Canonical, QualType Base,
8006 ArrayRef<QualType> typeArgs,
8007 ArrayRef<ObjCProtocolDecl *> protocols,
8010 ObjCObjectType(
enum Nonce_ObjCInterface)
8012 BaseType(QualType(this_(), 0)) {
8013 ObjCObjectTypeBits.NumProtocols = 0;
8014 ObjCObjectTypeBits.NumTypeArgs = 0;
8015 ObjCObjectTypeBits.IsKindOf = 0;
8018 void computeSuperClassTypeSlow()
const;
8029 bool isObjCId()
const {
8030 return getBaseType()->isSpecificBuiltinType(BuiltinType::ObjCId);
8033 bool isObjCClass()
const {
8034 return getBaseType()->isSpecificBuiltinType(BuiltinType::ObjCClass);
8037 bool isObjCUnqualifiedId()
const {
return qual_empty() && isObjCId(); }
8038 bool isObjCUnqualifiedClass()
const {
return qual_empty() && isObjCClass(); }
8039 bool isObjCUnqualifiedIdOrClass()
const {
8040 if (!qual_empty())
return false;
8041 if (
const BuiltinType *T =
getBaseType()->getAs<BuiltinType>())
8042 return T->getKind() == BuiltinType::ObjCId ||
8043 T->getKind() == BuiltinType::ObjCClass;
8046 bool isObjCQualifiedId()
const {
return !qual_empty() && isObjCId(); }
8047 bool isObjCQualifiedClass()
const {
return !qual_empty() && isObjCClass(); }
8051 ObjCInterfaceDecl *getInterface()
const;
8055 bool isSpecialized()
const;
8058 bool isSpecializedAsWritten()
const {
8059 return ObjCObjectTypeBits.NumTypeArgs > 0;
8064 bool isUnspecialized()
const {
return !isSpecialized(); }
8068 bool isUnspecializedAsWritten()
const {
return !isSpecializedAsWritten(); }
8071 ArrayRef<QualType> getTypeArgs()
const;
8075 ArrayRef<QualType> getTypeArgsAsWritten()
const {
8076 return {getTypeArgStorage(), ObjCObjectTypeBits.NumTypeArgs};
8080 bool isKindOfTypeAsWritten()
const {
return ObjCObjectTypeBits.IsKindOf; }
8083 bool isKindOfType()
const;
8091 QualType getSuperClassType()
const {
8092 if (!CachedSuperClassType.getInt())
8093 computeSuperClassTypeSlow();
8095 assert(CachedSuperClassType.getInt() &&
"Superclass not set?");
8096 return QualType(CachedSuperClassType.getPointer(), 0);
8101 QualType stripObjCKindOfTypeAndQuals(
const ASTContext &ctx)
const;
8103 bool isSugared()
const {
return false; }
8104 QualType desugar()
const {
return QualType(
this, 0); }
8106 static bool classof(
const Type *T) {
8116class ObjCObjectTypeImpl :
public ObjCObjectType,
public llvm::FoldingSetNode {
8117 friend class ASTContext;
8122 ObjCObjectTypeImpl(QualType Canonical, QualType Base,
8123 ArrayRef<QualType> typeArgs,
8124 ArrayRef<ObjCProtocolDecl *> protocols,
8126 : ObjCObjectType(Canonical,
Base, typeArgs, protocols, isKindOf) {}
8129 void Profile(llvm::FoldingSetNodeID &ID);
8130 static void Profile(llvm::FoldingSetNodeID &ID,
8132 ArrayRef<QualType> typeArgs,
8133 ArrayRef<ObjCProtocolDecl *> protocols,
8137inline QualType *ObjCObjectType::getTypeArgStorage() {
8138 return reinterpret_cast<QualType *
>(
static_cast<ObjCObjectTypeImpl*
>(
this)+1);
8141inline ObjCProtocolDecl **ObjCObjectType::getProtocolStorageImpl() {
8142 return reinterpret_cast<ObjCProtocolDecl**
>(
8143 getTypeArgStorage() + ObjCObjectTypeBits.NumTypeArgs);
8146inline ObjCProtocolDecl **ObjCTypeParamType::getProtocolStorageImpl() {
8147 return reinterpret_cast<ObjCProtocolDecl**
>(
8148 static_cast<ObjCTypeParamType*
>(
this)+1);
8182 return T->getTypeClass() == ObjCInterface;
8198inline ObjCInterfaceDecl *ObjCObjectType::getInterface()
const {
8199 QualType baseType = getBaseType();
8201 if (
const auto *T = dyn_cast<ObjCInterfaceType>(ObjT))
8202 return T->getDecl();
8204 baseType = ObjT->getBaseType();
8219class ObjCObjectPointerType :
public Type,
public llvm::FoldingSetNode {
8226 PointeeType(Pointee) {}
8369 QualType getSuperClassType()
const;
8379 return T->getTypeClass() == ObjCObjectPointer;
8383class AtomicType :
public Type,
public llvm::FoldingSetNode {
8402 return T->getTypeClass() ==
Atomic;
8407class PipeType :
public Type,
public llvm::FoldingSetNode {
8415 ElementType(elemType), isRead(isRead) {}
8429 return T->getTypeClass() ==
Pipe;
8438 LLVM_PREFERRED_TYPE(
bool)
8439 unsigned IsUnsigned : 1;
8440 unsigned NumBits : 24;
8453 std::pair<unsigned, unsigned>
getKey()
const {
8462 llvm::PointerIntPair<Expr*, 1, bool> ExprAndUnsigned;
8470 Expr *getNumBitsExpr()
const;
8478 static void Profile(llvm::FoldingSetNodeID &ID,
const ASTContext &Context,
8479 bool IsUnsigned,
Expr *NumBitsExpr);
8482 return T->getTypeClass() == DependentBitInt;
8486class PredefinedSugarType final :
public Type {
8499 static StringRef getName(Kind KD);
8513 return T->getTypeClass() == PredefinedSugar;
8527 if (!
type.hasLocalNonFastQualifiers())
8528 return type.getTypePtrUnsafe();
8549class alignas(8) TypeSourceInfo {
8556 TypeSourceInfo(
QualType ty,
size_t DataSize);
8573 Ty->getLocallyUnqualifiedSingleStepDesugaredType().split();
8579 return getCommonPtr()->BaseType;
8583 return (
isNull() ?
nullptr : getCommonPtr()->BaseType);
8591 if (
Self.isObjectType() ||
Self.isReferenceType())
8594 return F->getMethodQuals().empty() && F->getRefQualifier() ==
RQ_None;
8604 const ExtQuals *eq = getExtQualsUnsafe();
8613 Quals = getExtQualsUnsafe()->getQualifiers();
8619 Qualifiers quals = getCommonPtr()->CanonicalType.getLocalQualifiers();
8625 unsigned cvr = getCommonPtr()->CanonicalType.getLocalCVRQualifiers();
8631 QualType canon = getCommonPtr()->CanonicalType;
8636 return getTypePtr()->isCanonicalUnqualified();
8644 if (
T->isVariablyModifiedType() &&
T->hasSizedVLAType())
8653 getCommonPtr()->CanonicalType.isLocalConstQualified();
8658 getCommonPtr()->CanonicalType.isLocalRestrictQualified();
8664 getCommonPtr()->CanonicalType.isLocalVolatileQualified();
8669 getCommonPtr()->CanonicalType.hasLocalQualifiers();
8676 return QualType(getSplitUnqualifiedTypeImpl(*this).Ty, 0);
8683 return getSplitUnqualifiedTypeImpl(*
this);
8715 if (
const auto *FT = PT->getPointeeType()->getAs<
FunctionType>())
8716 return FT->getExtInfo();
8718 return FT->getExtInfo();
8765 return RefType->getPointeeType();
8856 return !
T->getPointeeType()->isFunctionType();
8863 return Fn->hasCFIUncheckedCallee();
8884 return T->getPointeeType()->isFunctionType();
8891 return T->getPointeeType()->isFunctionType();
8902 return T->isMemberFunctionPointer();
8909 return T->isMemberDataPointer();
8969 if (
auto *CMT = dyn_cast<ConstantMatrixType>(CanonicalType))
8970 return CMT->getElementType()->isBooleanType();
9017 return OPT->isObjCQualifiedIdType();
9023 return OPT->isObjCQualifiedClassType();
9029 return OPT->isObjCIdType();
9035 return OPT->isObjCClassType();
9041 return OPT->getPointeeType()->isSpecificBuiltinType(BuiltinType::ObjCSel);
9053#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
9054 inline bool Type::is##Id##Type() const { \
9055 return isSpecificBuiltinType(BuiltinType::Id); \
9057#include "clang/Basic/OpenCLImageTypes.def"
9080#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) is##Id##Type() ||
9082#include "clang/Basic/OpenCLImageTypes.def"
9094#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
9095 inline bool Type::is##Id##Type() const { \
9096 return isSpecificBuiltinType(BuiltinType::Id); \
9098#include "clang/Basic/OpenCLExtensionTypes.def"
9101#define INTEL_SUBGROUP_AVC_TYPE(ExtType, Id) \
9102 isOCLIntelSubgroupAVC##Id##Type() ||
9104#include "clang/Basic/OpenCLExtensionTypes.def"
9109#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) is##Id##Type() ||
9111#include "clang/Basic/OpenCLExtensionTypes.def"
9120#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) \
9121 inline bool Type::is##Id##Type() const { \
9122 return isSpecificBuiltinType(BuiltinType::Id); \
9124#include "clang/Basic/HLSLIntangibleTypes.def"
9126#define HLSL_PACKED_TYPE(Name, Id, SingletonId) \
9127 inline bool Type::is##Id##Type() const { \
9128 return isSpecificBuiltinType(BuiltinType::Id); \
9130#include "clang/Basic/HLSLPackedTypes.def"
9132#define SPIRV_TYPE(Name, Id, SingletonId) \
9133 inline bool Type::is##Id##Type() const { \
9134 return isSpecificBuiltinType(BuiltinType::Id); \
9136#include "clang/Basic/SPIRVTypes.def"
9139#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) is##Id##Type() ||
9141#include "clang/Basic/HLSLIntangibleTypes.def"
9146#define HLSL_PACKED_TYPE(Name, Id, SingletonId) is##Id##Type() ||
9148#include "clang/Basic/HLSLPackedTypes.def"
9177 if (
const auto *BT = dyn_cast<BuiltinType>(
this))
9178 return BT->isPlaceholderType();
9183 if (
const auto *BT = dyn_cast<BuiltinType>(
this))
9184 if (BT->isPlaceholderType())
9195 if (
const auto *BT = dyn_cast<BuiltinType>(
this))
9196 return BT->isNonOverloadPlaceholderType();
9249 if (
const auto *BT = dyn_cast<BuiltinType>(CanonicalType))
9250 return BT->isInteger();
9251 if (
const EnumType *ET = dyn_cast<EnumType>(CanonicalType)) {
9258 if (
const auto *OT = dyn_cast<OverflowBehaviorType>(CanonicalType))
9259 return OT->getUnderlyingType()->isIntegerType();
9265 if (
const auto *BT = dyn_cast<BuiltinType>(CanonicalType)) {
9266 return BT->getKind() >= BuiltinType::ShortAccum &&
9267 BT->getKind() <= BuiltinType::SatULongFract;
9281 if (
const auto *BT = dyn_cast<BuiltinType>(CanonicalType)) {
9282 return BT->getKind() >= BuiltinType::SatShortAccum &&
9283 BT->getKind() <= BuiltinType::SatULongFract;
9293 if (
const auto *BT = dyn_cast<BuiltinType>(CanonicalType)) {
9294 return ((BT->getKind() >= BuiltinType::ShortAccum &&
9295 BT->getKind() <= BuiltinType::LongAccum) ||
9296 (BT->getKind() >= BuiltinType::ShortFract &&
9297 BT->getKind() <= BuiltinType::LongFract) ||
9298 (BT->getKind() >= BuiltinType::SatShortAccum &&
9299 BT->getKind() <= BuiltinType::SatLongAccum) ||
9300 (BT->getKind() >= BuiltinType::SatShortFract &&
9301 BT->getKind() <= BuiltinType::SatLongFract));
9311 if (
const auto *BT = dyn_cast<BuiltinType>(CanonicalType))
9312 return BT->getKind() > BuiltinType::Void &&
9313 BT->getKind() <= BuiltinType::NullPtr;
9314 if (
const EnumType *ET = dyn_cast<EnumType>(CanonicalType))
9327 if (
const auto *BT = dyn_cast<BuiltinType>(CanonicalType))
9328 return BT->isInteger();
9332 if (
const auto *ET = dyn_cast<EnumType>(CanonicalType))
9335 if (
const auto *OBT = dyn_cast<OverflowBehaviorType>(CanonicalType))
9336 return OBT->getUnderlyingType()->isIntegralOrEnumerationType();
9342 if (
const auto *BT = dyn_cast<BuiltinType>(CanonicalType))
9343 return BT->getKind() == BuiltinType::Bool;
9349 return DT && !DT->isDeduced();
9366 return TST->isTypeAlias();
9393 if (
type->isAnyPointerType())
9394 return type->getPointeeType().getTypePtr();
9395 else if (
type->isArrayType())
9396 return type->getBaseElementTypeUnsafe();
9433 "ArrayType cannot be used with getAs!");
9436 if (
const auto *Ty = dyn_cast<T>(
this))
9440 if (!
isa<T>(CanonicalType))
9452 if (
const auto *Ty = dyn_cast<T>(
this))
9456 if (!
isa<T>(CanonicalType))
9461 const Type *Ty =
this;
9463 if (
const auto *A = dyn_cast<AttributedType>(Ty))
9464 Ty = A->getModifiedType().getTypePtr();
9465 else if (
const auto *A = dyn_cast<BTFTagAttributedType>(Ty))
9466 Ty = A->getWrappedType().getTypePtr();
9467 else if (
const auto *A = dyn_cast<HLSLAttributedResourceType>(Ty))
9468 Ty = A->getWrappedType().getTypePtr();
9469 else if (
const auto *P = dyn_cast<ParenType>(Ty))
9470 Ty = P->desugar().getTypePtr();
9471 else if (
const auto *A = dyn_cast<AdjustedType>(Ty))
9472 Ty = A->desugar().getTypePtr();
9473 else if (
const auto *M = dyn_cast<MacroQualifiedType>(Ty))
9474 Ty = M->desugar().getTypePtr();
9481 return dyn_cast<T>(Ty);
9486 if (
const auto *arr = dyn_cast<ArrayType>(
this))
9500 "ArrayType cannot be used with castAs!");
9502 if (
const auto *ty = dyn_cast<T>(
this))
return ty;
9503 assert(
isa<T>(CanonicalType));
9509 if (
const auto *arr = dyn_cast<ArrayType>(
this))
return arr;
9515 :
AdjustedType(Decayed, OriginalType, DecayedPtr, CanonicalPtr) {
9517 QualType Adjusted = getAdjustedType();
9518 (void)AttributedType::stripOuterNullability(Adjusted);
9525 (void)AttributedType::stripOuterNullability(Decayed);
9540 TypePtr = Pointee.getTypePtr();
9546 if (
const auto *FPT = TypePtr->
getAs<FunctionProtoType>())
9547 return FPT->getFunctionEffects();
Provides definitions for the various language-specific address spaces.
Defines the clang::attr::Kind enum.
Defines the Diagnostic-related interfaces.
static bool isBooleanType(QualType Ty)
static bool isUnsigned(SValBuilder &SVB, NonLoc Value)
llvm::dxil::ResourceClass ResourceClass
static std::optional< NonLoc > getIndex(ProgramStateRef State, const ElementRegion *ER, CharKind CK)
clang::CharUnits operator*(clang::CharUnits::QuantityType Scale, 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 isMatrixType(QualType QT)
static bool isParameterPack(Expr *PackExpression)
Defines the clang::SourceLocation class and associated facilities.
Defines various enumerations that describe declaration and type specifiers.
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)
AdjustedType(TypeClass TC, QualType OriginalTy, QualType AdjustedTy, QualType CanonicalPtr)
QualType getAdjustedType() const
QualType getOriginalType() const
std::pair< QualType, QualType > getKey() 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
QualType getValueType() const
Gets the type contained by this atomic type, i.e.
static bool classof(const Type *T)
Attr - This represents one attribute.
static bool classof(const Type *T)
BitIntType(bool isUnsigned, unsigned NumBits)
std::pair< unsigned, unsigned > getKey() const
unsigned getNumBits() const
QualType getPointeeType() const
static bool classof(const Type *T)
[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 bool classof(const Type *T)
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.
void Profile(llvm::FoldingSetNodeID &ID)
std::optional< LayoutKind > getLayout() const
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.
std::optional< LayoutKind > Layout
static void Profile(llvm::FoldingSetNodeID &ID, QualType ElementType, unsigned NumRows, unsigned NumColumns, std::optional< LayoutKind > Layout, TypeClass TypeClass)
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)
ConstantMatrixType(QualType MatrixElementType, unsigned NRows, unsigned NColumns, QualType CanonElementType, std::optional< LayoutKind > Layout)
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
BoundsAttrKind 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,...
static void Profile(llvm::FoldingSetNodeID &ID, QualType Result, param_type_iterator ArgTys, unsigned NumArgs, const ExtProtoInfo &EPI, const ASTContext &Context)
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().
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)
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.
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.
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.
static bool classof(const Type *T)
QualType getInnerType() const
QualType getElementType() const
static bool classof(const Type *T)
std::pair< QualType, bool > getKey() const
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)
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
QualType stripNullability(const ASTContext &ctx) const
Strip nullability attributes from the given type.
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
std::pair< QualType, bool > getKey() const
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 isHLSLBuiltinPackedType() const
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
bool isMetaInfoType() 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)
unsigned getRVVFixedLengthMaskLanes() const
Return the number of lanes of an RVV fixed-length mask vector.
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.
Top level wrappers for InstallAPI frontend operations.
CanQual< Type > CanQualType
Represents a canonical, potentially-qualified type.
VectorKind getRVVFixedLengthDataVectorKind(int LMulLog2)
Inverse of getRVVFixedLengthDataLMulLog2().
@ 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)
bool isRVVFixedLengthDataVectorKind(VectorKind VK)
True if VK is one of the RVV fixed-length data vector kinds, i.e.
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.
VectorKind getRVVFixedLengthMaskVectorKind(unsigned RatioLog2, unsigned SubByteLanes)
Inverse of getRVVFixedLengthMaskRatioLog2() and getRVVFixedLengthMaskSubByteLanes().
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.
@ Create
'create' clause, allowed on Compute and Combined constructs, plus 'data', 'enter data',...
@ 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)
unsigned getRVVFixedLengthMaskRatioLog2(VectorKind VK)
Return log2 of the R of the vbool<R>_t type recorded in an RVV fixed-length mask vector kind: Ratio1 ...
nullptr
This class represents a compute construct, representing a 'Kind' of ‘parallel’, 'serial',...
TypeDependence toTypeDependence(ExprDependence D)
StringRef getRVVFixedLengthString(VectorKind VK)
Return the LMUL of an RVV fixed-length data vector kind, "mf8" .
bool isRVVFixedLengthVectorKind(VectorKind VK)
True if VK is one of the RVV fixed-length data or mask vector kinds.
@ 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.
unsigned getRVVFixedLengthMaskSubByteLanes(VectorKind VK)
Return the number of lanes (1, 2 or 4) of an RVV fixed-length mask vector kind that fits in less than...
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
int getRVVFixedLengthDataLMulLog2(VectorKind VK)
Return log2 of the LMUL recorded in an RVV fixed-length data vector kind: MF8 -> -3,...
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.
@ RVVFixedLengthMaskRatio8
@ RVVFixedLengthMaskRatio4
@ AltiVecBool
is AltiVec 'vector bool ...'
@ RVVFixedLengthMaskRatio2_2
@ SveFixedLengthData
is AArch64 SVE fixed-length data vector
@ RVVFixedLengthMaskRatio8_2
@ AltiVecVector
is AltiVec vector
@ RVVFixedLengthMaskRatio2_4
@ AltiVecPixel
is AltiVec 'vector Pixel'
@ RVVFixedLengthMaskRatio32_1
@ RVVFixedLengthMaskRatio1_4
@ RVVFixedLengthMaskRatio64_2
@ Generic
not a target-specific vector type
@ RVVFixedLengthMaskRatio8_1
@ RVVFixedLengthMaskRatio1
is RISC-V RVV fixed-length mask vector of vbool<R>_t; the _<L> kinds have only L lanes in a single by...
@ RVVFixedLengthMaskRatio2_1
@ RVVFixedLengthMaskRatio64_1
@ RVVFixedLengthMaskRatio1_1
@ RVVFixedLengthMaskRatio1_2
@ RVVFixedLengthMaskRatio32_2
@ RVVFixedLengthMaskRatio64_4
@ RVVFixedLengthMaskRatio32_4
@ RVVFixedLengthData_MF8
is RISC-V RVV fixed-length data vector
@ RVVFixedLengthMaskRatio16_2
@ RVVFixedLengthMaskRatio8_4
@ RVVFixedLengthMaskRatio2
@ RVVFixedLengthMaskRatio16
@ RVVFixedLengthMaskRatio4_1
@ RVVFixedLengthMaskRatio16_1
@ RVVFixedLengthMaskRatio4_2
@ NeonPoly
is ARM Neon polynomial vector
@ SveFixedLengthPredicate
is AArch64 SVE fixed-length predicate vector
@ RVVFixedLengthMaskRatio32
@ RVVFixedLengthMaskRatio4_4
@ RVVFixedLengthMaskRatio16_4
@ RVVFixedLengthMaskRatio64
U cast(CodeGen::Address addr)
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)
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
bool isRVVFixedLengthMaskVectorKind(VectorKind VK)
True if VK is one of the RVV fixed-length mask vector kinds, i.e.
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...
__builtin_riscv_nclipru_u32 int64_t
__builtin_riscv_nclipru_u32 __builtin_riscv_nclip_i32 int32_t uint32_t uint32_t __builtin_riscv_mhacc_i32 __builtin_riscv_mhaccu_u32 __builtin_riscv_mhaccsu_i32 __builtin_riscv_mulq_i32 __builtin_riscv_mqwacc_i64 uint8_t
__builtin_riscv_nclipru_u32 __builtin_riscv_nclip_i32 int32_t uint32_t uint32_t __builtin_riscv_mhacc_i32 __builtin_riscv_mhaccu_u32 __builtin_riscv_mhaccsu_i32 __builtin_riscv_mulq_i32 __builtin_riscv_mqwacc_i64 __packed_splat4 uint16_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