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) &&
113 if (
const auto *DNT = ty->
getAs<DependentNameType>())
117 if (
const auto *TT = ty->
getAs<TagType>())
142 if (T.isConstQualified())
146 return AT->getElementType().isConstant(Ctx);
151std::optional<QualType::NonConstantStorageReason>
154 if (!
isConstant(Ctx) && !(*this)->isReferenceType())
162 if (
Record->hasMutableFields())
164 if (!
Record->hasTrivialDestructor() && !ExcludeDtor)
190 (tc == DependentSizedArray
200 const llvm::APInt &Sz,
const Expr *SzExpr,
202 bool NeedsExternalSize = SzExpr !=
nullptr || Sz.ugt(0x0FFFFFFFFFFFFFFF) ||
203 Sz.getBitWidth() > 0xFF;
204 if (!NeedsExternalSize)
206 ET, Can, Sz.getBitWidth(), Sz.getZExtValue(), SzMod, Qual);
208 auto *SzPtr =
new (Ctx,
alignof(ConstantArrayType::ExternalSize))
209 ConstantArrayType::ExternalSize(Sz, SzExpr);
217 const llvm::APInt &NumElements) {
218 uint64_t ElementSize = Context.getTypeSizeInChars(ElementType).getQuantity();
226 if (llvm::isPowerOf2_64(ElementSize)) {
227 return NumElements.getActiveBits() + llvm::Log2_64(ElementSize);
232 if ((ElementSize >> 32) == 0 && NumElements.getBitWidth() <= 64 &&
233 (NumElements.getZExtValue() >> 32) == 0) {
234 uint64_t TotalSize = NumElements.getZExtValue() * ElementSize;
235 return llvm::bit_width(TotalSize);
239 llvm::APSInt SizeExtended(NumElements,
true);
240 unsigned SizeTypeBits = Context.getTypeSize(Context.getSizeType());
241 SizeExtended = SizeExtended.extend(
242 std::max(SizeTypeBits, SizeExtended.getBitWidth()) * 2);
244 llvm::APSInt TotalSize(llvm::APInt(SizeExtended.getBitWidth(), ElementSize));
245 TotalSize *= SizeExtended;
247 return TotalSize.getActiveBits();
256 unsigned Bits = Context.getTypeSize(Context.getSizeType());
269 uint64_t ArraySize,
const Expr *SizeExpr,
272 ID.AddInteger(ArraySize);
273 ID.AddInteger(llvm::to_underlying(SizeMod));
274 ID.AddInteger(TypeQuals);
275 ID.AddBoolean(SizeExpr !=
nullptr);
277 SizeExpr->
Profile(ID, Context,
true);
289 :
ArrayType(DependentSizedArray, et, can, sm, tq, e), SizeExpr((
Stmt *)e) {}
294 unsigned TypeQuals,
Expr *E) {
296 ID.AddInteger(llvm::to_underlying(SizeMod));
297 ID.AddInteger(TypeQuals);
302DependentVectorType::DependentVectorType(
QualType ElementType,
305 :
Type(DependentVector, CanonType,
307 ElementType->getDependence() |
310 ElementType(ElementType), SizeExpr(SizeExpr), Loc(Loc) {
318 ID.AddPointer(ElementType.getAsOpaquePtr());
319 ID.AddInteger(llvm::to_underlying(VecKind));
320 SizeExpr->Profile(ID, Context,
true);
323DependentSizedExtVectorType::DependentSizedExtVectorType(
QualType ElementType,
327 :
Type(DependentSizedExtVector, can,
329 ElementType->getDependence() |
332 SizeExpr(SizeExpr), ElementType(ElementType), loc(loc) {}
338 ID.AddPointer(ElementType.getAsOpaquePtr());
339 SizeExpr->Profile(ID, Context,
true);
342DependentAddressSpaceType::DependentAddressSpaceType(
QualType PointeeType,
346 :
Type(DependentAddressSpace, can,
348 PointeeType->getDependence() |
351 AddrSpaceExpr(AddrSpaceExpr), PointeeType(PointeeType), loc(loc) {}
356 Expr *AddrSpaceExpr) {
357 ID.AddPointer(PointeeType.getAsOpaquePtr());
358 AddrSpaceExpr->Profile(ID, Context,
true);
362 const Expr *RowExpr,
const Expr *ColumnExpr)
363 :
Type(tc, canonType,
380 unsigned nColumns,
QualType canonType)
385 unsigned nRows,
unsigned nColumns,
390DependentSizedMatrixType::DependentSizedMatrixType(
QualType ElementType,
395 :
MatrixType(DependentSizedMatrix, ElementType, CanonicalType, RowExpr,
397 RowExpr(RowExpr), ColumnExpr(ColumnExpr), loc(loc) {}
404 RowExpr->Profile(ID, CTX,
true);
405 ColumnExpr->Profile(ID, CTX,
true);
432 ExprAndUnsigned(NumBitsExpr, IsUnsigned) {}
435 return ExprAndUnsigned.getInt();
439 return ExprAndUnsigned.getPointer();
445 ID.AddBoolean(IsUnsigned);
446 NumBitsExpr->
Profile(ID, Context,
true);
458 bool CountInBytes,
bool OrNull) {
459 ID.AddPointer(WrappedTy.getAsOpaquePtr());
460 ID.AddBoolean(CountInBytes);
461 ID.AddBoolean(OrNull);
466 ID.AddPointer(CountExpr);
474 if (
const auto *ATy = dyn_cast<ArrayType>(
this))
475 return ATy->getElementType().getTypePtr();
503 return Context.getQualifiedType(desugar,
split.
Quals);
509#define TYPE(CLASS, BASE) \
510 static_assert(!std::is_polymorphic<CLASS##Type>::value, \
511 #CLASS "Type should not be polymorphic!");
512#include "clang/AST/TypeNodes.inc"
517#define TYPE(CLASS, BASE) \
518 static_assert(std::is_trivially_destructible<CLASS##Type>::value, \
519 #CLASS "Type should be trivially destructible!");
520#include "clang/AST/TypeNodes.inc"
524#define ABSTRACT_TYPE(Class, Parent)
525#define TYPE(Class, Parent) \
526 case Type::Class: { \
527 const auto *ty = cast<Class##Type>(this); \
528 if (!ty->isSugared()) \
529 return QualType(ty, 0); \
530 return ty->desugar(); \
532#include "clang/AST/TypeNodes.inc"
534 llvm_unreachable(
"bad type kind!");
544#define ABSTRACT_TYPE(Class, Parent)
545#define TYPE(Class, Parent) \
546 case Type::Class: { \
547 const auto *Ty = cast<Class##Type>(CurTy); \
548 if (!Ty->isSugared()) \
549 return SplitQualType(Ty, Qs); \
550 Cur = Ty->desugar(); \
553#include "clang/AST/TypeNodes.inc"
562 Qualifiers quals =
split.Quals;
565 const Type *lastTypeWithQuals =
split.Ty;
572 switch (
split.Ty->getTypeClass()) {
573#define ABSTRACT_TYPE(Class, Parent)
574#define TYPE(Class, Parent) \
575 case Type::Class: { \
576 const auto *ty = cast<Class##Type>(split.Ty); \
577 if (!ty->isSugared()) \
579 next = ty->desugar(); \
582#include "clang/AST/TypeNodes.inc"
588 if (!
split.Quals.empty()) {
589 lastTypeWithQuals =
split.Ty;
595 return SplitQualType(lastTypeWithQuals, quals);
600 while (
const auto *PT = T->
getAs<ParenType>())
601 T = PT->getInnerType();
610 if (
const auto *Sugar = dyn_cast<T>(Cur))
613#define ABSTRACT_TYPE(Class, Parent)
614#define TYPE(Class, Parent) \
615 case Type::Class: { \
616 const auto *Ty = cast<Class##Type>(Cur); \
617 if (!Ty->isSugared()) \
619 Cur = Ty->desugar().getTypePtr(); \
622#include "clang/AST/TypeNodes.inc"
635template <>
const TemplateSpecializationType *
Type::getAs()
const {
655 const Type *Cur =
this;
659#define ABSTRACT_TYPE(Class, Parent)
660#define TYPE(Class, Parent) \
662 const auto *Ty = cast<Class##Type>(Cur); \
663 if (!Ty->isSugared()) \
665 Cur = Ty->desugar().getTypePtr(); \
668#include "clang/AST/TypeNodes.inc"
675 return RT->getDecl()->isClass();
681 return RT->getDecl()->isStruct();
689 const auto *
Decl = RT->getDecl();
690 if (!
Decl->isStruct())
692 return Decl->getDefinitionOrSelf()->hasFlexibleArrayMember();
697 return RD->hasAttr<ObjCBoxableAttr>();
703 return RT->getDecl()->isInterface();
709 return RT->getDecl()->isStructureOrClass();
715 return PT->getPointeeType()->isVoidType();
721 return RT->getDecl()->isUnion();
727 return CT->getElementType()->isFloatingType();
738 return ET->getDecl()->isScoped();
748 if (
Complex->getElementType()->isIntegerType())
771 if (
const auto *RT = dyn_cast<RecordType>(
this)) {
772 if (RT->getDecl()->isStruct())
777 if (
const auto *RT = dyn_cast<RecordType>(CanonicalType)) {
778 if (!RT->getDecl()->isStruct())
790 if (
const auto *RT = dyn_cast<RecordType>(
this)) {
791 if (RT->getDecl()->isUnion())
796 if (
const auto *RT = dyn_cast<RecordType>(CanonicalType)) {
797 if (!RT->getDecl()->isUnion())
817 if (OPT->isObjCIdType())
821 if (!OPT->isKindOfType())
825 if (OPT->isObjCClassType() || OPT->isObjCQualifiedClassType())
829 bound = OPT->getObjectType()
830 ->stripObjCKindOfTypeAndQuals(ctx)
841 if (OPT->isObjCClassType())
845 if (!OPT->isKindOfType())
849 return OPT->isObjCClassType() || OPT->isObjCQualifiedClassType();
863 :
Type(ObjCObject, Canonical,
Base->getDependence()), BaseType(
Base) {
867 assert(getTypeArgsAsWritten().size() == typeArgs.size() &&
868 "bitfield overflow in type argument count");
869 if (!typeArgs.empty())
870 memcpy(getTypeArgStorage(), typeArgs.data(),
871 typeArgs.size() *
sizeof(
QualType));
873 for (
auto typeArg : typeArgs) {
874 addDependence(typeArg->getDependence() & ~TypeDependence::VariablyModified);
881bool ObjCObjectType::isSpecialized()
const {
883 if (ObjCObjectTypeBits.NumTypeArgs > 0)
887 if (
const auto objcObject =
getBaseType()->getAs<ObjCObjectType>()) {
892 return objcObject->isSpecialized();
901 if (isSpecializedAsWritten())
902 return getTypeArgsAsWritten();
905 if (
const auto objcObject =
getBaseType()->getAs<ObjCObjectType>()) {
910 return objcObject->getTypeArgs();
917bool ObjCObjectType::isKindOfType()
const {
918 if (isKindOfTypeAsWritten())
922 if (
const auto objcObject =
getBaseType()->getAs<ObjCObjectType>()) {
927 return objcObject->isKindOfType();
935ObjCObjectType::stripObjCKindOfTypeAndQuals(
const ASTContext &ctx)
const {
936 if (!isKindOfType() && qual_empty())
942 if (
const auto *baseObj = splitBaseType.
Ty->
getAs<ObjCObjectType>())
943 baseType = baseObj->stripObjCKindOfTypeAndQuals(ctx);
947 getTypeArgsAsWritten(),
972template <
typename Derived>
973struct SimpleTransformVisitor :
public TypeVisitor<Derived, QualType> {
981 QualType result =
static_cast<Derived *
>(
this)->Visit(splitType.
Ty);
991 explicit SimpleTransformVisitor(
ASTContext &ctx) : Ctx(ctx) {}
995#define TYPE(Class, Base)
996#define DEPENDENT_TYPE(Class, Base) \
997 QualType Visit##Class##Type(const Class##Type *T) { return QualType(T, 0); }
998#include "clang/AST/TypeNodes.inc"
1000#define TRIVIAL_TYPE_CLASS(Class) \
1001 QualType Visit##Class##Type(const Class##Type *T) { return QualType(T, 0); }
1002#define SUGARED_TYPE_CLASS(Class) \
1003 QualType Visit##Class##Type(const Class##Type *T) { \
1004 if (!T->isSugared()) \
1005 return QualType(T, 0); \
1006 QualType desugaredType = recurse(T->desugar()); \
1007 if (desugaredType.isNull()) \
1009 if (desugaredType.getAsOpaquePtr() == T->desugar().getAsOpaquePtr()) \
1010 return QualType(T, 0); \
1011 return desugaredType; \
1017 QualType elementType = recurse(T->getElementType());
1018 if (elementType.
isNull())
1021 if (elementType.
getAsOpaquePtr() == T->getElementType().getAsOpaquePtr())
1027 QualType VisitPointerType(
const PointerType *T) {
1029 if (pointeeType.
isNull())
1033 return QualType(T, 0);
1038 QualType VisitBlockPointerType(
const BlockPointerType *T) {
1040 if (pointeeType.
isNull())
1044 return QualType(T, 0);
1049 QualType VisitLValueReferenceType(
const LValueReferenceType *T) {
1051 if (pointeeType.
isNull())
1056 return QualType(T, 0);
1061 QualType VisitRValueReferenceType(
const RValueReferenceType *T) {
1063 if (pointeeType.
isNull())
1068 return QualType(T, 0);
1073 QualType VisitMemberPointerType(
const MemberPointerType *T) {
1075 if (pointeeType.
isNull())
1079 return QualType(T, 0);
1085 QualType VisitConstantArrayType(
const ConstantArrayType *T) {
1087 if (elementType.
isNull())
1091 return QualType(T, 0);
1098 QualType VisitVariableArrayType(
const VariableArrayType *T) {
1100 if (elementType.
isNull())
1104 return QualType(T, 0);
1111 QualType VisitIncompleteArrayType(
const IncompleteArrayType *T) {
1113 if (elementType.
isNull())
1117 return QualType(T, 0);
1123 QualType VisitVectorType(
const VectorType *T) {
1125 if (elementType.
isNull())
1129 return QualType(T, 0);
1135 QualType VisitExtVectorType(
const ExtVectorType *T) {
1137 if (elementType.
isNull())
1141 return QualType(T, 0);
1146 QualType VisitConstantMatrixType(
const ConstantMatrixType *T) {
1148 if (elementType.
isNull())
1151 return QualType(T, 0);
1157 QualType VisitOverflowBehaviorType(
const OverflowBehaviorType *T) {
1158 QualType UnderlyingType = recurse(T->getUnderlyingType());
1159 if (UnderlyingType.
isNull())
1163 T->getUnderlyingType().getAsOpaquePtr())
1164 return QualType(T, 0);
1169 QualType VisitFunctionNoProtoType(
const FunctionNoProtoType *T) {
1175 return QualType(T, 0);
1180 QualType VisitFunctionProtoType(
const FunctionProtoType *T) {
1186 SmallVector<QualType, 4> paramTypes;
1187 bool paramChanged =
false;
1189 QualType newParamType = recurse(paramType);
1190 if (newParamType.
isNull())
1194 paramChanged =
true;
1196 paramTypes.push_back(newParamType);
1201 bool exceptionChanged =
false;
1203 SmallVector<QualType, 4> exceptionTypes;
1205 QualType newExceptionType = recurse(exceptionType);
1206 if (newExceptionType.
isNull())
1209 if (newExceptionType.
getAsOpaquePtr() != exceptionType.getAsOpaquePtr())
1210 exceptionChanged =
true;
1212 exceptionTypes.push_back(newExceptionType);
1215 if (exceptionChanged) {
1217 llvm::ArrayRef(exceptionTypes).copy(Ctx);
1222 !paramChanged && !exceptionChanged)
1223 return QualType(T, 0);
1228 QualType VisitParenType(
const ParenType *T) {
1234 return QualType(T, 0);
1243 QualType VisitAdjustedType(
const AdjustedType *T) {
1245 if (originalType.
isNull())
1249 if (adjustedType.
isNull())
1255 return QualType(T, 0);
1260 QualType VisitDecayedType(
const DecayedType *T) {
1262 if (originalType.
isNull())
1266 return QualType(T, 0);
1271 QualType VisitArrayParameterType(
const ArrayParameterType *T) {
1272 QualType ArrTy = VisitConstantArrayType(T);
1286 QualType VisitAttributedType(
const AttributedType *T) {
1287 QualType modifiedType = recurse(T->getModifiedType());
1288 if (modifiedType.
isNull())
1291 QualType equivalentType = recurse(T->getEquivalentType());
1292 if (equivalentType.
isNull())
1296 T->getModifiedType().getAsOpaquePtr() &&
1298 T->getEquivalentType().getAsOpaquePtr())
1299 return QualType(T, 0);
1305 QualType VisitSubstTemplateTypeParmType(
const SubstTemplateTypeParmType *T) {
1306 QualType replacementType = recurse(T->getReplacementType());
1307 if (replacementType.
isNull())
1311 T->getReplacementType().getAsOpaquePtr())
1312 return QualType(T, 0);
1315 replacementType, T->getAssociatedDecl(), T->getIndex(),
1316 T->getPackIndex(), T->getFinal());
1322 QualType VisitAutoType(
const AutoType *T) {
1323 if (!T->isDeduced())
1324 return QualType(T, 0);
1326 QualType deducedType = recurse(T->getDeducedType());
1327 if (deducedType.
isNull())
1330 if (deducedType.
getAsOpaquePtr() == T->getDeducedType().getAsOpaquePtr())
1331 return QualType(T, 0);
1333 return Ctx.
getAutoType(deducedType, T->getKeyword(), T->isDependentType(),
1334 false, T->getTypeConstraintConcept(),
1335 T->getTypeConstraintArguments());
1338 QualType VisitObjCObjectType(
const ObjCObjectType *T) {
1339 QualType baseType = recurse(T->getBaseType());
1344 bool typeArgChanged =
false;
1345 SmallVector<QualType, 4> typeArgs;
1346 for (
auto typeArg : T->getTypeArgsAsWritten()) {
1347 QualType newTypeArg = recurse(typeArg);
1352 typeArgChanged =
true;
1354 typeArgs.push_back(newTypeArg);
1357 if (baseType.
getAsOpaquePtr() == T->getBaseType().getAsOpaquePtr() &&
1359 return QualType(T, 0);
1363 llvm::ArrayRef(T->qual_begin(), T->getNumProtocols()),
1364 T->isKindOfTypeAsWritten());
1369 QualType VisitObjCObjectPointerType(
const ObjCObjectPointerType *T) {
1371 if (pointeeType.
isNull())
1375 return QualType(T, 0);
1380 QualType VisitAtomicType(
const AtomicType *T) {
1386 return QualType(T, 0);
1391#undef TRIVIAL_TYPE_CLASS
1392#undef SUGARED_TYPE_CLASS
1395struct SubstObjCTypeArgsVisitor
1396 :
public SimpleTransformVisitor<SubstObjCTypeArgsVisitor> {
1397 using BaseType = SimpleTransformVisitor<SubstObjCTypeArgsVisitor>;
1399 ArrayRef<QualType> TypeArgs;
1402 SubstObjCTypeArgsVisitor(ASTContext &ctx, ArrayRef<QualType> typeArgs,
1404 : BaseType(ctx), TypeArgs(typeArgs), SubstContext(context) {}
1406 QualType VisitObjCTypeParamType(
const ObjCTypeParamType *OTPTy) {
1409 ObjCTypeParamDecl *typeParam = OTPTy->getDecl();
1411 if (!TypeArgs.empty()) {
1412 QualType argType = TypeArgs[typeParam->
getIndex()];
1413 if (OTPTy->qual_empty())
1418 SmallVector<ObjCProtocolDecl *, 8> protocolsVec;
1419 protocolsVec.append(OTPTy->qual_begin(), OTPTy->qual_end());
1420 ArrayRef<ObjCProtocolDecl *> protocolsToApply = protocolsVec;
1422 argType, protocolsToApply, hasError,
true );
1425 switch (SubstContext) {
1426 case ObjCSubstitutionContext::Ordinary:
1427 case ObjCSubstitutionContext::Parameter:
1428 case ObjCSubstitutionContext::Superclass:
1432 case ObjCSubstitutionContext::Result:
1433 case ObjCSubstitutionContext::Property: {
1435 const auto *objPtr =
1440 if (objPtr->isKindOfType() || objPtr->isObjCIdOrClassType())
1444 const auto *obj = objPtr->getObjectType();
1446 obj->getBaseType(), obj->getTypeArgsAsWritten(), obj->getProtocols(),
1453 llvm_unreachable(
"Unexpected ObjCSubstitutionContext!");
1456 QualType VisitFunctionType(
const FunctionType *funcType) {
1462 Ctx, TypeArgs, ObjCSubstitutionContext::Result);
1472 return BaseType::VisitFunctionType(funcType);
1481 SmallVector<QualType, 4> paramTypes;
1482 bool paramChanged =
false;
1483 for (
auto paramType : funcProtoType->getParamTypes()) {
1485 Ctx, TypeArgs, ObjCSubstitutionContext::Parameter);
1486 if (newParamType.
isNull())
1490 paramChanged =
true;
1492 paramTypes.push_back(newParamType);
1496 FunctionProtoType::ExtProtoInfo info = funcProtoType->getExtProtoInfo();
1497 bool exceptionChanged =
false;
1499 SmallVector<QualType, 4> exceptionTypes;
1502 Ctx, TypeArgs, ObjCSubstitutionContext::Ordinary);
1503 if (newExceptionType.
isNull())
1506 if (newExceptionType.
getAsOpaquePtr() != exceptionType.getAsOpaquePtr())
1507 exceptionChanged =
true;
1509 exceptionTypes.push_back(newExceptionType);
1512 if (exceptionChanged) {
1514 llvm::ArrayRef(exceptionTypes).copy(Ctx);
1519 funcProtoType->getReturnType().getAsOpaquePtr() &&
1520 !paramChanged && !exceptionChanged)
1521 return BaseType::VisitFunctionType(funcType);
1526 QualType VisitObjCObjectType(
const ObjCObjectType *objcObjectType) {
1529 if (objcObjectType->isSpecializedAsWritten()) {
1530 SmallVector<QualType, 4> newTypeArgs;
1531 bool anyChanged =
false;
1532 for (
auto typeArg : objcObjectType->getTypeArgsAsWritten()) {
1534 Ctx, TypeArgs, ObjCSubstitutionContext::Ordinary);
1541 ArrayRef<ObjCProtocolDecl *> protocols(
1542 objcObjectType->qual_begin(), objcObjectType->getNumProtocols());
1543 if (TypeArgs.empty() &&
1544 SubstContext != ObjCSubstitutionContext::Superclass) {
1546 objcObjectType->getBaseType(), {}, protocols,
1547 objcObjectType->isKindOfTypeAsWritten());
1553 newTypeArgs.push_back(newTypeArg);
1557 ArrayRef<ObjCProtocolDecl *> protocols(
1558 objcObjectType->qual_begin(), objcObjectType->getNumProtocols());
1561 objcObjectType->isKindOfTypeAsWritten());
1565 return BaseType::VisitObjCObjectType(objcObjectType);
1568 QualType VisitAttributedType(
const AttributedType *attrType) {
1569 QualType newType = BaseType::VisitAttributedType(attrType);
1573 const auto *newAttrType = dyn_cast<AttributedType>(newType.
getTypePtr());
1574 if (!newAttrType || newAttrType->getAttrKind() != attr::ObjCKindOf)
1578 QualType newEquivType = newAttrType->getEquivalentType();
1579 const ObjCObjectPointerType *ptrType =
1580 newEquivType->
getAs<ObjCObjectPointerType>();
1581 const ObjCObjectType *objType = ptrType
1583 : newEquivType->
getAs<ObjCObjectType>();
1590 objType->getBaseType(), objType->getTypeArgsAsWritten(),
1591 objType->getProtocols(),
1593 objType->isObjCUnqualifiedId() ?
false :
true);
1601 newAttrType->getModifiedType(), newEquivType,
1602 newAttrType->getAttr());
1606struct StripObjCKindOfTypeVisitor
1607 :
public SimpleTransformVisitor<StripObjCKindOfTypeVisitor> {
1608 using BaseType = SimpleTransformVisitor<StripObjCKindOfTypeVisitor>;
1610 explicit StripObjCKindOfTypeVisitor(ASTContext &ctx) : BaseType(ctx) {}
1612 QualType VisitObjCObjectType(
const ObjCObjectType *objType) {
1613 if (!objType->isKindOfType())
1614 return BaseType::VisitObjCObjectType(objType);
1616 QualType baseType = objType->getBaseType().stripObjCKindOfType(Ctx);
1618 objType->getProtocols(),
1635 case BuiltinType::Kind::Float16: {
1643 case BuiltinType::Kind::BFloat16: {
1663 SubstObjCTypeArgsVisitor visitor(ctx, typeArgs, context);
1664 return visitor.recurse(*
this);
1678 auto &ctx =
const_cast<ASTContext &
>(constCtx);
1679 StripObjCKindOfTypeVisitor visitor(ctx);
1680 return visitor.recurse(*
this);
1685 if (
const auto AT = T.getTypePtr()->getAs<
AtomicType>())
1686 T = AT->getValueType();
1687 return T.getUnqualifiedType();
1690std::optional<ArrayRef<QualType>>
1693 if (
const auto method = dyn_cast<ObjCMethodDecl>(dc))
1694 dc = method->getDeclContext();
1698 const auto *dcClassDecl = dyn_cast<ObjCInterfaceDecl>(dc);
1704 dcTypeParams = dcClassDecl->getTypeParamList();
1706 return std::nullopt;
1710 dcCategoryDecl = dyn_cast<ObjCCategoryDecl>(dc);
1711 if (!dcCategoryDecl)
1712 return std::nullopt;
1718 return std::nullopt;
1722 return std::nullopt;
1724 assert(dcTypeParams &&
"No substitutions to perform");
1725 assert(dcClassDecl &&
"No class context");
1730 objectType = objectPointerType->getObjectType();
1741 objectType ? objectType->getInterface() :
nullptr;
1742 if (!curClassDecl) {
1750 while (curClassDecl != dcClassDecl) {
1752 QualType superType = objectType->getSuperClassType();
1753 if (superType.
isNull()) {
1754 objectType =
nullptr;
1759 curClassDecl = objectType->getInterface();
1764 if (!objectType || objectType->isUnspecialized()) {
1769 return objectType->getTypeArgs();
1774 if (
auto *ID = IfaceT->getInterface()) {
1775 if (ID->getTypeParamList())
1783void ObjCObjectType::computeSuperClassTypeSlow()
const {
1789 CachedSuperClassType.setInt(
true);
1795 if (!superClassObjTy) {
1796 CachedSuperClassType.setInt(
true);
1801 if (!superClassDecl) {
1802 CachedSuperClassType.setInt(
true);
1808 QualType superClassType(superClassObjTy, 0);
1810 if (!superClassTypeParams) {
1811 CachedSuperClassType.setPointerAndInt(
1812 superClassType->castAs<ObjCObjectType>(),
true);
1817 if (superClassObjTy->isUnspecialized()) {
1818 CachedSuperClassType.setPointerAndInt(superClassObjTy,
true);
1826 CachedSuperClassType.setPointerAndInt(
1827 superClassType->castAs<ObjCObjectType>(),
true);
1833 if (isUnspecialized()) {
1836 superClassObjTy->getInterface());
1837 CachedSuperClassType.setPointerAndInt(
1838 unspecializedSuper->
castAs<ObjCObjectType>(),
true);
1844 assert(typeArgs.size() == typeParams->
size());
1845 CachedSuperClassType.setPointerAndInt(
1849 ->castAs<ObjCObjectType>(),
1855 return interfaceDecl->getASTContext()
1856 .getObjCInterfaceType(interfaceDecl)
1865 if (superObjectType.
isNull())
1866 return superObjectType;
1877 if (T->getNumProtocols() && T->getInterface())
1890 if (OPT->isObjCQualifiedIdType())
1900 if (OPT->isObjCQualifiedClassType())
1908 if (OT->getInterface())
1916 if (OPT->getInterfaceType())
1933const TemplateSpecializationType *
1936 while (TST && TST->isTypeAlias())
1937 TST = TST->desugar()->getAs<TemplateSpecializationType>();
1943 case Type::DependentName:
1945 case Type::TemplateSpecialization:
1951 case Type::InjectedClassName:
1955 case Type::UnresolvedUsing:
1960 return std::nullopt;
1965 const Type *Cur =
this;
1966 while (
const auto *AT = Cur->
getAs<AttributedType>()) {
1967 if (AT->getAttrKind() == AK)
1969 Cur = AT->getEquivalentType().getTypePtr();
1976class GetContainedDeducedTypeVisitor
1977 :
public TypeVisitor<GetContainedDeducedTypeVisitor, Type *> {
1981 GetContainedDeducedTypeVisitor(
bool Syntactic =
false)
1982 : Syntactic(Syntactic) {}
1989 return Visit(T.getTypePtr());
1993 Type *VisitDeducedType(
const DeducedType *AT) {
1994 return const_cast<DeducedType *
>(AT);
1998 Type *VisitSubstTemplateTypeParmType(
const SubstTemplateTypeParmType *T) {
1999 return Visit(T->getReplacementType());
2002 Type *VisitPointerType(
const PointerType *T) {
2006 Type *VisitBlockPointerType(
const BlockPointerType *T) {
2010 Type *VisitReferenceType(
const ReferenceType *T) {
2014 Type *VisitMemberPointerType(
const MemberPointerType *T) {
2018 Type *VisitArrayType(
const ArrayType *T) {
2022 Type *VisitDependentSizedExtVectorType(
const DependentSizedExtVectorType *T) {
2026 Type *VisitVectorType(
const VectorType *T) {
2030 Type *VisitDependentSizedMatrixType(
const DependentSizedMatrixType *T) {
2034 Type *VisitConstantMatrixType(
const ConstantMatrixType *T) {
2038 Type *VisitFunctionProtoType(
const FunctionProtoType *T) {
2040 return const_cast<FunctionProtoType *
>(T);
2041 return VisitFunctionType(T);
2044 Type *VisitFunctionType(
const FunctionType *T) {
2048 Type *VisitParenType(
const ParenType *T) {
return Visit(T->
getInnerType()); }
2050 Type *VisitAttributedType(
const AttributedType *T) {
2051 return Visit(T->getModifiedType());
2054 Type *VisitMacroQualifiedType(
const MacroQualifiedType *T) {
2058 Type *VisitOverflowBehaviorType(
const OverflowBehaviorType *T) {
2059 return Visit(T->getUnderlyingType());
2062 Type *VisitAdjustedType(
const AdjustedType *T) {
2066 Type *VisitPackExpansionType(
const PackExpansionType *T) {
2067 return Visit(T->getPattern());
2074 return cast_or_null<DeducedType>(
2075 GetContainedDeducedTypeVisitor().Visit(
this));
2079 return isa_and_nonnull<FunctionType>(
2080 GetContainedDeducedTypeVisitor(
true).Visit(
this));
2084 if (
const auto *VT = dyn_cast<VectorType>(CanonicalType))
2085 return VT->getElementType()->isIntegerType();
2086 if (CanonicalType->isSveVLSBuiltinType()) {
2088 return VT->getKind() == BuiltinType::SveBool ||
2089 (VT->getKind() >= BuiltinType::SveInt8 &&
2090 VT->getKind() <= BuiltinType::SveUint64);
2092 if (CanonicalType->isRVVVLSBuiltinType()) {
2094 return (VT->getKind() >= BuiltinType::RvvInt8mf8 &&
2095 VT->getKind() <= BuiltinType::RvvUint64m8);
2121 if (
const auto *BT = dyn_cast<BuiltinType>(CanonicalType))
2122 return BT->isInteger();
2126 if (
const auto *ET = dyn_cast<EnumType>(CanonicalType))
2129 if (
const OverflowBehaviorType *OBT =
2130 dyn_cast<OverflowBehaviorType>(CanonicalType))
2131 return OBT->getUnderlyingType()->isIntegralOrEnumerationType();
2138 if (
const auto *BT = dyn_cast<BuiltinType>(CanonicalType))
2139 return BT->isInteger();
2141 if (
const auto *OBT = dyn_cast<OverflowBehaviorType>(CanonicalType))
2142 return OBT->getUnderlyingType()->isIntegerType();
2151 if (
const auto *ET = dyn_cast<EnumType>(CanonicalType))
2152 return !ET->getDecl()->isScoped();
2158 if (
const auto *BT = dyn_cast<BuiltinType>(CanonicalType))
2159 return BT->getKind() == BuiltinType::Char_U ||
2160 BT->getKind() == BuiltinType::UChar ||
2161 BT->getKind() == BuiltinType::Char_S ||
2162 BT->getKind() == BuiltinType::SChar;
2167 if (
const auto *BT = dyn_cast<BuiltinType>(CanonicalType))
2168 return BT->getKind() == BuiltinType::WChar_S ||
2169 BT->getKind() == BuiltinType::WChar_U;
2174 if (
const BuiltinType *BT = dyn_cast<BuiltinType>(CanonicalType))
2175 return BT->getKind() == BuiltinType::Char8;
2180 if (
const auto *BT = dyn_cast<BuiltinType>(CanonicalType))
2181 return BT->getKind() == BuiltinType::Char16;
2186 if (
const auto *BT = dyn_cast<BuiltinType>(CanonicalType))
2187 return BT->getKind() == BuiltinType::Char32;
2194 const auto *BT = dyn_cast<BuiltinType>(CanonicalType);
2197 switch (BT->getKind()) {
2200 case BuiltinType::Char_U:
2201 case BuiltinType::UChar:
2202 case BuiltinType::WChar_U:
2203 case BuiltinType::Char8:
2204 case BuiltinType::Char16:
2205 case BuiltinType::Char32:
2206 case BuiltinType::Char_S:
2207 case BuiltinType::SChar:
2208 case BuiltinType::WChar_S:
2214 const auto *BT = dyn_cast<BuiltinType>(CanonicalType);
2217 switch (BT->getKind()) {
2220 case BuiltinType::Char8:
2221 case BuiltinType::Char16:
2222 case BuiltinType::Char32:
2231 if (
const auto *BT = dyn_cast<BuiltinType>(CanonicalType))
2232 return BT->isSignedInteger();
2237 if (!ED->isComplete() || ED->isScoped())
2239 return ED->getIntegerType()->isSignedIntegerType();
2242 if (
const auto *IT = dyn_cast<BitIntType>(CanonicalType))
2243 return IT->isSigned();
2244 if (
const auto *IT = dyn_cast<DependentBitIntType>(CanonicalType))
2245 return IT->isSigned();
2247 if (
const auto *OBT = dyn_cast<OverflowBehaviorType>(CanonicalType))
2248 return OBT->getUnderlyingType()->isSignedIntegerType();
2254 if (
const auto *BT = dyn_cast<BuiltinType>(CanonicalType))
2255 return BT->isSignedInteger();
2258 if (!ED->isComplete())
2260 return ED->getIntegerType()->isSignedIntegerType();
2263 if (
const auto *IT = dyn_cast<BitIntType>(CanonicalType))
2264 return IT->isSigned();
2265 if (
const auto *IT = dyn_cast<DependentBitIntType>(CanonicalType))
2266 return IT->isSigned();
2268 if (
const auto *OBT = dyn_cast<OverflowBehaviorType>(CanonicalType))
2269 return OBT->getUnderlyingType()->isSignedIntegerOrEnumerationType();
2275 if (
const auto *VT = dyn_cast<VectorType>(CanonicalType))
2276 return VT->getElementType()->isSignedIntegerOrEnumerationType();
2285 if (
const auto *BT = dyn_cast<BuiltinType>(CanonicalType))
2286 return BT->isUnsignedInteger();
2291 if (!ED->isComplete() || ED->isScoped())
2293 return ED->getIntegerType()->isUnsignedIntegerType();
2296 if (
const auto *IT = dyn_cast<BitIntType>(CanonicalType))
2297 return IT->isUnsigned();
2298 if (
const auto *IT = dyn_cast<DependentBitIntType>(CanonicalType))
2299 return IT->isUnsigned();
2301 if (
const auto *OBT = dyn_cast<OverflowBehaviorType>(CanonicalType))
2302 return OBT->getUnderlyingType()->isUnsignedIntegerType();
2308 if (
const auto *BT = dyn_cast<BuiltinType>(CanonicalType))
2309 return BT->isUnsignedInteger();
2312 if (!ED->isComplete())
2314 return ED->getIntegerType()->isUnsignedIntegerType();
2317 if (
const auto *IT = dyn_cast<BitIntType>(CanonicalType))
2318 return IT->isUnsigned();
2319 if (
const auto *IT = dyn_cast<DependentBitIntType>(CanonicalType))
2320 return IT->isUnsigned();
2322 if (
const auto *OBT = dyn_cast<OverflowBehaviorType>(CanonicalType))
2323 return OBT->getUnderlyingType()->isUnsignedIntegerOrEnumerationType();
2329 if (
const auto *VT = dyn_cast<VectorType>(CanonicalType))
2330 return VT->getElementType()->isUnsignedIntegerOrEnumerationType();
2331 if (
const auto *VT = dyn_cast<MatrixType>(CanonicalType))
2332 return VT->getElementType()->isUnsignedIntegerOrEnumerationType();
2333 if (CanonicalType->isSveVLSBuiltinType()) {
2335 return VT->getKind() >= BuiltinType::SveUint8 &&
2336 VT->getKind() <= BuiltinType::SveUint64;
2342 if (
const auto *BT = dyn_cast<BuiltinType>(CanonicalType))
2343 return BT->isFloatingPoint();
2344 if (
const auto *CT = dyn_cast<ComplexType>(CanonicalType))
2345 return CT->getElementType()->isFloatingType();
2350 if (
const auto *VT = dyn_cast<VectorType>(CanonicalType))
2351 return VT->getElementType()->isFloatingType();
2352 if (
const auto *MT = dyn_cast<MatrixType>(CanonicalType))
2353 return MT->getElementType()->isFloatingType();
2358 if (
const auto *BT = dyn_cast<BuiltinType>(CanonicalType))
2359 return BT->isFloatingPoint();
2364 if (
const auto *BT = dyn_cast<BuiltinType>(CanonicalType))
2365 return BT->getKind() >= BuiltinType::Bool &&
2366 BT->getKind() <= BuiltinType::Ibm128;
2367 if (
const auto *ET = dyn_cast<EnumType>(CanonicalType)) {
2368 const auto *ED = ET->getDecl();
2369 return !ED->isScoped() && ED->getDefinitionOrSelf()->isComplete();
2375 if (
const auto *BT = dyn_cast<BuiltinType>(CanonicalType))
2376 return BT->getKind() >= BuiltinType::Bool &&
2377 BT->getKind() <= BuiltinType::Ibm128;
2378 if (
const auto *ET = dyn_cast<EnumType>(CanonicalType)) {
2385 const auto *ED = ET->getDecl();
2386 return !ED->isScoped() && ED->getDefinitionOrSelf()->isComplete();
2397 if (
const auto *VT = dyn_cast<VectorType>(CanonicalType))
2398 return VT->getElementType()->isBooleanType();
2400 return ED->isComplete() && ED->getIntegerType()->isBooleanType();
2401 if (
const auto *IT = dyn_cast<BitIntType>(CanonicalType))
2402 return IT->getNumBits() == 1;
2409 const Type *T = CanonicalType.getTypePtr();
2410 if (
const auto *BT = dyn_cast<BuiltinType>(T)) {
2411 if (BT->getKind() == BuiltinType::Bool)
2413 if (BT->getKind() == BuiltinType::NullPtr)
2415 if (BT->isInteger())
2417 if (BT->isFloatingPoint())
2419 if (BT->isFixedPointType())
2421 llvm_unreachable(
"unknown scalar builtin type");
2431 assert(T->castAsEnumDecl()->isComplete());
2433 }
else if (
const auto *CT = dyn_cast<ComplexType>(T)) {
2434 if (CT->getElementType()->isRealFloatingType())
2443 llvm_unreachable(
"unknown scalar type");
2456 if (
const auto *
Record = dyn_cast<RecordType>(CanonicalType)) {
2457 if (
const auto *ClassDecl = dyn_cast<CXXRecordDecl>(
Record->getDecl()))
2458 return ClassDecl->isAggregate();
2470 assert(!
isIncompleteType() &&
"This doesn't make sense for incomplete types");
2471 assert(!
isDependentType() &&
"This doesn't make sense for dependent types");
2483 switch (CanonicalType->getTypeClass()) {
2494 return !EnumD->isComplete();
2502 return !Rec->isCompleteDefinition();
2504 case InjectedClassName: {
2506 if (!Rec->isBeingDefined())
2520 ->isIncompleteType(Def);
2521 case IncompleteArray:
2524 case MemberPointer: {
2537 if (!Context.getTargetInfo().getCXXABI().isMicrosoft())
2540 if (RD->
hasAttr<MSInheritanceAttr>())
2547 ->isIncompleteType(Def);
2548 case ObjCInterface: {
2580 switch (BT->getKind()) {
2582#define WASM_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
2583#include "clang/Basic/WebAssemblyReferenceTypes.def"
2585#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
2586#include "clang/Basic/HLSLIntangibleTypes.def"
2597 return BT->getKind() == BuiltinType::WasmExternRef;
2602 if (
const auto *ATy = dyn_cast<ArrayType>(
this))
2603 return ATy->getElementType().isWebAssemblyReferenceType();
2605 if (
const auto *PTy = dyn_cast<PointerType>(
this))
2606 return PTy->getPointeeType().isWebAssemblyReferenceType();
2619 switch (BT->getKind()) {
2621#define SVE_VECTOR_TYPE(Name, MangledName, Id, SingletonId) \
2622 case BuiltinType::Id: \
2624#define SVE_OPAQUE_TYPE(Name, MangledName, Id, SingletonId) \
2625 case BuiltinType::Id: \
2627#define SVE_PREDICATE_TYPE(Name, MangledName, Id, SingletonId) \
2628 case BuiltinType::Id: \
2630#include "clang/Basic/AArch64ACLETypes.def"
2640 switch (BT->getKind()) {
2641#define RVV_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
2642#include "clang/Basic/RISCVVTypes.def"
2653 switch (BT->getKind()) {
2654 case BuiltinType::SveInt8:
2655 case BuiltinType::SveInt16:
2656 case BuiltinType::SveInt32:
2657 case BuiltinType::SveInt64:
2658 case BuiltinType::SveUint8:
2659 case BuiltinType::SveUint16:
2660 case BuiltinType::SveUint32:
2661 case BuiltinType::SveUint64:
2662 case BuiltinType::SveFloat16:
2663 case BuiltinType::SveFloat32:
2664 case BuiltinType::SveFloat64:
2665 case BuiltinType::SveBFloat16:
2666 case BuiltinType::SveBool:
2667 case BuiltinType::SveBoolx2:
2668 case BuiltinType::SveBoolx4:
2669 case BuiltinType::SveMFloat8:
2687 llvm_unreachable(
"Unhandled type");
2694 if (BTy->
getKind() == BuiltinType::SveBool)
2705 switch (BT->getKind()) {
2706#define RVV_VECTOR_TYPE(Name, Id, SingletonId, NumEls, ElBits, NF, IsSigned, \
2708 case BuiltinType::Id: \
2710#define RVV_PREDICATE_TYPE(Name, Id, SingletonId, NumEls) \
2711 case BuiltinType::Id: \
2713#include "clang/Basic/RISCVVTypes.def"
2727#define RVV_PREDICATE_TYPE(Name, Id, SingletonId, NumEls) \
2728 case BuiltinType::Id: \
2729 return Ctx.UnsignedCharTy;
2732#include "clang/Basic/RISCVVTypes.def"
2735 llvm_unreachable(
"Unhandled type");
2740 if (Context.getLangOpts().CPlusPlus11)
2753 if ((*this)->isIncompleteArrayType())
2754 return Context.getBaseElementType(*this).isCXX98PODType(Context);
2756 if ((*this)->isIncompleteType())
2765 if (Context.containsAddressDiscriminatedPointerAuth(CanonicalType))
2772 case Type::VariableArray:
2773 case Type::ConstantArray:
2775 return Context.getBaseElementType(*this).isCXX98PODType(Context);
2777 case Type::ObjCObjectPointer:
2778 case Type::BlockPointer:
2782 case Type::MemberPointer:
2784 case Type::ExtVector:
2786 case Type::OverflowBehavior:
2793 if (
const auto *ClassDecl =
2795 return ClassDecl->isPOD();
2809 if ((*this)->isArrayType())
2810 return Context.getBaseElementType(*this).isTrivialType(Context);
2812 if ((*this)->isSizelessBuiltinType())
2817 if ((*this)->isIncompleteType())
2829 if (Context.containsAddressDiscriminatedPointerAuth(CanonicalType))
2848 return ClassDecl->hasTrivialDefaultConstructor() &&
2849 !ClassDecl->hasNonTrivialDefaultConstructor() &&
2850 ClassDecl->isTriviallyCopyable();
2862 bool IsCopyConstructible) {
2863 if (
type->isArrayType())
2865 Context, IsCopyConstructible);
2867 if (
type.hasNonTrivialObjCLifetime())
2900 if (
const auto *ClassDecl = dyn_cast<CXXRecordDecl>(RD)) {
2901 if (IsCopyConstructible)
2902 return ClassDecl->isTriviallyCopyConstructible();
2903 return ClassDecl->isTriviallyCopyable();
2905 return !RD->isNonTrivialToPrimitiveCopy();
2919 if (CanonicalType.hasNonTrivialObjCLifetime())
2921 if (CanonicalType->isArrayType())
2922 return Context.getBaseElementType(CanonicalType)
2923 .isBitwiseCloneableType(Context);
2925 if (CanonicalType->isIncompleteType())
2930 if (Context.containsAddressDiscriminatedPointerAuth(CanonicalType))
2933 const auto *RD = CanonicalType->getAsRecordDecl();
2940 if (RD->mayInsertExtraPadding())
2943 for (
auto *
const Field : RD->fields()) {
2944 if (!Field->getType().isBitwiseCloneableType(Context))
2948 if (
const auto *CXXRD = dyn_cast<CXXRecordDecl>(RD)) {
2949 for (
auto Base : CXXRD->bases())
2950 if (!
Base.getType().isBitwiseCloneableType(Context))
2952 for (
auto VBase : CXXRD->vbases())
2953 if (!VBase.getType().isBitwiseCloneableType(Context))
2966 return !Context.getLangOpts().ObjCAutoRefCount &&
2967 Context.getLangOpts().ObjCWeak &&
3000 return OBT->getBehaviorKind() ==
3001 OverflowBehaviorType::OverflowBehaviorKind::Wrap;
3008 return OBT->getBehaviorKind() ==
3009 OverflowBehaviorType::OverflowBehaviorKind::Trap;
3016 if (
const auto *RD =
3032 if (
const auto *RD =
3072 assert(BaseTy &&
"NULL element type");
3106 if (
const auto *ClassDecl = dyn_cast<CXXRecordDecl>(RD))
3107 return ClassDecl->isLiteral();
3114 return AT->getValueType()->isLiteralType(Ctx);
3116 if (
const auto *OBT = BaseTy->
getAs<OverflowBehaviorType>())
3117 return OBT->getUnderlyingType()->isLiteralType(Ctx);
3139 return RD->isStructural();
3152 assert(BaseTy &&
"NULL element type");
3163 if (
const auto *ClassDecl = dyn_cast<CXXRecordDecl>(RD);
3164 ClassDecl && !ClassDecl->isStandardLayout())
3192 assert(BaseTy &&
"NULL element type");
3203 if (Context.containsAddressDiscriminatedPointerAuth(*
this))
3210 if (
const auto *ClassDecl = dyn_cast<CXXRecordDecl>(RD)) {
3213 if (!ClassDecl->isTrivial())
3219 if (!ClassDecl->isStandardLayout())
3250 const auto *ED = ET->getDecl();
3252 if (II && II->
isStr(
"align_val_t") && ED->isInStdNamespace())
3260 const auto *ED = ET->getDecl();
3262 if (II && II->
isStr(
"byte") && ED->isInStdNamespace())
3278 case TemplateTypeParm:
3279 case SubstTemplateTypeParm:
3280 case TemplateSpecialization:
3323 llvm_unreachable(
"Type specifier is not a tag type kind.");
3340 llvm_unreachable(
"Unknown tag type kind.");
3358 llvm_unreachable(
"Elaborated type keyword is not a tag type kind.");
3360 llvm_unreachable(
"Unknown elaborated type keyword.");
3375 llvm_unreachable(
"Unknown elaborated type keyword.");
3389 return "__interface";
3396 llvm_unreachable(
"Unknown elaborated type keyword.");
3401 if (
const auto *TST = dyn_cast<TemplateSpecializationType>(
this))
3403 else if (
const auto *DepName = dyn_cast<DependentNameType>(
this))
3404 Keyword = DepName->getKeyword();
3405 else if (
const auto *T = dyn_cast<TagType>(
this))
3407 else if (
const auto *T = dyn_cast<TypedefType>(
this))
3409 else if (
const auto *T = dyn_cast<UnresolvedUsingType>(
this))
3411 else if (
const auto *T = dyn_cast<UsingType>(
this))
3421#define ABSTRACT_TYPE(Derived, Base)
3422#define TYPE(Derived, Base) \
3425#include "clang/AST/TypeNodes.inc"
3428 llvm_unreachable(
"Invalid type class.");
3436 return Policy.
Bool ?
"bool" :
"_Bool";
3442 return "signed char";
3454 return "unsigned char";
3456 return "unsigned short";
3458 return "unsigned int";
3460 return "unsigned long";
3462 return "unsigned long long";
3464 return "unsigned __int128";
3466 return Policy.
Half ?
"half" :
"__fp16";
3474 return "long double";
3476 return "short _Accum";
3480 return "long _Accum";
3482 return "unsigned short _Accum";
3484 return "unsigned _Accum";
3486 return "unsigned long _Accum";
3487 case BuiltinType::ShortFract:
3488 return "short _Fract";
3489 case BuiltinType::Fract:
3491 case BuiltinType::LongFract:
3492 return "long _Fract";
3493 case BuiltinType::UShortFract:
3494 return "unsigned short _Fract";
3495 case BuiltinType::UFract:
3496 return "unsigned _Fract";
3497 case BuiltinType::ULongFract:
3498 return "unsigned long _Fract";
3499 case BuiltinType::SatShortAccum:
3500 return "_Sat short _Accum";
3501 case BuiltinType::SatAccum:
3502 return "_Sat _Accum";
3503 case BuiltinType::SatLongAccum:
3504 return "_Sat long _Accum";
3505 case BuiltinType::SatUShortAccum:
3506 return "_Sat unsigned short _Accum";
3507 case BuiltinType::SatUAccum:
3508 return "_Sat unsigned _Accum";
3509 case BuiltinType::SatULongAccum:
3510 return "_Sat unsigned long _Accum";
3511 case BuiltinType::SatShortFract:
3512 return "_Sat short _Fract";
3513 case BuiltinType::SatFract:
3514 return "_Sat _Fract";
3515 case BuiltinType::SatLongFract:
3516 return "_Sat long _Fract";
3517 case BuiltinType::SatUShortFract:
3518 return "_Sat unsigned short _Fract";
3519 case BuiltinType::SatUFract:
3520 return "_Sat unsigned _Fract";
3521 case BuiltinType::SatULongFract:
3522 return "_Sat unsigned long _Fract";
3526 return "__float128";
3531 return Policy.
MSWChar ?
"__wchar_t" :
"wchar_t";
3541 return "<overloaded function type>";
3543 return "<bound member function type>";
3544 case UnresolvedTemplate:
3545 return "<unresolved template type>";
3547 return "<pseudo-object type>";
3549 return "<dependent type>";
3551 return "<unknown type>";
3552 case ARCUnbridgedCast:
3553 return "<ARC unbridged cast type>";
3555 return "<builtin fn type>";
3562#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
3564 return "__" #Access " " #ImgType "_t";
3565#include "clang/Basic/OpenCLImageTypes.def"
3571 return "clk_event_t";
3575 return "reserve_id_t";
3576 case IncompleteMatrixIdx:
3577 return "<incomplete matrix index type>";
3579 return "<array section type>";
3580 case OMPArrayShaping:
3581 return "<OpenMP array shaping type>";
3583 return "<OpenMP iterator type>";
3584#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
3587#include "clang/Basic/OpenCLExtensionTypes.def"
3588#define SVE_TYPE(Name, Id, SingletonId) \
3591#include "clang/Basic/AArch64ACLETypes.def"
3592#define PPC_VECTOR_TYPE(Name, Id, Size) \
3595#include "clang/Basic/PPCTypes.def"
3596#define RVV_TYPE(Name, Id, SingletonId) \
3599#include "clang/Basic/RISCVVTypes.def"
3600#define WASM_TYPE(Name, Id, SingletonId) \
3603#include "clang/Basic/WebAssemblyReferenceTypes.def"
3604#define AMDGPU_TYPE(Name, Id, SingletonId, Width, Align) \
3607#include "clang/Basic/AMDGPUTypes.def"
3608#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) \
3611#include "clang/Basic/HLSLIntangibleTypes.def"
3614 llvm_unreachable(
"Invalid builtin type.");
3619 if (
auto *PET = dyn_cast<PackExpansionType>(
getTypePtr()))
3620 return PET->getPattern();
3625 if (
const auto *RefType =
getTypePtr()->getAs<ReferenceType>())
3633 if (!Context.getLangOpts().CPlusPlus ||
3642 return FPT->hasCFIUncheckedCallee();
3659 return "vectorcall";
3671 return "aarch64_vector_pcs";
3673 return "aarch64_sve_pcs";
3675 return "intel_ocl_bicc";
3677 return "spir_function";
3679 return "device_kernel";
3683 return "swiftasynccall";
3685 return "preserve_most";
3687 return "preserve_all";
3691 return "preserve_none";
3694#define CC_VLS_CASE(ABI_VLEN) \
3695 case CC_RISCVVLSCall_##ABI_VLEN: return "riscv_vls_cc(" #ABI_VLEN ")";
3712 llvm_unreachable(
"Invalid calling convention.");
3730 assert(
getNumParams() == params.size() &&
"NumParams overflow!");
3739 auto &ExtraBits = *getTrailingObjects<FunctionTypeExtraBitfields>();
3747 auto &ExtraAttrInfo = *getTrailingObjects<FunctionTypeExtraAttributeInfo>();
3751 auto &ExtraBits = *getTrailingObjects<FunctionTypeExtraBitfields>();
3752 ExtraBits.HasExtraAttributeInfo =
true;
3756 auto &ArmTypeAttrs = *getTrailingObjects<FunctionTypeArmAttributes>();
3757 ArmTypeAttrs = FunctionTypeArmAttributes();
3760 auto &ExtraBits = *getTrailingObjects<FunctionTypeExtraBitfields>();
3761 ExtraBits.HasArmTypeAttributes =
true;
3765 auto *argSlot = getTrailingObjects<QualType>();
3768 ~TypeDependence::VariablyModified);
3769 argSlot[i] = params[i];
3774 auto &ArmTypeAttrs = *getTrailingObjects<FunctionTypeArmAttributes>();
3776 "Not enough bits to encode SME attributes");
3782 auto &ExtraBits = *getTrailingObjects<FunctionTypeExtraBitfields>();
3784 assert(NumExceptions <= 1023 &&
"Not enough bits to encode exceptions");
3785 ExtraBits.NumExceptionType = NumExceptions;
3787 assert(hasExtraBitfields() &&
"missing trailing extra bitfields!");
3789 reinterpret_cast<QualType *
>(getTrailingObjects<ExceptionType>());
3797 (TypeDependence::Instantiation | TypeDependence::UnexpandedPack));
3799 exnSlot[I++] = ExceptionType;
3813 (TypeDependence::Instantiation | TypeDependence::UnexpandedPack));
3819 auto **slot = getTrailingObjects<FunctionDecl *>();
3827 auto **slot = getTrailingObjects<FunctionDecl *>();
3846 auto *extParamInfos = getTrailingObjects<ExtParameterInfo>();
3853 *getTrailingObjects<Qualifiers>() = epi.
TypeQuals;
3860 auto &EllipsisLoc = *getTrailingObjects<SourceLocation>();
3865 auto &ExtraBits = *getTrailingObjects<FunctionTypeExtraBitfields>();
3867 ExtraBits.NumFunctionEffects = EffectsCount;
3868 assert(ExtraBits.NumFunctionEffects == EffectsCount &&
3869 "effect bitfield overflow");
3872 auto *DestFX = getTrailingObjects<FunctionEffect>();
3873 llvm::uninitialized_copy(SrcFX, DestFX);
3876 if (!SrcConds.empty()) {
3877 ExtraBits.EffectsHaveConditions =
true;
3878 auto *DestConds = getTrailingObjects<EffectConditionExpr>();
3879 llvm::uninitialized_copy(SrcConds, DestConds);
3880 assert(llvm::any_of(SrcConds,
3881 [](
const EffectConditionExpr &EC) {
3883 return E->isTypeDependent() ||
3884 E->isValueDependent();
3887 "expected a dependent expression among the conditions");
3895 return NE->isValueDependent();
3907 return NE->isInstantiationDependent();
3918 llvm_unreachable(
"should not call this with unresolved exception specs");
3944 llvm_unreachable(
"unexpected exception specification kind");
3948 for (
unsigned ArgIdx =
getNumParams(); ArgIdx; --ArgIdx)
3956 const QualType *ArgTys,
unsigned NumParams,
3957 const ExtProtoInfo &epi,
3981 ID.AddPointer(
Result.getAsOpaquePtr());
3982 for (
unsigned i = 0; i != NumParams; ++i)
3983 ID.AddPointer(ArgTys[i].getAsOpaquePtr());
3987 assert(!(
unsigned(epi.Variadic) & ~1) && !(
unsigned(epi.RefQualifier) & ~3) &&
3988 !(
unsigned(epi.ExceptionSpec.Type) & ~15) &&
3989 "Values larger than expected.");
3990 ID.AddInteger(
unsigned(epi.Variadic) + (epi.RefQualifier << 1) +
3991 (epi.ExceptionSpec.Type << 3));
3992 ID.Add(epi.TypeQuals);
3994 for (
QualType Ex : epi.ExceptionSpec.Exceptions)
3997 epi.ExceptionSpec.NoexceptExpr->Profile(ID, Context, Canonical);
4000 ID.AddPointer(epi.ExceptionSpec.SourceDecl->getCanonicalDecl());
4002 if (epi.ExtParameterInfos) {
4003 for (
unsigned i = 0; i != NumParams; ++i)
4004 ID.AddInteger(epi.ExtParameterInfos[i].getOpaqueValue());
4007 epi.ExtInfo.Profile(ID);
4008 epi.ExtraAttributeInfo.Profile(ID);
4010 unsigned EffectCount = epi.FunctionEffects.size();
4011 bool HasConds = !epi.FunctionEffects.Conditions.empty();
4013 ID.AddInteger((EffectCount << 3) | (HasConds << 2) |
4014 (epi.AArch64SMEAttributes << 1) | epi.HasTrailingReturn);
4015 ID.AddInteger(epi.CFIUncheckedCallee);
4017 for (
unsigned Idx = 0; Idx != EffectCount; ++Idx) {
4018 ID.AddInteger(epi.FunctionEffects.Effects[Idx].toOpaqueInt32());
4020 ID.AddPointer(epi.FunctionEffects.Conditions[Idx].getCondition());
4031 : Data(D, Deref << DerefShift) {}
4034 return Data.getInt() & DerefMask;
4039 return Data.getOpaqueValue();
4046 Data.setFromOpaqueValue(
V);
4049OverflowBehaviorType::OverflowBehaviorType(
4051 OverflowBehaviorType::OverflowBehaviorKind Kind)
4052 :
Type(OverflowBehavior, Canon, Underlying->getDependence()),
4053 UnderlyingType(Underlying), BehaviorKind(Kind) {}
4059CountAttributedType::CountAttributedType(
4063 CountExpr(CountExpr) {
4067 auto *DeclSlot = getTrailingObjects();
4068 llvm::copy(CoupledDecls, DeclSlot);
4077#define ENUMERATE_ATTRS(PREFIX) \
4079 if (isCountInBytes()) { \
4081 return PREFIX "sized_by_or_null"; \
4082 return PREFIX "sized_by"; \
4085 return PREFIX "counted_by_or_null"; \
4086 return PREFIX "counted_by"; \
4089 if (WithMacroPrefix)
4094#undef ENUMERATE_ATTRS
4100 bool HasTypeDifferentFromDecl)
4102 Keyword, TC, UnderlyingType.getCanonicalType(),
4106 ~NestedNameSpecifierDependence::
Dependent)
4110 *getTrailingObjects<NestedNameSpecifier>() = Qualifier;
4111 if ((
TypedefBits.hasTypeDifferentFromDecl = HasTypeDifferentFromDecl))
4112 *getTrailingObjects<QualType>() = UnderlyingType;
4117 : *getTrailingObjects<QualType>();
4123 const Type *CanonicalType)
4129 ~NestedNameSpecifierDependence::
Dependent)
4133 *getTrailingObjects<NestedNameSpecifier>() = Qualifier;
4142 if ((
UsingBits.hasQualifier = !!Qualifier))
4143 *getTrailingObjects() = Qualifier;
4152 while (
auto *InnerMQT = dyn_cast<MacroQualifiedType>(Inner)) {
4155 Inner = InnerMQT->getModifiedType();
4166 ? Context.getUnqualifiedArrayType(Can).getAtomicUnqualifiedType()
4171 TOExpr(E), Context(Context) {
4172 TypeOfBits.Kind =
static_cast<unsigned>(Kind);
4181 ? Context.getUnqualifiedArrayType(QT).getAtomicUnqualifiedType()
4190 E->
Profile(ID, Context,
true);
4191 ID.AddBoolean(IsUnqual);
4198 ? Context.getUnqualifiedArrayType(Can).getAtomicUnqualifiedType()
4200 T->getDependence()),
4201 TOType(T), Context(Context) {
4202 TypeOfBits.Kind =
static_cast<unsigned>(Kind);
4205QualType TypeOfType::desugar()
const {
4208 ? Context.getUnqualifiedArrayType(QT).getAtomicUnqualifiedType()
4216 :
Type(Decltype, can,
4220 (E->
getType()->getDependence() &
4222 E(E), UnderlyingType(underlyingType) {}
4224bool DecltypeType::isSugared()
const {
return !E->isInstantiationDependent(); }
4226QualType DecltypeType::desugar()
const {
4233DependentDecltypeType::DependentDecltypeType(
Expr *E)
4236void DependentDecltypeType::Profile(llvm::FoldingSetNodeID &ID,
4238 E->
Profile(ID, Context,
true);
4242 Expr *IndexExpr,
bool FullySubstituted,
4244 :
Type(PackIndexing, Canonical,
4246 Pattern(Pattern), IndexExpr(IndexExpr),
Size(Expansions.size()),
4247 FullySubstituted(FullySubstituted) {
4249 llvm::uninitialized_copy(Expansions, getTrailingObjects());
4253 if (isInstantiationDependentType())
4254 return std::nullopt;
4256 ConstantExpr *CE = dyn_cast<ConstantExpr>(getIndexExpr());
4258 return std::nullopt;
4260 assert(Index.isNonNegative() &&
"Invalid index");
4261 return static_cast<unsigned>(Index.getExtValue());
4265PackIndexingType::computeDependence(
QualType Pattern,
Expr *IndexExpr,
4270 ? TypeDependence::DependentInstantiation
4271 : TypeDependence::None);
4272 if (Expansions.empty())
4273 TD |= Pattern->
getDependence() & TypeDependence::DependentInstantiation;
4275 for (
const QualType &T : Expansions)
4278 if (!(IndexD & TypeDependence::UnexpandedPack))
4284 TD |= TypeDependence::Error | TypeDependence::DependentInstantiation;
4289void PackIndexingType::Profile(llvm::FoldingSetNodeID &ID,
4291 Profile(ID, Context, getPattern(), getIndexExpr(), isFullySubstituted(),
4295void PackIndexingType::Profile(llvm::FoldingSetNodeID &ID,
4297 Expr *E,
bool FullySubstituted,
4300 E->
Profile(ID, Context,
true);
4301 ID.AddBoolean(FullySubstituted);
4302 if (!Expansions.empty()) {
4303 ID.AddInteger(Expansions.size());
4305 T.getCanonicalType().
Profile(ID);
4311UnaryTransformType::UnaryTransformType(
QualType BaseType,
4312 QualType UnderlyingType, UTTKind UKind,
4314 :
Type(UnaryTransform, CanonicalType, BaseType->getDependence()),
4315 BaseType(BaseType), UnderlyingType(UnderlyingType), UKind(UKind) {}
4319 bool OwnsTag,
bool ISInjected,
const Type *CanonicalType)
4326 ~NestedNameSpecifierDependence::
Dependent)
4330 getTrailingQualifier() = Qualifier;
4335void *TagType::getTrailingPointer()
const {
4336 switch (getTypeClass()) {
4341 case Type::InjectedClassName:
4342 return const_cast<InjectedClassNameType *
>(
4345 llvm_unreachable(
"unexpected type class");
4350 assert(TagTypeBits.HasQualifier);
4352 getTrailingPointer(), llvm::Align::Of<NestedNameSpecifier *>()));
4356 return TagTypeBits.HasQualifier ? getTrailingQualifier() : std::nullopt;
4360 auto *
Decl = dyn_cast<CXXRecordDecl>(
decl);
4363 if (
auto *RD = dyn_cast<ClassTemplateSpecializationDecl>(
Decl))
4364 return RD->getSpecializedTemplate();
4365 return Decl->getDescribedClassTemplate();
4369 auto *TD = getTemplateDecl();
4372 if (isCanonicalUnqualified())
4379TagType::getTemplateArgs(
const ASTContext &Ctx)
const {
4380 auto *
Decl = dyn_cast<CXXRecordDecl>(
decl);
4384 if (
auto *RD = dyn_cast<ClassTemplateSpecializationDecl>(
Decl))
4385 return RD->getTemplateArgs().asArray();
4387 return TD->getTemplateParameters()->getInjectedTemplateArgs(Ctx);
4391bool RecordType::hasConstFields()
const {
4392 std::vector<const RecordType *> RecordTypeList;
4393 RecordTypeList.push_back(
this);
4394 unsigned NextToCheckIndex = 0;
4396 while (RecordTypeList.size() > NextToCheckIndex) {
4397 for (
FieldDecl *FD : RecordTypeList[NextToCheckIndex]
4405 if (
const auto *FieldRecTy = FieldTy->
getAsCanonical<RecordType>()) {
4406 if (!llvm::is_contained(RecordTypeList, FieldRecTy))
4407 RecordTypeList.push_back(FieldRecTy);
4417 const TagDecl *TD,
bool IsInjected,
4418 const Type *CanonicalType)
4420 false, IsInjected, CanonicalType) {}
4429 :
Type(Attributed, canon, equivalent->getDependence()), Attribute(
attr),
4430 ModifiedType(modified), EquivalentType(equivalent) {
4432 assert(!attr ||
attr->getKind() == attrKind);
4435bool AttributedType::isQualifier()
const {
4437 switch (getAttrKind()) {
4442 case attr::ObjCOwnership:
4443 case attr::ObjCInertUnsafeUnretained:
4444 case attr::TypeNonNull:
4445 case attr::TypeNullable:
4446 case attr::TypeNullableResult:
4447 case attr::TypeNullUnspecified:
4448 case attr::LifetimeBound:
4449 case attr::AddressSpace:
4459bool AttributedType::isMSTypeSpec()
const {
4461 switch (getAttrKind()) {
4470 llvm_unreachable(
"invalid attr kind");
4473bool AttributedType::isWebAssemblyFuncrefSpec()
const {
4474 return getAttrKind() == attr::WebAssemblyFuncref;
4477bool AttributedType::isCallingConv()
const {
4479 switch (getAttrKind()) {
4484 case attr::FastCall:
4486 case attr::ThisCall:
4488 case attr::SwiftCall:
4489 case attr::SwiftAsyncCall:
4490 case attr::VectorCall:
4491 case attr::AArch64VectorPcs:
4492 case attr::AArch64SVEPcs:
4493 case attr::DeviceKernel:
4497 case attr::IntelOclBicc:
4498 case attr::PreserveMost:
4499 case attr::PreserveAll:
4501 case attr::PreserveNone:
4502 case attr::RISCVVectorCC:
4503 case attr::RISCVVLSCC:
4506 llvm_unreachable(
"invalid attr kind");
4510 return isCanonicalUnqualified() ?
nullptr : getDecl()->getIdentifier();
4513SubstTemplateTypeParmType::SubstTemplateTypeParmType(
QualType Replacement,
4514 Decl *AssociatedDecl,
4518 :
Type(SubstTemplateTypeParm, Replacement.getCanonicalType(),
4519 Replacement->getDependence()),
4520 AssociatedDecl(AssociatedDecl) {
4524 *getTrailingObjects() = Replacement;
4530 assert(AssociatedDecl !=
nullptr);
4534SubstTemplateTypeParmType::getReplacedParameter()
const {
4539void SubstTemplateTypeParmType::Profile(llvm::FoldingSetNodeID &ID,
4541 const Decl *AssociatedDecl,
4544 Replacement.Profile(ID);
4545 ID.AddPointer(AssociatedDecl);
4546 ID.AddInteger(Index);
4548 ID.AddBoolean(Final);
4551SubstPackType::SubstPackType(TypeClass Derived,
QualType Canon,
4553 :
Type(Derived, Canon,
4557 assert(llvm::all_of(
4559 [](
auto &P) { return P.getKind() == TemplateArgument::Type; }) &&
4560 "non-type argument to SubstPackType?");
4568void SubstPackType::Profile(llvm::FoldingSetNodeID &ID) {
4569 Profile(ID, getArgumentPack());
4572void SubstPackType::Profile(llvm::FoldingSetNodeID &ID,
4576 ID.AddPointer(P.getAsType().getAsOpaquePtr());
4579SubstTemplateTypeParmPackType::SubstTemplateTypeParmPackType(
4580 QualType Canon,
Decl *AssociatedDecl,
unsigned Index,
bool Final,
4582 : SubstPackType(SubstTemplateTypeParmPack, Canon, ArgPack),
4583 AssociatedDeclAndFinal(AssociatedDecl, Final) {
4584 assert(AssociatedDecl !=
nullptr);
4587 assert(getNumArgs() == ArgPack.
pack_size() &&
4588 "Parent bitfields in SubstPackType were overwritten."
4589 "Check NumSubstPackTypeBits.");
4592Decl *SubstTemplateTypeParmPackType::getAssociatedDecl()
const {
4593 return AssociatedDeclAndFinal.getPointer();
4596bool SubstTemplateTypeParmPackType::getFinal()
const {
4597 return AssociatedDeclAndFinal.getInt();
4601SubstTemplateTypeParmPackType::getReplacedParameter()
const {
4606IdentifierInfo *SubstTemplateTypeParmPackType::getIdentifier()
const {
4607 return getReplacedParameter()->getIdentifier();
4610void SubstTemplateTypeParmPackType::Profile(llvm::FoldingSetNodeID &ID) {
4611 Profile(ID, getAssociatedDecl(),
getIndex(), getFinal(), getArgumentPack());
4614void SubstTemplateTypeParmPackType::Profile(llvm::FoldingSetNodeID &ID,
4615 const Decl *AssociatedDecl,
4616 unsigned Index,
bool Final,
4618 ID.AddPointer(AssociatedDecl);
4619 ID.AddInteger(Index);
4620 ID.AddBoolean(Final);
4621 SubstPackType::Profile(ID, ArgPack);
4624SubstBuiltinTemplatePackType::SubstBuiltinTemplatePackType(
4626 : SubstPackType(SubstBuiltinTemplatePack, Canon, ArgPack) {}
4628bool TemplateSpecializationType::anyDependentTemplateArguments(
4631 return anyDependentTemplateArguments(Args.
arguments(), Converted);
4634bool TemplateSpecializationType::anyDependentTemplateArguments(
4637 if (Arg.isDependent())
4642bool TemplateSpecializationType::anyInstantiationDependentTemplateArguments(
4645 if (ArgLoc.getArgument().isInstantiationDependent())
4654 ? TypeDependence::DependentInstantiation
4659 D |= TypeDependence::UnexpandedPack;
4661 D |= (Underlying->
getDependence() & TypeDependence::UnexpandedPack);
4666TemplateSpecializationType::TemplateSpecializationType(
4670 Underlying.isNull() ?
QualType(this, 0)
4671 : Underlying.getCanonicalType(),
4674 TemplateSpecializationTypeBits.NumArgs = Args.size();
4675 TemplateSpecializationTypeBits.TypeAlias = IsAlias;
4677 auto *TemplateArgs =
4689 ~TypeDependence::Dependent);
4691 addDependence(Arg.getAsType()->getDependence() &
4692 TypeDependence::VariablyModified);
4699 *
reinterpret_cast<QualType *
>(TemplateArgs) = Underlying;
4702QualType TemplateSpecializationType::getAliasedType()
const {
4703 assert(isTypeAlias() &&
"not a type alias template specialization");
4704 return *
reinterpret_cast<const QualType *
>(template_arguments().end());
4707bool clang::TemplateSpecializationType::isSugared()
const {
4708 return !isDependentType() || isCurrentInstantiation() || isTypeAlias() ||
4713void TemplateSpecializationType::Profile(llvm::FoldingSetNodeID &ID,
4715 Profile(ID, getKeyword(),
Template, template_arguments(),
4716 isSugared() ? desugar() :
QualType(), Ctx);
4719void TemplateSpecializationType::Profile(llvm::FoldingSetNodeID &ID,
4725 ID.AddInteger(llvm::to_underlying(
Keyword));
4729 ID.AddInteger(Args.size());
4731 Arg.Profile(ID, Context);
4739 return Context.getQualifiedType(QT, *
this);
4743 const Type *T)
const {
4747 return Context.getQualifiedType(T, *
this);
4750void ObjCObjectTypeImpl::Profile(llvm::FoldingSetNodeID &ID,
QualType BaseType,
4754 ID.AddPointer(BaseType.getAsOpaquePtr());
4755 ID.AddInteger(typeArgs.size());
4756 for (
auto typeArg : typeArgs)
4757 ID.AddPointer(typeArg.getAsOpaquePtr());
4758 ID.AddInteger(protocols.size());
4759 for (
auto *proto : protocols)
4760 ID.AddPointer(proto);
4761 ID.AddBoolean(isKindOf);
4764void ObjCObjectTypeImpl::Profile(llvm::FoldingSetNodeID &ID) {
4765 Profile(ID, getBaseType(), getTypeArgsAsWritten(),
4767 isKindOfTypeAsWritten());
4770void ObjCTypeParamType::Profile(llvm::FoldingSetNodeID &ID,
4774 ID.AddPointer(OTPDecl);
4776 ID.AddInteger(protocols.size());
4777 for (
auto *proto : protocols)
4778 ID.AddPointer(proto);
4781void ObjCTypeParamType::Profile(llvm::FoldingSetNodeID &ID) {
4782 Profile(ID, getDecl(), getCanonicalTypeInternal(),
4789class CachedProperties {
4794 CachedProperties(
Linkage L,
bool local) : L(L), local(local) {}
4796 Linkage getLinkage()
const {
return L; }
4797 bool hasLocalOrUnnamedType()
const {
return local; }
4799 friend CachedProperties
merge(CachedProperties L, CachedProperties R) {
4801 return CachedProperties(MergedLinkage, L.hasLocalOrUnnamedType() ||
4802 R.hasLocalOrUnnamedType());
4821 return CachedProperties(T->TypeBits.getLinkage(),
4822 T->TypeBits.hasLocalOrUnnamedType());
4827 if (T->TypeBits.isCacheValid())
4832 if (!T->isCanonicalUnqualified()) {
4835 T->TypeBits.CacheValid =
true;
4836 T->TypeBits.CachedLinkage = CT->
TypeBits.CachedLinkage;
4837 T->TypeBits.CachedLocalOrUnnamed = CT->
TypeBits.CachedLocalOrUnnamed;
4843 T->TypeBits.CacheValid =
true;
4844 T->TypeBits.CachedLinkage = llvm::to_underlying(
Result.getLinkage());
4845 T->TypeBits.CachedLocalOrUnnamed =
Result.hasLocalOrUnnamedType();
4863 switch (T->getTypeClass()) {
4864#define TYPE(Class, Base)
4865#define NON_CANONICAL_TYPE(Class, Base) case Type::Class:
4866#include "clang/AST/TypeNodes.inc"
4867 llvm_unreachable(
"didn't expect a non-canonical type here");
4869#define TYPE(Class, Base)
4870#define DEPENDENT_TYPE(Class, Base) case Type::Class:
4871#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base) case Type::Class:
4872#include "clang/AST/TypeNodes.inc"
4874 assert(T->isInstantiationDependentType());
4878 case Type::DeducedTemplateSpecialization:
4892 const auto *Tag =
cast<TagType>(T)->getDecl()->getDefinitionOrSelf();
4898 Linkage L = Tag->getLinkageInternal();
4899 bool IsLocalOrUnnamed = Tag->getDeclContext()->isFunctionOrMethod() ||
4900 !Tag->hasNameForLinkage();
4901 return CachedProperties(L, IsLocalOrUnnamed);
4911 case Type::BlockPointer:
4913 case Type::LValueReference:
4914 case Type::RValueReference:
4916 case Type::MemberPointer: {
4918 CachedProperties Cls = [&] {
4919 if (MPT->isSugared())
4921 return Cache::get(MPT->getQualifier().getAsType());
4923 return merge(Cls,
Cache::get(MPT->getPointeeType()));
4925 case Type::ConstantArray:
4926 case Type::IncompleteArray:
4927 case Type::VariableArray:
4928 case Type::ArrayParameter:
4931 case Type::ExtVector:
4933 case Type::ConstantMatrix:
4935 case Type::FunctionNoProto:
4937 case Type::FunctionProto: {
4939 CachedProperties result =
Cache::get(FPT->getReturnType());
4940 for (
const auto &ai : FPT->param_types())
4944 case Type::ObjCInterface: {
4946 return CachedProperties(L,
false);
4948 case Type::ObjCObject:
4950 case Type::ObjCObjectPointer:
4956 case Type::HLSLAttributedResource:
4958 case Type::HLSLInlineSpirv:
4960 case Type::OverflowBehavior:
4964 llvm_unreachable(
"unhandled type class");
4975 return TypeBits.hasLocalOrUnnamedType();
4979 switch (T->getTypeClass()) {
4980#define TYPE(Class, Base)
4981#define NON_CANONICAL_TYPE(Class, Base) case Type::Class:
4982#include "clang/AST/TypeNodes.inc"
4983 llvm_unreachable(
"didn't expect a non-canonical type here");
4985#define TYPE(Class, Base)
4986#define DEPENDENT_TYPE(Class, Base) case Type::Class:
4987#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base) case Type::Class:
4988#include "clang/AST/TypeNodes.inc"
4990 assert(T->isInstantiationDependentType());
4998 case Type::DeducedTemplateSpecialization:
5010 case Type::BlockPointer:
5012 case Type::LValueReference:
5013 case Type::RValueReference:
5015 case Type::MemberPointer: {
5018 if (
auto *D = MPT->getMostRecentCXXRecordDecl()) {
5026 case Type::ConstantArray:
5027 case Type::IncompleteArray:
5028 case Type::VariableArray:
5029 case Type::ArrayParameter:
5032 case Type::ExtVector:
5034 case Type::ConstantMatrix:
5037 case Type::FunctionNoProto:
5039 case Type::FunctionProto: {
5042 for (
const auto &ai : FPT->param_types())
5046 case Type::ObjCInterface:
5048 case Type::ObjCObject:
5050 case Type::ObjCObjectPointer:
5057 case Type::OverflowBehavior:
5060 case Type::HLSLAttributedResource:
5062 ->getContainedType()
5063 ->getCanonicalTypeInternal());
5064 case Type::HLSLInlineSpirv:
5068 llvm_unreachable(
"unhandled type class");
5082 if (!T->isCanonicalUnqualified())
5096 while (
const auto *AT =
Type->getAs<AttributedType>()) {
5099 if (
auto Nullability = AT->getImmediateNullability())
5102 Type = AT->getEquivalentType();
5104 return std::nullopt;
5110 switch (
type->getTypeClass()) {
5111#define NON_CANONICAL_TYPE(Class, Parent) \
5114 llvm_unreachable("non-canonical type");
5115#define TYPE(Class, Parent)
5116#include "clang/AST/TypeNodes.inc"
5120 case Type::BlockPointer:
5121 case Type::MemberPointer:
5122 case Type::ObjCObjectPointer:
5126 case Type::UnresolvedUsing:
5127 case Type::TypeOfExpr:
5129 case Type::Decltype:
5130 case Type::PackIndexing:
5131 case Type::UnaryTransform:
5132 case Type::TemplateTypeParm:
5133 case Type::SubstTemplateTypeParmPack:
5134 case Type::SubstBuiltinTemplatePack:
5135 case Type::DependentName:
5137 return ResultIfUnknown;
5140 case Type::TemplateSpecialization:
5145 .getAsTemplateDecl())
5146 if (
auto *CTD = dyn_cast<ClassTemplateDecl>(templateDecl))
5147 return llvm::any_of(
5149 return RTD->getTemplatedDecl()->hasAttr<TypeNullableAttr>();
5151 return ResultIfUnknown;
5156#define SIGNED_TYPE(Id, SingletonId) case BuiltinType::Id:
5157#define UNSIGNED_TYPE(Id, SingletonId) case BuiltinType::Id:
5158#define FLOATING_TYPE(Id, SingletonId) case BuiltinType::Id:
5159#define BUILTIN_TYPE(Id, SingletonId)
5160#include "clang/AST/BuiltinTypes.def"
5163 case BuiltinType::UnresolvedTemplate:
5165 case BuiltinType::Dependent:
5166 case BuiltinType::Overload:
5167 case BuiltinType::BoundMember:
5168 case BuiltinType::PseudoObject:
5169 case BuiltinType::UnknownAny:
5170 case BuiltinType::ARCUnbridgedCast:
5171 return ResultIfUnknown;
5173 case BuiltinType::Void:
5174 case BuiltinType::ObjCId:
5175 case BuiltinType::ObjCClass:
5176 case BuiltinType::ObjCSel:
5177#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
5178 case BuiltinType::Id:
5179#include "clang/Basic/OpenCLImageTypes.def"
5180#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) case BuiltinType::Id:
5181#include "clang/Basic/OpenCLExtensionTypes.def"
5182 case BuiltinType::OCLSampler:
5183 case BuiltinType::OCLEvent:
5184 case BuiltinType::OCLClkEvent:
5185 case BuiltinType::OCLQueue:
5186 case BuiltinType::OCLReserveID:
5187#define SVE_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
5188#include "clang/Basic/AArch64ACLETypes.def"
5189#define PPC_VECTOR_TYPE(Name, Id, Size) case BuiltinType::Id:
5190#include "clang/Basic/PPCTypes.def"
5191#define RVV_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
5192#include "clang/Basic/RISCVVTypes.def"
5193#define WASM_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
5194#include "clang/Basic/WebAssemblyReferenceTypes.def"
5195#define AMDGPU_TYPE(Name, Id, SingletonId, Width, Align) case BuiltinType::Id:
5196#include "clang/Basic/AMDGPUTypes.def"
5197#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
5198#include "clang/Basic/HLSLIntangibleTypes.def"
5199 case BuiltinType::BuiltinFn:
5200 case BuiltinType::NullPtr:
5201 case BuiltinType::IncompleteMatrixIdx:
5202 case BuiltinType::ArraySection:
5203 case BuiltinType::OMPArrayShaping:
5204 case BuiltinType::OMPIterator:
5207 llvm_unreachable(
"unknown builtin type");
5209 case Type::Record: {
5213 if (
const auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(RD))
5214 return llvm::any_of(
5215 CTSD->getSpecializedTemplate()->redecls(),
5217 return RTD->getTemplatedDecl()->hasAttr<TypeNullableAttr>();
5220 return RD->hasAttr<TypeNullableAttr>();
5226 case Type::LValueReference:
5227 case Type::RValueReference:
5228 case Type::ConstantArray:
5229 case Type::IncompleteArray:
5230 case Type::VariableArray:
5231 case Type::DependentSizedArray:
5232 case Type::DependentVector:
5233 case Type::DependentSizedExtVector:
5235 case Type::ExtVector:
5236 case Type::ConstantMatrix:
5237 case Type::DependentSizedMatrix:
5238 case Type::DependentAddressSpace:
5239 case Type::FunctionProto:
5240 case Type::FunctionNoProto:
5241 case Type::DeducedTemplateSpecialization:
5243 case Type::InjectedClassName:
5244 case Type::PackExpansion:
5245 case Type::ObjCObject:
5246 case Type::ObjCInterface:
5250 case Type::DependentBitInt:
5251 case Type::ArrayParameter:
5252 case Type::HLSLAttributedResource:
5253 case Type::HLSLInlineSpirv:
5254 case Type::OverflowBehavior:
5257 llvm_unreachable(
"bad type kind!");
5260std::optional<NullabilityKind> AttributedType::getImmediateNullability()
const {
5261 if (getAttrKind() == attr::TypeNonNull)
5263 if (getAttrKind() == attr::TypeNullable)
5265 if (getAttrKind() == attr::TypeNullUnspecified)
5267 if (getAttrKind() == attr::TypeNullableResult)
5269 return std::nullopt;
5272std::optional<NullabilityKind>
5273AttributedType::stripOuterNullability(
QualType &T) {
5275 if (
auto MacroTy = dyn_cast<MacroQualifiedType>(T))
5276 AttrTy = MacroTy->getUnderlyingType();
5278 if (
auto attributed = dyn_cast<AttributedType>(AttrTy)) {
5279 if (
auto nullability = attributed->getImmediateNullability()) {
5280 T = attributed->getModifiedType();
5285 return std::nullopt;
5299 if (objcPtr->isObjCIdType()) {
5310 }
else if (objcPtr->isObjCQualifiedIdType()) {
5335 "cannot query implicit lifetime for non-inferrable type");
5340 while (
const auto *array = dyn_cast<ArrayType>(canon))
5341 canon = array->getElementType().getTypePtr();
5343 if (
const auto *
opt = dyn_cast<ObjCObjectPointerType>(canon)) {
5345 if (
opt->getObjectType()->isObjCClass())
5354 return typedefType->getDecl()->hasAttr<ObjCNSObjectAttr>();
5360 return typedefType->getDecl()->hasAttr<ObjCIndependentClassAttr>();
5373 return OPT->getPointeeType()->isObjCIndirectLifetimeType();
5375 return Ref->getPointeeType()->isObjCIndirectLifetimeType();
5377 return MemPtr->getPointeeType()->isObjCIndirectLifetimeType();
5385 while (
const ArrayType *array =
type->getAsArrayTypeUnsafe())
5386 type = array->getElementType().getTypePtr();
5387 return type->isObjCRetainableType();
5409 return RT->getDecl()
5410 ->getMostRecentDecl()
5411 ->hasAttr<CUDADeviceBuiltinSurfaceTypeAttr>();
5418 return RT->getDecl()
5419 ->getMostRecentDecl()
5420 ->hasAttr<CUDADeviceBuiltinTextureTypeAttr>();
5429 return ptr->getPointeeType()->hasSizedVLAType();
5431 return ref->getPointeeType()->hasSizedVLAType();
5437 return arr->getElementType()->hasSizedVLAType();
5444 return HLSLAttributedResourceType::findHandleTypeOnResource(
this) !=
nullptr;
5467 const RecordType *RT =
5473 assert(RD !=
nullptr &&
5474 "all HLSL structs and classes should be CXXRecordDecl");
5480 switch (
type.getObjCLifetime()) {
5492 if (
const auto *RD =
type->getBaseElementTypeUnsafe()->getAsRecordDecl()) {
5493 if (
const auto *CXXRD = dyn_cast<CXXRecordDecl>(RD)) {
5495 if (CXXRD->hasDefinition() && !CXXRD->hasTrivialDestructor())
5519 Qualifier.Profile(ID);
5531 auto *RD = getCXXRecordDecl();
5538 llvm::APSInt Val,
unsigned Scale) {
5539 llvm::FixedPointSemantics FXSema(Val.getBitWidth(), Scale, Val.isSigned(),
5542 llvm::APFixedPoint(Val, FXSema).toString(Str);
5549 : DeducedType(
Auto, DeducedAsType, ExtraDependence, Canon) {
5550 AutoTypeBits.Keyword = llvm::to_underlying(
Keyword);
5551 AutoTypeBits.NumArgs = TypeConstraintArgs.size();
5552 this->TypeConstraintConcept = TypeConstraintConcept;
5553 assert(TypeConstraintConcept || AutoTypeBits.NumArgs == 0);
5554 if (TypeConstraintConcept) {
5556 addDependence(TypeDependence::DependentInstantiation);
5571void AutoType::Profile(llvm::FoldingSetNodeID &ID,
const ASTContext &Context,
5576 ID.AddInteger((
unsigned)
Keyword);
5577 ID.AddBoolean(IsDependent);
5580 Arg.Profile(ID, Context);
5583void AutoType::Profile(llvm::FoldingSetNodeID &ID,
const ASTContext &Context) {
5584 Profile(ID, Context, getDeducedType(), getKeyword(), isDependentType(),
5585 getTypeConstraintConcept(), getTypeConstraintArguments());
5599 llvm_unreachable(
"unknown effect kind");
5605 return "nonblocking";
5607 return "nonallocating";
5611 return "allocating";
5613 llvm_unreachable(
"unknown effect kind");
5629 return std::nullopt;
5634 assert(0 &&
"effectProhibitingInference with non-inferable effect kind");
5637 llvm_unreachable(
"unknown effect kind");
5647 const Kind EK = Effect.kind();
5649 if (EK == CallerKind ||
5660 llvm_unreachable(
"unknown effect kind");
5672 unsigned InsertIdx = Effects.size();
5687 Errs.push_back({EC, NewEC});
5698 if (NewCondition || !Conditions.empty()) {
5699 if (Conditions.empty() && !Effects.empty())
5700 Conditions.resize(Effects.size());
5701 Conditions.insert(Conditions.begin() + InsertIdx,
5704 Effects.insert(Effects.begin() + InsertIdx, NewEC.
Effect);
5709 for (
const auto &Item :
Set)
5711 return Errs.empty();
5722 auto IterA = LHS.
begin(), EndA = LHS.
end();
5723 auto IterB = RHS.
begin(), EndB = RHS.
end();
5727 return std::tuple(LHS.Effect,
uintptr_t(LHS.Cond.getCondition())) <
5728 std::tuple(RHS.Effect,
uintptr_t(RHS.Cond.getCondition()));
5731 while (IterA != EndA && IterB != EndB) {
5736 else if (FEWCLess(B, A))
5747 assert(Errs.empty() &&
"conflict shouldn't be possible in getIntersection");
5760 Combined.
insert(RHS, Errs);
5781 llvm::interleaveComma(*
this, OS);
5791 llvm::interleaveComma(*
this, OS);
5798 assert(llvm::is_sorted(FX) &&
"effects should be sorted");
5799 assert((Conds.empty() || Conds.size() == FX.size()) &&
5800 "effects size should match conditions size");
5806 if (
Cond.getCondition() !=
nullptr)
5811const HLSLAttributedResourceType *
5812HLSLAttributedResourceType::findHandleTypeOnResource(
const Type *RT) {
5817 if (!RD->
fields().empty()) {
5818 const auto &FirstFD = RD->
fields().begin();
5819 return dyn_cast<HLSLAttributedResourceType>(
5820 FirstFD->getType().getTypePtr());
5826StringRef PredefinedSugarType::getName(Kind KD) {
5831 return "__signed_size_t";
5833 return "__ptrdiff_t";
5835 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.
static DeclT * getDefinitionOrSelf(DeclT *D)
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)
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 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.
QualType getAutoType(QualType DeducedType, AutoTypeKeyword Keyword, bool IsDependent, bool IsPack=false, TemplateDecl *TypeConstraintConcept=nullptr, ArrayRef< TemplateArgument > TypeConstraintArgs={}) const
C++11 deduced auto type.
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 getAdjustedType() const
QualType getOriginalType() const
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)
unsigned getIndexTypeCVRQualifiers() const
QualType getValueType() const
Gets the type contained by this atomic type, i.e.
void Profile(llvm::FoldingSetNodeID &ID)
Attr - This represents one attribute.
BitIntType(bool isUnsigned, unsigned NumBits)
QualType getPointeeType() const
[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
unsigned getNumColumns() const
Returns the number of columns in the matrix.
unsigned getNumRows() const
Returns the number of rows in the matrix.
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)
QualType getElementType() const
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.
QualType getElementType() const
Returns type of the elements being stored in the matrix.
MatrixType(QualType ElementTy, QualType CanonElementTy)
QualType ElementType
The element type of the matrix.
NestedNameSpecifier getQualifier() const
void Profile(llvm::FoldingSetNodeID &ID)
CXXRecordDecl * getMostRecentCXXRecordDecl() const
Note: this can trigger extra deserialization when external AST sources are used.
QualType getPointeeType() const
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.
QualType getPointeeType() const
Gets the type pointed to by this ObjC pointer.
ObjCInterfaceDecl * getInterfaceDecl() const
If this pointer points to an Objective @interface type, gets the declaration for that interface.
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.
QualType getInnerType() const
QualType getPointeeType() const
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...
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
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 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.
QualType getPointeeTypeAsWritten() const
bool isSpelledAsLValue() const
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.
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 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.
AttributedTypeBitfields AttributedTypeBits
bool isObjCBoxableRecordType() 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 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
std::optional< NullabilityKind > getNullability() const
Determine the nullability of the given type.
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.
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 ...
Expr * getSizeExpr() const
Represents a GCC generic vector type.
unsigned getNumElements() const
VectorType(QualType vecType, unsigned nElements, QualType canonType, VectorKind vecKind)
VectorKind getVectorKind() const
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
The JSON file list parser is used to communicate input to InstallAPI.
@ 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
void initialize(TemplateInstantiationCallbackPtrs &Callbacks, const Sema &TheSema)
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.
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)
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.
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)
__UINTPTR_TYPE__ uintptr_t
An unsigned integer type with the property that any valid pointer to void can be converted to this ty...
A FunctionEffect plus a potential boolean expression determining whether the effect is declared (e....
FunctionEffectWithCondition(FunctionEffect E, const EffectConditionExpr &C)
std::string description() const
Return a textual description of the effect, and its condition, if any.
FunctionDecl * SourceDecl
The function whose exception specification this is, for EST_Unevaluated and EST_Uninstantiated.
FunctionDecl * SourceTemplate
The function template whose exception specification this is instantiated from, for EST_Uninstantiated...
ExceptionSpecificationType Type
The kind of exception specification this is.
ArrayRef< QualType > Exceptions
Explicitly-specified list of exception types.
Expr * NoexceptExpr
Noexcept expression, if this is a computed noexcept specification.
Extra information about a function prototype.
ExceptionSpecInfo ExceptionSpec
FunctionTypeExtraAttributeInfo ExtraAttributeInfo
bool requiresFunctionProtoTypeArmAttributes() const
unsigned AArch64SMEAttributes
SourceLocation EllipsisLoc
FunctionEffectsRef FunctionEffects
unsigned CFIUncheckedCallee
const ExtParameterInfo * ExtParameterInfos
RefQualifierKind RefQualifier
bool requiresFunctionProtoTypeExtraAttributeInfo() const
unsigned HasTrailingReturn
bool requiresFunctionProtoTypeExtraBitfields() const
static StringRef getKeywordName(ElaboratedTypeKeyword Keyword)
static ElaboratedTypeKeyword getKeywordForTagTypeKind(TagTypeKind Tag)
Converts a TagTypeKind into an elaborated type keyword.
static TagTypeKind getTagTypeKindForKeyword(ElaboratedTypeKeyword Keyword)
Converts an elaborated type keyword into a TagTypeKind.
static TagTypeKind getTagTypeKindForTypeSpec(unsigned TypeSpec)
Converts a type specifier (DeclSpec::TST) into a tag type kind.
static bool KeywordIsTagTypeKind(ElaboratedTypeKeyword Keyword)
static ElaboratedTypeKeyword getKeywordForTypeSpec(unsigned TypeSpec)
Converts a type specifier (DeclSpec::TST) into an elaborated type keyword.
Describes how types, statements, expressions, and declarations should be printed.
unsigned Bool
Whether we can use 'bool' rather than '_Bool' (even if the language doesn't actually have 'bool',...
unsigned NullptrTypeInNamespace
Whether 'nullptr_t' is in namespace 'std' or not.
unsigned Half
When true, print the half-precision floating-point type as 'half' instead of '__fp16'.
unsigned MSWChar
When true, print the built-in wchar_t type as __wchar_t.
A std::pair-like structure for storing a qualified type split into its local qualifiers and its local...
const Type * Ty
The locally-unqualified type.
Qualifiers Quals
The local qualifiers.
constexpr unsigned toInternalRepresentation() const