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