1 //===- Type.cpp - Type representation and manipulation --------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // This file implements type-related functionality. 10 // 11 //===----------------------------------------------------------------------===// 12 13 #include "clang/AST/Type.h" 14 #include "Linkage.h" 15 #include "clang/AST/ASTContext.h" 16 #include "clang/AST/Attr.h" 17 #include "clang/AST/CharUnits.h" 18 #include "clang/AST/Decl.h" 19 #include "clang/AST/DeclBase.h" 20 #include "clang/AST/DeclCXX.h" 21 #include "clang/AST/DeclFriend.h" 22 #include "clang/AST/DeclObjC.h" 23 #include "clang/AST/DeclTemplate.h" 24 #include "clang/AST/DependenceFlags.h" 25 #include "clang/AST/Expr.h" 26 #include "clang/AST/NestedNameSpecifier.h" 27 #include "clang/AST/PrettyPrinter.h" 28 #include "clang/AST/TemplateBase.h" 29 #include "clang/AST/TemplateName.h" 30 #include "clang/AST/TypeVisitor.h" 31 #include "clang/Basic/AddressSpaces.h" 32 #include "clang/Basic/ExceptionSpecificationType.h" 33 #include "clang/Basic/IdentifierTable.h" 34 #include "clang/Basic/LLVM.h" 35 #include "clang/Basic/LangOptions.h" 36 #include "clang/Basic/Linkage.h" 37 #include "clang/Basic/Specifiers.h" 38 #include "clang/Basic/TargetCXXABI.h" 39 #include "clang/Basic/TargetInfo.h" 40 #include "clang/Basic/Visibility.h" 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" 49 #include <algorithm> 50 #include <cassert> 51 #include <cstdint> 52 #include <cstring> 53 #include <optional> 54 55 using namespace clang; 56 57 bool Qualifiers::isStrictSupersetOf(Qualifiers Other) const { 58 return (*this != Other) && 59 // CVR qualifiers superset 60 (((Mask & CVRMask) | (Other.Mask & CVRMask)) == (Mask & CVRMask)) && 61 // ObjC GC qualifiers superset 62 ((getObjCGCAttr() == Other.getObjCGCAttr()) || 63 (hasObjCGCAttr() && !Other.hasObjCGCAttr())) && 64 // Address space superset. 65 ((getAddressSpace() == Other.getAddressSpace()) || 66 (hasAddressSpace()&& !Other.hasAddressSpace())) && 67 // Lifetime qualifier superset. 68 ((getObjCLifetime() == Other.getObjCLifetime()) || 69 (hasObjCLifetime() && !Other.hasObjCLifetime())); 70 } 71 72 bool Qualifiers::isTargetAddressSpaceSupersetOf(LangAS A, LangAS B, 73 const ASTContext &Ctx) { 74 // In OpenCLC v2.0 s6.5.5: every address space except for __constant can be 75 // used as __generic. 76 return (A == LangAS::opencl_generic && B != LangAS::opencl_constant) || 77 // We also define global_device and global_host address spaces, 78 // to distinguish global pointers allocated on host from pointers 79 // allocated on device, which are a subset of __global. 80 (A == LangAS::opencl_global && (B == LangAS::opencl_global_device || 81 B == LangAS::opencl_global_host)) || 82 (A == LangAS::sycl_global && 83 (B == LangAS::sycl_global_device || B == LangAS::sycl_global_host)) || 84 // Consider pointer size address spaces to be equivalent to default. 85 ((isPtrSizeAddressSpace(A) || A == LangAS::Default) && 86 (isPtrSizeAddressSpace(B) || B == LangAS::Default)) || 87 // Default is a superset of SYCL address spaces. 88 (A == LangAS::Default && 89 (B == LangAS::sycl_private || B == LangAS::sycl_local || 90 B == LangAS::sycl_global || B == LangAS::sycl_global_device || 91 B == LangAS::sycl_global_host)) || 92 // In HIP device compilation, any cuda address space is allowed 93 // to implicitly cast into the default address space. 94 (A == LangAS::Default && 95 (B == LangAS::cuda_constant || B == LangAS::cuda_device || 96 B == LangAS::cuda_shared)) || 97 // Conversions from target specific address spaces may be legal 98 // depending on the target information. 99 Ctx.getTargetInfo().isAddressSpaceSupersetOf(A, B); 100 } 101 102 const IdentifierInfo* QualType::getBaseTypeIdentifier() const { 103 const Type* ty = getTypePtr(); 104 NamedDecl *ND = nullptr; 105 if (ty->isPointerOrReferenceType()) 106 return ty->getPointeeType().getBaseTypeIdentifier(); 107 else if (ty->isRecordType()) 108 ND = ty->castAs<RecordType>()->getDecl(); 109 else if (ty->isEnumeralType()) 110 ND = ty->castAs<EnumType>()->getDecl(); 111 else if (ty->getTypeClass() == Type::Typedef) 112 ND = ty->castAs<TypedefType>()->getDecl(); 113 else if (ty->isArrayType()) 114 return ty->castAsArrayTypeUnsafe()-> 115 getElementType().getBaseTypeIdentifier(); 116 117 if (ND) 118 return ND->getIdentifier(); 119 return nullptr; 120 } 121 122 bool QualType::mayBeDynamicClass() const { 123 const auto *ClassDecl = getTypePtr()->getPointeeCXXRecordDecl(); 124 return ClassDecl && ClassDecl->mayBeDynamicClass(); 125 } 126 127 bool QualType::mayBeNotDynamicClass() const { 128 const auto *ClassDecl = getTypePtr()->getPointeeCXXRecordDecl(); 129 return !ClassDecl || ClassDecl->mayBeNonDynamicClass(); 130 } 131 132 bool QualType::isConstant(QualType T, const ASTContext &Ctx) { 133 if (T.isConstQualified()) 134 return true; 135 136 if (const ArrayType *AT = Ctx.getAsArrayType(T)) 137 return AT->getElementType().isConstant(Ctx); 138 139 return T.getAddressSpace() == LangAS::opencl_constant; 140 } 141 142 std::optional<QualType::NonConstantStorageReason> 143 QualType::isNonConstantStorage(const ASTContext &Ctx, bool ExcludeCtor, 144 bool ExcludeDtor) { 145 if (!isConstant(Ctx) && !(*this)->isReferenceType()) 146 return NonConstantStorageReason::NonConstNonReferenceType; 147 if (!Ctx.getLangOpts().CPlusPlus) 148 return std::nullopt; 149 if (const CXXRecordDecl *Record = 150 Ctx.getBaseElementType(*this)->getAsCXXRecordDecl()) { 151 if (!ExcludeCtor) 152 return NonConstantStorageReason::NonTrivialCtor; 153 if (Record->hasMutableFields()) 154 return NonConstantStorageReason::MutableField; 155 if (!Record->hasTrivialDestructor() && !ExcludeDtor) 156 return NonConstantStorageReason::NonTrivialDtor; 157 } 158 return std::nullopt; 159 } 160 161 // C++ [temp.dep.type]p1: 162 // A type is dependent if it is... 163 // - an array type constructed from any dependent type or whose 164 // size is specified by a constant expression that is 165 // value-dependent, 166 ArrayType::ArrayType(TypeClass tc, QualType et, QualType can, 167 ArraySizeModifier sm, unsigned tq, const Expr *sz) 168 // Note, we need to check for DependentSizedArrayType explicitly here 169 // because we use a DependentSizedArrayType with no size expression as the 170 // type of a dependent array of unknown bound with a dependent braced 171 // initializer: 172 // 173 // template<int ...N> int arr[] = {N...}; 174 : Type(tc, can, 175 et->getDependence() | 176 (sz ? toTypeDependence( 177 turnValueToTypeDependence(sz->getDependence())) 178 : TypeDependence::None) | 179 (tc == VariableArray ? TypeDependence::VariablyModified 180 : TypeDependence::None) | 181 (tc == DependentSizedArray 182 ? TypeDependence::DependentInstantiation 183 : TypeDependence::None)), 184 ElementType(et) { 185 ArrayTypeBits.IndexTypeQuals = tq; 186 ArrayTypeBits.SizeModifier = llvm::to_underlying(sm); 187 } 188 189 ConstantArrayType * 190 ConstantArrayType::Create(const ASTContext &Ctx, QualType ET, QualType Can, 191 const llvm::APInt &Sz, const Expr *SzExpr, 192 ArraySizeModifier SzMod, unsigned Qual) { 193 bool NeedsExternalSize = SzExpr != nullptr || Sz.ugt(0x0FFFFFFFFFFFFFFF) || 194 Sz.getBitWidth() > 0xFF; 195 if (!NeedsExternalSize) 196 return new (Ctx, alignof(ConstantArrayType)) ConstantArrayType( 197 ET, Can, Sz.getBitWidth(), Sz.getZExtValue(), SzMod, Qual); 198 199 auto *SzPtr = new (Ctx, alignof(ConstantArrayType::ExternalSize)) 200 ConstantArrayType::ExternalSize(Sz, SzExpr); 201 return new (Ctx, alignof(ConstantArrayType)) 202 ConstantArrayType(ET, Can, SzPtr, SzMod, Qual); 203 } 204 205 unsigned ConstantArrayType::getNumAddressingBits(const ASTContext &Context, 206 QualType ElementType, 207 const llvm::APInt &NumElements) { 208 uint64_t ElementSize = Context.getTypeSizeInChars(ElementType).getQuantity(); 209 210 // Fast path the common cases so we can avoid the conservative computation 211 // below, which in common cases allocates "large" APSInt values, which are 212 // slow. 213 214 // If the element size is a power of 2, we can directly compute the additional 215 // number of addressing bits beyond those required for the element count. 216 if (llvm::isPowerOf2_64(ElementSize)) { 217 return NumElements.getActiveBits() + llvm::Log2_64(ElementSize); 218 } 219 220 // If both the element count and element size fit in 32-bits, we can do the 221 // computation directly in 64-bits. 222 if ((ElementSize >> 32) == 0 && NumElements.getBitWidth() <= 64 && 223 (NumElements.getZExtValue() >> 32) == 0) { 224 uint64_t TotalSize = NumElements.getZExtValue() * ElementSize; 225 return llvm::bit_width(TotalSize); 226 } 227 228 // Otherwise, use APSInt to handle arbitrary sized values. 229 llvm::APSInt SizeExtended(NumElements, true); 230 unsigned SizeTypeBits = Context.getTypeSize(Context.getSizeType()); 231 SizeExtended = SizeExtended.extend(std::max(SizeTypeBits, 232 SizeExtended.getBitWidth()) * 2); 233 234 llvm::APSInt TotalSize(llvm::APInt(SizeExtended.getBitWidth(), ElementSize)); 235 TotalSize *= SizeExtended; 236 237 return TotalSize.getActiveBits(); 238 } 239 240 unsigned 241 ConstantArrayType::getNumAddressingBits(const ASTContext &Context) const { 242 return getNumAddressingBits(Context, getElementType(), getSize()); 243 } 244 245 unsigned ConstantArrayType::getMaxSizeBits(const ASTContext &Context) { 246 unsigned Bits = Context.getTypeSize(Context.getSizeType()); 247 248 // Limit the number of bits in size_t so that maximal bit size fits 64 bit 249 // integer (see PR8256). We can do this as currently there is no hardware 250 // that supports full 64-bit virtual space. 251 if (Bits > 61) 252 Bits = 61; 253 254 return Bits; 255 } 256 257 void ConstantArrayType::Profile(llvm::FoldingSetNodeID &ID, 258 const ASTContext &Context, QualType ET, 259 uint64_t ArraySize, const Expr *SizeExpr, 260 ArraySizeModifier SizeMod, unsigned TypeQuals) { 261 ID.AddPointer(ET.getAsOpaquePtr()); 262 ID.AddInteger(ArraySize); 263 ID.AddInteger(llvm::to_underlying(SizeMod)); 264 ID.AddInteger(TypeQuals); 265 ID.AddBoolean(SizeExpr != nullptr); 266 if (SizeExpr) 267 SizeExpr->Profile(ID, Context, true); 268 } 269 270 QualType ArrayParameterType::getConstantArrayType(const ASTContext &Ctx) const { 271 return Ctx.getConstantArrayType(getElementType(), getSize(), getSizeExpr(), 272 getSizeModifier(), 273 getIndexTypeQualifiers().getAsOpaqueValue()); 274 } 275 276 DependentSizedArrayType::DependentSizedArrayType(QualType et, QualType can, 277 Expr *e, ArraySizeModifier sm, 278 unsigned tq, 279 SourceRange brackets) 280 : ArrayType(DependentSizedArray, et, can, sm, tq, e), SizeExpr((Stmt *)e), 281 Brackets(brackets) {} 282 283 void DependentSizedArrayType::Profile(llvm::FoldingSetNodeID &ID, 284 const ASTContext &Context, 285 QualType ET, 286 ArraySizeModifier SizeMod, 287 unsigned TypeQuals, 288 Expr *E) { 289 ID.AddPointer(ET.getAsOpaquePtr()); 290 ID.AddInteger(llvm::to_underlying(SizeMod)); 291 ID.AddInteger(TypeQuals); 292 if (E) 293 E->Profile(ID, Context, true); 294 } 295 296 DependentVectorType::DependentVectorType(QualType ElementType, 297 QualType CanonType, Expr *SizeExpr, 298 SourceLocation Loc, VectorKind VecKind) 299 : Type(DependentVector, CanonType, 300 TypeDependence::DependentInstantiation | 301 ElementType->getDependence() | 302 (SizeExpr ? toTypeDependence(SizeExpr->getDependence()) 303 : TypeDependence::None)), 304 ElementType(ElementType), SizeExpr(SizeExpr), Loc(Loc) { 305 VectorTypeBits.VecKind = llvm::to_underlying(VecKind); 306 } 307 308 void DependentVectorType::Profile(llvm::FoldingSetNodeID &ID, 309 const ASTContext &Context, 310 QualType ElementType, const Expr *SizeExpr, 311 VectorKind VecKind) { 312 ID.AddPointer(ElementType.getAsOpaquePtr()); 313 ID.AddInteger(llvm::to_underlying(VecKind)); 314 SizeExpr->Profile(ID, Context, true); 315 } 316 317 DependentSizedExtVectorType::DependentSizedExtVectorType(QualType ElementType, 318 QualType can, 319 Expr *SizeExpr, 320 SourceLocation loc) 321 : Type(DependentSizedExtVector, can, 322 TypeDependence::DependentInstantiation | 323 ElementType->getDependence() | 324 (SizeExpr ? toTypeDependence(SizeExpr->getDependence()) 325 : TypeDependence::None)), 326 SizeExpr(SizeExpr), ElementType(ElementType), loc(loc) {} 327 328 void 329 DependentSizedExtVectorType::Profile(llvm::FoldingSetNodeID &ID, 330 const ASTContext &Context, 331 QualType ElementType, Expr *SizeExpr) { 332 ID.AddPointer(ElementType.getAsOpaquePtr()); 333 SizeExpr->Profile(ID, Context, true); 334 } 335 336 DependentAddressSpaceType::DependentAddressSpaceType(QualType PointeeType, 337 QualType can, 338 Expr *AddrSpaceExpr, 339 SourceLocation loc) 340 : Type(DependentAddressSpace, can, 341 TypeDependence::DependentInstantiation | 342 PointeeType->getDependence() | 343 (AddrSpaceExpr ? toTypeDependence(AddrSpaceExpr->getDependence()) 344 : TypeDependence::None)), 345 AddrSpaceExpr(AddrSpaceExpr), PointeeType(PointeeType), loc(loc) {} 346 347 void DependentAddressSpaceType::Profile(llvm::FoldingSetNodeID &ID, 348 const ASTContext &Context, 349 QualType PointeeType, 350 Expr *AddrSpaceExpr) { 351 ID.AddPointer(PointeeType.getAsOpaquePtr()); 352 AddrSpaceExpr->Profile(ID, Context, true); 353 } 354 355 MatrixType::MatrixType(TypeClass tc, QualType matrixType, QualType canonType, 356 const Expr *RowExpr, const Expr *ColumnExpr) 357 : Type(tc, canonType, 358 (RowExpr ? (matrixType->getDependence() | TypeDependence::Dependent | 359 TypeDependence::Instantiation | 360 (matrixType->isVariablyModifiedType() 361 ? TypeDependence::VariablyModified 362 : TypeDependence::None) | 363 (matrixType->containsUnexpandedParameterPack() || 364 (RowExpr && 365 RowExpr->containsUnexpandedParameterPack()) || 366 (ColumnExpr && 367 ColumnExpr->containsUnexpandedParameterPack()) 368 ? TypeDependence::UnexpandedPack 369 : TypeDependence::None)) 370 : matrixType->getDependence())), 371 ElementType(matrixType) {} 372 373 ConstantMatrixType::ConstantMatrixType(QualType matrixType, unsigned nRows, 374 unsigned nColumns, QualType canonType) 375 : ConstantMatrixType(ConstantMatrix, matrixType, nRows, nColumns, 376 canonType) {} 377 378 ConstantMatrixType::ConstantMatrixType(TypeClass tc, QualType matrixType, 379 unsigned nRows, unsigned nColumns, 380 QualType canonType) 381 : MatrixType(tc, matrixType, canonType), NumRows(nRows), 382 NumColumns(nColumns) {} 383 384 DependentSizedMatrixType::DependentSizedMatrixType(QualType ElementType, 385 QualType CanonicalType, 386 Expr *RowExpr, 387 Expr *ColumnExpr, 388 SourceLocation loc) 389 : MatrixType(DependentSizedMatrix, ElementType, CanonicalType, RowExpr, 390 ColumnExpr), 391 RowExpr(RowExpr), ColumnExpr(ColumnExpr), loc(loc) {} 392 393 void DependentSizedMatrixType::Profile(llvm::FoldingSetNodeID &ID, 394 const ASTContext &CTX, 395 QualType ElementType, Expr *RowExpr, 396 Expr *ColumnExpr) { 397 ID.AddPointer(ElementType.getAsOpaquePtr()); 398 RowExpr->Profile(ID, CTX, true); 399 ColumnExpr->Profile(ID, CTX, true); 400 } 401 402 VectorType::VectorType(QualType vecType, unsigned nElements, QualType canonType, 403 VectorKind vecKind) 404 : VectorType(Vector, vecType, nElements, canonType, vecKind) {} 405 406 VectorType::VectorType(TypeClass tc, QualType vecType, unsigned nElements, 407 QualType canonType, VectorKind vecKind) 408 : Type(tc, canonType, vecType->getDependence()), ElementType(vecType) { 409 VectorTypeBits.VecKind = llvm::to_underlying(vecKind); 410 VectorTypeBits.NumElements = nElements; 411 } 412 413 BitIntType::BitIntType(bool IsUnsigned, unsigned NumBits) 414 : Type(BitInt, QualType{}, TypeDependence::None), IsUnsigned(IsUnsigned), 415 NumBits(NumBits) {} 416 417 DependentBitIntType::DependentBitIntType(bool IsUnsigned, Expr *NumBitsExpr) 418 : Type(DependentBitInt, QualType{}, 419 toTypeDependence(NumBitsExpr->getDependence())), 420 ExprAndUnsigned(NumBitsExpr, IsUnsigned) {} 421 422 bool DependentBitIntType::isUnsigned() const { 423 return ExprAndUnsigned.getInt(); 424 } 425 426 clang::Expr *DependentBitIntType::getNumBitsExpr() const { 427 return ExprAndUnsigned.getPointer(); 428 } 429 430 void DependentBitIntType::Profile(llvm::FoldingSetNodeID &ID, 431 const ASTContext &Context, bool IsUnsigned, 432 Expr *NumBitsExpr) { 433 ID.AddBoolean(IsUnsigned); 434 NumBitsExpr->Profile(ID, Context, true); 435 } 436 437 bool BoundsAttributedType::referencesFieldDecls() const { 438 return llvm::any_of(dependent_decls(), 439 [](const TypeCoupledDeclRefInfo &Info) { 440 return isa<FieldDecl>(Info.getDecl()); 441 }); 442 } 443 444 void CountAttributedType::Profile(llvm::FoldingSetNodeID &ID, 445 QualType WrappedTy, Expr *CountExpr, 446 bool CountInBytes, bool OrNull) { 447 ID.AddPointer(WrappedTy.getAsOpaquePtr()); 448 ID.AddBoolean(CountInBytes); 449 ID.AddBoolean(OrNull); 450 // We profile it as a pointer as the StmtProfiler considers parameter 451 // expressions on function declaration and function definition as the 452 // same, resulting in count expression being evaluated with ParamDecl 453 // not in the function scope. 454 ID.AddPointer(CountExpr); 455 } 456 457 /// getArrayElementTypeNoTypeQual - If this is an array type, return the 458 /// element type of the array, potentially with type qualifiers missing. 459 /// This method should never be used when type qualifiers are meaningful. 460 const Type *Type::getArrayElementTypeNoTypeQual() const { 461 // If this is directly an array type, return it. 462 if (const auto *ATy = dyn_cast<ArrayType>(this)) 463 return ATy->getElementType().getTypePtr(); 464 465 // If the canonical form of this type isn't the right kind, reject it. 466 if (!isa<ArrayType>(CanonicalType)) 467 return nullptr; 468 469 // If this is a typedef for an array type, strip the typedef off without 470 // losing all typedef information. 471 return cast<ArrayType>(getUnqualifiedDesugaredType()) 472 ->getElementType().getTypePtr(); 473 } 474 475 /// getDesugaredType - Return the specified type with any "sugar" removed from 476 /// the type. This takes off typedefs, typeof's etc. If the outer level of 477 /// the type is already concrete, it returns it unmodified. This is similar 478 /// to getting the canonical type, but it doesn't remove *all* typedefs. For 479 /// example, it returns "T*" as "T*", (not as "int*"), because the pointer is 480 /// concrete. 481 QualType QualType::getDesugaredType(QualType T, const ASTContext &Context) { 482 SplitQualType split = getSplitDesugaredType(T); 483 return Context.getQualifiedType(split.Ty, split.Quals); 484 } 485 486 QualType QualType::getSingleStepDesugaredTypeImpl(QualType type, 487 const ASTContext &Context) { 488 SplitQualType split = type.split(); 489 QualType desugar = split.Ty->getLocallyUnqualifiedSingleStepDesugaredType(); 490 return Context.getQualifiedType(desugar, split.Quals); 491 } 492 493 // Check that no type class is polymorphic. LLVM style RTTI should be used 494 // instead. If absolutely needed an exception can still be added here by 495 // defining the appropriate macro (but please don't do this). 496 #define TYPE(CLASS, BASE) \ 497 static_assert(!std::is_polymorphic<CLASS##Type>::value, \ 498 #CLASS "Type should not be polymorphic!"); 499 #include "clang/AST/TypeNodes.inc" 500 501 // Check that no type class has a non-trival destructor. Types are 502 // allocated with the BumpPtrAllocator from ASTContext and therefore 503 // their destructor is not executed. 504 #define TYPE(CLASS, BASE) \ 505 static_assert(std::is_trivially_destructible<CLASS##Type>::value, \ 506 #CLASS "Type should be trivially destructible!"); 507 #include "clang/AST/TypeNodes.inc" 508 509 QualType Type::getLocallyUnqualifiedSingleStepDesugaredType() const { 510 switch (getTypeClass()) { 511 #define ABSTRACT_TYPE(Class, Parent) 512 #define TYPE(Class, Parent) \ 513 case Type::Class: { \ 514 const auto *ty = cast<Class##Type>(this); \ 515 if (!ty->isSugared()) return QualType(ty, 0); \ 516 return ty->desugar(); \ 517 } 518 #include "clang/AST/TypeNodes.inc" 519 } 520 llvm_unreachable("bad type kind!"); 521 } 522 523 SplitQualType QualType::getSplitDesugaredType(QualType T) { 524 QualifierCollector Qs; 525 526 QualType Cur = T; 527 while (true) { 528 const Type *CurTy = Qs.strip(Cur); 529 switch (CurTy->getTypeClass()) { 530 #define ABSTRACT_TYPE(Class, Parent) 531 #define TYPE(Class, Parent) \ 532 case Type::Class: { \ 533 const auto *Ty = cast<Class##Type>(CurTy); \ 534 if (!Ty->isSugared()) \ 535 return SplitQualType(Ty, Qs); \ 536 Cur = Ty->desugar(); \ 537 break; \ 538 } 539 #include "clang/AST/TypeNodes.inc" 540 } 541 } 542 } 543 544 SplitQualType QualType::getSplitUnqualifiedTypeImpl(QualType type) { 545 SplitQualType split = type.split(); 546 547 // All the qualifiers we've seen so far. 548 Qualifiers quals = split.Quals; 549 550 // The last type node we saw with any nodes inside it. 551 const Type *lastTypeWithQuals = split.Ty; 552 553 while (true) { 554 QualType next; 555 556 // Do a single-step desugar, aborting the loop if the type isn't 557 // sugared. 558 switch (split.Ty->getTypeClass()) { 559 #define ABSTRACT_TYPE(Class, Parent) 560 #define TYPE(Class, Parent) \ 561 case Type::Class: { \ 562 const auto *ty = cast<Class##Type>(split.Ty); \ 563 if (!ty->isSugared()) goto done; \ 564 next = ty->desugar(); \ 565 break; \ 566 } 567 #include "clang/AST/TypeNodes.inc" 568 } 569 570 // Otherwise, split the underlying type. If that yields qualifiers, 571 // update the information. 572 split = next.split(); 573 if (!split.Quals.empty()) { 574 lastTypeWithQuals = split.Ty; 575 quals.addConsistentQualifiers(split.Quals); 576 } 577 } 578 579 done: 580 return SplitQualType(lastTypeWithQuals, quals); 581 } 582 583 QualType QualType::IgnoreParens(QualType T) { 584 // FIXME: this seems inherently un-qualifiers-safe. 585 while (const auto *PT = T->getAs<ParenType>()) 586 T = PT->getInnerType(); 587 return T; 588 } 589 590 /// This will check for a T (which should be a Type which can act as 591 /// sugar, such as a TypedefType) by removing any existing sugar until it 592 /// reaches a T or a non-sugared type. 593 template<typename T> static const T *getAsSugar(const Type *Cur) { 594 while (true) { 595 if (const auto *Sugar = dyn_cast<T>(Cur)) 596 return Sugar; 597 switch (Cur->getTypeClass()) { 598 #define ABSTRACT_TYPE(Class, Parent) 599 #define TYPE(Class, Parent) \ 600 case Type::Class: { \ 601 const auto *Ty = cast<Class##Type>(Cur); \ 602 if (!Ty->isSugared()) return 0; \ 603 Cur = Ty->desugar().getTypePtr(); \ 604 break; \ 605 } 606 #include "clang/AST/TypeNodes.inc" 607 } 608 } 609 } 610 611 template <> const TypedefType *Type::getAs() const { 612 return getAsSugar<TypedefType>(this); 613 } 614 615 template <> const UsingType *Type::getAs() const { 616 return getAsSugar<UsingType>(this); 617 } 618 619 template <> const TemplateSpecializationType *Type::getAs() const { 620 return getAsSugar<TemplateSpecializationType>(this); 621 } 622 623 template <> const AttributedType *Type::getAs() const { 624 return getAsSugar<AttributedType>(this); 625 } 626 627 template <> const BoundsAttributedType *Type::getAs() const { 628 return getAsSugar<BoundsAttributedType>(this); 629 } 630 631 template <> const CountAttributedType *Type::getAs() const { 632 return getAsSugar<CountAttributedType>(this); 633 } 634 635 /// getUnqualifiedDesugaredType - Pull any qualifiers and syntactic 636 /// sugar off the given type. This should produce an object of the 637 /// same dynamic type as the canonical type. 638 const Type *Type::getUnqualifiedDesugaredType() const { 639 const Type *Cur = this; 640 641 while (true) { 642 switch (Cur->getTypeClass()) { 643 #define ABSTRACT_TYPE(Class, Parent) 644 #define TYPE(Class, Parent) \ 645 case Class: { \ 646 const auto *Ty = cast<Class##Type>(Cur); \ 647 if (!Ty->isSugared()) return Cur; \ 648 Cur = Ty->desugar().getTypePtr(); \ 649 break; \ 650 } 651 #include "clang/AST/TypeNodes.inc" 652 } 653 } 654 } 655 656 bool Type::isClassType() const { 657 if (const auto *RT = getAs<RecordType>()) 658 return RT->getDecl()->isClass(); 659 return false; 660 } 661 662 bool Type::isStructureType() const { 663 if (const auto *RT = getAs<RecordType>()) 664 return RT->getDecl()->isStruct(); 665 return false; 666 } 667 668 bool Type::isStructureTypeWithFlexibleArrayMember() const { 669 const auto *RT = getAs<RecordType>(); 670 if (!RT) 671 return false; 672 const auto *Decl = RT->getDecl(); 673 if (!Decl->isStruct()) 674 return false; 675 return Decl->hasFlexibleArrayMember(); 676 } 677 678 bool Type::isObjCBoxableRecordType() const { 679 if (const auto *RT = getAs<RecordType>()) 680 return RT->getDecl()->hasAttr<ObjCBoxableAttr>(); 681 return false; 682 } 683 684 bool Type::isInterfaceType() const { 685 if (const auto *RT = getAs<RecordType>()) 686 return RT->getDecl()->isInterface(); 687 return false; 688 } 689 690 bool Type::isStructureOrClassType() const { 691 if (const auto *RT = getAs<RecordType>()) { 692 RecordDecl *RD = RT->getDecl(); 693 return RD->isStruct() || RD->isClass() || RD->isInterface(); 694 } 695 return false; 696 } 697 698 bool Type::isVoidPointerType() const { 699 if (const auto *PT = getAs<PointerType>()) 700 return PT->getPointeeType()->isVoidType(); 701 return false; 702 } 703 704 bool Type::isUnionType() const { 705 if (const auto *RT = getAs<RecordType>()) 706 return RT->getDecl()->isUnion(); 707 return false; 708 } 709 710 bool Type::isComplexType() const { 711 if (const auto *CT = dyn_cast<ComplexType>(CanonicalType)) 712 return CT->getElementType()->isFloatingType(); 713 return false; 714 } 715 716 bool Type::isComplexIntegerType() const { 717 // Check for GCC complex integer extension. 718 return getAsComplexIntegerType(); 719 } 720 721 bool Type::isScopedEnumeralType() const { 722 if (const auto *ET = getAs<EnumType>()) 723 return ET->getDecl()->isScoped(); 724 return false; 725 } 726 727 bool Type::isCountAttributedType() const { 728 return getAs<CountAttributedType>(); 729 } 730 731 const ComplexType *Type::getAsComplexIntegerType() const { 732 if (const auto *Complex = getAs<ComplexType>()) 733 if (Complex->getElementType()->isIntegerType()) 734 return Complex; 735 return nullptr; 736 } 737 738 QualType Type::getPointeeType() const { 739 if (const auto *PT = getAs<PointerType>()) 740 return PT->getPointeeType(); 741 if (const auto *OPT = getAs<ObjCObjectPointerType>()) 742 return OPT->getPointeeType(); 743 if (const auto *BPT = getAs<BlockPointerType>()) 744 return BPT->getPointeeType(); 745 if (const auto *RT = getAs<ReferenceType>()) 746 return RT->getPointeeType(); 747 if (const auto *MPT = getAs<MemberPointerType>()) 748 return MPT->getPointeeType(); 749 if (const auto *DT = getAs<DecayedType>()) 750 return DT->getPointeeType(); 751 return {}; 752 } 753 754 const RecordType *Type::getAsStructureType() const { 755 // If this is directly a structure type, return it. 756 if (const auto *RT = dyn_cast<RecordType>(this)) { 757 if (RT->getDecl()->isStruct()) 758 return RT; 759 } 760 761 // If the canonical form of this type isn't the right kind, reject it. 762 if (const auto *RT = dyn_cast<RecordType>(CanonicalType)) { 763 if (!RT->getDecl()->isStruct()) 764 return nullptr; 765 766 // If this is a typedef for a structure type, strip the typedef off without 767 // losing all typedef information. 768 return cast<RecordType>(getUnqualifiedDesugaredType()); 769 } 770 return nullptr; 771 } 772 773 const RecordType *Type::getAsUnionType() const { 774 // If this is directly a union type, return it. 775 if (const auto *RT = dyn_cast<RecordType>(this)) { 776 if (RT->getDecl()->isUnion()) 777 return RT; 778 } 779 780 // If the canonical form of this type isn't the right kind, reject it. 781 if (const auto *RT = dyn_cast<RecordType>(CanonicalType)) { 782 if (!RT->getDecl()->isUnion()) 783 return nullptr; 784 785 // If this is a typedef for a union type, strip the typedef off without 786 // losing all typedef information. 787 return cast<RecordType>(getUnqualifiedDesugaredType()); 788 } 789 790 return nullptr; 791 } 792 793 bool Type::isObjCIdOrObjectKindOfType(const ASTContext &ctx, 794 const ObjCObjectType *&bound) const { 795 bound = nullptr; 796 797 const auto *OPT = getAs<ObjCObjectPointerType>(); 798 if (!OPT) 799 return false; 800 801 // Easy case: id. 802 if (OPT->isObjCIdType()) 803 return true; 804 805 // If it's not a __kindof type, reject it now. 806 if (!OPT->isKindOfType()) 807 return false; 808 809 // If it's Class or qualified Class, it's not an object type. 810 if (OPT->isObjCClassType() || OPT->isObjCQualifiedClassType()) 811 return false; 812 813 // Figure out the type bound for the __kindof type. 814 bound = OPT->getObjectType()->stripObjCKindOfTypeAndQuals(ctx) 815 ->getAs<ObjCObjectType>(); 816 return true; 817 } 818 819 bool Type::isObjCClassOrClassKindOfType() const { 820 const auto *OPT = getAs<ObjCObjectPointerType>(); 821 if (!OPT) 822 return false; 823 824 // Easy case: Class. 825 if (OPT->isObjCClassType()) 826 return true; 827 828 // If it's not a __kindof type, reject it now. 829 if (!OPT->isKindOfType()) 830 return false; 831 832 // If it's Class or qualified Class, it's a class __kindof type. 833 return OPT->isObjCClassType() || OPT->isObjCQualifiedClassType(); 834 } 835 836 ObjCTypeParamType::ObjCTypeParamType(const ObjCTypeParamDecl *D, QualType can, 837 ArrayRef<ObjCProtocolDecl *> protocols) 838 : Type(ObjCTypeParam, can, toSemanticDependence(can->getDependence())), 839 OTPDecl(const_cast<ObjCTypeParamDecl *>(D)) { 840 initialize(protocols); 841 } 842 843 ObjCObjectType::ObjCObjectType(QualType Canonical, QualType Base, 844 ArrayRef<QualType> typeArgs, 845 ArrayRef<ObjCProtocolDecl *> protocols, 846 bool isKindOf) 847 : Type(ObjCObject, Canonical, Base->getDependence()), BaseType(Base) { 848 ObjCObjectTypeBits.IsKindOf = isKindOf; 849 850 ObjCObjectTypeBits.NumTypeArgs = typeArgs.size(); 851 assert(getTypeArgsAsWritten().size() == typeArgs.size() && 852 "bitfield overflow in type argument count"); 853 if (!typeArgs.empty()) 854 memcpy(getTypeArgStorage(), typeArgs.data(), 855 typeArgs.size() * sizeof(QualType)); 856 857 for (auto typeArg : typeArgs) { 858 addDependence(typeArg->getDependence() & ~TypeDependence::VariablyModified); 859 } 860 // Initialize the protocol qualifiers. The protocol storage is known 861 // after we set number of type arguments. 862 initialize(protocols); 863 } 864 865 bool ObjCObjectType::isSpecialized() const { 866 // If we have type arguments written here, the type is specialized. 867 if (ObjCObjectTypeBits.NumTypeArgs > 0) 868 return true; 869 870 // Otherwise, check whether the base type is specialized. 871 if (const auto objcObject = getBaseType()->getAs<ObjCObjectType>()) { 872 // Terminate when we reach an interface type. 873 if (isa<ObjCInterfaceType>(objcObject)) 874 return false; 875 876 return objcObject->isSpecialized(); 877 } 878 879 // Not specialized. 880 return false; 881 } 882 883 ArrayRef<QualType> ObjCObjectType::getTypeArgs() const { 884 // We have type arguments written on this type. 885 if (isSpecializedAsWritten()) 886 return getTypeArgsAsWritten(); 887 888 // Look at the base type, which might have type arguments. 889 if (const auto objcObject = getBaseType()->getAs<ObjCObjectType>()) { 890 // Terminate when we reach an interface type. 891 if (isa<ObjCInterfaceType>(objcObject)) 892 return {}; 893 894 return objcObject->getTypeArgs(); 895 } 896 897 // No type arguments. 898 return {}; 899 } 900 901 bool ObjCObjectType::isKindOfType() const { 902 if (isKindOfTypeAsWritten()) 903 return true; 904 905 // Look at the base type, which might have type arguments. 906 if (const auto objcObject = getBaseType()->getAs<ObjCObjectType>()) { 907 // Terminate when we reach an interface type. 908 if (isa<ObjCInterfaceType>(objcObject)) 909 return false; 910 911 return objcObject->isKindOfType(); 912 } 913 914 // Not a "__kindof" type. 915 return false; 916 } 917 918 QualType ObjCObjectType::stripObjCKindOfTypeAndQuals( 919 const ASTContext &ctx) const { 920 if (!isKindOfType() && qual_empty()) 921 return QualType(this, 0); 922 923 // Recursively strip __kindof. 924 SplitQualType splitBaseType = getBaseType().split(); 925 QualType baseType(splitBaseType.Ty, 0); 926 if (const auto *baseObj = splitBaseType.Ty->getAs<ObjCObjectType>()) 927 baseType = baseObj->stripObjCKindOfTypeAndQuals(ctx); 928 929 return ctx.getObjCObjectType(ctx.getQualifiedType(baseType, 930 splitBaseType.Quals), 931 getTypeArgsAsWritten(), 932 /*protocols=*/{}, 933 /*isKindOf=*/false); 934 } 935 936 ObjCInterfaceDecl *ObjCInterfaceType::getDecl() const { 937 ObjCInterfaceDecl *Canon = Decl->getCanonicalDecl(); 938 if (ObjCInterfaceDecl *Def = Canon->getDefinition()) 939 return Def; 940 return Canon; 941 } 942 943 const ObjCObjectPointerType *ObjCObjectPointerType::stripObjCKindOfTypeAndQuals( 944 const ASTContext &ctx) const { 945 if (!isKindOfType() && qual_empty()) 946 return this; 947 948 QualType obj = getObjectType()->stripObjCKindOfTypeAndQuals(ctx); 949 return ctx.getObjCObjectPointerType(obj)->castAs<ObjCObjectPointerType>(); 950 } 951 952 namespace { 953 954 /// Visitor used to perform a simple type transformation that does not change 955 /// the semantics of the type. 956 template <typename Derived> 957 struct SimpleTransformVisitor : public TypeVisitor<Derived, QualType> { 958 ASTContext &Ctx; 959 960 QualType recurse(QualType type) { 961 // Split out the qualifiers from the type. 962 SplitQualType splitType = type.split(); 963 964 // Visit the type itself. 965 QualType result = static_cast<Derived *>(this)->Visit(splitType.Ty); 966 if (result.isNull()) 967 return result; 968 969 // Reconstruct the transformed type by applying the local qualifiers 970 // from the split type. 971 return Ctx.getQualifiedType(result, splitType.Quals); 972 } 973 974 public: 975 explicit SimpleTransformVisitor(ASTContext &ctx) : Ctx(ctx) {} 976 977 // None of the clients of this transformation can occur where 978 // there are dependent types, so skip dependent types. 979 #define TYPE(Class, Base) 980 #define DEPENDENT_TYPE(Class, Base) \ 981 QualType Visit##Class##Type(const Class##Type *T) { return QualType(T, 0); } 982 #include "clang/AST/TypeNodes.inc" 983 984 #define TRIVIAL_TYPE_CLASS(Class) \ 985 QualType Visit##Class##Type(const Class##Type *T) { return QualType(T, 0); } 986 #define SUGARED_TYPE_CLASS(Class) \ 987 QualType Visit##Class##Type(const Class##Type *T) { \ 988 if (!T->isSugared()) \ 989 return QualType(T, 0); \ 990 QualType desugaredType = recurse(T->desugar()); \ 991 if (desugaredType.isNull()) \ 992 return {}; \ 993 if (desugaredType.getAsOpaquePtr() == T->desugar().getAsOpaquePtr()) \ 994 return QualType(T, 0); \ 995 return desugaredType; \ 996 } 997 998 TRIVIAL_TYPE_CLASS(Builtin) 999 1000 QualType VisitComplexType(const ComplexType *T) { 1001 QualType elementType = recurse(T->getElementType()); 1002 if (elementType.isNull()) 1003 return {}; 1004 1005 if (elementType.getAsOpaquePtr() == T->getElementType().getAsOpaquePtr()) 1006 return QualType(T, 0); 1007 1008 return Ctx.getComplexType(elementType); 1009 } 1010 1011 QualType VisitPointerType(const PointerType *T) { 1012 QualType pointeeType = recurse(T->getPointeeType()); 1013 if (pointeeType.isNull()) 1014 return {}; 1015 1016 if (pointeeType.getAsOpaquePtr() == T->getPointeeType().getAsOpaquePtr()) 1017 return QualType(T, 0); 1018 1019 return Ctx.getPointerType(pointeeType); 1020 } 1021 1022 QualType VisitBlockPointerType(const BlockPointerType *T) { 1023 QualType pointeeType = recurse(T->getPointeeType()); 1024 if (pointeeType.isNull()) 1025 return {}; 1026 1027 if (pointeeType.getAsOpaquePtr() == T->getPointeeType().getAsOpaquePtr()) 1028 return QualType(T, 0); 1029 1030 return Ctx.getBlockPointerType(pointeeType); 1031 } 1032 1033 QualType VisitLValueReferenceType(const LValueReferenceType *T) { 1034 QualType pointeeType = recurse(T->getPointeeTypeAsWritten()); 1035 if (pointeeType.isNull()) 1036 return {}; 1037 1038 if (pointeeType.getAsOpaquePtr() 1039 == T->getPointeeTypeAsWritten().getAsOpaquePtr()) 1040 return QualType(T, 0); 1041 1042 return Ctx.getLValueReferenceType(pointeeType, T->isSpelledAsLValue()); 1043 } 1044 1045 QualType VisitRValueReferenceType(const RValueReferenceType *T) { 1046 QualType pointeeType = recurse(T->getPointeeTypeAsWritten()); 1047 if (pointeeType.isNull()) 1048 return {}; 1049 1050 if (pointeeType.getAsOpaquePtr() 1051 == T->getPointeeTypeAsWritten().getAsOpaquePtr()) 1052 return QualType(T, 0); 1053 1054 return Ctx.getRValueReferenceType(pointeeType); 1055 } 1056 1057 QualType VisitMemberPointerType(const MemberPointerType *T) { 1058 QualType pointeeType = recurse(T->getPointeeType()); 1059 if (pointeeType.isNull()) 1060 return {}; 1061 1062 if (pointeeType.getAsOpaquePtr() == T->getPointeeType().getAsOpaquePtr()) 1063 return QualType(T, 0); 1064 1065 return Ctx.getMemberPointerType(pointeeType, T->getClass()); 1066 } 1067 1068 QualType VisitConstantArrayType(const ConstantArrayType *T) { 1069 QualType elementType = recurse(T->getElementType()); 1070 if (elementType.isNull()) 1071 return {}; 1072 1073 if (elementType.getAsOpaquePtr() == T->getElementType().getAsOpaquePtr()) 1074 return QualType(T, 0); 1075 1076 return Ctx.getConstantArrayType(elementType, T->getSize(), T->getSizeExpr(), 1077 T->getSizeModifier(), 1078 T->getIndexTypeCVRQualifiers()); 1079 } 1080 1081 QualType VisitVariableArrayType(const VariableArrayType *T) { 1082 QualType elementType = recurse(T->getElementType()); 1083 if (elementType.isNull()) 1084 return {}; 1085 1086 if (elementType.getAsOpaquePtr() == T->getElementType().getAsOpaquePtr()) 1087 return QualType(T, 0); 1088 1089 return Ctx.getVariableArrayType(elementType, T->getSizeExpr(), 1090 T->getSizeModifier(), 1091 T->getIndexTypeCVRQualifiers(), 1092 T->getBracketsRange()); 1093 } 1094 1095 QualType VisitIncompleteArrayType(const IncompleteArrayType *T) { 1096 QualType elementType = recurse(T->getElementType()); 1097 if (elementType.isNull()) 1098 return {}; 1099 1100 if (elementType.getAsOpaquePtr() == T->getElementType().getAsOpaquePtr()) 1101 return QualType(T, 0); 1102 1103 return Ctx.getIncompleteArrayType(elementType, T->getSizeModifier(), 1104 T->getIndexTypeCVRQualifiers()); 1105 } 1106 1107 QualType VisitVectorType(const VectorType *T) { 1108 QualType elementType = recurse(T->getElementType()); 1109 if (elementType.isNull()) 1110 return {}; 1111 1112 if (elementType.getAsOpaquePtr() == T->getElementType().getAsOpaquePtr()) 1113 return QualType(T, 0); 1114 1115 return Ctx.getVectorType(elementType, T->getNumElements(), 1116 T->getVectorKind()); 1117 } 1118 1119 QualType VisitExtVectorType(const ExtVectorType *T) { 1120 QualType elementType = recurse(T->getElementType()); 1121 if (elementType.isNull()) 1122 return {}; 1123 1124 if (elementType.getAsOpaquePtr() == T->getElementType().getAsOpaquePtr()) 1125 return QualType(T, 0); 1126 1127 return Ctx.getExtVectorType(elementType, T->getNumElements()); 1128 } 1129 1130 QualType VisitConstantMatrixType(const ConstantMatrixType *T) { 1131 QualType elementType = recurse(T->getElementType()); 1132 if (elementType.isNull()) 1133 return {}; 1134 if (elementType.getAsOpaquePtr() == T->getElementType().getAsOpaquePtr()) 1135 return QualType(T, 0); 1136 1137 return Ctx.getConstantMatrixType(elementType, T->getNumRows(), 1138 T->getNumColumns()); 1139 } 1140 1141 QualType VisitFunctionNoProtoType(const FunctionNoProtoType *T) { 1142 QualType returnType = recurse(T->getReturnType()); 1143 if (returnType.isNull()) 1144 return {}; 1145 1146 if (returnType.getAsOpaquePtr() == T->getReturnType().getAsOpaquePtr()) 1147 return QualType(T, 0); 1148 1149 return Ctx.getFunctionNoProtoType(returnType, T->getExtInfo()); 1150 } 1151 1152 QualType VisitFunctionProtoType(const FunctionProtoType *T) { 1153 QualType returnType = recurse(T->getReturnType()); 1154 if (returnType.isNull()) 1155 return {}; 1156 1157 // Transform parameter types. 1158 SmallVector<QualType, 4> paramTypes; 1159 bool paramChanged = false; 1160 for (auto paramType : T->getParamTypes()) { 1161 QualType newParamType = recurse(paramType); 1162 if (newParamType.isNull()) 1163 return {}; 1164 1165 if (newParamType.getAsOpaquePtr() != paramType.getAsOpaquePtr()) 1166 paramChanged = true; 1167 1168 paramTypes.push_back(newParamType); 1169 } 1170 1171 // Transform extended info. 1172 FunctionProtoType::ExtProtoInfo info = T->getExtProtoInfo(); 1173 bool exceptionChanged = false; 1174 if (info.ExceptionSpec.Type == EST_Dynamic) { 1175 SmallVector<QualType, 4> exceptionTypes; 1176 for (auto exceptionType : info.ExceptionSpec.Exceptions) { 1177 QualType newExceptionType = recurse(exceptionType); 1178 if (newExceptionType.isNull()) 1179 return {}; 1180 1181 if (newExceptionType.getAsOpaquePtr() != exceptionType.getAsOpaquePtr()) 1182 exceptionChanged = true; 1183 1184 exceptionTypes.push_back(newExceptionType); 1185 } 1186 1187 if (exceptionChanged) { 1188 info.ExceptionSpec.Exceptions = 1189 llvm::ArrayRef(exceptionTypes).copy(Ctx); 1190 } 1191 } 1192 1193 if (returnType.getAsOpaquePtr() == T->getReturnType().getAsOpaquePtr() && 1194 !paramChanged && !exceptionChanged) 1195 return QualType(T, 0); 1196 1197 return Ctx.getFunctionType(returnType, paramTypes, info); 1198 } 1199 1200 QualType VisitParenType(const ParenType *T) { 1201 QualType innerType = recurse(T->getInnerType()); 1202 if (innerType.isNull()) 1203 return {}; 1204 1205 if (innerType.getAsOpaquePtr() == T->getInnerType().getAsOpaquePtr()) 1206 return QualType(T, 0); 1207 1208 return Ctx.getParenType(innerType); 1209 } 1210 1211 SUGARED_TYPE_CLASS(Typedef) 1212 SUGARED_TYPE_CLASS(ObjCTypeParam) 1213 SUGARED_TYPE_CLASS(MacroQualified) 1214 1215 QualType VisitAdjustedType(const AdjustedType *T) { 1216 QualType originalType = recurse(T->getOriginalType()); 1217 if (originalType.isNull()) 1218 return {}; 1219 1220 QualType adjustedType = recurse(T->getAdjustedType()); 1221 if (adjustedType.isNull()) 1222 return {}; 1223 1224 if (originalType.getAsOpaquePtr() 1225 == T->getOriginalType().getAsOpaquePtr() && 1226 adjustedType.getAsOpaquePtr() == T->getAdjustedType().getAsOpaquePtr()) 1227 return QualType(T, 0); 1228 1229 return Ctx.getAdjustedType(originalType, adjustedType); 1230 } 1231 1232 QualType VisitDecayedType(const DecayedType *T) { 1233 QualType originalType = recurse(T->getOriginalType()); 1234 if (originalType.isNull()) 1235 return {}; 1236 1237 if (originalType.getAsOpaquePtr() 1238 == T->getOriginalType().getAsOpaquePtr()) 1239 return QualType(T, 0); 1240 1241 return Ctx.getDecayedType(originalType); 1242 } 1243 1244 QualType VisitArrayParameterType(const ArrayParameterType *T) { 1245 QualType ArrTy = VisitConstantArrayType(T); 1246 if (ArrTy.isNull()) 1247 return {}; 1248 1249 return Ctx.getArrayParameterType(ArrTy); 1250 } 1251 1252 SUGARED_TYPE_CLASS(TypeOfExpr) 1253 SUGARED_TYPE_CLASS(TypeOf) 1254 SUGARED_TYPE_CLASS(Decltype) 1255 SUGARED_TYPE_CLASS(UnaryTransform) 1256 TRIVIAL_TYPE_CLASS(Record) 1257 TRIVIAL_TYPE_CLASS(Enum) 1258 1259 // FIXME: Non-trivial to implement, but important for C++ 1260 SUGARED_TYPE_CLASS(Elaborated) 1261 1262 QualType VisitAttributedType(const AttributedType *T) { 1263 QualType modifiedType = recurse(T->getModifiedType()); 1264 if (modifiedType.isNull()) 1265 return {}; 1266 1267 QualType equivalentType = recurse(T->getEquivalentType()); 1268 if (equivalentType.isNull()) 1269 return {}; 1270 1271 if (modifiedType.getAsOpaquePtr() 1272 == T->getModifiedType().getAsOpaquePtr() && 1273 equivalentType.getAsOpaquePtr() 1274 == T->getEquivalentType().getAsOpaquePtr()) 1275 return QualType(T, 0); 1276 1277 return Ctx.getAttributedType(T->getAttrKind(), modifiedType, equivalentType, 1278 T->getAttr()); 1279 } 1280 1281 QualType VisitSubstTemplateTypeParmType(const SubstTemplateTypeParmType *T) { 1282 QualType replacementType = recurse(T->getReplacementType()); 1283 if (replacementType.isNull()) 1284 return {}; 1285 1286 if (replacementType.getAsOpaquePtr() 1287 == T->getReplacementType().getAsOpaquePtr()) 1288 return QualType(T, 0); 1289 1290 return Ctx.getSubstTemplateTypeParmType(replacementType, 1291 T->getAssociatedDecl(), 1292 T->getIndex(), T->getPackIndex()); 1293 } 1294 1295 // FIXME: Non-trivial to implement, but important for C++ 1296 SUGARED_TYPE_CLASS(TemplateSpecialization) 1297 1298 QualType VisitAutoType(const AutoType *T) { 1299 if (!T->isDeduced()) 1300 return QualType(T, 0); 1301 1302 QualType deducedType = recurse(T->getDeducedType()); 1303 if (deducedType.isNull()) 1304 return {}; 1305 1306 if (deducedType.getAsOpaquePtr() 1307 == T->getDeducedType().getAsOpaquePtr()) 1308 return QualType(T, 0); 1309 1310 return Ctx.getAutoType(deducedType, T->getKeyword(), 1311 T->isDependentType(), /*IsPack=*/false, 1312 T->getTypeConstraintConcept(), 1313 T->getTypeConstraintArguments()); 1314 } 1315 1316 QualType VisitObjCObjectType(const ObjCObjectType *T) { 1317 QualType baseType = recurse(T->getBaseType()); 1318 if (baseType.isNull()) 1319 return {}; 1320 1321 // Transform type arguments. 1322 bool typeArgChanged = false; 1323 SmallVector<QualType, 4> typeArgs; 1324 for (auto typeArg : T->getTypeArgsAsWritten()) { 1325 QualType newTypeArg = recurse(typeArg); 1326 if (newTypeArg.isNull()) 1327 return {}; 1328 1329 if (newTypeArg.getAsOpaquePtr() != typeArg.getAsOpaquePtr()) 1330 typeArgChanged = true; 1331 1332 typeArgs.push_back(newTypeArg); 1333 } 1334 1335 if (baseType.getAsOpaquePtr() == T->getBaseType().getAsOpaquePtr() && 1336 !typeArgChanged) 1337 return QualType(T, 0); 1338 1339 return Ctx.getObjCObjectType( 1340 baseType, typeArgs, 1341 llvm::ArrayRef(T->qual_begin(), T->getNumProtocols()), 1342 T->isKindOfTypeAsWritten()); 1343 } 1344 1345 TRIVIAL_TYPE_CLASS(ObjCInterface) 1346 1347 QualType VisitObjCObjectPointerType(const ObjCObjectPointerType *T) { 1348 QualType pointeeType = recurse(T->getPointeeType()); 1349 if (pointeeType.isNull()) 1350 return {}; 1351 1352 if (pointeeType.getAsOpaquePtr() 1353 == T->getPointeeType().getAsOpaquePtr()) 1354 return QualType(T, 0); 1355 1356 return Ctx.getObjCObjectPointerType(pointeeType); 1357 } 1358 1359 QualType VisitAtomicType(const AtomicType *T) { 1360 QualType valueType = recurse(T->getValueType()); 1361 if (valueType.isNull()) 1362 return {}; 1363 1364 if (valueType.getAsOpaquePtr() 1365 == T->getValueType().getAsOpaquePtr()) 1366 return QualType(T, 0); 1367 1368 return Ctx.getAtomicType(valueType); 1369 } 1370 1371 #undef TRIVIAL_TYPE_CLASS 1372 #undef SUGARED_TYPE_CLASS 1373 }; 1374 1375 struct SubstObjCTypeArgsVisitor 1376 : public SimpleTransformVisitor<SubstObjCTypeArgsVisitor> { 1377 using BaseType = SimpleTransformVisitor<SubstObjCTypeArgsVisitor>; 1378 1379 ArrayRef<QualType> TypeArgs; 1380 ObjCSubstitutionContext SubstContext; 1381 1382 SubstObjCTypeArgsVisitor(ASTContext &ctx, ArrayRef<QualType> typeArgs, 1383 ObjCSubstitutionContext context) 1384 : BaseType(ctx), TypeArgs(typeArgs), SubstContext(context) {} 1385 1386 QualType VisitObjCTypeParamType(const ObjCTypeParamType *OTPTy) { 1387 // Replace an Objective-C type parameter reference with the corresponding 1388 // type argument. 1389 ObjCTypeParamDecl *typeParam = OTPTy->getDecl(); 1390 // If we have type arguments, use them. 1391 if (!TypeArgs.empty()) { 1392 QualType argType = TypeArgs[typeParam->getIndex()]; 1393 if (OTPTy->qual_empty()) 1394 return argType; 1395 1396 // Apply protocol lists if exists. 1397 bool hasError; 1398 SmallVector<ObjCProtocolDecl *, 8> protocolsVec; 1399 protocolsVec.append(OTPTy->qual_begin(), OTPTy->qual_end()); 1400 ArrayRef<ObjCProtocolDecl *> protocolsToApply = protocolsVec; 1401 return Ctx.applyObjCProtocolQualifiers( 1402 argType, protocolsToApply, hasError, true/*allowOnPointerType*/); 1403 } 1404 1405 switch (SubstContext) { 1406 case ObjCSubstitutionContext::Ordinary: 1407 case ObjCSubstitutionContext::Parameter: 1408 case ObjCSubstitutionContext::Superclass: 1409 // Substitute the bound. 1410 return typeParam->getUnderlyingType(); 1411 1412 case ObjCSubstitutionContext::Result: 1413 case ObjCSubstitutionContext::Property: { 1414 // Substitute the __kindof form of the underlying type. 1415 const auto *objPtr = 1416 typeParam->getUnderlyingType()->castAs<ObjCObjectPointerType>(); 1417 1418 // __kindof types, id, and Class don't need an additional 1419 // __kindof. 1420 if (objPtr->isKindOfType() || objPtr->isObjCIdOrClassType()) 1421 return typeParam->getUnderlyingType(); 1422 1423 // Add __kindof. 1424 const auto *obj = objPtr->getObjectType(); 1425 QualType resultTy = Ctx.getObjCObjectType( 1426 obj->getBaseType(), obj->getTypeArgsAsWritten(), obj->getProtocols(), 1427 /*isKindOf=*/true); 1428 1429 // Rebuild object pointer type. 1430 return Ctx.getObjCObjectPointerType(resultTy); 1431 } 1432 } 1433 llvm_unreachable("Unexpected ObjCSubstitutionContext!"); 1434 } 1435 1436 QualType VisitFunctionType(const FunctionType *funcType) { 1437 // If we have a function type, update the substitution context 1438 // appropriately. 1439 1440 //Substitute result type. 1441 QualType returnType = funcType->getReturnType().substObjCTypeArgs( 1442 Ctx, TypeArgs, ObjCSubstitutionContext::Result); 1443 if (returnType.isNull()) 1444 return {}; 1445 1446 // Handle non-prototyped functions, which only substitute into the result 1447 // type. 1448 if (isa<FunctionNoProtoType>(funcType)) { 1449 // If the return type was unchanged, do nothing. 1450 if (returnType.getAsOpaquePtr() == 1451 funcType->getReturnType().getAsOpaquePtr()) 1452 return BaseType::VisitFunctionType(funcType); 1453 1454 // Otherwise, build a new type. 1455 return Ctx.getFunctionNoProtoType(returnType, funcType->getExtInfo()); 1456 } 1457 1458 const auto *funcProtoType = cast<FunctionProtoType>(funcType); 1459 1460 // Transform parameter types. 1461 SmallVector<QualType, 4> paramTypes; 1462 bool paramChanged = false; 1463 for (auto paramType : funcProtoType->getParamTypes()) { 1464 QualType newParamType = paramType.substObjCTypeArgs( 1465 Ctx, TypeArgs, ObjCSubstitutionContext::Parameter); 1466 if (newParamType.isNull()) 1467 return {}; 1468 1469 if (newParamType.getAsOpaquePtr() != paramType.getAsOpaquePtr()) 1470 paramChanged = true; 1471 1472 paramTypes.push_back(newParamType); 1473 } 1474 1475 // Transform extended info. 1476 FunctionProtoType::ExtProtoInfo info = funcProtoType->getExtProtoInfo(); 1477 bool exceptionChanged = false; 1478 if (info.ExceptionSpec.Type == EST_Dynamic) { 1479 SmallVector<QualType, 4> exceptionTypes; 1480 for (auto exceptionType : info.ExceptionSpec.Exceptions) { 1481 QualType newExceptionType = exceptionType.substObjCTypeArgs( 1482 Ctx, TypeArgs, ObjCSubstitutionContext::Ordinary); 1483 if (newExceptionType.isNull()) 1484 return {}; 1485 1486 if (newExceptionType.getAsOpaquePtr() != exceptionType.getAsOpaquePtr()) 1487 exceptionChanged = true; 1488 1489 exceptionTypes.push_back(newExceptionType); 1490 } 1491 1492 if (exceptionChanged) { 1493 info.ExceptionSpec.Exceptions = 1494 llvm::ArrayRef(exceptionTypes).copy(Ctx); 1495 } 1496 } 1497 1498 if (returnType.getAsOpaquePtr() == 1499 funcProtoType->getReturnType().getAsOpaquePtr() && 1500 !paramChanged && !exceptionChanged) 1501 return BaseType::VisitFunctionType(funcType); 1502 1503 return Ctx.getFunctionType(returnType, paramTypes, info); 1504 } 1505 1506 QualType VisitObjCObjectType(const ObjCObjectType *objcObjectType) { 1507 // Substitute into the type arguments of a specialized Objective-C object 1508 // type. 1509 if (objcObjectType->isSpecializedAsWritten()) { 1510 SmallVector<QualType, 4> newTypeArgs; 1511 bool anyChanged = false; 1512 for (auto typeArg : objcObjectType->getTypeArgsAsWritten()) { 1513 QualType newTypeArg = typeArg.substObjCTypeArgs( 1514 Ctx, TypeArgs, ObjCSubstitutionContext::Ordinary); 1515 if (newTypeArg.isNull()) 1516 return {}; 1517 1518 if (newTypeArg.getAsOpaquePtr() != typeArg.getAsOpaquePtr()) { 1519 // If we're substituting based on an unspecialized context type, 1520 // produce an unspecialized type. 1521 ArrayRef<ObjCProtocolDecl *> protocols( 1522 objcObjectType->qual_begin(), objcObjectType->getNumProtocols()); 1523 if (TypeArgs.empty() && 1524 SubstContext != ObjCSubstitutionContext::Superclass) { 1525 return Ctx.getObjCObjectType( 1526 objcObjectType->getBaseType(), {}, protocols, 1527 objcObjectType->isKindOfTypeAsWritten()); 1528 } 1529 1530 anyChanged = true; 1531 } 1532 1533 newTypeArgs.push_back(newTypeArg); 1534 } 1535 1536 if (anyChanged) { 1537 ArrayRef<ObjCProtocolDecl *> protocols( 1538 objcObjectType->qual_begin(), objcObjectType->getNumProtocols()); 1539 return Ctx.getObjCObjectType(objcObjectType->getBaseType(), newTypeArgs, 1540 protocols, 1541 objcObjectType->isKindOfTypeAsWritten()); 1542 } 1543 } 1544 1545 return BaseType::VisitObjCObjectType(objcObjectType); 1546 } 1547 1548 QualType VisitAttributedType(const AttributedType *attrType) { 1549 QualType newType = BaseType::VisitAttributedType(attrType); 1550 if (newType.isNull()) 1551 return {}; 1552 1553 const auto *newAttrType = dyn_cast<AttributedType>(newType.getTypePtr()); 1554 if (!newAttrType || newAttrType->getAttrKind() != attr::ObjCKindOf) 1555 return newType; 1556 1557 // Find out if it's an Objective-C object or object pointer type; 1558 QualType newEquivType = newAttrType->getEquivalentType(); 1559 const ObjCObjectPointerType *ptrType = 1560 newEquivType->getAs<ObjCObjectPointerType>(); 1561 const ObjCObjectType *objType = ptrType 1562 ? ptrType->getObjectType() 1563 : newEquivType->getAs<ObjCObjectType>(); 1564 if (!objType) 1565 return newType; 1566 1567 // Rebuild the "equivalent" type, which pushes __kindof down into 1568 // the object type. 1569 newEquivType = Ctx.getObjCObjectType( 1570 objType->getBaseType(), objType->getTypeArgsAsWritten(), 1571 objType->getProtocols(), 1572 // There is no need to apply kindof on an unqualified id type. 1573 /*isKindOf=*/objType->isObjCUnqualifiedId() ? false : true); 1574 1575 // If we started with an object pointer type, rebuild it. 1576 if (ptrType) 1577 newEquivType = Ctx.getObjCObjectPointerType(newEquivType); 1578 1579 // Rebuild the attributed type. 1580 return Ctx.getAttributedType(newAttrType->getAttrKind(), 1581 newAttrType->getModifiedType(), newEquivType, 1582 newAttrType->getAttr()); 1583 } 1584 }; 1585 1586 struct StripObjCKindOfTypeVisitor 1587 : public SimpleTransformVisitor<StripObjCKindOfTypeVisitor> { 1588 using BaseType = SimpleTransformVisitor<StripObjCKindOfTypeVisitor>; 1589 1590 explicit StripObjCKindOfTypeVisitor(ASTContext &ctx) : BaseType(ctx) {} 1591 1592 QualType VisitObjCObjectType(const ObjCObjectType *objType) { 1593 if (!objType->isKindOfType()) 1594 return BaseType::VisitObjCObjectType(objType); 1595 1596 QualType baseType = objType->getBaseType().stripObjCKindOfType(Ctx); 1597 return Ctx.getObjCObjectType(baseType, objType->getTypeArgsAsWritten(), 1598 objType->getProtocols(), 1599 /*isKindOf=*/false); 1600 } 1601 }; 1602 1603 } // namespace 1604 1605 bool QualType::UseExcessPrecision(const ASTContext &Ctx) { 1606 const BuiltinType *BT = getTypePtr()->getAs<BuiltinType>(); 1607 if (!BT) { 1608 const VectorType *VT = getTypePtr()->getAs<VectorType>(); 1609 if (VT) { 1610 QualType ElementType = VT->getElementType(); 1611 return ElementType.UseExcessPrecision(Ctx); 1612 } 1613 } else { 1614 switch (BT->getKind()) { 1615 case BuiltinType::Kind::Float16: { 1616 const TargetInfo &TI = Ctx.getTargetInfo(); 1617 if (TI.hasFloat16Type() && !TI.hasLegalHalfType() && 1618 Ctx.getLangOpts().getFloat16ExcessPrecision() != 1619 Ctx.getLangOpts().ExcessPrecisionKind::FPP_None) 1620 return true; 1621 break; 1622 } 1623 case BuiltinType::Kind::BFloat16: { 1624 const TargetInfo &TI = Ctx.getTargetInfo(); 1625 if (TI.hasBFloat16Type() && !TI.hasFullBFloat16Type() && 1626 Ctx.getLangOpts().getBFloat16ExcessPrecision() != 1627 Ctx.getLangOpts().ExcessPrecisionKind::FPP_None) 1628 return true; 1629 break; 1630 } 1631 default: 1632 return false; 1633 } 1634 } 1635 return false; 1636 } 1637 1638 /// Substitute the given type arguments for Objective-C type 1639 /// parameters within the given type, recursively. 1640 QualType QualType::substObjCTypeArgs(ASTContext &ctx, 1641 ArrayRef<QualType> typeArgs, 1642 ObjCSubstitutionContext context) const { 1643 SubstObjCTypeArgsVisitor visitor(ctx, typeArgs, context); 1644 return visitor.recurse(*this); 1645 } 1646 1647 QualType QualType::substObjCMemberType(QualType objectType, 1648 const DeclContext *dc, 1649 ObjCSubstitutionContext context) const { 1650 if (auto subs = objectType->getObjCSubstitutions(dc)) 1651 return substObjCTypeArgs(dc->getParentASTContext(), *subs, context); 1652 1653 return *this; 1654 } 1655 1656 QualType QualType::stripObjCKindOfType(const ASTContext &constCtx) const { 1657 // FIXME: Because ASTContext::getAttributedType() is non-const. 1658 auto &ctx = const_cast<ASTContext &>(constCtx); 1659 StripObjCKindOfTypeVisitor visitor(ctx); 1660 return visitor.recurse(*this); 1661 } 1662 1663 QualType QualType::getAtomicUnqualifiedType() const { 1664 QualType T = *this; 1665 if (const auto AT = T.getTypePtr()->getAs<AtomicType>()) 1666 T = AT->getValueType(); 1667 return T.getUnqualifiedType(); 1668 } 1669 1670 std::optional<ArrayRef<QualType>> 1671 Type::getObjCSubstitutions(const DeclContext *dc) const { 1672 // Look through method scopes. 1673 if (const auto method = dyn_cast<ObjCMethodDecl>(dc)) 1674 dc = method->getDeclContext(); 1675 1676 // Find the class or category in which the type we're substituting 1677 // was declared. 1678 const auto *dcClassDecl = dyn_cast<ObjCInterfaceDecl>(dc); 1679 const ObjCCategoryDecl *dcCategoryDecl = nullptr; 1680 ObjCTypeParamList *dcTypeParams = nullptr; 1681 if (dcClassDecl) { 1682 // If the class does not have any type parameters, there's no 1683 // substitution to do. 1684 dcTypeParams = dcClassDecl->getTypeParamList(); 1685 if (!dcTypeParams) 1686 return std::nullopt; 1687 } else { 1688 // If we are in neither a class nor a category, there's no 1689 // substitution to perform. 1690 dcCategoryDecl = dyn_cast<ObjCCategoryDecl>(dc); 1691 if (!dcCategoryDecl) 1692 return std::nullopt; 1693 1694 // If the category does not have any type parameters, there's no 1695 // substitution to do. 1696 dcTypeParams = dcCategoryDecl->getTypeParamList(); 1697 if (!dcTypeParams) 1698 return std::nullopt; 1699 1700 dcClassDecl = dcCategoryDecl->getClassInterface(); 1701 if (!dcClassDecl) 1702 return std::nullopt; 1703 } 1704 assert(dcTypeParams && "No substitutions to perform"); 1705 assert(dcClassDecl && "No class context"); 1706 1707 // Find the underlying object type. 1708 const ObjCObjectType *objectType; 1709 if (const auto *objectPointerType = getAs<ObjCObjectPointerType>()) { 1710 objectType = objectPointerType->getObjectType(); 1711 } else if (getAs<BlockPointerType>()) { 1712 ASTContext &ctx = dc->getParentASTContext(); 1713 objectType = ctx.getObjCObjectType(ctx.ObjCBuiltinIdTy, {}, {}) 1714 ->castAs<ObjCObjectType>(); 1715 } else { 1716 objectType = getAs<ObjCObjectType>(); 1717 } 1718 1719 /// Extract the class from the receiver object type. 1720 ObjCInterfaceDecl *curClassDecl = objectType ? objectType->getInterface() 1721 : nullptr; 1722 if (!curClassDecl) { 1723 // If we don't have a context type (e.g., this is "id" or some 1724 // variant thereof), substitute the bounds. 1725 return llvm::ArrayRef<QualType>(); 1726 } 1727 1728 // Follow the superclass chain until we've mapped the receiver type 1729 // to the same class as the context. 1730 while (curClassDecl != dcClassDecl) { 1731 // Map to the superclass type. 1732 QualType superType = objectType->getSuperClassType(); 1733 if (superType.isNull()) { 1734 objectType = nullptr; 1735 break; 1736 } 1737 1738 objectType = superType->castAs<ObjCObjectType>(); 1739 curClassDecl = objectType->getInterface(); 1740 } 1741 1742 // If we don't have a receiver type, or the receiver type does not 1743 // have type arguments, substitute in the defaults. 1744 if (!objectType || objectType->isUnspecialized()) { 1745 return llvm::ArrayRef<QualType>(); 1746 } 1747 1748 // The receiver type has the type arguments we want. 1749 return objectType->getTypeArgs(); 1750 } 1751 1752 bool Type::acceptsObjCTypeParams() const { 1753 if (auto *IfaceT = getAsObjCInterfaceType()) { 1754 if (auto *ID = IfaceT->getInterface()) { 1755 if (ID->getTypeParamList()) 1756 return true; 1757 } 1758 } 1759 1760 return false; 1761 } 1762 1763 void ObjCObjectType::computeSuperClassTypeSlow() const { 1764 // Retrieve the class declaration for this type. If there isn't one 1765 // (e.g., this is some variant of "id" or "Class"), then there is no 1766 // superclass type. 1767 ObjCInterfaceDecl *classDecl = getInterface(); 1768 if (!classDecl) { 1769 CachedSuperClassType.setInt(true); 1770 return; 1771 } 1772 1773 // Extract the superclass type. 1774 const ObjCObjectType *superClassObjTy = classDecl->getSuperClassType(); 1775 if (!superClassObjTy) { 1776 CachedSuperClassType.setInt(true); 1777 return; 1778 } 1779 1780 ObjCInterfaceDecl *superClassDecl = superClassObjTy->getInterface(); 1781 if (!superClassDecl) { 1782 CachedSuperClassType.setInt(true); 1783 return; 1784 } 1785 1786 // If the superclass doesn't have type parameters, then there is no 1787 // substitution to perform. 1788 QualType superClassType(superClassObjTy, 0); 1789 ObjCTypeParamList *superClassTypeParams = superClassDecl->getTypeParamList(); 1790 if (!superClassTypeParams) { 1791 CachedSuperClassType.setPointerAndInt( 1792 superClassType->castAs<ObjCObjectType>(), true); 1793 return; 1794 } 1795 1796 // If the superclass reference is unspecialized, return it. 1797 if (superClassObjTy->isUnspecialized()) { 1798 CachedSuperClassType.setPointerAndInt(superClassObjTy, true); 1799 return; 1800 } 1801 1802 // If the subclass is not parameterized, there aren't any type 1803 // parameters in the superclass reference to substitute. 1804 ObjCTypeParamList *typeParams = classDecl->getTypeParamList(); 1805 if (!typeParams) { 1806 CachedSuperClassType.setPointerAndInt( 1807 superClassType->castAs<ObjCObjectType>(), true); 1808 return; 1809 } 1810 1811 // If the subclass type isn't specialized, return the unspecialized 1812 // superclass. 1813 if (isUnspecialized()) { 1814 QualType unspecializedSuper 1815 = classDecl->getASTContext().getObjCInterfaceType( 1816 superClassObjTy->getInterface()); 1817 CachedSuperClassType.setPointerAndInt( 1818 unspecializedSuper->castAs<ObjCObjectType>(), 1819 true); 1820 return; 1821 } 1822 1823 // Substitute the provided type arguments into the superclass type. 1824 ArrayRef<QualType> typeArgs = getTypeArgs(); 1825 assert(typeArgs.size() == typeParams->size()); 1826 CachedSuperClassType.setPointerAndInt( 1827 superClassType.substObjCTypeArgs(classDecl->getASTContext(), typeArgs, 1828 ObjCSubstitutionContext::Superclass) 1829 ->castAs<ObjCObjectType>(), 1830 true); 1831 } 1832 1833 const ObjCInterfaceType *ObjCObjectPointerType::getInterfaceType() const { 1834 if (auto interfaceDecl = getObjectType()->getInterface()) { 1835 return interfaceDecl->getASTContext().getObjCInterfaceType(interfaceDecl) 1836 ->castAs<ObjCInterfaceType>(); 1837 } 1838 1839 return nullptr; 1840 } 1841 1842 QualType ObjCObjectPointerType::getSuperClassType() const { 1843 QualType superObjectType = getObjectType()->getSuperClassType(); 1844 if (superObjectType.isNull()) 1845 return superObjectType; 1846 1847 ASTContext &ctx = getInterfaceDecl()->getASTContext(); 1848 return ctx.getObjCObjectPointerType(superObjectType); 1849 } 1850 1851 const ObjCObjectType *Type::getAsObjCQualifiedInterfaceType() const { 1852 // There is no sugar for ObjCObjectType's, just return the canonical 1853 // type pointer if it is the right class. There is no typedef information to 1854 // return and these cannot be Address-space qualified. 1855 if (const auto *T = getAs<ObjCObjectType>()) 1856 if (T->getNumProtocols() && T->getInterface()) 1857 return T; 1858 return nullptr; 1859 } 1860 1861 bool Type::isObjCQualifiedInterfaceType() const { 1862 return getAsObjCQualifiedInterfaceType() != nullptr; 1863 } 1864 1865 const ObjCObjectPointerType *Type::getAsObjCQualifiedIdType() const { 1866 // There is no sugar for ObjCQualifiedIdType's, just return the canonical 1867 // type pointer if it is the right class. 1868 if (const auto *OPT = getAs<ObjCObjectPointerType>()) { 1869 if (OPT->isObjCQualifiedIdType()) 1870 return OPT; 1871 } 1872 return nullptr; 1873 } 1874 1875 const ObjCObjectPointerType *Type::getAsObjCQualifiedClassType() const { 1876 // There is no sugar for ObjCQualifiedClassType's, just return the canonical 1877 // type pointer if it is the right class. 1878 if (const auto *OPT = getAs<ObjCObjectPointerType>()) { 1879 if (OPT->isObjCQualifiedClassType()) 1880 return OPT; 1881 } 1882 return nullptr; 1883 } 1884 1885 const ObjCObjectType *Type::getAsObjCInterfaceType() const { 1886 if (const auto *OT = getAs<ObjCObjectType>()) { 1887 if (OT->getInterface()) 1888 return OT; 1889 } 1890 return nullptr; 1891 } 1892 1893 const ObjCObjectPointerType *Type::getAsObjCInterfacePointerType() const { 1894 if (const auto *OPT = getAs<ObjCObjectPointerType>()) { 1895 if (OPT->getInterfaceType()) 1896 return OPT; 1897 } 1898 return nullptr; 1899 } 1900 1901 const CXXRecordDecl *Type::getPointeeCXXRecordDecl() const { 1902 QualType PointeeType; 1903 if (const auto *PT = getAs<PointerType>()) 1904 PointeeType = PT->getPointeeType(); 1905 else if (const auto *RT = getAs<ReferenceType>()) 1906 PointeeType = RT->getPointeeType(); 1907 else 1908 return nullptr; 1909 1910 if (const auto *RT = PointeeType->getAs<RecordType>()) 1911 return dyn_cast<CXXRecordDecl>(RT->getDecl()); 1912 1913 return nullptr; 1914 } 1915 1916 CXXRecordDecl *Type::getAsCXXRecordDecl() const { 1917 return dyn_cast_or_null<CXXRecordDecl>(getAsTagDecl()); 1918 } 1919 1920 RecordDecl *Type::getAsRecordDecl() const { 1921 return dyn_cast_or_null<RecordDecl>(getAsTagDecl()); 1922 } 1923 1924 TagDecl *Type::getAsTagDecl() const { 1925 if (const auto *TT = getAs<TagType>()) 1926 return TT->getDecl(); 1927 if (const auto *Injected = getAs<InjectedClassNameType>()) 1928 return Injected->getDecl(); 1929 1930 return nullptr; 1931 } 1932 1933 bool Type::hasAttr(attr::Kind AK) const { 1934 const Type *Cur = this; 1935 while (const auto *AT = Cur->getAs<AttributedType>()) { 1936 if (AT->getAttrKind() == AK) 1937 return true; 1938 Cur = AT->getEquivalentType().getTypePtr(); 1939 } 1940 return false; 1941 } 1942 1943 namespace { 1944 1945 class GetContainedDeducedTypeVisitor : 1946 public TypeVisitor<GetContainedDeducedTypeVisitor, Type*> { 1947 bool Syntactic; 1948 1949 public: 1950 GetContainedDeducedTypeVisitor(bool Syntactic = false) 1951 : Syntactic(Syntactic) {} 1952 1953 using TypeVisitor<GetContainedDeducedTypeVisitor, Type*>::Visit; 1954 1955 Type *Visit(QualType T) { 1956 if (T.isNull()) 1957 return nullptr; 1958 return Visit(T.getTypePtr()); 1959 } 1960 1961 // The deduced type itself. 1962 Type *VisitDeducedType(const DeducedType *AT) { 1963 return const_cast<DeducedType*>(AT); 1964 } 1965 1966 // Only these types can contain the desired 'auto' type. 1967 Type *VisitSubstTemplateTypeParmType(const SubstTemplateTypeParmType *T) { 1968 return Visit(T->getReplacementType()); 1969 } 1970 1971 Type *VisitElaboratedType(const ElaboratedType *T) { 1972 return Visit(T->getNamedType()); 1973 } 1974 1975 Type *VisitPointerType(const PointerType *T) { 1976 return Visit(T->getPointeeType()); 1977 } 1978 1979 Type *VisitBlockPointerType(const BlockPointerType *T) { 1980 return Visit(T->getPointeeType()); 1981 } 1982 1983 Type *VisitReferenceType(const ReferenceType *T) { 1984 return Visit(T->getPointeeTypeAsWritten()); 1985 } 1986 1987 Type *VisitMemberPointerType(const MemberPointerType *T) { 1988 return Visit(T->getPointeeType()); 1989 } 1990 1991 Type *VisitArrayType(const ArrayType *T) { 1992 return Visit(T->getElementType()); 1993 } 1994 1995 Type *VisitDependentSizedExtVectorType( 1996 const DependentSizedExtVectorType *T) { 1997 return Visit(T->getElementType()); 1998 } 1999 2000 Type *VisitVectorType(const VectorType *T) { 2001 return Visit(T->getElementType()); 2002 } 2003 2004 Type *VisitDependentSizedMatrixType(const DependentSizedMatrixType *T) { 2005 return Visit(T->getElementType()); 2006 } 2007 2008 Type *VisitConstantMatrixType(const ConstantMatrixType *T) { 2009 return Visit(T->getElementType()); 2010 } 2011 2012 Type *VisitFunctionProtoType(const FunctionProtoType *T) { 2013 if (Syntactic && T->hasTrailingReturn()) 2014 return const_cast<FunctionProtoType*>(T); 2015 return VisitFunctionType(T); 2016 } 2017 2018 Type *VisitFunctionType(const FunctionType *T) { 2019 return Visit(T->getReturnType()); 2020 } 2021 2022 Type *VisitParenType(const ParenType *T) { 2023 return Visit(T->getInnerType()); 2024 } 2025 2026 Type *VisitAttributedType(const AttributedType *T) { 2027 return Visit(T->getModifiedType()); 2028 } 2029 2030 Type *VisitMacroQualifiedType(const MacroQualifiedType *T) { 2031 return Visit(T->getUnderlyingType()); 2032 } 2033 2034 Type *VisitAdjustedType(const AdjustedType *T) { 2035 return Visit(T->getOriginalType()); 2036 } 2037 2038 Type *VisitPackExpansionType(const PackExpansionType *T) { 2039 return Visit(T->getPattern()); 2040 } 2041 }; 2042 2043 } // namespace 2044 2045 DeducedType *Type::getContainedDeducedType() const { 2046 return cast_or_null<DeducedType>( 2047 GetContainedDeducedTypeVisitor().Visit(this)); 2048 } 2049 2050 bool Type::hasAutoForTrailingReturnType() const { 2051 return isa_and_nonnull<FunctionType>( 2052 GetContainedDeducedTypeVisitor(true).Visit(this)); 2053 } 2054 2055 bool Type::hasIntegerRepresentation() const { 2056 if (const auto *VT = dyn_cast<VectorType>(CanonicalType)) 2057 return VT->getElementType()->isIntegerType(); 2058 if (CanonicalType->isSveVLSBuiltinType()) { 2059 const auto *VT = cast<BuiltinType>(CanonicalType); 2060 return VT->getKind() == BuiltinType::SveBool || 2061 (VT->getKind() >= BuiltinType::SveInt8 && 2062 VT->getKind() <= BuiltinType::SveUint64); 2063 } 2064 if (CanonicalType->isRVVVLSBuiltinType()) { 2065 const auto *VT = cast<BuiltinType>(CanonicalType); 2066 return (VT->getKind() >= BuiltinType::RvvInt8mf8 && 2067 VT->getKind() <= BuiltinType::RvvUint64m8); 2068 } 2069 2070 return isIntegerType(); 2071 } 2072 2073 /// Determine whether this type is an integral type. 2074 /// 2075 /// This routine determines whether the given type is an integral type per 2076 /// C++ [basic.fundamental]p7. Although the C standard does not define the 2077 /// term "integral type", it has a similar term "integer type", and in C++ 2078 /// the two terms are equivalent. However, C's "integer type" includes 2079 /// enumeration types, while C++'s "integer type" does not. The \c ASTContext 2080 /// parameter is used to determine whether we should be following the C or 2081 /// C++ rules when determining whether this type is an integral/integer type. 2082 /// 2083 /// For cases where C permits "an integer type" and C++ permits "an integral 2084 /// type", use this routine. 2085 /// 2086 /// For cases where C permits "an integer type" and C++ permits "an integral 2087 /// or enumeration type", use \c isIntegralOrEnumerationType() instead. 2088 /// 2089 /// \param Ctx The context in which this type occurs. 2090 /// 2091 /// \returns true if the type is considered an integral type, false otherwise. 2092 bool Type::isIntegralType(const ASTContext &Ctx) const { 2093 if (const auto *BT = dyn_cast<BuiltinType>(CanonicalType)) 2094 return BT->getKind() >= BuiltinType::Bool && 2095 BT->getKind() <= BuiltinType::Int128; 2096 2097 // Complete enum types are integral in C. 2098 if (!Ctx.getLangOpts().CPlusPlus) 2099 if (const auto *ET = dyn_cast<EnumType>(CanonicalType)) 2100 return ET->getDecl()->isComplete(); 2101 2102 return isBitIntType(); 2103 } 2104 2105 bool Type::isIntegralOrUnscopedEnumerationType() const { 2106 if (const auto *BT = dyn_cast<BuiltinType>(CanonicalType)) 2107 return BT->getKind() >= BuiltinType::Bool && 2108 BT->getKind() <= BuiltinType::Int128; 2109 2110 if (isBitIntType()) 2111 return true; 2112 2113 return isUnscopedEnumerationType(); 2114 } 2115 2116 bool Type::isUnscopedEnumerationType() const { 2117 if (const auto *ET = dyn_cast<EnumType>(CanonicalType)) 2118 return !ET->getDecl()->isScoped(); 2119 2120 return false; 2121 } 2122 2123 bool Type::isCharType() const { 2124 if (const auto *BT = dyn_cast<BuiltinType>(CanonicalType)) 2125 return BT->getKind() == BuiltinType::Char_U || 2126 BT->getKind() == BuiltinType::UChar || 2127 BT->getKind() == BuiltinType::Char_S || 2128 BT->getKind() == BuiltinType::SChar; 2129 return false; 2130 } 2131 2132 bool Type::isWideCharType() const { 2133 if (const auto *BT = dyn_cast<BuiltinType>(CanonicalType)) 2134 return BT->getKind() == BuiltinType::WChar_S || 2135 BT->getKind() == BuiltinType::WChar_U; 2136 return false; 2137 } 2138 2139 bool Type::isChar8Type() const { 2140 if (const BuiltinType *BT = dyn_cast<BuiltinType>(CanonicalType)) 2141 return BT->getKind() == BuiltinType::Char8; 2142 return false; 2143 } 2144 2145 bool Type::isChar16Type() const { 2146 if (const auto *BT = dyn_cast<BuiltinType>(CanonicalType)) 2147 return BT->getKind() == BuiltinType::Char16; 2148 return false; 2149 } 2150 2151 bool Type::isChar32Type() const { 2152 if (const auto *BT = dyn_cast<BuiltinType>(CanonicalType)) 2153 return BT->getKind() == BuiltinType::Char32; 2154 return false; 2155 } 2156 2157 /// Determine whether this type is any of the built-in character 2158 /// types. 2159 bool Type::isAnyCharacterType() const { 2160 const auto *BT = dyn_cast<BuiltinType>(CanonicalType); 2161 if (!BT) return false; 2162 switch (BT->getKind()) { 2163 default: return false; 2164 case BuiltinType::Char_U: 2165 case BuiltinType::UChar: 2166 case BuiltinType::WChar_U: 2167 case BuiltinType::Char8: 2168 case BuiltinType::Char16: 2169 case BuiltinType::Char32: 2170 case BuiltinType::Char_S: 2171 case BuiltinType::SChar: 2172 case BuiltinType::WChar_S: 2173 return true; 2174 } 2175 } 2176 2177 /// isSignedIntegerType - Return true if this is an integer type that is 2178 /// signed, according to C99 6.2.5p4 [char, signed char, short, int, long..], 2179 /// an enum decl which has a signed representation 2180 bool Type::isSignedIntegerType() const { 2181 if (const auto *BT = dyn_cast<BuiltinType>(CanonicalType)) { 2182 return BT->getKind() >= BuiltinType::Char_S && 2183 BT->getKind() <= BuiltinType::Int128; 2184 } 2185 2186 if (const EnumType *ET = dyn_cast<EnumType>(CanonicalType)) { 2187 // Incomplete enum types are not treated as integer types. 2188 // FIXME: In C++, enum types are never integer types. 2189 if (ET->getDecl()->isComplete() && !ET->getDecl()->isScoped()) 2190 return ET->getDecl()->getIntegerType()->isSignedIntegerType(); 2191 } 2192 2193 if (const auto *IT = dyn_cast<BitIntType>(CanonicalType)) 2194 return IT->isSigned(); 2195 if (const auto *IT = dyn_cast<DependentBitIntType>(CanonicalType)) 2196 return IT->isSigned(); 2197 2198 return false; 2199 } 2200 2201 bool Type::isSignedIntegerOrEnumerationType() const { 2202 if (const auto *BT = dyn_cast<BuiltinType>(CanonicalType)) { 2203 return BT->getKind() >= BuiltinType::Char_S && 2204 BT->getKind() <= BuiltinType::Int128; 2205 } 2206 2207 if (const auto *ET = dyn_cast<EnumType>(CanonicalType)) { 2208 if (ET->getDecl()->isComplete()) 2209 return ET->getDecl()->getIntegerType()->isSignedIntegerType(); 2210 } 2211 2212 if (const auto *IT = dyn_cast<BitIntType>(CanonicalType)) 2213 return IT->isSigned(); 2214 if (const auto *IT = dyn_cast<DependentBitIntType>(CanonicalType)) 2215 return IT->isSigned(); 2216 2217 return false; 2218 } 2219 2220 bool Type::hasSignedIntegerRepresentation() const { 2221 if (const auto *VT = dyn_cast<VectorType>(CanonicalType)) 2222 return VT->getElementType()->isSignedIntegerOrEnumerationType(); 2223 else 2224 return isSignedIntegerOrEnumerationType(); 2225 } 2226 2227 /// isUnsignedIntegerType - Return true if this is an integer type that is 2228 /// unsigned, according to C99 6.2.5p6 [which returns true for _Bool], an enum 2229 /// decl which has an unsigned representation 2230 bool Type::isUnsignedIntegerType() const { 2231 if (const auto *BT = dyn_cast<BuiltinType>(CanonicalType)) { 2232 return BT->getKind() >= BuiltinType::Bool && 2233 BT->getKind() <= BuiltinType::UInt128; 2234 } 2235 2236 if (const auto *ET = dyn_cast<EnumType>(CanonicalType)) { 2237 // Incomplete enum types are not treated as integer types. 2238 // FIXME: In C++, enum types are never integer types. 2239 if (ET->getDecl()->isComplete() && !ET->getDecl()->isScoped()) 2240 return ET->getDecl()->getIntegerType()->isUnsignedIntegerType(); 2241 } 2242 2243 if (const auto *IT = dyn_cast<BitIntType>(CanonicalType)) 2244 return IT->isUnsigned(); 2245 if (const auto *IT = dyn_cast<DependentBitIntType>(CanonicalType)) 2246 return IT->isUnsigned(); 2247 2248 return false; 2249 } 2250 2251 bool Type::isUnsignedIntegerOrEnumerationType() const { 2252 if (const auto *BT = dyn_cast<BuiltinType>(CanonicalType)) { 2253 return BT->getKind() >= BuiltinType::Bool && 2254 BT->getKind() <= BuiltinType::UInt128; 2255 } 2256 2257 if (const auto *ET = dyn_cast<EnumType>(CanonicalType)) { 2258 if (ET->getDecl()->isComplete()) 2259 return ET->getDecl()->getIntegerType()->isUnsignedIntegerType(); 2260 } 2261 2262 if (const auto *IT = dyn_cast<BitIntType>(CanonicalType)) 2263 return IT->isUnsigned(); 2264 if (const auto *IT = dyn_cast<DependentBitIntType>(CanonicalType)) 2265 return IT->isUnsigned(); 2266 2267 return false; 2268 } 2269 2270 bool Type::hasUnsignedIntegerRepresentation() const { 2271 if (const auto *VT = dyn_cast<VectorType>(CanonicalType)) 2272 return VT->getElementType()->isUnsignedIntegerOrEnumerationType(); 2273 if (const auto *VT = dyn_cast<MatrixType>(CanonicalType)) 2274 return VT->getElementType()->isUnsignedIntegerOrEnumerationType(); 2275 if (CanonicalType->isSveVLSBuiltinType()) { 2276 const auto *VT = cast<BuiltinType>(CanonicalType); 2277 return VT->getKind() >= BuiltinType::SveUint8 && 2278 VT->getKind() <= BuiltinType::SveUint64; 2279 } 2280 return isUnsignedIntegerOrEnumerationType(); 2281 } 2282 2283 bool Type::isFloatingType() const { 2284 if (const auto *BT = dyn_cast<BuiltinType>(CanonicalType)) 2285 return BT->getKind() >= BuiltinType::Half && 2286 BT->getKind() <= BuiltinType::Ibm128; 2287 if (const auto *CT = dyn_cast<ComplexType>(CanonicalType)) 2288 return CT->getElementType()->isFloatingType(); 2289 return false; 2290 } 2291 2292 bool Type::hasFloatingRepresentation() const { 2293 if (const auto *VT = dyn_cast<VectorType>(CanonicalType)) 2294 return VT->getElementType()->isFloatingType(); 2295 if (const auto *MT = dyn_cast<MatrixType>(CanonicalType)) 2296 return MT->getElementType()->isFloatingType(); 2297 return isFloatingType(); 2298 } 2299 2300 bool Type::isRealFloatingType() const { 2301 if (const auto *BT = dyn_cast<BuiltinType>(CanonicalType)) 2302 return BT->isFloatingPoint(); 2303 return false; 2304 } 2305 2306 bool Type::isRealType() const { 2307 if (const auto *BT = dyn_cast<BuiltinType>(CanonicalType)) 2308 return BT->getKind() >= BuiltinType::Bool && 2309 BT->getKind() <= BuiltinType::Ibm128; 2310 if (const auto *ET = dyn_cast<EnumType>(CanonicalType)) 2311 return ET->getDecl()->isComplete() && !ET->getDecl()->isScoped(); 2312 return isBitIntType(); 2313 } 2314 2315 bool Type::isArithmeticType() const { 2316 if (const auto *BT = dyn_cast<BuiltinType>(CanonicalType)) 2317 return BT->getKind() >= BuiltinType::Bool && 2318 BT->getKind() <= BuiltinType::Ibm128; 2319 if (const auto *ET = dyn_cast<EnumType>(CanonicalType)) 2320 // GCC allows forward declaration of enum types (forbid by C99 6.7.2.3p2). 2321 // If a body isn't seen by the time we get here, return false. 2322 // 2323 // C++0x: Enumerations are not arithmetic types. For now, just return 2324 // false for scoped enumerations since that will disable any 2325 // unwanted implicit conversions. 2326 return !ET->getDecl()->isScoped() && ET->getDecl()->isComplete(); 2327 return isa<ComplexType>(CanonicalType) || isBitIntType(); 2328 } 2329 2330 Type::ScalarTypeKind Type::getScalarTypeKind() const { 2331 assert(isScalarType()); 2332 2333 const Type *T = CanonicalType.getTypePtr(); 2334 if (const auto *BT = dyn_cast<BuiltinType>(T)) { 2335 if (BT->getKind() == BuiltinType::Bool) return STK_Bool; 2336 if (BT->getKind() == BuiltinType::NullPtr) return STK_CPointer; 2337 if (BT->isInteger()) return STK_Integral; 2338 if (BT->isFloatingPoint()) return STK_Floating; 2339 if (BT->isFixedPointType()) return STK_FixedPoint; 2340 llvm_unreachable("unknown scalar builtin type"); 2341 } else if (isa<PointerType>(T)) { 2342 return STK_CPointer; 2343 } else if (isa<BlockPointerType>(T)) { 2344 return STK_BlockPointer; 2345 } else if (isa<ObjCObjectPointerType>(T)) { 2346 return STK_ObjCObjectPointer; 2347 } else if (isa<MemberPointerType>(T)) { 2348 return STK_MemberPointer; 2349 } else if (isa<EnumType>(T)) { 2350 assert(cast<EnumType>(T)->getDecl()->isComplete()); 2351 return STK_Integral; 2352 } else if (const auto *CT = dyn_cast<ComplexType>(T)) { 2353 if (CT->getElementType()->isRealFloatingType()) 2354 return STK_FloatingComplex; 2355 return STK_IntegralComplex; 2356 } else if (isBitIntType()) { 2357 return STK_Integral; 2358 } 2359 2360 llvm_unreachable("unknown scalar type"); 2361 } 2362 2363 /// Determines whether the type is a C++ aggregate type or C 2364 /// aggregate or union type. 2365 /// 2366 /// An aggregate type is an array or a class type (struct, union, or 2367 /// class) that has no user-declared constructors, no private or 2368 /// protected non-static data members, no base classes, and no virtual 2369 /// functions (C++ [dcl.init.aggr]p1). The notion of an aggregate type 2370 /// subsumes the notion of C aggregates (C99 6.2.5p21) because it also 2371 /// includes union types. 2372 bool Type::isAggregateType() const { 2373 if (const auto *Record = dyn_cast<RecordType>(CanonicalType)) { 2374 if (const auto *ClassDecl = dyn_cast<CXXRecordDecl>(Record->getDecl())) 2375 return ClassDecl->isAggregate(); 2376 2377 return true; 2378 } 2379 2380 return isa<ArrayType>(CanonicalType); 2381 } 2382 2383 /// isConstantSizeType - Return true if this is not a variable sized type, 2384 /// according to the rules of C99 6.7.5p3. It is not legal to call this on 2385 /// incomplete types or dependent types. 2386 bool Type::isConstantSizeType() const { 2387 assert(!isIncompleteType() && "This doesn't make sense for incomplete types"); 2388 assert(!isDependentType() && "This doesn't make sense for dependent types"); 2389 // The VAT must have a size, as it is known to be complete. 2390 return !isa<VariableArrayType>(CanonicalType); 2391 } 2392 2393 /// isIncompleteType - Return true if this is an incomplete type (C99 6.2.5p1) 2394 /// - a type that can describe objects, but which lacks information needed to 2395 /// determine its size. 2396 bool Type::isIncompleteType(NamedDecl **Def) const { 2397 if (Def) 2398 *Def = nullptr; 2399 2400 switch (CanonicalType->getTypeClass()) { 2401 default: return false; 2402 case Builtin: 2403 // Void is the only incomplete builtin type. Per C99 6.2.5p19, it can never 2404 // be completed. 2405 return isVoidType(); 2406 case Enum: { 2407 EnumDecl *EnumD = cast<EnumType>(CanonicalType)->getDecl(); 2408 if (Def) 2409 *Def = EnumD; 2410 return !EnumD->isComplete(); 2411 } 2412 case Record: { 2413 // A tagged type (struct/union/enum/class) is incomplete if the decl is a 2414 // forward declaration, but not a full definition (C99 6.2.5p22). 2415 RecordDecl *Rec = cast<RecordType>(CanonicalType)->getDecl(); 2416 if (Def) 2417 *Def = Rec; 2418 return !Rec->isCompleteDefinition(); 2419 } 2420 case InjectedClassName: { 2421 CXXRecordDecl *Rec = cast<InjectedClassNameType>(CanonicalType)->getDecl(); 2422 if (!Rec->isBeingDefined()) 2423 return false; 2424 if (Def) 2425 *Def = Rec; 2426 return true; 2427 } 2428 case ConstantArray: 2429 case VariableArray: 2430 // An array is incomplete if its element type is incomplete 2431 // (C++ [dcl.array]p1). 2432 // We don't handle dependent-sized arrays (dependent types are never treated 2433 // as incomplete). 2434 return cast<ArrayType>(CanonicalType)->getElementType() 2435 ->isIncompleteType(Def); 2436 case IncompleteArray: 2437 // An array of unknown size is an incomplete type (C99 6.2.5p22). 2438 return true; 2439 case MemberPointer: { 2440 // Member pointers in the MS ABI have special behavior in 2441 // RequireCompleteType: they attach a MSInheritanceAttr to the CXXRecordDecl 2442 // to indicate which inheritance model to use. 2443 auto *MPTy = cast<MemberPointerType>(CanonicalType); 2444 const Type *ClassTy = MPTy->getClass(); 2445 // Member pointers with dependent class types don't get special treatment. 2446 if (ClassTy->isDependentType()) 2447 return false; 2448 const CXXRecordDecl *RD = ClassTy->getAsCXXRecordDecl(); 2449 ASTContext &Context = RD->getASTContext(); 2450 // Member pointers not in the MS ABI don't get special treatment. 2451 if (!Context.getTargetInfo().getCXXABI().isMicrosoft()) 2452 return false; 2453 // The inheritance attribute might only be present on the most recent 2454 // CXXRecordDecl, use that one. 2455 RD = RD->getMostRecentNonInjectedDecl(); 2456 // Nothing interesting to do if the inheritance attribute is already set. 2457 if (RD->hasAttr<MSInheritanceAttr>()) 2458 return false; 2459 return true; 2460 } 2461 case ObjCObject: 2462 return cast<ObjCObjectType>(CanonicalType)->getBaseType() 2463 ->isIncompleteType(Def); 2464 case ObjCInterface: { 2465 // ObjC interfaces are incomplete if they are @class, not @interface. 2466 ObjCInterfaceDecl *Interface 2467 = cast<ObjCInterfaceType>(CanonicalType)->getDecl(); 2468 if (Def) 2469 *Def = Interface; 2470 return !Interface->hasDefinition(); 2471 } 2472 } 2473 } 2474 2475 bool Type::isSizelessBuiltinType() const { 2476 if (isSizelessVectorType()) 2477 return true; 2478 2479 if (const BuiltinType *BT = getAs<BuiltinType>()) { 2480 switch (BT->getKind()) { 2481 // WebAssembly reference types 2482 #define WASM_TYPE(Name, Id, SingletonId) case BuiltinType::Id: 2483 #include "clang/Basic/WebAssemblyReferenceTypes.def" 2484 // HLSL intangible types 2485 #define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) case BuiltinType::Id: 2486 #include "clang/Basic/HLSLIntangibleTypes.def" 2487 return true; 2488 default: 2489 return false; 2490 } 2491 } 2492 return false; 2493 } 2494 2495 bool Type::isWebAssemblyExternrefType() const { 2496 if (const auto *BT = getAs<BuiltinType>()) 2497 return BT->getKind() == BuiltinType::WasmExternRef; 2498 return false; 2499 } 2500 2501 bool Type::isWebAssemblyTableType() const { 2502 if (const auto *ATy = dyn_cast<ArrayType>(this)) 2503 return ATy->getElementType().isWebAssemblyReferenceType(); 2504 2505 if (const auto *PTy = dyn_cast<PointerType>(this)) 2506 return PTy->getPointeeType().isWebAssemblyReferenceType(); 2507 2508 return false; 2509 } 2510 2511 bool Type::isSizelessType() const { return isSizelessBuiltinType(); } 2512 2513 bool Type::isSizelessVectorType() const { 2514 return isSVESizelessBuiltinType() || isRVVSizelessBuiltinType(); 2515 } 2516 2517 bool Type::isSVESizelessBuiltinType() const { 2518 if (const BuiltinType *BT = getAs<BuiltinType>()) { 2519 switch (BT->getKind()) { 2520 // SVE Types 2521 #define SVE_VECTOR_TYPE(Name, MangledName, Id, SingletonId) \ 2522 case BuiltinType::Id: \ 2523 return true; 2524 #define SVE_OPAQUE_TYPE(Name, MangledName, Id, SingletonId) \ 2525 case BuiltinType::Id: \ 2526 return true; 2527 #define SVE_PREDICATE_TYPE(Name, MangledName, Id, SingletonId) \ 2528 case BuiltinType::Id: \ 2529 return true; 2530 #define SVE_TYPE(Name, Id, SingletonId) 2531 #include "clang/Basic/AArch64SVEACLETypes.def" 2532 default: 2533 return false; 2534 } 2535 } 2536 return false; 2537 } 2538 2539 bool Type::isRVVSizelessBuiltinType() const { 2540 if (const BuiltinType *BT = getAs<BuiltinType>()) { 2541 switch (BT->getKind()) { 2542 #define RVV_TYPE(Name, Id, SingletonId) case BuiltinType::Id: 2543 #include "clang/Basic/RISCVVTypes.def" 2544 return true; 2545 default: 2546 return false; 2547 } 2548 } 2549 return false; 2550 } 2551 2552 bool Type::isSveVLSBuiltinType() const { 2553 if (const BuiltinType *BT = getAs<BuiltinType>()) { 2554 switch (BT->getKind()) { 2555 case BuiltinType::SveInt8: 2556 case BuiltinType::SveInt16: 2557 case BuiltinType::SveInt32: 2558 case BuiltinType::SveInt64: 2559 case BuiltinType::SveUint8: 2560 case BuiltinType::SveUint16: 2561 case BuiltinType::SveUint32: 2562 case BuiltinType::SveUint64: 2563 case BuiltinType::SveFloat16: 2564 case BuiltinType::SveFloat32: 2565 case BuiltinType::SveFloat64: 2566 case BuiltinType::SveBFloat16: 2567 case BuiltinType::SveBool: 2568 case BuiltinType::SveBoolx2: 2569 case BuiltinType::SveBoolx4: 2570 case BuiltinType::SveMFloat8: 2571 return true; 2572 default: 2573 return false; 2574 } 2575 } 2576 return false; 2577 } 2578 2579 QualType Type::getSizelessVectorEltType(const ASTContext &Ctx) const { 2580 assert(isSizelessVectorType() && "Must be sizeless vector type"); 2581 // Currently supports SVE and RVV 2582 if (isSVESizelessBuiltinType()) 2583 return getSveEltType(Ctx); 2584 2585 if (isRVVSizelessBuiltinType()) 2586 return getRVVEltType(Ctx); 2587 2588 llvm_unreachable("Unhandled type"); 2589 } 2590 2591 QualType Type::getSveEltType(const ASTContext &Ctx) const { 2592 assert(isSveVLSBuiltinType() && "unsupported type!"); 2593 2594 const BuiltinType *BTy = castAs<BuiltinType>(); 2595 if (BTy->getKind() == BuiltinType::SveBool) 2596 // Represent predicates as i8 rather than i1 to avoid any layout issues. 2597 // The type is bitcasted to a scalable predicate type when casting between 2598 // scalable and fixed-length vectors. 2599 return Ctx.UnsignedCharTy; 2600 else 2601 return Ctx.getBuiltinVectorTypeInfo(BTy).ElementType; 2602 } 2603 2604 bool Type::isRVVVLSBuiltinType() const { 2605 if (const BuiltinType *BT = getAs<BuiltinType>()) { 2606 switch (BT->getKind()) { 2607 #define RVV_VECTOR_TYPE(Name, Id, SingletonId, NumEls, ElBits, NF, IsSigned, \ 2608 IsFP, IsBF) \ 2609 case BuiltinType::Id: \ 2610 return NF == 1; 2611 #define RVV_PREDICATE_TYPE(Name, Id, SingletonId, NumEls) \ 2612 case BuiltinType::Id: \ 2613 return true; 2614 #include "clang/Basic/RISCVVTypes.def" 2615 default: 2616 return false; 2617 } 2618 } 2619 return false; 2620 } 2621 2622 QualType Type::getRVVEltType(const ASTContext &Ctx) const { 2623 assert(isRVVVLSBuiltinType() && "unsupported type!"); 2624 2625 const BuiltinType *BTy = castAs<BuiltinType>(); 2626 2627 switch (BTy->getKind()) { 2628 #define RVV_PREDICATE_TYPE(Name, Id, SingletonId, NumEls) \ 2629 case BuiltinType::Id: \ 2630 return Ctx.UnsignedCharTy; 2631 default: 2632 return Ctx.getBuiltinVectorTypeInfo(BTy).ElementType; 2633 #include "clang/Basic/RISCVVTypes.def" 2634 } 2635 2636 llvm_unreachable("Unhandled type"); 2637 } 2638 2639 bool QualType::isPODType(const ASTContext &Context) const { 2640 // C++11 has a more relaxed definition of POD. 2641 if (Context.getLangOpts().CPlusPlus11) 2642 return isCXX11PODType(Context); 2643 2644 return isCXX98PODType(Context); 2645 } 2646 2647 bool QualType::isCXX98PODType(const ASTContext &Context) const { 2648 // The compiler shouldn't query this for incomplete types, but the user might. 2649 // We return false for that case. Except for incomplete arrays of PODs, which 2650 // are PODs according to the standard. 2651 if (isNull()) 2652 return false; 2653 2654 if ((*this)->isIncompleteArrayType()) 2655 return Context.getBaseElementType(*this).isCXX98PODType(Context); 2656 2657 if ((*this)->isIncompleteType()) 2658 return false; 2659 2660 if (hasNonTrivialObjCLifetime()) 2661 return false; 2662 2663 QualType CanonicalType = getTypePtr()->CanonicalType; 2664 switch (CanonicalType->getTypeClass()) { 2665 // Everything not explicitly mentioned is not POD. 2666 default: return false; 2667 case Type::VariableArray: 2668 case Type::ConstantArray: 2669 // IncompleteArray is handled above. 2670 return Context.getBaseElementType(*this).isCXX98PODType(Context); 2671 2672 case Type::ObjCObjectPointer: 2673 case Type::BlockPointer: 2674 case Type::Builtin: 2675 case Type::Complex: 2676 case Type::Pointer: 2677 case Type::MemberPointer: 2678 case Type::Vector: 2679 case Type::ExtVector: 2680 case Type::BitInt: 2681 return true; 2682 2683 case Type::Enum: 2684 return true; 2685 2686 case Type::Record: 2687 if (const auto *ClassDecl = 2688 dyn_cast<CXXRecordDecl>(cast<RecordType>(CanonicalType)->getDecl())) 2689 return ClassDecl->isPOD(); 2690 2691 // C struct/union is POD. 2692 return true; 2693 } 2694 } 2695 2696 bool QualType::isTrivialType(const ASTContext &Context) const { 2697 // The compiler shouldn't query this for incomplete types, but the user might. 2698 // We return false for that case. Except for incomplete arrays of PODs, which 2699 // are PODs according to the standard. 2700 if (isNull()) 2701 return false; 2702 2703 if ((*this)->isArrayType()) 2704 return Context.getBaseElementType(*this).isTrivialType(Context); 2705 2706 if ((*this)->isSizelessBuiltinType()) 2707 return true; 2708 2709 // Return false for incomplete types after skipping any incomplete array 2710 // types which are expressly allowed by the standard and thus our API. 2711 if ((*this)->isIncompleteType()) 2712 return false; 2713 2714 if (hasNonTrivialObjCLifetime()) 2715 return false; 2716 2717 QualType CanonicalType = getTypePtr()->CanonicalType; 2718 if (CanonicalType->isDependentType()) 2719 return false; 2720 2721 // C++0x [basic.types]p9: 2722 // Scalar types, trivial class types, arrays of such types, and 2723 // cv-qualified versions of these types are collectively called trivial 2724 // types. 2725 2726 // As an extension, Clang treats vector types as Scalar types. 2727 if (CanonicalType->isScalarType() || CanonicalType->isVectorType()) 2728 return true; 2729 if (const auto *RT = CanonicalType->getAs<RecordType>()) { 2730 if (const auto *ClassDecl = dyn_cast<CXXRecordDecl>(RT->getDecl())) { 2731 // C++20 [class]p6: 2732 // A trivial class is a class that is trivially copyable, and 2733 // has one or more eligible default constructors such that each is 2734 // trivial. 2735 // FIXME: We should merge this definition of triviality into 2736 // CXXRecordDecl::isTrivial. Currently it computes the wrong thing. 2737 return ClassDecl->hasTrivialDefaultConstructor() && 2738 !ClassDecl->hasNonTrivialDefaultConstructor() && 2739 ClassDecl->isTriviallyCopyable(); 2740 } 2741 2742 return true; 2743 } 2744 2745 // No other types can match. 2746 return false; 2747 } 2748 2749 static bool isTriviallyCopyableTypeImpl(const QualType &type, 2750 const ASTContext &Context, 2751 bool IsCopyConstructible) { 2752 if (type->isArrayType()) 2753 return isTriviallyCopyableTypeImpl(Context.getBaseElementType(type), 2754 Context, IsCopyConstructible); 2755 2756 if (type.hasNonTrivialObjCLifetime()) 2757 return false; 2758 2759 // C++11 [basic.types]p9 - See Core 2094 2760 // Scalar types, trivially copyable class types, arrays of such types, and 2761 // cv-qualified versions of these types are collectively 2762 // called trivially copy constructible types. 2763 2764 QualType CanonicalType = type.getCanonicalType(); 2765 if (CanonicalType->isDependentType()) 2766 return false; 2767 2768 if (CanonicalType->isSizelessBuiltinType()) 2769 return true; 2770 2771 // Return false for incomplete types after skipping any incomplete array types 2772 // which are expressly allowed by the standard and thus our API. 2773 if (CanonicalType->isIncompleteType()) 2774 return false; 2775 2776 // As an extension, Clang treats vector types as Scalar types. 2777 if (CanonicalType->isScalarType() || CanonicalType->isVectorType()) 2778 return true; 2779 2780 if (const auto *RT = CanonicalType->getAs<RecordType>()) { 2781 if (const auto *ClassDecl = dyn_cast<CXXRecordDecl>(RT->getDecl())) { 2782 if (IsCopyConstructible) { 2783 return ClassDecl->isTriviallyCopyConstructible(); 2784 } else { 2785 return ClassDecl->isTriviallyCopyable(); 2786 } 2787 } 2788 return true; 2789 } 2790 // No other types can match. 2791 return false; 2792 } 2793 2794 bool QualType::isTriviallyCopyableType(const ASTContext &Context) const { 2795 return isTriviallyCopyableTypeImpl(*this, Context, 2796 /*IsCopyConstructible=*/false); 2797 } 2798 2799 // FIXME: each call will trigger a full computation, cache the result. 2800 bool QualType::isBitwiseCloneableType(const ASTContext &Context) const { 2801 auto CanonicalType = getCanonicalType(); 2802 if (CanonicalType.hasNonTrivialObjCLifetime()) 2803 return false; 2804 if (CanonicalType->isArrayType()) 2805 return Context.getBaseElementType(CanonicalType) 2806 .isBitwiseCloneableType(Context); 2807 2808 if (CanonicalType->isIncompleteType()) 2809 return false; 2810 const auto *RD = CanonicalType->getAsRecordDecl(); // struct/union/class 2811 if (!RD) 2812 return true; 2813 2814 // Never allow memcpy when we're adding poisoned padding bits to the struct. 2815 // Accessing these posioned bits will trigger false alarms on 2816 // SanitizeAddressFieldPadding etc. 2817 if (RD->mayInsertExtraPadding()) 2818 return false; 2819 2820 for (auto *const Field : RD->fields()) { 2821 if (!Field->getType().isBitwiseCloneableType(Context)) 2822 return false; 2823 } 2824 2825 if (const auto *CXXRD = dyn_cast<CXXRecordDecl>(RD)) { 2826 for (auto Base : CXXRD->bases()) 2827 if (!Base.getType().isBitwiseCloneableType(Context)) 2828 return false; 2829 for (auto VBase : CXXRD->vbases()) 2830 if (!VBase.getType().isBitwiseCloneableType(Context)) 2831 return false; 2832 } 2833 return true; 2834 } 2835 2836 bool QualType::isTriviallyCopyConstructibleType( 2837 const ASTContext &Context) const { 2838 return isTriviallyCopyableTypeImpl(*this, Context, 2839 /*IsCopyConstructible=*/true); 2840 } 2841 2842 bool QualType::isTriviallyRelocatableType(const ASTContext &Context) const { 2843 QualType BaseElementType = Context.getBaseElementType(*this); 2844 2845 if (BaseElementType->isIncompleteType()) { 2846 return false; 2847 } else if (!BaseElementType->isObjectType()) { 2848 return false; 2849 } else if (const auto *RD = BaseElementType->getAsRecordDecl()) { 2850 return RD->canPassInRegisters(); 2851 } else if (BaseElementType.isTriviallyCopyableType(Context)) { 2852 return true; 2853 } else { 2854 switch (isNonTrivialToPrimitiveDestructiveMove()) { 2855 case PCK_Trivial: 2856 return !isDestructedType(); 2857 case PCK_ARCStrong: 2858 return true; 2859 default: 2860 return false; 2861 } 2862 } 2863 } 2864 2865 bool QualType::isNonWeakInMRRWithObjCWeak(const ASTContext &Context) const { 2866 return !Context.getLangOpts().ObjCAutoRefCount && 2867 Context.getLangOpts().ObjCWeak && 2868 getObjCLifetime() != Qualifiers::OCL_Weak; 2869 } 2870 2871 bool QualType::hasNonTrivialToPrimitiveDefaultInitializeCUnion(const RecordDecl *RD) { 2872 return RD->hasNonTrivialToPrimitiveDefaultInitializeCUnion(); 2873 } 2874 2875 bool QualType::hasNonTrivialToPrimitiveDestructCUnion(const RecordDecl *RD) { 2876 return RD->hasNonTrivialToPrimitiveDestructCUnion(); 2877 } 2878 2879 bool QualType::hasNonTrivialToPrimitiveCopyCUnion(const RecordDecl *RD) { 2880 return RD->hasNonTrivialToPrimitiveCopyCUnion(); 2881 } 2882 2883 bool QualType::isWebAssemblyReferenceType() const { 2884 return isWebAssemblyExternrefType() || isWebAssemblyFuncrefType(); 2885 } 2886 2887 bool QualType::isWebAssemblyExternrefType() const { 2888 return getTypePtr()->isWebAssemblyExternrefType(); 2889 } 2890 2891 bool QualType::isWebAssemblyFuncrefType() const { 2892 return getTypePtr()->isFunctionPointerType() && 2893 getAddressSpace() == LangAS::wasm_funcref; 2894 } 2895 2896 QualType::PrimitiveDefaultInitializeKind 2897 QualType::isNonTrivialToPrimitiveDefaultInitialize() const { 2898 if (const auto *RT = 2899 getTypePtr()->getBaseElementTypeUnsafe()->getAs<RecordType>()) 2900 if (RT->getDecl()->isNonTrivialToPrimitiveDefaultInitialize()) 2901 return PDIK_Struct; 2902 2903 switch (getQualifiers().getObjCLifetime()) { 2904 case Qualifiers::OCL_Strong: 2905 return PDIK_ARCStrong; 2906 case Qualifiers::OCL_Weak: 2907 return PDIK_ARCWeak; 2908 default: 2909 return PDIK_Trivial; 2910 } 2911 } 2912 2913 QualType::PrimitiveCopyKind QualType::isNonTrivialToPrimitiveCopy() const { 2914 if (const auto *RT = 2915 getTypePtr()->getBaseElementTypeUnsafe()->getAs<RecordType>()) 2916 if (RT->getDecl()->isNonTrivialToPrimitiveCopy()) 2917 return PCK_Struct; 2918 2919 Qualifiers Qs = getQualifiers(); 2920 switch (Qs.getObjCLifetime()) { 2921 case Qualifiers::OCL_Strong: 2922 return PCK_ARCStrong; 2923 case Qualifiers::OCL_Weak: 2924 return PCK_ARCWeak; 2925 default: 2926 return Qs.hasVolatile() ? PCK_VolatileTrivial : PCK_Trivial; 2927 } 2928 } 2929 2930 QualType::PrimitiveCopyKind 2931 QualType::isNonTrivialToPrimitiveDestructiveMove() const { 2932 return isNonTrivialToPrimitiveCopy(); 2933 } 2934 2935 bool Type::isLiteralType(const ASTContext &Ctx) const { 2936 if (isDependentType()) 2937 return false; 2938 2939 // C++1y [basic.types]p10: 2940 // A type is a literal type if it is: 2941 // -- cv void; or 2942 if (Ctx.getLangOpts().CPlusPlus14 && isVoidType()) 2943 return true; 2944 2945 // C++11 [basic.types]p10: 2946 // A type is a literal type if it is: 2947 // [...] 2948 // -- an array of literal type other than an array of runtime bound; or 2949 if (isVariableArrayType()) 2950 return false; 2951 const Type *BaseTy = getBaseElementTypeUnsafe(); 2952 assert(BaseTy && "NULL element type"); 2953 2954 // Return false for incomplete types after skipping any incomplete array 2955 // types; those are expressly allowed by the standard and thus our API. 2956 if (BaseTy->isIncompleteType()) 2957 return false; 2958 2959 // C++11 [basic.types]p10: 2960 // A type is a literal type if it is: 2961 // -- a scalar type; or 2962 // As an extension, Clang treats vector types and complex types as 2963 // literal types. 2964 if (BaseTy->isScalarType() || BaseTy->isVectorType() || 2965 BaseTy->isAnyComplexType()) 2966 return true; 2967 // -- a reference type; or 2968 if (BaseTy->isReferenceType()) 2969 return true; 2970 // -- a class type that has all of the following properties: 2971 if (const auto *RT = BaseTy->getAs<RecordType>()) { 2972 // -- a trivial destructor, 2973 // -- every constructor call and full-expression in the 2974 // brace-or-equal-initializers for non-static data members (if any) 2975 // is a constant expression, 2976 // -- it is an aggregate type or has at least one constexpr 2977 // constructor or constructor template that is not a copy or move 2978 // constructor, and 2979 // -- all non-static data members and base classes of literal types 2980 // 2981 // We resolve DR1361 by ignoring the second bullet. 2982 if (const auto *ClassDecl = dyn_cast<CXXRecordDecl>(RT->getDecl())) 2983 return ClassDecl->isLiteral(); 2984 2985 return true; 2986 } 2987 2988 // We treat _Atomic T as a literal type if T is a literal type. 2989 if (const auto *AT = BaseTy->getAs<AtomicType>()) 2990 return AT->getValueType()->isLiteralType(Ctx); 2991 2992 // If this type hasn't been deduced yet, then conservatively assume that 2993 // it'll work out to be a literal type. 2994 if (isa<AutoType>(BaseTy->getCanonicalTypeInternal())) 2995 return true; 2996 2997 return false; 2998 } 2999 3000 bool Type::isStructuralType() const { 3001 // C++20 [temp.param]p6: 3002 // A structural type is one of the following: 3003 // -- a scalar type; or 3004 // -- a vector type [Clang extension]; or 3005 if (isScalarType() || isVectorType()) 3006 return true; 3007 // -- an lvalue reference type; or 3008 if (isLValueReferenceType()) 3009 return true; 3010 // -- a literal class type [...under some conditions] 3011 if (const CXXRecordDecl *RD = getAsCXXRecordDecl()) 3012 return RD->isStructural(); 3013 return false; 3014 } 3015 3016 bool Type::isStandardLayoutType() const { 3017 if (isDependentType()) 3018 return false; 3019 3020 // C++0x [basic.types]p9: 3021 // Scalar types, standard-layout class types, arrays of such types, and 3022 // cv-qualified versions of these types are collectively called 3023 // standard-layout types. 3024 const Type *BaseTy = getBaseElementTypeUnsafe(); 3025 assert(BaseTy && "NULL element type"); 3026 3027 // Return false for incomplete types after skipping any incomplete array 3028 // types which are expressly allowed by the standard and thus our API. 3029 if (BaseTy->isIncompleteType()) 3030 return false; 3031 3032 // As an extension, Clang treats vector types as Scalar types. 3033 if (BaseTy->isScalarType() || BaseTy->isVectorType()) return true; 3034 if (const auto *RT = BaseTy->getAs<RecordType>()) { 3035 if (const auto *ClassDecl = dyn_cast<CXXRecordDecl>(RT->getDecl())) 3036 if (!ClassDecl->isStandardLayout()) 3037 return false; 3038 3039 // Default to 'true' for non-C++ class types. 3040 // FIXME: This is a bit dubious, but plain C structs should trivially meet 3041 // all the requirements of standard layout classes. 3042 return true; 3043 } 3044 3045 // No other types can match. 3046 return false; 3047 } 3048 3049 // This is effectively the intersection of isTrivialType and 3050 // isStandardLayoutType. We implement it directly to avoid redundant 3051 // conversions from a type to a CXXRecordDecl. 3052 bool QualType::isCXX11PODType(const ASTContext &Context) const { 3053 const Type *ty = getTypePtr(); 3054 if (ty->isDependentType()) 3055 return false; 3056 3057 if (hasNonTrivialObjCLifetime()) 3058 return false; 3059 3060 // C++11 [basic.types]p9: 3061 // Scalar types, POD classes, arrays of such types, and cv-qualified 3062 // versions of these types are collectively called trivial types. 3063 const Type *BaseTy = ty->getBaseElementTypeUnsafe(); 3064 assert(BaseTy && "NULL element type"); 3065 3066 if (BaseTy->isSizelessBuiltinType()) 3067 return true; 3068 3069 // Return false for incomplete types after skipping any incomplete array 3070 // types which are expressly allowed by the standard and thus our API. 3071 if (BaseTy->isIncompleteType()) 3072 return false; 3073 3074 // As an extension, Clang treats vector types as Scalar types. 3075 if (BaseTy->isScalarType() || BaseTy->isVectorType()) return true; 3076 if (const auto *RT = BaseTy->getAs<RecordType>()) { 3077 if (const auto *ClassDecl = dyn_cast<CXXRecordDecl>(RT->getDecl())) { 3078 // C++11 [class]p10: 3079 // A POD struct is a non-union class that is both a trivial class [...] 3080 if (!ClassDecl->isTrivial()) return false; 3081 3082 // C++11 [class]p10: 3083 // A POD struct is a non-union class that is both a trivial class and 3084 // a standard-layout class [...] 3085 if (!ClassDecl->isStandardLayout()) return false; 3086 3087 // C++11 [class]p10: 3088 // A POD struct is a non-union class that is both a trivial class and 3089 // a standard-layout class, and has no non-static data members of type 3090 // non-POD struct, non-POD union (or array of such types). [...] 3091 // 3092 // We don't directly query the recursive aspect as the requirements for 3093 // both standard-layout classes and trivial classes apply recursively 3094 // already. 3095 } 3096 3097 return true; 3098 } 3099 3100 // No other types can match. 3101 return false; 3102 } 3103 3104 bool Type::isNothrowT() const { 3105 if (const auto *RD = getAsCXXRecordDecl()) { 3106 IdentifierInfo *II = RD->getIdentifier(); 3107 if (II && II->isStr("nothrow_t") && RD->isInStdNamespace()) 3108 return true; 3109 } 3110 return false; 3111 } 3112 3113 bool Type::isAlignValT() const { 3114 if (const auto *ET = getAs<EnumType>()) { 3115 IdentifierInfo *II = ET->getDecl()->getIdentifier(); 3116 if (II && II->isStr("align_val_t") && ET->getDecl()->isInStdNamespace()) 3117 return true; 3118 } 3119 return false; 3120 } 3121 3122 bool Type::isStdByteType() const { 3123 if (const auto *ET = getAs<EnumType>()) { 3124 IdentifierInfo *II = ET->getDecl()->getIdentifier(); 3125 if (II && II->isStr("byte") && ET->getDecl()->isInStdNamespace()) 3126 return true; 3127 } 3128 return false; 3129 } 3130 3131 bool Type::isSpecifierType() const { 3132 // Note that this intentionally does not use the canonical type. 3133 switch (getTypeClass()) { 3134 case Builtin: 3135 case Record: 3136 case Enum: 3137 case Typedef: 3138 case Complex: 3139 case TypeOfExpr: 3140 case TypeOf: 3141 case TemplateTypeParm: 3142 case SubstTemplateTypeParm: 3143 case TemplateSpecialization: 3144 case Elaborated: 3145 case DependentName: 3146 case DependentTemplateSpecialization: 3147 case ObjCInterface: 3148 case ObjCObject: 3149 return true; 3150 default: 3151 return false; 3152 } 3153 } 3154 3155 ElaboratedTypeKeyword 3156 TypeWithKeyword::getKeywordForTypeSpec(unsigned TypeSpec) { 3157 switch (TypeSpec) { 3158 default: 3159 return ElaboratedTypeKeyword::None; 3160 case TST_typename: 3161 return ElaboratedTypeKeyword::Typename; 3162 case TST_class: 3163 return ElaboratedTypeKeyword::Class; 3164 case TST_struct: 3165 return ElaboratedTypeKeyword::Struct; 3166 case TST_interface: 3167 return ElaboratedTypeKeyword::Interface; 3168 case TST_union: 3169 return ElaboratedTypeKeyword::Union; 3170 case TST_enum: 3171 return ElaboratedTypeKeyword::Enum; 3172 } 3173 } 3174 3175 TagTypeKind 3176 TypeWithKeyword::getTagTypeKindForTypeSpec(unsigned TypeSpec) { 3177 switch(TypeSpec) { 3178 case TST_class: 3179 return TagTypeKind::Class; 3180 case TST_struct: 3181 return TagTypeKind::Struct; 3182 case TST_interface: 3183 return TagTypeKind::Interface; 3184 case TST_union: 3185 return TagTypeKind::Union; 3186 case TST_enum: 3187 return TagTypeKind::Enum; 3188 } 3189 3190 llvm_unreachable("Type specifier is not a tag type kind."); 3191 } 3192 3193 ElaboratedTypeKeyword 3194 TypeWithKeyword::getKeywordForTagTypeKind(TagTypeKind Kind) { 3195 switch (Kind) { 3196 case TagTypeKind::Class: 3197 return ElaboratedTypeKeyword::Class; 3198 case TagTypeKind::Struct: 3199 return ElaboratedTypeKeyword::Struct; 3200 case TagTypeKind::Interface: 3201 return ElaboratedTypeKeyword::Interface; 3202 case TagTypeKind::Union: 3203 return ElaboratedTypeKeyword::Union; 3204 case TagTypeKind::Enum: 3205 return ElaboratedTypeKeyword::Enum; 3206 } 3207 llvm_unreachable("Unknown tag type kind."); 3208 } 3209 3210 TagTypeKind 3211 TypeWithKeyword::getTagTypeKindForKeyword(ElaboratedTypeKeyword Keyword) { 3212 switch (Keyword) { 3213 case ElaboratedTypeKeyword::Class: 3214 return TagTypeKind::Class; 3215 case ElaboratedTypeKeyword::Struct: 3216 return TagTypeKind::Struct; 3217 case ElaboratedTypeKeyword::Interface: 3218 return TagTypeKind::Interface; 3219 case ElaboratedTypeKeyword::Union: 3220 return TagTypeKind::Union; 3221 case ElaboratedTypeKeyword::Enum: 3222 return TagTypeKind::Enum; 3223 case ElaboratedTypeKeyword::None: // Fall through. 3224 case ElaboratedTypeKeyword::Typename: 3225 llvm_unreachable("Elaborated type keyword is not a tag type kind."); 3226 } 3227 llvm_unreachable("Unknown elaborated type keyword."); 3228 } 3229 3230 bool 3231 TypeWithKeyword::KeywordIsTagTypeKind(ElaboratedTypeKeyword Keyword) { 3232 switch (Keyword) { 3233 case ElaboratedTypeKeyword::None: 3234 case ElaboratedTypeKeyword::Typename: 3235 return false; 3236 case ElaboratedTypeKeyword::Class: 3237 case ElaboratedTypeKeyword::Struct: 3238 case ElaboratedTypeKeyword::Interface: 3239 case ElaboratedTypeKeyword::Union: 3240 case ElaboratedTypeKeyword::Enum: 3241 return true; 3242 } 3243 llvm_unreachable("Unknown elaborated type keyword."); 3244 } 3245 3246 StringRef TypeWithKeyword::getKeywordName(ElaboratedTypeKeyword Keyword) { 3247 switch (Keyword) { 3248 case ElaboratedTypeKeyword::None: 3249 return {}; 3250 case ElaboratedTypeKeyword::Typename: 3251 return "typename"; 3252 case ElaboratedTypeKeyword::Class: 3253 return "class"; 3254 case ElaboratedTypeKeyword::Struct: 3255 return "struct"; 3256 case ElaboratedTypeKeyword::Interface: 3257 return "__interface"; 3258 case ElaboratedTypeKeyword::Union: 3259 return "union"; 3260 case ElaboratedTypeKeyword::Enum: 3261 return "enum"; 3262 } 3263 3264 llvm_unreachable("Unknown elaborated type keyword."); 3265 } 3266 3267 DependentTemplateSpecializationType::DependentTemplateSpecializationType( 3268 ElaboratedTypeKeyword Keyword, NestedNameSpecifier *NNS, 3269 const IdentifierInfo *Name, ArrayRef<TemplateArgument> Args, QualType Canon) 3270 : TypeWithKeyword(Keyword, DependentTemplateSpecialization, Canon, 3271 TypeDependence::DependentInstantiation | 3272 (NNS ? toTypeDependence(NNS->getDependence()) 3273 : TypeDependence::None)), 3274 NNS(NNS), Name(Name) { 3275 DependentTemplateSpecializationTypeBits.NumArgs = Args.size(); 3276 assert((!NNS || NNS->isDependent()) && 3277 "DependentTemplateSpecializatonType requires dependent qualifier"); 3278 auto *ArgBuffer = const_cast<TemplateArgument *>(template_arguments().data()); 3279 for (const TemplateArgument &Arg : Args) { 3280 addDependence(toTypeDependence(Arg.getDependence() & 3281 TemplateArgumentDependence::UnexpandedPack)); 3282 3283 new (ArgBuffer++) TemplateArgument(Arg); 3284 } 3285 } 3286 3287 void 3288 DependentTemplateSpecializationType::Profile(llvm::FoldingSetNodeID &ID, 3289 const ASTContext &Context, 3290 ElaboratedTypeKeyword Keyword, 3291 NestedNameSpecifier *Qualifier, 3292 const IdentifierInfo *Name, 3293 ArrayRef<TemplateArgument> Args) { 3294 ID.AddInteger(llvm::to_underlying(Keyword)); 3295 ID.AddPointer(Qualifier); 3296 ID.AddPointer(Name); 3297 for (const TemplateArgument &Arg : Args) 3298 Arg.Profile(ID, Context); 3299 } 3300 3301 bool Type::isElaboratedTypeSpecifier() const { 3302 ElaboratedTypeKeyword Keyword; 3303 if (const auto *Elab = dyn_cast<ElaboratedType>(this)) 3304 Keyword = Elab->getKeyword(); 3305 else if (const auto *DepName = dyn_cast<DependentNameType>(this)) 3306 Keyword = DepName->getKeyword(); 3307 else if (const auto *DepTST = 3308 dyn_cast<DependentTemplateSpecializationType>(this)) 3309 Keyword = DepTST->getKeyword(); 3310 else 3311 return false; 3312 3313 return TypeWithKeyword::KeywordIsTagTypeKind(Keyword); 3314 } 3315 3316 const char *Type::getTypeClassName() const { 3317 switch (TypeBits.TC) { 3318 #define ABSTRACT_TYPE(Derived, Base) 3319 #define TYPE(Derived, Base) case Derived: return #Derived; 3320 #include "clang/AST/TypeNodes.inc" 3321 } 3322 3323 llvm_unreachable("Invalid type class."); 3324 } 3325 3326 StringRef BuiltinType::getName(const PrintingPolicy &Policy) const { 3327 switch (getKind()) { 3328 case Void: 3329 return "void"; 3330 case Bool: 3331 return Policy.Bool ? "bool" : "_Bool"; 3332 case Char_S: 3333 return "char"; 3334 case Char_U: 3335 return "char"; 3336 case SChar: 3337 return "signed char"; 3338 case Short: 3339 return "short"; 3340 case Int: 3341 return "int"; 3342 case Long: 3343 return "long"; 3344 case LongLong: 3345 return "long long"; 3346 case Int128: 3347 return "__int128"; 3348 case UChar: 3349 return "unsigned char"; 3350 case UShort: 3351 return "unsigned short"; 3352 case UInt: 3353 return "unsigned int"; 3354 case ULong: 3355 return "unsigned long"; 3356 case ULongLong: 3357 return "unsigned long long"; 3358 case UInt128: 3359 return "unsigned __int128"; 3360 case Half: 3361 return Policy.Half ? "half" : "__fp16"; 3362 case BFloat16: 3363 return "__bf16"; 3364 case Float: 3365 return "float"; 3366 case Double: 3367 return "double"; 3368 case LongDouble: 3369 return "long double"; 3370 case ShortAccum: 3371 return "short _Accum"; 3372 case Accum: 3373 return "_Accum"; 3374 case LongAccum: 3375 return "long _Accum"; 3376 case UShortAccum: 3377 return "unsigned short _Accum"; 3378 case UAccum: 3379 return "unsigned _Accum"; 3380 case ULongAccum: 3381 return "unsigned long _Accum"; 3382 case BuiltinType::ShortFract: 3383 return "short _Fract"; 3384 case BuiltinType::Fract: 3385 return "_Fract"; 3386 case BuiltinType::LongFract: 3387 return "long _Fract"; 3388 case BuiltinType::UShortFract: 3389 return "unsigned short _Fract"; 3390 case BuiltinType::UFract: 3391 return "unsigned _Fract"; 3392 case BuiltinType::ULongFract: 3393 return "unsigned long _Fract"; 3394 case BuiltinType::SatShortAccum: 3395 return "_Sat short _Accum"; 3396 case BuiltinType::SatAccum: 3397 return "_Sat _Accum"; 3398 case BuiltinType::SatLongAccum: 3399 return "_Sat long _Accum"; 3400 case BuiltinType::SatUShortAccum: 3401 return "_Sat unsigned short _Accum"; 3402 case BuiltinType::SatUAccum: 3403 return "_Sat unsigned _Accum"; 3404 case BuiltinType::SatULongAccum: 3405 return "_Sat unsigned long _Accum"; 3406 case BuiltinType::SatShortFract: 3407 return "_Sat short _Fract"; 3408 case BuiltinType::SatFract: 3409 return "_Sat _Fract"; 3410 case BuiltinType::SatLongFract: 3411 return "_Sat long _Fract"; 3412 case BuiltinType::SatUShortFract: 3413 return "_Sat unsigned short _Fract"; 3414 case BuiltinType::SatUFract: 3415 return "_Sat unsigned _Fract"; 3416 case BuiltinType::SatULongFract: 3417 return "_Sat unsigned long _Fract"; 3418 case Float16: 3419 return "_Float16"; 3420 case Float128: 3421 return "__float128"; 3422 case Ibm128: 3423 return "__ibm128"; 3424 case WChar_S: 3425 case WChar_U: 3426 return Policy.MSWChar ? "__wchar_t" : "wchar_t"; 3427 case Char8: 3428 return "char8_t"; 3429 case Char16: 3430 return "char16_t"; 3431 case Char32: 3432 return "char32_t"; 3433 case NullPtr: 3434 return Policy.NullptrTypeInNamespace ? "std::nullptr_t" : "nullptr_t"; 3435 case Overload: 3436 return "<overloaded function type>"; 3437 case BoundMember: 3438 return "<bound member function type>"; 3439 case UnresolvedTemplate: 3440 return "<unresolved template type>"; 3441 case PseudoObject: 3442 return "<pseudo-object type>"; 3443 case Dependent: 3444 return "<dependent type>"; 3445 case UnknownAny: 3446 return "<unknown type>"; 3447 case ARCUnbridgedCast: 3448 return "<ARC unbridged cast type>"; 3449 case BuiltinFn: 3450 return "<builtin fn type>"; 3451 case ObjCId: 3452 return "id"; 3453 case ObjCClass: 3454 return "Class"; 3455 case ObjCSel: 3456 return "SEL"; 3457 #define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \ 3458 case Id: \ 3459 return "__" #Access " " #ImgType "_t"; 3460 #include "clang/Basic/OpenCLImageTypes.def" 3461 case OCLSampler: 3462 return "sampler_t"; 3463 case OCLEvent: 3464 return "event_t"; 3465 case OCLClkEvent: 3466 return "clk_event_t"; 3467 case OCLQueue: 3468 return "queue_t"; 3469 case OCLReserveID: 3470 return "reserve_id_t"; 3471 case IncompleteMatrixIdx: 3472 return "<incomplete matrix index type>"; 3473 case ArraySection: 3474 return "<array section type>"; 3475 case OMPArrayShaping: 3476 return "<OpenMP array shaping type>"; 3477 case OMPIterator: 3478 return "<OpenMP iterator type>"; 3479 #define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \ 3480 case Id: \ 3481 return #ExtType; 3482 #include "clang/Basic/OpenCLExtensionTypes.def" 3483 #define SVE_TYPE(Name, Id, SingletonId) \ 3484 case Id: \ 3485 return Name; 3486 #include "clang/Basic/AArch64SVEACLETypes.def" 3487 #define PPC_VECTOR_TYPE(Name, Id, Size) \ 3488 case Id: \ 3489 return #Name; 3490 #include "clang/Basic/PPCTypes.def" 3491 #define RVV_TYPE(Name, Id, SingletonId) \ 3492 case Id: \ 3493 return Name; 3494 #include "clang/Basic/RISCVVTypes.def" 3495 #define WASM_TYPE(Name, Id, SingletonId) \ 3496 case Id: \ 3497 return Name; 3498 #include "clang/Basic/WebAssemblyReferenceTypes.def" 3499 #define AMDGPU_TYPE(Name, Id, SingletonId, Width, Align) \ 3500 case Id: \ 3501 return Name; 3502 #include "clang/Basic/AMDGPUTypes.def" 3503 #define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) \ 3504 case Id: \ 3505 return #Name; 3506 #include "clang/Basic/HLSLIntangibleTypes.def" 3507 } 3508 3509 llvm_unreachable("Invalid builtin type."); 3510 } 3511 3512 QualType QualType::getNonPackExpansionType() const { 3513 // We never wrap type sugar around a PackExpansionType. 3514 if (auto *PET = dyn_cast<PackExpansionType>(getTypePtr())) 3515 return PET->getPattern(); 3516 return *this; 3517 } 3518 3519 QualType QualType::getNonLValueExprType(const ASTContext &Context) const { 3520 if (const auto *RefType = getTypePtr()->getAs<ReferenceType>()) 3521 return RefType->getPointeeType(); 3522 3523 // C++0x [basic.lval]: 3524 // Class prvalues can have cv-qualified types; non-class prvalues always 3525 // have cv-unqualified types. 3526 // 3527 // See also C99 6.3.2.1p2. 3528 if (!Context.getLangOpts().CPlusPlus || 3529 (!getTypePtr()->isDependentType() && !getTypePtr()->isRecordType())) 3530 return getUnqualifiedType(); 3531 3532 return *this; 3533 } 3534 3535 StringRef FunctionType::getNameForCallConv(CallingConv CC) { 3536 switch (CC) { 3537 case CC_C: return "cdecl"; 3538 case CC_X86StdCall: return "stdcall"; 3539 case CC_X86FastCall: return "fastcall"; 3540 case CC_X86ThisCall: return "thiscall"; 3541 case CC_X86Pascal: return "pascal"; 3542 case CC_X86VectorCall: return "vectorcall"; 3543 case CC_Win64: return "ms_abi"; 3544 case CC_X86_64SysV: return "sysv_abi"; 3545 case CC_X86RegCall : return "regcall"; 3546 case CC_AAPCS: return "aapcs"; 3547 case CC_AAPCS_VFP: return "aapcs-vfp"; 3548 case CC_AArch64VectorCall: return "aarch64_vector_pcs"; 3549 case CC_AArch64SVEPCS: return "aarch64_sve_pcs"; 3550 case CC_AMDGPUKernelCall: return "amdgpu_kernel"; 3551 case CC_IntelOclBicc: return "intel_ocl_bicc"; 3552 case CC_SpirFunction: return "spir_function"; 3553 case CC_OpenCLKernel: return "opencl_kernel"; 3554 case CC_Swift: return "swiftcall"; 3555 case CC_SwiftAsync: return "swiftasynccall"; 3556 case CC_PreserveMost: return "preserve_most"; 3557 case CC_PreserveAll: return "preserve_all"; 3558 case CC_M68kRTD: return "m68k_rtd"; 3559 case CC_PreserveNone: return "preserve_none"; 3560 // clang-format off 3561 case CC_RISCVVectorCall: return "riscv_vector_cc"; 3562 // clang-format on 3563 } 3564 3565 llvm_unreachable("Invalid calling convention."); 3566 } 3567 3568 void FunctionProtoType::ExceptionSpecInfo::instantiate() { 3569 assert(Type == EST_Uninstantiated); 3570 NoexceptExpr = 3571 cast<FunctionProtoType>(SourceTemplate->getType())->getNoexceptExpr(); 3572 Type = EST_DependentNoexcept; 3573 } 3574 3575 FunctionProtoType::FunctionProtoType(QualType result, ArrayRef<QualType> params, 3576 QualType canonical, 3577 const ExtProtoInfo &epi) 3578 : FunctionType(FunctionProto, result, canonical, result->getDependence(), 3579 epi.ExtInfo) { 3580 FunctionTypeBits.FastTypeQuals = epi.TypeQuals.getFastQualifiers(); 3581 FunctionTypeBits.RefQualifier = epi.RefQualifier; 3582 FunctionTypeBits.NumParams = params.size(); 3583 assert(getNumParams() == params.size() && "NumParams overflow!"); 3584 FunctionTypeBits.ExceptionSpecType = epi.ExceptionSpec.Type; 3585 FunctionTypeBits.HasExtParameterInfos = !!epi.ExtParameterInfos; 3586 FunctionTypeBits.Variadic = epi.Variadic; 3587 FunctionTypeBits.HasTrailingReturn = epi.HasTrailingReturn; 3588 3589 if (epi.requiresFunctionProtoTypeExtraBitfields()) { 3590 FunctionTypeBits.HasExtraBitfields = true; 3591 auto &ExtraBits = *getTrailingObjects<FunctionTypeExtraBitfields>(); 3592 ExtraBits = FunctionTypeExtraBitfields(); 3593 } else { 3594 FunctionTypeBits.HasExtraBitfields = false; 3595 } 3596 3597 if (epi.requiresFunctionProtoTypeArmAttributes()) { 3598 auto &ArmTypeAttrs = *getTrailingObjects<FunctionTypeArmAttributes>(); 3599 ArmTypeAttrs = FunctionTypeArmAttributes(); 3600 3601 // Also set the bit in FunctionTypeExtraBitfields 3602 auto &ExtraBits = *getTrailingObjects<FunctionTypeExtraBitfields>(); 3603 ExtraBits.HasArmTypeAttributes = true; 3604 } 3605 3606 // Fill in the trailing argument array. 3607 auto *argSlot = getTrailingObjects<QualType>(); 3608 for (unsigned i = 0; i != getNumParams(); ++i) { 3609 addDependence(params[i]->getDependence() & 3610 ~TypeDependence::VariablyModified); 3611 argSlot[i] = params[i]; 3612 } 3613 3614 // Propagate the SME ACLE attributes. 3615 if (epi.AArch64SMEAttributes != SME_NormalFunction) { 3616 auto &ArmTypeAttrs = *getTrailingObjects<FunctionTypeArmAttributes>(); 3617 assert(epi.AArch64SMEAttributes <= SME_AttributeMask && 3618 "Not enough bits to encode SME attributes"); 3619 ArmTypeAttrs.AArch64SMEAttributes = epi.AArch64SMEAttributes; 3620 } 3621 3622 // Fill in the exception type array if present. 3623 if (getExceptionSpecType() == EST_Dynamic) { 3624 auto &ExtraBits = *getTrailingObjects<FunctionTypeExtraBitfields>(); 3625 size_t NumExceptions = epi.ExceptionSpec.Exceptions.size(); 3626 assert(NumExceptions <= 1023 && "Not enough bits to encode exceptions"); 3627 ExtraBits.NumExceptionType = NumExceptions; 3628 3629 assert(hasExtraBitfields() && "missing trailing extra bitfields!"); 3630 auto *exnSlot = 3631 reinterpret_cast<QualType *>(getTrailingObjects<ExceptionType>()); 3632 unsigned I = 0; 3633 for (QualType ExceptionType : epi.ExceptionSpec.Exceptions) { 3634 // Note that, before C++17, a dependent exception specification does 3635 // *not* make a type dependent; it's not even part of the C++ type 3636 // system. 3637 addDependence( 3638 ExceptionType->getDependence() & 3639 (TypeDependence::Instantiation | TypeDependence::UnexpandedPack)); 3640 3641 exnSlot[I++] = ExceptionType; 3642 } 3643 } 3644 // Fill in the Expr * in the exception specification if present. 3645 else if (isComputedNoexcept(getExceptionSpecType())) { 3646 assert(epi.ExceptionSpec.NoexceptExpr && "computed noexcept with no expr"); 3647 assert((getExceptionSpecType() == EST_DependentNoexcept) == 3648 epi.ExceptionSpec.NoexceptExpr->isValueDependent()); 3649 3650 // Store the noexcept expression and context. 3651 *getTrailingObjects<Expr *>() = epi.ExceptionSpec.NoexceptExpr; 3652 3653 addDependence( 3654 toTypeDependence(epi.ExceptionSpec.NoexceptExpr->getDependence()) & 3655 (TypeDependence::Instantiation | TypeDependence::UnexpandedPack)); 3656 } 3657 // Fill in the FunctionDecl * in the exception specification if present. 3658 else if (getExceptionSpecType() == EST_Uninstantiated) { 3659 // Store the function decl from which we will resolve our 3660 // exception specification. 3661 auto **slot = getTrailingObjects<FunctionDecl *>(); 3662 slot[0] = epi.ExceptionSpec.SourceDecl; 3663 slot[1] = epi.ExceptionSpec.SourceTemplate; 3664 // This exception specification doesn't make the type dependent, because 3665 // it's not instantiated as part of instantiating the type. 3666 } else if (getExceptionSpecType() == EST_Unevaluated) { 3667 // Store the function decl from which we will resolve our 3668 // exception specification. 3669 auto **slot = getTrailingObjects<FunctionDecl *>(); 3670 slot[0] = epi.ExceptionSpec.SourceDecl; 3671 } 3672 3673 // If this is a canonical type, and its exception specification is dependent, 3674 // then it's a dependent type. This only happens in C++17 onwards. 3675 if (isCanonicalUnqualified()) { 3676 if (getExceptionSpecType() == EST_Dynamic || 3677 getExceptionSpecType() == EST_DependentNoexcept) { 3678 assert(hasDependentExceptionSpec() && "type should not be canonical"); 3679 addDependence(TypeDependence::DependentInstantiation); 3680 } 3681 } else if (getCanonicalTypeInternal()->isDependentType()) { 3682 // Ask our canonical type whether our exception specification was dependent. 3683 addDependence(TypeDependence::DependentInstantiation); 3684 } 3685 3686 // Fill in the extra parameter info if present. 3687 if (epi.ExtParameterInfos) { 3688 auto *extParamInfos = getTrailingObjects<ExtParameterInfo>(); 3689 for (unsigned i = 0; i != getNumParams(); ++i) 3690 extParamInfos[i] = epi.ExtParameterInfos[i]; 3691 } 3692 3693 if (epi.TypeQuals.hasNonFastQualifiers()) { 3694 FunctionTypeBits.HasExtQuals = 1; 3695 *getTrailingObjects<Qualifiers>() = epi.TypeQuals; 3696 } else { 3697 FunctionTypeBits.HasExtQuals = 0; 3698 } 3699 3700 // Fill in the Ellipsis location info if present. 3701 if (epi.Variadic) { 3702 auto &EllipsisLoc = *getTrailingObjects<SourceLocation>(); 3703 EllipsisLoc = epi.EllipsisLoc; 3704 } 3705 3706 if (!epi.FunctionEffects.empty()) { 3707 auto &ExtraBits = *getTrailingObjects<FunctionTypeExtraBitfields>(); 3708 size_t EffectsCount = epi.FunctionEffects.size(); 3709 ExtraBits.NumFunctionEffects = EffectsCount; 3710 assert(ExtraBits.NumFunctionEffects == EffectsCount && 3711 "effect bitfield overflow"); 3712 3713 ArrayRef<FunctionEffect> SrcFX = epi.FunctionEffects.effects(); 3714 auto *DestFX = getTrailingObjects<FunctionEffect>(); 3715 std::uninitialized_copy(SrcFX.begin(), SrcFX.end(), DestFX); 3716 3717 ArrayRef<EffectConditionExpr> SrcConds = epi.FunctionEffects.conditions(); 3718 if (!SrcConds.empty()) { 3719 ExtraBits.EffectsHaveConditions = true; 3720 auto *DestConds = getTrailingObjects<EffectConditionExpr>(); 3721 std::uninitialized_copy(SrcConds.begin(), SrcConds.end(), DestConds); 3722 assert(std::any_of(SrcConds.begin(), SrcConds.end(), 3723 [](const EffectConditionExpr &EC) { 3724 if (const Expr *E = EC.getCondition()) 3725 return E->isTypeDependent() || 3726 E->isValueDependent(); 3727 return false; 3728 }) && 3729 "expected a dependent expression among the conditions"); 3730 addDependence(TypeDependence::DependentInstantiation); 3731 } 3732 } 3733 } 3734 3735 bool FunctionProtoType::hasDependentExceptionSpec() const { 3736 if (Expr *NE = getNoexceptExpr()) 3737 return NE->isValueDependent(); 3738 for (QualType ET : exceptions()) 3739 // A pack expansion with a non-dependent pattern is still dependent, 3740 // because we don't know whether the pattern is in the exception spec 3741 // or not (that depends on whether the pack has 0 expansions). 3742 if (ET->isDependentType() || ET->getAs<PackExpansionType>()) 3743 return true; 3744 return false; 3745 } 3746 3747 bool FunctionProtoType::hasInstantiationDependentExceptionSpec() const { 3748 if (Expr *NE = getNoexceptExpr()) 3749 return NE->isInstantiationDependent(); 3750 for (QualType ET : exceptions()) 3751 if (ET->isInstantiationDependentType()) 3752 return true; 3753 return false; 3754 } 3755 3756 CanThrowResult FunctionProtoType::canThrow() const { 3757 switch (getExceptionSpecType()) { 3758 case EST_Unparsed: 3759 case EST_Unevaluated: 3760 llvm_unreachable("should not call this with unresolved exception specs"); 3761 3762 case EST_DynamicNone: 3763 case EST_BasicNoexcept: 3764 case EST_NoexceptTrue: 3765 case EST_NoThrow: 3766 return CT_Cannot; 3767 3768 case EST_None: 3769 case EST_MSAny: 3770 case EST_NoexceptFalse: 3771 return CT_Can; 3772 3773 case EST_Dynamic: 3774 // A dynamic exception specification is throwing unless every exception 3775 // type is an (unexpanded) pack expansion type. 3776 for (unsigned I = 0; I != getNumExceptions(); ++I) 3777 if (!getExceptionType(I)->getAs<PackExpansionType>()) 3778 return CT_Can; 3779 return CT_Dependent; 3780 3781 case EST_Uninstantiated: 3782 case EST_DependentNoexcept: 3783 return CT_Dependent; 3784 } 3785 3786 llvm_unreachable("unexpected exception specification kind"); 3787 } 3788 3789 bool FunctionProtoType::isTemplateVariadic() const { 3790 for (unsigned ArgIdx = getNumParams(); ArgIdx; --ArgIdx) 3791 if (isa<PackExpansionType>(getParamType(ArgIdx - 1))) 3792 return true; 3793 3794 return false; 3795 } 3796 3797 void FunctionProtoType::Profile(llvm::FoldingSetNodeID &ID, QualType Result, 3798 const QualType *ArgTys, unsigned NumParams, 3799 const ExtProtoInfo &epi, 3800 const ASTContext &Context, bool Canonical) { 3801 // We have to be careful not to get ambiguous profile encodings. 3802 // Note that valid type pointers are never ambiguous with anything else. 3803 // 3804 // The encoding grammar begins: 3805 // type type* bool int bool 3806 // If that final bool is true, then there is a section for the EH spec: 3807 // bool type* 3808 // This is followed by an optional "consumed argument" section of the 3809 // same length as the first type sequence: 3810 // bool* 3811 // This is followed by the ext info: 3812 // int 3813 // Finally we have a trailing return type flag (bool) 3814 // combined with AArch64 SME Attributes, to save space: 3815 // int 3816 // combined with any FunctionEffects 3817 // 3818 // There is no ambiguity between the consumed arguments and an empty EH 3819 // spec because of the leading 'bool' which unambiguously indicates 3820 // whether the following bool is the EH spec or part of the arguments. 3821 3822 ID.AddPointer(Result.getAsOpaquePtr()); 3823 for (unsigned i = 0; i != NumParams; ++i) 3824 ID.AddPointer(ArgTys[i].getAsOpaquePtr()); 3825 // This method is relatively performance sensitive, so as a performance 3826 // shortcut, use one AddInteger call instead of four for the next four 3827 // fields. 3828 assert(!(unsigned(epi.Variadic) & ~1) && 3829 !(unsigned(epi.RefQualifier) & ~3) && 3830 !(unsigned(epi.ExceptionSpec.Type) & ~15) && 3831 "Values larger than expected."); 3832 ID.AddInteger(unsigned(epi.Variadic) + 3833 (epi.RefQualifier << 1) + 3834 (epi.ExceptionSpec.Type << 3)); 3835 ID.Add(epi.TypeQuals); 3836 if (epi.ExceptionSpec.Type == EST_Dynamic) { 3837 for (QualType Ex : epi.ExceptionSpec.Exceptions) 3838 ID.AddPointer(Ex.getAsOpaquePtr()); 3839 } else if (isComputedNoexcept(epi.ExceptionSpec.Type)) { 3840 epi.ExceptionSpec.NoexceptExpr->Profile(ID, Context, Canonical); 3841 } else if (epi.ExceptionSpec.Type == EST_Uninstantiated || 3842 epi.ExceptionSpec.Type == EST_Unevaluated) { 3843 ID.AddPointer(epi.ExceptionSpec.SourceDecl->getCanonicalDecl()); 3844 } 3845 if (epi.ExtParameterInfos) { 3846 for (unsigned i = 0; i != NumParams; ++i) 3847 ID.AddInteger(epi.ExtParameterInfos[i].getOpaqueValue()); 3848 } 3849 3850 epi.ExtInfo.Profile(ID); 3851 3852 unsigned EffectCount = epi.FunctionEffects.size(); 3853 bool HasConds = !epi.FunctionEffects.Conditions.empty(); 3854 3855 ID.AddInteger((EffectCount << 3) | (HasConds << 2) | 3856 (epi.AArch64SMEAttributes << 1) | epi.HasTrailingReturn); 3857 3858 for (unsigned Idx = 0; Idx != EffectCount; ++Idx) { 3859 ID.AddInteger(epi.FunctionEffects.Effects[Idx].toOpaqueInt32()); 3860 if (HasConds) 3861 ID.AddPointer(epi.FunctionEffects.Conditions[Idx].getCondition()); 3862 } 3863 } 3864 3865 void FunctionProtoType::Profile(llvm::FoldingSetNodeID &ID, 3866 const ASTContext &Ctx) { 3867 Profile(ID, getReturnType(), param_type_begin(), getNumParams(), 3868 getExtProtoInfo(), Ctx, isCanonicalUnqualified()); 3869 } 3870 3871 TypeCoupledDeclRefInfo::TypeCoupledDeclRefInfo(ValueDecl *D, bool Deref) 3872 : Data(D, Deref << DerefShift) {} 3873 3874 bool TypeCoupledDeclRefInfo::isDeref() const { 3875 return Data.getInt() & DerefMask; 3876 } 3877 ValueDecl *TypeCoupledDeclRefInfo::getDecl() const { return Data.getPointer(); } 3878 unsigned TypeCoupledDeclRefInfo::getInt() const { return Data.getInt(); } 3879 void *TypeCoupledDeclRefInfo::getOpaqueValue() const { 3880 return Data.getOpaqueValue(); 3881 } 3882 bool TypeCoupledDeclRefInfo::operator==( 3883 const TypeCoupledDeclRefInfo &Other) const { 3884 return getOpaqueValue() == Other.getOpaqueValue(); 3885 } 3886 void TypeCoupledDeclRefInfo::setFromOpaqueValue(void *V) { 3887 Data.setFromOpaqueValue(V); 3888 } 3889 3890 BoundsAttributedType::BoundsAttributedType(TypeClass TC, QualType Wrapped, 3891 QualType Canon) 3892 : Type(TC, Canon, Wrapped->getDependence()), WrappedTy(Wrapped) {} 3893 3894 CountAttributedType::CountAttributedType( 3895 QualType Wrapped, QualType Canon, Expr *CountExpr, bool CountInBytes, 3896 bool OrNull, ArrayRef<TypeCoupledDeclRefInfo> CoupledDecls) 3897 : BoundsAttributedType(CountAttributed, Wrapped, Canon), 3898 CountExpr(CountExpr) { 3899 CountAttributedTypeBits.NumCoupledDecls = CoupledDecls.size(); 3900 CountAttributedTypeBits.CountInBytes = CountInBytes; 3901 CountAttributedTypeBits.OrNull = OrNull; 3902 auto *DeclSlot = getTrailingObjects<TypeCoupledDeclRefInfo>(); 3903 Decls = llvm::ArrayRef(DeclSlot, CoupledDecls.size()); 3904 for (unsigned i = 0; i != CoupledDecls.size(); ++i) 3905 DeclSlot[i] = CoupledDecls[i]; 3906 } 3907 3908 TypedefType::TypedefType(TypeClass tc, const TypedefNameDecl *D, 3909 QualType Underlying, QualType can) 3910 : Type(tc, can, toSemanticDependence(can->getDependence())), 3911 Decl(const_cast<TypedefNameDecl *>(D)) { 3912 assert(!isa<TypedefType>(can) && "Invalid canonical type"); 3913 TypedefBits.hasTypeDifferentFromDecl = !Underlying.isNull(); 3914 if (!typeMatchesDecl()) 3915 *getTrailingObjects<QualType>() = Underlying; 3916 } 3917 3918 QualType TypedefType::desugar() const { 3919 return typeMatchesDecl() ? Decl->getUnderlyingType() 3920 : *getTrailingObjects<QualType>(); 3921 } 3922 3923 UsingType::UsingType(const UsingShadowDecl *Found, QualType Underlying, 3924 QualType Canon) 3925 : Type(Using, Canon, toSemanticDependence(Canon->getDependence())), 3926 Found(const_cast<UsingShadowDecl *>(Found)) { 3927 UsingBits.hasTypeDifferentFromDecl = !Underlying.isNull(); 3928 if (!typeMatchesDecl()) 3929 *getTrailingObjects<QualType>() = Underlying; 3930 } 3931 3932 QualType UsingType::getUnderlyingType() const { 3933 return typeMatchesDecl() 3934 ? QualType( 3935 cast<TypeDecl>(Found->getTargetDecl())->getTypeForDecl(), 0) 3936 : *getTrailingObjects<QualType>(); 3937 } 3938 3939 QualType MacroQualifiedType::desugar() const { return getUnderlyingType(); } 3940 3941 QualType MacroQualifiedType::getModifiedType() const { 3942 // Step over MacroQualifiedTypes from the same macro to find the type 3943 // ultimately qualified by the macro qualifier. 3944 QualType Inner = cast<AttributedType>(getUnderlyingType())->getModifiedType(); 3945 while (auto *InnerMQT = dyn_cast<MacroQualifiedType>(Inner)) { 3946 if (InnerMQT->getMacroIdentifier() != getMacroIdentifier()) 3947 break; 3948 Inner = InnerMQT->getModifiedType(); 3949 } 3950 return Inner; 3951 } 3952 3953 TypeOfExprType::TypeOfExprType(const ASTContext &Context, Expr *E, 3954 TypeOfKind Kind, QualType Can) 3955 : Type(TypeOfExpr, 3956 // We have to protect against 'Can' being invalid through its 3957 // default argument. 3958 Kind == TypeOfKind::Unqualified && !Can.isNull() 3959 ? Context.getUnqualifiedArrayType(Can).getAtomicUnqualifiedType() 3960 : Can, 3961 toTypeDependence(E->getDependence()) | 3962 (E->getType()->getDependence() & 3963 TypeDependence::VariablyModified)), 3964 TOExpr(E), Context(Context) { 3965 TypeOfBits.Kind = static_cast<unsigned>(Kind); 3966 } 3967 3968 bool TypeOfExprType::isSugared() const { 3969 return !TOExpr->isTypeDependent(); 3970 } 3971 3972 QualType TypeOfExprType::desugar() const { 3973 if (isSugared()) { 3974 QualType QT = getUnderlyingExpr()->getType(); 3975 return getKind() == TypeOfKind::Unqualified 3976 ? Context.getUnqualifiedArrayType(QT).getAtomicUnqualifiedType() 3977 : QT; 3978 } 3979 return QualType(this, 0); 3980 } 3981 3982 void DependentTypeOfExprType::Profile(llvm::FoldingSetNodeID &ID, 3983 const ASTContext &Context, Expr *E, 3984 bool IsUnqual) { 3985 E->Profile(ID, Context, true); 3986 ID.AddBoolean(IsUnqual); 3987 } 3988 3989 TypeOfType::TypeOfType(const ASTContext &Context, QualType T, QualType Can, 3990 TypeOfKind Kind) 3991 : Type(TypeOf, 3992 Kind == TypeOfKind::Unqualified 3993 ? Context.getUnqualifiedArrayType(Can).getAtomicUnqualifiedType() 3994 : Can, 3995 T->getDependence()), 3996 TOType(T), Context(Context) { 3997 TypeOfBits.Kind = static_cast<unsigned>(Kind); 3998 } 3999 4000 QualType TypeOfType::desugar() const { 4001 QualType QT = getUnmodifiedType(); 4002 return getKind() == TypeOfKind::Unqualified 4003 ? Context.getUnqualifiedArrayType(QT).getAtomicUnqualifiedType() 4004 : QT; 4005 } 4006 4007 DecltypeType::DecltypeType(Expr *E, QualType underlyingType, QualType can) 4008 // C++11 [temp.type]p2: "If an expression e involves a template parameter, 4009 // decltype(e) denotes a unique dependent type." Hence a decltype type is 4010 // type-dependent even if its expression is only instantiation-dependent. 4011 : Type(Decltype, can, 4012 toTypeDependence(E->getDependence()) | 4013 (E->isInstantiationDependent() ? TypeDependence::Dependent 4014 : TypeDependence::None) | 4015 (E->getType()->getDependence() & 4016 TypeDependence::VariablyModified)), 4017 E(E), UnderlyingType(underlyingType) {} 4018 4019 bool DecltypeType::isSugared() const { return !E->isInstantiationDependent(); } 4020 4021 QualType DecltypeType::desugar() const { 4022 if (isSugared()) 4023 return getUnderlyingType(); 4024 4025 return QualType(this, 0); 4026 } 4027 4028 DependentDecltypeType::DependentDecltypeType(Expr *E, QualType UnderlyingType) 4029 : DecltypeType(E, UnderlyingType) {} 4030 4031 void DependentDecltypeType::Profile(llvm::FoldingSetNodeID &ID, 4032 const ASTContext &Context, Expr *E) { 4033 E->Profile(ID, Context, true); 4034 } 4035 4036 PackIndexingType::PackIndexingType(const ASTContext &Context, 4037 QualType Canonical, QualType Pattern, 4038 Expr *IndexExpr, bool FullySubstituted, 4039 ArrayRef<QualType> Expansions) 4040 : Type(PackIndexing, Canonical, 4041 computeDependence(Pattern, IndexExpr, Expansions)), 4042 Context(Context), Pattern(Pattern), IndexExpr(IndexExpr), 4043 Size(Expansions.size()), FullySubstituted(FullySubstituted) { 4044 4045 std::uninitialized_copy(Expansions.begin(), Expansions.end(), 4046 getTrailingObjects<QualType>()); 4047 } 4048 4049 std::optional<unsigned> PackIndexingType::getSelectedIndex() const { 4050 if (isInstantiationDependentType()) 4051 return std::nullopt; 4052 // Should only be not a constant for error recovery. 4053 ConstantExpr *CE = dyn_cast<ConstantExpr>(getIndexExpr()); 4054 if (!CE) 4055 return std::nullopt; 4056 auto Index = CE->getResultAsAPSInt(); 4057 assert(Index.isNonNegative() && "Invalid index"); 4058 return static_cast<unsigned>(Index.getExtValue()); 4059 } 4060 4061 TypeDependence 4062 PackIndexingType::computeDependence(QualType Pattern, Expr *IndexExpr, 4063 ArrayRef<QualType> Expansions) { 4064 TypeDependence IndexD = toTypeDependence(IndexExpr->getDependence()); 4065 4066 TypeDependence TD = IndexD | (IndexExpr->isInstantiationDependent() 4067 ? TypeDependence::DependentInstantiation 4068 : TypeDependence::None); 4069 if (Expansions.empty()) 4070 TD |= Pattern->getDependence() & TypeDependence::DependentInstantiation; 4071 else 4072 for (const QualType &T : Expansions) 4073 TD |= T->getDependence(); 4074 4075 if (!(IndexD & TypeDependence::UnexpandedPack)) 4076 TD &= ~TypeDependence::UnexpandedPack; 4077 4078 // If the pattern does not contain an unexpended pack, 4079 // the type is still dependent, and invalid 4080 if (!Pattern->containsUnexpandedParameterPack()) 4081 TD |= TypeDependence::Error | TypeDependence::DependentInstantiation; 4082 4083 return TD; 4084 } 4085 4086 void PackIndexingType::Profile(llvm::FoldingSetNodeID &ID, 4087 const ASTContext &Context, QualType Pattern, 4088 Expr *E, bool FullySubstituted) { 4089 Pattern.Profile(ID); 4090 E->Profile(ID, Context, true); 4091 ID.AddBoolean(FullySubstituted); 4092 } 4093 4094 UnaryTransformType::UnaryTransformType(QualType BaseType, 4095 QualType UnderlyingType, UTTKind UKind, 4096 QualType CanonicalType) 4097 : Type(UnaryTransform, CanonicalType, BaseType->getDependence()), 4098 BaseType(BaseType), UnderlyingType(UnderlyingType), UKind(UKind) {} 4099 4100 DependentUnaryTransformType::DependentUnaryTransformType(const ASTContext &C, 4101 QualType BaseType, 4102 UTTKind UKind) 4103 : UnaryTransformType(BaseType, C.DependentTy, UKind, QualType()) {} 4104 4105 TagType::TagType(TypeClass TC, const TagDecl *D, QualType can) 4106 : Type(TC, can, 4107 D->isDependentType() ? TypeDependence::DependentInstantiation 4108 : TypeDependence::None), 4109 decl(const_cast<TagDecl *>(D)) {} 4110 4111 static TagDecl *getInterestingTagDecl(TagDecl *decl) { 4112 for (auto *I : decl->redecls()) { 4113 if (I->isCompleteDefinition() || I->isBeingDefined()) 4114 return I; 4115 } 4116 // If there's no definition (not even in progress), return what we have. 4117 return decl; 4118 } 4119 4120 TagDecl *TagType::getDecl() const { 4121 return getInterestingTagDecl(decl); 4122 } 4123 4124 bool TagType::isBeingDefined() const { 4125 return getDecl()->isBeingDefined(); 4126 } 4127 4128 bool RecordType::hasConstFields() const { 4129 std::vector<const RecordType*> RecordTypeList; 4130 RecordTypeList.push_back(this); 4131 unsigned NextToCheckIndex = 0; 4132 4133 while (RecordTypeList.size() > NextToCheckIndex) { 4134 for (FieldDecl *FD : 4135 RecordTypeList[NextToCheckIndex]->getDecl()->fields()) { 4136 QualType FieldTy = FD->getType(); 4137 if (FieldTy.isConstQualified()) 4138 return true; 4139 FieldTy = FieldTy.getCanonicalType(); 4140 if (const auto *FieldRecTy = FieldTy->getAs<RecordType>()) { 4141 if (!llvm::is_contained(RecordTypeList, FieldRecTy)) 4142 RecordTypeList.push_back(FieldRecTy); 4143 } 4144 } 4145 ++NextToCheckIndex; 4146 } 4147 return false; 4148 } 4149 4150 AttributedType::AttributedType(QualType canon, const Attr *attr, 4151 QualType modified, QualType equivalent) 4152 : AttributedType(canon, attr->getKind(), attr, modified, equivalent) {} 4153 4154 AttributedType::AttributedType(QualType canon, attr::Kind attrKind, 4155 const Attr *attr, QualType modified, 4156 QualType equivalent) 4157 : Type(Attributed, canon, equivalent->getDependence()), Attribute(attr), 4158 ModifiedType(modified), EquivalentType(equivalent) { 4159 AttributedTypeBits.AttrKind = attrKind; 4160 assert(!attr || attr->getKind() == attrKind); 4161 } 4162 4163 bool AttributedType::isQualifier() const { 4164 // FIXME: Generate this with TableGen. 4165 switch (getAttrKind()) { 4166 // These are type qualifiers in the traditional C sense: they annotate 4167 // something about a specific value/variable of a type. (They aren't 4168 // always part of the canonical type, though.) 4169 case attr::ObjCGC: 4170 case attr::ObjCOwnership: 4171 case attr::ObjCInertUnsafeUnretained: 4172 case attr::TypeNonNull: 4173 case attr::TypeNullable: 4174 case attr::TypeNullableResult: 4175 case attr::TypeNullUnspecified: 4176 case attr::LifetimeBound: 4177 case attr::AddressSpace: 4178 return true; 4179 4180 // All other type attributes aren't qualifiers; they rewrite the modified 4181 // type to be a semantically different type. 4182 default: 4183 return false; 4184 } 4185 } 4186 4187 bool AttributedType::isMSTypeSpec() const { 4188 // FIXME: Generate this with TableGen? 4189 switch (getAttrKind()) { 4190 default: return false; 4191 case attr::Ptr32: 4192 case attr::Ptr64: 4193 case attr::SPtr: 4194 case attr::UPtr: 4195 return true; 4196 } 4197 llvm_unreachable("invalid attr kind"); 4198 } 4199 4200 bool AttributedType::isWebAssemblyFuncrefSpec() const { 4201 return getAttrKind() == attr::WebAssemblyFuncref; 4202 } 4203 4204 bool AttributedType::isCallingConv() const { 4205 // FIXME: Generate this with TableGen. 4206 switch (getAttrKind()) { 4207 default: return false; 4208 case attr::Pcs: 4209 case attr::CDecl: 4210 case attr::FastCall: 4211 case attr::StdCall: 4212 case attr::ThisCall: 4213 case attr::RegCall: 4214 case attr::SwiftCall: 4215 case attr::SwiftAsyncCall: 4216 case attr::VectorCall: 4217 case attr::AArch64VectorPcs: 4218 case attr::AArch64SVEPcs: 4219 case attr::AMDGPUKernelCall: 4220 case attr::Pascal: 4221 case attr::MSABI: 4222 case attr::SysVABI: 4223 case attr::IntelOclBicc: 4224 case attr::PreserveMost: 4225 case attr::PreserveAll: 4226 case attr::M68kRTD: 4227 case attr::PreserveNone: 4228 case attr::RISCVVectorCC: 4229 return true; 4230 } 4231 llvm_unreachable("invalid attr kind"); 4232 } 4233 4234 CXXRecordDecl *InjectedClassNameType::getDecl() const { 4235 return cast<CXXRecordDecl>(getInterestingTagDecl(Decl)); 4236 } 4237 4238 IdentifierInfo *TemplateTypeParmType::getIdentifier() const { 4239 return isCanonicalUnqualified() ? nullptr : getDecl()->getIdentifier(); 4240 } 4241 4242 static const TemplateTypeParmDecl *getReplacedParameter(Decl *D, 4243 unsigned Index) { 4244 if (const auto *TTP = dyn_cast<TemplateTypeParmDecl>(D)) 4245 return TTP; 4246 return cast<TemplateTypeParmDecl>( 4247 getReplacedTemplateParameterList(D)->getParam(Index)); 4248 } 4249 4250 SubstTemplateTypeParmType::SubstTemplateTypeParmType( 4251 QualType Replacement, Decl *AssociatedDecl, unsigned Index, 4252 std::optional<unsigned> PackIndex, SubstTemplateTypeParmTypeFlag Flag) 4253 : Type(SubstTemplateTypeParm, Replacement.getCanonicalType(), 4254 Replacement->getDependence()), 4255 AssociatedDecl(AssociatedDecl) { 4256 SubstTemplateTypeParmTypeBits.HasNonCanonicalUnderlyingType = 4257 Replacement != getCanonicalTypeInternal(); 4258 if (SubstTemplateTypeParmTypeBits.HasNonCanonicalUnderlyingType) 4259 *getTrailingObjects<QualType>() = Replacement; 4260 4261 SubstTemplateTypeParmTypeBits.Index = Index; 4262 SubstTemplateTypeParmTypeBits.PackIndex = PackIndex ? *PackIndex + 1 : 0; 4263 SubstTemplateTypeParmTypeBits.SubstitutionFlag = llvm::to_underlying(Flag); 4264 assert((Flag != SubstTemplateTypeParmTypeFlag::ExpandPacksInPlace || 4265 PackIndex) && 4266 "ExpandPacksInPlace needs a valid PackIndex"); 4267 assert(AssociatedDecl != nullptr); 4268 } 4269 4270 const TemplateTypeParmDecl * 4271 SubstTemplateTypeParmType::getReplacedParameter() const { 4272 return ::getReplacedParameter(getAssociatedDecl(), getIndex()); 4273 } 4274 4275 SubstTemplateTypeParmPackType::SubstTemplateTypeParmPackType( 4276 QualType Canon, Decl *AssociatedDecl, unsigned Index, bool Final, 4277 const TemplateArgument &ArgPack) 4278 : Type(SubstTemplateTypeParmPack, Canon, 4279 TypeDependence::DependentInstantiation | 4280 TypeDependence::UnexpandedPack), 4281 Arguments(ArgPack.pack_begin()), 4282 AssociatedDeclAndFinal(AssociatedDecl, Final) { 4283 SubstTemplateTypeParmPackTypeBits.Index = Index; 4284 SubstTemplateTypeParmPackTypeBits.NumArgs = ArgPack.pack_size(); 4285 assert(AssociatedDecl != nullptr); 4286 } 4287 4288 Decl *SubstTemplateTypeParmPackType::getAssociatedDecl() const { 4289 return AssociatedDeclAndFinal.getPointer(); 4290 } 4291 4292 bool SubstTemplateTypeParmPackType::getFinal() const { 4293 return AssociatedDeclAndFinal.getInt(); 4294 } 4295 4296 const TemplateTypeParmDecl * 4297 SubstTemplateTypeParmPackType::getReplacedParameter() const { 4298 return ::getReplacedParameter(getAssociatedDecl(), getIndex()); 4299 } 4300 4301 IdentifierInfo *SubstTemplateTypeParmPackType::getIdentifier() const { 4302 return getReplacedParameter()->getIdentifier(); 4303 } 4304 4305 TemplateArgument SubstTemplateTypeParmPackType::getArgumentPack() const { 4306 return TemplateArgument(llvm::ArrayRef(Arguments, getNumArgs())); 4307 } 4308 4309 void SubstTemplateTypeParmPackType::Profile(llvm::FoldingSetNodeID &ID) { 4310 Profile(ID, getAssociatedDecl(), getIndex(), getFinal(), getArgumentPack()); 4311 } 4312 4313 void SubstTemplateTypeParmPackType::Profile(llvm::FoldingSetNodeID &ID, 4314 const Decl *AssociatedDecl, 4315 unsigned Index, bool Final, 4316 const TemplateArgument &ArgPack) { 4317 ID.AddPointer(AssociatedDecl); 4318 ID.AddInteger(Index); 4319 ID.AddBoolean(Final); 4320 ID.AddInteger(ArgPack.pack_size()); 4321 for (const auto &P : ArgPack.pack_elements()) 4322 ID.AddPointer(P.getAsType().getAsOpaquePtr()); 4323 } 4324 4325 bool TemplateSpecializationType::anyDependentTemplateArguments( 4326 const TemplateArgumentListInfo &Args, ArrayRef<TemplateArgument> Converted) { 4327 return anyDependentTemplateArguments(Args.arguments(), Converted); 4328 } 4329 4330 bool TemplateSpecializationType::anyDependentTemplateArguments( 4331 ArrayRef<TemplateArgumentLoc> Args, ArrayRef<TemplateArgument> Converted) { 4332 for (const TemplateArgument &Arg : Converted) 4333 if (Arg.isDependent()) 4334 return true; 4335 return false; 4336 } 4337 4338 bool TemplateSpecializationType::anyInstantiationDependentTemplateArguments( 4339 ArrayRef<TemplateArgumentLoc> Args) { 4340 for (const TemplateArgumentLoc &ArgLoc : Args) { 4341 if (ArgLoc.getArgument().isInstantiationDependent()) 4342 return true; 4343 } 4344 return false; 4345 } 4346 4347 TemplateSpecializationType::TemplateSpecializationType( 4348 TemplateName T, ArrayRef<TemplateArgument> Args, QualType Canon, 4349 QualType AliasedType) 4350 : Type(TemplateSpecialization, Canon.isNull() ? QualType(this, 0) : Canon, 4351 (Canon.isNull() 4352 ? TypeDependence::DependentInstantiation 4353 : toSemanticDependence(Canon->getDependence())) | 4354 (toTypeDependence(T.getDependence()) & 4355 TypeDependence::UnexpandedPack)), 4356 Template(T) { 4357 TemplateSpecializationTypeBits.NumArgs = Args.size(); 4358 TemplateSpecializationTypeBits.TypeAlias = !AliasedType.isNull(); 4359 4360 assert(!T.getAsDependentTemplateName() && 4361 "Use DependentTemplateSpecializationType for dependent template-name"); 4362 assert((T.getKind() == TemplateName::Template || 4363 T.getKind() == TemplateName::SubstTemplateTemplateParm || 4364 T.getKind() == TemplateName::SubstTemplateTemplateParmPack || 4365 T.getKind() == TemplateName::UsingTemplate || 4366 T.getKind() == TemplateName::QualifiedTemplate || 4367 T.getKind() == TemplateName::DeducedTemplate) && 4368 "Unexpected template name for TemplateSpecializationType"); 4369 4370 auto *TemplateArgs = reinterpret_cast<TemplateArgument *>(this + 1); 4371 for (const TemplateArgument &Arg : Args) { 4372 // Update instantiation-dependent, variably-modified, and error bits. 4373 // If the canonical type exists and is non-dependent, the template 4374 // specialization type can be non-dependent even if one of the type 4375 // arguments is. Given: 4376 // template<typename T> using U = int; 4377 // U<T> is always non-dependent, irrespective of the type T. 4378 // However, U<Ts> contains an unexpanded parameter pack, even though 4379 // its expansion (and thus its desugared type) doesn't. 4380 addDependence(toTypeDependence(Arg.getDependence()) & 4381 ~TypeDependence::Dependent); 4382 if (Arg.getKind() == TemplateArgument::Type) 4383 addDependence(Arg.getAsType()->getDependence() & 4384 TypeDependence::VariablyModified); 4385 new (TemplateArgs++) TemplateArgument(Arg); 4386 } 4387 4388 // Store the aliased type if this is a type alias template specialization. 4389 if (isTypeAlias()) { 4390 auto *Begin = reinterpret_cast<TemplateArgument *>(this + 1); 4391 *reinterpret_cast<QualType *>(Begin + Args.size()) = AliasedType; 4392 } 4393 } 4394 4395 QualType TemplateSpecializationType::getAliasedType() const { 4396 assert(isTypeAlias() && "not a type alias template specialization"); 4397 return *reinterpret_cast<const QualType *>(template_arguments().end()); 4398 } 4399 4400 void TemplateSpecializationType::Profile(llvm::FoldingSetNodeID &ID, 4401 const ASTContext &Ctx) { 4402 Profile(ID, Template, template_arguments(), Ctx); 4403 if (isTypeAlias()) 4404 getAliasedType().Profile(ID); 4405 } 4406 4407 void 4408 TemplateSpecializationType::Profile(llvm::FoldingSetNodeID &ID, 4409 TemplateName T, 4410 ArrayRef<TemplateArgument> Args, 4411 const ASTContext &Context) { 4412 T.Profile(ID); 4413 for (const TemplateArgument &Arg : Args) 4414 Arg.Profile(ID, Context); 4415 } 4416 4417 QualType 4418 QualifierCollector::apply(const ASTContext &Context, QualType QT) const { 4419 if (!hasNonFastQualifiers()) 4420 return QT.withFastQualifiers(getFastQualifiers()); 4421 4422 return Context.getQualifiedType(QT, *this); 4423 } 4424 4425 QualType 4426 QualifierCollector::apply(const ASTContext &Context, const Type *T) const { 4427 if (!hasNonFastQualifiers()) 4428 return QualType(T, getFastQualifiers()); 4429 4430 return Context.getQualifiedType(T, *this); 4431 } 4432 4433 void ObjCObjectTypeImpl::Profile(llvm::FoldingSetNodeID &ID, 4434 QualType BaseType, 4435 ArrayRef<QualType> typeArgs, 4436 ArrayRef<ObjCProtocolDecl *> protocols, 4437 bool isKindOf) { 4438 ID.AddPointer(BaseType.getAsOpaquePtr()); 4439 ID.AddInteger(typeArgs.size()); 4440 for (auto typeArg : typeArgs) 4441 ID.AddPointer(typeArg.getAsOpaquePtr()); 4442 ID.AddInteger(protocols.size()); 4443 for (auto *proto : protocols) 4444 ID.AddPointer(proto); 4445 ID.AddBoolean(isKindOf); 4446 } 4447 4448 void ObjCObjectTypeImpl::Profile(llvm::FoldingSetNodeID &ID) { 4449 Profile(ID, getBaseType(), getTypeArgsAsWritten(), 4450 llvm::ArrayRef(qual_begin(), getNumProtocols()), 4451 isKindOfTypeAsWritten()); 4452 } 4453 4454 void ObjCTypeParamType::Profile(llvm::FoldingSetNodeID &ID, 4455 const ObjCTypeParamDecl *OTPDecl, 4456 QualType CanonicalType, 4457 ArrayRef<ObjCProtocolDecl *> protocols) { 4458 ID.AddPointer(OTPDecl); 4459 ID.AddPointer(CanonicalType.getAsOpaquePtr()); 4460 ID.AddInteger(protocols.size()); 4461 for (auto *proto : protocols) 4462 ID.AddPointer(proto); 4463 } 4464 4465 void ObjCTypeParamType::Profile(llvm::FoldingSetNodeID &ID) { 4466 Profile(ID, getDecl(), getCanonicalTypeInternal(), 4467 llvm::ArrayRef(qual_begin(), getNumProtocols())); 4468 } 4469 4470 namespace { 4471 4472 /// The cached properties of a type. 4473 class CachedProperties { 4474 Linkage L; 4475 bool local; 4476 4477 public: 4478 CachedProperties(Linkage L, bool local) : L(L), local(local) {} 4479 4480 Linkage getLinkage() const { return L; } 4481 bool hasLocalOrUnnamedType() const { return local; } 4482 4483 friend CachedProperties merge(CachedProperties L, CachedProperties R) { 4484 Linkage MergedLinkage = minLinkage(L.L, R.L); 4485 return CachedProperties(MergedLinkage, L.hasLocalOrUnnamedType() || 4486 R.hasLocalOrUnnamedType()); 4487 } 4488 }; 4489 4490 } // namespace 4491 4492 static CachedProperties computeCachedProperties(const Type *T); 4493 4494 namespace clang { 4495 4496 /// The type-property cache. This is templated so as to be 4497 /// instantiated at an internal type to prevent unnecessary symbol 4498 /// leakage. 4499 template <class Private> class TypePropertyCache { 4500 public: 4501 static CachedProperties get(QualType T) { 4502 return get(T.getTypePtr()); 4503 } 4504 4505 static CachedProperties get(const Type *T) { 4506 ensure(T); 4507 return CachedProperties(T->TypeBits.getLinkage(), 4508 T->TypeBits.hasLocalOrUnnamedType()); 4509 } 4510 4511 static void ensure(const Type *T) { 4512 // If the cache is valid, we're okay. 4513 if (T->TypeBits.isCacheValid()) return; 4514 4515 // If this type is non-canonical, ask its canonical type for the 4516 // relevant information. 4517 if (!T->isCanonicalUnqualified()) { 4518 const Type *CT = T->getCanonicalTypeInternal().getTypePtr(); 4519 ensure(CT); 4520 T->TypeBits.CacheValid = true; 4521 T->TypeBits.CachedLinkage = CT->TypeBits.CachedLinkage; 4522 T->TypeBits.CachedLocalOrUnnamed = CT->TypeBits.CachedLocalOrUnnamed; 4523 return; 4524 } 4525 4526 // Compute the cached properties and then set the cache. 4527 CachedProperties Result = computeCachedProperties(T); 4528 T->TypeBits.CacheValid = true; 4529 T->TypeBits.CachedLinkage = llvm::to_underlying(Result.getLinkage()); 4530 T->TypeBits.CachedLocalOrUnnamed = Result.hasLocalOrUnnamedType(); 4531 } 4532 }; 4533 4534 } // namespace clang 4535 4536 // Instantiate the friend template at a private class. In a 4537 // reasonable implementation, these symbols will be internal. 4538 // It is terrible that this is the best way to accomplish this. 4539 namespace { 4540 4541 class Private {}; 4542 4543 } // namespace 4544 4545 using Cache = TypePropertyCache<Private>; 4546 4547 static CachedProperties computeCachedProperties(const Type *T) { 4548 switch (T->getTypeClass()) { 4549 #define TYPE(Class,Base) 4550 #define NON_CANONICAL_TYPE(Class,Base) case Type::Class: 4551 #include "clang/AST/TypeNodes.inc" 4552 llvm_unreachable("didn't expect a non-canonical type here"); 4553 4554 #define TYPE(Class,Base) 4555 #define DEPENDENT_TYPE(Class,Base) case Type::Class: 4556 #define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class,Base) case Type::Class: 4557 #include "clang/AST/TypeNodes.inc" 4558 // Treat instantiation-dependent types as external. 4559 assert(T->isInstantiationDependentType()); 4560 return CachedProperties(Linkage::External, false); 4561 4562 case Type::Auto: 4563 case Type::DeducedTemplateSpecialization: 4564 // Give non-deduced 'auto' types external linkage. We should only see them 4565 // here in error recovery. 4566 return CachedProperties(Linkage::External, false); 4567 4568 case Type::BitInt: 4569 case Type::Builtin: 4570 // C++ [basic.link]p8: 4571 // A type is said to have linkage if and only if: 4572 // - it is a fundamental type (3.9.1); or 4573 return CachedProperties(Linkage::External, false); 4574 4575 case Type::Record: 4576 case Type::Enum: { 4577 const TagDecl *Tag = cast<TagType>(T)->getDecl(); 4578 4579 // C++ [basic.link]p8: 4580 // - it is a class or enumeration type that is named (or has a name 4581 // for linkage purposes (7.1.3)) and the name has linkage; or 4582 // - it is a specialization of a class template (14); or 4583 Linkage L = Tag->getLinkageInternal(); 4584 bool IsLocalOrUnnamed = 4585 Tag->getDeclContext()->isFunctionOrMethod() || 4586 !Tag->hasNameForLinkage(); 4587 return CachedProperties(L, IsLocalOrUnnamed); 4588 } 4589 4590 // C++ [basic.link]p8: 4591 // - it is a compound type (3.9.2) other than a class or enumeration, 4592 // compounded exclusively from types that have linkage; or 4593 case Type::Complex: 4594 return Cache::get(cast<ComplexType>(T)->getElementType()); 4595 case Type::Pointer: 4596 return Cache::get(cast<PointerType>(T)->getPointeeType()); 4597 case Type::BlockPointer: 4598 return Cache::get(cast<BlockPointerType>(T)->getPointeeType()); 4599 case Type::LValueReference: 4600 case Type::RValueReference: 4601 return Cache::get(cast<ReferenceType>(T)->getPointeeType()); 4602 case Type::MemberPointer: { 4603 const auto *MPT = cast<MemberPointerType>(T); 4604 return merge(Cache::get(MPT->getClass()), 4605 Cache::get(MPT->getPointeeType())); 4606 } 4607 case Type::ConstantArray: 4608 case Type::IncompleteArray: 4609 case Type::VariableArray: 4610 case Type::ArrayParameter: 4611 return Cache::get(cast<ArrayType>(T)->getElementType()); 4612 case Type::Vector: 4613 case Type::ExtVector: 4614 return Cache::get(cast<VectorType>(T)->getElementType()); 4615 case Type::ConstantMatrix: 4616 return Cache::get(cast<ConstantMatrixType>(T)->getElementType()); 4617 case Type::FunctionNoProto: 4618 return Cache::get(cast<FunctionType>(T)->getReturnType()); 4619 case Type::FunctionProto: { 4620 const auto *FPT = cast<FunctionProtoType>(T); 4621 CachedProperties result = Cache::get(FPT->getReturnType()); 4622 for (const auto &ai : FPT->param_types()) 4623 result = merge(result, Cache::get(ai)); 4624 return result; 4625 } 4626 case Type::ObjCInterface: { 4627 Linkage L = cast<ObjCInterfaceType>(T)->getDecl()->getLinkageInternal(); 4628 return CachedProperties(L, false); 4629 } 4630 case Type::ObjCObject: 4631 return Cache::get(cast<ObjCObjectType>(T)->getBaseType()); 4632 case Type::ObjCObjectPointer: 4633 return Cache::get(cast<ObjCObjectPointerType>(T)->getPointeeType()); 4634 case Type::Atomic: 4635 return Cache::get(cast<AtomicType>(T)->getValueType()); 4636 case Type::Pipe: 4637 return Cache::get(cast<PipeType>(T)->getElementType()); 4638 case Type::HLSLAttributedResource: 4639 return Cache::get(cast<HLSLAttributedResourceType>(T)->getWrappedType()); 4640 } 4641 4642 llvm_unreachable("unhandled type class"); 4643 } 4644 4645 /// Determine the linkage of this type. 4646 Linkage Type::getLinkage() const { 4647 Cache::ensure(this); 4648 return TypeBits.getLinkage(); 4649 } 4650 4651 bool Type::hasUnnamedOrLocalType() const { 4652 Cache::ensure(this); 4653 return TypeBits.hasLocalOrUnnamedType(); 4654 } 4655 4656 LinkageInfo LinkageComputer::computeTypeLinkageInfo(const Type *T) { 4657 switch (T->getTypeClass()) { 4658 #define TYPE(Class,Base) 4659 #define NON_CANONICAL_TYPE(Class,Base) case Type::Class: 4660 #include "clang/AST/TypeNodes.inc" 4661 llvm_unreachable("didn't expect a non-canonical type here"); 4662 4663 #define TYPE(Class,Base) 4664 #define DEPENDENT_TYPE(Class,Base) case Type::Class: 4665 #define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class,Base) case Type::Class: 4666 #include "clang/AST/TypeNodes.inc" 4667 // Treat instantiation-dependent types as external. 4668 assert(T->isInstantiationDependentType()); 4669 return LinkageInfo::external(); 4670 4671 case Type::BitInt: 4672 case Type::Builtin: 4673 return LinkageInfo::external(); 4674 4675 case Type::Auto: 4676 case Type::DeducedTemplateSpecialization: 4677 return LinkageInfo::external(); 4678 4679 case Type::Record: 4680 case Type::Enum: 4681 return getDeclLinkageAndVisibility(cast<TagType>(T)->getDecl()); 4682 4683 case Type::Complex: 4684 return computeTypeLinkageInfo(cast<ComplexType>(T)->getElementType()); 4685 case Type::Pointer: 4686 return computeTypeLinkageInfo(cast<PointerType>(T)->getPointeeType()); 4687 case Type::BlockPointer: 4688 return computeTypeLinkageInfo(cast<BlockPointerType>(T)->getPointeeType()); 4689 case Type::LValueReference: 4690 case Type::RValueReference: 4691 return computeTypeLinkageInfo(cast<ReferenceType>(T)->getPointeeType()); 4692 case Type::MemberPointer: { 4693 const auto *MPT = cast<MemberPointerType>(T); 4694 LinkageInfo LV = computeTypeLinkageInfo(MPT->getClass()); 4695 LV.merge(computeTypeLinkageInfo(MPT->getPointeeType())); 4696 return LV; 4697 } 4698 case Type::ConstantArray: 4699 case Type::IncompleteArray: 4700 case Type::VariableArray: 4701 case Type::ArrayParameter: 4702 return computeTypeLinkageInfo(cast<ArrayType>(T)->getElementType()); 4703 case Type::Vector: 4704 case Type::ExtVector: 4705 return computeTypeLinkageInfo(cast<VectorType>(T)->getElementType()); 4706 case Type::ConstantMatrix: 4707 return computeTypeLinkageInfo( 4708 cast<ConstantMatrixType>(T)->getElementType()); 4709 case Type::FunctionNoProto: 4710 return computeTypeLinkageInfo(cast<FunctionType>(T)->getReturnType()); 4711 case Type::FunctionProto: { 4712 const auto *FPT = cast<FunctionProtoType>(T); 4713 LinkageInfo LV = computeTypeLinkageInfo(FPT->getReturnType()); 4714 for (const auto &ai : FPT->param_types()) 4715 LV.merge(computeTypeLinkageInfo(ai)); 4716 return LV; 4717 } 4718 case Type::ObjCInterface: 4719 return getDeclLinkageAndVisibility(cast<ObjCInterfaceType>(T)->getDecl()); 4720 case Type::ObjCObject: 4721 return computeTypeLinkageInfo(cast<ObjCObjectType>(T)->getBaseType()); 4722 case Type::ObjCObjectPointer: 4723 return computeTypeLinkageInfo( 4724 cast<ObjCObjectPointerType>(T)->getPointeeType()); 4725 case Type::Atomic: 4726 return computeTypeLinkageInfo(cast<AtomicType>(T)->getValueType()); 4727 case Type::Pipe: 4728 return computeTypeLinkageInfo(cast<PipeType>(T)->getElementType()); 4729 case Type::HLSLAttributedResource: 4730 return computeTypeLinkageInfo(cast<HLSLAttributedResourceType>(T) 4731 ->getContainedType() 4732 ->getCanonicalTypeInternal()); 4733 } 4734 4735 llvm_unreachable("unhandled type class"); 4736 } 4737 4738 bool Type::isLinkageValid() const { 4739 if (!TypeBits.isCacheValid()) 4740 return true; 4741 4742 Linkage L = LinkageComputer{} 4743 .computeTypeLinkageInfo(getCanonicalTypeInternal()) 4744 .getLinkage(); 4745 return L == TypeBits.getLinkage(); 4746 } 4747 4748 LinkageInfo LinkageComputer::getTypeLinkageAndVisibility(const Type *T) { 4749 if (!T->isCanonicalUnqualified()) 4750 return computeTypeLinkageInfo(T->getCanonicalTypeInternal()); 4751 4752 LinkageInfo LV = computeTypeLinkageInfo(T); 4753 assert(LV.getLinkage() == T->getLinkage()); 4754 return LV; 4755 } 4756 4757 LinkageInfo Type::getLinkageAndVisibility() const { 4758 return LinkageComputer{}.getTypeLinkageAndVisibility(this); 4759 } 4760 4761 std::optional<NullabilityKind> Type::getNullability() const { 4762 QualType Type(this, 0); 4763 while (const auto *AT = Type->getAs<AttributedType>()) { 4764 // Check whether this is an attributed type with nullability 4765 // information. 4766 if (auto Nullability = AT->getImmediateNullability()) 4767 return Nullability; 4768 4769 Type = AT->getEquivalentType(); 4770 } 4771 return std::nullopt; 4772 } 4773 4774 bool Type::canHaveNullability(bool ResultIfUnknown) const { 4775 QualType type = getCanonicalTypeInternal(); 4776 4777 switch (type->getTypeClass()) { 4778 // We'll only see canonical types here. 4779 #define NON_CANONICAL_TYPE(Class, Parent) \ 4780 case Type::Class: \ 4781 llvm_unreachable("non-canonical type"); 4782 #define TYPE(Class, Parent) 4783 #include "clang/AST/TypeNodes.inc" 4784 4785 // Pointer types. 4786 case Type::Pointer: 4787 case Type::BlockPointer: 4788 case Type::MemberPointer: 4789 case Type::ObjCObjectPointer: 4790 return true; 4791 4792 // Dependent types that could instantiate to pointer types. 4793 case Type::UnresolvedUsing: 4794 case Type::TypeOfExpr: 4795 case Type::TypeOf: 4796 case Type::Decltype: 4797 case Type::PackIndexing: 4798 case Type::UnaryTransform: 4799 case Type::TemplateTypeParm: 4800 case Type::SubstTemplateTypeParmPack: 4801 case Type::DependentName: 4802 case Type::DependentTemplateSpecialization: 4803 case Type::Auto: 4804 return ResultIfUnknown; 4805 4806 // Dependent template specializations could instantiate to pointer types. 4807 case Type::TemplateSpecialization: 4808 // If it's a known class template, we can already check if it's nullable. 4809 if (TemplateDecl *templateDecl = 4810 cast<TemplateSpecializationType>(type.getTypePtr()) 4811 ->getTemplateName() 4812 .getAsTemplateDecl()) 4813 if (auto *CTD = dyn_cast<ClassTemplateDecl>(templateDecl)) 4814 return llvm::any_of( 4815 CTD->redecls(), [](const RedeclarableTemplateDecl *RTD) { 4816 return RTD->getTemplatedDecl()->hasAttr<TypeNullableAttr>(); 4817 }); 4818 return ResultIfUnknown; 4819 4820 case Type::Builtin: 4821 switch (cast<BuiltinType>(type.getTypePtr())->getKind()) { 4822 // Signed, unsigned, and floating-point types cannot have nullability. 4823 #define SIGNED_TYPE(Id, SingletonId) case BuiltinType::Id: 4824 #define UNSIGNED_TYPE(Id, SingletonId) case BuiltinType::Id: 4825 #define FLOATING_TYPE(Id, SingletonId) case BuiltinType::Id: 4826 #define BUILTIN_TYPE(Id, SingletonId) 4827 #include "clang/AST/BuiltinTypes.def" 4828 return false; 4829 4830 case BuiltinType::UnresolvedTemplate: 4831 // Dependent types that could instantiate to a pointer type. 4832 case BuiltinType::Dependent: 4833 case BuiltinType::Overload: 4834 case BuiltinType::BoundMember: 4835 case BuiltinType::PseudoObject: 4836 case BuiltinType::UnknownAny: 4837 case BuiltinType::ARCUnbridgedCast: 4838 return ResultIfUnknown; 4839 4840 case BuiltinType::Void: 4841 case BuiltinType::ObjCId: 4842 case BuiltinType::ObjCClass: 4843 case BuiltinType::ObjCSel: 4844 #define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \ 4845 case BuiltinType::Id: 4846 #include "clang/Basic/OpenCLImageTypes.def" 4847 #define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \ 4848 case BuiltinType::Id: 4849 #include "clang/Basic/OpenCLExtensionTypes.def" 4850 case BuiltinType::OCLSampler: 4851 case BuiltinType::OCLEvent: 4852 case BuiltinType::OCLClkEvent: 4853 case BuiltinType::OCLQueue: 4854 case BuiltinType::OCLReserveID: 4855 #define SVE_TYPE(Name, Id, SingletonId) \ 4856 case BuiltinType::Id: 4857 #include "clang/Basic/AArch64SVEACLETypes.def" 4858 #define PPC_VECTOR_TYPE(Name, Id, Size) \ 4859 case BuiltinType::Id: 4860 #include "clang/Basic/PPCTypes.def" 4861 #define RVV_TYPE(Name, Id, SingletonId) case BuiltinType::Id: 4862 #include "clang/Basic/RISCVVTypes.def" 4863 #define WASM_TYPE(Name, Id, SingletonId) case BuiltinType::Id: 4864 #include "clang/Basic/WebAssemblyReferenceTypes.def" 4865 #define AMDGPU_TYPE(Name, Id, SingletonId, Width, Align) case BuiltinType::Id: 4866 #include "clang/Basic/AMDGPUTypes.def" 4867 #define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) case BuiltinType::Id: 4868 #include "clang/Basic/HLSLIntangibleTypes.def" 4869 case BuiltinType::BuiltinFn: 4870 case BuiltinType::NullPtr: 4871 case BuiltinType::IncompleteMatrixIdx: 4872 case BuiltinType::ArraySection: 4873 case BuiltinType::OMPArrayShaping: 4874 case BuiltinType::OMPIterator: 4875 return false; 4876 } 4877 llvm_unreachable("unknown builtin type"); 4878 4879 case Type::Record: { 4880 const RecordDecl *RD = cast<RecordType>(type)->getDecl(); 4881 // For template specializations, look only at primary template attributes. 4882 // This is a consistent regardless of whether the instantiation is known. 4883 if (const auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(RD)) 4884 return llvm::any_of( 4885 CTSD->getSpecializedTemplate()->redecls(), 4886 [](const RedeclarableTemplateDecl *RTD) { 4887 return RTD->getTemplatedDecl()->hasAttr<TypeNullableAttr>(); 4888 }); 4889 return llvm::any_of(RD->redecls(), [](const TagDecl *RD) { 4890 return RD->hasAttr<TypeNullableAttr>(); 4891 }); 4892 } 4893 4894 // Non-pointer types. 4895 case Type::Complex: 4896 case Type::LValueReference: 4897 case Type::RValueReference: 4898 case Type::ConstantArray: 4899 case Type::IncompleteArray: 4900 case Type::VariableArray: 4901 case Type::DependentSizedArray: 4902 case Type::DependentVector: 4903 case Type::DependentSizedExtVector: 4904 case Type::Vector: 4905 case Type::ExtVector: 4906 case Type::ConstantMatrix: 4907 case Type::DependentSizedMatrix: 4908 case Type::DependentAddressSpace: 4909 case Type::FunctionProto: 4910 case Type::FunctionNoProto: 4911 case Type::DeducedTemplateSpecialization: 4912 case Type::Enum: 4913 case Type::InjectedClassName: 4914 case Type::PackExpansion: 4915 case Type::ObjCObject: 4916 case Type::ObjCInterface: 4917 case Type::Atomic: 4918 case Type::Pipe: 4919 case Type::BitInt: 4920 case Type::DependentBitInt: 4921 case Type::ArrayParameter: 4922 case Type::HLSLAttributedResource: 4923 return false; 4924 } 4925 llvm_unreachable("bad type kind!"); 4926 } 4927 4928 std::optional<NullabilityKind> AttributedType::getImmediateNullability() const { 4929 if (getAttrKind() == attr::TypeNonNull) 4930 return NullabilityKind::NonNull; 4931 if (getAttrKind() == attr::TypeNullable) 4932 return NullabilityKind::Nullable; 4933 if (getAttrKind() == attr::TypeNullUnspecified) 4934 return NullabilityKind::Unspecified; 4935 if (getAttrKind() == attr::TypeNullableResult) 4936 return NullabilityKind::NullableResult; 4937 return std::nullopt; 4938 } 4939 4940 std::optional<NullabilityKind> 4941 AttributedType::stripOuterNullability(QualType &T) { 4942 QualType AttrTy = T; 4943 if (auto MacroTy = dyn_cast<MacroQualifiedType>(T)) 4944 AttrTy = MacroTy->getUnderlyingType(); 4945 4946 if (auto attributed = dyn_cast<AttributedType>(AttrTy)) { 4947 if (auto nullability = attributed->getImmediateNullability()) { 4948 T = attributed->getModifiedType(); 4949 return nullability; 4950 } 4951 } 4952 4953 return std::nullopt; 4954 } 4955 4956 bool Type::isBlockCompatibleObjCPointerType(ASTContext &ctx) const { 4957 const auto *objcPtr = getAs<ObjCObjectPointerType>(); 4958 if (!objcPtr) 4959 return false; 4960 4961 if (objcPtr->isObjCIdType()) { 4962 // id is always okay. 4963 return true; 4964 } 4965 4966 // Blocks are NSObjects. 4967 if (ObjCInterfaceDecl *iface = objcPtr->getInterfaceDecl()) { 4968 if (iface->getIdentifier() != ctx.getNSObjectName()) 4969 return false; 4970 4971 // Continue to check qualifiers, below. 4972 } else if (objcPtr->isObjCQualifiedIdType()) { 4973 // Continue to check qualifiers, below. 4974 } else { 4975 return false; 4976 } 4977 4978 // Check protocol qualifiers. 4979 for (ObjCProtocolDecl *proto : objcPtr->quals()) { 4980 // Blocks conform to NSObject and NSCopying. 4981 if (proto->getIdentifier() != ctx.getNSObjectName() && 4982 proto->getIdentifier() != ctx.getNSCopyingName()) 4983 return false; 4984 } 4985 4986 return true; 4987 } 4988 4989 Qualifiers::ObjCLifetime Type::getObjCARCImplicitLifetime() const { 4990 if (isObjCARCImplicitlyUnretainedType()) 4991 return Qualifiers::OCL_ExplicitNone; 4992 return Qualifiers::OCL_Strong; 4993 } 4994 4995 bool Type::isObjCARCImplicitlyUnretainedType() const { 4996 assert(isObjCLifetimeType() && 4997 "cannot query implicit lifetime for non-inferrable type"); 4998 4999 const Type *canon = getCanonicalTypeInternal().getTypePtr(); 5000 5001 // Walk down to the base type. We don't care about qualifiers for this. 5002 while (const auto *array = dyn_cast<ArrayType>(canon)) 5003 canon = array->getElementType().getTypePtr(); 5004 5005 if (const auto *opt = dyn_cast<ObjCObjectPointerType>(canon)) { 5006 // Class and Class<Protocol> don't require retention. 5007 if (opt->getObjectType()->isObjCClass()) 5008 return true; 5009 } 5010 5011 return false; 5012 } 5013 5014 bool Type::isObjCNSObjectType() const { 5015 if (const auto *typedefType = getAs<TypedefType>()) 5016 return typedefType->getDecl()->hasAttr<ObjCNSObjectAttr>(); 5017 return false; 5018 } 5019 5020 bool Type::isObjCIndependentClassType() const { 5021 if (const auto *typedefType = getAs<TypedefType>()) 5022 return typedefType->getDecl()->hasAttr<ObjCIndependentClassAttr>(); 5023 return false; 5024 } 5025 5026 bool Type::isObjCRetainableType() const { 5027 return isObjCObjectPointerType() || 5028 isBlockPointerType() || 5029 isObjCNSObjectType(); 5030 } 5031 5032 bool Type::isObjCIndirectLifetimeType() const { 5033 if (isObjCLifetimeType()) 5034 return true; 5035 if (const auto *OPT = getAs<PointerType>()) 5036 return OPT->getPointeeType()->isObjCIndirectLifetimeType(); 5037 if (const auto *Ref = getAs<ReferenceType>()) 5038 return Ref->getPointeeType()->isObjCIndirectLifetimeType(); 5039 if (const auto *MemPtr = getAs<MemberPointerType>()) 5040 return MemPtr->getPointeeType()->isObjCIndirectLifetimeType(); 5041 return false; 5042 } 5043 5044 /// Returns true if objects of this type have lifetime semantics under 5045 /// ARC. 5046 bool Type::isObjCLifetimeType() const { 5047 const Type *type = this; 5048 while (const ArrayType *array = type->getAsArrayTypeUnsafe()) 5049 type = array->getElementType().getTypePtr(); 5050 return type->isObjCRetainableType(); 5051 } 5052 5053 /// Determine whether the given type T is a "bridgable" Objective-C type, 5054 /// which is either an Objective-C object pointer type or an 5055 bool Type::isObjCARCBridgableType() const { 5056 return isObjCObjectPointerType() || isBlockPointerType(); 5057 } 5058 5059 /// Determine whether the given type T is a "bridgeable" C type. 5060 bool Type::isCARCBridgableType() const { 5061 const auto *Pointer = getAs<PointerType>(); 5062 if (!Pointer) 5063 return false; 5064 5065 QualType Pointee = Pointer->getPointeeType(); 5066 return Pointee->isVoidType() || Pointee->isRecordType(); 5067 } 5068 5069 /// Check if the specified type is the CUDA device builtin surface type. 5070 bool Type::isCUDADeviceBuiltinSurfaceType() const { 5071 if (const auto *RT = getAs<RecordType>()) 5072 return RT->getDecl()->hasAttr<CUDADeviceBuiltinSurfaceTypeAttr>(); 5073 return false; 5074 } 5075 5076 /// Check if the specified type is the CUDA device builtin texture type. 5077 bool Type::isCUDADeviceBuiltinTextureType() const { 5078 if (const auto *RT = getAs<RecordType>()) 5079 return RT->getDecl()->hasAttr<CUDADeviceBuiltinTextureTypeAttr>(); 5080 return false; 5081 } 5082 5083 bool Type::hasSizedVLAType() const { 5084 if (!isVariablyModifiedType()) return false; 5085 5086 if (const auto *ptr = getAs<PointerType>()) 5087 return ptr->getPointeeType()->hasSizedVLAType(); 5088 if (const auto *ref = getAs<ReferenceType>()) 5089 return ref->getPointeeType()->hasSizedVLAType(); 5090 if (const ArrayType *arr = getAsArrayTypeUnsafe()) { 5091 if (isa<VariableArrayType>(arr) && 5092 cast<VariableArrayType>(arr)->getSizeExpr()) 5093 return true; 5094 5095 return arr->getElementType()->hasSizedVLAType(); 5096 } 5097 5098 return false; 5099 } 5100 5101 bool Type::isHLSLIntangibleType() const { 5102 const Type *Ty = getUnqualifiedDesugaredType(); 5103 5104 // check if it's a builtin type first 5105 if (Ty->isBuiltinType()) 5106 return Ty->isHLSLBuiltinIntangibleType(); 5107 5108 // unwrap arrays 5109 while (isa<ConstantArrayType>(Ty)) 5110 Ty = Ty->getArrayElementTypeNoTypeQual(); 5111 5112 const RecordType *RT = 5113 dyn_cast<RecordType>(Ty->getUnqualifiedDesugaredType()); 5114 if (!RT) 5115 return false; 5116 5117 CXXRecordDecl *RD = RT->getAsCXXRecordDecl(); 5118 assert(RD != nullptr && 5119 "all HLSL structs and classes should be CXXRecordDecl"); 5120 assert(RD->isCompleteDefinition() && "expecting complete type"); 5121 return RD->isHLSLIntangible(); 5122 } 5123 5124 QualType::DestructionKind QualType::isDestructedTypeImpl(QualType type) { 5125 switch (type.getObjCLifetime()) { 5126 case Qualifiers::OCL_None: 5127 case Qualifiers::OCL_ExplicitNone: 5128 case Qualifiers::OCL_Autoreleasing: 5129 break; 5130 5131 case Qualifiers::OCL_Strong: 5132 return DK_objc_strong_lifetime; 5133 case Qualifiers::OCL_Weak: 5134 return DK_objc_weak_lifetime; 5135 } 5136 5137 if (const auto *RT = 5138 type->getBaseElementTypeUnsafe()->getAs<RecordType>()) { 5139 const RecordDecl *RD = RT->getDecl(); 5140 if (const auto *CXXRD = dyn_cast<CXXRecordDecl>(RD)) { 5141 /// Check if this is a C++ object with a non-trivial destructor. 5142 if (CXXRD->hasDefinition() && !CXXRD->hasTrivialDestructor()) 5143 return DK_cxx_destructor; 5144 } else { 5145 /// Check if this is a C struct that is non-trivial to destroy or an array 5146 /// that contains such a struct. 5147 if (RD->isNonTrivialToPrimitiveDestroy()) 5148 return DK_nontrivial_c_struct; 5149 } 5150 } 5151 5152 return DK_none; 5153 } 5154 5155 CXXRecordDecl *MemberPointerType::getMostRecentCXXRecordDecl() const { 5156 return getClass()->getAsCXXRecordDecl()->getMostRecentNonInjectedDecl(); 5157 } 5158 5159 void clang::FixedPointValueToString(SmallVectorImpl<char> &Str, 5160 llvm::APSInt Val, unsigned Scale) { 5161 llvm::FixedPointSemantics FXSema(Val.getBitWidth(), Scale, Val.isSigned(), 5162 /*IsSaturated=*/false, 5163 /*HasUnsignedPadding=*/false); 5164 llvm::APFixedPoint(Val, FXSema).toString(Str); 5165 } 5166 5167 AutoType::AutoType(QualType DeducedAsType, AutoTypeKeyword Keyword, 5168 TypeDependence ExtraDependence, QualType Canon, 5169 ConceptDecl *TypeConstraintConcept, 5170 ArrayRef<TemplateArgument> TypeConstraintArgs) 5171 : DeducedType(Auto, DeducedAsType, ExtraDependence, Canon) { 5172 AutoTypeBits.Keyword = llvm::to_underlying(Keyword); 5173 AutoTypeBits.NumArgs = TypeConstraintArgs.size(); 5174 this->TypeConstraintConcept = TypeConstraintConcept; 5175 assert(TypeConstraintConcept || AutoTypeBits.NumArgs == 0); 5176 if (TypeConstraintConcept) { 5177 auto *ArgBuffer = 5178 const_cast<TemplateArgument *>(getTypeConstraintArguments().data()); 5179 for (const TemplateArgument &Arg : TypeConstraintArgs) { 5180 // We only syntactically depend on the constraint arguments. They don't 5181 // affect the deduced type, only its validity. 5182 addDependence( 5183 toSyntacticDependence(toTypeDependence(Arg.getDependence()))); 5184 5185 new (ArgBuffer++) TemplateArgument(Arg); 5186 } 5187 } 5188 } 5189 5190 void AutoType::Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context, 5191 QualType Deduced, AutoTypeKeyword Keyword, 5192 bool IsDependent, ConceptDecl *CD, 5193 ArrayRef<TemplateArgument> Arguments) { 5194 ID.AddPointer(Deduced.getAsOpaquePtr()); 5195 ID.AddInteger((unsigned)Keyword); 5196 ID.AddBoolean(IsDependent); 5197 ID.AddPointer(CD); 5198 for (const TemplateArgument &Arg : Arguments) 5199 Arg.Profile(ID, Context); 5200 } 5201 5202 void AutoType::Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context) { 5203 Profile(ID, Context, getDeducedType(), getKeyword(), isDependentType(), 5204 getTypeConstraintConcept(), getTypeConstraintArguments()); 5205 } 5206 5207 FunctionEffect::Kind FunctionEffect::oppositeKind() const { 5208 switch (kind()) { 5209 case Kind::NonBlocking: 5210 return Kind::Blocking; 5211 case Kind::Blocking: 5212 return Kind::NonBlocking; 5213 case Kind::NonAllocating: 5214 return Kind::Allocating; 5215 case Kind::Allocating: 5216 return Kind::NonAllocating; 5217 } 5218 llvm_unreachable("unknown effect kind"); 5219 } 5220 5221 StringRef FunctionEffect::name() const { 5222 switch (kind()) { 5223 case Kind::NonBlocking: 5224 return "nonblocking"; 5225 case Kind::NonAllocating: 5226 return "nonallocating"; 5227 case Kind::Blocking: 5228 return "blocking"; 5229 case Kind::Allocating: 5230 return "allocating"; 5231 } 5232 llvm_unreachable("unknown effect kind"); 5233 } 5234 5235 std::optional<FunctionEffect> FunctionEffect::effectProhibitingInference( 5236 const Decl &Callee, FunctionEffectKindSet CalleeFX) const { 5237 switch (kind()) { 5238 case Kind::NonAllocating: 5239 case Kind::NonBlocking: { 5240 for (FunctionEffect Effect : CalleeFX) { 5241 // nonblocking/nonallocating cannot call allocating. 5242 if (Effect.kind() == Kind::Allocating) 5243 return Effect; 5244 // nonblocking cannot call blocking. 5245 if (kind() == Kind::NonBlocking && Effect.kind() == Kind::Blocking) 5246 return Effect; 5247 } 5248 return std::nullopt; 5249 } 5250 5251 case Kind::Allocating: 5252 case Kind::Blocking: 5253 assert(0 && "effectProhibitingInference with non-inferable effect kind"); 5254 break; 5255 } 5256 llvm_unreachable("unknown effect kind"); 5257 } 5258 5259 bool FunctionEffect::shouldDiagnoseFunctionCall( 5260 bool Direct, FunctionEffectKindSet CalleeFX) const { 5261 switch (kind()) { 5262 case Kind::NonAllocating: 5263 case Kind::NonBlocking: { 5264 const Kind CallerKind = kind(); 5265 for (FunctionEffect Effect : CalleeFX) { 5266 const Kind EK = Effect.kind(); 5267 // Does callee have same or stronger constraint? 5268 if (EK == CallerKind || 5269 (CallerKind == Kind::NonAllocating && EK == Kind::NonBlocking)) { 5270 return false; // no diagnostic 5271 } 5272 } 5273 return true; // warning 5274 } 5275 case Kind::Allocating: 5276 case Kind::Blocking: 5277 return false; 5278 } 5279 llvm_unreachable("unknown effect kind"); 5280 } 5281 5282 // ===== 5283 5284 bool FunctionEffectSet::insert(const FunctionEffectWithCondition &NewEC, 5285 Conflicts &Errs) { 5286 FunctionEffect::Kind NewOppositeKind = NewEC.Effect.oppositeKind(); 5287 Expr *NewCondition = NewEC.Cond.getCondition(); 5288 5289 // The index at which insertion will take place; default is at end 5290 // but we might find an earlier insertion point. 5291 unsigned InsertIdx = Effects.size(); 5292 unsigned Idx = 0; 5293 for (const FunctionEffectWithCondition &EC : *this) { 5294 // Note about effects with conditions: They are considered distinct from 5295 // those without conditions; they are potentially unique, redundant, or 5296 // in conflict, but we can't tell which until the condition is evaluated. 5297 if (EC.Cond.getCondition() == nullptr && NewCondition == nullptr) { 5298 if (EC.Effect.kind() == NewEC.Effect.kind()) { 5299 // There is no condition, and the effect kind is already present, 5300 // so just fail to insert the new one (creating a duplicate), 5301 // and return success. 5302 return true; 5303 } 5304 5305 if (EC.Effect.kind() == NewOppositeKind) { 5306 Errs.push_back({EC, NewEC}); 5307 return false; 5308 } 5309 } 5310 5311 if (NewEC.Effect.kind() < EC.Effect.kind() && InsertIdx > Idx) 5312 InsertIdx = Idx; 5313 5314 ++Idx; 5315 } 5316 5317 if (NewCondition || !Conditions.empty()) { 5318 if (Conditions.empty() && !Effects.empty()) 5319 Conditions.resize(Effects.size()); 5320 Conditions.insert(Conditions.begin() + InsertIdx, 5321 NewEC.Cond.getCondition()); 5322 } 5323 Effects.insert(Effects.begin() + InsertIdx, NewEC.Effect); 5324 return true; 5325 } 5326 5327 bool FunctionEffectSet::insert(const FunctionEffectsRef &Set, Conflicts &Errs) { 5328 for (const auto &Item : Set) 5329 insert(Item, Errs); 5330 return Errs.empty(); 5331 } 5332 5333 FunctionEffectSet FunctionEffectSet::getIntersection(FunctionEffectsRef LHS, 5334 FunctionEffectsRef RHS) { 5335 FunctionEffectSet Result; 5336 FunctionEffectSet::Conflicts Errs; 5337 5338 // We could use std::set_intersection but that would require expanding the 5339 // container interface to include push_back, making it available to clients 5340 // who might fail to maintain invariants. 5341 auto IterA = LHS.begin(), EndA = LHS.end(); 5342 auto IterB = RHS.begin(), EndB = RHS.end(); 5343 5344 auto FEWCLess = [](const FunctionEffectWithCondition &LHS, 5345 const FunctionEffectWithCondition &RHS) { 5346 return std::tuple(LHS.Effect, uintptr_t(LHS.Cond.getCondition())) < 5347 std::tuple(RHS.Effect, uintptr_t(RHS.Cond.getCondition())); 5348 }; 5349 5350 while (IterA != EndA && IterB != EndB) { 5351 FunctionEffectWithCondition A = *IterA; 5352 FunctionEffectWithCondition B = *IterB; 5353 if (FEWCLess(A, B)) 5354 ++IterA; 5355 else if (FEWCLess(B, A)) 5356 ++IterB; 5357 else { 5358 Result.insert(A, Errs); 5359 ++IterA; 5360 ++IterB; 5361 } 5362 } 5363 5364 // Insertion shouldn't be able to fail; that would mean both input 5365 // sets contained conflicts. 5366 assert(Errs.empty() && "conflict shouldn't be possible in getIntersection"); 5367 5368 return Result; 5369 } 5370 5371 FunctionEffectSet FunctionEffectSet::getUnion(FunctionEffectsRef LHS, 5372 FunctionEffectsRef RHS, 5373 Conflicts &Errs) { 5374 // Optimize for either of the two sets being empty (very common). 5375 if (LHS.empty()) 5376 return FunctionEffectSet(RHS); 5377 5378 FunctionEffectSet Combined(LHS); 5379 Combined.insert(RHS, Errs); 5380 return Combined; 5381 } 5382 5383 namespace clang { 5384 5385 raw_ostream &operator<<(raw_ostream &OS, 5386 const FunctionEffectWithCondition &CFE) { 5387 OS << CFE.Effect.name(); 5388 if (Expr *E = CFE.Cond.getCondition()) { 5389 OS << '('; 5390 E->dump(); 5391 OS << ')'; 5392 } 5393 return OS; 5394 } 5395 5396 } // namespace clang 5397 5398 LLVM_DUMP_METHOD void FunctionEffectsRef::dump(llvm::raw_ostream &OS) const { 5399 OS << "Effects{"; 5400 llvm::interleaveComma(*this, OS); 5401 OS << "}"; 5402 } 5403 5404 LLVM_DUMP_METHOD void FunctionEffectSet::dump(llvm::raw_ostream &OS) const { 5405 FunctionEffectsRef(*this).dump(OS); 5406 } 5407 5408 LLVM_DUMP_METHOD void FunctionEffectKindSet::dump(llvm::raw_ostream &OS) const { 5409 OS << "Effects{"; 5410 llvm::interleaveComma(*this, OS); 5411 OS << "}"; 5412 } 5413 5414 FunctionEffectsRef 5415 FunctionEffectsRef::create(ArrayRef<FunctionEffect> FX, 5416 ArrayRef<EffectConditionExpr> Conds) { 5417 assert(std::is_sorted(FX.begin(), FX.end()) && "effects should be sorted"); 5418 assert((Conds.empty() || Conds.size() == FX.size()) && 5419 "effects size should match conditions size"); 5420 return FunctionEffectsRef(FX, Conds); 5421 } 5422 5423 std::string FunctionEffectWithCondition::description() const { 5424 std::string Result(Effect.name().str()); 5425 if (Cond.getCondition() != nullptr) 5426 Result += "(expr)"; 5427 return Result; 5428 } 5429 5430 const HLSLAttributedResourceType * 5431 HLSLAttributedResourceType::findHandleTypeOnResource(const Type *RT) { 5432 // If the type RT is an HLSL resource class, the first field must 5433 // be the resource handle of type HLSLAttributedResourceType 5434 const clang::Type *Ty = RT->getUnqualifiedDesugaredType(); 5435 if (const RecordDecl *RD = Ty->getAsCXXRecordDecl()) { 5436 if (!RD->fields().empty()) { 5437 const auto &FirstFD = RD->fields().begin(); 5438 return dyn_cast<HLSLAttributedResourceType>( 5439 FirstFD->getType().getTypePtr()); 5440 } 5441 } 5442 return nullptr; 5443 } 5444