17#ifndef LLVM_CLANG_AST_TYPE_BASE_H
18#define LLVM_CLANG_AST_TYPE_BASE_H
35#include "llvm/ADT/APInt.h"
36#include "llvm/ADT/APSInt.h"
37#include "llvm/ADT/ArrayRef.h"
38#include "llvm/ADT/FoldingSet.h"
39#include "llvm/ADT/PointerIntPair.h"
40#include "llvm/ADT/PointerUnion.h"
41#include "llvm/ADT/STLForwardCompat.h"
42#include "llvm/ADT/StringRef.h"
43#include "llvm/ADT/Twine.h"
44#include "llvm/ADT/iterator_range.h"
45#include "llvm/Support/Casting.h"
46#include "llvm/Support/Compiler.h"
47#include "llvm/Support/DXILABI.h"
48#include "llvm/Support/ErrorHandling.h"
49#include "llvm/Support/PointerLikeTypeTraits.h"
50#include "llvm/Support/TrailingObjects.h"
51#include "llvm/Support/type_traits.h"
79namespace serialization {
80 template <
class T>
class AbstractTypeReader;
117template <
typename>
class CanQual;
122class ExtQualsTypeCommonBase;
124class FunctionEffectsRef;
125class FunctionEffectKindSet;
126class FunctionEffectSet;
129class ObjCInterfaceDecl;
130class ObjCProtocolDecl;
131class ObjCTypeParamDecl;
132struct PrintingPolicy;
136class ClassTemplateDecl;
137class TemplateArgument;
138class TemplateArgumentListInfo;
139class TemplateArgumentLoc;
140class TemplateTypeParmDecl;
141class TypedefNameDecl;
142class UnresolvedUsingTypenameDecl;
143class UsingShadowDecl;
148#define TYPE(Class, Base) class Class##Type;
149#include "clang/AST/TypeNodes.inc"
152class PointerAuthQualifier {
156 EnabledMask = 1 << EnabledShift,
157 AddressDiscriminatedShift = EnabledShift + EnabledBits,
158 AddressDiscriminatedBits = 1,
159 AddressDiscriminatedMask = 1 << AddressDiscriminatedShift,
160 AuthenticationModeShift =
161 AddressDiscriminatedShift + AddressDiscriminatedBits,
162 AuthenticationModeBits = 2,
163 AuthenticationModeMask = ((1 << AuthenticationModeBits) - 1)
164 << AuthenticationModeShift,
165 IsaPointerShift = AuthenticationModeShift + AuthenticationModeBits,
167 IsaPointerMask = ((1 << IsaPointerBits) - 1) << IsaPointerShift,
168 AuthenticatesNullValuesShift = IsaPointerShift + IsaPointerBits,
169 AuthenticatesNullValuesBits = 1,
170 AuthenticatesNullValuesMask = ((1 << AuthenticatesNullValuesBits) - 1)
171 << AuthenticatesNullValuesShift,
172 KeyShift = AuthenticatesNullValuesShift + AuthenticatesNullValuesBits,
174 KeyMask = ((1 << KeyBits) - 1) << KeyShift,
175 DiscriminatorShift = KeyShift + KeyBits,
176 DiscriminatorBits = 16,
177 DiscriminatorMask = ((1u << DiscriminatorBits) - 1) << DiscriminatorShift,
188 static_assert((EnabledBits + AddressDiscriminatedBits +
189 AuthenticationModeBits + IsaPointerBits +
190 AuthenticatesNullValuesBits + KeyBits + DiscriminatorBits) ==
192 "PointerAuthQualifier should be exactly 32 bits");
193 static_assert((EnabledMask + AddressDiscriminatedMask +
194 AuthenticationModeMask + IsaPointerMask +
195 AuthenticatesNullValuesMask + KeyMask + DiscriminatorMask) ==
197 "All masks should cover the entire bits");
198 static_assert((EnabledMask ^ AddressDiscriminatedMask ^
199 AuthenticationModeMask ^ IsaPointerMask ^
200 AuthenticatesNullValuesMask ^ KeyMask ^ DiscriminatorMask) ==
202 "All masks should cover the entire bits");
205 unsigned ExtraDiscriminator,
207 bool IsIsaPointer,
bool AuthenticatesNullValues)
209 (IsAddressDiscriminated
210 ? llvm::to_underlying(AddressDiscriminatedMask)
213 (llvm::to_underlying(AuthenticationMode)
214 << AuthenticationModeShift) |
215 (ExtraDiscriminator << DiscriminatorShift) |
216 (IsIsaPointer << IsaPointerShift) |
217 (AuthenticatesNullValues << AuthenticatesNullValuesShift)) {
220 assert((Data == 0) ==
238 static PointerAuthQualifier
239 Create(
unsigned Key,
bool IsAddressDiscriminated,
unsigned ExtraDiscriminator,
241 bool AuthenticatesNullValues) {
246 AuthenticationMode, IsIsaPointer,
247 AuthenticatesNullValues);
251 assert((Data == 0) ==
260 return (Data & KeyMask) >> KeyShift;
267 return (Data & AddressDiscriminatedMask) >> AddressDiscriminatedShift;
272 return (Data >> DiscriminatorShift);
277 AuthenticationModeShift);
282 return (Data & IsaPointerMask) >> IsaPointerShift;
287 return (Data & AuthenticatesNullValuesMask) >> AuthenticatesNullValuesShift;
294 friend bool operator==(PointerAuthQualifier Lhs, PointerAuthQualifier Rhs) {
295 return Lhs.Data == Rhs.Data;
297 friend bool operator!=(PointerAuthQualifier Lhs, PointerAuthQualifier Rhs) {
298 return Lhs.Data != Rhs.Data;
309 PointerAuthQualifier
Result;
311 assert((
Result.Data == 0) ==
322 void Profile(llvm::FoldingSetNodeID &ID)
const { ID.AddInteger(Data); }
389 LPtrAuth == R.getPointerAuth()) {
393 R.setPointerAuth(
Empty);
398 Q.Mask = L.Mask & R.Mask;
407 R.removeCVRQualifiers(CommonCRV);
412 R.removeObjCGCAttr();
418 R.removeObjCLifetime();
424 R.removeAddressSpace();
492 assert(!(mask & ~
CVRMask) &&
"bitmask contains non-CVR bits");
496 assert(!(mask & ~
CVRMask) &&
"bitmask contains non-CVR bits");
497 Mask &= ~static_cast<uint64_t>(mask);
503 assert(!(mask & ~
CVRMask) &&
"bitmask contains non-CVR bits");
507 assert(!(mask & ~
CVRMask & ~UMask) &&
"bitmask contains non-CVRU bits");
513 Mask = (Mask & ~UMask) | (flag ? UMask : 0);
521 Mask = (Mask & ~GCAttrMask) | (
type << GCAttrShift);
546 return ObjCLifetime((Mask & LifetimeMask) >> LifetimeShift);
549 Mask = (Mask & ~LifetimeMask) | (
type << LifetimeShift);
555 Mask |= (
type << LifetimeShift);
572 return static_cast<LangAS>((Mask & AddressSpaceMask) >> AddressSpaceShift);
593 Mask = (Mask & ~AddressSpaceMask)
594 | (((uint32_t) space) << AddressSpaceShift);
607 Mask = (Mask & ~PtrAuthMask) |
621 assert(!(mask & ~
FastMask) &&
"bitmask contains non-fast qualifier bits");
625 assert(!(mask & ~
FastMask) &&
"bitmask contains non-fast qualifier bits");
626 Mask &= ~static_cast<uint64_t>(mask);
632 assert(!(mask & ~
FastMask) &&
"bitmask contains non-fast qualifier bits");
647 bool empty()
const {
return !Mask; }
802 bool appendSpaceIfNonEmpty =
false)
const;
804 void Profile(llvm::FoldingSetNodeID &ID)
const { ID.AddInteger(Mask); }
811 "PointerAuthQualifier must be 32 bits");
813 static constexpr uint64_t PtrAuthShift = 32;
814 static constexpr uint64_t PtrAuthMask = UINT64_C(0xffffffff) << PtrAuthShift;
816 static constexpr uint64_t UMask = 0x8;
817 static constexpr uint64_t UShift = 3;
818 static constexpr uint64_t GCAttrMask = 0x30;
819 static constexpr uint64_t GCAttrShift = 4;
820 static constexpr uint64_t LifetimeMask = 0x1C0;
821 static constexpr uint64_t LifetimeShift = 6;
822 static constexpr uint64_t AddressSpaceMask =
823 ~(
CVRMask | UMask | GCAttrMask | LifetimeMask | PtrAuthMask);
824 static constexpr uint64_t AddressSpaceShift = 9;
834 : Quals(Quals), HasAtomic(HasAtomic) {}
854 return {Quals.withVolatile(), HasAtomic};
858 return {Quals.withRestrict(), HasAtomic};
883 std::pair<const Type *,Qualifiers>
asPair()
const {
884 return std::pair<const Type *, Qualifiers>(
Ty,
Quals);
888 return a.
Ty ==
b.Ty && a.
Quals ==
b.Quals;
891 return a.
Ty !=
b.Ty || a.
Quals !=
b.Quals;
941 llvm::PointerIntPair<llvm::PointerUnion<const Type *, const ExtQuals *>,
944 const ExtQuals *getExtQualsUnsafe()
const {
948 const Type *getTypePtrUnsafe()
const {
952 const ExtQualsTypeCommonBase *getCommonPtr()
const {
953 assert(!
isNull() &&
"Cannot retrieve a NULL type pointer");
954 auto CommonPtrVal =
reinterpret_cast<uintptr_t>(
Value.getOpaqueValue());
956 return reinterpret_cast<ExtQualsTypeCommonBase*
>(CommonPtrVal);
988 T.Value.setFromOpaqueValue(
const_cast<void*
>(Ptr));
1005 return Value.getPointer().isNull();
1032 std::optional<NonConstantStorageReason>
1196 &&
"non-fast qualifier bits set in mask!");
1197 Value.setInt(Value.getInt() | TQs);
1207 Value.setInt(Value.getInt() & ~Mask);
1214 T.addFastQualifiers(TQs);
1227 T.removeLocalFastQualifiers();
1321 return getSingleStepDesugaredTypeImpl(*
this, Context);
1334 return LHS.Value == RHS.Value;
1337 return LHS.Value != RHS.Value;
1340 return LHS.Value < RHS.Value;
1354 const Twine &PlaceHolder = Twine(),
1355 unsigned Indentation = 0)
const;
1359 unsigned Indentation = 0) {
1360 return print(
split.Ty,
split.Quals, OS, policy, PlaceHolder, Indentation);
1365 const Twine &PlaceHolder,
1366 unsigned Indentation = 0);
1383 const Twine &PlaceHolder;
1384 unsigned Indentation;
1388 const Twine &PlaceHolder,
unsigned Indentation)
1389 : T(T), Policy(Policy), PlaceHolder(PlaceHolder),
1390 Indentation(Indentation) {}
1394 SQT.T.
print(OS, SQT.Policy, SQT.PlaceHolder, SQT.Indentation);
1400 const Twine &PlaceHolder = Twine(),
1401 unsigned Indentation = 0)
const {
1405 void dump(
const char *
s)
const;
1407 void dump(llvm::raw_ostream &OS,
const ASTContext &Context)
const;
1470 return PtrAuth.isAddressDiscriminated();
1557 return isDestructedTypeImpl(*
this);
1659raw_ostream &
operator<<(raw_ostream &OS, QualType QT);
1697class ExtQualsTypeCommonBase {
1708 const Type *
const BaseType;
1713 ExtQualsTypeCommonBase(
const Type *baseType,
QualType canon)
1714 : BaseType(baseType), CanonicalType(canon) {}
1727class alignas(TypeAlignment)
ExtQuals :
public ExtQualsTypeCommonBase,
1728 public llvm::FoldingSetNode {
1750 : ExtQualsTypeCommonBase(baseType,
1751 canon.isNull() ?
QualType(this_(), 0) : canon),
1753 assert(Quals.hasNonFastQualifiers()
1754 &&
"ExtQuals created with no fast qualifiers");
1755 assert(!Quals.hasFastQualifiers()
1756 &&
"ExtQuals created with fast qualifiers");
1766 return Quals.getObjCLifetime();
1780 const Type *BaseType,
1782 assert(!Quals.hasFastQualifiers() &&
"fast qualifiers in ExtQuals hash!");
1783 ID.AddPointer(BaseType);
1841enum class ArraySizeModifier;
1842enum class ElaboratedTypeKeyword;
1843enum class VectorKind;
1871class alignas(TypeAlignment)
Type :
public ExtQualsTypeCommonBase {
1874#define TYPE(Class, Base) Class,
1875#define LAST_TYPE(Class) TypeLast = Class
1876#define ABSTRACT_TYPE(Class, Base)
1877#include "clang/AST/TypeNodes.inc"
1882 class TypeBitfields {
1884 template <
class T>
friend class TypePropertyCache;
1887 LLVM_PREFERRED_TYPE(TypeClass)
1892 unsigned Dependence : llvm::BitWidth<TypeDependence>;
1896 LLVM_PREFERRED_TYPE(
bool)
1897 mutable unsigned CacheValid : 1;
1901 mutable unsigned CachedLinkage : 3;
1904 LLVM_PREFERRED_TYPE(
bool)
1905 mutable unsigned CachedLocalOrUnnamed : 1;
1908 LLVM_PREFERRED_TYPE(
bool)
1909 mutable unsigned FromAST : 1;
1911 bool isCacheValid()
const {
1916 assert(isCacheValid() &&
"getting linkage from invalid cache");
1917 return static_cast<Linkage>(CachedLinkage);
1920 bool hasLocalOrUnnamedType()
const {
1921 assert(isCacheValid() &&
"getting linkage from invalid cache");
1922 return CachedLocalOrUnnamed;
1925 enum { NumTypeBits = 8 + llvm::BitWidth<TypeDependence> + 6 };
1934 LLVM_PREFERRED_TYPE(TypeBitfields)
1940 unsigned IndexTypeQuals : 3;
1945 unsigned SizeModifier : 3;
1956 LLVM_PREFERRED_TYPE(
bool)
1957 unsigned HasExternalSize : 1;
1959 LLVM_PREFERRED_TYPE(
unsigned)
1960 unsigned SizeWidth : 5;
1966 LLVM_PREFERRED_TYPE(TypeBitfields)
1970 static constexpr unsigned NumOfBuiltinTypeBits = 10;
1971 unsigned Kind : NumOfBuiltinTypeBits;
1986 LLVM_PREFERRED_TYPE(TypeBitfields)
1993 unsigned RefQualifier : 2;
2004 LLVM_PREFERRED_TYPE(
bool)
2005 unsigned HasExtQuals : 1;
2009 unsigned ExceptionSpecType : 4;
2012 LLVM_PREFERRED_TYPE(
bool)
2013 unsigned HasExtParameterInfos : 1;
2016 LLVM_PREFERRED_TYPE(
bool)
2017 unsigned HasExtraBitfields : 1;
2020 LLVM_PREFERRED_TYPE(
bool)
2021 unsigned Variadic : 1;
2024 LLVM_PREFERRED_TYPE(
bool)
2025 unsigned HasTrailingReturn : 1;
2028 LLVM_PREFERRED_TYPE(
bool)
2029 unsigned CFIUncheckedCallee : 1;
2034 unsigned ExtInfo : 14;
2046 LLVM_PREFERRED_TYPE(TypeBitfields)
2050 unsigned NumTypeArgs : 7;
2053 unsigned NumProtocols : 6;
2056 LLVM_PREFERRED_TYPE(
bool)
2057 unsigned IsKindOf : 1;
2063 LLVM_PREFERRED_TYPE(TypeBitfields)
2077 LLVM_PREFERRED_TYPE(
bool)
2078 unsigned SpelledAsLValue : 1;
2082 LLVM_PREFERRED_TYPE(
bool)
2083 unsigned InnerRef : 1;
2089 LLVM_PREFERRED_TYPE(TypeBitfields)
2094 unsigned Keyword : 8;
2106 LLVM_PREFERRED_TYPE(
bool)
2107 unsigned HasQualifier : 1;
2110 LLVM_PREFERRED_TYPE(
bool)
2111 unsigned OwnsTag : 1;
2114 LLVM_PREFERRED_TYPE(
bool)
2115 unsigned IsInjected : 1;
2122 LLVM_PREFERRED_TYPE(TypeBitfields)
2128 unsigned VecKind : 4;
2130 uint32_t NumElements;
2136 LLVM_PREFERRED_TYPE(TypeBitfields)
2140 unsigned AttrKind : 32 - NumTypeBits;
2166 unsigned Keyword : 2;
2182 LLVM_PREFERRED_TYPE(TypeBitfields)
2195 LLVM_PREFERRED_TYPE(
bool)
2196 unsigned hasQualifier : 1;
2206 LLVM_PREFERRED_TYPE(
bool)
2207 unsigned hasQualifier : 1;
2217 LLVM_PREFERRED_TYPE(
bool)
2218 unsigned hasQualifier : 1;
2221 LLVM_PREFERRED_TYPE(
bool)
2222 unsigned hasTypeDifferentFromDecl : 1;
2228 LLVM_PREFERRED_TYPE(TypeBitfields)
2232 unsigned Depth : 15;
2235 LLVM_PREFERRED_TYPE(
bool)
2236 unsigned ParameterPack : 1;
2239 unsigned Index : 16;
2245 LLVM_PREFERRED_TYPE(TypeBitfields)
2248 LLVM_PREFERRED_TYPE(
bool)
2249 unsigned HasNonCanonicalUnderlyingType : 1;
2252 unsigned Index : 15;
2254 LLVM_PREFERRED_TYPE(
bool)
2262 unsigned PackIndex : 15;
2269 LLVM_PREFERRED_TYPE(TypeBitfields)
2276 unsigned NumArgs : 16;
2282 unsigned SubstTemplTypeParmPackIndex : 16;
2292 LLVM_PREFERRED_TYPE(
bool)
2293 unsigned TypeAlias : 1;
2308 LLVM_PREFERRED_TYPE(TypeBitfields)
2322 unsigned NumExpansions;
2342 LLVM_PREFERRED_TYPE(TypeBitfields)
2352 LLVM_PREFERRED_TYPE(TypeBitfields)
2355 static constexpr unsigned NumCoupledDeclsBits = 4;
2356 unsigned NumCoupledDecls : NumCoupledDeclsBits;
2357 LLVM_PREFERRED_TYPE(
bool)
2358 unsigned CountInBytes : 1;
2359 LLVM_PREFERRED_TYPE(
bool)
2360 unsigned OrNull : 1;
2395 void setFromAST(
bool V =
true)
const {
2403 : ExtQualsTypeCommonBase(this,
2405 static_assert(
sizeof(*this) <=
2406 alignof(
decltype(*this)) +
sizeof(ExtQualsTypeCommonBase),
2407 "changing bitfields changed sizeof(Type)!");
2408 static_assert(
alignof(
decltype(*this)) %
TypeAlignment == 0,
2409 "Insufficient alignment!");
2413 TypeBits.CachedLocalOrUnnamed =
false;
2422 TypeBits.Dependence =
static_cast<unsigned>(D);
2465 return CanonicalType ==
QualType(
this, 0);
2471 QualType getLocallyUnqualifiedSingleStepDesugaredType()
const;
2479 bool isSizelessType()
const;
2480 bool isSizelessBuiltinType()
const;
2483 bool isSizelessVectorType()
const;
2486 bool isSVESizelessBuiltinType()
const;
2489 bool isRVVSizelessBuiltinType()
const;
2492 bool isWebAssemblyExternrefType()
const;
2497 bool isWebAssemblyTableType()
const;
2502 bool isSveVLSBuiltinType()
const;
2512 bool isRVVVLSBuiltinType()
const;
2534 bool isIncompleteType(
NamedDecl **Def =
nullptr)
const;
2560 bool isAlwaysIncompleteType()
const;
2572 bool isLiteralType(
const ASTContext &Ctx)
const;
2575 bool isStructuralType()
const;
2579 bool isStandardLayoutType()
const;
2585 bool isBuiltinType()
const;
2588 bool isSpecificBuiltinType(
unsigned K)
const;
2593 bool isPlaceholderType()
const;
2597 bool isSpecificPlaceholderType(
unsigned K)
const;
2601 bool isNonOverloadPlaceholderType()
const;
2605 bool isIntegerType()
const;
2606 bool isEnumeralType()
const;
2609 bool isScopedEnumeralType()
const;
2611 bool isCharType()
const;
2612 bool isWideCharType()
const;
2613 bool isChar8Type()
const;
2614 bool isChar16Type()
const;
2615 bool isChar32Type()
const;
2616 bool isAnyCharacterType()
const;
2617 bool isUnicodeCharacterType()
const;
2618 bool isIntegralType(
const ASTContext &Ctx)
const;
2621 bool isIntegralOrEnumerationType()
const;
2624 bool isIntegralOrUnscopedEnumerationType()
const;
2625 bool isUnscopedEnumerationType()
const;
2628 bool isRealFloatingType()
const;
2631 bool isComplexType()
const;
2632 bool isAnyComplexType()
const;
2633 bool isFloatingType()
const;
2634 bool isHalfType()
const;
2635 bool isFloat16Type()
const;
2636 bool isFloat32Type()
const;
2637 bool isDoubleType()
const;
2638 bool isBFloat16Type()
const;
2639 bool isMFloat8Type()
const;
2640 bool isFloat128Type()
const;
2641 bool isIbm128Type()
const;
2642 bool isRealType()
const;
2643 bool isArithmeticType()
const;
2644 bool isVoidType()
const;
2645 bool isScalarType()
const;
2646 bool isAggregateType()
const;
2647 bool isFundamentalType()
const;
2648 bool isCompoundType()
const;
2652 bool isFunctionType()
const;
2655 bool isPointerType()
const;
2656 bool isPointerOrReferenceType()
const;
2657 bool isSignableType(
const ASTContext &Ctx)
const;
2658 bool isSignablePointerType()
const;
2659 bool isSignableIntegerType(
const ASTContext &Ctx)
const;
2660 bool isAnyPointerType()
const;
2661 bool isCountAttributedType()
const;
2662 bool isCFIUncheckedCalleeFunctionType()
const;
2663 bool hasPointeeToCFIUncheckedCalleeFunctionType()
const;
2664 bool isBlockPointerType()
const;
2665 bool isVoidPointerType()
const;
2666 bool isReferenceType()
const;
2667 bool isLValueReferenceType()
const;
2668 bool isRValueReferenceType()
const;
2669 bool isObjectPointerType()
const;
2670 bool isFunctionPointerType()
const;
2671 bool isFunctionReferenceType()
const;
2672 bool isMemberPointerType()
const;
2673 bool isMemberFunctionPointerType()
const;
2674 bool isMemberDataPointerType()
const;
2675 bool isArrayType()
const;
2676 bool isConstantArrayType()
const;
2677 bool isIncompleteArrayType()
const;
2678 bool isVariableArrayType()
const;
2679 bool isArrayParameterType()
const;
2680 bool isDependentSizedArrayType()
const;
2682 bool isClassType()
const;
2683 bool isStructureType()
const;
2684 bool isStructureTypeWithFlexibleArrayMember()
const;
2685 bool isObjCBoxableRecordType()
const;
2686 bool isInterfaceType()
const;
2687 bool isStructureOrClassType()
const;
2688 bool isUnionType()
const;
2689 bool isComplexIntegerType()
const;
2690 bool isVectorType()
const;
2691 bool isExtVectorType()
const;
2692 bool isExtVectorBoolType()
const;
2693 bool isConstantMatrixBoolType()
const;
2696 bool isPackedVectorBoolType(
const ASTContext &ctx)
const;
2697 bool isSubscriptableVectorType()
const;
2698 bool isMatrixType()
const;
2699 bool isConstantMatrixType()
const;
2700 bool isOverflowBehaviorType()
const;
2701 bool isDependentAddressSpaceType()
const;
2702 bool isObjCObjectPointerType()
const;
2703 bool isObjCRetainableType()
const;
2704 bool isObjCLifetimeType()
const;
2705 bool isObjCIndirectLifetimeType()
const;
2706 bool isObjCNSObjectType()
const;
2707 bool isObjCIndependentClassType()
const;
2710 bool isObjCObjectType()
const;
2711 bool isObjCQualifiedInterfaceType()
const;
2712 bool isObjCQualifiedIdType()
const;
2713 bool isObjCQualifiedClassType()
const;
2714 bool isObjCObjectOrInterfaceType()
const;
2715 bool isObjCIdType()
const;
2716 bool isDecltypeType()
const;
2724 return hasAttr(attr::ObjCInertUnsafeUnretained);
2734 bool isObjCIdOrObjectKindOfType(
const ASTContext &ctx,
2737 bool isObjCClassType()
const;
2745 bool isObjCClassOrClassKindOfType()
const;
2747 bool isBlockCompatibleObjCPointerType(
ASTContext &ctx)
const;
2748 bool isObjCSelType()
const;
2749 bool isObjCBuiltinType()
const;
2750 bool isObjCARCBridgableType()
const;
2751 bool isCARCBridgableType()
const;
2752 bool isTemplateTypeParmType()
const;
2753 bool isNullPtrType()
const;
2755 bool isNothrowT()
const;
2756 bool isAlignValT()
const;
2757 bool isStdByteType()
const;
2758 bool isAtomicType()
const;
2759 bool isUndeducedAutoType()
const;
2761 bool isTypedefNameType()
const;
2763#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
2764 bool is##Id##Type() const;
2765#include "clang/Basic/OpenCLImageTypes.def"
2767 bool isImageType()
const;
2769 bool isSamplerT()
const;
2770 bool isEventT()
const;
2771 bool isClkEventT()
const;
2772 bool isQueueT()
const;
2773 bool isReserveIDT()
const;
2775#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
2776 bool is##Id##Type() const;
2777#include "clang/Basic/OpenCLExtensionTypes.def"
2779 bool isOCLIntelSubgroupAVCType()
const;
2780 bool isOCLExtOpaqueType()
const;
2782 bool isPipeType()
const;
2783 bool isBitIntType()
const;
2784 bool isOpenCLSpecificType()
const;
2786#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) bool is##Id##Type() const;
2787#include "clang/Basic/HLSLIntangibleTypes.def"
2788 bool isHLSLSpecificType()
const;
2789 bool isHLSLBuiltinIntangibleType()
const;
2790 bool isHLSLAttributedResourceType()
const;
2791 bool isHLSLInlineSpirvType()
const;
2792 bool isHLSLResourceRecord()
const;
2793 bool isHLSLResourceRecordArray()
const;
2794 bool isHLSLIntangibleType()
2800 bool isObjCARCImplicitlyUnretainedType()
const;
2803 bool isCUDADeviceBuiltinSurfaceType()
const;
2805 bool isCUDADeviceBuiltinTextureType()
const;
2808 Qualifiers::ObjCLifetime getObjCARCImplicitLifetime()
const;
2824 ScalarTypeKind getScalarTypeKind()
const;
2852 bool isUndeducedType()
const;
2861 bool hasSizedVLAType()
const;
2864 bool hasUnnamedOrLocalType()
const;
2866 bool isOverloadableType()
const;
2869 bool isElaboratedTypeSpecifier()
const;
2871 bool canDecayToPointerType()
const;
2876 bool hasPointerRepresentation()
const;
2880 bool hasObjCPointerRepresentation()
const;
2884 bool hasIntegerRepresentation()
const;
2888 bool hasSignedIntegerRepresentation()
const;
2892 bool hasUnsignedIntegerRepresentation()
const;
2896 bool hasFloatingRepresentation()
const;
2901 bool hasBooleanRepresentation()
const;
2906 const RecordType *getAsStructureType()
const;
2908 const RecordType *getAsUnionType()
const;
2909 const ComplexType *getAsComplexIntegerType()
const;
2930 inline EnumDecl *getAsEnumDecl()
const;
2931 inline EnumDecl *castAsEnumDecl()
const;
2936 inline TagDecl *getAsTagDecl()
const;
2937 inline TagDecl *castAsTagDecl()
const;
2949 DeducedType *getContainedDeducedType()
const;
2961 bool hasAutoForTrailingReturnType()
const;
2972 template <
typename T>
const T *getAs()
const;
2977 return dyn_cast<T>(CanonicalType);
2984 return cast<T>(CanonicalType);
2988#define TYPE(Class, Base)
2989#define NEVER_CANONICAL_TYPE(Class) \
2990 template <> inline const Class##Type *Type::getAsCanonical() const = delete; \
2991 template <> inline const Class##Type *Type::castAsCanonical() const = delete;
2992#include "clang/AST/TypeNodes.inc"
2998 const TemplateSpecializationType *
2999 getAsNonAliasTemplateSpecializationType()
const;
3001 const TemplateSpecializationType *
3004 assert(TST &&
"not a TemplateSpecializationType");
3013 template <
typename T>
const T *getAsAdjusted()
const;
3017 const ArrayType *getAsArrayTypeUnsafe()
const;
3025 template <
typename T>
const T *castAs()
const;
3029 const ArrayType *castAsArrayTypeUnsafe()
const;
3043 const Type *getBaseElementTypeUnsafe()
const;
3048 const Type *getArrayElementTypeNoTypeQual()
const;
3053 const Type *getPointeeOrArrayElementType()
const;
3061 const Type *getUnqualifiedDesugaredType()
const;
3066 bool isSignedIntegerType()
const;
3071 bool isUnsignedIntegerType()
const;
3075 bool isSignedIntegerOrEnumerationType()
const;
3079 bool isUnsignedIntegerOrEnumerationType()
const;
3083 bool isFixedPointType()
const;
3086 bool isFixedPointOrIntegerType()
const;
3089 bool isConvertibleToFixedPointType()
const;
3093 bool isSaturatedFixedPointType()
const;
3097 bool isUnsaturatedFixedPointType()
const;
3101 bool isSignedFixedPointType()
const;
3105 bool isUnsignedFixedPointType()
const;
3110 bool isConstantSizeType()
const;
3114 bool isSpecifierType()
const;
3134 bool isLinkageValid()
const;
3148 bool canHaveNullability(
bool ResultIfUnknown =
true)
const;
3165 std::optional<ArrayRef<QualType>>
3166 getObjCSubstitutions(
const DeclContext *dc)
const;
3170 bool acceptsObjCTypeParams()
const;
3172 const char *getTypeClassName()
const;
3175 return CanonicalType;
3180 void dump(llvm::raw_ostream &OS,
const ASTContext &Context)
const;
3207#define TYPE(Class, Base)
3208#define ALWAYS_CANONICAL_TYPE(Class) \
3209 template <> inline const Class##Type *Type::getAs() const { \
3210 return dyn_cast<Class##Type>(CanonicalType); \
3212 template <> inline const Class##Type *Type::castAs() const { \
3213 return cast<Class##Type>(CanonicalType); \
3215#include "clang/AST/TypeNodes.inc"
3223#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) Id,
3224#include "clang/Basic/OpenCLImageTypes.def"
3226#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) Id,
3227#include "clang/Basic/OpenCLExtensionTypes.def"
3229#define SVE_TYPE(Name, Id, SingletonId) Id,
3230#include "clang/Basic/AArch64ACLETypes.def"
3232#define PPC_VECTOR_TYPE(Name, Id, Size) Id,
3233#include "clang/Basic/PPCTypes.def"
3235#define RVV_TYPE(Name, Id, SingletonId) Id,
3236#include "clang/Basic/RISCVVTypes.def"
3238#define WASM_TYPE(Name, Id, SingletonId) Id,
3239#include "clang/Basic/WebAssemblyReferenceTypes.def"
3241#define AMDGPU_TYPE(Name, Id, SingletonId, Width, Align) Id,
3242#include "clang/Basic/AMDGPUTypes.def"
3244#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) Id,
3245#include "clang/Basic/HLSLIntangibleTypes.def"
3247#define BUILTIN_TYPE(Id, SingletonId) Id,
3248#define LAST_BUILTIN_TYPE(Id) LastKind = Id
3249#include "clang/AST/BuiltinTypes.def"
3259 static_assert(Kind::LastKind <
3260 (1 << BuiltinTypeBitfields::NumOfBuiltinTypeBits) &&
3261 "Defined builtin type exceeds the allocated space for serial "
3272 StringRef str =
getName(Policy);
3273 assert(!str.empty() && str.data()[str.size()] ==
'\0');
3330class ComplexType :
public Type,
public llvm::FoldingSetNode {
3337 ElementType(Element) {}
3357class ParenType :
public Type,
public llvm::FoldingSetNode {
3383class PointerType :
public Type,
public llvm::FoldingSetNode {
3390 PointeeType(Pointee) {}
3413 using BaseTy = llvm::PointerIntPair<ValueDecl *, 1, unsigned>;
3428 bool isDeref()
const;
3430 unsigned getInt()
const;
3431 void *getOpaqueValue()
const;
3433 void setFromOpaqueValue(
void *
V);
3471 bool referencesFieldDecls()
const;
3477 switch (T->getTypeClass()) {
3478 case CountAttributed:
3488class CountAttributedType final
3490 public llvm::TrailingObjects<CountAttributedType,
3491 TypeCoupledDeclRefInfo> {
3502 bool CountInBytes,
bool OrNull,
3505 unsigned numTrailingObjects(OverloadToken<TypeCoupledDeclRefInfo>)
const {
3531 static void Profile(llvm::FoldingSetNodeID &ID,
QualType WrappedTy,
3535 return T->getTypeClass() == CountAttributed;
3538 StringRef getAttributeName(
bool WithMacroPrefix)
const;
3553 :
Type(TC, CanonicalPtr,
3556 OriginalTy(OriginalTy), AdjustedTy(AdjustedTy) {}
3566 Profile(ID, OriginalTy, AdjustedTy);
3571 ID.AddPointer(
New.getAsOpaquePtr());
3575 return T->getTypeClass() == Adjusted || T->getTypeClass() == Decayed;
3591 static bool classof(
const Type *T) {
return T->getTypeClass() == Decayed; }
3597class BlockPointerType :
public Type,
public llvm::FoldingSetNode {
3605 PointeeType(Pointee) {}
3623 return T->getTypeClass() == BlockPointer;
3633 bool SpelledAsLValue)
3635 PointeeType(Referencee) {
3649 while (T->isInnerRef())
3651 return T->PointeeType;
3660 bool SpelledAsLValue) {
3662 ID.AddBoolean(SpelledAsLValue);
3666 return T->getTypeClass() == LValueReference ||
3667 T->getTypeClass() == RValueReference;
3676 bool SpelledAsLValue)
3685 return T->getTypeClass() == LValueReference;
3701 return T->getTypeClass() == RValueReference;
3708class MemberPointerType :
public Type,
public llvm::FoldingSetNode {
3719 :
Type(MemberPointer, CanonicalPtr,
3723 PointeeType(Pointee), Qualifier(Qualifier) {}
3731 return PointeeType->isFunctionProtoType();
3737 return !PointeeType->isFunctionProtoType();
3746 bool isSugared()
const;
3758 static void Profile(llvm::FoldingSetNodeID &ID,
QualType Pointee,
3763 return T->getTypeClass() == MemberPointer;
3786 unsigned tq,
const Expr *sz =
nullptr);
3804 return T->getTypeClass() == ConstantArray ||
3805 T->getTypeClass() == VariableArray ||
3806 T->getTypeClass() == IncompleteArray ||
3807 T->getTypeClass() == DependentSizedArray ||
3808 T->getTypeClass() == ArrayParameter;
3818 struct ExternalSize {
3819 ExternalSize(
const llvm::APInt &Sz,
const Expr *SE)
3820 :
Size(Sz), SizeExpr(SE) {}
3822 const Expr *SizeExpr;
3833 ConstantArrayTypeBits.HasExternalSize =
false;
3834 ConstantArrayTypeBits.SizeWidth = Width / 8;
3837 assert(Width < 0xFF &&
"Type width in bits must be less than 8 bits");
3840 ConstantArrayType(QualType Et, QualType Can, ExternalSize *SzPtr,
3841 ArraySizeModifier
SM,
unsigned TQ)
3842 : ArrayType(ConstantArray, Et, Can,
SM, TQ, SzPtr->SizeExpr),
3844 ConstantArrayTypeBits.HasExternalSize =
true;
3845 ConstantArrayTypeBits.SizeWidth = 0;
3847 assert((SzPtr->SizeExpr ==
nullptr || !Can.isNull()) &&
3848 "canonical constant array should not have size expression");
3851 static ConstantArrayType *
Create(
const ASTContext &Ctx, QualType ET,
3852 QualType Can,
const llvm::APInt &Sz,
3853 const Expr *SzExpr, ArraySizeModifier SzMod,
3863 ConstantArrayTypeBits.SizeWidth = ATy->ConstantArrayTypeBits.SizeWidth;
3899 :
static_cast<int64_t
>(
Size);
3906 ?
SizePtr->Size.getLimitedValue()
3920 static unsigned getNumAddressingBits(
const ASTContext &Context,
3922 const llvm::APInt &NumElements);
3924 unsigned getNumAddressingBits(
const ASTContext &Context)
const;
3928 static unsigned getMaxSizeBits(
const ASTContext &Context);
3935 static void Profile(llvm::FoldingSetNodeID &ID,
const ASTContext &Ctx,
3940 return T->getTypeClass() == ConstantArray ||
3941 T->getTypeClass() == ArrayParameter;
3947class ArrayParameterType :
public ConstantArrayType {
3950 ArrayParameterType(
const ConstantArrayType *ATy,
QualType CanTy)
3951 : ConstantArrayType(ArrayParameter, ATy, CanTy) {}
3955 return T->getTypeClass() == ArrayParameter;
3969 :
ArrayType(IncompleteArray, et, can, sm, tq) {}
3978 return T->getTypeClass() == IncompleteArray;
3989 ID.AddInteger(llvm::to_underlying(SizeMod));
3990 ID.AddInteger(TypeQuals);
4030 :
ArrayType(VariableArray, et, can, sm, tq, e), SizeExpr((
Stmt *)e) {}
4038 return (
Expr*) SizeExpr;
4045 return T->getTypeClass() == VariableArray;
4049 llvm_unreachable(
"Cannot unique VariableArrayTypes.");
4085 return (
Expr*) SizeExpr;
4092 return T->getTypeClass() == DependentSizedArray;
4100 static void Profile(llvm::FoldingSetNodeID &ID,
const ASTContext &Context,
4102 unsigned TypeQuals,
Expr *E);
4116class DependentAddressSpaceType :
public Type,
public llvm::FoldingSetNode {
4119 Expr *AddrSpaceExpr;
4135 return T->getTypeClass() == DependentAddressSpace;
4142 static void Profile(llvm::FoldingSetNodeID &ID,
const ASTContext &Context,
4156class DependentSizedExtVectorType :
public Type,
public llvm::FoldingSetNode {
4178 return T->getTypeClass() == DependentSizedExtVector;
4185 static void Profile(llvm::FoldingSetNodeID &ID,
const ASTContext &Context,
4263 ID.AddInteger(NumElements);
4265 ID.AddInteger(llvm::to_underlying(VecKind));
4269 return T->getTypeClass() ==
Vector || T->getTypeClass() == ExtVector;
4282class DependentVectorType :
public Type,
public llvm::FoldingSetNode {
4304 return T->getTypeClass() == DependentVector;
4311 static void Profile(llvm::FoldingSetNodeID &ID,
const ASTContext &Context,
4326 :
VectorType(ExtVector, vecType, nElements, canonType,
4333 case 'x':
case 'r':
return 0;
4334 case 'y':
case 'g':
return 1;
4335 case 'z':
case 'b':
return 2;
4336 case 'w':
case 'a':
return 3;
4354 case 'a':
return 10;
4356 case 'b':
return 11;
4358 case 'c':
return 12;
4360 case 'd':
return 13;
4362 case 'e':
return 14;
4364 case 'f':
return 15;
4369 if (isNumericAccessor)
4385 return T->getTypeClass() == ExtVector;
4402 const Expr *RowExpr =
nullptr,
const Expr *ColumnExpr =
nullptr);
4415 if (T->isDependentType())
4419 if (T->isEnumeralType())
4425 return T->isRealType();
4429 return T->isRealType() && !T->isBooleanType();
4436 return T->getTypeClass() == ConstantMatrix ||
4437 T->getTypeClass() == DependentSizedMatrix;
4451 unsigned NColumns,
QualType CanonElementType);
4454 unsigned NColumns,
QualType CanonElementType);
4485 bool IsRowMajor =
false)
const {
4495 unsigned Row = ColumnMajorIdx %
NumRows;
4522 return T->getTypeClass() == ConstantMatrix;
4545 return T->getTypeClass() == DependentSizedMatrix;
4552 static void Profile(llvm::FoldingSetNodeID &ID,
const ASTContext &Context,
4588 HasPassObjSize = 0x20,
4591 unsigned char Data = 0;
4600 copy.Data = (copy.Data & ~ABIMask) |
unsigned(
kind);
4610 copy.Data |= IsConsumed;
4612 copy.Data &= ~IsConsumed;
4619 Copy.Data |= HasPassObjSize;
4627 Copy.Data |= IsNoEscape;
4629 Copy.Data &= ~IsNoEscape;
4641 return lhs.Data == rhs.Data;
4645 return lhs.Data != rhs.Data;
4680 enum { CallConvMask = 0x3F };
4681 enum { NoReturnMask = 0x40 };
4682 enum { ProducesResultMask = 0x80 };
4683 enum { NoCallerSavedRegsMask = 0x100 };
4684 enum { RegParmMask = 0xe00, RegParmOffset = 9 };
4685 enum { NoCfCheckMask = 0x1000 };
4686 enum { CmseNSCallMask = 0x2000 };
4687 uint16_t Bits =
CC_C;
4689 ExtInfo(
unsigned Bits) : Bits(static_cast<uint16_t>(Bits)) {}
4695 bool producesResult,
bool noCallerSavedRegs,
bool NoCfCheck,
4697 assert((!hasRegParm || regParm < 7) &&
"Invalid regparm value");
4698 Bits = ((
unsigned)cc) | (noReturn ? NoReturnMask : 0) |
4699 (producesResult ? ProducesResultMask : 0) |
4700 (noCallerSavedRegs ? NoCallerSavedRegsMask : 0) |
4701 (hasRegParm ? ((regParm + 1) << RegParmOffset) : 0) |
4702 (NoCfCheck ? NoCfCheckMask : 0) |
4703 (cmseNSCall ? CmseNSCallMask : 0);
4719 bool getHasRegParm()
const {
return ((Bits & RegParmMask) >> RegParmOffset) != 0; }
4722 unsigned RegParm = (Bits & RegParmMask) >> RegParmOffset;
4731 return Bits ==
Other.Bits;
4734 return Bits !=
Other.Bits;
4742 return ExtInfo(Bits | NoReturnMask);
4744 return ExtInfo(Bits & ~NoReturnMask);
4749 return ExtInfo(Bits | ProducesResultMask);
4751 return ExtInfo(Bits & ~ProducesResultMask);
4756 return ExtInfo(Bits | CmseNSCallMask);
4758 return ExtInfo(Bits & ~CmseNSCallMask);
4762 if (noCallerSavedRegs)
4763 return ExtInfo(Bits | NoCallerSavedRegsMask);
4765 return ExtInfo(Bits & ~NoCallerSavedRegsMask);
4770 return ExtInfo(Bits | NoCfCheckMask);
4772 return ExtInfo(Bits & ~NoCfCheckMask);
4776 assert(RegParm < 7 &&
"Invalid regparm value");
4777 return ExtInfo((Bits & ~RegParmMask) |
4778 ((RegParm + 1) << RegParmOffset));
4782 return ExtInfo((Bits & ~CallConvMask) | (
unsigned) cc);
4786 ID.AddInteger(Bits);
4804 LLVM_PREFERRED_TYPE(
bool)
4807 LLVM_PREFERRED_TYPE(
bool)
4810 LLVM_PREFERRED_TYPE(
bool)
4910 bool getCFIUncheckedCalleeAttr()
const;
4917 "Const, volatile and restrict are assumed to be a subset of "
4918 "the fast qualifiers.");
4930 static StringRef getNameForCallConv(
CallingConv CC);
4933 return T->getTypeClass() == FunctionNoProto ||
4934 T->getTypeClass() == FunctionProto;
4940class FunctionNoProtoType :
public FunctionType,
public llvm::FoldingSetNode {
4963 ID.AddPointer(ResultType.getAsOpaquePtr());
4967 return T->getTypeClass() == FunctionNoProto;
5017 Kind oppositeKind()
const;
5040 llvm_unreachable(
"unknown effect kind");
5044 StringRef name()
const;
5048 OS << Effect.
name();
5058 std::optional<FunctionEffect>
5059 effectProhibitingInference(
const Decl &Callee,
5066 bool shouldDiagnoseFunctionCall(
bool Direct,
5070 return LHS.FKind == RHS.FKind;
5073 return !(LHS == RHS);
5076 return LHS.FKind < RHS.FKind;
5083 Expr *Cond =
nullptr;
5092 return Cond == RHS.Cond;
5107 std::string description()
const;
5109 friend raw_ostream &
operator<<(raw_ostream &OS,
5118 const Container *Outer =
nullptr;
5125 return Idx ==
Other.Idx;
5128 return Idx !=
Other.Idx;
5137 assert(Outer !=
nullptr &&
"invalid FunctionEffectIterator");
5138 bool HasConds = !Outer->Conditions.empty();
5140 HasConds ? Outer->Conditions[Idx]
5162class FunctionEffectsRef {
5167 friend FunctionProtoType;
5168 friend FunctionEffectSet;
5179 : Effects(FX), Conditions(Conds) {}
5192 bool empty()
const {
return Effects.empty(); }
5193 size_t size()
const {
return Effects.size(); }
5204 const FunctionEffectsRef &RHS) {
5205 return LHS.Effects == RHS.Effects && LHS.Conditions == RHS.Conditions;
5208 const FunctionEffectsRef &RHS) {
5209 return !(LHS == RHS);
5212 void dump(llvm::raw_ostream &OS)
const;
5216class FunctionEffectKindSet {
5219 using KindBitsT = std::bitset<EndBitPos>;
5221 KindBitsT KindBits{};
5223 explicit FunctionEffectKindSet(KindBitsT KB) : KindBits(KB) {}
5229 return static_cast<size_t>(K);
5238 const FunctionEffectKindSet *Outer =
nullptr;
5243 void advanceToNextSetBit() {
5244 while (Idx < EndBitPos && !Outer->KindBits.test(Idx))
5250 iterator(
const FunctionEffectKindSet &O,
size_t I) : Outer(&O), Idx(I) {
5251 advanceToNextSetBit();
5256 iterator operator++() {
5258 advanceToNextSetBit();
5263 assert(Idx < EndBitPos &&
"Dereference of end iterator");
5272 iterator
begin()
const {
return iterator(*
this, 0); }
5273 iterator
end()
const {
return iterator(*
this, EndBitPos); }
5282 bool empty()
const {
return KindBits.none(); }
5284 return KindBits.test(kindToPos(EK));
5286 void dump(llvm::raw_ostream &OS)
const;
5288 static FunctionEffectKindSet
difference(FunctionEffectKindSet LHS,
5289 FunctionEffectKindSet RHS) {
5290 return FunctionEffectKindSet(LHS.KindBits & ~RHS.KindBits);
5306 : Effects(FX.effects()), Conditions(FX.conditions()) {}
5308 bool empty()
const {
return Effects.empty(); }
5309 size_t size()
const {
return Effects.size(); }
5318 void dump(llvm::raw_ostream &OS)
const;
5353class FunctionProtoType final
5355 public llvm::FoldingSetNode,
5356 private llvm::TrailingObjects<
5357 FunctionProtoType, QualType, SourceLocation,
5358 FunctionType::FunctionTypeExtraBitfields,
5359 FunctionType::FunctionTypeExtraAttributeInfo,
5360 FunctionType::FunctionTypeArmAttributes, FunctionType::ExceptionType,
5361 Expr *, FunctionDecl *, FunctionType::ExtParameterInfo, Qualifiers,
5362 FunctionEffect, EffectConditionExpr> {
5364 friend TrailingObjects;
5457 LLVM_PREFERRED_TYPE(
bool)
5459 LLVM_PREFERRED_TYPE(
bool)
5461 LLVM_PREFERRED_TYPE(
bool)
5476 Result.ExceptionSpec = ESI;
5510 unsigned numTrailingObjects(OverloadToken<QualType>)
const {
5511 return getNumParams();
5514 unsigned numTrailingObjects(OverloadToken<SourceLocation>)
const {
5515 return isVariadic();
5518 unsigned numTrailingObjects(OverloadToken<FunctionTypeArmAttributes>)
const {
5519 return hasArmTypeAttributes();
5522 unsigned numTrailingObjects(OverloadToken<FunctionTypeExtraBitfields>)
const {
5523 return hasExtraBitfields();
5527 numTrailingObjects(OverloadToken<FunctionTypeExtraAttributeInfo>)
const {
5528 return hasExtraAttributeInfo();
5531 unsigned numTrailingObjects(OverloadToken<ExceptionType>)
const {
5532 return getExceptionSpecSize().NumExceptionType;
5535 unsigned numTrailingObjects(OverloadToken<Expr *>)
const {
5536 return getExceptionSpecSize().NumExprPtr;
5539 unsigned numTrailingObjects(OverloadToken<FunctionDecl *>)
const {
5540 return getExceptionSpecSize().NumFunctionDeclPtr;
5543 unsigned numTrailingObjects(OverloadToken<ExtParameterInfo>)
const {
5544 return hasExtParameterInfos() ? getNumParams() : 0;
5547 unsigned numTrailingObjects(OverloadToken<Qualifiers>)
const {
5548 return hasExtQualifiers() ? 1 : 0;
5551 unsigned numTrailingObjects(OverloadToken<FunctionEffect>)
const {
5552 return getNumFunctionEffects();
5557 static bool containsAnyUnexpandedParameterPack(
const QualType *ArgArray,
5559 for (
unsigned Idx = 0; Idx < numArgs; ++Idx)
5560 if (ArgArray[Idx]->containsUnexpandedParameterPack())
5566 FunctionProtoType(QualType result, ArrayRef<QualType> params,
5567 QualType canonical,
const ExtProtoInfo &epi);
5572 struct ExceptionSpecSizeHolder {
5573 unsigned NumExceptionType;
5574 unsigned NumExprPtr;
5575 unsigned NumFunctionDeclPtr;
5580 static ExceptionSpecSizeHolder
5581 getExceptionSpecSize(ExceptionSpecificationType EST,
unsigned NumExceptions) {
5592 return {NumExceptions, 0, 0};
5605 llvm_unreachable(
"bad exception specification kind");
5610 ExceptionSpecSizeHolder getExceptionSpecSize()
const {
5611 return getExceptionSpecSize(getExceptionSpecType(), getNumExceptions());
5615 bool hasExtraBitfields()
const {
5616 assert((getExceptionSpecType() != EST_Dynamic ||
5617 FunctionTypeBits.HasExtraBitfields) &&
5618 "ExtraBitfields are required for given ExceptionSpecType");
5619 return FunctionTypeBits.HasExtraBitfields;
5623 bool hasExtraAttributeInfo()
const {
5624 return FunctionTypeBits.HasExtraBitfields &&
5625 getTrailingObjects<FunctionTypeExtraBitfields>()
5626 ->HasExtraAttributeInfo;
5629 bool hasArmTypeAttributes()
const {
5630 return FunctionTypeBits.HasExtraBitfields &&
5631 getTrailingObjects<FunctionTypeExtraBitfields>()
5632 ->HasArmTypeAttributes;
5635 bool hasExtQualifiers()
const {
5636 return FunctionTypeBits.HasExtQuals;
5643 assert(i <
getNumParams() &&
"invalid parameter index");
5688 bool hasDependentExceptionSpec()
const;
5692 bool hasInstantiationDependentExceptionSpec()
const;
5714 ? getTrailingObjects<FunctionTypeExtraBitfields>()
5730 return *getTrailingObjects<Expr *>();
5741 return getTrailingObjects<FunctionDecl *>()[0];
5751 return getTrailingObjects<FunctionDecl *>()[1];
5769 return isVariadic() ? *getTrailingObjects<SourceLocation>()
5779 bool isTemplateVariadic()
const;
5789 if (hasExtQualifiers())
5790 return *getTrailingObjects<Qualifiers>();
5807 return getTrailingObjects<QualType>();
5822 getTrailingObjects<ExceptionType>());
5847 return getTrailingObjects<ExtParameterInfo>();
5852 if (hasExtraAttributeInfo())
5853 return *getTrailingObjects<FunctionTypeExtraAttributeInfo>();
5860 if (!hasArmTypeAttributes())
5862 return getTrailingObjects<FunctionTypeArmAttributes>()
5863 ->AArch64SMEAttributes;
5867 assert(I <
getNumParams() &&
"parameter index out of range");
5869 return getTrailingObjects<ExtParameterInfo>()[I];
5874 assert(I <
getNumParams() &&
"parameter index out of range");
5876 return getTrailingObjects<ExtParameterInfo>()[I].getABI();
5881 assert(I <
getNumParams() &&
"parameter index out of range");
5883 return getTrailingObjects<ExtParameterInfo>()[I].isConsumed();
5888 return hasExtraBitfields()
5889 ? getTrailingObjects<FunctionTypeExtraBitfields>()
5890 ->NumFunctionEffects
5896 if (hasExtraBitfields()) {
5897 const auto *Bitfields = getTrailingObjects<FunctionTypeExtraBitfields>();
5898 if (Bitfields->NumFunctionEffects > 0)
5899 return getTrailingObjects<FunctionEffect>(
5900 Bitfields->NumFunctionEffects);
5906 if (hasExtraBitfields()) {
5907 const auto *Bitfields = getTrailingObjects<FunctionTypeExtraBitfields>();
5908 if (Bitfields->EffectsHaveConditions)
5909 return Bitfields->NumFunctionEffects;
5916 if (hasExtraBitfields()) {
5917 const auto *Bitfields = getTrailingObjects<FunctionTypeExtraBitfields>();
5918 if (Bitfields->EffectsHaveConditions)
5919 return getTrailingObjects<EffectConditionExpr>(
5920 Bitfields->NumFunctionEffects);
5927 if (hasExtraBitfields()) {
5928 const auto *Bitfields = getTrailingObjects<FunctionTypeExtraBitfields>();
5929 if (Bitfields->NumFunctionEffects > 0) {
5930 const size_t NumConds = Bitfields->EffectsHaveConditions
5931 ? Bitfields->NumFunctionEffects
5934 getTrailingObjects<FunctionEffect>(Bitfields->NumFunctionEffects),
5935 {NumConds ? getTrailingObjects<EffectConditionExpr>() : nullptr,
5945 void printExceptionSpecification(raw_ostream &OS,
5949 return T->getTypeClass() == FunctionProto;
5952 void Profile(llvm::FoldingSetNodeID &ID,
const ASTContext &Ctx);
6032 template <
class... As>
6035 this->KeywordWrapperBits.Keyword = llvm::to_underlying(
Keyword);
6060 constexpr unsigned long Offset =
6062 const auto *
Addr =
reinterpret_cast<const T *
>(
6063 reinterpret_cast<const char *
>(
this) - Offset);
6064 assert(llvm::isAddrAligned(llvm::Align(
alignof(T)),
Addr));
6074class UnresolvedUsingType final
6076 private llvm::TrailingObjects<UnresolvedUsingType,
6077 FoldingSetPlaceholder<UnresolvedUsingType>,
6078 NestedNameSpecifier> {
6080 friend TrailingObjects;
6084 unsigned numTrailingObjects(
6092 assert(numTrailingObjects(
6095 return getTrailingObjects<FoldingSetPlaceholder<UnresolvedUsingType>>();
6098 UnresolvedUsingType(ElaboratedTypeKeyword Keyword,
6099 NestedNameSpecifier Qualifier,
6100 const UnresolvedUsingTypenameDecl *D,
6101 const Type *CanonicalType);
6106 ? *getTrailingObjects<NestedNameSpecifier>()
6121 Qualifier.Profile(ID);
6129 return T->getTypeClass() == UnresolvedUsing;
6134 public llvm::FoldingSetNode,
6135 llvm::TrailingObjects<UsingType, NestedNameSpecifier> {
6140 friend TrailingObjects;
6147 return UsingBits.hasQualifier ? *getTrailingObjects() : std::nullopt;
6160 UnderlyingType.Profile(ID);
6162 Qualifier.Profile(ID);
6168 static bool classof(
const Type *T) {
return T->getTypeClass() == Using; }
6171class TypedefType final
6173 private llvm::TrailingObjects<TypedefType,
6174 FoldingSetPlaceholder<TypedefType>,
6175 NestedNameSpecifier, QualType> {
6178 friend TrailingObjects;
6187 unsigned numTrailingObjects(OverloadToken<NestedNameSpecifier>)
const {
6188 return TypedefBits.hasQualifier;
6191 TypedefType(TypeClass TC, ElaboratedTypeKeyword Keyword,
6192 NestedNameSpecifier Qualifier,
const TypedefNameDecl *D,
6193 QualType UnderlyingType,
bool HasTypeDifferentFromDecl);
6195 FoldingSetPlaceholder<TypedefType> *getFoldingSetPlaceholder() {
6196 assert(numTrailingObjects(
6197 OverloadToken<FoldingSetPlaceholder<TypedefType>>{}) == 1);
6198 return getTrailingObjects<FoldingSetPlaceholder<TypedefType>>();
6203 return TypedefBits.hasQualifier ? *getTrailingObjects<NestedNameSpecifier>()
6224 ID.AddInteger(llvm::to_underlying(
Keyword));
6226 Qualifier.Profile(ID);
6227 if (!Underlying.
isNull())
6241class MacroQualifiedType :
public Type {
6250 UnderlyingTy(UnderlyingTy), MacroII(MacroII) {
6252 "Expected a macro qualified type to only wrap attributed types.");
6267 return T->getTypeClass() == MacroQualified;
6295 bool isSugared()
const;
6297 static bool classof(
const Type *T) {
return T->getTypeClass() == TypeOfExpr; }
6307 public llvm::FoldingSetNode {
6317 static void Profile(llvm::FoldingSetNodeID &ID,
const ASTContext &Context,
6318 Expr *E,
bool IsUnqual);
6323class TypeOfType :
public Type {
6329 TypeOfType(
const ASTContext &Context, QualType T, QualType Can,
6333 QualType getUnmodifiedType()
const {
return TOType; }
6336 QualType desugar()
const;
6339 bool isSugared()
const {
return true; }
6343 return static_cast<TypeOfKind>(TypeOfBits.Kind);
6346 static bool classof(
const Type *T) {
return T->getTypeClass() == TypeOf; }
6350class DecltypeType :
public Type {
6352 QualType UnderlyingType;
6355 friend class ASTContext;
6357 DecltypeType(Expr *E, QualType underlyingType, QualType can = QualType());
6360 Expr *getUnderlyingExpr()
const {
return E; }
6364 QualType desugar()
const;
6367 bool isSugared()
const;
6369 static bool classof(
const Type *T) {
return T->getTypeClass() == Decltype; }
6378class DependentDecltypeType :
public DecltypeType,
public llvm::FoldingSetNode {
6380 DependentDecltypeType(Expr *E);
6382 void Profile(llvm::FoldingSetNodeID &ID,
const ASTContext &Context) {
6383 Profile(ID, Context, getUnderlyingExpr());
6386 static void Profile(llvm::FoldingSetNodeID &ID,
const ASTContext &Context,
6390class PackIndexingType final
6392 public llvm::FoldingSetNode,
6393 private llvm::TrailingObjects<PackIndexingType, QualType> {
6394 friend TrailingObjects;
6401 LLVM_PREFERRED_TYPE(
bool)
6402 unsigned FullySubstituted : 1;
6405 friend class ASTContext;
6406 PackIndexingType(QualType Canonical, QualType Pattern, Expr *IndexExpr,
6407 bool FullySubstituted, ArrayRef<QualType> Expansions = {});
6410 Expr *getIndexExpr()
const {
return IndexExpr; }
6411 QualType getPattern()
const {
return Pattern; }
6413 bool isSugared()
const {
return hasSelectedType(); }
6415 QualType desugar()
const {
6416 if (hasSelectedType())
6417 return getSelectedType();
6418 return QualType(
this, 0);
6421 QualType getSelectedType()
const {
6422 assert(hasSelectedType() &&
"Type is dependant");
6423 return *(getExpansionsPtr() + *getSelectedIndex());
6428 bool hasSelectedType()
const {
return getSelectedIndex() != std::nullopt; }
6430 bool isFullySubstituted()
const {
return FullySubstituted; }
6432 bool expandsToEmptyPack()
const {
return isFullySubstituted() &&
Size == 0; }
6434 ArrayRef<QualType> getExpansions()
const {
6435 return {getExpansionsPtr(),
Size};
6438 static bool classof(
const Type *T) {
6439 return T->getTypeClass() == PackIndexing;
6442 void Profile(llvm::FoldingSetNodeID &ID,
const ASTContext &Context);
6443 static void Profile(llvm::FoldingSetNodeID &ID,
const ASTContext &Context,
6444 QualType Pattern, Expr *E,
bool FullySubstituted,
6445 ArrayRef<QualType> Expansions);
6448 const QualType *getExpansionsPtr()
const {
return getTrailingObjects(); }
6451 ArrayRef<QualType> Expansions = {});
6455class UnaryTransformType :
public Type,
public llvm::FoldingSetNode {
6458#define TRANSFORM_TYPE_TRAIT_DEF(Enum, _) Enum,
6459#include "clang/Basic/TransformTypeTraits.def"
6467 QualType UnderlyingType;
6472 friend class ASTContext;
6474 UnaryTransformType(QualType BaseTy, QualType UnderlyingTy, UTTKind UKind,
6475 QualType CanonicalTy);
6478 bool isSugared()
const {
return !isDependentType(); }
6479 QualType desugar()
const {
return UnderlyingType; }
6484 UTTKind getUTTKind()
const {
return UKind; }
6486 static bool classof(
const Type *T) {
6487 return T->getTypeClass() == UnaryTransform;
6490 void Profile(llvm::FoldingSetNodeID &ID) {
6494 static void Profile(llvm::FoldingSetNodeID &ID, QualType BaseType,
6495 QualType UnderlyingType, UTTKind UKind) {
6496 BaseType.Profile(ID);
6497 UnderlyingType.Profile(ID);
6498 ID.AddInteger(UKind);
6502class TagType :
public TypeWithKeyword {
6503 friend class ASTContext;
6509 void *getTrailingPointer()
const;
6510 NestedNameSpecifier &getTrailingQualifier()
const;
6513 TagType(TypeClass TC, ElaboratedTypeKeyword Keyword,
6514 NestedNameSpecifier Qualifier,
const TagDecl *TD,
bool OwnsTag,
6515 bool IsInjected,
const Type *CanonicalType);
6518 TagDecl *getDecl()
const {
return decl; }
6519 [[deprecated(
"Use getDecl instead")]] TagDecl *getOriginalDecl()
const {
6523 NestedNameSpecifier getQualifier()
const;
6526 bool isTagOwned()
const {
return TagTypeBits.OwnsTag; }
6528 bool isInjected()
const {
return TagTypeBits.IsInjected; }
6530 ClassTemplateDecl *getTemplateDecl()
const;
6531 TemplateName getTemplateName(
const ASTContext &Ctx)
const;
6532 ArrayRef<TemplateArgument> getTemplateArgs(
const ASTContext &Ctx)
const;
6534 bool isSugared()
const {
return false; }
6535 QualType desugar()
const {
return getCanonicalTypeInternal(); }
6537 static bool classof(
const Type *T) {
6538 return T->getTypeClass() ==
Enum || T->getTypeClass() ==
Record ||
6539 T->getTypeClass() == InjectedClassName;
6543struct TagTypeFoldingSetPlaceholder :
public llvm::FoldingSetNode {
6544 static constexpr size_t getOffset() {
6545 return alignof(TagType) -
6546 (
sizeof(TagTypeFoldingSetPlaceholder) %
alignof(TagType));
6549 static void Profile(llvm::FoldingSetNodeID &ID, ElaboratedTypeKeyword Keyword,
6550 NestedNameSpecifier Qualifier,
const TagDecl *Tag,
6551 bool OwnsTag,
bool IsInjected) {
6552 ID.AddInteger(
uintptr_t(Tag) | OwnsTag | (IsInjected << 1) |
6553 ((Keyword != ElaboratedTypeKeyword::None) << 2));
6554 if (Keyword != ElaboratedTypeKeyword::None)
6555 ID.AddInteger(llvm::to_underlying(Keyword));
6560 void Profile(llvm::FoldingSetNodeID &ID)
const {
6561 const TagType *T = getTagType();
6562 Profile(ID, T->getKeyword(), T->getQualifier(), T->getDecl(),
6563 T->isTagOwned(), T->isInjected());
6566 TagType *getTagType() {
6567 return reinterpret_cast<TagType *
>(
reinterpret_cast<char *
>(
this + 1) +
6570 const TagType *getTagType()
const {
6571 return const_cast<TagTypeFoldingSetPlaceholder *
>(
this)->getTagType();
6573 static TagTypeFoldingSetPlaceholder *fromTagType(TagType *T) {
6574 return reinterpret_cast<TagTypeFoldingSetPlaceholder *
>(
6575 reinterpret_cast<char *
>(T) - getOffset()) -
6582class RecordType final :
public TagType {
6583 using TagType::TagType;
6586 RecordDecl *getDecl()
const {
6587 return reinterpret_cast<RecordDecl *
>(TagType::getDecl());
6589 [[deprecated(
"Use getDecl instead")]] RecordDecl *getOriginalDecl()
const {
6595 bool hasConstFields()
const;
6597 static bool classof(
const Type *T) {
return T->getTypeClass() ==
Record; }
6602class EnumType final :
public TagType {
6603 using TagType::TagType;
6606 EnumDecl *getDecl()
const {
6607 return reinterpret_cast<EnumDecl *
>(TagType::getDecl());
6609 [[deprecated(
"Use getDecl instead")]] EnumDecl *getOriginalDecl()
const {
6613 static bool classof(
const Type *T) {
return T->getTypeClass() ==
Enum; }
6633class InjectedClassNameType final :
public TagType {
6634 friend class ASTContext;
6636 InjectedClassNameType(ElaboratedTypeKeyword Keyword,
6637 NestedNameSpecifier Qualifier,
const TagDecl *TD,
6638 bool IsInjected,
const Type *CanonicalType);
6641 CXXRecordDecl *getDecl()
const {
6642 return reinterpret_cast<CXXRecordDecl *
>(TagType::getDecl());
6644 [[deprecated(
"Use getDecl instead")]] CXXRecordDecl *getOriginalDecl()
const {
6648 static bool classof(
const Type *T) {
6649 return T->getTypeClass() == InjectedClassName;
6667 using Kind = attr::Kind;
6670 friend class ASTContext;
6672 const Attr *Attribute;
6674 QualType ModifiedType;
6675 QualType EquivalentType;
6677 AttributedType(QualType canon, attr::Kind attrKind, QualType modified,
6678 QualType equivalent)
6681 AttributedType(QualType canon,
const Attr *attr, QualType modified,
6682 QualType equivalent);
6685 AttributedType(QualType canon, attr::Kind attrKind,
const Attr *attr,
6686 QualType modified, QualType equivalent);
6689 Kind getAttrKind()
const {
6690 return static_cast<Kind>(AttributedTypeBits.AttrKind);
6693 const Attr *getAttr()
const {
return Attribute; }
6695 QualType getModifiedType()
const {
return ModifiedType; }
6696 QualType getEquivalentType()
const {
return EquivalentType; }
6698 bool isSugared()
const {
return true; }
6699 QualType desugar()
const {
return getEquivalentType(); }
6716 bool isQualifier()
const;
6718 bool isMSTypeSpec()
const;
6720 bool isWebAssemblyFuncrefSpec()
const;
6722 bool isCallingConv()
const;
6737 void Profile(llvm::FoldingSetNodeID &ID) {
6738 Profile(ID, getAttrKind(), ModifiedType, EquivalentType, Attribute);
6741 static void Profile(llvm::FoldingSetNodeID &ID, Kind attrKind,
6742 QualType modified, QualType equivalent,
6744 ID.AddInteger(attrKind);
6745 ID.AddPointer(modified.getAsOpaquePtr());
6746 ID.AddPointer(equivalent.getAsOpaquePtr());
6747 ID.AddPointer(attr);
6750 static bool classof(
const Type *T) {
6751 return T->getTypeClass() == Attributed;
6755class BTFTagAttributedType :
public Type,
public llvm::FoldingSetNode {
6757 friend class ASTContext;
6759 QualType WrappedType;
6760 const BTFTypeTagAttr *BTFAttr;
6762 BTFTagAttributedType(QualType Canon, QualType Wrapped,
6763 const BTFTypeTagAttr *BTFAttr)
6764 : Type(BTFTagAttributed, Canon, Wrapped->getDependence()),
6765 WrappedType(Wrapped), BTFAttr(BTFAttr) {}
6768 QualType getWrappedType()
const {
return WrappedType; }
6769 const BTFTypeTagAttr *getAttr()
const {
return BTFAttr; }
6771 bool isSugared()
const {
return true; }
6772 QualType desugar()
const {
return getWrappedType(); }
6774 void Profile(llvm::FoldingSetNodeID &ID) {
6775 Profile(ID, WrappedType, BTFAttr);
6778 static void Profile(llvm::FoldingSetNodeID &ID, QualType Wrapped,
6779 const BTFTypeTagAttr *BTFAttr) {
6780 ID.AddPointer(Wrapped.getAsOpaquePtr());
6781 ID.AddPointer(BTFAttr);
6784 static bool classof(
const Type *T) {
6785 return T->getTypeClass() == BTFTagAttributed;
6789class OverflowBehaviorType :
public Type,
public llvm::FoldingSetNode {
6791 enum OverflowBehaviorKind { Wrap, Trap };
6794 friend class ASTContext;
6796 QualType UnderlyingType;
6797 OverflowBehaviorKind BehaviorKind;
6799 OverflowBehaviorType(QualType Canon, QualType Underlying,
6800 OverflowBehaviorKind Kind);
6804 OverflowBehaviorKind getBehaviorKind()
const {
return BehaviorKind; }
6806 bool isWrapKind()
const {
return BehaviorKind == OverflowBehaviorKind::Wrap; }
6807 bool isTrapKind()
const {
return BehaviorKind == OverflowBehaviorKind::Trap; }
6809 bool isSugared()
const {
return false; }
6812 void Profile(llvm::FoldingSetNodeID &ID) {
6813 Profile(ID, UnderlyingType, BehaviorKind);
6816 static void Profile(llvm::FoldingSetNodeID &ID, QualType Underlying,
6817 OverflowBehaviorKind Kind) {
6818 ID.AddPointer(Underlying.getAsOpaquePtr());
6819 ID.AddInteger((
int)Kind);
6822 static bool classof(
const Type *T) {
6827class HLSLAttributedResourceType :
public Type,
public llvm::FoldingSetNode {
6832 llvm::dxil::ResourceDimension ResourceDimension;
6834 LLVM_PREFERRED_TYPE(
bool)
6837 LLVM_PREFERRED_TYPE(
bool)
6838 uint8_t RawBuffer : 1;
6840 LLVM_PREFERRED_TYPE(
bool)
6841 uint8_t IsCounter : 1;
6844 llvm::dxil::ResourceDimension ResourceDimension,
6845 bool IsROV =
false,
bool RawBuffer =
false,
6846 bool IsCounter =
false)
6848 IsROV(IsROV), RawBuffer(RawBuffer), IsCounter(IsCounter) {}
6858 friend bool operator==(
const Attributes &LHS,
const Attributes &RHS) {
6859 return std::tie(LHS.ResourceClass, LHS.ResourceDimension, LHS.IsROV,
6860 LHS.RawBuffer, LHS.IsCounter) ==
6861 std::tie(RHS.ResourceClass, RHS.ResourceDimension, RHS.IsROV,
6862 RHS.RawBuffer, RHS.IsCounter);
6864 friend bool operator!=(
const Attributes &LHS,
const Attributes &RHS) {
6865 return !(LHS == RHS);
6870 friend class ASTContext;
6872 QualType WrappedType;
6873 QualType ContainedType;
6874 const Attributes Attrs;
6876 HLSLAttributedResourceType(QualType Wrapped, QualType Contained,
6877 const Attributes &Attrs)
6878 : Type(HLSLAttributedResource, QualType(),
6880 : Contained->getDependence()),
6881 WrappedType(Wrapped), ContainedType(Contained), Attrs(Attrs) {}
6884 QualType getWrappedType()
const {
return WrappedType; }
6885 QualType getContainedType()
const {
return ContainedType; }
6886 bool hasContainedType()
const {
return !ContainedType.isNull(); }
6887 const Attributes &getAttrs()
const {
return Attrs; }
6888 bool isRaw()
const {
return Attrs.RawBuffer; }
6889 bool isStructured()
const {
return !ContainedType->isChar8Type(); }
6891 bool isSugared()
const {
return false; }
6892 QualType desugar()
const {
return QualType(
this, 0); }
6894 void Profile(llvm::FoldingSetNodeID &ID) {
6895 Profile(ID, WrappedType, ContainedType, Attrs);
6898 static void Profile(llvm::FoldingSetNodeID &ID, QualType Wrapped,
6899 QualType Contained,
const Attributes &Attrs) {
6900 ID.AddPointer(Wrapped.getAsOpaquePtr());
6901 ID.AddPointer(Contained.getAsOpaquePtr());
6902 ID.AddInteger(
static_cast<uint32_t>(Attrs.ResourceClass));
6903 ID.AddInteger(
static_cast<uint32_t>(Attrs.ResourceDimension));
6904 ID.AddBoolean(Attrs.IsROV);
6905 ID.AddBoolean(Attrs.RawBuffer);
6906 ID.AddBoolean(Attrs.IsCounter);
6909 static bool classof(
const Type *T) {
6910 return T->getTypeClass() == HLSLAttributedResource;
6914 static const HLSLAttributedResourceType *
6915 findHandleTypeOnResource(
const Type *RT);
6921 enum SpirvOperandKind :
unsigned char {
6934 QualType ResultType;
6940 SpirvOperand(SpirvOperandKind Kind, QualType ResultType, llvm::APInt
Value)
6943 SpirvOperand(
const SpirvOperand &Other) =
default;
6944 ~SpirvOperand() =
default;
6945 SpirvOperand &operator=(
const SpirvOperand &Other) =
default;
6947 bool operator==(
const SpirvOperand &Other)
const {
6952 bool operator!=(
const SpirvOperand &Other)
const {
return !(*
this ==
Other); }
6957 bool isConstant()
const {
return Kind == ConstantId; }
6959 bool isType()
const {
return Kind == TypeId; }
6961 llvm::APInt getValue()
const {
6963 "This is not an operand with a value!");
6967 QualType getResultType()
const {
6968 assert((isConstant() || isType()) &&
6969 "This is not an operand with a result type!");
6973 static SpirvOperand createConstant(QualType ResultType, llvm::APInt Val) {
6974 return SpirvOperand(ConstantId, ResultType, std::move(Val));
6977 static SpirvOperand createLiteral(llvm::APInt Val) {
6978 return SpirvOperand(Literal, QualType(), std::move(Val));
6981 static SpirvOperand createType(QualType T) {
6982 return SpirvOperand(TypeId, T, llvm::APSInt());
6985 void Profile(llvm::FoldingSetNodeID &ID)
const {
6986 ID.AddInteger(Kind);
6987 ID.AddPointer(ResultType.getAsOpaquePtr());
6993class HLSLInlineSpirvType final
6995 public llvm::FoldingSetNode,
6996 private llvm::TrailingObjects<HLSLInlineSpirvType, SpirvOperand> {
6997 friend class ASTContext;
6998 friend TrailingObjects;
7006 HLSLInlineSpirvType(uint32_t Opcode, uint32_t Size, uint32_t Alignment,
7007 ArrayRef<SpirvOperand> Operands)
7009 Size(
Size), Alignment(Alignment), NumOperands(Operands.size()) {
7010 for (
size_t I = 0; I < NumOperands; I++) {
7013 auto *
Operand =
new (&getTrailingObjects()[I]) SpirvOperand();
7021 uint32_t getAlignment()
const {
return Alignment; }
7022 ArrayRef<SpirvOperand> getOperands()
const {
7023 return getTrailingObjects(NumOperands);
7026 bool isSugared()
const {
return false; }
7027 QualType desugar()
const {
return QualType(
this, 0); }
7029 void Profile(llvm::FoldingSetNodeID &ID) {
7030 Profile(ID, Opcode, Size, Alignment, getOperands());
7033 static void Profile(llvm::FoldingSetNodeID &ID, uint32_t Opcode,
7034 uint32_t Size, uint32_t Alignment,
7035 ArrayRef<SpirvOperand> Operands) {
7036 ID.AddInteger(Opcode);
7037 ID.AddInteger(Size);
7038 ID.AddInteger(Alignment);
7039 for (
auto &Operand : Operands)
7043 static bool classof(
const Type *T) {
7044 return T->getTypeClass() == HLSLInlineSpirv;
7048class TemplateTypeParmType :
public Type,
public llvm::FoldingSetNode {
7049 friend class ASTContext;
7052 TemplateTypeParmDecl *TTPDecl;
7054 TemplateTypeParmType(
unsigned D,
unsigned I,
bool PP,
7055 TemplateTypeParmDecl *TTPDecl, QualType Canon)
7060 assert(!TTPDecl == Canon.isNull());
7061 TemplateTypeParmTypeBits.Depth = D;
7062 TemplateTypeParmTypeBits.Index = I;
7063 TemplateTypeParmTypeBits.ParameterPack = PP;
7067 unsigned getDepth()
const {
return TemplateTypeParmTypeBits.Depth; }
7068 unsigned getIndex()
const {
return TemplateTypeParmTypeBits.Index; }
7070 return TemplateTypeParmTypeBits.ParameterPack;
7073 TemplateTypeParmDecl *getDecl()
const {
return TTPDecl; }
7077 bool isSugared()
const {
return false; }
7078 QualType desugar()
const {
return QualType(
this, 0); }
7080 void Profile(llvm::FoldingSetNodeID &ID) {
7084 static void Profile(llvm::FoldingSetNodeID &ID,
unsigned Depth,
7085 unsigned Index,
bool ParameterPack,
7086 TemplateTypeParmDecl *TTPDecl) {
7087 ID.AddInteger(Depth);
7088 ID.AddInteger(Index);
7089 ID.AddBoolean(ParameterPack);
7090 ID.AddPointer(TTPDecl);
7093 static bool classof(
const Type *T) {
7105class SubstTemplateTypeParmType final
7107 public llvm::FoldingSetNode,
7108 private llvm::TrailingObjects<SubstTemplateTypeParmType, QualType> {
7109 friend class ASTContext;
7110 friend class llvm::TrailingObjects<SubstTemplateTypeParmType, QualType>;
7112 Decl *AssociatedDecl;
7114 SubstTemplateTypeParmType(QualType Replacement, Decl *AssociatedDecl,
7115 unsigned Index, UnsignedOrNone PackIndex,
7121 QualType getReplacementType()
const {
7122 return SubstTemplateTypeParmTypeBits.HasNonCanonicalUnderlyingType
7123 ? *getTrailingObjects()
7124 : getCanonicalTypeInternal();
7130 Decl *getAssociatedDecl()
const {
return AssociatedDecl; }
7133 const TemplateTypeParmDecl *getReplacedParameter()
const;
7137 unsigned getIndex()
const {
return SubstTemplateTypeParmTypeBits.Index; }
7141 unsigned getFinal()
const {
return SubstTemplateTypeParmTypeBits.Final; }
7144 return UnsignedOrNone::fromInternalRepresentation(
7145 SubstTemplateTypeParmTypeBits.PackIndex);
7148 bool isSugared()
const {
return true; }
7149 QualType desugar()
const {
return getReplacementType(); }
7151 void Profile(llvm::FoldingSetNodeID &ID) {
7152 Profile(ID, getReplacementType(), getAssociatedDecl(),
getIndex(),
7153 getPackIndex(), getFinal());
7156 static void Profile(llvm::FoldingSetNodeID &ID, QualType Replacement,
7157 const Decl *AssociatedDecl,
unsigned Index,
7158 UnsignedOrNone PackIndex,
bool Final);
7160 static bool classof(
const Type *T) {
7161 return T->getTypeClass() == SubstTemplateTypeParm;
7171class SubstPackType :
public Type,
public llvm::FoldingSetNode {
7172 friend class ASTContext;
7179 SubstPackType(TypeClass Derived, QualType Canon,
7180 const TemplateArgument &ArgPack);
7183 unsigned getNumArgs()
const {
return SubstPackTypeBits.NumArgs; }
7185 TemplateArgument getArgumentPack()
const;
7187 void Profile(llvm::FoldingSetNodeID &ID);
7188 static void Profile(llvm::FoldingSetNodeID &ID,
7189 const TemplateArgument &ArgPack);
7191 static bool classof(
const Type *T) {
7192 return T->getTypeClass() == SubstTemplateTypeParmPack ||
7193 T->getTypeClass() == SubstBuiltinTemplatePack;
7198class SubstBuiltinTemplatePackType :
public SubstPackType {
7199 friend class ASTContext;
7201 SubstBuiltinTemplatePackType(QualType Canon,
const TemplateArgument &ArgPack);
7204 bool isSugared()
const {
return false; }
7205 QualType desugar()
const {
return QualType(
this, 0); }
7208 using SubstPackType::Profile;
7210 static bool classof(
const Type *T) {
7211 return T->getTypeClass() == SubstBuiltinTemplatePack;
7227class SubstTemplateTypeParmPackType :
public SubstPackType {
7228 friend class ASTContext;
7230 llvm::PointerIntPair<Decl *, 1, bool> AssociatedDeclAndFinal;
7232 SubstTemplateTypeParmPackType(QualType Canon, Decl *AssociatedDecl,
7233 unsigned Index,
bool Final,
7234 const TemplateArgument &ArgPack);
7242 Decl *getAssociatedDecl()
const;
7245 const TemplateTypeParmDecl *getReplacedParameter()
const;
7250 return SubstPackTypeBits.SubstTemplTypeParmPackIndex;
7255 bool getFinal()
const;
7257 bool isSugared()
const {
return false; }
7258 QualType desugar()
const {
return QualType(
this, 0); }
7260 void Profile(llvm::FoldingSetNodeID &ID);
7261 static void Profile(llvm::FoldingSetNodeID &ID,
const Decl *AssociatedDecl,
7262 unsigned Index,
bool Final,
7263 const TemplateArgument &ArgPack);
7265 static bool classof(
const Type *T) {
7266 return T->getTypeClass() == SubstTemplateTypeParmPack;
7278class DeducedType :
public Type {
7279 QualType DeducedAsType;
7282 DeducedType(TypeClass TC, DeducedKind DK, QualType DeducedAsTypeOrCanon);
7284 static void Profile(llvm::FoldingSetNodeID &ID, DeducedKind DK,
7286 ID.AddInteger(llvm::to_underlying(DK));
7292 return static_cast<DeducedKind>(DeducedTypeBits.Kind);
7295 bool isSugared()
const {
return getDeducedKind() == DeducedKind::Deduced; }
7296 QualType desugar()
const {
7297 return isSugared() ? DeducedAsType : QualType(
this, 0);
7302 QualType getDeducedType()
const {
return DeducedAsType; }
7303 bool isDeduced()
const {
return getDeducedKind() != DeducedKind::Undeduced; }
7305 static bool classof(
const Type *T) {
7306 return T->getTypeClass() ==
Auto ||
7307 T->getTypeClass() == DeducedTemplateSpecialization;
7313class AutoType :
public DeducedType,
public llvm::FoldingSetNode {
7314 friend class ASTContext;
7316 TemplateDecl *TypeConstraintConcept;
7318 AutoType(DeducedKind DK, QualType DeducedAsTypeOrCanon,
7319 AutoTypeKeyword Keyword, TemplateDecl *TypeConstraintConcept,
7320 ArrayRef<TemplateArgument> TypeConstraintArgs);
7323 ArrayRef<TemplateArgument> getTypeConstraintArguments()
const {
7324 return {
reinterpret_cast<const TemplateArgument *
>(
this + 1),
7325 AutoTypeBits.NumArgs};
7328 TemplateDecl *getTypeConstraintConcept()
const {
7329 return TypeConstraintConcept;
7332 bool isConstrained()
const {
7333 return TypeConstraintConcept !=
nullptr;
7336 bool isDecltypeAuto()
const {
7337 return getKeyword() == AutoTypeKeyword::DecltypeAuto;
7340 bool isGNUAutoType()
const {
7341 return getKeyword() == AutoTypeKeyword::GNUAutoType;
7345 return (AutoTypeKeyword)AutoTypeBits.Keyword;
7348 void Profile(llvm::FoldingSetNodeID &ID,
const ASTContext &Context);
7349 static void Profile(llvm::FoldingSetNodeID &ID,
const ASTContext &Context,
7350 DeducedKind DK, QualType Deduced, AutoTypeKeyword Keyword,
7351 TemplateDecl *CD, ArrayRef<TemplateArgument> Arguments);
7353 static bool classof(
const Type *T) {
7354 return T->getTypeClass() ==
Auto;
7359class DeducedTemplateSpecializationType :
public KeywordWrapper<DeducedType>,
7360 public llvm::FoldingSetNode {
7361 friend class ASTContext;
7366 DeducedTemplateSpecializationType(DeducedKind DK,
7367 QualType DeducedAsTypeOrCanon,
7368 ElaboratedTypeKeyword Keyword,
7369 TemplateName Template)
7370 : KeywordWrapper(
Keyword, DeducedTemplateSpecialization, DK,
7371 DeducedAsTypeOrCanon),
7375 if (DK == DeducedKind::Deduced)
7384 void Profile(llvm::FoldingSetNodeID &ID)
const {
7385 Profile(ID, getDeducedKind(), getDeducedType(), getKeyword(),
7389 static void Profile(llvm::FoldingSetNodeID &ID, DeducedKind DK,
7390 QualType Deduced, ElaboratedTypeKeyword Keyword,
7391 TemplateName Template) {
7392 DeducedType::Profile(ID, DK, Deduced);
7393 ID.AddInteger(llvm::to_underlying(Keyword));
7397 static bool classof(
const Type *T) {
7398 return T->getTypeClass() == DeducedTemplateSpecialization;
7422class TemplateSpecializationType :
public TypeWithKeyword,
7423 public llvm::FoldingSetNode {
7424 friend class ASTContext;
7435 TemplateSpecializationType(ElaboratedTypeKeyword Keyword, TemplateName T,
7436 bool IsAlias, ArrayRef<TemplateArgument> Args,
7437 QualType Underlying);
7452 anyDependentTemplateArguments(ArrayRef<TemplateArgumentLoc> Args,
7453 ArrayRef<TemplateArgument> Converted);
7455 anyDependentTemplateArguments(
const TemplateArgumentListInfo &,
7456 ArrayRef<TemplateArgument> Converted);
7457 static bool anyInstantiationDependentTemplateArguments(
7458 ArrayRef<TemplateArgumentLoc> Args);
7462 bool isCurrentInstantiation()
const {
7463 return isa<InjectedClassNameType>(getCanonicalTypeInternal());
7481 bool isTypeAlias()
const {
return TemplateSpecializationTypeBits.TypeAlias; }
7485 QualType getAliasedType()
const;
7490 ArrayRef<TemplateArgument> template_arguments()
const {
7491 return {
reinterpret_cast<const TemplateArgument *
>(
this + 1),
7492 TemplateSpecializationTypeBits.NumArgs};
7495 bool isSugared()
const;
7497 QualType desugar()
const {
7498 return isTypeAlias() ? getAliasedType() : getCanonicalTypeInternal();
7501 void Profile(llvm::FoldingSetNodeID &ID,
const ASTContext &Ctx);
7502 static void Profile(llvm::FoldingSetNodeID &ID, ElaboratedTypeKeyword Keyword,
7503 TemplateName T, ArrayRef<TemplateArgument> Args,
7504 QualType Underlying,
const ASTContext &Context);
7506 static bool classof(
const Type *T) {
7513void printTemplateArgumentList(raw_ostream &OS,
7514 ArrayRef<TemplateArgument> Args,
7515 const PrintingPolicy &Policy,
7516 const TemplateParameterList *TPL =
nullptr);
7518void printTemplateArgumentList(raw_ostream &OS,
7519 ArrayRef<TemplateArgumentLoc> Args,
7520 const PrintingPolicy &Policy,
7521 const TemplateParameterList *TPL =
nullptr);
7523void printTemplateArgumentList(raw_ostream &OS,
7524 const TemplateArgumentListInfo &Args,
7525 const PrintingPolicy &Policy,
7526 const TemplateParameterList *TPL =
nullptr);
7530bool isSubstitutedDefaultArgument(ASTContext &Ctx, TemplateArgument Arg,
7531 const NamedDecl *Param,
7532 ArrayRef<TemplateArgument> Args,
7547class DependentNameType :
public TypeWithKeyword,
public llvm::FoldingSetNode {
7548 friend class ASTContext;
7551 NestedNameSpecifier NNS;
7554 const IdentifierInfo *Name;
7556 DependentNameType(ElaboratedTypeKeyword Keyword, NestedNameSpecifier NNS,
7557 const IdentifierInfo *Name, QualType CanonType)
7558 : TypeWithKeyword(
Keyword, DependentName, CanonType,
7562 NNS(NNS), Name(Name) {
7568 NestedNameSpecifier getQualifier()
const {
return NNS; }
7576 bool isSugared()
const {
return false; }
7577 QualType desugar()
const {
return QualType(
this, 0); }
7579 void Profile(llvm::FoldingSetNodeID &ID) {
7580 Profile(ID, getKeyword(), NNS, Name);
7583 static void Profile(llvm::FoldingSetNodeID &ID, ElaboratedTypeKeyword Keyword,
7584 NestedNameSpecifier NNS,
const IdentifierInfo *Name) {
7585 ID.AddInteger(llvm::to_underlying(Keyword));
7587 ID.AddPointer(Name);
7590 static bool classof(
const Type *T) {
7591 return T->getTypeClass() == DependentName;
7617class PackExpansionType :
public Type,
public llvm::FoldingSetNode {
7618 friend class ASTContext;
7623 PackExpansionType(QualType Pattern, QualType Canon,
7624 UnsignedOrNone NumExpansions)
7625 : Type(PackExpansion, Canon,
7630 PackExpansionTypeBits.NumExpansions =
7631 NumExpansions ? *NumExpansions + 1 : 0;
7638 QualType getPattern()
const {
return Pattern; }
7643 if (PackExpansionTypeBits.NumExpansions)
7644 return PackExpansionTypeBits.NumExpansions - 1;
7645 return std::nullopt;
7648 bool isSugared()
const {
return false; }
7649 QualType desugar()
const {
return QualType(
this, 0); }
7651 void Profile(llvm::FoldingSetNodeID &ID) {
7652 Profile(ID, getPattern(), getNumExpansions());
7655 static void Profile(llvm::FoldingSetNodeID &ID, QualType Pattern,
7656 UnsignedOrNone NumExpansions) {
7657 ID.AddPointer(Pattern.getAsOpaquePtr());
7658 ID.AddInteger(NumExpansions.toInternalRepresentation());
7661 static bool classof(
const Type *T) {
7662 return T->getTypeClass() == PackExpansion;
7669class ObjCProtocolQualifiers {
7671 ObjCProtocolQualifiers() =
default;
7673 ObjCProtocolDecl *
const *getProtocolStorage()
const {
7674 return const_cast<ObjCProtocolQualifiers*
>(
this)->getProtocolStorage();
7677 ObjCProtocolDecl **getProtocolStorage() {
7678 return static_cast<T*
>(
this)->getProtocolStorageImpl();
7681 void setNumProtocols(
unsigned N) {
7682 static_cast<T*
>(
this)->setNumProtocolsImpl(N);
7685 void initialize(ArrayRef<ObjCProtocolDecl *> protocols) {
7686 setNumProtocols(protocols.size());
7687 assert(getNumProtocols() == protocols.size() &&
7688 "bitfield overflow in protocol count");
7689 if (!protocols.empty())
7690 memcpy(getProtocolStorage(), protocols.data(),
7691 protocols.size() *
sizeof(ObjCProtocolDecl*));
7695 using qual_iterator = ObjCProtocolDecl *
const *;
7696 using qual_range = llvm::iterator_range<qual_iterator>;
7698 qual_range quals()
const {
return qual_range(qual_begin(), qual_end()); }
7699 qual_iterator qual_begin()
const {
return getProtocolStorage(); }
7700 qual_iterator qual_end()
const {
return qual_begin() + getNumProtocols(); }
7702 bool qual_empty()
const {
return getNumProtocols() == 0; }
7706 unsigned getNumProtocols()
const {
7707 return static_cast<const T*
>(
this)->getNumProtocolsImpl();
7711 ObjCProtocolDecl *getProtocol(
unsigned I)
const {
7712 assert(I < getNumProtocols() &&
"Out-of-range protocol access");
7713 return qual_begin()[I];
7717 ArrayRef<ObjCProtocolDecl *> getProtocols()
const {
7718 return ArrayRef<ObjCProtocolDecl *>(qual_begin(), getNumProtocols());
7724class ObjCTypeParamType :
public Type,
7725 public ObjCProtocolQualifiers<ObjCTypeParamType>,
7726 public llvm::FoldingSetNode {
7727 friend class ASTContext;
7728 friend class ObjCProtocolQualifiers<ObjCTypeParamType>;
7731 unsigned NumProtocols : 6;
7733 ObjCTypeParamDecl *OTPDecl;
7738 ObjCProtocolDecl **getProtocolStorageImpl();
7742 unsigned getNumProtocolsImpl()
const {
7743 return NumProtocols;
7746 void setNumProtocolsImpl(
unsigned N) {
7750 ObjCTypeParamType(
const ObjCTypeParamDecl *D,
7752 ArrayRef<ObjCProtocolDecl *> protocols);
7755 bool isSugared()
const {
return true; }
7756 QualType desugar()
const {
return getCanonicalTypeInternal(); }
7758 static bool classof(
const Type *T) {
7759 return T->getTypeClass() == ObjCTypeParam;
7762 void Profile(llvm::FoldingSetNodeID &ID);
7763 static void Profile(llvm::FoldingSetNodeID &ID,
7764 const ObjCTypeParamDecl *OTPDecl,
7765 QualType CanonicalType,
7766 ArrayRef<ObjCProtocolDecl *> protocols);
7768 ObjCTypeParamDecl *getDecl()
const {
return OTPDecl; }
7799class ObjCObjectType :
public Type,
7800 public ObjCProtocolQualifiers<ObjCObjectType> {
7801 friend class ObjCProtocolQualifiers<ObjCObjectType>;
7819 mutable llvm::PointerIntPair<const ObjCObjectType *, 1, bool>
7820 CachedSuperClassType;
7822 QualType *getTypeArgStorage();
7823 const QualType *getTypeArgStorage()
const {
7824 return const_cast<ObjCObjectType *
>(
this)->getTypeArgStorage();
7827 ObjCProtocolDecl **getProtocolStorageImpl();
7830 unsigned getNumProtocolsImpl()
const {
7831 return ObjCObjectTypeBits.NumProtocols;
7833 void setNumProtocolsImpl(
unsigned N) {
7834 ObjCObjectTypeBits.NumProtocols = N;
7838 enum Nonce_ObjCInterface { Nonce_ObjCInterface };
7840 ObjCObjectType(QualType Canonical, QualType Base,
7841 ArrayRef<QualType> typeArgs,
7842 ArrayRef<ObjCProtocolDecl *> protocols,
7845 ObjCObjectType(
enum Nonce_ObjCInterface)
7847 BaseType(QualType(this_(), 0)) {
7848 ObjCObjectTypeBits.NumProtocols = 0;
7849 ObjCObjectTypeBits.NumTypeArgs = 0;
7850 ObjCObjectTypeBits.IsKindOf = 0;
7853 void computeSuperClassTypeSlow()
const;
7864 bool isObjCId()
const {
7865 return getBaseType()->isSpecificBuiltinType(BuiltinType::ObjCId);
7868 bool isObjCClass()
const {
7869 return getBaseType()->isSpecificBuiltinType(BuiltinType::ObjCClass);
7872 bool isObjCUnqualifiedId()
const {
return qual_empty() && isObjCId(); }
7873 bool isObjCUnqualifiedClass()
const {
return qual_empty() && isObjCClass(); }
7874 bool isObjCUnqualifiedIdOrClass()
const {
7875 if (!qual_empty())
return false;
7876 if (
const BuiltinType *T =
getBaseType()->getAs<BuiltinType>())
7877 return T->getKind() == BuiltinType::ObjCId ||
7878 T->getKind() == BuiltinType::ObjCClass;
7881 bool isObjCQualifiedId()
const {
return !qual_empty() && isObjCId(); }
7882 bool isObjCQualifiedClass()
const {
return !qual_empty() && isObjCClass(); }
7886 ObjCInterfaceDecl *getInterface()
const;
7890 bool isSpecialized()
const;
7893 bool isSpecializedAsWritten()
const {
7894 return ObjCObjectTypeBits.NumTypeArgs > 0;
7899 bool isUnspecialized()
const {
return !isSpecialized(); }
7903 bool isUnspecializedAsWritten()
const {
return !isSpecializedAsWritten(); }
7906 ArrayRef<QualType> getTypeArgs()
const;
7910 ArrayRef<QualType> getTypeArgsAsWritten()
const {
7911 return {getTypeArgStorage(), ObjCObjectTypeBits.NumTypeArgs};
7915 bool isKindOfTypeAsWritten()
const {
return ObjCObjectTypeBits.IsKindOf; }
7918 bool isKindOfType()
const;
7926 QualType getSuperClassType()
const {
7927 if (!CachedSuperClassType.getInt())
7928 computeSuperClassTypeSlow();
7930 assert(CachedSuperClassType.getInt() &&
"Superclass not set?");
7931 return QualType(CachedSuperClassType.getPointer(), 0);
7936 QualType stripObjCKindOfTypeAndQuals(
const ASTContext &ctx)
const;
7938 bool isSugared()
const {
return false; }
7939 QualType desugar()
const {
return QualType(
this, 0); }
7941 static bool classof(
const Type *T) {
7942 return T->getTypeClass() == ObjCObject ||
7943 T->getTypeClass() == ObjCInterface;
7951class ObjCObjectTypeImpl :
public ObjCObjectType,
public llvm::FoldingSetNode {
7952 friend class ASTContext;
7957 ObjCObjectTypeImpl(QualType Canonical, QualType Base,
7958 ArrayRef<QualType> typeArgs,
7959 ArrayRef<ObjCProtocolDecl *> protocols,
7961 : ObjCObjectType(Canonical,
Base, typeArgs, protocols, isKindOf) {}
7964 void Profile(llvm::FoldingSetNodeID &ID);
7965 static void Profile(llvm::FoldingSetNodeID &ID,
7967 ArrayRef<QualType> typeArgs,
7968 ArrayRef<ObjCProtocolDecl *> protocols,
7972inline QualType *ObjCObjectType::getTypeArgStorage() {
7973 return reinterpret_cast<QualType *
>(
static_cast<ObjCObjectTypeImpl*
>(
this)+1);
7976inline ObjCProtocolDecl **ObjCObjectType::getProtocolStorageImpl() {
7977 return reinterpret_cast<ObjCProtocolDecl**
>(
7978 getTypeArgStorage() + ObjCObjectTypeBits.NumTypeArgs);
7981inline ObjCProtocolDecl **ObjCTypeParamType::getProtocolStorageImpl() {
7982 return reinterpret_cast<ObjCProtocolDecl**
>(
7983 static_cast<ObjCTypeParamType*
>(
this)+1);
8017 return T->getTypeClass() == ObjCInterface;
8033inline ObjCInterfaceDecl *ObjCObjectType::getInterface()
const {
8034 QualType baseType = getBaseType();
8036 if (
const auto *T = dyn_cast<ObjCInterfaceType>(ObjT))
8037 return T->getDecl();
8039 baseType = ObjT->getBaseType();
8054class ObjCObjectPointerType :
public Type,
public llvm::FoldingSetNode {
8061 PointeeType(Pointee) {}
8204 QualType getSuperClassType()
const;
8216 ID.AddPointer(T.getAsOpaquePtr());
8220 return T->getTypeClass() == ObjCObjectPointer;
8224class AtomicType :
public Type,
public llvm::FoldingSetNode {
8245 ID.AddPointer(T.getAsOpaquePtr());
8249 return T->getTypeClass() ==
Atomic;
8254class PipeType :
public Type,
public llvm::FoldingSetNode {
8262 ElementType(elemType), isRead(isRead) {}
8276 ID.AddPointer(T.getAsOpaquePtr());
8277 ID.AddBoolean(isRead);
8281 return T->getTypeClass() ==
Pipe;
8290 LLVM_PREFERRED_TYPE(
bool)
8291 unsigned IsUnsigned : 1;
8292 unsigned NumBits : 24;
8309 static void Profile(llvm::FoldingSetNodeID &ID,
bool IsUnsigned,
8311 ID.AddBoolean(IsUnsigned);
8312 ID.AddInteger(NumBits);
8320 llvm::PointerIntPair<Expr*, 1, bool> ExprAndUnsigned;
8328 Expr *getNumBitsExpr()
const;
8336 static void Profile(llvm::FoldingSetNodeID &ID,
const ASTContext &Context,
8337 bool IsUnsigned,
Expr *NumBitsExpr);
8340 return T->getTypeClass() == DependentBitInt;
8344class PredefinedSugarType final :
public Type {
8357 static StringRef getName(Kind KD);
8371 return T->getTypeClass() == PredefinedSugar;
8385 if (!
type.hasLocalNonFastQualifiers())
8386 return type.getTypePtrUnsafe();
8407class alignas(8) TypeSourceInfo {
8414 TypeSourceInfo(
QualType ty,
size_t DataSize);
8431 Ty->getLocallyUnqualifiedSingleStepDesugaredType().split();
8437 return getCommonPtr()->BaseType;
8441 return (
isNull() ?
nullptr : getCommonPtr()->BaseType);
8449 if (
Self.isObjectType() ||
Self.isReferenceType())
8452 return F->getMethodQuals().empty() && F->getRefQualifier() ==
RQ_None;
8462 const ExtQuals *eq = getExtQualsUnsafe();
8471 Quals = getExtQualsUnsafe()->getQualifiers();
8477 Qualifiers quals = getCommonPtr()->CanonicalType.getLocalQualifiers();
8483 unsigned cvr = getCommonPtr()->CanonicalType.getLocalCVRQualifiers();
8489 QualType canon = getCommonPtr()->CanonicalType;
8494 return getTypePtr()->isCanonicalUnqualified();
8502 if (T->isVariablyModifiedType() && T->hasSizedVLAType())
8511 getCommonPtr()->CanonicalType.isLocalConstQualified();
8516 getCommonPtr()->CanonicalType.isLocalRestrictQualified();
8522 getCommonPtr()->CanonicalType.isLocalVolatileQualified();
8527 getCommonPtr()->CanonicalType.hasLocalQualifiers();
8534 return QualType(getSplitUnqualifiedTypeImpl(*this).Ty, 0);
8541 return getSplitUnqualifiedTypeImpl(*
this);
8573 if (
const auto *FT = PT->getPointeeType()->getAs<
FunctionType>())
8574 return FT->getExtInfo();
8576 return FT->getExtInfo();
8623 return RefType->getPointeeType();
8714 return !T->getPointeeType()->isFunctionType();
8721 return Fn->hasCFIUncheckedCallee();
8742 return T->getPointeeType()->isFunctionType();
8749 return T->getPointeeType()->isFunctionType();
8760 return T->isMemberFunctionPointer();
8767 return T->isMemberDataPointer();
8827 if (
auto *CMT = dyn_cast<ConstantMatrixType>(CanonicalType))
8828 return CMT->getElementType()->isBooleanType();
8875 return OPT->isObjCQualifiedIdType();
8881 return OPT->isObjCQualifiedClassType();
8887 return OPT->isObjCIdType();
8893 return OPT->isObjCClassType();
8899 return OPT->getPointeeType()->isSpecificBuiltinType(BuiltinType::ObjCSel);
8911#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
8912 inline bool Type::is##Id##Type() const { \
8913 return isSpecificBuiltinType(BuiltinType::Id); \
8915#include "clang/Basic/OpenCLImageTypes.def"
8938#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) is##Id##Type() ||
8940#include "clang/Basic/OpenCLImageTypes.def"
8952#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
8953 inline bool Type::is##Id##Type() const { \
8954 return isSpecificBuiltinType(BuiltinType::Id); \
8956#include "clang/Basic/OpenCLExtensionTypes.def"
8959#define INTEL_SUBGROUP_AVC_TYPE(ExtType, Id) \
8960 isOCLIntelSubgroupAVC##Id##Type() ||
8962#include "clang/Basic/OpenCLExtensionTypes.def"
8967#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) is##Id##Type() ||
8969#include "clang/Basic/OpenCLExtensionTypes.def"
8978#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) \
8979 inline bool Type::is##Id##Type() const { \
8980 return isSpecificBuiltinType(BuiltinType::Id); \
8982#include "clang/Basic/HLSLIntangibleTypes.def"
8985#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) is##Id##Type() ||
8987#include "clang/Basic/HLSLIntangibleTypes.def"
9016 if (
const auto *BT = dyn_cast<BuiltinType>(
this))
9017 return BT->isPlaceholderType();
9022 if (
const auto *BT = dyn_cast<BuiltinType>(
this))
9023 if (BT->isPlaceholderType())
9034 if (
const auto *BT = dyn_cast<BuiltinType>(
this))
9035 return BT->isNonOverloadPlaceholderType();
9084 if (
const auto *BT = dyn_cast<BuiltinType>(CanonicalType))
9085 return BT->isInteger();
9086 if (
const EnumType *ET = dyn_cast<EnumType>(CanonicalType)) {
9093 if (
const auto *OT = dyn_cast<OverflowBehaviorType>(CanonicalType))
9094 return OT->getUnderlyingType()->isIntegerType();
9100 if (
const auto *BT = dyn_cast<BuiltinType>(CanonicalType)) {
9101 return BT->getKind() >= BuiltinType::ShortAccum &&
9102 BT->getKind() <= BuiltinType::SatULongFract;
9116 if (
const auto *BT = dyn_cast<BuiltinType>(CanonicalType)) {
9117 return BT->getKind() >= BuiltinType::SatShortAccum &&
9118 BT->getKind() <= BuiltinType::SatULongFract;
9128 if (
const auto *BT = dyn_cast<BuiltinType>(CanonicalType)) {
9129 return ((BT->getKind() >= BuiltinType::ShortAccum &&
9130 BT->getKind() <= BuiltinType::LongAccum) ||
9131 (BT->getKind() >= BuiltinType::ShortFract &&
9132 BT->getKind() <= BuiltinType::LongFract) ||
9133 (BT->getKind() >= BuiltinType::SatShortAccum &&
9134 BT->getKind() <= BuiltinType::SatLongAccum) ||
9135 (BT->getKind() >= BuiltinType::SatShortFract &&
9136 BT->getKind() <= BuiltinType::SatLongFract));
9146 if (
const auto *BT = dyn_cast<BuiltinType>(CanonicalType))
9147 return BT->getKind() > BuiltinType::Void &&
9148 BT->getKind() <= BuiltinType::NullPtr;
9149 if (
const EnumType *ET = dyn_cast<EnumType>(CanonicalType))
9162 if (
const auto *BT = dyn_cast<BuiltinType>(CanonicalType))
9163 return BT->isInteger();
9167 if (
const auto *ET = dyn_cast<EnumType>(CanonicalType))
9170 if (
const auto *OBT = dyn_cast<OverflowBehaviorType>(CanonicalType))
9171 return OBT->getUnderlyingType()->isIntegralOrEnumerationType();
9177 if (
const auto *BT = dyn_cast<BuiltinType>(CanonicalType))
9178 return BT->getKind() == BuiltinType::Bool;
9184 return DT && !DT->isDeduced();
9201 return TST->isTypeAlias();
9228 if (
type->isAnyPointerType())
9229 return type->getPointeeType().getTypePtr();
9230 else if (
type->isArrayType())
9231 return type->getBaseElementTypeUnsafe();
9256 PD.
AddTaggedVal(
reinterpret_cast<uint64_t
>(T.getAsOpaquePtr()),
9268 "ArrayType cannot be used with getAs!");
9271 if (
const auto *Ty = dyn_cast<T>(
this))
9275 if (!
isa<T>(CanonicalType))
9287 if (
const auto *Ty = dyn_cast<T>(
this))
9291 if (!
isa<T>(CanonicalType))
9296 const Type *Ty =
this;
9298 if (
const auto *A = dyn_cast<AttributedType>(Ty))
9299 Ty = A->getModifiedType().getTypePtr();
9300 else if (
const auto *A = dyn_cast<BTFTagAttributedType>(Ty))
9301 Ty = A->getWrappedType().getTypePtr();
9302 else if (
const auto *A = dyn_cast<HLSLAttributedResourceType>(Ty))
9303 Ty = A->getWrappedType().getTypePtr();
9304 else if (
const auto *P = dyn_cast<ParenType>(Ty))
9305 Ty = P->desugar().getTypePtr();
9306 else if (
const auto *A = dyn_cast<AdjustedType>(Ty))
9307 Ty = A->desugar().getTypePtr();
9308 else if (
const auto *M = dyn_cast<MacroQualifiedType>(Ty))
9309 Ty = M->desugar().getTypePtr();
9316 return dyn_cast<T>(Ty);
9321 if (
const auto *arr = dyn_cast<ArrayType>(
this))
9335 "ArrayType cannot be used with castAs!");
9337 if (
const auto *ty = dyn_cast<T>(
this))
return ty;
9338 assert(
isa<T>(CanonicalType));
9344 if (
const auto *arr = dyn_cast<ArrayType>(
this))
return arr;
9350 :
AdjustedType(Decayed, OriginalType, DecayedPtr, CanonicalPtr) {
9352 QualType Adjusted = getAdjustedType();
9353 (void)AttributedType::stripOuterNullability(Adjusted);
9360 (void)AttributedType::stripOuterNullability(Decayed);
9375 TypePtr = Pointee.getTypePtr();
9381 if (
const auto *FPT = TypePtr->
getAs<FunctionProtoType>())
9382 return FPT->getFunctionEffects();
Provides definitions for the various language-specific address spaces.
static bool isUnsigned(SValBuilder &SVB, NonLoc Value)
Defines the clang::attr::Kind enum.
Defines the Diagnostic-related interfaces.
static bool isBooleanType(QualType Ty)
llvm::dxil::ResourceClass ResourceClass
static std::optional< NonLoc > getIndex(ProgramStateRef State, const ElementRegion *ER, CharKind CK)
clang::CharUnits operator*(clang::CharUnits::QuantityType Scale, const clang::CharUnits &CU)
static void dump(llvm::raw_ostream &OS, StringRef FunctionName, ArrayRef< CounterExpression > Expressions, ArrayRef< CounterMappingRegion > Regions)
static Decl::Kind getKind(const Decl *D)
Defines the ExceptionSpecificationType enumeration and various utility functions.
static QualType getObjectType(APValue::LValueBase B)
Retrieves the "underlying object type" of the given expression, as used by __builtin_object_size.
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified.
Defines the clang::LangOptions interface.
llvm::MachO::Record Record
*collection of selector each with an associated kind and an ordered *collection of selectors A selector has a kind
llvm::raw_ostream & operator<<(llvm::raw_ostream &OS, const OMPTraitInfo &TI)
static StringRef getIdentifier(const Token &Tok)
Implements a partial diagnostic that can be emitted anwyhere in a DiagnosticBuilder stream.
static QualType getUnderlyingType(const SubRegion *R)
static bool hasAttr(const Decl *D, bool IgnoreImplicitAttr)
static RecordDecl * getAsRecordDecl(QualType BaseType, HeuristicResolver &Resolver)
static bool isRecordType(QualType T)
static bool isParameterPack(Expr *PackExpression)
Defines the clang::SourceLocation class and associated facilities.
Defines various enumerations that describe declaration and type specifiers.
static OMPAtomicDirective * Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc, ArrayRef< OMPClause * > Clauses, Stmt *AssociatedStmt, Expressions Exprs)
Creates directive with a list of Clauses and 'x', 'v' and 'expr' parts of the atomic construct (see S...
static bool classof(const Stmt *T)
static QualType getPointeeType(const MemRegion *R)
Defines the clang::Visibility enumeration and various utility functions.
__DEVICE__ void * memcpy(void *__a, const void *__b, size_t __c)
__device__ __2f16 float __ockl_bool s
__device__ __2f16 float c
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
Represents a type which was implicitly adjusted by the semantic engine for arbitrary reasons.
static bool classof(const Type *T)
static void Profile(llvm::FoldingSetNodeID &ID, QualType Orig, QualType New)
AdjustedType(TypeClass TC, QualType OriginalTy, QualType AdjustedTy, QualType CanonicalPtr)
QualType getAdjustedType() const
void Profile(llvm::FoldingSetNodeID &ID)
QualType getOriginalType() const
static bool classof(const Type *T)
Represents an array type, per C99 6.7.5.2 - Array Declarators.
ArraySizeModifier getSizeModifier() const
Qualifiers getIndexTypeQualifiers() const
static bool classof(const Type *T)
QualType getElementType() const
ArrayType(TypeClass tc, QualType et, QualType can, ArraySizeModifier sm, unsigned tq, const Expr *sz=nullptr)
unsigned getIndexTypeCVRQualifiers() const
static void Profile(llvm::FoldingSetNodeID &ID, QualType T)
QualType getValueType() const
Gets the type contained by this atomic type, i.e.
void Profile(llvm::FoldingSetNodeID &ID)
static bool classof(const Type *T)
Attr - This represents one attribute.
static bool classof(const Type *T)
BitIntType(bool isUnsigned, unsigned NumBits)
static void Profile(llvm::FoldingSetNodeID &ID, bool IsUnsigned, unsigned NumBits)
void Profile(llvm::FoldingSetNodeID &ID) const
unsigned getNumBits() const
void Profile(llvm::FoldingSetNodeID &ID)
QualType getPointeeType() const
static bool classof(const Type *T)
static void Profile(llvm::FoldingSetNodeID &ID, QualType Pointee)
[BoundsSafety] Represents a parent type class for CountAttributedType and similar sugar types that wi...
decl_iterator dependent_decl_begin() const
decl_iterator dependent_decl_end() const
unsigned getNumCoupledDecls() const
BoundsAttributedType(TypeClass TC, QualType Wrapped, QualType Canon)
const TypeCoupledDeclRefInfo * decl_iterator
decl_range dependent_decls() const
ArrayRef< TypeCoupledDeclRefInfo > getCoupledDecls() const
llvm::iterator_range< decl_iterator > decl_range
static bool classof(const Type *T)
ArrayRef< TypeCoupledDeclRefInfo > Decls
This class is used for builtin types like 'int'.
bool isPlaceholderType() const
Determines whether this type is a placeholder type, i.e.
bool isNonOverloadPlaceholderType() const
Determines whether this type is a placeholder type other than Overload.
bool isFloatingPoint() const
static bool classof(const Type *T)
bool isSignedInteger() const
bool isUnsignedInteger() const
static bool isPlaceholderTypeKind(Kind K)
Determines whether the given kind corresponds to a placeholder type.
StringRef getName(const PrintingPolicy &Policy) const
const char * getNameAsCString(const PrintingPolicy &Policy) const
Represents a C++ struct/union/class.
Complex values, per C99 6.2.5p11.
QualType getElementType() const
static void Profile(llvm::FoldingSetNodeID &ID, QualType Element)
static bool classof(const Type *T)
void Profile(llvm::FoldingSetNodeID &ID)
Declaration of a C++20 concept.
Represents the canonical version of C arrays with a specified constant size.
unsigned getSizeBitWidth() const
Return the bit width of the size type.
ConstantArrayType(TypeClass Tc, const ConstantArrayType *ATy, QualType Can)
uint64_t getLimitedSize() const
Return the size zero-extended to uint64_t or UINT64_MAX if the value is larger than UINT64_MAX.
bool isZeroSize() const
Return true if the size is zero.
int64_t getSExtSize() const
Return the size sign-extended as a uint64_t.
const Expr * getSizeExpr() const
Return a pointer to the size expression.
static bool classof(const Type *T)
llvm::APInt getSize() const
Return the constant array size as an APInt.
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Ctx)
uint64_t getZExtSize() const
Return the size zero-extended as a uint64_t.
unsigned getNumColumns() const
Returns the number of columns in the matrix.
static void Profile(llvm::FoldingSetNodeID &ID, QualType ElementType, unsigned NumRows, unsigned NumColumns, TypeClass TypeClass)
void Profile(llvm::FoldingSetNodeID &ID)
unsigned getRowMajorFlattenedIndex(unsigned Row, unsigned Column) const
Returns the row-major flattened index of a matrix element located at row Row, and column Column.
unsigned getNumRows() const
Returns the number of rows in the matrix.
unsigned getNumElementsFlattened() const
Returns the number of elements required to embed the matrix into a vector.
unsigned getFlattenedIndex(unsigned Row, unsigned Column, bool IsRowMajor=false) const
Returns the flattened index of a matrix element located at row Row, and column Column.
ConstantMatrixType(QualType MatrixElementType, unsigned NRows, unsigned NColumns, QualType CanonElementType)
unsigned mapColumnMajorToRowMajorFlattenedIndex(unsigned ColumnMajorIdx) const
Given a column-major flattened index ColumnMajorIdx, return the equivalent row-major flattened index.
unsigned mapRowMajorToColumnMajorFlattenedIndex(unsigned RowMajorIdx) const
Given a row-major flattened index RowMajorIdx, return the equivalent column-major flattened index.
unsigned getColumnMajorFlattenedIndex(unsigned Row, unsigned Column) const
Returns the column-major flattened index of a matrix element located at row Row, and column Column.
unsigned NumRows
Number of rows and columns.
static bool classof(const Type *T)
Represents a sugar type with __counted_by or __sized_by annotations, including their _or_null variant...
void Profile(llvm::FoldingSetNodeID &ID)
static bool classof(const Type *T)
bool isCountInBytes() const
Expr * getCountExpr() const
DynamicCountPointerKind getKind() const
QualType getPointeeType() const
static bool classof(const Type *T)
QualType getDecayedType() const
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
Decl - This represents one declaration (or definition), e.g.
Expr * getAddrSpaceExpr() const
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context)
QualType getPointeeType() const
static bool classof(const Type *T)
SourceLocation getAttributeLoc() const
Expr * getNumBitsExpr() const
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context)
DependentBitIntType(bool IsUnsigned, Expr *NumBits)
static bool classof(const Type *T)
friend class StmtIteratorBase
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context)
static bool classof(const Type *T)
Expr * getSizeExpr() const
Expr * getSizeExpr() const
static bool classof(const Type *T)
SourceLocation getAttributeLoc() const
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context)
QualType getElementType() const
Expr * getColumnExpr() const
Expr * getRowExpr() const
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context)
SourceLocation getAttributeLoc() const
static bool classof(const Type *T)
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context)
DependentTypeOfExprType(const ASTContext &Context, Expr *E, TypeOfKind Kind)
Expr * getSizeExpr() const
VectorKind getVectorKind() const
SourceLocation getAttributeLoc() const
QualType getElementType() const
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context)
static bool classof(const Type *T)
@ ak_addrspace
address space
Wrap a function effect's condition expression in another struct so that FunctionProtoType's TrailingO...
EffectConditionExpr(Expr *E)
Expr * getCondition() const
bool operator==(const EffectConditionExpr &RHS) const
EffectConditionExpr()=default
This represents one expression.
We can encode up to four bits in the low bits of a type pointer, but there are many more type qualifi...
Qualifiers::ObjCLifetime getObjCLifetime() const
static void Profile(llvm::FoldingSetNodeID &ID, const Type *BaseType, Qualifiers Quals)
void Profile(llvm::FoldingSetNodeID &ID) const
ExtQuals(const Type *baseType, QualType canon, Qualifiers quals)
bool hasObjCGCAttr() const
Qualifiers::GC getObjCGCAttr() const
bool hasAddressSpace() const
const Type * getBaseType() const
Qualifiers getQualifiers() const
LangAS getAddressSpace() const
bool hasObjCLifetime() const
bool isAccessorWithinNumElements(char c, bool isNumericAccessor) const
static int getNumericAccessorIdx(char c)
static bool classof(const Type *T)
static int getPointAccessorIdx(char c)
static int getAccessorIdx(char c, bool isNumericAccessor)
Represents a function declaration or definition.
Support iteration in parallel through a pair of FunctionEffect and EffectConditionExpr containers.
bool operator==(const FunctionEffectIterator &Other) const
bool operator!=(const FunctionEffectIterator &Other) const
FunctionEffectIterator operator++()
FunctionEffectIterator(const Container &O, size_t I)
FunctionEffectWithCondition operator*() const
A mutable set of FunctionEffect::Kind.
static FunctionEffectKindSet difference(FunctionEffectKindSet LHS, FunctionEffectKindSet RHS)
bool contains(const FunctionEffect::Kind EK) const
FunctionEffectKindSet()=default
FunctionEffectKindSet(FunctionEffectsRef FX)
void insert(FunctionEffectKindSet Set)
void insert(FunctionEffectsRef FX)
void insert(FunctionEffect Effect)
FunctionEffectSet(const FunctionEffectsRef &FX)
FunctionEffectSet()=default
FunctionEffectIterator< FunctionEffectSet > iterator
bool insert(const FunctionEffectWithCondition &NewEC, Conflicts &Errs)
SmallVector< Conflict > Conflicts
static FunctionEffectSet getIntersection(FunctionEffectsRef LHS, FunctionEffectsRef RHS)
static FunctionEffectSet getUnion(FunctionEffectsRef LHS, FunctionEffectsRef RHS, Conflicts &Errs)
Represents an abstract function effect, using just an enumeration describing its kind.
Kind kind() const
The kind of the effect.
unsigned Flags
Flags describing some behaviors of the effect.
static constexpr size_t KindCount
friend bool operator<(FunctionEffect LHS, FunctionEffect RHS)
friend bool operator==(FunctionEffect LHS, FunctionEffect RHS)
uint32_t toOpaqueInt32() const
For serialization.
@ FE_ExcludeStaticLocalVars
@ FE_ExcludeThreadLocalVars
@ FE_ExcludeObjCMessageSend
friend bool operator!=(FunctionEffect LHS, FunctionEffect RHS)
Kind
Identifies the particular effect.
Flags flags() const
Flags describing some behaviors of the effect.
StringRef name() const
The description printed in diagnostics, e.g. 'nonblocking'.
static FunctionEffect fromOpaqueInt32(uint32_t Value)
friend raw_ostream & operator<<(raw_ostream &OS, const FunctionEffect &Effect)
An immutable set of FunctionEffects and possibly conditions attached to them.
ArrayRef< FunctionEffect > effects() const
ArrayRef< EffectConditionExpr > conditions() const
static FunctionEffectsRef create(ArrayRef< FunctionEffect > FX, ArrayRef< EffectConditionExpr > Conds)
Asserts invariants.
FunctionEffectIterator< FunctionEffectsRef > iterator
FunctionEffectsRef()=default
friend bool operator==(const FunctionEffectsRef &LHS, const FunctionEffectsRef &RHS)
static FunctionEffectsRef get(QualType QT)
Extract the effects from a Type if it is a function, block, or member function pointer,...
friend bool operator!=(const FunctionEffectsRef &LHS, const FunctionEffectsRef &RHS)
static void Profile(llvm::FoldingSetNodeID &ID, QualType ResultType, ExtInfo Info)
static bool classof(const Type *T)
void Profile(llvm::FoldingSetNodeID &ID)
Represents a prototype with parameter type info, e.g.
param_type_iterator param_type_begin() const
unsigned getNumFunctionEffectConditions() const
ExtParameterInfo getExtParameterInfo(unsigned I) const
ArrayRef< EffectConditionExpr > getFunctionEffectConditions() const
ExceptionSpecificationType getExceptionSpecType() const
Get the kind of exception specification on this function.
ArrayRef< FunctionEffect > getFunctionEffectsWithoutConditions() const
bool isParamConsumed(unsigned I) const
exception_iterator exception_end() const
const ExtParameterInfo * getExtParameterInfosOrNull() const
Return a pointer to the beginning of the array of extra parameter information, if present,...
unsigned getNumParams() const
bool hasTrailingReturn() const
Whether this function prototype has a trailing return type.
ExceptionSpecInfo getExceptionSpecInfo() const
Return all the available information about this type's exception spec.
const QualType * param_type_iterator
Qualifiers getMethodQuals() const
const QualType * exception_iterator
static bool classof(const Type *T)
QualType getParamType(unsigned i) const
FunctionEffectsRef getFunctionEffects() const
unsigned getAArch64SMEAttributes() const
Return a bitmask describing the SME attributes on the function type, see AArch64SMETypeAttributes for...
QualType getExceptionType(unsigned i) const
Return the ith exception type, where 0 <= i < getNumExceptions().
static void Profile(llvm::FoldingSetNodeID &ID, QualType Result, param_type_iterator ArgTys, unsigned NumArgs, const ExtProtoInfo &EPI, const ASTContext &Context, bool Canonical)
SourceLocation getEllipsisLoc() const
unsigned getNumFunctionEffects() const
bool hasCFIUncheckedCallee() const
unsigned getNumExceptions() const
Return the number of types in the exception specification.
bool hasExceptionSpec() const
Return whether this function has any kind of exception spec.
CanThrowResult canThrow() const
Determine whether this function type has a non-throwing exception specification.
bool hasDynamicExceptionSpec() const
Return whether this function has a dynamic (throw) exception spec.
bool hasNoexceptExceptionSpec() const
Return whether this function has a noexcept exception spec.
bool isVariadic() const
Whether this function prototype is variadic.
ExtProtoInfo getExtProtoInfo() const
Expr * getNoexceptExpr() const
Return the expression inside noexcept(expression), or a null pointer if there is none (because the ex...
param_type_iterator param_type_end() const
FunctionDecl * getExceptionSpecTemplate() const
If this function type has an uninstantiated exception specification, this is the function whose excep...
FunctionTypeExtraAttributeInfo getExtraAttributeInfo() const
Return the extra attribute information.
bool isNothrow(bool ResultIfDependent=false) const
Determine whether this function type has a non-throwing exception specification.
ArrayRef< QualType > getParamTypes() const
ArrayRef< QualType > exceptions() const
ParameterABI getParameterABI(unsigned I) const
ArrayRef< QualType > param_types() const
exception_iterator exception_begin() const
ArrayRef< ExtParameterInfo > getExtParameterInfos() const
bool hasExtParameterInfos() const
Is there any interesting extra information for any of the parameters of this function type?
RefQualifierKind getRefQualifier() const
Retrieve the ref-qualifier associated with this function type.
FunctionDecl * getExceptionSpecDecl() const
If this function type has an exception specification which hasn't been determined yet (either because...
A class which abstracts out some details necessary for making a call.
ExtInfo withNoCfCheck(bool noCfCheck) const
ExtInfo withCallingConv(CallingConv cc) const
CallingConv getCC() const
ExtInfo withProducesResult(bool producesResult) const
ExtInfo(bool noReturn, bool hasRegParm, unsigned regParm, CallingConv cc, bool producesResult, bool noCallerSavedRegs, bool NoCfCheck, bool cmseNSCall)
bool getCmseNSCall() const
bool getNoCfCheck() const
unsigned getRegParm() const
void Profile(llvm::FoldingSetNodeID &ID) const
bool getNoCallerSavedRegs() const
ExtInfo withNoReturn(bool noReturn) const
bool getHasRegParm() const
friend class FunctionType
bool operator==(ExtInfo Other) const
bool getProducesResult() const
ExtInfo withNoCallerSavedRegs(bool noCallerSavedRegs) const
ExtInfo withCmseNSCall(bool cmseNSCall) const
ExtInfo withRegParm(unsigned RegParm) const
bool operator!=(ExtInfo Other) const
Interesting information about a specific parameter that can't simply be reflected in parameter's type...
friend bool operator==(ExtParameterInfo lhs, ExtParameterInfo rhs)
friend bool operator!=(ExtParameterInfo lhs, ExtParameterInfo rhs)
ExtParameterInfo()=default
bool hasPassObjectSize() const
ExtParameterInfo withHasPassObjectSize() const
unsigned char getOpaqueValue() const
bool isConsumed() const
Is this parameter considered "consumed" by Objective-C ARC?
ParameterABI getABI() const
Return the ABI treatment of this parameter.
ExtParameterInfo withIsConsumed(bool consumed) const
ExtParameterInfo withIsNoEscape(bool NoEscape) const
ExtParameterInfo withABI(ParameterABI kind) const
static ExtParameterInfo getFromOpaqueValue(unsigned char data)
FunctionType - C99 6.7.5.3 - Function Declarators.
ExtInfo getExtInfo() const
AArch64SMETypeAttributes
The AArch64 SME ACLE (Arm C/C++ Language Extensions) define a number of function type attributes that...
@ SME_PStateSMEnabledMask
@ SME_PStateSMCompatibleMask
@ SME_AgnosticZAStateShift
@ SME_AgnosticZAStateMask
static ArmStateValue getArmZT0State(unsigned AttrBits)
bool getNoReturnAttr() const
Determine whether this function type includes the GNU noreturn attribute.
static ArmStateValue getArmZAState(unsigned AttrBits)
unsigned getRegParmType() const
CallingConv getCallConv() const
QualType getReturnType() const
FunctionType(TypeClass tc, QualType res, QualType Canonical, TypeDependence Dependence, ExtInfo Info)
static bool classof(const Type *T)
bool getCmseNSCallAttr() const
bool getHasRegParm() const
Qualifiers getFastTypeQuals() const
QualType getCallResultType(const ASTContext &Context) const
Determine the type of an expression that calls a function of this type.
One of these records is kept for each identifier that is lexed.
void Profile(llvm::FoldingSetNodeID &ID)
static void Profile(llvm::FoldingSetNodeID &ID, QualType ET, ArraySizeModifier SizeMod, unsigned TypeQuals)
friend class StmtIteratorBase
static bool classof(const Type *T)
KeywordWrapper(ElaboratedTypeKeyword Keyword, As &&...as)
ElaboratedTypeKeyword getKeyword() const
static CannotCastToThisType classof(const T *)
static bool classof(const Type *T)
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
static bool classof(const Type *T)
QualType getUnderlyingType() const
const IdentifierInfo * getMacroIdentifier() const
static bool isValidElementType(QualType T, const LangOptions &LangOpts)
Valid elements types are the following:
QualType getElementType() const
Returns type of the elements being stored in the matrix.
MatrixType(QualType ElementTy, QualType CanonElementTy)
QualType ElementType
The element type of the matrix.
static bool classof(const Type *T)
NestedNameSpecifier getQualifier() const
void Profile(llvm::FoldingSetNodeID &ID)
QualType getPointeeType() const
bool isMemberFunctionPointer() const
Returns true if the member type (i.e.
bool isMemberDataPointer() const
Returns true if the member type (i.e.
static bool classof(const Type *T)
This represents a decl that may have a name.
Represents a C++ nested name specifier, such as "\::std::vector<int>::".
Represents an ObjC class declaration.
Represents typeof(type), a C23 feature and GCC extension, or `typeof_unqual(type),...
static bool classof(const Type *T)
Represents a pointer to an Objective C object.
unsigned getNumProtocols() const
Return the number of qualifying protocols on the object type.
bool isSpecialized() const
Whether this type is specialized, meaning that it has type arguments.
qual_iterator qual_end() const
bool isObjCQualifiedClassType() const
True if this is equivalent to 'Class.
static void Profile(llvm::FoldingSetNodeID &ID, QualType T)
bool isObjCQualifiedIdType() const
True if this is equivalent to 'id.
bool isSpecializedAsWritten() const
Whether this type is specialized, meaning that it has type arguments.
bool isUnspecializedAsWritten() const
Determine whether this object type is "unspecialized" as written, meaning that it has no type argumen...
ArrayRef< QualType > getTypeArgsAsWritten() const
Retrieve the type arguments for this type.
void Profile(llvm::FoldingSetNodeID &ID)
const ObjCObjectType * getObjectType() const
Gets the type pointed to by this ObjC pointer.
ObjCObjectType::qual_iterator qual_iterator
An iterator over the qualifiers on the object type.
llvm::iterator_range< qual_iterator > qual_range
static bool classof(const Type *T)
bool isUnspecialized() const
Whether this type is unspecialized, meaning that is has no type arguments.
bool isObjCIdType() const
True if this is equivalent to the 'id' type, i.e.
ObjCProtocolDecl * getProtocol(unsigned I) const
Retrieve a qualifying protocol by index on the object type.
QualType getPointeeType() const
Gets the type pointed to by this ObjC pointer.
ObjCInterfaceDecl * getInterfaceDecl() const
If this pointer points to an Objective @interface type, gets the declaration for that interface.
bool isObjCClassType() const
True if this is equivalent to the 'Class' type, i.e.
bool isObjCIdOrClassType() const
True if this is equivalent to the 'id' or 'Class' type,.
ArrayRef< QualType > getTypeArgs() const
Retrieve the type arguments for this type.
qual_iterator qual_begin() const
bool isKindOfType() const
Whether this is a "__kindof" type.
Represents an Objective-C protocol declaration.
void Profile(llvm::FoldingSetNodeID &ID)
static bool classof(const Type *T)
static void Profile(llvm::FoldingSetNodeID &ID, QualType Inner)
QualType getInnerType() const
static void Profile(llvm::FoldingSetNodeID &ID, QualType T, bool isRead)
QualType getElementType() const
void Profile(llvm::FoldingSetNodeID &ID)
static bool classof(const Type *T)
Pointer-authentication qualifiers.
static PointerAuthQualifier fromOpaqueValue(uint32_t Opaque)
friend bool operator==(PointerAuthQualifier Lhs, PointerAuthQualifier Rhs)
bool isIsaPointer() const
static PointerAuthQualifier Create(unsigned Key, bool IsAddressDiscriminated, unsigned ExtraDiscriminator, PointerAuthenticationMode AuthenticationMode, bool IsIsaPointer, bool AuthenticatesNullValues)
friend bool operator!=(PointerAuthQualifier Lhs, PointerAuthQualifier Rhs)
bool authenticatesNullValues() const
bool isEquivalent(PointerAuthQualifier Other) const
@ MaxDiscriminator
The maximum supported pointer-authentication discriminator.
@ MaxKey
The maximum supported pointer-authentication key.
void Profile(llvm::FoldingSetNodeID &ID) const
bool isAddressDiscriminated() const
PointerAuthQualifier withoutKeyNone() const
unsigned getExtraDiscriminator() const
void print(raw_ostream &OS, const PrintingPolicy &Policy) const
PointerAuthenticationMode getAuthenticationMode() const
bool isEmptyWhenPrinted(const PrintingPolicy &Policy) const
std::string getAsString() const
uint32_t getAsOpaqueValue() const
PointerAuthQualifier()=default
PointerType - C99 6.7.5.1 - Pointer Declarators.
QualType getPointeeType() const
static bool classof(const Type *T)
void Profile(llvm::FoldingSetNodeID &ID)
static void Profile(llvm::FoldingSetNodeID &ID, QualType Pointee)
static bool classof(const Type *T)
const IdentifierInfo * getIdentifier() const
StreamedQualTypeHelper(const QualType &T, const PrintingPolicy &Policy, const Twine &PlaceHolder, unsigned Indentation)
friend raw_ostream & operator<<(raw_ostream &OS, const StreamedQualTypeHelper &SQT)
A (possibly-)qualified type.
void addRestrict()
Add the restrict qualifier to this QualType.
QualType(const ExtQuals *Ptr, unsigned Quals)
bool hasAddressDiscriminatedPointerAuth() const
bool isLocalConstQualified() const
Determine whether this particular QualType instance has the "const" qualifier set,...
bool isLocalRestrictQualified() const
Determine whether this particular QualType instance has the "restrict" qualifier set,...
bool isVolatileQualified() const
Determine whether this type is volatile-qualified.
bool isRestrictQualified() const
Determine whether this type is restrict-qualified.
bool isTriviallyCopyableType(const ASTContext &Context) const
Return true if this is a trivially copyable type (C++0x [basic.types]p9)
QualType IgnoreParens() const
Returns the specified type after dropping any outer-level parentheses.
Qualifiers::GC getObjCGCAttr() const
Returns gc attribute of this type.
friend bool operator==(const QualType &LHS, const QualType &RHS)
Indicate whether the specified types and qualifiers are identical.
bool hasQualifiers() const
Determine whether this type has any qualifiers.
QualType withFastQualifiers(unsigned TQs) const
QualType withRestrict() const
bool hasNonTrivialToPrimitiveCopyCUnion() const
Check if this is or contains a C union that is non-trivial to copy, which is a union that has a membe...
PointerAuthQualifier getPointerAuth() const
void addFastQualifiers(unsigned TQs)
bool isWebAssemblyFuncrefType() const
Returns true if it is a WebAssembly Funcref Type.
QualType getNonLValueExprType(const ASTContext &Context) const
Determine the type of a (typically non-lvalue) expression with the specified result type.
@ DK_objc_strong_lifetime
PrimitiveDefaultInitializeKind
@ PDIK_ARCWeak
The type is an Objective-C retainable pointer type that is qualified with the ARC __weak qualifier.
@ PDIK_Trivial
The type does not fall into any of the following categories.
@ PDIK_ARCStrong
The type is an Objective-C retainable pointer type that is qualified with the ARC __strong qualifier.
@ PDIK_Struct
The type is a struct containing a field whose type is not PCK_Trivial.
bool mayBeDynamicClass() const
Returns true if it is a class and it might be dynamic.
bool hasLocalNonFastQualifiers() const
Determine whether this particular QualType instance has any "non-fast" qualifiers,...
bool isNonWeakInMRRWithObjCWeak(const ASTContext &Context) const
const IdentifierInfo * getBaseTypeIdentifier() const
Retrieves a pointer to the name of the base type.
bool isBitwiseCloneableType(const ASTContext &Context) const
Return true if the type is safe to bitwise copy using memcpy/memmove.
QualType withoutLocalFastQualifiers() const
void Profile(llvm::FoldingSetNodeID &ID) const
bool isAddressSpaceOverlapping(QualType T, const ASTContext &Ctx) const
Returns true if address space qualifiers overlap with T address space qualifiers.
QualType getDesugaredType(const ASTContext &Context) const
Return the specified type with any "sugar" removed from the type.
void removeLocalFastQualifiers(unsigned Mask)
QualType withConst() const
QualType getLocalUnqualifiedType() const
Return this type with all of the instance-specific qualifiers removed, but without removing any quali...
void addConst()
Add the const type qualifier to this QualType.
bool hasLocalQualifiers() const
Determine whether this particular QualType instance has any qualifiers, without looking through any t...
bool isTriviallyCopyConstructibleType(const ASTContext &Context) const
Return true if this is a trivially copyable type.
bool isTrivialType(const ASTContext &Context) const
Return true if this is a trivial type per (C++0x [basic.types]p9)
bool isNull() const
Return true if this QualType doesn't point to a type yet.
PrimitiveCopyKind isNonTrivialToPrimitiveCopy() const
Check if this is a non-trivial type that would cause a C struct transitively containing this type to ...
const Type * getTypePtr() const
Retrieves a pointer to the underlying (unqualified) type.
LangAS getAddressSpace() const
Return the address space of this type.
bool isConstant(const ASTContext &Ctx) const
static QualType getFromOpaquePtr(const void *Ptr)
QualType withVolatile() const
bool hasNonTrivialToPrimitiveDestructCUnion() const
Check if this is or contains a C union that is non-trivial to destruct, which is a union that has a m...
Qualifiers getQualifiers() const
Retrieve the set of qualifiers applied to this type.
const Type * operator->() const
void setLocalFastQualifiers(unsigned Quals)
bool isCXX98PODType(const ASTContext &Context) const
Return true if this is a POD type according to the rules of the C++98 standard, regardless of the cur...
bool hasPostfixDeclaratorSyntax() const
Returns true if the type uses postfix declarator syntax, i.e.
Qualifiers::ObjCLifetime getObjCLifetime() const
Returns lifetime attribute of this type.
QualType stripObjCKindOfType(const ASTContext &ctx) const
Strip Objective-C "__kindof" types from the given type.
void print(raw_ostream &OS, const PrintingPolicy &Policy, const Twine &PlaceHolder=Twine(), unsigned Indentation=0) const
void getAsStringInternal(std::string &Str, const PrintingPolicy &Policy) const
bool isReferenceable() const
QualType getNonReferenceType() const
If Type is a reference type (e.g., const int&), returns the type that the reference refers to ("const...
QualType getCanonicalType() const
QualType getUnqualifiedType() const
Retrieve the unqualified variant of the given type, removing as little sugar as possible.
void removeLocalVolatile()
QualType substObjCMemberType(QualType objectType, const DeclContext *dc, ObjCSubstitutionContext context) const
Substitute type arguments from an object type for the Objective-C type parameters used in the subject...
bool isWebAssemblyReferenceType() const
Returns true if it is a WebAssembly Reference Type.
SplitQualType getSplitDesugaredType() const
std::optional< NonConstantStorageReason > isNonConstantStorage(const ASTContext &Ctx, bool ExcludeCtor, bool ExcludeDtor)
Determine whether instances of this type can be placed in immutable storage.
QualType withCVRQualifiers(unsigned CVR) const
bool isTrapType() const
Returns true if it is a OverflowBehaviorType of Trap kind.
unsigned getLocalCVRQualifiers() const
Retrieve the set of CVR (const-volatile-restrict) qualifiers local to this particular QualType instan...
SplitQualType split() const
Divides a QualType into its unqualified type and a set of local qualifiers.
bool UseExcessPrecision(const ASTContext &Ctx)
void addVolatile()
Add the volatile type qualifier to this QualType.
bool isCForbiddenLValueType() const
Determine whether expressions of the given type are forbidden from being lvalues in C.
PrimitiveDefaultInitializeKind isNonTrivialToPrimitiveDefaultInitialize() const
Functions to query basic properties of non-trivial C struct types.
bool isObjCGCStrong() const
true when Type is objc's strong.
std::string getAsString() const
void * getAsOpaquePtr() const
static void print(SplitQualType split, raw_ostream &OS, const PrintingPolicy &policy, const Twine &PlaceHolder, unsigned Indentation=0)
bool isMoreQualifiedThan(QualType Other, const ASTContext &Ctx) const
Determine whether this type is more qualified than the other given type, requiring exact equality for...
bool isCanonicalAsParam() const
void removeLocalRestrict()
bool isWebAssemblyExternrefType() const
Returns true if it is a WebAssembly Externref Type.
QualType(const Type *Ptr, unsigned Quals)
QualType getNonPackExpansionType() const
Remove an outer pack expansion type (if any) from this type.
SplitQualType getSplitUnqualifiedType() const
Retrieve the unqualified variant of the given type, removing as little sugar as possible.
bool isCXX11PODType(const ASTContext &Context) const
Return true if this is a POD type according to the more relaxed rules of the C++11 standard,...
bool mayBeNotDynamicClass() const
Returns true if it is not a class or if the class might not be dynamic.
bool isConstQualified() const
Determine whether this type is const-qualified.
bool hasAddressSpace() const
Check if this type has any address space qualifier.
bool isObjCGCWeak() const
true when Type is objc's weak.
QualType substObjCTypeArgs(ASTContext &ctx, ArrayRef< QualType > typeArgs, ObjCSubstitutionContext context) const
Substitute type arguments for the Objective-C type parameters used in the subject type.
unsigned getLocalFastQualifiers() const
void removeLocalFastQualifiers()
QualType getAtomicUnqualifiedType() const
Remove all qualifiers including _Atomic.
DestructionKind isDestructedType() const
Returns a nonzero value if objects of this type require non-trivial work to clean up after.
friend bool operator<(const QualType &LHS, const QualType &RHS)
friend bool operator!=(const QualType &LHS, const QualType &RHS)
StreamedQualTypeHelper stream(const PrintingPolicy &Policy, const Twine &PlaceHolder=Twine(), unsigned Indentation=0) const
bool isLocalVolatileQualified() const
Determine whether this particular QualType instance has the "volatile" qualifier set,...
bool isConstantStorage(const ASTContext &Ctx, bool ExcludeCtor, bool ExcludeDtor)
unsigned getCVRQualifiers() const
Retrieve the set of CVR (const-volatile-restrict) qualifiers applied to this type.
static void getAsStringInternal(SplitQualType split, std::string &out, const PrintingPolicy &policy)
QualType getSingleStepDesugaredType(const ASTContext &Context) const
Return the specified type with one level of "sugar" removed from the type.
const Type * getTypePtrOrNull() const
bool isWrapType() const
Returns true if it is a OverflowBehaviorType of Wrap kind.
static std::string getAsString(SplitQualType split, const PrintingPolicy &Policy)
bool hasNonTrivialObjCLifetime() const
bool isPODType(const ASTContext &Context) const
Determine whether this is a Plain Old Data (POD) type (C++ 3.9p10).
bool isAtLeastAsQualifiedAs(QualType Other, const ASTContext &Ctx) const
Determine whether this type is at least as qualified as the other given type, requiring exact equalit...
friend class QualifierCollector
bool hasStrongOrWeakObjCLifetime() const
PrimitiveCopyKind isNonTrivialToPrimitiveDestructiveMove() const
Check if this is a non-trivial type that would cause a C struct transitively containing this type to ...
QualType withExactLocalFastQualifiers(unsigned TQs) const
@ NonConstNonReferenceType
@ PCK_Struct
The type is a struct containing a field whose type is neither PCK_Trivial nor PCK_VolatileTrivial.
@ PCK_Trivial
The type does not fall into any of the following categories.
@ PCK_ARCStrong
The type is an Objective-C retainable pointer type that is qualified with the ARC __strong qualifier.
@ PCK_VolatileTrivial
The type would be trivial except that it is volatile-qualified.
@ PCK_PtrAuth
The type is an address-discriminated signed pointer type.
@ PCK_ARCWeak
The type is an Objective-C retainable pointer type that is qualified with the ARC __weak qualifier.
const Type & operator*() const
Qualifiers getLocalQualifiers() const
Retrieve the set of qualifiers local to this particular QualType instance, not including any qualifie...
bool hasNonTrivialToPrimitiveDefaultInitializeCUnion() const
Check if this is or contains a C union that is non-trivial to default-initialize, which is a union th...
const Type * strip(QualType type)
Collect any qualifiers on the given type and return an unqualified type.
QualifierCollector(Qualifiers Qs=Qualifiers())
QualifiersAndAtomic & operator+=(Qualifiers RHS)
QualifiersAndAtomic withVolatile()
QualifiersAndAtomic withAtomic()
QualifiersAndAtomic withConst()
QualifiersAndAtomic(Qualifiers Quals, bool HasAtomic)
QualifiersAndAtomic withRestrict()
The collection of all-type qualifiers we support.
unsigned getCVRQualifiers() const
void removeCVRQualifiers(unsigned mask)
friend Qualifiers operator-(Qualifiers L, Qualifiers R)
Compute the difference between two qualifier sets.
static Qualifiers fromFastMask(unsigned Mask)
void setFastQualifiers(unsigned mask)
void addAddressSpace(LangAS space)
static Qualifiers removeCommonQualifiers(Qualifiers &L, Qualifiers &R)
Returns the common set of qualifiers while removing them from the given sets.
bool hasOnlyConst() const
@ OCL_Strong
Assigning into this object requires the old value to be released and the new value to be retained.
@ OCL_ExplicitNone
This object can be modified without requiring retains or releases.
@ OCL_None
There is no lifetime qualification on this type.
@ OCL_Weak
Reading or writing from this object requires a barrier call.
@ OCL_Autoreleasing
Assigning into this object requires a lifetime extension.
void removeObjCLifetime()
bool hasTargetSpecificAddressSpace() const
bool isStrictSupersetOf(Qualifiers Other) const
Determine whether this set of qualifiers is a strict superset of another set of qualifiers,...
bool hasNonFastQualifiers() const
Return true if the set contains any qualifiers which require an ExtQuals node to be allocated.
void Profile(llvm::FoldingSetNodeID &ID) const
bool operator!=(Qualifiers Other) const
bool hasNonTrivialObjCLifetime() const
True if the lifetime is neither None or ExplicitNone.
void addCVRQualifiers(unsigned mask)
bool hasCVRQualifiers() const
void addConsistentQualifiers(Qualifiers qs)
Add the qualifiers from the given set to this set, given that they don't conflict.
void removeFastQualifiers(unsigned mask)
static bool isTargetAddressSpaceSupersetOf(LangAS A, LangAS B, const ASTContext &Ctx)
Qualifiers & operator+=(Qualifiers R)
void removeFastQualifiers()
bool hasQualifiers() const
Return true if the set contains any qualifiers.
void removeCVRQualifiers()
Qualifiers withVolatile() const
void addCVRUQualifiers(unsigned mask)
Qualifiers & operator-=(Qualifiers R)
bool compatiblyIncludes(Qualifiers other, const ASTContext &Ctx) const
Determines if these qualifiers compatibly include another set.
bool hasUnaligned() const
unsigned getAddressSpaceAttributePrintValue() const
Get the address space attribute value to be printed by diagnostics.
bool hasAddressSpace() const
static bool isAddressSpaceSupersetOf(LangAS A, LangAS B, const ASTContext &Ctx)
Returns true if address space A is equal to or a superset of B.
Qualifiers withoutAddressSpace() const
unsigned getFastQualifiers() const
void print(raw_ostream &OS, const PrintingPolicy &Policy, bool appendSpaceIfNonEmpty=false) const
void removeAddressSpace()
void addQualifiers(Qualifiers Q)
Add the qualifiers from the given set to this set.
static Qualifiers fromCVRMask(unsigned CVR)
void setAddressSpace(LangAS space)
unsigned getCVRUQualifiers() const
bool isEmptyWhenPrinted(const PrintingPolicy &Policy) const
PointerAuthQualifier getPointerAuth() const
void setObjCGCAttr(GC type)
Qualifiers withConst() const
bool hasObjCGCAttr() const
uint64_t getAsOpaqueValue() const
void setCVRQualifiers(unsigned mask)
bool hasObjCLifetime() const
ObjCLifetime getObjCLifetime() const
Qualifiers withoutObjCLifetime() const
Qualifiers withoutObjCGCAttr() const
static Qualifiers fromCVRUMask(unsigned CVRU)
friend Qualifiers operator+(Qualifiers L, Qualifiers R)
void setUnaligned(bool flag)
void addFastQualifiers(unsigned mask)
std::string getAsString() const
Qualifiers withRestrict() const
void addPointerAuth(PointerAuthQualifier Q)
void addObjCGCAttr(GC type)
bool hasPointerAuth() const
bool operator==(Qualifiers Other) const
void removeQualifiers(Qualifiers Q)
Remove the qualifiers from the given set from this set.
LangAS getAddressSpace() const
bool hasOnlyVolatile() const
void setPointerAuth(PointerAuthQualifier Q)
bool compatiblyIncludesObjCLifetime(Qualifiers other) const
Determines if these qualifiers compatibly include another set of qualifiers from the narrow perspecti...
Qualifiers getNonFastQualifiers() const
static Qualifiers fromOpaqueValue(uint64_t opaque)
bool hasStrongOrWeakObjCLifetime() const
True if the lifetime is either strong or weak.
static std::string getAddrSpaceAsString(LangAS AS)
@ FastWidth
The width of the "fast" qualifier mask.
@ MaxAddressSpace
The maximum supported address space number.
@ FastMask
The fast qualifier mask.
bool hasFastQualifiers() const
bool hasOnlyRestrict() const
bool isAddressSpaceSupersetOf(Qualifiers other, const ASTContext &Ctx) const
Returns true if the address space in these qualifiers is equal to or a superset of the address space ...
void addObjCLifetime(ObjCLifetime type)
void setObjCLifetime(ObjCLifetime type)
static bool classof(const Type *T)
Represents a struct/union/class.
Base for LValueReferenceType and RValueReferenceType.
QualType getPointeeType() const
ReferenceType(TypeClass tc, QualType Referencee, QualType CanonicalRef, bool SpelledAsLValue)
static bool classof(const Type *T)
QualType getPointeeTypeAsWritten() const
bool isSpelledAsLValue() const
void Profile(llvm::FoldingSetNodeID &ID)
static void Profile(llvm::FoldingSetNodeID &ID, QualType Referencee, bool SpelledAsLValue)
Encodes a location in the source.
Stmt - This represents one statement.
The streaming interface shared between DiagnosticBuilder and PartialDiagnostic.
void AddTaggedVal(uint64_t V, DiagnosticsEngine::ArgumentKind Kind) const
Represents the declaration of a struct/union/class/enum.
Stores a list of template parameters for a TemplateDecl and its derived classes.
[BoundsSafety] Represents information of declarations referenced by the arguments of the counted_by a...
TypeCoupledDeclRefInfo(ValueDecl *D=nullptr, bool Deref=false)
D is to a declaration referenced by the argument of attribute.
llvm::PointerIntPair< ValueDecl *, 1, unsigned > BaseTy
Base wrapper for a particular "section" of type source info.
static bool classof(const Type *T)
TypeOfKind getKind() const
Returns the kind of 'typeof' type this is.
TypeOfExprType(const ASTContext &Context, Expr *E, TypeOfKind Kind, QualType Can=QualType())
Expr * getUnderlyingExpr() const
QualType getType() const
Return the type wrapped by this type source info.
void overrideType(QualType T)
Override the type stored in this TypeSourceInfo. Use with caution!
TypeWithKeyword(ElaboratedTypeKeyword Keyword, TypeClass tc, QualType Canonical, TypeDependence Dependence)
friend class AttributedType
friend class ConstantArrayType
friend class CountAttributedType
FunctionTypeBitfields store various bits belonging to FunctionProtoType.
friend class FunctionProtoType
friend class FunctionType
friend class KeywordWrapper
friend class ObjCObjectType
friend class PackExpansionType
friend class PredefinedSugarType
friend class ReferenceType
friend class SubstTemplateTypeParmPackType
friend class SubstPackType
friend class SubstTemplateTypeParmType
friend class TemplateSpecializationType
friend class TemplateTypeParmType
friend class TypeOfExprType
friend class UnresolvedUsingType
friend class DependentVectorType
The base class of the type hierarchy.
bool isIncompleteOrObjectType() const
Return true if this is an incomplete or object type, in other words, not a function type.
bool isDecltypeType() const
bool isDependentSizedArrayType() const
bool isFixedPointOrIntegerType() const
Return true if this is a fixed point or integer type.
bool isBlockPointerType() const
TypedefBitfields TypedefBits
bool isBooleanType() const
bool isFunctionReferenceType() const
bool isSignableType(const ASTContext &Ctx) const
Type(const Type &)=delete
bool isObjCBuiltinType() const
const TemplateSpecializationType * getAsNonAliasTemplateSpecializationType() const
Look through sugar for an instance of TemplateSpecializationType which is not a type alias,...
bool isMFloat8Type() const
const Type * getPointeeOrArrayElementType() const
If this is a pointer type, return the pointee type.
bool isIncompleteArrayType() const
bool isPlaceholderType() const
Test for a type which does not represent an actual type-system type but is instead used as a placehol...
bool isFloat16Type() const
ReferenceTypeBitfields ReferenceTypeBits
bool isSignablePointerType() const
ArrayTypeBitfields ArrayTypeBits
const ArrayType * castAsArrayTypeUnsafe() const
A variant of castAs<> for array type which silently discards qualifiers from the outermost type.
static constexpr int NumDeducedTypeBits
bool isDependentAddressSpaceType() const
bool isUndeducedAutoType() const
bool isRValueReferenceType() const
bool isFundamentalType() const
Tests whether the type is categorized as a fundamental type.
VectorTypeBitfields VectorTypeBits
SubstPackTypeBitfields SubstPackTypeBits
bool isConstantArrayType() const
bool canDecayToPointerType() const
Determines whether this type can decay to a pointer type.
bool isFunctionPointerType() const
bool isHLSLInlineSpirvType() const
bool isConvertibleToFixedPointType() const
Return true if this can be converted to (or from) a fixed point type.
bool isArithmeticType() const
PredefinedSugarTypeBitfields PredefinedSugarTypeBits
bool isConstantMatrixType() const
bool isHLSLBuiltinIntangibleType() const
bool isPointerType() const
const TemplateSpecializationType * castAsNonAliasTemplateSpecializationType() const
bool isArrayParameterType() const
TypeOfBitfields TypeOfBits
static constexpr int FunctionTypeNumParamsLimit
bool isIntegerType() const
isIntegerType() does not include complex integers (a GCC extension).
bool isObjCSelType() const
const T * castAs() const
Member-template castAs<specific type>.
BuiltinTypeBitfields BuiltinTypeBits
bool isSpecificPlaceholderType(unsigned K) const
Test for a specific placeholder type.
bool isReferenceType() const
bool isSignedFixedPointType() const
Return true if this is a fixed point type that is signed according to ISO/IEC JTC1 SC22 WG14 N1169.
bool isObjectPointerType() const
bool isEnumeralType() const
bool isVisibilityExplicit() const
Return true if the visibility was explicitly set is the code.
void addDependence(TypeDependence D)
ConstantArrayTypeBitfields ConstantArrayTypeBits
Type(TypeClass tc, QualType canon, TypeDependence Dependence)
bool isScalarType() const
bool isVariableArrayType() const
bool isFloat128Type() const
bool isSveVLSBuiltinType() const
Determines if this is a sizeless type supported by the 'arm_sve_vector_bits' type attribute,...
CountAttributedTypeBitfields CountAttributedTypeBits
bool isObjCQualifiedIdType() const
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.
LinkageInfo getLinkageAndVisibility() const
Determine the linkage and visibility of this type.
bool isIntegralOrEnumerationType() const
Determine whether this type is an integral or enumeration type.
bool isExtVectorType() const
bool isExtVectorBoolType() const
Type & operator=(const Type &)=delete
bool isObjCObjectOrInterfaceType() const
bool isNonOverloadPlaceholderType() const
Test for a placeholder type other than Overload; see BuiltinType::isNonOverloadPlaceholderType.
bool isOCLIntelSubgroupAVCType() const
AutoType * getContainedAutoType() const
Get the AutoType whose type will be deduced for a variable with an initializer of this type.
bool isInstantiationDependentType() const
Determine whether this type is an instantiation-dependent type, meaning that the type involves a temp...
bool isMemberDataPointerType() const
bool isLValueReferenceType() const
bool isBitIntType() const
bool isSpecificBuiltinType(unsigned K) const
Test for a particular builtin type.
bool isBuiltinType() const
Helper methods to distinguish type categories.
bool isOpenCLSpecificType() const
bool isConstantMatrixBoolType() const
bool isDependentType() const
Whether this type is a dependent type, meaning that its definition somehow depends on a template para...
bool isSignableIntegerType(const ASTContext &Ctx) const
bool isFloat32Type() const
bool isAnyComplexType() const
bool isFixedPointType() const
Return true if this is a fixed point type according to ISO/IEC JTC1 SC22 WG14 N1169.
friend class TypePropertyCache
DeducedType * getContainedDeducedType() const
Get the DeducedType whose type will be deduced for a variable with an initializer of this type.
bool isSaturatedFixedPointType() const
Return true if this is a saturated fixed point type according to ISO/IEC JTC1 SC22 WG14 N1169.
bool containsUnexpandedParameterPack() const
Whether this type is or contains an unexpanded parameter pack, used to support C++0x variadic templat...
bool hasPointeeToCFIUncheckedCalleeFunctionType() const
const BuiltinType * getAsPlaceholderType() const
QualType getCanonicalTypeInternal() const
bool isHLSLSpecificType() const
bool isTemplateTypeParmType() const
@ PtrdiffT
The "ptrdiff_t" type.
@ SizeT
The "size_t" type.
@ SignedSizeT
The signed integer type corresponding to "size_t".
bool isCompoundType() const
Tests whether the type is categorized as a compound type.
bool containsErrors() const
Whether this type is an error type.
const Type * getBaseElementTypeUnsafe() const
Get the base element type of this type, potentially discarding type qualifiers.
bool isMemberPointerType() const
bool isAtomicType() const
AttributedTypeBitfields AttributedTypeBits
bool isFunctionProtoType() const
bool isIbm128Type() const
bool isOverloadableType() const
Determines whether this is a type for which one can define an overloaded operator.
bool isObjCIdType() const
bool isMatrixType() const
TagTypeBitfields TagTypeBits
bool isOverflowBehaviorType() const
PackExpansionTypeBitfields PackExpansionTypeBits
bool isVariablyModifiedType() const
Whether this type is a variably-modified type (C99 6.7.5).
bool isUnsaturatedFixedPointType() const
Return true if this is a saturated fixed point type according to ISO/IEC JTC1 SC22 WG14 N1169.
UnresolvedUsingBitfields UnresolvedUsingBits
bool isObjCObjectType() const
bool isFromAST() const
Whether this type comes from an AST file.
const ArrayType * getAsArrayTypeUnsafe() const
A variant of getAs<> for array types which silently discards qualifiers from the outermost type.
bool isUndeducedType() const
Determine whether this type is an undeduced type, meaning that it somehow involves a C++11 'auto' typ...
bool isObjectType() const
Determine whether this type is an object type.
bool isDoubleType() const
bool isPointerOrReferenceType() const
KeywordWrapperBitfields KeywordWrapperBits
FunctionTypeBitfields FunctionTypeBits
bool isBFloat16Type() const
void setDependence(TypeDependence D)
const T * getAsAdjusted() const
Member-template getAsAdjusted<specific type>.
bool isFunctionType() const
bool isObjCObjectPointerType() const
SubstTemplateTypeParmTypeBitfields SubstTemplateTypeParmTypeBits
TypeDependence getDependence() const
Visibility getVisibility() const
Determine the visibility of this type.
bool isMemberFunctionPointerType() const
bool isUnsignedFixedPointType() const
Return true if this is a fixed point type that is unsigned according to ISO/IEC JTC1 SC22 WG14 N1169.
bool isVectorType() const
bool isObjCQualifiedClassType() const
bool isObjCClassType() const
bool isObjCInertUnsafeUnretainedType() const
Was this type written with the special inert-in-ARC __unsafe_unretained qualifier?
bool isRealFloatingType() const
Floating point categories.
const T * getAsCanonical() const
If this type is canonically the specified type, return its canonical type cast to that specified type...
bool isHLSLAttributedResourceType() const
ObjCObjectTypeBitfields ObjCObjectTypeBits
TemplateTypeParmTypeBitfields TemplateTypeParmTypeBits
bool isOCLExtOpaqueType() const
const T * castAsCanonical() const
Return this type's canonical type cast to the specified type.
bool isAnyPointerType() const
TypeClass getTypeClass() const
bool isCanonicalUnqualified() const
Determines if this type would be canonical if it had no further qualification.
bool isSubscriptableVectorType() const
const T * getAs() const
Member-template getAs<specific type>'.
const Type * getUnqualifiedDesugaredType() const
Return the specified type with any "sugar" removed from the type, removing any typedefs,...
bool isNullPtrType() const
bool isRecordType() const
TemplateSpecializationTypeBitfields TemplateSpecializationTypeBits
bool isTypedefNameType() const
Determines whether this type is written as a typedef-name.
static constexpr int FunctionTypeNumParamsWidth
bool isFunctionNoProtoType() const
bool isReserveIDT() const
bool hasObjCPointerRepresentation() const
Whether this type can represent an objective pointer type for the purpose of GC'ability.
bool hasPointerRepresentation() const
Whether this type is represented natively as a pointer.
DeducedTypeBitfields DeducedTypeBits
AutoTypeBitfields AutoTypeBits
bool isCFIUncheckedCalleeFunctionType() const
Type & operator=(Type &&)=delete
Base class for declarations which introduce a typedef-name.
TypedefNameDecl * getDecl() const
NestedNameSpecifier getQualifier() const
static void Profile(llvm::FoldingSetNodeID &ID, ElaboratedTypeKeyword Keyword, NestedNameSpecifier Qualifier, const TypedefNameDecl *Decl, QualType Underlying)
static bool classof(const Type *T)
bool typeMatchesDecl() const
void Profile(llvm::FoldingSetNodeID &ID) const
void Profile(llvm::FoldingSetNodeID &ID) const
NestedNameSpecifier getQualifier() const
UnresolvedUsingTypenameDecl * getDecl() const
static void Profile(llvm::FoldingSetNodeID &ID, ElaboratedTypeKeyword Keyword, NestedNameSpecifier Qualifier, const UnresolvedUsingTypenameDecl *D)
static bool classof(const Type *T)
Represents a dependent using declaration which was marked with typename.
Represents a shadow declaration implicitly introduced into a scope by a (resolved) using-declaration ...
UsingShadowDecl * getDecl() const
void Profile(llvm::FoldingSetNodeID &ID) const
NestedNameSpecifier getQualifier() const
static void Profile(llvm::FoldingSetNodeID &ID, ElaboratedTypeKeyword Keyword, NestedNameSpecifier Qualifier, const UsingShadowDecl *D, QualType UnderlyingType)
static bool classof(const Type *T)
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
static bool classof(const Type *T)
friend class StmtIteratorBase
void Profile(llvm::FoldingSetNodeID &ID)
Expr * getSizeExpr() const
unsigned getNumElements() const
VectorType(QualType vecType, unsigned nElements, QualType canonType, VectorKind vecKind)
void Profile(llvm::FoldingSetNodeID &ID)
static void Profile(llvm::FoldingSetNodeID &ID, QualType ElementType, unsigned NumElements, TypeClass TypeClass, VectorKind VecKind)
VectorKind getVectorKind() const
QualType ElementType
The element type of the vector.
QualType getElementType() const
static bool classof(const Type *T)
Defines the Linkage enumeration and various utility functions.
mlir::Type getBaseType(mlir::Value varPtr)
@ AttributedType
The l-value was considered opaque, so the alignment was determined from a type, but that type was an ...
bool operator!=(const CommonEntityInfo &LHS, const CommonEntityInfo &RHS)
const internal::VariadicAllOfMatcher< Type > type
Matches Types in the clang AST.
const AstTypeMatcher< ArrayType > arrayType
const internal::VariadicAllOfMatcher< Decl > decl
Matches declarations.
uint32_t Literal
Literals are represented as positive integers.
std::variant< struct RequiresDecl, struct HeaderDecl, struct UmbrellaDirDecl, struct ModuleDecl, struct ExcludeDecl, struct ExportDecl, struct ExportAsDecl, struct ExternModuleDecl, struct UseDecl, struct LinkDecl, struct ConfigMacrosDecl, struct ConflictDecl > Decl
All declarations that can appear in a module declaration.
bool operator==(const ValueType &a, const ValueType &b)
bool isLiteral(TokenKind K)
Return true if this is a "literal" kind, like a numeric constant, string, etc.
The JSON file list parser is used to communicate input to InstallAPI.
CanQual< Type > CanQualType
Represents a canonical, potentially-qualified type.
@ Overload
This is a legitimate overload: the existing declarations are functions or function templates with dif...
bool isa(CodeGen::Address addr)
AutoTypeKeyword
Which keyword(s) were used to create an AutoType.
@ GNUAutoType
__auto_type (GNU extension)
@ DecltypeAuto
decltype(auto)
bool isTargetAddressSpace(LangAS AS)
CanThrowResult
Possible results from evaluation of a noexcept expression.
FunctionType::ExtInfo getFunctionExtInfo(const Type &t)
bool isDynamicExceptionSpec(ExceptionSpecificationType ESpecType)
TypeDependenceScope::TypeDependence TypeDependence
void initialize(TemplateInstantiationCallbackPtrs &Callbacks, const Sema &TheSema)
@ Nullable
Values of this type can be null.
RefQualifierKind
The kind of C++11 ref-qualifier associated with a function type.
@ RQ_None
No ref-qualifier was provided.
@ RQ_LValue
An lvalue ref-qualifier was provided (&).
@ RQ_RValue
An rvalue ref-qualifier was provided (&&).
@ TemplateName
The identifier is a template name. FIXME: Add an annotation for that.
bool IsEnumDeclComplete(EnumDecl *ED)
Check if the given decl is complete.
ExprDependence computeDependence(FullExpr *E)
@ Vector
'vector' clause, allowed on 'loop', Combined, and 'routine' directives.
@ Self
'self' clause, allowed on Compute and Combined Constructs, plus 'update'.
TypeOfKind
The kind of 'typeof' expression we're after.
bool operator==(const CallGraphNode::CallRecord &LHS, const CallGraphNode::CallRecord &RHS)
nullptr
This class represents a compute construct, representing a 'Kind' of ‘parallel’, 'serial',...
TypeDependence toTypeDependence(ExprDependence D)
@ Dependent
Parse the block as a dependent block, which may be used in some template instantiations but not other...
unsigned toTargetAddressSpace(LangAS AS)
Linkage
Describes the different kinds of linkage (C++ [basic.link], C99 6.2.2) that an entity may have.
ObjCSubstitutionContext
The kind of type we are substituting Objective-C type arguments into.
@ Superclass
The superclass of a type.
@ Property
The type of a property.
@ Parameter
The parameter type of a method or function.
@ Result
The result type of a method or function.
ArraySizeModifier
Capture whether this is a normal array (e.g.
ParameterABI
Kinds of parameter ABI.
@ Ordinary
This parameter uses ordinary ABI rules for its type.
OptionalUnsigned< unsigned > UnsignedOrNone
bool isComputedNoexcept(ExceptionSpecificationType ESpecType)
@ Template
We are parsing a template declaration.
bool isNoexceptExceptionSpec(ExceptionSpecificationType ESpecType)
TagTypeKind
The kind of a tag type.
constexpr unsigned PointerAuthKeyNone
bool IsEnumDeclScoped(EnumDecl *ED)
Check if the given decl is scoped.
std::is_base_of< ArrayType, T > TypeIsArrayType
@ Keyword
The name has been typo-corrected to a keyword.
LangAS
Defines the address space values used by the address space qualifier of QualType.
void FixedPointValueToString(SmallVectorImpl< char > &Str, llvm::APSInt Val, unsigned Scale)
bool operator!=(CanQual< T > x, CanQual< U > y)
@ Deduced
The normal deduced case.
@ Undeduced
Not deduced yet. This is for example an 'auto' which was just parsed.
@ DeducedAsPack
Same as above, but additionally this represents a case where the deduced entity itself is a pack.
@ DeducedAsDependent
This is a special case where the initializer is dependent, so we can't deduce a type yet.
PointerAuthenticationMode
const StreamingDiagnostic & operator<<(const StreamingDiagnostic &DB, const ConceptReference *C)
Insertion operator for diagnostics.
CallingConv
CallingConv - Specifies the calling convention that a function uses.
@ AltiVecBool
is AltiVec 'vector bool ...'
@ SveFixedLengthData
is AArch64 SVE fixed-length data vector
@ AltiVecVector
is AltiVec vector
@ AltiVecPixel
is AltiVec 'vector Pixel'
@ Generic
not a target-specific vector type
@ RVVFixedLengthData
is RISC-V RVV fixed-length data vector
@ RVVFixedLengthMask
is RISC-V RVV fixed-length mask vector
@ NeonPoly
is ARM Neon polynomial vector
@ SveFixedLengthPredicate
is AArch64 SVE fixed-length predicate vector
U cast(CodeGen::Address addr)
@ None
The alignment was not explicit in code.
ElaboratedTypeKeyword
The elaboration keyword that precedes a qualified type name or introduces an elaborated-type-specifie...
@ Interface
The "__interface" keyword introduces the elaborated-type-specifier.
@ None
No keyword precedes the qualified type name.
@ Struct
The "struct" keyword introduces the elaborated-type-specifier.
@ Class
The "class" keyword introduces the elaborated-type-specifier.
@ Union
The "union" keyword introduces the elaborated-type-specifier.
@ Enum
The "enum" keyword introduces the elaborated-type-specifier.
@ Typename
The "typename" keyword precedes the qualified type name, e.g., typename T::type.
TypeDependence toSyntacticDependence(TypeDependence D)
@ Other
Other implicit parameter.
ExceptionSpecificationType
The various types of exception specifications that exist in C++11.
@ EST_DependentNoexcept
noexcept(expression), value-dependent
@ EST_Uninstantiated
not instantiated yet
@ EST_Unparsed
not parsed yet
@ EST_NoThrow
Microsoft __declspec(nothrow) extension.
@ EST_None
no exception specification
@ EST_MSAny
Microsoft throw(...) extension.
@ EST_BasicNoexcept
noexcept
@ EST_NoexceptFalse
noexcept(expression), evals to 'false'
@ EST_Unevaluated
not evaluated yet, for special member function
@ EST_NoexceptTrue
noexcept(expression), evals to 'true'
@ EST_Dynamic
throw(T1, T2)
OptionalUnsigned< NullabilityKind > NullabilityKindOrNone
Visibility
Describes the different kinds of visibility that a declaration may have.
Diagnostic wrappers for TextAPI types for error reporting.
__UINTPTR_TYPE__ uintptr_t
An unsigned integer type with the property that any valid pointer to void can be converted to this ty...
void Profile(llvm::FoldingSetNodeID &ID)
const T * getType() const
FunctionEffectWithCondition Rejected
FunctionEffectWithCondition Kept
A FunctionEffect plus a potential boolean expression determining whether the effect is declared (e....
FunctionEffectWithCondition(FunctionEffect E, const EffectConditionExpr &C)
Holds information about the various types of exception specification.
FunctionDecl * SourceDecl
The function whose exception specification this is, for EST_Unevaluated and EST_Uninstantiated.
ExceptionSpecInfo(ExceptionSpecificationType EST)
FunctionDecl * SourceTemplate
The function template whose exception specification this is instantiated from, for EST_Uninstantiated...
ExceptionSpecificationType Type
The kind of exception specification this is.
ArrayRef< QualType > Exceptions
Explicitly-specified list of exception types.
Expr * NoexceptExpr
Noexcept expression, if this is a computed noexcept specification.
ExceptionSpecInfo()=default
Extra information about a function prototype.
ExceptionSpecInfo ExceptionSpec
FunctionTypeExtraAttributeInfo ExtraAttributeInfo
bool requiresFunctionProtoTypeArmAttributes() const
unsigned AArch64SMEAttributes
SourceLocation EllipsisLoc
FunctionEffectsRef FunctionEffects
unsigned CFIUncheckedCallee
const ExtParameterInfo * ExtParameterInfos
RefQualifierKind RefQualifier
bool requiresFunctionProtoTypeExtraAttributeInfo() const
ExtProtoInfo withCFIUncheckedCallee(bool CFIUncheckedCallee)
ExtProtoInfo(CallingConv CC)
unsigned HasTrailingReturn
bool requiresFunctionProtoTypeExtraBitfields() const
void setArmSMEAttribute(AArch64SMETypeAttributes Kind, bool Enable=true)
ExtProtoInfo withExceptionSpec(const ExceptionSpecInfo &ESI)
FunctionType::ExtInfo ExtInfo
A simple holder for a QualType representing a type in an exception specification.
FunctionTypeArmAttributes()
unsigned AArch64SMEAttributes
Any AArch64 SME ACLE type attributes that need to be propagated on declarations and function pointers...
Provides a few static helpers for converting and printing elaborated type keyword and tag type kind e...
static StringRef getTagTypeKindName(TagTypeKind Kind)
static StringRef getKeywordName(ElaboratedTypeKeyword Keyword)
static ElaboratedTypeKeyword getKeywordForTagTypeKind(TagTypeKind Tag)
Converts a TagTypeKind into an elaborated type keyword.
static TagTypeKind getTagTypeKindForKeyword(ElaboratedTypeKeyword Keyword)
Converts an elaborated type keyword into a TagTypeKind.
static TagTypeKind getTagTypeKindForTypeSpec(unsigned TypeSpec)
Converts a type specifier (DeclSpec::TST) into a tag type kind.
static bool KeywordIsTagTypeKind(ElaboratedTypeKeyword Keyword)
static ElaboratedTypeKeyword getKeywordForTypeSpec(unsigned TypeSpec)
Converts a type specifier (DeclSpec::TST) into an elaborated type keyword.
Describes how types, statements, expressions, and declarations should be printed.
A std::pair-like structure for storing a qualified type split into its local qualifiers and its local...
SplitQualType(const Type *ty, Qualifiers qs)
SplitQualType getSingleStepDesugaredType() const
friend bool operator==(SplitQualType a, SplitQualType b)
const Type * Ty
The locally-unqualified type.
friend bool operator!=(SplitQualType a, SplitQualType b)
std::pair< const Type *, Qualifiers > asPair() const
Qualifiers Quals
The local qualifiers.
static inline ::clang::ExtQuals * getFromVoidPointer(void *P)
static void * getAsVoidPointer(::clang::ExtQuals *P)
static constexpr int NumLowBitsAvailable
static void * getAsVoidPointer(::clang::Type *P)
static constexpr int NumLowBitsAvailable
static inline ::clang::Type * getFromVoidPointer(void *P)
static void * getAsVoidPointer(clang::QualType P)
static clang::QualType getFromVoidPointer(void *P)
static constexpr int NumLowBitsAvailable
static SimpleType getSimplifiedValue(::clang::QualType Val)
const ::clang::Type * SimpleType