]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm-project/clang/include/clang/AST/Type.h
Merge llvm-project 13.0.0 release
[FreeBSD/FreeBSD.git] / contrib / llvm-project / clang / include / clang / AST / Type.h
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