1 //===- Type.h - C Language Family Type Representation -----------*- C++ -*-===// 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 /// \file 10 /// C Language Family Type Representation 11 /// 12 /// This file defines the clang::Type interface and subclasses, used to 13 /// represent types for languages in the C family. 14 // 15 //===----------------------------------------------------------------------===// 16 17 #ifndef LLVM_CLANG_AST_TYPE_H 18 #define LLVM_CLANG_AST_TYPE_H 19 20 #include "clang/AST/DependenceFlags.h" 21 #include "clang/AST/NestedNameSpecifier.h" 22 #include "clang/AST/TemplateName.h" 23 #include "clang/Basic/AddressSpaces.h" 24 #include "clang/Basic/AttrKinds.h" 25 #include "clang/Basic/Diagnostic.h" 26 #include "clang/Basic/ExceptionSpecificationType.h" 27 #include "clang/Basic/LLVM.h" 28 #include "clang/Basic/Linkage.h" 29 #include "clang/Basic/PartialDiagnostic.h" 30 #include "clang/Basic/SourceLocation.h" 31 #include "clang/Basic/Specifiers.h" 32 #include "clang/Basic/Visibility.h" 33 #include "llvm/ADT/APInt.h" 34 #include "llvm/ADT/APSInt.h" 35 #include "llvm/ADT/ArrayRef.h" 36 #include "llvm/ADT/FoldingSet.h" 37 #include "llvm/ADT/None.h" 38 #include "llvm/ADT/Optional.h" 39 #include "llvm/ADT/PointerIntPair.h" 40 #include "llvm/ADT/PointerUnion.h" 41 #include "llvm/ADT/StringRef.h" 42 #include "llvm/ADT/Twine.h" 43 #include "llvm/ADT/iterator_range.h" 44 #include "llvm/Support/Casting.h" 45 #include "llvm/Support/Compiler.h" 46 #include "llvm/Support/ErrorHandling.h" 47 #include "llvm/Support/PointerLikeTypeTraits.h" 48 #include "llvm/Support/TrailingObjects.h" 49 #include "llvm/Support/type_traits.h" 50 #include <cassert> 51 #include <cstddef> 52 #include <cstdint> 53 #include <cstring> 54 #include <string> 55 #include <type_traits> 56 #include <utility> 57 58 namespace clang { 59 60 class ExtQuals; 61 class QualType; 62 class ConceptDecl; 63 class TagDecl; 64 class TemplateParameterList; 65 class Type; 66 67 enum { 68 TypeAlignmentInBits = 4, 69 TypeAlignment = 1 << TypeAlignmentInBits 70 }; 71 72 namespace serialization { 73 template <class T> class AbstractTypeReader; 74 template <class T> class AbstractTypeWriter; 75 } 76 77 } // namespace clang 78 79 namespace llvm { 80 81 template <typename T> 82 struct PointerLikeTypeTraits; 83 template<> 84 struct PointerLikeTypeTraits< ::clang::Type*> { 85 static inline void *getAsVoidPointer(::clang::Type *P) { return P; } 86 87 static inline ::clang::Type *getFromVoidPointer(void *P) { 88 return static_cast< ::clang::Type*>(P); 89 } 90 91 static constexpr int NumLowBitsAvailable = clang::TypeAlignmentInBits; 92 }; 93 94 template<> 95 struct PointerLikeTypeTraits< ::clang::ExtQuals*> { 96 static inline void *getAsVoidPointer(::clang::ExtQuals *P) { return P; } 97 98 static inline ::clang::ExtQuals *getFromVoidPointer(void *P) { 99 return static_cast< ::clang::ExtQuals*>(P); 100 } 101 102 static constexpr int NumLowBitsAvailable = clang::TypeAlignmentInBits; 103 }; 104 105 } // namespace llvm 106 107 namespace clang { 108 109 class ASTContext; 110 template <typename> class CanQual; 111 class CXXRecordDecl; 112 class DeclContext; 113 class EnumDecl; 114 class Expr; 115 class ExtQualsTypeCommonBase; 116 class FunctionDecl; 117 class IdentifierInfo; 118 class NamedDecl; 119 class ObjCInterfaceDecl; 120 class ObjCProtocolDecl; 121 class ObjCTypeParamDecl; 122 struct PrintingPolicy; 123 class RecordDecl; 124 class Stmt; 125 class TagDecl; 126 class TemplateArgument; 127 class TemplateArgumentListInfo; 128 class TemplateArgumentLoc; 129 class TemplateTypeParmDecl; 130 class TypedefNameDecl; 131 class UnresolvedUsingTypenameDecl; 132 133 using CanQualType = CanQual<Type>; 134 135 // Provide forward declarations for all of the *Type classes. 136 #define TYPE(Class, Base) class Class##Type; 137 #include "clang/AST/TypeNodes.inc" 138 139 /// The collection of all-type qualifiers we support. 140 /// Clang supports five independent qualifiers: 141 /// * C99: const, volatile, and restrict 142 /// * MS: __unaligned 143 /// * Embedded C (TR18037): address spaces 144 /// * Objective C: the GC attributes (none, weak, or strong) 145 class Qualifiers { 146 public: 147 enum TQ { // NOTE: These flags must be kept in sync with DeclSpec::TQ. 148 Const = 0x1, 149 Restrict = 0x2, 150 Volatile = 0x4, 151 CVRMask = Const | Volatile | Restrict 152 }; 153 154 enum GC { 155 GCNone = 0, 156 Weak, 157 Strong 158 }; 159 160 enum ObjCLifetime { 161 /// There is no lifetime qualification on this type. 162 OCL_None, 163 164 /// This object can be modified without requiring retains or 165 /// releases. 166 OCL_ExplicitNone, 167 168 /// Assigning into this object requires the old value to be 169 /// released and the new value to be retained. The timing of the 170 /// release of the old value is inexact: it may be moved to 171 /// immediately after the last known point where the value is 172 /// live. 173 OCL_Strong, 174 175 /// Reading or writing from this object requires a barrier call. 176 OCL_Weak, 177 178 /// Assigning into this object requires a lifetime extension. 179 OCL_Autoreleasing 180 }; 181 182 enum { 183 /// The maximum supported address space number. 184 /// 23 bits should be enough for anyone. 185 MaxAddressSpace = 0x7fffffu, 186 187 /// The width of the "fast" qualifier mask. 188 FastWidth = 3, 189 190 /// The fast qualifier mask. 191 FastMask = (1 << FastWidth) - 1 192 }; 193 194 /// Returns the common set of qualifiers while removing them from 195 /// the given sets. 196 static Qualifiers removeCommonQualifiers(Qualifiers &L, Qualifiers &R) { 197 // If both are only CVR-qualified, bit operations are sufficient. 198 if (!(L.Mask & ~CVRMask) && !(R.Mask & ~CVRMask)) { 199 Qualifiers Q; 200 Q.Mask = L.Mask & R.Mask; 201 L.Mask &= ~Q.Mask; 202 R.Mask &= ~Q.Mask; 203 return Q; 204 } 205 206 Qualifiers Q; 207 unsigned CommonCRV = L.getCVRQualifiers() & R.getCVRQualifiers(); 208 Q.addCVRQualifiers(CommonCRV); 209 L.removeCVRQualifiers(CommonCRV); 210 R.removeCVRQualifiers(CommonCRV); 211 212 if (L.getObjCGCAttr() == R.getObjCGCAttr()) { 213 Q.setObjCGCAttr(L.getObjCGCAttr()); 214 L.removeObjCGCAttr(); 215 R.removeObjCGCAttr(); 216 } 217 218 if (L.getObjCLifetime() == R.getObjCLifetime()) { 219 Q.setObjCLifetime(L.getObjCLifetime()); 220 L.removeObjCLifetime(); 221 R.removeObjCLifetime(); 222 } 223 224 if (L.getAddressSpace() == R.getAddressSpace()) { 225 Q.setAddressSpace(L.getAddressSpace()); 226 L.removeAddressSpace(); 227 R.removeAddressSpace(); 228 } 229 return Q; 230 } 231 232 static Qualifiers fromFastMask(unsigned Mask) { 233 Qualifiers Qs; 234 Qs.addFastQualifiers(Mask); 235 return Qs; 236 } 237 238 static Qualifiers fromCVRMask(unsigned CVR) { 239 Qualifiers Qs; 240 Qs.addCVRQualifiers(CVR); 241 return Qs; 242 } 243 244 static Qualifiers fromCVRUMask(unsigned CVRU) { 245 Qualifiers Qs; 246 Qs.addCVRUQualifiers(CVRU); 247 return Qs; 248 } 249 250 // Deserialize qualifiers from an opaque representation. 251 static Qualifiers fromOpaqueValue(unsigned opaque) { 252 Qualifiers Qs; 253 Qs.Mask = opaque; 254 return Qs; 255 } 256 257 // Serialize these qualifiers into an opaque representation. 258 unsigned getAsOpaqueValue() const { 259 return Mask; 260 } 261 262 bool hasConst() const { return Mask & Const; } 263 bool hasOnlyConst() const { return Mask == Const; } 264 void removeConst() { Mask &= ~Const; } 265 void addConst() { Mask |= Const; } 266 267 bool hasVolatile() const { return Mask & Volatile; } 268 bool hasOnlyVolatile() const { return Mask == Volatile; } 269 void removeVolatile() { Mask &= ~Volatile; } 270 void addVolatile() { Mask |= Volatile; } 271 272 bool hasRestrict() const { return Mask & Restrict; } 273 bool hasOnlyRestrict() const { return Mask == Restrict; } 274 void removeRestrict() { Mask &= ~Restrict; } 275 void addRestrict() { Mask |= Restrict; } 276 277 bool hasCVRQualifiers() const { return getCVRQualifiers(); } 278 unsigned getCVRQualifiers() const { return Mask & CVRMask; } 279 unsigned getCVRUQualifiers() const { return Mask & (CVRMask | UMask); } 280 281 void setCVRQualifiers(unsigned mask) { 282 assert(!(mask & ~CVRMask) && "bitmask contains non-CVR bits"); 283 Mask = (Mask & ~CVRMask) | mask; 284 } 285 void removeCVRQualifiers(unsigned mask) { 286 assert(!(mask & ~CVRMask) && "bitmask contains non-CVR bits"); 287 Mask &= ~mask; 288 } 289 void removeCVRQualifiers() { 290 removeCVRQualifiers(CVRMask); 291 } 292 void addCVRQualifiers(unsigned mask) { 293 assert(!(mask & ~CVRMask) && "bitmask contains non-CVR bits"); 294 Mask |= mask; 295 } 296 void addCVRUQualifiers(unsigned mask) { 297 assert(!(mask & ~CVRMask & ~UMask) && "bitmask contains non-CVRU bits"); 298 Mask |= mask; 299 } 300 301 bool hasUnaligned() const { return Mask & UMask; } 302 void setUnaligned(bool flag) { 303 Mask = (Mask & ~UMask) | (flag ? UMask : 0); 304 } 305 void removeUnaligned() { Mask &= ~UMask; } 306 void addUnaligned() { Mask |= UMask; } 307 308 bool hasObjCGCAttr() const { return Mask & GCAttrMask; } 309 GC getObjCGCAttr() const { return GC((Mask & GCAttrMask) >> GCAttrShift); } 310 void setObjCGCAttr(GC type) { 311 Mask = (Mask & ~GCAttrMask) | (type << GCAttrShift); 312 } 313 void removeObjCGCAttr() { setObjCGCAttr(GCNone); } 314 void addObjCGCAttr(GC type) { 315 assert(type); 316 setObjCGCAttr(type); 317 } 318 Qualifiers withoutObjCGCAttr() const { 319 Qualifiers qs = *this; 320 qs.removeObjCGCAttr(); 321 return qs; 322 } 323 Qualifiers withoutObjCLifetime() const { 324 Qualifiers qs = *this; 325 qs.removeObjCLifetime(); 326 return qs; 327 } 328 Qualifiers withoutAddressSpace() const { 329 Qualifiers qs = *this; 330 qs.removeAddressSpace(); 331 return qs; 332 } 333 334 bool hasObjCLifetime() const { return Mask & LifetimeMask; } 335 ObjCLifetime getObjCLifetime() const { 336 return ObjCLifetime((Mask & LifetimeMask) >> LifetimeShift); 337 } 338 void setObjCLifetime(ObjCLifetime type) { 339 Mask = (Mask & ~LifetimeMask) | (type << LifetimeShift); 340 } 341 void removeObjCLifetime() { setObjCLifetime(OCL_None); } 342 void addObjCLifetime(ObjCLifetime type) { 343 assert(type); 344 assert(!hasObjCLifetime()); 345 Mask |= (type << LifetimeShift); 346 } 347 348 /// True if the lifetime is neither None or ExplicitNone. 349 bool hasNonTrivialObjCLifetime() const { 350 ObjCLifetime lifetime = getObjCLifetime(); 351 return (lifetime > OCL_ExplicitNone); 352 } 353 354 /// True if the lifetime is either strong or weak. 355 bool hasStrongOrWeakObjCLifetime() const { 356 ObjCLifetime lifetime = getObjCLifetime(); 357 return (lifetime == OCL_Strong || lifetime == OCL_Weak); 358 } 359 360 bool hasAddressSpace() const { return Mask & AddressSpaceMask; } 361 LangAS getAddressSpace() const { 362 return static_cast<LangAS>(Mask >> AddressSpaceShift); 363 } 364 bool hasTargetSpecificAddressSpace() const { 365 return isTargetAddressSpace(getAddressSpace()); 366 } 367 /// Get the address space attribute value to be printed by diagnostics. 368 unsigned getAddressSpaceAttributePrintValue() const { 369 auto Addr = getAddressSpace(); 370 // This function is not supposed to be used with language specific 371 // address spaces. If that happens, the diagnostic message should consider 372 // printing the QualType instead of the address space value. 373 assert(Addr == LangAS::Default || hasTargetSpecificAddressSpace()); 374 if (Addr != LangAS::Default) 375 return toTargetAddressSpace(Addr); 376 // TODO: The diagnostic messages where Addr may be 0 should be fixed 377 // since it cannot differentiate the situation where 0 denotes the default 378 // address space or user specified __attribute__((address_space(0))). 379 return 0; 380 } 381 void setAddressSpace(LangAS space) { 382 assert((unsigned)space <= MaxAddressSpace); 383 Mask = (Mask & ~AddressSpaceMask) 384 | (((uint32_t) space) << AddressSpaceShift); 385 } 386 void removeAddressSpace() { setAddressSpace(LangAS::Default); } 387 void addAddressSpace(LangAS space) { 388 assert(space != LangAS::Default); 389 setAddressSpace(space); 390 } 391 392 // Fast qualifiers are those that can be allocated directly 393 // on a QualType object. 394 bool hasFastQualifiers() const { return getFastQualifiers(); } 395 unsigned getFastQualifiers() const { return Mask & FastMask; } 396 void setFastQualifiers(unsigned mask) { 397 assert(!(mask & ~FastMask) && "bitmask contains non-fast qualifier bits"); 398 Mask = (Mask & ~FastMask) | mask; 399 } 400 void removeFastQualifiers(unsigned mask) { 401 assert(!(mask & ~FastMask) && "bitmask contains non-fast qualifier bits"); 402 Mask &= ~mask; 403 } 404 void removeFastQualifiers() { 405 removeFastQualifiers(FastMask); 406 } 407 void addFastQualifiers(unsigned mask) { 408 assert(!(mask & ~FastMask) && "bitmask contains non-fast qualifier bits"); 409 Mask |= mask; 410 } 411 412 /// Return true if the set contains any qualifiers which require an ExtQuals 413 /// node to be allocated. 414 bool hasNonFastQualifiers() const { return Mask & ~FastMask; } 415 Qualifiers getNonFastQualifiers() const { 416 Qualifiers Quals = *this; 417 Quals.setFastQualifiers(0); 418 return Quals; 419 } 420 421 /// Return true if the set contains any qualifiers. 422 bool hasQualifiers() const { return Mask; } 423 bool empty() const { return !Mask; } 424 425 /// Add the qualifiers from the given set to this set. 426 void addQualifiers(Qualifiers Q) { 427 // If the other set doesn't have any non-boolean qualifiers, just 428 // bit-or it in. 429 if (!(Q.Mask & ~CVRMask)) 430 Mask |= Q.Mask; 431 else { 432 Mask |= (Q.Mask & CVRMask); 433 if (Q.hasAddressSpace()) 434 addAddressSpace(Q.getAddressSpace()); 435 if (Q.hasObjCGCAttr()) 436 addObjCGCAttr(Q.getObjCGCAttr()); 437 if (Q.hasObjCLifetime()) 438 addObjCLifetime(Q.getObjCLifetime()); 439 } 440 } 441 442 /// Remove the qualifiers from the given set from this set. 443 void removeQualifiers(Qualifiers Q) { 444 // If the other set doesn't have any non-boolean qualifiers, just 445 // bit-and the inverse in. 446 if (!(Q.Mask & ~CVRMask)) 447 Mask &= ~Q.Mask; 448 else { 449 Mask &= ~(Q.Mask & CVRMask); 450 if (getObjCGCAttr() == Q.getObjCGCAttr()) 451 removeObjCGCAttr(); 452 if (getObjCLifetime() == Q.getObjCLifetime()) 453 removeObjCLifetime(); 454 if (getAddressSpace() == Q.getAddressSpace()) 455 removeAddressSpace(); 456 } 457 } 458 459 /// Add the qualifiers from the given set to this set, given that 460 /// they don't conflict. 461 void addConsistentQualifiers(Qualifiers qs) { 462 assert(getAddressSpace() == qs.getAddressSpace() || 463 !hasAddressSpace() || !qs.hasAddressSpace()); 464 assert(getObjCGCAttr() == qs.getObjCGCAttr() || 465 !hasObjCGCAttr() || !qs.hasObjCGCAttr()); 466 assert(getObjCLifetime() == qs.getObjCLifetime() || 467 !hasObjCLifetime() || !qs.hasObjCLifetime()); 468 Mask |= qs.Mask; 469 } 470 471 /// Returns true if address space A is equal to or a superset of B. 472 /// OpenCL v2.0 defines conversion rules (OpenCLC v2.0 s6.5.5) and notion of 473 /// overlapping address spaces. 474 /// CL1.1 or CL1.2: 475 /// every address space is a superset of itself. 476 /// CL2.0 adds: 477 /// __generic is a superset of any address space except for __constant. 478 static bool isAddressSpaceSupersetOf(LangAS A, LangAS B) { 479 // Address spaces must match exactly. 480 return A == B || 481 // Otherwise in OpenCLC v2.0 s6.5.5: every address space except 482 // for __constant can be used as __generic. 483 (A == LangAS::opencl_generic && B != LangAS::opencl_constant) || 484 // We also define global_device and global_host address spaces, 485 // to distinguish global pointers allocated on host from pointers 486 // allocated on device, which are a subset of __global. 487 (A == LangAS::opencl_global && (B == LangAS::opencl_global_device || 488 B == LangAS::opencl_global_host)) || 489 (A == LangAS::sycl_global && (B == LangAS::sycl_global_device || 490 B == LangAS::sycl_global_host)) || 491 // Consider pointer size address spaces to be equivalent to default. 492 ((isPtrSizeAddressSpace(A) || A == LangAS::Default) && 493 (isPtrSizeAddressSpace(B) || B == LangAS::Default)) || 494 // Default is a superset of SYCL address spaces. 495 (A == LangAS::Default && 496 (B == LangAS::sycl_private || B == LangAS::sycl_local || 497 B == LangAS::sycl_global || B == LangAS::sycl_global_device || 498 B == LangAS::sycl_global_host)); 499 } 500 501 /// Returns true if the address space in these qualifiers is equal to or 502 /// a superset of the address space in the argument qualifiers. 503 bool isAddressSpaceSupersetOf(Qualifiers other) const { 504 return isAddressSpaceSupersetOf(getAddressSpace(), other.getAddressSpace()); 505 } 506 507 /// Determines if these qualifiers compatibly include another set. 508 /// Generally this answers the question of whether an object with the other 509 /// qualifiers can be safely used as an object with these qualifiers. 510 bool compatiblyIncludes(Qualifiers other) const { 511 return isAddressSpaceSupersetOf(other) && 512 // ObjC GC qualifiers can match, be added, or be removed, but can't 513 // be changed. 514 (getObjCGCAttr() == other.getObjCGCAttr() || !hasObjCGCAttr() || 515 !other.hasObjCGCAttr()) && 516 // ObjC lifetime qualifiers must match exactly. 517 getObjCLifetime() == other.getObjCLifetime() && 518 // CVR qualifiers may subset. 519 (((Mask & CVRMask) | (other.Mask & CVRMask)) == (Mask & CVRMask)) && 520 // U qualifier may superset. 521 (!other.hasUnaligned() || hasUnaligned()); 522 } 523 524 /// Determines if these qualifiers compatibly include another set of 525 /// qualifiers from the narrow perspective of Objective-C ARC lifetime. 526 /// 527 /// One set of Objective-C lifetime qualifiers compatibly includes the other 528 /// if the lifetime qualifiers match, or if both are non-__weak and the 529 /// including set also contains the 'const' qualifier, or both are non-__weak 530 /// and one is None (which can only happen in non-ARC modes). 531 bool compatiblyIncludesObjCLifetime(Qualifiers other) const { 532 if (getObjCLifetime() == other.getObjCLifetime()) 533 return true; 534 535 if (getObjCLifetime() == OCL_Weak || other.getObjCLifetime() == OCL_Weak) 536 return false; 537 538 if (getObjCLifetime() == OCL_None || other.getObjCLifetime() == OCL_None) 539 return true; 540 541 return hasConst(); 542 } 543 544 /// Determine whether this set of qualifiers is a strict superset of 545 /// another set of qualifiers, not considering qualifier compatibility. 546 bool isStrictSupersetOf(Qualifiers Other) const; 547 548 bool operator==(Qualifiers Other) const { return Mask == Other.Mask; } 549 bool operator!=(Qualifiers Other) const { return Mask != Other.Mask; } 550 551 explicit operator bool() const { return hasQualifiers(); } 552 553 Qualifiers &operator+=(Qualifiers R) { 554 addQualifiers(R); 555 return *this; 556 } 557 558 // Union two qualifier sets. If an enumerated qualifier appears 559 // in both sets, use the one from the right. 560 friend Qualifiers operator+(Qualifiers L, Qualifiers R) { 561 L += R; 562 return L; 563 } 564 565 Qualifiers &operator-=(Qualifiers R) { 566 removeQualifiers(R); 567 return *this; 568 } 569 570 /// Compute the difference between two qualifier sets. 571 friend Qualifiers operator-(Qualifiers L, Qualifiers R) { 572 L -= R; 573 return L; 574 } 575 576 std::string getAsString() const; 577 std::string getAsString(const PrintingPolicy &Policy) const; 578 579 static std::string getAddrSpaceAsString(LangAS AS); 580 581 bool isEmptyWhenPrinted(const PrintingPolicy &Policy) const; 582 void print(raw_ostream &OS, const PrintingPolicy &Policy, 583 bool appendSpaceIfNonEmpty = false) const; 584 585 void Profile(llvm::FoldingSetNodeID &ID) const { 586 ID.AddInteger(Mask); 587 } 588 589 private: 590 // bits: |0 1 2|3|4 .. 5|6 .. 8|9 ... 31| 591 // |C R V|U|GCAttr|Lifetime|AddressSpace| 592 uint32_t Mask = 0; 593 594 static const uint32_t UMask = 0x8; 595 static const uint32_t UShift = 3; 596 static const uint32_t GCAttrMask = 0x30; 597 static const uint32_t GCAttrShift = 4; 598 static const uint32_t LifetimeMask = 0x1C0; 599 static const uint32_t LifetimeShift = 6; 600 static const uint32_t AddressSpaceMask = 601 ~(CVRMask | UMask | GCAttrMask | LifetimeMask); 602 static const uint32_t AddressSpaceShift = 9; 603 }; 604 605 /// A std::pair-like structure for storing a qualified type split 606 /// into its local qualifiers and its locally-unqualified type. 607 struct SplitQualType { 608 /// The locally-unqualified type. 609 const Type *Ty = nullptr; 610 611 /// The local qualifiers. 612 Qualifiers Quals; 613 614 SplitQualType() = default; 615 SplitQualType(const Type *ty, Qualifiers qs) : Ty(ty), Quals(qs) {} 616 617 SplitQualType getSingleStepDesugaredType() const; // end of this file 618 619 // Make std::tie work. 620 std::pair<const Type *,Qualifiers> asPair() const { 621 return std::pair<const Type *, Qualifiers>(Ty, Quals); 622 } 623 624 friend bool operator==(SplitQualType a, SplitQualType b) { 625 return a.Ty == b.Ty && a.Quals == b.Quals; 626 } 627 friend bool operator!=(SplitQualType a, SplitQualType b) { 628 return a.Ty != b.Ty || a.Quals != b.Quals; 629 } 630 }; 631 632 /// The kind of type we are substituting Objective-C type arguments into. 633 /// 634 /// The kind of substitution affects the replacement of type parameters when 635 /// no concrete type information is provided, e.g., when dealing with an 636 /// unspecialized type. 637 enum class ObjCSubstitutionContext { 638 /// An ordinary type. 639 Ordinary, 640 641 /// The result type of a method or function. 642 Result, 643 644 /// The parameter type of a method or function. 645 Parameter, 646 647 /// The type of a property. 648 Property, 649 650 /// The superclass of a type. 651 Superclass, 652 }; 653 654 /// A (possibly-)qualified type. 655 /// 656 /// For efficiency, we don't store CV-qualified types as nodes on their 657 /// own: instead each reference to a type stores the qualifiers. This 658 /// greatly reduces the number of nodes we need to allocate for types (for 659 /// example we only need one for 'int', 'const int', 'volatile int', 660 /// 'const volatile int', etc). 661 /// 662 /// As an added efficiency bonus, instead of making this a pair, we 663 /// just store the two bits we care about in the low bits of the 664 /// pointer. To handle the packing/unpacking, we make QualType be a 665 /// simple wrapper class that acts like a smart pointer. A third bit 666 /// indicates whether there are extended qualifiers present, in which 667 /// case the pointer points to a special structure. 668 class QualType { 669 friend class QualifierCollector; 670 671 // Thankfully, these are efficiently composable. 672 llvm::PointerIntPair<llvm::PointerUnion<const Type *, const ExtQuals *>, 673 Qualifiers::FastWidth> Value; 674 675 const ExtQuals *getExtQualsUnsafe() const { 676 return Value.getPointer().get<const ExtQuals*>(); 677 } 678 679 const Type *getTypePtrUnsafe() const { 680 return Value.getPointer().get<const Type*>(); 681 } 682 683 const ExtQualsTypeCommonBase *getCommonPtr() const { 684 assert(!isNull() && "Cannot retrieve a NULL type pointer"); 685 auto CommonPtrVal = reinterpret_cast<uintptr_t>(Value.getOpaqueValue()); 686 CommonPtrVal &= ~(uintptr_t)((1 << TypeAlignmentInBits) - 1); 687 return reinterpret_cast<ExtQualsTypeCommonBase*>(CommonPtrVal); 688 } 689 690 public: 691 QualType() = default; 692 QualType(const Type *Ptr, unsigned Quals) : Value(Ptr, Quals) {} 693 QualType(const ExtQuals *Ptr, unsigned Quals) : Value(Ptr, Quals) {} 694 695 unsigned getLocalFastQualifiers() const { return Value.getInt(); } 696 void setLocalFastQualifiers(unsigned Quals) { Value.setInt(Quals); } 697 698 /// Retrieves a pointer to the underlying (unqualified) type. 699 /// 700 /// This function requires that the type not be NULL. If the type might be 701 /// NULL, use the (slightly less efficient) \c getTypePtrOrNull(). 702 const Type *getTypePtr() const; 703 704 const Type *getTypePtrOrNull() const; 705 706 /// Retrieves a pointer to the name of the base type. 707 const IdentifierInfo *getBaseTypeIdentifier() const; 708 709 /// Divides a QualType into its unqualified type and a set of local 710 /// qualifiers. 711 SplitQualType split() const; 712 713 void *getAsOpaquePtr() const { return Value.getOpaqueValue(); } 714 715 static QualType getFromOpaquePtr(const void *Ptr) { 716 QualType T; 717 T.Value.setFromOpaqueValue(const_cast<void*>(Ptr)); 718 return T; 719 } 720 721 const Type &operator*() const { 722 return *getTypePtr(); 723 } 724 725 const Type *operator->() const { 726 return getTypePtr(); 727 } 728 729 bool isCanonical() const; 730 bool isCanonicalAsParam() const; 731 732 /// Return true if this QualType doesn't point to a type yet. 733 bool isNull() const { 734 return Value.getPointer().isNull(); 735 } 736 737 /// Determine whether this particular QualType instance has the 738 /// "const" qualifier set, without looking through typedefs that may have 739 /// added "const" at a different level. 740 bool isLocalConstQualified() const { 741 return (getLocalFastQualifiers() & Qualifiers::Const); 742 } 743 744 /// Determine whether this type is const-qualified. 745 bool isConstQualified() const; 746 747 /// Determine whether this particular QualType instance has the 748 /// "restrict" qualifier set, without looking through typedefs that may have 749 /// added "restrict" at a different level. 750 bool isLocalRestrictQualified() const { 751 return (getLocalFastQualifiers() & Qualifiers::Restrict); 752 } 753 754 /// Determine whether this type is restrict-qualified. 755 bool isRestrictQualified() const; 756 757 /// Determine whether this particular QualType instance has the 758 /// "volatile" qualifier set, without looking through typedefs that may have 759 /// added "volatile" at a different level. 760 bool isLocalVolatileQualified() const { 761 return (getLocalFastQualifiers() & Qualifiers::Volatile); 762 } 763 764 /// Determine whether this type is volatile-qualified. 765 bool isVolatileQualified() const; 766 767 /// Determine whether this particular QualType instance has any 768 /// qualifiers, without looking through any typedefs that might add 769 /// qualifiers at a different level. 770 bool hasLocalQualifiers() const { 771 return getLocalFastQualifiers() || hasLocalNonFastQualifiers(); 772 } 773 774 /// Determine whether this type has any qualifiers. 775 bool hasQualifiers() const; 776 777 /// Determine whether this particular QualType instance has any 778 /// "non-fast" qualifiers, e.g., those that are stored in an ExtQualType 779 /// instance. 780 bool hasLocalNonFastQualifiers() const { 781 return Value.getPointer().is<const ExtQuals*>(); 782 } 783 784 /// Retrieve the set of qualifiers local to this particular QualType 785 /// instance, not including any qualifiers acquired through typedefs or 786 /// other sugar. 787 Qualifiers getLocalQualifiers() const; 788 789 /// Retrieve the set of qualifiers applied to this type. 790 Qualifiers getQualifiers() const; 791 792 /// Retrieve the set of CVR (const-volatile-restrict) qualifiers 793 /// local to this particular QualType instance, not including any qualifiers 794 /// acquired through typedefs or other sugar. 795 unsigned getLocalCVRQualifiers() const { 796 return getLocalFastQualifiers(); 797 } 798 799 /// Retrieve the set of CVR (const-volatile-restrict) qualifiers 800 /// applied to this type. 801 unsigned getCVRQualifiers() const; 802 803 bool isConstant(const ASTContext& Ctx) const { 804 return QualType::isConstant(*this, Ctx); 805 } 806 807 /// Determine whether this is a Plain Old Data (POD) type (C++ 3.9p10). 808 bool isPODType(const ASTContext &Context) const; 809 810 /// Return true if this is a POD type according to the rules of the C++98 811 /// standard, regardless of the current compilation's language. 812 bool isCXX98PODType(const ASTContext &Context) const; 813 814 /// Return true if this is a POD type according to the more relaxed rules 815 /// of the C++11 standard, regardless of the current compilation's language. 816 /// (C++0x [basic.types]p9). Note that, unlike 817 /// CXXRecordDecl::isCXX11StandardLayout, this takes DRs into account. 818 bool isCXX11PODType(const ASTContext &Context) const; 819 820 /// Return true if this is a trivial type per (C++0x [basic.types]p9) 821 bool isTrivialType(const ASTContext &Context) const; 822 823 /// Return true if this is a trivially copyable type (C++0x [basic.types]p9) 824 bool isTriviallyCopyableType(const ASTContext &Context) const; 825 826 827 /// Returns true if it is a class and it might be dynamic. 828 bool mayBeDynamicClass() const; 829 830 /// Returns true if it is not a class or if the class might not be dynamic. 831 bool mayBeNotDynamicClass() const; 832 833 // Don't promise in the API that anything besides 'const' can be 834 // easily added. 835 836 /// Add the `const` type qualifier to this QualType. 837 void addConst() { 838 addFastQualifiers(Qualifiers::Const); 839 } 840 QualType withConst() const { 841 return withFastQualifiers(Qualifiers::Const); 842 } 843 844 /// Add the `volatile` type qualifier to this QualType. 845 void addVolatile() { 846 addFastQualifiers(Qualifiers::Volatile); 847 } 848 QualType withVolatile() const { 849 return withFastQualifiers(Qualifiers::Volatile); 850 } 851 852 /// Add the `restrict` qualifier to this QualType. 853 void addRestrict() { 854 addFastQualifiers(Qualifiers::Restrict); 855 } 856 QualType withRestrict() const { 857 return withFastQualifiers(Qualifiers::Restrict); 858 } 859 860 QualType withCVRQualifiers(unsigned CVR) const { 861 return withFastQualifiers(CVR); 862 } 863 864 void addFastQualifiers(unsigned TQs) { 865 assert(!(TQs & ~Qualifiers::FastMask) 866 && "non-fast qualifier bits set in mask!"); 867 Value.setInt(Value.getInt() | TQs); 868 } 869 870 void removeLocalConst(); 871 void removeLocalVolatile(); 872 void removeLocalRestrict(); 873 void removeLocalCVRQualifiers(unsigned Mask); 874 875 void removeLocalFastQualifiers() { Value.setInt(0); } 876 void removeLocalFastQualifiers(unsigned Mask) { 877 assert(!(Mask & ~Qualifiers::FastMask) && "mask has non-fast qualifiers"); 878 Value.setInt(Value.getInt() & ~Mask); 879 } 880 881 // Creates a type with the given qualifiers in addition to any 882 // qualifiers already on this type. 883 QualType withFastQualifiers(unsigned TQs) const { 884 QualType T = *this; 885 T.addFastQualifiers(TQs); 886 return T; 887 } 888 889 // Creates a type with exactly the given fast qualifiers, removing 890 // any existing fast qualifiers. 891 QualType withExactLocalFastQualifiers(unsigned TQs) const { 892 return withoutLocalFastQualifiers().withFastQualifiers(TQs); 893 } 894 895 // Removes fast qualifiers, but leaves any extended qualifiers in place. 896 QualType withoutLocalFastQualifiers() const { 897 QualType T = *this; 898 T.removeLocalFastQualifiers(); 899 return T; 900 } 901 902 QualType getCanonicalType() const; 903 904 /// Return this type with all of the instance-specific qualifiers 905 /// removed, but without removing any qualifiers that may have been applied 906 /// through typedefs. 907 QualType getLocalUnqualifiedType() const { return QualType(getTypePtr(), 0); } 908 909 /// Retrieve the unqualified variant of the given type, 910 /// removing as little sugar as possible. 911 /// 912 /// This routine looks through various kinds of sugar to find the 913 /// least-desugared type that is unqualified. For example, given: 914 /// 915 /// \code 916 /// typedef int Integer; 917 /// typedef const Integer CInteger; 918 /// typedef CInteger DifferenceType; 919 /// \endcode 920 /// 921 /// Executing \c getUnqualifiedType() on the type \c DifferenceType will 922 /// desugar until we hit the type \c Integer, which has no qualifiers on it. 923 /// 924 /// The resulting type might still be qualified if it's sugar for an array 925 /// type. To strip qualifiers even from within a sugared array type, use 926 /// ASTContext::getUnqualifiedArrayType. 927 inline QualType getUnqualifiedType() const; 928 929 /// Retrieve the unqualified variant of the given type, removing as little 930 /// sugar as possible. 931 /// 932 /// Like getUnqualifiedType(), but also returns the set of 933 /// qualifiers that were built up. 934 /// 935 /// The resulting type might still be qualified if it's sugar for an array 936 /// type. To strip qualifiers even from within a sugared array type, use 937 /// ASTContext::getUnqualifiedArrayType. 938 inline SplitQualType getSplitUnqualifiedType() const; 939 940 /// Determine whether this type is more qualified than the other 941 /// given type, requiring exact equality for non-CVR qualifiers. 942 bool isMoreQualifiedThan(QualType Other) const; 943 944 /// Determine whether this type is at least as qualified as the other 945 /// given type, requiring exact equality for non-CVR qualifiers. 946 bool isAtLeastAsQualifiedAs(QualType Other) const; 947 948 QualType getNonReferenceType() const; 949 950 /// Determine the type of a (typically non-lvalue) expression with the 951 /// specified result type. 952 /// 953 /// This routine should be used for expressions for which the return type is 954 /// explicitly specified (e.g., in a cast or call) and isn't necessarily 955 /// an lvalue. It removes a top-level reference (since there are no 956 /// expressions of reference type) and deletes top-level cvr-qualifiers 957 /// from non-class types (in C++) or all types (in C). 958 QualType getNonLValueExprType(const ASTContext &Context) const; 959 960 /// Remove an outer pack expansion type (if any) from this type. Used as part 961 /// of converting the type of a declaration to the type of an expression that 962 /// references that expression. It's meaningless for an expression to have a 963 /// pack expansion type. 964 QualType getNonPackExpansionType() const; 965 966 /// Return the specified type with any "sugar" removed from 967 /// the type. This takes off typedefs, typeof's etc. If the outer level of 968 /// the type is already concrete, it returns it unmodified. This is similar 969 /// to getting the canonical type, but it doesn't remove *all* typedefs. For 970 /// example, it returns "T*" as "T*", (not as "int*"), because the pointer is 971 /// concrete. 972 /// 973 /// Qualifiers are left in place. 974 QualType getDesugaredType(const ASTContext &Context) const { 975 return getDesugaredType(*this, Context); 976 } 977 978 SplitQualType getSplitDesugaredType() const { 979 return getSplitDesugaredType(*this); 980 } 981 982 /// Return the specified type with one level of "sugar" removed from 983 /// the type. 984 /// 985 /// This routine takes off the first typedef, typeof, etc. If the outer level 986 /// of the type is already concrete, it returns it unmodified. 987 QualType getSingleStepDesugaredType(const ASTContext &Context) const { 988 return getSingleStepDesugaredTypeImpl(*this, Context); 989 } 990 991 /// Returns the specified type after dropping any 992 /// outer-level parentheses. 993 QualType IgnoreParens() const { 994 if (isa<ParenType>(*this)) 995 return QualType::IgnoreParens(*this); 996 return *this; 997 } 998 999 /// Indicate whether the specified types and qualifiers are identical. 1000 friend bool operator==(const QualType &LHS, const QualType &RHS) { 1001 return LHS.Value == RHS.Value; 1002 } 1003 friend bool operator!=(const QualType &LHS, const QualType &RHS) { 1004 return LHS.Value != RHS.Value; 1005 } 1006 friend bool operator<(const QualType &LHS, const QualType &RHS) { 1007 return LHS.Value < RHS.Value; 1008 } 1009 1010 static std::string getAsString(SplitQualType split, 1011 const PrintingPolicy &Policy) { 1012 return getAsString(split.Ty, split.Quals, Policy); 1013 } 1014 static std::string getAsString(const Type *ty, Qualifiers qs, 1015 const PrintingPolicy &Policy); 1016 1017 std::string getAsString() const; 1018 std::string getAsString(const PrintingPolicy &Policy) const; 1019 1020 void print(raw_ostream &OS, const PrintingPolicy &Policy, 1021 const Twine &PlaceHolder = Twine(), 1022 unsigned Indentation = 0) const; 1023 1024 static void print(SplitQualType split, raw_ostream &OS, 1025 const PrintingPolicy &policy, const Twine &PlaceHolder, 1026 unsigned Indentation = 0) { 1027 return print(split.Ty, split.Quals, OS, policy, PlaceHolder, Indentation); 1028 } 1029 1030 static void print(const Type *ty, Qualifiers qs, 1031 raw_ostream &OS, const PrintingPolicy &policy, 1032 const Twine &PlaceHolder, 1033 unsigned Indentation = 0); 1034 1035 void getAsStringInternal(std::string &Str, 1036 const PrintingPolicy &Policy) const; 1037 1038 static void getAsStringInternal(SplitQualType split, std::string &out, 1039 const PrintingPolicy &policy) { 1040 return getAsStringInternal(split.Ty, split.Quals, out, policy); 1041 } 1042 1043 static void getAsStringInternal(const Type *ty, Qualifiers qs, 1044 std::string &out, 1045 const PrintingPolicy &policy); 1046 1047 class StreamedQualTypeHelper { 1048 const QualType &T; 1049 const PrintingPolicy &Policy; 1050 const Twine &PlaceHolder; 1051 unsigned Indentation; 1052 1053 public: 1054 StreamedQualTypeHelper(const QualType &T, const PrintingPolicy &Policy, 1055 const Twine &PlaceHolder, unsigned Indentation) 1056 : T(T), Policy(Policy), PlaceHolder(PlaceHolder), 1057 Indentation(Indentation) {} 1058 1059 friend raw_ostream &operator<<(raw_ostream &OS, 1060 const StreamedQualTypeHelper &SQT) { 1061 SQT.T.print(OS, SQT.Policy, SQT.PlaceHolder, SQT.Indentation); 1062 return OS; 1063 } 1064 }; 1065 1066 StreamedQualTypeHelper stream(const PrintingPolicy &Policy, 1067 const Twine &PlaceHolder = Twine(), 1068 unsigned Indentation = 0) const { 1069 return StreamedQualTypeHelper(*this, Policy, PlaceHolder, Indentation); 1070 } 1071 1072 void dump(const char *s) const; 1073 void dump() const; 1074 void dump(llvm::raw_ostream &OS, const ASTContext &Context) const; 1075 1076 void Profile(llvm::FoldingSetNodeID &ID) const { 1077 ID.AddPointer(getAsOpaquePtr()); 1078 } 1079 1080 /// Check if this type has any address space qualifier. 1081 inline bool hasAddressSpace() const; 1082 1083 /// Return the address space of this type. 1084 inline LangAS getAddressSpace() const; 1085 1086 /// Returns true if address space qualifiers overlap with T address space 1087 /// qualifiers. 1088 /// OpenCL C defines conversion rules for pointers to different address spaces 1089 /// and notion of overlapping address spaces. 1090 /// CL1.1 or CL1.2: 1091 /// address spaces overlap iff they are they same. 1092 /// OpenCL C v2.0 s6.5.5 adds: 1093 /// __generic overlaps with any address space except for __constant. 1094 bool isAddressSpaceOverlapping(QualType T) const { 1095 Qualifiers Q = getQualifiers(); 1096 Qualifiers TQ = T.getQualifiers(); 1097 // Address spaces overlap if at least one of them is a superset of another 1098 return Q.isAddressSpaceSupersetOf(TQ) || TQ.isAddressSpaceSupersetOf(Q); 1099 } 1100 1101 /// Returns gc attribute of this type. 1102 inline Qualifiers::GC getObjCGCAttr() const; 1103 1104 /// true when Type is objc's weak. 1105 bool isObjCGCWeak() const { 1106 return getObjCGCAttr() == Qualifiers::Weak; 1107 } 1108 1109 /// true when Type is objc's strong. 1110 bool isObjCGCStrong() const { 1111 return getObjCGCAttr() == Qualifiers::Strong; 1112 } 1113 1114 /// Returns lifetime attribute of this type. 1115 Qualifiers::ObjCLifetime getObjCLifetime() const { 1116 return getQualifiers().getObjCLifetime(); 1117 } 1118 1119 bool hasNonTrivialObjCLifetime() const { 1120 return getQualifiers().hasNonTrivialObjCLifetime(); 1121 } 1122 1123 bool hasStrongOrWeakObjCLifetime() const { 1124 return getQualifiers().hasStrongOrWeakObjCLifetime(); 1125 } 1126 1127 // true when Type is objc's weak and weak is enabled but ARC isn't. 1128 bool isNonWeakInMRRWithObjCWeak(const ASTContext &Context) const; 1129 1130 enum PrimitiveDefaultInitializeKind { 1131 /// The type does not fall into any of the following categories. Note that 1132 /// this case is zero-valued so that values of this enum can be used as a 1133 /// boolean condition for non-triviality. 1134 PDIK_Trivial, 1135 1136 /// The type is an Objective-C retainable pointer type that is qualified 1137 /// with the ARC __strong qualifier. 1138 PDIK_ARCStrong, 1139 1140 /// The type is an Objective-C retainable pointer type that is qualified 1141 /// with the ARC __weak qualifier. 1142 PDIK_ARCWeak, 1143 1144 /// The type is a struct containing a field whose type is not PCK_Trivial. 1145 PDIK_Struct 1146 }; 1147 1148 /// Functions to query basic properties of non-trivial C struct types. 1149 1150 /// Check if this is a non-trivial type that would cause a C struct 1151 /// transitively containing this type to be non-trivial to default initialize 1152 /// and return the kind. 1153 PrimitiveDefaultInitializeKind 1154 isNonTrivialToPrimitiveDefaultInitialize() const; 1155 1156 enum PrimitiveCopyKind { 1157 /// The type does not fall into any of the following categories. Note that 1158 /// this case is zero-valued so that values of this enum can be used as a 1159 /// boolean condition for non-triviality. 1160 PCK_Trivial, 1161 1162 /// The type would be trivial except that it is volatile-qualified. Types 1163 /// that fall into one of the other non-trivial cases may additionally be 1164 /// volatile-qualified. 1165 PCK_VolatileTrivial, 1166 1167 /// The type is an Objective-C retainable pointer type that is qualified 1168 /// with the ARC __strong qualifier. 1169 PCK_ARCStrong, 1170 1171 /// The type is an Objective-C retainable pointer type that is qualified 1172 /// with the ARC __weak qualifier. 1173 PCK_ARCWeak, 1174 1175 /// The type is a struct containing a field whose type is neither 1176 /// PCK_Trivial nor PCK_VolatileTrivial. 1177 /// Note that a C++ struct type does not necessarily match this; C++ copying 1178 /// semantics are too complex to express here, in part because they depend 1179 /// on the exact constructor or assignment operator that is chosen by 1180 /// overload resolution to do the copy. 1181 PCK_Struct 1182 }; 1183 1184 /// Check if this is a non-trivial type that would cause a C struct 1185 /// transitively containing this type to be non-trivial to copy and return the 1186 /// kind. 1187 PrimitiveCopyKind isNonTrivialToPrimitiveCopy() const; 1188 1189 /// Check if this is a non-trivial type that would cause a C struct 1190 /// transitively containing this type to be non-trivial to destructively 1191 /// move and return the kind. Destructive move in this context is a C++-style 1192 /// move in which the source object is placed in a valid but unspecified state 1193 /// after it is moved, as opposed to a truly destructive move in which the 1194 /// source object is placed in an uninitialized state. 1195 PrimitiveCopyKind isNonTrivialToPrimitiveDestructiveMove() const; 1196 1197 enum DestructionKind { 1198 DK_none, 1199 DK_cxx_destructor, 1200 DK_objc_strong_lifetime, 1201 DK_objc_weak_lifetime, 1202 DK_nontrivial_c_struct 1203 }; 1204 1205 /// Returns a nonzero value if objects of this type require 1206 /// non-trivial work to clean up after. Non-zero because it's 1207 /// conceivable that qualifiers (objc_gc(weak)?) could make 1208 /// something require destruction. 1209 DestructionKind isDestructedType() const { 1210 return isDestructedTypeImpl(*this); 1211 } 1212 1213 /// Check if this is or contains a C union that is non-trivial to 1214 /// default-initialize, which is a union that has a member that is non-trivial 1215 /// to default-initialize. If this returns true, 1216 /// isNonTrivialToPrimitiveDefaultInitialize returns PDIK_Struct. 1217 bool hasNonTrivialToPrimitiveDefaultInitializeCUnion() const; 1218 1219 /// Check if this is or contains a C union that is non-trivial to destruct, 1220 /// which is a union that has a member that is non-trivial to destruct. If 1221 /// this returns true, isDestructedType returns DK_nontrivial_c_struct. 1222 bool hasNonTrivialToPrimitiveDestructCUnion() const; 1223 1224 /// Check if this is or contains a C union that is non-trivial to copy, which 1225 /// is a union that has a member that is non-trivial to copy. If this returns 1226 /// true, isNonTrivialToPrimitiveCopy returns PCK_Struct. 1227 bool hasNonTrivialToPrimitiveCopyCUnion() const; 1228 1229 /// Determine whether expressions of the given type are forbidden 1230 /// from being lvalues in C. 1231 /// 1232 /// The expression types that are forbidden to be lvalues are: 1233 /// - 'void', but not qualified void 1234 /// - function types 1235 /// 1236 /// The exact rule here is C99 6.3.2.1: 1237 /// An lvalue is an expression with an object type or an incomplete 1238 /// type other than void. 1239 bool isCForbiddenLValueType() const; 1240 1241 /// Substitute type arguments for the Objective-C type parameters used in the 1242 /// subject type. 1243 /// 1244 /// \param ctx ASTContext in which the type exists. 1245 /// 1246 /// \param typeArgs The type arguments that will be substituted for the 1247 /// Objective-C type parameters in the subject type, which are generally 1248 /// computed via \c Type::getObjCSubstitutions. If empty, the type 1249 /// parameters will be replaced with their bounds or id/Class, as appropriate 1250 /// for the context. 1251 /// 1252 /// \param context The context in which the subject type was written. 1253 /// 1254 /// \returns the resulting type. 1255 QualType substObjCTypeArgs(ASTContext &ctx, 1256 ArrayRef<QualType> typeArgs, 1257 ObjCSubstitutionContext context) const; 1258 1259 /// Substitute type arguments from an object type for the Objective-C type 1260 /// parameters used in the subject type. 1261 /// 1262 /// This operation combines the computation of type arguments for 1263 /// substitution (\c Type::getObjCSubstitutions) with the actual process of 1264 /// substitution (\c QualType::substObjCTypeArgs) for the convenience of 1265 /// callers that need to perform a single substitution in isolation. 1266 /// 1267 /// \param objectType The type of the object whose member type we're 1268 /// substituting into. For example, this might be the receiver of a message 1269 /// or the base of a property access. 1270 /// 1271 /// \param dc The declaration context from which the subject type was 1272 /// retrieved, which indicates (for example) which type parameters should 1273 /// be substituted. 1274 /// 1275 /// \param context The context in which the subject type was written. 1276 /// 1277 /// \returns the subject type after replacing all of the Objective-C type 1278 /// parameters with their corresponding arguments. 1279 QualType substObjCMemberType(QualType objectType, 1280 const DeclContext *dc, 1281 ObjCSubstitutionContext context) const; 1282 1283 /// Strip Objective-C "__kindof" types from the given type. 1284 QualType stripObjCKindOfType(const ASTContext &ctx) const; 1285 1286 /// Remove all qualifiers including _Atomic. 1287 QualType getAtomicUnqualifiedType() const; 1288 1289 private: 1290 // These methods are implemented in a separate translation unit; 1291 // "static"-ize them to avoid creating temporary QualTypes in the 1292 // caller. 1293 static bool isConstant(QualType T, const ASTContext& Ctx); 1294 static QualType getDesugaredType(QualType T, const ASTContext &Context); 1295 static SplitQualType getSplitDesugaredType(QualType T); 1296 static SplitQualType getSplitUnqualifiedTypeImpl(QualType type); 1297 static QualType getSingleStepDesugaredTypeImpl(QualType type, 1298 const ASTContext &C); 1299 static QualType IgnoreParens(QualType T); 1300 static DestructionKind isDestructedTypeImpl(QualType type); 1301 1302 /// Check if \param RD is or contains a non-trivial C union. 1303 static bool hasNonTrivialToPrimitiveDefaultInitializeCUnion(const RecordDecl *RD); 1304 static bool hasNonTrivialToPrimitiveDestructCUnion(const RecordDecl *RD); 1305 static bool hasNonTrivialToPrimitiveCopyCUnion(const RecordDecl *RD); 1306 }; 1307 1308 } // namespace clang 1309 1310 namespace llvm { 1311 1312 /// Implement simplify_type for QualType, so that we can dyn_cast from QualType 1313 /// to a specific Type class. 1314 template<> struct simplify_type< ::clang::QualType> { 1315 using SimpleType = const ::clang::Type *; 1316 1317 static SimpleType getSimplifiedValue(::clang::QualType Val) { 1318 return Val.getTypePtr(); 1319 } 1320 }; 1321 1322 // Teach SmallPtrSet that QualType is "basically a pointer". 1323 template<> 1324 struct PointerLikeTypeTraits<clang::QualType> { 1325 static inline void *getAsVoidPointer(clang::QualType P) { 1326 return P.getAsOpaquePtr(); 1327 } 1328 1329 static inline clang::QualType getFromVoidPointer(void *P) { 1330 return clang::QualType::getFromOpaquePtr(P); 1331 } 1332 1333 // Various qualifiers go in low bits. 1334 static constexpr int NumLowBitsAvailable = 0; 1335 }; 1336 1337 } // namespace llvm 1338 1339 namespace clang { 1340 1341 /// Base class that is common to both the \c ExtQuals and \c Type 1342 /// classes, which allows \c QualType to access the common fields between the 1343 /// two. 1344 class ExtQualsTypeCommonBase { 1345 friend class ExtQuals; 1346 friend class QualType; 1347 friend class Type; 1348 1349 /// The "base" type of an extended qualifiers type (\c ExtQuals) or 1350 /// a self-referential pointer (for \c Type). 1351 /// 1352 /// This pointer allows an efficient mapping from a QualType to its 1353 /// underlying type pointer. 1354 const Type *const BaseType; 1355 1356 /// The canonical type of this type. A QualType. 1357 QualType CanonicalType; 1358 1359 ExtQualsTypeCommonBase(const Type *baseType, QualType canon) 1360 : BaseType(baseType), CanonicalType(canon) {} 1361 }; 1362 1363 /// We can encode up to four bits in the low bits of a 1364 /// type pointer, but there are many more type qualifiers that we want 1365 /// to be able to apply to an arbitrary type. Therefore we have this 1366 /// struct, intended to be heap-allocated and used by QualType to 1367 /// store qualifiers. 1368 /// 1369 /// The current design tags the 'const', 'restrict', and 'volatile' qualifiers 1370 /// in three low bits on the QualType pointer; a fourth bit records whether 1371 /// the pointer is an ExtQuals node. The extended qualifiers (address spaces, 1372 /// Objective-C GC attributes) are much more rare. 1373 class ExtQuals : public ExtQualsTypeCommonBase, public llvm::FoldingSetNode { 1374 // NOTE: changing the fast qualifiers should be straightforward as 1375 // long as you don't make 'const' non-fast. 1376 // 1. Qualifiers: 1377 // a) Modify the bitmasks (Qualifiers::TQ and DeclSpec::TQ). 1378 // Fast qualifiers must occupy the low-order bits. 1379 // b) Update Qualifiers::FastWidth and FastMask. 1380 // 2. QualType: 1381 // a) Update is{Volatile,Restrict}Qualified(), defined inline. 1382 // b) Update remove{Volatile,Restrict}, defined near the end of 1383 // this header. 1384 // 3. ASTContext: 1385 // a) Update get{Volatile,Restrict}Type. 1386 1387 /// The immutable set of qualifiers applied by this node. Always contains 1388 /// extended qualifiers. 1389 Qualifiers Quals; 1390 1391 ExtQuals *this_() { return this; } 1392 1393 public: 1394 ExtQuals(const Type *baseType, QualType canon, Qualifiers quals) 1395 : ExtQualsTypeCommonBase(baseType, 1396 canon.isNull() ? QualType(this_(), 0) : canon), 1397 Quals(quals) { 1398 assert(Quals.hasNonFastQualifiers() 1399 && "ExtQuals created with no fast qualifiers"); 1400 assert(!Quals.hasFastQualifiers() 1401 && "ExtQuals created with fast qualifiers"); 1402 } 1403 1404 Qualifiers getQualifiers() const { return Quals; } 1405 1406 bool hasObjCGCAttr() const { return Quals.hasObjCGCAttr(); } 1407 Qualifiers::GC getObjCGCAttr() const { return Quals.getObjCGCAttr(); } 1408 1409 bool hasObjCLifetime() const { return Quals.hasObjCLifetime(); } 1410 Qualifiers::ObjCLifetime getObjCLifetime() const { 1411 return Quals.getObjCLifetime(); 1412 } 1413 1414 bool hasAddressSpace() const { return Quals.hasAddressSpace(); } 1415 LangAS getAddressSpace() const { return Quals.getAddressSpace(); } 1416 1417 const Type *getBaseType() const { return BaseType; } 1418 1419 public: 1420 void Profile(llvm::FoldingSetNodeID &ID) const { 1421 Profile(ID, getBaseType(), Quals); 1422 } 1423 1424 static void Profile(llvm::FoldingSetNodeID &ID, 1425 const Type *BaseType, 1426 Qualifiers Quals) { 1427 assert(!Quals.hasFastQualifiers() && "fast qualifiers in ExtQuals hash!"); 1428 ID.AddPointer(BaseType); 1429 Quals.Profile(ID); 1430 } 1431 }; 1432 1433 /// The kind of C++11 ref-qualifier associated with a function type. 1434 /// This determines whether a member function's "this" object can be an 1435 /// lvalue, rvalue, or neither. 1436 enum RefQualifierKind { 1437 /// No ref-qualifier was provided. 1438 RQ_None = 0, 1439 1440 /// An lvalue ref-qualifier was provided (\c &). 1441 RQ_LValue, 1442 1443 /// An rvalue ref-qualifier was provided (\c &&). 1444 RQ_RValue 1445 }; 1446 1447 /// Which keyword(s) were used to create an AutoType. 1448 enum class AutoTypeKeyword { 1449 /// auto 1450 Auto, 1451 1452 /// decltype(auto) 1453 DecltypeAuto, 1454 1455 /// __auto_type (GNU extension) 1456 GNUAutoType 1457 }; 1458 1459 /// The base class of the type hierarchy. 1460 /// 1461 /// A central concept with types is that each type always has a canonical 1462 /// type. A canonical type is the type with any typedef names stripped out 1463 /// of it or the types it references. For example, consider: 1464 /// 1465 /// typedef int foo; 1466 /// typedef foo* bar; 1467 /// 'int *' 'foo *' 'bar' 1468 /// 1469 /// There will be a Type object created for 'int'. Since int is canonical, its 1470 /// CanonicalType pointer points to itself. There is also a Type for 'foo' (a 1471 /// TypedefType). Its CanonicalType pointer points to the 'int' Type. Next 1472 /// there is a PointerType that represents 'int*', which, like 'int', is 1473 /// canonical. Finally, there is a PointerType type for 'foo*' whose canonical 1474 /// type is 'int*', and there is a TypedefType for 'bar', whose canonical type 1475 /// is also 'int*'. 1476 /// 1477 /// Non-canonical types are useful for emitting diagnostics, without losing 1478 /// information about typedefs being used. Canonical types are useful for type 1479 /// comparisons (they allow by-pointer equality tests) and useful for reasoning 1480 /// about whether something has a particular form (e.g. is a function type), 1481 /// because they implicitly, recursively, strip all typedefs out of a type. 1482 /// 1483 /// Types, once created, are immutable. 1484 /// 1485 class alignas(8) Type : public ExtQualsTypeCommonBase { 1486 public: 1487 enum TypeClass { 1488 #define TYPE(Class, Base) Class, 1489 #define LAST_TYPE(Class) TypeLast = Class 1490 #define ABSTRACT_TYPE(Class, Base) 1491 #include "clang/AST/TypeNodes.inc" 1492 }; 1493 1494 private: 1495 /// Bitfields required by the Type class. 1496 class TypeBitfields { 1497 friend class Type; 1498 template <class T> friend class TypePropertyCache; 1499 1500 /// TypeClass bitfield - Enum that specifies what subclass this belongs to. 1501 unsigned TC : 8; 1502 1503 /// Store information on the type dependency. 1504 unsigned Dependence : llvm::BitWidth<TypeDependence>; 1505 1506 /// True if the cache (i.e. the bitfields here starting with 1507 /// 'Cache') is valid. 1508 mutable unsigned CacheValid : 1; 1509 1510 /// Linkage of this type. 1511 mutable unsigned CachedLinkage : 3; 1512 1513 /// Whether this type involves and local or unnamed types. 1514 mutable unsigned CachedLocalOrUnnamed : 1; 1515 1516 /// Whether this type comes from an AST file. 1517 mutable unsigned FromAST : 1; 1518 1519 bool isCacheValid() const { 1520 return CacheValid; 1521 } 1522 1523 Linkage getLinkage() const { 1524 assert(isCacheValid() && "getting linkage from invalid cache"); 1525 return static_cast<Linkage>(CachedLinkage); 1526 } 1527 1528 bool hasLocalOrUnnamedType() const { 1529 assert(isCacheValid() && "getting linkage from invalid cache"); 1530 return CachedLocalOrUnnamed; 1531 } 1532 }; 1533 enum { NumTypeBits = 8 + llvm::BitWidth<TypeDependence> + 6 }; 1534 1535 protected: 1536 // These classes allow subclasses to somewhat cleanly pack bitfields 1537 // into Type. 1538 1539 class ArrayTypeBitfields { 1540 friend class ArrayType; 1541 1542 unsigned : NumTypeBits; 1543 1544 /// CVR qualifiers from declarations like 1545 /// 'int X[static restrict 4]'. For function parameters only. 1546 unsigned IndexTypeQuals : 3; 1547 1548 /// Storage class qualifiers from declarations like 1549 /// 'int X[static restrict 4]'. For function parameters only. 1550 /// Actually an ArrayType::ArraySizeModifier. 1551 unsigned SizeModifier : 3; 1552 }; 1553 1554 class ConstantArrayTypeBitfields { 1555 friend class ConstantArrayType; 1556 1557 unsigned : NumTypeBits + 3 + 3; 1558 1559 /// Whether we have a stored size expression. 1560 unsigned HasStoredSizeExpr : 1; 1561 }; 1562 1563 class BuiltinTypeBitfields { 1564 friend class BuiltinType; 1565 1566 unsigned : NumTypeBits; 1567 1568 /// The kind (BuiltinType::Kind) of builtin type this is. 1569 unsigned Kind : 8; 1570 }; 1571 1572 /// FunctionTypeBitfields store various bits belonging to FunctionProtoType. 1573 /// Only common bits are stored here. Additional uncommon bits are stored 1574 /// in a trailing object after FunctionProtoType. 1575 class FunctionTypeBitfields { 1576 friend class FunctionProtoType; 1577 friend class FunctionType; 1578 1579 unsigned : NumTypeBits; 1580 1581 /// Extra information which affects how the function is called, like 1582 /// regparm and the calling convention. 1583 unsigned ExtInfo : 13; 1584 1585 /// The ref-qualifier associated with a \c FunctionProtoType. 1586 /// 1587 /// This is a value of type \c RefQualifierKind. 1588 unsigned RefQualifier : 2; 1589 1590 /// Used only by FunctionProtoType, put here to pack with the 1591 /// other bitfields. 1592 /// The qualifiers are part of FunctionProtoType because... 1593 /// 1594 /// C++ 8.3.5p4: The return type, the parameter type list and the 1595 /// cv-qualifier-seq, [...], are part of the function type. 1596 unsigned FastTypeQuals : Qualifiers::FastWidth; 1597 /// Whether this function has extended Qualifiers. 1598 unsigned HasExtQuals : 1; 1599 1600 /// The number of parameters this function has, not counting '...'. 1601 /// According to [implimits] 8 bits should be enough here but this is 1602 /// somewhat easy to exceed with metaprogramming and so we would like to 1603 /// keep NumParams as wide as reasonably possible. 1604 unsigned NumParams : 16; 1605 1606 /// The type of exception specification this function has. 1607 unsigned ExceptionSpecType : 4; 1608 1609 /// Whether this function has extended parameter information. 1610 unsigned HasExtParameterInfos : 1; 1611 1612 /// Whether the function is variadic. 1613 unsigned Variadic : 1; 1614 1615 /// Whether this function has a trailing return type. 1616 unsigned HasTrailingReturn : 1; 1617 }; 1618 1619 class ObjCObjectTypeBitfields { 1620 friend class ObjCObjectType; 1621 1622 unsigned : NumTypeBits; 1623 1624 /// The number of type arguments stored directly on this object type. 1625 unsigned NumTypeArgs : 7; 1626 1627 /// The number of protocols stored directly on this object type. 1628 unsigned NumProtocols : 6; 1629 1630 /// Whether this is a "kindof" type. 1631 unsigned IsKindOf : 1; 1632 }; 1633 1634 class ReferenceTypeBitfields { 1635 friend class ReferenceType; 1636 1637 unsigned : NumTypeBits; 1638 1639 /// True if the type was originally spelled with an lvalue sigil. 1640 /// This is never true of rvalue references but can also be false 1641 /// on lvalue references because of C++0x [dcl.typedef]p9, 1642 /// as follows: 1643 /// 1644 /// typedef int &ref; // lvalue, spelled lvalue 1645 /// typedef int &&rvref; // rvalue 1646 /// ref &a; // lvalue, inner ref, spelled lvalue 1647 /// ref &&a; // lvalue, inner ref 1648 /// rvref &a; // lvalue, inner ref, spelled lvalue 1649 /// rvref &&a; // rvalue, inner ref 1650 unsigned SpelledAsLValue : 1; 1651 1652 /// True if the inner type is a reference type. This only happens 1653 /// in non-canonical forms. 1654 unsigned InnerRef : 1; 1655 }; 1656 1657 class TypeWithKeywordBitfields { 1658 friend class TypeWithKeyword; 1659 1660 unsigned : NumTypeBits; 1661 1662 /// An ElaboratedTypeKeyword. 8 bits for efficient access. 1663 unsigned Keyword : 8; 1664 }; 1665 1666 enum { NumTypeWithKeywordBits = 8 }; 1667 1668 class ElaboratedTypeBitfields { 1669 friend class ElaboratedType; 1670 1671 unsigned : NumTypeBits; 1672 unsigned : NumTypeWithKeywordBits; 1673 1674 /// Whether the ElaboratedType has a trailing OwnedTagDecl. 1675 unsigned HasOwnedTagDecl : 1; 1676 }; 1677 1678 class VectorTypeBitfields { 1679 friend class VectorType; 1680 friend class DependentVectorType; 1681 1682 unsigned : NumTypeBits; 1683 1684 /// The kind of vector, either a generic vector type or some 1685 /// target-specific vector type such as for AltiVec or Neon. 1686 unsigned VecKind : 3; 1687 /// The number of elements in the vector. 1688 uint32_t NumElements; 1689 }; 1690 1691 class AttributedTypeBitfields { 1692 friend class AttributedType; 1693 1694 unsigned : NumTypeBits; 1695 1696 /// An AttributedType::Kind 1697 unsigned AttrKind : 32 - NumTypeBits; 1698 }; 1699 1700 class AutoTypeBitfields { 1701 friend class AutoType; 1702 1703 unsigned : NumTypeBits; 1704 1705 /// Was this placeholder type spelled as 'auto', 'decltype(auto)', 1706 /// or '__auto_type'? AutoTypeKeyword value. 1707 unsigned Keyword : 2; 1708 1709 /// The number of template arguments in the type-constraints, which is 1710 /// expected to be able to hold at least 1024 according to [implimits]. 1711 /// However as this limit is somewhat easy to hit with template 1712 /// metaprogramming we'd prefer to keep it as large as possible. 1713 /// At the moment it has been left as a non-bitfield since this type 1714 /// safely fits in 64 bits as an unsigned, so there is no reason to 1715 /// introduce the performance impact of a bitfield. 1716 unsigned NumArgs; 1717 }; 1718 1719 class SubstTemplateTypeParmPackTypeBitfields { 1720 friend class SubstTemplateTypeParmPackType; 1721 1722 unsigned : NumTypeBits; 1723 1724 /// The number of template arguments in \c Arguments, which is 1725 /// expected to be able to hold at least 1024 according to [implimits]. 1726 /// However as this limit is somewhat easy to hit with template 1727 /// metaprogramming we'd prefer to keep it as large as possible. 1728 /// At the moment it has been left as a non-bitfield since this type 1729 /// safely fits in 64 bits as an unsigned, so there is no reason to 1730 /// introduce the performance impact of a bitfield. 1731 unsigned NumArgs; 1732 }; 1733 1734 class TemplateSpecializationTypeBitfields { 1735 friend class TemplateSpecializationType; 1736 1737 unsigned : NumTypeBits; 1738 1739 /// Whether this template specialization type is a substituted type alias. 1740 unsigned TypeAlias : 1; 1741 1742 /// The number of template arguments named in this class template 1743 /// specialization, which is expected to be able to hold at least 1024 1744 /// according to [implimits]. However, as this limit is somewhat easy to 1745 /// hit with template metaprogramming we'd prefer to keep it as large 1746 /// as possible. At the moment it has been left as a non-bitfield since 1747 /// this type safely fits in 64 bits as an unsigned, so there is no reason 1748 /// to introduce the performance impact of a bitfield. 1749 unsigned NumArgs; 1750 }; 1751 1752 class DependentTemplateSpecializationTypeBitfields { 1753 friend class DependentTemplateSpecializationType; 1754 1755 unsigned : NumTypeBits; 1756 unsigned : NumTypeWithKeywordBits; 1757 1758 /// The number of template arguments named in this class template 1759 /// specialization, which is expected to be able to hold at least 1024 1760 /// according to [implimits]. However, as this limit is somewhat easy to 1761 /// hit with template metaprogramming we'd prefer to keep it as large 1762 /// as possible. At the moment it has been left as a non-bitfield since 1763 /// this type safely fits in 64 bits as an unsigned, so there is no reason 1764 /// to introduce the performance impact of a bitfield. 1765 unsigned NumArgs; 1766 }; 1767 1768 class PackExpansionTypeBitfields { 1769 friend class PackExpansionType; 1770 1771 unsigned : NumTypeBits; 1772 1773 /// The number of expansions that this pack expansion will 1774 /// generate when substituted (+1), which is expected to be able to 1775 /// hold at least 1024 according to [implimits]. However, as this limit 1776 /// is somewhat easy to hit with template metaprogramming we'd prefer to 1777 /// keep it as large as possible. At the moment it has been left as a 1778 /// non-bitfield since this type safely fits in 64 bits as an unsigned, so 1779 /// there is no reason to introduce the performance impact of a bitfield. 1780 /// 1781 /// This field will only have a non-zero value when some of the parameter 1782 /// packs that occur within the pattern have been substituted but others 1783 /// have not. 1784 unsigned NumExpansions; 1785 }; 1786 1787 union { 1788 TypeBitfields TypeBits; 1789 ArrayTypeBitfields ArrayTypeBits; 1790 ConstantArrayTypeBitfields ConstantArrayTypeBits; 1791 AttributedTypeBitfields AttributedTypeBits; 1792 AutoTypeBitfields AutoTypeBits; 1793 BuiltinTypeBitfields BuiltinTypeBits; 1794 FunctionTypeBitfields FunctionTypeBits; 1795 ObjCObjectTypeBitfields ObjCObjectTypeBits; 1796 ReferenceTypeBitfields ReferenceTypeBits; 1797 TypeWithKeywordBitfields TypeWithKeywordBits; 1798 ElaboratedTypeBitfields ElaboratedTypeBits; 1799 VectorTypeBitfields VectorTypeBits; 1800 SubstTemplateTypeParmPackTypeBitfields SubstTemplateTypeParmPackTypeBits; 1801 TemplateSpecializationTypeBitfields TemplateSpecializationTypeBits; 1802 DependentTemplateSpecializationTypeBitfields 1803 DependentTemplateSpecializationTypeBits; 1804 PackExpansionTypeBitfields PackExpansionTypeBits; 1805 }; 1806 1807 private: 1808 template <class T> friend class TypePropertyCache; 1809 1810 /// Set whether this type comes from an AST file. 1811 void setFromAST(bool V = true) const { 1812 TypeBits.FromAST = V; 1813 } 1814 1815 protected: 1816 friend class ASTContext; 1817 1818 Type(TypeClass tc, QualType canon, TypeDependence Dependence) 1819 : ExtQualsTypeCommonBase(this, 1820 canon.isNull() ? QualType(this_(), 0) : canon) { 1821 static_assert(sizeof(*this) <= 8 + sizeof(ExtQualsTypeCommonBase), 1822 "changing bitfields changed sizeof(Type)!"); 1823 static_assert(alignof(decltype(*this)) % sizeof(void *) == 0, 1824 "Insufficient alignment!"); 1825 TypeBits.TC = tc; 1826 TypeBits.Dependence = static_cast<unsigned>(Dependence); 1827 TypeBits.CacheValid = false; 1828 TypeBits.CachedLocalOrUnnamed = false; 1829 TypeBits.CachedLinkage = NoLinkage; 1830 TypeBits.FromAST = false; 1831 } 1832 1833 // silence VC++ warning C4355: 'this' : used in base member initializer list 1834 Type *this_() { return this; } 1835 1836 void setDependence(TypeDependence D) { 1837 TypeBits.Dependence = static_cast<unsigned>(D); 1838 } 1839 1840 void addDependence(TypeDependence D) { setDependence(getDependence() | D); } 1841 1842 public: 1843 friend class ASTReader; 1844 friend class ASTWriter; 1845 template <class T> friend class serialization::AbstractTypeReader; 1846 template <class T> friend class serialization::AbstractTypeWriter; 1847 1848 Type(const Type &) = delete; 1849 Type(Type &&) = delete; 1850 Type &operator=(const Type &) = delete; 1851 Type &operator=(Type &&) = delete; 1852 1853 TypeClass getTypeClass() const { return static_cast<TypeClass>(TypeBits.TC); } 1854 1855 /// Whether this type comes from an AST file. 1856 bool isFromAST() const { return TypeBits.FromAST; } 1857 1858 /// Whether this type is or contains an unexpanded parameter 1859 /// pack, used to support C++0x variadic templates. 1860 /// 1861 /// A type that contains a parameter pack shall be expanded by the 1862 /// ellipsis operator at some point. For example, the typedef in the 1863 /// following example contains an unexpanded parameter pack 'T': 1864 /// 1865 /// \code 1866 /// template<typename ...T> 1867 /// struct X { 1868 /// typedef T* pointer_types; // ill-formed; T is a parameter pack. 1869 /// }; 1870 /// \endcode 1871 /// 1872 /// Note that this routine does not specify which 1873 bool containsUnexpandedParameterPack() const { 1874 return getDependence() & TypeDependence::UnexpandedPack; 1875 } 1876 1877 /// Determines if this type would be canonical if it had no further 1878 /// qualification. 1879 bool isCanonicalUnqualified() const { 1880 return CanonicalType == QualType(this, 0); 1881 } 1882 1883 /// Pull a single level of sugar off of this locally-unqualified type. 1884 /// Users should generally prefer SplitQualType::getSingleStepDesugaredType() 1885 /// or QualType::getSingleStepDesugaredType(const ASTContext&). 1886 QualType getLocallyUnqualifiedSingleStepDesugaredType() const; 1887 1888 /// As an extension, we classify types as one of "sized" or "sizeless"; 1889 /// every type is one or the other. Standard types are all sized; 1890 /// sizeless types are purely an extension. 1891 /// 1892 /// Sizeless types contain data with no specified size, alignment, 1893 /// or layout. 1894 bool isSizelessType() const; 1895 bool isSizelessBuiltinType() const; 1896 1897 /// Determines if this is a sizeless type supported by the 1898 /// 'arm_sve_vector_bits' type attribute, which can be applied to a single 1899 /// SVE vector or predicate, excluding tuple types such as svint32x4_t. 1900 bool isVLSTBuiltinType() const; 1901 1902 /// Returns the representative type for the element of an SVE builtin type. 1903 /// This is used to represent fixed-length SVE vectors created with the 1904 /// 'arm_sve_vector_bits' type attribute as VectorType. 1905 QualType getSveEltType(const ASTContext &Ctx) const; 1906 1907 /// Types are partitioned into 3 broad categories (C99 6.2.5p1): 1908 /// object types, function types, and incomplete types. 1909 1910 /// Return true if this is an incomplete type. 1911 /// A type that can describe objects, but which lacks information needed to 1912 /// determine its size (e.g. void, or a fwd declared struct). Clients of this 1913 /// routine will need to determine if the size is actually required. 1914 /// 1915 /// Def If non-null, and the type refers to some kind of declaration 1916 /// that can be completed (such as a C struct, C++ class, or Objective-C 1917 /// class), will be set to the declaration. 1918 bool isIncompleteType(NamedDecl **Def = nullptr) const; 1919 1920 /// Return true if this is an incomplete or object 1921 /// type, in other words, not a function type. 1922 bool isIncompleteOrObjectType() const { 1923 return !isFunctionType(); 1924 } 1925 1926 /// Determine whether this type is an object type. 1927 bool isObjectType() const { 1928 // C++ [basic.types]p8: 1929 // An object type is a (possibly cv-qualified) type that is not a 1930 // function type, not a reference type, and not a void type. 1931 return !isReferenceType() && !isFunctionType() && !isVoidType(); 1932 } 1933 1934 /// Return true if this is a literal type 1935 /// (C++11 [basic.types]p10) 1936 bool isLiteralType(const ASTContext &Ctx) const; 1937 1938 /// Determine if this type is a structural type, per C++20 [temp.param]p7. 1939 bool isStructuralType() const; 1940 1941 /// Test if this type is a standard-layout type. 1942 /// (C++0x [basic.type]p9) 1943 bool isStandardLayoutType() const; 1944 1945 /// Helper methods to distinguish type categories. All type predicates 1946 /// operate on the canonical type, ignoring typedefs and qualifiers. 1947 1948 /// Returns true if the type is a builtin type. 1949 bool isBuiltinType() const; 1950 1951 /// Test for a particular builtin type. 1952 bool isSpecificBuiltinType(unsigned K) const; 1953 1954 /// Test for a type which does not represent an actual type-system type but 1955 /// is instead used as a placeholder for various convenient purposes within 1956 /// Clang. All such types are BuiltinTypes. 1957 bool isPlaceholderType() const; 1958 const BuiltinType *getAsPlaceholderType() const; 1959 1960 /// Test for a specific placeholder type. 1961 bool isSpecificPlaceholderType(unsigned K) const; 1962 1963 /// Test for a placeholder type other than Overload; see 1964 /// BuiltinType::isNonOverloadPlaceholderType. 1965 bool isNonOverloadPlaceholderType() const; 1966 1967 /// isIntegerType() does *not* include complex integers (a GCC extension). 1968 /// isComplexIntegerType() can be used to test for complex integers. 1969 bool isIntegerType() const; // C99 6.2.5p17 (int, char, bool, enum) 1970 bool isEnumeralType() const; 1971 1972 /// Determine whether this type is a scoped enumeration type. 1973 bool isScopedEnumeralType() const; 1974 bool isBooleanType() const; 1975 bool isCharType() const; 1976 bool isWideCharType() const; 1977 bool isChar8Type() const; 1978 bool isChar16Type() const; 1979 bool isChar32Type() const; 1980 bool isAnyCharacterType() const; 1981 bool isIntegralType(const ASTContext &Ctx) const; 1982 1983 /// Determine whether this type is an integral or enumeration type. 1984 bool isIntegralOrEnumerationType() const; 1985 1986 /// Determine whether this type is an integral or unscoped enumeration type. 1987 bool isIntegralOrUnscopedEnumerationType() const; 1988 bool isUnscopedEnumerationType() const; 1989 1990 /// Floating point categories. 1991 bool isRealFloatingType() const; // C99 6.2.5p10 (float, double, long double) 1992 /// isComplexType() does *not* include complex integers (a GCC extension). 1993 /// isComplexIntegerType() can be used to test for complex integers. 1994 bool isComplexType() const; // C99 6.2.5p11 (complex) 1995 bool isAnyComplexType() const; // C99 6.2.5p11 (complex) + Complex Int. 1996 bool isFloatingType() const; // C99 6.2.5p11 (real floating + complex) 1997 bool isHalfType() const; // OpenCL 6.1.1.1, NEON (IEEE 754-2008 half) 1998 bool isFloat16Type() const; // C11 extension ISO/IEC TS 18661 1999 bool isBFloat16Type() const; 2000 bool isFloat128Type() const; 2001 bool isRealType() const; // C99 6.2.5p17 (real floating + integer) 2002 bool isArithmeticType() const; // C99 6.2.5p18 (integer + floating) 2003 bool isVoidType() const; // C99 6.2.5p19 2004 bool isScalarType() const; // C99 6.2.5p21 (arithmetic + pointers) 2005 bool isAggregateType() const; 2006 bool isFundamentalType() const; 2007 bool isCompoundType() const; 2008 2009 // Type Predicates: Check to see if this type is structurally the specified 2010 // type, ignoring typedefs and qualifiers. 2011 bool isFunctionType() const; 2012 bool isFunctionNoProtoType() const { return getAs<FunctionNoProtoType>(); } 2013 bool isFunctionProtoType() const { return getAs<FunctionProtoType>(); } 2014 bool isPointerType() const; 2015 bool isAnyPointerType() const; // Any C pointer or ObjC object pointer 2016 bool isBlockPointerType() const; 2017 bool isVoidPointerType() const; 2018 bool isReferenceType() const; 2019 bool isLValueReferenceType() const; 2020 bool isRValueReferenceType() const; 2021 bool isObjectPointerType() const; 2022 bool isFunctionPointerType() const; 2023 bool isFunctionReferenceType() const; 2024 bool isMemberPointerType() const; 2025 bool isMemberFunctionPointerType() const; 2026 bool isMemberDataPointerType() const; 2027 bool isArrayType() const; 2028 bool isConstantArrayType() const; 2029 bool isIncompleteArrayType() const; 2030 bool isVariableArrayType() const; 2031 bool isDependentSizedArrayType() const; 2032 bool isRecordType() const; 2033 bool isClassType() const; 2034 bool isStructureType() const; 2035 bool isObjCBoxableRecordType() const; 2036 bool isInterfaceType() const; 2037 bool isStructureOrClassType() const; 2038 bool isUnionType() const; 2039 bool isComplexIntegerType() const; // GCC _Complex integer type. 2040 bool isVectorType() const; // GCC vector type. 2041 bool isExtVectorType() const; // Extended vector type. 2042 bool isMatrixType() const; // Matrix type. 2043 bool isConstantMatrixType() const; // Constant matrix type. 2044 bool isDependentAddressSpaceType() const; // value-dependent address space qualifier 2045 bool isObjCObjectPointerType() const; // pointer to ObjC object 2046 bool isObjCRetainableType() const; // ObjC object or block pointer 2047 bool isObjCLifetimeType() const; // (array of)* retainable type 2048 bool isObjCIndirectLifetimeType() const; // (pointer to)* lifetime type 2049 bool isObjCNSObjectType() const; // __attribute__((NSObject)) 2050 bool isObjCIndependentClassType() const; // __attribute__((objc_independent_class)) 2051 // FIXME: change this to 'raw' interface type, so we can used 'interface' type 2052 // for the common case. 2053 bool isObjCObjectType() const; // NSString or typeof(*(id)0) 2054 bool isObjCQualifiedInterfaceType() const; // NSString<foo> 2055 bool isObjCQualifiedIdType() const; // id<foo> 2056 bool isObjCQualifiedClassType() const; // Class<foo> 2057 bool isObjCObjectOrInterfaceType() const; 2058 bool isObjCIdType() const; // id 2059 bool isDecltypeType() const; 2060 /// Was this type written with the special inert-in-ARC __unsafe_unretained 2061 /// qualifier? 2062 /// 2063 /// This approximates the answer to the following question: if this 2064 /// translation unit were compiled in ARC, would this type be qualified 2065 /// with __unsafe_unretained? 2066 bool isObjCInertUnsafeUnretainedType() const { 2067 return hasAttr(attr::ObjCInertUnsafeUnretained); 2068 } 2069 2070 /// Whether the type is Objective-C 'id' or a __kindof type of an 2071 /// object type, e.g., __kindof NSView * or __kindof id 2072 /// <NSCopying>. 2073 /// 2074 /// \param bound Will be set to the bound on non-id subtype types, 2075 /// which will be (possibly specialized) Objective-C class type, or 2076 /// null for 'id. 2077 bool isObjCIdOrObjectKindOfType(const ASTContext &ctx, 2078 const ObjCObjectType *&bound) const; 2079 2080 bool isObjCClassType() const; // Class 2081 2082 /// Whether the type is Objective-C 'Class' or a __kindof type of an 2083 /// Class type, e.g., __kindof Class <NSCopying>. 2084 /// 2085 /// Unlike \c isObjCIdOrObjectKindOfType, there is no relevant bound 2086 /// here because Objective-C's type system cannot express "a class 2087 /// object for a subclass of NSFoo". 2088 bool isObjCClassOrClassKindOfType() const; 2089 2090 bool isBlockCompatibleObjCPointerType(ASTContext &ctx) const; 2091 bool isObjCSelType() const; // Class 2092 bool isObjCBuiltinType() const; // 'id' or 'Class' 2093 bool isObjCARCBridgableType() const; 2094 bool isCARCBridgableType() const; 2095 bool isTemplateTypeParmType() const; // C++ template type parameter 2096 bool isNullPtrType() const; // C++11 std::nullptr_t 2097 bool isNothrowT() const; // C++ std::nothrow_t 2098 bool isAlignValT() const; // C++17 std::align_val_t 2099 bool isStdByteType() const; // C++17 std::byte 2100 bool isAtomicType() const; // C11 _Atomic() 2101 bool isUndeducedAutoType() const; // C++11 auto or 2102 // C++14 decltype(auto) 2103 bool isTypedefNameType() const; // typedef or alias template 2104 2105 #define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \ 2106 bool is##Id##Type() const; 2107 #include "clang/Basic/OpenCLImageTypes.def" 2108 2109 bool isImageType() const; // Any OpenCL image type 2110 2111 bool isSamplerT() const; // OpenCL sampler_t 2112 bool isEventT() const; // OpenCL event_t 2113 bool isClkEventT() const; // OpenCL clk_event_t 2114 bool isQueueT() const; // OpenCL queue_t 2115 bool isReserveIDT() const; // OpenCL reserve_id_t 2116 2117 #define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \ 2118 bool is##Id##Type() const; 2119 #include "clang/Basic/OpenCLExtensionTypes.def" 2120 // Type defined in cl_intel_device_side_avc_motion_estimation OpenCL extension 2121 bool isOCLIntelSubgroupAVCType() const; 2122 bool isOCLExtOpaqueType() const; // Any OpenCL extension type 2123 2124 bool isPipeType() const; // OpenCL pipe type 2125 bool isExtIntType() const; // Extended Int Type 2126 bool isOpenCLSpecificType() const; // Any OpenCL specific type 2127 2128 /// Determines if this type, which must satisfy 2129 /// isObjCLifetimeType(), is implicitly __unsafe_unretained rather 2130 /// than implicitly __strong. 2131 bool isObjCARCImplicitlyUnretainedType() const; 2132 2133 /// Check if the type is the CUDA device builtin surface type. 2134 bool isCUDADeviceBuiltinSurfaceType() const; 2135 /// Check if the type is the CUDA device builtin texture type. 2136 bool isCUDADeviceBuiltinTextureType() const; 2137 2138 /// Return the implicit lifetime for this type, which must not be dependent. 2139 Qualifiers::ObjCLifetime getObjCARCImplicitLifetime() const; 2140 2141 enum ScalarTypeKind { 2142 STK_CPointer, 2143 STK_BlockPointer, 2144 STK_ObjCObjectPointer, 2145 STK_MemberPointer, 2146 STK_Bool, 2147 STK_Integral, 2148 STK_Floating, 2149 STK_IntegralComplex, 2150 STK_FloatingComplex, 2151 STK_FixedPoint 2152 }; 2153 2154 /// Given that this is a scalar type, classify it. 2155 ScalarTypeKind getScalarTypeKind() const; 2156 2157 TypeDependence getDependence() const { 2158 return static_cast<TypeDependence>(TypeBits.Dependence); 2159 } 2160 2161 /// Whether this type is an error type. 2162 bool containsErrors() const { 2163 return getDependence() & TypeDependence::Error; 2164 } 2165 2166 /// Whether this type is a dependent type, meaning that its definition 2167 /// somehow depends on a template parameter (C++ [temp.dep.type]). 2168 bool isDependentType() const { 2169 return getDependence() & TypeDependence::Dependent; 2170 } 2171 2172 /// Determine whether this type is an instantiation-dependent type, 2173 /// meaning that the type involves a template parameter (even if the 2174 /// definition does not actually depend on the type substituted for that 2175 /// template parameter). 2176 bool isInstantiationDependentType() const { 2177 return getDependence() & TypeDependence::Instantiation; 2178 } 2179 2180 /// Determine whether this type is an undeduced type, meaning that 2181 /// it somehow involves a C++11 'auto' type or similar which has not yet been 2182 /// deduced. 2183 bool isUndeducedType() const; 2184 2185 /// Whether this type is a variably-modified type (C99 6.7.5). 2186 bool isVariablyModifiedType() const { 2187 return getDependence() & TypeDependence::VariablyModified; 2188 } 2189 2190 /// Whether this type involves a variable-length array type 2191 /// with a definite size. 2192 bool hasSizedVLAType() const; 2193 2194 /// Whether this type is or contains a local or unnamed type. 2195 bool hasUnnamedOrLocalType() const; 2196 2197 bool isOverloadableType() const; 2198 2199 /// Determine wither this type is a C++ elaborated-type-specifier. 2200 bool isElaboratedTypeSpecifier() const; 2201 2202 bool canDecayToPointerType() const; 2203 2204 /// Whether this type is represented natively as a pointer. This includes 2205 /// pointers, references, block pointers, and Objective-C interface, 2206 /// qualified id, and qualified interface types, as well as nullptr_t. 2207 bool hasPointerRepresentation() const; 2208 2209 /// Whether this type can represent an objective pointer type for the 2210 /// purpose of GC'ability 2211 bool hasObjCPointerRepresentation() const; 2212 2213 /// Determine whether this type has an integer representation 2214 /// of some sort, e.g., it is an integer type or a vector. 2215 bool hasIntegerRepresentation() const; 2216 2217 /// Determine whether this type has an signed integer representation 2218 /// of some sort, e.g., it is an signed integer type or a vector. 2219 bool hasSignedIntegerRepresentation() const; 2220 2221 /// Determine whether this type has an unsigned integer representation 2222 /// of some sort, e.g., it is an unsigned integer type or a vector. 2223 bool hasUnsignedIntegerRepresentation() const; 2224 2225 /// Determine whether this type has a floating-point representation 2226 /// of some sort, e.g., it is a floating-point type or a vector thereof. 2227 bool hasFloatingRepresentation() const; 2228 2229 // Type Checking Functions: Check to see if this type is structurally the 2230 // specified type, ignoring typedefs and qualifiers, and return a pointer to 2231 // the best type we can. 2232 const RecordType *getAsStructureType() const; 2233 /// NOTE: getAs*ArrayType are methods on ASTContext. 2234 const RecordType *getAsUnionType() const; 2235 const ComplexType *getAsComplexIntegerType() const; // GCC complex int type. 2236 const ObjCObjectType *getAsObjCInterfaceType() const; 2237 2238 // The following is a convenience method that returns an ObjCObjectPointerType 2239 // for object declared using an interface. 2240 const ObjCObjectPointerType *getAsObjCInterfacePointerType() const; 2241 const ObjCObjectPointerType *getAsObjCQualifiedIdType() const; 2242 const ObjCObjectPointerType *getAsObjCQualifiedClassType() const; 2243 const ObjCObjectType *getAsObjCQualifiedInterfaceType() const; 2244 2245 /// Retrieves the CXXRecordDecl that this type refers to, either 2246 /// because the type is a RecordType or because it is the injected-class-name 2247 /// type of a class template or class template partial specialization. 2248 CXXRecordDecl *getAsCXXRecordDecl() const; 2249 2250 /// Retrieves the RecordDecl this type refers to. 2251 RecordDecl *getAsRecordDecl() const; 2252 2253 /// Retrieves the TagDecl that this type refers to, either 2254 /// because the type is a TagType or because it is the injected-class-name 2255 /// type of a class template or class template partial specialization. 2256 TagDecl *getAsTagDecl() const; 2257 2258 /// If this is a pointer or reference to a RecordType, return the 2259 /// CXXRecordDecl that the type refers to. 2260 /// 2261 /// If this is not a pointer or reference, or the type being pointed to does 2262 /// not refer to a CXXRecordDecl, returns NULL. 2263 const CXXRecordDecl *getPointeeCXXRecordDecl() const; 2264 2265 /// Get the DeducedType whose type will be deduced for a variable with 2266 /// an initializer of this type. This looks through declarators like pointer 2267 /// types, but not through decltype or typedefs. 2268 DeducedType *getContainedDeducedType() const; 2269 2270 /// Get the AutoType whose type will be deduced for a variable with 2271 /// an initializer of this type. This looks through declarators like pointer 2272 /// types, but not through decltype or typedefs. 2273 AutoType *getContainedAutoType() const { 2274 return dyn_cast_or_null<AutoType>(getContainedDeducedType()); 2275 } 2276 2277 /// Determine whether this type was written with a leading 'auto' 2278 /// corresponding to a trailing return type (possibly for a nested 2279 /// function type within a pointer to function type or similar). 2280 bool hasAutoForTrailingReturnType() const; 2281 2282 /// Member-template getAs<specific type>'. Look through sugar for 2283 /// an instance of \<specific type>. This scheme will eventually 2284 /// replace the specific getAsXXXX methods above. 2285 /// 2286 /// There are some specializations of this member template listed 2287 /// immediately following this class. 2288 template <typename T> const T *getAs() const; 2289 2290 /// Member-template getAsAdjusted<specific type>. Look through specific kinds 2291 /// of sugar (parens, attributes, etc) for an instance of \<specific type>. 2292 /// This is used when you need to walk over sugar nodes that represent some 2293 /// kind of type adjustment from a type that was written as a \<specific type> 2294 /// to another type that is still canonically a \<specific type>. 2295 template <typename T> const T *getAsAdjusted() const; 2296 2297 /// A variant of getAs<> for array types which silently discards 2298 /// qualifiers from the outermost type. 2299 const ArrayType *getAsArrayTypeUnsafe() const; 2300 2301 /// Member-template castAs<specific type>. Look through sugar for 2302 /// the underlying instance of \<specific type>. 2303 /// 2304 /// This method has the same relationship to getAs<T> as cast<T> has 2305 /// to dyn_cast<T>; which is to say, the underlying type *must* 2306 /// have the intended type, and this method will never return null. 2307 template <typename T> const T *castAs() const; 2308 2309 /// A variant of castAs<> for array type which silently discards 2310 /// qualifiers from the outermost type. 2311 const ArrayType *castAsArrayTypeUnsafe() const; 2312 2313 /// Determine whether this type had the specified attribute applied to it 2314 /// (looking through top-level type sugar). 2315 bool hasAttr(attr::Kind AK) const; 2316 2317 /// Get the base element type of this type, potentially discarding type 2318 /// qualifiers. This should never be used when type qualifiers 2319 /// are meaningful. 2320 const Type *getBaseElementTypeUnsafe() const; 2321 2322 /// If this is an array type, return the element type of the array, 2323 /// potentially with type qualifiers missing. 2324 /// This should never be used when type qualifiers are meaningful. 2325 const Type *getArrayElementTypeNoTypeQual() const; 2326 2327 /// If this is a pointer type, return the pointee type. 2328 /// If this is an array type, return the array element type. 2329 /// This should never be used when type qualifiers are meaningful. 2330 const Type *getPointeeOrArrayElementType() const; 2331 2332 /// If this is a pointer, ObjC object pointer, or block 2333 /// pointer, this returns the respective pointee. 2334 QualType getPointeeType() const; 2335 2336 /// Return the specified type with any "sugar" removed from the type, 2337 /// removing any typedefs, typeofs, etc., as well as any qualifiers. 2338 const Type *getUnqualifiedDesugaredType() const; 2339 2340 /// More type predicates useful for type checking/promotion 2341 bool isPromotableIntegerType() const; // C99 6.3.1.1p2 2342 2343 /// Return true if this is an integer type that is 2344 /// signed, according to C99 6.2.5p4 [char, signed char, short, int, long..], 2345 /// or an enum decl which has a signed representation. 2346 bool isSignedIntegerType() const; 2347 2348 /// Return true if this is an integer type that is 2349 /// unsigned, according to C99 6.2.5p6 [which returns true for _Bool], 2350 /// or an enum decl which has an unsigned representation. 2351 bool isUnsignedIntegerType() const; 2352 2353 /// Determines whether this is an integer type that is signed or an 2354 /// enumeration types whose underlying type is a signed integer type. 2355 bool isSignedIntegerOrEnumerationType() const; 2356 2357 /// Determines whether this is an integer type that is unsigned or an 2358 /// enumeration types whose underlying type is a unsigned integer type. 2359 bool isUnsignedIntegerOrEnumerationType() const; 2360 2361 /// Return true if this is a fixed point type according to 2362 /// ISO/IEC JTC1 SC22 WG14 N1169. 2363 bool isFixedPointType() const; 2364 2365 /// Return true if this is a fixed point or integer type. 2366 bool isFixedPointOrIntegerType() const; 2367 2368 /// Return true if this is a saturated fixed point type according to 2369 /// ISO/IEC JTC1 SC22 WG14 N1169. This type can be signed or unsigned. 2370 bool isSaturatedFixedPointType() const; 2371 2372 /// Return true if this is a saturated fixed point type according to 2373 /// ISO/IEC JTC1 SC22 WG14 N1169. This type can be signed or unsigned. 2374 bool isUnsaturatedFixedPointType() const; 2375 2376 /// Return true if this is a fixed point type that is signed according 2377 /// to ISO/IEC JTC1 SC22 WG14 N1169. This type can also be saturated. 2378 bool isSignedFixedPointType() const; 2379 2380 /// Return true if this is a fixed point type that is unsigned according 2381 /// to ISO/IEC JTC1 SC22 WG14 N1169. This type can also be saturated. 2382 bool isUnsignedFixedPointType() const; 2383 2384 /// Return true if this is not a variable sized type, 2385 /// according to the rules of C99 6.7.5p3. It is not legal to call this on 2386 /// incomplete types. 2387 bool isConstantSizeType() const; 2388 2389 /// Returns true if this type can be represented by some 2390 /// set of type specifiers. 2391 bool isSpecifierType() const; 2392 2393 /// Determine the linkage of this type. 2394 Linkage getLinkage() const; 2395 2396 /// Determine the visibility of this type. 2397 Visibility getVisibility() const { 2398 return getLinkageAndVisibility().getVisibility(); 2399 } 2400 2401 /// Return true if the visibility was explicitly set is the code. 2402 bool isVisibilityExplicit() const { 2403 return getLinkageAndVisibility().isVisibilityExplicit(); 2404 } 2405 2406 /// Determine the linkage and visibility of this type. 2407 LinkageInfo getLinkageAndVisibility() const; 2408 2409 /// True if the computed linkage is valid. Used for consistency 2410 /// checking. Should always return true. 2411 bool isLinkageValid() const; 2412 2413 /// Determine the nullability of the given type. 2414 /// 2415 /// Note that nullability is only captured as sugar within the type 2416 /// system, not as part of the canonical type, so nullability will 2417 /// be lost by canonicalization and desugaring. 2418 Optional<NullabilityKind> getNullability(const ASTContext &context) const; 2419 2420 /// Determine whether the given type can have a nullability 2421 /// specifier applied to it, i.e., if it is any kind of pointer type. 2422 /// 2423 /// \param ResultIfUnknown The value to return if we don't yet know whether 2424 /// this type can have nullability because it is dependent. 2425 bool canHaveNullability(bool ResultIfUnknown = true) const; 2426 2427 /// Retrieve the set of substitutions required when accessing a member 2428 /// of the Objective-C receiver type that is declared in the given context. 2429 /// 2430 /// \c *this is the type of the object we're operating on, e.g., the 2431 /// receiver for a message send or the base of a property access, and is 2432 /// expected to be of some object or object pointer type. 2433 /// 2434 /// \param dc The declaration context for which we are building up a 2435 /// substitution mapping, which should be an Objective-C class, extension, 2436 /// category, or method within. 2437 /// 2438 /// \returns an array of type arguments that can be substituted for 2439 /// the type parameters of the given declaration context in any type described 2440 /// within that context, or an empty optional to indicate that no 2441 /// substitution is required. 2442 Optional<ArrayRef<QualType>> 2443 getObjCSubstitutions(const DeclContext *dc) const; 2444 2445 /// Determines if this is an ObjC interface type that may accept type 2446 /// parameters. 2447 bool acceptsObjCTypeParams() const; 2448 2449 const char *getTypeClassName() const; 2450 2451 QualType getCanonicalTypeInternal() const { 2452 return CanonicalType; 2453 } 2454 2455 CanQualType getCanonicalTypeUnqualified() const; // in CanonicalType.h 2456 void dump() const; 2457 void dump(llvm::raw_ostream &OS, const ASTContext &Context) const; 2458 }; 2459 2460 /// This will check for a TypedefType by removing any existing sugar 2461 /// until it reaches a TypedefType or a non-sugared type. 2462 template <> const TypedefType *Type::getAs() const; 2463 2464 /// This will check for a TemplateSpecializationType by removing any 2465 /// existing sugar until it reaches a TemplateSpecializationType or a 2466 /// non-sugared type. 2467 template <> const TemplateSpecializationType *Type::getAs() const; 2468 2469 /// This will check for an AttributedType by removing any existing sugar 2470 /// until it reaches an AttributedType or a non-sugared type. 2471 template <> const AttributedType *Type::getAs() const; 2472 2473 // We can do canonical leaf types faster, because we don't have to 2474 // worry about preserving child type decoration. 2475 #define TYPE(Class, Base) 2476 #define LEAF_TYPE(Class) \ 2477 template <> inline const Class##Type *Type::getAs() const { \ 2478 return dyn_cast<Class##Type>(CanonicalType); \ 2479 } \ 2480 template <> inline const Class##Type *Type::castAs() const { \ 2481 return cast<Class##Type>(CanonicalType); \ 2482 } 2483 #include "clang/AST/TypeNodes.inc" 2484 2485 /// This class is used for builtin types like 'int'. Builtin 2486 /// types are always canonical and have a literal name field. 2487 class BuiltinType : public Type { 2488 public: 2489 enum Kind { 2490 // OpenCL image types 2491 #define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) Id, 2492 #include "clang/Basic/OpenCLImageTypes.def" 2493 // OpenCL extension types 2494 #define EXT_OPAQUE_TYPE(ExtType, Id, Ext) Id, 2495 #include "clang/Basic/OpenCLExtensionTypes.def" 2496 // SVE Types 2497 #define SVE_TYPE(Name, Id, SingletonId) Id, 2498 #include "clang/Basic/AArch64SVEACLETypes.def" 2499 // PPC MMA Types 2500 #define PPC_VECTOR_TYPE(Name, Id, Size) Id, 2501 #include "clang/Basic/PPCTypes.def" 2502 // RVV Types 2503 #define RVV_TYPE(Name, Id, SingletonId) Id, 2504 #include "clang/Basic/RISCVVTypes.def" 2505 // All other builtin types 2506 #define BUILTIN_TYPE(Id, SingletonId) Id, 2507 #define LAST_BUILTIN_TYPE(Id) LastKind = Id 2508 #include "clang/AST/BuiltinTypes.def" 2509 }; 2510 2511 private: 2512 friend class ASTContext; // ASTContext creates these. 2513 2514 BuiltinType(Kind K) 2515 : Type(Builtin, QualType(), 2516 K == Dependent ? TypeDependence::DependentInstantiation 2517 : TypeDependence::None) { 2518 BuiltinTypeBits.Kind = K; 2519 } 2520 2521 public: 2522 Kind getKind() const { return static_cast<Kind>(BuiltinTypeBits.Kind); } 2523 StringRef getName(const PrintingPolicy &Policy) const; 2524 2525 const char *getNameAsCString(const PrintingPolicy &Policy) const { 2526 // The StringRef is null-terminated. 2527 StringRef str = getName(Policy); 2528 assert(!str.empty() && str.data()[str.size()] == '\0'); 2529 return str.data(); 2530 } 2531 2532 bool isSugared() const { return false; } 2533 QualType desugar() const { return QualType(this, 0); } 2534 2535 bool isInteger() const { 2536 return getKind() >= Bool && getKind() <= Int128; 2537 } 2538 2539 bool isSignedInteger() const { 2540 return getKind() >= Char_S && getKind() <= Int128; 2541 } 2542 2543 bool isUnsignedInteger() const { 2544 return getKind() >= Bool && getKind() <= UInt128; 2545 } 2546 2547 bool isFloatingPoint() const { 2548 return getKind() >= Half && getKind() <= Float128; 2549 } 2550 2551 /// Determines whether the given kind corresponds to a placeholder type. 2552 static bool isPlaceholderTypeKind(Kind K) { 2553 return K >= Overload; 2554 } 2555 2556 /// Determines whether this type is a placeholder type, i.e. a type 2557 /// which cannot appear in arbitrary positions in a fully-formed 2558 /// expression. 2559 bool isPlaceholderType() const { 2560 return isPlaceholderTypeKind(getKind()); 2561 } 2562 2563 /// Determines whether this type is a placeholder type other than 2564 /// Overload. Most placeholder types require only syntactic 2565 /// information about their context in order to be resolved (e.g. 2566 /// whether it is a call expression), which means they can (and 2567 /// should) be resolved in an earlier "phase" of analysis. 2568 /// Overload expressions sometimes pick up further information 2569 /// from their context, like whether the context expects a 2570 /// specific function-pointer type, and so frequently need 2571 /// special treatment. 2572 bool isNonOverloadPlaceholderType() const { 2573 return getKind() > Overload; 2574 } 2575 2576 static bool classof(const Type *T) { return T->getTypeClass() == Builtin; } 2577 }; 2578 2579 /// Complex values, per C99 6.2.5p11. This supports the C99 complex 2580 /// types (_Complex float etc) as well as the GCC integer complex extensions. 2581 class ComplexType : public Type, public llvm::FoldingSetNode { 2582 friend class ASTContext; // ASTContext creates these. 2583 2584 QualType ElementType; 2585 2586 ComplexType(QualType Element, QualType CanonicalPtr) 2587 : Type(Complex, CanonicalPtr, Element->getDependence()), 2588 ElementType(Element) {} 2589 2590 public: 2591 QualType getElementType() const { return ElementType; } 2592 2593 bool isSugared() const { return false; } 2594 QualType desugar() const { return QualType(this, 0); } 2595 2596 void Profile(llvm::FoldingSetNodeID &ID) { 2597 Profile(ID, getElementType()); 2598 } 2599 2600 static void Profile(llvm::FoldingSetNodeID &ID, QualType Element) { 2601 ID.AddPointer(Element.getAsOpaquePtr()); 2602 } 2603 2604 static bool classof(const Type *T) { return T->getTypeClass() == Complex; } 2605 }; 2606 2607 /// Sugar for parentheses used when specifying types. 2608 class ParenType : public Type, public llvm::FoldingSetNode { 2609 friend class ASTContext; // ASTContext creates these. 2610 2611 QualType Inner; 2612 2613 ParenType(QualType InnerType, QualType CanonType) 2614 : Type(Paren, CanonType, InnerType->getDependence()), Inner(InnerType) {} 2615 2616 public: 2617 QualType getInnerType() const { return Inner; } 2618 2619 bool isSugared() const { return true; } 2620 QualType desugar() const { return getInnerType(); } 2621 2622 void Profile(llvm::FoldingSetNodeID &ID) { 2623 Profile(ID, getInnerType()); 2624 } 2625 2626 static void Profile(llvm::FoldingSetNodeID &ID, QualType Inner) { 2627 Inner.Profile(ID); 2628 } 2629 2630 static bool classof(const Type *T) { return T->getTypeClass() == Paren; } 2631 }; 2632 2633 /// PointerType - C99 6.7.5.1 - Pointer Declarators. 2634 class PointerType : public Type, public llvm::FoldingSetNode { 2635 friend class ASTContext; // ASTContext creates these. 2636 2637 QualType PointeeType; 2638 2639 PointerType(QualType Pointee, QualType CanonicalPtr) 2640 : Type(Pointer, CanonicalPtr, Pointee->getDependence()), 2641 PointeeType(Pointee) {} 2642 2643 public: 2644 QualType getPointeeType() const { return PointeeType; } 2645 2646 bool isSugared() const { return false; } 2647 QualType desugar() const { return QualType(this, 0); } 2648 2649 void Profile(llvm::FoldingSetNodeID &ID) { 2650 Profile(ID, getPointeeType()); 2651 } 2652 2653 static void Profile(llvm::FoldingSetNodeID &ID, QualType Pointee) { 2654 ID.AddPointer(Pointee.getAsOpaquePtr()); 2655 } 2656 2657 static bool classof(const Type *T) { return T->getTypeClass() == Pointer; } 2658 }; 2659 2660 /// Represents a type which was implicitly adjusted by the semantic 2661 /// engine for arbitrary reasons. For example, array and function types can 2662 /// decay, and function types can have their calling conventions adjusted. 2663 class AdjustedType : public Type, public llvm::FoldingSetNode { 2664 QualType OriginalTy; 2665 QualType AdjustedTy; 2666 2667 protected: 2668 friend class ASTContext; // ASTContext creates these. 2669 2670 AdjustedType(TypeClass TC, QualType OriginalTy, QualType AdjustedTy, 2671 QualType CanonicalPtr) 2672 : Type(TC, CanonicalPtr, OriginalTy->getDependence()), 2673 OriginalTy(OriginalTy), AdjustedTy(AdjustedTy) {} 2674 2675 public: 2676 QualType getOriginalType() const { return OriginalTy; } 2677 QualType getAdjustedType() const { return AdjustedTy; } 2678 2679 bool isSugared() const { return true; } 2680 QualType desugar() const { return AdjustedTy; } 2681 2682 void Profile(llvm::FoldingSetNodeID &ID) { 2683 Profile(ID, OriginalTy, AdjustedTy); 2684 } 2685 2686 static void Profile(llvm::FoldingSetNodeID &ID, QualType Orig, QualType New) { 2687 ID.AddPointer(Orig.getAsOpaquePtr()); 2688 ID.AddPointer(New.getAsOpaquePtr()); 2689 } 2690 2691 static bool classof(const Type *T) { 2692 return T->getTypeClass() == Adjusted || T->getTypeClass() == Decayed; 2693 } 2694 }; 2695 2696 /// Represents a pointer type decayed from an array or function type. 2697 class DecayedType : public AdjustedType { 2698 friend class ASTContext; // ASTContext creates these. 2699 2700 inline 2701 DecayedType(QualType OriginalType, QualType Decayed, QualType Canonical); 2702 2703 public: 2704 QualType getDecayedType() const { return getAdjustedType(); } 2705 2706 inline QualType getPointeeType() const; 2707 2708 static bool classof(const Type *T) { return T->getTypeClass() == Decayed; } 2709 }; 2710 2711 /// Pointer to a block type. 2712 /// This type is to represent types syntactically represented as 2713 /// "void (^)(int)", etc. Pointee is required to always be a function type. 2714 class BlockPointerType : public Type, public llvm::FoldingSetNode { 2715 friend class ASTContext; // ASTContext creates these. 2716 2717 // Block is some kind of pointer type 2718 QualType PointeeType; 2719 2720 BlockPointerType(QualType Pointee, QualType CanonicalCls) 2721 : Type(BlockPointer, CanonicalCls, Pointee->getDependence()), 2722 PointeeType(Pointee) {} 2723 2724 public: 2725 // Get the pointee type. Pointee is required to always be a function type. 2726 QualType getPointeeType() const { return PointeeType; } 2727 2728 bool isSugared() const { return false; } 2729 QualType desugar() const { return QualType(this, 0); } 2730 2731 void Profile(llvm::FoldingSetNodeID &ID) { 2732 Profile(ID, getPointeeType()); 2733 } 2734 2735 static void Profile(llvm::FoldingSetNodeID &ID, QualType Pointee) { 2736 ID.AddPointer(Pointee.getAsOpaquePtr()); 2737 } 2738 2739 static bool classof(const Type *T) { 2740 return T->getTypeClass() == BlockPointer; 2741 } 2742 }; 2743 2744 /// Base for LValueReferenceType and RValueReferenceType 2745 class ReferenceType : public Type, public llvm::FoldingSetNode { 2746 QualType PointeeType; 2747 2748 protected: 2749 ReferenceType(TypeClass tc, QualType Referencee, QualType CanonicalRef, 2750 bool SpelledAsLValue) 2751 : Type(tc, CanonicalRef, Referencee->getDependence()), 2752 PointeeType(Referencee) { 2753 ReferenceTypeBits.SpelledAsLValue = SpelledAsLValue; 2754 ReferenceTypeBits.InnerRef = Referencee->isReferenceType(); 2755 } 2756 2757 public: 2758 bool isSpelledAsLValue() const { return ReferenceTypeBits.SpelledAsLValue; } 2759 bool isInnerRef() const { return ReferenceTypeBits.InnerRef; } 2760 2761 QualType getPointeeTypeAsWritten() const { return PointeeType; } 2762 2763 QualType getPointeeType() const { 2764 // FIXME: this might strip inner qualifiers; okay? 2765 const ReferenceType *T = this; 2766 while (T->isInnerRef()) 2767 T = T->PointeeType->castAs<ReferenceType>(); 2768 return T->PointeeType; 2769 } 2770 2771 void Profile(llvm::FoldingSetNodeID &ID) { 2772 Profile(ID, PointeeType, isSpelledAsLValue()); 2773 } 2774 2775 static void Profile(llvm::FoldingSetNodeID &ID, 2776 QualType Referencee, 2777 bool SpelledAsLValue) { 2778 ID.AddPointer(Referencee.getAsOpaquePtr()); 2779 ID.AddBoolean(SpelledAsLValue); 2780 } 2781 2782 static bool classof(const Type *T) { 2783 return T->getTypeClass() == LValueReference || 2784 T->getTypeClass() == RValueReference; 2785 } 2786 }; 2787 2788 /// An lvalue reference type, per C++11 [dcl.ref]. 2789 class LValueReferenceType : public ReferenceType { 2790 friend class ASTContext; // ASTContext creates these 2791 2792 LValueReferenceType(QualType Referencee, QualType CanonicalRef, 2793 bool SpelledAsLValue) 2794 : ReferenceType(LValueReference, Referencee, CanonicalRef, 2795 SpelledAsLValue) {} 2796 2797 public: 2798 bool isSugared() const { return false; } 2799 QualType desugar() const { return QualType(this, 0); } 2800 2801 static bool classof(const Type *T) { 2802 return T->getTypeClass() == LValueReference; 2803 } 2804 }; 2805 2806 /// An rvalue reference type, per C++11 [dcl.ref]. 2807 class RValueReferenceType : public ReferenceType { 2808 friend class ASTContext; // ASTContext creates these 2809 2810 RValueReferenceType(QualType Referencee, QualType CanonicalRef) 2811 : ReferenceType(RValueReference, Referencee, CanonicalRef, false) {} 2812 2813 public: 2814 bool isSugared() const { return false; } 2815 QualType desugar() const { return QualType(this, 0); } 2816 2817 static bool classof(const Type *T) { 2818 return T->getTypeClass() == RValueReference; 2819 } 2820 }; 2821 2822 /// A pointer to member type per C++ 8.3.3 - Pointers to members. 2823 /// 2824 /// This includes both pointers to data members and pointer to member functions. 2825 class MemberPointerType : public Type, public llvm::FoldingSetNode { 2826 friend class ASTContext; // ASTContext creates these. 2827 2828 QualType PointeeType; 2829 2830 /// The class of which the pointee is a member. Must ultimately be a 2831 /// RecordType, but could be a typedef or a template parameter too. 2832 const Type *Class; 2833 2834 MemberPointerType(QualType Pointee, const Type *Cls, QualType CanonicalPtr) 2835 : Type(MemberPointer, CanonicalPtr, 2836 (Cls->getDependence() & ~TypeDependence::VariablyModified) | 2837 Pointee->getDependence()), 2838 PointeeType(Pointee), Class(Cls) {} 2839 2840 public: 2841 QualType getPointeeType() const { return PointeeType; } 2842 2843 /// Returns true if the member type (i.e. the pointee type) is a 2844 /// function type rather than a data-member type. 2845 bool isMemberFunctionPointer() const { 2846 return PointeeType->isFunctionProtoType(); 2847 } 2848 2849 /// Returns true if the member type (i.e. the pointee type) is a 2850 /// data type rather than a function type. 2851 bool isMemberDataPointer() const { 2852 return !PointeeType->isFunctionProtoType(); 2853 } 2854 2855 const Type *getClass() const { return Class; } 2856 CXXRecordDecl *getMostRecentCXXRecordDecl() const; 2857 2858 bool isSugared() const { return false; } 2859 QualType desugar() const { return QualType(this, 0); } 2860 2861 void Profile(llvm::FoldingSetNodeID &ID) { 2862 Profile(ID, getPointeeType(), getClass()); 2863 } 2864 2865 static void Profile(llvm::FoldingSetNodeID &ID, QualType Pointee, 2866 const Type *Class) { 2867 ID.AddPointer(Pointee.getAsOpaquePtr()); 2868 ID.AddPointer(Class); 2869 } 2870 2871 static bool classof(const Type *T) { 2872 return T->getTypeClass() == MemberPointer; 2873 } 2874 }; 2875 2876 /// Represents an array type, per C99 6.7.5.2 - Array Declarators. 2877 class ArrayType : public Type, public llvm::FoldingSetNode { 2878 public: 2879 /// Capture whether this is a normal array (e.g. int X[4]) 2880 /// an array with a static size (e.g. int X[static 4]), or an array 2881 /// with a star size (e.g. int X[*]). 2882 /// 'static' is only allowed on function parameters. 2883 enum ArraySizeModifier { 2884 Normal, Static, Star 2885 }; 2886 2887 private: 2888 /// The element type of the array. 2889 QualType ElementType; 2890 2891 protected: 2892 friend class ASTContext; // ASTContext creates these. 2893 2894 ArrayType(TypeClass tc, QualType et, QualType can, ArraySizeModifier sm, 2895 unsigned tq, const Expr *sz = nullptr); 2896 2897 public: 2898 QualType getElementType() const { return ElementType; } 2899 2900 ArraySizeModifier getSizeModifier() const { 2901 return ArraySizeModifier(ArrayTypeBits.SizeModifier); 2902 } 2903 2904 Qualifiers getIndexTypeQualifiers() const { 2905 return Qualifiers::fromCVRMask(getIndexTypeCVRQualifiers()); 2906 } 2907 2908 unsigned getIndexTypeCVRQualifiers() const { 2909 return ArrayTypeBits.IndexTypeQuals; 2910 } 2911 2912 static bool classof(const Type *T) { 2913 return T->getTypeClass() == ConstantArray || 2914 T->getTypeClass() == VariableArray || 2915 T->getTypeClass() == IncompleteArray || 2916 T->getTypeClass() == DependentSizedArray; 2917 } 2918 }; 2919 2920 /// Represents the canonical version of C arrays with a specified constant size. 2921 /// For example, the canonical type for 'int A[4 + 4*100]' is a 2922 /// ConstantArrayType where the element type is 'int' and the size is 404. 2923 class ConstantArrayType final 2924 : public ArrayType, 2925 private llvm::TrailingObjects<ConstantArrayType, const Expr *> { 2926 friend class ASTContext; // ASTContext creates these. 2927 friend TrailingObjects; 2928 2929 llvm::APInt Size; // Allows us to unique the type. 2930 2931 ConstantArrayType(QualType et, QualType can, const llvm::APInt &size, 2932 const Expr *sz, ArraySizeModifier sm, unsigned tq) 2933 : ArrayType(ConstantArray, et, can, sm, tq, sz), Size(size) { 2934 ConstantArrayTypeBits.HasStoredSizeExpr = sz != nullptr; 2935 if (ConstantArrayTypeBits.HasStoredSizeExpr) { 2936 assert(!can.isNull() && "canonical constant array should not have size"); 2937 *getTrailingObjects<const Expr*>() = sz; 2938 } 2939 } 2940 2941 unsigned numTrailingObjects(OverloadToken<const Expr*>) const { 2942 return ConstantArrayTypeBits.HasStoredSizeExpr; 2943 } 2944 2945 public: 2946 const llvm::APInt &getSize() const { return Size; } 2947 const Expr *getSizeExpr() const { 2948 return ConstantArrayTypeBits.HasStoredSizeExpr 2949 ? *getTrailingObjects<const Expr *>() 2950 : nullptr; 2951 } 2952 bool isSugared() const { return false; } 2953 QualType desugar() const { return QualType(this, 0); } 2954 2955 /// Determine the number of bits required to address a member of 2956 // an array with the given element type and number of elements. 2957 static unsigned getNumAddressingBits(const ASTContext &Context, 2958 QualType ElementType, 2959 const llvm::APInt &NumElements); 2960 2961 /// Determine the maximum number of active bits that an array's size 2962 /// can require, which limits the maximum size of the array. 2963 static unsigned getMaxSizeBits(const ASTContext &Context); 2964 2965 void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Ctx) { 2966 Profile(ID, Ctx, getElementType(), getSize(), getSizeExpr(), 2967 getSizeModifier(), getIndexTypeCVRQualifiers()); 2968 } 2969 2970 static void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Ctx, 2971 QualType ET, const llvm::APInt &ArraySize, 2972 const Expr *SizeExpr, ArraySizeModifier SizeMod, 2973 unsigned TypeQuals); 2974 2975 static bool classof(const Type *T) { 2976 return T->getTypeClass() == ConstantArray; 2977 } 2978 }; 2979 2980 /// Represents a C array with an unspecified size. For example 'int A[]' has 2981 /// an IncompleteArrayType where the element type is 'int' and the size is 2982 /// unspecified. 2983 class IncompleteArrayType : public ArrayType { 2984 friend class ASTContext; // ASTContext creates these. 2985 2986 IncompleteArrayType(QualType et, QualType can, 2987 ArraySizeModifier sm, unsigned tq) 2988 : ArrayType(IncompleteArray, et, can, sm, tq) {} 2989 2990 public: 2991 friend class StmtIteratorBase; 2992 2993 bool isSugared() const { return false; } 2994 QualType desugar() const { return QualType(this, 0); } 2995 2996 static bool classof(const Type *T) { 2997 return T->getTypeClass() == IncompleteArray; 2998 } 2999 3000 void Profile(llvm::FoldingSetNodeID &ID) { 3001 Profile(ID, getElementType(), getSizeModifier(), 3002 getIndexTypeCVRQualifiers()); 3003 } 3004 3005 static void Profile(llvm::FoldingSetNodeID &ID, QualType ET, 3006 ArraySizeModifier SizeMod, unsigned TypeQuals) { 3007 ID.AddPointer(ET.getAsOpaquePtr()); 3008 ID.AddInteger(SizeMod); 3009 ID.AddInteger(TypeQuals); 3010 } 3011 }; 3012 3013 /// Represents a C array with a specified size that is not an 3014 /// integer-constant-expression. For example, 'int s[x+foo()]'. 3015 /// Since the size expression is an arbitrary expression, we store it as such. 3016 /// 3017 /// Note: VariableArrayType's aren't uniqued (since the expressions aren't) and 3018 /// should not be: two lexically equivalent variable array types could mean 3019 /// different things, for example, these variables do not have the same type 3020 /// dynamically: 3021 /// 3022 /// void foo(int x) { 3023 /// int Y[x]; 3024 /// ++x; 3025 /// int Z[x]; 3026 /// } 3027 class VariableArrayType : public ArrayType { 3028 friend class ASTContext; // ASTContext creates these. 3029 3030 /// An assignment-expression. VLA's are only permitted within 3031 /// a function block. 3032 Stmt *SizeExpr; 3033 3034 /// The range spanned by the left and right array brackets. 3035 SourceRange Brackets; 3036 3037 VariableArrayType(QualType et, QualType can, Expr *e, 3038 ArraySizeModifier sm, unsigned tq, 3039 SourceRange brackets) 3040 : ArrayType(VariableArray, et, can, sm, tq, e), 3041 SizeExpr((Stmt*) e), Brackets(brackets) {} 3042 3043 public: 3044 friend class StmtIteratorBase; 3045 3046 Expr *getSizeExpr() const { 3047 // We use C-style casts instead of cast<> here because we do not wish 3048 // to have a dependency of Type.h on Stmt.h/Expr.h. 3049 return (Expr*) SizeExpr; 3050 } 3051 3052 SourceRange getBracketsRange() const { return Brackets; } 3053 SourceLocation getLBracketLoc() const { return Brackets.getBegin(); } 3054 SourceLocation getRBracketLoc() const { return Brackets.getEnd(); } 3055 3056 bool isSugared() const { return false; } 3057 QualType desugar() const { return QualType(this, 0); } 3058 3059 static bool classof(const Type *T) { 3060 return T->getTypeClass() == VariableArray; 3061 } 3062 3063 void Profile(llvm::FoldingSetNodeID &ID) { 3064 llvm_unreachable("Cannot unique VariableArrayTypes."); 3065 } 3066 }; 3067 3068 /// Represents an array type in C++ whose size is a value-dependent expression. 3069 /// 3070 /// For example: 3071 /// \code 3072 /// template<typename T, int Size> 3073 /// class array { 3074 /// T data[Size]; 3075 /// }; 3076 /// \endcode 3077 /// 3078 /// For these types, we won't actually know what the array bound is 3079 /// until template instantiation occurs, at which point this will 3080 /// become either a ConstantArrayType or a VariableArrayType. 3081 class DependentSizedArrayType : public ArrayType { 3082 friend class ASTContext; // ASTContext creates these. 3083 3084 const ASTContext &Context; 3085 3086 /// An assignment expression that will instantiate to the 3087 /// size of the array. 3088 /// 3089 /// The expression itself might be null, in which case the array 3090 /// type will have its size deduced from an initializer. 3091 Stmt *SizeExpr; 3092 3093 /// The range spanned by the left and right array brackets. 3094 SourceRange Brackets; 3095 3096 DependentSizedArrayType(const ASTContext &Context, QualType et, QualType can, 3097 Expr *e, ArraySizeModifier sm, unsigned tq, 3098 SourceRange brackets); 3099 3100 public: 3101 friend class StmtIteratorBase; 3102 3103 Expr *getSizeExpr() const { 3104 // We use C-style casts instead of cast<> here because we do not wish 3105 // to have a dependency of Type.h on Stmt.h/Expr.h. 3106 return (Expr*) SizeExpr; 3107 } 3108 3109 SourceRange getBracketsRange() const { return Brackets; } 3110 SourceLocation getLBracketLoc() const { return Brackets.getBegin(); } 3111 SourceLocation getRBracketLoc() const { return Brackets.getEnd(); } 3112 3113 bool isSugared() const { return false; } 3114 QualType desugar() const { return QualType(this, 0); } 3115 3116 static bool classof(const Type *T) { 3117 return T->getTypeClass() == DependentSizedArray; 3118 } 3119 3120 void Profile(llvm::FoldingSetNodeID &ID) { 3121 Profile(ID, Context, getElementType(), 3122 getSizeModifier(), getIndexTypeCVRQualifiers(), getSizeExpr()); 3123 } 3124 3125 static void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context, 3126 QualType ET, ArraySizeModifier SizeMod, 3127 unsigned TypeQuals, Expr *E); 3128 }; 3129 3130 /// Represents an extended address space qualifier where the input address space 3131 /// value is dependent. Non-dependent address spaces are not represented with a 3132 /// special Type subclass; they are stored on an ExtQuals node as part of a QualType. 3133 /// 3134 /// For example: 3135 /// \code 3136 /// template<typename T, int AddrSpace> 3137 /// class AddressSpace { 3138 /// typedef T __attribute__((address_space(AddrSpace))) type; 3139 /// } 3140 /// \endcode 3141 class DependentAddressSpaceType : public Type, public llvm::FoldingSetNode { 3142 friend class ASTContext; 3143 3144 const ASTContext &Context; 3145 Expr *AddrSpaceExpr; 3146 QualType PointeeType; 3147 SourceLocation loc; 3148 3149 DependentAddressSpaceType(const ASTContext &Context, QualType PointeeType, 3150 QualType can, Expr *AddrSpaceExpr, 3151 SourceLocation loc); 3152 3153 public: 3154 Expr *getAddrSpaceExpr() const { return AddrSpaceExpr; } 3155 QualType getPointeeType() const { return PointeeType; } 3156 SourceLocation getAttributeLoc() const { return loc; } 3157 3158 bool isSugared() const { return false; } 3159 QualType desugar() const { return QualType(this, 0); } 3160 3161 static bool classof(const Type *T) { 3162 return T->getTypeClass() == DependentAddressSpace; 3163 } 3164 3165 void Profile(llvm::FoldingSetNodeID &ID) { 3166 Profile(ID, Context, getPointeeType(), getAddrSpaceExpr()); 3167 } 3168 3169 static void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context, 3170 QualType PointeeType, Expr *AddrSpaceExpr); 3171 }; 3172 3173 /// Represents an extended vector type where either the type or size is 3174 /// dependent. 3175 /// 3176 /// For example: 3177 /// \code 3178 /// template<typename T, int Size> 3179 /// class vector { 3180 /// typedef T __attribute__((ext_vector_type(Size))) type; 3181 /// } 3182 /// \endcode 3183 class DependentSizedExtVectorType : public Type, public llvm::FoldingSetNode { 3184 friend class ASTContext; 3185 3186 const ASTContext &Context; 3187 Expr *SizeExpr; 3188 3189 /// The element type of the array. 3190 QualType ElementType; 3191 3192 SourceLocation loc; 3193 3194 DependentSizedExtVectorType(const ASTContext &Context, QualType ElementType, 3195 QualType can, Expr *SizeExpr, SourceLocation loc); 3196 3197 public: 3198 Expr *getSizeExpr() const { return SizeExpr; } 3199 QualType getElementType() const { return ElementType; } 3200 SourceLocation getAttributeLoc() const { return loc; } 3201 3202 bool isSugared() const { return false; } 3203 QualType desugar() const { return QualType(this, 0); } 3204 3205 static bool classof(const Type *T) { 3206 return T->getTypeClass() == DependentSizedExtVector; 3207 } 3208 3209 void Profile(llvm::FoldingSetNodeID &ID) { 3210 Profile(ID, Context, getElementType(), getSizeExpr()); 3211 } 3212 3213 static void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context, 3214 QualType ElementType, Expr *SizeExpr); 3215 }; 3216 3217 3218 /// Represents a GCC generic vector type. This type is created using 3219 /// __attribute__((vector_size(n)), where "n" specifies the vector size in 3220 /// bytes; or from an Altivec __vector or vector declaration. 3221 /// Since the constructor takes the number of vector elements, the 3222 /// client is responsible for converting the size into the number of elements. 3223 class VectorType : public Type, public llvm::FoldingSetNode { 3224 public: 3225 enum VectorKind { 3226 /// not a target-specific vector type 3227 GenericVector, 3228 3229 /// is AltiVec vector 3230 AltiVecVector, 3231 3232 /// is AltiVec 'vector Pixel' 3233 AltiVecPixel, 3234 3235 /// is AltiVec 'vector bool ...' 3236 AltiVecBool, 3237 3238 /// is ARM Neon vector 3239 NeonVector, 3240 3241 /// is ARM Neon polynomial vector 3242 NeonPolyVector, 3243 3244 /// is AArch64 SVE fixed-length data vector 3245 SveFixedLengthDataVector, 3246 3247 /// is AArch64 SVE fixed-length predicate vector 3248 SveFixedLengthPredicateVector 3249 }; 3250 3251 protected: 3252 friend class ASTContext; // ASTContext creates these. 3253 3254 /// The element type of the vector. 3255 QualType ElementType; 3256 3257 VectorType(QualType vecType, unsigned nElements, QualType canonType, 3258 VectorKind vecKind); 3259 3260 VectorType(TypeClass tc, QualType vecType, unsigned nElements, 3261 QualType canonType, VectorKind vecKind); 3262 3263 public: 3264 QualType getElementType() const { return ElementType; } 3265 unsigned getNumElements() const { return VectorTypeBits.NumElements; } 3266 3267 bool isSugared() const { return false; } 3268 QualType desugar() const { return QualType(this, 0); } 3269 3270 VectorKind getVectorKind() const { 3271 return VectorKind(VectorTypeBits.VecKind); 3272 } 3273 3274 void Profile(llvm::FoldingSetNodeID &ID) { 3275 Profile(ID, getElementType(), getNumElements(), 3276 getTypeClass(), getVectorKind()); 3277 } 3278 3279 static void Profile(llvm::FoldingSetNodeID &ID, QualType ElementType, 3280 unsigned NumElements, TypeClass TypeClass, 3281 VectorKind VecKind) { 3282 ID.AddPointer(ElementType.getAsOpaquePtr()); 3283 ID.AddInteger(NumElements); 3284 ID.AddInteger(TypeClass); 3285 ID.AddInteger(VecKind); 3286 } 3287 3288 static bool classof(const Type *T) { 3289 return T->getTypeClass() == Vector || T->getTypeClass() == ExtVector; 3290 } 3291 }; 3292 3293 /// Represents a vector type where either the type or size is dependent. 3294 //// 3295 /// For example: 3296 /// \code 3297 /// template<typename T, int Size> 3298 /// class vector { 3299 /// typedef T __attribute__((vector_size(Size))) type; 3300 /// } 3301 /// \endcode 3302 class DependentVectorType : public Type, public llvm::FoldingSetNode { 3303 friend class ASTContext; 3304 3305 const ASTContext &Context; 3306 QualType ElementType; 3307 Expr *SizeExpr; 3308 SourceLocation Loc; 3309 3310 DependentVectorType(const ASTContext &Context, QualType ElementType, 3311 QualType CanonType, Expr *SizeExpr, 3312 SourceLocation Loc, VectorType::VectorKind vecKind); 3313 3314 public: 3315 Expr *getSizeExpr() const { return SizeExpr; } 3316 QualType getElementType() const { return ElementType; } 3317 SourceLocation getAttributeLoc() const { return Loc; } 3318 VectorType::VectorKind getVectorKind() const { 3319 return VectorType::VectorKind(VectorTypeBits.VecKind); 3320 } 3321 3322 bool isSugared() const { return false; } 3323 QualType desugar() const { return QualType(this, 0); } 3324 3325 static bool classof(const Type *T) { 3326 return T->getTypeClass() == DependentVector; 3327 } 3328 3329 void Profile(llvm::FoldingSetNodeID &ID) { 3330 Profile(ID, Context, getElementType(), getSizeExpr(), getVectorKind()); 3331 } 3332 3333 static void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context, 3334 QualType ElementType, const Expr *SizeExpr, 3335 VectorType::VectorKind VecKind); 3336 }; 3337 3338 /// ExtVectorType - Extended vector type. This type is created using 3339 /// __attribute__((ext_vector_type(n)), where "n" is the number of elements. 3340 /// Unlike vector_size, ext_vector_type is only allowed on typedef's. This 3341 /// class enables syntactic extensions, like Vector Components for accessing 3342 /// points (as .xyzw), colors (as .rgba), and textures (modeled after OpenGL 3343 /// Shading Language). 3344 class ExtVectorType : public VectorType { 3345 friend class ASTContext; // ASTContext creates these. 3346 3347 ExtVectorType(QualType vecType, unsigned nElements, QualType canonType) 3348 : VectorType(ExtVector, vecType, nElements, canonType, GenericVector) {} 3349 3350 public: 3351 static int getPointAccessorIdx(char c) { 3352 switch (c) { 3353 default: return -1; 3354 case 'x': case 'r': return 0; 3355 case 'y': case 'g': return 1; 3356 case 'z': case 'b': return 2; 3357 case 'w': case 'a': return 3; 3358 } 3359 } 3360 3361 static int getNumericAccessorIdx(char c) { 3362 switch (c) { 3363 default: return -1; 3364 case '0': return 0; 3365 case '1': return 1; 3366 case '2': return 2; 3367 case '3': return 3; 3368 case '4': return 4; 3369 case '5': return 5; 3370 case '6': return 6; 3371 case '7': return 7; 3372 case '8': return 8; 3373 case '9': return 9; 3374 case 'A': 3375 case 'a': return 10; 3376 case 'B': 3377 case 'b': return 11; 3378 case 'C': 3379 case 'c': return 12; 3380 case 'D': 3381 case 'd': return 13; 3382 case 'E': 3383 case 'e': return 14; 3384 case 'F': 3385 case 'f': return 15; 3386 } 3387 } 3388 3389 static int getAccessorIdx(char c, bool isNumericAccessor) { 3390 if (isNumericAccessor) 3391 return getNumericAccessorIdx(c); 3392 else 3393 return getPointAccessorIdx(c); 3394 } 3395 3396 bool isAccessorWithinNumElements(char c, bool isNumericAccessor) const { 3397 if (int idx = getAccessorIdx(c, isNumericAccessor)+1) 3398 return unsigned(idx-1) < getNumElements(); 3399 return false; 3400 } 3401 3402 bool isSugared() const { return false; } 3403 QualType desugar() const { return QualType(this, 0); } 3404 3405 static bool classof(const Type *T) { 3406 return T->getTypeClass() == ExtVector; 3407 } 3408 }; 3409 3410 /// Represents a matrix type, as defined in the Matrix Types clang extensions. 3411 /// __attribute__((matrix_type(rows, columns))), where "rows" specifies 3412 /// number of rows and "columns" specifies the number of columns. 3413 class MatrixType : public Type, public llvm::FoldingSetNode { 3414 protected: 3415 friend class ASTContext; 3416 3417 /// The element type of the matrix. 3418 QualType ElementType; 3419 3420 MatrixType(QualType ElementTy, QualType CanonElementTy); 3421 3422 MatrixType(TypeClass TypeClass, QualType ElementTy, QualType CanonElementTy, 3423 const Expr *RowExpr = nullptr, const Expr *ColumnExpr = nullptr); 3424 3425 public: 3426 /// Returns type of the elements being stored in the matrix 3427 QualType getElementType() const { return ElementType; } 3428 3429 /// Valid elements types are the following: 3430 /// * an integer type (as in C2x 6.2.5p19), but excluding enumerated types 3431 /// and _Bool 3432 /// * the standard floating types float or double 3433 /// * a half-precision floating point type, if one is supported on the target 3434 static bool isValidElementType(QualType T) { 3435 return T->isDependentType() || 3436 (T->isRealType() && !T->isBooleanType() && !T->isEnumeralType()); 3437 } 3438 3439 bool isSugared() const { return false; } 3440 QualType desugar() const { return QualType(this, 0); } 3441 3442 static bool classof(const Type *T) { 3443 return T->getTypeClass() == ConstantMatrix || 3444 T->getTypeClass() == DependentSizedMatrix; 3445 } 3446 }; 3447 3448 /// Represents a concrete matrix type with constant number of rows and columns 3449 class ConstantMatrixType final : public MatrixType { 3450 protected: 3451 friend class ASTContext; 3452 3453 /// The element type of the matrix. 3454 // FIXME: Appears to be unused? There is also MatrixType::ElementType... 3455 QualType ElementType; 3456 3457 /// Number of rows and columns. 3458 unsigned NumRows; 3459 unsigned NumColumns; 3460 3461 static constexpr unsigned MaxElementsPerDimension = (1 << 20) - 1; 3462 3463 ConstantMatrixType(QualType MatrixElementType, unsigned NRows, 3464 unsigned NColumns, QualType CanonElementType); 3465 3466 ConstantMatrixType(TypeClass typeClass, QualType MatrixType, unsigned NRows, 3467 unsigned NColumns, QualType CanonElementType); 3468 3469 public: 3470 /// Returns the number of rows in the matrix. 3471 unsigned getNumRows() const { return NumRows; } 3472 3473 /// Returns the number of columns in the matrix. 3474 unsigned getNumColumns() const { return NumColumns; } 3475 3476 /// Returns the number of elements required to embed the matrix into a vector. 3477 unsigned getNumElementsFlattened() const { 3478 return getNumRows() * getNumColumns(); 3479 } 3480 3481 /// Returns true if \p NumElements is a valid matrix dimension. 3482 static constexpr bool isDimensionValid(size_t NumElements) { 3483 return NumElements > 0 && NumElements <= MaxElementsPerDimension; 3484 } 3485 3486 /// Returns the maximum number of elements per dimension. 3487 static constexpr unsigned getMaxElementsPerDimension() { 3488 return MaxElementsPerDimension; 3489 } 3490 3491 void Profile(llvm::FoldingSetNodeID &ID) { 3492 Profile(ID, getElementType(), getNumRows(), getNumColumns(), 3493 getTypeClass()); 3494 } 3495 3496 static void Profile(llvm::FoldingSetNodeID &ID, QualType ElementType, 3497 unsigned NumRows, unsigned NumColumns, 3498 TypeClass TypeClass) { 3499 ID.AddPointer(ElementType.getAsOpaquePtr()); 3500 ID.AddInteger(NumRows); 3501 ID.AddInteger(NumColumns); 3502 ID.AddInteger(TypeClass); 3503 } 3504 3505 static bool classof(const Type *T) { 3506 return T->getTypeClass() == ConstantMatrix; 3507 } 3508 }; 3509 3510 /// Represents a matrix type where the type and the number of rows and columns 3511 /// is dependent on a template. 3512 class DependentSizedMatrixType final : public MatrixType { 3513 friend class ASTContext; 3514 3515 const ASTContext &Context; 3516 Expr *RowExpr; 3517 Expr *ColumnExpr; 3518 3519 SourceLocation loc; 3520 3521 DependentSizedMatrixType(const ASTContext &Context, QualType ElementType, 3522 QualType CanonicalType, Expr *RowExpr, 3523 Expr *ColumnExpr, SourceLocation loc); 3524 3525 public: 3526 QualType getElementType() const { return ElementType; } 3527 Expr *getRowExpr() const { return RowExpr; } 3528 Expr *getColumnExpr() const { return ColumnExpr; } 3529 SourceLocation getAttributeLoc() const { return loc; } 3530 3531 bool isSugared() const { return false; } 3532 QualType desugar() const { return QualType(this, 0); } 3533 3534 static bool classof(const Type *T) { 3535 return T->getTypeClass() == DependentSizedMatrix; 3536 } 3537 3538 void Profile(llvm::FoldingSetNodeID &ID) { 3539 Profile(ID, Context, getElementType(), getRowExpr(), getColumnExpr()); 3540 } 3541 3542 static void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context, 3543 QualType ElementType, Expr *RowExpr, Expr *ColumnExpr); 3544 }; 3545 3546 /// FunctionType - C99 6.7.5.3 - Function Declarators. This is the common base 3547 /// class of FunctionNoProtoType and FunctionProtoType. 3548 class FunctionType : public Type { 3549 // The type returned by the function. 3550 QualType ResultType; 3551 3552 public: 3553 /// Interesting information about a specific parameter that can't simply 3554 /// be reflected in parameter's type. This is only used by FunctionProtoType 3555 /// but is in FunctionType to make this class available during the 3556 /// specification of the bases of FunctionProtoType. 3557 /// 3558 /// It makes sense to model language features this way when there's some 3559 /// sort of parameter-specific override (such as an attribute) that 3560 /// affects how the function is called. For example, the ARC ns_consumed 3561 /// attribute changes whether a parameter is passed at +0 (the default) 3562 /// or +1 (ns_consumed). This must be reflected in the function type, 3563 /// but isn't really a change to the parameter type. 3564 /// 3565 /// One serious disadvantage of modelling language features this way is 3566 /// that they generally do not work with language features that attempt 3567 /// to destructure types. For example, template argument deduction will 3568 /// not be able to match a parameter declared as 3569 /// T (*)(U) 3570 /// against an argument of type 3571 /// void (*)(__attribute__((ns_consumed)) id) 3572 /// because the substitution of T=void, U=id into the former will 3573 /// not produce the latter. 3574 class ExtParameterInfo { 3575 enum { 3576 ABIMask = 0x0F, 3577 IsConsumed = 0x10, 3578 HasPassObjSize = 0x20, 3579 IsNoEscape = 0x40, 3580 }; 3581 unsigned char Data = 0; 3582 3583 public: 3584 ExtParameterInfo() = default; 3585 3586 /// Return the ABI treatment of this parameter. 3587 ParameterABI getABI() const { return ParameterABI(Data & ABIMask); } 3588 ExtParameterInfo withABI(ParameterABI kind) const { 3589 ExtParameterInfo copy = *this; 3590 copy.Data = (copy.Data & ~ABIMask) | unsigned(kind); 3591 return copy; 3592 } 3593 3594 /// Is this parameter considered "consumed" by Objective-C ARC? 3595 /// Consumed parameters must have retainable object type. 3596 bool isConsumed() const { return (Data & IsConsumed); } 3597 ExtParameterInfo withIsConsumed(bool consumed) const { 3598 ExtParameterInfo copy = *this; 3599 if (consumed) 3600 copy.Data |= IsConsumed; 3601 else 3602 copy.Data &= ~IsConsumed; 3603 return copy; 3604 } 3605 3606 bool hasPassObjectSize() const { return Data & HasPassObjSize; } 3607 ExtParameterInfo withHasPassObjectSize() const { 3608 ExtParameterInfo Copy = *this; 3609 Copy.Data |= HasPassObjSize; 3610 return Copy; 3611 } 3612 3613 bool isNoEscape() const { return Data & IsNoEscape; } 3614 ExtParameterInfo withIsNoEscape(bool NoEscape) const { 3615 ExtParameterInfo Copy = *this; 3616 if (NoEscape) 3617 Copy.Data |= IsNoEscape; 3618 else 3619 Copy.Data &= ~IsNoEscape; 3620 return Copy; 3621 } 3622 3623 unsigned char getOpaqueValue() const { return Data; } 3624 static ExtParameterInfo getFromOpaqueValue(unsigned char data) { 3625 ExtParameterInfo result; 3626 result.Data = data; 3627 return result; 3628 } 3629 3630 friend bool operator==(ExtParameterInfo lhs, ExtParameterInfo rhs) { 3631 return lhs.Data == rhs.Data; 3632 } 3633 3634 friend bool operator!=(ExtParameterInfo lhs, ExtParameterInfo rhs) { 3635 return lhs.Data != rhs.Data; 3636 } 3637 }; 3638 3639 /// A class which abstracts out some details necessary for 3640 /// making a call. 3641 /// 3642 /// It is not actually used directly for storing this information in 3643 /// a FunctionType, although FunctionType does currently use the 3644 /// same bit-pattern. 3645 /// 3646 // If you add a field (say Foo), other than the obvious places (both, 3647 // constructors, compile failures), what you need to update is 3648 // * Operator== 3649 // * getFoo 3650 // * withFoo 3651 // * functionType. Add Foo, getFoo. 3652 // * ASTContext::getFooType 3653 // * ASTContext::mergeFunctionTypes 3654 // * FunctionNoProtoType::Profile 3655 // * FunctionProtoType::Profile 3656 // * TypePrinter::PrintFunctionProto 3657 // * AST read and write 3658 // * Codegen 3659 class ExtInfo { 3660 friend class FunctionType; 3661 3662 // Feel free to rearrange or add bits, but if you go over 16, you'll need to 3663 // adjust the Bits field below, and if you add bits, you'll need to adjust 3664 // Type::FunctionTypeBitfields::ExtInfo as well. 3665 3666 // | CC |noreturn|produces|nocallersavedregs|regparm|nocfcheck|cmsenscall| 3667 // |0 .. 4| 5 | 6 | 7 |8 .. 10| 11 | 12 | 3668 // 3669 // regparm is either 0 (no regparm attribute) or the regparm value+1. 3670 enum { CallConvMask = 0x1F }; 3671 enum { NoReturnMask = 0x20 }; 3672 enum { ProducesResultMask = 0x40 }; 3673 enum { NoCallerSavedRegsMask = 0x80 }; 3674 enum { 3675 RegParmMask = 0x700, 3676 RegParmOffset = 8 3677 }; 3678 enum { NoCfCheckMask = 0x800 }; 3679 enum { CmseNSCallMask = 0x1000 }; 3680 uint16_t Bits = CC_C; 3681 3682 ExtInfo(unsigned Bits) : Bits(static_cast<uint16_t>(Bits)) {} 3683 3684 public: 3685 // Constructor with no defaults. Use this when you know that you 3686 // have all the elements (when reading an AST file for example). 3687 ExtInfo(bool noReturn, bool hasRegParm, unsigned regParm, CallingConv cc, 3688 bool producesResult, bool noCallerSavedRegs, bool NoCfCheck, 3689 bool cmseNSCall) { 3690 assert((!hasRegParm || regParm < 7) && "Invalid regparm value"); 3691 Bits = ((unsigned)cc) | (noReturn ? NoReturnMask : 0) | 3692 (producesResult ? ProducesResultMask : 0) | 3693 (noCallerSavedRegs ? NoCallerSavedRegsMask : 0) | 3694 (hasRegParm ? ((regParm + 1) << RegParmOffset) : 0) | 3695 (NoCfCheck ? NoCfCheckMask : 0) | 3696 (cmseNSCall ? CmseNSCallMask : 0); 3697 } 3698 3699 // Constructor with all defaults. Use when for example creating a 3700 // function known to use defaults. 3701 ExtInfo() = default; 3702 3703 // Constructor with just the calling convention, which is an important part 3704 // of the canonical type. 3705 ExtInfo(CallingConv CC) : Bits(CC) {} 3706 3707 bool getNoReturn() const { return Bits & NoReturnMask; } 3708 bool getProducesResult() const { return Bits & ProducesResultMask; } 3709 bool getCmseNSCall() const { return Bits & CmseNSCallMask; } 3710 bool getNoCallerSavedRegs() const { return Bits & NoCallerSavedRegsMask; } 3711 bool getNoCfCheck() const { return Bits & NoCfCheckMask; } 3712 bool getHasRegParm() const { return ((Bits & RegParmMask) >> RegParmOffset) != 0; } 3713 3714 unsigned getRegParm() const { 3715 unsigned RegParm = (Bits & RegParmMask) >> RegParmOffset; 3716 if (RegParm > 0) 3717 --RegParm; 3718 return RegParm; 3719 } 3720 3721 CallingConv getCC() const { return CallingConv(Bits & CallConvMask); } 3722 3723 bool operator==(ExtInfo Other) const { 3724 return Bits == Other.Bits; 3725 } 3726 bool operator!=(ExtInfo Other) const { 3727 return Bits != Other.Bits; 3728 } 3729 3730 // Note that we don't have setters. That is by design, use 3731 // the following with methods instead of mutating these objects. 3732 3733 ExtInfo withNoReturn(bool noReturn) const { 3734 if (noReturn) 3735 return ExtInfo(Bits | NoReturnMask); 3736 else 3737 return ExtInfo(Bits & ~NoReturnMask); 3738 } 3739 3740 ExtInfo withProducesResult(bool producesResult) const { 3741 if (producesResult) 3742 return ExtInfo(Bits | ProducesResultMask); 3743 else 3744 return ExtInfo(Bits & ~ProducesResultMask); 3745 } 3746 3747 ExtInfo withCmseNSCall(bool cmseNSCall) const { 3748 if (cmseNSCall) 3749 return ExtInfo(Bits | CmseNSCallMask); 3750 else 3751 return ExtInfo(Bits & ~CmseNSCallMask); 3752 } 3753 3754 ExtInfo withNoCallerSavedRegs(bool noCallerSavedRegs) const { 3755 if (noCallerSavedRegs) 3756 return ExtInfo(Bits | NoCallerSavedRegsMask); 3757 else 3758 return ExtInfo(Bits & ~NoCallerSavedRegsMask); 3759 } 3760 3761 ExtInfo withNoCfCheck(bool noCfCheck) const { 3762 if (noCfCheck) 3763 return ExtInfo(Bits | NoCfCheckMask); 3764 else 3765 return ExtInfo(Bits & ~NoCfCheckMask); 3766 } 3767 3768 ExtInfo withRegParm(unsigned RegParm) const { 3769 assert(RegParm < 7 && "Invalid regparm value"); 3770 return ExtInfo((Bits & ~RegParmMask) | 3771 ((RegParm + 1) << RegParmOffset)); 3772 } 3773 3774 ExtInfo withCallingConv(CallingConv cc) const { 3775 return ExtInfo((Bits & ~CallConvMask) | (unsigned) cc); 3776 } 3777 3778 void Profile(llvm::FoldingSetNodeID &ID) const { 3779 ID.AddInteger(Bits); 3780 } 3781 }; 3782 3783 /// A simple holder for a QualType representing a type in an 3784 /// exception specification. Unfortunately needed by FunctionProtoType 3785 /// because TrailingObjects cannot handle repeated types. 3786 struct ExceptionType { QualType Type; }; 3787 3788 /// A simple holder for various uncommon bits which do not fit in 3789 /// FunctionTypeBitfields. Aligned to alignof(void *) to maintain the 3790 /// alignment of subsequent objects in TrailingObjects. You must update 3791 /// hasExtraBitfields in FunctionProtoType after adding extra data here. 3792 struct alignas(void *) FunctionTypeExtraBitfields { 3793 /// The number of types in the exception specification. 3794 /// A whole unsigned is not needed here and according to 3795 /// [implimits] 8 bits would be enough here. 3796 unsigned NumExceptionType; 3797 }; 3798 3799 protected: 3800 FunctionType(TypeClass tc, QualType res, QualType Canonical, 3801 TypeDependence Dependence, ExtInfo Info) 3802 : Type(tc, Canonical, Dependence), ResultType(res) { 3803 FunctionTypeBits.ExtInfo = Info.Bits; 3804 } 3805 3806 Qualifiers getFastTypeQuals() const { 3807 return Qualifiers::fromFastMask(FunctionTypeBits.FastTypeQuals); 3808 } 3809 3810 public: 3811 QualType getReturnType() const { return ResultType; } 3812 3813 bool getHasRegParm() const { return getExtInfo().getHasRegParm(); } 3814 unsigned getRegParmType() const { return getExtInfo().getRegParm(); } 3815 3816 /// Determine whether this function type includes the GNU noreturn 3817 /// attribute. The C++11 [[noreturn]] attribute does not affect the function 3818 /// type. 3819 bool getNoReturnAttr() const { return getExtInfo().getNoReturn(); } 3820 3821 bool getCmseNSCallAttr() const { return getExtInfo().getCmseNSCall(); } 3822 CallingConv getCallConv() const { return getExtInfo().getCC(); } 3823 ExtInfo getExtInfo() const { return ExtInfo(FunctionTypeBits.ExtInfo); } 3824 3825 static_assert((~Qualifiers::FastMask & Qualifiers::CVRMask) == 0, 3826 "Const, volatile and restrict are assumed to be a subset of " 3827 "the fast qualifiers."); 3828 3829 bool isConst() const { return getFastTypeQuals().hasConst(); } 3830 bool isVolatile() const { return getFastTypeQuals().hasVolatile(); } 3831 bool isRestrict() const { return getFastTypeQuals().hasRestrict(); } 3832 3833 /// Determine the type of an expression that calls a function of 3834 /// this type. 3835 QualType getCallResultType(const ASTContext &Context) const { 3836 return getReturnType().getNonLValueExprType(Context); 3837 } 3838 3839 static StringRef getNameForCallConv(CallingConv CC); 3840 3841 static bool classof(const Type *T) { 3842 return T->getTypeClass() == FunctionNoProto || 3843 T->getTypeClass() == FunctionProto; 3844 } 3845 }; 3846 3847 /// Represents a K&R-style 'int foo()' function, which has 3848 /// no information available about its arguments. 3849 class FunctionNoProtoType : public FunctionType, public llvm::FoldingSetNode { 3850 friend class ASTContext; // ASTContext creates these. 3851 3852 FunctionNoProtoType(QualType Result, QualType Canonical, ExtInfo Info) 3853 : FunctionType(FunctionNoProto, Result, Canonical, 3854 Result->getDependence() & 3855 ~(TypeDependence::DependentInstantiation | 3856 TypeDependence::UnexpandedPack), 3857 Info) {} 3858 3859 public: 3860 // No additional state past what FunctionType provides. 3861 3862 bool isSugared() const { return false; } 3863 QualType desugar() const { return QualType(this, 0); } 3864 3865 void Profile(llvm::FoldingSetNodeID &ID) { 3866 Profile(ID, getReturnType(), getExtInfo()); 3867 } 3868 3869 static void Profile(llvm::FoldingSetNodeID &ID, QualType ResultType, 3870 ExtInfo Info) { 3871 Info.Profile(ID); 3872 ID.AddPointer(ResultType.getAsOpaquePtr()); 3873 } 3874 3875 static bool classof(const Type *T) { 3876 return T->getTypeClass() == FunctionNoProto; 3877 } 3878 }; 3879 3880 /// Represents a prototype with parameter type info, e.g. 3881 /// 'int foo(int)' or 'int foo(void)'. 'void' is represented as having no 3882 /// parameters, not as having a single void parameter. Such a type can have 3883 /// an exception specification, but this specification is not part of the 3884 /// canonical type. FunctionProtoType has several trailing objects, some of 3885 /// which optional. For more information about the trailing objects see 3886 /// the first comment inside FunctionProtoType. 3887 class FunctionProtoType final 3888 : public FunctionType, 3889 public llvm::FoldingSetNode, 3890 private llvm::TrailingObjects< 3891 FunctionProtoType, QualType, SourceLocation, 3892 FunctionType::FunctionTypeExtraBitfields, FunctionType::ExceptionType, 3893 Expr *, FunctionDecl *, FunctionType::ExtParameterInfo, Qualifiers> { 3894 friend class ASTContext; // ASTContext creates these. 3895 friend TrailingObjects; 3896 3897 // FunctionProtoType is followed by several trailing objects, some of 3898 // which optional. They are in order: 3899 // 3900 // * An array of getNumParams() QualType holding the parameter types. 3901 // Always present. Note that for the vast majority of FunctionProtoType, 3902 // these will be the only trailing objects. 3903 // 3904 // * Optionally if the function is variadic, the SourceLocation of the 3905 // ellipsis. 3906 // 3907 // * Optionally if some extra data is stored in FunctionTypeExtraBitfields 3908 // (see FunctionTypeExtraBitfields and FunctionTypeBitfields): 3909 // a single FunctionTypeExtraBitfields. Present if and only if 3910 // hasExtraBitfields() is true. 3911 // 3912 // * Optionally exactly one of: 3913 // * an array of getNumExceptions() ExceptionType, 3914 // * a single Expr *, 3915 // * a pair of FunctionDecl *, 3916 // * a single FunctionDecl * 3917 // used to store information about the various types of exception 3918 // specification. See getExceptionSpecSize for the details. 3919 // 3920 // * Optionally an array of getNumParams() ExtParameterInfo holding 3921 // an ExtParameterInfo for each of the parameters. Present if and 3922 // only if hasExtParameterInfos() is true. 3923 // 3924 // * Optionally a Qualifiers object to represent extra qualifiers that can't 3925 // be represented by FunctionTypeBitfields.FastTypeQuals. Present if and only 3926 // if hasExtQualifiers() is true. 3927 // 3928 // The optional FunctionTypeExtraBitfields has to be before the data 3929 // related to the exception specification since it contains the number 3930 // of exception types. 3931 // 3932 // We put the ExtParameterInfos last. If all were equal, it would make 3933 // more sense to put these before the exception specification, because 3934 // it's much easier to skip past them compared to the elaborate switch 3935 // required to skip the exception specification. However, all is not 3936 // equal; ExtParameterInfos are used to model very uncommon features, 3937 // and it's better not to burden the more common paths. 3938 3939 public: 3940 /// Holds information about the various types of exception specification. 3941 /// ExceptionSpecInfo is not stored as such in FunctionProtoType but is 3942 /// used to group together the various bits of information about the 3943 /// exception specification. 3944 struct ExceptionSpecInfo { 3945 /// The kind of exception specification this is. 3946 ExceptionSpecificationType Type = EST_None; 3947 3948 /// Explicitly-specified list of exception types. 3949 ArrayRef<QualType> Exceptions; 3950 3951 /// Noexcept expression, if this is a computed noexcept specification. 3952 Expr *NoexceptExpr = nullptr; 3953 3954 /// The function whose exception specification this is, for 3955 /// EST_Unevaluated and EST_Uninstantiated. 3956 FunctionDecl *SourceDecl = nullptr; 3957 3958 /// The function template whose exception specification this is instantiated 3959 /// from, for EST_Uninstantiated. 3960 FunctionDecl *SourceTemplate = nullptr; 3961 3962 ExceptionSpecInfo() = default; 3963 3964 ExceptionSpecInfo(ExceptionSpecificationType EST) : Type(EST) {} 3965 }; 3966 3967 /// Extra information about a function prototype. ExtProtoInfo is not 3968 /// stored as such in FunctionProtoType but is used to group together 3969 /// the various bits of extra information about a function prototype. 3970 struct ExtProtoInfo { 3971 FunctionType::ExtInfo ExtInfo; 3972 bool Variadic : 1; 3973 bool HasTrailingReturn : 1; 3974 Qualifiers TypeQuals; 3975 RefQualifierKind RefQualifier = RQ_None; 3976 ExceptionSpecInfo ExceptionSpec; 3977 const ExtParameterInfo *ExtParameterInfos = nullptr; 3978 SourceLocation EllipsisLoc; 3979 3980 ExtProtoInfo() : Variadic(false), HasTrailingReturn(false) {} 3981 3982 ExtProtoInfo(CallingConv CC) 3983 : ExtInfo(CC), Variadic(false), HasTrailingReturn(false) {} 3984 3985 ExtProtoInfo withExceptionSpec(const ExceptionSpecInfo &ESI) { 3986 ExtProtoInfo Result(*this); 3987 Result.ExceptionSpec = ESI; 3988 return Result; 3989 } 3990 }; 3991 3992 private: 3993 unsigned numTrailingObjects(OverloadToken<QualType>) const { 3994 return getNumParams(); 3995 } 3996 3997 unsigned numTrailingObjects(OverloadToken<SourceLocation>) const { 3998 return isVariadic(); 3999 } 4000 4001 unsigned numTrailingObjects(OverloadToken<FunctionTypeExtraBitfields>) const { 4002 return hasExtraBitfields(); 4003 } 4004 4005 unsigned numTrailingObjects(OverloadToken<ExceptionType>) const { 4006 return getExceptionSpecSize().NumExceptionType; 4007 } 4008 4009 unsigned numTrailingObjects(OverloadToken<Expr *>) const { 4010 return getExceptionSpecSize().NumExprPtr; 4011 } 4012 4013 unsigned numTrailingObjects(OverloadToken<FunctionDecl *>) const { 4014 return getExceptionSpecSize().NumFunctionDeclPtr; 4015 } 4016 4017 unsigned numTrailingObjects(OverloadToken<ExtParameterInfo>) const { 4018 return hasExtParameterInfos() ? getNumParams() : 0; 4019 } 4020 4021 /// Determine whether there are any argument types that 4022 /// contain an unexpanded parameter pack. 4023 static bool containsAnyUnexpandedParameterPack(const QualType *ArgArray, 4024 unsigned numArgs) { 4025 for (unsigned Idx = 0; Idx < numArgs; ++Idx) 4026 if (ArgArray[Idx]->containsUnexpandedParameterPack()) 4027 return true; 4028 4029 return false; 4030 } 4031 4032 FunctionProtoType(QualType result, ArrayRef<QualType> params, 4033 QualType canonical, const ExtProtoInfo &epi); 4034 4035 /// This struct is returned by getExceptionSpecSize and is used to 4036 /// translate an ExceptionSpecificationType to the number and kind 4037 /// of trailing objects related to the exception specification. 4038 struct ExceptionSpecSizeHolder { 4039 unsigned NumExceptionType; 4040 unsigned NumExprPtr; 4041 unsigned NumFunctionDeclPtr; 4042 }; 4043 4044 /// Return the number and kind of trailing objects 4045 /// related to the exception specification. 4046 static ExceptionSpecSizeHolder 4047 getExceptionSpecSize(ExceptionSpecificationType EST, unsigned NumExceptions) { 4048 switch (EST) { 4049 case EST_None: 4050 case EST_DynamicNone: 4051 case EST_MSAny: 4052 case EST_BasicNoexcept: 4053 case EST_Unparsed: 4054 case EST_NoThrow: 4055 return {0, 0, 0}; 4056 4057 case EST_Dynamic: 4058 return {NumExceptions, 0, 0}; 4059 4060 case EST_DependentNoexcept: 4061 case EST_NoexceptFalse: 4062 case EST_NoexceptTrue: 4063 return {0, 1, 0}; 4064 4065 case EST_Uninstantiated: 4066 return {0, 0, 2}; 4067 4068 case EST_Unevaluated: 4069 return {0, 0, 1}; 4070 } 4071 llvm_unreachable("bad exception specification kind"); 4072 } 4073 4074 /// Return the number and kind of trailing objects 4075 /// related to the exception specification. 4076 ExceptionSpecSizeHolder getExceptionSpecSize() const { 4077 return getExceptionSpecSize(getExceptionSpecType(), getNumExceptions()); 4078 } 4079 4080 /// Whether the trailing FunctionTypeExtraBitfields is present. 4081 static bool hasExtraBitfields(ExceptionSpecificationType EST) { 4082 // If the exception spec type is EST_Dynamic then we have > 0 exception 4083 // types and the exact number is stored in FunctionTypeExtraBitfields. 4084 return EST == EST_Dynamic; 4085 } 4086 4087 /// Whether the trailing FunctionTypeExtraBitfields is present. 4088 bool hasExtraBitfields() const { 4089 return hasExtraBitfields(getExceptionSpecType()); 4090 } 4091 4092 bool hasExtQualifiers() const { 4093 return FunctionTypeBits.HasExtQuals; 4094 } 4095 4096 public: 4097 unsigned getNumParams() const { return FunctionTypeBits.NumParams; } 4098 4099 QualType getParamType(unsigned i) const { 4100 assert(i < getNumParams() && "invalid parameter index"); 4101 return param_type_begin()[i]; 4102 } 4103 4104 ArrayRef<QualType> getParamTypes() const { 4105 return llvm::makeArrayRef(param_type_begin(), param_type_end()); 4106 } 4107 4108 ExtProtoInfo getExtProtoInfo() const { 4109 ExtProtoInfo EPI; 4110 EPI.ExtInfo = getExtInfo(); 4111 EPI.Variadic = isVariadic(); 4112 EPI.EllipsisLoc = getEllipsisLoc(); 4113 EPI.HasTrailingReturn = hasTrailingReturn(); 4114 EPI.ExceptionSpec = getExceptionSpecInfo(); 4115 EPI.TypeQuals = getMethodQuals(); 4116 EPI.RefQualifier = getRefQualifier(); 4117 EPI.ExtParameterInfos = getExtParameterInfosOrNull(); 4118 return EPI; 4119 } 4120 4121 /// Get the kind of exception specification on this function. 4122 ExceptionSpecificationType getExceptionSpecType() const { 4123 return static_cast<ExceptionSpecificationType>( 4124 FunctionTypeBits.ExceptionSpecType); 4125 } 4126 4127 /// Return whether this function has any kind of exception spec. 4128 bool hasExceptionSpec() const { return getExceptionSpecType() != EST_None; } 4129 4130 /// Return whether this function has a dynamic (throw) exception spec. 4131 bool hasDynamicExceptionSpec() const { 4132 return isDynamicExceptionSpec(getExceptionSpecType()); 4133 } 4134 4135 /// Return whether this function has a noexcept exception spec. 4136 bool hasNoexceptExceptionSpec() const { 4137 return isNoexceptExceptionSpec(getExceptionSpecType()); 4138 } 4139 4140 /// Return whether this function has a dependent exception spec. 4141 bool hasDependentExceptionSpec() const; 4142 4143 /// Return whether this function has an instantiation-dependent exception 4144 /// spec. 4145 bool hasInstantiationDependentExceptionSpec() const; 4146 4147 /// Return all the available information about this type's exception spec. 4148 ExceptionSpecInfo getExceptionSpecInfo() const { 4149 ExceptionSpecInfo Result; 4150 Result.Type = getExceptionSpecType(); 4151 if (Result.Type == EST_Dynamic) { 4152 Result.Exceptions = exceptions(); 4153 } else if (isComputedNoexcept(Result.Type)) { 4154 Result.NoexceptExpr = getNoexceptExpr(); 4155 } else if (Result.Type == EST_Uninstantiated) { 4156 Result.SourceDecl = getExceptionSpecDecl(); 4157 Result.SourceTemplate = getExceptionSpecTemplate(); 4158 } else if (Result.Type == EST_Unevaluated) { 4159 Result.SourceDecl = getExceptionSpecDecl(); 4160 } 4161 return Result; 4162 } 4163 4164 /// Return the number of types in the exception specification. 4165 unsigned getNumExceptions() const { 4166 return getExceptionSpecType() == EST_Dynamic 4167 ? getTrailingObjects<FunctionTypeExtraBitfields>() 4168 ->NumExceptionType 4169 : 0; 4170 } 4171 4172 /// Return the ith exception type, where 0 <= i < getNumExceptions(). 4173 QualType getExceptionType(unsigned i) const { 4174 assert(i < getNumExceptions() && "Invalid exception number!"); 4175 return exception_begin()[i]; 4176 } 4177 4178 /// Return the expression inside noexcept(expression), or a null pointer 4179 /// if there is none (because the exception spec is not of this form). 4180 Expr *getNoexceptExpr() const { 4181 if (!isComputedNoexcept(getExceptionSpecType())) 4182 return nullptr; 4183 return *getTrailingObjects<Expr *>(); 4184 } 4185 4186 /// If this function type has an exception specification which hasn't 4187 /// been determined yet (either because it has not been evaluated or because 4188 /// it has not been instantiated), this is the function whose exception 4189 /// specification is represented by this type. 4190 FunctionDecl *getExceptionSpecDecl() const { 4191 if (getExceptionSpecType() != EST_Uninstantiated && 4192 getExceptionSpecType() != EST_Unevaluated) 4193 return nullptr; 4194 return getTrailingObjects<FunctionDecl *>()[0]; 4195 } 4196 4197 /// If this function type has an uninstantiated exception 4198 /// specification, this is the function whose exception specification 4199 /// should be instantiated to find the exception specification for 4200 /// this type. 4201 FunctionDecl *getExceptionSpecTemplate() const { 4202 if (getExceptionSpecType() != EST_Uninstantiated) 4203 return nullptr; 4204 return getTrailingObjects<FunctionDecl *>()[1]; 4205 } 4206 4207 /// Determine whether this function type has a non-throwing exception 4208 /// specification. 4209 CanThrowResult canThrow() const; 4210 4211 /// Determine whether this function type has a non-throwing exception 4212 /// specification. If this depends on template arguments, returns 4213 /// \c ResultIfDependent. 4214 bool isNothrow(bool ResultIfDependent = false) const { 4215 return ResultIfDependent ? canThrow() != CT_Can : canThrow() == CT_Cannot; 4216 } 4217 4218 /// Whether this function prototype is variadic. 4219 bool isVariadic() const { return FunctionTypeBits.Variadic; } 4220 4221 SourceLocation getEllipsisLoc() const { 4222 return isVariadic() ? *getTrailingObjects<SourceLocation>() 4223 : SourceLocation(); 4224 } 4225 4226 /// Determines whether this function prototype contains a 4227 /// parameter pack at the end. 4228 /// 4229 /// A function template whose last parameter is a parameter pack can be 4230 /// called with an arbitrary number of arguments, much like a variadic 4231 /// function. 4232 bool isTemplateVariadic() const; 4233 4234 /// Whether this function prototype has a trailing return type. 4235 bool hasTrailingReturn() const { return FunctionTypeBits.HasTrailingReturn; } 4236 4237 Qualifiers getMethodQuals() const { 4238 if (hasExtQualifiers()) 4239 return *getTrailingObjects<Qualifiers>(); 4240 else 4241 return getFastTypeQuals(); 4242 } 4243 4244 /// Retrieve the ref-qualifier associated with this function type. 4245 RefQualifierKind getRefQualifier() const { 4246 return static_cast<RefQualifierKind>(FunctionTypeBits.RefQualifier); 4247 } 4248 4249 using param_type_iterator = const QualType *; 4250 using param_type_range = llvm::iterator_range<param_type_iterator>; 4251 4252 param_type_range param_types() const { 4253 return param_type_range(param_type_begin(), param_type_end()); 4254 } 4255 4256 param_type_iterator param_type_begin() const { 4257 return getTrailingObjects<QualType>(); 4258 } 4259 4260 param_type_iterator param_type_end() const { 4261 return param_type_begin() + getNumParams(); 4262 } 4263 4264 using exception_iterator = const QualType *; 4265 4266 ArrayRef<QualType> exceptions() const { 4267 return llvm::makeArrayRef(exception_begin(), exception_end()); 4268 } 4269 4270 exception_iterator exception_begin() const { 4271 return reinterpret_cast<exception_iterator>( 4272 getTrailingObjects<ExceptionType>()); 4273 } 4274 4275 exception_iterator exception_end() const { 4276 return exception_begin() + getNumExceptions(); 4277 } 4278 4279 /// Is there any interesting extra information for any of the parameters 4280 /// of this function type? 4281 bool hasExtParameterInfos() const { 4282 return FunctionTypeBits.HasExtParameterInfos; 4283 } 4284 4285 ArrayRef<ExtParameterInfo> getExtParameterInfos() const { 4286 assert(hasExtParameterInfos()); 4287 return ArrayRef<ExtParameterInfo>(getTrailingObjects<ExtParameterInfo>(), 4288 getNumParams()); 4289 } 4290 4291 /// Return a pointer to the beginning of the array of extra parameter 4292 /// information, if present, or else null if none of the parameters 4293 /// carry it. This is equivalent to getExtProtoInfo().ExtParameterInfos. 4294 const ExtParameterInfo *getExtParameterInfosOrNull() const { 4295 if (!hasExtParameterInfos()) 4296 return nullptr; 4297 return getTrailingObjects<ExtParameterInfo>(); 4298 } 4299 4300 ExtParameterInfo getExtParameterInfo(unsigned I) const { 4301 assert(I < getNumParams() && "parameter index out of range"); 4302 if (hasExtParameterInfos()) 4303 return getTrailingObjects<ExtParameterInfo>()[I]; 4304 return ExtParameterInfo(); 4305 } 4306 4307 ParameterABI getParameterABI(unsigned I) const { 4308 assert(I < getNumParams() && "parameter index out of range"); 4309 if (hasExtParameterInfos()) 4310 return getTrailingObjects<ExtParameterInfo>()[I].getABI(); 4311 return ParameterABI::Ordinary; 4312 } 4313 4314 bool isParamConsumed(unsigned I) const { 4315 assert(I < getNumParams() && "parameter index out of range"); 4316 if (hasExtParameterInfos()) 4317 return getTrailingObjects<ExtParameterInfo>()[I].isConsumed(); 4318 return false; 4319 } 4320 4321 bool isSugared() const { return false; } 4322 QualType desugar() const { return QualType(this, 0); } 4323 4324 void printExceptionSpecification(raw_ostream &OS, 4325 const PrintingPolicy &Policy) const; 4326 4327 static bool classof(const Type *T) { 4328 return T->getTypeClass() == FunctionProto; 4329 } 4330 4331 void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Ctx); 4332 static void Profile(llvm::FoldingSetNodeID &ID, QualType Result, 4333 param_type_iterator ArgTys, unsigned NumArgs, 4334 const ExtProtoInfo &EPI, const ASTContext &Context, 4335 bool Canonical); 4336 }; 4337 4338 /// Represents the dependent type named by a dependently-scoped 4339 /// typename using declaration, e.g. 4340 /// using typename Base<T>::foo; 4341 /// 4342 /// Template instantiation turns these into the underlying type. 4343 class UnresolvedUsingType : public Type { 4344 friend class ASTContext; // ASTContext creates these. 4345 4346 UnresolvedUsingTypenameDecl *Decl; 4347 4348 UnresolvedUsingType(const UnresolvedUsingTypenameDecl *D) 4349 : Type(UnresolvedUsing, QualType(), 4350 TypeDependence::DependentInstantiation), 4351 Decl(const_cast<UnresolvedUsingTypenameDecl *>(D)) {} 4352 4353 public: 4354 UnresolvedUsingTypenameDecl *getDecl() const { return Decl; } 4355 4356 bool isSugared() const { return false; } 4357 QualType desugar() const { return QualType(this, 0); } 4358 4359 static bool classof(const Type *T) { 4360 return T->getTypeClass() == UnresolvedUsing; 4361 } 4362 4363 void Profile(llvm::FoldingSetNodeID &ID) { 4364 return Profile(ID, Decl); 4365 } 4366 4367 static void Profile(llvm::FoldingSetNodeID &ID, 4368 UnresolvedUsingTypenameDecl *D) { 4369 ID.AddPointer(D); 4370 } 4371 }; 4372 4373 class TypedefType : public Type { 4374 TypedefNameDecl *Decl; 4375 4376 private: 4377 friend class ASTContext; // ASTContext creates these. 4378 4379 TypedefType(TypeClass tc, const TypedefNameDecl *D, QualType underlying, 4380 QualType can); 4381 4382 public: 4383 TypedefNameDecl *getDecl() const { return Decl; } 4384 4385 bool isSugared() const { return true; } 4386 QualType desugar() const; 4387 4388 static bool classof(const Type *T) { return T->getTypeClass() == Typedef; } 4389 }; 4390 4391 /// Sugar type that represents a type that was qualified by a qualifier written 4392 /// as a macro invocation. 4393 class MacroQualifiedType : public Type { 4394 friend class ASTContext; // ASTContext creates these. 4395 4396 QualType UnderlyingTy; 4397 const IdentifierInfo *MacroII; 4398 4399 MacroQualifiedType(QualType UnderlyingTy, QualType CanonTy, 4400 const IdentifierInfo *MacroII) 4401 : Type(MacroQualified, CanonTy, UnderlyingTy->getDependence()), 4402 UnderlyingTy(UnderlyingTy), MacroII(MacroII) { 4403 assert(isa<AttributedType>(UnderlyingTy) && 4404 "Expected a macro qualified type to only wrap attributed types."); 4405 } 4406 4407 public: 4408 const IdentifierInfo *getMacroIdentifier() const { return MacroII; } 4409 QualType getUnderlyingType() const { return UnderlyingTy; } 4410 4411 /// Return this attributed type's modified type with no qualifiers attached to 4412 /// it. 4413 QualType getModifiedType() const; 4414 4415 bool isSugared() const { return true; } 4416 QualType desugar() const; 4417 4418 static bool classof(const Type *T) { 4419 return T->getTypeClass() == MacroQualified; 4420 } 4421 }; 4422 4423 /// Represents a `typeof` (or __typeof__) expression (a GCC extension). 4424 class TypeOfExprType : public Type { 4425 Expr *TOExpr; 4426 4427 protected: 4428 friend class ASTContext; // ASTContext creates these. 4429 4430 TypeOfExprType(Expr *E, QualType can = QualType()); 4431 4432 public: 4433 Expr *getUnderlyingExpr() const { return TOExpr; } 4434 4435 /// Remove a single level of sugar. 4436 QualType desugar() const; 4437 4438 /// Returns whether this type directly provides sugar. 4439 bool isSugared() const; 4440 4441 static bool classof(const Type *T) { return T->getTypeClass() == TypeOfExpr; } 4442 }; 4443 4444 /// Internal representation of canonical, dependent 4445 /// `typeof(expr)` types. 4446 /// 4447 /// This class is used internally by the ASTContext to manage 4448 /// canonical, dependent types, only. Clients will only see instances 4449 /// of this class via TypeOfExprType nodes. 4450 class DependentTypeOfExprType 4451 : public TypeOfExprType, public llvm::FoldingSetNode { 4452 const ASTContext &Context; 4453 4454 public: 4455 DependentTypeOfExprType(const ASTContext &Context, Expr *E) 4456 : TypeOfExprType(E), Context(Context) {} 4457 4458 void Profile(llvm::FoldingSetNodeID &ID) { 4459 Profile(ID, Context, getUnderlyingExpr()); 4460 } 4461 4462 static void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context, 4463 Expr *E); 4464 }; 4465 4466 /// Represents `typeof(type)`, a GCC extension. 4467 class TypeOfType : public Type { 4468 friend class ASTContext; // ASTContext creates these. 4469 4470 QualType TOType; 4471 4472 TypeOfType(QualType T, QualType can) 4473 : Type(TypeOf, can, T->getDependence()), TOType(T) { 4474 assert(!isa<TypedefType>(can) && "Invalid canonical type"); 4475 } 4476 4477 public: 4478 QualType getUnderlyingType() const { return TOType; } 4479 4480 /// Remove a single level of sugar. 4481 QualType desugar() const { return getUnderlyingType(); } 4482 4483 /// Returns whether this type directly provides sugar. 4484 bool isSugared() const { return true; } 4485 4486 static bool classof(const Type *T) { return T->getTypeClass() == TypeOf; } 4487 }; 4488 4489 /// Represents the type `decltype(expr)` (C++11). 4490 class DecltypeType : public Type { 4491 Expr *E; 4492 QualType UnderlyingType; 4493 4494 protected: 4495 friend class ASTContext; // ASTContext creates these. 4496 4497 DecltypeType(Expr *E, QualType underlyingType, QualType can = QualType()); 4498 4499 public: 4500 Expr *getUnderlyingExpr() const { return E; } 4501 QualType getUnderlyingType() const { return UnderlyingType; } 4502 4503 /// Remove a single level of sugar. 4504 QualType desugar() const; 4505 4506 /// Returns whether this type directly provides sugar. 4507 bool isSugared() const; 4508 4509 static bool classof(const Type *T) { return T->getTypeClass() == Decltype; } 4510 }; 4511 4512 /// Internal representation of canonical, dependent 4513 /// decltype(expr) types. 4514 /// 4515 /// This class is used internally by the ASTContext to manage 4516 /// canonical, dependent types, only. Clients will only see instances 4517 /// of this class via DecltypeType nodes. 4518 class DependentDecltypeType : public DecltypeType, public llvm::FoldingSetNode { 4519 const ASTContext &Context; 4520 4521 public: 4522 DependentDecltypeType(const ASTContext &Context, Expr *E); 4523 4524 void Profile(llvm::FoldingSetNodeID &ID) { 4525 Profile(ID, Context, getUnderlyingExpr()); 4526 } 4527 4528 static void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context, 4529 Expr *E); 4530 }; 4531 4532 /// A unary type transform, which is a type constructed from another. 4533 class UnaryTransformType : public Type { 4534 public: 4535 enum UTTKind { 4536 EnumUnderlyingType 4537 }; 4538 4539 private: 4540 /// The untransformed type. 4541 QualType BaseType; 4542 4543 /// The transformed type if not dependent, otherwise the same as BaseType. 4544 QualType UnderlyingType; 4545 4546 UTTKind UKind; 4547 4548 protected: 4549 friend class ASTContext; 4550 4551 UnaryTransformType(QualType BaseTy, QualType UnderlyingTy, UTTKind UKind, 4552 QualType CanonicalTy); 4553 4554 public: 4555 bool isSugared() const { return !isDependentType(); } 4556 QualType desugar() const { return UnderlyingType; } 4557 4558 QualType getUnderlyingType() const { return UnderlyingType; } 4559 QualType getBaseType() const { return BaseType; } 4560 4561 UTTKind getUTTKind() const { return UKind; } 4562 4563 static bool classof(const Type *T) { 4564 return T->getTypeClass() == UnaryTransform; 4565 } 4566 }; 4567 4568 /// Internal representation of canonical, dependent 4569 /// __underlying_type(type) types. 4570 /// 4571 /// This class is used internally by the ASTContext to manage 4572 /// canonical, dependent types, only. Clients will only see instances 4573 /// of this class via UnaryTransformType nodes. 4574 class DependentUnaryTransformType : public UnaryTransformType, 4575 public llvm::FoldingSetNode { 4576 public: 4577 DependentUnaryTransformType(const ASTContext &C, QualType BaseType, 4578 UTTKind UKind); 4579 4580 void Profile(llvm::FoldingSetNodeID &ID) { 4581 Profile(ID, getBaseType(), getUTTKind()); 4582 } 4583 4584 static void Profile(llvm::FoldingSetNodeID &ID, QualType BaseType, 4585 UTTKind UKind) { 4586 ID.AddPointer(BaseType.getAsOpaquePtr()); 4587 ID.AddInteger((unsigned)UKind); 4588 } 4589 }; 4590 4591 class TagType : public Type { 4592 friend class ASTReader; 4593 template <class T> friend class serialization::AbstractTypeReader; 4594 4595 /// Stores the TagDecl associated with this type. The decl may point to any 4596 /// TagDecl that declares the entity. 4597 TagDecl *decl; 4598 4599 protected: 4600 TagType(TypeClass TC, const TagDecl *D, QualType can); 4601 4602 public: 4603 TagDecl *getDecl() const; 4604 4605 /// Determines whether this type is in the process of being defined. 4606 bool isBeingDefined() const; 4607 4608 static bool classof(const Type *T) { 4609 return T->getTypeClass() == Enum || T->getTypeClass() == Record; 4610 } 4611 }; 4612 4613 /// A helper class that allows the use of isa/cast/dyncast 4614 /// to detect TagType objects of structs/unions/classes. 4615 class RecordType : public TagType { 4616 protected: 4617 friend class ASTContext; // ASTContext creates these. 4618 4619 explicit RecordType(const RecordDecl *D) 4620 : TagType(Record, reinterpret_cast<const TagDecl*>(D), QualType()) {} 4621 explicit RecordType(TypeClass TC, RecordDecl *D) 4622 : TagType(TC, reinterpret_cast<const TagDecl*>(D), QualType()) {} 4623 4624 public: 4625 RecordDecl *getDecl() const { 4626 return reinterpret_cast<RecordDecl*>(TagType::getDecl()); 4627 } 4628 4629 /// Recursively check all fields in the record for const-ness. If any field 4630 /// is declared const, return true. Otherwise, return false. 4631 bool hasConstFields() const; 4632 4633 bool isSugared() const { return false; } 4634 QualType desugar() const { return QualType(this, 0); } 4635 4636 static bool classof(const Type *T) { return T->getTypeClass() == Record; } 4637 }; 4638 4639 /// A helper class that allows the use of isa/cast/dyncast 4640 /// to detect TagType objects of enums. 4641 class EnumType : public TagType { 4642 friend class ASTContext; // ASTContext creates these. 4643 4644 explicit EnumType(const EnumDecl *D) 4645 : TagType(Enum, reinterpret_cast<const TagDecl*>(D), QualType()) {} 4646 4647 public: 4648 EnumDecl *getDecl() const { 4649 return reinterpret_cast<EnumDecl*>(TagType::getDecl()); 4650 } 4651 4652 bool isSugared() const { return false; } 4653 QualType desugar() const { return QualType(this, 0); } 4654 4655 static bool classof(const Type *T) { return T->getTypeClass() == Enum; } 4656 }; 4657 4658 /// An attributed type is a type to which a type attribute has been applied. 4659 /// 4660 /// The "modified type" is the fully-sugared type to which the attributed 4661 /// type was applied; generally it is not canonically equivalent to the 4662 /// attributed type. The "equivalent type" is the minimally-desugared type 4663 /// which the type is canonically equivalent to. 4664 /// 4665 /// For example, in the following attributed type: 4666 /// int32_t __attribute__((vector_size(16))) 4667 /// - the modified type is the TypedefType for int32_t 4668 /// - the equivalent type is VectorType(16, int32_t) 4669 /// - the canonical type is VectorType(16, int) 4670 class AttributedType : public Type, public llvm::FoldingSetNode { 4671 public: 4672 using Kind = attr::Kind; 4673 4674 private: 4675 friend class ASTContext; // ASTContext creates these 4676 4677 QualType ModifiedType; 4678 QualType EquivalentType; 4679 4680 AttributedType(QualType canon, attr::Kind attrKind, QualType modified, 4681 QualType equivalent) 4682 : Type(Attributed, canon, equivalent->getDependence()), 4683 ModifiedType(modified), EquivalentType(equivalent) { 4684 AttributedTypeBits.AttrKind = attrKind; 4685 } 4686 4687 public: 4688 Kind getAttrKind() const { 4689 return static_cast<Kind>(AttributedTypeBits.AttrKind); 4690 } 4691 4692 QualType getModifiedType() const { return ModifiedType; } 4693 QualType getEquivalentType() const { return EquivalentType; } 4694 4695 bool isSugared() const { return true; } 4696 QualType desugar() const { return getEquivalentType(); } 4697 4698 /// Does this attribute behave like a type qualifier? 4699 /// 4700 /// A type qualifier adjusts a type to provide specialized rules for 4701 /// a specific object, like the standard const and volatile qualifiers. 4702 /// This includes attributes controlling things like nullability, 4703 /// address spaces, and ARC ownership. The value of the object is still 4704 /// largely described by the modified type. 4705 /// 4706 /// In contrast, many type attributes "rewrite" their modified type to 4707 /// produce a fundamentally different type, not necessarily related in any 4708 /// formalizable way to the original type. For example, calling convention 4709 /// and vector attributes are not simple type qualifiers. 4710 /// 4711 /// Type qualifiers are often, but not always, reflected in the canonical 4712 /// type. 4713 bool isQualifier() const; 4714 4715 bool isMSTypeSpec() const; 4716 4717 bool isCallingConv() const; 4718 4719 llvm::Optional<NullabilityKind> getImmediateNullability() const; 4720 4721 /// Retrieve the attribute kind corresponding to the given 4722 /// nullability kind. 4723 static Kind getNullabilityAttrKind(NullabilityKind kind) { 4724 switch (kind) { 4725 case NullabilityKind::NonNull: 4726 return attr::TypeNonNull; 4727 4728 case NullabilityKind::Nullable: 4729 return attr::TypeNullable; 4730 4731 case NullabilityKind::NullableResult: 4732 return attr::TypeNullableResult; 4733 4734 case NullabilityKind::Unspecified: 4735 return attr::TypeNullUnspecified; 4736 } 4737 llvm_unreachable("Unknown nullability kind."); 4738 } 4739 4740 /// Strip off the top-level nullability annotation on the given 4741 /// type, if it's there. 4742 /// 4743 /// \param T The type to strip. If the type is exactly an 4744 /// AttributedType specifying nullability (without looking through 4745 /// type sugar), the nullability is returned and this type changed 4746 /// to the underlying modified type. 4747 /// 4748 /// \returns the top-level nullability, if present. 4749 static Optional<NullabilityKind> stripOuterNullability(QualType &T); 4750 4751 void Profile(llvm::FoldingSetNodeID &ID) { 4752 Profile(ID, getAttrKind(), ModifiedType, EquivalentType); 4753 } 4754 4755 static void Profile(llvm::FoldingSetNodeID &ID, Kind attrKind, 4756 QualType modified, QualType equivalent) { 4757 ID.AddInteger(attrKind); 4758 ID.AddPointer(modified.getAsOpaquePtr()); 4759 ID.AddPointer(equivalent.getAsOpaquePtr()); 4760 } 4761 4762 static bool classof(const Type *T) { 4763 return T->getTypeClass() == Attributed; 4764 } 4765 }; 4766 4767 class TemplateTypeParmType : public Type, public llvm::FoldingSetNode { 4768 friend class ASTContext; // ASTContext creates these 4769 4770 // Helper data collector for canonical types. 4771 struct CanonicalTTPTInfo { 4772 unsigned Depth : 15; 4773 unsigned ParameterPack : 1; 4774 unsigned Index : 16; 4775 }; 4776 4777 union { 4778 // Info for the canonical type. 4779 CanonicalTTPTInfo CanTTPTInfo; 4780 4781 // Info for the non-canonical type. 4782 TemplateTypeParmDecl *TTPDecl; 4783 }; 4784 4785 /// Build a non-canonical type. 4786 TemplateTypeParmType(TemplateTypeParmDecl *TTPDecl, QualType Canon) 4787 : Type(TemplateTypeParm, Canon, 4788 TypeDependence::DependentInstantiation | 4789 (Canon->getDependence() & TypeDependence::UnexpandedPack)), 4790 TTPDecl(TTPDecl) {} 4791 4792 /// Build the canonical type. 4793 TemplateTypeParmType(unsigned D, unsigned I, bool PP) 4794 : Type(TemplateTypeParm, QualType(this, 0), 4795 TypeDependence::DependentInstantiation | 4796 (PP ? TypeDependence::UnexpandedPack : TypeDependence::None)) { 4797 CanTTPTInfo.Depth = D; 4798 CanTTPTInfo.Index = I; 4799 CanTTPTInfo.ParameterPack = PP; 4800 } 4801 4802 const CanonicalTTPTInfo& getCanTTPTInfo() const { 4803 QualType Can = getCanonicalTypeInternal(); 4804 return Can->castAs<TemplateTypeParmType>()->CanTTPTInfo; 4805 } 4806 4807 public: 4808 unsigned getDepth() const { return getCanTTPTInfo().Depth; } 4809 unsigned getIndex() const { return getCanTTPTInfo().Index; } 4810 bool isParameterPack() const { return getCanTTPTInfo().ParameterPack; } 4811 4812 TemplateTypeParmDecl *getDecl() const { 4813 return isCanonicalUnqualified() ? nullptr : TTPDecl; 4814 } 4815 4816 IdentifierInfo *getIdentifier() const; 4817 4818 bool isSugared() const { return false; } 4819 QualType desugar() const { return QualType(this, 0); } 4820 4821 void Profile(llvm::FoldingSetNodeID &ID) { 4822 Profile(ID, getDepth(), getIndex(), isParameterPack(), getDecl()); 4823 } 4824 4825 static void Profile(llvm::FoldingSetNodeID &ID, unsigned Depth, 4826 unsigned Index, bool ParameterPack, 4827 TemplateTypeParmDecl *TTPDecl) { 4828 ID.AddInteger(Depth); 4829 ID.AddInteger(Index); 4830 ID.AddBoolean(ParameterPack); 4831 ID.AddPointer(TTPDecl); 4832 } 4833 4834 static bool classof(const Type *T) { 4835 return T->getTypeClass() == TemplateTypeParm; 4836 } 4837 }; 4838 4839 /// Represents the result of substituting a type for a template 4840 /// type parameter. 4841 /// 4842 /// Within an instantiated template, all template type parameters have 4843 /// been replaced with these. They are used solely to record that a 4844 /// type was originally written as a template type parameter; 4845 /// therefore they are never canonical. 4846 class SubstTemplateTypeParmType : public Type, public llvm::FoldingSetNode { 4847 friend class ASTContext; 4848 4849 // The original type parameter. 4850 const TemplateTypeParmType *Replaced; 4851 4852 SubstTemplateTypeParmType(const TemplateTypeParmType *Param, QualType Canon) 4853 : Type(SubstTemplateTypeParm, Canon, Canon->getDependence()), 4854 Replaced(Param) {} 4855 4856 public: 4857 /// Gets the template parameter that was substituted for. 4858 const TemplateTypeParmType *getReplacedParameter() const { 4859 return Replaced; 4860 } 4861 4862 /// Gets the type that was substituted for the template 4863 /// parameter. 4864 QualType getReplacementType() const { 4865 return getCanonicalTypeInternal(); 4866 } 4867 4868 bool isSugared() const { return true; } 4869 QualType desugar() const { return getReplacementType(); } 4870 4871 void Profile(llvm::FoldingSetNodeID &ID) { 4872 Profile(ID, getReplacedParameter(), getReplacementType()); 4873 } 4874 4875 static void Profile(llvm::FoldingSetNodeID &ID, 4876 const TemplateTypeParmType *Replaced, 4877 QualType Replacement) { 4878 ID.AddPointer(Replaced); 4879 ID.AddPointer(Replacement.getAsOpaquePtr()); 4880 } 4881 4882 static bool classof(const Type *T) { 4883 return T->getTypeClass() == SubstTemplateTypeParm; 4884 } 4885 }; 4886 4887 /// Represents the result of substituting a set of types for a template 4888 /// type parameter pack. 4889 /// 4890 /// When a pack expansion in the source code contains multiple parameter packs 4891 /// and those parameter packs correspond to different levels of template 4892 /// parameter lists, this type node is used to represent a template type 4893 /// parameter pack from an outer level, which has already had its argument pack 4894 /// substituted but that still lives within a pack expansion that itself 4895 /// could not be instantiated. When actually performing a substitution into 4896 /// that pack expansion (e.g., when all template parameters have corresponding 4897 /// arguments), this type will be replaced with the \c SubstTemplateTypeParmType 4898 /// at the current pack substitution index. 4899 class SubstTemplateTypeParmPackType : public Type, public llvm::FoldingSetNode { 4900 friend class ASTContext; 4901 4902 /// The original type parameter. 4903 const TemplateTypeParmType *Replaced; 4904 4905 /// A pointer to the set of template arguments that this 4906 /// parameter pack is instantiated with. 4907 const TemplateArgument *Arguments; 4908 4909 SubstTemplateTypeParmPackType(const TemplateTypeParmType *Param, 4910 QualType Canon, 4911 const TemplateArgument &ArgPack); 4912 4913 public: 4914 IdentifierInfo *getIdentifier() const { return Replaced->getIdentifier(); } 4915 4916 /// Gets the template parameter that was substituted for. 4917 const TemplateTypeParmType *getReplacedParameter() const { 4918 return Replaced; 4919 } 4920 4921 unsigned getNumArgs() const { 4922 return SubstTemplateTypeParmPackTypeBits.NumArgs; 4923 } 4924 4925 bool isSugared() const { return false; } 4926 QualType desugar() const { return QualType(this, 0); } 4927 4928 TemplateArgument getArgumentPack() const; 4929 4930 void Profile(llvm::FoldingSetNodeID &ID); 4931 static void Profile(llvm::FoldingSetNodeID &ID, 4932 const TemplateTypeParmType *Replaced, 4933 const TemplateArgument &ArgPack); 4934 4935 static bool classof(const Type *T) { 4936 return T->getTypeClass() == SubstTemplateTypeParmPack; 4937 } 4938 }; 4939 4940 /// Common base class for placeholders for types that get replaced by 4941 /// placeholder type deduction: C++11 auto, C++14 decltype(auto), C++17 deduced 4942 /// class template types, and constrained type names. 4943 /// 4944 /// These types are usually a placeholder for a deduced type. However, before 4945 /// the initializer is attached, or (usually) if the initializer is 4946 /// type-dependent, there is no deduced type and the type is canonical. In 4947 /// the latter case, it is also a dependent type. 4948 class DeducedType : public Type { 4949 protected: 4950 DeducedType(TypeClass TC, QualType DeducedAsType, 4951 TypeDependence ExtraDependence) 4952 : Type(TC, 4953 // FIXME: Retain the sugared deduced type? 4954 DeducedAsType.isNull() ? QualType(this, 0) 4955 : DeducedAsType.getCanonicalType(), 4956 ExtraDependence | (DeducedAsType.isNull() 4957 ? TypeDependence::None 4958 : DeducedAsType->getDependence() & 4959 ~TypeDependence::VariablyModified)) {} 4960 4961 public: 4962 bool isSugared() const { return !isCanonicalUnqualified(); } 4963 QualType desugar() const { return getCanonicalTypeInternal(); } 4964 4965 /// Get the type deduced for this placeholder type, or null if it's 4966 /// either not been deduced or was deduced to a dependent type. 4967 QualType getDeducedType() const { 4968 return !isCanonicalUnqualified() ? getCanonicalTypeInternal() : QualType(); 4969 } 4970 bool isDeduced() const { 4971 return !isCanonicalUnqualified() || isDependentType(); 4972 } 4973 4974 static bool classof(const Type *T) { 4975 return T->getTypeClass() == Auto || 4976 T->getTypeClass() == DeducedTemplateSpecialization; 4977 } 4978 }; 4979 4980 /// Represents a C++11 auto or C++14 decltype(auto) type, possibly constrained 4981 /// by a type-constraint. 4982 class alignas(8) AutoType : public DeducedType, public llvm::FoldingSetNode { 4983 friend class ASTContext; // ASTContext creates these 4984 4985 ConceptDecl *TypeConstraintConcept; 4986 4987 AutoType(QualType DeducedAsType, AutoTypeKeyword Keyword, 4988 TypeDependence ExtraDependence, ConceptDecl *CD, 4989 ArrayRef<TemplateArgument> TypeConstraintArgs); 4990 4991 const TemplateArgument *getArgBuffer() const { 4992 return reinterpret_cast<const TemplateArgument*>(this+1); 4993 } 4994 4995 TemplateArgument *getArgBuffer() { 4996 return reinterpret_cast<TemplateArgument*>(this+1); 4997 } 4998 4999 public: 5000 /// Retrieve the template arguments. 5001 const TemplateArgument *getArgs() const { 5002 return getArgBuffer(); 5003 } 5004 5005 /// Retrieve the number of template arguments. 5006 unsigned getNumArgs() const { 5007 return AutoTypeBits.NumArgs; 5008 } 5009 5010 const TemplateArgument &getArg(unsigned Idx) const; // in TemplateBase.h 5011 5012 ArrayRef<TemplateArgument> getTypeConstraintArguments() const { 5013 return {getArgs(), getNumArgs()}; 5014 } 5015 5016 ConceptDecl *getTypeConstraintConcept() const { 5017 return TypeConstraintConcept; 5018 } 5019 5020 bool isConstrained() const { 5021 return TypeConstraintConcept != nullptr; 5022 } 5023 5024 bool isDecltypeAuto() const { 5025 return getKeyword() == AutoTypeKeyword::DecltypeAuto; 5026 } 5027 5028 AutoTypeKeyword getKeyword() const { 5029 return (AutoTypeKeyword)AutoTypeBits.Keyword; 5030 } 5031 5032 void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context) { 5033 Profile(ID, Context, getDeducedType(), getKeyword(), isDependentType(), 5034 getTypeConstraintConcept(), getTypeConstraintArguments()); 5035 } 5036 5037 static void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context, 5038 QualType Deduced, AutoTypeKeyword Keyword, 5039 bool IsDependent, ConceptDecl *CD, 5040 ArrayRef<TemplateArgument> Arguments); 5041 5042 static bool classof(const Type *T) { 5043 return T->getTypeClass() == Auto; 5044 } 5045 }; 5046 5047 /// Represents a C++17 deduced template specialization type. 5048 class DeducedTemplateSpecializationType : public DeducedType, 5049 public llvm::FoldingSetNode { 5050 friend class ASTContext; // ASTContext creates these 5051 5052 /// The name of the template whose arguments will be deduced. 5053 TemplateName Template; 5054 5055 DeducedTemplateSpecializationType(TemplateName Template, 5056 QualType DeducedAsType, 5057 bool IsDeducedAsDependent) 5058 : DeducedType(DeducedTemplateSpecialization, DeducedAsType, 5059 toTypeDependence(Template.getDependence()) | 5060 (IsDeducedAsDependent 5061 ? TypeDependence::DependentInstantiation 5062 : TypeDependence::None)), 5063 Template(Template) {} 5064 5065 public: 5066 /// Retrieve the name of the template that we are deducing. 5067 TemplateName getTemplateName() const { return Template;} 5068 5069 void Profile(llvm::FoldingSetNodeID &ID) { 5070 Profile(ID, getTemplateName(), getDeducedType(), isDependentType()); 5071 } 5072 5073 static void Profile(llvm::FoldingSetNodeID &ID, TemplateName Template, 5074 QualType Deduced, bool IsDependent) { 5075 Template.Profile(ID); 5076 ID.AddPointer(Deduced.getAsOpaquePtr()); 5077 ID.AddBoolean(IsDependent); 5078 } 5079 5080 static bool classof(const Type *T) { 5081 return T->getTypeClass() == DeducedTemplateSpecialization; 5082 } 5083 }; 5084 5085 /// Represents a type template specialization; the template 5086 /// must be a class template, a type alias template, or a template 5087 /// template parameter. A template which cannot be resolved to one of 5088 /// these, e.g. because it is written with a dependent scope 5089 /// specifier, is instead represented as a 5090 /// @c DependentTemplateSpecializationType. 5091 /// 5092 /// A non-dependent template specialization type is always "sugar", 5093 /// typically for a \c RecordType. For example, a class template 5094 /// specialization type of \c vector<int> will refer to a tag type for 5095 /// the instantiation \c std::vector<int, std::allocator<int>> 5096 /// 5097 /// Template specializations are dependent if either the template or 5098 /// any of the template arguments are dependent, in which case the 5099 /// type may also be canonical. 5100 /// 5101 /// Instances of this type are allocated with a trailing array of 5102 /// TemplateArguments, followed by a QualType representing the 5103 /// non-canonical aliased type when the template is a type alias 5104 /// template. 5105 class alignas(8) TemplateSpecializationType 5106 : public Type, 5107 public llvm::FoldingSetNode { 5108 friend class ASTContext; // ASTContext creates these 5109 5110 /// The name of the template being specialized. This is 5111 /// either a TemplateName::Template (in which case it is a 5112 /// ClassTemplateDecl*, a TemplateTemplateParmDecl*, or a 5113 /// TypeAliasTemplateDecl*), a 5114 /// TemplateName::SubstTemplateTemplateParmPack, or a 5115 /// TemplateName::SubstTemplateTemplateParm (in which case the 5116 /// replacement must, recursively, be one of these). 5117 TemplateName Template; 5118 5119 TemplateSpecializationType(TemplateName T, 5120 ArrayRef<TemplateArgument> Args, 5121 QualType Canon, 5122 QualType Aliased); 5123 5124 public: 5125 /// Determine whether any of the given template arguments are dependent. 5126 /// 5127 /// The converted arguments should be supplied when known; whether an 5128 /// argument is dependent can depend on the conversions performed on it 5129 /// (for example, a 'const int' passed as a template argument might be 5130 /// dependent if the parameter is a reference but non-dependent if the 5131 /// parameter is an int). 5132 /// 5133 /// Note that the \p Args parameter is unused: this is intentional, to remind 5134 /// the caller that they need to pass in the converted arguments, not the 5135 /// specified arguments. 5136 static bool 5137 anyDependentTemplateArguments(ArrayRef<TemplateArgumentLoc> Args, 5138 ArrayRef<TemplateArgument> Converted); 5139 static bool 5140 anyDependentTemplateArguments(const TemplateArgumentListInfo &, 5141 ArrayRef<TemplateArgument> Converted); 5142 static bool anyInstantiationDependentTemplateArguments( 5143 ArrayRef<TemplateArgumentLoc> Args); 5144 5145 /// True if this template specialization type matches a current 5146 /// instantiation in the context in which it is found. 5147 bool isCurrentInstantiation() const { 5148 return isa<InjectedClassNameType>(getCanonicalTypeInternal()); 5149 } 5150 5151 /// Determine if this template specialization type is for a type alias 5152 /// template that has been substituted. 5153 /// 5154 /// Nearly every template specialization type whose template is an alias 5155 /// template will be substituted. However, this is not the case when 5156 /// the specialization contains a pack expansion but the template alias 5157 /// does not have a corresponding parameter pack, e.g., 5158 /// 5159 /// \code 5160 /// template<typename T, typename U, typename V> struct S; 5161 /// template<typename T, typename U> using A = S<T, int, U>; 5162 /// template<typename... Ts> struct X { 5163 /// typedef A<Ts...> type; // not a type alias 5164 /// }; 5165 /// \endcode 5166 bool isTypeAlias() const { return TemplateSpecializationTypeBits.TypeAlias; } 5167 5168 /// Get the aliased type, if this is a specialization of a type alias 5169 /// template. 5170 QualType getAliasedType() const { 5171 assert(isTypeAlias() && "not a type alias template specialization"); 5172 return *reinterpret_cast<const QualType*>(end()); 5173 } 5174 5175 using iterator = const TemplateArgument *; 5176 5177 iterator begin() const { return getArgs(); } 5178 iterator end() const; // defined inline in TemplateBase.h 5179 5180 /// Retrieve the name of the template that we are specializing. 5181 TemplateName getTemplateName() const { return Template; } 5182 5183 /// Retrieve the template arguments. 5184 const TemplateArgument *getArgs() const { 5185 return reinterpret_cast<const TemplateArgument *>(this + 1); 5186 } 5187 5188 /// Retrieve the number of template arguments. 5189 unsigned getNumArgs() const { 5190 return TemplateSpecializationTypeBits.NumArgs; 5191 } 5192 5193 /// Retrieve a specific template argument as a type. 5194 /// \pre \c isArgType(Arg) 5195 const TemplateArgument &getArg(unsigned Idx) const; // in TemplateBase.h 5196 5197 ArrayRef<TemplateArgument> template_arguments() const { 5198 return {getArgs(), getNumArgs()}; 5199 } 5200 5201 bool isSugared() const { 5202 return !isDependentType() || isCurrentInstantiation() || isTypeAlias(); 5203 } 5204 5205 QualType desugar() const { 5206 return isTypeAlias() ? getAliasedType() : getCanonicalTypeInternal(); 5207 } 5208 5209 void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Ctx) { 5210 Profile(ID, Template, template_arguments(), Ctx); 5211 if (isTypeAlias()) 5212 getAliasedType().Profile(ID); 5213 } 5214 5215 static void Profile(llvm::FoldingSetNodeID &ID, TemplateName T, 5216 ArrayRef<TemplateArgument> Args, 5217 const ASTContext &Context); 5218 5219 static bool classof(const Type *T) { 5220 return T->getTypeClass() == TemplateSpecialization; 5221 } 5222 }; 5223 5224 /// Print a template argument list, including the '<' and '>' 5225 /// enclosing the template arguments. 5226 void printTemplateArgumentList(raw_ostream &OS, 5227 ArrayRef<TemplateArgument> Args, 5228 const PrintingPolicy &Policy, 5229 const TemplateParameterList *TPL = nullptr); 5230 5231 void printTemplateArgumentList(raw_ostream &OS, 5232 ArrayRef<TemplateArgumentLoc> Args, 5233 const PrintingPolicy &Policy, 5234 const TemplateParameterList *TPL = nullptr); 5235 5236 void printTemplateArgumentList(raw_ostream &OS, 5237 const TemplateArgumentListInfo &Args, 5238 const PrintingPolicy &Policy, 5239 const TemplateParameterList *TPL = nullptr); 5240 5241 /// The injected class name of a C++ class template or class 5242 /// template partial specialization. Used to record that a type was 5243 /// spelled with a bare identifier rather than as a template-id; the 5244 /// equivalent for non-templated classes is just RecordType. 5245 /// 5246 /// Injected class name types are always dependent. Template 5247 /// instantiation turns these into RecordTypes. 5248 /// 5249 /// Injected class name types are always canonical. This works 5250 /// because it is impossible to compare an injected class name type 5251 /// with the corresponding non-injected template type, for the same 5252 /// reason that it is impossible to directly compare template 5253 /// parameters from different dependent contexts: injected class name 5254 /// types can only occur within the scope of a particular templated 5255 /// declaration, and within that scope every template specialization 5256 /// will canonicalize to the injected class name (when appropriate 5257 /// according to the rules of the language). 5258 class InjectedClassNameType : public Type { 5259 friend class ASTContext; // ASTContext creates these. 5260 friend class ASTNodeImporter; 5261 friend class ASTReader; // FIXME: ASTContext::getInjectedClassNameType is not 5262 // currently suitable for AST reading, too much 5263 // interdependencies. 5264 template <class T> friend class serialization::AbstractTypeReader; 5265 5266 CXXRecordDecl *Decl; 5267 5268 /// The template specialization which this type represents. 5269 /// For example, in 5270 /// template <class T> class A { ... }; 5271 /// this is A<T>, whereas in 5272 /// template <class X, class Y> class A<B<X,Y> > { ... }; 5273 /// this is A<B<X,Y> >. 5274 /// 5275 /// It is always unqualified, always a template specialization type, 5276 /// and always dependent. 5277 QualType InjectedType; 5278 5279 InjectedClassNameType(CXXRecordDecl *D, QualType TST) 5280 : Type(InjectedClassName, QualType(), 5281 TypeDependence::DependentInstantiation), 5282 Decl(D), InjectedType(TST) { 5283 assert(isa<TemplateSpecializationType>(TST)); 5284 assert(!TST.hasQualifiers()); 5285 assert(TST->isDependentType()); 5286 } 5287 5288 public: 5289 QualType getInjectedSpecializationType() const { return InjectedType; } 5290 5291 const TemplateSpecializationType *getInjectedTST() const { 5292 return cast<TemplateSpecializationType>(InjectedType.getTypePtr()); 5293 } 5294 5295 TemplateName getTemplateName() const { 5296 return getInjectedTST()->getTemplateName(); 5297 } 5298 5299 CXXRecordDecl *getDecl() const; 5300 5301 bool isSugared() const { return false; } 5302 QualType desugar() const { return QualType(this, 0); } 5303 5304 static bool classof(const Type *T) { 5305 return T->getTypeClass() == InjectedClassName; 5306 } 5307 }; 5308 5309 /// The kind of a tag type. 5310 enum TagTypeKind { 5311 /// The "struct" keyword. 5312 TTK_Struct, 5313 5314 /// The "__interface" keyword. 5315 TTK_Interface, 5316 5317 /// The "union" keyword. 5318 TTK_Union, 5319 5320 /// The "class" keyword. 5321 TTK_Class, 5322 5323 /// The "enum" keyword. 5324 TTK_Enum 5325 }; 5326 5327 /// The elaboration keyword that precedes a qualified type name or 5328 /// introduces an elaborated-type-specifier. 5329 enum ElaboratedTypeKeyword { 5330 /// The "struct" keyword introduces the elaborated-type-specifier. 5331 ETK_Struct, 5332 5333 /// The "__interface" keyword introduces the elaborated-type-specifier. 5334 ETK_Interface, 5335 5336 /// The "union" keyword introduces the elaborated-type-specifier. 5337 ETK_Union, 5338 5339 /// The "class" keyword introduces the elaborated-type-specifier. 5340 ETK_Class, 5341 5342 /// The "enum" keyword introduces the elaborated-type-specifier. 5343 ETK_Enum, 5344 5345 /// The "typename" keyword precedes the qualified type name, e.g., 5346 /// \c typename T::type. 5347 ETK_Typename, 5348 5349 /// No keyword precedes the qualified type name. 5350 ETK_None 5351 }; 5352 5353 /// A helper class for Type nodes having an ElaboratedTypeKeyword. 5354 /// The keyword in stored in the free bits of the base class. 5355 /// Also provides a few static helpers for converting and printing 5356 /// elaborated type keyword and tag type kind enumerations. 5357 class TypeWithKeyword : public Type { 5358 protected: 5359 TypeWithKeyword(ElaboratedTypeKeyword Keyword, TypeClass tc, 5360 QualType Canonical, TypeDependence Dependence) 5361 : Type(tc, Canonical, Dependence) { 5362 TypeWithKeywordBits.Keyword = Keyword; 5363 } 5364 5365 public: 5366 ElaboratedTypeKeyword getKeyword() const { 5367 return static_cast<ElaboratedTypeKeyword>(TypeWithKeywordBits.Keyword); 5368 } 5369 5370 /// Converts a type specifier (DeclSpec::TST) into an elaborated type keyword. 5371 static ElaboratedTypeKeyword getKeywordForTypeSpec(unsigned TypeSpec); 5372 5373 /// Converts a type specifier (DeclSpec::TST) into a tag type kind. 5374 /// It is an error to provide a type specifier which *isn't* a tag kind here. 5375 static TagTypeKind getTagTypeKindForTypeSpec(unsigned TypeSpec); 5376 5377 /// Converts a TagTypeKind into an elaborated type keyword. 5378 static ElaboratedTypeKeyword getKeywordForTagTypeKind(TagTypeKind Tag); 5379 5380 /// Converts an elaborated type keyword into a TagTypeKind. 5381 /// It is an error to provide an elaborated type keyword 5382 /// which *isn't* a tag kind here. 5383 static TagTypeKind getTagTypeKindForKeyword(ElaboratedTypeKeyword Keyword); 5384 5385 static bool KeywordIsTagTypeKind(ElaboratedTypeKeyword Keyword); 5386 5387 static StringRef getKeywordName(ElaboratedTypeKeyword Keyword); 5388 5389 static StringRef getTagTypeKindName(TagTypeKind Kind) { 5390 return getKeywordName(getKeywordForTagTypeKind(Kind)); 5391 } 5392 5393 class CannotCastToThisType {}; 5394 static CannotCastToThisType classof(const Type *); 5395 }; 5396 5397 /// Represents a type that was referred to using an elaborated type 5398 /// keyword, e.g., struct S, or via a qualified name, e.g., N::M::type, 5399 /// or both. 5400 /// 5401 /// This type is used to keep track of a type name as written in the 5402 /// source code, including tag keywords and any nested-name-specifiers. 5403 /// The type itself is always "sugar", used to express what was written 5404 /// in the source code but containing no additional semantic information. 5405 class ElaboratedType final 5406 : public TypeWithKeyword, 5407 public llvm::FoldingSetNode, 5408 private llvm::TrailingObjects<ElaboratedType, TagDecl *> { 5409 friend class ASTContext; // ASTContext creates these 5410 friend TrailingObjects; 5411 5412 /// The nested name specifier containing the qualifier. 5413 NestedNameSpecifier *NNS; 5414 5415 /// The type that this qualified name refers to. 5416 QualType NamedType; 5417 5418 /// The (re)declaration of this tag type owned by this occurrence is stored 5419 /// as a trailing object if there is one. Use getOwnedTagDecl to obtain 5420 /// it, or obtain a null pointer if there is none. 5421 5422 ElaboratedType(ElaboratedTypeKeyword Keyword, NestedNameSpecifier *NNS, 5423 QualType NamedType, QualType CanonType, TagDecl *OwnedTagDecl) 5424 : TypeWithKeyword(Keyword, Elaborated, CanonType, 5425 // Any semantic dependence on the qualifier will have 5426 // been incorporated into NamedType. We still need to 5427 // track syntactic (instantiation / error / pack) 5428 // dependence on the qualifier. 5429 NamedType->getDependence() | 5430 (NNS ? toSyntacticDependence( 5431 toTypeDependence(NNS->getDependence())) 5432 : TypeDependence::None)), 5433 NNS(NNS), NamedType(NamedType) { 5434 ElaboratedTypeBits.HasOwnedTagDecl = false; 5435 if (OwnedTagDecl) { 5436 ElaboratedTypeBits.HasOwnedTagDecl = true; 5437 *getTrailingObjects<TagDecl *>() = OwnedTagDecl; 5438 } 5439 assert(!(Keyword == ETK_None && NNS == nullptr) && 5440 "ElaboratedType cannot have elaborated type keyword " 5441 "and name qualifier both null."); 5442 } 5443 5444 public: 5445 /// Retrieve the qualification on this type. 5446 NestedNameSpecifier *getQualifier() const { return NNS; } 5447 5448 /// Retrieve the type named by the qualified-id. 5449 QualType getNamedType() const { return NamedType; } 5450 5451 /// Remove a single level of sugar. 5452 QualType desugar() const { return getNamedType(); } 5453 5454 /// Returns whether this type directly provides sugar. 5455 bool isSugared() const { return true; } 5456 5457 /// Return the (re)declaration of this type owned by this occurrence of this 5458 /// type, or nullptr if there is none. 5459 TagDecl *getOwnedTagDecl() const { 5460 return ElaboratedTypeBits.HasOwnedTagDecl ? *getTrailingObjects<TagDecl *>() 5461 : nullptr; 5462 } 5463 5464 void Profile(llvm::FoldingSetNodeID &ID) { 5465 Profile(ID, getKeyword(), NNS, NamedType, getOwnedTagDecl()); 5466 } 5467 5468 static void Profile(llvm::FoldingSetNodeID &ID, ElaboratedTypeKeyword Keyword, 5469 NestedNameSpecifier *NNS, QualType NamedType, 5470 TagDecl *OwnedTagDecl) { 5471 ID.AddInteger(Keyword); 5472 ID.AddPointer(NNS); 5473 NamedType.Profile(ID); 5474 ID.AddPointer(OwnedTagDecl); 5475 } 5476 5477 static bool classof(const Type *T) { return T->getTypeClass() == Elaborated; } 5478 }; 5479 5480 /// Represents a qualified type name for which the type name is 5481 /// dependent. 5482 /// 5483 /// DependentNameType represents a class of dependent types that involve a 5484 /// possibly dependent nested-name-specifier (e.g., "T::") followed by a 5485 /// name of a type. The DependentNameType may start with a "typename" (for a 5486 /// typename-specifier), "class", "struct", "union", or "enum" (for a 5487 /// dependent elaborated-type-specifier), or nothing (in contexts where we 5488 /// know that we must be referring to a type, e.g., in a base class specifier). 5489 /// Typically the nested-name-specifier is dependent, but in MSVC compatibility 5490 /// mode, this type is used with non-dependent names to delay name lookup until 5491 /// instantiation. 5492 class DependentNameType : public TypeWithKeyword, public llvm::FoldingSetNode { 5493 friend class ASTContext; // ASTContext creates these 5494 5495 /// The nested name specifier containing the qualifier. 5496 NestedNameSpecifier *NNS; 5497 5498 /// The type that this typename specifier refers to. 5499 const IdentifierInfo *Name; 5500 5501 DependentNameType(ElaboratedTypeKeyword Keyword, NestedNameSpecifier *NNS, 5502 const IdentifierInfo *Name, QualType CanonType) 5503 : TypeWithKeyword(Keyword, DependentName, CanonType, 5504 TypeDependence::DependentInstantiation | 5505 toTypeDependence(NNS->getDependence())), 5506 NNS(NNS), Name(Name) {} 5507 5508 public: 5509 /// Retrieve the qualification on this type. 5510 NestedNameSpecifier *getQualifier() const { return NNS; } 5511 5512 /// Retrieve the type named by the typename specifier as an identifier. 5513 /// 5514 /// This routine will return a non-NULL identifier pointer when the 5515 /// form of the original typename was terminated by an identifier, 5516 /// e.g., "typename T::type". 5517 const IdentifierInfo *getIdentifier() const { 5518 return Name; 5519 } 5520 5521 bool isSugared() const { return false; } 5522 QualType desugar() const { return QualType(this, 0); } 5523 5524 void Profile(llvm::FoldingSetNodeID &ID) { 5525 Profile(ID, getKeyword(), NNS, Name); 5526 } 5527 5528 static void Profile(llvm::FoldingSetNodeID &ID, ElaboratedTypeKeyword Keyword, 5529 NestedNameSpecifier *NNS, const IdentifierInfo *Name) { 5530 ID.AddInteger(Keyword); 5531 ID.AddPointer(NNS); 5532 ID.AddPointer(Name); 5533 } 5534 5535 static bool classof(const Type *T) { 5536 return T->getTypeClass() == DependentName; 5537 } 5538 }; 5539 5540 /// Represents a template specialization type whose template cannot be 5541 /// resolved, e.g. 5542 /// A<T>::template B<T> 5543 class alignas(8) DependentTemplateSpecializationType 5544 : public TypeWithKeyword, 5545 public llvm::FoldingSetNode { 5546 friend class ASTContext; // ASTContext creates these 5547 5548 /// The nested name specifier containing the qualifier. 5549 NestedNameSpecifier *NNS; 5550 5551 /// The identifier of the template. 5552 const IdentifierInfo *Name; 5553 5554 DependentTemplateSpecializationType(ElaboratedTypeKeyword Keyword, 5555 NestedNameSpecifier *NNS, 5556 const IdentifierInfo *Name, 5557 ArrayRef<TemplateArgument> Args, 5558 QualType Canon); 5559 5560 const TemplateArgument *getArgBuffer() const { 5561 return reinterpret_cast<const TemplateArgument*>(this+1); 5562 } 5563 5564 TemplateArgument *getArgBuffer() { 5565 return reinterpret_cast<TemplateArgument*>(this+1); 5566 } 5567 5568 public: 5569 NestedNameSpecifier *getQualifier() const { return NNS; } 5570 const IdentifierInfo *getIdentifier() const { return Name; } 5571 5572 /// Retrieve the template arguments. 5573 const TemplateArgument *getArgs() const { 5574 return getArgBuffer(); 5575 } 5576 5577 /// Retrieve the number of template arguments. 5578 unsigned getNumArgs() const { 5579 return DependentTemplateSpecializationTypeBits.NumArgs; 5580 } 5581 5582 const TemplateArgument &getArg(unsigned Idx) const; // in TemplateBase.h 5583 5584 ArrayRef<TemplateArgument> template_arguments() const { 5585 return {getArgs(), getNumArgs()}; 5586 } 5587 5588 using iterator = const TemplateArgument *; 5589 5590 iterator begin() const { return getArgs(); } 5591 iterator end() const; // inline in TemplateBase.h 5592 5593 bool isSugared() const { return false; } 5594 QualType desugar() const { return QualType(this, 0); } 5595 5596 void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context) { 5597 Profile(ID, Context, getKeyword(), NNS, Name, {getArgs(), getNumArgs()}); 5598 } 5599 5600 static void Profile(llvm::FoldingSetNodeID &ID, 5601 const ASTContext &Context, 5602 ElaboratedTypeKeyword Keyword, 5603 NestedNameSpecifier *Qualifier, 5604 const IdentifierInfo *Name, 5605 ArrayRef<TemplateArgument> Args); 5606 5607 static bool classof(const Type *T) { 5608 return T->getTypeClass() == DependentTemplateSpecialization; 5609 } 5610 }; 5611 5612 /// Represents a pack expansion of types. 5613 /// 5614 /// Pack expansions are part of C++11 variadic templates. A pack 5615 /// expansion contains a pattern, which itself contains one or more 5616 /// "unexpanded" parameter packs. When instantiated, a pack expansion 5617 /// produces a series of types, each instantiated from the pattern of 5618 /// the expansion, where the Ith instantiation of the pattern uses the 5619 /// Ith arguments bound to each of the unexpanded parameter packs. The 5620 /// pack expansion is considered to "expand" these unexpanded 5621 /// parameter packs. 5622 /// 5623 /// \code 5624 /// template<typename ...Types> struct tuple; 5625 /// 5626 /// template<typename ...Types> 5627 /// struct tuple_of_references { 5628 /// typedef tuple<Types&...> type; 5629 /// }; 5630 /// \endcode 5631 /// 5632 /// Here, the pack expansion \c Types&... is represented via a 5633 /// PackExpansionType whose pattern is Types&. 5634 class PackExpansionType : public Type, public llvm::FoldingSetNode { 5635 friend class ASTContext; // ASTContext creates these 5636 5637 /// The pattern of the pack expansion. 5638 QualType Pattern; 5639 5640 PackExpansionType(QualType Pattern, QualType Canon, 5641 Optional<unsigned> NumExpansions) 5642 : Type(PackExpansion, Canon, 5643 (Pattern->getDependence() | TypeDependence::Dependent | 5644 TypeDependence::Instantiation) & 5645 ~TypeDependence::UnexpandedPack), 5646 Pattern(Pattern) { 5647 PackExpansionTypeBits.NumExpansions = 5648 NumExpansions ? *NumExpansions + 1 : 0; 5649 } 5650 5651 public: 5652 /// Retrieve the pattern of this pack expansion, which is the 5653 /// type that will be repeatedly instantiated when instantiating the 5654 /// pack expansion itself. 5655 QualType getPattern() const { return Pattern; } 5656 5657 /// Retrieve the number of expansions that this pack expansion will 5658 /// generate, if known. 5659 Optional<unsigned> getNumExpansions() const { 5660 if (PackExpansionTypeBits.NumExpansions) 5661 return PackExpansionTypeBits.NumExpansions - 1; 5662 return None; 5663 } 5664 5665 bool isSugared() const { return false; } 5666 QualType desugar() const { return QualType(this, 0); } 5667 5668 void Profile(llvm::FoldingSetNodeID &ID) { 5669 Profile(ID, getPattern(), getNumExpansions()); 5670 } 5671 5672 static void Profile(llvm::FoldingSetNodeID &ID, QualType Pattern, 5673 Optional<unsigned> NumExpansions) { 5674 ID.AddPointer(Pattern.getAsOpaquePtr()); 5675 ID.AddBoolean(NumExpansions.hasValue()); 5676 if (NumExpansions) 5677 ID.AddInteger(*NumExpansions); 5678 } 5679 5680 static bool classof(const Type *T) { 5681 return T->getTypeClass() == PackExpansion; 5682 } 5683 }; 5684 5685 /// This class wraps the list of protocol qualifiers. For types that can 5686 /// take ObjC protocol qualifers, they can subclass this class. 5687 template <class T> 5688 class ObjCProtocolQualifiers { 5689 protected: 5690 ObjCProtocolQualifiers() = default; 5691 5692 ObjCProtocolDecl * const *getProtocolStorage() const { 5693 return const_cast<ObjCProtocolQualifiers*>(this)->getProtocolStorage(); 5694 } 5695 5696 ObjCProtocolDecl **getProtocolStorage() { 5697 return static_cast<T*>(this)->getProtocolStorageImpl(); 5698 } 5699 5700 void setNumProtocols(unsigned N) { 5701 static_cast<T*>(this)->setNumProtocolsImpl(N); 5702 } 5703 5704 void initialize(ArrayRef<ObjCProtocolDecl *> protocols) { 5705 setNumProtocols(protocols.size()); 5706 assert(getNumProtocols() == protocols.size() && 5707 "bitfield overflow in protocol count"); 5708 if (!protocols.empty()) 5709 memcpy(getProtocolStorage(), protocols.data(), 5710 protocols.size() * sizeof(ObjCProtocolDecl*)); 5711 } 5712 5713 public: 5714 using qual_iterator = ObjCProtocolDecl * const *; 5715 using qual_range = llvm::iterator_range<qual_iterator>; 5716 5717 qual_range quals() const { return qual_range(qual_begin(), qual_end()); } 5718 qual_iterator qual_begin() const { return getProtocolStorage(); } 5719 qual_iterator qual_end() const { return qual_begin() + getNumProtocols(); } 5720 5721 bool qual_empty() const { return getNumProtocols() == 0; } 5722 5723 /// Return the number of qualifying protocols in this type, or 0 if 5724 /// there are none. 5725 unsigned getNumProtocols() const { 5726 return static_cast<const T*>(this)->getNumProtocolsImpl(); 5727 } 5728 5729 /// Fetch a protocol by index. 5730 ObjCProtocolDecl *getProtocol(unsigned I) const { 5731 assert(I < getNumProtocols() && "Out-of-range protocol access"); 5732 return qual_begin()[I]; 5733 } 5734 5735 /// Retrieve all of the protocol qualifiers. 5736 ArrayRef<ObjCProtocolDecl *> getProtocols() const { 5737 return ArrayRef<ObjCProtocolDecl *>(qual_begin(), getNumProtocols()); 5738 } 5739 }; 5740 5741 /// Represents a type parameter type in Objective C. It can take 5742 /// a list of protocols. 5743 class ObjCTypeParamType : public Type, 5744 public ObjCProtocolQualifiers<ObjCTypeParamType>, 5745 public llvm::FoldingSetNode { 5746 friend class ASTContext; 5747 friend class ObjCProtocolQualifiers<ObjCTypeParamType>; 5748 5749 /// The number of protocols stored on this type. 5750 unsigned NumProtocols : 6; 5751 5752 ObjCTypeParamDecl *OTPDecl; 5753 5754 /// The protocols are stored after the ObjCTypeParamType node. In the 5755 /// canonical type, the list of protocols are sorted alphabetically 5756 /// and uniqued. 5757 ObjCProtocolDecl **getProtocolStorageImpl(); 5758 5759 /// Return the number of qualifying protocols in this interface type, 5760 /// or 0 if there are none. 5761 unsigned getNumProtocolsImpl() const { 5762 return NumProtocols; 5763 } 5764 5765 void setNumProtocolsImpl(unsigned N) { 5766 NumProtocols = N; 5767 } 5768 5769 ObjCTypeParamType(const ObjCTypeParamDecl *D, 5770 QualType can, 5771 ArrayRef<ObjCProtocolDecl *> protocols); 5772 5773 public: 5774 bool isSugared() const { return true; } 5775 QualType desugar() const { return getCanonicalTypeInternal(); } 5776 5777 static bool classof(const Type *T) { 5778 return T->getTypeClass() == ObjCTypeParam; 5779 } 5780 5781 void Profile(llvm::FoldingSetNodeID &ID); 5782 static void Profile(llvm::FoldingSetNodeID &ID, 5783 const ObjCTypeParamDecl *OTPDecl, 5784 QualType CanonicalType, 5785 ArrayRef<ObjCProtocolDecl *> protocols); 5786 5787 ObjCTypeParamDecl *getDecl() const { return OTPDecl; } 5788 }; 5789 5790 /// Represents a class type in Objective C. 5791 /// 5792 /// Every Objective C type is a combination of a base type, a set of 5793 /// type arguments (optional, for parameterized classes) and a list of 5794 /// protocols. 5795 /// 5796 /// Given the following declarations: 5797 /// \code 5798 /// \@class C<T>; 5799 /// \@protocol P; 5800 /// \endcode 5801 /// 5802 /// 'C' is an ObjCInterfaceType C. It is sugar for an ObjCObjectType 5803 /// with base C and no protocols. 5804 /// 5805 /// 'C<P>' is an unspecialized ObjCObjectType with base C and protocol list [P]. 5806 /// 'C<C*>' is a specialized ObjCObjectType with type arguments 'C*' and no 5807 /// protocol list. 5808 /// 'C<C*><P>' is a specialized ObjCObjectType with base C, type arguments 'C*', 5809 /// and protocol list [P]. 5810 /// 5811 /// 'id' is a TypedefType which is sugar for an ObjCObjectPointerType whose 5812 /// pointee is an ObjCObjectType with base BuiltinType::ObjCIdType 5813 /// and no protocols. 5814 /// 5815 /// 'id<P>' is an ObjCObjectPointerType whose pointee is an ObjCObjectType 5816 /// with base BuiltinType::ObjCIdType and protocol list [P]. Eventually 5817 /// this should get its own sugar class to better represent the source. 5818 class ObjCObjectType : public Type, 5819 public ObjCProtocolQualifiers<ObjCObjectType> { 5820 friend class ObjCProtocolQualifiers<ObjCObjectType>; 5821 5822 // ObjCObjectType.NumTypeArgs - the number of type arguments stored 5823 // after the ObjCObjectPointerType node. 5824 // ObjCObjectType.NumProtocols - the number of protocols stored 5825 // after the type arguments of ObjCObjectPointerType node. 5826 // 5827 // These protocols are those written directly on the type. If 5828 // protocol qualifiers ever become additive, the iterators will need 5829 // to get kindof complicated. 5830 // 5831 // In the canonical object type, these are sorted alphabetically 5832 // and uniqued. 5833 5834 /// Either a BuiltinType or an InterfaceType or sugar for either. 5835 QualType BaseType; 5836 5837 /// Cached superclass type. 5838 mutable llvm::PointerIntPair<const ObjCObjectType *, 1, bool> 5839 CachedSuperClassType; 5840 5841 QualType *getTypeArgStorage(); 5842 const QualType *getTypeArgStorage() const { 5843 return const_cast<ObjCObjectType *>(this)->getTypeArgStorage(); 5844 } 5845 5846 ObjCProtocolDecl **getProtocolStorageImpl(); 5847 /// Return the number of qualifying protocols in this interface type, 5848 /// or 0 if there are none. 5849 unsigned getNumProtocolsImpl() const { 5850 return ObjCObjectTypeBits.NumProtocols; 5851 } 5852 void setNumProtocolsImpl(unsigned N) { 5853 ObjCObjectTypeBits.NumProtocols = N; 5854 } 5855 5856 protected: 5857 enum Nonce_ObjCInterface { Nonce_ObjCInterface }; 5858 5859 ObjCObjectType(QualType Canonical, QualType Base, 5860 ArrayRef<QualType> typeArgs, 5861 ArrayRef<ObjCProtocolDecl *> protocols, 5862 bool isKindOf); 5863 5864 ObjCObjectType(enum Nonce_ObjCInterface) 5865 : Type(ObjCInterface, QualType(), TypeDependence::None), 5866 BaseType(QualType(this_(), 0)) { 5867 ObjCObjectTypeBits.NumProtocols = 0; 5868 ObjCObjectTypeBits.NumTypeArgs = 0; 5869 ObjCObjectTypeBits.IsKindOf = 0; 5870 } 5871 5872 void computeSuperClassTypeSlow() const; 5873 5874 public: 5875 /// Gets the base type of this object type. This is always (possibly 5876 /// sugar for) one of: 5877 /// - the 'id' builtin type (as opposed to the 'id' type visible to the 5878 /// user, which is a typedef for an ObjCObjectPointerType) 5879 /// - the 'Class' builtin type (same caveat) 5880 /// - an ObjCObjectType (currently always an ObjCInterfaceType) 5881 QualType getBaseType() const { return BaseType; } 5882 5883 bool isObjCId() const { 5884 return getBaseType()->isSpecificBuiltinType(BuiltinType::ObjCId); 5885 } 5886 5887 bool isObjCClass() const { 5888 return getBaseType()->isSpecificBuiltinType(BuiltinType::ObjCClass); 5889 } 5890 5891 bool isObjCUnqualifiedId() const { return qual_empty() && isObjCId(); } 5892 bool isObjCUnqualifiedClass() const { return qual_empty() && isObjCClass(); } 5893 bool isObjCUnqualifiedIdOrClass() const { 5894 if (!qual_empty()) return false; 5895 if (const BuiltinType *T = getBaseType()->getAs<BuiltinType>()) 5896 return T->getKind() == BuiltinType::ObjCId || 5897 T->getKind() == BuiltinType::ObjCClass; 5898 return false; 5899 } 5900 bool isObjCQualifiedId() const { return !qual_empty() && isObjCId(); } 5901 bool isObjCQualifiedClass() const { return !qual_empty() && isObjCClass(); } 5902 5903 /// Gets the interface declaration for this object type, if the base type 5904 /// really is an interface. 5905 ObjCInterfaceDecl *getInterface() const; 5906 5907 /// Determine whether this object type is "specialized", meaning 5908 /// that it has type arguments. 5909 bool isSpecialized() const; 5910 5911 /// Determine whether this object type was written with type arguments. 5912 bool isSpecializedAsWritten() const { 5913 return ObjCObjectTypeBits.NumTypeArgs > 0; 5914 } 5915 5916 /// Determine whether this object type is "unspecialized", meaning 5917 /// that it has no type arguments. 5918 bool isUnspecialized() const { return !isSpecialized(); } 5919 5920 /// Determine whether this object type is "unspecialized" as 5921 /// written, meaning that it has no type arguments. 5922 bool isUnspecializedAsWritten() const { return !isSpecializedAsWritten(); } 5923 5924 /// Retrieve the type arguments of this object type (semantically). 5925 ArrayRef<QualType> getTypeArgs() const; 5926 5927 /// Retrieve the type arguments of this object type as they were 5928 /// written. 5929 ArrayRef<QualType> getTypeArgsAsWritten() const { 5930 return llvm::makeArrayRef(getTypeArgStorage(), 5931 ObjCObjectTypeBits.NumTypeArgs); 5932 } 5933 5934 /// Whether this is a "__kindof" type as written. 5935 bool isKindOfTypeAsWritten() const { return ObjCObjectTypeBits.IsKindOf; } 5936 5937 /// Whether this ia a "__kindof" type (semantically). 5938 bool isKindOfType() const; 5939 5940 /// Retrieve the type of the superclass of this object type. 5941 /// 5942 /// This operation substitutes any type arguments into the 5943 /// superclass of the current class type, potentially producing a 5944 /// specialization of the superclass type. Produces a null type if 5945 /// there is no superclass. 5946 QualType getSuperClassType() const { 5947 if (!CachedSuperClassType.getInt()) 5948 computeSuperClassTypeSlow(); 5949 5950 assert(CachedSuperClassType.getInt() && "Superclass not set?"); 5951 return QualType(CachedSuperClassType.getPointer(), 0); 5952 } 5953 5954 /// Strip off the Objective-C "kindof" type and (with it) any 5955 /// protocol qualifiers. 5956 QualType stripObjCKindOfTypeAndQuals(const ASTContext &ctx) const; 5957 5958 bool isSugared() const { return false; } 5959 QualType desugar() const { return QualType(this, 0); } 5960 5961 static bool classof(const Type *T) { 5962 return T->getTypeClass() == ObjCObject || 5963 T->getTypeClass() == ObjCInterface; 5964 } 5965 }; 5966 5967 /// A class providing a concrete implementation 5968 /// of ObjCObjectType, so as to not increase the footprint of 5969 /// ObjCInterfaceType. Code outside of ASTContext and the core type 5970 /// system should not reference this type. 5971 class ObjCObjectTypeImpl : public ObjCObjectType, public llvm::FoldingSetNode { 5972 friend class ASTContext; 5973 5974 // If anyone adds fields here, ObjCObjectType::getProtocolStorage() 5975 // will need to be modified. 5976 5977 ObjCObjectTypeImpl(QualType Canonical, QualType Base, 5978 ArrayRef<QualType> typeArgs, 5979 ArrayRef<ObjCProtocolDecl *> protocols, 5980 bool isKindOf) 5981 : ObjCObjectType(Canonical, Base, typeArgs, protocols, isKindOf) {} 5982 5983 public: 5984 void Profile(llvm::FoldingSetNodeID &ID); 5985 static void Profile(llvm::FoldingSetNodeID &ID, 5986 QualType Base, 5987 ArrayRef<QualType> typeArgs, 5988 ArrayRef<ObjCProtocolDecl *> protocols, 5989 bool isKindOf); 5990 }; 5991 5992 inline QualType *ObjCObjectType::getTypeArgStorage() { 5993 return reinterpret_cast<QualType *>(static_cast<ObjCObjectTypeImpl*>(this)+1); 5994 } 5995 5996 inline ObjCProtocolDecl **ObjCObjectType::getProtocolStorageImpl() { 5997 return reinterpret_cast<ObjCProtocolDecl**>( 5998 getTypeArgStorage() + ObjCObjectTypeBits.NumTypeArgs); 5999 } 6000 6001 inline ObjCProtocolDecl **ObjCTypeParamType::getProtocolStorageImpl() { 6002 return reinterpret_cast<ObjCProtocolDecl**>( 6003 static_cast<ObjCTypeParamType*>(this)+1); 6004 } 6005 6006 /// Interfaces are the core concept in Objective-C for object oriented design. 6007 /// They basically correspond to C++ classes. There are two kinds of interface 6008 /// types: normal interfaces like `NSString`, and qualified interfaces, which 6009 /// are qualified with a protocol list like `NSString<NSCopyable, NSAmazing>`. 6010 /// 6011 /// ObjCInterfaceType guarantees the following properties when considered 6012 /// as a subtype of its superclass, ObjCObjectType: 6013 /// - There are no protocol qualifiers. To reinforce this, code which 6014 /// tries to invoke the protocol methods via an ObjCInterfaceType will 6015 /// fail to compile. 6016 /// - It is its own base type. That is, if T is an ObjCInterfaceType*, 6017 /// T->getBaseType() == QualType(T, 0). 6018 class ObjCInterfaceType : public ObjCObjectType { 6019 friend class ASTContext; // ASTContext creates these. 6020 friend class ASTReader; 6021 friend class ObjCInterfaceDecl; 6022 template <class T> friend class serialization::AbstractTypeReader; 6023 6024 mutable ObjCInterfaceDecl *Decl; 6025 6026 ObjCInterfaceType(const ObjCInterfaceDecl *D) 6027 : ObjCObjectType(Nonce_ObjCInterface), 6028 Decl(const_cast<ObjCInterfaceDecl*>(D)) {} 6029 6030 public: 6031 /// Get the declaration of this interface. 6032 ObjCInterfaceDecl *getDecl() const { return Decl; } 6033 6034 bool isSugared() const { return false; } 6035 QualType desugar() const { return QualType(this, 0); } 6036 6037 static bool classof(const Type *T) { 6038 return T->getTypeClass() == ObjCInterface; 6039 } 6040 6041 // Nonsense to "hide" certain members of ObjCObjectType within this 6042 // class. People asking for protocols on an ObjCInterfaceType are 6043 // not going to get what they want: ObjCInterfaceTypes are 6044 // guaranteed to have no protocols. 6045 enum { 6046 qual_iterator, 6047 qual_begin, 6048 qual_end, 6049 getNumProtocols, 6050 getProtocol 6051 }; 6052 }; 6053 6054 inline ObjCInterfaceDecl *ObjCObjectType::getInterface() const { 6055 QualType baseType = getBaseType(); 6056 while (const auto *ObjT = baseType->getAs<ObjCObjectType>()) { 6057 if (const auto *T = dyn_cast<ObjCInterfaceType>(ObjT)) 6058 return T->getDecl(); 6059 6060 baseType = ObjT->getBaseType(); 6061 } 6062 6063 return nullptr; 6064 } 6065 6066 /// Represents a pointer to an Objective C object. 6067 /// 6068 /// These are constructed from pointer declarators when the pointee type is 6069 /// an ObjCObjectType (or sugar for one). In addition, the 'id' and 'Class' 6070 /// types are typedefs for these, and the protocol-qualified types 'id<P>' 6071 /// and 'Class<P>' are translated into these. 6072 /// 6073 /// Pointers to pointers to Objective C objects are still PointerTypes; 6074 /// only the first level of pointer gets it own type implementation. 6075 class ObjCObjectPointerType : public Type, public llvm::FoldingSetNode { 6076 friend class ASTContext; // ASTContext creates these. 6077 6078 QualType PointeeType; 6079 6080 ObjCObjectPointerType(QualType Canonical, QualType Pointee) 6081 : Type(ObjCObjectPointer, Canonical, Pointee->getDependence()), 6082 PointeeType(Pointee) {} 6083 6084 public: 6085 /// Gets the type pointed to by this ObjC pointer. 6086 /// The result will always be an ObjCObjectType or sugar thereof. 6087 QualType getPointeeType() const { return PointeeType; } 6088 6089 /// Gets the type pointed to by this ObjC pointer. Always returns non-null. 6090 /// 6091 /// This method is equivalent to getPointeeType() except that 6092 /// it discards any typedefs (or other sugar) between this 6093 /// type and the "outermost" object type. So for: 6094 /// \code 6095 /// \@class A; \@protocol P; \@protocol Q; 6096 /// typedef A<P> AP; 6097 /// typedef A A1; 6098 /// typedef A1<P> A1P; 6099 /// typedef A1P<Q> A1PQ; 6100 /// \endcode 6101 /// For 'A*', getObjectType() will return 'A'. 6102 /// For 'A<P>*', getObjectType() will return 'A<P>'. 6103 /// For 'AP*', getObjectType() will return 'A<P>'. 6104 /// For 'A1*', getObjectType() will return 'A'. 6105 /// For 'A1<P>*', getObjectType() will return 'A1<P>'. 6106 /// For 'A1P*', getObjectType() will return 'A1<P>'. 6107 /// For 'A1PQ*', getObjectType() will return 'A1<Q>', because 6108 /// adding protocols to a protocol-qualified base discards the 6109 /// old qualifiers (for now). But if it didn't, getObjectType() 6110 /// would return 'A1P<Q>' (and we'd have to make iterating over 6111 /// qualifiers more complicated). 6112 const ObjCObjectType *getObjectType() const { 6113 return PointeeType->castAs<ObjCObjectType>(); 6114 } 6115 6116 /// If this pointer points to an Objective C 6117 /// \@interface type, gets the type for that interface. Any protocol 6118 /// qualifiers on the interface are ignored. 6119 /// 6120 /// \return null if the base type for this pointer is 'id' or 'Class' 6121 const ObjCInterfaceType *getInterfaceType() const; 6122 6123 /// If this pointer points to an Objective \@interface 6124 /// type, gets the declaration for that interface. 6125 /// 6126 /// \return null if the base type for this pointer is 'id' or 'Class' 6127 ObjCInterfaceDecl *getInterfaceDecl() const { 6128 return getObjectType()->getInterface(); 6129 } 6130 6131 /// True if this is equivalent to the 'id' type, i.e. if 6132 /// its object type is the primitive 'id' type with no protocols. 6133 bool isObjCIdType() const { 6134 return getObjectType()->isObjCUnqualifiedId(); 6135 } 6136 6137 /// True if this is equivalent to the 'Class' type, 6138 /// i.e. if its object tive is the primitive 'Class' type with no protocols. 6139 bool isObjCClassType() const { 6140 return getObjectType()->isObjCUnqualifiedClass(); 6141 } 6142 6143 /// True if this is equivalent to the 'id' or 'Class' type, 6144 bool isObjCIdOrClassType() const { 6145 return getObjectType()->isObjCUnqualifiedIdOrClass(); 6146 } 6147 6148 /// True if this is equivalent to 'id<P>' for some non-empty set of 6149 /// protocols. 6150 bool isObjCQualifiedIdType() const { 6151 return getObjectType()->isObjCQualifiedId(); 6152 } 6153 6154 /// True if this is equivalent to 'Class<P>' for some non-empty set of 6155 /// protocols. 6156 bool isObjCQualifiedClassType() const { 6157 return getObjectType()->isObjCQualifiedClass(); 6158 } 6159 6160 /// Whether this is a "__kindof" type. 6161 bool isKindOfType() const { return getObjectType()->isKindOfType(); } 6162 6163 /// Whether this type is specialized, meaning that it has type arguments. 6164 bool isSpecialized() const { return getObjectType()->isSpecialized(); } 6165 6166 /// Whether this type is specialized, meaning that it has type arguments. 6167 bool isSpecializedAsWritten() const { 6168 return getObjectType()->isSpecializedAsWritten(); 6169 } 6170 6171 /// Whether this type is unspecialized, meaning that is has no type arguments. 6172 bool isUnspecialized() const { return getObjectType()->isUnspecialized(); } 6173 6174 /// Determine whether this object type is "unspecialized" as 6175 /// written, meaning that it has no type arguments. 6176 bool isUnspecializedAsWritten() const { return !isSpecializedAsWritten(); } 6177 6178 /// Retrieve the type arguments for this type. 6179 ArrayRef<QualType> getTypeArgs() const { 6180 return getObjectType()->getTypeArgs(); 6181 } 6182 6183 /// Retrieve the type arguments for this type. 6184 ArrayRef<QualType> getTypeArgsAsWritten() const { 6185 return getObjectType()->getTypeArgsAsWritten(); 6186 } 6187 6188 /// An iterator over the qualifiers on the object type. Provided 6189 /// for convenience. This will always iterate over the full set of 6190 /// protocols on a type, not just those provided directly. 6191 using qual_iterator = ObjCObjectType::qual_iterator; 6192 using qual_range = llvm::iterator_range<qual_iterator>; 6193 6194 qual_range quals() const { return qual_range(qual_begin(), qual_end()); } 6195 6196 qual_iterator qual_begin() const { 6197 return getObjectType()->qual_begin(); 6198 } 6199 6200 qual_iterator qual_end() const { 6201 return getObjectType()->qual_end(); 6202 } 6203 6204 bool qual_empty() const { return getObjectType()->qual_empty(); } 6205 6206 /// Return the number of qualifying protocols on the object type. 6207 unsigned getNumProtocols() const { 6208 return getObjectType()->getNumProtocols(); 6209 } 6210 6211 /// Retrieve a qualifying protocol by index on the object type. 6212 ObjCProtocolDecl *getProtocol(unsigned I) const { 6213 return getObjectType()->getProtocol(I); 6214 } 6215 6216 bool isSugared() const { return false; } 6217 QualType desugar() const { return QualType(this, 0); } 6218 6219 /// Retrieve the type of the superclass of this object pointer type. 6220 /// 6221 /// This operation substitutes any type arguments into the 6222 /// superclass of the current class type, potentially producing a 6223 /// pointer to a specialization of the superclass type. Produces a 6224 /// null type if there is no superclass. 6225 QualType getSuperClassType() const; 6226 6227 /// Strip off the Objective-C "kindof" type and (with it) any 6228 /// protocol qualifiers. 6229 const ObjCObjectPointerType *stripObjCKindOfTypeAndQuals( 6230 const ASTContext &ctx) const; 6231 6232 void Profile(llvm::FoldingSetNodeID &ID) { 6233 Profile(ID, getPointeeType()); 6234 } 6235 6236 static void Profile(llvm::FoldingSetNodeID &ID, QualType T) { 6237 ID.AddPointer(T.getAsOpaquePtr()); 6238 } 6239 6240 static bool classof(const Type *T) { 6241 return T->getTypeClass() == ObjCObjectPointer; 6242 } 6243 }; 6244 6245 class AtomicType : public Type, public llvm::FoldingSetNode { 6246 friend class ASTContext; // ASTContext creates these. 6247 6248 QualType ValueType; 6249 6250 AtomicType(QualType ValTy, QualType Canonical) 6251 : Type(Atomic, Canonical, ValTy->getDependence()), ValueType(ValTy) {} 6252 6253 public: 6254 /// Gets the type contained by this atomic type, i.e. 6255 /// the type returned by performing an atomic load of this atomic type. 6256 QualType getValueType() const { return ValueType; } 6257 6258 bool isSugared() const { return false; } 6259 QualType desugar() const { return QualType(this, 0); } 6260 6261 void Profile(llvm::FoldingSetNodeID &ID) { 6262 Profile(ID, getValueType()); 6263 } 6264 6265 static void Profile(llvm::FoldingSetNodeID &ID, QualType T) { 6266 ID.AddPointer(T.getAsOpaquePtr()); 6267 } 6268 6269 static bool classof(const Type *T) { 6270 return T->getTypeClass() == Atomic; 6271 } 6272 }; 6273 6274 /// PipeType - OpenCL20. 6275 class PipeType : public Type, public llvm::FoldingSetNode { 6276 friend class ASTContext; // ASTContext creates these. 6277 6278 QualType ElementType; 6279 bool isRead; 6280 6281 PipeType(QualType elemType, QualType CanonicalPtr, bool isRead) 6282 : Type(Pipe, CanonicalPtr, elemType->getDependence()), 6283 ElementType(elemType), isRead(isRead) {} 6284 6285 public: 6286 QualType getElementType() const { return ElementType; } 6287 6288 bool isSugared() const { return false; } 6289 6290 QualType desugar() const { return QualType(this, 0); } 6291 6292 void Profile(llvm::FoldingSetNodeID &ID) { 6293 Profile(ID, getElementType(), isReadOnly()); 6294 } 6295 6296 static void Profile(llvm::FoldingSetNodeID &ID, QualType T, bool isRead) { 6297 ID.AddPointer(T.getAsOpaquePtr()); 6298 ID.AddBoolean(isRead); 6299 } 6300 6301 static bool classof(const Type *T) { 6302 return T->getTypeClass() == Pipe; 6303 } 6304 6305 bool isReadOnly() const { return isRead; } 6306 }; 6307 6308 /// A fixed int type of a specified bitwidth. 6309 class ExtIntType final : public Type, public llvm::FoldingSetNode { 6310 friend class ASTContext; 6311 unsigned IsUnsigned : 1; 6312 unsigned NumBits : 24; 6313 6314 protected: 6315 ExtIntType(bool isUnsigned, unsigned NumBits); 6316 6317 public: 6318 bool isUnsigned() const { return IsUnsigned; } 6319 bool isSigned() const { return !IsUnsigned; } 6320 unsigned getNumBits() const { return NumBits; } 6321 6322 bool isSugared() const { return false; } 6323 QualType desugar() const { return QualType(this, 0); } 6324 6325 void Profile(llvm::FoldingSetNodeID &ID) { 6326 Profile(ID, isUnsigned(), getNumBits()); 6327 } 6328 6329 static void Profile(llvm::FoldingSetNodeID &ID, bool IsUnsigned, 6330 unsigned NumBits) { 6331 ID.AddBoolean(IsUnsigned); 6332 ID.AddInteger(NumBits); 6333 } 6334 6335 static bool classof(const Type *T) { return T->getTypeClass() == ExtInt; } 6336 }; 6337 6338 class DependentExtIntType final : public Type, public llvm::FoldingSetNode { 6339 friend class ASTContext; 6340 const ASTContext &Context; 6341 llvm::PointerIntPair<Expr*, 1, bool> ExprAndUnsigned; 6342 6343 protected: 6344 DependentExtIntType(const ASTContext &Context, bool IsUnsigned, 6345 Expr *NumBits); 6346 6347 public: 6348 bool isUnsigned() const; 6349 bool isSigned() const { return !isUnsigned(); } 6350 Expr *getNumBitsExpr() const; 6351 6352 bool isSugared() const { return false; } 6353 QualType desugar() const { return QualType(this, 0); } 6354 6355 void Profile(llvm::FoldingSetNodeID &ID) { 6356 Profile(ID, Context, isUnsigned(), getNumBitsExpr()); 6357 } 6358 static void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context, 6359 bool IsUnsigned, Expr *NumBitsExpr); 6360 6361 static bool classof(const Type *T) { 6362 return T->getTypeClass() == DependentExtInt; 6363 } 6364 }; 6365 6366 /// A qualifier set is used to build a set of qualifiers. 6367 class QualifierCollector : public Qualifiers { 6368 public: 6369 QualifierCollector(Qualifiers Qs = Qualifiers()) : Qualifiers(Qs) {} 6370 6371 /// Collect any qualifiers on the given type and return an 6372 /// unqualified type. The qualifiers are assumed to be consistent 6373 /// with those already in the type. 6374 const Type *strip(QualType type) { 6375 addFastQualifiers(type.getLocalFastQualifiers()); 6376 if (!type.hasLocalNonFastQualifiers()) 6377 return type.getTypePtrUnsafe(); 6378 6379 const ExtQuals *extQuals = type.getExtQualsUnsafe(); 6380 addConsistentQualifiers(extQuals->getQualifiers()); 6381 return extQuals->getBaseType(); 6382 } 6383 6384 /// Apply the collected qualifiers to the given type. 6385 QualType apply(const ASTContext &Context, QualType QT) const; 6386 6387 /// Apply the collected qualifiers to the given type. 6388 QualType apply(const ASTContext &Context, const Type* T) const; 6389 }; 6390 6391 /// A container of type source information. 6392 /// 6393 /// A client can read the relevant info using TypeLoc wrappers, e.g: 6394 /// @code 6395 /// TypeLoc TL = TypeSourceInfo->getTypeLoc(); 6396 /// TL.getBeginLoc().print(OS, SrcMgr); 6397 /// @endcode 6398 class alignas(8) TypeSourceInfo { 6399 // Contains a memory block after the class, used for type source information, 6400 // allocated by ASTContext. 6401 friend class ASTContext; 6402 6403 QualType Ty; 6404 6405 TypeSourceInfo(QualType ty) : Ty(ty) {} 6406 6407 public: 6408 /// Return the type wrapped by this type source info. 6409 QualType getType() const { return Ty; } 6410 6411 /// Return the TypeLoc wrapper for the type source info. 6412 TypeLoc getTypeLoc() const; // implemented in TypeLoc.h 6413 6414 /// Override the type stored in this TypeSourceInfo. Use with caution! 6415 void overrideType(QualType T) { Ty = T; } 6416 }; 6417 6418 // Inline function definitions. 6419 6420 inline SplitQualType SplitQualType::getSingleStepDesugaredType() const { 6421 SplitQualType desugar = 6422 Ty->getLocallyUnqualifiedSingleStepDesugaredType().split(); 6423 desugar.Quals.addConsistentQualifiers(Quals); 6424 return desugar; 6425 } 6426 6427 inline const Type *QualType::getTypePtr() const { 6428 return getCommonPtr()->BaseType; 6429 } 6430 6431 inline const Type *QualType::getTypePtrOrNull() const { 6432 return (isNull() ? nullptr : getCommonPtr()->BaseType); 6433 } 6434 6435 inline SplitQualType QualType::split() const { 6436 if (!hasLocalNonFastQualifiers()) 6437 return SplitQualType(getTypePtrUnsafe(), 6438 Qualifiers::fromFastMask(getLocalFastQualifiers())); 6439 6440 const ExtQuals *eq = getExtQualsUnsafe(); 6441 Qualifiers qs = eq->getQualifiers(); 6442 qs.addFastQualifiers(getLocalFastQualifiers()); 6443 return SplitQualType(eq->getBaseType(), qs); 6444 } 6445 6446 inline Qualifiers QualType::getLocalQualifiers() const { 6447 Qualifiers Quals; 6448 if (hasLocalNonFastQualifiers()) 6449 Quals = getExtQualsUnsafe()->getQualifiers(); 6450 Quals.addFastQualifiers(getLocalFastQualifiers()); 6451 return Quals; 6452 } 6453 6454 inline Qualifiers QualType::getQualifiers() const { 6455 Qualifiers quals = getCommonPtr()->CanonicalType.getLocalQualifiers(); 6456 quals.addFastQualifiers(getLocalFastQualifiers()); 6457 return quals; 6458 } 6459 6460 inline unsigned QualType::getCVRQualifiers() const { 6461 unsigned cvr = getCommonPtr()->CanonicalType.getLocalCVRQualifiers(); 6462 cvr |= getLocalCVRQualifiers(); 6463 return cvr; 6464 } 6465 6466 inline QualType QualType::getCanonicalType() const { 6467 QualType canon = getCommonPtr()->CanonicalType; 6468 return canon.withFastQualifiers(getLocalFastQualifiers()); 6469 } 6470 6471 inline bool QualType::isCanonical() const { 6472 return getTypePtr()->isCanonicalUnqualified(); 6473 } 6474 6475 inline bool QualType::isCanonicalAsParam() const { 6476 if (!isCanonical()) return false; 6477 if (hasLocalQualifiers()) return false; 6478 6479 const Type *T = getTypePtr(); 6480 if (T->isVariablyModifiedType() && T->hasSizedVLAType()) 6481 return false; 6482 6483 return !isa<FunctionType>(T) && !isa<ArrayType>(T); 6484 } 6485 6486 inline bool QualType::isConstQualified() const { 6487 return isLocalConstQualified() || 6488 getCommonPtr()->CanonicalType.isLocalConstQualified(); 6489 } 6490 6491 inline bool QualType::isRestrictQualified() const { 6492 return isLocalRestrictQualified() || 6493 getCommonPtr()->CanonicalType.isLocalRestrictQualified(); 6494 } 6495 6496 6497 inline bool QualType::isVolatileQualified() const { 6498 return isLocalVolatileQualified() || 6499 getCommonPtr()->CanonicalType.isLocalVolatileQualified(); 6500 } 6501 6502 inline bool QualType::hasQualifiers() const { 6503 return hasLocalQualifiers() || 6504 getCommonPtr()->CanonicalType.hasLocalQualifiers(); 6505 } 6506 6507 inline QualType QualType::getUnqualifiedType() const { 6508 if (!getTypePtr()->getCanonicalTypeInternal().hasLocalQualifiers()) 6509 return QualType(getTypePtr(), 0); 6510 6511 return QualType(getSplitUnqualifiedTypeImpl(*this).Ty, 0); 6512 } 6513 6514 inline SplitQualType QualType::getSplitUnqualifiedType() const { 6515 if (!getTypePtr()->getCanonicalTypeInternal().hasLocalQualifiers()) 6516 return split(); 6517 6518 return getSplitUnqualifiedTypeImpl(*this); 6519 } 6520 6521 inline void QualType::removeLocalConst() { 6522 removeLocalFastQualifiers(Qualifiers::Const); 6523 } 6524 6525 inline void QualType::removeLocalRestrict() { 6526 removeLocalFastQualifiers(Qualifiers::Restrict); 6527 } 6528 6529 inline void QualType::removeLocalVolatile() { 6530 removeLocalFastQualifiers(Qualifiers::Volatile); 6531 } 6532 6533 inline void QualType::removeLocalCVRQualifiers(unsigned Mask) { 6534 assert(!(Mask & ~Qualifiers::CVRMask) && "mask has non-CVR bits"); 6535 static_assert((int)Qualifiers::CVRMask == (int)Qualifiers::FastMask, 6536 "Fast bits differ from CVR bits!"); 6537 6538 // Fast path: we don't need to touch the slow qualifiers. 6539 removeLocalFastQualifiers(Mask); 6540 } 6541 6542 /// Check if this type has any address space qualifier. 6543 inline bool QualType::hasAddressSpace() const { 6544 return getQualifiers().hasAddressSpace(); 6545 } 6546 6547 /// Return the address space of this type. 6548 inline LangAS QualType::getAddressSpace() const { 6549 return getQualifiers().getAddressSpace(); 6550 } 6551 6552 /// Return the gc attribute of this type. 6553 inline Qualifiers::GC QualType::getObjCGCAttr() const { 6554 return getQualifiers().getObjCGCAttr(); 6555 } 6556 6557 inline bool QualType::hasNonTrivialToPrimitiveDefaultInitializeCUnion() const { 6558 if (auto *RD = getTypePtr()->getBaseElementTypeUnsafe()->getAsRecordDecl()) 6559 return hasNonTrivialToPrimitiveDefaultInitializeCUnion(RD); 6560 return false; 6561 } 6562 6563 inline bool QualType::hasNonTrivialToPrimitiveDestructCUnion() const { 6564 if (auto *RD = getTypePtr()->getBaseElementTypeUnsafe()->getAsRecordDecl()) 6565 return hasNonTrivialToPrimitiveDestructCUnion(RD); 6566 return false; 6567 } 6568 6569 inline bool QualType::hasNonTrivialToPrimitiveCopyCUnion() const { 6570 if (auto *RD = getTypePtr()->getBaseElementTypeUnsafe()->getAsRecordDecl()) 6571 return hasNonTrivialToPrimitiveCopyCUnion(RD); 6572 return false; 6573 } 6574 6575 inline FunctionType::ExtInfo getFunctionExtInfo(const Type &t) { 6576 if (const auto *PT = t.getAs<PointerType>()) { 6577 if (const auto *FT = PT->getPointeeType()->getAs<FunctionType>()) 6578 return FT->getExtInfo(); 6579 } else if (const auto *FT = t.getAs<FunctionType>()) 6580 return FT->getExtInfo(); 6581 6582 return FunctionType::ExtInfo(); 6583 } 6584 6585 inline FunctionType::ExtInfo getFunctionExtInfo(QualType t) { 6586 return getFunctionExtInfo(*t); 6587 } 6588 6589 /// Determine whether this type is more 6590 /// qualified than the Other type. For example, "const volatile int" 6591 /// is more qualified than "const int", "volatile int", and 6592 /// "int". However, it is not more qualified than "const volatile 6593 /// int". 6594 inline bool QualType::isMoreQualifiedThan(QualType other) const { 6595 Qualifiers MyQuals = getQualifiers(); 6596 Qualifiers OtherQuals = other.getQualifiers(); 6597 return (MyQuals != OtherQuals && MyQuals.compatiblyIncludes(OtherQuals)); 6598 } 6599 6600 /// Determine whether this type is at last 6601 /// as qualified as the Other type. For example, "const volatile 6602 /// int" is at least as qualified as "const int", "volatile int", 6603 /// "int", and "const volatile int". 6604 inline bool QualType::isAtLeastAsQualifiedAs(QualType other) const { 6605 Qualifiers OtherQuals = other.getQualifiers(); 6606 6607 // Ignore __unaligned qualifier if this type is a void. 6608 if (getUnqualifiedType()->isVoidType()) 6609 OtherQuals.removeUnaligned(); 6610 6611 return getQualifiers().compatiblyIncludes(OtherQuals); 6612 } 6613 6614 /// If Type is a reference type (e.g., const 6615 /// int&), returns the type that the reference refers to ("const 6616 /// int"). Otherwise, returns the type itself. This routine is used 6617 /// throughout Sema to implement C++ 5p6: 6618 /// 6619 /// If an expression initially has the type "reference to T" (8.3.2, 6620 /// 8.5.3), the type is adjusted to "T" prior to any further 6621 /// analysis, the expression designates the object or function 6622 /// denoted by the reference, and the expression is an lvalue. 6623 inline QualType QualType::getNonReferenceType() const { 6624 if (const auto *RefType = (*this)->getAs<ReferenceType>()) 6625 return RefType->getPointeeType(); 6626 else 6627 return *this; 6628 } 6629 6630 inline bool QualType::isCForbiddenLValueType() const { 6631 return ((getTypePtr()->isVoidType() && !hasQualifiers()) || 6632 getTypePtr()->isFunctionType()); 6633 } 6634 6635 /// Tests whether the type is categorized as a fundamental type. 6636 /// 6637 /// \returns True for types specified in C++0x [basic.fundamental]. 6638 inline bool Type::isFundamentalType() const { 6639 return isVoidType() || 6640 isNullPtrType() || 6641 // FIXME: It's really annoying that we don't have an 6642 // 'isArithmeticType()' which agrees with the standard definition. 6643 (isArithmeticType() && !isEnumeralType()); 6644 } 6645 6646 /// Tests whether the type is categorized as a compound type. 6647 /// 6648 /// \returns True for types specified in C++0x [basic.compound]. 6649 inline bool Type::isCompoundType() const { 6650 // C++0x [basic.compound]p1: 6651 // Compound types can be constructed in the following ways: 6652 // -- arrays of objects of a given type [...]; 6653 return isArrayType() || 6654 // -- functions, which have parameters of given types [...]; 6655 isFunctionType() || 6656 // -- pointers to void or objects or functions [...]; 6657 isPointerType() || 6658 // -- references to objects or functions of a given type. [...] 6659 isReferenceType() || 6660 // -- classes containing a sequence of objects of various types, [...]; 6661 isRecordType() || 6662 // -- unions, which are classes capable of containing objects of different 6663 // types at different times; 6664 isUnionType() || 6665 // -- enumerations, which comprise a set of named constant values. [...]; 6666 isEnumeralType() || 6667 // -- pointers to non-static class members, [...]. 6668 isMemberPointerType(); 6669 } 6670 6671 inline bool Type::isFunctionType() const { 6672 return isa<FunctionType>(CanonicalType); 6673 } 6674 6675 inline bool Type::isPointerType() const { 6676 return isa<PointerType>(CanonicalType); 6677 } 6678 6679 inline bool Type::isAnyPointerType() const { 6680 return isPointerType() || isObjCObjectPointerType(); 6681 } 6682 6683 inline bool Type::isBlockPointerType() const { 6684 return isa<BlockPointerType>(CanonicalType); 6685 } 6686 6687 inline bool Type::isReferenceType() const { 6688 return isa<ReferenceType>(CanonicalType); 6689 } 6690 6691 inline bool Type::isLValueReferenceType() const { 6692 return isa<LValueReferenceType>(CanonicalType); 6693 } 6694 6695 inline bool Type::isRValueReferenceType() const { 6696 return isa<RValueReferenceType>(CanonicalType); 6697 } 6698 6699 inline bool Type::isObjectPointerType() const { 6700 // Note: an "object pointer type" is not the same thing as a pointer to an 6701 // object type; rather, it is a pointer to an object type or a pointer to cv 6702 // void. 6703 if (const auto *T = getAs<PointerType>()) 6704 return !T->getPointeeType()->isFunctionType(); 6705 else 6706 return false; 6707 } 6708 6709 inline bool Type::isFunctionPointerType() const { 6710 if (const auto *T = getAs<PointerType>()) 6711 return T->getPointeeType()->isFunctionType(); 6712 else 6713 return false; 6714 } 6715 6716 inline bool Type::isFunctionReferenceType() const { 6717 if (const auto *T = getAs<ReferenceType>()) 6718 return T->getPointeeType()->isFunctionType(); 6719 else 6720 return false; 6721 } 6722 6723 inline bool Type::isMemberPointerType() const { 6724 return isa<MemberPointerType>(CanonicalType); 6725 } 6726 6727 inline bool Type::isMemberFunctionPointerType() const { 6728 if (const auto *T = getAs<MemberPointerType>()) 6729 return T->isMemberFunctionPointer(); 6730 else 6731 return false; 6732 } 6733 6734 inline bool Type::isMemberDataPointerType() const { 6735 if (const auto *T = getAs<MemberPointerType>()) 6736 return T->isMemberDataPointer(); 6737 else 6738 return false; 6739 } 6740 6741 inline bool Type::isArrayType() const { 6742 return isa<ArrayType>(CanonicalType); 6743 } 6744 6745 inline bool Type::isConstantArrayType() const { 6746 return isa<ConstantArrayType>(CanonicalType); 6747 } 6748 6749 inline bool Type::isIncompleteArrayType() const { 6750 return isa<IncompleteArrayType>(CanonicalType); 6751 } 6752 6753 inline bool Type::isVariableArrayType() const { 6754 return isa<VariableArrayType>(CanonicalType); 6755 } 6756 6757 inline bool Type::isDependentSizedArrayType() const { 6758 return isa<DependentSizedArrayType>(CanonicalType); 6759 } 6760 6761 inline bool Type::isBuiltinType() const { 6762 return isa<BuiltinType>(CanonicalType); 6763 } 6764 6765 inline bool Type::isRecordType() const { 6766 return isa<RecordType>(CanonicalType); 6767 } 6768 6769 inline bool Type::isEnumeralType() const { 6770 return isa<EnumType>(CanonicalType); 6771 } 6772 6773 inline bool Type::isAnyComplexType() const { 6774 return isa<ComplexType>(CanonicalType); 6775 } 6776 6777 inline bool Type::isVectorType() const { 6778 return isa<VectorType>(CanonicalType); 6779 } 6780 6781 inline bool Type::isExtVectorType() const { 6782 return isa<ExtVectorType>(CanonicalType); 6783 } 6784 6785 inline bool Type::isMatrixType() const { 6786 return isa<MatrixType>(CanonicalType); 6787 } 6788 6789 inline bool Type::isConstantMatrixType() const { 6790 return isa<ConstantMatrixType>(CanonicalType); 6791 } 6792 6793 inline bool Type::isDependentAddressSpaceType() const { 6794 return isa<DependentAddressSpaceType>(CanonicalType); 6795 } 6796 6797 inline bool Type::isObjCObjectPointerType() const { 6798 return isa<ObjCObjectPointerType>(CanonicalType); 6799 } 6800 6801 inline bool Type::isObjCObjectType() const { 6802 return isa<ObjCObjectType>(CanonicalType); 6803 } 6804 6805 inline bool Type::isObjCObjectOrInterfaceType() const { 6806 return isa<ObjCInterfaceType>(CanonicalType) || 6807 isa<ObjCObjectType>(CanonicalType); 6808 } 6809 6810 inline bool Type::isAtomicType() const { 6811 return isa<AtomicType>(CanonicalType); 6812 } 6813 6814 inline bool Type::isUndeducedAutoType() const { 6815 return isa<AutoType>(CanonicalType); 6816 } 6817 6818 inline bool Type::isObjCQualifiedIdType() const { 6819 if (const auto *OPT = getAs<ObjCObjectPointerType>()) 6820 return OPT->isObjCQualifiedIdType(); 6821 return false; 6822 } 6823 6824 inline bool Type::isObjCQualifiedClassType() const { 6825 if (const auto *OPT = getAs<ObjCObjectPointerType>()) 6826 return OPT->isObjCQualifiedClassType(); 6827 return false; 6828 } 6829 6830 inline bool Type::isObjCIdType() const { 6831 if (const auto *OPT = getAs<ObjCObjectPointerType>()) 6832 return OPT->isObjCIdType(); 6833 return false; 6834 } 6835 6836 inline bool Type::isObjCClassType() const { 6837 if (const auto *OPT = getAs<ObjCObjectPointerType>()) 6838 return OPT->isObjCClassType(); 6839 return false; 6840 } 6841 6842 inline bool Type::isObjCSelType() const { 6843 if (const auto *OPT = getAs<PointerType>()) 6844 return OPT->getPointeeType()->isSpecificBuiltinType(BuiltinType::ObjCSel); 6845 return false; 6846 } 6847 6848 inline bool Type::isObjCBuiltinType() const { 6849 return isObjCIdType() || isObjCClassType() || isObjCSelType(); 6850 } 6851 6852 inline bool Type::isDecltypeType() const { 6853 return isa<DecltypeType>(this); 6854 } 6855 6856 #define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \ 6857 inline bool Type::is##Id##Type() const { \ 6858 return isSpecificBuiltinType(BuiltinType::Id); \ 6859 } 6860 #include "clang/Basic/OpenCLImageTypes.def" 6861 6862 inline bool Type::isSamplerT() const { 6863 return isSpecificBuiltinType(BuiltinType::OCLSampler); 6864 } 6865 6866 inline bool Type::isEventT() const { 6867 return isSpecificBuiltinType(BuiltinType::OCLEvent); 6868 } 6869 6870 inline bool Type::isClkEventT() const { 6871 return isSpecificBuiltinType(BuiltinType::OCLClkEvent); 6872 } 6873 6874 inline bool Type::isQueueT() const { 6875 return isSpecificBuiltinType(BuiltinType::OCLQueue); 6876 } 6877 6878 inline bool Type::isReserveIDT() const { 6879 return isSpecificBuiltinType(BuiltinType::OCLReserveID); 6880 } 6881 6882 inline bool Type::isImageType() const { 6883 #define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) is##Id##Type() || 6884 return 6885 #include "clang/Basic/OpenCLImageTypes.def" 6886 false; // end boolean or operation 6887 } 6888 6889 inline bool Type::isPipeType() const { 6890 return isa<PipeType>(CanonicalType); 6891 } 6892 6893 inline bool Type::isExtIntType() const { 6894 return isa<ExtIntType>(CanonicalType); 6895 } 6896 6897 #define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \ 6898 inline bool Type::is##Id##Type() const { \ 6899 return isSpecificBuiltinType(BuiltinType::Id); \ 6900 } 6901 #include "clang/Basic/OpenCLExtensionTypes.def" 6902 6903 inline bool Type::isOCLIntelSubgroupAVCType() const { 6904 #define INTEL_SUBGROUP_AVC_TYPE(ExtType, Id) \ 6905 isOCLIntelSubgroupAVC##Id##Type() || 6906 return 6907 #include "clang/Basic/OpenCLExtensionTypes.def" 6908 false; // end of boolean or operation 6909 } 6910 6911 inline bool Type::isOCLExtOpaqueType() const { 6912 #define EXT_OPAQUE_TYPE(ExtType, Id, Ext) is##Id##Type() || 6913 return 6914 #include "clang/Basic/OpenCLExtensionTypes.def" 6915 false; // end of boolean or operation 6916 } 6917 6918 inline bool Type::isOpenCLSpecificType() const { 6919 return isSamplerT() || isEventT() || isImageType() || isClkEventT() || 6920 isQueueT() || isReserveIDT() || isPipeType() || isOCLExtOpaqueType(); 6921 } 6922 6923 inline bool Type::isTemplateTypeParmType() const { 6924 return isa<TemplateTypeParmType>(CanonicalType); 6925 } 6926 6927 inline bool Type::isSpecificBuiltinType(unsigned K) const { 6928 if (const BuiltinType *BT = getAs<BuiltinType>()) { 6929 return BT->getKind() == static_cast<BuiltinType::Kind>(K); 6930 } 6931 return false; 6932 } 6933 6934 inline bool Type::isPlaceholderType() const { 6935 if (const auto *BT = dyn_cast<BuiltinType>(this)) 6936 return BT->isPlaceholderType(); 6937 return false; 6938 } 6939 6940 inline const BuiltinType *Type::getAsPlaceholderType() const { 6941 if (const auto *BT = dyn_cast<BuiltinType>(this)) 6942 if (BT->isPlaceholderType()) 6943 return BT; 6944 return nullptr; 6945 } 6946 6947 inline bool Type::isSpecificPlaceholderType(unsigned K) const { 6948 assert(BuiltinType::isPlaceholderTypeKind((BuiltinType::Kind) K)); 6949 return isSpecificBuiltinType(K); 6950 } 6951 6952 inline bool Type::isNonOverloadPlaceholderType() const { 6953 if (const auto *BT = dyn_cast<BuiltinType>(this)) 6954 return BT->isNonOverloadPlaceholderType(); 6955 return false; 6956 } 6957 6958 inline bool Type::isVoidType() const { 6959 return isSpecificBuiltinType(BuiltinType::Void); 6960 } 6961 6962 inline bool Type::isHalfType() const { 6963 // FIXME: Should we allow complex __fp16? Probably not. 6964 return isSpecificBuiltinType(BuiltinType::Half); 6965 } 6966 6967 inline bool Type::isFloat16Type() const { 6968 return isSpecificBuiltinType(BuiltinType::Float16); 6969 } 6970 6971 inline bool Type::isBFloat16Type() const { 6972 return isSpecificBuiltinType(BuiltinType::BFloat16); 6973 } 6974 6975 inline bool Type::isFloat128Type() const { 6976 return isSpecificBuiltinType(BuiltinType::Float128); 6977 } 6978 6979 inline bool Type::isNullPtrType() const { 6980 return isSpecificBuiltinType(BuiltinType::NullPtr); 6981 } 6982 6983 bool IsEnumDeclComplete(EnumDecl *); 6984 bool IsEnumDeclScoped(EnumDecl *); 6985 6986 inline bool Type::isIntegerType() const { 6987 if (const auto *BT = dyn_cast<BuiltinType>(CanonicalType)) 6988 return BT->getKind() >= BuiltinType::Bool && 6989 BT->getKind() <= BuiltinType::Int128; 6990 if (const EnumType *ET = dyn_cast<EnumType>(CanonicalType)) { 6991 // Incomplete enum types are not treated as integer types. 6992 // FIXME: In C++, enum types are never integer types. 6993 return IsEnumDeclComplete(ET->getDecl()) && 6994 !IsEnumDeclScoped(ET->getDecl()); 6995 } 6996 return isExtIntType(); 6997 } 6998 6999 inline bool Type::isFixedPointType() const { 7000 if (const auto *BT = dyn_cast<BuiltinType>(CanonicalType)) { 7001 return BT->getKind() >= BuiltinType::ShortAccum && 7002 BT->getKind() <= BuiltinType::SatULongFract; 7003 } 7004 return false; 7005 } 7006 7007 inline bool Type::isFixedPointOrIntegerType() const { 7008 return isFixedPointType() || isIntegerType(); 7009 } 7010 7011 inline bool Type::isSaturatedFixedPointType() const { 7012 if (const auto *BT = dyn_cast<BuiltinType>(CanonicalType)) { 7013 return BT->getKind() >= BuiltinType::SatShortAccum && 7014 BT->getKind() <= BuiltinType::SatULongFract; 7015 } 7016 return false; 7017 } 7018 7019 inline bool Type::isUnsaturatedFixedPointType() const { 7020 return isFixedPointType() && !isSaturatedFixedPointType(); 7021 } 7022 7023 inline bool Type::isSignedFixedPointType() const { 7024 if (const auto *BT = dyn_cast<BuiltinType>(CanonicalType)) { 7025 return ((BT->getKind() >= BuiltinType::ShortAccum && 7026 BT->getKind() <= BuiltinType::LongAccum) || 7027 (BT->getKind() >= BuiltinType::ShortFract && 7028 BT->getKind() <= BuiltinType::LongFract) || 7029 (BT->getKind() >= BuiltinType::SatShortAccum && 7030 BT->getKind() <= BuiltinType::SatLongAccum) || 7031 (BT->getKind() >= BuiltinType::SatShortFract && 7032 BT->getKind() <= BuiltinType::SatLongFract)); 7033 } 7034 return false; 7035 } 7036 7037 inline bool Type::isUnsignedFixedPointType() const { 7038 return isFixedPointType() && !isSignedFixedPointType(); 7039 } 7040 7041 inline bool Type::isScalarType() const { 7042 if (const auto *BT = dyn_cast<BuiltinType>(CanonicalType)) 7043 return BT->getKind() > BuiltinType::Void && 7044 BT->getKind() <= BuiltinType::NullPtr; 7045 if (const EnumType *ET = dyn_cast<EnumType>(CanonicalType)) 7046 // Enums are scalar types, but only if they are defined. Incomplete enums 7047 // are not treated as scalar types. 7048 return IsEnumDeclComplete(ET->getDecl()); 7049 return isa<PointerType>(CanonicalType) || 7050 isa<BlockPointerType>(CanonicalType) || 7051 isa<MemberPointerType>(CanonicalType) || 7052 isa<ComplexType>(CanonicalType) || 7053 isa<ObjCObjectPointerType>(CanonicalType) || 7054 isExtIntType(); 7055 } 7056 7057 inline bool Type::isIntegralOrEnumerationType() const { 7058 if (const auto *BT = dyn_cast<BuiltinType>(CanonicalType)) 7059 return BT->getKind() >= BuiltinType::Bool && 7060 BT->getKind() <= BuiltinType::Int128; 7061 7062 // Check for a complete enum type; incomplete enum types are not properly an 7063 // enumeration type in the sense required here. 7064 if (const auto *ET = dyn_cast<EnumType>(CanonicalType)) 7065 return IsEnumDeclComplete(ET->getDecl()); 7066 7067 return isExtIntType(); 7068 } 7069 7070 inline bool Type::isBooleanType() const { 7071 if (const auto *BT = dyn_cast<BuiltinType>(CanonicalType)) 7072 return BT->getKind() == BuiltinType::Bool; 7073 return false; 7074 } 7075 7076 inline bool Type::isUndeducedType() const { 7077 auto *DT = getContainedDeducedType(); 7078 return DT && !DT->isDeduced(); 7079 } 7080 7081 /// Determines whether this is a type for which one can define 7082 /// an overloaded operator. 7083 inline bool Type::isOverloadableType() const { 7084 return isDependentType() || isRecordType() || isEnumeralType(); 7085 } 7086 7087 /// Determines whether this type is written as a typedef-name. 7088 inline bool Type::isTypedefNameType() const { 7089 if (getAs<TypedefType>()) 7090 return true; 7091 if (auto *TST = getAs<TemplateSpecializationType>()) 7092 return TST->isTypeAlias(); 7093 return false; 7094 } 7095 7096 /// Determines whether this type can decay to a pointer type. 7097 inline bool Type::canDecayToPointerType() const { 7098 return isFunctionType() || isArrayType(); 7099 } 7100 7101 inline bool Type::hasPointerRepresentation() const { 7102 return (isPointerType() || isReferenceType() || isBlockPointerType() || 7103 isObjCObjectPointerType() || isNullPtrType()); 7104 } 7105 7106 inline bool Type::hasObjCPointerRepresentation() const { 7107 return isObjCObjectPointerType(); 7108 } 7109 7110 inline const Type *Type::getBaseElementTypeUnsafe() const { 7111 const Type *type = this; 7112 while (const ArrayType *arrayType = type->getAsArrayTypeUnsafe()) 7113 type = arrayType->getElementType().getTypePtr(); 7114 return type; 7115 } 7116 7117 inline const Type *Type::getPointeeOrArrayElementType() const { 7118 const Type *type = this; 7119 if (type->isAnyPointerType()) 7120 return type->getPointeeType().getTypePtr(); 7121 else if (type->isArrayType()) 7122 return type->getBaseElementTypeUnsafe(); 7123 return type; 7124 } 7125 /// Insertion operator for partial diagnostics. This allows sending adress 7126 /// spaces into a diagnostic with <<. 7127 inline const StreamingDiagnostic &operator<<(const StreamingDiagnostic &PD, 7128 LangAS AS) { 7129 PD.AddTaggedVal(static_cast<std::underlying_type_t<LangAS>>(AS), 7130 DiagnosticsEngine::ArgumentKind::ak_addrspace); 7131 return PD; 7132 } 7133 7134 /// Insertion operator for partial diagnostics. This allows sending Qualifiers 7135 /// into a diagnostic with <<. 7136 inline const StreamingDiagnostic &operator<<(const StreamingDiagnostic &PD, 7137 Qualifiers Q) { 7138 PD.AddTaggedVal(Q.getAsOpaqueValue(), 7139 DiagnosticsEngine::ArgumentKind::ak_qual); 7140 return PD; 7141 } 7142 7143 /// Insertion operator for partial diagnostics. This allows sending QualType's 7144 /// into a diagnostic with <<. 7145 inline const StreamingDiagnostic &operator<<(const StreamingDiagnostic &PD, 7146 QualType T) { 7147 PD.AddTaggedVal(reinterpret_cast<intptr_t>(T.getAsOpaquePtr()), 7148 DiagnosticsEngine::ak_qualtype); 7149 return PD; 7150 } 7151 7152 // Helper class template that is used by Type::getAs to ensure that one does 7153 // not try to look through a qualified type to get to an array type. 7154 template <typename T> 7155 using TypeIsArrayType = 7156 std::integral_constant<bool, std::is_same<T, ArrayType>::value || 7157 std::is_base_of<ArrayType, T>::value>; 7158 7159 // Member-template getAs<specific type>'. 7160 template <typename T> const T *Type::getAs() const { 7161 static_assert(!TypeIsArrayType<T>::value, 7162 "ArrayType cannot be used with getAs!"); 7163 7164 // If this is directly a T type, return it. 7165 if (const auto *Ty = dyn_cast<T>(this)) 7166 return Ty; 7167 7168 // If the canonical form of this type isn't the right kind, reject it. 7169 if (!isa<T>(CanonicalType)) 7170 return nullptr; 7171 7172 // If this is a typedef for the type, strip the typedef off without 7173 // losing all typedef information. 7174 return cast<T>(getUnqualifiedDesugaredType()); 7175 } 7176 7177 template <typename T> const T *Type::getAsAdjusted() const { 7178 static_assert(!TypeIsArrayType<T>::value, "ArrayType cannot be used with getAsAdjusted!"); 7179 7180 // If this is directly a T type, return it. 7181 if (const auto *Ty = dyn_cast<T>(this)) 7182 return Ty; 7183 7184 // If the canonical form of this type isn't the right kind, reject it. 7185 if (!isa<T>(CanonicalType)) 7186 return nullptr; 7187 7188 // Strip off type adjustments that do not modify the underlying nature of the 7189 // type. 7190 const Type *Ty = this; 7191 while (Ty) { 7192 if (const auto *A = dyn_cast<AttributedType>(Ty)) 7193 Ty = A->getModifiedType().getTypePtr(); 7194 else if (const auto *E = dyn_cast<ElaboratedType>(Ty)) 7195 Ty = E->desugar().getTypePtr(); 7196 else if (const auto *P = dyn_cast<ParenType>(Ty)) 7197 Ty = P->desugar().getTypePtr(); 7198 else if (const auto *A = dyn_cast<AdjustedType>(Ty)) 7199 Ty = A->desugar().getTypePtr(); 7200 else if (const auto *M = dyn_cast<MacroQualifiedType>(Ty)) 7201 Ty = M->desugar().getTypePtr(); 7202 else 7203 break; 7204 } 7205 7206 // Just because the canonical type is correct does not mean we can use cast<>, 7207 // since we may not have stripped off all the sugar down to the base type. 7208 return dyn_cast<T>(Ty); 7209 } 7210 7211 inline const ArrayType *Type::getAsArrayTypeUnsafe() const { 7212 // If this is directly an array type, return it. 7213 if (const auto *arr = dyn_cast<ArrayType>(this)) 7214 return arr; 7215 7216 // If the canonical form of this type isn't the right kind, reject it. 7217 if (!isa<ArrayType>(CanonicalType)) 7218 return nullptr; 7219 7220 // If this is a typedef for the type, strip the typedef off without 7221 // losing all typedef information. 7222 return cast<ArrayType>(getUnqualifiedDesugaredType()); 7223 } 7224 7225 template <typename T> const T *Type::castAs() const { 7226 static_assert(!TypeIsArrayType<T>::value, 7227 "ArrayType cannot be used with castAs!"); 7228 7229 if (const auto *ty = dyn_cast<T>(this)) return ty; 7230 assert(isa<T>(CanonicalType)); 7231 return cast<T>(getUnqualifiedDesugaredType()); 7232 } 7233 7234 inline const ArrayType *Type::castAsArrayTypeUnsafe() const { 7235 assert(isa<ArrayType>(CanonicalType)); 7236 if (const auto *arr = dyn_cast<ArrayType>(this)) return arr; 7237 return cast<ArrayType>(getUnqualifiedDesugaredType()); 7238 } 7239 7240 DecayedType::DecayedType(QualType OriginalType, QualType DecayedPtr, 7241 QualType CanonicalPtr) 7242 : AdjustedType(Decayed, OriginalType, DecayedPtr, CanonicalPtr) { 7243 #ifndef NDEBUG 7244 QualType Adjusted = getAdjustedType(); 7245 (void)AttributedType::stripOuterNullability(Adjusted); 7246 assert(isa<PointerType>(Adjusted)); 7247 #endif 7248 } 7249 7250 QualType DecayedType::getPointeeType() const { 7251 QualType Decayed = getDecayedType(); 7252 (void)AttributedType::stripOuterNullability(Decayed); 7253 return cast<PointerType>(Decayed)->getPointeeType(); 7254 } 7255 7256 // Get the decimal string representation of a fixed point type, represented 7257 // as a scaled integer. 7258 // TODO: At some point, we should change the arguments to instead just accept an 7259 // APFixedPoint instead of APSInt and scale. 7260 void FixedPointValueToString(SmallVectorImpl<char> &Str, llvm::APSInt Val, 7261 unsigned Scale); 7262 7263 } // namespace clang 7264 7265 #endif // LLVM_CLANG_AST_TYPE_H 7266