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