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) &&
114 if (
const auto *DNT = ty->
getAs<DependentNameType>())
118 if (
const auto *TT = ty->
getAs<TagType>())
136 switch (
T->getTypeClass()) {
142 case Type::BlockPointer:
145 case Type::MemberPointer:
148 case Type::LValueReference:
149 case Type::RValueReference:
152 case Type::PackExpansion:
156 case Type::ConstantArray:
157 case Type::DependentSizedArray:
158 case Type::IncompleteArray:
159 case Type::VariableArray:
160 case Type::FunctionProto:
161 case Type::FunctionNoProto:
178 if (
T.isConstQualified())
182 return AT->getElementType().isConstant(Ctx);
187std::optional<QualType::NonConstantStorageReason>
190 if (!
isConstant(Ctx) && !(*this)->isReferenceType())
198 if (
Record->hasMutableFields())
200 if (!
Record->hasTrivialDestructor() && !ExcludeDtor)
226 (tc == DependentSizedArray
236 const llvm::APInt &Sz,
const Expr *SzExpr,
238 bool NeedsExternalSize = SzExpr !=
nullptr || Sz.ugt(0x0FFFFFFFFFFFFFFF) ||
239 Sz.getBitWidth() > 0xFF;
240 if (!NeedsExternalSize)
242 ET, Can, Sz.getBitWidth(), Sz.getZExtValue(), SzMod, Qual);
244 auto *SzPtr =
new (Ctx,
alignof(ConstantArrayType::ExternalSize))
245 ConstantArrayType::ExternalSize(Sz, SzExpr);
253 const llvm::APInt &NumElements) {
254 uint64_t ElementSize = Context.getTypeSizeInChars(ElementType).getQuantity();
262 if (llvm::isPowerOf2_64(ElementSize)) {
263 return NumElements.getActiveBits() + llvm::Log2_64(ElementSize);
268 if ((ElementSize >> 32) == 0 && NumElements.getBitWidth() <= 64 &&
269 (NumElements.getZExtValue() >> 32) == 0) {
270 uint64_t TotalSize = NumElements.getZExtValue() * ElementSize;
271 return llvm::bit_width(TotalSize);
275 llvm::APSInt SizeExtended(NumElements,
true);
276 unsigned SizeTypeBits = Context.getTypeSize(Context.getSizeType());
277 SizeExtended = SizeExtended.extend(
278 std::max(SizeTypeBits, SizeExtended.getBitWidth()) * 2);
280 llvm::APSInt TotalSize(llvm::APInt(SizeExtended.getBitWidth(), ElementSize));
281 TotalSize *= SizeExtended;
283 return TotalSize.getActiveBits();
292 unsigned Bits = Context.getTypeSize(Context.getSizeType());
305 uint64_t ArraySize,
const Expr *SizeExpr,
308 ID.AddInteger(ArraySize);
309 ID.AddInteger(llvm::to_underlying(SizeMod));
310 ID.AddInteger(TypeQuals);
311 ID.AddBoolean(SizeExpr !=
nullptr);
313 SizeExpr->
Profile(ID, Context,
true);
325 :
ArrayType(DependentSizedArray, et, can, sm, tq, e), SizeExpr((
Stmt *)e) {}
330 unsigned TypeQuals,
Expr *E) {
332 ID.AddInteger(llvm::to_underlying(SizeMod));
333 ID.AddInteger(TypeQuals);
338DependentVectorType::DependentVectorType(
QualType ElementType,
341 :
Type(DependentVector, CanonType,
343 ElementType->getDependence() |
346 ElementType(ElementType), SizeExpr(SizeExpr), Loc(Loc) {
354 ID.AddPointer(ElementType.getAsOpaquePtr());
355 ID.AddInteger(llvm::to_underlying(VecKind));
356 SizeExpr->Profile(ID, Context,
true);
359DependentSizedExtVectorType::DependentSizedExtVectorType(
QualType ElementType,
363 :
Type(DependentSizedExtVector, can,
365 ElementType->getDependence() |
368 SizeExpr(SizeExpr), ElementType(ElementType), loc(loc) {}
374 ID.AddPointer(ElementType.getAsOpaquePtr());
375 SizeExpr->Profile(ID, Context,
true);
378DependentAddressSpaceType::DependentAddressSpaceType(
QualType PointeeType,
382 :
Type(DependentAddressSpace, can,
384 PointeeType->getDependence() |
387 AddrSpaceExpr(AddrSpaceExpr), PointeeType(PointeeType), loc(loc) {}
392 Expr *AddrSpaceExpr) {
393 ID.AddPointer(PointeeType.getAsOpaquePtr());
394 AddrSpaceExpr->Profile(ID, Context,
true);
398 const Expr *RowExpr,
const Expr *ColumnExpr)
399 :
Type(tc, canonType,
416 unsigned nColumns,
QualType canonType)
421 unsigned nRows,
unsigned nColumns,
426DependentSizedMatrixType::DependentSizedMatrixType(
QualType ElementType,
431 :
MatrixType(DependentSizedMatrix, ElementType, CanonicalType, RowExpr,
433 RowExpr(RowExpr), ColumnExpr(ColumnExpr), loc(loc) {}
440 RowExpr->Profile(ID, CTX,
true);
441 ColumnExpr->Profile(ID, CTX,
true);
468 ExprAndUnsigned(NumBitsExpr, IsUnsigned) {}
471 return ExprAndUnsigned.getInt();
475 return ExprAndUnsigned.getPointer();
481 ID.AddBoolean(IsUnsigned);
482 NumBitsExpr->
Profile(ID, Context,
true);
494 bool CountInBytes,
bool OrNull) {
495 ID.AddPointer(WrappedTy.getAsOpaquePtr());
496 ID.AddBoolean(CountInBytes);
497 ID.AddBoolean(OrNull);
502 ID.AddPointer(CountExpr);
510 if (
const auto *ATy = dyn_cast<ArrayType>(
this))
511 return ATy->getElementType().getTypePtr();
539 return Context.getQualifiedType(desugar,
split.
Quals);
545#define TYPE(CLASS, BASE) \
546 static_assert(!std::is_polymorphic<CLASS##Type>::value, \
547 #CLASS "Type should not be polymorphic!");
548#include "clang/AST/TypeNodes.inc"
553#define TYPE(CLASS, BASE) \
554 static_assert(std::is_trivially_destructible<CLASS##Type>::value, \
555 #CLASS "Type should be trivially destructible!");
556#include "clang/AST/TypeNodes.inc"
560#define ABSTRACT_TYPE(Class, Parent)
561#define TYPE(Class, Parent) \
562 case Type::Class: { \
563 const auto *ty = cast<Class##Type>(this); \
564 if (!ty->isSugared()) \
565 return QualType(ty, 0); \
566 return ty->desugar(); \
568#include "clang/AST/TypeNodes.inc"
570 llvm_unreachable(
"bad type kind!");
580#define ABSTRACT_TYPE(Class, Parent)
581#define TYPE(Class, Parent) \
582 case Type::Class: { \
583 const auto *Ty = cast<Class##Type>(CurTy); \
584 if (!Ty->isSugared()) \
585 return SplitQualType(Ty, Qs); \
586 Cur = Ty->desugar(); \
589#include "clang/AST/TypeNodes.inc"
598 Qualifiers quals =
split.Quals;
601 const Type *lastTypeWithQuals =
split.Ty;
608 switch (
split.Ty->getTypeClass()) {
609#define ABSTRACT_TYPE(Class, Parent)
610#define TYPE(Class, Parent) \
611 case Type::Class: { \
612 const auto *ty = cast<Class##Type>(split.Ty); \
613 if (!ty->isSugared()) \
615 next = ty->desugar(); \
618#include "clang/AST/TypeNodes.inc"
624 if (!
split.Quals.empty()) {
625 lastTypeWithQuals =
split.Ty;
631 return SplitQualType(lastTypeWithQuals, quals);
636 while (
const auto *PT =
T->
getAs<ParenType>())
637 T = PT->getInnerType();
646 if (
const auto *Sugar = dyn_cast<T>(Cur))
649#define ABSTRACT_TYPE(Class, Parent)
650#define TYPE(Class, Parent) \
651 case Type::Class: { \
652 const auto *Ty = cast<Class##Type>(Cur); \
653 if (!Ty->isSugared()) \
655 Cur = Ty->desugar().getTypePtr(); \
658#include "clang/AST/TypeNodes.inc"
671template <>
const TemplateSpecializationType *
Type::getAs()
const {
691 const Type *Cur =
this;
695#define ABSTRACT_TYPE(Class, Parent)
696#define TYPE(Class, Parent) \
698 const auto *Ty = cast<Class##Type>(Cur); \
699 if (!Ty->isSugared()) \
701 Cur = Ty->desugar().getTypePtr(); \
704#include "clang/AST/TypeNodes.inc"
711 return RT->getDecl()->isClass();
717 return RT->getDecl()->isStruct();
725 const auto *
Decl = RT->getDecl();
726 if (!
Decl->isStruct())
728 return Decl->getDefinitionOrSelf()->hasFlexibleArrayMember();
733 return RD->hasAttr<ObjCBoxableAttr>();
739 return RT->getDecl()->isInterface();
745 return RT->getDecl()->isStructureOrClass();
751 return PT->getPointeeType()->isVoidType();
757 return RT->getDecl()->isUnion();
763 return CT->getElementType()->isFloatingType();
774 return ET->getDecl()->isScoped();
784 if (
Complex->getElementType()->isIntegerType())
807 if (
const auto *RT = dyn_cast<RecordType>(
this)) {
808 if (RT->getDecl()->isStruct())
813 if (
const auto *RT = dyn_cast<RecordType>(CanonicalType)) {
814 if (!RT->getDecl()->isStruct())
826 if (
const auto *RT = dyn_cast<RecordType>(
this)) {
827 if (RT->getDecl()->isUnion())
832 if (
const auto *RT = dyn_cast<RecordType>(CanonicalType)) {
833 if (!RT->getDecl()->isUnion())
853 if (OPT->isObjCIdType())
857 if (!OPT->isKindOfType())
861 if (OPT->isObjCClassType() || OPT->isObjCQualifiedClassType())
865 bound = OPT->getObjectType()
866 ->stripObjCKindOfTypeAndQuals(ctx)
877 if (OPT->isObjCClassType())
881 if (!OPT->isKindOfType())
885 return OPT->isObjCClassType() || OPT->isObjCQualifiedClassType();
892 initialize(protocols);
899 :
Type(ObjCObject, Canonical,
Base->getDependence()), BaseType(
Base) {
903 assert(getTypeArgsAsWritten().size() == typeArgs.size() &&
904 "bitfield overflow in type argument count");
905 if (!typeArgs.empty())
906 memcpy(getTypeArgStorage(), typeArgs.data(),
907 typeArgs.size() *
sizeof(
QualType));
909 for (
auto typeArg : typeArgs) {
910 addDependence(typeArg->getDependence() & ~TypeDependence::VariablyModified);
914 initialize(protocols);
917bool ObjCObjectType::isSpecialized()
const {
919 if (ObjCObjectTypeBits.NumTypeArgs > 0)
923 if (
const auto objcObject =
getBaseType()->getAs<ObjCObjectType>()) {
928 return objcObject->isSpecialized();
937 if (isSpecializedAsWritten())
938 return getTypeArgsAsWritten();
941 if (
const auto objcObject =
getBaseType()->getAs<ObjCObjectType>()) {
946 return objcObject->getTypeArgs();
953bool ObjCObjectType::isKindOfType()
const {
954 if (isKindOfTypeAsWritten())
958 if (
const auto objcObject =
getBaseType()->getAs<ObjCObjectType>()) {
963 return objcObject->isKindOfType();
971ObjCObjectType::stripObjCKindOfTypeAndQuals(
const ASTContext &ctx)
const {
972 if (!isKindOfType() && qual_empty())
978 if (
const auto *baseObj = splitBaseType.
Ty->
getAs<ObjCObjectType>())
979 baseType = baseObj->stripObjCKindOfTypeAndQuals(ctx);
983 getTypeArgsAsWritten(),
1008template <
typename Derived>
1009struct SimpleTransformVisitor :
public TypeVisitor<Derived, QualType> {
1017 QualType result =
static_cast<Derived *
>(
this)->Visit(splitType.
Ty);
1027 explicit SimpleTransformVisitor(
ASTContext &ctx) : Ctx(ctx) {}
1031#define TYPE(Class, Base)
1032#define DEPENDENT_TYPE(Class, Base) \
1033 QualType Visit##Class##Type(const Class##Type *T) { return QualType(T, 0); }
1034#include "clang/AST/TypeNodes.inc"
1036#define TRIVIAL_TYPE_CLASS(Class) \
1037 QualType Visit##Class##Type(const Class##Type *T) { return QualType(T, 0); }
1038#define SUGARED_TYPE_CLASS(Class) \
1039 QualType Visit##Class##Type(const Class##Type *T) { \
1040 if (!T->isSugared()) \
1041 return QualType(T, 0); \
1042 QualType desugaredType = recurse(T->desugar()); \
1043 if (desugaredType.isNull()) \
1045 if (desugaredType.getAsOpaquePtr() == T->desugar().getAsOpaquePtr()) \
1046 return QualType(T, 0); \
1047 return desugaredType; \
1053 QualType elementType = recurse(
T->getElementType());
1054 if (elementType.
isNull())
1057 if (elementType.
getAsOpaquePtr() ==
T->getElementType().getAsOpaquePtr())
1063 QualType VisitPointerType(
const PointerType *
T) {
1065 if (pointeeType.
isNull())
1069 return QualType(
T, 0);
1074 QualType VisitBlockPointerType(
const BlockPointerType *
T) {
1076 if (pointeeType.
isNull())
1080 return QualType(
T, 0);
1085 QualType VisitLValueReferenceType(
const LValueReferenceType *
T) {
1086 QualType pointeeType = recurse(
T->getPointeeTypeAsWritten());
1087 if (pointeeType.
isNull())
1091 T->getPointeeTypeAsWritten().getAsOpaquePtr())
1092 return QualType(
T, 0);
1097 QualType VisitRValueReferenceType(
const RValueReferenceType *
T) {
1098 QualType pointeeType = recurse(
T->getPointeeTypeAsWritten());
1099 if (pointeeType.
isNull())
1103 T->getPointeeTypeAsWritten().getAsOpaquePtr())
1104 return QualType(
T, 0);
1109 QualType VisitMemberPointerType(
const MemberPointerType *
T) {
1111 if (pointeeType.
isNull())
1115 return QualType(
T, 0);
1118 T->getMostRecentCXXRecordDecl());
1121 QualType VisitConstantArrayType(
const ConstantArrayType *
T) {
1122 QualType elementType = recurse(
T->getElementType());
1123 if (elementType.
isNull())
1126 if (elementType.
getAsOpaquePtr() ==
T->getElementType().getAsOpaquePtr())
1127 return QualType(
T, 0);
1130 T->getSizeModifier(),
1131 T->getIndexTypeCVRQualifiers());
1134 QualType VisitVariableArrayType(
const VariableArrayType *
T) {
1135 QualType elementType = recurse(
T->getElementType());
1136 if (elementType.
isNull())
1139 if (elementType.
getAsOpaquePtr() ==
T->getElementType().getAsOpaquePtr())
1140 return QualType(
T, 0);
1143 T->getSizeModifier(),
1144 T->getIndexTypeCVRQualifiers());
1147 QualType VisitIncompleteArrayType(
const IncompleteArrayType *
T) {
1148 QualType elementType = recurse(
T->getElementType());
1149 if (elementType.
isNull())
1152 if (elementType.
getAsOpaquePtr() ==
T->getElementType().getAsOpaquePtr())
1153 return QualType(
T, 0);
1156 T->getIndexTypeCVRQualifiers());
1159 QualType VisitVectorType(
const VectorType *
T) {
1160 QualType elementType = recurse(
T->getElementType());
1161 if (elementType.
isNull())
1164 if (elementType.
getAsOpaquePtr() ==
T->getElementType().getAsOpaquePtr())
1165 return QualType(
T, 0);
1168 T->getVectorKind());
1171 QualType VisitExtVectorType(
const ExtVectorType *
T) {
1172 QualType elementType = recurse(
T->getElementType());
1173 if (elementType.
isNull())
1176 if (elementType.
getAsOpaquePtr() ==
T->getElementType().getAsOpaquePtr())
1177 return QualType(
T, 0);
1182 QualType VisitConstantMatrixType(
const ConstantMatrixType *
T) {
1183 QualType elementType = recurse(
T->getElementType());
1184 if (elementType.
isNull())
1186 if (elementType.
getAsOpaquePtr() ==
T->getElementType().getAsOpaquePtr())
1187 return QualType(
T, 0);
1190 T->getNumColumns());
1193 QualType VisitOverflowBehaviorType(
const OverflowBehaviorType *
T) {
1194 QualType UnderlyingType = recurse(
T->getUnderlyingType());
1195 if (UnderlyingType.
isNull())
1199 T->getUnderlyingType().getAsOpaquePtr())
1200 return QualType(
T, 0);
1205 QualType VisitFunctionNoProtoType(
const FunctionNoProtoType *
T) {
1211 return QualType(
T, 0);
1216 QualType VisitFunctionProtoType(
const FunctionProtoType *
T) {
1222 SmallVector<QualType, 4> paramTypes;
1223 bool paramChanged =
false;
1225 QualType newParamType = recurse(paramType);
1226 if (newParamType.
isNull())
1230 paramChanged =
true;
1232 paramTypes.push_back(newParamType);
1237 bool exceptionChanged =
false;
1239 SmallVector<QualType, 4> exceptionTypes;
1240 for (
auto exceptionType :
info.ExceptionSpec.Exceptions) {
1241 QualType newExceptionType = recurse(exceptionType);
1242 if (newExceptionType.
isNull())
1245 if (newExceptionType.
getAsOpaquePtr() != exceptionType.getAsOpaquePtr())
1246 exceptionChanged =
true;
1248 exceptionTypes.push_back(newExceptionType);
1251 if (exceptionChanged) {
1252 info.ExceptionSpec.Exceptions =
1253 llvm::ArrayRef(exceptionTypes).copy(Ctx);
1258 !paramChanged && !exceptionChanged)
1259 return QualType(
T, 0);
1264 QualType VisitParenType(
const ParenType *
T) {
1265 QualType innerType = recurse(
T->getInnerType());
1270 return QualType(
T, 0);
1279 QualType VisitAdjustedType(
const AdjustedType *
T) {
1280 QualType originalType = recurse(
T->getOriginalType());
1281 if (originalType.
isNull())
1284 QualType adjustedType = recurse(
T->getAdjustedType());
1285 if (adjustedType.
isNull())
1289 T->getOriginalType().getAsOpaquePtr() &&
1290 adjustedType.
getAsOpaquePtr() ==
T->getAdjustedType().getAsOpaquePtr())
1291 return QualType(
T, 0);
1296 QualType VisitDecayedType(
const DecayedType *
T) {
1297 QualType originalType = recurse(
T->getOriginalType());
1298 if (originalType.
isNull())
1301 if (originalType.
getAsOpaquePtr() ==
T->getOriginalType().getAsOpaquePtr())
1302 return QualType(
T, 0);
1307 QualType VisitArrayParameterType(
const ArrayParameterType *
T) {
1308 QualType ArrTy = VisitConstantArrayType(
T);
1322 QualType VisitAttributedType(
const AttributedType *
T) {
1323 QualType modifiedType = recurse(
T->getModifiedType());
1324 if (modifiedType.
isNull())
1327 QualType equivalentType = recurse(
T->getEquivalentType());
1328 if (equivalentType.
isNull())
1332 T->getModifiedType().getAsOpaquePtr() &&
1334 T->getEquivalentType().getAsOpaquePtr())
1335 return QualType(
T, 0);
1341 QualType VisitSubstTemplateTypeParmType(
const SubstTemplateTypeParmType *
T) {
1342 QualType replacementType = recurse(
T->getReplacementType());
1343 if (replacementType.
isNull())
1347 T->getReplacementType().getAsOpaquePtr())
1348 return QualType(
T, 0);
1351 replacementType,
T->getAssociatedDecl(),
T->getIndex(),
1352 T->getPackIndex(),
T->getFinal());
1358 QualType VisitAutoType(
const AutoType *
T) {
1359 if (!
T->isDeduced())
1360 return QualType(
T, 0);
1362 QualType deducedType = recurse(
T->getDeducedType());
1363 if (deducedType.
isNull())
1366 if (deducedType ==
T->getDeducedType())
1367 return QualType(
T, 0);
1369 return Ctx.
getAutoType(
T->getDeducedKind(), deducedType,
T->getKeyword(),
1370 T->getTypeConstraintConcept(),
1371 T->getTypeConstraintArguments());
1374 QualType VisitObjCObjectType(
const ObjCObjectType *
T) {
1375 QualType baseType = recurse(
T->getBaseType());
1380 bool typeArgChanged =
false;
1381 SmallVector<QualType, 4> typeArgs;
1382 for (
auto typeArg :
T->getTypeArgsAsWritten()) {
1383 QualType newTypeArg = recurse(typeArg);
1388 typeArgChanged =
true;
1390 typeArgs.push_back(newTypeArg);
1395 return QualType(
T, 0);
1399 llvm::ArrayRef(
T->qual_begin(),
T->getNumProtocols()),
1400 T->isKindOfTypeAsWritten());
1405 QualType VisitObjCObjectPointerType(
const ObjCObjectPointerType *
T) {
1407 if (pointeeType.
isNull())
1411 return QualType(
T, 0);
1416 QualType VisitAtomicType(
const AtomicType *
T) {
1417 QualType valueType = recurse(
T->getValueType());
1422 return QualType(
T, 0);
1427#undef TRIVIAL_TYPE_CLASS
1428#undef SUGARED_TYPE_CLASS
1431struct SubstObjCTypeArgsVisitor
1432 :
public SimpleTransformVisitor<SubstObjCTypeArgsVisitor> {
1433 using BaseType = SimpleTransformVisitor<SubstObjCTypeArgsVisitor>;
1435 ArrayRef<QualType> TypeArgs;
1438 SubstObjCTypeArgsVisitor(ASTContext &ctx, ArrayRef<QualType> typeArgs,
1440 : BaseType(ctx), TypeArgs(typeArgs), SubstContext(context) {}
1442 QualType VisitObjCTypeParamType(
const ObjCTypeParamType *OTPTy) {
1445 ObjCTypeParamDecl *typeParam = OTPTy->getDecl();
1447 if (!TypeArgs.empty()) {
1448 QualType argType = TypeArgs[typeParam->
getIndex()];
1449 if (OTPTy->qual_empty())
1454 SmallVector<ObjCProtocolDecl *, 8> protocolsVec;
1455 protocolsVec.append(OTPTy->qual_begin(), OTPTy->qual_end());
1456 ArrayRef<ObjCProtocolDecl *> protocolsToApply = protocolsVec;
1458 argType, protocolsToApply, hasError,
true );
1461 switch (SubstContext) {
1462 case ObjCSubstitutionContext::Ordinary:
1463 case ObjCSubstitutionContext::Parameter:
1464 case ObjCSubstitutionContext::Superclass:
1468 case ObjCSubstitutionContext::Result:
1469 case ObjCSubstitutionContext::Property: {
1471 const auto *objPtr =
1476 if (objPtr->isKindOfType() || objPtr->isObjCIdOrClassType())
1480 const auto *obj = objPtr->getObjectType();
1482 obj->getBaseType(), obj->getTypeArgsAsWritten(), obj->getProtocols(),
1489 llvm_unreachable(
"Unexpected ObjCSubstitutionContext!");
1492 QualType VisitFunctionType(
const FunctionType *funcType) {
1498 Ctx, TypeArgs, ObjCSubstitutionContext::Result);
1508 return BaseType::VisitFunctionType(funcType);
1517 SmallVector<QualType, 4> paramTypes;
1518 bool paramChanged =
false;
1519 for (
auto paramType : funcProtoType->getParamTypes()) {
1521 Ctx, TypeArgs, ObjCSubstitutionContext::Parameter);
1522 if (newParamType.
isNull())
1526 paramChanged =
true;
1528 paramTypes.push_back(newParamType);
1532 FunctionProtoType::ExtProtoInfo
info = funcProtoType->getExtProtoInfo();
1533 bool exceptionChanged =
false;
1535 SmallVector<QualType, 4> exceptionTypes;
1536 for (
auto exceptionType :
info.ExceptionSpec.Exceptions) {
1538 Ctx, TypeArgs, ObjCSubstitutionContext::Ordinary);
1539 if (newExceptionType.
isNull())
1542 if (newExceptionType.
getAsOpaquePtr() != exceptionType.getAsOpaquePtr())
1543 exceptionChanged =
true;
1545 exceptionTypes.push_back(newExceptionType);
1548 if (exceptionChanged) {
1549 info.ExceptionSpec.Exceptions =
1550 llvm::ArrayRef(exceptionTypes).copy(Ctx);
1555 funcProtoType->getReturnType().getAsOpaquePtr() &&
1556 !paramChanged && !exceptionChanged)
1557 return BaseType::VisitFunctionType(funcType);
1562 QualType VisitObjCObjectType(
const ObjCObjectType *objcObjectType) {
1565 if (objcObjectType->isSpecializedAsWritten()) {
1566 SmallVector<QualType, 4> newTypeArgs;
1567 bool anyChanged =
false;
1568 for (
auto typeArg : objcObjectType->getTypeArgsAsWritten()) {
1570 Ctx, TypeArgs, ObjCSubstitutionContext::Ordinary);
1577 ArrayRef<ObjCProtocolDecl *> protocols(
1578 objcObjectType->qual_begin(), objcObjectType->getNumProtocols());
1579 if (TypeArgs.empty() &&
1580 SubstContext != ObjCSubstitutionContext::Superclass) {
1582 objcObjectType->getBaseType(), {}, protocols,
1583 objcObjectType->isKindOfTypeAsWritten());
1589 newTypeArgs.push_back(newTypeArg);
1593 ArrayRef<ObjCProtocolDecl *> protocols(
1594 objcObjectType->qual_begin(), objcObjectType->getNumProtocols());
1597 objcObjectType->isKindOfTypeAsWritten());
1601 return BaseType::VisitObjCObjectType(objcObjectType);
1604 QualType VisitAttributedType(
const AttributedType *attrType) {
1605 QualType newType = BaseType::VisitAttributedType(attrType);
1609 const auto *newAttrType = dyn_cast<AttributedType>(newType.
getTypePtr());
1610 if (!newAttrType || newAttrType->getAttrKind() != attr::ObjCKindOf)
1614 QualType newEquivType = newAttrType->getEquivalentType();
1615 const ObjCObjectPointerType *ptrType =
1616 newEquivType->
getAs<ObjCObjectPointerType>();
1617 const ObjCObjectType *objType = ptrType
1619 : newEquivType->
getAs<ObjCObjectType>();
1626 objType->getBaseType(), objType->getTypeArgsAsWritten(),
1627 objType->getProtocols(),
1629 objType->isObjCUnqualifiedId() ?
false :
true);
1637 newAttrType->getModifiedType(), newEquivType,
1638 newAttrType->getAttr());
1642struct StripNullabilityTypeVisitor
1643 :
public SimpleTransformVisitor<StripNullabilityTypeVisitor> {
1644 using BaseType = SimpleTransformVisitor<StripNullabilityTypeVisitor>;
1646 explicit StripNullabilityTypeVisitor(ASTContext &ctx) : BaseType(ctx) {}
1648 QualType VisitAttributedType(
const AttributedType *attrType) {
1649 QualType
type(attrType, 0);
1650 if (AttributedType::stripOuterNullability(
type)) {
1651 while (AttributedType::stripOuterNullability(
type)) {
1653 return BaseType::recurse(
type);
1656 return BaseType::VisitAttributedType(attrType);
1660struct StripObjCKindOfTypeVisitor
1661 :
public SimpleTransformVisitor<StripObjCKindOfTypeVisitor> {
1662 using BaseType = SimpleTransformVisitor<StripObjCKindOfTypeVisitor>;
1664 explicit StripObjCKindOfTypeVisitor(ASTContext &ctx) : BaseType(ctx) {}
1666 QualType VisitObjCObjectType(
const ObjCObjectType *objType) {
1667 if (!objType->isKindOfType())
1668 return BaseType::VisitObjCObjectType(objType);
1670 QualType baseType = objType->getBaseType().stripObjCKindOfType(Ctx);
1672 objType->getProtocols(),
1689 case BuiltinType::Kind::Float16: {
1697 case BuiltinType::Kind::BFloat16: {
1717 SubstObjCTypeArgsVisitor visitor(ctx, typeArgs, context);
1718 return visitor.recurse(*
this);
1732 auto &ctx =
const_cast<ASTContext &
>(constCtx);
1733 StripObjCKindOfTypeVisitor visitor(ctx);
1734 return visitor.recurse(*
this);
1740 auto &ctx =
const_cast<ASTContext &
>(constCtx);
1741 StripNullabilityTypeVisitor visitor(ctx);
1742 return visitor.recurse(*
this);
1747 if (
const auto AT =
T.getTypePtr()->getAs<
AtomicType>())
1748 T = AT->getValueType();
1749 return T.getUnqualifiedType();
1752std::optional<ArrayRef<QualType>>
1755 if (
const auto method = dyn_cast<ObjCMethodDecl>(dc))
1756 dc = method->getDeclContext();
1760 const auto *dcClassDecl = dyn_cast<ObjCInterfaceDecl>(dc);
1766 dcTypeParams = dcClassDecl->getTypeParamList();
1768 return std::nullopt;
1772 dcCategoryDecl = dyn_cast<ObjCCategoryDecl>(dc);
1773 if (!dcCategoryDecl)
1774 return std::nullopt;
1780 return std::nullopt;
1784 return std::nullopt;
1786 assert(dcTypeParams &&
"No substitutions to perform");
1787 assert(dcClassDecl &&
"No class context");
1792 objectType = objectPointerType->getObjectType();
1803 objectType ? objectType->getInterface() :
nullptr;
1804 if (!curClassDecl) {
1812 while (curClassDecl != dcClassDecl) {
1814 QualType superType = objectType->getSuperClassType();
1815 if (superType.
isNull()) {
1816 objectType =
nullptr;
1821 curClassDecl = objectType->getInterface();
1826 if (!objectType || objectType->isUnspecialized()) {
1831 return objectType->getTypeArgs();
1836 if (
auto *ID = IfaceT->getInterface()) {
1837 if (ID->getTypeParamList())
1845void ObjCObjectType::computeSuperClassTypeSlow()
const {
1851 CachedSuperClassType.setInt(
true);
1857 if (!superClassObjTy) {
1858 CachedSuperClassType.setInt(
true);
1863 if (!superClassDecl) {
1864 CachedSuperClassType.setInt(
true);
1870 QualType superClassType(superClassObjTy, 0);
1872 if (!superClassTypeParams) {
1873 CachedSuperClassType.setPointerAndInt(
1874 superClassType->castAs<ObjCObjectType>(),
true);
1879 if (superClassObjTy->isUnspecialized()) {
1880 CachedSuperClassType.setPointerAndInt(superClassObjTy,
true);
1888 CachedSuperClassType.setPointerAndInt(
1889 superClassType->castAs<ObjCObjectType>(),
true);
1895 if (isUnspecialized()) {
1898 superClassObjTy->getInterface());
1899 CachedSuperClassType.setPointerAndInt(
1900 unspecializedSuper->
castAs<ObjCObjectType>(),
true);
1906 assert(typeArgs.size() == typeParams->
size());
1907 CachedSuperClassType.setPointerAndInt(
1911 ->castAs<ObjCObjectType>(),
1917 return interfaceDecl->getASTContext()
1918 .getObjCInterfaceType(interfaceDecl)
1927 if (superObjectType.
isNull())
1928 return superObjectType;
1939 if (
T->getNumProtocols() &&
T->getInterface())
1952 if (OPT->isObjCQualifiedIdType())
1962 if (OPT->isObjCQualifiedClassType())
1970 if (OT->getInterface())
1978 if (OPT->getInterfaceType())
1995const TemplateSpecializationType *
1998 while (TST && TST->isTypeAlias())
1999 TST = TST->desugar()->getAs<TemplateSpecializationType>();
2005 case Type::DependentName:
2007 case Type::TemplateSpecialization:
2013 case Type::InjectedClassName:
2017 case Type::UnresolvedUsing:
2022 return std::nullopt;
2027 const Type *Cur =
this;
2028 while (
const auto *AT = Cur->
getAs<AttributedType>()) {
2029 if (AT->getAttrKind() == AK)
2031 Cur = AT->getEquivalentType().getTypePtr();
2038class GetContainedDeducedTypeVisitor
2039 :
public TypeVisitor<GetContainedDeducedTypeVisitor, Type *> {
2043 GetContainedDeducedTypeVisitor(
bool Syntactic =
false)
2044 : Syntactic(Syntactic) {}
2051 return Visit(
T.getTypePtr());
2055 Type *VisitDeducedType(
const DeducedType *AT) {
2056 return const_cast<DeducedType *
>(AT);
2060 Type *VisitSubstTemplateTypeParmType(
const SubstTemplateTypeParmType *
T) {
2061 return Visit(
T->getReplacementType());
2064 Type *VisitPointerType(
const PointerType *
T) {
2068 Type *VisitBlockPointerType(
const BlockPointerType *
T) {
2072 Type *VisitReferenceType(
const ReferenceType *
T) {
2073 return Visit(
T->getPointeeTypeAsWritten());
2076 Type *VisitMemberPointerType(
const MemberPointerType *
T) {
2080 Type *VisitArrayType(
const ArrayType *
T) {
2081 return Visit(
T->getElementType());
2084 Type *VisitDependentSizedExtVectorType(
const DependentSizedExtVectorType *
T) {
2085 return Visit(
T->getElementType());
2088 Type *VisitVectorType(
const VectorType *
T) {
2089 return Visit(
T->getElementType());
2092 Type *VisitDependentSizedMatrixType(
const DependentSizedMatrixType *
T) {
2093 return Visit(
T->getElementType());
2096 Type *VisitConstantMatrixType(
const ConstantMatrixType *
T) {
2097 return Visit(
T->getElementType());
2100 Type *VisitFunctionProtoType(
const FunctionProtoType *
T) {
2102 return const_cast<FunctionProtoType *
>(
T);
2103 return VisitFunctionType(
T);
2106 Type *VisitFunctionType(
const FunctionType *
T) {
2110 Type *VisitParenType(
const ParenType *
T) {
return Visit(
T->getInnerType()); }
2112 Type *VisitAttributedType(
const AttributedType *
T) {
2113 return Visit(
T->getModifiedType());
2116 Type *VisitMacroQualifiedType(
const MacroQualifiedType *
T) {
2117 return Visit(
T->getUnderlyingType());
2120 Type *VisitOverflowBehaviorType(
const OverflowBehaviorType *
T) {
2121 return Visit(
T->getUnderlyingType());
2124 Type *VisitAdjustedType(
const AdjustedType *
T) {
2125 return Visit(
T->getOriginalType());
2128 Type *VisitPackExpansionType(
const PackExpansionType *
T) {
2129 return Visit(
T->getPattern());
2132 Type *VisitAtomicType(
const AtomicType *
T) {
2133 return Visit(
T->getValueType());
2140 return cast_or_null<DeducedType>(
2141 GetContainedDeducedTypeVisitor().Visit(
this));
2145 return isa_and_nonnull<FunctionType>(
2146 GetContainedDeducedTypeVisitor(
true).Visit(
this));
2150 if (
const auto *VT = dyn_cast<VectorType>(CanonicalType))
2151 return VT->getElementType()->isIntegerType();
2152 if (CanonicalType->isSveVLSBuiltinType()) {
2154 return VT->getKind() == BuiltinType::SveBool ||
2155 (VT->getKind() >= BuiltinType::SveInt8 &&
2156 VT->getKind() <= BuiltinType::SveUint64);
2158 if (CanonicalType->isRVVVLSBuiltinType()) {
2160 return (VT->getKind() >= BuiltinType::RvvInt8mf8 &&
2161 VT->getKind() <= BuiltinType::RvvUint64m8);
2187 if (
const auto *BT = dyn_cast<BuiltinType>(CanonicalType))
2188 return BT->isInteger();
2192 if (
const auto *ET = dyn_cast<EnumType>(CanonicalType))
2195 if (
const OverflowBehaviorType *OBT =
2196 dyn_cast<OverflowBehaviorType>(CanonicalType))
2197 return OBT->getUnderlyingType()->isIntegralOrEnumerationType();
2204 if (
const auto *BT = dyn_cast<BuiltinType>(CanonicalType))
2205 return BT->isInteger();
2207 if (
const auto *OBT = dyn_cast<OverflowBehaviorType>(CanonicalType))
2208 return OBT->getUnderlyingType()->isIntegerType();
2217 if (
const auto *ET = dyn_cast<EnumType>(CanonicalType))
2218 return !ET->getDecl()->isScoped();
2224 if (
const auto *BT = dyn_cast<BuiltinType>(CanonicalType))
2225 return BT->getKind() == BuiltinType::Char_U ||
2226 BT->getKind() == BuiltinType::UChar ||
2227 BT->getKind() == BuiltinType::Char_S ||
2228 BT->getKind() == BuiltinType::SChar;
2233 if (
const auto *BT = dyn_cast<BuiltinType>(CanonicalType))
2234 return BT->getKind() == BuiltinType::WChar_S ||
2235 BT->getKind() == BuiltinType::WChar_U;
2240 if (
const BuiltinType *BT = dyn_cast<BuiltinType>(CanonicalType))
2241 return BT->getKind() == BuiltinType::Char8;
2246 if (
const auto *BT = dyn_cast<BuiltinType>(CanonicalType))
2247 return BT->getKind() == BuiltinType::Char16;
2252 if (
const auto *BT = dyn_cast<BuiltinType>(CanonicalType))
2253 return BT->getKind() == BuiltinType::Char32;
2260 const auto *BT = dyn_cast<BuiltinType>(CanonicalType);
2263 switch (BT->getKind()) {
2266 case BuiltinType::Char_U:
2267 case BuiltinType::UChar:
2268 case BuiltinType::WChar_U:
2269 case BuiltinType::Char8:
2270 case BuiltinType::Char16:
2271 case BuiltinType::Char32:
2272 case BuiltinType::Char_S:
2273 case BuiltinType::SChar:
2274 case BuiltinType::WChar_S:
2280 const auto *BT = dyn_cast<BuiltinType>(CanonicalType);
2283 switch (BT->getKind()) {
2286 case BuiltinType::Char8:
2287 case BuiltinType::Char16:
2288 case BuiltinType::Char32:
2297 if (
const auto *BT = dyn_cast<BuiltinType>(CanonicalType))
2298 return BT->isSignedInteger();
2303 if (!ED->isComplete() || ED->isScoped())
2305 return ED->getIntegerType()->isSignedIntegerType();
2308 if (
const auto *IT = dyn_cast<BitIntType>(CanonicalType))
2309 return IT->isSigned();
2310 if (
const auto *IT = dyn_cast<DependentBitIntType>(CanonicalType))
2311 return IT->isSigned();
2313 if (
const auto *OBT = dyn_cast<OverflowBehaviorType>(CanonicalType))
2314 return OBT->getUnderlyingType()->isSignedIntegerType();
2320 if (
const auto *BT = dyn_cast<BuiltinType>(CanonicalType))
2321 return BT->isSignedInteger();
2324 if (!ED->isComplete())
2326 return ED->getIntegerType()->isSignedIntegerType();
2329 if (
const auto *IT = dyn_cast<BitIntType>(CanonicalType))
2330 return IT->isSigned();
2331 if (
const auto *IT = dyn_cast<DependentBitIntType>(CanonicalType))
2332 return IT->isSigned();
2334 if (
const auto *OBT = dyn_cast<OverflowBehaviorType>(CanonicalType))
2335 return OBT->getUnderlyingType()->isSignedIntegerOrEnumerationType();
2341 if (
const auto *VT = dyn_cast<VectorType>(CanonicalType))
2342 return VT->getElementType()->isSignedIntegerOrEnumerationType();
2343 if (
const auto *MT = dyn_cast<MatrixType>(CanonicalType))
2344 return MT->getElementType()->isSignedIntegerOrEnumerationType();
2346 if (
const auto *BT = dyn_cast<BuiltinType>(CanonicalType)) {
2347 switch (BT->getKind()) {
2348#define SVE_VECTOR_TYPE_INT(Name, MangledName, Id, SingletonId, NumEls, \
2349 ElBits, NF, IsSigned) \
2350 case BuiltinType::Id: \
2352#include "clang/Basic/AArch64ACLETypes.def"
2365 if (
const auto *BT = dyn_cast<BuiltinType>(CanonicalType))
2366 return BT->isUnsignedInteger();
2371 if (!ED->isComplete() || ED->isScoped())
2373 return ED->getIntegerType()->isUnsignedIntegerType();
2376 if (
const auto *IT = dyn_cast<BitIntType>(CanonicalType))
2377 return IT->isUnsigned();
2378 if (
const auto *IT = dyn_cast<DependentBitIntType>(CanonicalType))
2379 return IT->isUnsigned();
2381 if (
const auto *OBT = dyn_cast<OverflowBehaviorType>(CanonicalType))
2382 return OBT->getUnderlyingType()->isUnsignedIntegerType();
2388 if (
const auto *BT = dyn_cast<BuiltinType>(CanonicalType))
2389 return BT->isUnsignedInteger();
2392 if (!ED->isComplete())
2394 return ED->getIntegerType()->isUnsignedIntegerType();
2397 if (
const auto *IT = dyn_cast<BitIntType>(CanonicalType))
2398 return IT->isUnsigned();
2399 if (
const auto *IT = dyn_cast<DependentBitIntType>(CanonicalType))
2400 return IT->isUnsigned();
2402 if (
const auto *OBT = dyn_cast<OverflowBehaviorType>(CanonicalType))
2403 return OBT->getUnderlyingType()->isUnsignedIntegerOrEnumerationType();
2409 if (
const auto *VT = dyn_cast<VectorType>(CanonicalType))
2410 return VT->getElementType()->isUnsignedIntegerOrEnumerationType();
2411 if (
const auto *VT = dyn_cast<MatrixType>(CanonicalType))
2412 return VT->getElementType()->isUnsignedIntegerOrEnumerationType();
2413 if (CanonicalType->isSveVLSBuiltinType()) {
2415 return VT->getKind() >= BuiltinType::SveUint8 &&
2416 VT->getKind() <= BuiltinType::SveUint64;
2422 if (
const auto *BT = dyn_cast<BuiltinType>(CanonicalType))
2423 return BT->isFloatingPoint();
2424 if (
const auto *CT = dyn_cast<ComplexType>(CanonicalType))
2425 return CT->getElementType()->isFloatingType();
2430 if (
const auto *VT = dyn_cast<VectorType>(CanonicalType))
2431 return VT->getElementType()->isFloatingType();
2432 if (
const auto *MT = dyn_cast<MatrixType>(CanonicalType))
2433 return MT->getElementType()->isFloatingType();
2438 if (
const auto *BT = dyn_cast<BuiltinType>(CanonicalType))
2439 return BT->isFloatingPoint();
2444 if (
const auto *BT = dyn_cast<BuiltinType>(CanonicalType))
2445 return BT->getKind() >= BuiltinType::Bool &&
2446 BT->getKind() <= BuiltinType::Ibm128;
2447 if (
const auto *ET = dyn_cast<EnumType>(CanonicalType)) {
2448 const auto *ED = ET->getDecl();
2449 return !ED->isScoped() && ED->getDefinitionOrSelf()->isComplete();
2455 if (
const auto *BT = dyn_cast<BuiltinType>(CanonicalType))
2456 return BT->getKind() >= BuiltinType::Bool &&
2457 BT->getKind() <= BuiltinType::Ibm128;
2458 if (
const auto *ET = dyn_cast<EnumType>(CanonicalType)) {
2465 const auto *ED = ET->getDecl();
2466 return !ED->isScoped() && ED->getDefinitionOrSelf()->isComplete();
2477 if (
const auto *VT = dyn_cast<VectorType>(CanonicalType))
2478 return VT->getElementType()->isBooleanType();
2480 return ED->isComplete() && ED->getIntegerType()->isBooleanType();
2481 if (
const auto *IT = dyn_cast<BitIntType>(CanonicalType))
2482 return IT->getNumBits() == 1;
2489 const Type *
T = CanonicalType.getTypePtr();
2490 if (
const auto *BT = dyn_cast<BuiltinType>(
T)) {
2491 if (BT->getKind() == BuiltinType::Bool)
2493 if (BT->getKind() == BuiltinType::NullPtr)
2495 if (BT->isInteger())
2497 if (BT->isFloatingPoint())
2499 if (BT->isFixedPointType())
2501 llvm_unreachable(
"unknown scalar builtin type");
2511 assert(
T->castAsEnumDecl()->isComplete());
2513 }
else if (
const auto *CT = dyn_cast<ComplexType>(
T)) {
2514 if (CT->getElementType()->isRealFloatingType())
2523 llvm_unreachable(
"unknown scalar type");
2536 if (
const auto *
Record = dyn_cast<RecordType>(CanonicalType)) {
2537 if (
const auto *ClassDecl = dyn_cast<CXXRecordDecl>(
Record->getDecl()))
2538 return ClassDecl->isAggregate();
2550 assert(!
isIncompleteType() &&
"This doesn't make sense for incomplete types");
2551 assert(!
isDependentType() &&
"This doesn't make sense for dependent types");
2563 switch (CanonicalType->getTypeClass()) {
2574 return !EnumD->isComplete();
2582 return !Rec->isCompleteDefinition();
2584 case InjectedClassName: {
2586 if (!Rec->isBeingDefined())
2600 ->isIncompleteType(Def);
2601 case IncompleteArray:
2604 case MemberPointer: {
2617 if (!Context.getTargetInfo().getCXXABI().isMicrosoft())
2620 if (RD->
hasAttr<MSInheritanceAttr>())
2627 ->isIncompleteType(Def);
2628 case ObjCInterface: {
2660 switch (BT->getKind()) {
2662#define WASM_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
2663#include "clang/Basic/WebAssemblyReferenceTypes.def"
2665#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
2666#include "clang/Basic/HLSLIntangibleTypes.def"
2668 case BuiltinType::AMDGPUFeaturePredicate:
2679 return BT->getKind() == BuiltinType::WasmExternRef;
2684 if (
const auto *ATy = dyn_cast<ArrayType>(
this))
2685 return ATy->getElementType().isWebAssemblyReferenceType();
2687 if (
const auto *PTy = dyn_cast<PointerType>(
this))
2688 return PTy->getPointeeType().isWebAssemblyReferenceType();
2701 switch (BT->getKind()) {
2703#define SVE_VECTOR_TYPE(Name, MangledName, Id, SingletonId) \
2704 case BuiltinType::Id: \
2706#define SVE_OPAQUE_TYPE(Name, MangledName, Id, SingletonId) \
2707 case BuiltinType::Id: \
2709#define SVE_PREDICATE_TYPE(Name, MangledName, Id, SingletonId) \
2710 case BuiltinType::Id: \
2712#include "clang/Basic/AArch64ACLETypes.def"
2722 switch (BT->getKind()) {
2723#define RVV_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
2724#include "clang/Basic/RISCVVTypes.def"
2735 switch (BT->getKind()) {
2736 case BuiltinType::SveInt8:
2737 case BuiltinType::SveInt16:
2738 case BuiltinType::SveInt32:
2739 case BuiltinType::SveInt64:
2740 case BuiltinType::SveUint8:
2741 case BuiltinType::SveUint16:
2742 case BuiltinType::SveUint32:
2743 case BuiltinType::SveUint64:
2744 case BuiltinType::SveFloat16:
2745 case BuiltinType::SveFloat32:
2746 case BuiltinType::SveFloat64:
2747 case BuiltinType::SveBFloat16:
2748 case BuiltinType::SveBool:
2749 case BuiltinType::SveBoolx2:
2750 case BuiltinType::SveBoolx4:
2751 case BuiltinType::SveMFloat8:
2769 llvm_unreachable(
"Unhandled type");
2776 if (BTy->
getKind() == BuiltinType::SveBool)
2787 switch (BT->getKind()) {
2788#define RVV_VECTOR_TYPE(Name, Id, SingletonId, NumEls, ElBits, NF, IsSigned, \
2790 case BuiltinType::Id: \
2792#define RVV_PREDICATE_TYPE(Name, Id, SingletonId, NumEls) \
2793 case BuiltinType::Id: \
2795#include "clang/Basic/RISCVVTypes.def"
2809#define RVV_PREDICATE_TYPE(Name, Id, SingletonId, NumEls) \
2810 case BuiltinType::Id: \
2811 return Ctx.UnsignedCharTy;
2814#include "clang/Basic/RISCVVTypes.def"
2817 llvm_unreachable(
"Unhandled type");
2821 if (Context.getLangOpts().HLSL &&
2822 getTypePtr()->isHLSLStandardLayoutRecordOrArrayOf())
2826 if (Context.getLangOpts().CPlusPlus11)
2839 if ((*this)->isIncompleteArrayType())
2840 return Context.getBaseElementType(*this).isCXX98PODType(Context);
2842 if ((*this)->isIncompleteType())
2851 if (Context.containsAddressDiscriminatedPointerAuth(CanonicalType))
2858 case Type::VariableArray:
2859 case Type::ConstantArray:
2861 return Context.getBaseElementType(*this).isCXX98PODType(Context);
2863 case Type::ObjCObjectPointer:
2864 case Type::BlockPointer:
2868 case Type::MemberPointer:
2870 case Type::ExtVector:
2872 case Type::OverflowBehavior:
2879 if (
const auto *ClassDecl =
2881 return ClassDecl->isPOD();
2895 if ((*this)->isArrayType())
2896 return Context.getBaseElementType(*this).isTrivialType(Context);
2898 if ((*this)->isSizelessBuiltinType())
2903 if ((*this)->isIncompleteType())
2915 if (Context.containsAddressDiscriminatedPointerAuth(CanonicalType))
2934 return ClassDecl->hasTrivialDefaultConstructor() &&
2935 !ClassDecl->hasNonTrivialDefaultConstructor() &&
2936 ClassDecl->isTriviallyCopyable();
2948 bool IsCopyConstructible) {
2949 if (
type->isArrayType())
2951 Context, IsCopyConstructible);
2953 if (
type.hasNonTrivialObjCLifetime())
2987 if (
const auto *ClassDecl = dyn_cast<CXXRecordDecl>(RD)) {
2988 if (IsCopyConstructible)
2989 return ClassDecl->isTriviallyCopyConstructible();
2990 return ClassDecl->isTriviallyCopyable();
2992 return !RD->isNonTrivialToPrimitiveCopy();
3006 if (CanonicalType.hasNonTrivialObjCLifetime())
3008 if (CanonicalType->isArrayType())
3009 return Context.getBaseElementType(CanonicalType)
3010 .isBitwiseCloneableType(Context);
3012 if (CanonicalType->isIncompleteType())
3017 if (Context.containsAddressDiscriminatedPointerAuth(CanonicalType))
3020 const auto *RD = CanonicalType->getAsRecordDecl();
3024 if (RD->isInvalidDecl())
3030 if (RD->mayInsertExtraPadding())
3033 for (
auto *
const Field : RD->fields()) {
3034 if (!Field->getType().isBitwiseCloneableType(Context))
3038 if (
const auto *CXXRD = dyn_cast<CXXRecordDecl>(RD)) {
3039 for (
auto Base : CXXRD->bases())
3040 if (!
Base.getType().isBitwiseCloneableType(Context))
3042 for (
auto VBase : CXXRD->vbases())
3043 if (!VBase.getType().isBitwiseCloneableType(Context))
3056 return !Context.getLangOpts().ObjCAutoRefCount &&
3057 Context.getLangOpts().ObjCWeak &&
3090 return OBT->getBehaviorKind() ==
3091 OverflowBehaviorType::OverflowBehaviorKind::Wrap;
3098 return OBT->getBehaviorKind() ==
3099 OverflowBehaviorType::OverflowBehaviorKind::Trap;
3106 if (
const auto *RD =
3122 if (
const auto *RD =
3162 assert(BaseTy &&
"NULL element type");
3196 if (
const auto *ClassDecl = dyn_cast<CXXRecordDecl>(RD))
3197 return ClassDecl->isLiteral();
3204 return AT->getValueType()->isLiteralType(Ctx);
3206 if (
const auto *OBT = BaseTy->
getAs<OverflowBehaviorType>())
3207 return OBT->getUnderlyingType()->isLiteralType(Ctx);
3229 return RD->isStructural();
3242 assert(BaseTy &&
"NULL element type");
3253 if (
const auto *ClassDecl = dyn_cast<CXXRecordDecl>(RD);
3254 ClassDecl && !ClassDecl->isStandardLayout())
3282 assert(BaseTy &&
"NULL element type");
3293 if (Context.containsAddressDiscriminatedPointerAuth(*
this))
3300 if (
const auto *ClassDecl = dyn_cast<CXXRecordDecl>(RD)) {
3303 if (!ClassDecl->isTrivial())
3309 if (!ClassDecl->isStandardLayout())
3340 const auto *ED = ET->getDecl();
3342 if (II && II->
isStr(
"align_val_t") && ED->isInStdNamespace())
3350 const auto *ED = ET->getDecl();
3352 if (II && II->
isStr(
"byte") && ED->isInStdNamespace())
3368 case TemplateTypeParm:
3369 case SubstTemplateTypeParm:
3370 case TemplateSpecialization:
3413 llvm_unreachable(
"Type specifier is not a tag type kind.");
3430 llvm_unreachable(
"Unknown tag type kind.");
3448 llvm_unreachable(
"Elaborated type keyword is not a tag type kind.");
3450 llvm_unreachable(
"Unknown elaborated type keyword.");
3465 llvm_unreachable(
"Unknown elaborated type keyword.");
3479 return "__interface";
3486 llvm_unreachable(
"Unknown elaborated type keyword.");
3491 if (
const auto *TST = dyn_cast<TemplateSpecializationType>(
this))
3493 else if (
const auto *DepName = dyn_cast<DependentNameType>(
this))
3494 Keyword = DepName->getKeyword();
3495 else if (
const auto *
T = dyn_cast<TagType>(
this))
3497 else if (
const auto *
T = dyn_cast<TypedefType>(
this))
3499 else if (
const auto *
T = dyn_cast<UnresolvedUsingType>(
this))
3501 else if (
const auto *
T = dyn_cast<UsingType>(
this))
3511#define ABSTRACT_TYPE(Derived, Base)
3512#define TYPE(Derived, Base) \
3515#include "clang/AST/TypeNodes.inc"
3518 llvm_unreachable(
"Invalid type class.");
3526 return Policy.
Bool ?
"bool" :
"_Bool";
3532 return "signed char";
3544 return "unsigned char";
3546 return "unsigned short";
3548 return "unsigned int";
3550 return "unsigned long";
3552 return "unsigned long long";
3554 return "unsigned __int128";
3556 return Policy.
Half ?
"half" :
"__fp16";
3564 return "long double";
3566 return "short _Accum";
3570 return "long _Accum";
3572 return "unsigned short _Accum";
3574 return "unsigned _Accum";
3576 return "unsigned long _Accum";
3577 case BuiltinType::ShortFract:
3578 return "short _Fract";
3579 case BuiltinType::Fract:
3581 case BuiltinType::LongFract:
3582 return "long _Fract";
3583 case BuiltinType::UShortFract:
3584 return "unsigned short _Fract";
3585 case BuiltinType::UFract:
3586 return "unsigned _Fract";
3587 case BuiltinType::ULongFract:
3588 return "unsigned long _Fract";
3589 case BuiltinType::SatShortAccum:
3590 return "_Sat short _Accum";
3591 case BuiltinType::SatAccum:
3592 return "_Sat _Accum";
3593 case BuiltinType::SatLongAccum:
3594 return "_Sat long _Accum";
3595 case BuiltinType::SatUShortAccum:
3596 return "_Sat unsigned short _Accum";
3597 case BuiltinType::SatUAccum:
3598 return "_Sat unsigned _Accum";
3599 case BuiltinType::SatULongAccum:
3600 return "_Sat unsigned long _Accum";
3601 case BuiltinType::SatShortFract:
3602 return "_Sat short _Fract";
3603 case BuiltinType::SatFract:
3604 return "_Sat _Fract";
3605 case BuiltinType::SatLongFract:
3606 return "_Sat long _Fract";
3607 case BuiltinType::SatUShortFract:
3608 return "_Sat unsigned short _Fract";
3609 case BuiltinType::SatUFract:
3610 return "_Sat unsigned _Fract";
3611 case BuiltinType::SatULongFract:
3612 return "_Sat unsigned long _Fract";
3616 return "__float128";
3621 return Policy.
MSWChar ?
"__wchar_t" :
"wchar_t";
3631 return "<overloaded function type>";
3633 return "<bound member function type>";
3634 case UnresolvedTemplate:
3635 return "<unresolved template type>";
3637 return "<pseudo-object type>";
3639 return "<dependent type>";
3641 return "<unknown type>";
3642 case ARCUnbridgedCast:
3643 return "<ARC unbridged cast type>";
3645 return "<builtin fn type>";
3652#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
3654 return "__" #Access " " #ImgType "_t";
3655#include "clang/Basic/OpenCLImageTypes.def"
3661 return "clk_event_t";
3665 return "reserve_id_t";
3666 case IncompleteMatrixIdx:
3667 return "<incomplete matrix index type>";
3669 return "<array section type>";
3670 case OMPArrayShaping:
3671 return "<OpenMP array shaping type>";
3673 return "<OpenMP iterator type>";
3674#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
3677#include "clang/Basic/OpenCLExtensionTypes.def"
3678#define SVE_TYPE(Name, Id, SingletonId) \
3681#include "clang/Basic/AArch64ACLETypes.def"
3682#define PPC_VECTOR_TYPE(Name, Id, Size) \
3685#include "clang/Basic/PPCTypes.def"
3686#define RVV_TYPE(Name, Id, SingletonId) \
3689#include "clang/Basic/RISCVVTypes.def"
3690#define WASM_TYPE(Name, Id, SingletonId) \
3693#include "clang/Basic/WebAssemblyReferenceTypes.def"
3694#define AMDGPU_TYPE(Name, Id, SingletonId, Width, Align) \
3697#include "clang/Basic/AMDGPUTypes.def"
3698#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) \
3701#include "clang/Basic/HLSLIntangibleTypes.def"
3702#define SPIRV_TYPE(Name, Id, SingletonId) \
3705#include "clang/Basic/SPIRVTypes.def"
3708 llvm_unreachable(
"Invalid builtin type.");
3713 if (
auto *PET = dyn_cast<PackExpansionType>(
getTypePtr()))
3714 return PET->getPattern();
3719 if (
const auto *RefType =
getTypePtr()->getAs<ReferenceType>())
3727 if (!Context.getLangOpts().CPlusPlus ||
3736 return FPT->hasCFIUncheckedCallee();
3753 return "vectorcall";
3765 return "aarch64_vector_pcs";
3767 return "aarch64_sve_pcs";
3769 return "intel_ocl_bicc";
3771 return "device_kernel";
3775 return "swiftasynccall";
3777 return "preserve_most";
3779 return "preserve_all";
3783 return "preserve_none";
3786#define CC_VLS_CASE(ABI_VLEN) \
3787 case CC_RISCVVLSCall_##ABI_VLEN: return "riscv_vls_cc(" #ABI_VLEN ")";
3804 llvm_unreachable(
"Invalid calling convention.");
3822 assert(
getNumParams() == params.size() &&
"NumParams overflow!");
3831 auto &ExtraBits = *getTrailingObjects<FunctionTypeExtraBitfields>();
3839 auto &ExtraAttrInfo = *getTrailingObjects<FunctionTypeExtraAttributeInfo>();
3843 auto &ExtraBits = *getTrailingObjects<FunctionTypeExtraBitfields>();
3844 ExtraBits.HasExtraAttributeInfo =
true;
3848 auto &ArmTypeAttrs = *getTrailingObjects<FunctionTypeArmAttributes>();
3849 ArmTypeAttrs = FunctionTypeArmAttributes();
3852 auto &ExtraBits = *getTrailingObjects<FunctionTypeExtraBitfields>();
3853 ExtraBits.HasArmTypeAttributes =
true;
3857 auto *argSlot = getTrailingObjects<QualType>();
3860 ~TypeDependence::VariablyModified);
3861 argSlot[i] = params[i];
3866 auto &ArmTypeAttrs = *getTrailingObjects<FunctionTypeArmAttributes>();
3868 "Not enough bits to encode SME attributes");
3874 auto &ExtraBits = *getTrailingObjects<FunctionTypeExtraBitfields>();
3876 assert(NumExceptions <= 1023 &&
"Not enough bits to encode exceptions");
3877 ExtraBits.NumExceptionType = NumExceptions;
3879 assert(hasExtraBitfields() &&
"missing trailing extra bitfields!");
3881 reinterpret_cast<QualType *
>(getTrailingObjects<ExceptionType>());
3889 (TypeDependence::Instantiation | TypeDependence::UnexpandedPack));
3891 exnSlot[I++] = ExceptionType;
3905 (TypeDependence::Instantiation | TypeDependence::UnexpandedPack));
3911 auto **slot = getTrailingObjects<FunctionDecl *>();
3919 auto **slot = getTrailingObjects<FunctionDecl *>();
3938 auto *extParamInfos = getTrailingObjects<ExtParameterInfo>();
3945 *getTrailingObjects<Qualifiers>() = epi.
TypeQuals;
3952 auto &EllipsisLoc = *getTrailingObjects<SourceLocation>();
3957 auto &ExtraBits = *getTrailingObjects<FunctionTypeExtraBitfields>();
3959 ExtraBits.NumFunctionEffects = EffectsCount;
3960 assert(ExtraBits.NumFunctionEffects == EffectsCount &&
3961 "effect bitfield overflow");
3964 auto *DestFX = getTrailingObjects<FunctionEffect>();
3965 llvm::uninitialized_copy(SrcFX, DestFX);
3968 if (!SrcConds.empty()) {
3969 ExtraBits.EffectsHaveConditions =
true;
3970 auto *DestConds = getTrailingObjects<EffectConditionExpr>();
3971 llvm::uninitialized_copy(SrcConds, DestConds);
3972 assert(llvm::any_of(SrcConds,
3973 [](
const EffectConditionExpr &EC) {
3975 return E->isTypeDependent() ||
3976 E->isValueDependent();
3979 "expected a dependent expression among the conditions");
3987 return NE->isValueDependent();
3999 return NE->isInstantiationDependent();
4010 llvm_unreachable(
"should not call this with unresolved exception specs");
4036 llvm_unreachable(
"unexpected exception specification kind");
4040 for (
unsigned ArgIdx =
getNumParams(); ArgIdx; --ArgIdx)
4048 const QualType *ArgTys,
unsigned NumParams,
4049 const ExtProtoInfo &epi,
4073 ID.AddPointer(
Result.getAsOpaquePtr());
4074 for (
unsigned i = 0; i != NumParams; ++i)
4075 ID.AddPointer(ArgTys[i].getAsOpaquePtr());
4079 assert(!(
unsigned(epi.Variadic) & ~1) && !(
unsigned(epi.RefQualifier) & ~3) &&
4080 !(
unsigned(epi.ExceptionSpec.Type) & ~15) &&
4081 "Values larger than expected.");
4082 ID.AddInteger(
unsigned(epi.Variadic) + (epi.RefQualifier << 1) +
4083 (epi.ExceptionSpec.Type << 3));
4084 ID.Add(epi.TypeQuals);
4086 for (
QualType Ex : epi.ExceptionSpec.Exceptions)
4091 epi.ExceptionSpec.NoexceptExpr->Profile(ID, Context,
true);
4094 ID.AddPointer(epi.ExceptionSpec.SourceDecl->getCanonicalDecl());
4096 if (epi.ExtParameterInfos) {
4097 for (
unsigned i = 0; i != NumParams; ++i)
4098 ID.AddInteger(epi.ExtParameterInfos[i].getOpaqueValue());
4101 epi.ExtInfo.Profile(ID);
4102 epi.ExtraAttributeInfo.Profile(ID);
4104 unsigned EffectCount = epi.FunctionEffects.size();
4105 bool HasConds = !epi.FunctionEffects.Conditions.empty();
4107 ID.AddInteger((EffectCount << 3) | (HasConds << 2) |
4108 (epi.AArch64SMEAttributes << 1) | epi.HasTrailingReturn);
4109 ID.AddInteger(epi.CFIUncheckedCallee);
4111 for (
unsigned Idx = 0; Idx != EffectCount; ++Idx) {
4112 ID.AddInteger(epi.FunctionEffects.Effects[Idx].toOpaqueInt32());
4114 ID.AddPointer(epi.FunctionEffects.Conditions[Idx].getCondition());
4125 : Data(D, Deref << DerefShift) {}
4128 return Data.getInt() & DerefMask;
4133 return Data.getOpaqueValue();
4140 Data.setFromOpaqueValue(
V);
4143OverflowBehaviorType::OverflowBehaviorType(
4145 OverflowBehaviorType::OverflowBehaviorKind Kind)
4146 :
Type(OverflowBehavior, Canon, Underlying->getDependence()),
4147 UnderlyingType(Underlying), BehaviorKind(Kind) {}
4153CountAttributedType::CountAttributedType(
4157 CountExpr(CountExpr) {
4161 auto *DeclSlot = getTrailingObjects();
4162 llvm::copy(CoupledDecls, DeclSlot);
4171#define ENUMERATE_ATTRS(PREFIX) \
4173 if (isCountInBytes()) { \
4175 return PREFIX "sized_by_or_null"; \
4176 return PREFIX "sized_by"; \
4179 return PREFIX "counted_by_or_null"; \
4180 return PREFIX "counted_by"; \
4183 if (WithMacroPrefix)
4188#undef ENUMERATE_ATTRS
4194 bool HasTypeDifferentFromDecl)
4196 Keyword, TC, UnderlyingType.getCanonicalType(),
4200 ~NestedNameSpecifierDependence::
Dependent)
4204 *getTrailingObjects<NestedNameSpecifier>() = Qualifier;
4205 if ((
TypedefBits.hasTypeDifferentFromDecl = HasTypeDifferentFromDecl))
4206 *getTrailingObjects<QualType>() = UnderlyingType;
4211 : *getTrailingObjects<QualType>();
4217 const Type *CanonicalType)
4223 ~NestedNameSpecifierDependence::
Dependent)
4227 *getTrailingObjects<NestedNameSpecifier>() = Qualifier;
4236 if ((
UsingBits.hasQualifier = !!Qualifier))
4237 *getTrailingObjects() = Qualifier;
4246 while (
auto *InnerMQT = dyn_cast<MacroQualifiedType>(Inner)) {
4249 Inner = InnerMQT->getModifiedType();
4260 ? Context.getUnqualifiedArrayType(Can).getAtomicUnqualifiedType()
4265 TOExpr(E), Context(Context) {
4266 TypeOfBits.Kind =
static_cast<unsigned>(Kind);
4275 ? Context.getUnqualifiedArrayType(QT).getAtomicUnqualifiedType()
4284 E->
Profile(ID, Context,
true);
4285 ID.AddBoolean(IsUnqual);
4292 ? Context.getUnqualifiedArrayType(Can).getAtomicUnqualifiedType()
4294 T->getDependence()),
4295 TOType(
T), Context(Context) {
4296 TypeOfBits.Kind =
static_cast<unsigned>(Kind);
4299QualType TypeOfType::desugar()
const {
4302 ? Context.getUnqualifiedArrayType(QT).getAtomicUnqualifiedType()
4310 :
Type(Decltype, can,
4314 (E->
getType()->getDependence() &
4316 E(E), UnderlyingType(underlyingType) {}
4318bool DecltypeType::isSugared()
const {
return !E->isInstantiationDependent(); }
4320QualType DecltypeType::desugar()
const {
4327DependentDecltypeType::DependentDecltypeType(
Expr *E)
4330void DependentDecltypeType::Profile(llvm::FoldingSetNodeID &ID,
4332 E->
Profile(ID, Context,
true);
4336 Expr *IndexExpr,
bool FullySubstituted,
4338 :
Type(PackIndexing, Canonical,
4340 Pattern(Pattern), IndexExpr(IndexExpr),
Size(Expansions.size()),
4341 FullySubstituted(FullySubstituted) {
4343 llvm::uninitialized_copy(Expansions, getTrailingObjects());
4347 if (isInstantiationDependentType())
4348 return std::nullopt;
4350 ConstantExpr *CE = dyn_cast<ConstantExpr>(getIndexExpr());
4352 return std::nullopt;
4354 assert(Index.isNonNegative() &&
"Invalid index");
4355 return static_cast<unsigned>(Index.getExtValue());
4359PackIndexingType::computeDependence(
QualType Pattern,
Expr *IndexExpr,
4364 ? TypeDependence::DependentInstantiation
4365 : TypeDependence::None);
4366 if (Expansions.empty())
4367 TD |= Pattern->
getDependence() & TypeDependence::DependentInstantiation;
4370 TD |=
T->getDependence();
4372 if (!(IndexD & TypeDependence::UnexpandedPack))
4378 TD |= TypeDependence::Error | TypeDependence::DependentInstantiation;
4383void PackIndexingType::Profile(llvm::FoldingSetNodeID &ID,
4385 Profile(ID, Context, getPattern(), getIndexExpr(), isFullySubstituted(),
4389void PackIndexingType::Profile(llvm::FoldingSetNodeID &ID,
4391 Expr *E,
bool FullySubstituted,
4394 E->
Profile(ID, Context,
true);
4395 ID.AddBoolean(FullySubstituted);
4396 if (!Expansions.empty()) {
4397 ID.AddInteger(Expansions.size());
4399 T.getCanonicalType().Profile(ID);
4405UnaryTransformType::UnaryTransformType(
QualType BaseType,
4406 QualType UnderlyingType, UTTKind UKind,
4408 :
Type(UnaryTransform, CanonicalType, BaseType->getDependence()),
4409 BaseType(BaseType), UnderlyingType(UnderlyingType), UKind(UKind) {}
4413 bool OwnsTag,
bool ISInjected,
const Type *CanonicalType)
4420 ~NestedNameSpecifierDependence::
Dependent)
4424 getTrailingQualifier() = Qualifier;
4429void *TagType::getTrailingPointer()
const {
4430 switch (getTypeClass()) {
4435 case Type::InjectedClassName:
4436 return const_cast<InjectedClassNameType *
>(
4439 llvm_unreachable(
"unexpected type class");
4444 assert(TagTypeBits.HasQualifier);
4446 getTrailingPointer(), llvm::Align::Of<NestedNameSpecifier *>()));
4450 return TagTypeBits.HasQualifier ? getTrailingQualifier() : std::nullopt;
4454 auto *
Decl = dyn_cast<CXXRecordDecl>(
decl);
4457 if (
auto *RD = dyn_cast<ClassTemplateSpecializationDecl>(
Decl))
4458 return RD->getSpecializedTemplate();
4459 return Decl->getDescribedClassTemplate();
4463 auto *TD = getTemplateDecl();
4466 if (isCanonicalUnqualified())
4473TagType::getTemplateArgs(
const ASTContext &Ctx)
const {
4474 auto *
Decl = dyn_cast<CXXRecordDecl>(
decl);
4478 if (
auto *RD = dyn_cast<ClassTemplateSpecializationDecl>(
Decl))
4479 return RD->getTemplateArgs().asArray();
4481 return TD->getTemplateParameters()->getInjectedTemplateArgs(Ctx);
4485bool RecordType::hasConstFields()
const {
4486 std::vector<const RecordType *> RecordTypeList;
4487 RecordTypeList.push_back(
this);
4488 unsigned NextToCheckIndex = 0;
4490 while (RecordTypeList.size() > NextToCheckIndex) {
4491 for (
FieldDecl *FD : RecordTypeList[NextToCheckIndex]
4493 ->getDefinitionOrSelf()
4499 if (
const auto *FieldRecTy = FieldTy->
getAsCanonical<RecordType>()) {
4500 if (!llvm::is_contained(RecordTypeList, FieldRecTy))
4501 RecordTypeList.push_back(FieldRecTy);
4511 const TagDecl *TD,
bool IsInjected,
4512 const Type *CanonicalType)
4514 false, IsInjected, CanonicalType) {}
4523 :
Type(Attributed, canon, equivalent->getDependence()), Attribute(
attr),
4524 ModifiedType(modified), EquivalentType(equivalent) {
4526 assert(!attr ||
attr->getKind() == attrKind);
4529bool AttributedType::isQualifier()
const {
4531 switch (getAttrKind()) {
4536 case attr::ObjCOwnership:
4537 case attr::ObjCInertUnsafeUnretained:
4538 case attr::TypeNonNull:
4539 case attr::TypeNullable:
4540 case attr::TypeNullableResult:
4541 case attr::TypeNullUnspecified:
4542 case attr::LifetimeBound:
4543 case attr::AddressSpace:
4553bool AttributedType::isMSTypeSpec()
const {
4555 switch (getAttrKind()) {
4564 llvm_unreachable(
"invalid attr kind");
4567bool AttributedType::isWebAssemblyFuncrefSpec()
const {
4568 return getAttrKind() == attr::WebAssemblyFuncref;
4571bool AttributedType::isCallingConv()
const {
4573 switch (getAttrKind()) {
4578 case attr::FastCall:
4580 case attr::ThisCall:
4582 case attr::SwiftCall:
4583 case attr::SwiftAsyncCall:
4584 case attr::VectorCall:
4585 case attr::AArch64VectorPcs:
4586 case attr::AArch64SVEPcs:
4587 case attr::DeviceKernel:
4591 case attr::IntelOclBicc:
4592 case attr::PreserveMost:
4593 case attr::PreserveAll:
4595 case attr::PreserveNone:
4596 case attr::RISCVVectorCC:
4597 case attr::RISCVVLSCC:
4600 llvm_unreachable(
"invalid attr kind");
4604 return isCanonicalUnqualified() ?
nullptr : getDecl()->getIdentifier();
4607SubstTemplateTypeParmType::SubstTemplateTypeParmType(
QualType Replacement,
4608 Decl *AssociatedDecl,
4612 :
Type(SubstTemplateTypeParm, Replacement.getCanonicalType(),
4613 Replacement->getDependence()),
4614 AssociatedDecl(AssociatedDecl) {
4618 *getTrailingObjects() = Replacement;
4624 assert(AssociatedDecl !=
nullptr);
4628SubstTemplateTypeParmType::getReplacedParameter()
const {
4633SubstPackType::SubstPackType(TypeClass Derived,
QualType Canon,
4635 :
Type(Derived, Canon,
4639 assert(llvm::all_of(
4641 [](
auto &P) { return P.getKind() == TemplateArgument::Type; }) &&
4642 "non-type argument to SubstPackType?");
4650void SubstPackType::Profile(llvm::FoldingSetNodeID &ID) {
4651 Profile(ID, getArgumentPack());
4654void SubstPackType::Profile(llvm::FoldingSetNodeID &ID,
4658 ID.AddPointer(P.getAsType().getAsOpaquePtr());
4661SubstTemplateTypeParmPackType::SubstTemplateTypeParmPackType(
4662 QualType Canon,
Decl *AssociatedDecl,
unsigned Index,
bool Final,
4664 : SubstPackType(SubstTemplateTypeParmPack, Canon, ArgPack),
4665 AssociatedDeclAndFinal(AssociatedDecl, Final) {
4666 assert(AssociatedDecl !=
nullptr);
4669 assert(getNumArgs() == ArgPack.
pack_size() &&
4670 "Parent bitfields in SubstPackType were overwritten."
4671 "Check NumSubstPackTypeBits.");
4674Decl *SubstTemplateTypeParmPackType::getAssociatedDecl()
const {
4675 return AssociatedDeclAndFinal.getPointer();
4678bool SubstTemplateTypeParmPackType::getFinal()
const {
4679 return AssociatedDeclAndFinal.getInt();
4683SubstTemplateTypeParmPackType::getReplacedParameter()
const {
4688IdentifierInfo *SubstTemplateTypeParmPackType::getIdentifier()
const {
4689 return getReplacedParameter()->getIdentifier();
4692void SubstTemplateTypeParmPackType::Profile(llvm::FoldingSetNodeID &ID) {
4693 Profile(ID, getAssociatedDecl(),
getIndex(), getFinal(), getArgumentPack());
4696void SubstTemplateTypeParmPackType::Profile(llvm::FoldingSetNodeID &ID,
4697 const Decl *AssociatedDecl,
4698 unsigned Index,
bool Final,
4700 ID.AddPointer(AssociatedDecl);
4701 ID.AddInteger(Index);
4702 ID.AddBoolean(Final);
4703 SubstPackType::Profile(ID, ArgPack);
4706SubstBuiltinTemplatePackType::SubstBuiltinTemplatePackType(
4708 : SubstPackType(SubstBuiltinTemplatePack, Canon, ArgPack) {}
4710bool TemplateSpecializationType::anyDependentTemplateArguments(
4713 return anyDependentTemplateArguments(Args.
arguments(), Converted);
4716bool TemplateSpecializationType::anyDependentTemplateArguments(
4719 if (Arg.isDependent())
4724bool TemplateSpecializationType::anyInstantiationDependentTemplateArguments(
4727 if (ArgLoc.getArgument().isInstantiationDependent())
4736 ? TypeDependence::DependentInstantiation
4741 D |= TypeDependence::UnexpandedPack;
4743 D |= (Underlying->
getDependence() & TypeDependence::UnexpandedPack);
4748TemplateSpecializationType::TemplateSpecializationType(
4752 Underlying.isNull() ?
QualType(this, 0)
4753 : Underlying.getCanonicalType(),
4756 TemplateSpecializationTypeBits.NumArgs = Args.size();
4757 TemplateSpecializationTypeBits.TypeAlias = IsAlias;
4759 auto *TemplateArgs =
4771 ~TypeDependence::Dependent);
4773 addDependence(Arg.getAsType()->getDependence() &
4774 TypeDependence::VariablyModified);
4781 *
reinterpret_cast<QualType *
>(TemplateArgs) = Underlying;
4784QualType TemplateSpecializationType::getAliasedType()
const {
4785 assert(isTypeAlias() &&
"not a type alias template specialization");
4786 return *
reinterpret_cast<const QualType *
>(template_arguments().end());
4789bool clang::TemplateSpecializationType::isSugared()
const {
4790 return !isDependentType() || isCurrentInstantiation() || isTypeAlias() ||
4795void TemplateSpecializationType::Profile(llvm::FoldingSetNodeID &ID,
4797 Profile(ID, getKeyword(),
Template, template_arguments(),
4798 isSugared() ? desugar() :
QualType(), Ctx);
4801void TemplateSpecializationType::Profile(llvm::FoldingSetNodeID &ID,
4807 ID.AddInteger(llvm::to_underlying(
Keyword));
4811 ID.AddInteger(Args.size());
4813 Arg.Profile(ID, Context);
4821 return Context.getQualifiedType(QT, *
this);
4825 const Type *
T)
const {
4829 return Context.getQualifiedType(
T, *
this);
4832void ObjCObjectTypeImpl::Profile(llvm::FoldingSetNodeID &ID,
QualType BaseType,
4836 ID.AddPointer(BaseType.getAsOpaquePtr());
4837 ID.AddInteger(typeArgs.size());
4838 for (
auto typeArg : typeArgs)
4839 ID.AddPointer(typeArg.getAsOpaquePtr());
4840 ID.AddInteger(protocols.size());
4841 for (
auto *proto : protocols)
4842 ID.AddPointer(proto);
4843 ID.AddBoolean(isKindOf);
4846void ObjCObjectTypeImpl::Profile(llvm::FoldingSetNodeID &ID) {
4847 Profile(ID, getBaseType(), getTypeArgsAsWritten(),
4849 isKindOfTypeAsWritten());
4855class CachedProperties {
4860 CachedProperties(
Linkage L,
bool local) : L(L), local(local) {}
4862 Linkage getLinkage()
const {
return L; }
4863 bool hasLocalOrUnnamedType()
const {
return local; }
4865 friend CachedProperties
merge(CachedProperties L, CachedProperties R) {
4867 return CachedProperties(MergedLinkage, L.hasLocalOrUnnamedType() ||
4868 R.hasLocalOrUnnamedType());
4887 return CachedProperties(
T->TypeBits.getLinkage(),
4888 T->TypeBits.hasLocalOrUnnamedType());
4893 if (
T->TypeBits.isCacheValid())
4898 if (!
T->isCanonicalUnqualified()) {
4899 const Type *CT =
T->getCanonicalTypeInternal().getTypePtr();
4901 T->TypeBits.CacheValid =
true;
4902 T->TypeBits.CachedLinkage = CT->
TypeBits.CachedLinkage;
4903 T->TypeBits.CachedLocalOrUnnamed = CT->
TypeBits.CachedLocalOrUnnamed;
4909 T->TypeBits.CacheValid =
true;
4910 T->TypeBits.CachedLinkage = llvm::to_underlying(
Result.getLinkage());
4911 T->TypeBits.CachedLocalOrUnnamed =
Result.hasLocalOrUnnamedType();
4929 switch (
T->getTypeClass()) {
4930#define TYPE(Class, Base)
4931#define NON_CANONICAL_TYPE(Class, Base) case Type::Class:
4932#include "clang/AST/TypeNodes.inc"
4933 llvm_unreachable(
"didn't expect a non-canonical type here");
4935#define TYPE(Class, Base)
4936#define DEPENDENT_TYPE(Class, Base) case Type::Class:
4937#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base) case Type::Class:
4938#include "clang/AST/TypeNodes.inc"
4940 assert(
T->isInstantiationDependentType());
4944 case Type::DeducedTemplateSpecialization:
4958 const auto *Tag =
cast<TagType>(
T)->getDecl()->getDefinitionOrSelf();
4964 Linkage L = Tag->getLinkageInternal();
4965 bool IsLocalOrUnnamed = Tag->getDeclContext()->isFunctionOrMethod() ||
4966 !Tag->hasNameForLinkage();
4967 return CachedProperties(L, IsLocalOrUnnamed);
4977 case Type::BlockPointer:
4979 case Type::LValueReference:
4980 case Type::RValueReference:
4982 case Type::MemberPointer: {
4984 CachedProperties Cls = [&] {
4985 if (MPT->isSugared())
4987 return Cache::get(MPT->getQualifier().getAsType());
4989 return merge(Cls,
Cache::get(MPT->getPointeeType()));
4991 case Type::ConstantArray:
4992 case Type::IncompleteArray:
4993 case Type::VariableArray:
4994 case Type::ArrayParameter:
4997 case Type::ExtVector:
4999 case Type::ConstantMatrix:
5001 case Type::FunctionNoProto:
5003 case Type::FunctionProto: {
5005 CachedProperties result =
Cache::get(FPT->getReturnType());
5006 for (
const auto &ai : FPT->param_types())
5010 case Type::ObjCInterface: {
5012 return CachedProperties(L,
false);
5014 case Type::ObjCObject:
5016 case Type::ObjCObjectPointer:
5022 case Type::HLSLAttributedResource:
5024 case Type::HLSLInlineSpirv:
5026 case Type::OverflowBehavior:
5030 llvm_unreachable(
"unhandled type class");
5041 return TypeBits.hasLocalOrUnnamedType();
5045 switch (
T->getTypeClass()) {
5046#define TYPE(Class, Base)
5047#define NON_CANONICAL_TYPE(Class, Base) case Type::Class:
5048#include "clang/AST/TypeNodes.inc"
5049 llvm_unreachable(
"didn't expect a non-canonical type here");
5051#define TYPE(Class, Base)
5052#define DEPENDENT_TYPE(Class, Base) case Type::Class:
5053#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base) case Type::Class:
5054#include "clang/AST/TypeNodes.inc"
5056 assert(
T->isInstantiationDependentType());
5064 case Type::DeducedTemplateSpecialization:
5076 case Type::BlockPointer:
5078 case Type::LValueReference:
5079 case Type::RValueReference:
5081 case Type::MemberPointer: {
5084 if (
auto *D = MPT->getMostRecentCXXRecordDecl()) {
5092 case Type::ConstantArray:
5093 case Type::IncompleteArray:
5094 case Type::VariableArray:
5095 case Type::ArrayParameter:
5098 case Type::ExtVector:
5100 case Type::ConstantMatrix:
5103 case Type::FunctionNoProto:
5105 case Type::FunctionProto: {
5108 for (
const auto &ai : FPT->param_types())
5112 case Type::ObjCInterface:
5114 case Type::ObjCObject:
5116 case Type::ObjCObjectPointer:
5123 case Type::OverflowBehavior:
5126 case Type::HLSLAttributedResource:
5129 case Type::HLSLInlineSpirv:
5133 llvm_unreachable(
"unhandled type class");
5147 if (!
T->isCanonicalUnqualified())
5161 while (
const auto *AT =
Type->getAs<AttributedType>()) {
5164 if (
auto Nullability = AT->getImmediateNullability())
5167 Type = AT->getEquivalentType();
5169 return std::nullopt;
5175 switch (
type->getTypeClass()) {
5176#define NON_CANONICAL_TYPE(Class, Parent) \
5179 llvm_unreachable("non-canonical type");
5180#define TYPE(Class, Parent)
5181#include "clang/AST/TypeNodes.inc"
5185 case Type::BlockPointer:
5186 case Type::MemberPointer:
5187 case Type::ObjCObjectPointer:
5191 case Type::UnresolvedUsing:
5192 case Type::TypeOfExpr:
5194 case Type::Decltype:
5195 case Type::PackIndexing:
5196 case Type::UnaryTransform:
5197 case Type::TemplateTypeParm:
5198 case Type::SubstTemplateTypeParmPack:
5199 case Type::SubstBuiltinTemplatePack:
5200 case Type::DependentName:
5202 return ResultIfUnknown;
5205 case Type::TemplateSpecialization:
5210 .getAsTemplateDecl())
5211 if (
auto *CTD = dyn_cast<ClassTemplateDecl>(templateDecl))
5212 return llvm::any_of(
5214 return RTD->getTemplatedDecl()->hasAttr<TypeNullableAttr>();
5216 return ResultIfUnknown;
5221#define SIGNED_TYPE(Id, SingletonId) case BuiltinType::Id:
5222#define UNSIGNED_TYPE(Id, SingletonId) case BuiltinType::Id:
5223#define FLOATING_TYPE(Id, SingletonId) case BuiltinType::Id:
5224#define BUILTIN_TYPE(Id, SingletonId)
5225#include "clang/AST/BuiltinTypes.def"
5228 case BuiltinType::UnresolvedTemplate:
5230 case BuiltinType::Dependent:
5231 case BuiltinType::Overload:
5232 case BuiltinType::BoundMember:
5233 case BuiltinType::PseudoObject:
5234 case BuiltinType::UnknownAny:
5235 case BuiltinType::ARCUnbridgedCast:
5236 return ResultIfUnknown;
5238 case BuiltinType::Void:
5239 case BuiltinType::ObjCId:
5240 case BuiltinType::ObjCClass:
5241 case BuiltinType::ObjCSel:
5242#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
5243 case BuiltinType::Id:
5244#include "clang/Basic/OpenCLImageTypes.def"
5245#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) case BuiltinType::Id:
5246#include "clang/Basic/OpenCLExtensionTypes.def"
5247 case BuiltinType::OCLSampler:
5248 case BuiltinType::OCLEvent:
5249 case BuiltinType::OCLClkEvent:
5250 case BuiltinType::OCLQueue:
5251 case BuiltinType::OCLReserveID:
5252#define SVE_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
5253#include "clang/Basic/AArch64ACLETypes.def"
5254#define PPC_VECTOR_TYPE(Name, Id, Size) case BuiltinType::Id:
5255#include "clang/Basic/PPCTypes.def"
5256#define RVV_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
5257#include "clang/Basic/RISCVVTypes.def"
5258#define WASM_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
5259#include "clang/Basic/WebAssemblyReferenceTypes.def"
5260#define AMDGPU_TYPE(Name, Id, SingletonId, Width, Align) case BuiltinType::Id:
5261#include "clang/Basic/AMDGPUTypes.def"
5262#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
5263#include "clang/Basic/HLSLIntangibleTypes.def"
5264#define SPIRV_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
5265#include "clang/Basic/SPIRVTypes.def"
5266 case BuiltinType::BuiltinFn:
5267 case BuiltinType::NullPtr:
5268 case BuiltinType::IncompleteMatrixIdx:
5269 case BuiltinType::ArraySection:
5270 case BuiltinType::OMPArrayShaping:
5271 case BuiltinType::OMPIterator:
5274 llvm_unreachable(
"unknown builtin type");
5276 case Type::Record: {
5280 if (
const auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(RD))
5281 return llvm::any_of(
5282 CTSD->getSpecializedTemplate()->redecls(),
5284 return RTD->getTemplatedDecl()->hasAttr<TypeNullableAttr>();
5287 return RD->hasAttr<TypeNullableAttr>();
5293 case Type::LValueReference:
5294 case Type::RValueReference:
5295 case Type::ConstantArray:
5296 case Type::IncompleteArray:
5297 case Type::VariableArray:
5298 case Type::DependentSizedArray:
5299 case Type::DependentVector:
5300 case Type::DependentSizedExtVector:
5302 case Type::ExtVector:
5303 case Type::ConstantMatrix:
5304 case Type::DependentSizedMatrix:
5305 case Type::DependentAddressSpace:
5306 case Type::FunctionProto:
5307 case Type::FunctionNoProto:
5308 case Type::DeducedTemplateSpecialization:
5310 case Type::InjectedClassName:
5311 case Type::PackExpansion:
5312 case Type::ObjCObject:
5313 case Type::ObjCInterface:
5317 case Type::DependentBitInt:
5318 case Type::ArrayParameter:
5319 case Type::HLSLAttributedResource:
5320 case Type::HLSLInlineSpirv:
5321 case Type::OverflowBehavior:
5324 llvm_unreachable(
"bad type kind!");
5328 if (getAttrKind() == attr::TypeNonNull)
5330 if (getAttrKind() == attr::TypeNullable)
5332 if (getAttrKind() == attr::TypeNullUnspecified)
5334 if (getAttrKind() == attr::TypeNullableResult)
5336 return std::nullopt;
5341 if (
auto MacroTy = dyn_cast<MacroQualifiedType>(
T))
5342 AttrTy = MacroTy->getUnderlyingType();
5344 if (
auto attributed = dyn_cast<AttributedType>(AttrTy)) {
5345 if (
auto nullability = attributed->getImmediateNullability()) {
5346 T = attributed->getModifiedType();
5351 return std::nullopt;
5354void AttributedType::Profile(llvm::FoldingSetNodeID &ID,
const ASTContext &Ctx,
5357 ID.AddInteger(attrKind);
5361 attr->Profile(ID, Ctx);
5375 if (objcPtr->isObjCIdType()) {
5386 }
else if (objcPtr->isObjCQualifiedIdType()) {
5411 "cannot query implicit lifetime for non-inferrable type");
5416 while (
const auto *array = dyn_cast<ArrayType>(canon))
5417 canon = array->getElementType().getTypePtr();
5419 if (
const auto *
opt = dyn_cast<ObjCObjectPointerType>(canon)) {
5421 if (
opt->getObjectType()->isObjCClass())
5430 return typedefType->getDecl()->hasAttr<ObjCNSObjectAttr>();
5436 return typedefType->getDecl()->hasAttr<ObjCIndependentClassAttr>();
5449 return OPT->getPointeeType()->isObjCIndirectLifetimeType();
5451 return Ref->getPointeeType()->isObjCIndirectLifetimeType();
5453 return MemPtr->getPointeeType()->isObjCIndirectLifetimeType();
5461 while (
const ArrayType *array =
type->getAsArrayTypeUnsafe())
5462 type = array->getElementType().getTypePtr();
5463 return type->isObjCRetainableType();
5485 return RT->getDecl()
5486 ->getMostRecentDecl()
5487 ->hasAttr<CUDADeviceBuiltinSurfaceTypeAttr>();
5494 return RT->getDecl()
5495 ->getMostRecentDecl()
5496 ->hasAttr<CUDADeviceBuiltinTextureTypeAttr>();
5508 if (
const auto *BT = dyn_cast<BuiltinType>(Ty))
5509 return BT->getKind() == BuiltinType::AMDGPUNamedWorkgroupBarrier;
5510 if (AllowWrappers) {
5511 if (
const auto *RT = dyn_cast<RecordType>(Ty))
5512 return RT->getDecl()->hasAttr<AMDGPUNamedBarrierWrapperAttr>();
5530 return ptr->getPointeeType()->hasSizedVLAType();
5532 return ref->getPointeeType()->hasSizedVLAType();
5538 return arr->getElementType()->hasSizedVLAType();
5545 return HLSLAttributedResourceType::findHandleTypeOnResource(
this) !=
nullptr;
5568 const RecordType *RT =
5574 assert(RD !=
nullptr &&
5575 "all HLSL structs and classes should be CXXRecordDecl");
5582 if (
const auto *RD =
5584 if (!RD->isHLSLBuiltinRecord() && RD->isStandardLayout())
5591 switch (
type.getObjCLifetime()) {
5603 if (
const auto *RD =
type->getBaseElementTypeUnsafe()->getAsRecordDecl()) {
5604 if (
const auto *CXXRD = dyn_cast<CXXRecordDecl>(RD)) {
5606 if (CXXRD->hasDefinition() && !CXXRD->hasTrivialDestructor())
5621 llvm::SmallPtrSetImpl<const Decl *> &Seen) {
5622 if (
const auto *Arr = Context.getAsArrayType(Ty))
5623 Ty = Context.getBaseElementType(Arr);
5625 if (
const auto *AttrTy = Ty->
getAs<AttributedType>())
5626 Ty = AttrTy->getModifiedType();
5629 "Incomplete types cannot be evaluated for laundering");
5636 if (!Seen.insert(
Record).second)
5639 if (
Record->isDynamicClass())
5665 Qualifier.Profile(ID);
5677 auto *RD = getCXXRecordDecl();
5684 llvm::APSInt Val,
unsigned Scale) {
5685 llvm::FixedPointSemantics FXSema(Val.getBitWidth(), Scale, Val.isSigned(),
5688 llvm::APFixedPoint(Val, FXSema).toString(Str);
5691DeducedType::DeducedType(TypeClass TC,
DeducedKind DK,
5694 ? DeducedAsTypeOrCanon.getCanonicalType()
5695 : DeducedAsTypeOrCanon,
5697 DeducedTypeBits.Kind = llvm::to_underlying(DK);
5702 assert(!DeducedAsTypeOrCanon.
isNull() &&
"Deduced type cannot be null");
5704 ~TypeDependence::VariablyModified);
5705 DeducedAsType = DeducedAsTypeOrCanon;
5708 addDependence(TypeDependence::UnexpandedPack);
5711 addDependence(TypeDependence::DependentInstantiation);
5714 assert(getDeducedKind() == DK &&
"DeducedKind does not match the type state");
5720 : DeducedType(
Auto, DK, DeducedAsTypeOrCanon) {
5721 AutoTypeBits.Keyword = llvm::to_underlying(
Keyword);
5722 AutoTypeBits.NumArgs = TypeConstraintArgs.size();
5723 this->TypeConstraintConcept = TypeConstraintConcept;
5724 assert(!TypeConstraintConcept.
isNull() || AutoTypeBits.NumArgs == 0);
5725 if (!TypeConstraintConcept.
isNull()) {
5727 "type-constraint does not name a concept");
5744void AutoType::Profile(llvm::FoldingSetNodeID &ID,
const ASTContext &Context,
5748 DeducedType::Profile(ID, DK,
Deduced);
5749 ID.AddInteger(llvm::to_underlying(
Keyword));
5752 Arg.Profile(ID, Context);
5755void AutoType::Profile(llvm::FoldingSetNodeID &ID,
const ASTContext &Context) {
5756 Profile(ID, Context, getDeducedKind(), getDeducedType(), getKeyword(),
5757 getTypeConstraintConcept(), getTypeConstraintArguments());
5771 llvm_unreachable(
"unknown effect kind");
5777 return "nonblocking";
5779 return "nonallocating";
5783 return "allocating";
5785 llvm_unreachable(
"unknown effect kind");
5801 return std::nullopt;
5806 assert(0 &&
"effectProhibitingInference with non-inferable effect kind");
5809 llvm_unreachable(
"unknown effect kind");
5819 const Kind EK = Effect.kind();
5821 if (EK == CallerKind ||
5832 llvm_unreachable(
"unknown effect kind");
5844 unsigned InsertIdx = Effects.size();
5859 Errs.push_back({EC, NewEC});
5870 if (NewCondition || !Conditions.empty()) {
5871 if (Conditions.empty() && !Effects.empty())
5872 Conditions.resize(Effects.size());
5873 Conditions.insert(Conditions.begin() + InsertIdx,
5876 Effects.insert(Effects.begin() + InsertIdx, NewEC.
Effect);
5881 for (
const auto &Item :
Set)
5883 return Errs.empty();
5894 auto IterA = LHS.
begin(), EndA = LHS.
end();
5895 auto IterB = RHS.
begin(), EndB = RHS.
end();
5899 return std::tuple(LHS.Effect,
uintptr_t(LHS.Cond.getCondition())) <
5900 std::tuple(RHS.Effect,
uintptr_t(RHS.Cond.getCondition()));
5903 while (IterA != EndA && IterB != EndB) {
5908 else if (FEWCLess(B, A))
5919 assert(Errs.empty() &&
"conflict shouldn't be possible in getIntersection");
5932 Combined.
insert(RHS, Errs);
5953 llvm::interleaveComma(*
this, OS);
5963 llvm::interleaveComma(*
this, OS);
5970 assert(llvm::is_sorted(FX) &&
"effects should be sorted");
5971 assert((Conds.empty() || Conds.size() == FX.size()) &&
5972 "effects size should match conditions size");
5978 if (
Cond.getCondition() !=
nullptr)
5984HLSLAttributedResourceType::computeDependence(
QualType Contained,
5985 const Attributes &Attrs) {
5989 if (Attrs.SampleCountExpr)
5994HLSLAttributedResourceType::HLSLAttributedResourceType(
QualType Wrapped,
5996 const Attributes &Attrs)
5999 WrappedType(Wrapped), ContainedType(Contained), Attrs(Attrs) {}
6001void HLSLAttributedResourceType::Profile(llvm::FoldingSetNodeID &ID,
6004 const Attributes &Attrs) {
6007 ID.AddInteger(
static_cast<uint32_t>(Attrs.ResourceClass));
6008 ID.AddInteger(
static_cast<uint32_t>(Attrs.ResourceDimension));
6009 ID.AddBoolean(Attrs.IsROV);
6010 ID.AddBoolean(Attrs.RawBuffer);
6011 ID.AddBoolean(Attrs.IsCounter);
6012 ID.AddBoolean(Attrs.IsArray);
6013 ID.AddBoolean(Attrs.SampleCountExpr !=
nullptr);
6014 if (Attrs.SampleCountExpr)
6015 Attrs.SampleCountExpr->Profile(ID, Ctx,
true);
6018const HLSLAttributedResourceType *
6019HLSLAttributedResourceType::findHandleTypeOnResource(
const Type *RT) {
6024 if (!RD->
fields().empty()) {
6025 const auto &FirstFD = RD->
fields().begin();
6026 return dyn_cast<HLSLAttributedResourceType>(
6027 FirstFD->getType().getTypePtr());
6033StringRef PredefinedSugarType::getName(Kind KD) {
6038 return "__signed_size_t";
6040 return "__ptrdiff_t";
6042 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 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 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
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.
QualType getConstantMatrixType(QualType ElementType, unsigned NumRows, unsigned NumColumns) const
Return the unique reference to the matrix type of the specified element type and size.
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
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)
ConstantExpr - An expression that occurs in a constant context and optionally the result of evaluatin...
llvm::APSInt getResultAsAPSInt() const
ConstantMatrixType(QualType MatrixElementType, unsigned NRows, unsigned NColumns, QualType CanonElementType)
unsigned NumRows
Number of rows and columns.
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)
QualType ElementType
The element type of the matrix.
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.
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
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.
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.
@ Type
The name was classified as a type.
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.
U cast(CodeGen::Address addr)
@ None
The alignment was not explicit in code.
@ 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...
__packed_splat4 __packed_splat2 __packed_splat8 __packed_splat4 __packed_splat2 __packed_splat4 __packed_splat2 __packed_splat8 __packed_splat4 uint32_t
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.