17#ifndef LLVM_CLANG_AST_TYPE_BASE_H
18#define LLVM_CLANG_AST_TYPE_BASE_H
35#include "llvm/ADT/APInt.h"
36#include "llvm/ADT/APSInt.h"
37#include "llvm/ADT/ArrayRef.h"
38#include "llvm/ADT/FoldingSet.h"
39#include "llvm/ADT/PointerIntPair.h"
40#include "llvm/ADT/PointerUnion.h"
41#include "llvm/ADT/STLForwardCompat.h"
42#include "llvm/ADT/StringRef.h"
43#include "llvm/ADT/Twine.h"
44#include "llvm/ADT/iterator_range.h"
45#include "llvm/Support/Casting.h"
46#include "llvm/Support/Compiler.h"
47#include "llvm/Support/DXILABI.h"
48#include "llvm/Support/ErrorHandling.h"
49#include "llvm/Support/PointerLikeTypeTraits.h"
50#include "llvm/Support/TrailingObjects.h"
51#include "llvm/Support/type_traits.h"
79namespace serialization {
80 template <
class T>
class AbstractTypeReader;
117template <
typename>
class CanQual;
122class ExtQualsTypeCommonBase;
124class FunctionEffectsRef;
125class FunctionEffectKindSet;
126class FunctionEffectSet;
129class ObjCInterfaceDecl;
130class ObjCProtocolDecl;
131class ObjCTypeParamDecl;
132struct PrintingPolicy;
136class ClassTemplateDecl;
137class TemplateArgument;
138class TemplateArgumentListInfo;
139class TemplateArgumentLoc;
140class TemplateTypeParmDecl;
141class TypedefNameDecl;
142class UnresolvedUsingTypenameDecl;
143class UsingShadowDecl;
148#define TYPE(Class, Base) class Class##Type;
149#include "clang/AST/TypeNodes.inc"
152class PointerAuthQualifier {
156 EnabledMask = 1 << EnabledShift,
157 AddressDiscriminatedShift = EnabledShift + EnabledBits,
158 AddressDiscriminatedBits = 1,
159 AddressDiscriminatedMask = 1 << AddressDiscriminatedShift,
160 AuthenticationModeShift =
161 AddressDiscriminatedShift + AddressDiscriminatedBits,
162 AuthenticationModeBits = 2,
163 AuthenticationModeMask = ((1 << AuthenticationModeBits) - 1)
164 << AuthenticationModeShift,
165 IsaPointerShift = AuthenticationModeShift + AuthenticationModeBits,
167 IsaPointerMask = ((1 << IsaPointerBits) - 1) << IsaPointerShift,
168 AuthenticatesNullValuesShift = IsaPointerShift + IsaPointerBits,
169 AuthenticatesNullValuesBits = 1,
170 AuthenticatesNullValuesMask = ((1 << AuthenticatesNullValuesBits) - 1)
171 << AuthenticatesNullValuesShift,
172 KeyShift = AuthenticatesNullValuesShift + AuthenticatesNullValuesBits,
174 KeyMask = ((1 << KeyBits) - 1) << KeyShift,
175 DiscriminatorShift = KeyShift + KeyBits,
176 DiscriminatorBits = 16,
177 DiscriminatorMask = ((1u << DiscriminatorBits) - 1) << DiscriminatorShift,
188 static_assert((EnabledBits + AddressDiscriminatedBits +
189 AuthenticationModeBits + IsaPointerBits +
190 AuthenticatesNullValuesBits + KeyBits + DiscriminatorBits) ==
192 "PointerAuthQualifier should be exactly 32 bits");
193 static_assert((EnabledMask + AddressDiscriminatedMask +
194 AuthenticationModeMask + IsaPointerMask +
195 AuthenticatesNullValuesMask + KeyMask + DiscriminatorMask) ==
197 "All masks should cover the entire bits");
198 static_assert((EnabledMask ^ AddressDiscriminatedMask ^
199 AuthenticationModeMask ^ IsaPointerMask ^
200 AuthenticatesNullValuesMask ^ KeyMask ^ DiscriminatorMask) ==
202 "All masks should cover the entire bits");
205 unsigned ExtraDiscriminator,
207 bool IsIsaPointer,
bool AuthenticatesNullValues)
209 (IsAddressDiscriminated
210 ? llvm::to_underlying(AddressDiscriminatedMask)
213 (llvm::to_underlying(AuthenticationMode)
214 << AuthenticationModeShift) |
215 (ExtraDiscriminator << DiscriminatorShift) |
216 (IsIsaPointer << IsaPointerShift) |
217 (AuthenticatesNullValues << AuthenticatesNullValuesShift)) {
220 assert((Data == 0) ==
238 static PointerAuthQualifier
239 Create(
unsigned Key,
bool IsAddressDiscriminated,
unsigned ExtraDiscriminator,
241 bool AuthenticatesNullValues) {
246 AuthenticationMode, IsIsaPointer,
247 AuthenticatesNullValues);
251 assert((Data == 0) ==
260 return (Data & KeyMask) >> KeyShift;
267 return (Data & AddressDiscriminatedMask) >> AddressDiscriminatedShift;
272 return (Data >> DiscriminatorShift);
277 AuthenticationModeShift);
282 return (Data & IsaPointerMask) >> IsaPointerShift;
287 return (Data & AuthenticatesNullValuesMask) >> AuthenticatesNullValuesShift;
294 friend bool operator==(PointerAuthQualifier Lhs, PointerAuthQualifier Rhs) {
295 return Lhs.Data == Rhs.Data;
297 friend bool operator!=(PointerAuthQualifier Lhs, PointerAuthQualifier Rhs) {
298 return Lhs.Data != Rhs.Data;
309 PointerAuthQualifier
Result;
311 assert((
Result.Data == 0) ==
322 void Profile(llvm::FoldingSetNodeID &ID)
const { ID.AddInteger(Data); }
389 LPtrAuth == R.getPointerAuth()) {
393 R.setPointerAuth(
Empty);
398 Q.Mask = L.Mask & R.Mask;
407 R.removeCVRQualifiers(CommonCRV);
412 R.removeObjCGCAttr();
418 R.removeObjCLifetime();
424 R.removeAddressSpace();
492 assert(!(mask & ~
CVRMask) &&
"bitmask contains non-CVR bits");
496 assert(!(mask & ~
CVRMask) &&
"bitmask contains non-CVR bits");
497 Mask &= ~static_cast<uint64_t>(mask);
503 assert(!(mask & ~
CVRMask) &&
"bitmask contains non-CVR bits");
507 assert(!(mask & ~
CVRMask & ~UMask) &&
"bitmask contains non-CVRU bits");
513 Mask = (Mask & ~UMask) | (flag ? UMask : 0);
521 Mask = (Mask & ~GCAttrMask) | (
type << GCAttrShift);
546 return ObjCLifetime((Mask & LifetimeMask) >> LifetimeShift);
549 Mask = (Mask & ~LifetimeMask) | (
type << LifetimeShift);
555 Mask |= (
type << LifetimeShift);
572 return static_cast<LangAS>((Mask & AddressSpaceMask) >> AddressSpaceShift);
593 Mask = (Mask & ~AddressSpaceMask)
594 | (((uint32_t) space) << AddressSpaceShift);
607 Mask = (Mask & ~PtrAuthMask) |
621 assert(!(mask & ~
FastMask) &&
"bitmask contains non-fast qualifier bits");
625 assert(!(mask & ~
FastMask) &&
"bitmask contains non-fast qualifier bits");
626 Mask &= ~static_cast<uint64_t>(mask);
632 assert(!(mask & ~
FastMask) &&
"bitmask contains non-fast qualifier bits");
647 bool empty()
const {
return !Mask; }
802 bool appendSpaceIfNonEmpty =
false)
const;
804 void Profile(llvm::FoldingSetNodeID &ID)
const { ID.AddInteger(Mask); }
811 "PointerAuthQualifier must be 32 bits");
813 static constexpr uint64_t PtrAuthShift = 32;
814 static constexpr uint64_t PtrAuthMask = UINT64_C(0xffffffff) << PtrAuthShift;
816 static constexpr uint64_t UMask = 0x8;
817 static constexpr uint64_t UShift = 3;
818 static constexpr uint64_t GCAttrMask = 0x30;
819 static constexpr uint64_t GCAttrShift = 4;
820 static constexpr uint64_t LifetimeMask = 0x1C0;
821 static constexpr uint64_t LifetimeShift = 6;
822 static constexpr uint64_t AddressSpaceMask =
823 ~(
CVRMask | UMask | GCAttrMask | LifetimeMask | PtrAuthMask);
824 static constexpr uint64_t AddressSpaceShift = 9;
834 : Quals(Quals), HasAtomic(HasAtomic) {}
854 return {Quals.withVolatile(), HasAtomic};
858 return {Quals.withRestrict(), HasAtomic};
883 std::pair<const Type *,Qualifiers>
asPair()
const {
884 return std::pair<const Type *, Qualifiers>(
Ty,
Quals);
888 return a.
Ty ==
b.Ty && a.
Quals ==
b.Quals;
891 return a.
Ty !=
b.Ty || a.
Quals !=
b.Quals;
941 llvm::PointerIntPair<llvm::PointerUnion<const Type *, const ExtQuals *>,
944 const ExtQuals *getExtQualsUnsafe()
const {
948 const Type *getTypePtrUnsafe()
const {
952 const ExtQualsTypeCommonBase *getCommonPtr()
const {
953 assert(!
isNull() &&
"Cannot retrieve a NULL type pointer");
954 auto CommonPtrVal =
reinterpret_cast<uintptr_t>(
Value.getOpaqueValue());
956 return reinterpret_cast<ExtQualsTypeCommonBase*
>(CommonPtrVal);
988 T.Value.setFromOpaqueValue(
const_cast<void*
>(Ptr));
1005 return Value.getPointer().isNull();
1032 std::optional<NonConstantStorageReason>
1191 &&
"non-fast qualifier bits set in mask!");
1192 Value.setInt(Value.getInt() | TQs);
1202 Value.setInt(Value.getInt() & ~Mask);
1209 T.addFastQualifiers(TQs);
1222 T.removeLocalFastQualifiers();
1316 return getSingleStepDesugaredTypeImpl(*
this, Context);
1329 return LHS.Value == RHS.Value;
1332 return LHS.Value != RHS.Value;
1335 return LHS.Value < RHS.Value;
1349 const Twine &PlaceHolder = Twine(),
1350 unsigned Indentation = 0)
const;
1354 unsigned Indentation = 0) {
1355 return print(
split.Ty,
split.Quals, OS, policy, PlaceHolder, Indentation);
1360 const Twine &PlaceHolder,
1361 unsigned Indentation = 0);
1378 const Twine &PlaceHolder;
1379 unsigned Indentation;
1383 const Twine &PlaceHolder,
unsigned Indentation)
1384 : T(T), Policy(Policy), PlaceHolder(PlaceHolder),
1385 Indentation(Indentation) {}
1389 SQT.T.
print(OS, SQT.Policy, SQT.PlaceHolder, SQT.Indentation);
1395 const Twine &PlaceHolder = Twine(),
1396 unsigned Indentation = 0)
const {
1400 void dump(
const char *
s)
const;
1402 void dump(llvm::raw_ostream &OS,
const ASTContext &Context)
const;
1465 return PtrAuth.isAddressDiscriminated();
1552 return isDestructedTypeImpl(*
this);
1654raw_ostream &
operator<<(raw_ostream &OS, QualType QT);
1692class ExtQualsTypeCommonBase {
1703 const Type *
const BaseType;
1708 ExtQualsTypeCommonBase(
const Type *baseType,
QualType canon)
1709 : BaseType(baseType), CanonicalType(canon) {}
1722class alignas(TypeAlignment)
ExtQuals :
public ExtQualsTypeCommonBase,
1723 public llvm::FoldingSetNode {
1745 : ExtQualsTypeCommonBase(baseType,
1746 canon.isNull() ?
QualType(this_(), 0) : canon),
1748 assert(Quals.hasNonFastQualifiers()
1749 &&
"ExtQuals created with no fast qualifiers");
1750 assert(!Quals.hasFastQualifiers()
1751 &&
"ExtQuals created with fast qualifiers");
1761 return Quals.getObjCLifetime();
1775 const Type *BaseType,
1777 assert(!Quals.hasFastQualifiers() &&
"fast qualifiers in ExtQuals hash!");
1778 ID.AddPointer(BaseType);
1809enum class ArraySizeModifier;
1810enum class ElaboratedTypeKeyword;
1811enum class VectorKind;
1839class alignas(TypeAlignment)
Type :
public ExtQualsTypeCommonBase {
1842#define TYPE(Class, Base) Class,
1843#define LAST_TYPE(Class) TypeLast = Class
1844#define ABSTRACT_TYPE(Class, Base)
1845#include "clang/AST/TypeNodes.inc"
1850 class TypeBitfields {
1852 template <
class T>
friend class TypePropertyCache;
1855 LLVM_PREFERRED_TYPE(TypeClass)
1860 unsigned Dependence : llvm::BitWidth<TypeDependence>;
1864 LLVM_PREFERRED_TYPE(
bool)
1865 mutable unsigned CacheValid : 1;
1869 mutable unsigned CachedLinkage : 3;
1872 LLVM_PREFERRED_TYPE(
bool)
1873 mutable unsigned CachedLocalOrUnnamed : 1;
1876 LLVM_PREFERRED_TYPE(
bool)
1877 mutable unsigned FromAST : 1;
1879 bool isCacheValid()
const {
1884 assert(isCacheValid() &&
"getting linkage from invalid cache");
1885 return static_cast<Linkage>(CachedLinkage);
1888 bool hasLocalOrUnnamedType()
const {
1889 assert(isCacheValid() &&
"getting linkage from invalid cache");
1890 return CachedLocalOrUnnamed;
1893 enum { NumTypeBits = 8 + llvm::BitWidth<TypeDependence> + 6 };
1902 LLVM_PREFERRED_TYPE(TypeBitfields)
1908 unsigned IndexTypeQuals : 3;
1913 unsigned SizeModifier : 3;
1924 LLVM_PREFERRED_TYPE(
bool)
1925 unsigned HasExternalSize : 1;
1927 LLVM_PREFERRED_TYPE(
unsigned)
1928 unsigned SizeWidth : 5;
1934 LLVM_PREFERRED_TYPE(TypeBitfields)
1938 static constexpr unsigned NumOfBuiltinTypeBits = 9;
1939 unsigned Kind : NumOfBuiltinTypeBits;
1954 LLVM_PREFERRED_TYPE(TypeBitfields)
1961 unsigned RefQualifier : 2;
1972 LLVM_PREFERRED_TYPE(
bool)
1973 unsigned HasExtQuals : 1;
1977 unsigned ExceptionSpecType : 4;
1980 LLVM_PREFERRED_TYPE(
bool)
1981 unsigned HasExtParameterInfos : 1;
1984 LLVM_PREFERRED_TYPE(
bool)
1985 unsigned HasExtraBitfields : 1;
1988 LLVM_PREFERRED_TYPE(
bool)
1989 unsigned Variadic : 1;
1992 LLVM_PREFERRED_TYPE(
bool)
1993 unsigned HasTrailingReturn : 1;
1996 LLVM_PREFERRED_TYPE(
bool)
1997 unsigned CFIUncheckedCallee : 1;
2002 unsigned ExtInfo : 14;
2014 LLVM_PREFERRED_TYPE(TypeBitfields)
2018 unsigned NumTypeArgs : 7;
2021 unsigned NumProtocols : 6;
2024 LLVM_PREFERRED_TYPE(
bool)
2025 unsigned IsKindOf : 1;
2031 LLVM_PREFERRED_TYPE(TypeBitfields)
2045 LLVM_PREFERRED_TYPE(
bool)
2046 unsigned SpelledAsLValue : 1;
2050 LLVM_PREFERRED_TYPE(
bool)
2051 unsigned InnerRef : 1;
2057 LLVM_PREFERRED_TYPE(TypeBitfields)
2062 unsigned Keyword : 8;
2074 LLVM_PREFERRED_TYPE(
bool)
2075 unsigned HasQualifier : 1;
2078 LLVM_PREFERRED_TYPE(
bool)
2079 unsigned OwnsTag : 1;
2082 LLVM_PREFERRED_TYPE(
bool)
2083 unsigned IsInjected : 1;
2090 LLVM_PREFERRED_TYPE(TypeBitfields)
2096 unsigned VecKind : 4;
2098 uint32_t NumElements;
2104 LLVM_PREFERRED_TYPE(TypeBitfields)
2108 unsigned AttrKind : 32 - NumTypeBits;
2114 LLVM_PREFERRED_TYPE(TypeBitfields)
2120 unsigned Keyword : 2;
2136 LLVM_PREFERRED_TYPE(TypeBitfields)
2149 LLVM_PREFERRED_TYPE(
bool)
2150 unsigned hasQualifier : 1;
2160 LLVM_PREFERRED_TYPE(
bool)
2161 unsigned hasQualifier : 1;
2171 LLVM_PREFERRED_TYPE(
bool)
2172 unsigned hasQualifier : 1;
2175 LLVM_PREFERRED_TYPE(
bool)
2176 unsigned hasTypeDifferentFromDecl : 1;
2182 LLVM_PREFERRED_TYPE(TypeBitfields)
2186 unsigned Depth : 15;
2189 LLVM_PREFERRED_TYPE(
bool)
2190 unsigned ParameterPack : 1;
2193 unsigned Index : 16;
2199 LLVM_PREFERRED_TYPE(TypeBitfields)
2202 LLVM_PREFERRED_TYPE(
bool)
2203 unsigned HasNonCanonicalUnderlyingType : 1;
2206 unsigned Index : 15;
2208 LLVM_PREFERRED_TYPE(
bool)
2216 unsigned PackIndex : 15;
2223 LLVM_PREFERRED_TYPE(TypeBitfields)
2230 unsigned NumArgs : 16;
2236 unsigned SubstTemplTypeParmPackIndex : 16;
2246 LLVM_PREFERRED_TYPE(
bool)
2247 unsigned TypeAlias : 1;
2262 LLVM_PREFERRED_TYPE(TypeBitfields)
2276 unsigned NumExpansions;
2296 LLVM_PREFERRED_TYPE(TypeBitfields)
2306 LLVM_PREFERRED_TYPE(TypeBitfields)
2309 static constexpr unsigned NumCoupledDeclsBits = 4;
2310 unsigned NumCoupledDecls : NumCoupledDeclsBits;
2311 LLVM_PREFERRED_TYPE(
bool)
2312 unsigned CountInBytes : 1;
2313 LLVM_PREFERRED_TYPE(
bool)
2314 unsigned OrNull : 1;
2348 void setFromAST(
bool V =
true)
const {
2356 : ExtQualsTypeCommonBase(this,
2358 static_assert(
sizeof(*this) <=
2359 alignof(
decltype(*this)) +
sizeof(ExtQualsTypeCommonBase),
2360 "changing bitfields changed sizeof(Type)!");
2361 static_assert(
alignof(
decltype(*this)) %
TypeAlignment == 0,
2362 "Insufficient alignment!");
2366 TypeBits.CachedLocalOrUnnamed =
false;
2375 TypeBits.Dependence =
static_cast<unsigned>(D);
2418 return CanonicalType ==
QualType(
this, 0);
2424 QualType getLocallyUnqualifiedSingleStepDesugaredType()
const;
2432 bool isSizelessType()
const;
2433 bool isSizelessBuiltinType()
const;
2436 bool isSizelessVectorType()
const;
2439 bool isSVESizelessBuiltinType()
const;
2442 bool isRVVSizelessBuiltinType()
const;
2445 bool isWebAssemblyExternrefType()
const;
2450 bool isWebAssemblyTableType()
const;
2455 bool isSveVLSBuiltinType()
const;
2465 bool isRVVVLSBuiltinType()
const;
2487 bool isIncompleteType(
NamedDecl **Def =
nullptr)
const;
2513 bool isAlwaysIncompleteType()
const;
2525 bool isLiteralType(
const ASTContext &Ctx)
const;
2528 bool isStructuralType()
const;
2532 bool isStandardLayoutType()
const;
2538 bool isBuiltinType()
const;
2541 bool isSpecificBuiltinType(
unsigned K)
const;
2546 bool isPlaceholderType()
const;
2550 bool isSpecificPlaceholderType(
unsigned K)
const;
2554 bool isNonOverloadPlaceholderType()
const;
2558 bool isIntegerType()
const;
2559 bool isEnumeralType()
const;
2562 bool isScopedEnumeralType()
const;
2564 bool isCharType()
const;
2565 bool isWideCharType()
const;
2566 bool isChar8Type()
const;
2567 bool isChar16Type()
const;
2568 bool isChar32Type()
const;
2569 bool isAnyCharacterType()
const;
2570 bool isUnicodeCharacterType()
const;
2571 bool isIntegralType(
const ASTContext &Ctx)
const;
2574 bool isIntegralOrEnumerationType()
const;
2577 bool isIntegralOrUnscopedEnumerationType()
const;
2578 bool isUnscopedEnumerationType()
const;
2581 bool isRealFloatingType()
const;
2584 bool isComplexType()
const;
2585 bool isAnyComplexType()
const;
2586 bool isFloatingType()
const;
2587 bool isHalfType()
const;
2588 bool isFloat16Type()
const;
2589 bool isFloat32Type()
const;
2590 bool isDoubleType()
const;
2591 bool isBFloat16Type()
const;
2592 bool isMFloat8Type()
const;
2593 bool isFloat128Type()
const;
2594 bool isIbm128Type()
const;
2595 bool isRealType()
const;
2596 bool isArithmeticType()
const;
2597 bool isVoidType()
const;
2598 bool isScalarType()
const;
2599 bool isAggregateType()
const;
2600 bool isFundamentalType()
const;
2601 bool isCompoundType()
const;
2605 bool isFunctionType()
const;
2608 bool isPointerType()
const;
2609 bool isPointerOrReferenceType()
const;
2610 bool isSignableType(
const ASTContext &Ctx)
const;
2611 bool isSignablePointerType()
const;
2612 bool isSignableIntegerType(
const ASTContext &Ctx)
const;
2613 bool isAnyPointerType()
const;
2614 bool isCountAttributedType()
const;
2615 bool isCFIUncheckedCalleeFunctionType()
const;
2616 bool hasPointeeToCFIUncheckedCalleeFunctionType()
const;
2617 bool isBlockPointerType()
const;
2618 bool isVoidPointerType()
const;
2619 bool isReferenceType()
const;
2620 bool isLValueReferenceType()
const;
2621 bool isRValueReferenceType()
const;
2622 bool isObjectPointerType()
const;
2623 bool isFunctionPointerType()
const;
2624 bool isFunctionReferenceType()
const;
2625 bool isMemberPointerType()
const;
2626 bool isMemberFunctionPointerType()
const;
2627 bool isMemberDataPointerType()
const;
2628 bool isArrayType()
const;
2629 bool isConstantArrayType()
const;
2630 bool isIncompleteArrayType()
const;
2631 bool isVariableArrayType()
const;
2632 bool isArrayParameterType()
const;
2633 bool isDependentSizedArrayType()
const;
2635 bool isClassType()
const;
2636 bool isStructureType()
const;
2637 bool isStructureTypeWithFlexibleArrayMember()
const;
2638 bool isObjCBoxableRecordType()
const;
2639 bool isInterfaceType()
const;
2640 bool isStructureOrClassType()
const;
2641 bool isUnionType()
const;
2642 bool isComplexIntegerType()
const;
2643 bool isVectorType()
const;
2644 bool isExtVectorType()
const;
2645 bool isExtVectorBoolType()
const;
2646 bool isConstantMatrixBoolType()
const;
2649 bool isPackedVectorBoolType(
const ASTContext &ctx)
const;
2650 bool isSubscriptableVectorType()
const;
2651 bool isMatrixType()
const;
2652 bool isConstantMatrixType()
const;
2653 bool isOverflowBehaviorType()
const;
2654 bool isDependentAddressSpaceType()
const;
2655 bool isObjCObjectPointerType()
const;
2656 bool isObjCRetainableType()
const;
2657 bool isObjCLifetimeType()
const;
2658 bool isObjCIndirectLifetimeType()
const;
2659 bool isObjCNSObjectType()
const;
2660 bool isObjCIndependentClassType()
const;
2663 bool isObjCObjectType()
const;
2664 bool isObjCQualifiedInterfaceType()
const;
2665 bool isObjCQualifiedIdType()
const;
2666 bool isObjCQualifiedClassType()
const;
2667 bool isObjCObjectOrInterfaceType()
const;
2668 bool isObjCIdType()
const;
2669 bool isDecltypeType()
const;
2677 return hasAttr(attr::ObjCInertUnsafeUnretained);
2687 bool isObjCIdOrObjectKindOfType(
const ASTContext &ctx,
2690 bool isObjCClassType()
const;
2698 bool isObjCClassOrClassKindOfType()
const;
2700 bool isBlockCompatibleObjCPointerType(
ASTContext &ctx)
const;
2701 bool isObjCSelType()
const;
2702 bool isObjCBuiltinType()
const;
2703 bool isObjCARCBridgableType()
const;
2704 bool isCARCBridgableType()
const;
2705 bool isTemplateTypeParmType()
const;
2706 bool isNullPtrType()
const;
2708 bool isNothrowT()
const;
2709 bool isAlignValT()
const;
2710 bool isStdByteType()
const;
2711 bool isAtomicType()
const;
2712 bool isUndeducedAutoType()
const;
2714 bool isTypedefNameType()
const;
2716#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
2717 bool is##Id##Type() const;
2718#include "clang/Basic/OpenCLImageTypes.def"
2720 bool isImageType()
const;
2722 bool isSamplerT()
const;
2723 bool isEventT()
const;
2724 bool isClkEventT()
const;
2725 bool isQueueT()
const;
2726 bool isReserveIDT()
const;
2728#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
2729 bool is##Id##Type() const;
2730#include "clang/Basic/OpenCLExtensionTypes.def"
2732 bool isOCLIntelSubgroupAVCType()
const;
2733 bool isOCLExtOpaqueType()
const;
2735 bool isPipeType()
const;
2736 bool isBitIntType()
const;
2737 bool isOpenCLSpecificType()
const;
2739#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) bool is##Id##Type() const;
2740#include "clang/Basic/HLSLIntangibleTypes.def"
2741 bool isHLSLSpecificType()
const;
2742 bool isHLSLBuiltinIntangibleType()
const;
2743 bool isHLSLAttributedResourceType()
const;
2744 bool isHLSLInlineSpirvType()
const;
2745 bool isHLSLResourceRecord()
const;
2746 bool isHLSLResourceRecordArray()
const;
2747 bool isHLSLIntangibleType()
2753 bool isObjCARCImplicitlyUnretainedType()
const;
2756 bool isCUDADeviceBuiltinSurfaceType()
const;
2758 bool isCUDADeviceBuiltinTextureType()
const;
2761 Qualifiers::ObjCLifetime getObjCARCImplicitLifetime()
const;
2777 ScalarTypeKind getScalarTypeKind()
const;
2805 bool isUndeducedType()
const;
2814 bool hasSizedVLAType()
const;
2817 bool hasUnnamedOrLocalType()
const;
2819 bool isOverloadableType()
const;
2822 bool isElaboratedTypeSpecifier()
const;
2824 bool canDecayToPointerType()
const;
2829 bool hasPointerRepresentation()
const;
2833 bool hasObjCPointerRepresentation()
const;
2837 bool hasIntegerRepresentation()
const;
2841 bool hasSignedIntegerRepresentation()
const;
2845 bool hasUnsignedIntegerRepresentation()
const;
2849 bool hasFloatingRepresentation()
const;
2854 bool hasBooleanRepresentation()
const;
2859 const RecordType *getAsStructureType()
const;
2861 const RecordType *getAsUnionType()
const;
2862 const ComplexType *getAsComplexIntegerType()
const;
2883 inline EnumDecl *getAsEnumDecl()
const;
2884 inline EnumDecl *castAsEnumDecl()
const;
2889 inline TagDecl *getAsTagDecl()
const;
2890 inline TagDecl *castAsTagDecl()
const;
2902 DeducedType *getContainedDeducedType()
const;
2914 bool hasAutoForTrailingReturnType()
const;
2925 template <
typename T>
const T *getAs()
const;
2930 return dyn_cast<T>(CanonicalType);
2937 return cast<T>(CanonicalType);
2941#define TYPE(Class, Base)
2942#define NEVER_CANONICAL_TYPE(Class) \
2943 template <> inline const Class##Type *Type::getAsCanonical() const = delete; \
2944 template <> inline const Class##Type *Type::castAsCanonical() const = delete;
2945#include "clang/AST/TypeNodes.inc"
2951 const TemplateSpecializationType *
2952 getAsNonAliasTemplateSpecializationType()
const;
2954 const TemplateSpecializationType *
2957 assert(TST &&
"not a TemplateSpecializationType");
2966 template <
typename T>
const T *getAsAdjusted()
const;
2970 const ArrayType *getAsArrayTypeUnsafe()
const;
2978 template <
typename T>
const T *castAs()
const;
2982 const ArrayType *castAsArrayTypeUnsafe()
const;
2996 const Type *getBaseElementTypeUnsafe()
const;
3001 const Type *getArrayElementTypeNoTypeQual()
const;
3006 const Type *getPointeeOrArrayElementType()
const;
3014 const Type *getUnqualifiedDesugaredType()
const;
3019 bool isSignedIntegerType()
const;
3024 bool isUnsignedIntegerType()
const;
3028 bool isSignedIntegerOrEnumerationType()
const;
3032 bool isUnsignedIntegerOrEnumerationType()
const;
3036 bool isFixedPointType()
const;
3039 bool isFixedPointOrIntegerType()
const;
3042 bool isConvertibleToFixedPointType()
const;
3046 bool isSaturatedFixedPointType()
const;
3050 bool isUnsaturatedFixedPointType()
const;
3054 bool isSignedFixedPointType()
const;
3058 bool isUnsignedFixedPointType()
const;
3063 bool isConstantSizeType()
const;
3067 bool isSpecifierType()
const;
3087 bool isLinkageValid()
const;
3094 std::optional<NullabilityKind> getNullability()
const;
3101 bool canHaveNullability(
bool ResultIfUnknown =
true)
const;
3118 std::optional<ArrayRef<QualType>>
3119 getObjCSubstitutions(
const DeclContext *dc)
const;
3123 bool acceptsObjCTypeParams()
const;
3125 const char *getTypeClassName()
const;
3128 return CanonicalType;
3133 void dump(llvm::raw_ostream &OS,
const ASTContext &Context)
const;
3160#define TYPE(Class, Base)
3161#define ALWAYS_CANONICAL_TYPE(Class) \
3162 template <> inline const Class##Type *Type::getAs() const { \
3163 return dyn_cast<Class##Type>(CanonicalType); \
3165 template <> inline const Class##Type *Type::castAs() const { \
3166 return cast<Class##Type>(CanonicalType); \
3168#include "clang/AST/TypeNodes.inc"
3176#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) Id,
3177#include "clang/Basic/OpenCLImageTypes.def"
3179#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) Id,
3180#include "clang/Basic/OpenCLExtensionTypes.def"
3182#define SVE_TYPE(Name, Id, SingletonId) Id,
3183#include "clang/Basic/AArch64ACLETypes.def"
3185#define PPC_VECTOR_TYPE(Name, Id, Size) Id,
3186#include "clang/Basic/PPCTypes.def"
3188#define RVV_TYPE(Name, Id, SingletonId) Id,
3189#include "clang/Basic/RISCVVTypes.def"
3191#define WASM_TYPE(Name, Id, SingletonId) Id,
3192#include "clang/Basic/WebAssemblyReferenceTypes.def"
3194#define AMDGPU_TYPE(Name, Id, SingletonId, Width, Align) Id,
3195#include "clang/Basic/AMDGPUTypes.def"
3197#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) Id,
3198#include "clang/Basic/HLSLIntangibleTypes.def"
3200#define BUILTIN_TYPE(Id, SingletonId) Id,
3201#define LAST_BUILTIN_TYPE(Id) LastKind = Id
3202#include "clang/AST/BuiltinTypes.def"
3212 static_assert(Kind::LastKind <
3213 (1 << BuiltinTypeBitfields::NumOfBuiltinTypeBits) &&
3214 "Defined builtin type exceeds the allocated space for serial "
3225 StringRef str =
getName(Policy);
3226 assert(!str.empty() && str.data()[str.size()] ==
'\0');
3283class ComplexType :
public Type,
public llvm::FoldingSetNode {
3290 ElementType(Element) {}
3310class ParenType :
public Type,
public llvm::FoldingSetNode {
3336class PointerType :
public Type,
public llvm::FoldingSetNode {
3343 PointeeType(Pointee) {}
3366 using BaseTy = llvm::PointerIntPair<ValueDecl *, 1, unsigned>;
3381 bool isDeref()
const;
3383 unsigned getInt()
const;
3384 void *getOpaqueValue()
const;
3386 void setFromOpaqueValue(
void *
V);
3424 bool referencesFieldDecls()
const;
3430 switch (T->getTypeClass()) {
3431 case CountAttributed:
3441class CountAttributedType final
3443 public llvm::TrailingObjects<CountAttributedType,
3444 TypeCoupledDeclRefInfo> {
3455 bool CountInBytes,
bool OrNull,
3458 unsigned numTrailingObjects(OverloadToken<TypeCoupledDeclRefInfo>)
const {
3484 static void Profile(llvm::FoldingSetNodeID &ID,
QualType WrappedTy,
3488 return T->getTypeClass() == CountAttributed;
3491 StringRef getAttributeName(
bool WithMacroPrefix)
const;
3506 :
Type(TC, CanonicalPtr,
3509 OriginalTy(OriginalTy), AdjustedTy(AdjustedTy) {}
3519 Profile(ID, OriginalTy, AdjustedTy);
3524 ID.AddPointer(
New.getAsOpaquePtr());
3528 return T->getTypeClass() == Adjusted || T->getTypeClass() == Decayed;
3544 static bool classof(
const Type *T) {
return T->getTypeClass() == Decayed; }
3550class BlockPointerType :
public Type,
public llvm::FoldingSetNode {
3558 PointeeType(Pointee) {}
3576 return T->getTypeClass() == BlockPointer;
3586 bool SpelledAsLValue)
3588 PointeeType(Referencee) {
3602 while (T->isInnerRef())
3604 return T->PointeeType;
3613 bool SpelledAsLValue) {
3615 ID.AddBoolean(SpelledAsLValue);
3619 return T->getTypeClass() == LValueReference ||
3620 T->getTypeClass() == RValueReference;
3629 bool SpelledAsLValue)
3638 return T->getTypeClass() == LValueReference;
3654 return T->getTypeClass() == RValueReference;
3661class MemberPointerType :
public Type,
public llvm::FoldingSetNode {
3672 :
Type(MemberPointer, CanonicalPtr,
3676 PointeeType(Pointee), Qualifier(Qualifier) {}
3684 return PointeeType->isFunctionProtoType();
3690 return !PointeeType->isFunctionProtoType();
3699 bool isSugared()
const;
3711 static void Profile(llvm::FoldingSetNodeID &ID,
QualType Pointee,
3716 return T->getTypeClass() == MemberPointer;
3739 unsigned tq,
const Expr *sz =
nullptr);
3757 return T->getTypeClass() == ConstantArray ||
3758 T->getTypeClass() == VariableArray ||
3759 T->getTypeClass() == IncompleteArray ||
3760 T->getTypeClass() == DependentSizedArray ||
3761 T->getTypeClass() == ArrayParameter;
3771 struct ExternalSize {
3772 ExternalSize(
const llvm::APInt &Sz,
const Expr *SE)
3773 :
Size(Sz), SizeExpr(SE) {}
3775 const Expr *SizeExpr;
3786 ConstantArrayTypeBits.HasExternalSize =
false;
3787 ConstantArrayTypeBits.SizeWidth = Width / 8;
3790 assert(Width < 0xFF &&
"Type width in bits must be less than 8 bits");
3793 ConstantArrayType(QualType Et, QualType Can, ExternalSize *SzPtr,
3794 ArraySizeModifier
SM,
unsigned TQ)
3795 : ArrayType(ConstantArray, Et, Can,
SM, TQ, SzPtr->SizeExpr),
3797 ConstantArrayTypeBits.HasExternalSize =
true;
3798 ConstantArrayTypeBits.SizeWidth = 0;
3800 assert((SzPtr->SizeExpr ==
nullptr || !Can.isNull()) &&
3801 "canonical constant array should not have size expression");
3804 static ConstantArrayType *
Create(
const ASTContext &Ctx, QualType ET,
3805 QualType Can,
const llvm::APInt &Sz,
3806 const Expr *SzExpr, ArraySizeModifier SzMod,
3816 ConstantArrayTypeBits.SizeWidth = ATy->ConstantArrayTypeBits.SizeWidth;
3852 :
static_cast<int64_t
>(
Size);
3859 ?
SizePtr->Size.getLimitedValue()
3873 static unsigned getNumAddressingBits(
const ASTContext &Context,
3875 const llvm::APInt &NumElements);
3877 unsigned getNumAddressingBits(
const ASTContext &Context)
const;
3881 static unsigned getMaxSizeBits(
const ASTContext &Context);
3888 static void Profile(llvm::FoldingSetNodeID &ID,
const ASTContext &Ctx,
3893 return T->getTypeClass() == ConstantArray ||
3894 T->getTypeClass() == ArrayParameter;
3900class ArrayParameterType :
public ConstantArrayType {
3903 ArrayParameterType(
const ConstantArrayType *ATy,
QualType CanTy)
3904 : ConstantArrayType(ArrayParameter, ATy, CanTy) {}
3908 return T->getTypeClass() == ArrayParameter;
3922 :
ArrayType(IncompleteArray, et, can, sm, tq) {}
3931 return T->getTypeClass() == IncompleteArray;
3942 ID.AddInteger(llvm::to_underlying(SizeMod));
3943 ID.AddInteger(TypeQuals);
3983 :
ArrayType(VariableArray, et, can, sm, tq, e), SizeExpr((
Stmt *)e) {}
3991 return (
Expr*) SizeExpr;
3998 return T->getTypeClass() == VariableArray;
4002 llvm_unreachable(
"Cannot unique VariableArrayTypes.");
4038 return (
Expr*) SizeExpr;
4045 return T->getTypeClass() == DependentSizedArray;
4053 static void Profile(llvm::FoldingSetNodeID &ID,
const ASTContext &Context,
4055 unsigned TypeQuals,
Expr *E);
4069class DependentAddressSpaceType :
public Type,
public llvm::FoldingSetNode {
4072 Expr *AddrSpaceExpr;
4088 return T->getTypeClass() == DependentAddressSpace;
4095 static void Profile(llvm::FoldingSetNodeID &ID,
const ASTContext &Context,
4109class DependentSizedExtVectorType :
public Type,
public llvm::FoldingSetNode {
4131 return T->getTypeClass() == DependentSizedExtVector;
4138 static void Profile(llvm::FoldingSetNodeID &ID,
const ASTContext &Context,
4216 ID.AddInteger(NumElements);
4218 ID.AddInteger(llvm::to_underlying(VecKind));
4222 return T->getTypeClass() ==
Vector || T->getTypeClass() == ExtVector;
4235class DependentVectorType :
public Type,
public llvm::FoldingSetNode {
4257 return T->getTypeClass() == DependentVector;
4264 static void Profile(llvm::FoldingSetNodeID &ID,
const ASTContext &Context,
4279 :
VectorType(ExtVector, vecType, nElements, canonType,
4286 case 'x':
case 'r':
return 0;
4287 case 'y':
case 'g':
return 1;
4288 case 'z':
case 'b':
return 2;
4289 case 'w':
case 'a':
return 3;
4307 case 'a':
return 10;
4309 case 'b':
return 11;
4311 case 'c':
return 12;
4313 case 'd':
return 13;
4315 case 'e':
return 14;
4317 case 'f':
return 15;
4322 if (isNumericAccessor)
4338 return T->getTypeClass() == ExtVector;
4355 const Expr *RowExpr =
nullptr,
const Expr *ColumnExpr =
nullptr);
4368 if (T->isDependentType())
4372 if (T->isEnumeralType())
4378 return T->isRealType();
4382 return T->isRealType() && !T->isBooleanType();
4389 return T->getTypeClass() == ConstantMatrix ||
4390 T->getTypeClass() == DependentSizedMatrix;
4404 unsigned NColumns,
QualType CanonElementType);
4407 unsigned NColumns,
QualType CanonElementType);
4438 bool IsRowMajor =
false)
const {
4448 unsigned Row = ColumnMajorIdx %
NumRows;
4475 return T->getTypeClass() == ConstantMatrix;
4498 return T->getTypeClass() == DependentSizedMatrix;
4505 static void Profile(llvm::FoldingSetNodeID &ID,
const ASTContext &Context,
4541 HasPassObjSize = 0x20,
4544 unsigned char Data = 0;
4553 copy.Data = (copy.Data & ~ABIMask) |
unsigned(
kind);
4563 copy.Data |= IsConsumed;
4565 copy.Data &= ~IsConsumed;
4572 Copy.Data |= HasPassObjSize;
4580 Copy.Data |= IsNoEscape;
4582 Copy.Data &= ~IsNoEscape;
4594 return lhs.Data == rhs.Data;
4598 return lhs.Data != rhs.Data;
4633 enum { CallConvMask = 0x3F };
4634 enum { NoReturnMask = 0x40 };
4635 enum { ProducesResultMask = 0x80 };
4636 enum { NoCallerSavedRegsMask = 0x100 };
4637 enum { RegParmMask = 0xe00, RegParmOffset = 9 };
4638 enum { NoCfCheckMask = 0x1000 };
4639 enum { CmseNSCallMask = 0x2000 };
4640 uint16_t Bits =
CC_C;
4642 ExtInfo(
unsigned Bits) : Bits(static_cast<uint16_t>(Bits)) {}
4648 bool producesResult,
bool noCallerSavedRegs,
bool NoCfCheck,
4650 assert((!hasRegParm || regParm < 7) &&
"Invalid regparm value");
4651 Bits = ((
unsigned)cc) | (noReturn ? NoReturnMask : 0) |
4652 (producesResult ? ProducesResultMask : 0) |
4653 (noCallerSavedRegs ? NoCallerSavedRegsMask : 0) |
4654 (hasRegParm ? ((regParm + 1) << RegParmOffset) : 0) |
4655 (NoCfCheck ? NoCfCheckMask : 0) |
4656 (cmseNSCall ? CmseNSCallMask : 0);
4672 bool getHasRegParm()
const {
return ((Bits & RegParmMask) >> RegParmOffset) != 0; }
4675 unsigned RegParm = (Bits & RegParmMask) >> RegParmOffset;
4684 return Bits ==
Other.Bits;
4687 return Bits !=
Other.Bits;
4695 return ExtInfo(Bits | NoReturnMask);
4697 return ExtInfo(Bits & ~NoReturnMask);
4702 return ExtInfo(Bits | ProducesResultMask);
4704 return ExtInfo(Bits & ~ProducesResultMask);
4709 return ExtInfo(Bits | CmseNSCallMask);
4711 return ExtInfo(Bits & ~CmseNSCallMask);
4715 if (noCallerSavedRegs)
4716 return ExtInfo(Bits | NoCallerSavedRegsMask);
4718 return ExtInfo(Bits & ~NoCallerSavedRegsMask);
4723 return ExtInfo(Bits | NoCfCheckMask);
4725 return ExtInfo(Bits & ~NoCfCheckMask);
4729 assert(RegParm < 7 &&
"Invalid regparm value");
4730 return ExtInfo((Bits & ~RegParmMask) |
4731 ((RegParm + 1) << RegParmOffset));
4735 return ExtInfo((Bits & ~CallConvMask) | (
unsigned) cc);
4739 ID.AddInteger(Bits);
4757 LLVM_PREFERRED_TYPE(
bool)
4760 LLVM_PREFERRED_TYPE(
bool)
4763 LLVM_PREFERRED_TYPE(
bool)
4863 bool getCFIUncheckedCalleeAttr()
const;
4870 "Const, volatile and restrict are assumed to be a subset of "
4871 "the fast qualifiers.");
4883 static StringRef getNameForCallConv(
CallingConv CC);
4886 return T->getTypeClass() == FunctionNoProto ||
4887 T->getTypeClass() == FunctionProto;
4893class FunctionNoProtoType :
public FunctionType,
public llvm::FoldingSetNode {
4916 ID.AddPointer(ResultType.getAsOpaquePtr());
4920 return T->getTypeClass() == FunctionNoProto;
4970 Kind oppositeKind()
const;
4993 llvm_unreachable(
"unknown effect kind");
4997 StringRef name()
const;
5001 OS << Effect.
name();
5011 std::optional<FunctionEffect>
5012 effectProhibitingInference(
const Decl &Callee,
5019 bool shouldDiagnoseFunctionCall(
bool Direct,
5023 return LHS.FKind == RHS.FKind;
5026 return !(LHS == RHS);
5029 return LHS.FKind < RHS.FKind;
5036 Expr *Cond =
nullptr;
5045 return Cond == RHS.Cond;
5060 std::string description()
const;
5062 friend raw_ostream &
operator<<(raw_ostream &OS,
5071 const Container *Outer =
nullptr;
5078 return Idx ==
Other.Idx;
5081 return Idx !=
Other.Idx;
5090 assert(Outer !=
nullptr &&
"invalid FunctionEffectIterator");
5091 bool HasConds = !Outer->Conditions.empty();
5093 HasConds ? Outer->Conditions[Idx]
5115class FunctionEffectsRef {
5120 friend FunctionProtoType;
5121 friend FunctionEffectSet;
5132 : Effects(FX), Conditions(Conds) {}
5145 bool empty()
const {
return Effects.empty(); }
5146 size_t size()
const {
return Effects.size(); }
5157 const FunctionEffectsRef &RHS) {
5158 return LHS.Effects == RHS.Effects && LHS.Conditions == RHS.Conditions;
5161 const FunctionEffectsRef &RHS) {
5162 return !(LHS == RHS);
5165 void dump(llvm::raw_ostream &OS)
const;
5169class FunctionEffectKindSet {
5172 using KindBitsT = std::bitset<EndBitPos>;
5174 KindBitsT KindBits{};
5176 explicit FunctionEffectKindSet(KindBitsT KB) : KindBits(KB) {}
5182 return static_cast<size_t>(K);
5191 const FunctionEffectKindSet *Outer =
nullptr;
5196 void advanceToNextSetBit() {
5197 while (Idx < EndBitPos && !Outer->KindBits.test(Idx))
5203 iterator(
const FunctionEffectKindSet &O,
size_t I) : Outer(&O), Idx(I) {
5204 advanceToNextSetBit();
5209 iterator operator++() {
5211 advanceToNextSetBit();
5216 assert(Idx < EndBitPos &&
"Dereference of end iterator");
5225 iterator
begin()
const {
return iterator(*
this, 0); }
5226 iterator
end()
const {
return iterator(*
this, EndBitPos); }
5235 bool empty()
const {
return KindBits.none(); }
5237 return KindBits.test(kindToPos(EK));
5239 void dump(llvm::raw_ostream &OS)
const;
5241 static FunctionEffectKindSet
difference(FunctionEffectKindSet LHS,
5242 FunctionEffectKindSet RHS) {
5243 return FunctionEffectKindSet(LHS.KindBits & ~RHS.KindBits);
5259 : Effects(FX.effects()), Conditions(FX.conditions()) {}
5261 bool empty()
const {
return Effects.empty(); }
5262 size_t size()
const {
return Effects.size(); }
5271 void dump(llvm::raw_ostream &OS)
const;
5306class FunctionProtoType final
5308 public llvm::FoldingSetNode,
5309 private llvm::TrailingObjects<
5310 FunctionProtoType, QualType, SourceLocation,
5311 FunctionType::FunctionTypeExtraBitfields,
5312 FunctionType::FunctionTypeExtraAttributeInfo,
5313 FunctionType::FunctionTypeArmAttributes, FunctionType::ExceptionType,
5314 Expr *, FunctionDecl *, FunctionType::ExtParameterInfo, Qualifiers,
5315 FunctionEffect, EffectConditionExpr> {
5317 friend TrailingObjects;
5410 LLVM_PREFERRED_TYPE(
bool)
5412 LLVM_PREFERRED_TYPE(
bool)
5414 LLVM_PREFERRED_TYPE(
bool)
5429 Result.ExceptionSpec = ESI;
5463 unsigned numTrailingObjects(OverloadToken<QualType>)
const {
5464 return getNumParams();
5467 unsigned numTrailingObjects(OverloadToken<SourceLocation>)
const {
5468 return isVariadic();
5471 unsigned numTrailingObjects(OverloadToken<FunctionTypeArmAttributes>)
const {
5472 return hasArmTypeAttributes();
5475 unsigned numTrailingObjects(OverloadToken<FunctionTypeExtraBitfields>)
const {
5476 return hasExtraBitfields();
5480 numTrailingObjects(OverloadToken<FunctionTypeExtraAttributeInfo>)
const {
5481 return hasExtraAttributeInfo();
5484 unsigned numTrailingObjects(OverloadToken<ExceptionType>)
const {
5485 return getExceptionSpecSize().NumExceptionType;
5488 unsigned numTrailingObjects(OverloadToken<Expr *>)
const {
5489 return getExceptionSpecSize().NumExprPtr;
5492 unsigned numTrailingObjects(OverloadToken<FunctionDecl *>)
const {
5493 return getExceptionSpecSize().NumFunctionDeclPtr;
5496 unsigned numTrailingObjects(OverloadToken<ExtParameterInfo>)
const {
5497 return hasExtParameterInfos() ? getNumParams() : 0;
5500 unsigned numTrailingObjects(OverloadToken<Qualifiers>)
const {
5501 return hasExtQualifiers() ? 1 : 0;
5504 unsigned numTrailingObjects(OverloadToken<FunctionEffect>)
const {
5505 return getNumFunctionEffects();
5510 static bool containsAnyUnexpandedParameterPack(
const QualType *ArgArray,
5512 for (
unsigned Idx = 0; Idx < numArgs; ++Idx)
5513 if (ArgArray[Idx]->containsUnexpandedParameterPack())
5519 FunctionProtoType(QualType result, ArrayRef<QualType> params,
5520 QualType canonical,
const ExtProtoInfo &epi);
5525 struct ExceptionSpecSizeHolder {
5526 unsigned NumExceptionType;
5527 unsigned NumExprPtr;
5528 unsigned NumFunctionDeclPtr;
5533 static ExceptionSpecSizeHolder
5534 getExceptionSpecSize(ExceptionSpecificationType EST,
unsigned NumExceptions) {
5545 return {NumExceptions, 0, 0};
5558 llvm_unreachable(
"bad exception specification kind");
5563 ExceptionSpecSizeHolder getExceptionSpecSize()
const {
5564 return getExceptionSpecSize(getExceptionSpecType(), getNumExceptions());
5568 bool hasExtraBitfields()
const {
5569 assert((getExceptionSpecType() != EST_Dynamic ||
5570 FunctionTypeBits.HasExtraBitfields) &&
5571 "ExtraBitfields are required for given ExceptionSpecType");
5572 return FunctionTypeBits.HasExtraBitfields;
5576 bool hasExtraAttributeInfo()
const {
5577 return FunctionTypeBits.HasExtraBitfields &&
5578 getTrailingObjects<FunctionTypeExtraBitfields>()
5579 ->HasExtraAttributeInfo;
5582 bool hasArmTypeAttributes()
const {
5583 return FunctionTypeBits.HasExtraBitfields &&
5584 getTrailingObjects<FunctionTypeExtraBitfields>()
5585 ->HasArmTypeAttributes;
5588 bool hasExtQualifiers()
const {
5589 return FunctionTypeBits.HasExtQuals;
5596 assert(i <
getNumParams() &&
"invalid parameter index");
5641 bool hasDependentExceptionSpec()
const;
5645 bool hasInstantiationDependentExceptionSpec()
const;
5667 ? getTrailingObjects<FunctionTypeExtraBitfields>()
5683 return *getTrailingObjects<Expr *>();
5694 return getTrailingObjects<FunctionDecl *>()[0];
5704 return getTrailingObjects<FunctionDecl *>()[1];
5722 return isVariadic() ? *getTrailingObjects<SourceLocation>()
5732 bool isTemplateVariadic()
const;
5742 if (hasExtQualifiers())
5743 return *getTrailingObjects<Qualifiers>();
5760 return getTrailingObjects<QualType>();
5775 getTrailingObjects<ExceptionType>());
5800 return getTrailingObjects<ExtParameterInfo>();
5805 if (hasExtraAttributeInfo())
5806 return *getTrailingObjects<FunctionTypeExtraAttributeInfo>();
5813 if (!hasArmTypeAttributes())
5815 return getTrailingObjects<FunctionTypeArmAttributes>()
5816 ->AArch64SMEAttributes;
5820 assert(I <
getNumParams() &&
"parameter index out of range");
5822 return getTrailingObjects<ExtParameterInfo>()[I];
5827 assert(I <
getNumParams() &&
"parameter index out of range");
5829 return getTrailingObjects<ExtParameterInfo>()[I].getABI();
5834 assert(I <
getNumParams() &&
"parameter index out of range");
5836 return getTrailingObjects<ExtParameterInfo>()[I].isConsumed();
5841 return hasExtraBitfields()
5842 ? getTrailingObjects<FunctionTypeExtraBitfields>()
5843 ->NumFunctionEffects
5849 if (hasExtraBitfields()) {
5850 const auto *Bitfields = getTrailingObjects<FunctionTypeExtraBitfields>();
5851 if (Bitfields->NumFunctionEffects > 0)
5852 return getTrailingObjects<FunctionEffect>(
5853 Bitfields->NumFunctionEffects);
5859 if (hasExtraBitfields()) {
5860 const auto *Bitfields = getTrailingObjects<FunctionTypeExtraBitfields>();
5861 if (Bitfields->EffectsHaveConditions)
5862 return Bitfields->NumFunctionEffects;
5869 if (hasExtraBitfields()) {
5870 const auto *Bitfields = getTrailingObjects<FunctionTypeExtraBitfields>();
5871 if (Bitfields->EffectsHaveConditions)
5872 return getTrailingObjects<EffectConditionExpr>(
5873 Bitfields->NumFunctionEffects);
5880 if (hasExtraBitfields()) {
5881 const auto *Bitfields = getTrailingObjects<FunctionTypeExtraBitfields>();
5882 if (Bitfields->NumFunctionEffects > 0) {
5883 const size_t NumConds = Bitfields->EffectsHaveConditions
5884 ? Bitfields->NumFunctionEffects
5887 getTrailingObjects<FunctionEffect>(Bitfields->NumFunctionEffects),
5888 {NumConds ? getTrailingObjects<EffectConditionExpr>() : nullptr,
5898 void printExceptionSpecification(raw_ostream &OS,
5902 return T->getTypeClass() == FunctionProto;
5905 void Profile(llvm::FoldingSetNodeID &ID,
const ASTContext &Ctx);
5985 template <
class... As>
5988 this->KeywordWrapperBits.Keyword = llvm::to_underlying(
Keyword);
6013 constexpr unsigned long Offset =
6015 const auto *
Addr =
reinterpret_cast<const T *
>(
6016 reinterpret_cast<const char *
>(
this) - Offset);
6017 assert(llvm::isAddrAligned(llvm::Align(
alignof(T)),
Addr));
6027class UnresolvedUsingType final
6029 private llvm::TrailingObjects<UnresolvedUsingType,
6030 FoldingSetPlaceholder<UnresolvedUsingType>,
6031 NestedNameSpecifier> {
6033 friend TrailingObjects;
6037 unsigned numTrailingObjects(
6045 assert(numTrailingObjects(
6048 return getTrailingObjects<FoldingSetPlaceholder<UnresolvedUsingType>>();
6051 UnresolvedUsingType(ElaboratedTypeKeyword Keyword,
6052 NestedNameSpecifier Qualifier,
6053 const UnresolvedUsingTypenameDecl *D,
6054 const Type *CanonicalType);
6059 ? *getTrailingObjects<NestedNameSpecifier>()
6074 Qualifier.Profile(ID);
6082 return T->getTypeClass() == UnresolvedUsing;
6087 public llvm::FoldingSetNode,
6088 llvm::TrailingObjects<UsingType, NestedNameSpecifier> {
6093 friend TrailingObjects;
6100 return UsingBits.hasQualifier ? *getTrailingObjects() : std::nullopt;
6113 UnderlyingType.Profile(ID);
6115 Qualifier.Profile(ID);
6121 static bool classof(
const Type *T) {
return T->getTypeClass() == Using; }
6124class TypedefType final
6126 private llvm::TrailingObjects<TypedefType,
6127 FoldingSetPlaceholder<TypedefType>,
6128 NestedNameSpecifier, QualType> {
6131 friend TrailingObjects;
6140 unsigned numTrailingObjects(OverloadToken<NestedNameSpecifier>)
const {
6141 return TypedefBits.hasQualifier;
6144 TypedefType(TypeClass TC, ElaboratedTypeKeyword Keyword,
6145 NestedNameSpecifier Qualifier,
const TypedefNameDecl *D,
6146 QualType UnderlyingType,
bool HasTypeDifferentFromDecl);
6148 FoldingSetPlaceholder<TypedefType> *getFoldingSetPlaceholder() {
6149 assert(numTrailingObjects(
6150 OverloadToken<FoldingSetPlaceholder<TypedefType>>{}) == 1);
6151 return getTrailingObjects<FoldingSetPlaceholder<TypedefType>>();
6156 return TypedefBits.hasQualifier ? *getTrailingObjects<NestedNameSpecifier>()
6177 ID.AddInteger(llvm::to_underlying(
Keyword));
6179 Qualifier.Profile(ID);
6180 if (!Underlying.
isNull())
6194class MacroQualifiedType :
public Type {
6203 UnderlyingTy(UnderlyingTy), MacroII(MacroII) {
6205 "Expected a macro qualified type to only wrap attributed types.");
6220 return T->getTypeClass() == MacroQualified;
6248 bool isSugared()
const;
6250 static bool classof(
const Type *T) {
return T->getTypeClass() == TypeOfExpr; }
6260 public llvm::FoldingSetNode {
6270 static void Profile(llvm::FoldingSetNodeID &ID,
const ASTContext &Context,
6271 Expr *E,
bool IsUnqual);
6276class TypeOfType :
public Type {
6282 TypeOfType(
const ASTContext &Context, QualType T, QualType Can,
6286 QualType getUnmodifiedType()
const {
return TOType; }
6289 QualType desugar()
const;
6292 bool isSugared()
const {
return true; }
6296 return static_cast<TypeOfKind>(TypeOfBits.Kind);
6299 static bool classof(
const Type *T) {
return T->getTypeClass() == TypeOf; }
6303class DecltypeType :
public Type {
6305 QualType UnderlyingType;
6308 friend class ASTContext;
6310 DecltypeType(Expr *E, QualType underlyingType, QualType can = QualType());
6313 Expr *getUnderlyingExpr()
const {
return E; }
6317 QualType desugar()
const;
6320 bool isSugared()
const;
6322 static bool classof(
const Type *T) {
return T->getTypeClass() == Decltype; }
6331class DependentDecltypeType :
public DecltypeType,
public llvm::FoldingSetNode {
6333 DependentDecltypeType(Expr *E);
6335 void Profile(llvm::FoldingSetNodeID &ID,
const ASTContext &Context) {
6336 Profile(ID, Context, getUnderlyingExpr());
6339 static void Profile(llvm::FoldingSetNodeID &ID,
const ASTContext &Context,
6343class PackIndexingType final
6345 public llvm::FoldingSetNode,
6346 private llvm::TrailingObjects<PackIndexingType, QualType> {
6347 friend TrailingObjects;
6354 LLVM_PREFERRED_TYPE(
bool)
6355 unsigned FullySubstituted : 1;
6358 friend class ASTContext;
6359 PackIndexingType(QualType Canonical, QualType Pattern, Expr *IndexExpr,
6360 bool FullySubstituted, ArrayRef<QualType> Expansions = {});
6363 Expr *getIndexExpr()
const {
return IndexExpr; }
6364 QualType getPattern()
const {
return Pattern; }
6366 bool isSugared()
const {
return hasSelectedType(); }
6368 QualType desugar()
const {
6369 if (hasSelectedType())
6370 return getSelectedType();
6371 return QualType(
this, 0);
6374 QualType getSelectedType()
const {
6375 assert(hasSelectedType() &&
"Type is dependant");
6376 return *(getExpansionsPtr() + *getSelectedIndex());
6379 UnsignedOrNone getSelectedIndex()
const;
6381 bool hasSelectedType()
const {
return getSelectedIndex() != std::nullopt; }
6383 bool isFullySubstituted()
const {
return FullySubstituted; }
6385 bool expandsToEmptyPack()
const {
return isFullySubstituted() &&
Size == 0; }
6387 ArrayRef<QualType> getExpansions()
const {
6388 return {getExpansionsPtr(),
Size};
6391 static bool classof(
const Type *T) {
6392 return T->getTypeClass() == PackIndexing;
6395 void Profile(llvm::FoldingSetNodeID &ID,
const ASTContext &Context);
6396 static void Profile(llvm::FoldingSetNodeID &ID,
const ASTContext &Context,
6397 QualType Pattern, Expr *E,
bool FullySubstituted,
6398 ArrayRef<QualType> Expansions);
6401 const QualType *getExpansionsPtr()
const {
return getTrailingObjects(); }
6404 ArrayRef<QualType> Expansions = {});
6408class UnaryTransformType :
public Type,
public llvm::FoldingSetNode {
6411#define TRANSFORM_TYPE_TRAIT_DEF(Enum, _) Enum,
6412#include "clang/Basic/TransformTypeTraits.def"
6420 QualType UnderlyingType;
6425 friend class ASTContext;
6427 UnaryTransformType(QualType BaseTy, QualType UnderlyingTy, UTTKind UKind,
6428 QualType CanonicalTy);
6431 bool isSugared()
const {
return !isDependentType(); }
6432 QualType desugar()
const {
return UnderlyingType; }
6437 UTTKind getUTTKind()
const {
return UKind; }
6439 static bool classof(
const Type *T) {
6440 return T->getTypeClass() == UnaryTransform;
6443 void Profile(llvm::FoldingSetNodeID &ID) {
6447 static void Profile(llvm::FoldingSetNodeID &ID, QualType BaseType,
6448 QualType UnderlyingType, UTTKind UKind) {
6449 BaseType.Profile(ID);
6450 UnderlyingType.Profile(ID);
6451 ID.AddInteger(UKind);
6455class TagType :
public TypeWithKeyword {
6456 friend class ASTContext;
6462 void *getTrailingPointer()
const;
6463 NestedNameSpecifier &getTrailingQualifier()
const;
6466 TagType(TypeClass TC, ElaboratedTypeKeyword Keyword,
6467 NestedNameSpecifier Qualifier,
const TagDecl *TD,
bool OwnsTag,
6468 bool IsInjected,
const Type *CanonicalType);
6471 TagDecl *getDecl()
const {
return decl; }
6472 [[deprecated(
"Use getDecl instead")]] TagDecl *getOriginalDecl()
const {
6476 NestedNameSpecifier getQualifier()
const;
6479 bool isTagOwned()
const {
return TagTypeBits.OwnsTag; }
6481 bool isInjected()
const {
return TagTypeBits.IsInjected; }
6483 ClassTemplateDecl *getTemplateDecl()
const;
6484 TemplateName getTemplateName(
const ASTContext &Ctx)
const;
6485 ArrayRef<TemplateArgument> getTemplateArgs(
const ASTContext &Ctx)
const;
6487 bool isSugared()
const {
return false; }
6488 QualType desugar()
const {
return getCanonicalTypeInternal(); }
6490 static bool classof(
const Type *T) {
6491 return T->getTypeClass() ==
Enum || T->getTypeClass() ==
Record ||
6492 T->getTypeClass() == InjectedClassName;
6496struct TagTypeFoldingSetPlaceholder :
public llvm::FoldingSetNode {
6497 static constexpr size_t getOffset() {
6498 return alignof(TagType) -
6499 (
sizeof(TagTypeFoldingSetPlaceholder) %
alignof(TagType));
6502 static void Profile(llvm::FoldingSetNodeID &ID, ElaboratedTypeKeyword Keyword,
6503 NestedNameSpecifier Qualifier,
const TagDecl *Tag,
6504 bool OwnsTag,
bool IsInjected) {
6505 ID.AddInteger(
uintptr_t(Tag) | OwnsTag | (IsInjected << 1) |
6506 ((Keyword != ElaboratedTypeKeyword::None) << 2));
6507 if (Keyword != ElaboratedTypeKeyword::None)
6508 ID.AddInteger(llvm::to_underlying(Keyword));
6513 void Profile(llvm::FoldingSetNodeID &ID)
const {
6514 const TagType *T = getTagType();
6515 Profile(ID, T->getKeyword(), T->getQualifier(), T->getDecl(),
6516 T->isTagOwned(), T->isInjected());
6519 TagType *getTagType() {
6520 return reinterpret_cast<TagType *
>(
reinterpret_cast<char *
>(
this + 1) +
6523 const TagType *getTagType()
const {
6524 return const_cast<TagTypeFoldingSetPlaceholder *
>(
this)->getTagType();
6526 static TagTypeFoldingSetPlaceholder *fromTagType(TagType *T) {
6527 return reinterpret_cast<TagTypeFoldingSetPlaceholder *
>(
6528 reinterpret_cast<char *
>(T) - getOffset()) -
6535class RecordType final :
public TagType {
6536 using TagType::TagType;
6539 RecordDecl *getDecl()
const {
6540 return reinterpret_cast<RecordDecl *
>(TagType::getDecl());
6542 [[deprecated(
"Use getDecl instead")]] RecordDecl *getOriginalDecl()
const {
6548 bool hasConstFields()
const;
6550 static bool classof(
const Type *T) {
return T->getTypeClass() ==
Record; }
6555class EnumType final :
public TagType {
6556 using TagType::TagType;
6559 EnumDecl *getDecl()
const {
6560 return reinterpret_cast<EnumDecl *
>(TagType::getDecl());
6562 [[deprecated(
"Use getDecl instead")]] EnumDecl *getOriginalDecl()
const {
6566 static bool classof(
const Type *T) {
return T->getTypeClass() ==
Enum; }
6586class InjectedClassNameType final :
public TagType {
6587 friend class ASTContext;
6589 InjectedClassNameType(ElaboratedTypeKeyword Keyword,
6590 NestedNameSpecifier Qualifier,
const TagDecl *TD,
6591 bool IsInjected,
const Type *CanonicalType);
6594 CXXRecordDecl *getDecl()
const {
6595 return reinterpret_cast<CXXRecordDecl *
>(TagType::getDecl());
6597 [[deprecated(
"Use getDecl instead")]] CXXRecordDecl *getOriginalDecl()
const {
6601 static bool classof(
const Type *T) {
6602 return T->getTypeClass() == InjectedClassName;
6620 using Kind = attr::Kind;
6623 friend class ASTContext;
6625 const Attr *Attribute;
6627 QualType ModifiedType;
6628 QualType EquivalentType;
6630 AttributedType(QualType canon, attr::Kind attrKind, QualType modified,
6631 QualType equivalent)
6634 AttributedType(QualType canon,
const Attr *attr, QualType modified,
6635 QualType equivalent);
6638 AttributedType(QualType canon, attr::Kind attrKind,
const Attr *attr,
6639 QualType modified, QualType equivalent);
6642 Kind getAttrKind()
const {
6643 return static_cast<Kind>(AttributedTypeBits.AttrKind);
6646 const Attr *getAttr()
const {
return Attribute; }
6648 QualType getModifiedType()
const {
return ModifiedType; }
6649 QualType getEquivalentType()
const {
return EquivalentType; }
6651 bool isSugared()
const {
return true; }
6652 QualType desugar()
const {
return getEquivalentType(); }
6669 bool isQualifier()
const;
6671 bool isMSTypeSpec()
const;
6673 bool isWebAssemblyFuncrefSpec()
const;
6675 bool isCallingConv()
const;
6677 std::optional<NullabilityKind> getImmediateNullability()
const;
6688 static std::optional<NullabilityKind> stripOuterNullability(QualType &T);
6690 void Profile(llvm::FoldingSetNodeID &ID) {
6691 Profile(ID, getAttrKind(), ModifiedType, EquivalentType, Attribute);
6694 static void Profile(llvm::FoldingSetNodeID &ID, Kind attrKind,
6695 QualType modified, QualType equivalent,
6697 ID.AddInteger(attrKind);
6698 ID.AddPointer(modified.getAsOpaquePtr());
6699 ID.AddPointer(equivalent.getAsOpaquePtr());
6700 ID.AddPointer(attr);
6703 static bool classof(
const Type *T) {
6704 return T->getTypeClass() == Attributed;
6708class BTFTagAttributedType :
public Type,
public llvm::FoldingSetNode {
6710 friend class ASTContext;
6712 QualType WrappedType;
6713 const BTFTypeTagAttr *BTFAttr;
6715 BTFTagAttributedType(QualType Canon, QualType Wrapped,
6716 const BTFTypeTagAttr *BTFAttr)
6717 : Type(BTFTagAttributed, Canon, Wrapped->getDependence()),
6718 WrappedType(Wrapped), BTFAttr(BTFAttr) {}
6721 QualType getWrappedType()
const {
return WrappedType; }
6722 const BTFTypeTagAttr *getAttr()
const {
return BTFAttr; }
6724 bool isSugared()
const {
return true; }
6725 QualType desugar()
const {
return getWrappedType(); }
6727 void Profile(llvm::FoldingSetNodeID &ID) {
6728 Profile(ID, WrappedType, BTFAttr);
6731 static void Profile(llvm::FoldingSetNodeID &ID, QualType Wrapped,
6732 const BTFTypeTagAttr *BTFAttr) {
6733 ID.AddPointer(Wrapped.getAsOpaquePtr());
6734 ID.AddPointer(BTFAttr);
6737 static bool classof(
const Type *T) {
6738 return T->getTypeClass() == BTFTagAttributed;
6742class OverflowBehaviorType :
public Type,
public llvm::FoldingSetNode {
6744 enum OverflowBehaviorKind { Wrap, Trap };
6747 friend class ASTContext;
6749 QualType UnderlyingType;
6750 OverflowBehaviorKind BehaviorKind;
6752 OverflowBehaviorType(QualType Canon, QualType Underlying,
6753 OverflowBehaviorKind Kind);
6757 OverflowBehaviorKind getBehaviorKind()
const {
return BehaviorKind; }
6759 bool isWrapKind()
const {
return BehaviorKind == OverflowBehaviorKind::Wrap; }
6760 bool isTrapKind()
const {
return BehaviorKind == OverflowBehaviorKind::Trap; }
6762 bool isSugared()
const {
return false; }
6765 void Profile(llvm::FoldingSetNodeID &ID) {
6766 Profile(ID, UnderlyingType, BehaviorKind);
6769 static void Profile(llvm::FoldingSetNodeID &ID, QualType Underlying,
6770 OverflowBehaviorKind Kind) {
6771 ID.AddPointer(Underlying.getAsOpaquePtr());
6772 ID.AddInteger((
int)Kind);
6775 static bool classof(
const Type *T) {
6780class HLSLAttributedResourceType :
public Type,
public llvm::FoldingSetNode {
6785 llvm::dxil::ResourceDimension ResourceDimension;
6787 LLVM_PREFERRED_TYPE(
bool)
6790 LLVM_PREFERRED_TYPE(
bool)
6791 uint8_t RawBuffer : 1;
6793 LLVM_PREFERRED_TYPE(
bool)
6794 uint8_t IsCounter : 1;
6797 llvm::dxil::ResourceDimension ResourceDimension,
6798 bool IsROV =
false,
bool RawBuffer =
false,
6799 bool IsCounter =
false)
6801 IsROV(IsROV), RawBuffer(RawBuffer), IsCounter(IsCounter) {}
6811 friend bool operator==(
const Attributes &LHS,
const Attributes &RHS) {
6812 return std::tie(LHS.ResourceClass, LHS.ResourceDimension, LHS.IsROV,
6813 LHS.RawBuffer, LHS.IsCounter) ==
6814 std::tie(RHS.ResourceClass, RHS.ResourceDimension, RHS.IsROV,
6815 RHS.RawBuffer, RHS.IsCounter);
6817 friend bool operator!=(
const Attributes &LHS,
const Attributes &RHS) {
6818 return !(LHS == RHS);
6823 friend class ASTContext;
6825 QualType WrappedType;
6826 QualType ContainedType;
6827 const Attributes Attrs;
6829 HLSLAttributedResourceType(QualType Wrapped, QualType Contained,
6830 const Attributes &Attrs)
6831 : Type(HLSLAttributedResource, QualType(),
6833 : Contained->getDependence()),
6834 WrappedType(Wrapped), ContainedType(Contained), Attrs(Attrs) {}
6837 QualType getWrappedType()
const {
return WrappedType; }
6838 QualType getContainedType()
const {
return ContainedType; }
6839 bool hasContainedType()
const {
return !ContainedType.isNull(); }
6840 const Attributes &getAttrs()
const {
return Attrs; }
6841 bool isRaw()
const {
return Attrs.RawBuffer; }
6842 bool isStructured()
const {
return !ContainedType->isChar8Type(); }
6844 bool isSugared()
const {
return false; }
6845 QualType desugar()
const {
return QualType(
this, 0); }
6847 void Profile(llvm::FoldingSetNodeID &ID) {
6848 Profile(ID, WrappedType, ContainedType, Attrs);
6851 static void Profile(llvm::FoldingSetNodeID &ID, QualType Wrapped,
6852 QualType Contained,
const Attributes &Attrs) {
6853 ID.AddPointer(Wrapped.getAsOpaquePtr());
6854 ID.AddPointer(Contained.getAsOpaquePtr());
6855 ID.AddInteger(
static_cast<uint32_t>(Attrs.ResourceClass));
6856 ID.AddInteger(
static_cast<uint32_t>(Attrs.ResourceDimension));
6857 ID.AddBoolean(Attrs.IsROV);
6858 ID.AddBoolean(Attrs.RawBuffer);
6859 ID.AddBoolean(Attrs.IsCounter);
6862 static bool classof(
const Type *T) {
6863 return T->getTypeClass() == HLSLAttributedResource;
6867 static const HLSLAttributedResourceType *
6868 findHandleTypeOnResource(
const Type *RT);
6874 enum SpirvOperandKind :
unsigned char {
6887 QualType ResultType;
6893 SpirvOperand(SpirvOperandKind Kind, QualType ResultType, llvm::APInt
Value)
6896 SpirvOperand(
const SpirvOperand &Other) =
default;
6897 ~SpirvOperand() =
default;
6898 SpirvOperand &operator=(
const SpirvOperand &Other) =
default;
6900 bool operator==(
const SpirvOperand &Other)
const {
6905 bool operator!=(
const SpirvOperand &Other)
const {
return !(*
this ==
Other); }
6910 bool isConstant()
const {
return Kind == ConstantId; }
6912 bool isType()
const {
return Kind == TypeId; }
6914 llvm::APInt getValue()
const {
6916 "This is not an operand with a value!");
6920 QualType getResultType()
const {
6921 assert((isConstant() || isType()) &&
6922 "This is not an operand with a result type!");
6926 static SpirvOperand createConstant(QualType ResultType, llvm::APInt Val) {
6927 return SpirvOperand(ConstantId, ResultType, std::move(Val));
6930 static SpirvOperand createLiteral(llvm::APInt Val) {
6931 return SpirvOperand(Literal, QualType(), std::move(Val));
6934 static SpirvOperand createType(QualType T) {
6935 return SpirvOperand(TypeId, T, llvm::APSInt());
6938 void Profile(llvm::FoldingSetNodeID &ID)
const {
6939 ID.AddInteger(Kind);
6940 ID.AddPointer(ResultType.getAsOpaquePtr());
6946class HLSLInlineSpirvType final
6948 public llvm::FoldingSetNode,
6949 private llvm::TrailingObjects<HLSLInlineSpirvType, SpirvOperand> {
6950 friend class ASTContext;
6951 friend TrailingObjects;
6959 HLSLInlineSpirvType(uint32_t Opcode, uint32_t Size, uint32_t Alignment,
6960 ArrayRef<SpirvOperand> Operands)
6962 Size(
Size), Alignment(Alignment), NumOperands(Operands.size()) {
6963 for (
size_t I = 0; I < NumOperands; I++) {
6966 auto *
Operand =
new (&getTrailingObjects()[I]) SpirvOperand();
6974 uint32_t getAlignment()
const {
return Alignment; }
6975 ArrayRef<SpirvOperand> getOperands()
const {
6976 return getTrailingObjects(NumOperands);
6979 bool isSugared()
const {
return false; }
6980 QualType desugar()
const {
return QualType(
this, 0); }
6982 void Profile(llvm::FoldingSetNodeID &ID) {
6983 Profile(ID, Opcode, Size, Alignment, getOperands());
6986 static void Profile(llvm::FoldingSetNodeID &ID, uint32_t Opcode,
6987 uint32_t Size, uint32_t Alignment,
6988 ArrayRef<SpirvOperand> Operands) {
6989 ID.AddInteger(Opcode);
6990 ID.AddInteger(Size);
6991 ID.AddInteger(Alignment);
6992 for (
auto &Operand : Operands)
6996 static bool classof(
const Type *T) {
6997 return T->getTypeClass() == HLSLInlineSpirv;
7001class TemplateTypeParmType :
public Type,
public llvm::FoldingSetNode {
7002 friend class ASTContext;
7005 TemplateTypeParmDecl *TTPDecl;
7007 TemplateTypeParmType(
unsigned D,
unsigned I,
bool PP,
7008 TemplateTypeParmDecl *TTPDecl, QualType Canon)
7013 assert(!TTPDecl == Canon.isNull());
7014 TemplateTypeParmTypeBits.Depth = D;
7015 TemplateTypeParmTypeBits.Index = I;
7016 TemplateTypeParmTypeBits.ParameterPack = PP;
7020 unsigned getDepth()
const {
return TemplateTypeParmTypeBits.Depth; }
7021 unsigned getIndex()
const {
return TemplateTypeParmTypeBits.Index; }
7023 return TemplateTypeParmTypeBits.ParameterPack;
7026 TemplateTypeParmDecl *getDecl()
const {
return TTPDecl; }
7030 bool isSugared()
const {
return false; }
7031 QualType desugar()
const {
return QualType(
this, 0); }
7033 void Profile(llvm::FoldingSetNodeID &ID) {
7037 static void Profile(llvm::FoldingSetNodeID &ID,
unsigned Depth,
7038 unsigned Index,
bool ParameterPack,
7039 TemplateTypeParmDecl *TTPDecl) {
7040 ID.AddInteger(Depth);
7041 ID.AddInteger(Index);
7042 ID.AddBoolean(ParameterPack);
7043 ID.AddPointer(TTPDecl);
7046 static bool classof(
const Type *T) {
7058class SubstTemplateTypeParmType final
7060 public llvm::FoldingSetNode,
7061 private llvm::TrailingObjects<SubstTemplateTypeParmType, QualType> {
7062 friend class ASTContext;
7063 friend class llvm::TrailingObjects<SubstTemplateTypeParmType, QualType>;
7065 Decl *AssociatedDecl;
7067 SubstTemplateTypeParmType(QualType Replacement, Decl *AssociatedDecl,
7068 unsigned Index, UnsignedOrNone PackIndex,
7074 QualType getReplacementType()
const {
7075 return SubstTemplateTypeParmTypeBits.HasNonCanonicalUnderlyingType
7076 ? *getTrailingObjects()
7077 : getCanonicalTypeInternal();
7083 Decl *getAssociatedDecl()
const {
return AssociatedDecl; }
7086 const TemplateTypeParmDecl *getReplacedParameter()
const;
7090 unsigned getIndex()
const {
return SubstTemplateTypeParmTypeBits.Index; }
7094 unsigned getFinal()
const {
return SubstTemplateTypeParmTypeBits.Final; }
7096 UnsignedOrNone getPackIndex()
const {
7097 return UnsignedOrNone::fromInternalRepresentation(
7098 SubstTemplateTypeParmTypeBits.PackIndex);
7101 bool isSugared()
const {
return true; }
7102 QualType desugar()
const {
return getReplacementType(); }
7104 void Profile(llvm::FoldingSetNodeID &ID) {
7105 Profile(ID, getReplacementType(), getAssociatedDecl(),
getIndex(),
7106 getPackIndex(), getFinal());
7109 static void Profile(llvm::FoldingSetNodeID &ID, QualType Replacement,
7110 const Decl *AssociatedDecl,
unsigned Index,
7111 UnsignedOrNone PackIndex,
bool Final);
7113 static bool classof(
const Type *T) {
7114 return T->getTypeClass() == SubstTemplateTypeParm;
7124class SubstPackType :
public Type,
public llvm::FoldingSetNode {
7125 friend class ASTContext;
7132 SubstPackType(TypeClass Derived, QualType Canon,
7133 const TemplateArgument &ArgPack);
7136 unsigned getNumArgs()
const {
return SubstPackTypeBits.NumArgs; }
7138 TemplateArgument getArgumentPack()
const;
7140 void Profile(llvm::FoldingSetNodeID &ID);
7141 static void Profile(llvm::FoldingSetNodeID &ID,
7142 const TemplateArgument &ArgPack);
7144 static bool classof(
const Type *T) {
7145 return T->getTypeClass() == SubstTemplateTypeParmPack ||
7146 T->getTypeClass() == SubstBuiltinTemplatePack;
7151class SubstBuiltinTemplatePackType :
public SubstPackType {
7152 friend class ASTContext;
7154 SubstBuiltinTemplatePackType(QualType Canon,
const TemplateArgument &ArgPack);
7157 bool isSugared()
const {
return false; }
7158 QualType desugar()
const {
return QualType(
this, 0); }
7161 using SubstPackType::Profile;
7163 static bool classof(
const Type *T) {
7164 return T->getTypeClass() == SubstBuiltinTemplatePack;
7180class SubstTemplateTypeParmPackType :
public SubstPackType {
7181 friend class ASTContext;
7183 llvm::PointerIntPair<Decl *, 1, bool> AssociatedDeclAndFinal;
7185 SubstTemplateTypeParmPackType(QualType Canon, Decl *AssociatedDecl,
7186 unsigned Index,
bool Final,
7187 const TemplateArgument &ArgPack);
7195 Decl *getAssociatedDecl()
const;
7198 const TemplateTypeParmDecl *getReplacedParameter()
const;
7203 return SubstPackTypeBits.SubstTemplTypeParmPackIndex;
7208 bool getFinal()
const;
7210 bool isSugared()
const {
return false; }
7211 QualType desugar()
const {
return QualType(
this, 0); }
7213 void Profile(llvm::FoldingSetNodeID &ID);
7214 static void Profile(llvm::FoldingSetNodeID &ID,
const Decl *AssociatedDecl,
7215 unsigned Index,
bool Final,
7216 const TemplateArgument &ArgPack);
7218 static bool classof(
const Type *T) {
7219 return T->getTypeClass() == SubstTemplateTypeParmPack;
7231class DeducedType :
public Type {
7232 QualType DeducedAsType;
7235 DeducedType(TypeClass TC, QualType DeducedAsType,
7236 TypeDependence ExtraDependence, QualType Canon)
7238 ExtraDependence | (DeducedAsType.isNull()
7240 : DeducedAsType->getDependence() &
7242 DeducedAsType(DeducedAsType) {}
7245 bool isSugared()
const {
return !DeducedAsType.isNull(); }
7246 QualType desugar()
const {
7247 return isSugared() ? DeducedAsType : QualType(
this, 0);
7252 QualType getDeducedType()
const {
return DeducedAsType; }
7253 bool isDeduced()
const {
7254 return !DeducedAsType.isNull() || isDependentType();
7257 static bool classof(
const Type *T) {
7258 return T->getTypeClass() ==
Auto ||
7259 T->getTypeClass() == DeducedTemplateSpecialization;
7265class AutoType :
public DeducedType {
7266 friend class ASTContext;
7268 TemplateDecl *TypeConstraintConcept;
7270 AutoType(QualType DeducedAsType, AutoTypeKeyword Keyword,
7271 TypeDependence ExtraDependence, QualType Canon, TemplateDecl *CD,
7272 ArrayRef<TemplateArgument> TypeConstraintArgs);
7275 ArrayRef<TemplateArgument> getTypeConstraintArguments()
const {
7276 return {
reinterpret_cast<const TemplateArgument *
>(
this + 1),
7277 AutoTypeBits.NumArgs};
7280 TemplateDecl *getTypeConstraintConcept()
const {
7281 return TypeConstraintConcept;
7284 bool isConstrained()
const {
7285 return TypeConstraintConcept !=
nullptr;
7288 bool isDecltypeAuto()
const {
7289 return getKeyword() == AutoTypeKeyword::DecltypeAuto;
7292 bool isGNUAutoType()
const {
7293 return getKeyword() == AutoTypeKeyword::GNUAutoType;
7297 return (AutoTypeKeyword)AutoTypeBits.Keyword;
7300 void Profile(llvm::FoldingSetNodeID &ID,
const ASTContext &Context);
7301 static void Profile(llvm::FoldingSetNodeID &ID,
const ASTContext &Context,
7302 QualType Deduced, AutoTypeKeyword Keyword,
7303 bool IsDependent, TemplateDecl *CD,
7304 ArrayRef<TemplateArgument> Arguments);
7306 static bool classof(
const Type *T) {
7307 return T->getTypeClass() ==
Auto;
7312class DeducedTemplateSpecializationType :
public KeywordWrapper<DeducedType>,
7313 public llvm::FoldingSetNode {
7314 friend class ASTContext;
7319 DeducedTemplateSpecializationType(ElaboratedTypeKeyword Keyword,
7320 TemplateName Template,
7321 QualType DeducedAsType,
7322 bool IsDeducedAsDependent, QualType Canon)
7323 : KeywordWrapper(
Keyword, DeducedTemplateSpecialization, DeducedAsType,
7325 (IsDeducedAsDependent
7335 void Profile(llvm::FoldingSetNodeID &ID)
const {
7336 Profile(ID, getKeyword(), getTemplateName(), getDeducedType(),
7340 static void Profile(llvm::FoldingSetNodeID &ID, ElaboratedTypeKeyword Keyword,
7341 TemplateName Template, QualType Deduced,
7343 ID.AddInteger(llvm::to_underlying(Keyword));
7345 Deduced.Profile(ID);
7346 ID.AddBoolean(IsDependent ||
Template.isDependent());
7349 static bool classof(
const Type *T) {
7350 return T->getTypeClass() == DeducedTemplateSpecialization;
7374class TemplateSpecializationType :
public TypeWithKeyword,
7375 public llvm::FoldingSetNode {
7376 friend class ASTContext;
7387 TemplateSpecializationType(ElaboratedTypeKeyword Keyword, TemplateName T,
7388 bool IsAlias, ArrayRef<TemplateArgument> Args,
7389 QualType Underlying);
7404 anyDependentTemplateArguments(ArrayRef<TemplateArgumentLoc> Args,
7405 ArrayRef<TemplateArgument> Converted);
7407 anyDependentTemplateArguments(
const TemplateArgumentListInfo &,
7408 ArrayRef<TemplateArgument> Converted);
7409 static bool anyInstantiationDependentTemplateArguments(
7410 ArrayRef<TemplateArgumentLoc> Args);
7414 bool isCurrentInstantiation()
const {
7415 return isa<InjectedClassNameType>(getCanonicalTypeInternal());
7433 bool isTypeAlias()
const {
return TemplateSpecializationTypeBits.TypeAlias; }
7437 QualType getAliasedType()
const;
7442 ArrayRef<TemplateArgument> template_arguments()
const {
7443 return {
reinterpret_cast<const TemplateArgument *
>(
this + 1),
7444 TemplateSpecializationTypeBits.NumArgs};
7447 bool isSugared()
const;
7449 QualType desugar()
const {
7450 return isTypeAlias() ? getAliasedType() : getCanonicalTypeInternal();
7453 void Profile(llvm::FoldingSetNodeID &ID,
const ASTContext &Ctx);
7454 static void Profile(llvm::FoldingSetNodeID &ID, ElaboratedTypeKeyword Keyword,
7455 TemplateName T, ArrayRef<TemplateArgument> Args,
7456 QualType Underlying,
const ASTContext &Context);
7458 static bool classof(
const Type *T) {
7465void printTemplateArgumentList(raw_ostream &OS,
7466 ArrayRef<TemplateArgument> Args,
7467 const PrintingPolicy &Policy,
7468 const TemplateParameterList *TPL =
nullptr);
7470void printTemplateArgumentList(raw_ostream &OS,
7471 ArrayRef<TemplateArgumentLoc> Args,
7472 const PrintingPolicy &Policy,
7473 const TemplateParameterList *TPL =
nullptr);
7475void printTemplateArgumentList(raw_ostream &OS,
7476 const TemplateArgumentListInfo &Args,
7477 const PrintingPolicy &Policy,
7478 const TemplateParameterList *TPL =
nullptr);
7482bool isSubstitutedDefaultArgument(ASTContext &Ctx, TemplateArgument Arg,
7483 const NamedDecl *Param,
7484 ArrayRef<TemplateArgument> Args,
7499class DependentNameType :
public TypeWithKeyword,
public llvm::FoldingSetNode {
7500 friend class ASTContext;
7503 NestedNameSpecifier NNS;
7506 const IdentifierInfo *Name;
7508 DependentNameType(ElaboratedTypeKeyword Keyword, NestedNameSpecifier NNS,
7509 const IdentifierInfo *Name, QualType CanonType)
7510 : TypeWithKeyword(
Keyword, DependentName, CanonType,
7514 NNS(NNS), Name(Name) {
7520 NestedNameSpecifier getQualifier()
const {
return NNS; }
7528 bool isSugared()
const {
return false; }
7529 QualType desugar()
const {
return QualType(
this, 0); }
7531 void Profile(llvm::FoldingSetNodeID &ID) {
7532 Profile(ID, getKeyword(), NNS, Name);
7535 static void Profile(llvm::FoldingSetNodeID &ID, ElaboratedTypeKeyword Keyword,
7536 NestedNameSpecifier NNS,
const IdentifierInfo *Name) {
7537 ID.AddInteger(llvm::to_underlying(Keyword));
7539 ID.AddPointer(Name);
7542 static bool classof(
const Type *T) {
7543 return T->getTypeClass() == DependentName;
7569class PackExpansionType :
public Type,
public llvm::FoldingSetNode {
7570 friend class ASTContext;
7575 PackExpansionType(QualType Pattern, QualType Canon,
7576 UnsignedOrNone NumExpansions)
7577 : Type(PackExpansion, Canon,
7582 PackExpansionTypeBits.NumExpansions =
7583 NumExpansions ? *NumExpansions + 1 : 0;
7590 QualType getPattern()
const {
return Pattern; }
7594 UnsignedOrNone getNumExpansions()
const {
7595 if (PackExpansionTypeBits.NumExpansions)
7596 return PackExpansionTypeBits.NumExpansions - 1;
7597 return std::nullopt;
7600 bool isSugared()
const {
return false; }
7601 QualType desugar()
const {
return QualType(
this, 0); }
7603 void Profile(llvm::FoldingSetNodeID &ID) {
7604 Profile(ID, getPattern(), getNumExpansions());
7607 static void Profile(llvm::FoldingSetNodeID &ID, QualType Pattern,
7608 UnsignedOrNone NumExpansions) {
7609 ID.AddPointer(Pattern.getAsOpaquePtr());
7610 ID.AddInteger(NumExpansions.toInternalRepresentation());
7613 static bool classof(
const Type *T) {
7614 return T->getTypeClass() == PackExpansion;
7621class ObjCProtocolQualifiers {
7623 ObjCProtocolQualifiers() =
default;
7625 ObjCProtocolDecl *
const *getProtocolStorage()
const {
7626 return const_cast<ObjCProtocolQualifiers*
>(
this)->getProtocolStorage();
7629 ObjCProtocolDecl **getProtocolStorage() {
7630 return static_cast<T*
>(
this)->getProtocolStorageImpl();
7633 void setNumProtocols(
unsigned N) {
7634 static_cast<T*
>(
this)->setNumProtocolsImpl(N);
7637 void initialize(ArrayRef<ObjCProtocolDecl *> protocols) {
7638 setNumProtocols(protocols.size());
7639 assert(getNumProtocols() == protocols.size() &&
7640 "bitfield overflow in protocol count");
7641 if (!protocols.empty())
7642 memcpy(getProtocolStorage(), protocols.data(),
7643 protocols.size() *
sizeof(ObjCProtocolDecl*));
7647 using qual_iterator = ObjCProtocolDecl *
const *;
7648 using qual_range = llvm::iterator_range<qual_iterator>;
7650 qual_range quals()
const {
return qual_range(qual_begin(), qual_end()); }
7651 qual_iterator qual_begin()
const {
return getProtocolStorage(); }
7652 qual_iterator qual_end()
const {
return qual_begin() + getNumProtocols(); }
7654 bool qual_empty()
const {
return getNumProtocols() == 0; }
7658 unsigned getNumProtocols()
const {
7659 return static_cast<const T*
>(
this)->getNumProtocolsImpl();
7663 ObjCProtocolDecl *getProtocol(
unsigned I)
const {
7664 assert(I < getNumProtocols() &&
"Out-of-range protocol access");
7665 return qual_begin()[I];
7669 ArrayRef<ObjCProtocolDecl *> getProtocols()
const {
7670 return ArrayRef<ObjCProtocolDecl *>(qual_begin(), getNumProtocols());
7676class ObjCTypeParamType :
public Type,
7677 public ObjCProtocolQualifiers<ObjCTypeParamType>,
7678 public llvm::FoldingSetNode {
7679 friend class ASTContext;
7680 friend class ObjCProtocolQualifiers<ObjCTypeParamType>;
7683 unsigned NumProtocols : 6;
7685 ObjCTypeParamDecl *OTPDecl;
7690 ObjCProtocolDecl **getProtocolStorageImpl();
7694 unsigned getNumProtocolsImpl()
const {
7695 return NumProtocols;
7698 void setNumProtocolsImpl(
unsigned N) {
7702 ObjCTypeParamType(
const ObjCTypeParamDecl *D,
7704 ArrayRef<ObjCProtocolDecl *> protocols);
7707 bool isSugared()
const {
return true; }
7708 QualType desugar()
const {
return getCanonicalTypeInternal(); }
7710 static bool classof(
const Type *T) {
7711 return T->getTypeClass() == ObjCTypeParam;
7714 void Profile(llvm::FoldingSetNodeID &ID);
7715 static void Profile(llvm::FoldingSetNodeID &ID,
7716 const ObjCTypeParamDecl *OTPDecl,
7717 QualType CanonicalType,
7718 ArrayRef<ObjCProtocolDecl *> protocols);
7720 ObjCTypeParamDecl *getDecl()
const {
return OTPDecl; }
7751class ObjCObjectType :
public Type,
7752 public ObjCProtocolQualifiers<ObjCObjectType> {
7753 friend class ObjCProtocolQualifiers<ObjCObjectType>;
7771 mutable llvm::PointerIntPair<const ObjCObjectType *, 1, bool>
7772 CachedSuperClassType;
7774 QualType *getTypeArgStorage();
7775 const QualType *getTypeArgStorage()
const {
7776 return const_cast<ObjCObjectType *
>(
this)->getTypeArgStorage();
7779 ObjCProtocolDecl **getProtocolStorageImpl();
7782 unsigned getNumProtocolsImpl()
const {
7783 return ObjCObjectTypeBits.NumProtocols;
7785 void setNumProtocolsImpl(
unsigned N) {
7786 ObjCObjectTypeBits.NumProtocols = N;
7790 enum Nonce_ObjCInterface { Nonce_ObjCInterface };
7792 ObjCObjectType(QualType Canonical, QualType Base,
7793 ArrayRef<QualType> typeArgs,
7794 ArrayRef<ObjCProtocolDecl *> protocols,
7797 ObjCObjectType(
enum Nonce_ObjCInterface)
7799 BaseType(QualType(this_(), 0)) {
7800 ObjCObjectTypeBits.NumProtocols = 0;
7801 ObjCObjectTypeBits.NumTypeArgs = 0;
7802 ObjCObjectTypeBits.IsKindOf = 0;
7805 void computeSuperClassTypeSlow()
const;
7816 bool isObjCId()
const {
7817 return getBaseType()->isSpecificBuiltinType(BuiltinType::ObjCId);
7820 bool isObjCClass()
const {
7821 return getBaseType()->isSpecificBuiltinType(BuiltinType::ObjCClass);
7824 bool isObjCUnqualifiedId()
const {
return qual_empty() && isObjCId(); }
7825 bool isObjCUnqualifiedClass()
const {
return qual_empty() && isObjCClass(); }
7826 bool isObjCUnqualifiedIdOrClass()
const {
7827 if (!qual_empty())
return false;
7828 if (
const BuiltinType *T =
getBaseType()->getAs<BuiltinType>())
7829 return T->getKind() == BuiltinType::ObjCId ||
7830 T->getKind() == BuiltinType::ObjCClass;
7833 bool isObjCQualifiedId()
const {
return !qual_empty() && isObjCId(); }
7834 bool isObjCQualifiedClass()
const {
return !qual_empty() && isObjCClass(); }
7838 ObjCInterfaceDecl *getInterface()
const;
7842 bool isSpecialized()
const;
7845 bool isSpecializedAsWritten()
const {
7846 return ObjCObjectTypeBits.NumTypeArgs > 0;
7851 bool isUnspecialized()
const {
return !isSpecialized(); }
7855 bool isUnspecializedAsWritten()
const {
return !isSpecializedAsWritten(); }
7858 ArrayRef<QualType> getTypeArgs()
const;
7862 ArrayRef<QualType> getTypeArgsAsWritten()
const {
7863 return {getTypeArgStorage(), ObjCObjectTypeBits.NumTypeArgs};
7867 bool isKindOfTypeAsWritten()
const {
return ObjCObjectTypeBits.IsKindOf; }
7870 bool isKindOfType()
const;
7878 QualType getSuperClassType()
const {
7879 if (!CachedSuperClassType.getInt())
7880 computeSuperClassTypeSlow();
7882 assert(CachedSuperClassType.getInt() &&
"Superclass not set?");
7883 return QualType(CachedSuperClassType.getPointer(), 0);
7888 QualType stripObjCKindOfTypeAndQuals(
const ASTContext &ctx)
const;
7890 bool isSugared()
const {
return false; }
7891 QualType desugar()
const {
return QualType(
this, 0); }
7893 static bool classof(
const Type *T) {
7894 return T->getTypeClass() == ObjCObject ||
7895 T->getTypeClass() == ObjCInterface;
7903class ObjCObjectTypeImpl :
public ObjCObjectType,
public llvm::FoldingSetNode {
7904 friend class ASTContext;
7909 ObjCObjectTypeImpl(QualType Canonical, QualType Base,
7910 ArrayRef<QualType> typeArgs,
7911 ArrayRef<ObjCProtocolDecl *> protocols,
7913 : ObjCObjectType(Canonical,
Base, typeArgs, protocols, isKindOf) {}
7916 void Profile(llvm::FoldingSetNodeID &ID);
7917 static void Profile(llvm::FoldingSetNodeID &ID,
7919 ArrayRef<QualType> typeArgs,
7920 ArrayRef<ObjCProtocolDecl *> protocols,
7924inline QualType *ObjCObjectType::getTypeArgStorage() {
7925 return reinterpret_cast<QualType *
>(
static_cast<ObjCObjectTypeImpl*
>(
this)+1);
7928inline ObjCProtocolDecl **ObjCObjectType::getProtocolStorageImpl() {
7929 return reinterpret_cast<ObjCProtocolDecl**
>(
7930 getTypeArgStorage() + ObjCObjectTypeBits.NumTypeArgs);
7933inline ObjCProtocolDecl **ObjCTypeParamType::getProtocolStorageImpl() {
7934 return reinterpret_cast<ObjCProtocolDecl**
>(
7935 static_cast<ObjCTypeParamType*
>(
this)+1);
7969 return T->getTypeClass() == ObjCInterface;
7985inline ObjCInterfaceDecl *ObjCObjectType::getInterface()
const {
7986 QualType baseType = getBaseType();
7988 if (
const auto *T = dyn_cast<ObjCInterfaceType>(ObjT))
7989 return T->getDecl();
7991 baseType = ObjT->getBaseType();
8006class ObjCObjectPointerType :
public Type,
public llvm::FoldingSetNode {
8013 PointeeType(Pointee) {}
8156 QualType getSuperClassType()
const;
8168 ID.AddPointer(T.getAsOpaquePtr());
8172 return T->getTypeClass() == ObjCObjectPointer;
8176class AtomicType :
public Type,
public llvm::FoldingSetNode {
8197 ID.AddPointer(T.getAsOpaquePtr());
8201 return T->getTypeClass() ==
Atomic;
8206class PipeType :
public Type,
public llvm::FoldingSetNode {
8214 ElementType(elemType), isRead(isRead) {}
8228 ID.AddPointer(T.getAsOpaquePtr());
8229 ID.AddBoolean(isRead);
8233 return T->getTypeClass() ==
Pipe;
8242 LLVM_PREFERRED_TYPE(
bool)
8243 unsigned IsUnsigned : 1;
8244 unsigned NumBits : 24;
8261 static void Profile(llvm::FoldingSetNodeID &ID,
bool IsUnsigned,
8263 ID.AddBoolean(IsUnsigned);
8264 ID.AddInteger(NumBits);
8272 llvm::PointerIntPair<Expr*, 1, bool> ExprAndUnsigned;
8280 Expr *getNumBitsExpr()
const;
8288 static void Profile(llvm::FoldingSetNodeID &ID,
const ASTContext &Context,
8289 bool IsUnsigned,
Expr *NumBitsExpr);
8292 return T->getTypeClass() == DependentBitInt;
8296class PredefinedSugarType final :
public Type {
8309 static StringRef getName(Kind KD);
8323 return T->getTypeClass() == PredefinedSugar;
8337 if (!
type.hasLocalNonFastQualifiers())
8338 return type.getTypePtrUnsafe();
8359class alignas(8) TypeSourceInfo {
8366 TypeSourceInfo(
QualType ty,
size_t DataSize);
8383 Ty->getLocallyUnqualifiedSingleStepDesugaredType().split();
8389 return getCommonPtr()->BaseType;
8393 return (
isNull() ?
nullptr : getCommonPtr()->BaseType);
8401 if (
Self.isObjectType() ||
Self.isReferenceType())
8404 return F->getMethodQuals().empty() && F->getRefQualifier() ==
RQ_None;
8414 const ExtQuals *eq = getExtQualsUnsafe();
8423 Quals = getExtQualsUnsafe()->getQualifiers();
8429 Qualifiers quals = getCommonPtr()->CanonicalType.getLocalQualifiers();
8435 unsigned cvr = getCommonPtr()->CanonicalType.getLocalCVRQualifiers();
8441 QualType canon = getCommonPtr()->CanonicalType;
8446 return getTypePtr()->isCanonicalUnqualified();
8454 if (T->isVariablyModifiedType() && T->hasSizedVLAType())
8463 getCommonPtr()->CanonicalType.isLocalConstQualified();
8468 getCommonPtr()->CanonicalType.isLocalRestrictQualified();
8474 getCommonPtr()->CanonicalType.isLocalVolatileQualified();
8479 getCommonPtr()->CanonicalType.hasLocalQualifiers();
8486 return QualType(getSplitUnqualifiedTypeImpl(*this).Ty, 0);
8493 return getSplitUnqualifiedTypeImpl(*
this);
8525 if (
const auto *FT = PT->getPointeeType()->getAs<
FunctionType>())
8526 return FT->getExtInfo();
8528 return FT->getExtInfo();
8575 return RefType->getPointeeType();
8666 return !T->getPointeeType()->isFunctionType();
8673 return Fn->hasCFIUncheckedCallee();
8694 return T->getPointeeType()->isFunctionType();
8701 return T->getPointeeType()->isFunctionType();
8712 return T->isMemberFunctionPointer();
8719 return T->isMemberDataPointer();
8779 if (
auto *CMT = dyn_cast<ConstantMatrixType>(CanonicalType))
8780 return CMT->getElementType()->isBooleanType();
8827 return OPT->isObjCQualifiedIdType();
8833 return OPT->isObjCQualifiedClassType();
8839 return OPT->isObjCIdType();
8845 return OPT->isObjCClassType();
8851 return OPT->getPointeeType()->isSpecificBuiltinType(BuiltinType::ObjCSel);
8863#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
8864 inline bool Type::is##Id##Type() const { \
8865 return isSpecificBuiltinType(BuiltinType::Id); \
8867#include "clang/Basic/OpenCLImageTypes.def"
8890#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) is##Id##Type() ||
8892#include "clang/Basic/OpenCLImageTypes.def"
8904#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
8905 inline bool Type::is##Id##Type() const { \
8906 return isSpecificBuiltinType(BuiltinType::Id); \
8908#include "clang/Basic/OpenCLExtensionTypes.def"
8911#define INTEL_SUBGROUP_AVC_TYPE(ExtType, Id) \
8912 isOCLIntelSubgroupAVC##Id##Type() ||
8914#include "clang/Basic/OpenCLExtensionTypes.def"
8919#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) is##Id##Type() ||
8921#include "clang/Basic/OpenCLExtensionTypes.def"
8930#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) \
8931 inline bool Type::is##Id##Type() const { \
8932 return isSpecificBuiltinType(BuiltinType::Id); \
8934#include "clang/Basic/HLSLIntangibleTypes.def"
8937#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) is##Id##Type() ||
8939#include "clang/Basic/HLSLIntangibleTypes.def"
8968 if (
const auto *BT = dyn_cast<BuiltinType>(
this))
8969 return BT->isPlaceholderType();
8974 if (
const auto *BT = dyn_cast<BuiltinType>(
this))
8975 if (BT->isPlaceholderType())
8986 if (
const auto *BT = dyn_cast<BuiltinType>(
this))
8987 return BT->isNonOverloadPlaceholderType();
9036 if (
const auto *BT = dyn_cast<BuiltinType>(CanonicalType))
9037 return BT->isInteger();
9038 if (
const EnumType *ET = dyn_cast<EnumType>(CanonicalType)) {
9045 if (
const auto *OT = dyn_cast<OverflowBehaviorType>(CanonicalType))
9046 return OT->getUnderlyingType()->isIntegerType();
9052 if (
const auto *BT = dyn_cast<BuiltinType>(CanonicalType)) {
9053 return BT->getKind() >= BuiltinType::ShortAccum &&
9054 BT->getKind() <= BuiltinType::SatULongFract;
9068 if (
const auto *BT = dyn_cast<BuiltinType>(CanonicalType)) {
9069 return BT->getKind() >= BuiltinType::SatShortAccum &&
9070 BT->getKind() <= BuiltinType::SatULongFract;
9080 if (
const auto *BT = dyn_cast<BuiltinType>(CanonicalType)) {
9081 return ((BT->getKind() >= BuiltinType::ShortAccum &&
9082 BT->getKind() <= BuiltinType::LongAccum) ||
9083 (BT->getKind() >= BuiltinType::ShortFract &&
9084 BT->getKind() <= BuiltinType::LongFract) ||
9085 (BT->getKind() >= BuiltinType::SatShortAccum &&
9086 BT->getKind() <= BuiltinType::SatLongAccum) ||
9087 (BT->getKind() >= BuiltinType::SatShortFract &&
9088 BT->getKind() <= BuiltinType::SatLongFract));
9098 if (
const auto *BT = dyn_cast<BuiltinType>(CanonicalType))
9099 return BT->getKind() > BuiltinType::Void &&
9100 BT->getKind() <= BuiltinType::NullPtr;
9101 if (
const EnumType *ET = dyn_cast<EnumType>(CanonicalType))
9114 if (
const auto *BT = dyn_cast<BuiltinType>(CanonicalType))
9115 return BT->isInteger();
9119 if (
const auto *ET = dyn_cast<EnumType>(CanonicalType))
9122 if (
const auto *OBT = dyn_cast<OverflowBehaviorType>(CanonicalType))
9123 return OBT->getUnderlyingType()->isIntegralOrEnumerationType();
9129 if (
const auto *BT = dyn_cast<BuiltinType>(CanonicalType))
9130 return BT->getKind() == BuiltinType::Bool;
9136 return DT && !DT->isDeduced();
9153 return TST->isTypeAlias();
9180 if (
type->isAnyPointerType())
9181 return type->getPointeeType().getTypePtr();
9182 else if (
type->isArrayType())
9183 return type->getBaseElementTypeUnsafe();
9208 PD.
AddTaggedVal(
reinterpret_cast<uint64_t
>(T.getAsOpaquePtr()),
9220 "ArrayType cannot be used with getAs!");
9223 if (
const auto *Ty = dyn_cast<T>(
this))
9227 if (!
isa<T>(CanonicalType))
9239 if (
const auto *Ty = dyn_cast<T>(
this))
9243 if (!
isa<T>(CanonicalType))
9248 const Type *Ty =
this;
9250 if (
const auto *A = dyn_cast<AttributedType>(Ty))
9251 Ty = A->getModifiedType().getTypePtr();
9252 else if (
const auto *A = dyn_cast<BTFTagAttributedType>(Ty))
9253 Ty = A->getWrappedType().getTypePtr();
9254 else if (
const auto *A = dyn_cast<HLSLAttributedResourceType>(Ty))
9255 Ty = A->getWrappedType().getTypePtr();
9256 else if (
const auto *P = dyn_cast<ParenType>(Ty))
9257 Ty = P->desugar().getTypePtr();
9258 else if (
const auto *A = dyn_cast<AdjustedType>(Ty))
9259 Ty = A->desugar().getTypePtr();
9260 else if (
const auto *M = dyn_cast<MacroQualifiedType>(Ty))
9261 Ty = M->desugar().getTypePtr();
9268 return dyn_cast<T>(Ty);
9273 if (
const auto *arr = dyn_cast<ArrayType>(
this))
9287 "ArrayType cannot be used with castAs!");
9289 if (
const auto *ty = dyn_cast<T>(
this))
return ty;
9290 assert(
isa<T>(CanonicalType));
9296 if (
const auto *arr = dyn_cast<ArrayType>(
this))
return arr;
9302 :
AdjustedType(Decayed, OriginalType, DecayedPtr, CanonicalPtr) {
9304 QualType Adjusted = getAdjustedType();
9305 (void)AttributedType::stripOuterNullability(Adjusted);
9312 (void)AttributedType::stripOuterNullability(Decayed);
9327 TypePtr = Pointee.getTypePtr();
9333 if (
const auto *FPT = TypePtr->
getAs<FunctionProtoType>())
9334 return FPT->getFunctionEffects();
Provides definitions for the various language-specific address spaces.
static bool isUnsigned(SValBuilder &SVB, NonLoc Value)
Defines the clang::attr::Kind enum.
Defines the Diagnostic-related interfaces.
static bool isBooleanType(QualType Ty)
llvm::dxil::ResourceClass ResourceClass
static std::optional< NonLoc > getIndex(ProgramStateRef State, const ElementRegion *ER, CharKind CK)
clang::CharUnits operator*(clang::CharUnits::QuantityType Scale, const clang::CharUnits &CU)
static void dump(llvm::raw_ostream &OS, StringRef FunctionName, ArrayRef< CounterExpression > Expressions, ArrayRef< CounterMappingRegion > Regions)
static Decl::Kind getKind(const Decl *D)
Defines the ExceptionSpecificationType enumeration and various utility functions.
static QualType getObjectType(APValue::LValueBase B)
Retrieves the "underlying object type" of the given expression, as used by __builtin_object_size.
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified.
Defines the clang::LangOptions interface.
llvm::MachO::Record Record
*collection of selector each with an associated kind and an ordered *collection of selectors A selector has a kind
llvm::raw_ostream & operator<<(llvm::raw_ostream &OS, const OMPTraitInfo &TI)
static StringRef getIdentifier(const Token &Tok)
Implements a partial diagnostic that can be emitted anwyhere in a DiagnosticBuilder stream.
static QualType getUnderlyingType(const SubRegion *R)
static bool hasAttr(const Decl *D, bool IgnoreImplicitAttr)
static RecordDecl * getAsRecordDecl(QualType BaseType, HeuristicResolver &Resolver)
static bool isRecordType(QualType T)
static bool isParameterPack(Expr *PackExpression)
Defines the clang::SourceLocation class and associated facilities.
Defines various enumerations that describe declaration and type specifiers.
static OMPAtomicDirective * Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc, ArrayRef< OMPClause * > Clauses, Stmt *AssociatedStmt, Expressions Exprs)
Creates directive with a list of Clauses and 'x', 'v' and 'expr' parts of the atomic construct (see S...
static bool classof(const Stmt *T)
static QualType getPointeeType(const MemRegion *R)
Defines the clang::Visibility enumeration and various utility functions.
__DEVICE__ void * memcpy(void *__a, const void *__b, size_t __c)
__device__ __2f16 float __ockl_bool s
__device__ __2f16 float c
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
Represents a type which was implicitly adjusted by the semantic engine for arbitrary reasons.
static bool classof(const Type *T)
static void Profile(llvm::FoldingSetNodeID &ID, QualType Orig, QualType New)
AdjustedType(TypeClass TC, QualType OriginalTy, QualType AdjustedTy, QualType CanonicalPtr)
QualType getAdjustedType() const
void Profile(llvm::FoldingSetNodeID &ID)
QualType getOriginalType() const
static bool classof(const Type *T)
Represents an array type, per C99 6.7.5.2 - Array Declarators.
ArraySizeModifier getSizeModifier() const
Qualifiers getIndexTypeQualifiers() const
static bool classof(const Type *T)
QualType getElementType() const
ArrayType(TypeClass tc, QualType et, QualType can, ArraySizeModifier sm, unsigned tq, const Expr *sz=nullptr)
unsigned getIndexTypeCVRQualifiers() const
static void Profile(llvm::FoldingSetNodeID &ID, QualType T)
QualType getValueType() const
Gets the type contained by this atomic type, i.e.
void Profile(llvm::FoldingSetNodeID &ID)
static bool classof(const Type *T)
Attr - This represents one attribute.
static bool classof(const Type *T)
BitIntType(bool isUnsigned, unsigned NumBits)
static void Profile(llvm::FoldingSetNodeID &ID, bool IsUnsigned, unsigned NumBits)
void Profile(llvm::FoldingSetNodeID &ID) const
unsigned getNumBits() const
void Profile(llvm::FoldingSetNodeID &ID)
QualType getPointeeType() const
static bool classof(const Type *T)
static void Profile(llvm::FoldingSetNodeID &ID, QualType Pointee)
[BoundsSafety] Represents a parent type class for CountAttributedType and similar sugar types that wi...
decl_iterator dependent_decl_begin() const
decl_iterator dependent_decl_end() const
unsigned getNumCoupledDecls() const
BoundsAttributedType(TypeClass TC, QualType Wrapped, QualType Canon)
const TypeCoupledDeclRefInfo * decl_iterator
decl_range dependent_decls() const
ArrayRef< TypeCoupledDeclRefInfo > getCoupledDecls() const
llvm::iterator_range< decl_iterator > decl_range
static bool classof(const Type *T)
ArrayRef< TypeCoupledDeclRefInfo > Decls
This class is used for builtin types like 'int'.
bool isPlaceholderType() const
Determines whether this type is a placeholder type, i.e.
bool isNonOverloadPlaceholderType() const
Determines whether this type is a placeholder type other than Overload.
bool isFloatingPoint() const
static bool classof(const Type *T)
bool isSignedInteger() const
bool isUnsignedInteger() const
static bool isPlaceholderTypeKind(Kind K)
Determines whether the given kind corresponds to a placeholder type.
StringRef getName(const PrintingPolicy &Policy) const
const char * getNameAsCString(const PrintingPolicy &Policy) const
Represents a C++ struct/union/class.
Complex values, per C99 6.2.5p11.
QualType getElementType() const
static void Profile(llvm::FoldingSetNodeID &ID, QualType Element)
static bool classof(const Type *T)
void Profile(llvm::FoldingSetNodeID &ID)
Declaration of a C++20 concept.
Represents the canonical version of C arrays with a specified constant size.
unsigned getSizeBitWidth() const
Return the bit width of the size type.
ConstantArrayType(TypeClass Tc, const ConstantArrayType *ATy, QualType Can)
uint64_t getLimitedSize() const
Return the size zero-extended to uint64_t or UINT64_MAX if the value is larger than UINT64_MAX.
bool isZeroSize() const
Return true if the size is zero.
int64_t getSExtSize() const
Return the size sign-extended as a uint64_t.
const Expr * getSizeExpr() const
Return a pointer to the size expression.
static bool classof(const Type *T)
llvm::APInt getSize() const
Return the constant array size as an APInt.
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Ctx)
uint64_t getZExtSize() const
Return the size zero-extended as a uint64_t.
unsigned getNumColumns() const
Returns the number of columns in the matrix.
static void Profile(llvm::FoldingSetNodeID &ID, QualType ElementType, unsigned NumRows, unsigned NumColumns, TypeClass TypeClass)
void Profile(llvm::FoldingSetNodeID &ID)
unsigned getRowMajorFlattenedIndex(unsigned Row, unsigned Column) const
Returns the row-major flattened index of a matrix element located at row Row, and column Column.
unsigned getNumRows() const
Returns the number of rows in the matrix.
unsigned getNumElementsFlattened() const
Returns the number of elements required to embed the matrix into a vector.
unsigned getFlattenedIndex(unsigned Row, unsigned Column, bool IsRowMajor=false) const
Returns the flattened index of a matrix element located at row Row, and column Column.
ConstantMatrixType(QualType MatrixElementType, unsigned NRows, unsigned NColumns, QualType CanonElementType)
unsigned mapColumnMajorToRowMajorFlattenedIndex(unsigned ColumnMajorIdx) const
Given a column-major flattened index ColumnMajorIdx, return the equivalent row-major flattened index.
unsigned mapRowMajorToColumnMajorFlattenedIndex(unsigned RowMajorIdx) const
Given a row-major flattened index RowMajorIdx, return the equivalent column-major flattened index.
unsigned getColumnMajorFlattenedIndex(unsigned Row, unsigned Column) const
Returns the column-major flattened index of a matrix element located at row Row, and column Column.
unsigned NumRows
Number of rows and columns.
static bool classof(const Type *T)
Represents a sugar type with __counted_by or __sized_by annotations, including their _or_null variant...
void Profile(llvm::FoldingSetNodeID &ID)
static bool classof(const Type *T)
bool isCountInBytes() const
Expr * getCountExpr() const
DynamicCountPointerKind getKind() const
QualType getPointeeType() const
static bool classof(const Type *T)
QualType getDecayedType() const
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
Decl - This represents one declaration (or definition), e.g.
Expr * getAddrSpaceExpr() const
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context)
QualType getPointeeType() const
static bool classof(const Type *T)
SourceLocation getAttributeLoc() const
Expr * getNumBitsExpr() const
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context)
DependentBitIntType(bool IsUnsigned, Expr *NumBits)
static bool classof(const Type *T)
friend class StmtIteratorBase
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context)
static bool classof(const Type *T)
Expr * getSizeExpr() const
Expr * getSizeExpr() const
static bool classof(const Type *T)
SourceLocation getAttributeLoc() const
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context)
QualType getElementType() const
Expr * getColumnExpr() const
Expr * getRowExpr() const
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context)
SourceLocation getAttributeLoc() const
static bool classof(const Type *T)
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context)
DependentTypeOfExprType(const ASTContext &Context, Expr *E, TypeOfKind Kind)
Expr * getSizeExpr() const
VectorKind getVectorKind() const
SourceLocation getAttributeLoc() const
QualType getElementType() const
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context)
static bool classof(const Type *T)
@ ak_addrspace
address space
Wrap a function effect's condition expression in another struct so that FunctionProtoType's TrailingO...
EffectConditionExpr(Expr *E)
Expr * getCondition() const
bool operator==(const EffectConditionExpr &RHS) const
EffectConditionExpr()=default
This represents one expression.
We can encode up to four bits in the low bits of a type pointer, but there are many more type qualifi...
Qualifiers::ObjCLifetime getObjCLifetime() const
static void Profile(llvm::FoldingSetNodeID &ID, const Type *BaseType, Qualifiers Quals)
void Profile(llvm::FoldingSetNodeID &ID) const
ExtQuals(const Type *baseType, QualType canon, Qualifiers quals)
bool hasObjCGCAttr() const
Qualifiers::GC getObjCGCAttr() const
bool hasAddressSpace() const
const Type * getBaseType() const
Qualifiers getQualifiers() const
LangAS getAddressSpace() const
bool hasObjCLifetime() const
bool isAccessorWithinNumElements(char c, bool isNumericAccessor) const
static int getNumericAccessorIdx(char c)
static bool classof(const Type *T)
static int getPointAccessorIdx(char c)
static int getAccessorIdx(char c, bool isNumericAccessor)
Represents a function declaration or definition.
Support iteration in parallel through a pair of FunctionEffect and EffectConditionExpr containers.
bool operator==(const FunctionEffectIterator &Other) const
bool operator!=(const FunctionEffectIterator &Other) const
FunctionEffectIterator operator++()
FunctionEffectIterator(const Container &O, size_t I)
FunctionEffectWithCondition operator*() const
A mutable set of FunctionEffect::Kind.
static FunctionEffectKindSet difference(FunctionEffectKindSet LHS, FunctionEffectKindSet RHS)
bool contains(const FunctionEffect::Kind EK) const
FunctionEffectKindSet()=default
FunctionEffectKindSet(FunctionEffectsRef FX)
void insert(FunctionEffectKindSet Set)
void insert(FunctionEffectsRef FX)
void insert(FunctionEffect Effect)
FunctionEffectSet(const FunctionEffectsRef &FX)
FunctionEffectSet()=default
FunctionEffectIterator< FunctionEffectSet > iterator
bool insert(const FunctionEffectWithCondition &NewEC, Conflicts &Errs)
SmallVector< Conflict > Conflicts
static FunctionEffectSet getIntersection(FunctionEffectsRef LHS, FunctionEffectsRef RHS)
static FunctionEffectSet getUnion(FunctionEffectsRef LHS, FunctionEffectsRef RHS, Conflicts &Errs)
Represents an abstract function effect, using just an enumeration describing its kind.
Kind kind() const
The kind of the effect.
unsigned Flags
Flags describing some behaviors of the effect.
static constexpr size_t KindCount
friend bool operator<(FunctionEffect LHS, FunctionEffect RHS)
friend bool operator==(FunctionEffect LHS, FunctionEffect RHS)
uint32_t toOpaqueInt32() const
For serialization.
@ FE_ExcludeStaticLocalVars
@ FE_ExcludeThreadLocalVars
@ FE_ExcludeObjCMessageSend
friend bool operator!=(FunctionEffect LHS, FunctionEffect RHS)
Kind
Identifies the particular effect.
Flags flags() const
Flags describing some behaviors of the effect.
StringRef name() const
The description printed in diagnostics, e.g. 'nonblocking'.
static FunctionEffect fromOpaqueInt32(uint32_t Value)
friend raw_ostream & operator<<(raw_ostream &OS, const FunctionEffect &Effect)
An immutable set of FunctionEffects and possibly conditions attached to them.
ArrayRef< FunctionEffect > effects() const
ArrayRef< EffectConditionExpr > conditions() const
static FunctionEffectsRef create(ArrayRef< FunctionEffect > FX, ArrayRef< EffectConditionExpr > Conds)
Asserts invariants.
FunctionEffectIterator< FunctionEffectsRef > iterator
FunctionEffectsRef()=default
friend bool operator==(const FunctionEffectsRef &LHS, const FunctionEffectsRef &RHS)
static FunctionEffectsRef get(QualType QT)
Extract the effects from a Type if it is a function, block, or member function pointer,...
friend bool operator!=(const FunctionEffectsRef &LHS, const FunctionEffectsRef &RHS)
static void Profile(llvm::FoldingSetNodeID &ID, QualType ResultType, ExtInfo Info)
static bool classof(const Type *T)
void Profile(llvm::FoldingSetNodeID &ID)
Represents a prototype with parameter type info, e.g.
param_type_iterator param_type_begin() const
unsigned getNumFunctionEffectConditions() const
ExtParameterInfo getExtParameterInfo(unsigned I) const
ArrayRef< EffectConditionExpr > getFunctionEffectConditions() const
ExceptionSpecificationType getExceptionSpecType() const
Get the kind of exception specification on this function.
ArrayRef< FunctionEffect > getFunctionEffectsWithoutConditions() const
bool isParamConsumed(unsigned I) const
exception_iterator exception_end() const
const ExtParameterInfo * getExtParameterInfosOrNull() const
Return a pointer to the beginning of the array of extra parameter information, if present,...
unsigned getNumParams() const
bool hasTrailingReturn() const
Whether this function prototype has a trailing return type.
ExceptionSpecInfo getExceptionSpecInfo() const
Return all the available information about this type's exception spec.
const QualType * param_type_iterator
Qualifiers getMethodQuals() const
const QualType * exception_iterator
static bool classof(const Type *T)
QualType getParamType(unsigned i) const
FunctionEffectsRef getFunctionEffects() const
unsigned getAArch64SMEAttributes() const
Return a bitmask describing the SME attributes on the function type, see AArch64SMETypeAttributes for...
QualType getExceptionType(unsigned i) const
Return the ith exception type, where 0 <= i < getNumExceptions().
static void Profile(llvm::FoldingSetNodeID &ID, QualType Result, param_type_iterator ArgTys, unsigned NumArgs, const ExtProtoInfo &EPI, const ASTContext &Context, bool Canonical)
SourceLocation getEllipsisLoc() const
unsigned getNumFunctionEffects() const
bool hasCFIUncheckedCallee() const
unsigned getNumExceptions() const
Return the number of types in the exception specification.
bool hasExceptionSpec() const
Return whether this function has any kind of exception spec.
CanThrowResult canThrow() const
Determine whether this function type has a non-throwing exception specification.
bool hasDynamicExceptionSpec() const
Return whether this function has a dynamic (throw) exception spec.
bool hasNoexceptExceptionSpec() const
Return whether this function has a noexcept exception spec.
bool isVariadic() const
Whether this function prototype is variadic.
ExtProtoInfo getExtProtoInfo() const
Expr * getNoexceptExpr() const
Return the expression inside noexcept(expression), or a null pointer if there is none (because the ex...
param_type_iterator param_type_end() const
FunctionDecl * getExceptionSpecTemplate() const
If this function type has an uninstantiated exception specification, this is the function whose excep...
FunctionTypeExtraAttributeInfo getExtraAttributeInfo() const
Return the extra attribute information.
bool isNothrow(bool ResultIfDependent=false) const
Determine whether this function type has a non-throwing exception specification.
ArrayRef< QualType > getParamTypes() const
ArrayRef< QualType > exceptions() const
ParameterABI getParameterABI(unsigned I) const
ArrayRef< QualType > param_types() const
exception_iterator exception_begin() const
ArrayRef< ExtParameterInfo > getExtParameterInfos() const
bool hasExtParameterInfos() const
Is there any interesting extra information for any of the parameters of this function type?
RefQualifierKind getRefQualifier() const
Retrieve the ref-qualifier associated with this function type.
FunctionDecl * getExceptionSpecDecl() const
If this function type has an exception specification which hasn't been determined yet (either because...
A class which abstracts out some details necessary for making a call.
ExtInfo withNoCfCheck(bool noCfCheck) const
ExtInfo withCallingConv(CallingConv cc) const
CallingConv getCC() const
ExtInfo withProducesResult(bool producesResult) const
ExtInfo(bool noReturn, bool hasRegParm, unsigned regParm, CallingConv cc, bool producesResult, bool noCallerSavedRegs, bool NoCfCheck, bool cmseNSCall)
bool getCmseNSCall() const
bool getNoCfCheck() const
unsigned getRegParm() const
void Profile(llvm::FoldingSetNodeID &ID) const
bool getNoCallerSavedRegs() const
ExtInfo withNoReturn(bool noReturn) const
bool getHasRegParm() const
friend class FunctionType
bool operator==(ExtInfo Other) const
bool getProducesResult() const
ExtInfo withNoCallerSavedRegs(bool noCallerSavedRegs) const
ExtInfo withCmseNSCall(bool cmseNSCall) const
ExtInfo withRegParm(unsigned RegParm) const
bool operator!=(ExtInfo Other) const
Interesting information about a specific parameter that can't simply be reflected in parameter's type...
friend bool operator==(ExtParameterInfo lhs, ExtParameterInfo rhs)
friend bool operator!=(ExtParameterInfo lhs, ExtParameterInfo rhs)
ExtParameterInfo()=default
bool hasPassObjectSize() const
ExtParameterInfo withHasPassObjectSize() const
unsigned char getOpaqueValue() const
bool isConsumed() const
Is this parameter considered "consumed" by Objective-C ARC?
ParameterABI getABI() const
Return the ABI treatment of this parameter.
ExtParameterInfo withIsConsumed(bool consumed) const
ExtParameterInfo withIsNoEscape(bool NoEscape) const
ExtParameterInfo withABI(ParameterABI kind) const
static ExtParameterInfo getFromOpaqueValue(unsigned char data)
FunctionType - C99 6.7.5.3 - Function Declarators.
ExtInfo getExtInfo() const
AArch64SMETypeAttributes
The AArch64 SME ACLE (Arm C/C++ Language Extensions) define a number of function type attributes that...
@ SME_PStateSMEnabledMask
@ SME_PStateSMCompatibleMask
@ SME_AgnosticZAStateShift
@ SME_AgnosticZAStateMask
static ArmStateValue getArmZT0State(unsigned AttrBits)
bool getNoReturnAttr() const
Determine whether this function type includes the GNU noreturn attribute.
static ArmStateValue getArmZAState(unsigned AttrBits)
unsigned getRegParmType() const
CallingConv getCallConv() const
QualType getReturnType() const
FunctionType(TypeClass tc, QualType res, QualType Canonical, TypeDependence Dependence, ExtInfo Info)
static bool classof(const Type *T)
bool getCmseNSCallAttr() const
bool getHasRegParm() const
Qualifiers getFastTypeQuals() const
QualType getCallResultType(const ASTContext &Context) const
Determine the type of an expression that calls a function of this type.
One of these records is kept for each identifier that is lexed.
void Profile(llvm::FoldingSetNodeID &ID)
static void Profile(llvm::FoldingSetNodeID &ID, QualType ET, ArraySizeModifier SizeMod, unsigned TypeQuals)
friend class StmtIteratorBase
static bool classof(const Type *T)
KeywordWrapper(ElaboratedTypeKeyword Keyword, As &&...as)
ElaboratedTypeKeyword getKeyword() const
static CannotCastToThisType classof(const T *)
static bool classof(const Type *T)
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
static bool classof(const Type *T)
QualType getUnderlyingType() const
const IdentifierInfo * getMacroIdentifier() const
static bool isValidElementType(QualType T, const LangOptions &LangOpts)
Valid elements types are the following:
QualType getElementType() const
Returns type of the elements being stored in the matrix.
MatrixType(QualType ElementTy, QualType CanonElementTy)
QualType ElementType
The element type of the matrix.
static bool classof(const Type *T)
NestedNameSpecifier getQualifier() const
void Profile(llvm::FoldingSetNodeID &ID)
QualType getPointeeType() const
bool isMemberFunctionPointer() const
Returns true if the member type (i.e.
bool isMemberDataPointer() const
Returns true if the member type (i.e.
static bool classof(const Type *T)
This represents a decl that may have a name.
Represents a C++ nested name specifier, such as "\::std::vector<int>::".
Represents an ObjC class declaration.
Represents typeof(type), a C23 feature and GCC extension, or `typeof_unqual(type),...
static bool classof(const Type *T)
Represents a pointer to an Objective C object.
unsigned getNumProtocols() const
Return the number of qualifying protocols on the object type.
bool isSpecialized() const
Whether this type is specialized, meaning that it has type arguments.
qual_iterator qual_end() const
bool isObjCQualifiedClassType() const
True if this is equivalent to 'Class.
static void Profile(llvm::FoldingSetNodeID &ID, QualType T)
bool isObjCQualifiedIdType() const
True if this is equivalent to 'id.
bool isSpecializedAsWritten() const
Whether this type is specialized, meaning that it has type arguments.
bool isUnspecializedAsWritten() const
Determine whether this object type is "unspecialized" as written, meaning that it has no type argumen...
ArrayRef< QualType > getTypeArgsAsWritten() const
Retrieve the type arguments for this type.
void Profile(llvm::FoldingSetNodeID &ID)
const ObjCObjectType * getObjectType() const
Gets the type pointed to by this ObjC pointer.
ObjCObjectType::qual_iterator qual_iterator
An iterator over the qualifiers on the object type.
llvm::iterator_range< qual_iterator > qual_range
static bool classof(const Type *T)
bool isUnspecialized() const
Whether this type is unspecialized, meaning that is has no type arguments.
bool isObjCIdType() const
True if this is equivalent to the 'id' type, i.e.
ObjCProtocolDecl * getProtocol(unsigned I) const
Retrieve a qualifying protocol by index on the object type.
QualType getPointeeType() const
Gets the type pointed to by this ObjC pointer.
ObjCInterfaceDecl * getInterfaceDecl() const
If this pointer points to an Objective @interface type, gets the declaration for that interface.
bool isObjCClassType() const
True if this is equivalent to the 'Class' type, i.e.
bool isObjCIdOrClassType() const
True if this is equivalent to the 'id' or 'Class' type,.
ArrayRef< QualType > getTypeArgs() const
Retrieve the type arguments for this type.
qual_iterator qual_begin() const
bool isKindOfType() const
Whether this is a "__kindof" type.
Represents an Objective-C protocol declaration.
void Profile(llvm::FoldingSetNodeID &ID)
static bool classof(const Type *T)
static void Profile(llvm::FoldingSetNodeID &ID, QualType Inner)
QualType getInnerType() const
static void Profile(llvm::FoldingSetNodeID &ID, QualType T, bool isRead)
QualType getElementType() const
void Profile(llvm::FoldingSetNodeID &ID)
static bool classof(const Type *T)
Pointer-authentication qualifiers.
static PointerAuthQualifier fromOpaqueValue(uint32_t Opaque)
friend bool operator==(PointerAuthQualifier Lhs, PointerAuthQualifier Rhs)
bool isIsaPointer() const
static PointerAuthQualifier Create(unsigned Key, bool IsAddressDiscriminated, unsigned ExtraDiscriminator, PointerAuthenticationMode AuthenticationMode, bool IsIsaPointer, bool AuthenticatesNullValues)
friend bool operator!=(PointerAuthQualifier Lhs, PointerAuthQualifier Rhs)
bool authenticatesNullValues() const
bool isEquivalent(PointerAuthQualifier Other) const
@ MaxDiscriminator
The maximum supported pointer-authentication discriminator.
@ MaxKey
The maximum supported pointer-authentication key.
void Profile(llvm::FoldingSetNodeID &ID) const
bool isAddressDiscriminated() const
PointerAuthQualifier withoutKeyNone() const
unsigned getExtraDiscriminator() const
void print(raw_ostream &OS, const PrintingPolicy &Policy) const
PointerAuthenticationMode getAuthenticationMode() const
bool isEmptyWhenPrinted(const PrintingPolicy &Policy) const
std::string getAsString() const
uint32_t getAsOpaqueValue() const
PointerAuthQualifier()=default
PointerType - C99 6.7.5.1 - Pointer Declarators.
QualType getPointeeType() const
static bool classof(const Type *T)
void Profile(llvm::FoldingSetNodeID &ID)
static void Profile(llvm::FoldingSetNodeID &ID, QualType Pointee)
static bool classof(const Type *T)
const IdentifierInfo * getIdentifier() const
StreamedQualTypeHelper(const QualType &T, const PrintingPolicy &Policy, const Twine &PlaceHolder, unsigned Indentation)
friend raw_ostream & operator<<(raw_ostream &OS, const StreamedQualTypeHelper &SQT)
A (possibly-)qualified type.
void addRestrict()
Add the restrict qualifier to this QualType.
QualType(const ExtQuals *Ptr, unsigned Quals)
bool hasAddressDiscriminatedPointerAuth() const
bool isLocalConstQualified() const
Determine whether this particular QualType instance has the "const" qualifier set,...
bool isLocalRestrictQualified() const
Determine whether this particular QualType instance has the "restrict" qualifier set,...
bool isVolatileQualified() const
Determine whether this type is volatile-qualified.
bool isRestrictQualified() const
Determine whether this type is restrict-qualified.
bool isTriviallyCopyableType(const ASTContext &Context) const
Return true if this is a trivially copyable type (C++0x [basic.types]p9)
QualType IgnoreParens() const
Returns the specified type after dropping any outer-level parentheses.
Qualifiers::GC getObjCGCAttr() const
Returns gc attribute of this type.
friend bool operator==(const QualType &LHS, const QualType &RHS)
Indicate whether the specified types and qualifiers are identical.
bool hasQualifiers() const
Determine whether this type has any qualifiers.
QualType withFastQualifiers(unsigned TQs) const
QualType withRestrict() const
bool hasNonTrivialToPrimitiveCopyCUnion() const
Check if this is or contains a C union that is non-trivial to copy, which is a union that has a membe...
PointerAuthQualifier getPointerAuth() const
void addFastQualifiers(unsigned TQs)
bool isWebAssemblyFuncrefType() const
Returns true if it is a WebAssembly Funcref Type.
QualType getNonLValueExprType(const ASTContext &Context) const
Determine the type of a (typically non-lvalue) expression with the specified result type.
@ DK_objc_strong_lifetime
PrimitiveDefaultInitializeKind
@ PDIK_ARCWeak
The type is an Objective-C retainable pointer type that is qualified with the ARC __weak qualifier.
@ PDIK_Trivial
The type does not fall into any of the following categories.
@ PDIK_ARCStrong
The type is an Objective-C retainable pointer type that is qualified with the ARC __strong qualifier.
@ PDIK_Struct
The type is a struct containing a field whose type is not PCK_Trivial.
bool mayBeDynamicClass() const
Returns true if it is a class and it might be dynamic.
bool hasLocalNonFastQualifiers() const
Determine whether this particular QualType instance has any "non-fast" qualifiers,...
bool isNonWeakInMRRWithObjCWeak(const ASTContext &Context) const
const IdentifierInfo * getBaseTypeIdentifier() const
Retrieves a pointer to the name of the base type.
bool isBitwiseCloneableType(const ASTContext &Context) const
Return true if the type is safe to bitwise copy using memcpy/memmove.
QualType withoutLocalFastQualifiers() const
void Profile(llvm::FoldingSetNodeID &ID) const
bool isAddressSpaceOverlapping(QualType T, const ASTContext &Ctx) const
Returns true if address space qualifiers overlap with T address space qualifiers.
QualType getDesugaredType(const ASTContext &Context) const
Return the specified type with any "sugar" removed from the type.
void removeLocalFastQualifiers(unsigned Mask)
QualType withConst() const
QualType getLocalUnqualifiedType() const
Return this type with all of the instance-specific qualifiers removed, but without removing any quali...
void addConst()
Add the const type qualifier to this QualType.
bool hasLocalQualifiers() const
Determine whether this particular QualType instance has any qualifiers, without looking through any t...
bool isTriviallyCopyConstructibleType(const ASTContext &Context) const
Return true if this is a trivially copyable type.
bool isTrivialType(const ASTContext &Context) const
Return true if this is a trivial type per (C++0x [basic.types]p9)
bool isNull() const
Return true if this QualType doesn't point to a type yet.
PrimitiveCopyKind isNonTrivialToPrimitiveCopy() const
Check if this is a non-trivial type that would cause a C struct transitively containing this type to ...
const Type * getTypePtr() const
Retrieves a pointer to the underlying (unqualified) type.
LangAS getAddressSpace() const
Return the address space of this type.
bool isConstant(const ASTContext &Ctx) const
static QualType getFromOpaquePtr(const void *Ptr)
QualType withVolatile() const
bool hasNonTrivialToPrimitiveDestructCUnion() const
Check if this is or contains a C union that is non-trivial to destruct, which is a union that has a m...
Qualifiers getQualifiers() const
Retrieve the set of qualifiers applied to this type.
const Type * operator->() const
void setLocalFastQualifiers(unsigned Quals)
bool isCXX98PODType(const ASTContext &Context) const
Return true if this is a POD type according to the rules of the C++98 standard, regardless of the cur...
Qualifiers::ObjCLifetime getObjCLifetime() const
Returns lifetime attribute of this type.
QualType stripObjCKindOfType(const ASTContext &ctx) const
Strip Objective-C "__kindof" types from the given type.
void print(raw_ostream &OS, const PrintingPolicy &Policy, const Twine &PlaceHolder=Twine(), unsigned Indentation=0) const
void getAsStringInternal(std::string &Str, const PrintingPolicy &Policy) const
bool isReferenceable() const
QualType getNonReferenceType() const
If Type is a reference type (e.g., const int&), returns the type that the reference refers to ("const...
QualType getCanonicalType() const
QualType getUnqualifiedType() const
Retrieve the unqualified variant of the given type, removing as little sugar as possible.
void removeLocalVolatile()
QualType substObjCMemberType(QualType objectType, const DeclContext *dc, ObjCSubstitutionContext context) const
Substitute type arguments from an object type for the Objective-C type parameters used in the subject...
bool isWebAssemblyReferenceType() const
Returns true if it is a WebAssembly Reference Type.
SplitQualType getSplitDesugaredType() const
std::optional< NonConstantStorageReason > isNonConstantStorage(const ASTContext &Ctx, bool ExcludeCtor, bool ExcludeDtor)
Determine whether instances of this type can be placed in immutable storage.
QualType withCVRQualifiers(unsigned CVR) const
bool isTrapType() const
Returns true if it is a OverflowBehaviorType of Trap kind.
unsigned getLocalCVRQualifiers() const
Retrieve the set of CVR (const-volatile-restrict) qualifiers local to this particular QualType instan...
SplitQualType split() const
Divides a QualType into its unqualified type and a set of local qualifiers.
bool UseExcessPrecision(const ASTContext &Ctx)
void addVolatile()
Add the volatile type qualifier to this QualType.
bool isCForbiddenLValueType() const
Determine whether expressions of the given type are forbidden from being lvalues in C.
PrimitiveDefaultInitializeKind isNonTrivialToPrimitiveDefaultInitialize() const
Functions to query basic properties of non-trivial C struct types.
bool isObjCGCStrong() const
true when Type is objc's strong.
std::string getAsString() const
void * getAsOpaquePtr() const
static void print(SplitQualType split, raw_ostream &OS, const PrintingPolicy &policy, const Twine &PlaceHolder, unsigned Indentation=0)
bool isMoreQualifiedThan(QualType Other, const ASTContext &Ctx) const
Determine whether this type is more qualified than the other given type, requiring exact equality for...
bool isCanonicalAsParam() const
void removeLocalRestrict()
bool isWebAssemblyExternrefType() const
Returns true if it is a WebAssembly Externref Type.
QualType(const Type *Ptr, unsigned Quals)
QualType getNonPackExpansionType() const
Remove an outer pack expansion type (if any) from this type.
SplitQualType getSplitUnqualifiedType() const
Retrieve the unqualified variant of the given type, removing as little sugar as possible.
bool isCXX11PODType(const ASTContext &Context) const
Return true if this is a POD type according to the more relaxed rules of the C++11 standard,...
bool mayBeNotDynamicClass() const
Returns true if it is not a class or if the class might not be dynamic.
bool isConstQualified() const
Determine whether this type is const-qualified.
bool hasAddressSpace() const
Check if this type has any address space qualifier.
bool isObjCGCWeak() const
true when Type is objc's weak.
QualType substObjCTypeArgs(ASTContext &ctx, ArrayRef< QualType > typeArgs, ObjCSubstitutionContext context) const
Substitute type arguments for the Objective-C type parameters used in the subject type.
unsigned getLocalFastQualifiers() const
void removeLocalFastQualifiers()
QualType getAtomicUnqualifiedType() const
Remove all qualifiers including _Atomic.
DestructionKind isDestructedType() const
Returns a nonzero value if objects of this type require non-trivial work to clean up after.
friend bool operator<(const QualType &LHS, const QualType &RHS)
friend bool operator!=(const QualType &LHS, const QualType &RHS)
StreamedQualTypeHelper stream(const PrintingPolicy &Policy, const Twine &PlaceHolder=Twine(), unsigned Indentation=0) const
bool isLocalVolatileQualified() const
Determine whether this particular QualType instance has the "volatile" qualifier set,...
bool isConstantStorage(const ASTContext &Ctx, bool ExcludeCtor, bool ExcludeDtor)
unsigned getCVRQualifiers() const
Retrieve the set of CVR (const-volatile-restrict) qualifiers applied to this type.
static void getAsStringInternal(SplitQualType split, std::string &out, const PrintingPolicy &policy)
QualType getSingleStepDesugaredType(const ASTContext &Context) const
Return the specified type with one level of "sugar" removed from the type.
const Type * getTypePtrOrNull() const
bool isWrapType() const
Returns true if it is a OverflowBehaviorType of Wrap kind.
static std::string getAsString(SplitQualType split, const PrintingPolicy &Policy)
bool hasNonTrivialObjCLifetime() const
bool isPODType(const ASTContext &Context) const
Determine whether this is a Plain Old Data (POD) type (C++ 3.9p10).
bool isAtLeastAsQualifiedAs(QualType Other, const ASTContext &Ctx) const
Determine whether this type is at least as qualified as the other given type, requiring exact equalit...
friend class QualifierCollector
bool hasStrongOrWeakObjCLifetime() const
PrimitiveCopyKind isNonTrivialToPrimitiveDestructiveMove() const
Check if this is a non-trivial type that would cause a C struct transitively containing this type to ...
QualType withExactLocalFastQualifiers(unsigned TQs) const
@ NonConstNonReferenceType
@ PCK_Struct
The type is a struct containing a field whose type is neither PCK_Trivial nor PCK_VolatileTrivial.
@ PCK_Trivial
The type does not fall into any of the following categories.
@ PCK_ARCStrong
The type is an Objective-C retainable pointer type that is qualified with the ARC __strong qualifier.
@ PCK_VolatileTrivial
The type would be trivial except that it is volatile-qualified.
@ PCK_PtrAuth
The type is an address-discriminated signed pointer type.
@ PCK_ARCWeak
The type is an Objective-C retainable pointer type that is qualified with the ARC __weak qualifier.
const Type & operator*() const
Qualifiers getLocalQualifiers() const
Retrieve the set of qualifiers local to this particular QualType instance, not including any qualifie...
bool hasNonTrivialToPrimitiveDefaultInitializeCUnion() const
Check if this is or contains a C union that is non-trivial to default-initialize, which is a union th...
const Type * strip(QualType type)
Collect any qualifiers on the given type and return an unqualified type.
QualifierCollector(Qualifiers Qs=Qualifiers())
QualifiersAndAtomic & operator+=(Qualifiers RHS)
QualifiersAndAtomic withVolatile()
QualifiersAndAtomic withAtomic()
QualifiersAndAtomic withConst()
QualifiersAndAtomic(Qualifiers Quals, bool HasAtomic)
QualifiersAndAtomic withRestrict()
The collection of all-type qualifiers we support.
unsigned getCVRQualifiers() const
void removeCVRQualifiers(unsigned mask)
friend Qualifiers operator-(Qualifiers L, Qualifiers R)
Compute the difference between two qualifier sets.
static Qualifiers fromFastMask(unsigned Mask)
void setFastQualifiers(unsigned mask)
void addAddressSpace(LangAS space)
static Qualifiers removeCommonQualifiers(Qualifiers &L, Qualifiers &R)
Returns the common set of qualifiers while removing them from the given sets.
bool hasOnlyConst() const
@ OCL_Strong
Assigning into this object requires the old value to be released and the new value to be retained.
@ OCL_ExplicitNone
This object can be modified without requiring retains or releases.
@ OCL_None
There is no lifetime qualification on this type.
@ OCL_Weak
Reading or writing from this object requires a barrier call.
@ OCL_Autoreleasing
Assigning into this object requires a lifetime extension.
void removeObjCLifetime()
bool hasTargetSpecificAddressSpace() const
bool isStrictSupersetOf(Qualifiers Other) const
Determine whether this set of qualifiers is a strict superset of another set of qualifiers,...
bool hasNonFastQualifiers() const
Return true if the set contains any qualifiers which require an ExtQuals node to be allocated.
void Profile(llvm::FoldingSetNodeID &ID) const
bool operator!=(Qualifiers Other) const
bool hasNonTrivialObjCLifetime() const
True if the lifetime is neither None or ExplicitNone.
void addCVRQualifiers(unsigned mask)
bool hasCVRQualifiers() const
void addConsistentQualifiers(Qualifiers qs)
Add the qualifiers from the given set to this set, given that they don't conflict.
void removeFastQualifiers(unsigned mask)
static bool isTargetAddressSpaceSupersetOf(LangAS A, LangAS B, const ASTContext &Ctx)
Qualifiers & operator+=(Qualifiers R)
void removeFastQualifiers()
bool hasQualifiers() const
Return true if the set contains any qualifiers.
void removeCVRQualifiers()
Qualifiers withVolatile() const
void addCVRUQualifiers(unsigned mask)
Qualifiers & operator-=(Qualifiers R)
bool compatiblyIncludes(Qualifiers other, const ASTContext &Ctx) const
Determines if these qualifiers compatibly include another set.
bool hasUnaligned() const
unsigned getAddressSpaceAttributePrintValue() const
Get the address space attribute value to be printed by diagnostics.
bool hasAddressSpace() const
static bool isAddressSpaceSupersetOf(LangAS A, LangAS B, const ASTContext &Ctx)
Returns true if address space A is equal to or a superset of B.
Qualifiers withoutAddressSpace() const
unsigned getFastQualifiers() const
void print(raw_ostream &OS, const PrintingPolicy &Policy, bool appendSpaceIfNonEmpty=false) const
void removeAddressSpace()
void addQualifiers(Qualifiers Q)
Add the qualifiers from the given set to this set.
static Qualifiers fromCVRMask(unsigned CVR)
void setAddressSpace(LangAS space)
unsigned getCVRUQualifiers() const
bool isEmptyWhenPrinted(const PrintingPolicy &Policy) const
PointerAuthQualifier getPointerAuth() const
void setObjCGCAttr(GC type)
Qualifiers withConst() const
bool hasObjCGCAttr() const
uint64_t getAsOpaqueValue() const
void setCVRQualifiers(unsigned mask)
bool hasObjCLifetime() const
ObjCLifetime getObjCLifetime() const
Qualifiers withoutObjCLifetime() const
Qualifiers withoutObjCGCAttr() const
static Qualifiers fromCVRUMask(unsigned CVRU)
friend Qualifiers operator+(Qualifiers L, Qualifiers R)
void setUnaligned(bool flag)
void addFastQualifiers(unsigned mask)
std::string getAsString() const
Qualifiers withRestrict() const
void addPointerAuth(PointerAuthQualifier Q)
void addObjCGCAttr(GC type)
bool hasPointerAuth() const
bool operator==(Qualifiers Other) const
void removeQualifiers(Qualifiers Q)
Remove the qualifiers from the given set from this set.
LangAS getAddressSpace() const
bool hasOnlyVolatile() const
void setPointerAuth(PointerAuthQualifier Q)
bool compatiblyIncludesObjCLifetime(Qualifiers other) const
Determines if these qualifiers compatibly include another set of qualifiers from the narrow perspecti...
Qualifiers getNonFastQualifiers() const
static Qualifiers fromOpaqueValue(uint64_t opaque)
bool hasStrongOrWeakObjCLifetime() const
True if the lifetime is either strong or weak.
static std::string getAddrSpaceAsString(LangAS AS)
@ FastWidth
The width of the "fast" qualifier mask.
@ MaxAddressSpace
The maximum supported address space number.
@ FastMask
The fast qualifier mask.
bool hasFastQualifiers() const
bool hasOnlyRestrict() const
bool isAddressSpaceSupersetOf(Qualifiers other, const ASTContext &Ctx) const
Returns true if the address space in these qualifiers is equal to or a superset of the address space ...
void addObjCLifetime(ObjCLifetime type)
void setObjCLifetime(ObjCLifetime type)
static bool classof(const Type *T)
Represents a struct/union/class.
Base for LValueReferenceType and RValueReferenceType.
QualType getPointeeType() const
ReferenceType(TypeClass tc, QualType Referencee, QualType CanonicalRef, bool SpelledAsLValue)
static bool classof(const Type *T)
QualType getPointeeTypeAsWritten() const
bool isSpelledAsLValue() const
void Profile(llvm::FoldingSetNodeID &ID)
static void Profile(llvm::FoldingSetNodeID &ID, QualType Referencee, bool SpelledAsLValue)
Encodes a location in the source.
Stmt - This represents one statement.
The streaming interface shared between DiagnosticBuilder and PartialDiagnostic.
void AddTaggedVal(uint64_t V, DiagnosticsEngine::ArgumentKind Kind) const
Represents the declaration of a struct/union/class/enum.
Stores a list of template parameters for a TemplateDecl and its derived classes.
[BoundsSafety] Represents information of declarations referenced by the arguments of the counted_by a...
TypeCoupledDeclRefInfo(ValueDecl *D=nullptr, bool Deref=false)
D is to a declaration referenced by the argument of attribute.
llvm::PointerIntPair< ValueDecl *, 1, unsigned > BaseTy
Base wrapper for a particular "section" of type source info.
static bool classof(const Type *T)
TypeOfKind getKind() const
Returns the kind of 'typeof' type this is.
TypeOfExprType(const ASTContext &Context, Expr *E, TypeOfKind Kind, QualType Can=QualType())
Expr * getUnderlyingExpr() const
QualType getType() const
Return the type wrapped by this type source info.
void overrideType(QualType T)
Override the type stored in this TypeSourceInfo. Use with caution!
TypeWithKeyword(ElaboratedTypeKeyword Keyword, TypeClass tc, QualType Canonical, TypeDependence Dependence)
friend class AttributedType
friend class ConstantArrayType
friend class CountAttributedType
FunctionTypeBitfields store various bits belonging to FunctionProtoType.
friend class FunctionProtoType
friend class FunctionType
friend class KeywordWrapper
friend class ObjCObjectType
friend class PackExpansionType
friend class PredefinedSugarType
friend class ReferenceType
friend class SubstTemplateTypeParmPackType
friend class SubstPackType
friend class SubstTemplateTypeParmType
friend class TemplateSpecializationType
friend class TemplateTypeParmType
friend class TypeOfExprType
friend class UnresolvedUsingType
friend class DependentVectorType
The base class of the type hierarchy.
bool isIncompleteOrObjectType() const
Return true if this is an incomplete or object type, in other words, not a function type.
bool isDecltypeType() const
bool isDependentSizedArrayType() const
bool isFixedPointOrIntegerType() const
Return true if this is a fixed point or integer type.
bool isBlockPointerType() const
TypedefBitfields TypedefBits
bool isBooleanType() const
bool isFunctionReferenceType() const
bool isSignableType(const ASTContext &Ctx) const
Type(const Type &)=delete
bool isObjCBuiltinType() const
const TemplateSpecializationType * getAsNonAliasTemplateSpecializationType() const
Look through sugar for an instance of TemplateSpecializationType which is not a type alias,...
bool isMFloat8Type() const
const Type * getPointeeOrArrayElementType() const
If this is a pointer type, return the pointee type.
bool isIncompleteArrayType() const
bool isPlaceholderType() const
Test for a type which does not represent an actual type-system type but is instead used as a placehol...
bool isFloat16Type() const
ReferenceTypeBitfields ReferenceTypeBits
bool isSignablePointerType() const
ArrayTypeBitfields ArrayTypeBits
const ArrayType * castAsArrayTypeUnsafe() const
A variant of castAs<> for array type which silently discards qualifiers from the outermost type.
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.
AutoTypeBitfields AutoTypeBits
bool isCFIUncheckedCalleeFunctionType() const
Type & operator=(Type &&)=delete
Base class for declarations which introduce a typedef-name.
TypedefNameDecl * getDecl() const
NestedNameSpecifier getQualifier() const
static void Profile(llvm::FoldingSetNodeID &ID, ElaboratedTypeKeyword Keyword, NestedNameSpecifier Qualifier, const TypedefNameDecl *Decl, QualType Underlying)
static bool classof(const Type *T)
bool typeMatchesDecl() const
void Profile(llvm::FoldingSetNodeID &ID) const
void Profile(llvm::FoldingSetNodeID &ID) const
NestedNameSpecifier getQualifier() const
UnresolvedUsingTypenameDecl * getDecl() const
static void Profile(llvm::FoldingSetNodeID &ID, ElaboratedTypeKeyword Keyword, NestedNameSpecifier Qualifier, const UnresolvedUsingTypenameDecl *D)
static bool classof(const Type *T)
Represents a dependent using declaration which was marked with typename.
Represents a shadow declaration implicitly introduced into a scope by a (resolved) using-declaration ...
UsingShadowDecl * getDecl() const
void Profile(llvm::FoldingSetNodeID &ID) const
NestedNameSpecifier getQualifier() const
static void Profile(llvm::FoldingSetNodeID &ID, ElaboratedTypeKeyword Keyword, NestedNameSpecifier Qualifier, const UsingShadowDecl *D, QualType UnderlyingType)
static bool classof(const Type *T)
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
static bool classof(const Type *T)
friend class StmtIteratorBase
void Profile(llvm::FoldingSetNodeID &ID)
Expr * getSizeExpr() const
unsigned getNumElements() const
VectorType(QualType vecType, unsigned nElements, QualType canonType, VectorKind vecKind)
void Profile(llvm::FoldingSetNodeID &ID)
static void Profile(llvm::FoldingSetNodeID &ID, QualType ElementType, unsigned NumElements, TypeClass TypeClass, VectorKind VecKind)
VectorKind getVectorKind() const
QualType ElementType
The element type of the vector.
QualType getElementType() const
static bool classof(const Type *T)
Defines the Linkage enumeration and various utility functions.
mlir::Type getBaseType(mlir::Value varPtr)
@ AttributedType
The l-value was considered opaque, so the alignment was determined from a type, but that type was an ...
bool operator!=(const CommonEntityInfo &LHS, const CommonEntityInfo &RHS)
const internal::VariadicAllOfMatcher< Type > type
Matches Types in the clang AST.
const AstTypeMatcher< ArrayType > arrayType
const internal::VariadicAllOfMatcher< Decl > decl
Matches declarations.
uint32_t Literal
Literals are represented as positive integers.
std::variant< struct RequiresDecl, struct HeaderDecl, struct UmbrellaDirDecl, struct ModuleDecl, struct ExcludeDecl, struct ExportDecl, struct ExportAsDecl, struct ExternModuleDecl, struct UseDecl, struct LinkDecl, struct ConfigMacrosDecl, struct ConflictDecl > Decl
All declarations that can appear in a module declaration.
bool operator==(const ValueType &a, const ValueType &b)
bool isLiteral(TokenKind K)
Return true if this is a "literal" kind, like a numeric constant, string, etc.
The JSON file list parser is used to communicate input to InstallAPI.
CanQual< Type > CanQualType
Represents a canonical, potentially-qualified type.
@ Overload
This is a legitimate overload: the existing declarations are functions or function templates with dif...
bool isa(CodeGen::Address addr)
AutoTypeKeyword
Which keyword(s) were used to create an AutoType.
@ GNUAutoType
__auto_type (GNU extension)
@ DecltypeAuto
decltype(auto)
bool isTargetAddressSpace(LangAS AS)
CanThrowResult
Possible results from evaluation of a noexcept expression.
FunctionType::ExtInfo getFunctionExtInfo(const Type &t)
bool isDynamicExceptionSpec(ExceptionSpecificationType ESpecType)
TypeDependenceScope::TypeDependence TypeDependence
void initialize(TemplateInstantiationCallbackPtrs &Callbacks, const Sema &TheSema)
@ Nullable
Values of this type can be null.
RefQualifierKind
The kind of C++11 ref-qualifier associated with a function type.
@ RQ_None
No ref-qualifier was provided.
@ RQ_LValue
An lvalue ref-qualifier was provided (&).
@ RQ_RValue
An rvalue ref-qualifier was provided (&&).
@ TemplateName
The identifier is a template name. FIXME: Add an annotation for that.
bool IsEnumDeclComplete(EnumDecl *ED)
Check if the given decl is complete.
ExprDependence computeDependence(FullExpr *E)
@ Vector
'vector' clause, allowed on 'loop', Combined, and 'routine' directives.
@ Self
'self' clause, allowed on Compute and Combined Constructs, plus 'update'.
TypeOfKind
The kind of 'typeof' expression we're after.
bool operator==(const CallGraphNode::CallRecord &LHS, const CallGraphNode::CallRecord &RHS)
nullptr
This class represents a compute construct, representing a 'Kind' of ‘parallel’, 'serial',...
TypeDependence toTypeDependence(ExprDependence D)
@ Dependent
Parse the block as a dependent block, which may be used in some template instantiations but not other...
unsigned toTargetAddressSpace(LangAS AS)
Linkage
Describes the different kinds of linkage (C++ [basic.link], C99 6.2.2) that an entity may have.
ObjCSubstitutionContext
The kind of type we are substituting Objective-C type arguments into.
@ Superclass
The superclass of a type.
@ Property
The type of a property.
@ Parameter
The parameter type of a method or function.
@ Result
The result type of a method or function.
ArraySizeModifier
Capture whether this is a normal array (e.g.
ParameterABI
Kinds of parameter ABI.
@ Ordinary
This parameter uses ordinary ABI rules for its type.
bool isComputedNoexcept(ExceptionSpecificationType ESpecType)
@ Template
We are parsing a template declaration.
bool isNoexceptExceptionSpec(ExceptionSpecificationType ESpecType)
TagTypeKind
The kind of a tag type.
constexpr unsigned PointerAuthKeyNone
bool IsEnumDeclScoped(EnumDecl *ED)
Check if the given decl is scoped.
std::is_base_of< ArrayType, T > TypeIsArrayType
@ Keyword
The name has been typo-corrected to a keyword.
LangAS
Defines the address space values used by the address space qualifier of QualType.
void FixedPointValueToString(SmallVectorImpl< char > &Str, llvm::APSInt Val, unsigned Scale)
bool operator!=(CanQual< T > x, CanQual< U > y)
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.
@ Other
Other implicit parameter.
ExceptionSpecificationType
The various types of exception specifications that exist in C++11.
@ EST_DependentNoexcept
noexcept(expression), value-dependent
@ EST_Uninstantiated
not instantiated yet
@ EST_Unparsed
not parsed yet
@ EST_NoThrow
Microsoft __declspec(nothrow) extension.
@ EST_None
no exception specification
@ EST_MSAny
Microsoft throw(...) extension.
@ EST_BasicNoexcept
noexcept
@ EST_NoexceptFalse
noexcept(expression), evals to 'false'
@ EST_Unevaluated
not evaluated yet, for special member function
@ EST_NoexceptTrue
noexcept(expression), evals to 'true'
@ EST_Dynamic
throw(T1, T2)
Visibility
Describes the different kinds of visibility that a declaration may have.
Diagnostic wrappers for TextAPI types for error reporting.
__UINTPTR_TYPE__ uintptr_t
An unsigned integer type with the property that any valid pointer to void can be converted to this ty...
void Profile(llvm::FoldingSetNodeID &ID)
const T * getType() const
FunctionEffectWithCondition Rejected
FunctionEffectWithCondition Kept
A FunctionEffect plus a potential boolean expression determining whether the effect is declared (e....
FunctionEffectWithCondition(FunctionEffect E, const EffectConditionExpr &C)
Holds information about the various types of exception specification.
FunctionDecl * SourceDecl
The function whose exception specification this is, for EST_Unevaluated and EST_Uninstantiated.
ExceptionSpecInfo(ExceptionSpecificationType EST)
FunctionDecl * SourceTemplate
The function template whose exception specification this is instantiated from, for EST_Uninstantiated...
ExceptionSpecificationType Type
The kind of exception specification this is.
ArrayRef< QualType > Exceptions
Explicitly-specified list of exception types.
Expr * NoexceptExpr
Noexcept expression, if this is a computed noexcept specification.
ExceptionSpecInfo()=default
Extra information about a function prototype.
ExceptionSpecInfo ExceptionSpec
FunctionTypeExtraAttributeInfo ExtraAttributeInfo
bool requiresFunctionProtoTypeArmAttributes() const
unsigned AArch64SMEAttributes
SourceLocation EllipsisLoc
FunctionEffectsRef FunctionEffects
unsigned CFIUncheckedCallee
const ExtParameterInfo * ExtParameterInfos
RefQualifierKind RefQualifier
bool requiresFunctionProtoTypeExtraAttributeInfo() const
ExtProtoInfo withCFIUncheckedCallee(bool CFIUncheckedCallee)
ExtProtoInfo(CallingConv CC)
unsigned HasTrailingReturn
bool requiresFunctionProtoTypeExtraBitfields() const
void setArmSMEAttribute(AArch64SMETypeAttributes Kind, bool Enable=true)
ExtProtoInfo withExceptionSpec(const ExceptionSpecInfo &ESI)
FunctionType::ExtInfo ExtInfo
A simple holder for a QualType representing a type in an exception specification.
FunctionTypeArmAttributes()
unsigned AArch64SMEAttributes
Any AArch64 SME ACLE type attributes that need to be propagated on declarations and function pointers...
Provides a few static helpers for converting and printing elaborated type keyword and tag type kind e...
static StringRef getTagTypeKindName(TagTypeKind Kind)
static StringRef getKeywordName(ElaboratedTypeKeyword Keyword)
static ElaboratedTypeKeyword getKeywordForTagTypeKind(TagTypeKind Tag)
Converts a TagTypeKind into an elaborated type keyword.
static TagTypeKind getTagTypeKindForKeyword(ElaboratedTypeKeyword Keyword)
Converts an elaborated type keyword into a TagTypeKind.
static TagTypeKind getTagTypeKindForTypeSpec(unsigned TypeSpec)
Converts a type specifier (DeclSpec::TST) into a tag type kind.
static bool KeywordIsTagTypeKind(ElaboratedTypeKeyword Keyword)
static ElaboratedTypeKeyword getKeywordForTypeSpec(unsigned TypeSpec)
Converts a type specifier (DeclSpec::TST) into an elaborated type keyword.
Describes how types, statements, expressions, and declarations should be printed.
A std::pair-like structure for storing a qualified type split into its local qualifiers and its local...
SplitQualType(const Type *ty, Qualifiers qs)
SplitQualType getSingleStepDesugaredType() const
friend bool operator==(SplitQualType a, SplitQualType b)
const Type * Ty
The locally-unqualified type.
friend bool operator!=(SplitQualType a, SplitQualType b)
std::pair< const Type *, Qualifiers > asPair() const
Qualifiers Quals
The local qualifiers.
static inline ::clang::ExtQuals * getFromVoidPointer(void *P)
static void * getAsVoidPointer(::clang::ExtQuals *P)
static constexpr int NumLowBitsAvailable
static void * getAsVoidPointer(::clang::Type *P)
static constexpr int NumLowBitsAvailable
static inline ::clang::Type * getFromVoidPointer(void *P)
static void * getAsVoidPointer(clang::QualType P)
static clang::QualType getFromVoidPointer(void *P)
static constexpr int NumLowBitsAvailable
static SimpleType getSimplifiedValue(::clang::QualType Val)
const ::clang::Type * SimpleType