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