41#include "llvm/ADT/APInt.h"
42#include "llvm/ADT/APSInt.h"
43#include "llvm/ADT/ArrayRef.h"
44#include "llvm/ADT/FoldingSet.h"
45#include "llvm/ADT/STLExtras.h"
46#include "llvm/ADT/SmallVector.h"
47#include "llvm/Support/ErrorHandling.h"
48#include "llvm/Support/MathExtras.h"
58 return (*
this !=
Other) &&
125 if (ToRegion == FromRegion)
197 if (
const auto *DNT = ty->
getAs<DependentNameType>())
201 if (
const auto *TT = ty->
getAs<TagType>())
219 switch (
T->getTypeClass()) {
225 case Type::BlockPointer:
228 case Type::MemberPointer:
231 case Type::LValueReference:
232 case Type::RValueReference:
235 case Type::PackExpansion:
239 case Type::ConstantArray:
240 case Type::DependentSizedArray:
241 case Type::IncompleteArray:
242 case Type::VariableArray:
243 case Type::FunctionProto:
244 case Type::FunctionNoProto:
261 if (
T.isConstQualified())
265 return AT->getElementType().isConstant(Ctx);
270std::optional<QualType::NonConstantStorageReason>
273 if (!
isConstant(Ctx) && !(*this)->isReferenceType())
281 if (
Record->hasMutableFields())
283 if (!
Record->hasTrivialDestructor() && !ExcludeDtor)
309 (tc == DependentSizedArray
314 "only CVR index qualifiers are stored");
321 const llvm::APInt &Sz,
const Expr *SzExpr,
323 bool NeedsExternalSize = SzExpr !=
nullptr || Sz.ugt(0x0FFFFFFFFFFFFFFF) ||
324 Sz.getBitWidth() > 0xFF;
325 if (!NeedsExternalSize)
327 ET, Can, Sz.getBitWidth(), Sz.getZExtValue(), SzMod, Qual);
329 auto *SzPtr =
new (Ctx,
alignof(ConstantArrayType::ExternalSize))
330 ConstantArrayType::ExternalSize(Sz, SzExpr);
338 const llvm::APInt &NumElements) {
339 uint64_t ElementSize = Context.getTypeSizeInChars(ElementType).getQuantity();
347 if (llvm::isPowerOf2_64(ElementSize)) {
348 return NumElements.getActiveBits() + llvm::Log2_64(ElementSize);
353 if ((ElementSize >> 32) == 0 && NumElements.getBitWidth() <= 64 &&
354 (NumElements.getZExtValue() >> 32) == 0) {
355 uint64_t TotalSize = NumElements.getZExtValue() * ElementSize;
356 return llvm::bit_width(TotalSize);
360 llvm::APSInt SizeExtended(NumElements,
true);
361 unsigned SizeTypeBits = Context.getTypeSize(Context.getSizeType());
362 SizeExtended = SizeExtended.extend(
363 std::max(SizeTypeBits, SizeExtended.getBitWidth()) * 2);
365 llvm::APSInt TotalSize(llvm::APInt(SizeExtended.getBitWidth(), ElementSize));
366 TotalSize *= SizeExtended;
368 return TotalSize.getActiveBits();
377 unsigned Bits = Context.getTypeSize(Context.getSizeType());
390 uint64_t ArraySize,
const Expr *SizeExpr,
393 ID.AddInteger(ArraySize);
394 ID.AddInteger(llvm::to_underlying(SizeMod));
395 ID.AddInteger(TypeQuals);
396 ID.AddBoolean(SizeExpr !=
nullptr);
398 SizeExpr->
Profile(ID, Context,
true);
410 :
ArrayType(DependentSizedArray, et, can, sm, tq, e), SizeExpr((
Stmt *)e) {}
415 unsigned TypeQuals,
Expr *E) {
417 ID.AddInteger(llvm::to_underlying(SizeMod));
418 ID.AddInteger(TypeQuals);
423DependentVectorType::DependentVectorType(
QualType ElementType,
426 :
Type(DependentVector, CanonType,
428 ElementType->getDependence() |
431 ElementType(ElementType), SizeExpr(SizeExpr), Loc(Loc) {
439 ID.AddPointer(ElementType.getAsOpaquePtr());
440 ID.AddInteger(llvm::to_underlying(VecKind));
441 SizeExpr->Profile(ID, Context,
true);
444DependentSizedExtVectorType::DependentSizedExtVectorType(
QualType ElementType,
448 :
Type(DependentSizedExtVector, can,
450 ElementType->getDependence() |
453 SizeExpr(SizeExpr), ElementType(ElementType), loc(loc) {}
459 ID.AddPointer(ElementType.getAsOpaquePtr());
460 SizeExpr->Profile(ID, Context,
true);
463DependentAddressSpaceType::DependentAddressSpaceType(
QualType PointeeType,
467 :
Type(DependentAddressSpace, can,
469 PointeeType->getDependence() |
472 AddrSpaceExpr(AddrSpaceExpr), PointeeType(PointeeType), loc(loc) {}
477 Expr *AddrSpaceExpr) {
478 ID.AddPointer(PointeeType.getAsOpaquePtr());
479 AddrSpaceExpr->Profile(ID, Context,
true);
483 const Expr *RowExpr,
const Expr *ColumnExpr)
484 :
Type(tc, canonType,
498 ElementType(matrixType) {}
501 unsigned nColumns,
QualType canonType,
502 std::optional<LayoutKind>
Layout)
507 unsigned nRows,
unsigned nColumns,
509 std::optional<LayoutKind>
Layout)
513DependentSizedMatrixType::DependentSizedMatrixType(
QualType ElementType,
518 :
MatrixType(DependentSizedMatrix, ElementType, CanonicalType, RowExpr,
520 RowExpr(RowExpr), ColumnExpr(ColumnExpr), loc(loc) {}
526 ID.AddPointer(ElementType.getAsOpaquePtr());
527 RowExpr->Profile(ID, CTX,
true);
528 ColumnExpr->Profile(ID, CTX,
true);
555 ExprAndUnsigned(NumBitsExpr, IsUnsigned) {}
558 return ExprAndUnsigned.getInt();
562 return ExprAndUnsigned.getPointer();
568 ID.AddBoolean(IsUnsigned);
569 NumBitsExpr->
Profile(ID, Context,
true);
581 bool CountInBytes,
bool OrNull) {
582 ID.AddPointer(WrappedTy.getAsOpaquePtr());
583 ID.AddBoolean(CountInBytes);
584 ID.AddBoolean(OrNull);
589 ID.AddPointer(CountExpr);
597 if (
const auto *ATy = dyn_cast<ArrayType>(
this))
598 return ATy->getElementType().getTypePtr();
626 return Context.getQualifiedType(desugar,
split.
Quals);
632#define TYPE(CLASS, BASE) \
633 static_assert(!std::is_polymorphic<CLASS##Type>::value, \
634 #CLASS "Type should not be polymorphic!");
635#include "clang/AST/TypeNodes.inc"
640#define TYPE(CLASS, BASE) \
641 static_assert(std::is_trivially_destructible<CLASS##Type>::value, \
642 #CLASS "Type should be trivially destructible!");
643#include "clang/AST/TypeNodes.inc"
647#define ABSTRACT_TYPE(Class, Parent)
648#define TYPE(Class, Parent) \
649 case Type::Class: { \
650 const auto *ty = cast<Class##Type>(this); \
651 if (!ty->isSugared()) \
652 return QualType(ty, 0); \
653 return ty->desugar(); \
655#include "clang/AST/TypeNodes.inc"
657 llvm_unreachable(
"bad type kind!");
667#define ABSTRACT_TYPE(Class, Parent)
668#define TYPE(Class, Parent) \
669 case Type::Class: { \
670 const auto *Ty = cast<Class##Type>(CurTy); \
671 if (!Ty->isSugared()) \
672 return SplitQualType(Ty, Qs); \
673 Cur = Ty->desugar(); \
676#include "clang/AST/TypeNodes.inc"
685 Qualifiers quals =
split.Quals;
688 const Type *lastTypeWithQuals =
split.Ty;
695 switch (
split.Ty->getTypeClass()) {
696#define ABSTRACT_TYPE(Class, Parent)
697#define TYPE(Class, Parent) \
698 case Type::Class: { \
699 const auto *ty = cast<Class##Type>(split.Ty); \
700 if (!ty->isSugared()) \
702 next = ty->desugar(); \
705#include "clang/AST/TypeNodes.inc"
711 if (!
split.Quals.empty()) {
712 lastTypeWithQuals =
split.Ty;
721 if (
const auto *OBT = dyn_cast<OverflowBehaviorType>(
split.Ty)) {
722 SplitQualType SplitOBT = OBT->getSplitUnqualifiedType();
724 return SplitQualType(SplitOBT.
Ty, quals);
727 return SplitQualType(lastTypeWithQuals, quals);
732 while (
const auto *PT =
T->
getAs<ParenType>())
733 T = PT->getInnerType();
742 if (
const auto *Sugar = dyn_cast<T>(Cur))
745#define ABSTRACT_TYPE(Class, Parent)
746#define TYPE(Class, Parent) \
747 case Type::Class: { \
748 const auto *Ty = cast<Class##Type>(Cur); \
749 if (!Ty->isSugared()) \
751 Cur = Ty->desugar().getTypePtr(); \
754#include "clang/AST/TypeNodes.inc"
767template <>
const TemplateSpecializationType *
Type::getAs()
const {
787 const Type *Cur =
this;
791#define ABSTRACT_TYPE(Class, Parent)
792#define TYPE(Class, Parent) \
794 const auto *Ty = cast<Class##Type>(Cur); \
795 if (!Ty->isSugared()) \
797 Cur = Ty->desugar().getTypePtr(); \
800#include "clang/AST/TypeNodes.inc"
807 return RT->getDecl()->isClass();
813 return RT->getDecl()->isStruct();
821 const auto *
Decl = RT->getDecl();
822 if (!
Decl->isStruct())
824 return Decl->getDefinitionOrSelf()->hasFlexibleArrayMember();
829 return RD->hasAttr<ObjCBoxableAttr>();
835 return RT->getDecl()->isInterface();
841 return RT->getDecl()->isStructureOrClass();
847 return PT->getPointeeType()->isVoidType();
853 return RT->getDecl()->isUnion();
859 return CT->getElementType()->isFloatingType();
870 return ET->getDecl()->isScoped();
880 if (
Complex->getElementType()->isIntegerType())
903 if (
const auto *RT = dyn_cast<RecordType>(
this)) {
904 if (RT->getDecl()->isStruct())
909 if (
const auto *RT = dyn_cast<RecordType>(CanonicalType)) {
910 if (!RT->getDecl()->isStruct())
922 if (
const auto *RT = dyn_cast<RecordType>(
this)) {
923 if (RT->getDecl()->isUnion())
928 if (
const auto *RT = dyn_cast<RecordType>(CanonicalType)) {
929 if (!RT->getDecl()->isUnion())
949 if (OPT->isObjCIdType())
953 if (!OPT->isKindOfType())
957 if (OPT->isObjCClassType() || OPT->isObjCQualifiedClassType())
961 bound = OPT->getObjectType()
962 ->stripObjCKindOfTypeAndQuals(ctx)
973 if (OPT->isObjCClassType())
977 if (!OPT->isKindOfType())
981 return OPT->isObjCClassType() || OPT->isObjCQualifiedClassType();
988 initialize(protocols);
995 :
Type(ObjCObject, Canonical,
Base->getDependence()), BaseType(
Base) {
999 assert(getTypeArgsAsWritten().size() == typeArgs.size() &&
1000 "bitfield overflow in type argument count");
1001 if (!typeArgs.empty())
1002 memcpy(getTypeArgStorage(), typeArgs.data(),
1003 typeArgs.size() *
sizeof(
QualType));
1005 for (
auto typeArg : typeArgs) {
1006 addDependence(typeArg->getDependence() & ~TypeDependence::VariablyModified);
1010 initialize(protocols);
1013bool ObjCObjectType::isSpecialized()
const {
1015 if (ObjCObjectTypeBits.NumTypeArgs > 0)
1019 if (
const auto objcObject =
getBaseType()->getAs<ObjCObjectType>()) {
1024 return objcObject->isSpecialized();
1033 if (isSpecializedAsWritten())
1034 return getTypeArgsAsWritten();
1037 if (
const auto objcObject =
getBaseType()->getAs<ObjCObjectType>()) {
1042 return objcObject->getTypeArgs();
1049bool ObjCObjectType::isKindOfType()
const {
1050 if (isKindOfTypeAsWritten())
1054 if (
const auto objcObject =
getBaseType()->getAs<ObjCObjectType>()) {
1059 return objcObject->isKindOfType();
1067ObjCObjectType::stripObjCKindOfTypeAndQuals(
const ASTContext &ctx)
const {
1068 if (!isKindOfType() && qual_empty())
1074 if (
const auto *baseObj = splitBaseType.
Ty->
getAs<ObjCObjectType>())
1075 baseType = baseObj->stripObjCKindOfTypeAndQuals(ctx);
1079 getTypeArgsAsWritten(),
1104template <
typename Derived>
1105struct SimpleTransformVisitor :
public TypeVisitor<Derived, QualType> {
1113 QualType result =
static_cast<Derived *
>(
this)->Visit(splitType.
Ty);
1123 explicit SimpleTransformVisitor(
ASTContext &ctx) : Ctx(ctx) {}
1127#define TYPE(Class, Base)
1128#define DEPENDENT_TYPE(Class, Base) \
1129 QualType Visit##Class##Type(const Class##Type *T) { return QualType(T, 0); }
1130#include "clang/AST/TypeNodes.inc"
1132#define TRIVIAL_TYPE_CLASS(Class) \
1133 QualType Visit##Class##Type(const Class##Type *T) { return QualType(T, 0); }
1134#define SUGARED_TYPE_CLASS(Class) \
1135 QualType Visit##Class##Type(const Class##Type *T) { \
1136 if (!T->isSugared()) \
1137 return QualType(T, 0); \
1138 QualType desugaredType = recurse(T->desugar()); \
1139 if (desugaredType.isNull()) \
1141 if (desugaredType.getAsOpaquePtr() == T->desugar().getAsOpaquePtr()) \
1142 return QualType(T, 0); \
1143 return desugaredType; \
1149 QualType elementType = recurse(
T->getElementType());
1150 if (elementType.
isNull())
1153 if (elementType.
getAsOpaquePtr() ==
T->getElementType().getAsOpaquePtr())
1159 QualType VisitPointerType(
const PointerType *
T) {
1165 return QualType(
T, 0);
1170 QualType VisitBlockPointerType(
const BlockPointerType *
T) {
1176 return QualType(
T, 0);
1181 QualType VisitLValueReferenceType(
const LValueReferenceType *
T) {
1182 QualType
pointeeType = recurse(
T->getPointeeTypeAsWritten());
1187 T->getPointeeTypeAsWritten().getAsOpaquePtr())
1188 return QualType(
T, 0);
1193 QualType VisitRValueReferenceType(
const RValueReferenceType *
T) {
1194 QualType
pointeeType = recurse(
T->getPointeeTypeAsWritten());
1199 T->getPointeeTypeAsWritten().getAsOpaquePtr())
1200 return QualType(
T, 0);
1205 QualType VisitMemberPointerType(
const MemberPointerType *
T) {
1211 return QualType(
T, 0);
1214 T->getMostRecentCXXRecordDecl());
1217 QualType VisitConstantArrayType(
const ConstantArrayType *
T) {
1218 QualType elementType = recurse(
T->getElementType());
1219 if (elementType.
isNull())
1222 if (elementType.
getAsOpaquePtr() ==
T->getElementType().getAsOpaquePtr())
1223 return QualType(
T, 0);
1226 T->getSizeModifier(),
1227 T->getIndexTypeCVRQualifiers());
1230 QualType VisitVariableArrayType(
const VariableArrayType *
T) {
1231 QualType elementType = recurse(
T->getElementType());
1232 if (elementType.
isNull())
1235 if (elementType.
getAsOpaquePtr() ==
T->getElementType().getAsOpaquePtr())
1236 return QualType(
T, 0);
1239 T->getSizeModifier(),
1240 T->getIndexTypeCVRQualifiers());
1243 QualType VisitIncompleteArrayType(
const IncompleteArrayType *
T) {
1244 QualType elementType = recurse(
T->getElementType());
1245 if (elementType.
isNull())
1248 if (elementType.
getAsOpaquePtr() ==
T->getElementType().getAsOpaquePtr())
1249 return QualType(
T, 0);
1252 T->getIndexTypeCVRQualifiers());
1255 QualType VisitVectorType(
const VectorType *
T) {
1256 QualType elementType = recurse(
T->getElementType());
1257 if (elementType.
isNull())
1260 if (elementType.
getAsOpaquePtr() ==
T->getElementType().getAsOpaquePtr())
1261 return QualType(
T, 0);
1264 T->getVectorKind());
1267 QualType VisitExtVectorType(
const ExtVectorType *
T) {
1268 QualType elementType = recurse(
T->getElementType());
1269 if (elementType.
isNull())
1272 if (elementType.
getAsOpaquePtr() ==
T->getElementType().getAsOpaquePtr())
1273 return QualType(
T, 0);
1278 QualType VisitConstantMatrixType(
const ConstantMatrixType *
T) {
1279 QualType elementType = recurse(
T->getElementType());
1280 if (elementType.
isNull())
1282 if (elementType.
getAsOpaquePtr() ==
T->getElementType().getAsOpaquePtr())
1283 return QualType(
T, 0);
1286 T->getNumColumns(),
T->getLayout());
1289 QualType VisitOverflowBehaviorType(
const OverflowBehaviorType *
T) {
1290 QualType UnderlyingType = recurse(
T->getUnderlyingType());
1291 if (UnderlyingType.
isNull())
1295 T->getUnderlyingType().getAsOpaquePtr())
1296 return QualType(
T, 0);
1301 QualType VisitFunctionNoProtoType(
const FunctionNoProtoType *
T) {
1307 return QualType(
T, 0);
1312 QualType VisitFunctionProtoType(
const FunctionProtoType *
T) {
1318 SmallVector<QualType, 4> paramTypes;
1319 bool paramChanged =
false;
1321 QualType newParamType = recurse(paramType);
1322 if (newParamType.
isNull())
1326 paramChanged =
true;
1328 paramTypes.push_back(newParamType);
1333 bool exceptionChanged =
false;
1335 SmallVector<QualType, 4> exceptionTypes;
1336 for (
auto exceptionType :
info.ExceptionSpec.Exceptions) {
1337 QualType newExceptionType = recurse(exceptionType);
1338 if (newExceptionType.
isNull())
1341 if (newExceptionType.
getAsOpaquePtr() != exceptionType.getAsOpaquePtr())
1342 exceptionChanged =
true;
1344 exceptionTypes.push_back(newExceptionType);
1347 if (exceptionChanged) {
1348 info.ExceptionSpec.Exceptions =
1349 llvm::ArrayRef(exceptionTypes).copy(Ctx);
1354 !paramChanged && !exceptionChanged)
1355 return QualType(
T, 0);
1360 QualType VisitParenType(
const ParenType *
T) {
1361 QualType innerType = recurse(
T->getInnerType());
1366 return QualType(
T, 0);
1375 QualType VisitAdjustedType(
const AdjustedType *
T) {
1376 QualType originalType = recurse(
T->getOriginalType());
1377 if (originalType.
isNull())
1380 QualType adjustedType = recurse(
T->getAdjustedType());
1381 if (adjustedType.
isNull())
1385 T->getOriginalType().getAsOpaquePtr() &&
1386 adjustedType.
getAsOpaquePtr() ==
T->getAdjustedType().getAsOpaquePtr())
1387 return QualType(
T, 0);
1392 QualType VisitDecayedType(
const DecayedType *
T) {
1393 QualType originalType = recurse(
T->getOriginalType());
1394 if (originalType.
isNull())
1397 if (originalType.
getAsOpaquePtr() ==
T->getOriginalType().getAsOpaquePtr())
1398 return QualType(
T, 0);
1403 QualType VisitArrayParameterType(
const ArrayParameterType *
T) {
1404 QualType ArrTy = VisitConstantArrayType(
T);
1418 QualType VisitAttributedType(
const AttributedType *
T) {
1419 QualType modifiedType = recurse(
T->getModifiedType());
1420 if (modifiedType.
isNull())
1423 QualType equivalentType = recurse(
T->getEquivalentType());
1424 if (equivalentType.
isNull())
1428 T->getModifiedType().getAsOpaquePtr() &&
1430 T->getEquivalentType().getAsOpaquePtr())
1431 return QualType(
T, 0);
1437 QualType VisitSubstTemplateTypeParmType(
const SubstTemplateTypeParmType *
T) {
1438 QualType replacementType = recurse(
T->getReplacementType());
1439 if (replacementType.
isNull())
1443 T->getReplacementType().getAsOpaquePtr())
1444 return QualType(
T, 0);
1447 replacementType,
T->getAssociatedDecl(),
T->getIndex(),
1448 T->getPackIndex(),
T->getFinal());
1454 QualType VisitAutoType(
const AutoType *
T) {
1455 if (!
T->isDeduced())
1456 return QualType(
T, 0);
1458 QualType deducedType = recurse(
T->getDeducedType());
1459 if (deducedType.
isNull())
1462 if (deducedType ==
T->getDeducedType())
1463 return QualType(
T, 0);
1465 return Ctx.
getAutoType(
T->getDeducedKind(), deducedType,
T->getKeyword(),
1466 T->getTypeConstraintConcept(),
1467 T->getTypeConstraintArguments());
1470 QualType VisitObjCObjectType(
const ObjCObjectType *
T) {
1471 QualType baseType = recurse(
T->getBaseType());
1476 bool typeArgChanged =
false;
1477 SmallVector<QualType, 4> typeArgs;
1478 for (
auto typeArg :
T->getTypeArgsAsWritten()) {
1479 QualType newTypeArg = recurse(typeArg);
1484 typeArgChanged =
true;
1486 typeArgs.push_back(newTypeArg);
1491 return QualType(
T, 0);
1495 llvm::ArrayRef(
T->qual_begin(),
T->getNumProtocols()),
1496 T->isKindOfTypeAsWritten());
1501 QualType VisitObjCObjectPointerType(
const ObjCObjectPointerType *
T) {
1507 return QualType(
T, 0);
1512 QualType VisitAtomicType(
const AtomicType *
T) {
1513 QualType valueType = recurse(
T->getValueType());
1518 return QualType(
T, 0);
1523#undef TRIVIAL_TYPE_CLASS
1524#undef SUGARED_TYPE_CLASS
1527struct SubstObjCTypeArgsVisitor
1528 :
public SimpleTransformVisitor<SubstObjCTypeArgsVisitor> {
1529 using BaseType = SimpleTransformVisitor<SubstObjCTypeArgsVisitor>;
1531 ArrayRef<QualType> TypeArgs;
1534 SubstObjCTypeArgsVisitor(ASTContext &ctx, ArrayRef<QualType> typeArgs,
1536 : BaseType(ctx), TypeArgs(typeArgs), SubstContext(context) {}
1538 QualType VisitObjCTypeParamType(
const ObjCTypeParamType *OTPTy) {
1541 ObjCTypeParamDecl *typeParam = OTPTy->getDecl();
1543 if (!TypeArgs.empty()) {
1544 QualType argType = TypeArgs[typeParam->
getIndex()];
1545 if (OTPTy->qual_empty())
1550 SmallVector<ObjCProtocolDecl *, 8> protocolsVec;
1551 protocolsVec.append(OTPTy->qual_begin(), OTPTy->qual_end());
1552 ArrayRef<ObjCProtocolDecl *> protocolsToApply = protocolsVec;
1554 argType, protocolsToApply, hasError,
true );
1557 switch (SubstContext) {
1558 case ObjCSubstitutionContext::Ordinary:
1559 case ObjCSubstitutionContext::Parameter:
1560 case ObjCSubstitutionContext::Superclass:
1564 case ObjCSubstitutionContext::Result:
1565 case ObjCSubstitutionContext::Property: {
1567 const auto *objPtr =
1572 if (objPtr->isKindOfType() || objPtr->isObjCIdOrClassType())
1576 const auto *obj = objPtr->getObjectType();
1578 obj->getBaseType(), obj->getTypeArgsAsWritten(), obj->getProtocols(),
1585 llvm_unreachable(
"Unexpected ObjCSubstitutionContext!");
1588 QualType VisitFunctionType(
const FunctionType *funcType) {
1594 Ctx, TypeArgs, ObjCSubstitutionContext::Result);
1604 return BaseType::VisitFunctionType(funcType);
1613 SmallVector<QualType, 4> paramTypes;
1614 bool paramChanged =
false;
1615 for (
auto paramType : funcProtoType->getParamTypes()) {
1617 Ctx, TypeArgs, ObjCSubstitutionContext::Parameter);
1618 if (newParamType.
isNull())
1622 paramChanged =
true;
1624 paramTypes.push_back(newParamType);
1628 FunctionProtoType::ExtProtoInfo
info = funcProtoType->getExtProtoInfo();
1629 bool exceptionChanged =
false;
1631 SmallVector<QualType, 4> exceptionTypes;
1632 for (
auto exceptionType :
info.ExceptionSpec.Exceptions) {
1634 Ctx, TypeArgs, ObjCSubstitutionContext::Ordinary);
1635 if (newExceptionType.
isNull())
1638 if (newExceptionType.
getAsOpaquePtr() != exceptionType.getAsOpaquePtr())
1639 exceptionChanged =
true;
1641 exceptionTypes.push_back(newExceptionType);
1644 if (exceptionChanged) {
1645 info.ExceptionSpec.Exceptions =
1646 llvm::ArrayRef(exceptionTypes).copy(Ctx);
1651 funcProtoType->getReturnType().getAsOpaquePtr() &&
1652 !paramChanged && !exceptionChanged)
1653 return BaseType::VisitFunctionType(funcType);
1658 QualType VisitObjCObjectType(
const ObjCObjectType *objcObjectType) {
1661 if (objcObjectType->isSpecializedAsWritten()) {
1662 SmallVector<QualType, 4> newTypeArgs;
1663 bool anyChanged =
false;
1664 for (
auto typeArg : objcObjectType->getTypeArgsAsWritten()) {
1666 Ctx, TypeArgs, ObjCSubstitutionContext::Ordinary);
1673 ArrayRef<ObjCProtocolDecl *> protocols(
1674 objcObjectType->qual_begin(), objcObjectType->getNumProtocols());
1675 if (TypeArgs.empty() &&
1676 SubstContext != ObjCSubstitutionContext::Superclass) {
1678 objcObjectType->getBaseType(), {}, protocols,
1679 objcObjectType->isKindOfTypeAsWritten());
1685 newTypeArgs.push_back(newTypeArg);
1689 ArrayRef<ObjCProtocolDecl *> protocols(
1690 objcObjectType->qual_begin(), objcObjectType->getNumProtocols());
1693 objcObjectType->isKindOfTypeAsWritten());
1697 return BaseType::VisitObjCObjectType(objcObjectType);
1700 QualType VisitAttributedType(
const AttributedType *attrType) {
1701 QualType newType = BaseType::VisitAttributedType(attrType);
1705 const auto *newAttrType = dyn_cast<AttributedType>(newType.
getTypePtr());
1706 if (!newAttrType || newAttrType->getAttrKind() != attr::ObjCKindOf)
1710 QualType newEquivType = newAttrType->getEquivalentType();
1711 const ObjCObjectPointerType *ptrType =
1712 newEquivType->
getAs<ObjCObjectPointerType>();
1713 const ObjCObjectType *objType = ptrType
1715 : newEquivType->
getAs<ObjCObjectType>();
1722 objType->getBaseType(), objType->getTypeArgsAsWritten(),
1723 objType->getProtocols(),
1725 objType->isObjCUnqualifiedId() ?
false :
true);
1733 newAttrType->getModifiedType(), newEquivType,
1734 newAttrType->getAttr());
1738struct StripNullabilityTypeVisitor
1739 :
public SimpleTransformVisitor<StripNullabilityTypeVisitor> {
1740 using BaseType = SimpleTransformVisitor<StripNullabilityTypeVisitor>;
1742 explicit StripNullabilityTypeVisitor(ASTContext &ctx) : BaseType(ctx) {}
1744 QualType VisitAttributedType(
const AttributedType *attrType) {
1745 QualType
type(attrType, 0);
1746 if (AttributedType::stripOuterNullability(
type)) {
1747 while (AttributedType::stripOuterNullability(
type)) {
1749 return BaseType::recurse(
type);
1752 return BaseType::VisitAttributedType(attrType);
1756struct StripObjCKindOfTypeVisitor
1757 :
public SimpleTransformVisitor<StripObjCKindOfTypeVisitor> {
1758 using BaseType = SimpleTransformVisitor<StripObjCKindOfTypeVisitor>;
1760 explicit StripObjCKindOfTypeVisitor(ASTContext &ctx) : BaseType(ctx) {}
1762 QualType VisitObjCObjectType(
const ObjCObjectType *objType) {
1763 if (!objType->isKindOfType())
1764 return BaseType::VisitObjCObjectType(objType);
1766 QualType baseType = objType->getBaseType().stripObjCKindOfType(Ctx);
1768 objType->getProtocols(),
1785 case BuiltinType::Kind::Float16: {
1793 case BuiltinType::Kind::BFloat16: {
1813 SubstObjCTypeArgsVisitor visitor(ctx, typeArgs, context);
1814 return visitor.recurse(*
this);
1828 auto &ctx =
const_cast<ASTContext &
>(constCtx);
1829 StripObjCKindOfTypeVisitor visitor(ctx);
1830 return visitor.recurse(*
this);
1836 auto &ctx =
const_cast<ASTContext &
>(constCtx);
1837 StripNullabilityTypeVisitor visitor(ctx);
1838 return visitor.recurse(*
this);
1843 if (
const auto AT =
T.getTypePtr()->getAs<
AtomicType>())
1844 T = AT->getValueType();
1845 return T.getUnqualifiedType();
1848std::optional<ArrayRef<QualType>>
1851 if (
const auto method = dyn_cast<ObjCMethodDecl>(dc))
1852 dc = method->getDeclContext();
1856 const auto *dcClassDecl = dyn_cast<ObjCInterfaceDecl>(dc);
1862 dcTypeParams = dcClassDecl->getTypeParamList();
1864 return std::nullopt;
1868 dcCategoryDecl = dyn_cast<ObjCCategoryDecl>(dc);
1869 if (!dcCategoryDecl)
1870 return std::nullopt;
1876 return std::nullopt;
1880 return std::nullopt;
1882 assert(dcTypeParams &&
"No substitutions to perform");
1883 assert(dcClassDecl &&
"No class context");
1888 objectType = objectPointerType->getObjectType();
1899 objectType ? objectType->getInterface() :
nullptr;
1900 if (!curClassDecl) {
1908 while (curClassDecl != dcClassDecl) {
1910 QualType superType = objectType->getSuperClassType();
1911 if (superType.
isNull()) {
1912 objectType =
nullptr;
1917 curClassDecl = objectType->getInterface();
1922 if (!objectType || objectType->isUnspecialized()) {
1927 return objectType->getTypeArgs();
1932 if (
auto *ID = IfaceT->getInterface()) {
1933 if (ID->getTypeParamList())
1941void ObjCObjectType::computeSuperClassTypeSlow()
const {
1947 CachedSuperClassType.setInt(
true);
1953 if (!superClassObjTy) {
1954 CachedSuperClassType.setInt(
true);
1959 if (!superClassDecl) {
1960 CachedSuperClassType.setInt(
true);
1966 QualType superClassType(superClassObjTy, 0);
1968 if (!superClassTypeParams) {
1969 CachedSuperClassType.setPointerAndInt(
1970 superClassType->castAs<ObjCObjectType>(),
true);
1975 if (superClassObjTy->isUnspecialized()) {
1976 CachedSuperClassType.setPointerAndInt(superClassObjTy,
true);
1984 CachedSuperClassType.setPointerAndInt(
1985 superClassType->castAs<ObjCObjectType>(),
true);
1991 if (isUnspecialized()) {
1994 superClassObjTy->getInterface());
1995 CachedSuperClassType.setPointerAndInt(
1996 unspecializedSuper->
castAs<ObjCObjectType>(),
true);
2002 assert(typeArgs.size() == typeParams->
size());
2003 CachedSuperClassType.setPointerAndInt(
2007 ->castAs<ObjCObjectType>(),
2013 return interfaceDecl->getASTContext()
2014 .getObjCInterfaceType(interfaceDecl)
2023 if (superObjectType.
isNull())
2024 return superObjectType;
2035 if (
T->getNumProtocols() &&
T->getInterface())
2048 if (OPT->isObjCQualifiedIdType())
2058 if (OPT->isObjCQualifiedClassType())
2066 if (OT->getInterface())
2074 if (OPT->getInterfaceType())
2091const TemplateSpecializationType *
2094 while (TST && TST->isTypeAlias())
2095 TST = TST->desugar()->getAs<TemplateSpecializationType>();
2101 case Type::DependentName:
2103 case Type::TemplateSpecialization:
2109 case Type::InjectedClassName:
2113 case Type::UnresolvedUsing:
2118 return std::nullopt;
2123 const Type *Cur =
this;
2124 while (
const auto *AT = Cur->
getAs<AttributedType>()) {
2125 if (AT->getAttrKind() == AK)
2127 Cur = AT->getEquivalentType().getTypePtr();
2134class GetContainedDeducedTypeVisitor
2135 :
public TypeVisitor<GetContainedDeducedTypeVisitor, Type *> {
2139 GetContainedDeducedTypeVisitor(
bool Syntactic =
false)
2140 : Syntactic(Syntactic) {}
2147 return Visit(
T.getTypePtr());
2151 Type *VisitDeducedType(
const DeducedType *AT) {
2152 return const_cast<DeducedType *
>(AT);
2156 Type *VisitSubstTemplateTypeParmType(
const SubstTemplateTypeParmType *
T) {
2157 return Visit(
T->getReplacementType());
2160 Type *VisitPointerType(
const PointerType *
T) {
2164 Type *VisitBlockPointerType(
const BlockPointerType *
T) {
2168 Type *VisitReferenceType(
const ReferenceType *
T) {
2169 return Visit(
T->getPointeeTypeAsWritten());
2172 Type *VisitMemberPointerType(
const MemberPointerType *
T) {
2176 Type *VisitArrayType(
const ArrayType *
T) {
2177 return Visit(
T->getElementType());
2180 Type *VisitDependentSizedExtVectorType(
const DependentSizedExtVectorType *
T) {
2181 return Visit(
T->getElementType());
2184 Type *VisitVectorType(
const VectorType *
T) {
2185 return Visit(
T->getElementType());
2188 Type *VisitDependentSizedMatrixType(
const DependentSizedMatrixType *
T) {
2189 return Visit(
T->getElementType());
2192 Type *VisitConstantMatrixType(
const ConstantMatrixType *
T) {
2193 return Visit(
T->getElementType());
2196 Type *VisitFunctionProtoType(
const FunctionProtoType *
T) {
2198 return const_cast<FunctionProtoType *
>(
T);
2199 return VisitFunctionType(
T);
2202 Type *VisitFunctionType(
const FunctionType *
T) {
2206 Type *VisitParenType(
const ParenType *
T) {
return Visit(
T->getInnerType()); }
2208 Type *VisitAttributedType(
const AttributedType *
T) {
2209 return Visit(
T->getModifiedType());
2212 Type *VisitMacroQualifiedType(
const MacroQualifiedType *
T) {
2213 return Visit(
T->getUnderlyingType());
2216 Type *VisitOverflowBehaviorType(
const OverflowBehaviorType *
T) {
2217 return Visit(
T->getUnderlyingType());
2220 Type *VisitAdjustedType(
const AdjustedType *
T) {
2221 return Visit(
T->getOriginalType());
2224 Type *VisitPackExpansionType(
const PackExpansionType *
T) {
2225 return Visit(
T->getPattern());
2228 Type *VisitAtomicType(
const AtomicType *
T) {
2229 return Visit(
T->getValueType());
2236 return cast_or_null<DeducedType>(
2237 GetContainedDeducedTypeVisitor().Visit(
this));
2241 return isa_and_nonnull<FunctionType>(
2242 GetContainedDeducedTypeVisitor(
true).Visit(
this));
2246 if (
const auto *VT = dyn_cast<VectorType>(CanonicalType))
2247 return VT->getElementType()->isIntegerType();
2248 if (CanonicalType->isSveVLSBuiltinType()) {
2250 return VT->getKind() == BuiltinType::SveBool ||
2251 (VT->getKind() >= BuiltinType::SveInt8 &&
2252 VT->getKind() <= BuiltinType::SveUint64);
2254 if (CanonicalType->isRVVVLSBuiltinType()) {
2256 return (VT->getKind() >= BuiltinType::RvvInt8mf8 &&
2257 VT->getKind() <= BuiltinType::RvvUint64m8);
2283 if (
const auto *BT = dyn_cast<BuiltinType>(CanonicalType))
2284 return BT->isInteger();
2288 if (
const auto *ET = dyn_cast<EnumType>(CanonicalType))
2291 if (
const OverflowBehaviorType *OBT =
2292 dyn_cast<OverflowBehaviorType>(CanonicalType))
2293 return OBT->getUnderlyingType()->isIntegralOrEnumerationType();
2300 if (
const auto *BT = dyn_cast<BuiltinType>(CanonicalType))
2301 return BT->isInteger();
2303 if (
const auto *OBT = dyn_cast<OverflowBehaviorType>(CanonicalType))
2304 return OBT->getUnderlyingType()->isIntegerType();
2313 if (
const auto *ET = dyn_cast<EnumType>(CanonicalType))
2314 return !ET->getDecl()->isScoped();
2320 if (
const auto *BT = dyn_cast<BuiltinType>(CanonicalType))
2321 return BT->getKind() == BuiltinType::Char_U ||
2322 BT->getKind() == BuiltinType::UChar ||
2323 BT->getKind() == BuiltinType::Char_S ||
2324 BT->getKind() == BuiltinType::SChar;
2329 if (
const auto *BT = dyn_cast<BuiltinType>(CanonicalType))
2330 return BT->getKind() == BuiltinType::WChar_S ||
2331 BT->getKind() == BuiltinType::WChar_U;
2336 if (
const BuiltinType *BT = dyn_cast<BuiltinType>(CanonicalType))
2337 return BT->getKind() == BuiltinType::Char8;
2342 if (
const auto *BT = dyn_cast<BuiltinType>(CanonicalType))
2343 return BT->getKind() == BuiltinType::Char16;
2348 if (
const auto *BT = dyn_cast<BuiltinType>(CanonicalType))
2349 return BT->getKind() == BuiltinType::Char32;
2356 const auto *BT = dyn_cast<BuiltinType>(CanonicalType);
2359 switch (BT->getKind()) {
2362 case BuiltinType::Char_U:
2363 case BuiltinType::UChar:
2364 case BuiltinType::WChar_U:
2365 case BuiltinType::Char8:
2366 case BuiltinType::Char16:
2367 case BuiltinType::Char32:
2368 case BuiltinType::Char_S:
2369 case BuiltinType::SChar:
2370 case BuiltinType::WChar_S:
2376 const auto *BT = dyn_cast<BuiltinType>(CanonicalType);
2379 switch (BT->getKind()) {
2382 case BuiltinType::Char8:
2383 case BuiltinType::Char16:
2384 case BuiltinType::Char32:
2393 if (
const auto *BT = dyn_cast<BuiltinType>(CanonicalType))
2394 return BT->isSignedInteger();
2399 if (!ED->isComplete() || ED->isScoped())
2401 return ED->getIntegerType()->isSignedIntegerType();
2404 if (
const auto *IT = dyn_cast<BitIntType>(CanonicalType))
2405 return IT->isSigned();
2406 if (
const auto *IT = dyn_cast<DependentBitIntType>(CanonicalType))
2407 return IT->isSigned();
2409 if (
const auto *OBT = dyn_cast<OverflowBehaviorType>(CanonicalType))
2410 return OBT->getUnderlyingType()->isSignedIntegerType();
2416 if (
const auto *BT = dyn_cast<BuiltinType>(CanonicalType))
2417 return BT->isSignedInteger();
2420 if (!ED->isComplete())
2422 return ED->getIntegerType()->isSignedIntegerType();
2425 if (
const auto *IT = dyn_cast<BitIntType>(CanonicalType))
2426 return IT->isSigned();
2427 if (
const auto *IT = dyn_cast<DependentBitIntType>(CanonicalType))
2428 return IT->isSigned();
2430 if (
const auto *OBT = dyn_cast<OverflowBehaviorType>(CanonicalType))
2431 return OBT->getUnderlyingType()->isSignedIntegerOrEnumerationType();
2437 if (
const auto *VT = dyn_cast<VectorType>(CanonicalType))
2438 return VT->getElementType()->isSignedIntegerOrEnumerationType();
2439 if (
const auto *MT = dyn_cast<MatrixType>(CanonicalType))
2440 return MT->getElementType()->isSignedIntegerOrEnumerationType();
2442 if (
const auto *BT = dyn_cast<BuiltinType>(CanonicalType)) {
2443 switch (BT->getKind()) {
2444#define SVE_VECTOR_TYPE_INT(Name, MangledName, Id, SingletonId, NumEls, \
2445 ElBits, NF, IsSigned) \
2446 case BuiltinType::Id: \
2448#include "clang/Basic/AArch64ACLETypes.def"
2461 if (
const auto *BT = dyn_cast<BuiltinType>(CanonicalType))
2462 return BT->isUnsignedInteger();
2467 if (!ED->isComplete() || ED->isScoped())
2469 return ED->getIntegerType()->isUnsignedIntegerType();
2472 if (
const auto *IT = dyn_cast<BitIntType>(CanonicalType))
2473 return IT->isUnsigned();
2474 if (
const auto *IT = dyn_cast<DependentBitIntType>(CanonicalType))
2475 return IT->isUnsigned();
2477 if (
const auto *OBT = dyn_cast<OverflowBehaviorType>(CanonicalType))
2478 return OBT->getUnderlyingType()->isUnsignedIntegerType();
2484 if (
const auto *BT = dyn_cast<BuiltinType>(CanonicalType))
2485 return BT->isUnsignedInteger();
2488 if (!ED->isComplete())
2490 return ED->getIntegerType()->isUnsignedIntegerType();
2493 if (
const auto *IT = dyn_cast<BitIntType>(CanonicalType))
2494 return IT->isUnsigned();
2495 if (
const auto *IT = dyn_cast<DependentBitIntType>(CanonicalType))
2496 return IT->isUnsigned();
2498 if (
const auto *OBT = dyn_cast<OverflowBehaviorType>(CanonicalType))
2499 return OBT->getUnderlyingType()->isUnsignedIntegerOrEnumerationType();
2505 if (
const auto *VT = dyn_cast<VectorType>(CanonicalType))
2506 return VT->getElementType()->isUnsignedIntegerOrEnumerationType();
2507 if (
const auto *VT = dyn_cast<MatrixType>(CanonicalType))
2508 return VT->getElementType()->isUnsignedIntegerOrEnumerationType();
2509 if (CanonicalType->isSveVLSBuiltinType()) {
2511 return VT->getKind() >= BuiltinType::SveUint8 &&
2512 VT->getKind() <= BuiltinType::SveUint64;
2518 if (
const auto *BT = dyn_cast<BuiltinType>(CanonicalType))
2519 return BT->isFloatingPoint();
2520 if (
const auto *CT = dyn_cast<ComplexType>(CanonicalType))
2521 return CT->getElementType()->isFloatingType();
2526 if (
const auto *VT = dyn_cast<VectorType>(CanonicalType))
2527 return VT->getElementType()->isFloatingType();
2528 if (
const auto *MT = dyn_cast<MatrixType>(CanonicalType))
2529 return MT->getElementType()->isFloatingType();
2534 if (
const auto *BT = dyn_cast<BuiltinType>(CanonicalType))
2535 return BT->isFloatingPoint();
2540 if (
const auto *BT = dyn_cast<BuiltinType>(CanonicalType))
2541 return BT->getKind() >= BuiltinType::Bool &&
2542 BT->getKind() <= BuiltinType::Ibm128;
2543 if (
const auto *ET = dyn_cast<EnumType>(CanonicalType)) {
2544 const auto *ED = ET->getDecl();
2545 return !ED->isScoped() && ED->getDefinitionOrSelf()->isComplete();
2551 if (
const auto *BT = dyn_cast<BuiltinType>(CanonicalType))
2552 return BT->getKind() >= BuiltinType::Bool &&
2553 BT->getKind() <= BuiltinType::Ibm128;
2554 if (
const auto *ET = dyn_cast<EnumType>(CanonicalType)) {
2561 const auto *ED = ET->getDecl();
2562 return !ED->isScoped() && ED->getDefinitionOrSelf()->isComplete();
2573 if (
const auto *VT = dyn_cast<VectorType>(CanonicalType))
2574 return VT->getElementType()->isBooleanType();
2576 return ED->isComplete() && ED->getIntegerType()->isBooleanType();
2577 if (
const auto *IT = dyn_cast<BitIntType>(CanonicalType))
2578 return IT->getNumBits() == 1;
2585 const Type *
T = CanonicalType.getTypePtr();
2586 if (
const auto *BT = dyn_cast<BuiltinType>(
T)) {
2587 if (BT->getKind() == BuiltinType::Bool)
2589 if (BT->getKind() == BuiltinType::NullPtr)
2591 if (BT->isInteger())
2593 if (BT->isFloatingPoint())
2595 if (BT->isFixedPointType())
2597 llvm_unreachable(
"unknown scalar builtin type");
2607 assert(
T->castAsEnumDecl()->isComplete());
2609 }
else if (
const auto *CT = dyn_cast<ComplexType>(
T)) {
2610 if (CT->getElementType()->isRealFloatingType())
2619 llvm_unreachable(
"unknown scalar type");
2632 if (
const auto *
Record = dyn_cast<RecordType>(CanonicalType)) {
2633 if (
const auto *ClassDecl = dyn_cast<CXXRecordDecl>(
Record->getDecl()))
2634 return ClassDecl->isAggregate();
2646 assert(!
isIncompleteType() &&
"This doesn't make sense for incomplete types");
2647 assert(!
isDependentType() &&
"This doesn't make sense for dependent types");
2659 switch (CanonicalType->getTypeClass()) {
2670 return !EnumD->isComplete();
2678 return !Rec->isCompleteDefinition();
2680 case InjectedClassName: {
2682 if (!Rec->isBeingDefined())
2696 ->isIncompleteType(Def);
2697 case IncompleteArray:
2700 case MemberPointer: {
2713 if (!Context.getTargetInfo().getCXXABI().isMicrosoft())
2716 if (RD->
hasAttr<MSInheritanceAttr>())
2723 ->isIncompleteType(Def);
2724 case ObjCInterface: {
2756 switch (BT->getKind()) {
2758#define WASM_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
2759#include "clang/Basic/WebAssemblyReferenceTypes.def"
2761#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
2762#include "clang/Basic/HLSLIntangibleTypes.def"
2764 case BuiltinType::AMDGPUFeaturePredicate:
2775 return BT->getKind() == BuiltinType::WasmExternRef;
2780 if (
const auto *ATy = dyn_cast<ArrayType>(
this))
2781 return ATy->getElementType().isWebAssemblyReferenceType();
2783 if (
const auto *PTy = dyn_cast<PointerType>(
this))
2784 return PTy->getPointeeType().isWebAssemblyReferenceType();
2797 switch (BT->getKind()) {
2799#define SVE_VECTOR_TYPE(Name, MangledName, Id, SingletonId) \
2800 case BuiltinType::Id: \
2802#define SVE_OPAQUE_TYPE(Name, MangledName, Id, SingletonId) \
2803 case BuiltinType::Id: \
2805#define SVE_PREDICATE_TYPE(Name, MangledName, Id, SingletonId) \
2806 case BuiltinType::Id: \
2808#include "clang/Basic/AArch64ACLETypes.def"
2818 switch (BT->getKind()) {
2819#define RVV_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
2820#include "clang/Basic/RISCVVTypes.def"
2831 switch (BT->getKind()) {
2832 case BuiltinType::SveInt8:
2833 case BuiltinType::SveInt16:
2834 case BuiltinType::SveInt32:
2835 case BuiltinType::SveInt64:
2836 case BuiltinType::SveUint8:
2837 case BuiltinType::SveUint16:
2838 case BuiltinType::SveUint32:
2839 case BuiltinType::SveUint64:
2840 case BuiltinType::SveFloat16:
2841 case BuiltinType::SveFloat32:
2842 case BuiltinType::SveFloat64:
2843 case BuiltinType::SveBFloat16:
2844 case BuiltinType::SveBool:
2845 case BuiltinType::SveMFloat8:
2863 llvm_unreachable(
"Unhandled type");
2870 if (BTy->
getKind() == BuiltinType::SveBool)
2881 switch (BT->getKind()) {
2882#define RVV_VECTOR_TYPE(Name, Id, SingletonId, NumEls, ElBits, NF, IsSigned, \
2884 case BuiltinType::Id: \
2886#define RVV_PREDICATE_TYPE(Name, Id, SingletonId, NumEls) \
2887 case BuiltinType::Id: \
2889#include "clang/Basic/RISCVVTypes.def"
2903#define RVV_PREDICATE_TYPE(Name, Id, SingletonId, NumEls) \
2904 case BuiltinType::Id: \
2905 return Ctx.UnsignedCharTy;
2908#include "clang/Basic/RISCVVTypes.def"
2911 llvm_unreachable(
"Unhandled type");
2915 if (Context.getLangOpts().HLSL &&
2916 getTypePtr()->isHLSLStandardLayoutRecordOrArrayOf())
2920 if (Context.getLangOpts().CPlusPlus11)
2933 if ((*this)->isIncompleteArrayType())
2934 return Context.getBaseElementType(*this).isCXX98PODType(Context);
2936 if ((*this)->isIncompleteType())
2945 if (Context.containsAddressDiscriminatedPointerAuth(CanonicalType))
2952 case Type::VariableArray:
2953 case Type::ConstantArray:
2955 return Context.getBaseElementType(*this).isCXX98PODType(Context);
2957 case Type::ObjCObjectPointer:
2958 case Type::BlockPointer:
2962 case Type::MemberPointer:
2964 case Type::ExtVector:
2966 case Type::OverflowBehavior:
2973 if (
const auto *ClassDecl =
2975 return ClassDecl->isPOD();
2989 if ((*this)->isArrayType())
2990 return Context.getBaseElementType(*this).isTrivialType(Context);
2992 if ((*this)->isSizelessBuiltinType())
2997 if ((*this)->isIncompleteType())
3009 if (Context.containsAddressDiscriminatedPointerAuth(CanonicalType))
3028 return ClassDecl->hasTrivialDefaultConstructor() &&
3029 !ClassDecl->hasNonTrivialDefaultConstructor() &&
3030 ClassDecl->isTriviallyCopyable();
3042 bool IsCopyConstructible) {
3043 if (
type->isArrayType())
3045 Context, IsCopyConstructible);
3047 if (
type.hasNonTrivialObjCLifetime())
3081 if (
const auto *ClassDecl = dyn_cast<CXXRecordDecl>(RD)) {
3082 if (IsCopyConstructible)
3083 return ClassDecl->isTriviallyCopyConstructible();
3084 return ClassDecl->isTriviallyCopyable();
3086 return !RD->isNonTrivialToPrimitiveCopy();
3100 if (CanonicalType.hasNonTrivialObjCLifetime())
3102 if (CanonicalType->isArrayType())
3103 return Context.getBaseElementType(CanonicalType)
3104 .isBitwiseCloneableType(Context);
3106 if (CanonicalType->isIncompleteType())
3111 if (Context.containsAddressDiscriminatedPointerAuth(CanonicalType))
3114 const auto *RD = CanonicalType->getAsRecordDecl();
3118 if (RD->isInvalidDecl())
3124 if (RD->mayInsertExtraPadding())
3127 for (
auto *
const Field : RD->fields()) {
3128 if (!Field->getType().isBitwiseCloneableType(Context))
3132 if (
const auto *CXXRD = dyn_cast<CXXRecordDecl>(RD)) {
3133 for (
auto Base : CXXRD->bases())
3134 if (!
Base.getType().isBitwiseCloneableType(Context))
3136 for (
auto VBase : CXXRD->vbases())
3137 if (!VBase.getType().isBitwiseCloneableType(Context))
3150 return !Context.getLangOpts().ObjCAutoRefCount &&
3151 Context.getLangOpts().ObjCWeak &&
3184 return OBT->getBehaviorKind() ==
3185 OverflowBehaviorType::OverflowBehaviorKind::Wrap;
3192 return OBT->getBehaviorKind() ==
3193 OverflowBehaviorType::OverflowBehaviorKind::Trap;
3200 if (
const auto *RD =
3216 if (
const auto *RD =
3256 assert(BaseTy &&
"NULL element type");
3290 if (
const auto *ClassDecl = dyn_cast<CXXRecordDecl>(RD))
3291 return ClassDecl->isLiteral();
3305 return AT->getValueType()->isLiteralType(Ctx);
3307 if (
const auto *OBT = BaseTy->
getAs<OverflowBehaviorType>())
3308 return OBT->getUnderlyingType()->isLiteralType(Ctx);
3330 return RD->isStructural();
3343 assert(BaseTy &&
"NULL element type");
3354 if (
const auto *ClassDecl = dyn_cast<CXXRecordDecl>(RD);
3355 ClassDecl && !ClassDecl->isStandardLayout())
3383 assert(BaseTy &&
"NULL element type");
3394 if (Context.containsAddressDiscriminatedPointerAuth(*
this))
3401 if (
const auto *ClassDecl = dyn_cast<CXXRecordDecl>(RD)) {
3404 if (!ClassDecl->isTrivial())
3410 if (!ClassDecl->isStandardLayout())
3441 const auto *ED = ET->getDecl();
3443 if (II && II->
isStr(
"align_val_t") && ED->isInStdNamespace())
3451 const auto *ED = ET->getDecl();
3453 if (II && II->
isStr(
"byte") && ED->isInStdNamespace())
3469 case TemplateTypeParm:
3470 case SubstTemplateTypeParm:
3471 case TemplateSpecialization:
3514 llvm_unreachable(
"Type specifier is not a tag type kind.");
3531 llvm_unreachable(
"Unknown tag type kind.");
3549 llvm_unreachable(
"Elaborated type keyword is not a tag type kind.");
3551 llvm_unreachable(
"Unknown elaborated type keyword.");
3566 llvm_unreachable(
"Unknown elaborated type keyword.");
3580 return "__interface";
3587 llvm_unreachable(
"Unknown elaborated type keyword.");
3592 if (
const auto *TST = dyn_cast<TemplateSpecializationType>(
this))
3594 else if (
const auto *DepName = dyn_cast<DependentNameType>(
this))
3595 Keyword = DepName->getKeyword();
3596 else if (
const auto *
T = dyn_cast<TagType>(
this))
3598 else if (
const auto *
T = dyn_cast<TypedefType>(
this))
3600 else if (
const auto *
T = dyn_cast<UnresolvedUsingType>(
this))
3602 else if (
const auto *
T = dyn_cast<UsingType>(
this))
3612#define ABSTRACT_TYPE(Derived, Base)
3613#define TYPE(Derived, Base) \
3616#include "clang/AST/TypeNodes.inc"
3619 llvm_unreachable(
"Invalid type class.");
3627 return Policy.
Bool ?
"bool" :
"_Bool";
3633 return "signed char";
3645 return "unsigned char";
3647 return "unsigned short";
3649 return "unsigned int";
3651 return "unsigned long";
3653 return "unsigned long long";
3655 return "unsigned __int128";
3657 return Policy.
Half ?
"half" :
"__fp16";
3665 return "long double";
3667 return "short _Accum";
3671 return "long _Accum";
3673 return "unsigned short _Accum";
3675 return "unsigned _Accum";
3677 return "unsigned long _Accum";
3678 case BuiltinType::MetaInfo:
3679 return "std::meta::info";
3680 case BuiltinType::ShortFract:
3681 return "short _Fract";
3682 case BuiltinType::Fract:
3684 case BuiltinType::LongFract:
3685 return "long _Fract";
3686 case BuiltinType::UShortFract:
3687 return "unsigned short _Fract";
3688 case BuiltinType::UFract:
3689 return "unsigned _Fract";
3690 case BuiltinType::ULongFract:
3691 return "unsigned long _Fract";
3692 case BuiltinType::SatShortAccum:
3693 return "_Sat short _Accum";
3694 case BuiltinType::SatAccum:
3695 return "_Sat _Accum";
3696 case BuiltinType::SatLongAccum:
3697 return "_Sat long _Accum";
3698 case BuiltinType::SatUShortAccum:
3699 return "_Sat unsigned short _Accum";
3700 case BuiltinType::SatUAccum:
3701 return "_Sat unsigned _Accum";
3702 case BuiltinType::SatULongAccum:
3703 return "_Sat unsigned long _Accum";
3704 case BuiltinType::SatShortFract:
3705 return "_Sat short _Fract";
3706 case BuiltinType::SatFract:
3707 return "_Sat _Fract";
3708 case BuiltinType::SatLongFract:
3709 return "_Sat long _Fract";
3710 case BuiltinType::SatUShortFract:
3711 return "_Sat unsigned short _Fract";
3712 case BuiltinType::SatUFract:
3713 return "_Sat unsigned _Fract";
3714 case BuiltinType::SatULongFract:
3715 return "_Sat unsigned long _Fract";
3719 return "__float128";
3724 return Policy.
MSWChar ?
"__wchar_t" :
"wchar_t";
3734 return "<overloaded function type>";
3736 return "<bound member function type>";
3737 case UnresolvedTemplate:
3738 return "<unresolved template type>";
3740 return "<pseudo-object type>";
3742 return "<dependent type>";
3744 return "<unknown type>";
3745 case ARCUnbridgedCast:
3746 return "<ARC unbridged cast type>";
3748 return "<builtin fn type>";
3755#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
3757 return "__" #Access " " #ImgType "_t";
3758#include "clang/Basic/OpenCLImageTypes.def"
3764 return "clk_event_t";
3768 return "reserve_id_t";
3769 case IncompleteMatrixIdx:
3770 return "<incomplete matrix index type>";
3772 return "<array section type>";
3773 case OMPArrayShaping:
3774 return "<OpenMP array shaping type>";
3776 return "<OpenMP iterator type>";
3777#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
3780#include "clang/Basic/OpenCLExtensionTypes.def"
3781#define SVE_TYPE(Name, Id, SingletonId) \
3784#include "clang/Basic/AArch64ACLETypes.def"
3785#define PPC_VECTOR_TYPE(Name, Id, Size) \
3788#include "clang/Basic/PPCTypes.def"
3789#define RVV_TYPE(Name, Id, SingletonId) \
3792#include "clang/Basic/RISCVVTypes.def"
3793#define WASM_TYPE(Name, Id, SingletonId) \
3796#include "clang/Basic/WebAssemblyReferenceTypes.def"
3797#define AMDGPU_TYPE(Name, Id, SingletonId, Width, Align) \
3800#include "clang/Basic/AMDGPUTypes.def"
3801#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) \
3804#include "clang/Basic/HLSLIntangibleTypes.def"
3805#define HLSL_PACKED_TYPE(Name, Id, SingletonId) \
3808#include "clang/Basic/HLSLPackedTypes.def"
3809#define SPIRV_TYPE(Name, Id, SingletonId) \
3812#include "clang/Basic/SPIRVTypes.def"
3815 llvm_unreachable(
"Invalid builtin type.");
3820 if (
auto *PET = dyn_cast<PackExpansionType>(
getTypePtr()))
3821 return PET->getPattern();
3826 if (
const auto *RefType =
getTypePtr()->getAs<ReferenceType>())
3834 if (!Context.getLangOpts().CPlusPlus ||
3843 return FPT->hasCFIUncheckedCallee();
3860 return "vectorcall";
3872 return "aarch64_vector_pcs";
3874 return "aarch64_sve_pcs";
3876 return "intel_ocl_bicc";
3878 return "device_kernel";
3882 return "swiftasynccall";
3884 return "preserve_most";
3886 return "preserve_all";
3890 return "preserve_none";
3893#define CC_VLS_CASE(ABI_VLEN) \
3894 case CC_RISCVVLSCall_##ABI_VLEN: return "riscv_vls_cc(" #ABI_VLEN ")";
3911 llvm_unreachable(
"Invalid calling convention.");
3929 assert(
getNumParams() == params.size() &&
"NumParams overflow!");
3938 auto &ExtraBits = *getTrailingObjects<FunctionTypeExtraBitfields>();
3946 auto &ExtraAttrInfo = *getTrailingObjects<FunctionTypeExtraAttributeInfo>();
3950 auto &ExtraBits = *getTrailingObjects<FunctionTypeExtraBitfields>();
3951 ExtraBits.HasExtraAttributeInfo =
true;
3955 auto &ArmTypeAttrs = *getTrailingObjects<FunctionTypeArmAttributes>();
3956 ArmTypeAttrs = FunctionTypeArmAttributes();
3959 auto &ExtraBits = *getTrailingObjects<FunctionTypeExtraBitfields>();
3960 ExtraBits.HasArmTypeAttributes =
true;
3964 auto *argSlot = getTrailingObjects<QualType>();
3967 ~TypeDependence::VariablyModified);
3968 argSlot[i] = params[i];
3973 auto &ArmTypeAttrs = *getTrailingObjects<FunctionTypeArmAttributes>();
3975 "Not enough bits to encode SME attributes");
3981 auto &ExtraBits = *getTrailingObjects<FunctionTypeExtraBitfields>();
3983 assert(NumExceptions <= 1023 &&
"Not enough bits to encode exceptions");
3984 ExtraBits.NumExceptionType = NumExceptions;
3986 assert(hasExtraBitfields() &&
"missing trailing extra bitfields!");
3988 reinterpret_cast<QualType *
>(getTrailingObjects<ExceptionType>());
3996 (TypeDependence::Instantiation | TypeDependence::UnexpandedPack));
3998 exnSlot[I++] = ExceptionType;
4012 (TypeDependence::Instantiation | TypeDependence::UnexpandedPack));
4018 auto **slot = getTrailingObjects<FunctionDecl *>();
4026 auto **slot = getTrailingObjects<FunctionDecl *>();
4045 auto *extParamInfos = getTrailingObjects<ExtParameterInfo>();
4052 *getTrailingObjects<Qualifiers>() = epi.
TypeQuals;
4059 auto &EllipsisLoc = *getTrailingObjects<SourceLocation>();
4064 auto &ExtraBits = *getTrailingObjects<FunctionTypeExtraBitfields>();
4066 ExtraBits.NumFunctionEffects = EffectsCount;
4067 assert(ExtraBits.NumFunctionEffects == EffectsCount &&
4068 "effect bitfield overflow");
4071 auto *DestFX = getTrailingObjects<FunctionEffect>();
4072 llvm::uninitialized_copy(SrcFX, DestFX);
4075 if (!SrcConds.empty()) {
4076 ExtraBits.EffectsHaveConditions =
true;
4077 auto *DestConds = getTrailingObjects<EffectConditionExpr>();
4078 llvm::uninitialized_copy(SrcConds, DestConds);
4079 assert(llvm::any_of(SrcConds,
4080 [](
const EffectConditionExpr &EC) {
4082 return E->isTypeDependent() ||
4083 E->isValueDependent();
4086 "expected a dependent expression among the conditions");
4094 return NE->isValueDependent();
4106 return NE->isInstantiationDependent();
4117 llvm_unreachable(
"should not call this with unresolved exception specs");
4143 llvm_unreachable(
"unexpected exception specification kind");
4147 for (
unsigned ArgIdx =
getNumParams(); ArgIdx; --ArgIdx)
4155 const QualType *ArgTys,
unsigned NumParams,
4156 const ExtProtoInfo &epi,
4180 ID.AddPointer(
Result.getAsOpaquePtr());
4181 for (
unsigned i = 0; i != NumParams; ++i)
4182 ID.AddPointer(ArgTys[i].getAsOpaquePtr());
4186 assert(!(
unsigned(epi.Variadic) & ~1) && !(
unsigned(epi.RefQualifier) & ~3) &&
4187 !(
unsigned(epi.ExceptionSpec.Type) & ~15) &&
4188 "Values larger than expected.");
4189 ID.AddInteger(
unsigned(epi.Variadic) + (epi.RefQualifier << 1) +
4190 (epi.ExceptionSpec.Type << 3));
4191 ID.Add(epi.TypeQuals);
4193 for (
QualType Ex : epi.ExceptionSpec.Exceptions)
4206 ID.AddPointer(epi.ExceptionSpec.NoexceptExpr);
4210 epi.ExceptionSpec.NoexceptExpr->Profile(ID, Context,
true);
4213 ID.AddPointer(epi.ExceptionSpec.SourceDecl->getCanonicalDecl());
4215 if (epi.ExtParameterInfos) {
4216 for (
unsigned i = 0; i != NumParams; ++i)
4217 ID.AddInteger(epi.ExtParameterInfos[i].getOpaqueValue());
4220 epi.ExtInfo.Profile(ID);
4221 epi.ExtraAttributeInfo.Profile(ID);
4223 unsigned EffectCount = epi.FunctionEffects.size();
4224 bool HasConds = !epi.FunctionEffects.Conditions.empty();
4226 ID.AddInteger((EffectCount << 3) | (HasConds << 2) |
4227 (epi.AArch64SMEAttributes << 1) | epi.HasTrailingReturn);
4228 ID.AddInteger(epi.CFIUncheckedCallee);
4230 for (
unsigned Idx = 0; Idx != EffectCount; ++Idx) {
4231 ID.AddInteger(epi.FunctionEffects.Effects[Idx].toOpaqueInt32());
4233 ID.AddPointer(epi.FunctionEffects.Conditions[Idx].getCondition());
4244 : Data(D, Deref << DerefShift) {}
4247 return Data.getInt() & DerefMask;
4252 return Data.getOpaqueValue();
4259 Data.setFromOpaqueValue(
V);
4262OverflowBehaviorType::OverflowBehaviorType(
4264 OverflowBehaviorType::OverflowBehaviorKind Kind)
4265 :
Type(OverflowBehavior, Canon, Underlying->getDependence()),
4266 UnderlyingType(Underlying), BehaviorKind(Kind), Context(Context) {}
4268SplitQualType OverflowBehaviorType::getSplitUnqualifiedType()
const {
4270 QualType UnqualUnderlyingTy(SplitUnderlying.
Ty, 0);
4271 if (UnqualUnderlyingTy == UnderlyingType)
4275 Context.getOverflowBehaviorType(BehaviorKind, UnqualUnderlyingTy);
4283CountAttributedType::CountAttributedType(
4287 CountExpr(CountExpr) {
4295 Decls = CoupledDecls;
4307 llvm::copy(Decls, Slots);
4308 return ArrayRef(Slots, Decls.size());
4316 ArrayRef<TypeCoupledDeclRefInfo>
Decls =
4318 return new (Ctx,
alignof(CountAttributedType)) CountAttributedType(
4319 Wrapped, Canon, CountExpr, CountInBytes, OrNull,
Decls);
4322void CountAttributedType::complete(
4325 assert(!CountExpr &&
"count expression is already set");
4326 assert(E &&
"completing with a null count expression");
4337#define ENUMERATE_ATTRS(PREFIX) \
4339 if (isCountInBytes()) { \
4341 return PREFIX "sized_by_or_null"; \
4342 return PREFIX "sized_by"; \
4345 return PREFIX "counted_by_or_null"; \
4346 return PREFIX "counted_by"; \
4349 if (WithMacroPrefix)
4354#undef ENUMERATE_ATTRS
4360 bool HasTypeDifferentFromDecl)
4362 Keyword, TC, UnderlyingType.getCanonicalType(),
4366 ~NestedNameSpecifierDependence::
Dependent)
4370 *getTrailingObjects<NestedNameSpecifier>() = Qualifier;
4371 if ((
TypedefBits.hasTypeDifferentFromDecl = HasTypeDifferentFromDecl))
4372 *getTrailingObjects<QualType>() = UnderlyingType;
4377 : *getTrailingObjects<QualType>();
4383 const Type *CanonicalType)
4389 ~NestedNameSpecifierDependence::
Dependent)
4393 *getTrailingObjects<NestedNameSpecifier>() = Qualifier;
4402 if ((
UsingBits.hasQualifier = !!Qualifier))
4403 *getTrailingObjects() = Qualifier;
4412 while (
auto *InnerMQT = dyn_cast<MacroQualifiedType>(Inner)) {
4415 Inner = InnerMQT->getModifiedType();
4426 ? Context.getUnqualifiedArrayType(Can).getAtomicUnqualifiedType()
4431 TOExpr(E), Context(Context) {
4432 TypeOfBits.Kind =
static_cast<unsigned>(Kind);
4441 ? Context.getUnqualifiedArrayType(QT).getAtomicUnqualifiedType()
4450 E->
Profile(ID, Context,
true);
4451 ID.AddBoolean(IsUnqual);
4458 ? Context.getUnqualifiedArrayType(Can).getAtomicUnqualifiedType()
4460 T->getDependence()),
4461 TOType(
T), Context(Context) {
4462 TypeOfBits.Kind =
static_cast<unsigned>(Kind);
4465QualType TypeOfType::desugar()
const {
4468 ? Context.getUnqualifiedArrayType(QT).getAtomicUnqualifiedType()
4476 :
Type(Decltype, can,
4480 (E->
getType()->getDependence() &
4482 E(E), UnderlyingType(underlyingType) {}
4486QualType DecltypeType::desugar()
const {
4493DependentDecltypeType::DependentDecltypeType(
Expr *E)
4496void DependentDecltypeType::Profile(llvm::FoldingSetNodeID &ID,
4498 E->
Profile(ID, Context,
true);
4502 Expr *IndexExpr,
bool FullySubstituted,
4504 :
Type(PackIndexing, Canonical,
4506 Pattern(Pattern), IndexExpr(IndexExpr),
Size(Expansions.size()),
4507 FullySubstituted(FullySubstituted) {
4509 llvm::uninitialized_copy(Expansions, getTrailingObjects());
4513 if (isInstantiationDependentType())
4514 return std::nullopt;
4516 ConstantExpr *CE = dyn_cast<ConstantExpr>(getIndexExpr());
4518 return std::nullopt;
4520 assert(Index.isNonNegative() &&
"Invalid index");
4521 return static_cast<unsigned>(Index.getExtValue());
4525PackIndexingType::computeDependence(
QualType Pattern,
Expr *IndexExpr,
4530 ? TypeDependence::DependentInstantiation
4531 : TypeDependence::None);
4532 if (Expansions.empty())
4533 TD |= Pattern->
getDependence() & TypeDependence::DependentInstantiation;
4536 TD |=
T->getDependence();
4538 if (!(IndexD & TypeDependence::UnexpandedPack))
4544 TD |= TypeDependence::Error | TypeDependence::DependentInstantiation;
4549void PackIndexingType::Profile(llvm::FoldingSetNodeID &ID,
4551 Profile(ID, Context, getPattern(), getIndexExpr(), isFullySubstituted(),
4555void PackIndexingType::Profile(llvm::FoldingSetNodeID &ID,
4557 Expr *E,
bool FullySubstituted,
4560 E->
Profile(ID, Context,
true);
4561 ID.AddBoolean(FullySubstituted);
4562 if (!Expansions.empty()) {
4563 ID.AddInteger(Expansions.size());
4565 T.getCanonicalType().Profile(ID);
4571UnaryTransformType::UnaryTransformType(
QualType BaseType,
4572 QualType UnderlyingType, UTTKind UKind,
4574 :
Type(UnaryTransform, CanonicalType, BaseType->getDependence()),
4575 BaseType(BaseType), UnderlyingType(UnderlyingType), UKind(UKind) {}
4579 bool OwnsTag,
bool ISInjected,
const Type *CanonicalType)
4586 ~NestedNameSpecifierDependence::
Dependent)
4590 getTrailingQualifier() = Qualifier;
4595void *TagType::getTrailingPointer()
const {
4596 switch (getTypeClass()) {
4601 case Type::InjectedClassName:
4602 return const_cast<InjectedClassNameType *
>(
4605 llvm_unreachable(
"unexpected type class");
4610 assert(TagTypeBits.HasQualifier);
4612 getTrailingPointer(), llvm::Align::Of<NestedNameSpecifier *>()));
4616 return TagTypeBits.HasQualifier ? getTrailingQualifier() : std::nullopt;
4620 auto *
Decl = dyn_cast<CXXRecordDecl>(
decl);
4623 if (
auto *RD = dyn_cast<ClassTemplateSpecializationDecl>(
Decl))
4624 return RD->getSpecializedTemplate();
4625 return Decl->getDescribedClassTemplate();
4629 auto *TD = getTemplateDecl();
4632 if (isCanonicalUnqualified())
4639TagType::getTemplateArgs(
const ASTContext &Ctx)
const {
4640 auto *
Decl = dyn_cast<CXXRecordDecl>(
decl);
4644 if (
auto *RD = dyn_cast<ClassTemplateSpecializationDecl>(
Decl))
4645 return RD->getTemplateArgs().asArray();
4647 return TD->getTemplateParameters()->getInjectedTemplateArgs(Ctx);
4651bool RecordType::hasConstFields()
const {
4652 std::vector<const RecordType *> RecordTypeList;
4653 RecordTypeList.push_back(
this);
4654 unsigned NextToCheckIndex = 0;
4656 while (RecordTypeList.size() > NextToCheckIndex) {
4657 for (
FieldDecl *FD : RecordTypeList[NextToCheckIndex]
4659 ->getDefinitionOrSelf()
4665 if (
const auto *FieldRecTy = FieldTy->
getAsCanonical<RecordType>()) {
4666 if (!llvm::is_contained(RecordTypeList, FieldRecTy))
4667 RecordTypeList.push_back(FieldRecTy);
4677 const TagDecl *TD,
bool IsInjected,
4678 const Type *CanonicalType)
4680 false, IsInjected, CanonicalType) {}
4689 :
Type(Attributed, canon, equivalent->getDependence()), Attribute(
attr),
4690 ModifiedType(modified), EquivalentType(equivalent) {
4692 assert(!attr ||
attr->getKind() == attrKind);
4695bool AttributedType::isQualifier()
const {
4697 switch (getAttrKind()) {
4702 case attr::ObjCOwnership:
4703 case attr::ObjCInertUnsafeUnretained:
4704 case attr::TypeNonNull:
4705 case attr::TypeNullable:
4706 case attr::TypeNullableResult:
4707 case attr::TypeNullUnspecified:
4708 case attr::LifetimeBound:
4709 case attr::AddressSpace:
4719bool AttributedType::isMSTypeSpec()
const {
4721 switch (getAttrKind()) {
4730 llvm_unreachable(
"invalid attr kind");
4733bool AttributedType::isWebAssemblyFuncrefSpec()
const {
4734 return getAttrKind() == attr::WebAssemblyFuncref;
4737bool AttributedType::isCallingConv()
const {
4739 switch (getAttrKind()) {
4744 case attr::FastCall:
4746 case attr::ThisCall:
4748 case attr::SwiftCall:
4749 case attr::SwiftAsyncCall:
4750 case attr::VectorCall:
4751 case attr::AArch64VectorPcs:
4752 case attr::AArch64SVEPcs:
4753 case attr::DeviceKernel:
4757 case attr::IntelOclBicc:
4758 case attr::PreserveMost:
4759 case attr::PreserveAll:
4761 case attr::PreserveNone:
4762 case attr::RISCVVectorCC:
4763 case attr::RISCVVLSCC:
4766 llvm_unreachable(
"invalid attr kind");
4770 return isCanonicalUnqualified() ?
nullptr : getDecl()->getIdentifier();
4773SubstTemplateTypeParmType::SubstTemplateTypeParmType(
QualType Replacement,
4774 Decl *AssociatedDecl,
4778 :
Type(SubstTemplateTypeParm, Replacement.getCanonicalType(),
4779 Replacement->getDependence()),
4780 AssociatedDecl(AssociatedDecl) {
4784 *getTrailingObjects() = Replacement;
4790 assert(AssociatedDecl !=
nullptr);
4794SubstTemplateTypeParmType::getReplacedParameter()
const {
4799SubstPackType::SubstPackType(TypeClass Derived,
QualType Canon,
4801 :
Type(Derived, Canon,
4805 assert(llvm::all_of(
4807 [](
auto &P) { return P.getKind() == TemplateArgument::Type; }) &&
4808 "non-type argument to SubstPackType?");
4816void SubstPackType::Profile(llvm::FoldingSetNodeID &ID) {
4817 Profile(ID, getArgumentPack());
4820void SubstPackType::Profile(llvm::FoldingSetNodeID &ID,
4824 ID.AddPointer(P.getAsType().getAsOpaquePtr());
4827SubstTemplateTypeParmPackType::SubstTemplateTypeParmPackType(
4828 QualType Canon,
Decl *AssociatedDecl,
unsigned Index,
bool Final,
4830 : SubstPackType(SubstTemplateTypeParmPack, Canon, ArgPack),
4831 AssociatedDeclAndFinal(AssociatedDecl, Final) {
4832 assert(AssociatedDecl !=
nullptr);
4835 assert(getNumArgs() == ArgPack.
pack_size() &&
4836 "Parent bitfields in SubstPackType were overwritten."
4837 "Check NumSubstPackTypeBits.");
4840Decl *SubstTemplateTypeParmPackType::getAssociatedDecl()
const {
4841 return AssociatedDeclAndFinal.getPointer();
4844bool SubstTemplateTypeParmPackType::getFinal()
const {
4845 return AssociatedDeclAndFinal.getInt();
4849SubstTemplateTypeParmPackType::getReplacedParameter()
const {
4854IdentifierInfo *SubstTemplateTypeParmPackType::getIdentifier()
const {
4855 return getReplacedParameter()->getIdentifier();
4858void SubstTemplateTypeParmPackType::Profile(llvm::FoldingSetNodeID &ID) {
4859 Profile(ID, getAssociatedDecl(),
getIndex(), getFinal(), getArgumentPack());
4862void SubstTemplateTypeParmPackType::Profile(llvm::FoldingSetNodeID &ID,
4863 const Decl *AssociatedDecl,
4864 unsigned Index,
bool Final,
4866 ID.AddPointer(AssociatedDecl);
4867 ID.AddInteger(Index);
4868 ID.AddBoolean(Final);
4869 SubstPackType::Profile(ID, ArgPack);
4872SubstBuiltinTemplatePackType::SubstBuiltinTemplatePackType(
4874 : SubstPackType(SubstBuiltinTemplatePack, Canon, ArgPack) {}
4876bool TemplateSpecializationType::anyDependentTemplateArguments(
4879 return anyDependentTemplateArguments(Args.
arguments(), Converted);
4882bool TemplateSpecializationType::anyDependentTemplateArguments(
4885 if (Arg.isDependent())
4890bool TemplateSpecializationType::anyInstantiationDependentTemplateArguments(
4893 if (ArgLoc.getArgument().isInstantiationDependent())
4902 ? TypeDependence::DependentInstantiation
4907 D |= TypeDependence::UnexpandedPack;
4909 D |= (Underlying->
getDependence() & TypeDependence::UnexpandedPack);
4914TemplateSpecializationType::TemplateSpecializationType(
4918 Underlying.isNull() ?
QualType(this, 0)
4919 : Underlying.getCanonicalType(),
4922 TemplateSpecializationTypeBits.NumArgs = Args.size();
4923 TemplateSpecializationTypeBits.TypeAlias = IsAlias;
4925 auto *TemplateArgs =
4937 ~TypeDependence::Dependent);
4939 addDependence(Arg.getAsType()->getDependence() &
4940 TypeDependence::VariablyModified);
4947 *
reinterpret_cast<QualType *
>(TemplateArgs) = Underlying;
4950QualType TemplateSpecializationType::getAliasedType()
const {
4951 assert(isTypeAlias() &&
"not a type alias template specialization");
4952 return *
reinterpret_cast<const QualType *
>(template_arguments().end());
4955bool clang::TemplateSpecializationType::isSugared()
const {
4956 return !isDependentType() || isCurrentInstantiation() || isTypeAlias() ||
4961void TemplateSpecializationType::Profile(llvm::FoldingSetNodeID &ID,
4963 Profile(ID, getKeyword(),
Template, template_arguments(),
4964 isSugared() ? desugar() :
QualType(), Ctx);
4967void TemplateSpecializationType::Profile(llvm::FoldingSetNodeID &ID,
4973 ID.AddInteger(llvm::to_underlying(
Keyword));
4977 ID.AddInteger(Args.size());
4979 Arg.Profile(ID, Context);
4987 return Context.getQualifiedType(QT, *
this);
4991 const Type *
T)
const {
4995 return Context.getQualifiedType(
T, *
this);
4998void ObjCObjectTypeImpl::Profile(llvm::FoldingSetNodeID &ID,
QualType BaseType,
5002 ID.AddPointer(BaseType.getAsOpaquePtr());
5003 ID.AddInteger(typeArgs.size());
5004 for (
auto typeArg : typeArgs)
5005 ID.AddPointer(typeArg.getAsOpaquePtr());
5006 ID.AddInteger(protocols.size());
5007 for (
auto *proto : protocols)
5008 ID.AddPointer(proto);
5009 ID.AddBoolean(isKindOf);
5012void ObjCObjectTypeImpl::Profile(llvm::FoldingSetNodeID &ID) {
5013 Profile(ID, getBaseType(), getTypeArgsAsWritten(),
5015 isKindOfTypeAsWritten());
5021class CachedProperties {
5026 CachedProperties(
Linkage L,
bool local) : L(L), local(local) {}
5028 Linkage getLinkage()
const {
return L; }
5029 bool hasLocalOrUnnamedType()
const {
return local; }
5031 friend CachedProperties
merge(CachedProperties L, CachedProperties R) {
5033 return CachedProperties(MergedLinkage, L.hasLocalOrUnnamedType() ||
5034 R.hasLocalOrUnnamedType());
5053 return CachedProperties(
T->TypeBits.getLinkage(),
5054 T->TypeBits.hasLocalOrUnnamedType());
5059 if (
T->TypeBits.isCacheValid())
5064 if (!
T->isCanonicalUnqualified()) {
5065 const Type *CT =
T->getCanonicalTypeInternal().getTypePtr();
5067 T->TypeBits.CacheValid =
true;
5068 T->TypeBits.CachedLinkage = CT->
TypeBits.CachedLinkage;
5069 T->TypeBits.CachedLocalOrUnnamed = CT->
TypeBits.CachedLocalOrUnnamed;
5075 T->TypeBits.CacheValid =
true;
5076 T->TypeBits.CachedLinkage = llvm::to_underlying(
Result.getLinkage());
5077 T->TypeBits.CachedLocalOrUnnamed =
Result.hasLocalOrUnnamedType();
5095 switch (
T->getTypeClass()) {
5096#define TYPE(Class, Base)
5097#define NON_CANONICAL_TYPE(Class, Base) case Type::Class:
5098#include "clang/AST/TypeNodes.inc"
5099 llvm_unreachable(
"didn't expect a non-canonical type here");
5101#define TYPE(Class, Base)
5102#define DEPENDENT_TYPE(Class, Base) case Type::Class:
5103#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base) case Type::Class:
5104#include "clang/AST/TypeNodes.inc"
5106 assert(
T->isInstantiationDependentType());
5110 case Type::DeducedTemplateSpecialization:
5124 const auto *Tag =
cast<TagType>(
T)->getDecl()->getDefinitionOrSelf();
5130 Linkage L = Tag->getLinkageInternal();
5131 bool IsLocalOrUnnamed = Tag->getDeclContext()->isFunctionOrMethod() ||
5132 !Tag->hasNameForLinkage();
5133 return CachedProperties(L, IsLocalOrUnnamed);
5143 case Type::BlockPointer:
5145 case Type::LValueReference:
5146 case Type::RValueReference:
5148 case Type::MemberPointer: {
5150 CachedProperties Cls = [&] {
5151 if (MPT->isSugared())
5153 return Cache::get(MPT->getQualifier().getAsType());
5155 return merge(Cls,
Cache::get(MPT->getPointeeType()));
5157 case Type::ConstantArray:
5158 case Type::IncompleteArray:
5159 case Type::VariableArray:
5160 case Type::ArrayParameter:
5163 case Type::ExtVector:
5165 case Type::ConstantMatrix:
5167 case Type::FunctionNoProto:
5169 case Type::FunctionProto: {
5171 CachedProperties result =
Cache::get(FPT->getReturnType());
5172 for (
const auto &ai : FPT->param_types())
5176 case Type::ObjCInterface: {
5178 return CachedProperties(L,
false);
5180 case Type::ObjCObject:
5182 case Type::ObjCObjectPointer:
5188 case Type::HLSLAttributedResource:
5190 case Type::HLSLInlineSpirv:
5192 case Type::OverflowBehavior:
5196 llvm_unreachable(
"unhandled type class");
5207 return TypeBits.hasLocalOrUnnamedType();
5211 switch (
T->getTypeClass()) {
5212#define TYPE(Class, Base)
5213#define NON_CANONICAL_TYPE(Class, Base) case Type::Class:
5214#include "clang/AST/TypeNodes.inc"
5215 llvm_unreachable(
"didn't expect a non-canonical type here");
5217#define TYPE(Class, Base)
5218#define DEPENDENT_TYPE(Class, Base) case Type::Class:
5219#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base) case Type::Class:
5220#include "clang/AST/TypeNodes.inc"
5222 assert(
T->isInstantiationDependentType());
5230 case Type::DeducedTemplateSpecialization:
5242 case Type::BlockPointer:
5244 case Type::LValueReference:
5245 case Type::RValueReference:
5247 case Type::MemberPointer: {
5250 if (
auto *D = MPT->getMostRecentCXXRecordDecl()) {
5258 case Type::ConstantArray:
5259 case Type::IncompleteArray:
5260 case Type::VariableArray:
5261 case Type::ArrayParameter:
5264 case Type::ExtVector:
5266 case Type::ConstantMatrix:
5269 case Type::FunctionNoProto:
5271 case Type::FunctionProto: {
5274 for (
const auto &ai : FPT->param_types())
5278 case Type::ObjCInterface:
5280 case Type::ObjCObject:
5282 case Type::ObjCObjectPointer:
5289 case Type::OverflowBehavior:
5292 case Type::HLSLAttributedResource:
5295 case Type::HLSLInlineSpirv:
5299 llvm_unreachable(
"unhandled type class");
5313 if (!
T->isCanonicalUnqualified())
5327 while (
const auto *AT =
Type->getAs<AttributedType>()) {
5330 if (
auto Nullability = AT->getImmediateNullability())
5333 Type = AT->getEquivalentType();
5335 return std::nullopt;
5341 switch (
type->getTypeClass()) {
5342#define NON_CANONICAL_TYPE(Class, Parent) \
5345 llvm_unreachable("non-canonical type");
5346#define TYPE(Class, Parent)
5347#include "clang/AST/TypeNodes.inc"
5351 case Type::BlockPointer:
5352 case Type::MemberPointer:
5353 case Type::ObjCObjectPointer:
5357 case Type::UnresolvedUsing:
5358 case Type::TypeOfExpr:
5360 case Type::Decltype:
5361 case Type::PackIndexing:
5362 case Type::UnaryTransform:
5363 case Type::TemplateTypeParm:
5364 case Type::SubstTemplateTypeParmPack:
5365 case Type::SubstBuiltinTemplatePack:
5366 case Type::DependentName:
5368 return ResultIfUnknown;
5371 case Type::TemplateSpecialization:
5376 .getAsTemplateDecl())
5377 if (
auto *CTD = dyn_cast<ClassTemplateDecl>(templateDecl))
5378 return llvm::any_of(
5380 return RTD->getTemplatedDecl()->hasAttr<TypeNullableAttr>();
5382 return ResultIfUnknown;
5387#define SIGNED_TYPE(Id, SingletonId) case BuiltinType::Id:
5388#define UNSIGNED_TYPE(Id, SingletonId) case BuiltinType::Id:
5389#define FLOATING_TYPE(Id, SingletonId) case BuiltinType::Id:
5390#define BUILTIN_TYPE(Id, SingletonId)
5391#include "clang/AST/BuiltinTypes.def"
5394 case BuiltinType::UnresolvedTemplate:
5396 case BuiltinType::Dependent:
5397 case BuiltinType::Overload:
5398 case BuiltinType::BoundMember:
5399 case BuiltinType::PseudoObject:
5400 case BuiltinType::UnknownAny:
5401 case BuiltinType::ARCUnbridgedCast:
5402 return ResultIfUnknown;
5404 case BuiltinType::Void:
5405 case BuiltinType::ObjCId:
5406 case BuiltinType::ObjCClass:
5407 case BuiltinType::ObjCSel:
5408#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
5409 case BuiltinType::Id:
5410#include "clang/Basic/OpenCLImageTypes.def"
5411#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) case BuiltinType::Id:
5412#include "clang/Basic/OpenCLExtensionTypes.def"
5413 case BuiltinType::OCLSampler:
5414 case BuiltinType::OCLEvent:
5415 case BuiltinType::OCLClkEvent:
5416 case BuiltinType::OCLQueue:
5417 case BuiltinType::OCLReserveID:
5418#define SVE_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
5419#include "clang/Basic/AArch64ACLETypes.def"
5420#define PPC_VECTOR_TYPE(Name, Id, Size) case BuiltinType::Id:
5421#include "clang/Basic/PPCTypes.def"
5422#define RVV_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
5423#include "clang/Basic/RISCVVTypes.def"
5424#define WASM_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
5425#include "clang/Basic/WebAssemblyReferenceTypes.def"
5426#define AMDGPU_TYPE(Name, Id, SingletonId, Width, Align) case BuiltinType::Id:
5427#include "clang/Basic/AMDGPUTypes.def"
5428#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
5429#include "clang/Basic/HLSLIntangibleTypes.def"
5430#define HLSL_PACKED_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
5431#include "clang/Basic/HLSLPackedTypes.def"
5432#define SPIRV_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
5433#include "clang/Basic/SPIRVTypes.def"
5434 case BuiltinType::BuiltinFn:
5435 case BuiltinType::NullPtr:
5436 case BuiltinType::MetaInfo:
5437 case BuiltinType::IncompleteMatrixIdx:
5438 case BuiltinType::ArraySection:
5439 case BuiltinType::OMPArrayShaping:
5440 case BuiltinType::OMPIterator:
5443 llvm_unreachable(
"unknown builtin type");
5445 case Type::Record: {
5449 if (
const auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(RD))
5450 return llvm::any_of(
5451 CTSD->getSpecializedTemplate()->redecls(),
5453 return RTD->getTemplatedDecl()->hasAttr<TypeNullableAttr>();
5456 return RD->hasAttr<TypeNullableAttr>();
5462 case Type::LValueReference:
5463 case Type::RValueReference:
5464 case Type::ConstantArray:
5465 case Type::IncompleteArray:
5466 case Type::VariableArray:
5467 case Type::DependentSizedArray:
5468 case Type::DependentVector:
5469 case Type::DependentSizedExtVector:
5471 case Type::ExtVector:
5472 case Type::ConstantMatrix:
5473 case Type::DependentSizedMatrix:
5474 case Type::DependentAddressSpace:
5475 case Type::FunctionProto:
5476 case Type::FunctionNoProto:
5477 case Type::DeducedTemplateSpecialization:
5479 case Type::InjectedClassName:
5480 case Type::PackExpansion:
5481 case Type::ObjCObject:
5482 case Type::ObjCInterface:
5486 case Type::DependentBitInt:
5487 case Type::ArrayParameter:
5488 case Type::HLSLAttributedResource:
5489 case Type::HLSLInlineSpirv:
5490 case Type::OverflowBehavior:
5493 llvm_unreachable(
"bad type kind!");
5497 if (getAttrKind() == attr::TypeNonNull)
5499 if (getAttrKind() == attr::TypeNullable)
5501 if (getAttrKind() == attr::TypeNullUnspecified)
5503 if (getAttrKind() == attr::TypeNullableResult)
5505 return std::nullopt;
5510 if (
auto MacroTy = dyn_cast<MacroQualifiedType>(
T))
5511 AttrTy = MacroTy->getUnderlyingType();
5513 if (
auto attributed = dyn_cast<AttributedType>(AttrTy)) {
5514 if (
auto nullability = attributed->getImmediateNullability()) {
5515 T = attributed->getModifiedType();
5520 return std::nullopt;
5523void AttributedType::Profile(llvm::FoldingSetNodeID &ID,
const ASTContext &Ctx,
5526 ID.AddInteger(attrKind);
5530 attr->Profile(ID, Ctx);
5544 if (objcPtr->isObjCIdType()) {
5555 }
else if (objcPtr->isObjCQualifiedIdType()) {
5580 "cannot query implicit lifetime for non-inferrable type");
5585 while (
const auto *array = dyn_cast<ArrayType>(canon))
5586 canon = array->getElementType().getTypePtr();
5588 if (
const auto *
opt = dyn_cast<ObjCObjectPointerType>(canon)) {
5590 if (
opt->getObjectType()->isObjCClass())
5599 return typedefType->getDecl()->hasAttr<ObjCNSObjectAttr>();
5605 return typedefType->getDecl()->hasAttr<ObjCIndependentClassAttr>();
5618 return OPT->getPointeeType()->isObjCIndirectLifetimeType();
5620 return Ref->getPointeeType()->isObjCIndirectLifetimeType();
5622 return MemPtr->getPointeeType()->isObjCIndirectLifetimeType();
5630 while (
const ArrayType *array =
type->getAsArrayTypeUnsafe())
5631 type = array->getElementType().getTypePtr();
5632 return type->isObjCRetainableType();
5654 return RT->getDecl()
5655 ->getMostRecentDecl()
5656 ->hasAttr<CUDADeviceBuiltinSurfaceTypeAttr>();
5663 return RT->getDecl()
5664 ->getMostRecentDecl()
5665 ->hasAttr<CUDADeviceBuiltinTextureTypeAttr>();
5677 if (
const auto *BT = dyn_cast<BuiltinType>(Ty))
5678 return BT->getKind() == BuiltinType::AMDGPUNamedWorkgroupBarrier;
5679 if (AllowWrappers) {
5680 if (
const auto *RT = dyn_cast<RecordType>(Ty))
5681 return RT->getDecl()->hasAttr<AMDGPUNamedBarrierWrapperAttr>();
5699 return ptr->getPointeeType()->hasSizedVLAType();
5701 return ref->getPointeeType()->hasSizedVLAType();
5707 return arr->getElementType()->hasSizedVLAType();
5714 return HLSLAttributedResourceType::findHandleTypeOnResource(
this) !=
nullptr;
5737 const RecordType *RT =
5743 assert(RD !=
nullptr &&
5744 "all HLSL structs and classes should be CXXRecordDecl");
5751 if (
const auto *RD =
5753 if (!RD->isHLSLBuiltinRecord() && RD->isStandardLayout())
5760 switch (
type.getObjCLifetime()) {
5772 if (
const auto *RD =
type->getBaseElementTypeUnsafe()->getAsRecordDecl()) {
5773 if (
const auto *CXXRD = dyn_cast<CXXRecordDecl>(RD)) {
5775 if (CXXRD->hasDefinition() && !CXXRD->hasTrivialDestructor())
5790 llvm::SmallPtrSetImpl<const Decl *> &Seen) {
5791 if (
const auto *Arr = Context.getAsArrayType(Ty))
5792 Ty = Context.getBaseElementType(Arr);
5794 if (
const auto *AttrTy = Ty->
getAs<AttributedType>())
5795 Ty = AttrTy->getModifiedType();
5798 "Incomplete types cannot be evaluated for laundering");
5805 if (!Seen.insert(
Record).second)
5808 if (
Record->isDynamicClass())
5834 Qualifier.Profile(ID);
5846 auto *RD = getCXXRecordDecl();
5853 llvm::APSInt Val,
unsigned Scale) {
5854 llvm::FixedPointSemantics FXSema(Val.getBitWidth(), Scale, Val.isSigned(),
5857 llvm::APFixedPoint(Val, FXSema).toString(Str);
5860DeducedType::DeducedType(TypeClass TC,
DeducedKind DK,
5863 ? DeducedAsTypeOrCanon.getCanonicalType()
5864 : DeducedAsTypeOrCanon,
5866 DeducedTypeBits.Kind = llvm::to_underlying(DK);
5871 assert(!DeducedAsTypeOrCanon.
isNull() &&
"Deduced type cannot be null");
5873 ~TypeDependence::VariablyModified);
5874 DeducedAsType = DeducedAsTypeOrCanon;
5877 addDependence(TypeDependence::UnexpandedPack);
5880 addDependence(TypeDependence::DependentInstantiation);
5883 assert(getDeducedKind() == DK &&
"DeducedKind does not match the type state");
5889 : DeducedType(
Auto, DK, DeducedAsTypeOrCanon) {
5890 AutoTypeBits.Keyword = llvm::to_underlying(
Keyword);
5891 AutoTypeBits.NumArgs = TypeConstraintArgs.size();
5892 this->TypeConstraintConcept = TypeConstraintConcept;
5893 assert(!TypeConstraintConcept.
isNull() || AutoTypeBits.NumArgs == 0);
5894 if (!TypeConstraintConcept.
isNull()) {
5896 "type-constraint does not name a concept");
5913void AutoType::Profile(llvm::FoldingSetNodeID &ID,
const ASTContext &Context,
5917 DeducedType::Profile(ID, DK,
Deduced);
5918 ID.AddInteger(llvm::to_underlying(
Keyword));
5921 Arg.Profile(ID, Context);
5924void AutoType::Profile(llvm::FoldingSetNodeID &ID,
const ASTContext &Context) {
5925 Profile(ID, Context, getDeducedKind(), getDeducedType(), getKeyword(),
5926 getTypeConstraintConcept(), getTypeConstraintArguments());
5940 llvm_unreachable(
"unknown effect kind");
5946 return "nonblocking";
5948 return "nonallocating";
5952 return "allocating";
5954 llvm_unreachable(
"unknown effect kind");
5970 return std::nullopt;
5975 assert(0 &&
"effectProhibitingInference with non-inferable effect kind");
5978 llvm_unreachable(
"unknown effect kind");
5988 const Kind EK = Effect.kind();
5990 if (EK == CallerKind ||
6001 llvm_unreachable(
"unknown effect kind");
6013 unsigned InsertIdx = Effects.size();
6028 Errs.push_back({EC, NewEC});
6039 if (NewCondition || !Conditions.empty()) {
6040 if (Conditions.empty() && !Effects.empty())
6041 Conditions.resize(Effects.size());
6042 Conditions.insert(Conditions.begin() + InsertIdx,
6045 Effects.insert(Effects.begin() + InsertIdx, NewEC.
Effect);
6050 for (
const auto &Item :
Set)
6052 return Errs.empty();
6063 auto IterA = LHS.
begin(), EndA = LHS.
end();
6064 auto IterB = RHS.
begin(), EndB = RHS.
end();
6068 return std::tuple(LHS.Effect,
uintptr_t(LHS.Cond.getCondition())) <
6069 std::tuple(RHS.Effect,
uintptr_t(RHS.Cond.getCondition()));
6072 while (IterA != EndA && IterB != EndB) {
6077 else if (FEWCLess(B, A))
6088 assert(Errs.empty() &&
"conflict shouldn't be possible in getIntersection");
6101 Combined.
insert(RHS, Errs);
6122 llvm::interleaveComma(*
this, OS);
6132 llvm::interleaveComma(*
this, OS);
6139 assert(llvm::is_sorted(FX) &&
"effects should be sorted");
6140 assert((Conds.empty() || Conds.size() == FX.size()) &&
6141 "effects size should match conditions size");
6147 if (
Cond.getCondition() !=
nullptr)
6153HLSLAttributedResourceType::computeDependence(
QualType Contained,
6154 const Attributes &Attrs) {
6158 if (Attrs.SampleCountExpr)
6163HLSLAttributedResourceType::HLSLAttributedResourceType(
QualType Wrapped,
6165 const Attributes &Attrs)
6168 WrappedType(Wrapped), ContainedType(Contained), Attrs(Attrs) {}
6170void HLSLAttributedResourceType::Profile(llvm::FoldingSetNodeID &ID,
6173 const Attributes &Attrs) {
6176 ID.AddInteger(
static_cast<uint32_t>(Attrs.ResourceClass));
6177 ID.AddInteger(
static_cast<uint32_t>(Attrs.ResourceDimension));
6178 ID.AddBoolean(Attrs.IsROV);
6179 ID.AddBoolean(Attrs.RawBuffer);
6180 ID.AddBoolean(Attrs.IsCounter);
6181 ID.AddBoolean(Attrs.IsArray);
6182 ID.AddBoolean(Attrs.SampleCountExpr !=
nullptr);
6183 if (Attrs.SampleCountExpr)
6184 Attrs.SampleCountExpr->Profile(ID, Ctx,
true);
6187const HLSLAttributedResourceType *
6188HLSLAttributedResourceType::findHandleTypeOnResource(
const Type *RT) {
6193 if (!RD->
fields().empty()) {
6194 const auto &FirstFD = RD->
fields().begin();
6195 return dyn_cast<HLSLAttributedResourceType>(
6196 FirstFD->getType().getTypePtr());
6202StringRef PredefinedSugarType::getName(Kind KD) {
6207 return "__signed_size_t";
6209 return "__ptrdiff_t";
6211 llvm_unreachable(
"unexpected kind");
Defines the clang::ASTContext interface.
Provides definitions for the various language-specific address spaces.
static std::optional< NonLoc > getIndex(ProgramStateRef State, const ElementRegion *ER, CharKind CK)
static Decl::Kind getKind(const Decl *D)
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
Defines the C++ template declaration subclasses.
Defines the ExceptionSpecificationType enumeration and various utility functions.
Defines the clang::IdentifierInfo, clang::IdentifierTable, and clang::Selector interfaces.
#define CC_VLS_CASE(ABI_VLEN)
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified.
Defines the clang::LangOptions interface.
llvm::MachO::Record Record
static QualType getUnderlyingType(const SubRegion *R)
static RecordDecl * getAsRecordDecl(QualType BaseType, HeuristicResolver &Resolver)
static bool isRecordType(QualType T)
Defines various enumerations that describe declaration and type specifiers.
static QualType getPointeeType(const MemRegion *R)
Defines the TargetCXXABI class, which abstracts details of the C++ ABI that we're targeting.
static TypeDependence getTemplateSpecializationTypeDependence(QualType Underlying, TemplateName T)
#define ENUMERATE_ATTRS(PREFIX)
#define SUGARED_TYPE_CLASS(Class)
static ArrayRef< TypeCoupledDeclRefInfo > allocateCoupledDecls(const ASTContext &Ctx, ArrayRef< TypeCoupledDeclRefInfo > Decls)
Copy Decls into Ctx so a CountAttributedType can retain it by reference.
static MemoryRegion getMemoryRegion(LangAS AS)
static bool isConvertibleOpenCLSYCLAddressSpace(LangAS To, LangAS From)
static bool isAMDGPUNamedBarrierTypeImpl(const Type *Ty, bool AllowWrappers)
static bool requiresBuiltinLaunderImpl(const ASTContext &Context, QualType Ty, llvm::SmallPtrSetImpl< const Decl * > &Seen)
TypePropertyCache< Private > Cache
static bool isTriviallyCopyableTypeImpl(const QualType &type, const ASTContext &Context, bool IsCopyConstructible)
static const T * getAsSugar(const Type *Cur)
This will check for a T (which should be a Type which can act as sugar, such as a TypedefType) by rem...
#define TRIVIAL_TYPE_CLASS(Class)
static CachedProperties computeCachedProperties(const Type *T)
C Language Family Type Representation.
Defines the clang::Visibility enumeration and various utility functions.
__DEVICE__ void * memcpy(void *__a, const void *__b, size_t __c)
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
BuiltinVectorTypeInfo getBuiltinVectorTypeInfo(const BuiltinType *VecTy) const
Returns the element type, element count and number of vectors (in case of tuple) for a builtin vector...
QualType getAtomicType(QualType T) const
Return the uniqued reference to the atomic type for the specified type.
QualType getParenType(QualType NamedType) const
QualType getRValueReferenceType(QualType T) const
Return the uniqued reference to the type for an rvalue reference to the specified type.
QualType getConstantMatrixType(QualType ElementType, unsigned NumRows, unsigned NumColumns, std::optional< MatrixType::LayoutKind > Layout=std::nullopt) const
Return the unique reference to the matrix type of the specified element type and size.
QualType getObjCInterfaceType(const ObjCInterfaceDecl *Decl, ObjCInterfaceDecl *PrevDecl=nullptr) const
getObjCInterfaceType - Return the unique reference to the type for the specified ObjC interface decl.
QualType getAutoType(DeducedKind DK, QualType DeducedAsType, AutoTypeKeyword Keyword, TemplateName TypeConstraintConcept=TemplateName(), ArrayRef< TemplateArgument > TypeConstraintArgs={}) const
C++11 deduced auto type.
QualType getBlockPointerType(QualType T) const
Return the uniqued reference to the type for a block of the specified type.
QualType getAttributedType(attr::Kind attrKind, QualType modifiedType, QualType equivalentType, const Attr *attr=nullptr) const
QualType getFunctionNoProtoType(QualType ResultTy, const FunctionType::ExtInfo &Info) const
Return a K&R style C function type like 'int()'.
QualType getArrayParameterType(QualType Ty) const
Return the uniqued reference to a specified array parameter type from the original array type.
QualType getVectorType(QualType VectorType, unsigned NumElts, VectorKind VecKind) const
Return the unique reference to a vector type of the specified element type and size.
QualType getSubstTemplateTypeParmType(QualType Replacement, Decl *AssociatedDecl, unsigned Index, UnsignedOrNone PackIndex, bool Final) const
Retrieve a substitution-result type.
QualType getPointerType(QualType T) const
Return the uniqued reference to the type for a pointer to the specified type.
QualType getLValueReferenceType(QualType T, bool SpelledAsLValue=true) const
Return the uniqued reference to the type for an lvalue reference to the specified type.
QualType getConstantArrayType(QualType EltTy, const llvm::APInt &ArySize, const Expr *SizeExpr, ArraySizeModifier ASM, unsigned IndexTypeQuals) const
Return the unique reference to the type for a constant array of the specified element type.
const LangOptions & getLangOpts() const
QualType applyObjCProtocolQualifiers(QualType type, ArrayRef< ObjCProtocolDecl * > protocols, bool &hasError, bool allowOnPointerType=false) const
Apply Objective-C protocol qualifiers to the given type.
QualType getDecayedType(QualType T) const
Return the uniqued reference to the decayed version of the given type.
QualType getBaseElementType(const ArrayType *VAT) const
Return the innermost element type of an array type.
CanQualType ObjCBuiltinIdTy
IdentifierInfo * getNSObjectName() const
Retrieve the identifier 'NSObject'.
QualType getAdjustedType(QualType Orig, QualType New) const
Return the uniqued reference to a type adjusted from the original type to a new type.
QualType getQualifiedType(SplitQualType split) const
Un-split a SplitQualType.
QualType getObjCObjectPointerType(QualType OIT) const
Return a ObjCObjectPointerType type for the given ObjCObjectType.
QualType getObjCObjectType(QualType Base, ObjCProtocolDecl *const *Protocols, unsigned NumProtocols) const
Legacy interface: cannot provide type arguments or __kindof.
QualType getVariableArrayType(QualType EltTy, Expr *NumElts, ArraySizeModifier ASM, unsigned IndexTypeQuals) const
Return a non-unique reference to the type for a variable array of the specified element type.
const ArrayType * getAsArrayType(QualType T) const
Type Query functions.
uint64_t getTypeSize(QualType T) const
Return the size of the specified (complete) type T, in bits.
CanQualType UnsignedCharTy
void * Allocate(size_t Size, unsigned Align=8) const
TemplateName getQualifiedTemplateName(NestedNameSpecifier Qualifier, bool TemplateKeyword, TemplateName Template) const
Retrieve the template name that represents a qualified template name such as std::vector.
QualType getFunctionType(QualType ResultTy, ArrayRef< QualType > Args, const FunctionProtoType::ExtProtoInfo &EPI) const
Return a normal function type with a typed argument list.
QualType getMemberPointerType(QualType T, NestedNameSpecifier Qualifier, const CXXRecordDecl *Cls) const
Return the uniqued reference to the type for a member pointer to the specified type in the specified ...
QualType getComplexType(QualType T) const
Return the uniqued reference to the type for a complex number with the specified element type.
QualType getExtVectorType(QualType VectorType, unsigned NumElts) const
Return the unique reference to an extended vector type of the specified element type and size.
const TargetInfo & getTargetInfo() const
QualType getOverflowBehaviorType(const OverflowBehaviorAttr *Attr, QualType Wrapped) const
QualType getIncompleteArrayType(QualType EltTy, ArraySizeModifier ASM, unsigned IndexTypeQuals) const
Return a unique reference to the type for an incomplete array of the specified element type.
IdentifierInfo * getNSCopyingName()
Retrieve the identifier 'NSCopying'.
QualType getConstantArrayType(const ASTContext &Ctx) const
Represents an array type, per C99 6.7.5.2 - Array Declarators.
ArraySizeModifier getSizeModifier() const
Qualifiers getIndexTypeQualifiers() const
QualType getElementType() const
ArrayType(TypeClass tc, QualType et, QualType can, ArraySizeModifier sm, unsigned tq, const Expr *sz=nullptr)
Attr - This represents one attribute.
BitIntType(bool isUnsigned, unsigned NumBits)
[BoundsSafety] Represents a parent type class for CountAttributedType and similar sugar types that wi...
BoundsAttributedType(TypeClass TC, QualType Wrapped, QualType Canon)
decl_range dependent_decls() const
bool referencesFieldDecls() const
ArrayRef< TypeCoupledDeclRefInfo > Decls
This class is used for builtin types like 'int'.
StringRef getName(const PrintingPolicy &Policy) const
Represents a C++ struct/union/class.
bool isHLSLIntangible() const
Returns true if the class contains HLSL intangible type, either as a field or in base class.
bool mayBeNonDynamicClass() const
bool mayBeDynamicClass() const
CXXRecordDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
Declaration of a class template.
Complex values, per C99 6.2.5p11.
Represents the canonical version of C arrays with a specified constant size.
static unsigned getNumAddressingBits(const ASTContext &Context, QualType ElementType, const llvm::APInt &NumElements)
Determine the number of bits required to address a member of.
static unsigned getMaxSizeBits(const ASTContext &Context)
Determine the maximum number of active bits that an array's size can require, which limits the maximu...
const Expr * getSizeExpr() const
Return a pointer to the size expression.
llvm::APInt getSize() const
Return the constant array size as an APInt.
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Ctx)
An expression that occurs in a constant context and the result of evaluating the expression.
llvm::APSInt getResultAsAPSInt() const
std::optional< LayoutKind > Layout
unsigned NumRows
Number of rows and columns.
ConstantMatrixType(QualType MatrixElementType, unsigned NRows, unsigned NColumns, QualType CanonElementType, std::optional< LayoutKind > Layout)
Represents a sugar type with __counted_by or __sized_by annotations, including their _or_null variant...
void Profile(llvm::FoldingSetNodeID &ID)
StringRef getAttributeName(bool WithMacroPrefix) const
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
ASTContext & getParentASTContext() const
Decl - This represents one declaration (or definition), e.g.
bool isInStdNamespace() const
ASTContext & getASTContext() const LLVM_READONLY
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context)
Expr * getNumBitsExpr() const
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context)
DependentBitIntType(bool IsUnsigned, Expr *NumBits)
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context)
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context)
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context)
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context)
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context)
Expr * getCondition() const
This represents one expression.
bool isValueDependent() const
Determines whether the value of this expression depends on.
bool isInstantiationDependent() const
Whether this expression is instantiation-dependent, meaning that it depends in some way on.
ExprDependence getDependence() const
Represents a member of a struct/union/class.
A mutable set of FunctionEffect::Kind.
void dump(llvm::raw_ostream &OS) const
FunctionEffectSet()=default
bool insert(const FunctionEffectWithCondition &NewEC, Conflicts &Errs)
SmallVector< Conflict > Conflicts
static FunctionEffectSet getIntersection(FunctionEffectsRef LHS, FunctionEffectsRef RHS)
void dump(llvm::raw_ostream &OS) const
static FunctionEffectSet getUnion(FunctionEffectsRef LHS, FunctionEffectsRef RHS, Conflicts &Errs)
Kind kind() const
The kind of the effect.
Kind
Identifies the particular effect.
bool shouldDiagnoseFunctionCall(bool Direct, FunctionEffectKindSet CalleeFX) const
StringRef name() const
The description printed in diagnostics, e.g. 'nonblocking'.
Kind oppositeKind() const
Return the opposite kind, for effects which have opposites.
std::optional< FunctionEffect > effectProhibitingInference(const Decl &Callee, FunctionEffectKindSet CalleeFX) const
Determine whether the effect is allowed to be inferred on the callee, which is either a FunctionDecl ...
An immutable set of FunctionEffects and possibly conditions attached to them.
void dump(llvm::raw_ostream &OS) const
ArrayRef< FunctionEffect > effects() const
ArrayRef< EffectConditionExpr > conditions() const
static FunctionEffectsRef create(ArrayRef< FunctionEffect > FX, ArrayRef< EffectConditionExpr > Conds)
Asserts invariants.
FunctionEffectsRef()=default
bool hasDependentExceptionSpec() const
Return whether this function has a dependent exception spec.
param_type_iterator param_type_begin() const
ExceptionSpecificationType getExceptionSpecType() const
Get the kind of exception specification on this function.
bool isTemplateVariadic() const
Determines whether this function prototype contains a parameter pack at the end.
unsigned getNumParams() const
bool hasTrailingReturn() const
Whether this function prototype has a trailing return type.
QualType getParamType(unsigned i) const
QualType getExceptionType(unsigned i) const
Return the ith exception type, where 0 <= i < getNumExceptions().
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Ctx)
unsigned getNumExceptions() const
Return the number of types in the exception specification.
CanThrowResult canThrow() const
Determine whether this function type has a non-throwing exception specification.
ExtProtoInfo getExtProtoInfo() const
Expr * getNoexceptExpr() const
Return the expression inside noexcept(expression), or a null pointer if there is none (because the ex...
ArrayRef< QualType > getParamTypes() const
ArrayRef< QualType > exceptions() const
bool hasInstantiationDependentExceptionSpec() const
Return whether this function has an instantiation-dependent exception spec.
A class which abstracts out some details necessary for making a call.
ExtInfo getExtInfo() const
static StringRef getNameForCallConv(CallingConv CC)
bool getCFIUncheckedCalleeAttr() const
Determine whether this is a function prototype that includes the cfi_unchecked_callee attribute.
QualType getReturnType() const
FunctionType(TypeClass tc, QualType res, QualType Canonical, TypeDependence Dependence, ExtInfo Info)
One of these records is kept for each identifier that is lexed.
bool isStr(const char(&Str)[StrLen]) const
Return true if this is the identifier for the specified string.
LinkageInfo computeTypeLinkageInfo(const Type *T)
LinkageInfo getTypeLinkageAndVisibility(const Type *T)
LinkageInfo getDeclLinkageAndVisibility(const NamedDecl *D)
static LinkageInfo external()
Linkage getLinkage() const
void merge(LinkageInfo other)
Merge both linkage and visibility.
QualType getModifiedType() const
Return this attributed type's modified type with no qualifiers attached to it.
QualType getUnderlyingType() const
const IdentifierInfo * getMacroIdentifier() const
Represents a matrix type, as defined in the Matrix Types clang extensions.
MatrixType(QualType ElementTy, QualType CanonElementTy)
NestedNameSpecifier getQualifier() const
void Profile(llvm::FoldingSetNodeID &ID)
CXXRecordDecl * getMostRecentCXXRecordDecl() const
Note: this can trigger extra deserialization when external AST sources are used.
This represents a decl that may have a name.
IdentifierInfo * getIdentifier() const
Get the identifier that names this declaration, if there is one.
Represents a C++ nested name specifier, such as "\::std::vector<int>::".
CXXRecordDecl * getAsRecordDecl() const
Retrieve the record declaration stored in this nested name specifier, or null.
ObjCCategoryDecl - Represents a category declaration.
ObjCInterfaceDecl * getClassInterface()
ObjCTypeParamList * getTypeParamList() const
Retrieve the type parameter list associated with this category or extension.
Represents an ObjC class declaration.
ObjCTypeParamList * getTypeParamList() const
Retrieve the type parameters of this class.
const ObjCObjectType * getSuperClassType() const
Retrieve the superclass type.
ObjCInterfaceDecl * getCanonicalDecl() override
Retrieves the canonical declaration of this Objective-C class.
ObjCInterfaceDecl * getDefinition()
Retrieve the definition of this class, or NULL if this class has been forward-declared (with @class) ...
Represents typeof(type), a C23 feature and GCC extension, or `typeof_unqual(type),...
ObjCInterfaceDecl * getDecl() const
Get the declaration of this interface.
Represents a pointer to an Objective C object.
const ObjCObjectPointerType * stripObjCKindOfTypeAndQuals(const ASTContext &ctx) const
Strip off the Objective-C "kindof" type and (with it) any protocol qualifiers.
const ObjCObjectType * getObjectType() const
Gets the type pointed to by this ObjC pointer.
QualType getSuperClassType() const
Retrieve the type of the superclass of this object pointer type.
ObjCInterfaceDecl * getInterfaceDecl() const
If this pointer points to an Objective @interface type, gets the declaration for that interface.
const ObjCInterfaceType * getInterfaceType() const
If this pointer points to an Objective C @interface type, gets the type for that interface.
bool isKindOfType() const
Whether this is a "__kindof" type.
Represents an Objective-C protocol declaration.
Represents the declaration of an Objective-C type parameter.
unsigned getIndex() const
Retrieve the index into its type parameter list.
Stores a list of Objective-C type parameters for a parameterized class or a category/extension thereo...
unsigned size() const
Determine the number of type parameters in this list.
A (possibly-)qualified type.
bool hasAddressDiscriminatedPointerAuth() const
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.
QualType withFastQualifiers(unsigned TQs) 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...
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 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.
void Profile(llvm::FoldingSetNodeID &ID) const
QualType getDesugaredType(const ASTContext &Context) const
Return the specified type with any "sugar" removed from the type.
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
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.
bool isCXX98PODType(const ASTContext &Context) const
Return true if this is a POD type according to the rules of the C++98 standard, regardless of the cur...
bool hasPostfixDeclaratorSyntax() const
Returns true if the type uses postfix declarator syntax, i.e.
Qualifiers::ObjCLifetime getObjCLifetime() const
Returns lifetime attribute of this type.
QualType stripObjCKindOfType(const ASTContext &ctx) const
Strip Objective-C "__kindof" types from the given type.
QualType getCanonicalType() const
QualType getUnqualifiedType() const
Retrieve the unqualified variant of the given type, removing as little sugar as possible.
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.
bool isTrapType() const
Returns true if it is a OverflowBehaviorType of Trap kind.
SplitQualType split() const
Divides a QualType into its unqualified type and a set of local qualifiers.
bool UseExcessPrecision(const ASTContext &Ctx)
PrimitiveDefaultInitializeKind isNonTrivialToPrimitiveDefaultInitialize() const
Functions to query basic properties of non-trivial C struct types.
void * getAsOpaquePtr() const
QualType stripNullability(const ASTContext &ctx) const
Strip nullability attributes from the given type.
bool isWebAssemblyExternrefType() const
Returns true if it is a WebAssembly Externref Type.
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.
QualType substObjCTypeArgs(ASTContext &ctx, ArrayRef< QualType > typeArgs, ObjCSubstitutionContext context) const
Substitute type arguments for the Objective-C type parameters used in the subject type.
QualType getAtomicUnqualifiedType() const
Remove all qualifiers including _Atomic.
bool requiresBuiltinLaunder(const ASTContext &Context) const
Returns true if this type requires laundering by checking if it is a dynamic class type,...
bool isWrapType() const
Returns true if it is a OverflowBehaviorType of Wrap kind.
bool hasNonTrivialObjCLifetime() const
bool isPODType(const ASTContext &Context) const
Determine whether this is a Plain Old Data (POD) type (C++ 3.9p10).
PrimitiveCopyKind isNonTrivialToPrimitiveDestructiveMove() const
Check if this is a non-trivial type that would cause a C struct transitively containing this type to ...
@ 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.
bool hasNonTrivialToPrimitiveDefaultInitializeCUnion() const
Check if this is or contains a C union that is non-trivial to default-initialize, which is a union th...
A qualifier set is used to build a set of qualifiers.
const Type * strip(QualType type)
Collect any qualifiers on the given type and return an unqualified type.
QualType apply(const ASTContext &Context, QualType QT) const
Apply the collected qualifiers to the given type.
The collection of all-type qualifiers we support.
@ 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.
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 addConsistentQualifiers(Qualifiers qs)
Add the qualifiers from the given set to this set, given that they don't conflict.
static bool isTargetAddressSpaceSupersetOf(LangAS A, LangAS B, const ASTContext &Ctx)
bool hasAddressSpace() const
unsigned getFastQualifiers() const
bool hasObjCGCAttr() const
bool hasObjCLifetime() const
ObjCLifetime getObjCLifetime() const
LangAS getAddressSpace() const
Represents a struct/union/class.
bool hasNonTrivialToPrimitiveDestructCUnion() const
bool hasNonTrivialToPrimitiveCopyCUnion() const
bool hasNonTrivialToPrimitiveDefaultInitializeCUnion() const
bool isNonTrivialToPrimitiveDestroy() const
bool isNonTrivialToPrimitiveCopy() const
field_range fields() const
RecordDecl * getMostRecentDecl()
bool isNonTrivialToPrimitiveDefaultInitialize() const
Functions to query basic properties of non-trivial C structs.
Declaration of a redeclarable template.
Encodes a location in the source.
Stmt - This represents one statement.
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context, bool Canonical, bool ProfileLambdaExpr=false) const
Produce a unique representation of the given statement.
void dump() const
Dumps the specified AST fragment and all subtrees to llvm::errs().
Represents the declaration of a struct/union/class/enum.
redecl_range redecls() const
Returns an iterator range for all the redeclarations of the same decl.
bool isCompleteDefinition() const
Return true if this decl has its body fully specified.
NestedNameSpecifier getQualifier() const
Retrieve the nested-name-specifier that qualifies the name of this declaration, if it was present in ...
bool isDependentType() const
Whether this declaration declares a type that is dependent, i.e., a type that somehow depends on temp...
Exposes information about the current target.
virtual bool hasFullBFloat16Type() const
Determine whether the BFloat type is fully supported on this target, i.e arithemtic operations.
virtual bool hasFastHalfType() const
Determine whether the target has fast native support for operations on half types.
virtual bool hasFloat16Type() const
Determine whether the _Float16 type is supported on this target.
virtual bool hasBFloat16Type() const
Determine whether the _BFloat16 type is supported on this target.
virtual bool isAddressSpaceSupersetOf(LangAS A, LangAS B) const
Returns true if an address space can be safely converted to another.
A convenient class for passing around template argument information.
ArrayRef< TemplateArgumentLoc > arguments() const
Location wrapper for a TemplateArgument.
Represents a template argument.
unsigned pack_size() const
The number of template arguments in the given template argument pack.
ArrayRef< TemplateArgument > pack_elements() const
Iterator range referencing all of the elements of a template argument pack.
@ Type
The template argument is a type.
The base class of all kinds of template declarations (e.g., class, function, etc.).
Represents a C++ template name within the type system.
TemplateNameDependence getDependence() const
bool isNull() const
Determine whether this template name is NULL.
bool isConceptName() const
Determines whether this template name denotes a concept, or a template template parameter denoting on...
void Profile(llvm::FoldingSetNodeID &ID)
Declaration of a template type parameter.
[BoundsSafety] Represents information of declarations referenced by the arguments of the counted_by a...
ValueDecl * getDecl() const
bool operator==(const TypeCoupledDeclRefInfo &Other) const
void * getOpaqueValue() const
TypeCoupledDeclRefInfo(ValueDecl *D=nullptr, bool Deref=false)
D is to a declaration referenced by the argument of attribute.
void setFromOpaqueValue(void *V)
bool isSugared() const
Returns whether this type directly provides sugar.
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 desugar() const
Remove a single level of sugar.
static void ensure(const Type *T)
static CachedProperties get(QualType T)
static CachedProperties get(const Type *T)
A helper class for Type nodes having an ElaboratedTypeKeyword.
The base class of the type hierarchy.
bool isSizelessType() const
As an extension, we classify types as one of "sized" or "sizeless"; every type is one or the other.
bool isStructureType() const
bool isBlockPointerType() const
const ObjCObjectPointerType * getAsObjCQualifiedClassType() const
bool isLinkageValid() const
True if the computed linkage is valid.
TypedefBitfields TypedefBits
bool isBooleanType() const
const ObjCObjectType * getAsObjCQualifiedInterfaceType() const
const ObjCObjectPointerType * getAsObjCQualifiedIdType() const
const TemplateSpecializationType * getAsNonAliasTemplateSpecializationType() const
Look through sugar for an instance of TemplateSpecializationType which is not a type alias,...
bool isMFloat8Type() const
bool isSignedIntegerOrEnumerationType() const
Determines whether this is an integer type that is signed or an enumeration types whose underlying ty...
bool isPackedVectorBoolType(const ASTContext &ctx) const
bool hasAttr(attr::Kind AK) const
Determine whether this type had the specified attribute applied to it (looking through top-level type...
bool isAlwaysIncompleteType() const
QualType getRVVEltType(const ASTContext &Ctx) const
Returns the representative type for the element of an RVV builtin type.
const RecordType * getAsUnionType() const
NOTE: getAs*ArrayType are methods on ASTContext.
bool isLiteralType(const ASTContext &Ctx) const
Return true if this is a literal type (C++11 [basic.types]p10)
bool isSignedIntegerType() const
Return true if this is an integer type that is signed, according to C99 6.2.5p4 [char,...
bool isComplexType() const
isComplexType() does not include complex integers (a GCC extension).
ArrayTypeBitfields ArrayTypeBits
const ArrayType * castAsArrayTypeUnsafe() const
A variant of castAs<> for array type which silently discards qualifiers from the outermost type.
bool isUnsignedIntegerOrEnumerationType() const
Determines whether this is an integer type that is unsigned or an enumeration types whose underlying ...
bool isIntegralOrUnscopedEnumerationType() const
Determine whether this type is an integral or unscoped enumeration type.
CXXRecordDecl * getAsCXXRecordDecl() const
Retrieves the CXXRecordDecl that this type refers to, either because the type is a RecordType or beca...
VectorTypeBitfields VectorTypeBits
SubstPackTypeBitfields SubstPackTypeBits
RecordDecl * getAsRecordDecl() const
Retrieves the RecordDecl this type refers to.
bool hasIntegerRepresentation() const
Determine whether this type has an integer representation of some sort, e.g., it is an integer type o...
bool isVoidPointerType() const
const ComplexType * getAsComplexIntegerType() const
bool isConstantSizeType() const
Return true if this is not a variable sized type, according to the rules of C99 6....
QualType getLocallyUnqualifiedSingleStepDesugaredType() const
Pull a single level of sugar off of this locally-unqualified type.
bool isFunctionPointerType() const
bool isCountAttributedType() const
bool isObjCARCBridgableType() const
Determine whether the given type T is a "bridgable" Objective-C type, which is either an Objective-C ...
CXXRecordDecl * castAsCXXRecordDecl() const
bool isArithmeticType() const
bool isConstantMatrixType() const
bool isHLSLBuiltinIntangibleType() const
TypeOfBitfields TypeOfBits
bool isIntegerType() const
isIntegerType() does not include complex integers (a GCC extension).
bool isSVESizelessBuiltinType() const
Returns true for SVE scalable vector types.
const T * castAs() const
Member-template castAs<specific type>.
bool isReferenceType() const
bool isHLSLIntangibleType() const
bool isEnumeralType() const
void addDependence(TypeDependence D)
bool isObjCNSObjectType() const
Type(TypeClass tc, QualType canon, TypeDependence Dependence)
const ObjCObjectPointerType * getAsObjCInterfacePointerType() const
NestedNameSpecifier getPrefix() const
If this type represents a qualified-id, this returns its nested name specifier.
bool isScalarType() const
const CXXRecordDecl * getPointeeCXXRecordDecl() const
If this is a pointer or reference to a RecordType, return the CXXRecordDecl that the type refers to.
bool isInterfaceType() const
bool isVariableArrayType() const
bool isSizelessBuiltinType() const
bool isAMDGPUNamedBarrierTypeOrWrapper() const
Check if the type is the AMDGPU named barrier type/a RecordType of a named barrier wrapper,...
bool isCUDADeviceBuiltinSurfaceType() const
Check if the type is the CUDA device builtin surface type.
bool isSveVLSBuiltinType() const
Determines if this is a sizeless type supported by the 'arm_sve_vector_bits' type attribute,...
bool isIntegralType(const ASTContext &Ctx) const
Determine whether this type is an integral type.
bool isElaboratedTypeSpecifier() const
Determine wither this type is a C++ elaborated-type-specifier.
CountAttributedTypeBitfields CountAttributedTypeBits
const Type * getArrayElementTypeNoTypeQual() const
If this is an array type, return the element type of the array, potentially with type qualifiers miss...
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 hasUnsignedIntegerRepresentation() const
Determine whether this type has an unsigned integer representation of some sort, e....
bool isAnyCharacterType() const
Determine whether this type is any of the built-in character types.
bool isExtVectorBoolType() const
bool isWebAssemblyExternrefType() const
Check if this is a WebAssembly Externref Type.
bool canHaveNullability(bool ResultIfUnknown=true) const
Determine whether the given type can have a nullability specifier applied to it, i....
QualType getSveEltType(const ASTContext &Ctx) const
Returns the representative type for the element of an SVE builtin type.
bool isInstantiationDependentType() const
Determine whether this type is an instantiation-dependent type, meaning that the type involves a temp...
bool isLValueReferenceType() const
bool isBitIntType() const
bool isBuiltinType() const
Helper methods to distinguish type categories.
bool isStructuralType() const
Determine if this type is a structural type, per C++20 [temp.param]p7.
bool isDependentType() const
Whether this type is a dependent type, meaning that its definition somehow depends on a template para...
bool isAggregateType() const
Determines whether the type is a C++ aggregate type or C aggregate or union type.
bool isCARCBridgableType() const
Determine whether the given type T is a "bridgeable" C type.
bool isSignableIntegerType(const ASTContext &Ctx) const
RecordDecl * castAsRecordDecl() const
bool isChar16Type() const
bool isAnyComplexType() const
DeducedType * getContainedDeducedType() const
Get the DeducedType whose type will be deduced for a variable with an initializer of this type.
bool containsUnexpandedParameterPack() const
Whether this type is or contains an unexpanded parameter pack, used to support C++0x variadic templat...
ScalarTypeKind getScalarTypeKind() const
Given that this is a scalar type, classify it.
bool hasSignedIntegerRepresentation() const
Determine whether this type has an signed integer representation of some sort, e.g....
QualType getCanonicalTypeInternal() const
const RecordType * getAsStructureType() const
const char * getTypeClassName() const
bool isWebAssemblyTableType() const
Returns true if this is a WebAssembly table type: either an array of reference types,...
@ PtrdiffT
The "ptrdiff_t" type.
@ SizeT
The "size_t" type.
@ SignedSizeT
The signed integer type corresponding to "size_t".
const Type * getBaseElementTypeUnsafe() const
Get the base element type of this type, potentially discarding type qualifiers.
bool isHLSLStandardLayoutRecordOrArrayOf() const
AttributedTypeBitfields AttributedTypeBits
bool isObjCBoxableRecordType() const
bool isMatrixType() const
bool isChar32Type() const
bool isStandardLayoutType() const
Test if this type is a standard-layout type.
TagTypeBitfields TagTypeBits
bool isOverflowBehaviorType() const
EnumDecl * castAsEnumDecl() const
bool isVariablyModifiedType() const
Whether this type is a variably-modified type (C99 6.7.5).
bool isComplexIntegerType() const
bool isUnscopedEnumerationType() const
bool isStdByteType() const
UnresolvedUsingBitfields UnresolvedUsingBits
bool isCUDADeviceBuiltinTextureType() const
Check if the type is the CUDA device builtin texture type.
bool isBlockCompatibleObjCPointerType(ASTContext &ctx) const
bool isObjCClassOrClassKindOfType() const
Whether the type is Objective-C 'Class' or a __kindof type of an Class type, e.g.,...
const ArrayType * getAsArrayTypeUnsafe() const
A variant of getAs<> for array types which silently discards qualifiers from the outermost type.
bool isObjCLifetimeType() const
Returns true if objects of this type have lifetime semantics under ARC.
bool isHLSLResourceRecord() const
EnumDecl * getAsEnumDecl() const
Retrieves the EnumDecl this type refers to.
bool isObjCIndirectLifetimeType() const
bool hasUnnamedOrLocalType() const
Whether this type is or contains a local or unnamed type.
bool isPointerOrReferenceType() const
bool isMetaInfoType() const
Qualifiers::ObjCLifetime getObjCARCImplicitLifetime() const
Return the implicit lifetime for this type, which must not be dependent.
FunctionTypeBitfields FunctionTypeBits
bool isObjCQualifiedInterfaceType() const
bool isSpecifierType() const
Returns true if this type can be represented by some set of type specifiers.
bool isIncompleteType(NamedDecl **Def=nullptr) const
Types are partitioned into 3 broad categories (C99 6.2.5p1): object types, function types,...
bool isObjCObjectPointerType() const
SubstTemplateTypeParmTypeBitfields SubstTemplateTypeParmTypeBits
bool isStructureTypeWithFlexibleArrayMember() const
TypeDependence getDependence() const
bool hasFloatingRepresentation() const
Determine whether this type has a floating-point representation of some sort, e.g....
bool isStructureOrClassType() const
bool isAMDGPUNamedBarrierType() const
Check if the type is the AMDGPU named barrier type, or an array thereof.
bool isVectorType() const
bool isRVVVLSBuiltinType() const
Determines if this is a sizeless type supported by the 'riscv_rvv_vector_bits' type attribute,...
bool isRealFloatingType() const
Floating point categories.
bool isRVVSizelessBuiltinType() const
Returns true for RVV scalable vector types.
std::optional< ArrayRef< QualType > > getObjCSubstitutions(const DeclContext *dc) const
Retrieve the set of substitutions required when accessing a member of the Objective-C receiver type t...
const T * getAsCanonical() const
If this type is canonically the specified type, return its canonical type cast to that specified type...
Linkage getLinkage() const
Determine the linkage of this type.
ObjCObjectTypeBitfields ObjCObjectTypeBits
bool isFloatingType() const
const ObjCObjectType * getAsObjCInterfaceType() const
bool isWideCharType() const
bool isUnsignedIntegerType() const
Return true if this is an integer type that is unsigned, according to C99 6.2.5p6 [which returns true...
bool hasSizedVLAType() const
Whether this type involves a variable-length array type with a definite size.
TypeClass getTypeClass() const
bool isCanonicalUnqualified() const
Determines if this type would be canonical if it had no further qualification.
bool hasAutoForTrailingReturnType() const
Determine whether this type was written with a leading 'auto' corresponding to a trailing return type...
bool isObjCIdOrObjectKindOfType(const ASTContext &ctx, const ObjCObjectType *&bound) const
Whether the type is Objective-C 'id' or a __kindof type of an object type, e.g., __kindof NSView * or...
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 isObjCARCImplicitlyUnretainedType() const
Determines if this type, which must satisfy isObjCLifetimeType(), is implicitly __unsafe_unretained r...
bool isRecordType() const
bool isHLSLResourceRecordArray() const
bool isObjCRetainableType() const
bool isObjCIndependentClassType() const
bool isSizelessVectorType() const
Returns true for all scalable vector types.
bool isScopedEnumeralType() const
Determine whether this type is a scoped enumeration type.
NullabilityKindOrNone getNullability() const
Determine the nullability of the given type.
bool acceptsObjCTypeParams() const
Determines if this is an ObjC interface type that may accept type parameters.
QualType getSizelessVectorEltType(const ASTContext &Ctx) const
Returns the representative type for the element of a sizeless vector builtin type.
bool isUnicodeCharacterType() const
bool hasBooleanRepresentation() const
Determine whether this type has a boolean representation – i.e., it is a boolean type,...
Base class for declarations which introduce a typedef-name.
QualType getUnderlyingType() const
bool typeMatchesDecl() const
Represents a dependent using declaration which was marked with typename.
Represents a shadow declaration implicitly introduced into a scope by a (resolved) using-declaration ...
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
Represents a GCC generic vector type.
VectorType(QualType vecType, unsigned nElements, QualType canonType, VectorKind vecKind)
QualType ElementType
The element type of the vector.
QualType getElementType() const
Defines the Linkage enumeration and various utility functions.
Defines the clang::TargetInfo interface.
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 ...
const internal::VariadicAllOfMatcher< Attr > attr
const internal::VariadicAllOfMatcher< Type > type
Matches Types in the clang AST.
const internal::VariadicAllOfMatcher< Decl > decl
Matches declarations.
const AstTypeMatcher< TypedefType > typedefType
void info(bool Verbose, unsigned Level, const char *Fmt, Ts &&...Args)
Prints an indented note to stderr when Verbose is set.
Top level wrappers for InstallAPI frontend operations.
@ Overload
This is a legitimate overload: the existing declarations are functions or function templates with dif...
bool isa(CodeGen::Address addr)
if(T->getSizeExpr()) TRY_TO(TraverseStmt(const_cast< Expr * >(T -> getSizeExpr())))
AutoTypeKeyword
Which keyword(s) were used to create an AutoType.
QualType pointeeType(QualType T)
CanThrowResult
Possible results from evaluation of a noexcept expression.
TypeDependenceScope::TypeDependence TypeDependence
Linkage minLinkage(Linkage L1, Linkage L2)
Compute the minimum linkage given two linkages.
@ Nullable
Values of this type can be null.
@ Unspecified
Whether values of this type can be null is (explicitly) unspecified.
@ NonNull
Values of this type can never be null.
@ TemplateName
The identifier is a template name. FIXME: Add an annotation for that.
bool IsEnumDeclComplete(EnumDecl *ED)
Check if the given decl is complete.
bool isPackProducingBuiltinTemplateName(TemplateName N)
ExprDependence computeDependence(FullExpr *E)
@ Private
'private' clause, allowed on 'parallel', 'serial', 'loop', 'parallel loop', and 'serial loop' constru...
@ Vector
'vector' clause, allowed on 'loop', Combined, and 'routine' directives.
TypeOfKind
The kind of 'typeof' expression we're after.
nullptr
This class represents a compute construct, representing a 'Kind' of ‘parallel’, 'serial',...
TypeDependence toTypeDependence(ExprDependence D)
ExprDependence turnValueToTypeDependence(ExprDependence D)
@ Dependent
Parse the block as a dependent block, which may be used in some template instantiations but not other...
Linkage
Describes the different kinds of linkage (C++ [basic.link], C99 6.2.2) that an entity may have.
@ External
External linkage, which indicates that the entity can be referred to from other translation units.
ObjCSubstitutionContext
The kind of type we are substituting Objective-C type arguments into.
@ Superclass
The superclass of a type.
@ Result
The result type of a method or function.
ArraySizeModifier
Capture whether this is a normal array (e.g.
OptionalUnsigned< unsigned > UnsignedOrNone
const FunctionProtoType * T
bool isComputedNoexcept(ExceptionSpecificationType ESpecType)
@ Template
We are parsing a template declaration.
TagTypeKind
The kind of a tag type.
@ Interface
The "__interface" keyword.
@ Struct
The "struct" keyword.
@ Class
The "class" keyword.
@ Union
The "union" keyword.
@ Enum
The "enum" keyword.
@ 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)
@ Deduced
The normal deduced case.
@ Undeduced
Not deduced yet. This is for example an 'auto' which was just parsed.
@ DeducedAsPack
Same as above, but additionally this represents a case where the deduced entity itself is a pack.
@ DeducedAsDependent
This is a special case where the initializer is dependent, so we can't deduce a type yet.
std::tuple< NamedDecl *, TemplateArgument > getReplacedTemplateParameter(Decl *D, unsigned Index)
Internal helper used by Subst* nodes to retrieve a parameter from the AssociatedDecl,...
bool isPtrSizeAddressSpace(LangAS AS)
const StreamingDiagnostic & operator<<(const StreamingDiagnostic &DB, const ConceptReference *C)
Insertion operator for diagnostics.
CallingConv
CallingConv - Specifies the calling convention that a function uses.
@ Generic
not a target-specific vector type
U cast(CodeGen::Address addr)
@ PackIndex
Index of a pack indexing expression or specifier.
ElaboratedTypeKeyword
The elaboration keyword that precedes a qualified type name or introduces an elaborated-type-specifie...
@ Interface
The "__interface" keyword introduces the elaborated-type-specifier.
@ None
No keyword precedes the qualified type name.
@ Struct
The "struct" keyword introduces the elaborated-type-specifier.
@ Class
The "class" keyword introduces the elaborated-type-specifier.
@ Union
The "union" keyword introduces the elaborated-type-specifier.
@ Enum
The "enum" keyword introduces the elaborated-type-specifier.
@ Typename
The "typename" keyword precedes the qualified type name, e.g., typename T::type.
TypeDependence toSemanticDependence(TypeDependence D)
TypeDependence toSyntacticDependence(TypeDependence D)
@ Other
Other implicit parameter.
@ EST_DependentNoexcept
noexcept(expression), value-dependent
@ EST_Uninstantiated
not instantiated yet
@ EST_Unparsed
not parsed yet
@ EST_NoThrow
Microsoft __declspec(nothrow) extension.
@ EST_None
no exception specification
@ EST_MSAny
Microsoft throw(...) extension.
@ EST_BasicNoexcept
noexcept
@ EST_NoexceptFalse
noexcept(expression), evals to 'false'
@ EST_Unevaluated
not evaluated yet, for special member function
@ EST_NoexceptTrue
noexcept(expression), evals to 'true'
@ EST_Dynamic
throw(T1, T2)
OptionalUnsigned< NullabilityKind > NullabilityKindOrNone
__UINTPTR_TYPE__ uintptr_t
An unsigned integer type with the property that any valid pointer to void can be converted to this ty...
A FunctionEffect plus a potential boolean expression determining whether the effect is declared (e....
FunctionEffectWithCondition(FunctionEffect E, const EffectConditionExpr &C)
std::string description() const
Return a textual description of the effect, and its condition, if any.
FunctionDecl * SourceDecl
The function whose exception specification this is, for EST_Unevaluated and EST_Uninstantiated.
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.
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
unsigned HasTrailingReturn
bool requiresFunctionProtoTypeExtraBitfields() const
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.
unsigned Bool
Whether we can use 'bool' rather than '_Bool' (even if the language doesn't actually have 'bool',...
unsigned NullptrTypeInNamespace
Whether 'nullptr_t' is in namespace 'std' or not.
unsigned Half
When true, print the half-precision floating-point type as 'half' instead of '__fp16'.
unsigned MSWChar
When true, print the built-in wchar_t type as __wchar_t.
A std::pair-like structure for storing a qualified type split into its local qualifiers and its local...
const Type * Ty
The locally-unqualified type.
Qualifiers Quals
The local qualifiers.