1 //===--- Type.h - C Language Family Type Representation ---------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 /// \file 10 /// \brief 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/NestedNameSpecifier.h" 21 #include "clang/AST/TemplateName.h" 22 #include "clang/Basic/AddressSpaces.h" 23 #include "clang/Basic/Diagnostic.h" 24 #include "clang/Basic/ExceptionSpecificationType.h" 25 #include "clang/Basic/LLVM.h" 26 #include "clang/Basic/Linkage.h" 27 #include "clang/Basic/PartialDiagnostic.h" 28 #include "clang/Basic/Specifiers.h" 29 #include "clang/Basic/Visibility.h" 30 #include "llvm/ADT/APInt.h" 31 #include "llvm/ADT/FoldingSet.h" 32 #include "llvm/ADT/Optional.h" 33 #include "llvm/ADT/PointerIntPair.h" 34 #include "llvm/ADT/PointerUnion.h" 35 #include "llvm/ADT/Twine.h" 36 #include "llvm/ADT/iterator_range.h" 37 #include "llvm/Support/ErrorHandling.h" 38 39 namespace clang { 40 enum { 41 TypeAlignmentInBits = 4, 42 TypeAlignment = 1 << TypeAlignmentInBits 43 }; 44 class Type; 45 class ExtQuals; 46 class QualType; 47 } 48 49 namespace llvm { 50 template <typename T> 51 class PointerLikeTypeTraits; 52 template<> 53 class PointerLikeTypeTraits< ::clang::Type*> { 54 public: 55 static inline void *getAsVoidPointer(::clang::Type *P) { return P; } 56 static inline ::clang::Type *getFromVoidPointer(void *P) { 57 return static_cast< ::clang::Type*>(P); 58 } 59 enum { NumLowBitsAvailable = clang::TypeAlignmentInBits }; 60 }; 61 template<> 62 class PointerLikeTypeTraits< ::clang::ExtQuals*> { 63 public: 64 static inline void *getAsVoidPointer(::clang::ExtQuals *P) { return P; } 65 static inline ::clang::ExtQuals *getFromVoidPointer(void *P) { 66 return static_cast< ::clang::ExtQuals*>(P); 67 } 68 enum { NumLowBitsAvailable = clang::TypeAlignmentInBits }; 69 }; 70 71 template <> 72 struct isPodLike<clang::QualType> { static const bool value = true; }; 73 } 74 75 namespace clang { 76 class ASTContext; 77 class TypedefNameDecl; 78 class TemplateDecl; 79 class TemplateTypeParmDecl; 80 class NonTypeTemplateParmDecl; 81 class TemplateTemplateParmDecl; 82 class TagDecl; 83 class RecordDecl; 84 class CXXRecordDecl; 85 class EnumDecl; 86 class FieldDecl; 87 class FunctionDecl; 88 class ObjCInterfaceDecl; 89 class ObjCProtocolDecl; 90 class ObjCMethodDecl; 91 class UnresolvedUsingTypenameDecl; 92 class Expr; 93 class Stmt; 94 class SourceLocation; 95 class StmtIteratorBase; 96 class TemplateArgument; 97 class TemplateArgumentLoc; 98 class TemplateArgumentListInfo; 99 class ElaboratedType; 100 class ExtQuals; 101 class ExtQualsTypeCommonBase; 102 struct PrintingPolicy; 103 104 template <typename> class CanQual; 105 typedef CanQual<Type> CanQualType; 106 107 // Provide forward declarations for all of the *Type classes 108 #define TYPE(Class, Base) class Class##Type; 109 #include "clang/AST/TypeNodes.def" 110 111 /// The collection of all-type qualifiers we support. 112 /// Clang supports five independent qualifiers: 113 /// * C99: const, volatile, and restrict 114 /// * Embedded C (TR18037): address spaces 115 /// * Objective C: the GC attributes (none, weak, or strong) 116 class Qualifiers { 117 public: 118 enum TQ { // NOTE: These flags must be kept in sync with DeclSpec::TQ. 119 Const = 0x1, 120 Restrict = 0x2, 121 Volatile = 0x4, 122 CVRMask = Const | Volatile | Restrict 123 }; 124 125 enum GC { 126 GCNone = 0, 127 Weak, 128 Strong 129 }; 130 131 enum ObjCLifetime { 132 /// There is no lifetime qualification on this type. 133 OCL_None, 134 135 /// This object can be modified without requiring retains or 136 /// releases. 137 OCL_ExplicitNone, 138 139 /// Assigning into this object requires the old value to be 140 /// released and the new value to be retained. The timing of the 141 /// release of the old value is inexact: it may be moved to 142 /// immediately after the last known point where the value is 143 /// live. 144 OCL_Strong, 145 146 /// Reading or writing from this object requires a barrier call. 147 OCL_Weak, 148 149 /// Assigning into this object requires a lifetime extension. 150 OCL_Autoreleasing 151 }; 152 153 enum { 154 /// The maximum supported address space number. 155 /// 24 bits should be enough for anyone. 156 MaxAddressSpace = 0xffffffu, 157 158 /// The width of the "fast" qualifier mask. 159 FastWidth = 3, 160 161 /// The fast qualifier mask. 162 FastMask = (1 << FastWidth) - 1 163 }; 164 165 Qualifiers() : Mask(0) {} 166 167 /// Returns the common set of qualifiers while removing them from 168 /// the given sets. 169 static Qualifiers removeCommonQualifiers(Qualifiers &L, Qualifiers &R) { 170 // If both are only CVR-qualified, bit operations are sufficient. 171 if (!(L.Mask & ~CVRMask) && !(R.Mask & ~CVRMask)) { 172 Qualifiers Q; 173 Q.Mask = L.Mask & R.Mask; 174 L.Mask &= ~Q.Mask; 175 R.Mask &= ~Q.Mask; 176 return Q; 177 } 178 179 Qualifiers Q; 180 unsigned CommonCRV = L.getCVRQualifiers() & R.getCVRQualifiers(); 181 Q.addCVRQualifiers(CommonCRV); 182 L.removeCVRQualifiers(CommonCRV); 183 R.removeCVRQualifiers(CommonCRV); 184 185 if (L.getObjCGCAttr() == R.getObjCGCAttr()) { 186 Q.setObjCGCAttr(L.getObjCGCAttr()); 187 L.removeObjCGCAttr(); 188 R.removeObjCGCAttr(); 189 } 190 191 if (L.getObjCLifetime() == R.getObjCLifetime()) { 192 Q.setObjCLifetime(L.getObjCLifetime()); 193 L.removeObjCLifetime(); 194 R.removeObjCLifetime(); 195 } 196 197 if (L.getAddressSpace() == R.getAddressSpace()) { 198 Q.setAddressSpace(L.getAddressSpace()); 199 L.removeAddressSpace(); 200 R.removeAddressSpace(); 201 } 202 return Q; 203 } 204 205 static Qualifiers fromFastMask(unsigned Mask) { 206 Qualifiers Qs; 207 Qs.addFastQualifiers(Mask); 208 return Qs; 209 } 210 211 static Qualifiers fromCVRMask(unsigned CVR) { 212 Qualifiers Qs; 213 Qs.addCVRQualifiers(CVR); 214 return Qs; 215 } 216 217 // Deserialize qualifiers from an opaque representation. 218 static Qualifiers fromOpaqueValue(unsigned opaque) { 219 Qualifiers Qs; 220 Qs.Mask = opaque; 221 return Qs; 222 } 223 224 // Serialize these qualifiers into an opaque representation. 225 unsigned getAsOpaqueValue() const { 226 return Mask; 227 } 228 229 bool hasConst() const { return Mask & Const; } 230 void setConst(bool flag) { 231 Mask = (Mask & ~Const) | (flag ? Const : 0); 232 } 233 void removeConst() { Mask &= ~Const; } 234 void addConst() { Mask |= Const; } 235 236 bool hasVolatile() const { return Mask & Volatile; } 237 void setVolatile(bool flag) { 238 Mask = (Mask & ~Volatile) | (flag ? Volatile : 0); 239 } 240 void removeVolatile() { Mask &= ~Volatile; } 241 void addVolatile() { Mask |= Volatile; } 242 243 bool hasRestrict() const { return Mask & Restrict; } 244 void setRestrict(bool flag) { 245 Mask = (Mask & ~Restrict) | (flag ? Restrict : 0); 246 } 247 void removeRestrict() { Mask &= ~Restrict; } 248 void addRestrict() { Mask |= Restrict; } 249 250 bool hasCVRQualifiers() const { return getCVRQualifiers(); } 251 unsigned getCVRQualifiers() const { return Mask & CVRMask; } 252 void setCVRQualifiers(unsigned mask) { 253 assert(!(mask & ~CVRMask) && "bitmask contains non-CVR bits"); 254 Mask = (Mask & ~CVRMask) | mask; 255 } 256 void removeCVRQualifiers(unsigned mask) { 257 assert(!(mask & ~CVRMask) && "bitmask contains non-CVR bits"); 258 Mask &= ~mask; 259 } 260 void removeCVRQualifiers() { 261 removeCVRQualifiers(CVRMask); 262 } 263 void addCVRQualifiers(unsigned mask) { 264 assert(!(mask & ~CVRMask) && "bitmask contains non-CVR bits"); 265 Mask |= mask; 266 } 267 268 bool hasObjCGCAttr() const { return Mask & GCAttrMask; } 269 GC getObjCGCAttr() const { return GC((Mask & GCAttrMask) >> GCAttrShift); } 270 void setObjCGCAttr(GC type) { 271 Mask = (Mask & ~GCAttrMask) | (type << GCAttrShift); 272 } 273 void removeObjCGCAttr() { setObjCGCAttr(GCNone); } 274 void addObjCGCAttr(GC type) { 275 assert(type); 276 setObjCGCAttr(type); 277 } 278 Qualifiers withoutObjCGCAttr() const { 279 Qualifiers qs = *this; 280 qs.removeObjCGCAttr(); 281 return qs; 282 } 283 Qualifiers withoutObjCLifetime() const { 284 Qualifiers qs = *this; 285 qs.removeObjCLifetime(); 286 return qs; 287 } 288 289 bool hasObjCLifetime() const { return Mask & LifetimeMask; } 290 ObjCLifetime getObjCLifetime() const { 291 return ObjCLifetime((Mask & LifetimeMask) >> LifetimeShift); 292 } 293 void setObjCLifetime(ObjCLifetime type) { 294 Mask = (Mask & ~LifetimeMask) | (type << LifetimeShift); 295 } 296 void removeObjCLifetime() { setObjCLifetime(OCL_None); } 297 void addObjCLifetime(ObjCLifetime type) { 298 assert(type); 299 assert(!hasObjCLifetime()); 300 Mask |= (type << LifetimeShift); 301 } 302 303 /// True if the lifetime is neither None or ExplicitNone. 304 bool hasNonTrivialObjCLifetime() const { 305 ObjCLifetime lifetime = getObjCLifetime(); 306 return (lifetime > OCL_ExplicitNone); 307 } 308 309 /// True if the lifetime is either strong or weak. 310 bool hasStrongOrWeakObjCLifetime() const { 311 ObjCLifetime lifetime = getObjCLifetime(); 312 return (lifetime == OCL_Strong || lifetime == OCL_Weak); 313 } 314 315 bool hasAddressSpace() const { return Mask & AddressSpaceMask; } 316 unsigned getAddressSpace() const { return Mask >> AddressSpaceShift; } 317 void setAddressSpace(unsigned space) { 318 assert(space <= MaxAddressSpace); 319 Mask = (Mask & ~AddressSpaceMask) 320 | (((uint32_t) space) << AddressSpaceShift); 321 } 322 void removeAddressSpace() { setAddressSpace(0); } 323 void addAddressSpace(unsigned space) { 324 assert(space); 325 setAddressSpace(space); 326 } 327 328 // Fast qualifiers are those that can be allocated directly 329 // on a QualType object. 330 bool hasFastQualifiers() const { return getFastQualifiers(); } 331 unsigned getFastQualifiers() const { return Mask & FastMask; } 332 void setFastQualifiers(unsigned mask) { 333 assert(!(mask & ~FastMask) && "bitmask contains non-fast qualifier bits"); 334 Mask = (Mask & ~FastMask) | mask; 335 } 336 void removeFastQualifiers(unsigned mask) { 337 assert(!(mask & ~FastMask) && "bitmask contains non-fast qualifier bits"); 338 Mask &= ~mask; 339 } 340 void removeFastQualifiers() { 341 removeFastQualifiers(FastMask); 342 } 343 void addFastQualifiers(unsigned mask) { 344 assert(!(mask & ~FastMask) && "bitmask contains non-fast qualifier bits"); 345 Mask |= mask; 346 } 347 348 /// Return true if the set contains any qualifiers which require an ExtQuals 349 /// node to be allocated. 350 bool hasNonFastQualifiers() const { return Mask & ~FastMask; } 351 Qualifiers getNonFastQualifiers() const { 352 Qualifiers Quals = *this; 353 Quals.setFastQualifiers(0); 354 return Quals; 355 } 356 357 /// Return true if the set contains any qualifiers. 358 bool hasQualifiers() const { return Mask; } 359 bool empty() const { return !Mask; } 360 361 /// Add the qualifiers from the given set to this set. 362 void addQualifiers(Qualifiers Q) { 363 // If the other set doesn't have any non-boolean qualifiers, just 364 // bit-or it in. 365 if (!(Q.Mask & ~CVRMask)) 366 Mask |= Q.Mask; 367 else { 368 Mask |= (Q.Mask & CVRMask); 369 if (Q.hasAddressSpace()) 370 addAddressSpace(Q.getAddressSpace()); 371 if (Q.hasObjCGCAttr()) 372 addObjCGCAttr(Q.getObjCGCAttr()); 373 if (Q.hasObjCLifetime()) 374 addObjCLifetime(Q.getObjCLifetime()); 375 } 376 } 377 378 /// \brief Remove the qualifiers from the given set from this set. 379 void removeQualifiers(Qualifiers Q) { 380 // If the other set doesn't have any non-boolean qualifiers, just 381 // bit-and the inverse in. 382 if (!(Q.Mask & ~CVRMask)) 383 Mask &= ~Q.Mask; 384 else { 385 Mask &= ~(Q.Mask & CVRMask); 386 if (getObjCGCAttr() == Q.getObjCGCAttr()) 387 removeObjCGCAttr(); 388 if (getObjCLifetime() == Q.getObjCLifetime()) 389 removeObjCLifetime(); 390 if (getAddressSpace() == Q.getAddressSpace()) 391 removeAddressSpace(); 392 } 393 } 394 395 /// Add the qualifiers from the given set to this set, given that 396 /// they don't conflict. 397 void addConsistentQualifiers(Qualifiers qs) { 398 assert(getAddressSpace() == qs.getAddressSpace() || 399 !hasAddressSpace() || !qs.hasAddressSpace()); 400 assert(getObjCGCAttr() == qs.getObjCGCAttr() || 401 !hasObjCGCAttr() || !qs.hasObjCGCAttr()); 402 assert(getObjCLifetime() == qs.getObjCLifetime() || 403 !hasObjCLifetime() || !qs.hasObjCLifetime()); 404 Mask |= qs.Mask; 405 } 406 407 /// Returns true if this address space is a superset of the other one. 408 /// OpenCL v2.0 defines conversion rules (OpenCLC v2.0 s6.5.5) and notion of 409 /// overlapping address spaces. 410 /// CL1.1 or CL1.2: 411 /// every address space is a superset of itself. 412 /// CL2.0 adds: 413 /// __generic is a superset of any address space except for __constant. 414 bool isAddressSpaceSupersetOf(Qualifiers other) const { 415 return 416 // Address spaces must match exactly. 417 getAddressSpace() == other.getAddressSpace() || 418 // Otherwise in OpenCLC v2.0 s6.5.5: every address space except 419 // for __constant can be used as __generic. 420 (getAddressSpace() == LangAS::opencl_generic && 421 other.getAddressSpace() != LangAS::opencl_constant); 422 } 423 424 /// Determines if these qualifiers compatibly include another set. 425 /// Generally this answers the question of whether an object with the other 426 /// qualifiers can be safely used as an object with these qualifiers. 427 bool compatiblyIncludes(Qualifiers other) const { 428 return isAddressSpaceSupersetOf(other) && 429 // ObjC GC qualifiers can match, be added, or be removed, but can't 430 // be changed. 431 (getObjCGCAttr() == other.getObjCGCAttr() || !hasObjCGCAttr() || 432 !other.hasObjCGCAttr()) && 433 // ObjC lifetime qualifiers must match exactly. 434 getObjCLifetime() == other.getObjCLifetime() && 435 // CVR qualifiers may subset. 436 (((Mask & CVRMask) | (other.Mask & CVRMask)) == (Mask & CVRMask)); 437 } 438 439 /// \brief Determines if these qualifiers compatibly include another set of 440 /// qualifiers from the narrow perspective of Objective-C ARC lifetime. 441 /// 442 /// One set of Objective-C lifetime qualifiers compatibly includes the other 443 /// if the lifetime qualifiers match, or if both are non-__weak and the 444 /// including set also contains the 'const' qualifier, or both are non-__weak 445 /// and one is None (which can only happen in non-ARC modes). 446 bool compatiblyIncludesObjCLifetime(Qualifiers other) const { 447 if (getObjCLifetime() == other.getObjCLifetime()) 448 return true; 449 450 if (getObjCLifetime() == OCL_Weak || other.getObjCLifetime() == OCL_Weak) 451 return false; 452 453 if (getObjCLifetime() == OCL_None || other.getObjCLifetime() == OCL_None) 454 return true; 455 456 return hasConst(); 457 } 458 459 /// \brief Determine whether this set of qualifiers is a strict superset of 460 /// another set of qualifiers, not considering qualifier compatibility. 461 bool isStrictSupersetOf(Qualifiers Other) const; 462 463 bool operator==(Qualifiers Other) const { return Mask == Other.Mask; } 464 bool operator!=(Qualifiers Other) const { return Mask != Other.Mask; } 465 466 explicit operator bool() const { return hasQualifiers(); } 467 468 Qualifiers &operator+=(Qualifiers R) { 469 addQualifiers(R); 470 return *this; 471 } 472 473 // Union two qualifier sets. If an enumerated qualifier appears 474 // in both sets, use the one from the right. 475 friend Qualifiers operator+(Qualifiers L, Qualifiers R) { 476 L += R; 477 return L; 478 } 479 480 Qualifiers &operator-=(Qualifiers R) { 481 removeQualifiers(R); 482 return *this; 483 } 484 485 /// \brief Compute the difference between two qualifier sets. 486 friend Qualifiers operator-(Qualifiers L, Qualifiers R) { 487 L -= R; 488 return L; 489 } 490 491 std::string getAsString() const; 492 std::string getAsString(const PrintingPolicy &Policy) const; 493 494 bool isEmptyWhenPrinted(const PrintingPolicy &Policy) const; 495 void print(raw_ostream &OS, const PrintingPolicy &Policy, 496 bool appendSpaceIfNonEmpty = false) const; 497 498 void Profile(llvm::FoldingSetNodeID &ID) const { 499 ID.AddInteger(Mask); 500 } 501 502 private: 503 504 // bits: |0 1 2|3 .. 4|5 .. 7|8 ... 31| 505 // |C R V|GCAttr|Lifetime|AddressSpace| 506 uint32_t Mask; 507 508 static const uint32_t GCAttrMask = 0x18; 509 static const uint32_t GCAttrShift = 3; 510 static const uint32_t LifetimeMask = 0xE0; 511 static const uint32_t LifetimeShift = 5; 512 static const uint32_t AddressSpaceMask = ~(CVRMask|GCAttrMask|LifetimeMask); 513 static const uint32_t AddressSpaceShift = 8; 514 }; 515 516 /// A std::pair-like structure for storing a qualified type split 517 /// into its local qualifiers and its locally-unqualified type. 518 struct SplitQualType { 519 /// The locally-unqualified type. 520 const Type *Ty; 521 522 /// The local qualifiers. 523 Qualifiers Quals; 524 525 SplitQualType() : Ty(nullptr), Quals() {} 526 SplitQualType(const Type *ty, Qualifiers qs) : Ty(ty), Quals(qs) {} 527 528 SplitQualType getSingleStepDesugaredType() const; // end of this file 529 530 // Make std::tie work. 531 std::pair<const Type *,Qualifiers> asPair() const { 532 return std::pair<const Type *, Qualifiers>(Ty, Quals); 533 } 534 535 friend bool operator==(SplitQualType a, SplitQualType b) { 536 return a.Ty == b.Ty && a.Quals == b.Quals; 537 } 538 friend bool operator!=(SplitQualType a, SplitQualType b) { 539 return a.Ty != b.Ty || a.Quals != b.Quals; 540 } 541 }; 542 543 /// The kind of type we are substituting Objective-C type arguments into. 544 /// 545 /// The kind of substitution affects the replacement of type parameters when 546 /// no concrete type information is provided, e.g., when dealing with an 547 /// unspecialized type. 548 enum class ObjCSubstitutionContext { 549 /// An ordinary type. 550 Ordinary, 551 /// The result type of a method or function. 552 Result, 553 /// The parameter type of a method or function. 554 Parameter, 555 /// The type of a property. 556 Property, 557 /// The superclass of a type. 558 Superclass, 559 }; 560 561 /// A (possibly-)qualified type. 562 /// 563 /// For efficiency, we don't store CV-qualified types as nodes on their 564 /// own: instead each reference to a type stores the qualifiers. This 565 /// greatly reduces the number of nodes we need to allocate for types (for 566 /// example we only need one for 'int', 'const int', 'volatile int', 567 /// 'const volatile int', etc). 568 /// 569 /// As an added efficiency bonus, instead of making this a pair, we 570 /// just store the two bits we care about in the low bits of the 571 /// pointer. To handle the packing/unpacking, we make QualType be a 572 /// simple wrapper class that acts like a smart pointer. A third bit 573 /// indicates whether there are extended qualifiers present, in which 574 /// case the pointer points to a special structure. 575 class QualType { 576 // Thankfully, these are efficiently composable. 577 llvm::PointerIntPair<llvm::PointerUnion<const Type*,const ExtQuals*>, 578 Qualifiers::FastWidth> Value; 579 580 const ExtQuals *getExtQualsUnsafe() const { 581 return Value.getPointer().get<const ExtQuals*>(); 582 } 583 584 const Type *getTypePtrUnsafe() const { 585 return Value.getPointer().get<const Type*>(); 586 } 587 588 const ExtQualsTypeCommonBase *getCommonPtr() const { 589 assert(!isNull() && "Cannot retrieve a NULL type pointer"); 590 uintptr_t CommonPtrVal 591 = reinterpret_cast<uintptr_t>(Value.getOpaqueValue()); 592 CommonPtrVal &= ~(uintptr_t)((1 << TypeAlignmentInBits) - 1); 593 return reinterpret_cast<ExtQualsTypeCommonBase*>(CommonPtrVal); 594 } 595 596 friend class QualifierCollector; 597 public: 598 QualType() {} 599 600 QualType(const Type *Ptr, unsigned Quals) 601 : Value(Ptr, Quals) {} 602 QualType(const ExtQuals *Ptr, unsigned Quals) 603 : Value(Ptr, Quals) {} 604 605 unsigned getLocalFastQualifiers() const { return Value.getInt(); } 606 void setLocalFastQualifiers(unsigned Quals) { Value.setInt(Quals); } 607 608 /// Retrieves a pointer to the underlying (unqualified) type. 609 /// 610 /// This function requires that the type not be NULL. If the type might be 611 /// NULL, use the (slightly less efficient) \c getTypePtrOrNull(). 612 const Type *getTypePtr() const; 613 614 const Type *getTypePtrOrNull() const; 615 616 /// Retrieves a pointer to the name of the base type. 617 const IdentifierInfo *getBaseTypeIdentifier() const; 618 619 /// Divides a QualType into its unqualified type and a set of local 620 /// qualifiers. 621 SplitQualType split() const; 622 623 void *getAsOpaquePtr() const { return Value.getOpaqueValue(); } 624 static QualType getFromOpaquePtr(const void *Ptr) { 625 QualType T; 626 T.Value.setFromOpaqueValue(const_cast<void*>(Ptr)); 627 return T; 628 } 629 630 const Type &operator*() const { 631 return *getTypePtr(); 632 } 633 634 const Type *operator->() const { 635 return getTypePtr(); 636 } 637 638 bool isCanonical() const; 639 bool isCanonicalAsParam() const; 640 641 /// Return true if this QualType doesn't point to a type yet. 642 bool isNull() const { 643 return Value.getPointer().isNull(); 644 } 645 646 /// \brief Determine whether this particular QualType instance has the 647 /// "const" qualifier set, without looking through typedefs that may have 648 /// added "const" at a different level. 649 bool isLocalConstQualified() const { 650 return (getLocalFastQualifiers() & Qualifiers::Const); 651 } 652 653 /// \brief Determine whether this type is const-qualified. 654 bool isConstQualified() const; 655 656 /// \brief Determine whether this particular QualType instance has the 657 /// "restrict" qualifier set, without looking through typedefs that may have 658 /// added "restrict" at a different level. 659 bool isLocalRestrictQualified() const { 660 return (getLocalFastQualifiers() & Qualifiers::Restrict); 661 } 662 663 /// \brief Determine whether this type is restrict-qualified. 664 bool isRestrictQualified() const; 665 666 /// \brief Determine whether this particular QualType instance has the 667 /// "volatile" qualifier set, without looking through typedefs that may have 668 /// added "volatile" at a different level. 669 bool isLocalVolatileQualified() const { 670 return (getLocalFastQualifiers() & Qualifiers::Volatile); 671 } 672 673 /// \brief Determine whether this type is volatile-qualified. 674 bool isVolatileQualified() const; 675 676 /// \brief Determine whether this particular QualType instance has any 677 /// qualifiers, without looking through any typedefs that might add 678 /// qualifiers at a different level. 679 bool hasLocalQualifiers() const { 680 return getLocalFastQualifiers() || hasLocalNonFastQualifiers(); 681 } 682 683 /// \brief Determine whether this type has any qualifiers. 684 bool hasQualifiers() const; 685 686 /// \brief Determine whether this particular QualType instance has any 687 /// "non-fast" qualifiers, e.g., those that are stored in an ExtQualType 688 /// instance. 689 bool hasLocalNonFastQualifiers() const { 690 return Value.getPointer().is<const ExtQuals*>(); 691 } 692 693 /// \brief Retrieve the set of qualifiers local to this particular QualType 694 /// instance, not including any qualifiers acquired through typedefs or 695 /// other sugar. 696 Qualifiers getLocalQualifiers() const; 697 698 /// \brief Retrieve the set of qualifiers applied to this type. 699 Qualifiers getQualifiers() const; 700 701 /// \brief Retrieve the set of CVR (const-volatile-restrict) qualifiers 702 /// local to this particular QualType instance, not including any qualifiers 703 /// acquired through typedefs or other sugar. 704 unsigned getLocalCVRQualifiers() const { 705 return getLocalFastQualifiers(); 706 } 707 708 /// \brief Retrieve the set of CVR (const-volatile-restrict) qualifiers 709 /// applied to this type. 710 unsigned getCVRQualifiers() const; 711 712 bool isConstant(ASTContext& Ctx) const { 713 return QualType::isConstant(*this, Ctx); 714 } 715 716 /// \brief Determine whether this is a Plain Old Data (POD) type (C++ 3.9p10). 717 bool isPODType(ASTContext &Context) const; 718 719 /// Return true if this is a POD type according to the rules of the C++98 720 /// standard, regardless of the current compilation's language. 721 bool isCXX98PODType(ASTContext &Context) const; 722 723 /// Return true if this is a POD type according to the more relaxed rules 724 /// of the C++11 standard, regardless of the current compilation's language. 725 /// (C++0x [basic.types]p9) 726 bool isCXX11PODType(ASTContext &Context) const; 727 728 /// Return true if this is a trivial type per (C++0x [basic.types]p9) 729 bool isTrivialType(ASTContext &Context) const; 730 731 /// Return true if this is a trivially copyable type (C++0x [basic.types]p9) 732 bool isTriviallyCopyableType(ASTContext &Context) const; 733 734 // Don't promise in the API that anything besides 'const' can be 735 // easily added. 736 737 /// Add the `const` type qualifier to this QualType. 738 void addConst() { 739 addFastQualifiers(Qualifiers::Const); 740 } 741 QualType withConst() const { 742 return withFastQualifiers(Qualifiers::Const); 743 } 744 745 /// Add the `volatile` type qualifier to this QualType. 746 void addVolatile() { 747 addFastQualifiers(Qualifiers::Volatile); 748 } 749 QualType withVolatile() const { 750 return withFastQualifiers(Qualifiers::Volatile); 751 } 752 753 /// Add the `restrict` qualifier to this QualType. 754 void addRestrict() { 755 addFastQualifiers(Qualifiers::Restrict); 756 } 757 QualType withRestrict() const { 758 return withFastQualifiers(Qualifiers::Restrict); 759 } 760 761 QualType withCVRQualifiers(unsigned CVR) const { 762 return withFastQualifiers(CVR); 763 } 764 765 void addFastQualifiers(unsigned TQs) { 766 assert(!(TQs & ~Qualifiers::FastMask) 767 && "non-fast qualifier bits set in mask!"); 768 Value.setInt(Value.getInt() | TQs); 769 } 770 771 void removeLocalConst(); 772 void removeLocalVolatile(); 773 void removeLocalRestrict(); 774 void removeLocalCVRQualifiers(unsigned Mask); 775 776 void removeLocalFastQualifiers() { Value.setInt(0); } 777 void removeLocalFastQualifiers(unsigned Mask) { 778 assert(!(Mask & ~Qualifiers::FastMask) && "mask has non-fast qualifiers"); 779 Value.setInt(Value.getInt() & ~Mask); 780 } 781 782 // Creates a type with the given qualifiers in addition to any 783 // qualifiers already on this type. 784 QualType withFastQualifiers(unsigned TQs) const { 785 QualType T = *this; 786 T.addFastQualifiers(TQs); 787 return T; 788 } 789 790 // Creates a type with exactly the given fast qualifiers, removing 791 // any existing fast qualifiers. 792 QualType withExactLocalFastQualifiers(unsigned TQs) const { 793 return withoutLocalFastQualifiers().withFastQualifiers(TQs); 794 } 795 796 // Removes fast qualifiers, but leaves any extended qualifiers in place. 797 QualType withoutLocalFastQualifiers() const { 798 QualType T = *this; 799 T.removeLocalFastQualifiers(); 800 return T; 801 } 802 803 QualType getCanonicalType() const; 804 805 /// \brief Return this type with all of the instance-specific qualifiers 806 /// removed, but without removing any qualifiers that may have been applied 807 /// through typedefs. 808 QualType getLocalUnqualifiedType() const { return QualType(getTypePtr(), 0); } 809 810 /// \brief Retrieve the unqualified variant of the given type, 811 /// removing as little sugar as possible. 812 /// 813 /// This routine looks through various kinds of sugar to find the 814 /// least-desugared type that is unqualified. For example, given: 815 /// 816 /// \code 817 /// typedef int Integer; 818 /// typedef const Integer CInteger; 819 /// typedef CInteger DifferenceType; 820 /// \endcode 821 /// 822 /// Executing \c getUnqualifiedType() on the type \c DifferenceType will 823 /// desugar until we hit the type \c Integer, which has no qualifiers on it. 824 /// 825 /// The resulting type might still be qualified if it's sugar for an array 826 /// type. To strip qualifiers even from within a sugared array type, use 827 /// ASTContext::getUnqualifiedArrayType. 828 inline QualType getUnqualifiedType() const; 829 830 /// Retrieve the unqualified variant of the given type, removing as little 831 /// sugar as possible. 832 /// 833 /// Like getUnqualifiedType(), but also returns the set of 834 /// qualifiers that were built up. 835 /// 836 /// The resulting type might still be qualified if it's sugar for an array 837 /// type. To strip qualifiers even from within a sugared array type, use 838 /// ASTContext::getUnqualifiedArrayType. 839 inline SplitQualType getSplitUnqualifiedType() const; 840 841 /// \brief Determine whether this type is more qualified than the other 842 /// given type, requiring exact equality for non-CVR qualifiers. 843 bool isMoreQualifiedThan(QualType Other) const; 844 845 /// \brief Determine whether this type is at least as qualified as the other 846 /// given type, requiring exact equality for non-CVR qualifiers. 847 bool isAtLeastAsQualifiedAs(QualType Other) const; 848 849 QualType getNonReferenceType() const; 850 851 /// \brief Determine the type of a (typically non-lvalue) expression with the 852 /// specified result type. 853 /// 854 /// This routine should be used for expressions for which the return type is 855 /// explicitly specified (e.g., in a cast or call) and isn't necessarily 856 /// an lvalue. It removes a top-level reference (since there are no 857 /// expressions of reference type) and deletes top-level cvr-qualifiers 858 /// from non-class types (in C++) or all types (in C). 859 QualType getNonLValueExprType(const ASTContext &Context) const; 860 861 /// Return the specified type with any "sugar" removed from 862 /// the type. This takes off typedefs, typeof's etc. If the outer level of 863 /// the type is already concrete, it returns it unmodified. This is similar 864 /// to getting the canonical type, but it doesn't remove *all* typedefs. For 865 /// example, it returns "T*" as "T*", (not as "int*"), because the pointer is 866 /// concrete. 867 /// 868 /// Qualifiers are left in place. 869 QualType getDesugaredType(const ASTContext &Context) const { 870 return getDesugaredType(*this, Context); 871 } 872 873 SplitQualType getSplitDesugaredType() const { 874 return getSplitDesugaredType(*this); 875 } 876 877 /// \brief Return the specified type with one level of "sugar" removed from 878 /// the type. 879 /// 880 /// This routine takes off the first typedef, typeof, etc. If the outer level 881 /// of the type is already concrete, it returns it unmodified. 882 QualType getSingleStepDesugaredType(const ASTContext &Context) const { 883 return getSingleStepDesugaredTypeImpl(*this, Context); 884 } 885 886 /// Returns the specified type after dropping any 887 /// outer-level parentheses. 888 QualType IgnoreParens() const { 889 if (isa<ParenType>(*this)) 890 return QualType::IgnoreParens(*this); 891 return *this; 892 } 893 894 /// Indicate whether the specified types and qualifiers are identical. 895 friend bool operator==(const QualType &LHS, const QualType &RHS) { 896 return LHS.Value == RHS.Value; 897 } 898 friend bool operator!=(const QualType &LHS, const QualType &RHS) { 899 return LHS.Value != RHS.Value; 900 } 901 std::string getAsString() const { 902 return getAsString(split()); 903 } 904 static std::string getAsString(SplitQualType split) { 905 return getAsString(split.Ty, split.Quals); 906 } 907 static std::string getAsString(const Type *ty, Qualifiers qs); 908 909 std::string getAsString(const PrintingPolicy &Policy) const; 910 911 void print(raw_ostream &OS, const PrintingPolicy &Policy, 912 const Twine &PlaceHolder = Twine()) const { 913 print(split(), OS, Policy, PlaceHolder); 914 } 915 static void print(SplitQualType split, raw_ostream &OS, 916 const PrintingPolicy &policy, const Twine &PlaceHolder) { 917 return print(split.Ty, split.Quals, OS, policy, PlaceHolder); 918 } 919 static void print(const Type *ty, Qualifiers qs, 920 raw_ostream &OS, const PrintingPolicy &policy, 921 const Twine &PlaceHolder); 922 923 void getAsStringInternal(std::string &Str, 924 const PrintingPolicy &Policy) const { 925 return getAsStringInternal(split(), Str, Policy); 926 } 927 static void getAsStringInternal(SplitQualType split, std::string &out, 928 const PrintingPolicy &policy) { 929 return getAsStringInternal(split.Ty, split.Quals, out, policy); 930 } 931 static void getAsStringInternal(const Type *ty, Qualifiers qs, 932 std::string &out, 933 const PrintingPolicy &policy); 934 935 class StreamedQualTypeHelper { 936 const QualType &T; 937 const PrintingPolicy &Policy; 938 const Twine &PlaceHolder; 939 public: 940 StreamedQualTypeHelper(const QualType &T, const PrintingPolicy &Policy, 941 const Twine &PlaceHolder) 942 : T(T), Policy(Policy), PlaceHolder(PlaceHolder) { } 943 944 friend raw_ostream &operator<<(raw_ostream &OS, 945 const StreamedQualTypeHelper &SQT) { 946 SQT.T.print(OS, SQT.Policy, SQT.PlaceHolder); 947 return OS; 948 } 949 }; 950 951 StreamedQualTypeHelper stream(const PrintingPolicy &Policy, 952 const Twine &PlaceHolder = Twine()) const { 953 return StreamedQualTypeHelper(*this, Policy, PlaceHolder); 954 } 955 956 void dump(const char *s) const; 957 void dump() const; 958 959 void Profile(llvm::FoldingSetNodeID &ID) const { 960 ID.AddPointer(getAsOpaquePtr()); 961 } 962 963 /// Return the address space of this type. 964 inline unsigned getAddressSpace() const; 965 966 /// Returns gc attribute of this type. 967 inline Qualifiers::GC getObjCGCAttr() const; 968 969 /// true when Type is objc's weak. 970 bool isObjCGCWeak() const { 971 return getObjCGCAttr() == Qualifiers::Weak; 972 } 973 974 /// true when Type is objc's strong. 975 bool isObjCGCStrong() const { 976 return getObjCGCAttr() == Qualifiers::Strong; 977 } 978 979 /// Returns lifetime attribute of this type. 980 Qualifiers::ObjCLifetime getObjCLifetime() const { 981 return getQualifiers().getObjCLifetime(); 982 } 983 984 bool hasNonTrivialObjCLifetime() const { 985 return getQualifiers().hasNonTrivialObjCLifetime(); 986 } 987 988 bool hasStrongOrWeakObjCLifetime() const { 989 return getQualifiers().hasStrongOrWeakObjCLifetime(); 990 } 991 992 enum DestructionKind { 993 DK_none, 994 DK_cxx_destructor, 995 DK_objc_strong_lifetime, 996 DK_objc_weak_lifetime 997 }; 998 999 /// Returns a nonzero value if objects of this type require 1000 /// non-trivial work to clean up after. Non-zero because it's 1001 /// conceivable that qualifiers (objc_gc(weak)?) could make 1002 /// something require destruction. 1003 DestructionKind isDestructedType() const { 1004 return isDestructedTypeImpl(*this); 1005 } 1006 1007 /// Determine whether expressions of the given type are forbidden 1008 /// from being lvalues in C. 1009 /// 1010 /// The expression types that are forbidden to be lvalues are: 1011 /// - 'void', but not qualified void 1012 /// - function types 1013 /// 1014 /// The exact rule here is C99 6.3.2.1: 1015 /// An lvalue is an expression with an object type or an incomplete 1016 /// type other than void. 1017 bool isCForbiddenLValueType() const; 1018 1019 /// Substitute type arguments for the Objective-C type parameters used in the 1020 /// subject type. 1021 /// 1022 /// \param ctx ASTContext in which the type exists. 1023 /// 1024 /// \param typeArgs The type arguments that will be substituted for the 1025 /// Objective-C type parameters in the subject type, which are generally 1026 /// computed via \c Type::getObjCSubstitutions. If empty, the type 1027 /// parameters will be replaced with their bounds or id/Class, as appropriate 1028 /// for the context. 1029 /// 1030 /// \param context The context in which the subject type was written. 1031 /// 1032 /// \returns the resulting type. 1033 QualType substObjCTypeArgs(ASTContext &ctx, 1034 ArrayRef<QualType> typeArgs, 1035 ObjCSubstitutionContext context) const; 1036 1037 /// Substitute type arguments from an object type for the Objective-C type 1038 /// parameters used in the subject type. 1039 /// 1040 /// This operation combines the computation of type arguments for 1041 /// substitution (\c Type::getObjCSubstitutions) with the actual process of 1042 /// substitution (\c QualType::substObjCTypeArgs) for the convenience of 1043 /// callers that need to perform a single substitution in isolation. 1044 /// 1045 /// \param objectType The type of the object whose member type we're 1046 /// substituting into. For example, this might be the receiver of a message 1047 /// or the base of a property access. 1048 /// 1049 /// \param dc The declaration context from which the subject type was 1050 /// retrieved, which indicates (for example) which type parameters should 1051 /// be substituted. 1052 /// 1053 /// \param context The context in which the subject type was written. 1054 /// 1055 /// \returns the subject type after replacing all of the Objective-C type 1056 /// parameters with their corresponding arguments. 1057 QualType substObjCMemberType(QualType objectType, 1058 const DeclContext *dc, 1059 ObjCSubstitutionContext context) const; 1060 1061 /// Strip Objective-C "__kindof" types from the given type. 1062 QualType stripObjCKindOfType(const ASTContext &ctx) const; 1063 1064 private: 1065 // These methods are implemented in a separate translation unit; 1066 // "static"-ize them to avoid creating temporary QualTypes in the 1067 // caller. 1068 static bool isConstant(QualType T, ASTContext& Ctx); 1069 static QualType getDesugaredType(QualType T, const ASTContext &Context); 1070 static SplitQualType getSplitDesugaredType(QualType T); 1071 static SplitQualType getSplitUnqualifiedTypeImpl(QualType type); 1072 static QualType getSingleStepDesugaredTypeImpl(QualType type, 1073 const ASTContext &C); 1074 static QualType IgnoreParens(QualType T); 1075 static DestructionKind isDestructedTypeImpl(QualType type); 1076 }; 1077 1078 } // end clang. 1079 1080 namespace llvm { 1081 /// Implement simplify_type for QualType, so that we can dyn_cast from QualType 1082 /// to a specific Type class. 1083 template<> struct simplify_type< ::clang::QualType> { 1084 typedef const ::clang::Type *SimpleType; 1085 static SimpleType getSimplifiedValue(::clang::QualType Val) { 1086 return Val.getTypePtr(); 1087 } 1088 }; 1089 1090 // Teach SmallPtrSet that QualType is "basically a pointer". 1091 template<> 1092 class PointerLikeTypeTraits<clang::QualType> { 1093 public: 1094 static inline void *getAsVoidPointer(clang::QualType P) { 1095 return P.getAsOpaquePtr(); 1096 } 1097 static inline clang::QualType getFromVoidPointer(void *P) { 1098 return clang::QualType::getFromOpaquePtr(P); 1099 } 1100 // Various qualifiers go in low bits. 1101 enum { NumLowBitsAvailable = 0 }; 1102 }; 1103 1104 } // end namespace llvm 1105 1106 namespace clang { 1107 1108 /// \brief Base class that is common to both the \c ExtQuals and \c Type 1109 /// classes, which allows \c QualType to access the common fields between the 1110 /// two. 1111 /// 1112 class ExtQualsTypeCommonBase { 1113 ExtQualsTypeCommonBase(const Type *baseType, QualType canon) 1114 : BaseType(baseType), CanonicalType(canon) {} 1115 1116 /// \brief The "base" type of an extended qualifiers type (\c ExtQuals) or 1117 /// a self-referential pointer (for \c Type). 1118 /// 1119 /// This pointer allows an efficient mapping from a QualType to its 1120 /// underlying type pointer. 1121 const Type *const BaseType; 1122 1123 /// \brief The canonical type of this type. A QualType. 1124 QualType CanonicalType; 1125 1126 friend class QualType; 1127 friend class Type; 1128 friend class ExtQuals; 1129 }; 1130 1131 /// We can encode up to four bits in the low bits of a 1132 /// type pointer, but there are many more type qualifiers that we want 1133 /// to be able to apply to an arbitrary type. Therefore we have this 1134 /// struct, intended to be heap-allocated and used by QualType to 1135 /// store qualifiers. 1136 /// 1137 /// The current design tags the 'const', 'restrict', and 'volatile' qualifiers 1138 /// in three low bits on the QualType pointer; a fourth bit records whether 1139 /// the pointer is an ExtQuals node. The extended qualifiers (address spaces, 1140 /// Objective-C GC attributes) are much more rare. 1141 class ExtQuals : public ExtQualsTypeCommonBase, public llvm::FoldingSetNode { 1142 // NOTE: changing the fast qualifiers should be straightforward as 1143 // long as you don't make 'const' non-fast. 1144 // 1. Qualifiers: 1145 // a) Modify the bitmasks (Qualifiers::TQ and DeclSpec::TQ). 1146 // Fast qualifiers must occupy the low-order bits. 1147 // b) Update Qualifiers::FastWidth and FastMask. 1148 // 2. QualType: 1149 // a) Update is{Volatile,Restrict}Qualified(), defined inline. 1150 // b) Update remove{Volatile,Restrict}, defined near the end of 1151 // this header. 1152 // 3. ASTContext: 1153 // a) Update get{Volatile,Restrict}Type. 1154 1155 /// The immutable set of qualifiers applied by this node. Always contains 1156 /// extended qualifiers. 1157 Qualifiers Quals; 1158 1159 ExtQuals *this_() { return this; } 1160 1161 public: 1162 ExtQuals(const Type *baseType, QualType canon, Qualifiers quals) 1163 : ExtQualsTypeCommonBase(baseType, 1164 canon.isNull() ? QualType(this_(), 0) : canon), 1165 Quals(quals) 1166 { 1167 assert(Quals.hasNonFastQualifiers() 1168 && "ExtQuals created with no fast qualifiers"); 1169 assert(!Quals.hasFastQualifiers() 1170 && "ExtQuals created with fast qualifiers"); 1171 } 1172 1173 Qualifiers getQualifiers() const { return Quals; } 1174 1175 bool hasObjCGCAttr() const { return Quals.hasObjCGCAttr(); } 1176 Qualifiers::GC getObjCGCAttr() const { return Quals.getObjCGCAttr(); } 1177 1178 bool hasObjCLifetime() const { return Quals.hasObjCLifetime(); } 1179 Qualifiers::ObjCLifetime getObjCLifetime() const { 1180 return Quals.getObjCLifetime(); 1181 } 1182 1183 bool hasAddressSpace() const { return Quals.hasAddressSpace(); } 1184 unsigned getAddressSpace() const { return Quals.getAddressSpace(); } 1185 1186 const Type *getBaseType() const { return BaseType; } 1187 1188 public: 1189 void Profile(llvm::FoldingSetNodeID &ID) const { 1190 Profile(ID, getBaseType(), Quals); 1191 } 1192 static void Profile(llvm::FoldingSetNodeID &ID, 1193 const Type *BaseType, 1194 Qualifiers Quals) { 1195 assert(!Quals.hasFastQualifiers() && "fast qualifiers in ExtQuals hash!"); 1196 ID.AddPointer(BaseType); 1197 Quals.Profile(ID); 1198 } 1199 }; 1200 1201 /// The kind of C++11 ref-qualifier associated with a function type. 1202 /// This determines whether a member function's "this" object can be an 1203 /// lvalue, rvalue, or neither. 1204 enum RefQualifierKind { 1205 /// \brief No ref-qualifier was provided. 1206 RQ_None = 0, 1207 /// \brief An lvalue ref-qualifier was provided (\c &). 1208 RQ_LValue, 1209 /// \brief An rvalue ref-qualifier was provided (\c &&). 1210 RQ_RValue 1211 }; 1212 1213 /// Which keyword(s) were used to create an AutoType. 1214 enum class AutoTypeKeyword { 1215 /// \brief auto 1216 Auto, 1217 /// \brief decltype(auto) 1218 DecltypeAuto, 1219 /// \brief __auto_type (GNU extension) 1220 GNUAutoType 1221 }; 1222 1223 /// The base class of the type hierarchy. 1224 /// 1225 /// A central concept with types is that each type always has a canonical 1226 /// type. A canonical type is the type with any typedef names stripped out 1227 /// of it or the types it references. For example, consider: 1228 /// 1229 /// typedef int foo; 1230 /// typedef foo* bar; 1231 /// 'int *' 'foo *' 'bar' 1232 /// 1233 /// There will be a Type object created for 'int'. Since int is canonical, its 1234 /// CanonicalType pointer points to itself. There is also a Type for 'foo' (a 1235 /// TypedefType). Its CanonicalType pointer points to the 'int' Type. Next 1236 /// there is a PointerType that represents 'int*', which, like 'int', is 1237 /// canonical. Finally, there is a PointerType type for 'foo*' whose canonical 1238 /// type is 'int*', and there is a TypedefType for 'bar', whose canonical type 1239 /// is also 'int*'. 1240 /// 1241 /// Non-canonical types are useful for emitting diagnostics, without losing 1242 /// information about typedefs being used. Canonical types are useful for type 1243 /// comparisons (they allow by-pointer equality tests) and useful for reasoning 1244 /// about whether something has a particular form (e.g. is a function type), 1245 /// because they implicitly, recursively, strip all typedefs out of a type. 1246 /// 1247 /// Types, once created, are immutable. 1248 /// 1249 class Type : public ExtQualsTypeCommonBase { 1250 public: 1251 enum TypeClass { 1252 #define TYPE(Class, Base) Class, 1253 #define LAST_TYPE(Class) TypeLast = Class, 1254 #define ABSTRACT_TYPE(Class, Base) 1255 #include "clang/AST/TypeNodes.def" 1256 TagFirst = Record, TagLast = Enum 1257 }; 1258 1259 private: 1260 Type(const Type &) = delete; 1261 void operator=(const Type &) = delete; 1262 1263 /// Bitfields required by the Type class. 1264 class TypeBitfields { 1265 friend class Type; 1266 template <class T> friend class TypePropertyCache; 1267 1268 /// TypeClass bitfield - Enum that specifies what subclass this belongs to. 1269 unsigned TC : 8; 1270 1271 /// Whether this type is a dependent type (C++ [temp.dep.type]). 1272 unsigned Dependent : 1; 1273 1274 /// Whether this type somehow involves a template parameter, even 1275 /// if the resolution of the type does not depend on a template parameter. 1276 unsigned InstantiationDependent : 1; 1277 1278 /// Whether this type is a variably-modified type (C99 6.7.5). 1279 unsigned VariablyModified : 1; 1280 1281 /// \brief Whether this type contains an unexpanded parameter pack 1282 /// (for C++11 variadic templates). 1283 unsigned ContainsUnexpandedParameterPack : 1; 1284 1285 /// \brief True if the cache (i.e. the bitfields here starting with 1286 /// 'Cache') is valid. 1287 mutable unsigned CacheValid : 1; 1288 1289 /// \brief Linkage of this type. 1290 mutable unsigned CachedLinkage : 3; 1291 1292 /// \brief Whether this type involves and local or unnamed types. 1293 mutable unsigned CachedLocalOrUnnamed : 1; 1294 1295 /// \brief Whether this type comes from an AST file. 1296 mutable unsigned FromAST : 1; 1297 1298 bool isCacheValid() const { 1299 return CacheValid; 1300 } 1301 Linkage getLinkage() const { 1302 assert(isCacheValid() && "getting linkage from invalid cache"); 1303 return static_cast<Linkage>(CachedLinkage); 1304 } 1305 bool hasLocalOrUnnamedType() const { 1306 assert(isCacheValid() && "getting linkage from invalid cache"); 1307 return CachedLocalOrUnnamed; 1308 } 1309 }; 1310 enum { NumTypeBits = 18 }; 1311 1312 protected: 1313 // These classes allow subclasses to somewhat cleanly pack bitfields 1314 // into Type. 1315 1316 class ArrayTypeBitfields { 1317 friend class ArrayType; 1318 1319 unsigned : NumTypeBits; 1320 1321 /// CVR qualifiers from declarations like 1322 /// 'int X[static restrict 4]'. For function parameters only. 1323 unsigned IndexTypeQuals : 3; 1324 1325 /// Storage class qualifiers from declarations like 1326 /// 'int X[static restrict 4]'. For function parameters only. 1327 /// Actually an ArrayType::ArraySizeModifier. 1328 unsigned SizeModifier : 3; 1329 }; 1330 1331 class BuiltinTypeBitfields { 1332 friend class BuiltinType; 1333 1334 unsigned : NumTypeBits; 1335 1336 /// The kind (BuiltinType::Kind) of builtin type this is. 1337 unsigned Kind : 8; 1338 }; 1339 1340 class FunctionTypeBitfields { 1341 friend class FunctionType; 1342 friend class FunctionProtoType; 1343 1344 unsigned : NumTypeBits; 1345 1346 /// Extra information which affects how the function is called, like 1347 /// regparm and the calling convention. 1348 unsigned ExtInfo : 9; 1349 1350 /// Used only by FunctionProtoType, put here to pack with the 1351 /// other bitfields. 1352 /// The qualifiers are part of FunctionProtoType because... 1353 /// 1354 /// C++ 8.3.5p4: The return type, the parameter type list and the 1355 /// cv-qualifier-seq, [...], are part of the function type. 1356 unsigned TypeQuals : 3; 1357 1358 /// \brief The ref-qualifier associated with a \c FunctionProtoType. 1359 /// 1360 /// This is a value of type \c RefQualifierKind. 1361 unsigned RefQualifier : 2; 1362 }; 1363 1364 class ObjCObjectTypeBitfields { 1365 friend class ObjCObjectType; 1366 1367 unsigned : NumTypeBits; 1368 1369 /// The number of type arguments stored directly on this object type. 1370 unsigned NumTypeArgs : 7; 1371 1372 /// The number of protocols stored directly on this object type. 1373 unsigned NumProtocols : 6; 1374 1375 /// Whether this is a "kindof" type. 1376 unsigned IsKindOf : 1; 1377 }; 1378 static_assert(NumTypeBits + 7 + 6 + 1 <= 32, "Does not fit in an unsigned"); 1379 1380 class ReferenceTypeBitfields { 1381 friend class ReferenceType; 1382 1383 unsigned : NumTypeBits; 1384 1385 /// True if the type was originally spelled with an lvalue sigil. 1386 /// This is never true of rvalue references but can also be false 1387 /// on lvalue references because of C++0x [dcl.typedef]p9, 1388 /// as follows: 1389 /// 1390 /// typedef int &ref; // lvalue, spelled lvalue 1391 /// typedef int &&rvref; // rvalue 1392 /// ref &a; // lvalue, inner ref, spelled lvalue 1393 /// ref &&a; // lvalue, inner ref 1394 /// rvref &a; // lvalue, inner ref, spelled lvalue 1395 /// rvref &&a; // rvalue, inner ref 1396 unsigned SpelledAsLValue : 1; 1397 1398 /// True if the inner type is a reference type. This only happens 1399 /// in non-canonical forms. 1400 unsigned InnerRef : 1; 1401 }; 1402 1403 class TypeWithKeywordBitfields { 1404 friend class TypeWithKeyword; 1405 1406 unsigned : NumTypeBits; 1407 1408 /// An ElaboratedTypeKeyword. 8 bits for efficient access. 1409 unsigned Keyword : 8; 1410 }; 1411 1412 class VectorTypeBitfields { 1413 friend class VectorType; 1414 1415 unsigned : NumTypeBits; 1416 1417 /// The kind of vector, either a generic vector type or some 1418 /// target-specific vector type such as for AltiVec or Neon. 1419 unsigned VecKind : 3; 1420 1421 /// The number of elements in the vector. 1422 unsigned NumElements : 29 - NumTypeBits; 1423 1424 enum { MaxNumElements = (1 << (29 - NumTypeBits)) - 1 }; 1425 }; 1426 1427 class AttributedTypeBitfields { 1428 friend class AttributedType; 1429 1430 unsigned : NumTypeBits; 1431 1432 /// An AttributedType::Kind 1433 unsigned AttrKind : 32 - NumTypeBits; 1434 }; 1435 1436 class AutoTypeBitfields { 1437 friend class AutoType; 1438 1439 unsigned : NumTypeBits; 1440 1441 /// Was this placeholder type spelled as 'auto', 'decltype(auto)', 1442 /// or '__auto_type'? AutoTypeKeyword value. 1443 unsigned Keyword : 2; 1444 }; 1445 1446 union { 1447 TypeBitfields TypeBits; 1448 ArrayTypeBitfields ArrayTypeBits; 1449 AttributedTypeBitfields AttributedTypeBits; 1450 AutoTypeBitfields AutoTypeBits; 1451 BuiltinTypeBitfields BuiltinTypeBits; 1452 FunctionTypeBitfields FunctionTypeBits; 1453 ObjCObjectTypeBitfields ObjCObjectTypeBits; 1454 ReferenceTypeBitfields ReferenceTypeBits; 1455 TypeWithKeywordBitfields TypeWithKeywordBits; 1456 VectorTypeBitfields VectorTypeBits; 1457 }; 1458 1459 private: 1460 /// \brief Set whether this type comes from an AST file. 1461 void setFromAST(bool V = true) const { 1462 TypeBits.FromAST = V; 1463 } 1464 1465 template <class T> friend class TypePropertyCache; 1466 1467 protected: 1468 // silence VC++ warning C4355: 'this' : used in base member initializer list 1469 Type *this_() { return this; } 1470 Type(TypeClass tc, QualType canon, bool Dependent, 1471 bool InstantiationDependent, bool VariablyModified, 1472 bool ContainsUnexpandedParameterPack) 1473 : ExtQualsTypeCommonBase(this, 1474 canon.isNull() ? QualType(this_(), 0) : canon) { 1475 TypeBits.TC = tc; 1476 TypeBits.Dependent = Dependent; 1477 TypeBits.InstantiationDependent = Dependent || InstantiationDependent; 1478 TypeBits.VariablyModified = VariablyModified; 1479 TypeBits.ContainsUnexpandedParameterPack = ContainsUnexpandedParameterPack; 1480 TypeBits.CacheValid = false; 1481 TypeBits.CachedLocalOrUnnamed = false; 1482 TypeBits.CachedLinkage = NoLinkage; 1483 TypeBits.FromAST = false; 1484 } 1485 friend class ASTContext; 1486 1487 void setDependent(bool D = true) { 1488 TypeBits.Dependent = D; 1489 if (D) 1490 TypeBits.InstantiationDependent = true; 1491 } 1492 void setInstantiationDependent(bool D = true) { 1493 TypeBits.InstantiationDependent = D; } 1494 void setVariablyModified(bool VM = true) { TypeBits.VariablyModified = VM; 1495 } 1496 void setContainsUnexpandedParameterPack(bool PP = true) { 1497 TypeBits.ContainsUnexpandedParameterPack = PP; 1498 } 1499 1500 public: 1501 TypeClass getTypeClass() const { return static_cast<TypeClass>(TypeBits.TC); } 1502 1503 /// \brief Whether this type comes from an AST file. 1504 bool isFromAST() const { return TypeBits.FromAST; } 1505 1506 /// \brief Whether this type is or contains an unexpanded parameter 1507 /// pack, used to support C++0x variadic templates. 1508 /// 1509 /// A type that contains a parameter pack shall be expanded by the 1510 /// ellipsis operator at some point. For example, the typedef in the 1511 /// following example contains an unexpanded parameter pack 'T': 1512 /// 1513 /// \code 1514 /// template<typename ...T> 1515 /// struct X { 1516 /// typedef T* pointer_types; // ill-formed; T is a parameter pack. 1517 /// }; 1518 /// \endcode 1519 /// 1520 /// Note that this routine does not specify which 1521 bool containsUnexpandedParameterPack() const { 1522 return TypeBits.ContainsUnexpandedParameterPack; 1523 } 1524 1525 /// Determines if this type would be canonical if it had no further 1526 /// qualification. 1527 bool isCanonicalUnqualified() const { 1528 return CanonicalType == QualType(this, 0); 1529 } 1530 1531 /// Pull a single level of sugar off of this locally-unqualified type. 1532 /// Users should generally prefer SplitQualType::getSingleStepDesugaredType() 1533 /// or QualType::getSingleStepDesugaredType(const ASTContext&). 1534 QualType getLocallyUnqualifiedSingleStepDesugaredType() const; 1535 1536 /// Types are partitioned into 3 broad categories (C99 6.2.5p1): 1537 /// object types, function types, and incomplete types. 1538 1539 /// Return true if this is an incomplete type. 1540 /// A type that can describe objects, but which lacks information needed to 1541 /// determine its size (e.g. void, or a fwd declared struct). Clients of this 1542 /// routine will need to determine if the size is actually required. 1543 /// 1544 /// \brief Def If non-null, and the type refers to some kind of declaration 1545 /// that can be completed (such as a C struct, C++ class, or Objective-C 1546 /// class), will be set to the declaration. 1547 bool isIncompleteType(NamedDecl **Def = nullptr) const; 1548 1549 /// Return true if this is an incomplete or object 1550 /// type, in other words, not a function type. 1551 bool isIncompleteOrObjectType() const { 1552 return !isFunctionType(); 1553 } 1554 1555 /// \brief Determine whether this type is an object type. 1556 bool isObjectType() const { 1557 // C++ [basic.types]p8: 1558 // An object type is a (possibly cv-qualified) type that is not a 1559 // function type, not a reference type, and not a void type. 1560 return !isReferenceType() && !isFunctionType() && !isVoidType(); 1561 } 1562 1563 /// Return true if this is a literal type 1564 /// (C++11 [basic.types]p10) 1565 bool isLiteralType(const ASTContext &Ctx) const; 1566 1567 /// Test if this type is a standard-layout type. 1568 /// (C++0x [basic.type]p9) 1569 bool isStandardLayoutType() const; 1570 1571 /// Helper methods to distinguish type categories. All type predicates 1572 /// operate on the canonical type, ignoring typedefs and qualifiers. 1573 1574 /// Returns true if the type is a builtin type. 1575 bool isBuiltinType() const; 1576 1577 /// Test for a particular builtin type. 1578 bool isSpecificBuiltinType(unsigned K) const; 1579 1580 /// Test for a type which does not represent an actual type-system type but 1581 /// is instead used as a placeholder for various convenient purposes within 1582 /// Clang. All such types are BuiltinTypes. 1583 bool isPlaceholderType() const; 1584 const BuiltinType *getAsPlaceholderType() const; 1585 1586 /// Test for a specific placeholder type. 1587 bool isSpecificPlaceholderType(unsigned K) const; 1588 1589 /// Test for a placeholder type other than Overload; see 1590 /// BuiltinType::isNonOverloadPlaceholderType. 1591 bool isNonOverloadPlaceholderType() const; 1592 1593 /// isIntegerType() does *not* include complex integers (a GCC extension). 1594 /// isComplexIntegerType() can be used to test for complex integers. 1595 bool isIntegerType() const; // C99 6.2.5p17 (int, char, bool, enum) 1596 bool isEnumeralType() const; 1597 bool isBooleanType() const; 1598 bool isCharType() const; 1599 bool isWideCharType() const; 1600 bool isChar16Type() const; 1601 bool isChar32Type() const; 1602 bool isAnyCharacterType() const; 1603 bool isIntegralType(ASTContext &Ctx) const; 1604 1605 /// Determine whether this type is an integral or enumeration type. 1606 bool isIntegralOrEnumerationType() const; 1607 /// Determine whether this type is an integral or unscoped enumeration type. 1608 bool isIntegralOrUnscopedEnumerationType() const; 1609 1610 /// Floating point categories. 1611 bool isRealFloatingType() const; // C99 6.2.5p10 (float, double, long double) 1612 /// isComplexType() does *not* include complex integers (a GCC extension). 1613 /// isComplexIntegerType() can be used to test for complex integers. 1614 bool isComplexType() const; // C99 6.2.5p11 (complex) 1615 bool isAnyComplexType() const; // C99 6.2.5p11 (complex) + Complex Int. 1616 bool isFloatingType() const; // C99 6.2.5p11 (real floating + complex) 1617 bool isHalfType() const; // OpenCL 6.1.1.1, NEON (IEEE 754-2008 half) 1618 bool isRealType() const; // C99 6.2.5p17 (real floating + integer) 1619 bool isArithmeticType() const; // C99 6.2.5p18 (integer + floating) 1620 bool isVoidType() const; // C99 6.2.5p19 1621 bool isScalarType() const; // C99 6.2.5p21 (arithmetic + pointers) 1622 bool isAggregateType() const; 1623 bool isFundamentalType() const; 1624 bool isCompoundType() const; 1625 1626 // Type Predicates: Check to see if this type is structurally the specified 1627 // type, ignoring typedefs and qualifiers. 1628 bool isFunctionType() const; 1629 bool isFunctionNoProtoType() const { return getAs<FunctionNoProtoType>(); } 1630 bool isFunctionProtoType() const { return getAs<FunctionProtoType>(); } 1631 bool isPointerType() const; 1632 bool isAnyPointerType() const; // Any C pointer or ObjC object pointer 1633 bool isBlockPointerType() const; 1634 bool isVoidPointerType() const; 1635 bool isReferenceType() const; 1636 bool isLValueReferenceType() const; 1637 bool isRValueReferenceType() const; 1638 bool isFunctionPointerType() const; 1639 bool isMemberPointerType() const; 1640 bool isMemberFunctionPointerType() const; 1641 bool isMemberDataPointerType() const; 1642 bool isArrayType() const; 1643 bool isConstantArrayType() const; 1644 bool isIncompleteArrayType() const; 1645 bool isVariableArrayType() const; 1646 bool isDependentSizedArrayType() const; 1647 bool isRecordType() const; 1648 bool isClassType() const; 1649 bool isStructureType() const; 1650 bool isObjCBoxableRecordType() const; 1651 bool isInterfaceType() const; 1652 bool isStructureOrClassType() const; 1653 bool isUnionType() const; 1654 bool isComplexIntegerType() const; // GCC _Complex integer type. 1655 bool isVectorType() const; // GCC vector type. 1656 bool isExtVectorType() const; // Extended vector type. 1657 bool isObjCObjectPointerType() const; // pointer to ObjC object 1658 bool isObjCRetainableType() const; // ObjC object or block pointer 1659 bool isObjCLifetimeType() const; // (array of)* retainable type 1660 bool isObjCIndirectLifetimeType() const; // (pointer to)* lifetime type 1661 bool isObjCNSObjectType() const; // __attribute__((NSObject)) 1662 bool isObjCIndependentClassType() const; // __attribute__((objc_independent_class)) 1663 // FIXME: change this to 'raw' interface type, so we can used 'interface' type 1664 // for the common case. 1665 bool isObjCObjectType() const; // NSString or typeof(*(id)0) 1666 bool isObjCQualifiedInterfaceType() const; // NSString<foo> 1667 bool isObjCQualifiedIdType() const; // id<foo> 1668 bool isObjCQualifiedClassType() const; // Class<foo> 1669 bool isObjCObjectOrInterfaceType() const; 1670 bool isObjCIdType() const; // id 1671 bool isObjCInertUnsafeUnretainedType() const; 1672 1673 /// Whether the type is Objective-C 'id' or a __kindof type of an 1674 /// object type, e.g., __kindof NSView * or __kindof id 1675 /// <NSCopying>. 1676 /// 1677 /// \param bound Will be set to the bound on non-id subtype types, 1678 /// which will be (possibly specialized) Objective-C class type, or 1679 /// null for 'id. 1680 bool isObjCIdOrObjectKindOfType(const ASTContext &ctx, 1681 const ObjCObjectType *&bound) const; 1682 1683 bool isObjCClassType() const; // Class 1684 1685 /// Whether the type is Objective-C 'Class' or a __kindof type of an 1686 /// Class type, e.g., __kindof Class <NSCopying>. 1687 /// 1688 /// Unlike \c isObjCIdOrObjectKindOfType, there is no relevant bound 1689 /// here because Objective-C's type system cannot express "a class 1690 /// object for a subclass of NSFoo". 1691 bool isObjCClassOrClassKindOfType() const; 1692 1693 bool isBlockCompatibleObjCPointerType(ASTContext &ctx) const; 1694 bool isObjCSelType() const; // Class 1695 bool isObjCBuiltinType() const; // 'id' or 'Class' 1696 bool isObjCARCBridgableType() const; 1697 bool isCARCBridgableType() const; 1698 bool isTemplateTypeParmType() const; // C++ template type parameter 1699 bool isNullPtrType() const; // C++0x nullptr_t 1700 bool isAtomicType() const; // C11 _Atomic() 1701 1702 bool isImage1dT() const; // OpenCL image1d_t 1703 bool isImage1dArrayT() const; // OpenCL image1d_array_t 1704 bool isImage1dBufferT() const; // OpenCL image1d_buffer_t 1705 bool isImage2dT() const; // OpenCL image2d_t 1706 bool isImage2dArrayT() const; // OpenCL image2d_array_t 1707 bool isImage2dDepthT() const; // OpenCL image_2d_depth_t 1708 bool isImage2dArrayDepthT() const; // OpenCL image_2d_array_depth_t 1709 bool isImage2dMSAAT() const; // OpenCL image_2d_msaa_t 1710 bool isImage2dArrayMSAAT() const; // OpenCL image_2d_array_msaa_t 1711 bool isImage2dMSAATDepth() const; // OpenCL image_2d_msaa_depth_t 1712 bool isImage2dArrayMSAATDepth() const; // OpenCL image_2d_array_msaa_depth_t 1713 bool isImage3dT() const; // OpenCL image3d_t 1714 1715 bool isImageType() const; // Any OpenCL image type 1716 1717 bool isSamplerT() const; // OpenCL sampler_t 1718 bool isEventT() const; // OpenCL event_t 1719 bool isClkEventT() const; // OpenCL clk_event_t 1720 bool isQueueT() const; // OpenCL queue_t 1721 bool isNDRangeT() const; // OpenCL ndrange_t 1722 bool isReserveIDT() const; // OpenCL reserve_id_t 1723 1724 bool isOpenCLSpecificType() const; // Any OpenCL specific type 1725 1726 /// Determines if this type, which must satisfy 1727 /// isObjCLifetimeType(), is implicitly __unsafe_unretained rather 1728 /// than implicitly __strong. 1729 bool isObjCARCImplicitlyUnretainedType() const; 1730 1731 /// Return the implicit lifetime for this type, which must not be dependent. 1732 Qualifiers::ObjCLifetime getObjCARCImplicitLifetime() const; 1733 1734 enum ScalarTypeKind { 1735 STK_CPointer, 1736 STK_BlockPointer, 1737 STK_ObjCObjectPointer, 1738 STK_MemberPointer, 1739 STK_Bool, 1740 STK_Integral, 1741 STK_Floating, 1742 STK_IntegralComplex, 1743 STK_FloatingComplex 1744 }; 1745 /// Given that this is a scalar type, classify it. 1746 ScalarTypeKind getScalarTypeKind() const; 1747 1748 /// Whether this type is a dependent type, meaning that its definition 1749 /// somehow depends on a template parameter (C++ [temp.dep.type]). 1750 bool isDependentType() const { return TypeBits.Dependent; } 1751 1752 /// \brief Determine whether this type is an instantiation-dependent type, 1753 /// meaning that the type involves a template parameter (even if the 1754 /// definition does not actually depend on the type substituted for that 1755 /// template parameter). 1756 bool isInstantiationDependentType() const { 1757 return TypeBits.InstantiationDependent; 1758 } 1759 1760 /// \brief Determine whether this type is an undeduced type, meaning that 1761 /// it somehow involves a C++11 'auto' type which has not yet been deduced. 1762 bool isUndeducedType() const; 1763 1764 /// \brief Whether this type is a variably-modified type (C99 6.7.5). 1765 bool isVariablyModifiedType() const { return TypeBits.VariablyModified; } 1766 1767 /// \brief Whether this type involves a variable-length array type 1768 /// with a definite size. 1769 bool hasSizedVLAType() const; 1770 1771 /// \brief Whether this type is or contains a local or unnamed type. 1772 bool hasUnnamedOrLocalType() const; 1773 1774 bool isOverloadableType() const; 1775 1776 /// \brief Determine wither this type is a C++ elaborated-type-specifier. 1777 bool isElaboratedTypeSpecifier() const; 1778 1779 bool canDecayToPointerType() const; 1780 1781 /// Whether this type is represented natively as a pointer. This includes 1782 /// pointers, references, block pointers, and Objective-C interface, 1783 /// qualified id, and qualified interface types, as well as nullptr_t. 1784 bool hasPointerRepresentation() const; 1785 1786 /// Whether this type can represent an objective pointer type for the 1787 /// purpose of GC'ability 1788 bool hasObjCPointerRepresentation() const; 1789 1790 /// \brief Determine whether this type has an integer representation 1791 /// of some sort, e.g., it is an integer type or a vector. 1792 bool hasIntegerRepresentation() const; 1793 1794 /// \brief Determine whether this type has an signed integer representation 1795 /// of some sort, e.g., it is an signed integer type or a vector. 1796 bool hasSignedIntegerRepresentation() const; 1797 1798 /// \brief Determine whether this type has an unsigned integer representation 1799 /// of some sort, e.g., it is an unsigned integer type or a vector. 1800 bool hasUnsignedIntegerRepresentation() const; 1801 1802 /// \brief Determine whether this type has a floating-point representation 1803 /// of some sort, e.g., it is a floating-point type or a vector thereof. 1804 bool hasFloatingRepresentation() const; 1805 1806 // Type Checking Functions: Check to see if this type is structurally the 1807 // specified type, ignoring typedefs and qualifiers, and return a pointer to 1808 // the best type we can. 1809 const RecordType *getAsStructureType() const; 1810 /// NOTE: getAs*ArrayType are methods on ASTContext. 1811 const RecordType *getAsUnionType() const; 1812 const ComplexType *getAsComplexIntegerType() const; // GCC complex int type. 1813 const ObjCObjectType *getAsObjCInterfaceType() const; 1814 // The following is a convenience method that returns an ObjCObjectPointerType 1815 // for object declared using an interface. 1816 const ObjCObjectPointerType *getAsObjCInterfacePointerType() const; 1817 const ObjCObjectPointerType *getAsObjCQualifiedIdType() const; 1818 const ObjCObjectPointerType *getAsObjCQualifiedClassType() const; 1819 const ObjCObjectType *getAsObjCQualifiedInterfaceType() const; 1820 1821 /// \brief Retrieves the CXXRecordDecl that this type refers to, either 1822 /// because the type is a RecordType or because it is the injected-class-name 1823 /// type of a class template or class template partial specialization. 1824 CXXRecordDecl *getAsCXXRecordDecl() const; 1825 1826 /// \brief Retrieves the TagDecl that this type refers to, either 1827 /// because the type is a TagType or because it is the injected-class-name 1828 /// type of a class template or class template partial specialization. 1829 TagDecl *getAsTagDecl() const; 1830 1831 /// If this is a pointer or reference to a RecordType, return the 1832 /// CXXRecordDecl that that type refers to. 1833 /// 1834 /// If this is not a pointer or reference, or the type being pointed to does 1835 /// not refer to a CXXRecordDecl, returns NULL. 1836 const CXXRecordDecl *getPointeeCXXRecordDecl() const; 1837 1838 /// Get the AutoType whose type will be deduced for a variable with 1839 /// an initializer of this type. This looks through declarators like pointer 1840 /// types, but not through decltype or typedefs. 1841 AutoType *getContainedAutoType() const; 1842 1843 /// Member-template getAs<specific type>'. Look through sugar for 1844 /// an instance of \<specific type>. This scheme will eventually 1845 /// replace the specific getAsXXXX methods above. 1846 /// 1847 /// There are some specializations of this member template listed 1848 /// immediately following this class. 1849 template <typename T> const T *getAs() const; 1850 1851 /// A variant of getAs<> for array types which silently discards 1852 /// qualifiers from the outermost type. 1853 const ArrayType *getAsArrayTypeUnsafe() const; 1854 1855 /// Member-template castAs<specific type>. Look through sugar for 1856 /// the underlying instance of \<specific type>. 1857 /// 1858 /// This method has the same relationship to getAs<T> as cast<T> has 1859 /// to dyn_cast<T>; which is to say, the underlying type *must* 1860 /// have the intended type, and this method will never return null. 1861 template <typename T> const T *castAs() const; 1862 1863 /// A variant of castAs<> for array type which silently discards 1864 /// qualifiers from the outermost type. 1865 const ArrayType *castAsArrayTypeUnsafe() const; 1866 1867 /// Get the base element type of this type, potentially discarding type 1868 /// qualifiers. This should never be used when type qualifiers 1869 /// are meaningful. 1870 const Type *getBaseElementTypeUnsafe() const; 1871 1872 /// If this is an array type, return the element type of the array, 1873 /// potentially with type qualifiers missing. 1874 /// This should never be used when type qualifiers are meaningful. 1875 const Type *getArrayElementTypeNoTypeQual() const; 1876 1877 /// If this is a pointer, ObjC object pointer, or block 1878 /// pointer, this returns the respective pointee. 1879 QualType getPointeeType() const; 1880 1881 /// Return the specified type with any "sugar" removed from the type, 1882 /// removing any typedefs, typeofs, etc., as well as any qualifiers. 1883 const Type *getUnqualifiedDesugaredType() const; 1884 1885 /// More type predicates useful for type checking/promotion 1886 bool isPromotableIntegerType() const; // C99 6.3.1.1p2 1887 1888 /// Return true if this is an integer type that is 1889 /// signed, according to C99 6.2.5p4 [char, signed char, short, int, long..], 1890 /// or an enum decl which has a signed representation. 1891 bool isSignedIntegerType() const; 1892 1893 /// Return true if this is an integer type that is 1894 /// unsigned, according to C99 6.2.5p6 [which returns true for _Bool], 1895 /// or an enum decl which has an unsigned representation. 1896 bool isUnsignedIntegerType() const; 1897 1898 /// Determines whether this is an integer type that is signed or an 1899 /// enumeration types whose underlying type is a signed integer type. 1900 bool isSignedIntegerOrEnumerationType() const; 1901 1902 /// Determines whether this is an integer type that is unsigned or an 1903 /// enumeration types whose underlying type is a unsigned integer type. 1904 bool isUnsignedIntegerOrEnumerationType() const; 1905 1906 /// Return true if this is not a variable sized type, 1907 /// according to the rules of C99 6.7.5p3. It is not legal to call this on 1908 /// incomplete types. 1909 bool isConstantSizeType() const; 1910 1911 /// Returns true if this type can be represented by some 1912 /// set of type specifiers. 1913 bool isSpecifierType() const; 1914 1915 /// Determine the linkage of this type. 1916 Linkage getLinkage() const; 1917 1918 /// Determine the visibility of this type. 1919 Visibility getVisibility() const { 1920 return getLinkageAndVisibility().getVisibility(); 1921 } 1922 1923 /// Return true if the visibility was explicitly set is the code. 1924 bool isVisibilityExplicit() const { 1925 return getLinkageAndVisibility().isVisibilityExplicit(); 1926 } 1927 1928 /// Determine the linkage and visibility of this type. 1929 LinkageInfo getLinkageAndVisibility() const; 1930 1931 /// True if the computed linkage is valid. Used for consistency 1932 /// checking. Should always return true. 1933 bool isLinkageValid() const; 1934 1935 /// Determine the nullability of the given type. 1936 /// 1937 /// Note that nullability is only captured as sugar within the type 1938 /// system, not as part of the canonical type, so nullability will 1939 /// be lost by canonicalization and desugaring. 1940 Optional<NullabilityKind> getNullability(const ASTContext &context) const; 1941 1942 /// Determine whether the given type can have a nullability 1943 /// specifier applied to it, i.e., if it is any kind of pointer type 1944 /// or a dependent type that could instantiate to any kind of 1945 /// pointer type. 1946 bool canHaveNullability() const; 1947 1948 /// Retrieve the set of substitutions required when accessing a member 1949 /// of the Objective-C receiver type that is declared in the given context. 1950 /// 1951 /// \c *this is the type of the object we're operating on, e.g., the 1952 /// receiver for a message send or the base of a property access, and is 1953 /// expected to be of some object or object pointer type. 1954 /// 1955 /// \param dc The declaration context for which we are building up a 1956 /// substitution mapping, which should be an Objective-C class, extension, 1957 /// category, or method within. 1958 /// 1959 /// \returns an array of type arguments that can be substituted for 1960 /// the type parameters of the given declaration context in any type described 1961 /// within that context, or an empty optional to indicate that no 1962 /// substitution is required. 1963 Optional<ArrayRef<QualType>> 1964 getObjCSubstitutions(const DeclContext *dc) const; 1965 1966 /// Determines if this is an ObjC interface type that may accept type 1967 /// parameters. 1968 bool acceptsObjCTypeParams() const; 1969 1970 const char *getTypeClassName() const; 1971 1972 QualType getCanonicalTypeInternal() const { 1973 return CanonicalType; 1974 } 1975 CanQualType getCanonicalTypeUnqualified() const; // in CanonicalType.h 1976 void dump() const; 1977 1978 friend class ASTReader; 1979 friend class ASTWriter; 1980 }; 1981 1982 /// \brief This will check for a TypedefType by removing any existing sugar 1983 /// until it reaches a TypedefType or a non-sugared type. 1984 template <> const TypedefType *Type::getAs() const; 1985 1986 /// \brief This will check for a TemplateSpecializationType by removing any 1987 /// existing sugar until it reaches a TemplateSpecializationType or a 1988 /// non-sugared type. 1989 template <> const TemplateSpecializationType *Type::getAs() const; 1990 1991 /// \brief This will check for an AttributedType by removing any existing sugar 1992 /// until it reaches an AttributedType or a non-sugared type. 1993 template <> const AttributedType *Type::getAs() const; 1994 1995 // We can do canonical leaf types faster, because we don't have to 1996 // worry about preserving child type decoration. 1997 #define TYPE(Class, Base) 1998 #define LEAF_TYPE(Class) \ 1999 template <> inline const Class##Type *Type::getAs() const { \ 2000 return dyn_cast<Class##Type>(CanonicalType); \ 2001 } \ 2002 template <> inline const Class##Type *Type::castAs() const { \ 2003 return cast<Class##Type>(CanonicalType); \ 2004 } 2005 #include "clang/AST/TypeNodes.def" 2006 2007 2008 /// This class is used for builtin types like 'int'. Builtin 2009 /// types are always canonical and have a literal name field. 2010 class BuiltinType : public Type { 2011 public: 2012 enum Kind { 2013 #define BUILTIN_TYPE(Id, SingletonId) Id, 2014 #define LAST_BUILTIN_TYPE(Id) LastKind = Id 2015 #include "clang/AST/BuiltinTypes.def" 2016 }; 2017 2018 public: 2019 BuiltinType(Kind K) 2020 : Type(Builtin, QualType(), /*Dependent=*/(K == Dependent), 2021 /*InstantiationDependent=*/(K == Dependent), 2022 /*VariablyModified=*/false, 2023 /*Unexpanded paramter pack=*/false) { 2024 BuiltinTypeBits.Kind = K; 2025 } 2026 2027 Kind getKind() const { return static_cast<Kind>(BuiltinTypeBits.Kind); } 2028 StringRef getName(const PrintingPolicy &Policy) const; 2029 const char *getNameAsCString(const PrintingPolicy &Policy) const { 2030 // The StringRef is null-terminated. 2031 StringRef str = getName(Policy); 2032 assert(!str.empty() && str.data()[str.size()] == '\0'); 2033 return str.data(); 2034 } 2035 2036 bool isSugared() const { return false; } 2037 QualType desugar() const { return QualType(this, 0); } 2038 2039 bool isInteger() const { 2040 return getKind() >= Bool && getKind() <= Int128; 2041 } 2042 2043 bool isSignedInteger() const { 2044 return getKind() >= Char_S && getKind() <= Int128; 2045 } 2046 2047 bool isUnsignedInteger() const { 2048 return getKind() >= Bool && getKind() <= UInt128; 2049 } 2050 2051 bool isFloatingPoint() const { 2052 return getKind() >= Half && getKind() <= LongDouble; 2053 } 2054 2055 /// Determines whether the given kind corresponds to a placeholder type. 2056 static bool isPlaceholderTypeKind(Kind K) { 2057 return K >= Overload; 2058 } 2059 2060 /// Determines whether this type is a placeholder type, i.e. a type 2061 /// which cannot appear in arbitrary positions in a fully-formed 2062 /// expression. 2063 bool isPlaceholderType() const { 2064 return isPlaceholderTypeKind(getKind()); 2065 } 2066 2067 /// Determines whether this type is a placeholder type other than 2068 /// Overload. Most placeholder types require only syntactic 2069 /// information about their context in order to be resolved (e.g. 2070 /// whether it is a call expression), which means they can (and 2071 /// should) be resolved in an earlier "phase" of analysis. 2072 /// Overload expressions sometimes pick up further information 2073 /// from their context, like whether the context expects a 2074 /// specific function-pointer type, and so frequently need 2075 /// special treatment. 2076 bool isNonOverloadPlaceholderType() const { 2077 return getKind() > Overload; 2078 } 2079 2080 static bool classof(const Type *T) { return T->getTypeClass() == Builtin; } 2081 }; 2082 2083 /// Complex values, per C99 6.2.5p11. This supports the C99 complex 2084 /// types (_Complex float etc) as well as the GCC integer complex extensions. 2085 /// 2086 class ComplexType : public Type, public llvm::FoldingSetNode { 2087 QualType ElementType; 2088 ComplexType(QualType Element, QualType CanonicalPtr) : 2089 Type(Complex, CanonicalPtr, Element->isDependentType(), 2090 Element->isInstantiationDependentType(), 2091 Element->isVariablyModifiedType(), 2092 Element->containsUnexpandedParameterPack()), 2093 ElementType(Element) { 2094 } 2095 friend class ASTContext; // ASTContext creates these. 2096 2097 public: 2098 QualType getElementType() const { return ElementType; } 2099 2100 bool isSugared() const { return false; } 2101 QualType desugar() const { return QualType(this, 0); } 2102 2103 void Profile(llvm::FoldingSetNodeID &ID) { 2104 Profile(ID, getElementType()); 2105 } 2106 static void Profile(llvm::FoldingSetNodeID &ID, QualType Element) { 2107 ID.AddPointer(Element.getAsOpaquePtr()); 2108 } 2109 2110 static bool classof(const Type *T) { return T->getTypeClass() == Complex; } 2111 }; 2112 2113 /// Sugar for parentheses used when specifying types. 2114 /// 2115 class ParenType : public Type, public llvm::FoldingSetNode { 2116 QualType Inner; 2117 2118 ParenType(QualType InnerType, QualType CanonType) : 2119 Type(Paren, CanonType, InnerType->isDependentType(), 2120 InnerType->isInstantiationDependentType(), 2121 InnerType->isVariablyModifiedType(), 2122 InnerType->containsUnexpandedParameterPack()), 2123 Inner(InnerType) { 2124 } 2125 friend class ASTContext; // ASTContext creates these. 2126 2127 public: 2128 2129 QualType getInnerType() const { return Inner; } 2130 2131 bool isSugared() const { return true; } 2132 QualType desugar() const { return getInnerType(); } 2133 2134 void Profile(llvm::FoldingSetNodeID &ID) { 2135 Profile(ID, getInnerType()); 2136 } 2137 static void Profile(llvm::FoldingSetNodeID &ID, QualType Inner) { 2138 Inner.Profile(ID); 2139 } 2140 2141 static bool classof(const Type *T) { return T->getTypeClass() == Paren; } 2142 }; 2143 2144 /// PointerType - C99 6.7.5.1 - Pointer Declarators. 2145 /// 2146 class PointerType : public Type, public llvm::FoldingSetNode { 2147 QualType PointeeType; 2148 2149 PointerType(QualType Pointee, QualType CanonicalPtr) : 2150 Type(Pointer, CanonicalPtr, Pointee->isDependentType(), 2151 Pointee->isInstantiationDependentType(), 2152 Pointee->isVariablyModifiedType(), 2153 Pointee->containsUnexpandedParameterPack()), 2154 PointeeType(Pointee) { 2155 } 2156 friend class ASTContext; // ASTContext creates these. 2157 2158 public: 2159 2160 QualType getPointeeType() const { return PointeeType; } 2161 2162 /// Returns true if address spaces of pointers overlap. 2163 /// OpenCL v2.0 defines conversion rules for pointers to different 2164 /// address spaces (OpenCLC v2.0 s6.5.5) and notion of overlapping 2165 /// address spaces. 2166 /// CL1.1 or CL1.2: 2167 /// address spaces overlap iff they are they same. 2168 /// CL2.0 adds: 2169 /// __generic overlaps with any address space except for __constant. 2170 bool isAddressSpaceOverlapping(const PointerType &other) const { 2171 Qualifiers thisQuals = PointeeType.getQualifiers(); 2172 Qualifiers otherQuals = other.getPointeeType().getQualifiers(); 2173 // Address spaces overlap if at least one of them is a superset of another 2174 return thisQuals.isAddressSpaceSupersetOf(otherQuals) || 2175 otherQuals.isAddressSpaceSupersetOf(thisQuals); 2176 } 2177 2178 bool isSugared() const { return false; } 2179 QualType desugar() const { return QualType(this, 0); } 2180 2181 void Profile(llvm::FoldingSetNodeID &ID) { 2182 Profile(ID, getPointeeType()); 2183 } 2184 static void Profile(llvm::FoldingSetNodeID &ID, QualType Pointee) { 2185 ID.AddPointer(Pointee.getAsOpaquePtr()); 2186 } 2187 2188 static bool classof(const Type *T) { return T->getTypeClass() == Pointer; } 2189 }; 2190 2191 /// Represents a type which was implicitly adjusted by the semantic 2192 /// engine for arbitrary reasons. For example, array and function types can 2193 /// decay, and function types can have their calling conventions adjusted. 2194 class AdjustedType : public Type, public llvm::FoldingSetNode { 2195 QualType OriginalTy; 2196 QualType AdjustedTy; 2197 2198 protected: 2199 AdjustedType(TypeClass TC, QualType OriginalTy, QualType AdjustedTy, 2200 QualType CanonicalPtr) 2201 : Type(TC, CanonicalPtr, OriginalTy->isDependentType(), 2202 OriginalTy->isInstantiationDependentType(), 2203 OriginalTy->isVariablyModifiedType(), 2204 OriginalTy->containsUnexpandedParameterPack()), 2205 OriginalTy(OriginalTy), AdjustedTy(AdjustedTy) {} 2206 2207 friend class ASTContext; // ASTContext creates these. 2208 2209 public: 2210 QualType getOriginalType() const { return OriginalTy; } 2211 QualType getAdjustedType() const { return AdjustedTy; } 2212 2213 bool isSugared() const { return true; } 2214 QualType desugar() const { return AdjustedTy; } 2215 2216 void Profile(llvm::FoldingSetNodeID &ID) { 2217 Profile(ID, OriginalTy, AdjustedTy); 2218 } 2219 static void Profile(llvm::FoldingSetNodeID &ID, QualType Orig, QualType New) { 2220 ID.AddPointer(Orig.getAsOpaquePtr()); 2221 ID.AddPointer(New.getAsOpaquePtr()); 2222 } 2223 2224 static bool classof(const Type *T) { 2225 return T->getTypeClass() == Adjusted || T->getTypeClass() == Decayed; 2226 } 2227 }; 2228 2229 /// Represents a pointer type decayed from an array or function type. 2230 class DecayedType : public AdjustedType { 2231 2232 DecayedType(QualType OriginalType, QualType DecayedPtr, QualType CanonicalPtr) 2233 : AdjustedType(Decayed, OriginalType, DecayedPtr, CanonicalPtr) { 2234 assert(isa<PointerType>(getAdjustedType())); 2235 } 2236 2237 friend class ASTContext; // ASTContext creates these. 2238 2239 public: 2240 QualType getDecayedType() const { return getAdjustedType(); } 2241 2242 QualType getPointeeType() const { 2243 return cast<PointerType>(getDecayedType())->getPointeeType(); 2244 } 2245 2246 static bool classof(const Type *T) { return T->getTypeClass() == Decayed; } 2247 }; 2248 2249 /// Pointer to a block type. 2250 /// This type is to represent types syntactically represented as 2251 /// "void (^)(int)", etc. Pointee is required to always be a function type. 2252 /// 2253 class BlockPointerType : public Type, public llvm::FoldingSetNode { 2254 QualType PointeeType; // Block is some kind of pointer type 2255 BlockPointerType(QualType Pointee, QualType CanonicalCls) : 2256 Type(BlockPointer, CanonicalCls, Pointee->isDependentType(), 2257 Pointee->isInstantiationDependentType(), 2258 Pointee->isVariablyModifiedType(), 2259 Pointee->containsUnexpandedParameterPack()), 2260 PointeeType(Pointee) { 2261 } 2262 friend class ASTContext; // ASTContext creates these. 2263 2264 public: 2265 2266 // Get the pointee type. Pointee is required to always be a function type. 2267 QualType getPointeeType() const { return PointeeType; } 2268 2269 bool isSugared() const { return false; } 2270 QualType desugar() const { return QualType(this, 0); } 2271 2272 void Profile(llvm::FoldingSetNodeID &ID) { 2273 Profile(ID, getPointeeType()); 2274 } 2275 static void Profile(llvm::FoldingSetNodeID &ID, QualType Pointee) { 2276 ID.AddPointer(Pointee.getAsOpaquePtr()); 2277 } 2278 2279 static bool classof(const Type *T) { 2280 return T->getTypeClass() == BlockPointer; 2281 } 2282 }; 2283 2284 /// Base for LValueReferenceType and RValueReferenceType 2285 /// 2286 class ReferenceType : public Type, public llvm::FoldingSetNode { 2287 QualType PointeeType; 2288 2289 protected: 2290 ReferenceType(TypeClass tc, QualType Referencee, QualType CanonicalRef, 2291 bool SpelledAsLValue) : 2292 Type(tc, CanonicalRef, Referencee->isDependentType(), 2293 Referencee->isInstantiationDependentType(), 2294 Referencee->isVariablyModifiedType(), 2295 Referencee->containsUnexpandedParameterPack()), 2296 PointeeType(Referencee) 2297 { 2298 ReferenceTypeBits.SpelledAsLValue = SpelledAsLValue; 2299 ReferenceTypeBits.InnerRef = Referencee->isReferenceType(); 2300 } 2301 2302 public: 2303 bool isSpelledAsLValue() const { return ReferenceTypeBits.SpelledAsLValue; } 2304 bool isInnerRef() const { return ReferenceTypeBits.InnerRef; } 2305 2306 QualType getPointeeTypeAsWritten() const { return PointeeType; } 2307 QualType getPointeeType() const { 2308 // FIXME: this might strip inner qualifiers; okay? 2309 const ReferenceType *T = this; 2310 while (T->isInnerRef()) 2311 T = T->PointeeType->castAs<ReferenceType>(); 2312 return T->PointeeType; 2313 } 2314 2315 void Profile(llvm::FoldingSetNodeID &ID) { 2316 Profile(ID, PointeeType, isSpelledAsLValue()); 2317 } 2318 static void Profile(llvm::FoldingSetNodeID &ID, 2319 QualType Referencee, 2320 bool SpelledAsLValue) { 2321 ID.AddPointer(Referencee.getAsOpaquePtr()); 2322 ID.AddBoolean(SpelledAsLValue); 2323 } 2324 2325 static bool classof(const Type *T) { 2326 return T->getTypeClass() == LValueReference || 2327 T->getTypeClass() == RValueReference; 2328 } 2329 }; 2330 2331 /// An lvalue reference type, per C++11 [dcl.ref]. 2332 /// 2333 class LValueReferenceType : public ReferenceType { 2334 LValueReferenceType(QualType Referencee, QualType CanonicalRef, 2335 bool SpelledAsLValue) : 2336 ReferenceType(LValueReference, Referencee, CanonicalRef, SpelledAsLValue) 2337 {} 2338 friend class ASTContext; // ASTContext creates these 2339 public: 2340 bool isSugared() const { return false; } 2341 QualType desugar() const { return QualType(this, 0); } 2342 2343 static bool classof(const Type *T) { 2344 return T->getTypeClass() == LValueReference; 2345 } 2346 }; 2347 2348 /// An rvalue reference type, per C++11 [dcl.ref]. 2349 /// 2350 class RValueReferenceType : public ReferenceType { 2351 RValueReferenceType(QualType Referencee, QualType CanonicalRef) : 2352 ReferenceType(RValueReference, Referencee, CanonicalRef, false) { 2353 } 2354 friend class ASTContext; // ASTContext creates these 2355 public: 2356 bool isSugared() const { return false; } 2357 QualType desugar() const { return QualType(this, 0); } 2358 2359 static bool classof(const Type *T) { 2360 return T->getTypeClass() == RValueReference; 2361 } 2362 }; 2363 2364 /// A pointer to member type per C++ 8.3.3 - Pointers to members. 2365 /// 2366 /// This includes both pointers to data members and pointer to member functions. 2367 /// 2368 class MemberPointerType : public Type, public llvm::FoldingSetNode { 2369 QualType PointeeType; 2370 /// The class of which the pointee is a member. Must ultimately be a 2371 /// RecordType, but could be a typedef or a template parameter too. 2372 const Type *Class; 2373 2374 MemberPointerType(QualType Pointee, const Type *Cls, QualType CanonicalPtr) : 2375 Type(MemberPointer, CanonicalPtr, 2376 Cls->isDependentType() || Pointee->isDependentType(), 2377 (Cls->isInstantiationDependentType() || 2378 Pointee->isInstantiationDependentType()), 2379 Pointee->isVariablyModifiedType(), 2380 (Cls->containsUnexpandedParameterPack() || 2381 Pointee->containsUnexpandedParameterPack())), 2382 PointeeType(Pointee), Class(Cls) { 2383 } 2384 friend class ASTContext; // ASTContext creates these. 2385 2386 public: 2387 QualType getPointeeType() const { return PointeeType; } 2388 2389 /// Returns true if the member type (i.e. the pointee type) is a 2390 /// function type rather than a data-member type. 2391 bool isMemberFunctionPointer() const { 2392 return PointeeType->isFunctionProtoType(); 2393 } 2394 2395 /// Returns true if the member type (i.e. the pointee type) is a 2396 /// data type rather than a function type. 2397 bool isMemberDataPointer() const { 2398 return !PointeeType->isFunctionProtoType(); 2399 } 2400 2401 const Type *getClass() const { return Class; } 2402 CXXRecordDecl *getMostRecentCXXRecordDecl() const; 2403 2404 bool isSugared() const { return false; } 2405 QualType desugar() const { return QualType(this, 0); } 2406 2407 void Profile(llvm::FoldingSetNodeID &ID) { 2408 Profile(ID, getPointeeType(), getClass()); 2409 } 2410 static void Profile(llvm::FoldingSetNodeID &ID, QualType Pointee, 2411 const Type *Class) { 2412 ID.AddPointer(Pointee.getAsOpaquePtr()); 2413 ID.AddPointer(Class); 2414 } 2415 2416 static bool classof(const Type *T) { 2417 return T->getTypeClass() == MemberPointer; 2418 } 2419 }; 2420 2421 /// Represents an array type, per C99 6.7.5.2 - Array Declarators. 2422 /// 2423 class ArrayType : public Type, public llvm::FoldingSetNode { 2424 public: 2425 /// Capture whether this is a normal array (e.g. int X[4]) 2426 /// an array with a static size (e.g. int X[static 4]), or an array 2427 /// with a star size (e.g. int X[*]). 2428 /// 'static' is only allowed on function parameters. 2429 enum ArraySizeModifier { 2430 Normal, Static, Star 2431 }; 2432 private: 2433 /// The element type of the array. 2434 QualType ElementType; 2435 2436 protected: 2437 // C++ [temp.dep.type]p1: 2438 // A type is dependent if it is... 2439 // - an array type constructed from any dependent type or whose 2440 // size is specified by a constant expression that is 2441 // value-dependent, 2442 ArrayType(TypeClass tc, QualType et, QualType can, 2443 ArraySizeModifier sm, unsigned tq, 2444 bool ContainsUnexpandedParameterPack) 2445 : Type(tc, can, et->isDependentType() || tc == DependentSizedArray, 2446 et->isInstantiationDependentType() || tc == DependentSizedArray, 2447 (tc == VariableArray || et->isVariablyModifiedType()), 2448 ContainsUnexpandedParameterPack), 2449 ElementType(et) { 2450 ArrayTypeBits.IndexTypeQuals = tq; 2451 ArrayTypeBits.SizeModifier = sm; 2452 } 2453 2454 friend class ASTContext; // ASTContext creates these. 2455 2456 public: 2457 QualType getElementType() const { return ElementType; } 2458 ArraySizeModifier getSizeModifier() const { 2459 return ArraySizeModifier(ArrayTypeBits.SizeModifier); 2460 } 2461 Qualifiers getIndexTypeQualifiers() const { 2462 return Qualifiers::fromCVRMask(getIndexTypeCVRQualifiers()); 2463 } 2464 unsigned getIndexTypeCVRQualifiers() const { 2465 return ArrayTypeBits.IndexTypeQuals; 2466 } 2467 2468 static bool classof(const Type *T) { 2469 return T->getTypeClass() == ConstantArray || 2470 T->getTypeClass() == VariableArray || 2471 T->getTypeClass() == IncompleteArray || 2472 T->getTypeClass() == DependentSizedArray; 2473 } 2474 }; 2475 2476 /// Represents the canonical version of C arrays with a specified constant size. 2477 /// For example, the canonical type for 'int A[4 + 4*100]' is a 2478 /// ConstantArrayType where the element type is 'int' and the size is 404. 2479 class ConstantArrayType : public ArrayType { 2480 llvm::APInt Size; // Allows us to unique the type. 2481 2482 ConstantArrayType(QualType et, QualType can, const llvm::APInt &size, 2483 ArraySizeModifier sm, unsigned tq) 2484 : ArrayType(ConstantArray, et, can, sm, tq, 2485 et->containsUnexpandedParameterPack()), 2486 Size(size) {} 2487 protected: 2488 ConstantArrayType(TypeClass tc, QualType et, QualType can, 2489 const llvm::APInt &size, ArraySizeModifier sm, unsigned tq) 2490 : ArrayType(tc, et, can, sm, tq, et->containsUnexpandedParameterPack()), 2491 Size(size) {} 2492 friend class ASTContext; // ASTContext creates these. 2493 public: 2494 const llvm::APInt &getSize() const { return Size; } 2495 bool isSugared() const { return false; } 2496 QualType desugar() const { return QualType(this, 0); } 2497 2498 2499 /// \brief Determine the number of bits required to address a member of 2500 // an array with the given element type and number of elements. 2501 static unsigned getNumAddressingBits(ASTContext &Context, 2502 QualType ElementType, 2503 const llvm::APInt &NumElements); 2504 2505 /// \brief Determine the maximum number of active bits that an array's size 2506 /// can require, which limits the maximum size of the array. 2507 static unsigned getMaxSizeBits(ASTContext &Context); 2508 2509 void Profile(llvm::FoldingSetNodeID &ID) { 2510 Profile(ID, getElementType(), getSize(), 2511 getSizeModifier(), getIndexTypeCVRQualifiers()); 2512 } 2513 static void Profile(llvm::FoldingSetNodeID &ID, QualType ET, 2514 const llvm::APInt &ArraySize, ArraySizeModifier SizeMod, 2515 unsigned TypeQuals) { 2516 ID.AddPointer(ET.getAsOpaquePtr()); 2517 ID.AddInteger(ArraySize.getZExtValue()); 2518 ID.AddInteger(SizeMod); 2519 ID.AddInteger(TypeQuals); 2520 } 2521 static bool classof(const Type *T) { 2522 return T->getTypeClass() == ConstantArray; 2523 } 2524 }; 2525 2526 /// Represents a C array with an unspecified size. For example 'int A[]' has 2527 /// an IncompleteArrayType where the element type is 'int' and the size is 2528 /// unspecified. 2529 class IncompleteArrayType : public ArrayType { 2530 2531 IncompleteArrayType(QualType et, QualType can, 2532 ArraySizeModifier sm, unsigned tq) 2533 : ArrayType(IncompleteArray, et, can, sm, tq, 2534 et->containsUnexpandedParameterPack()) {} 2535 friend class ASTContext; // ASTContext creates these. 2536 public: 2537 bool isSugared() const { return false; } 2538 QualType desugar() const { return QualType(this, 0); } 2539 2540 static bool classof(const Type *T) { 2541 return T->getTypeClass() == IncompleteArray; 2542 } 2543 2544 friend class StmtIteratorBase; 2545 2546 void Profile(llvm::FoldingSetNodeID &ID) { 2547 Profile(ID, getElementType(), getSizeModifier(), 2548 getIndexTypeCVRQualifiers()); 2549 } 2550 2551 static void Profile(llvm::FoldingSetNodeID &ID, QualType ET, 2552 ArraySizeModifier SizeMod, unsigned TypeQuals) { 2553 ID.AddPointer(ET.getAsOpaquePtr()); 2554 ID.AddInteger(SizeMod); 2555 ID.AddInteger(TypeQuals); 2556 } 2557 }; 2558 2559 /// Represents a C array with a specified size that is not an 2560 /// integer-constant-expression. For example, 'int s[x+foo()]'. 2561 /// Since the size expression is an arbitrary expression, we store it as such. 2562 /// 2563 /// Note: VariableArrayType's aren't uniqued (since the expressions aren't) and 2564 /// should not be: two lexically equivalent variable array types could mean 2565 /// different things, for example, these variables do not have the same type 2566 /// dynamically: 2567 /// 2568 /// void foo(int x) { 2569 /// int Y[x]; 2570 /// ++x; 2571 /// int Z[x]; 2572 /// } 2573 /// 2574 class VariableArrayType : public ArrayType { 2575 /// An assignment-expression. VLA's are only permitted within 2576 /// a function block. 2577 Stmt *SizeExpr; 2578 /// The range spanned by the left and right array brackets. 2579 SourceRange Brackets; 2580 2581 VariableArrayType(QualType et, QualType can, Expr *e, 2582 ArraySizeModifier sm, unsigned tq, 2583 SourceRange brackets) 2584 : ArrayType(VariableArray, et, can, sm, tq, 2585 et->containsUnexpandedParameterPack()), 2586 SizeExpr((Stmt*) e), Brackets(brackets) {} 2587 friend class ASTContext; // ASTContext creates these. 2588 2589 public: 2590 Expr *getSizeExpr() const { 2591 // We use C-style casts instead of cast<> here because we do not wish 2592 // to have a dependency of Type.h on Stmt.h/Expr.h. 2593 return (Expr*) SizeExpr; 2594 } 2595 SourceRange getBracketsRange() const { return Brackets; } 2596 SourceLocation getLBracketLoc() const { return Brackets.getBegin(); } 2597 SourceLocation getRBracketLoc() const { return Brackets.getEnd(); } 2598 2599 bool isSugared() const { return false; } 2600 QualType desugar() const { return QualType(this, 0); } 2601 2602 static bool classof(const Type *T) { 2603 return T->getTypeClass() == VariableArray; 2604 } 2605 2606 friend class StmtIteratorBase; 2607 2608 void Profile(llvm::FoldingSetNodeID &ID) { 2609 llvm_unreachable("Cannot unique VariableArrayTypes."); 2610 } 2611 }; 2612 2613 /// Represents an array type in C++ whose size is a value-dependent expression. 2614 /// 2615 /// For example: 2616 /// \code 2617 /// template<typename T, int Size> 2618 /// class array { 2619 /// T data[Size]; 2620 /// }; 2621 /// \endcode 2622 /// 2623 /// For these types, we won't actually know what the array bound is 2624 /// until template instantiation occurs, at which point this will 2625 /// become either a ConstantArrayType or a VariableArrayType. 2626 class DependentSizedArrayType : public ArrayType { 2627 const ASTContext &Context; 2628 2629 /// \brief An assignment expression that will instantiate to the 2630 /// size of the array. 2631 /// 2632 /// The expression itself might be null, in which case the array 2633 /// type will have its size deduced from an initializer. 2634 Stmt *SizeExpr; 2635 2636 /// The range spanned by the left and right array brackets. 2637 SourceRange Brackets; 2638 2639 DependentSizedArrayType(const ASTContext &Context, QualType et, QualType can, 2640 Expr *e, ArraySizeModifier sm, unsigned tq, 2641 SourceRange brackets); 2642 2643 friend class ASTContext; // ASTContext creates these. 2644 2645 public: 2646 Expr *getSizeExpr() const { 2647 // We use C-style casts instead of cast<> here because we do not wish 2648 // to have a dependency of Type.h on Stmt.h/Expr.h. 2649 return (Expr*) SizeExpr; 2650 } 2651 SourceRange getBracketsRange() const { return Brackets; } 2652 SourceLocation getLBracketLoc() const { return Brackets.getBegin(); } 2653 SourceLocation getRBracketLoc() const { return Brackets.getEnd(); } 2654 2655 bool isSugared() const { return false; } 2656 QualType desugar() const { return QualType(this, 0); } 2657 2658 static bool classof(const Type *T) { 2659 return T->getTypeClass() == DependentSizedArray; 2660 } 2661 2662 friend class StmtIteratorBase; 2663 2664 2665 void Profile(llvm::FoldingSetNodeID &ID) { 2666 Profile(ID, Context, getElementType(), 2667 getSizeModifier(), getIndexTypeCVRQualifiers(), getSizeExpr()); 2668 } 2669 2670 static void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context, 2671 QualType ET, ArraySizeModifier SizeMod, 2672 unsigned TypeQuals, Expr *E); 2673 }; 2674 2675 /// Represents an extended vector type where either the type or size is 2676 /// dependent. 2677 /// 2678 /// For example: 2679 /// \code 2680 /// template<typename T, int Size> 2681 /// class vector { 2682 /// typedef T __attribute__((ext_vector_type(Size))) type; 2683 /// } 2684 /// \endcode 2685 class DependentSizedExtVectorType : public Type, public llvm::FoldingSetNode { 2686 const ASTContext &Context; 2687 Expr *SizeExpr; 2688 /// The element type of the array. 2689 QualType ElementType; 2690 SourceLocation loc; 2691 2692 DependentSizedExtVectorType(const ASTContext &Context, QualType ElementType, 2693 QualType can, Expr *SizeExpr, SourceLocation loc); 2694 2695 friend class ASTContext; 2696 2697 public: 2698 Expr *getSizeExpr() const { return SizeExpr; } 2699 QualType getElementType() const { return ElementType; } 2700 SourceLocation getAttributeLoc() const { return loc; } 2701 2702 bool isSugared() const { return false; } 2703 QualType desugar() const { return QualType(this, 0); } 2704 2705 static bool classof(const Type *T) { 2706 return T->getTypeClass() == DependentSizedExtVector; 2707 } 2708 2709 void Profile(llvm::FoldingSetNodeID &ID) { 2710 Profile(ID, Context, getElementType(), getSizeExpr()); 2711 } 2712 2713 static void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context, 2714 QualType ElementType, Expr *SizeExpr); 2715 }; 2716 2717 2718 /// Represents a GCC generic vector type. This type is created using 2719 /// __attribute__((vector_size(n)), where "n" specifies the vector size in 2720 /// bytes; or from an Altivec __vector or vector declaration. 2721 /// Since the constructor takes the number of vector elements, the 2722 /// client is responsible for converting the size into the number of elements. 2723 class VectorType : public Type, public llvm::FoldingSetNode { 2724 public: 2725 enum VectorKind { 2726 GenericVector, ///< not a target-specific vector type 2727 AltiVecVector, ///< is AltiVec vector 2728 AltiVecPixel, ///< is AltiVec 'vector Pixel' 2729 AltiVecBool, ///< is AltiVec 'vector bool ...' 2730 NeonVector, ///< is ARM Neon vector 2731 NeonPolyVector ///< is ARM Neon polynomial vector 2732 }; 2733 protected: 2734 /// The element type of the vector. 2735 QualType ElementType; 2736 2737 VectorType(QualType vecType, unsigned nElements, QualType canonType, 2738 VectorKind vecKind); 2739 2740 VectorType(TypeClass tc, QualType vecType, unsigned nElements, 2741 QualType canonType, VectorKind vecKind); 2742 2743 friend class ASTContext; // ASTContext creates these. 2744 2745 public: 2746 2747 QualType getElementType() const { return ElementType; } 2748 unsigned getNumElements() const { return VectorTypeBits.NumElements; } 2749 static bool isVectorSizeTooLarge(unsigned NumElements) { 2750 return NumElements > VectorTypeBitfields::MaxNumElements; 2751 } 2752 2753 bool isSugared() const { return false; } 2754 QualType desugar() const { return QualType(this, 0); } 2755 2756 VectorKind getVectorKind() const { 2757 return VectorKind(VectorTypeBits.VecKind); 2758 } 2759 2760 void Profile(llvm::FoldingSetNodeID &ID) { 2761 Profile(ID, getElementType(), getNumElements(), 2762 getTypeClass(), getVectorKind()); 2763 } 2764 static void Profile(llvm::FoldingSetNodeID &ID, QualType ElementType, 2765 unsigned NumElements, TypeClass TypeClass, 2766 VectorKind VecKind) { 2767 ID.AddPointer(ElementType.getAsOpaquePtr()); 2768 ID.AddInteger(NumElements); 2769 ID.AddInteger(TypeClass); 2770 ID.AddInteger(VecKind); 2771 } 2772 2773 static bool classof(const Type *T) { 2774 return T->getTypeClass() == Vector || T->getTypeClass() == ExtVector; 2775 } 2776 }; 2777 2778 /// ExtVectorType - Extended vector type. This type is created using 2779 /// __attribute__((ext_vector_type(n)), where "n" is the number of elements. 2780 /// Unlike vector_size, ext_vector_type is only allowed on typedef's. This 2781 /// class enables syntactic extensions, like Vector Components for accessing 2782 /// points, colors, and textures (modeled after OpenGL Shading Language). 2783 class ExtVectorType : public VectorType { 2784 ExtVectorType(QualType vecType, unsigned nElements, QualType canonType) : 2785 VectorType(ExtVector, vecType, nElements, canonType, GenericVector) {} 2786 friend class ASTContext; // ASTContext creates these. 2787 public: 2788 static int getPointAccessorIdx(char c) { 2789 switch (c) { 2790 default: return -1; 2791 case 'x': case 'r': return 0; 2792 case 'y': case 'g': return 1; 2793 case 'z': case 'b': return 2; 2794 case 'w': case 'a': return 3; 2795 } 2796 } 2797 static int getNumericAccessorIdx(char c) { 2798 switch (c) { 2799 default: return -1; 2800 case '0': return 0; 2801 case '1': return 1; 2802 case '2': return 2; 2803 case '3': return 3; 2804 case '4': return 4; 2805 case '5': return 5; 2806 case '6': return 6; 2807 case '7': return 7; 2808 case '8': return 8; 2809 case '9': return 9; 2810 case 'A': 2811 case 'a': return 10; 2812 case 'B': 2813 case 'b': return 11; 2814 case 'C': 2815 case 'c': return 12; 2816 case 'D': 2817 case 'd': return 13; 2818 case 'E': 2819 case 'e': return 14; 2820 case 'F': 2821 case 'f': return 15; 2822 } 2823 } 2824 2825 static int getAccessorIdx(char c) { 2826 if (int idx = getPointAccessorIdx(c)+1) return idx-1; 2827 return getNumericAccessorIdx(c); 2828 } 2829 2830 bool isAccessorWithinNumElements(char c) const { 2831 if (int idx = getAccessorIdx(c)+1) 2832 return unsigned(idx-1) < getNumElements(); 2833 return false; 2834 } 2835 bool isSugared() const { return false; } 2836 QualType desugar() const { return QualType(this, 0); } 2837 2838 static bool classof(const Type *T) { 2839 return T->getTypeClass() == ExtVector; 2840 } 2841 }; 2842 2843 /// FunctionType - C99 6.7.5.3 - Function Declarators. This is the common base 2844 /// class of FunctionNoProtoType and FunctionProtoType. 2845 /// 2846 class FunctionType : public Type { 2847 // The type returned by the function. 2848 QualType ResultType; 2849 2850 public: 2851 /// A class which abstracts out some details necessary for 2852 /// making a call. 2853 /// 2854 /// It is not actually used directly for storing this information in 2855 /// a FunctionType, although FunctionType does currently use the 2856 /// same bit-pattern. 2857 /// 2858 // If you add a field (say Foo), other than the obvious places (both, 2859 // constructors, compile failures), what you need to update is 2860 // * Operator== 2861 // * getFoo 2862 // * withFoo 2863 // * functionType. Add Foo, getFoo. 2864 // * ASTContext::getFooType 2865 // * ASTContext::mergeFunctionTypes 2866 // * FunctionNoProtoType::Profile 2867 // * FunctionProtoType::Profile 2868 // * TypePrinter::PrintFunctionProto 2869 // * AST read and write 2870 // * Codegen 2871 class ExtInfo { 2872 // Feel free to rearrange or add bits, but if you go over 9, 2873 // you'll need to adjust both the Bits field below and 2874 // Type::FunctionTypeBitfields. 2875 2876 // | CC |noreturn|produces|regparm| 2877 // |0 .. 3| 4 | 5 | 6 .. 8| 2878 // 2879 // regparm is either 0 (no regparm attribute) or the regparm value+1. 2880 enum { CallConvMask = 0xF }; 2881 enum { NoReturnMask = 0x10 }; 2882 enum { ProducesResultMask = 0x20 }; 2883 enum { RegParmMask = ~(CallConvMask | NoReturnMask | ProducesResultMask), 2884 RegParmOffset = 6 }; // Assumed to be the last field 2885 2886 uint16_t Bits; 2887 2888 ExtInfo(unsigned Bits) : Bits(static_cast<uint16_t>(Bits)) {} 2889 2890 friend class FunctionType; 2891 2892 public: 2893 // Constructor with no defaults. Use this when you know that you 2894 // have all the elements (when reading an AST file for example). 2895 ExtInfo(bool noReturn, bool hasRegParm, unsigned regParm, CallingConv cc, 2896 bool producesResult) { 2897 assert((!hasRegParm || regParm < 7) && "Invalid regparm value"); 2898 Bits = ((unsigned) cc) | 2899 (noReturn ? NoReturnMask : 0) | 2900 (producesResult ? ProducesResultMask : 0) | 2901 (hasRegParm ? ((regParm + 1) << RegParmOffset) : 0); 2902 } 2903 2904 // Constructor with all defaults. Use when for example creating a 2905 // function known to use defaults. 2906 ExtInfo() : Bits(CC_C) { } 2907 2908 // Constructor with just the calling convention, which is an important part 2909 // of the canonical type. 2910 ExtInfo(CallingConv CC) : Bits(CC) { } 2911 2912 bool getNoReturn() const { return Bits & NoReturnMask; } 2913 bool getProducesResult() const { return Bits & ProducesResultMask; } 2914 bool getHasRegParm() const { return (Bits >> RegParmOffset) != 0; } 2915 unsigned getRegParm() const { 2916 unsigned RegParm = Bits >> RegParmOffset; 2917 if (RegParm > 0) 2918 --RegParm; 2919 return RegParm; 2920 } 2921 CallingConv getCC() const { return CallingConv(Bits & CallConvMask); } 2922 2923 bool operator==(ExtInfo Other) const { 2924 return Bits == Other.Bits; 2925 } 2926 bool operator!=(ExtInfo Other) const { 2927 return Bits != Other.Bits; 2928 } 2929 2930 // Note that we don't have setters. That is by design, use 2931 // the following with methods instead of mutating these objects. 2932 2933 ExtInfo withNoReturn(bool noReturn) const { 2934 if (noReturn) 2935 return ExtInfo(Bits | NoReturnMask); 2936 else 2937 return ExtInfo(Bits & ~NoReturnMask); 2938 } 2939 2940 ExtInfo withProducesResult(bool producesResult) const { 2941 if (producesResult) 2942 return ExtInfo(Bits | ProducesResultMask); 2943 else 2944 return ExtInfo(Bits & ~ProducesResultMask); 2945 } 2946 2947 ExtInfo withRegParm(unsigned RegParm) const { 2948 assert(RegParm < 7 && "Invalid regparm value"); 2949 return ExtInfo((Bits & ~RegParmMask) | 2950 ((RegParm + 1) << RegParmOffset)); 2951 } 2952 2953 ExtInfo withCallingConv(CallingConv cc) const { 2954 return ExtInfo((Bits & ~CallConvMask) | (unsigned) cc); 2955 } 2956 2957 void Profile(llvm::FoldingSetNodeID &ID) const { 2958 ID.AddInteger(Bits); 2959 } 2960 }; 2961 2962 protected: 2963 FunctionType(TypeClass tc, QualType res, 2964 QualType Canonical, bool Dependent, 2965 bool InstantiationDependent, 2966 bool VariablyModified, bool ContainsUnexpandedParameterPack, 2967 ExtInfo Info) 2968 : Type(tc, Canonical, Dependent, InstantiationDependent, VariablyModified, 2969 ContainsUnexpandedParameterPack), 2970 ResultType(res) { 2971 FunctionTypeBits.ExtInfo = Info.Bits; 2972 } 2973 unsigned getTypeQuals() const { return FunctionTypeBits.TypeQuals; } 2974 2975 public: 2976 QualType getReturnType() const { return ResultType; } 2977 2978 bool getHasRegParm() const { return getExtInfo().getHasRegParm(); } 2979 unsigned getRegParmType() const { return getExtInfo().getRegParm(); } 2980 /// Determine whether this function type includes the GNU noreturn 2981 /// attribute. The C++11 [[noreturn]] attribute does not affect the function 2982 /// type. 2983 bool getNoReturnAttr() const { return getExtInfo().getNoReturn(); } 2984 CallingConv getCallConv() const { return getExtInfo().getCC(); } 2985 ExtInfo getExtInfo() const { return ExtInfo(FunctionTypeBits.ExtInfo); } 2986 bool isConst() const { return getTypeQuals() & Qualifiers::Const; } 2987 bool isVolatile() const { return getTypeQuals() & Qualifiers::Volatile; } 2988 bool isRestrict() const { return getTypeQuals() & Qualifiers::Restrict; } 2989 2990 /// \brief Determine the type of an expression that calls a function of 2991 /// this type. 2992 QualType getCallResultType(ASTContext &Context) const { 2993 return getReturnType().getNonLValueExprType(Context); 2994 } 2995 2996 static StringRef getNameForCallConv(CallingConv CC); 2997 2998 static bool classof(const Type *T) { 2999 return T->getTypeClass() == FunctionNoProto || 3000 T->getTypeClass() == FunctionProto; 3001 } 3002 }; 3003 3004 /// Represents a K&R-style 'int foo()' function, which has 3005 /// no information available about its arguments. 3006 class FunctionNoProtoType : public FunctionType, public llvm::FoldingSetNode { 3007 FunctionNoProtoType(QualType Result, QualType Canonical, ExtInfo Info) 3008 : FunctionType(FunctionNoProto, Result, Canonical, 3009 /*Dependent=*/false, /*InstantiationDependent=*/false, 3010 Result->isVariablyModifiedType(), 3011 /*ContainsUnexpandedParameterPack=*/false, Info) {} 3012 3013 friend class ASTContext; // ASTContext creates these. 3014 3015 public: 3016 // No additional state past what FunctionType provides. 3017 3018 bool isSugared() const { return false; } 3019 QualType desugar() const { return QualType(this, 0); } 3020 3021 void Profile(llvm::FoldingSetNodeID &ID) { 3022 Profile(ID, getReturnType(), getExtInfo()); 3023 } 3024 static void Profile(llvm::FoldingSetNodeID &ID, QualType ResultType, 3025 ExtInfo Info) { 3026 Info.Profile(ID); 3027 ID.AddPointer(ResultType.getAsOpaquePtr()); 3028 } 3029 3030 static bool classof(const Type *T) { 3031 return T->getTypeClass() == FunctionNoProto; 3032 } 3033 }; 3034 3035 /// Represents a prototype with parameter type info, e.g. 3036 /// 'int foo(int)' or 'int foo(void)'. 'void' is represented as having no 3037 /// parameters, not as having a single void parameter. Such a type can have an 3038 /// exception specification, but this specification is not part of the canonical 3039 /// type. 3040 class FunctionProtoType : public FunctionType, public llvm::FoldingSetNode { 3041 public: 3042 struct ExceptionSpecInfo { 3043 ExceptionSpecInfo() 3044 : Type(EST_None), NoexceptExpr(nullptr), 3045 SourceDecl(nullptr), SourceTemplate(nullptr) {} 3046 3047 ExceptionSpecInfo(ExceptionSpecificationType EST) 3048 : Type(EST), NoexceptExpr(nullptr), SourceDecl(nullptr), 3049 SourceTemplate(nullptr) {} 3050 3051 /// The kind of exception specification this is. 3052 ExceptionSpecificationType Type; 3053 /// Explicitly-specified list of exception types. 3054 ArrayRef<QualType> Exceptions; 3055 /// Noexcept expression, if this is EST_ComputedNoexcept. 3056 Expr *NoexceptExpr; 3057 /// The function whose exception specification this is, for 3058 /// EST_Unevaluated and EST_Uninstantiated. 3059 FunctionDecl *SourceDecl; 3060 /// The function template whose exception specification this is instantiated 3061 /// from, for EST_Uninstantiated. 3062 FunctionDecl *SourceTemplate; 3063 }; 3064 3065 /// Extra information about a function prototype. 3066 struct ExtProtoInfo { 3067 ExtProtoInfo() 3068 : Variadic(false), HasTrailingReturn(false), TypeQuals(0), 3069 RefQualifier(RQ_None), ConsumedParameters(nullptr) {} 3070 3071 ExtProtoInfo(CallingConv CC) 3072 : ExtInfo(CC), Variadic(false), HasTrailingReturn(false), TypeQuals(0), 3073 RefQualifier(RQ_None), ConsumedParameters(nullptr) {} 3074 3075 ExtProtoInfo withExceptionSpec(const ExceptionSpecInfo &O) { 3076 ExtProtoInfo Result(*this); 3077 Result.ExceptionSpec = O; 3078 return Result; 3079 } 3080 3081 FunctionType::ExtInfo ExtInfo; 3082 bool Variadic : 1; 3083 bool HasTrailingReturn : 1; 3084 unsigned char TypeQuals; 3085 RefQualifierKind RefQualifier; 3086 ExceptionSpecInfo ExceptionSpec; 3087 const bool *ConsumedParameters; 3088 }; 3089 3090 private: 3091 /// \brief Determine whether there are any argument types that 3092 /// contain an unexpanded parameter pack. 3093 static bool containsAnyUnexpandedParameterPack(const QualType *ArgArray, 3094 unsigned numArgs) { 3095 for (unsigned Idx = 0; Idx < numArgs; ++Idx) 3096 if (ArgArray[Idx]->containsUnexpandedParameterPack()) 3097 return true; 3098 3099 return false; 3100 } 3101 3102 FunctionProtoType(QualType result, ArrayRef<QualType> params, 3103 QualType canonical, const ExtProtoInfo &epi); 3104 3105 /// The number of parameters this function has, not counting '...'. 3106 unsigned NumParams : 15; 3107 3108 /// The number of types in the exception spec, if any. 3109 unsigned NumExceptions : 9; 3110 3111 /// The type of exception specification this function has. 3112 unsigned ExceptionSpecType : 4; 3113 3114 /// Whether this function has any consumed parameters. 3115 unsigned HasAnyConsumedParams : 1; 3116 3117 /// Whether the function is variadic. 3118 unsigned Variadic : 1; 3119 3120 /// Whether this function has a trailing return type. 3121 unsigned HasTrailingReturn : 1; 3122 3123 // ParamInfo - There is an variable size array after the class in memory that 3124 // holds the parameter types. 3125 3126 // Exceptions - There is another variable size array after ArgInfo that 3127 // holds the exception types. 3128 3129 // NoexceptExpr - Instead of Exceptions, there may be a single Expr* pointing 3130 // to the expression in the noexcept() specifier. 3131 3132 // ExceptionSpecDecl, ExceptionSpecTemplate - Instead of Exceptions, there may 3133 // be a pair of FunctionDecl* pointing to the function which should be used to 3134 // instantiate this function type's exception specification, and the function 3135 // from which it should be instantiated. 3136 3137 // ConsumedParameters - A variable size array, following Exceptions 3138 // and of length NumParams, holding flags indicating which parameters 3139 // are consumed. This only appears if HasAnyConsumedParams is true. 3140 3141 friend class ASTContext; // ASTContext creates these. 3142 3143 const bool *getConsumedParamsBuffer() const { 3144 assert(hasAnyConsumedParams()); 3145 3146 // Find the end of the exceptions. 3147 Expr *const *eh_end = reinterpret_cast<Expr *const *>(exception_end()); 3148 if (getExceptionSpecType() == EST_ComputedNoexcept) 3149 eh_end += 1; // NoexceptExpr 3150 // The memory layout of these types isn't handled here, so 3151 // hopefully this is never called for them? 3152 assert(getExceptionSpecType() != EST_Uninstantiated && 3153 getExceptionSpecType() != EST_Unevaluated); 3154 3155 return reinterpret_cast<const bool*>(eh_end); 3156 } 3157 3158 public: 3159 unsigned getNumParams() const { return NumParams; } 3160 QualType getParamType(unsigned i) const { 3161 assert(i < NumParams && "invalid parameter index"); 3162 return param_type_begin()[i]; 3163 } 3164 ArrayRef<QualType> getParamTypes() const { 3165 return llvm::makeArrayRef(param_type_begin(), param_type_end()); 3166 } 3167 3168 ExtProtoInfo getExtProtoInfo() const { 3169 ExtProtoInfo EPI; 3170 EPI.ExtInfo = getExtInfo(); 3171 EPI.Variadic = isVariadic(); 3172 EPI.HasTrailingReturn = hasTrailingReturn(); 3173 EPI.ExceptionSpec.Type = getExceptionSpecType(); 3174 EPI.TypeQuals = static_cast<unsigned char>(getTypeQuals()); 3175 EPI.RefQualifier = getRefQualifier(); 3176 if (EPI.ExceptionSpec.Type == EST_Dynamic) { 3177 EPI.ExceptionSpec.Exceptions = exceptions(); 3178 } else if (EPI.ExceptionSpec.Type == EST_ComputedNoexcept) { 3179 EPI.ExceptionSpec.NoexceptExpr = getNoexceptExpr(); 3180 } else if (EPI.ExceptionSpec.Type == EST_Uninstantiated) { 3181 EPI.ExceptionSpec.SourceDecl = getExceptionSpecDecl(); 3182 EPI.ExceptionSpec.SourceTemplate = getExceptionSpecTemplate(); 3183 } else if (EPI.ExceptionSpec.Type == EST_Unevaluated) { 3184 EPI.ExceptionSpec.SourceDecl = getExceptionSpecDecl(); 3185 } 3186 if (hasAnyConsumedParams()) 3187 EPI.ConsumedParameters = getConsumedParamsBuffer(); 3188 return EPI; 3189 } 3190 3191 /// Get the kind of exception specification on this function. 3192 ExceptionSpecificationType getExceptionSpecType() const { 3193 return static_cast<ExceptionSpecificationType>(ExceptionSpecType); 3194 } 3195 /// Return whether this function has any kind of exception spec. 3196 bool hasExceptionSpec() const { 3197 return getExceptionSpecType() != EST_None; 3198 } 3199 /// Return whether this function has a dynamic (throw) exception spec. 3200 bool hasDynamicExceptionSpec() const { 3201 return isDynamicExceptionSpec(getExceptionSpecType()); 3202 } 3203 /// Return whether this function has a noexcept exception spec. 3204 bool hasNoexceptExceptionSpec() const { 3205 return isNoexceptExceptionSpec(getExceptionSpecType()); 3206 } 3207 /// Return whether this function has a dependent exception spec. 3208 bool hasDependentExceptionSpec() const; 3209 /// Result type of getNoexceptSpec(). 3210 enum NoexceptResult { 3211 NR_NoNoexcept, ///< There is no noexcept specifier. 3212 NR_BadNoexcept, ///< The noexcept specifier has a bad expression. 3213 NR_Dependent, ///< The noexcept specifier is dependent. 3214 NR_Throw, ///< The noexcept specifier evaluates to false. 3215 NR_Nothrow ///< The noexcept specifier evaluates to true. 3216 }; 3217 /// Get the meaning of the noexcept spec on this function, if any. 3218 NoexceptResult getNoexceptSpec(const ASTContext &Ctx) const; 3219 unsigned getNumExceptions() const { return NumExceptions; } 3220 QualType getExceptionType(unsigned i) const { 3221 assert(i < NumExceptions && "Invalid exception number!"); 3222 return exception_begin()[i]; 3223 } 3224 Expr *getNoexceptExpr() const { 3225 if (getExceptionSpecType() != EST_ComputedNoexcept) 3226 return nullptr; 3227 // NoexceptExpr sits where the arguments end. 3228 return *reinterpret_cast<Expr *const *>(param_type_end()); 3229 } 3230 /// \brief If this function type has an exception specification which hasn't 3231 /// been determined yet (either because it has not been evaluated or because 3232 /// it has not been instantiated), this is the function whose exception 3233 /// specification is represented by this type. 3234 FunctionDecl *getExceptionSpecDecl() const { 3235 if (getExceptionSpecType() != EST_Uninstantiated && 3236 getExceptionSpecType() != EST_Unevaluated) 3237 return nullptr; 3238 return reinterpret_cast<FunctionDecl *const *>(param_type_end())[0]; 3239 } 3240 /// \brief If this function type has an uninstantiated exception 3241 /// specification, this is the function whose exception specification 3242 /// should be instantiated to find the exception specification for 3243 /// this type. 3244 FunctionDecl *getExceptionSpecTemplate() const { 3245 if (getExceptionSpecType() != EST_Uninstantiated) 3246 return nullptr; 3247 return reinterpret_cast<FunctionDecl *const *>(param_type_end())[1]; 3248 } 3249 /// Determine whether this function type has a non-throwing exception 3250 /// specification. If this depends on template arguments, returns 3251 /// \c ResultIfDependent. 3252 bool isNothrow(const ASTContext &Ctx, bool ResultIfDependent = false) const; 3253 3254 bool isVariadic() const { return Variadic; } 3255 3256 /// Determines whether this function prototype contains a 3257 /// parameter pack at the end. 3258 /// 3259 /// A function template whose last parameter is a parameter pack can be 3260 /// called with an arbitrary number of arguments, much like a variadic 3261 /// function. 3262 bool isTemplateVariadic() const; 3263 3264 bool hasTrailingReturn() const { return HasTrailingReturn; } 3265 3266 unsigned getTypeQuals() const { return FunctionType::getTypeQuals(); } 3267 3268 3269 /// Retrieve the ref-qualifier associated with this function type. 3270 RefQualifierKind getRefQualifier() const { 3271 return static_cast<RefQualifierKind>(FunctionTypeBits.RefQualifier); 3272 } 3273 3274 typedef const QualType *param_type_iterator; 3275 typedef llvm::iterator_range<param_type_iterator> param_type_range; 3276 3277 param_type_range param_types() const { 3278 return param_type_range(param_type_begin(), param_type_end()); 3279 } 3280 param_type_iterator param_type_begin() const { 3281 return reinterpret_cast<const QualType *>(this+1); 3282 } 3283 param_type_iterator param_type_end() const { 3284 return param_type_begin() + NumParams; 3285 } 3286 3287 typedef const QualType *exception_iterator; 3288 3289 ArrayRef<QualType> exceptions() const { 3290 return llvm::makeArrayRef(exception_begin(), exception_end()); 3291 } 3292 exception_iterator exception_begin() const { 3293 // exceptions begin where arguments end 3294 return param_type_end(); 3295 } 3296 exception_iterator exception_end() const { 3297 if (getExceptionSpecType() != EST_Dynamic) 3298 return exception_begin(); 3299 return exception_begin() + NumExceptions; 3300 } 3301 3302 bool hasAnyConsumedParams() const { return HasAnyConsumedParams; } 3303 bool isParamConsumed(unsigned I) const { 3304 assert(I < getNumParams() && "parameter index out of range"); 3305 if (hasAnyConsumedParams()) 3306 return getConsumedParamsBuffer()[I]; 3307 return false; 3308 } 3309 3310 bool isSugared() const { return false; } 3311 QualType desugar() const { return QualType(this, 0); } 3312 3313 void printExceptionSpecification(raw_ostream &OS, 3314 const PrintingPolicy &Policy) const; 3315 3316 static bool classof(const Type *T) { 3317 return T->getTypeClass() == FunctionProto; 3318 } 3319 3320 void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Ctx); 3321 static void Profile(llvm::FoldingSetNodeID &ID, QualType Result, 3322 param_type_iterator ArgTys, unsigned NumArgs, 3323 const ExtProtoInfo &EPI, const ASTContext &Context); 3324 }; 3325 3326 /// \brief Represents the dependent type named by a dependently-scoped 3327 /// typename using declaration, e.g. 3328 /// using typename Base<T>::foo; 3329 /// 3330 /// Template instantiation turns these into the underlying type. 3331 class UnresolvedUsingType : public Type { 3332 UnresolvedUsingTypenameDecl *Decl; 3333 3334 UnresolvedUsingType(const UnresolvedUsingTypenameDecl *D) 3335 : Type(UnresolvedUsing, QualType(), true, true, false, 3336 /*ContainsUnexpandedParameterPack=*/false), 3337 Decl(const_cast<UnresolvedUsingTypenameDecl*>(D)) {} 3338 friend class ASTContext; // ASTContext creates these. 3339 public: 3340 3341 UnresolvedUsingTypenameDecl *getDecl() const { return Decl; } 3342 3343 bool isSugared() const { return false; } 3344 QualType desugar() const { return QualType(this, 0); } 3345 3346 static bool classof(const Type *T) { 3347 return T->getTypeClass() == UnresolvedUsing; 3348 } 3349 3350 void Profile(llvm::FoldingSetNodeID &ID) { 3351 return Profile(ID, Decl); 3352 } 3353 static void Profile(llvm::FoldingSetNodeID &ID, 3354 UnresolvedUsingTypenameDecl *D) { 3355 ID.AddPointer(D); 3356 } 3357 }; 3358 3359 3360 class TypedefType : public Type { 3361 TypedefNameDecl *Decl; 3362 protected: 3363 TypedefType(TypeClass tc, const TypedefNameDecl *D, QualType can) 3364 : Type(tc, can, can->isDependentType(), 3365 can->isInstantiationDependentType(), 3366 can->isVariablyModifiedType(), 3367 /*ContainsUnexpandedParameterPack=*/false), 3368 Decl(const_cast<TypedefNameDecl*>(D)) { 3369 assert(!isa<TypedefType>(can) && "Invalid canonical type"); 3370 } 3371 friend class ASTContext; // ASTContext creates these. 3372 public: 3373 3374 TypedefNameDecl *getDecl() const { return Decl; } 3375 3376 bool isSugared() const { return true; } 3377 QualType desugar() const; 3378 3379 static bool classof(const Type *T) { return T->getTypeClass() == Typedef; } 3380 }; 3381 3382 /// Represents a `typeof` (or __typeof__) expression (a GCC extension). 3383 class TypeOfExprType : public Type { 3384 Expr *TOExpr; 3385 3386 protected: 3387 TypeOfExprType(Expr *E, QualType can = QualType()); 3388 friend class ASTContext; // ASTContext creates these. 3389 public: 3390 Expr *getUnderlyingExpr() const { return TOExpr; } 3391 3392 /// \brief Remove a single level of sugar. 3393 QualType desugar() const; 3394 3395 /// \brief Returns whether this type directly provides sugar. 3396 bool isSugared() const; 3397 3398 static bool classof(const Type *T) { return T->getTypeClass() == TypeOfExpr; } 3399 }; 3400 3401 /// \brief Internal representation of canonical, dependent 3402 /// `typeof(expr)` types. 3403 /// 3404 /// This class is used internally by the ASTContext to manage 3405 /// canonical, dependent types, only. Clients will only see instances 3406 /// of this class via TypeOfExprType nodes. 3407 class DependentTypeOfExprType 3408 : public TypeOfExprType, public llvm::FoldingSetNode { 3409 const ASTContext &Context; 3410 3411 public: 3412 DependentTypeOfExprType(const ASTContext &Context, Expr *E) 3413 : TypeOfExprType(E), Context(Context) { } 3414 3415 void Profile(llvm::FoldingSetNodeID &ID) { 3416 Profile(ID, Context, getUnderlyingExpr()); 3417 } 3418 3419 static void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context, 3420 Expr *E); 3421 }; 3422 3423 /// Represents `typeof(type)`, a GCC extension. 3424 class TypeOfType : public Type { 3425 QualType TOType; 3426 TypeOfType(QualType T, QualType can) 3427 : Type(TypeOf, can, T->isDependentType(), 3428 T->isInstantiationDependentType(), 3429 T->isVariablyModifiedType(), 3430 T->containsUnexpandedParameterPack()), 3431 TOType(T) { 3432 assert(!isa<TypedefType>(can) && "Invalid canonical type"); 3433 } 3434 friend class ASTContext; // ASTContext creates these. 3435 public: 3436 QualType getUnderlyingType() const { return TOType; } 3437 3438 /// \brief Remove a single level of sugar. 3439 QualType desugar() const { return getUnderlyingType(); } 3440 3441 /// \brief Returns whether this type directly provides sugar. 3442 bool isSugared() const { return true; } 3443 3444 static bool classof(const Type *T) { return T->getTypeClass() == TypeOf; } 3445 }; 3446 3447 /// Represents the type `decltype(expr)` (C++11). 3448 class DecltypeType : public Type { 3449 Expr *E; 3450 QualType UnderlyingType; 3451 3452 protected: 3453 DecltypeType(Expr *E, QualType underlyingType, QualType can = QualType()); 3454 friend class ASTContext; // ASTContext creates these. 3455 public: 3456 Expr *getUnderlyingExpr() const { return E; } 3457 QualType getUnderlyingType() const { return UnderlyingType; } 3458 3459 /// \brief Remove a single level of sugar. 3460 QualType desugar() const; 3461 3462 /// \brief Returns whether this type directly provides sugar. 3463 bool isSugared() const; 3464 3465 static bool classof(const Type *T) { return T->getTypeClass() == Decltype; } 3466 }; 3467 3468 /// \brief Internal representation of canonical, dependent 3469 /// decltype(expr) types. 3470 /// 3471 /// This class is used internally by the ASTContext to manage 3472 /// canonical, dependent types, only. Clients will only see instances 3473 /// of this class via DecltypeType nodes. 3474 class DependentDecltypeType : public DecltypeType, public llvm::FoldingSetNode { 3475 const ASTContext &Context; 3476 3477 public: 3478 DependentDecltypeType(const ASTContext &Context, Expr *E); 3479 3480 void Profile(llvm::FoldingSetNodeID &ID) { 3481 Profile(ID, Context, getUnderlyingExpr()); 3482 } 3483 3484 static void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context, 3485 Expr *E); 3486 }; 3487 3488 /// A unary type transform, which is a type constructed from another. 3489 class UnaryTransformType : public Type { 3490 public: 3491 enum UTTKind { 3492 EnumUnderlyingType 3493 }; 3494 3495 private: 3496 /// The untransformed type. 3497 QualType BaseType; 3498 /// The transformed type if not dependent, otherwise the same as BaseType. 3499 QualType UnderlyingType; 3500 3501 UTTKind UKind; 3502 protected: 3503 UnaryTransformType(QualType BaseTy, QualType UnderlyingTy, UTTKind UKind, 3504 QualType CanonicalTy); 3505 friend class ASTContext; 3506 public: 3507 bool isSugared() const { return !isDependentType(); } 3508 QualType desugar() const { return UnderlyingType; } 3509 3510 QualType getUnderlyingType() const { return UnderlyingType; } 3511 QualType getBaseType() const { return BaseType; } 3512 3513 UTTKind getUTTKind() const { return UKind; } 3514 3515 static bool classof(const Type *T) { 3516 return T->getTypeClass() == UnaryTransform; 3517 } 3518 }; 3519 3520 class TagType : public Type { 3521 /// Stores the TagDecl associated with this type. The decl may point to any 3522 /// TagDecl that declares the entity. 3523 TagDecl * decl; 3524 3525 friend class ASTReader; 3526 3527 protected: 3528 TagType(TypeClass TC, const TagDecl *D, QualType can); 3529 3530 public: 3531 TagDecl *getDecl() const; 3532 3533 /// Determines whether this type is in the process of being defined. 3534 bool isBeingDefined() const; 3535 3536 static bool classof(const Type *T) { 3537 return T->getTypeClass() >= TagFirst && T->getTypeClass() <= TagLast; 3538 } 3539 }; 3540 3541 /// A helper class that allows the use of isa/cast/dyncast 3542 /// to detect TagType objects of structs/unions/classes. 3543 class RecordType : public TagType { 3544 protected: 3545 explicit RecordType(const RecordDecl *D) 3546 : TagType(Record, reinterpret_cast<const TagDecl*>(D), QualType()) { } 3547 explicit RecordType(TypeClass TC, RecordDecl *D) 3548 : TagType(TC, reinterpret_cast<const TagDecl*>(D), QualType()) { } 3549 friend class ASTContext; // ASTContext creates these. 3550 public: 3551 3552 RecordDecl *getDecl() const { 3553 return reinterpret_cast<RecordDecl*>(TagType::getDecl()); 3554 } 3555 3556 // FIXME: This predicate is a helper to QualType/Type. It needs to 3557 // recursively check all fields for const-ness. If any field is declared 3558 // const, it needs to return false. 3559 bool hasConstFields() const { return false; } 3560 3561 bool isSugared() const { return false; } 3562 QualType desugar() const { return QualType(this, 0); } 3563 3564 static bool classof(const Type *T) { return T->getTypeClass() == Record; } 3565 }; 3566 3567 /// A helper class that allows the use of isa/cast/dyncast 3568 /// to detect TagType objects of enums. 3569 class EnumType : public TagType { 3570 explicit EnumType(const EnumDecl *D) 3571 : TagType(Enum, reinterpret_cast<const TagDecl*>(D), QualType()) { } 3572 friend class ASTContext; // ASTContext creates these. 3573 public: 3574 3575 EnumDecl *getDecl() const { 3576 return reinterpret_cast<EnumDecl*>(TagType::getDecl()); 3577 } 3578 3579 bool isSugared() const { return false; } 3580 QualType desugar() const { return QualType(this, 0); } 3581 3582 static bool classof(const Type *T) { return T->getTypeClass() == Enum; } 3583 }; 3584 3585 /// An attributed type is a type to which a type attribute has been applied. 3586 /// 3587 /// The "modified type" is the fully-sugared type to which the attributed 3588 /// type was applied; generally it is not canonically equivalent to the 3589 /// attributed type. The "equivalent type" is the minimally-desugared type 3590 /// which the type is canonically equivalent to. 3591 /// 3592 /// For example, in the following attributed type: 3593 /// int32_t __attribute__((vector_size(16))) 3594 /// - the modified type is the TypedefType for int32_t 3595 /// - the equivalent type is VectorType(16, int32_t) 3596 /// - the canonical type is VectorType(16, int) 3597 class AttributedType : public Type, public llvm::FoldingSetNode { 3598 public: 3599 // It is really silly to have yet another attribute-kind enum, but 3600 // clang::attr::Kind doesn't currently cover the pure type attrs. 3601 enum Kind { 3602 // Expression operand. 3603 attr_address_space, 3604 attr_regparm, 3605 attr_vector_size, 3606 attr_neon_vector_type, 3607 attr_neon_polyvector_type, 3608 3609 FirstExprOperandKind = attr_address_space, 3610 LastExprOperandKind = attr_neon_polyvector_type, 3611 3612 // Enumerated operand (string or keyword). 3613 attr_objc_gc, 3614 attr_objc_ownership, 3615 attr_pcs, 3616 attr_pcs_vfp, 3617 3618 FirstEnumOperandKind = attr_objc_gc, 3619 LastEnumOperandKind = attr_pcs_vfp, 3620 3621 // No operand. 3622 attr_noreturn, 3623 attr_cdecl, 3624 attr_fastcall, 3625 attr_stdcall, 3626 attr_thiscall, 3627 attr_pascal, 3628 attr_vectorcall, 3629 attr_inteloclbicc, 3630 attr_ms_abi, 3631 attr_sysv_abi, 3632 attr_ptr32, 3633 attr_ptr64, 3634 attr_sptr, 3635 attr_uptr, 3636 attr_nonnull, 3637 attr_nullable, 3638 attr_null_unspecified, 3639 attr_objc_kindof, 3640 attr_objc_inert_unsafe_unretained, 3641 }; 3642 3643 private: 3644 QualType ModifiedType; 3645 QualType EquivalentType; 3646 3647 friend class ASTContext; // creates these 3648 3649 AttributedType(QualType canon, Kind attrKind, 3650 QualType modified, QualType equivalent) 3651 : Type(Attributed, canon, canon->isDependentType(), 3652 canon->isInstantiationDependentType(), 3653 canon->isVariablyModifiedType(), 3654 canon->containsUnexpandedParameterPack()), 3655 ModifiedType(modified), EquivalentType(equivalent) { 3656 AttributedTypeBits.AttrKind = attrKind; 3657 } 3658 3659 public: 3660 Kind getAttrKind() const { 3661 return static_cast<Kind>(AttributedTypeBits.AttrKind); 3662 } 3663 3664 QualType getModifiedType() const { return ModifiedType; } 3665 QualType getEquivalentType() const { return EquivalentType; } 3666 3667 bool isSugared() const { return true; } 3668 QualType desugar() const { return getEquivalentType(); } 3669 3670 /// Does this attribute behave like a type qualifier? 3671 /// 3672 /// A type qualifier adjusts a type to provide specialized rules for 3673 /// a specific object, like the standard const and volatile qualifiers. 3674 /// This includes attributes controlling things like nullability, 3675 /// address spaces, and ARC ownership. The value of the object is still 3676 /// largely described by the modified type. 3677 /// 3678 /// In contrast, many type attributes "rewrite" their modified type to 3679 /// produce a fundamentally different type, not necessarily related in any 3680 /// formalizable way to the original type. For example, calling convention 3681 /// and vector attributes are not simple type qualifiers. 3682 /// 3683 /// Type qualifiers are often, but not always, reflected in the canonical 3684 /// type. 3685 bool isQualifier() const; 3686 3687 bool isMSTypeSpec() const; 3688 3689 bool isCallingConv() const; 3690 3691 llvm::Optional<NullabilityKind> getImmediateNullability() const; 3692 3693 /// Retrieve the attribute kind corresponding to the given 3694 /// nullability kind. 3695 static Kind getNullabilityAttrKind(NullabilityKind kind) { 3696 switch (kind) { 3697 case NullabilityKind::NonNull: 3698 return attr_nonnull; 3699 3700 case NullabilityKind::Nullable: 3701 return attr_nullable; 3702 3703 case NullabilityKind::Unspecified: 3704 return attr_null_unspecified; 3705 } 3706 llvm_unreachable("Unknown nullability kind."); 3707 } 3708 3709 /// Strip off the top-level nullability annotation on the given 3710 /// type, if it's there. 3711 /// 3712 /// \param T The type to strip. If the type is exactly an 3713 /// AttributedType specifying nullability (without looking through 3714 /// type sugar), the nullability is returned and this type changed 3715 /// to the underlying modified type. 3716 /// 3717 /// \returns the top-level nullability, if present. 3718 static Optional<NullabilityKind> stripOuterNullability(QualType &T); 3719 3720 void Profile(llvm::FoldingSetNodeID &ID) { 3721 Profile(ID, getAttrKind(), ModifiedType, EquivalentType); 3722 } 3723 3724 static void Profile(llvm::FoldingSetNodeID &ID, Kind attrKind, 3725 QualType modified, QualType equivalent) { 3726 ID.AddInteger(attrKind); 3727 ID.AddPointer(modified.getAsOpaquePtr()); 3728 ID.AddPointer(equivalent.getAsOpaquePtr()); 3729 } 3730 3731 static bool classof(const Type *T) { 3732 return T->getTypeClass() == Attributed; 3733 } 3734 }; 3735 3736 class TemplateTypeParmType : public Type, public llvm::FoldingSetNode { 3737 // Helper data collector for canonical types. 3738 struct CanonicalTTPTInfo { 3739 unsigned Depth : 15; 3740 unsigned ParameterPack : 1; 3741 unsigned Index : 16; 3742 }; 3743 3744 union { 3745 // Info for the canonical type. 3746 CanonicalTTPTInfo CanTTPTInfo; 3747 // Info for the non-canonical type. 3748 TemplateTypeParmDecl *TTPDecl; 3749 }; 3750 3751 /// Build a non-canonical type. 3752 TemplateTypeParmType(TemplateTypeParmDecl *TTPDecl, QualType Canon) 3753 : Type(TemplateTypeParm, Canon, /*Dependent=*/true, 3754 /*InstantiationDependent=*/true, 3755 /*VariablyModified=*/false, 3756 Canon->containsUnexpandedParameterPack()), 3757 TTPDecl(TTPDecl) { } 3758 3759 /// Build the canonical type. 3760 TemplateTypeParmType(unsigned D, unsigned I, bool PP) 3761 : Type(TemplateTypeParm, QualType(this, 0), 3762 /*Dependent=*/true, 3763 /*InstantiationDependent=*/true, 3764 /*VariablyModified=*/false, PP) { 3765 CanTTPTInfo.Depth = D; 3766 CanTTPTInfo.Index = I; 3767 CanTTPTInfo.ParameterPack = PP; 3768 } 3769 3770 friend class ASTContext; // ASTContext creates these 3771 3772 const CanonicalTTPTInfo& getCanTTPTInfo() const { 3773 QualType Can = getCanonicalTypeInternal(); 3774 return Can->castAs<TemplateTypeParmType>()->CanTTPTInfo; 3775 } 3776 3777 public: 3778 unsigned getDepth() const { return getCanTTPTInfo().Depth; } 3779 unsigned getIndex() const { return getCanTTPTInfo().Index; } 3780 bool isParameterPack() const { return getCanTTPTInfo().ParameterPack; } 3781 3782 TemplateTypeParmDecl *getDecl() const { 3783 return isCanonicalUnqualified() ? nullptr : TTPDecl; 3784 } 3785 3786 IdentifierInfo *getIdentifier() const; 3787 3788 bool isSugared() const { return false; } 3789 QualType desugar() const { return QualType(this, 0); } 3790 3791 void Profile(llvm::FoldingSetNodeID &ID) { 3792 Profile(ID, getDepth(), getIndex(), isParameterPack(), getDecl()); 3793 } 3794 3795 static void Profile(llvm::FoldingSetNodeID &ID, unsigned Depth, 3796 unsigned Index, bool ParameterPack, 3797 TemplateTypeParmDecl *TTPDecl) { 3798 ID.AddInteger(Depth); 3799 ID.AddInteger(Index); 3800 ID.AddBoolean(ParameterPack); 3801 ID.AddPointer(TTPDecl); 3802 } 3803 3804 static bool classof(const Type *T) { 3805 return T->getTypeClass() == TemplateTypeParm; 3806 } 3807 }; 3808 3809 /// \brief Represents the result of substituting a type for a template 3810 /// type parameter. 3811 /// 3812 /// Within an instantiated template, all template type parameters have 3813 /// been replaced with these. They are used solely to record that a 3814 /// type was originally written as a template type parameter; 3815 /// therefore they are never canonical. 3816 class SubstTemplateTypeParmType : public Type, public llvm::FoldingSetNode { 3817 // The original type parameter. 3818 const TemplateTypeParmType *Replaced; 3819 3820 SubstTemplateTypeParmType(const TemplateTypeParmType *Param, QualType Canon) 3821 : Type(SubstTemplateTypeParm, Canon, Canon->isDependentType(), 3822 Canon->isInstantiationDependentType(), 3823 Canon->isVariablyModifiedType(), 3824 Canon->containsUnexpandedParameterPack()), 3825 Replaced(Param) { } 3826 3827 friend class ASTContext; 3828 3829 public: 3830 /// Gets the template parameter that was substituted for. 3831 const TemplateTypeParmType *getReplacedParameter() const { 3832 return Replaced; 3833 } 3834 3835 /// Gets the type that was substituted for the template 3836 /// parameter. 3837 QualType getReplacementType() const { 3838 return getCanonicalTypeInternal(); 3839 } 3840 3841 bool isSugared() const { return true; } 3842 QualType desugar() const { return getReplacementType(); } 3843 3844 void Profile(llvm::FoldingSetNodeID &ID) { 3845 Profile(ID, getReplacedParameter(), getReplacementType()); 3846 } 3847 static void Profile(llvm::FoldingSetNodeID &ID, 3848 const TemplateTypeParmType *Replaced, 3849 QualType Replacement) { 3850 ID.AddPointer(Replaced); 3851 ID.AddPointer(Replacement.getAsOpaquePtr()); 3852 } 3853 3854 static bool classof(const Type *T) { 3855 return T->getTypeClass() == SubstTemplateTypeParm; 3856 } 3857 }; 3858 3859 /// \brief Represents the result of substituting a set of types for a template 3860 /// type parameter pack. 3861 /// 3862 /// When a pack expansion in the source code contains multiple parameter packs 3863 /// and those parameter packs correspond to different levels of template 3864 /// parameter lists, this type node is used to represent a template type 3865 /// parameter pack from an outer level, which has already had its argument pack 3866 /// substituted but that still lives within a pack expansion that itself 3867 /// could not be instantiated. When actually performing a substitution into 3868 /// that pack expansion (e.g., when all template parameters have corresponding 3869 /// arguments), this type will be replaced with the \c SubstTemplateTypeParmType 3870 /// at the current pack substitution index. 3871 class SubstTemplateTypeParmPackType : public Type, public llvm::FoldingSetNode { 3872 /// \brief The original type parameter. 3873 const TemplateTypeParmType *Replaced; 3874 3875 /// \brief A pointer to the set of template arguments that this 3876 /// parameter pack is instantiated with. 3877 const TemplateArgument *Arguments; 3878 3879 /// \brief The number of template arguments in \c Arguments. 3880 unsigned NumArguments; 3881 3882 SubstTemplateTypeParmPackType(const TemplateTypeParmType *Param, 3883 QualType Canon, 3884 const TemplateArgument &ArgPack); 3885 3886 friend class ASTContext; 3887 3888 public: 3889 IdentifierInfo *getIdentifier() const { return Replaced->getIdentifier(); } 3890 3891 /// Gets the template parameter that was substituted for. 3892 const TemplateTypeParmType *getReplacedParameter() const { 3893 return Replaced; 3894 } 3895 3896 bool isSugared() const { return false; } 3897 QualType desugar() const { return QualType(this, 0); } 3898 3899 TemplateArgument getArgumentPack() const; 3900 3901 void Profile(llvm::FoldingSetNodeID &ID); 3902 static void Profile(llvm::FoldingSetNodeID &ID, 3903 const TemplateTypeParmType *Replaced, 3904 const TemplateArgument &ArgPack); 3905 3906 static bool classof(const Type *T) { 3907 return T->getTypeClass() == SubstTemplateTypeParmPack; 3908 } 3909 }; 3910 3911 /// \brief Represents a C++11 auto or C++14 decltype(auto) type. 3912 /// 3913 /// These types are usually a placeholder for a deduced type. However, before 3914 /// the initializer is attached, or if the initializer is type-dependent, there 3915 /// is no deduced type and an auto type is canonical. In the latter case, it is 3916 /// also a dependent type. 3917 class AutoType : public Type, public llvm::FoldingSetNode { 3918 AutoType(QualType DeducedType, AutoTypeKeyword Keyword, bool IsDependent) 3919 : Type(Auto, DeducedType.isNull() ? QualType(this, 0) : DeducedType, 3920 /*Dependent=*/IsDependent, /*InstantiationDependent=*/IsDependent, 3921 /*VariablyModified=*/false, 3922 /*ContainsParameterPack=*/DeducedType.isNull() 3923 ? false : DeducedType->containsUnexpandedParameterPack()) { 3924 assert((DeducedType.isNull() || !IsDependent) && 3925 "auto deduced to dependent type"); 3926 AutoTypeBits.Keyword = (unsigned)Keyword; 3927 } 3928 3929 friend class ASTContext; // ASTContext creates these 3930 3931 public: 3932 bool isDecltypeAuto() const { 3933 return getKeyword() == AutoTypeKeyword::DecltypeAuto; 3934 } 3935 AutoTypeKeyword getKeyword() const { 3936 return (AutoTypeKeyword)AutoTypeBits.Keyword; 3937 } 3938 3939 bool isSugared() const { return !isCanonicalUnqualified(); } 3940 QualType desugar() const { return getCanonicalTypeInternal(); } 3941 3942 /// \brief Get the type deduced for this auto type, or null if it's either 3943 /// not been deduced or was deduced to a dependent type. 3944 QualType getDeducedType() const { 3945 return !isCanonicalUnqualified() ? getCanonicalTypeInternal() : QualType(); 3946 } 3947 bool isDeduced() const { 3948 return !isCanonicalUnqualified() || isDependentType(); 3949 } 3950 3951 void Profile(llvm::FoldingSetNodeID &ID) { 3952 Profile(ID, getDeducedType(), getKeyword(), isDependentType()); 3953 } 3954 3955 static void Profile(llvm::FoldingSetNodeID &ID, QualType Deduced, 3956 AutoTypeKeyword Keyword, bool IsDependent) { 3957 ID.AddPointer(Deduced.getAsOpaquePtr()); 3958 ID.AddInteger((unsigned)Keyword); 3959 ID.AddBoolean(IsDependent); 3960 } 3961 3962 static bool classof(const Type *T) { 3963 return T->getTypeClass() == Auto; 3964 } 3965 }; 3966 3967 /// \brief Represents a type template specialization; the template 3968 /// must be a class template, a type alias template, or a template 3969 /// template parameter. A template which cannot be resolved to one of 3970 /// these, e.g. because it is written with a dependent scope 3971 /// specifier, is instead represented as a 3972 /// @c DependentTemplateSpecializationType. 3973 /// 3974 /// A non-dependent template specialization type is always "sugar", 3975 /// typically for a \c RecordType. For example, a class template 3976 /// specialization type of \c vector<int> will refer to a tag type for 3977 /// the instantiation \c std::vector<int, std::allocator<int>> 3978 /// 3979 /// Template specializations are dependent if either the template or 3980 /// any of the template arguments are dependent, in which case the 3981 /// type may also be canonical. 3982 /// 3983 /// Instances of this type are allocated with a trailing array of 3984 /// TemplateArguments, followed by a QualType representing the 3985 /// non-canonical aliased type when the template is a type alias 3986 /// template. 3987 class LLVM_ALIGNAS(/*alignof(uint64_t)*/ 8) TemplateSpecializationType 3988 : public Type, 3989 public llvm::FoldingSetNode { 3990 /// The name of the template being specialized. This is 3991 /// either a TemplateName::Template (in which case it is a 3992 /// ClassTemplateDecl*, a TemplateTemplateParmDecl*, or a 3993 /// TypeAliasTemplateDecl*), a 3994 /// TemplateName::SubstTemplateTemplateParmPack, or a 3995 /// TemplateName::SubstTemplateTemplateParm (in which case the 3996 /// replacement must, recursively, be one of these). 3997 TemplateName Template; 3998 3999 /// The number of template arguments named in this class template 4000 /// specialization. 4001 unsigned NumArgs : 31; 4002 4003 /// Whether this template specialization type is a substituted type alias. 4004 bool TypeAlias : 1; 4005 4006 TemplateSpecializationType(TemplateName T, 4007 const TemplateArgument *Args, 4008 unsigned NumArgs, QualType Canon, 4009 QualType Aliased); 4010 4011 friend class ASTContext; // ASTContext creates these 4012 4013 public: 4014 /// Determine whether any of the given template arguments are dependent. 4015 static bool anyDependentTemplateArguments(const TemplateArgumentLoc *Args, 4016 unsigned NumArgs, 4017 bool &InstantiationDependent); 4018 4019 static bool anyDependentTemplateArguments(const TemplateArgumentListInfo &, 4020 bool &InstantiationDependent); 4021 4022 /// \brief Print a template argument list, including the '<' and '>' 4023 /// enclosing the template arguments. 4024 static void PrintTemplateArgumentList(raw_ostream &OS, 4025 const TemplateArgument *Args, 4026 unsigned NumArgs, 4027 const PrintingPolicy &Policy, 4028 bool SkipBrackets = false); 4029 4030 static void PrintTemplateArgumentList(raw_ostream &OS, 4031 const TemplateArgumentLoc *Args, 4032 unsigned NumArgs, 4033 const PrintingPolicy &Policy); 4034 4035 static void PrintTemplateArgumentList(raw_ostream &OS, 4036 const TemplateArgumentListInfo &, 4037 const PrintingPolicy &Policy); 4038 4039 /// True if this template specialization type matches a current 4040 /// instantiation in the context in which it is found. 4041 bool isCurrentInstantiation() const { 4042 return isa<InjectedClassNameType>(getCanonicalTypeInternal()); 4043 } 4044 4045 /// \brief Determine if this template specialization type is for a type alias 4046 /// template that has been substituted. 4047 /// 4048 /// Nearly every template specialization type whose template is an alias 4049 /// template will be substituted. However, this is not the case when 4050 /// the specialization contains a pack expansion but the template alias 4051 /// does not have a corresponding parameter pack, e.g., 4052 /// 4053 /// \code 4054 /// template<typename T, typename U, typename V> struct S; 4055 /// template<typename T, typename U> using A = S<T, int, U>; 4056 /// template<typename... Ts> struct X { 4057 /// typedef A<Ts...> type; // not a type alias 4058 /// }; 4059 /// \endcode 4060 bool isTypeAlias() const { return TypeAlias; } 4061 4062 /// Get the aliased type, if this is a specialization of a type alias 4063 /// template. 4064 QualType getAliasedType() const { 4065 assert(isTypeAlias() && "not a type alias template specialization"); 4066 return *reinterpret_cast<const QualType*>(end()); 4067 } 4068 4069 typedef const TemplateArgument * iterator; 4070 4071 iterator begin() const { return getArgs(); } 4072 iterator end() const; // defined inline in TemplateBase.h 4073 4074 /// Retrieve the name of the template that we are specializing. 4075 TemplateName getTemplateName() const { return Template; } 4076 4077 /// Retrieve the template arguments. 4078 const TemplateArgument *getArgs() const { 4079 return reinterpret_cast<const TemplateArgument *>(this + 1); 4080 } 4081 4082 /// Retrieve the number of template arguments. 4083 unsigned getNumArgs() const { return NumArgs; } 4084 4085 /// Retrieve a specific template argument as a type. 4086 /// \pre \c isArgType(Arg) 4087 const TemplateArgument &getArg(unsigned Idx) const; // in TemplateBase.h 4088 4089 bool isSugared() const { 4090 return !isDependentType() || isCurrentInstantiation() || isTypeAlias(); 4091 } 4092 QualType desugar() const { return getCanonicalTypeInternal(); } 4093 4094 void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Ctx) { 4095 Profile(ID, Template, getArgs(), NumArgs, Ctx); 4096 if (isTypeAlias()) 4097 getAliasedType().Profile(ID); 4098 } 4099 4100 static void Profile(llvm::FoldingSetNodeID &ID, TemplateName T, 4101 const TemplateArgument *Args, 4102 unsigned NumArgs, 4103 const ASTContext &Context); 4104 4105 static bool classof(const Type *T) { 4106 return T->getTypeClass() == TemplateSpecialization; 4107 } 4108 }; 4109 4110 /// The injected class name of a C++ class template or class 4111 /// template partial specialization. Used to record that a type was 4112 /// spelled with a bare identifier rather than as a template-id; the 4113 /// equivalent for non-templated classes is just RecordType. 4114 /// 4115 /// Injected class name types are always dependent. Template 4116 /// instantiation turns these into RecordTypes. 4117 /// 4118 /// Injected class name types are always canonical. This works 4119 /// because it is impossible to compare an injected class name type 4120 /// with the corresponding non-injected template type, for the same 4121 /// reason that it is impossible to directly compare template 4122 /// parameters from different dependent contexts: injected class name 4123 /// types can only occur within the scope of a particular templated 4124 /// declaration, and within that scope every template specialization 4125 /// will canonicalize to the injected class name (when appropriate 4126 /// according to the rules of the language). 4127 class InjectedClassNameType : public Type { 4128 CXXRecordDecl *Decl; 4129 4130 /// The template specialization which this type represents. 4131 /// For example, in 4132 /// template <class T> class A { ... }; 4133 /// this is A<T>, whereas in 4134 /// template <class X, class Y> class A<B<X,Y> > { ... }; 4135 /// this is A<B<X,Y> >. 4136 /// 4137 /// It is always unqualified, always a template specialization type, 4138 /// and always dependent. 4139 QualType InjectedType; 4140 4141 friend class ASTContext; // ASTContext creates these. 4142 friend class ASTReader; // FIXME: ASTContext::getInjectedClassNameType is not 4143 // currently suitable for AST reading, too much 4144 // interdependencies. 4145 InjectedClassNameType(CXXRecordDecl *D, QualType TST) 4146 : Type(InjectedClassName, QualType(), /*Dependent=*/true, 4147 /*InstantiationDependent=*/true, 4148 /*VariablyModified=*/false, 4149 /*ContainsUnexpandedParameterPack=*/false), 4150 Decl(D), InjectedType(TST) { 4151 assert(isa<TemplateSpecializationType>(TST)); 4152 assert(!TST.hasQualifiers()); 4153 assert(TST->isDependentType()); 4154 } 4155 4156 public: 4157 QualType getInjectedSpecializationType() const { return InjectedType; } 4158 const TemplateSpecializationType *getInjectedTST() const { 4159 return cast<TemplateSpecializationType>(InjectedType.getTypePtr()); 4160 } 4161 4162 CXXRecordDecl *getDecl() const; 4163 4164 bool isSugared() const { return false; } 4165 QualType desugar() const { return QualType(this, 0); } 4166 4167 static bool classof(const Type *T) { 4168 return T->getTypeClass() == InjectedClassName; 4169 } 4170 }; 4171 4172 /// \brief The kind of a tag type. 4173 enum TagTypeKind { 4174 /// \brief The "struct" keyword. 4175 TTK_Struct, 4176 /// \brief The "__interface" keyword. 4177 TTK_Interface, 4178 /// \brief The "union" keyword. 4179 TTK_Union, 4180 /// \brief The "class" keyword. 4181 TTK_Class, 4182 /// \brief The "enum" keyword. 4183 TTK_Enum 4184 }; 4185 4186 /// \brief The elaboration keyword that precedes a qualified type name or 4187 /// introduces an elaborated-type-specifier. 4188 enum ElaboratedTypeKeyword { 4189 /// \brief The "struct" keyword introduces the elaborated-type-specifier. 4190 ETK_Struct, 4191 /// \brief The "__interface" keyword introduces the elaborated-type-specifier. 4192 ETK_Interface, 4193 /// \brief The "union" keyword introduces the elaborated-type-specifier. 4194 ETK_Union, 4195 /// \brief The "class" keyword introduces the elaborated-type-specifier. 4196 ETK_Class, 4197 /// \brief The "enum" keyword introduces the elaborated-type-specifier. 4198 ETK_Enum, 4199 /// \brief The "typename" keyword precedes the qualified type name, e.g., 4200 /// \c typename T::type. 4201 ETK_Typename, 4202 /// \brief No keyword precedes the qualified type name. 4203 ETK_None 4204 }; 4205 4206 /// A helper class for Type nodes having an ElaboratedTypeKeyword. 4207 /// The keyword in stored in the free bits of the base class. 4208 /// Also provides a few static helpers for converting and printing 4209 /// elaborated type keyword and tag type kind enumerations. 4210 class TypeWithKeyword : public Type { 4211 protected: 4212 TypeWithKeyword(ElaboratedTypeKeyword Keyword, TypeClass tc, 4213 QualType Canonical, bool Dependent, 4214 bool InstantiationDependent, bool VariablyModified, 4215 bool ContainsUnexpandedParameterPack) 4216 : Type(tc, Canonical, Dependent, InstantiationDependent, VariablyModified, 4217 ContainsUnexpandedParameterPack) { 4218 TypeWithKeywordBits.Keyword = Keyword; 4219 } 4220 4221 public: 4222 ElaboratedTypeKeyword getKeyword() const { 4223 return static_cast<ElaboratedTypeKeyword>(TypeWithKeywordBits.Keyword); 4224 } 4225 4226 /// Converts a type specifier (DeclSpec::TST) into an elaborated type keyword. 4227 static ElaboratedTypeKeyword getKeywordForTypeSpec(unsigned TypeSpec); 4228 4229 /// Converts a type specifier (DeclSpec::TST) into a tag type kind. 4230 /// It is an error to provide a type specifier which *isn't* a tag kind here. 4231 static TagTypeKind getTagTypeKindForTypeSpec(unsigned TypeSpec); 4232 4233 /// Converts a TagTypeKind into an elaborated type keyword. 4234 static ElaboratedTypeKeyword getKeywordForTagTypeKind(TagTypeKind Tag); 4235 4236 /// Converts an elaborated type keyword into a TagTypeKind. 4237 /// It is an error to provide an elaborated type keyword 4238 /// which *isn't* a tag kind here. 4239 static TagTypeKind getTagTypeKindForKeyword(ElaboratedTypeKeyword Keyword); 4240 4241 static bool KeywordIsTagTypeKind(ElaboratedTypeKeyword Keyword); 4242 4243 static StringRef getKeywordName(ElaboratedTypeKeyword Keyword); 4244 4245 static StringRef getTagTypeKindName(TagTypeKind Kind) { 4246 return getKeywordName(getKeywordForTagTypeKind(Kind)); 4247 } 4248 4249 class CannotCastToThisType {}; 4250 static CannotCastToThisType classof(const Type *); 4251 }; 4252 4253 /// \brief Represents a type that was referred to using an elaborated type 4254 /// keyword, e.g., struct S, or via a qualified name, e.g., N::M::type, 4255 /// or both. 4256 /// 4257 /// This type is used to keep track of a type name as written in the 4258 /// source code, including tag keywords and any nested-name-specifiers. 4259 /// The type itself is always "sugar", used to express what was written 4260 /// in the source code but containing no additional semantic information. 4261 class ElaboratedType : public TypeWithKeyword, public llvm::FoldingSetNode { 4262 4263 /// The nested name specifier containing the qualifier. 4264 NestedNameSpecifier *NNS; 4265 4266 /// The type that this qualified name refers to. 4267 QualType NamedType; 4268 4269 ElaboratedType(ElaboratedTypeKeyword Keyword, NestedNameSpecifier *NNS, 4270 QualType NamedType, QualType CanonType) 4271 : TypeWithKeyword(Keyword, Elaborated, CanonType, 4272 NamedType->isDependentType(), 4273 NamedType->isInstantiationDependentType(), 4274 NamedType->isVariablyModifiedType(), 4275 NamedType->containsUnexpandedParameterPack()), 4276 NNS(NNS), NamedType(NamedType) { 4277 assert(!(Keyword == ETK_None && NNS == nullptr) && 4278 "ElaboratedType cannot have elaborated type keyword " 4279 "and name qualifier both null."); 4280 } 4281 4282 friend class ASTContext; // ASTContext creates these 4283 4284 public: 4285 ~ElaboratedType(); 4286 4287 /// Retrieve the qualification on this type. 4288 NestedNameSpecifier *getQualifier() const { return NNS; } 4289 4290 /// Retrieve the type named by the qualified-id. 4291 QualType getNamedType() const { return NamedType; } 4292 4293 /// Remove a single level of sugar. 4294 QualType desugar() const { return getNamedType(); } 4295 4296 /// Returns whether this type directly provides sugar. 4297 bool isSugared() const { return true; } 4298 4299 void Profile(llvm::FoldingSetNodeID &ID) { 4300 Profile(ID, getKeyword(), NNS, NamedType); 4301 } 4302 4303 static void Profile(llvm::FoldingSetNodeID &ID, ElaboratedTypeKeyword Keyword, 4304 NestedNameSpecifier *NNS, QualType NamedType) { 4305 ID.AddInteger(Keyword); 4306 ID.AddPointer(NNS); 4307 NamedType.Profile(ID); 4308 } 4309 4310 static bool classof(const Type *T) { 4311 return T->getTypeClass() == Elaborated; 4312 } 4313 }; 4314 4315 /// \brief Represents a qualified type name for which the type name is 4316 /// dependent. 4317 /// 4318 /// DependentNameType represents a class of dependent types that involve a 4319 /// possibly dependent nested-name-specifier (e.g., "T::") followed by a 4320 /// name of a type. The DependentNameType may start with a "typename" (for a 4321 /// typename-specifier), "class", "struct", "union", or "enum" (for a 4322 /// dependent elaborated-type-specifier), or nothing (in contexts where we 4323 /// know that we must be referring to a type, e.g., in a base class specifier). 4324 /// Typically the nested-name-specifier is dependent, but in MSVC compatibility 4325 /// mode, this type is used with non-dependent names to delay name lookup until 4326 /// instantiation. 4327 class DependentNameType : public TypeWithKeyword, public llvm::FoldingSetNode { 4328 4329 /// \brief The nested name specifier containing the qualifier. 4330 NestedNameSpecifier *NNS; 4331 4332 /// \brief The type that this typename specifier refers to. 4333 const IdentifierInfo *Name; 4334 4335 DependentNameType(ElaboratedTypeKeyword Keyword, NestedNameSpecifier *NNS, 4336 const IdentifierInfo *Name, QualType CanonType) 4337 : TypeWithKeyword(Keyword, DependentName, CanonType, /*Dependent=*/true, 4338 /*InstantiationDependent=*/true, 4339 /*VariablyModified=*/false, 4340 NNS->containsUnexpandedParameterPack()), 4341 NNS(NNS), Name(Name) {} 4342 4343 friend class ASTContext; // ASTContext creates these 4344 4345 public: 4346 /// Retrieve the qualification on this type. 4347 NestedNameSpecifier *getQualifier() const { return NNS; } 4348 4349 /// Retrieve the type named by the typename specifier as an identifier. 4350 /// 4351 /// This routine will return a non-NULL identifier pointer when the 4352 /// form of the original typename was terminated by an identifier, 4353 /// e.g., "typename T::type". 4354 const IdentifierInfo *getIdentifier() const { 4355 return Name; 4356 } 4357 4358 bool isSugared() const { return false; } 4359 QualType desugar() const { return QualType(this, 0); } 4360 4361 void Profile(llvm::FoldingSetNodeID &ID) { 4362 Profile(ID, getKeyword(), NNS, Name); 4363 } 4364 4365 static void Profile(llvm::FoldingSetNodeID &ID, ElaboratedTypeKeyword Keyword, 4366 NestedNameSpecifier *NNS, const IdentifierInfo *Name) { 4367 ID.AddInteger(Keyword); 4368 ID.AddPointer(NNS); 4369 ID.AddPointer(Name); 4370 } 4371 4372 static bool classof(const Type *T) { 4373 return T->getTypeClass() == DependentName; 4374 } 4375 }; 4376 4377 /// Represents a template specialization type whose template cannot be 4378 /// resolved, e.g. 4379 /// A<T>::template B<T> 4380 class LLVM_ALIGNAS(/*alignof(uint64_t)*/ 8) DependentTemplateSpecializationType 4381 : public TypeWithKeyword, 4382 public llvm::FoldingSetNode { 4383 4384 /// The nested name specifier containing the qualifier. 4385 NestedNameSpecifier *NNS; 4386 4387 /// The identifier of the template. 4388 const IdentifierInfo *Name; 4389 4390 /// \brief The number of template arguments named in this class template 4391 /// specialization. 4392 unsigned NumArgs; 4393 4394 const TemplateArgument *getArgBuffer() const { 4395 return reinterpret_cast<const TemplateArgument*>(this+1); 4396 } 4397 TemplateArgument *getArgBuffer() { 4398 return reinterpret_cast<TemplateArgument*>(this+1); 4399 } 4400 4401 DependentTemplateSpecializationType(ElaboratedTypeKeyword Keyword, 4402 NestedNameSpecifier *NNS, 4403 const IdentifierInfo *Name, 4404 unsigned NumArgs, 4405 const TemplateArgument *Args, 4406 QualType Canon); 4407 4408 friend class ASTContext; // ASTContext creates these 4409 4410 public: 4411 NestedNameSpecifier *getQualifier() const { return NNS; } 4412 const IdentifierInfo *getIdentifier() const { return Name; } 4413 4414 /// \brief Retrieve the template arguments. 4415 const TemplateArgument *getArgs() const { 4416 return getArgBuffer(); 4417 } 4418 4419 /// \brief Retrieve the number of template arguments. 4420 unsigned getNumArgs() const { return NumArgs; } 4421 4422 const TemplateArgument &getArg(unsigned Idx) const; // in TemplateBase.h 4423 4424 typedef const TemplateArgument * iterator; 4425 iterator begin() const { return getArgs(); } 4426 iterator end() const; // inline in TemplateBase.h 4427 4428 bool isSugared() const { return false; } 4429 QualType desugar() const { return QualType(this, 0); } 4430 4431 void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context) { 4432 Profile(ID, Context, getKeyword(), NNS, Name, NumArgs, getArgs()); 4433 } 4434 4435 static void Profile(llvm::FoldingSetNodeID &ID, 4436 const ASTContext &Context, 4437 ElaboratedTypeKeyword Keyword, 4438 NestedNameSpecifier *Qualifier, 4439 const IdentifierInfo *Name, 4440 unsigned NumArgs, 4441 const TemplateArgument *Args); 4442 4443 static bool classof(const Type *T) { 4444 return T->getTypeClass() == DependentTemplateSpecialization; 4445 } 4446 }; 4447 4448 /// \brief Represents a pack expansion of types. 4449 /// 4450 /// Pack expansions are part of C++11 variadic templates. A pack 4451 /// expansion contains a pattern, which itself contains one or more 4452 /// "unexpanded" parameter packs. When instantiated, a pack expansion 4453 /// produces a series of types, each instantiated from the pattern of 4454 /// the expansion, where the Ith instantiation of the pattern uses the 4455 /// Ith arguments bound to each of the unexpanded parameter packs. The 4456 /// pack expansion is considered to "expand" these unexpanded 4457 /// parameter packs. 4458 /// 4459 /// \code 4460 /// template<typename ...Types> struct tuple; 4461 /// 4462 /// template<typename ...Types> 4463 /// struct tuple_of_references { 4464 /// typedef tuple<Types&...> type; 4465 /// }; 4466 /// \endcode 4467 /// 4468 /// Here, the pack expansion \c Types&... is represented via a 4469 /// PackExpansionType whose pattern is Types&. 4470 class PackExpansionType : public Type, public llvm::FoldingSetNode { 4471 /// \brief The pattern of the pack expansion. 4472 QualType Pattern; 4473 4474 /// \brief The number of expansions that this pack expansion will 4475 /// generate when substituted (+1), or indicates that 4476 /// 4477 /// This field will only have a non-zero value when some of the parameter 4478 /// packs that occur within the pattern have been substituted but others have 4479 /// not. 4480 unsigned NumExpansions; 4481 4482 PackExpansionType(QualType Pattern, QualType Canon, 4483 Optional<unsigned> NumExpansions) 4484 : Type(PackExpansion, Canon, /*Dependent=*/Pattern->isDependentType(), 4485 /*InstantiationDependent=*/true, 4486 /*VariablyModified=*/Pattern->isVariablyModifiedType(), 4487 /*ContainsUnexpandedParameterPack=*/false), 4488 Pattern(Pattern), 4489 NumExpansions(NumExpansions? *NumExpansions + 1: 0) { } 4490 4491 friend class ASTContext; // ASTContext creates these 4492 4493 public: 4494 /// \brief Retrieve the pattern of this pack expansion, which is the 4495 /// type that will be repeatedly instantiated when instantiating the 4496 /// pack expansion itself. 4497 QualType getPattern() const { return Pattern; } 4498 4499 /// \brief Retrieve the number of expansions that this pack expansion will 4500 /// generate, if known. 4501 Optional<unsigned> getNumExpansions() const { 4502 if (NumExpansions) 4503 return NumExpansions - 1; 4504 4505 return None; 4506 } 4507 4508 bool isSugared() const { return !Pattern->isDependentType(); } 4509 QualType desugar() const { return isSugared() ? Pattern : QualType(this, 0); } 4510 4511 void Profile(llvm::FoldingSetNodeID &ID) { 4512 Profile(ID, getPattern(), getNumExpansions()); 4513 } 4514 4515 static void Profile(llvm::FoldingSetNodeID &ID, QualType Pattern, 4516 Optional<unsigned> NumExpansions) { 4517 ID.AddPointer(Pattern.getAsOpaquePtr()); 4518 ID.AddBoolean(NumExpansions.hasValue()); 4519 if (NumExpansions) 4520 ID.AddInteger(*NumExpansions); 4521 } 4522 4523 static bool classof(const Type *T) { 4524 return T->getTypeClass() == PackExpansion; 4525 } 4526 }; 4527 4528 /// Represents a class type in Objective C. 4529 /// 4530 /// Every Objective C type is a combination of a base type, a set of 4531 /// type arguments (optional, for parameterized classes) and a list of 4532 /// protocols. 4533 /// 4534 /// Given the following declarations: 4535 /// \code 4536 /// \@class C<T>; 4537 /// \@protocol P; 4538 /// \endcode 4539 /// 4540 /// 'C' is an ObjCInterfaceType C. It is sugar for an ObjCObjectType 4541 /// with base C and no protocols. 4542 /// 4543 /// 'C<P>' is an unspecialized ObjCObjectType with base C and protocol list [P]. 4544 /// 'C<C*>' is a specialized ObjCObjectType with type arguments 'C*' and no 4545 /// protocol list. 4546 /// 'C<C*><P>' is a specialized ObjCObjectType with base C, type arguments 'C*', 4547 /// and protocol list [P]. 4548 /// 4549 /// 'id' is a TypedefType which is sugar for an ObjCObjectPointerType whose 4550 /// pointee is an ObjCObjectType with base BuiltinType::ObjCIdType 4551 /// and no protocols. 4552 /// 4553 /// 'id<P>' is an ObjCObjectPointerType whose pointee is an ObjCObjectType 4554 /// with base BuiltinType::ObjCIdType and protocol list [P]. Eventually 4555 /// this should get its own sugar class to better represent the source. 4556 class ObjCObjectType : public Type { 4557 // ObjCObjectType.NumTypeArgs - the number of type arguments stored 4558 // after the ObjCObjectPointerType node. 4559 // ObjCObjectType.NumProtocols - the number of protocols stored 4560 // after the type arguments of ObjCObjectPointerType node. 4561 // 4562 // These protocols are those written directly on the type. If 4563 // protocol qualifiers ever become additive, the iterators will need 4564 // to get kindof complicated. 4565 // 4566 // In the canonical object type, these are sorted alphabetically 4567 // and uniqued. 4568 4569 /// Either a BuiltinType or an InterfaceType or sugar for either. 4570 QualType BaseType; 4571 4572 /// Cached superclass type. 4573 mutable llvm::PointerIntPair<const ObjCObjectType *, 1, bool> 4574 CachedSuperClassType; 4575 4576 ObjCProtocolDecl * const *getProtocolStorage() const { 4577 return const_cast<ObjCObjectType*>(this)->getProtocolStorage(); 4578 } 4579 4580 QualType *getTypeArgStorage(); 4581 const QualType *getTypeArgStorage() const { 4582 return const_cast<ObjCObjectType *>(this)->getTypeArgStorage(); 4583 } 4584 4585 ObjCProtocolDecl **getProtocolStorage(); 4586 4587 protected: 4588 ObjCObjectType(QualType Canonical, QualType Base, 4589 ArrayRef<QualType> typeArgs, 4590 ArrayRef<ObjCProtocolDecl *> protocols, 4591 bool isKindOf); 4592 4593 enum Nonce_ObjCInterface { Nonce_ObjCInterface }; 4594 ObjCObjectType(enum Nonce_ObjCInterface) 4595 : Type(ObjCInterface, QualType(), false, false, false, false), 4596 BaseType(QualType(this_(), 0)) { 4597 ObjCObjectTypeBits.NumProtocols = 0; 4598 ObjCObjectTypeBits.NumTypeArgs = 0; 4599 ObjCObjectTypeBits.IsKindOf = 0; 4600 } 4601 4602 void computeSuperClassTypeSlow() const; 4603 4604 public: 4605 /// Gets the base type of this object type. This is always (possibly 4606 /// sugar for) one of: 4607 /// - the 'id' builtin type (as opposed to the 'id' type visible to the 4608 /// user, which is a typedef for an ObjCObjectPointerType) 4609 /// - the 'Class' builtin type (same caveat) 4610 /// - an ObjCObjectType (currently always an ObjCInterfaceType) 4611 QualType getBaseType() const { return BaseType; } 4612 4613 bool isObjCId() const { 4614 return getBaseType()->isSpecificBuiltinType(BuiltinType::ObjCId); 4615 } 4616 bool isObjCClass() const { 4617 return getBaseType()->isSpecificBuiltinType(BuiltinType::ObjCClass); 4618 } 4619 bool isObjCUnqualifiedId() const { return qual_empty() && isObjCId(); } 4620 bool isObjCUnqualifiedClass() const { return qual_empty() && isObjCClass(); } 4621 bool isObjCUnqualifiedIdOrClass() const { 4622 if (!qual_empty()) return false; 4623 if (const BuiltinType *T = getBaseType()->getAs<BuiltinType>()) 4624 return T->getKind() == BuiltinType::ObjCId || 4625 T->getKind() == BuiltinType::ObjCClass; 4626 return false; 4627 } 4628 bool isObjCQualifiedId() const { return !qual_empty() && isObjCId(); } 4629 bool isObjCQualifiedClass() const { return !qual_empty() && isObjCClass(); } 4630 4631 /// Gets the interface declaration for this object type, if the base type 4632 /// really is an interface. 4633 ObjCInterfaceDecl *getInterface() const; 4634 4635 /// Determine whether this object type is "specialized", meaning 4636 /// that it has type arguments. 4637 bool isSpecialized() const; 4638 4639 /// Determine whether this object type was written with type arguments. 4640 bool isSpecializedAsWritten() const { 4641 return ObjCObjectTypeBits.NumTypeArgs > 0; 4642 } 4643 4644 /// Determine whether this object type is "unspecialized", meaning 4645 /// that it has no type arguments. 4646 bool isUnspecialized() const { return !isSpecialized(); } 4647 4648 /// Determine whether this object type is "unspecialized" as 4649 /// written, meaning that it has no type arguments. 4650 bool isUnspecializedAsWritten() const { return !isSpecializedAsWritten(); } 4651 4652 /// Retrieve the type arguments of this object type (semantically). 4653 ArrayRef<QualType> getTypeArgs() const; 4654 4655 /// Retrieve the type arguments of this object type as they were 4656 /// written. 4657 ArrayRef<QualType> getTypeArgsAsWritten() const { 4658 return llvm::makeArrayRef(getTypeArgStorage(), 4659 ObjCObjectTypeBits.NumTypeArgs); 4660 } 4661 4662 typedef ObjCProtocolDecl * const *qual_iterator; 4663 typedef llvm::iterator_range<qual_iterator> qual_range; 4664 4665 qual_range quals() const { return qual_range(qual_begin(), qual_end()); } 4666 qual_iterator qual_begin() const { return getProtocolStorage(); } 4667 qual_iterator qual_end() const { return qual_begin() + getNumProtocols(); } 4668 4669 bool qual_empty() const { return getNumProtocols() == 0; } 4670 4671 /// Return the number of qualifying protocols in this interface type, 4672 /// or 0 if there are none. 4673 unsigned getNumProtocols() const { return ObjCObjectTypeBits.NumProtocols; } 4674 4675 /// Fetch a protocol by index. 4676 ObjCProtocolDecl *getProtocol(unsigned I) const { 4677 assert(I < getNumProtocols() && "Out-of-range protocol access"); 4678 return qual_begin()[I]; 4679 } 4680 4681 /// Retrieve all of the protocol qualifiers. 4682 ArrayRef<ObjCProtocolDecl *> getProtocols() const { 4683 return ArrayRef<ObjCProtocolDecl *>(qual_begin(), getNumProtocols()); 4684 } 4685 4686 /// Whether this is a "__kindof" type as written. 4687 bool isKindOfTypeAsWritten() const { return ObjCObjectTypeBits.IsKindOf; } 4688 4689 /// Whether this ia a "__kindof" type (semantically). 4690 bool isKindOfType() const; 4691 4692 /// Retrieve the type of the superclass of this object type. 4693 /// 4694 /// This operation substitutes any type arguments into the 4695 /// superclass of the current class type, potentially producing a 4696 /// specialization of the superclass type. Produces a null type if 4697 /// there is no superclass. 4698 QualType getSuperClassType() const { 4699 if (!CachedSuperClassType.getInt()) 4700 computeSuperClassTypeSlow(); 4701 4702 assert(CachedSuperClassType.getInt() && "Superclass not set?"); 4703 return QualType(CachedSuperClassType.getPointer(), 0); 4704 } 4705 4706 /// Strip off the Objective-C "kindof" type and (with it) any 4707 /// protocol qualifiers. 4708 QualType stripObjCKindOfTypeAndQuals(const ASTContext &ctx) const; 4709 4710 bool isSugared() const { return false; } 4711 QualType desugar() const { return QualType(this, 0); } 4712 4713 static bool classof(const Type *T) { 4714 return T->getTypeClass() == ObjCObject || 4715 T->getTypeClass() == ObjCInterface; 4716 } 4717 }; 4718 4719 /// A class providing a concrete implementation 4720 /// of ObjCObjectType, so as to not increase the footprint of 4721 /// ObjCInterfaceType. Code outside of ASTContext and the core type 4722 /// system should not reference this type. 4723 class ObjCObjectTypeImpl : public ObjCObjectType, public llvm::FoldingSetNode { 4724 friend class ASTContext; 4725 4726 // If anyone adds fields here, ObjCObjectType::getProtocolStorage() 4727 // will need to be modified. 4728 4729 ObjCObjectTypeImpl(QualType Canonical, QualType Base, 4730 ArrayRef<QualType> typeArgs, 4731 ArrayRef<ObjCProtocolDecl *> protocols, 4732 bool isKindOf) 4733 : ObjCObjectType(Canonical, Base, typeArgs, protocols, isKindOf) {} 4734 4735 public: 4736 void Profile(llvm::FoldingSetNodeID &ID); 4737 static void Profile(llvm::FoldingSetNodeID &ID, 4738 QualType Base, 4739 ArrayRef<QualType> typeArgs, 4740 ArrayRef<ObjCProtocolDecl *> protocols, 4741 bool isKindOf); 4742 }; 4743 4744 inline QualType *ObjCObjectType::getTypeArgStorage() { 4745 return reinterpret_cast<QualType *>(static_cast<ObjCObjectTypeImpl*>(this)+1); 4746 } 4747 4748 inline ObjCProtocolDecl **ObjCObjectType::getProtocolStorage() { 4749 return reinterpret_cast<ObjCProtocolDecl**>( 4750 getTypeArgStorage() + ObjCObjectTypeBits.NumTypeArgs); 4751 } 4752 4753 /// Interfaces are the core concept in Objective-C for object oriented design. 4754 /// They basically correspond to C++ classes. There are two kinds of interface 4755 /// types: normal interfaces like `NSString`, and qualified interfaces, which 4756 /// are qualified with a protocol list like `NSString<NSCopyable, NSAmazing>`. 4757 /// 4758 /// ObjCInterfaceType guarantees the following properties when considered 4759 /// as a subtype of its superclass, ObjCObjectType: 4760 /// - There are no protocol qualifiers. To reinforce this, code which 4761 /// tries to invoke the protocol methods via an ObjCInterfaceType will 4762 /// fail to compile. 4763 /// - It is its own base type. That is, if T is an ObjCInterfaceType*, 4764 /// T->getBaseType() == QualType(T, 0). 4765 class ObjCInterfaceType : public ObjCObjectType { 4766 mutable ObjCInterfaceDecl *Decl; 4767 4768 ObjCInterfaceType(const ObjCInterfaceDecl *D) 4769 : ObjCObjectType(Nonce_ObjCInterface), 4770 Decl(const_cast<ObjCInterfaceDecl*>(D)) {} 4771 friend class ASTContext; // ASTContext creates these. 4772 friend class ASTReader; 4773 friend class ObjCInterfaceDecl; 4774 4775 public: 4776 /// Get the declaration of this interface. 4777 ObjCInterfaceDecl *getDecl() const { return Decl; } 4778 4779 bool isSugared() const { return false; } 4780 QualType desugar() const { return QualType(this, 0); } 4781 4782 static bool classof(const Type *T) { 4783 return T->getTypeClass() == ObjCInterface; 4784 } 4785 4786 // Nonsense to "hide" certain members of ObjCObjectType within this 4787 // class. People asking for protocols on an ObjCInterfaceType are 4788 // not going to get what they want: ObjCInterfaceTypes are 4789 // guaranteed to have no protocols. 4790 enum { 4791 qual_iterator, 4792 qual_begin, 4793 qual_end, 4794 getNumProtocols, 4795 getProtocol 4796 }; 4797 }; 4798 4799 inline ObjCInterfaceDecl *ObjCObjectType::getInterface() const { 4800 QualType baseType = getBaseType(); 4801 while (const ObjCObjectType *ObjT = baseType->getAs<ObjCObjectType>()) { 4802 if (const ObjCInterfaceType *T = dyn_cast<ObjCInterfaceType>(ObjT)) 4803 return T->getDecl(); 4804 4805 baseType = ObjT->getBaseType(); 4806 } 4807 4808 return nullptr; 4809 } 4810 4811 /// Represents a pointer to an Objective C object. 4812 /// 4813 /// These are constructed from pointer declarators when the pointee type is 4814 /// an ObjCObjectType (or sugar for one). In addition, the 'id' and 'Class' 4815 /// types are typedefs for these, and the protocol-qualified types 'id<P>' 4816 /// and 'Class<P>' are translated into these. 4817 /// 4818 /// Pointers to pointers to Objective C objects are still PointerTypes; 4819 /// only the first level of pointer gets it own type implementation. 4820 class ObjCObjectPointerType : public Type, public llvm::FoldingSetNode { 4821 QualType PointeeType; 4822 4823 ObjCObjectPointerType(QualType Canonical, QualType Pointee) 4824 : Type(ObjCObjectPointer, Canonical, 4825 Pointee->isDependentType(), 4826 Pointee->isInstantiationDependentType(), 4827 Pointee->isVariablyModifiedType(), 4828 Pointee->containsUnexpandedParameterPack()), 4829 PointeeType(Pointee) {} 4830 friend class ASTContext; // ASTContext creates these. 4831 4832 public: 4833 /// Gets the type pointed to by this ObjC pointer. 4834 /// The result will always be an ObjCObjectType or sugar thereof. 4835 QualType getPointeeType() const { return PointeeType; } 4836 4837 /// Gets the type pointed to by this ObjC pointer. Always returns non-null. 4838 /// 4839 /// This method is equivalent to getPointeeType() except that 4840 /// it discards any typedefs (or other sugar) between this 4841 /// type and the "outermost" object type. So for: 4842 /// \code 4843 /// \@class A; \@protocol P; \@protocol Q; 4844 /// typedef A<P> AP; 4845 /// typedef A A1; 4846 /// typedef A1<P> A1P; 4847 /// typedef A1P<Q> A1PQ; 4848 /// \endcode 4849 /// For 'A*', getObjectType() will return 'A'. 4850 /// For 'A<P>*', getObjectType() will return 'A<P>'. 4851 /// For 'AP*', getObjectType() will return 'A<P>'. 4852 /// For 'A1*', getObjectType() will return 'A'. 4853 /// For 'A1<P>*', getObjectType() will return 'A1<P>'. 4854 /// For 'A1P*', getObjectType() will return 'A1<P>'. 4855 /// For 'A1PQ*', getObjectType() will return 'A1<Q>', because 4856 /// adding protocols to a protocol-qualified base discards the 4857 /// old qualifiers (for now). But if it didn't, getObjectType() 4858 /// would return 'A1P<Q>' (and we'd have to make iterating over 4859 /// qualifiers more complicated). 4860 const ObjCObjectType *getObjectType() const { 4861 return PointeeType->castAs<ObjCObjectType>(); 4862 } 4863 4864 /// If this pointer points to an Objective C 4865 /// \@interface type, gets the type for that interface. Any protocol 4866 /// qualifiers on the interface are ignored. 4867 /// 4868 /// \return null if the base type for this pointer is 'id' or 'Class' 4869 const ObjCInterfaceType *getInterfaceType() const; 4870 4871 /// If this pointer points to an Objective \@interface 4872 /// type, gets the declaration for that interface. 4873 /// 4874 /// \return null if the base type for this pointer is 'id' or 'Class' 4875 ObjCInterfaceDecl *getInterfaceDecl() const { 4876 return getObjectType()->getInterface(); 4877 } 4878 4879 /// True if this is equivalent to the 'id' type, i.e. if 4880 /// its object type is the primitive 'id' type with no protocols. 4881 bool isObjCIdType() const { 4882 return getObjectType()->isObjCUnqualifiedId(); 4883 } 4884 4885 /// True if this is equivalent to the 'Class' type, 4886 /// i.e. if its object tive is the primitive 'Class' type with no protocols. 4887 bool isObjCClassType() const { 4888 return getObjectType()->isObjCUnqualifiedClass(); 4889 } 4890 4891 /// True if this is equivalent to the 'id' or 'Class' type, 4892 bool isObjCIdOrClassType() const { 4893 return getObjectType()->isObjCUnqualifiedIdOrClass(); 4894 } 4895 4896 /// True if this is equivalent to 'id<P>' for some non-empty set of 4897 /// protocols. 4898 bool isObjCQualifiedIdType() const { 4899 return getObjectType()->isObjCQualifiedId(); 4900 } 4901 4902 /// True if this is equivalent to 'Class<P>' for some non-empty set of 4903 /// protocols. 4904 bool isObjCQualifiedClassType() const { 4905 return getObjectType()->isObjCQualifiedClass(); 4906 } 4907 4908 /// Whether this is a "__kindof" type. 4909 bool isKindOfType() const { return getObjectType()->isKindOfType(); } 4910 4911 /// Whether this type is specialized, meaning that it has type arguments. 4912 bool isSpecialized() const { return getObjectType()->isSpecialized(); } 4913 4914 /// Whether this type is specialized, meaning that it has type arguments. 4915 bool isSpecializedAsWritten() const { 4916 return getObjectType()->isSpecializedAsWritten(); 4917 } 4918 4919 /// Whether this type is unspecialized, meaning that is has no type arguments. 4920 bool isUnspecialized() const { return getObjectType()->isUnspecialized(); } 4921 4922 /// Determine whether this object type is "unspecialized" as 4923 /// written, meaning that it has no type arguments. 4924 bool isUnspecializedAsWritten() const { return !isSpecializedAsWritten(); } 4925 4926 /// Retrieve the type arguments for this type. 4927 ArrayRef<QualType> getTypeArgs() const { 4928 return getObjectType()->getTypeArgs(); 4929 } 4930 4931 /// Retrieve the type arguments for this type. 4932 ArrayRef<QualType> getTypeArgsAsWritten() const { 4933 return getObjectType()->getTypeArgsAsWritten(); 4934 } 4935 4936 /// An iterator over the qualifiers on the object type. Provided 4937 /// for convenience. This will always iterate over the full set of 4938 /// protocols on a type, not just those provided directly. 4939 typedef ObjCObjectType::qual_iterator qual_iterator; 4940 typedef llvm::iterator_range<qual_iterator> qual_range; 4941 4942 qual_range quals() const { return qual_range(qual_begin(), qual_end()); } 4943 qual_iterator qual_begin() const { 4944 return getObjectType()->qual_begin(); 4945 } 4946 qual_iterator qual_end() const { 4947 return getObjectType()->qual_end(); 4948 } 4949 bool qual_empty() const { return getObjectType()->qual_empty(); } 4950 4951 /// Return the number of qualifying protocols on the object type. 4952 unsigned getNumProtocols() const { 4953 return getObjectType()->getNumProtocols(); 4954 } 4955 4956 /// Retrieve a qualifying protocol by index on the object type. 4957 ObjCProtocolDecl *getProtocol(unsigned I) const { 4958 return getObjectType()->getProtocol(I); 4959 } 4960 4961 bool isSugared() const { return false; } 4962 QualType desugar() const { return QualType(this, 0); } 4963 4964 /// Retrieve the type of the superclass of this object pointer type. 4965 /// 4966 /// This operation substitutes any type arguments into the 4967 /// superclass of the current class type, potentially producing a 4968 /// pointer to a specialization of the superclass type. Produces a 4969 /// null type if there is no superclass. 4970 QualType getSuperClassType() const; 4971 4972 /// Strip off the Objective-C "kindof" type and (with it) any 4973 /// protocol qualifiers. 4974 const ObjCObjectPointerType *stripObjCKindOfTypeAndQuals( 4975 const ASTContext &ctx) const; 4976 4977 void Profile(llvm::FoldingSetNodeID &ID) { 4978 Profile(ID, getPointeeType()); 4979 } 4980 static void Profile(llvm::FoldingSetNodeID &ID, QualType T) { 4981 ID.AddPointer(T.getAsOpaquePtr()); 4982 } 4983 static bool classof(const Type *T) { 4984 return T->getTypeClass() == ObjCObjectPointer; 4985 } 4986 }; 4987 4988 class AtomicType : public Type, public llvm::FoldingSetNode { 4989 QualType ValueType; 4990 4991 AtomicType(QualType ValTy, QualType Canonical) 4992 : Type(Atomic, Canonical, ValTy->isDependentType(), 4993 ValTy->isInstantiationDependentType(), 4994 ValTy->isVariablyModifiedType(), 4995 ValTy->containsUnexpandedParameterPack()), 4996 ValueType(ValTy) {} 4997 friend class ASTContext; // ASTContext creates these. 4998 4999 public: 5000 /// Gets the type contained by this atomic type, i.e. 5001 /// the type returned by performing an atomic load of this atomic type. 5002 QualType getValueType() const { return ValueType; } 5003 5004 bool isSugared() const { return false; } 5005 QualType desugar() const { return QualType(this, 0); } 5006 5007 void Profile(llvm::FoldingSetNodeID &ID) { 5008 Profile(ID, getValueType()); 5009 } 5010 static void Profile(llvm::FoldingSetNodeID &ID, QualType T) { 5011 ID.AddPointer(T.getAsOpaquePtr()); 5012 } 5013 static bool classof(const Type *T) { 5014 return T->getTypeClass() == Atomic; 5015 } 5016 }; 5017 5018 /// A qualifier set is used to build a set of qualifiers. 5019 class QualifierCollector : public Qualifiers { 5020 public: 5021 QualifierCollector(Qualifiers Qs = Qualifiers()) : Qualifiers(Qs) {} 5022 5023 /// Collect any qualifiers on the given type and return an 5024 /// unqualified type. The qualifiers are assumed to be consistent 5025 /// with those already in the type. 5026 const Type *strip(QualType type) { 5027 addFastQualifiers(type.getLocalFastQualifiers()); 5028 if (!type.hasLocalNonFastQualifiers()) 5029 return type.getTypePtrUnsafe(); 5030 5031 const ExtQuals *extQuals = type.getExtQualsUnsafe(); 5032 addConsistentQualifiers(extQuals->getQualifiers()); 5033 return extQuals->getBaseType(); 5034 } 5035 5036 /// Apply the collected qualifiers to the given type. 5037 QualType apply(const ASTContext &Context, QualType QT) const; 5038 5039 /// Apply the collected qualifiers to the given type. 5040 QualType apply(const ASTContext &Context, const Type* T) const; 5041 }; 5042 5043 5044 // Inline function definitions. 5045 5046 inline SplitQualType SplitQualType::getSingleStepDesugaredType() const { 5047 SplitQualType desugar = 5048 Ty->getLocallyUnqualifiedSingleStepDesugaredType().split(); 5049 desugar.Quals.addConsistentQualifiers(Quals); 5050 return desugar; 5051 } 5052 5053 inline const Type *QualType::getTypePtr() const { 5054 return getCommonPtr()->BaseType; 5055 } 5056 5057 inline const Type *QualType::getTypePtrOrNull() const { 5058 return (isNull() ? nullptr : getCommonPtr()->BaseType); 5059 } 5060 5061 inline SplitQualType QualType::split() const { 5062 if (!hasLocalNonFastQualifiers()) 5063 return SplitQualType(getTypePtrUnsafe(), 5064 Qualifiers::fromFastMask(getLocalFastQualifiers())); 5065 5066 const ExtQuals *eq = getExtQualsUnsafe(); 5067 Qualifiers qs = eq->getQualifiers(); 5068 qs.addFastQualifiers(getLocalFastQualifiers()); 5069 return SplitQualType(eq->getBaseType(), qs); 5070 } 5071 5072 inline Qualifiers QualType::getLocalQualifiers() const { 5073 Qualifiers Quals; 5074 if (hasLocalNonFastQualifiers()) 5075 Quals = getExtQualsUnsafe()->getQualifiers(); 5076 Quals.addFastQualifiers(getLocalFastQualifiers()); 5077 return Quals; 5078 } 5079 5080 inline Qualifiers QualType::getQualifiers() const { 5081 Qualifiers quals = getCommonPtr()->CanonicalType.getLocalQualifiers(); 5082 quals.addFastQualifiers(getLocalFastQualifiers()); 5083 return quals; 5084 } 5085 5086 inline unsigned QualType::getCVRQualifiers() const { 5087 unsigned cvr = getCommonPtr()->CanonicalType.getLocalCVRQualifiers(); 5088 cvr |= getLocalCVRQualifiers(); 5089 return cvr; 5090 } 5091 5092 inline QualType QualType::getCanonicalType() const { 5093 QualType canon = getCommonPtr()->CanonicalType; 5094 return canon.withFastQualifiers(getLocalFastQualifiers()); 5095 } 5096 5097 inline bool QualType::isCanonical() const { 5098 return getTypePtr()->isCanonicalUnqualified(); 5099 } 5100 5101 inline bool QualType::isCanonicalAsParam() const { 5102 if (!isCanonical()) return false; 5103 if (hasLocalQualifiers()) return false; 5104 5105 const Type *T = getTypePtr(); 5106 if (T->isVariablyModifiedType() && T->hasSizedVLAType()) 5107 return false; 5108 5109 return !isa<FunctionType>(T) && !isa<ArrayType>(T); 5110 } 5111 5112 inline bool QualType::isConstQualified() const { 5113 return isLocalConstQualified() || 5114 getCommonPtr()->CanonicalType.isLocalConstQualified(); 5115 } 5116 5117 inline bool QualType::isRestrictQualified() const { 5118 return isLocalRestrictQualified() || 5119 getCommonPtr()->CanonicalType.isLocalRestrictQualified(); 5120 } 5121 5122 5123 inline bool QualType::isVolatileQualified() const { 5124 return isLocalVolatileQualified() || 5125 getCommonPtr()->CanonicalType.isLocalVolatileQualified(); 5126 } 5127 5128 inline bool QualType::hasQualifiers() const { 5129 return hasLocalQualifiers() || 5130 getCommonPtr()->CanonicalType.hasLocalQualifiers(); 5131 } 5132 5133 inline QualType QualType::getUnqualifiedType() const { 5134 if (!getTypePtr()->getCanonicalTypeInternal().hasLocalQualifiers()) 5135 return QualType(getTypePtr(), 0); 5136 5137 return QualType(getSplitUnqualifiedTypeImpl(*this).Ty, 0); 5138 } 5139 5140 inline SplitQualType QualType::getSplitUnqualifiedType() const { 5141 if (!getTypePtr()->getCanonicalTypeInternal().hasLocalQualifiers()) 5142 return split(); 5143 5144 return getSplitUnqualifiedTypeImpl(*this); 5145 } 5146 5147 inline void QualType::removeLocalConst() { 5148 removeLocalFastQualifiers(Qualifiers::Const); 5149 } 5150 5151 inline void QualType::removeLocalRestrict() { 5152 removeLocalFastQualifiers(Qualifiers::Restrict); 5153 } 5154 5155 inline void QualType::removeLocalVolatile() { 5156 removeLocalFastQualifiers(Qualifiers::Volatile); 5157 } 5158 5159 inline void QualType::removeLocalCVRQualifiers(unsigned Mask) { 5160 assert(!(Mask & ~Qualifiers::CVRMask) && "mask has non-CVR bits"); 5161 assert((int)Qualifiers::CVRMask == (int)Qualifiers::FastMask); 5162 5163 // Fast path: we don't need to touch the slow qualifiers. 5164 removeLocalFastQualifiers(Mask); 5165 } 5166 5167 /// Return the address space of this type. 5168 inline unsigned QualType::getAddressSpace() const { 5169 return getQualifiers().getAddressSpace(); 5170 } 5171 5172 /// Return the gc attribute of this type. 5173 inline Qualifiers::GC QualType::getObjCGCAttr() const { 5174 return getQualifiers().getObjCGCAttr(); 5175 } 5176 5177 inline FunctionType::ExtInfo getFunctionExtInfo(const Type &t) { 5178 if (const PointerType *PT = t.getAs<PointerType>()) { 5179 if (const FunctionType *FT = PT->getPointeeType()->getAs<FunctionType>()) 5180 return FT->getExtInfo(); 5181 } else if (const FunctionType *FT = t.getAs<FunctionType>()) 5182 return FT->getExtInfo(); 5183 5184 return FunctionType::ExtInfo(); 5185 } 5186 5187 inline FunctionType::ExtInfo getFunctionExtInfo(QualType t) { 5188 return getFunctionExtInfo(*t); 5189 } 5190 5191 /// Determine whether this type is more 5192 /// qualified than the Other type. For example, "const volatile int" 5193 /// is more qualified than "const int", "volatile int", and 5194 /// "int". However, it is not more qualified than "const volatile 5195 /// int". 5196 inline bool QualType::isMoreQualifiedThan(QualType other) const { 5197 Qualifiers myQuals = getQualifiers(); 5198 Qualifiers otherQuals = other.getQualifiers(); 5199 return (myQuals != otherQuals && myQuals.compatiblyIncludes(otherQuals)); 5200 } 5201 5202 /// Determine whether this type is at last 5203 /// as qualified as the Other type. For example, "const volatile 5204 /// int" is at least as qualified as "const int", "volatile int", 5205 /// "int", and "const volatile int". 5206 inline bool QualType::isAtLeastAsQualifiedAs(QualType other) const { 5207 return getQualifiers().compatiblyIncludes(other.getQualifiers()); 5208 } 5209 5210 /// If Type is a reference type (e.g., const 5211 /// int&), returns the type that the reference refers to ("const 5212 /// int"). Otherwise, returns the type itself. This routine is used 5213 /// throughout Sema to implement C++ 5p6: 5214 /// 5215 /// If an expression initially has the type "reference to T" (8.3.2, 5216 /// 8.5.3), the type is adjusted to "T" prior to any further 5217 /// analysis, the expression designates the object or function 5218 /// denoted by the reference, and the expression is an lvalue. 5219 inline QualType QualType::getNonReferenceType() const { 5220 if (const ReferenceType *RefType = (*this)->getAs<ReferenceType>()) 5221 return RefType->getPointeeType(); 5222 else 5223 return *this; 5224 } 5225 5226 inline bool QualType::isCForbiddenLValueType() const { 5227 return ((getTypePtr()->isVoidType() && !hasQualifiers()) || 5228 getTypePtr()->isFunctionType()); 5229 } 5230 5231 /// Tests whether the type is categorized as a fundamental type. 5232 /// 5233 /// \returns True for types specified in C++0x [basic.fundamental]. 5234 inline bool Type::isFundamentalType() const { 5235 return isVoidType() || 5236 // FIXME: It's really annoying that we don't have an 5237 // 'isArithmeticType()' which agrees with the standard definition. 5238 (isArithmeticType() && !isEnumeralType()); 5239 } 5240 5241 /// Tests whether the type is categorized as a compound type. 5242 /// 5243 /// \returns True for types specified in C++0x [basic.compound]. 5244 inline bool Type::isCompoundType() const { 5245 // C++0x [basic.compound]p1: 5246 // Compound types can be constructed in the following ways: 5247 // -- arrays of objects of a given type [...]; 5248 return isArrayType() || 5249 // -- functions, which have parameters of given types [...]; 5250 isFunctionType() || 5251 // -- pointers to void or objects or functions [...]; 5252 isPointerType() || 5253 // -- references to objects or functions of a given type. [...] 5254 isReferenceType() || 5255 // -- classes containing a sequence of objects of various types, [...]; 5256 isRecordType() || 5257 // -- unions, which are classes capable of containing objects of different 5258 // types at different times; 5259 isUnionType() || 5260 // -- enumerations, which comprise a set of named constant values. [...]; 5261 isEnumeralType() || 5262 // -- pointers to non-static class members, [...]. 5263 isMemberPointerType(); 5264 } 5265 5266 inline bool Type::isFunctionType() const { 5267 return isa<FunctionType>(CanonicalType); 5268 } 5269 inline bool Type::isPointerType() const { 5270 return isa<PointerType>(CanonicalType); 5271 } 5272 inline bool Type::isAnyPointerType() const { 5273 return isPointerType() || isObjCObjectPointerType(); 5274 } 5275 inline bool Type::isBlockPointerType() const { 5276 return isa<BlockPointerType>(CanonicalType); 5277 } 5278 inline bool Type::isReferenceType() const { 5279 return isa<ReferenceType>(CanonicalType); 5280 } 5281 inline bool Type::isLValueReferenceType() const { 5282 return isa<LValueReferenceType>(CanonicalType); 5283 } 5284 inline bool Type::isRValueReferenceType() const { 5285 return isa<RValueReferenceType>(CanonicalType); 5286 } 5287 inline bool Type::isFunctionPointerType() const { 5288 if (const PointerType *T = getAs<PointerType>()) 5289 return T->getPointeeType()->isFunctionType(); 5290 else 5291 return false; 5292 } 5293 inline bool Type::isMemberPointerType() const { 5294 return isa<MemberPointerType>(CanonicalType); 5295 } 5296 inline bool Type::isMemberFunctionPointerType() const { 5297 if (const MemberPointerType* T = getAs<MemberPointerType>()) 5298 return T->isMemberFunctionPointer(); 5299 else 5300 return false; 5301 } 5302 inline bool Type::isMemberDataPointerType() const { 5303 if (const MemberPointerType* T = getAs<MemberPointerType>()) 5304 return T->isMemberDataPointer(); 5305 else 5306 return false; 5307 } 5308 inline bool Type::isArrayType() const { 5309 return isa<ArrayType>(CanonicalType); 5310 } 5311 inline bool Type::isConstantArrayType() const { 5312 return isa<ConstantArrayType>(CanonicalType); 5313 } 5314 inline bool Type::isIncompleteArrayType() const { 5315 return isa<IncompleteArrayType>(CanonicalType); 5316 } 5317 inline bool Type::isVariableArrayType() const { 5318 return isa<VariableArrayType>(CanonicalType); 5319 } 5320 inline bool Type::isDependentSizedArrayType() const { 5321 return isa<DependentSizedArrayType>(CanonicalType); 5322 } 5323 inline bool Type::isBuiltinType() const { 5324 return isa<BuiltinType>(CanonicalType); 5325 } 5326 inline bool Type::isRecordType() const { 5327 return isa<RecordType>(CanonicalType); 5328 } 5329 inline bool Type::isEnumeralType() const { 5330 return isa<EnumType>(CanonicalType); 5331 } 5332 inline bool Type::isAnyComplexType() const { 5333 return isa<ComplexType>(CanonicalType); 5334 } 5335 inline bool Type::isVectorType() const { 5336 return isa<VectorType>(CanonicalType); 5337 } 5338 inline bool Type::isExtVectorType() const { 5339 return isa<ExtVectorType>(CanonicalType); 5340 } 5341 inline bool Type::isObjCObjectPointerType() const { 5342 return isa<ObjCObjectPointerType>(CanonicalType); 5343 } 5344 inline bool Type::isObjCObjectType() const { 5345 return isa<ObjCObjectType>(CanonicalType); 5346 } 5347 inline bool Type::isObjCObjectOrInterfaceType() const { 5348 return isa<ObjCInterfaceType>(CanonicalType) || 5349 isa<ObjCObjectType>(CanonicalType); 5350 } 5351 inline bool Type::isAtomicType() const { 5352 return isa<AtomicType>(CanonicalType); 5353 } 5354 5355 inline bool Type::isObjCQualifiedIdType() const { 5356 if (const ObjCObjectPointerType *OPT = getAs<ObjCObjectPointerType>()) 5357 return OPT->isObjCQualifiedIdType(); 5358 return false; 5359 } 5360 inline bool Type::isObjCQualifiedClassType() const { 5361 if (const ObjCObjectPointerType *OPT = getAs<ObjCObjectPointerType>()) 5362 return OPT->isObjCQualifiedClassType(); 5363 return false; 5364 } 5365 inline bool Type::isObjCIdType() const { 5366 if (const ObjCObjectPointerType *OPT = getAs<ObjCObjectPointerType>()) 5367 return OPT->isObjCIdType(); 5368 return false; 5369 } 5370 inline bool Type::isObjCClassType() const { 5371 if (const ObjCObjectPointerType *OPT = getAs<ObjCObjectPointerType>()) 5372 return OPT->isObjCClassType(); 5373 return false; 5374 } 5375 inline bool Type::isObjCSelType() const { 5376 if (const PointerType *OPT = getAs<PointerType>()) 5377 return OPT->getPointeeType()->isSpecificBuiltinType(BuiltinType::ObjCSel); 5378 return false; 5379 } 5380 inline bool Type::isObjCBuiltinType() const { 5381 return isObjCIdType() || isObjCClassType() || isObjCSelType(); 5382 } 5383 5384 inline bool Type::isImage1dT() const { 5385 return isSpecificBuiltinType(BuiltinType::OCLImage1d); 5386 } 5387 5388 inline bool Type::isImage1dArrayT() const { 5389 return isSpecificBuiltinType(BuiltinType::OCLImage1dArray); 5390 } 5391 5392 inline bool Type::isImage1dBufferT() const { 5393 return isSpecificBuiltinType(BuiltinType::OCLImage1dBuffer); 5394 } 5395 5396 inline bool Type::isImage2dT() const { 5397 return isSpecificBuiltinType(BuiltinType::OCLImage2d); 5398 } 5399 5400 inline bool Type::isImage2dArrayT() const { 5401 return isSpecificBuiltinType(BuiltinType::OCLImage2dArray); 5402 } 5403 5404 inline bool Type::isImage2dDepthT() const { 5405 return isSpecificBuiltinType(BuiltinType::OCLImage2dDepth); 5406 } 5407 5408 inline bool Type::isImage2dArrayDepthT() const { 5409 return isSpecificBuiltinType(BuiltinType::OCLImage2dArrayDepth); 5410 } 5411 5412 inline bool Type::isImage2dMSAAT() const { 5413 return isSpecificBuiltinType(BuiltinType::OCLImage2dMSAA); 5414 } 5415 5416 inline bool Type::isImage2dArrayMSAAT() const { 5417 return isSpecificBuiltinType(BuiltinType::OCLImage2dArrayMSAA); 5418 } 5419 5420 inline bool Type::isImage2dMSAATDepth() const { 5421 return isSpecificBuiltinType(BuiltinType::OCLImage2dMSAADepth); 5422 } 5423 5424 inline bool Type::isImage2dArrayMSAATDepth() const { 5425 return isSpecificBuiltinType(BuiltinType::OCLImage2dArrayMSAADepth); 5426 } 5427 5428 inline bool Type::isImage3dT() const { 5429 return isSpecificBuiltinType(BuiltinType::OCLImage3d); 5430 } 5431 5432 inline bool Type::isSamplerT() const { 5433 return isSpecificBuiltinType(BuiltinType::OCLSampler); 5434 } 5435 5436 inline bool Type::isEventT() const { 5437 return isSpecificBuiltinType(BuiltinType::OCLEvent); 5438 } 5439 5440 inline bool Type::isClkEventT() const { 5441 return isSpecificBuiltinType(BuiltinType::OCLClkEvent); 5442 } 5443 5444 inline bool Type::isQueueT() const { 5445 return isSpecificBuiltinType(BuiltinType::OCLQueue); 5446 } 5447 5448 inline bool Type::isNDRangeT() const { 5449 return isSpecificBuiltinType(BuiltinType::OCLNDRange); 5450 } 5451 5452 inline bool Type::isReserveIDT() const { 5453 return isSpecificBuiltinType(BuiltinType::OCLReserveID); 5454 } 5455 5456 inline bool Type::isImageType() const { 5457 return isImage3dT() || isImage2dT() || isImage2dArrayT() || 5458 isImage2dDepthT() || isImage2dArrayDepthT() || isImage2dMSAAT() || 5459 isImage2dArrayMSAAT() || isImage2dMSAATDepth() || 5460 isImage2dArrayMSAATDepth() || isImage1dT() || isImage1dArrayT() || 5461 isImage1dBufferT(); 5462 } 5463 5464 inline bool Type::isOpenCLSpecificType() const { 5465 return isSamplerT() || isEventT() || isImageType() || isClkEventT() || 5466 isQueueT() || isNDRangeT() || isReserveIDT(); 5467 } 5468 5469 inline bool Type::isTemplateTypeParmType() const { 5470 return isa<TemplateTypeParmType>(CanonicalType); 5471 } 5472 5473 inline bool Type::isSpecificBuiltinType(unsigned K) const { 5474 if (const BuiltinType *BT = getAs<BuiltinType>()) 5475 if (BT->getKind() == (BuiltinType::Kind) K) 5476 return true; 5477 return false; 5478 } 5479 5480 inline bool Type::isPlaceholderType() const { 5481 if (const BuiltinType *BT = dyn_cast<BuiltinType>(this)) 5482 return BT->isPlaceholderType(); 5483 return false; 5484 } 5485 5486 inline const BuiltinType *Type::getAsPlaceholderType() const { 5487 if (const BuiltinType *BT = dyn_cast<BuiltinType>(this)) 5488 if (BT->isPlaceholderType()) 5489 return BT; 5490 return nullptr; 5491 } 5492 5493 inline bool Type::isSpecificPlaceholderType(unsigned K) const { 5494 assert(BuiltinType::isPlaceholderTypeKind((BuiltinType::Kind) K)); 5495 if (const BuiltinType *BT = dyn_cast<BuiltinType>(this)) 5496 return (BT->getKind() == (BuiltinType::Kind) K); 5497 return false; 5498 } 5499 5500 inline bool Type::isNonOverloadPlaceholderType() const { 5501 if (const BuiltinType *BT = dyn_cast<BuiltinType>(this)) 5502 return BT->isNonOverloadPlaceholderType(); 5503 return false; 5504 } 5505 5506 inline bool Type::isVoidType() const { 5507 if (const BuiltinType *BT = dyn_cast<BuiltinType>(CanonicalType)) 5508 return BT->getKind() == BuiltinType::Void; 5509 return false; 5510 } 5511 5512 inline bool Type::isHalfType() const { 5513 if (const BuiltinType *BT = dyn_cast<BuiltinType>(CanonicalType)) 5514 return BT->getKind() == BuiltinType::Half; 5515 // FIXME: Should we allow complex __fp16? Probably not. 5516 return false; 5517 } 5518 5519 inline bool Type::isNullPtrType() const { 5520 if (const BuiltinType *BT = getAs<BuiltinType>()) 5521 return BT->getKind() == BuiltinType::NullPtr; 5522 return false; 5523 } 5524 5525 extern bool IsEnumDeclComplete(EnumDecl *); 5526 extern bool IsEnumDeclScoped(EnumDecl *); 5527 5528 inline bool Type::isIntegerType() const { 5529 if (const BuiltinType *BT = dyn_cast<BuiltinType>(CanonicalType)) 5530 return BT->getKind() >= BuiltinType::Bool && 5531 BT->getKind() <= BuiltinType::Int128; 5532 if (const EnumType *ET = dyn_cast<EnumType>(CanonicalType)) { 5533 // Incomplete enum types are not treated as integer types. 5534 // FIXME: In C++, enum types are never integer types. 5535 return IsEnumDeclComplete(ET->getDecl()) && 5536 !IsEnumDeclScoped(ET->getDecl()); 5537 } 5538 return false; 5539 } 5540 5541 inline bool Type::isScalarType() const { 5542 if (const BuiltinType *BT = dyn_cast<BuiltinType>(CanonicalType)) 5543 return BT->getKind() > BuiltinType::Void && 5544 BT->getKind() <= BuiltinType::NullPtr; 5545 if (const EnumType *ET = dyn_cast<EnumType>(CanonicalType)) 5546 // Enums are scalar types, but only if they are defined. Incomplete enums 5547 // are not treated as scalar types. 5548 return IsEnumDeclComplete(ET->getDecl()); 5549 return isa<PointerType>(CanonicalType) || 5550 isa<BlockPointerType>(CanonicalType) || 5551 isa<MemberPointerType>(CanonicalType) || 5552 isa<ComplexType>(CanonicalType) || 5553 isa<ObjCObjectPointerType>(CanonicalType); 5554 } 5555 5556 inline bool Type::isIntegralOrEnumerationType() const { 5557 if (const BuiltinType *BT = dyn_cast<BuiltinType>(CanonicalType)) 5558 return BT->getKind() >= BuiltinType::Bool && 5559 BT->getKind() <= BuiltinType::Int128; 5560 5561 // Check for a complete enum type; incomplete enum types are not properly an 5562 // enumeration type in the sense required here. 5563 if (const EnumType *ET = dyn_cast<EnumType>(CanonicalType)) 5564 return IsEnumDeclComplete(ET->getDecl()); 5565 5566 return false; 5567 } 5568 5569 inline bool Type::isBooleanType() const { 5570 if (const BuiltinType *BT = dyn_cast<BuiltinType>(CanonicalType)) 5571 return BT->getKind() == BuiltinType::Bool; 5572 return false; 5573 } 5574 5575 inline bool Type::isUndeducedType() const { 5576 const AutoType *AT = getContainedAutoType(); 5577 return AT && !AT->isDeduced(); 5578 } 5579 5580 /// \brief Determines whether this is a type for which one can define 5581 /// an overloaded operator. 5582 inline bool Type::isOverloadableType() const { 5583 return isDependentType() || isRecordType() || isEnumeralType(); 5584 } 5585 5586 /// \brief Determines whether this type can decay to a pointer type. 5587 inline bool Type::canDecayToPointerType() const { 5588 return isFunctionType() || isArrayType(); 5589 } 5590 5591 inline bool Type::hasPointerRepresentation() const { 5592 return (isPointerType() || isReferenceType() || isBlockPointerType() || 5593 isObjCObjectPointerType() || isNullPtrType()); 5594 } 5595 5596 inline bool Type::hasObjCPointerRepresentation() const { 5597 return isObjCObjectPointerType(); 5598 } 5599 5600 inline const Type *Type::getBaseElementTypeUnsafe() const { 5601 const Type *type = this; 5602 while (const ArrayType *arrayType = type->getAsArrayTypeUnsafe()) 5603 type = arrayType->getElementType().getTypePtr(); 5604 return type; 5605 } 5606 5607 /// Insertion operator for diagnostics. This allows sending QualType's into a 5608 /// diagnostic with <<. 5609 inline const DiagnosticBuilder &operator<<(const DiagnosticBuilder &DB, 5610 QualType T) { 5611 DB.AddTaggedVal(reinterpret_cast<intptr_t>(T.getAsOpaquePtr()), 5612 DiagnosticsEngine::ak_qualtype); 5613 return DB; 5614 } 5615 5616 /// Insertion operator for partial diagnostics. This allows sending QualType's 5617 /// into a diagnostic with <<. 5618 inline const PartialDiagnostic &operator<<(const PartialDiagnostic &PD, 5619 QualType T) { 5620 PD.AddTaggedVal(reinterpret_cast<intptr_t>(T.getAsOpaquePtr()), 5621 DiagnosticsEngine::ak_qualtype); 5622 return PD; 5623 } 5624 5625 // Helper class template that is used by Type::getAs to ensure that one does 5626 // not try to look through a qualified type to get to an array type. 5627 template <typename T, bool isArrayType = (std::is_same<T, ArrayType>::value || 5628 std::is_base_of<ArrayType, T>::value)> 5629 struct ArrayType_cannot_be_used_with_getAs {}; 5630 5631 template<typename T> 5632 struct ArrayType_cannot_be_used_with_getAs<T, true>; 5633 5634 // Member-template getAs<specific type>'. 5635 template <typename T> const T *Type::getAs() const { 5636 ArrayType_cannot_be_used_with_getAs<T> at; 5637 (void)at; 5638 5639 // If this is directly a T type, return it. 5640 if (const T *Ty = dyn_cast<T>(this)) 5641 return Ty; 5642 5643 // If the canonical form of this type isn't the right kind, reject it. 5644 if (!isa<T>(CanonicalType)) 5645 return nullptr; 5646 5647 // If this is a typedef for the type, strip the typedef off without 5648 // losing all typedef information. 5649 return cast<T>(getUnqualifiedDesugaredType()); 5650 } 5651 5652 inline const ArrayType *Type::getAsArrayTypeUnsafe() const { 5653 // If this is directly an array type, return it. 5654 if (const ArrayType *arr = dyn_cast<ArrayType>(this)) 5655 return arr; 5656 5657 // If the canonical form of this type isn't the right kind, reject it. 5658 if (!isa<ArrayType>(CanonicalType)) 5659 return nullptr; 5660 5661 // If this is a typedef for the type, strip the typedef off without 5662 // losing all typedef information. 5663 return cast<ArrayType>(getUnqualifiedDesugaredType()); 5664 } 5665 5666 template <typename T> const T *Type::castAs() const { 5667 ArrayType_cannot_be_used_with_getAs<T> at; 5668 (void) at; 5669 5670 if (const T *ty = dyn_cast<T>(this)) return ty; 5671 assert(isa<T>(CanonicalType)); 5672 return cast<T>(getUnqualifiedDesugaredType()); 5673 } 5674 5675 inline const ArrayType *Type::castAsArrayTypeUnsafe() const { 5676 assert(isa<ArrayType>(CanonicalType)); 5677 if (const ArrayType *arr = dyn_cast<ArrayType>(this)) return arr; 5678 return cast<ArrayType>(getUnqualifiedDesugaredType()); 5679 } 5680 5681 } // end namespace clang 5682 5683 #endif 5684