clang 22.0.0git
TypeLoc.h
Go to the documentation of this file.
1//===- TypeLoc.h - Type Source Info Wrapper ---------------------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9/// \file
10/// Defines the clang::TypeLoc interface and its subclasses.
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef LLVM_CLANG_AST_TYPELOC_H
15#define LLVM_CLANG_AST_TYPELOC_H
16
21#include "clang/AST/TypeBase.h"
22#include "clang/Basic/LLVM.h"
25#include "llvm/ADT/ArrayRef.h"
26#include "llvm/Support/Casting.h"
27#include "llvm/Support/Compiler.h"
28#include "llvm/Support/MathExtras.h"
29#include <algorithm>
30#include <cassert>
31#include <cstdint>
32#include <cstring>
33
34namespace clang {
35
36class Attr;
37class ASTContext;
38class CXXRecordDecl;
39class ConceptDecl;
40class Expr;
44class ParmVarDecl;
46class UnqualTypeLoc;
48
49// Predeclare all the type nodes.
50#define ABSTRACT_TYPELOC(Class, Base)
51#define TYPELOC(Class, Base) \
52 class Class##TypeLoc;
53#include "clang/AST/TypeLocNodes.def"
54
55/// Base wrapper for a particular "section" of type source info.
56///
57/// A client should use the TypeLoc subclasses through castAs()/getAs()
58/// in order to get at the actual information.
59class TypeLoc {
60protected:
61 // The correctness of this relies on the property that, for Type *Ty,
62 // QualType(Ty, 0).getAsOpaquePtr() == (void*) Ty
63 const void *Ty = nullptr;
64 void *Data = nullptr;
65
66public:
67 TypeLoc() = default;
68 TypeLoc(QualType ty, void *opaqueData)
69 : Ty(ty.getAsOpaquePtr()), Data(opaqueData) {}
70 TypeLoc(const Type *ty, void *opaqueData)
71 : Ty(ty), Data(opaqueData) {}
72
73 /// Convert to the specified TypeLoc type, asserting that this TypeLoc
74 /// is of the desired type.
75 ///
76 /// \pre T::isKind(*this)
77 template<typename T>
78 T castAs() const {
79 assert(T::isKind(*this));
80 T t;
81 TypeLoc& tl = t;
82 tl = *this;
83 return t;
84 }
85
86 /// Convert to the specified TypeLoc type, returning a null TypeLoc if
87 /// this TypeLoc is not of the desired type.
88 template<typename T>
89 T getAs() const {
90 if (!T::isKind(*this))
91 return {};
92 T t;
93 TypeLoc& tl = t;
94 tl = *this;
95 return t;
96 }
97
98 /// Convert to the specified TypeLoc type, returning a null TypeLoc if
99 /// this TypeLoc is not of the desired type. It will consider type
100 /// adjustments from a type that was written as a T to another type that is
101 /// still canonically a T (ignores parens, attributes, elaborated types, etc).
102 template <typename T>
103 T getAsAdjusted() const;
104
105 /// The kinds of TypeLocs. Equivalent to the Type::TypeClass enum,
106 /// except it also defines a Qualified enum that corresponds to the
107 /// QualifiedLoc class.
109#define ABSTRACT_TYPE(Class, Base)
110#define TYPE(Class, Base) \
111 Class = Type::Class,
112#include "clang/AST/TypeNodes.inc"
114 };
115
117 if (getType().hasLocalQualifiers()) return Qualified;
118 return (TypeLocClass) getType()->getTypeClass();
119 }
120
121 bool isNull() const { return !Ty; }
122 explicit operator bool() const { return Ty; }
123
124 /// Returns the size of type source info data block for the given type.
125 static unsigned getFullDataSizeForType(QualType Ty);
126
127 /// Returns the alignment of type source info data block for
128 /// the given type.
129 static unsigned getLocalAlignmentForType(QualType Ty);
130
131 /// Get the type for which this source info wrapper provides
132 /// information.
135 }
136
137 const Type *getTypePtr() const {
139 }
140
141 /// Get the pointer where source information is stored.
142 // FIXME: This should provide a type-safe interface.
143 void *getOpaqueData() const {
144 return Data;
145 }
146
147 /// Get the begin source location.
149
150 /// Get the end source location.
152
153 /// Get the full source range.
154 SourceRange getSourceRange() const LLVM_READONLY {
155 return SourceRange(getBeginLoc(), getEndLoc());
156 }
157
158
159 /// Get the local source range.
161 return getLocalSourceRangeImpl(*this);
162 }
163
164 /// Returns the size of the type source info data block.
165 unsigned getFullDataSize() const {
167 }
168
169 /// Get the next TypeLoc pointed by this TypeLoc, e.g for "int*" the
170 /// TypeLoc is a PointerLoc and next TypeLoc is for "int".
172 return getNextTypeLocImpl(*this);
173 }
174
175 /// Skips past any qualifiers, if this is qualified.
176 UnqualTypeLoc getUnqualifiedLoc() const; // implemented in this header
177
178 TypeLoc IgnoreParens() const;
179
180 /// Find a type with the location of an explicit type qualifier.
181 ///
182 /// The result, if non-null, will be one of:
183 /// QualifiedTypeLoc
184 /// AtomicTypeLoc
185 /// AttributedTypeLoc, for those type attributes that behave as qualifiers
187
188 /// Get the typeloc of an AutoType whose type will be deduced for a variable
189 /// with an initializer of this type. This looks through declarators like
190 /// pointer types, but not through decltype or typedefs.
192
193 /// Get the SourceLocation of the template keyword (if any).
195
196 /// If this type represents a qualified-id, this returns it's nested name
197 /// specifier. For example, for the qualified-id "foo::bar::baz", this returns
198 /// "foo::bar". Returns null if this type represents an unqualified-id.
200
201 /// This returns the position of the type after any elaboration, such as the
202 /// 'struct' keyword. This may be the position of the name qualifiers,
203 /// 'template' keyword, or the name location otherwise.
205
206 /// Initializes this to state that every location in this
207 /// type is the given location.
208 ///
209 /// This method exists to provide a simple transition for code that
210 /// relies on location-less types.
211 void initialize(ASTContext &Context, SourceLocation Loc) const {
212 initializeImpl(Context, *this, Loc);
213 }
214
215 /// Initializes this by copying its information from another
216 /// TypeLoc of the same type.
218 assert(getType() == Other.getType());
219 copy(Other);
220 }
221
222 /// Initializes this by copying its information from another
223 /// TypeLoc of the same type. The given size must be the full data
224 /// size.
225 void initializeFullCopy(TypeLoc Other, unsigned Size) {
226 assert(getType() == Other.getType());
227 assert(getFullDataSize() == Size);
228 copy(Other);
229 }
230
231 /// Copies the other type loc into this one.
232 void copy(TypeLoc other);
233
234 friend bool operator==(const TypeLoc &LHS, const TypeLoc &RHS) {
235 return LHS.Ty == RHS.Ty && LHS.Data == RHS.Data;
236 }
237
238 friend bool operator!=(const TypeLoc &LHS, const TypeLoc &RHS) {
239 return !(LHS == RHS);
240 }
241
242 /// Find the location of the nullability specifier (__nonnull,
243 /// __nullable, or __null_unspecifier), if there is one.
245
246 void dump() const;
247 void dump(llvm::raw_ostream &, const ASTContext &) const;
248
249private:
250 static bool isKind(const TypeLoc&) {
251 return true;
252 }
253
254 static void initializeImpl(ASTContext &Context, TypeLoc TL,
255 SourceLocation Loc);
256 static TypeLoc getNextTypeLocImpl(TypeLoc TL);
257 static TypeLoc IgnoreParensImpl(TypeLoc TL);
258 static SourceRange getLocalSourceRangeImpl(TypeLoc TL);
259};
260
261inline TypeSourceInfo::TypeSourceInfo(QualType ty, size_t DataSize) : Ty(ty) {
262 // Init data attached to the object. See getTypeLoc.
263 memset(static_cast<void *>(this + 1), 0, DataSize);
264}
265
266/// Return the TypeLoc for a type source info.
268 // TODO: is this alignment already sufficient?
269 return TypeLoc(Ty, const_cast<void*>(static_cast<const void*>(this + 1)));
270}
271
272/// Wrapper of type source information for a type with
273/// no direct qualifiers.
274class UnqualTypeLoc : public TypeLoc {
275public:
276 UnqualTypeLoc() = default;
277 UnqualTypeLoc(const Type *Ty, void *Data) : TypeLoc(Ty, Data) {}
278
279 const Type *getTypePtr() const {
280 return reinterpret_cast<const Type*>(Ty);
281 }
282
286
287private:
288 friend class TypeLoc;
289
290 static bool isKind(const TypeLoc &TL) {
291 return !TL.getType().hasLocalQualifiers();
292 }
293};
294
295/// Wrapper of type source information for a type with
296/// non-trivial direct qualifiers.
297///
298/// Currently, we intentionally do not provide source location for
299/// type qualifiers.
300class QualifiedTypeLoc : public TypeLoc {
301public:
302 SourceRange getLocalSourceRange() const { return {}; }
303
305 unsigned align =
307 auto dataInt = reinterpret_cast<uintptr_t>(Data);
308 dataInt = llvm::alignTo(dataInt, align);
309 return UnqualTypeLoc(getTypePtr(), reinterpret_cast<void*>(dataInt));
310 }
311
312 /// Initializes the local data of this type source info block to
313 /// provide no information.
315 // do nothing
316 }
317
318 void copyLocal(TypeLoc other) {
319 // do nothing
320 }
321
323 return getUnqualifiedLoc();
324 }
325
326 /// Returns the size of the type source info data block that is
327 /// specific to this type.
328 unsigned getLocalDataSize() const {
329 // In fact, we don't currently preserve any location information
330 // for qualifiers.
331 return 0;
332 }
333
334 /// Returns the alignment of the type source info data block that is
335 /// specific to this type.
336 unsigned getLocalDataAlignment() const {
337 // We don't preserve any location information.
338 return 1;
339 }
340
341private:
342 friend class TypeLoc;
343
344 static bool isKind(const TypeLoc &TL) {
345 return TL.getType().hasLocalQualifiers();
346 }
347};
348
354
355/// A metaprogramming base class for TypeLoc classes which correspond
356/// to a particular Type subclass. It is accepted for a single
357/// TypeLoc class to correspond to multiple Type classes.
358///
359/// \tparam Base a class from which to derive
360/// \tparam Derived the class deriving from this one
361/// \tparam TypeClass the concrete Type subclass associated with this
362/// location type
363/// \tparam LocalData the structure type of local location data for
364/// this type
365///
366/// TypeLocs with non-constant amounts of local data should override
367/// getExtraLocalDataSize(); getExtraLocalData() will then point to
368/// this extra memory.
369///
370/// TypeLocs with an inner type should define
371/// QualType getInnerType() const
372/// and getInnerTypeLoc() will then point to this inner type's
373/// location data.
374///
375/// A word about hierarchies: this template is not designed to be
376/// derived from multiple times in a hierarchy. It is also not
377/// designed to be used for classes where subtypes might provide
378/// different amounts of source information. It should be subclassed
379/// only at the deepest portion of the hierarchy where all children
380/// have identical source information; if that's an abstract type,
381/// then further descendents should inherit from
382/// InheritingConcreteTypeLoc instead.
383template <class Base, class Derived, class TypeClass, class LocalData>
384class ConcreteTypeLoc : public Base {
385 friend class TypeLoc;
386
387 const Derived *asDerived() const {
388 return static_cast<const Derived*>(this);
389 }
390
391 static bool isKind(const TypeLoc &TL) {
392 return !TL.getType().hasLocalQualifiers() &&
393 Derived::classofType(TL.getTypePtr());
394 }
395
396 static bool classofType(const Type *Ty) {
397 return TypeClass::classof(Ty);
398 }
399
400public:
401 unsigned getLocalDataAlignment() const {
402 return std::max(unsigned(alignof(LocalData)),
403 asDerived()->getExtraLocalDataAlignment());
404 }
405
406 unsigned getLocalDataSize() const {
407 unsigned size = sizeof(LocalData);
408 unsigned extraAlign = asDerived()->getExtraLocalDataAlignment();
409 size = llvm::alignTo(size, extraAlign);
410 size += asDerived()->getExtraLocalDataSize();
411 size = llvm::alignTo(size, asDerived()->getLocalDataAlignment());
412 return size;
413 }
414
415 void copyLocal(Derived other) {
416 // Some subclasses have no data to copy.
417 if (asDerived()->getLocalDataSize() == 0) return;
418
419 // Copy the fixed-sized local data.
420 memcpy(getLocalData(), other.getLocalData(), sizeof(LocalData));
421
422 // Copy the variable-sized local data. We need to do this
423 // separately because the padding in the source and the padding in
424 // the destination might be different.
425 memcpy(getExtraLocalData(), other.getExtraLocalData(),
426 asDerived()->getExtraLocalDataSize());
427 }
428
430 return getNextTypeLoc(asDerived()->getInnerType());
431 }
432
433 const TypeClass *getTypePtr() const {
434 return cast<TypeClass>(Base::getTypePtr());
435 }
436
437protected:
438 unsigned getExtraLocalDataSize() const {
439 return 0;
440 }
441
442 unsigned getExtraLocalDataAlignment() const {
443 return 1;
444 }
445
446 LocalData *getLocalData() const {
447 return static_cast<LocalData*>(Base::Data);
448 }
449
450 /// Gets a pointer past the Info structure; useful for classes with
451 /// local data that can't be captured in the Info (e.g. because it's
452 /// of variable size).
453 void *getExtraLocalData() const {
454 unsigned size = sizeof(LocalData);
455 unsigned extraAlign = asDerived()->getExtraLocalDataAlignment();
456 size = llvm::alignTo(size, extraAlign);
457 return reinterpret_cast<char *>(Base::Data) + size;
458 }
459
460 void *getNonLocalData() const {
461 auto data = reinterpret_cast<uintptr_t>(Base::Data);
462 data += asDerived()->getLocalDataSize();
463 data = llvm::alignTo(data, getNextTypeAlign());
464 return reinterpret_cast<void*>(data);
465 }
466
467 struct HasNoInnerType {};
469
471 return TypeLoc(asDerived()->getInnerType(), getNonLocalData());
472 }
473
474private:
475 unsigned getInnerTypeSize() const {
476 return getInnerTypeSize(asDerived()->getInnerType());
477 }
478
479 unsigned getInnerTypeSize(HasNoInnerType _) const {
480 return 0;
481 }
482
483 unsigned getInnerTypeSize(QualType _) const {
485 }
486
487 unsigned getNextTypeAlign() const {
488 return getNextTypeAlign(asDerived()->getInnerType());
489 }
490
491 unsigned getNextTypeAlign(HasNoInnerType _) const {
492 return 1;
493 }
494
495 unsigned getNextTypeAlign(QualType T) const {
497 }
498
499 TypeLoc getNextTypeLoc(HasNoInnerType _) const { return {}; }
500
501 TypeLoc getNextTypeLoc(QualType T) const {
502 return TypeLoc(T, getNonLocalData());
503 }
504};
505
506/// A metaprogramming class designed for concrete subtypes of abstract
507/// types where all subtypes share equivalently-structured source
508/// information. See the note on ConcreteTypeLoc.
509template <class Base, class Derived, class TypeClass>
511 friend class TypeLoc;
512
513 static bool classofType(const Type *Ty) {
514 return TypeClass::classof(Ty);
515 }
516
517 static bool isKind(const TypeLoc &TL) {
518 return !TL.getType().hasLocalQualifiers() &&
519 Derived::classofType(TL.getTypePtr());
520 }
521 static bool isKind(const UnqualTypeLoc &TL) {
522 return Derived::classofType(TL.getTypePtr());
523 }
524
525public:
526 const TypeClass *getTypePtr() const {
527 return cast<TypeClass>(Base::getTypePtr());
528 }
529};
530
534
535/// A reasonable base class for TypeLocs that correspond to
536/// types that are written as a type-specifier.
537class TypeSpecTypeLoc : public ConcreteTypeLoc<UnqualTypeLoc,
538 TypeSpecTypeLoc,
539 Type,
540 TypeSpecLocInfo> {
541public:
542 enum {
545 };
546
548 return this->getLocalData()->NameLoc;
549 }
550
552 this->getLocalData()->NameLoc = Loc;
553 }
554
558
560 setNameLoc(Loc);
561 }
562
563private:
564 friend class TypeLoc;
565
566 static bool isKind(const TypeLoc &TL);
567};
568
572
573/// Wrapper for source info for builtin types.
574class BuiltinTypeLoc : public ConcreteTypeLoc<UnqualTypeLoc,
575 BuiltinTypeLoc,
576 BuiltinType,
577 BuiltinLocInfo> {
578public:
582
584 getLocalData()->BuiltinRange = Loc;
585 }
586
588 SourceRange &BuiltinRange = getLocalData()->BuiltinRange;
589 if (!BuiltinRange.getBegin().isValid()) {
590 BuiltinRange = Range;
591 } else {
592 BuiltinRange.setBegin(std::min(Range.getBegin(), BuiltinRange.getBegin()));
593 BuiltinRange.setEnd(std::max(Range.getEnd(), BuiltinRange.getEnd()));
594 }
595 }
596
598
603 return *(static_cast<WrittenBuiltinSpecs*>(getExtraLocalData()));
604 }
605
606 bool needsExtraLocalData() const {
608 return (bk >= BuiltinType::UShort && bk <= BuiltinType::UInt128) ||
609 (bk >= BuiltinType::Short && bk <= BuiltinType::Ibm128) ||
610 bk == BuiltinType::UChar || bk == BuiltinType::SChar;
611 }
612
613 unsigned getExtraLocalDataSize() const {
614 return needsExtraLocalData() ? sizeof(WrittenBuiltinSpecs) : 0;
615 }
616
617 unsigned getExtraLocalDataAlignment() const {
618 return needsExtraLocalData() ? alignof(WrittenBuiltinSpecs) : 1;
619 }
620
624
631
635
638 getWrittenBuiltinSpecs().Sign = static_cast<unsigned>(written);
639 }
640
647
651
654 getWrittenBuiltinSpecs().Width = static_cast<unsigned>(written);
655 }
656
658
659 bool hasWrittenTypeSpec() const {
661 }
662
665 getWrittenBuiltinSpecs().Type = written;
666 }
667
668 bool hasModeAttr() const {
671 else
672 return false;
673 }
674
675 void setModeAttr(bool written) {
678 }
679
681 setBuiltinLoc(Loc);
682 if (needsExtraLocalData()) {
684 wbs.Sign = static_cast<unsigned>(TypeSpecifierSign::Unspecified);
685 wbs.Width = static_cast<unsigned>(TypeSpecifierWidth::Unspecified);
686 wbs.Type = TST_unspecified;
687 wbs.ModeAttr = false;
688 }
689 }
690};
691
695
703 NestedNameSpecifier Qualifier, SourceLocation Loc)
704 : NameLoc(Loc),
707 QualifierData(getTrivialQualifierData(Context, Qualifier, Loc)) {}
708
710 assert(!Qualifier == !QualifierData);
711 return NestedNameSpecifierLoc(Qualifier, QualifierData);
712 }
713
716 if (NestedNameSpecifierLoc QualifierLoc = getQualifierLoc(Qualifier);
717 BeginLoc.isInvalid() && Qualifier)
718 BeginLoc = QualifierLoc.getBeginLoc();
719 if (BeginLoc.isInvalid())
720 BeginLoc = NameLoc;
721 return SourceRange(BeginLoc, NameLoc);
722 }
723
724private:
725 void *QualifierData;
726
727 static void *getTrivialQualifierData(ASTContext &Context,
728 NestedNameSpecifier Qualifier,
729 SourceLocation Loc) {
730 if (!Qualifier)
731 return nullptr;
733 Builder.MakeTrivial(Context, Qualifier, Loc);
734 return Builder.getWithLocInContext(Context).getOpaqueData();
735 }
736};
737
738template <class TL, class T>
740 : public ConcreteTypeLoc<UnqualTypeLoc, TL, T, ElaboratedNameLocInfo> {
741public:
742 auto *getDecl() const { return this->getTypePtr()->getDecl(); }
743
744 void set(SourceLocation ElaboratedKeywordLoc,
745 NestedNameSpecifierLoc QualifierLoc, SourceLocation NameLoc) {
746 assert(QualifierLoc.getNestedNameSpecifier() ==
747 this->getTypePtr()->getQualifier());
748 *this->getLocalData() =
749 ElaboratedNameLocInfo(ElaboratedKeywordLoc, QualifierLoc, NameLoc);
750 }
751
755
757 return this->getLocalData()->getQualifierLoc(
758 this->getTypePtr()->getQualifier());
759 }
760
761 SourceLocation getNameLoc() const { return this->getLocalData()->NameLoc; }
762
764 return this->getLocalData()->getLocalSourceRange(
765 this->getTypePtr()->getQualifier());
766 }
767
769 const auto *Ptr = this->getTypePtr();
770 *this->getLocalData() = ElaboratedNameLocInfo(Context, Ptr->getKeyword(),
771 Ptr->getQualifier(), Loc);
772 }
773};
774
775/// Wrapper for source info for typedefs.
777 : public ElaboratedNameTypeLoc<TypedefTypeLoc, TypedefType> {};
778
779/// Wrapper for source info for unresolved typename using decls.
781 : public ElaboratedNameTypeLoc<UnresolvedUsingTypeLoc,
782 UnresolvedUsingType> {};
783
784/// Wrapper for source info for types used via transparent aliases.
785class UsingTypeLoc : public ElaboratedNameTypeLoc<UsingTypeLoc, UsingType> {};
786
792
793class TagTypeLoc : public ConcreteTypeLoc<UnqualTypeLoc, TagTypeLoc, TagType,
794 TagTypeLocInfo> {
795public:
796 TagDecl *getDecl() const { return getTypePtr()->getDecl(); }
797
798 /// True if the tag was defined in this type specifier.
799 bool isDefinition() const;
800
804
808
810 NestedNameSpecifier Qualifier = getTypePtr()->getQualifier();
811 void *QualifierData = getLocalData()->QualifierData;
812 assert(!Qualifier == !QualifierData);
813 return NestedNameSpecifierLoc(Qualifier, QualifierData);
814 }
815
817 assert(QualifierLoc.getNestedNameSpecifier() ==
818 getTypePtr()->getQualifier());
819 getLocalData()->QualifierData = QualifierLoc.getOpaqueData();
820 }
821
823
825
828 if (NestedNameSpecifierLoc Qualifier = getQualifierLoc();
829 BeginLoc.isInvalid() && Qualifier)
830 BeginLoc = Qualifier.getBeginLoc();
831 if (BeginLoc.isInvalid())
832 BeginLoc = getNameLoc();
833 return SourceRange(BeginLoc, getNameLoc());
834 }
835
837 setElaboratedKeywordLoc(getTypePtr()->getKeyword() !=
839 ? Loc
840 : SourceLocation());
841 if (NestedNameSpecifier Qualifier = getTypePtr()->getQualifier()) {
843 Builder.MakeTrivial(Context, Qualifier, Loc);
844 setQualifierLoc(Builder.getWithLocInContext(Context));
845 } else {
846 getLocalData()->QualifierData = nullptr;
847 }
848 setNameLoc(Loc);
849 }
850};
851
852/// Wrapper for source info for record types.
853class RecordTypeLoc : public InheritingConcreteTypeLoc<TagTypeLoc,
854 RecordTypeLoc,
855 RecordType> {
856public:
857 RecordDecl *getDecl() const { return getTypePtr()->getDecl(); }
858};
859
860/// Wrapper for source info for enum types.
861class EnumTypeLoc : public InheritingConcreteTypeLoc<TagTypeLoc,
862 EnumTypeLoc,
863 EnumType> {
864public:
865 EnumDecl *getDecl() const { return getTypePtr()->getDecl(); }
866};
867
868/// Wrapper for source info for injected class names of class
869/// templates.
871 : public InheritingConcreteTypeLoc<TagTypeLoc, InjectedClassNameTypeLoc,
872 InjectedClassNameType> {
873public:
874 CXXRecordDecl *getDecl() const { return getTypePtr()->getDecl(); }
875};
876
877/// Wrapper for template type parameters.
879 public InheritingConcreteTypeLoc<TypeSpecTypeLoc,
880 TemplateTypeParmTypeLoc,
881 TemplateTypeParmType> {
882public:
883 TemplateTypeParmDecl *getDecl() const { return getTypePtr()->getDecl(); }
884};
885
889
890/// ProtocolLAngleLoc, ProtocolRAngleLoc, and the source locations for
891/// protocol qualifiers are stored after Info.
892class ObjCTypeParamTypeLoc : public ConcreteTypeLoc<UnqualTypeLoc,
893 ObjCTypeParamTypeLoc,
894 ObjCTypeParamType,
895 ObjCTypeParamTypeLocInfo> {
896 // SourceLocations are stored after Info, one for each protocol qualifier.
897 SourceLocation *getProtocolLocArray() const {
898 return (SourceLocation*)this->getExtraLocalData() + 2;
899 }
900
901public:
902 ObjCTypeParamDecl *getDecl() const { return getTypePtr()->getDecl(); }
903
905 return this->getLocalData()->NameLoc;
906 }
907
909 this->getLocalData()->NameLoc = Loc;
910 }
911
917
919 *((SourceLocation*)this->getExtraLocalData()) = Loc;
920 }
921
923 return getNumProtocols() ?
924 *((SourceLocation*)this->getExtraLocalData() + 1) :
926 }
927
929 *((SourceLocation*)this->getExtraLocalData() + 1) = Loc;
930 }
931
932 unsigned getNumProtocols() const {
933 return this->getTypePtr()->getNumProtocols();
934 }
935
936 SourceLocation getProtocolLoc(unsigned i) const {
937 assert(i < getNumProtocols() && "Index is out of bounds!");
938 return getProtocolLocArray()[i];
939 }
940
941 void setProtocolLoc(unsigned i, SourceLocation Loc) {
942 assert(i < getNumProtocols() && "Index is out of bounds!");
943 getProtocolLocArray()[i] = Loc;
944 }
945
946 ObjCProtocolDecl *getProtocol(unsigned i) const {
947 assert(i < getNumProtocols() && "Index is out of bounds!");
948 return *(this->getTypePtr()->qual_begin() + i);
949 }
950
952 return {getProtocolLocArray(), getNumProtocols()};
953 }
954
955 void initializeLocal(ASTContext &Context, SourceLocation Loc);
956
957 unsigned getExtraLocalDataSize() const {
958 if (!this->getNumProtocols()) return 0;
959 // When there are protocol qualifers, we have LAngleLoc and RAngleLoc
960 // as well.
961 return (this->getNumProtocols() + 2) * sizeof(SourceLocation) ;
962 }
963
964 unsigned getExtraLocalDataAlignment() const {
965 return alignof(SourceLocation);
966 }
967
969 SourceLocation start = getNameLoc();
971 if (end.isInvalid()) return SourceRange(start, start);
972 return SourceRange(start, end);
973 }
974};
975
976/// Wrapper for substituted template type parameters.
978 public InheritingConcreteTypeLoc<TypeSpecTypeLoc,
979 SubstTemplateTypeParmTypeLoc,
980 SubstTemplateTypeParmType> {
981};
982
983/// Abstract type representing delayed type pack expansions.
985 : public InheritingConcreteTypeLoc<TypeSpecTypeLoc, SubstPackTypeLoc,
986 SubstPackType> {};
987
988/// Wrapper for substituted template type parameters.
990 : public InheritingConcreteTypeLoc<SubstPackTypeLoc,
991 SubstTemplateTypeParmPackTypeLoc,
992 SubstTemplateTypeParmPackType> {};
993
994/// Wrapper for substituted template type parameters.
996 : public InheritingConcreteTypeLoc<SubstPackTypeLoc,
997 SubstBuiltinTemplatePackTypeLoc,
998 SubstBuiltinTemplatePackType> {};
999
1002};
1003
1004/// Type source information for an attributed type.
1005class AttributedTypeLoc : public ConcreteTypeLoc<UnqualTypeLoc,
1006 AttributedTypeLoc,
1007 AttributedType,
1008 AttributedLocInfo> {
1009public:
1011 return getTypePtr()->getAttrKind();
1012 }
1013
1014 bool isQualifier() const {
1015 return getTypePtr()->isQualifier();
1016 }
1017
1018 /// The modified type, which is generally canonically different from
1019 /// the attribute type.
1020 /// int main(int, char**) __attribute__((noreturn))
1021 /// ~~~ ~~~~~~~~~~~~~
1023 return getInnerTypeLoc();
1024 }
1025
1027 return TypeLoc(getTypePtr()->getEquivalentType(), getNonLocalData());
1028 }
1029
1030 /// The type attribute.
1031 const Attr *getAttr() const {
1032 return getLocalData()->TypeAttr;
1033 }
1034 void setAttr(const Attr *A) {
1035 getLocalData()->TypeAttr = A;
1036 }
1037
1038 template<typename T> const T *getAttrAs() {
1039 return dyn_cast_or_null<T>(getAttr());
1040 }
1041
1043
1045 setAttr(nullptr);
1046 }
1047
1049 return getTypePtr()->getModifiedType();
1050 }
1051};
1052
1053struct BTFTagAttributedLocInfo {}; // Nothing.
1054
1055/// Type source information for an btf_tag attributed type.
1057 : public ConcreteTypeLoc<UnqualTypeLoc, BTFTagAttributedTypeLoc,
1058 BTFTagAttributedType, BTFTagAttributedLocInfo> {
1059public:
1061
1062 /// The btf_type_tag attribute.
1063 const BTFTypeTagAttr *getAttr() const { return getTypePtr()->getAttr(); }
1064
1065 template <typename T> T *getAttrAs() {
1066 return dyn_cast_or_null<T>(getAttr());
1067 }
1068
1070
1072
1073 QualType getInnerType() const { return getTypePtr()->getWrappedType(); }
1074};
1075
1080
1081/// Type source information for HLSL attributed resource type.
1083 : public ConcreteTypeLoc<UnqualTypeLoc, HLSLAttributedResourceTypeLoc,
1084 HLSLAttributedResourceType,
1085 HLSLAttributedResourceLocInfo> {
1086public:
1088
1095
1101 QualType getInnerType() const { return getTypePtr()->getWrappedType(); }
1102 unsigned getLocalDataSize() const {
1103 return sizeof(HLSLAttributedResourceLocInfo);
1104 }
1105};
1106
1110
1112 : public ConcreteTypeLoc<UnqualTypeLoc, HLSLInlineSpirvTypeLoc,
1113 HLSLInlineSpirvType, HLSLInlineSpirvTypeLocInfo> {
1114public:
1116 void setSpirvTypeLoc(SourceLocation loc) const { getLocalData()->Loc = loc; }
1117
1122 setSpirvTypeLoc(loc);
1123 }
1124};
1125
1133
1134// A helper class for defining ObjC TypeLocs that can qualified with
1135// protocols.
1136//
1137// TypeClass basically has to be either ObjCInterfaceType or
1138// ObjCObjectPointerType.
1139class ObjCObjectTypeLoc : public ConcreteTypeLoc<UnqualTypeLoc,
1140 ObjCObjectTypeLoc,
1141 ObjCObjectType,
1142 ObjCObjectTypeLocInfo> {
1143 // TypeSourceInfo*'s are stored after Info, one for each type argument.
1144 TypeSourceInfo **getTypeArgLocArray() const {
1145 return (TypeSourceInfo**)this->getExtraLocalData();
1146 }
1147
1148 // SourceLocations are stored after the type argument information, one for
1149 // each Protocol.
1150 SourceLocation *getProtocolLocArray() const {
1151 return (SourceLocation*)(getTypeArgLocArray() + getNumTypeArgs());
1152 }
1153
1154public:
1158
1162
1166
1170
1171 unsigned getNumTypeArgs() const {
1172 return this->getTypePtr()->getTypeArgsAsWritten().size();
1173 }
1174
1175 TypeSourceInfo *getTypeArgTInfo(unsigned i) const {
1176 assert(i < getNumTypeArgs() && "Index is out of bounds!");
1177 return getTypeArgLocArray()[i];
1178 }
1179
1180 void setTypeArgTInfo(unsigned i, TypeSourceInfo *TInfo) {
1181 assert(i < getNumTypeArgs() && "Index is out of bounds!");
1182 getTypeArgLocArray()[i] = TInfo;
1183 }
1184
1188
1192
1196
1200
1201 unsigned getNumProtocols() const {
1202 return this->getTypePtr()->getNumProtocols();
1203 }
1204
1205 SourceLocation getProtocolLoc(unsigned i) const {
1206 assert(i < getNumProtocols() && "Index is out of bounds!");
1207 return getProtocolLocArray()[i];
1208 }
1209
1210 void setProtocolLoc(unsigned i, SourceLocation Loc) {
1211 assert(i < getNumProtocols() && "Index is out of bounds!");
1212 getProtocolLocArray()[i] = Loc;
1213 }
1214
1215 ObjCProtocolDecl *getProtocol(unsigned i) const {
1216 assert(i < getNumProtocols() && "Index is out of bounds!");
1217 return *(this->getTypePtr()->qual_begin() + i);
1218 }
1219
1220
1222 return {getProtocolLocArray(), getNumProtocols()};
1223 }
1224
1227 }
1228
1229 void setHasBaseTypeAsWritten(bool HasBaseType) {
1230 getLocalData()->HasBaseTypeAsWritten = HasBaseType;
1231 }
1232
1234 return getInnerTypeLoc();
1235 }
1236
1239 if (start.isInvalid())
1240 start = getProtocolLAngleLoc();
1242 if (end.isInvalid())
1243 end = getTypeArgsRAngleLoc();
1244 return SourceRange(start, end);
1245 }
1246
1247 void initializeLocal(ASTContext &Context, SourceLocation Loc);
1248
1249 unsigned getExtraLocalDataSize() const {
1250 return this->getNumTypeArgs() * sizeof(TypeSourceInfo *)
1251 + this->getNumProtocols() * sizeof(SourceLocation);
1252 }
1253
1255 static_assert(alignof(ObjCObjectTypeLoc) >= alignof(TypeSourceInfo *),
1256 "not enough alignment for tail-allocated data");
1257 return alignof(TypeSourceInfo *);
1258 }
1259
1261 return getTypePtr()->getBaseType();
1262 }
1263};
1264
1269
1270/// Wrapper for source info for ObjC interfaces.
1271class ObjCInterfaceTypeLoc : public ConcreteTypeLoc<ObjCObjectTypeLoc,
1272 ObjCInterfaceTypeLoc,
1273 ObjCInterfaceType,
1274 ObjCInterfaceLocInfo> {
1275public:
1277 return getTypePtr()->getDecl();
1278 }
1279
1281 return getLocalData()->NameLoc;
1282 }
1283
1285 getLocalData()->NameLoc = Loc;
1286 }
1287
1291
1293 return getLocalData()->NameEndLoc;
1294 }
1295
1297 getLocalData()->NameEndLoc = Loc;
1298 }
1299
1301 setNameLoc(Loc);
1302 setNameEndLoc(Loc);
1303 }
1304};
1305
1308 : public ConcreteTypeLoc<UnqualTypeLoc, BoundsAttributedTypeLoc,
1309 BoundsAttributedType, BoundsAttributedLocInfo> {
1310public:
1312 QualType getInnerType() const { return getTypePtr()->desugar(); }
1314 // nothing to do
1315 }
1316 // LocalData is empty and TypeLocBuilder doesn't handle DataSize 1.
1317 unsigned getLocalDataSize() const { return 0; }
1318};
1319
1321 : public InheritingConcreteTypeLoc<BoundsAttributedTypeLoc,
1322 CountAttributedTypeLoc,
1323 CountAttributedType> {
1324public:
1325 Expr *getCountExpr() const { return getTypePtr()->getCountExpr(); }
1326 bool isCountInBytes() const { return getTypePtr()->isCountInBytes(); }
1327 bool isOrNull() const { return getTypePtr()->isOrNull(); }
1328
1330};
1331
1335
1337 : public ConcreteTypeLoc<UnqualTypeLoc, MacroQualifiedTypeLoc,
1338 MacroQualifiedType, MacroQualifiedLocInfo> {
1339public:
1341 setExpansionLoc(Loc);
1342 }
1343
1345
1347 return getTypePtr()->getMacroIdentifier();
1348 }
1349
1351 return this->getLocalData()->ExpansionLoc;
1352 }
1353
1355 this->getLocalData()->ExpansionLoc = Loc;
1356 }
1357
1359
1363};
1364
1369
1371 : public ConcreteTypeLoc<UnqualTypeLoc, ParenTypeLoc, ParenType,
1372 ParenLocInfo> {
1373public:
1375 return this->getLocalData()->LParenLoc;
1376 }
1377
1379 return this->getLocalData()->RParenLoc;
1380 }
1381
1383 this->getLocalData()->LParenLoc = Loc;
1384 }
1385
1387 this->getLocalData()->RParenLoc = Loc;
1388 }
1389
1393
1395 setLParenLoc(Loc);
1396 setRParenLoc(Loc);
1397 }
1398
1400 return getInnerTypeLoc();
1401 }
1402
1404 return this->getTypePtr()->getInnerType();
1405 }
1406};
1407
1409 if (ParenTypeLoc::isKind(*this))
1410 return IgnoreParensImpl(*this);
1411 return *this;
1412}
1413
1414struct AdjustedLocInfo {}; // Nothing.
1415
1416class AdjustedTypeLoc : public ConcreteTypeLoc<UnqualTypeLoc, AdjustedTypeLoc,
1417 AdjustedType, AdjustedLocInfo> {
1418public:
1420 return getInnerTypeLoc();
1421 }
1422
1424 // do nothing
1425 }
1426
1428 // The inner type is the undecayed type, since that's what we have source
1429 // location information for.
1430 return getTypePtr()->getOriginalType();
1431 }
1432
1433 SourceRange getLocalSourceRange() const { return {}; }
1434
1435 unsigned getLocalDataSize() const {
1436 // sizeof(AdjustedLocInfo) is 1, but we don't need its address to be unique
1437 // anyway. TypeLocBuilder can't handle data sizes of 1.
1438 return 0; // No data.
1439 }
1440};
1441
1442/// Wrapper for source info for pointers decayed from arrays and
1443/// functions.
1445 AdjustedTypeLoc, DecayedTypeLoc, DecayedType> {
1446};
1447
1451
1452/// A base class for
1453template <class Derived, class TypeClass, class LocalData = PointerLikeLocInfo>
1454class PointerLikeTypeLoc : public ConcreteTypeLoc<UnqualTypeLoc, Derived,
1455 TypeClass, LocalData> {
1456public:
1458 return this->getLocalData()->StarLoc;
1459 }
1460
1462 this->getLocalData()->StarLoc = Loc;
1463 }
1464
1466 return this->getInnerTypeLoc();
1467 }
1468
1472
1474 setSigilLoc(Loc);
1475 }
1476
1478 return this->getTypePtr()->getPointeeType();
1479 }
1480};
1481
1482/// Wrapper for source info for pointers.
1483class PointerTypeLoc : public PointerLikeTypeLoc<PointerTypeLoc,
1484 PointerType> {
1485public:
1487 return getSigilLoc();
1488 }
1489
1491 setSigilLoc(Loc);
1492 }
1493};
1494
1495/// Wrapper for source info for block pointers.
1496class BlockPointerTypeLoc : public PointerLikeTypeLoc<BlockPointerTypeLoc,
1497 BlockPointerType> {
1498public:
1500 return getSigilLoc();
1501 }
1502
1504 setSigilLoc(Loc);
1505 }
1506};
1507
1509 void *QualifierData = nullptr;
1510};
1511
1512/// Wrapper for source info for member pointers.
1513class MemberPointerTypeLoc : public PointerLikeTypeLoc<MemberPointerTypeLoc,
1514 MemberPointerType,
1515 MemberPointerLocInfo> {
1516public:
1518 return getSigilLoc();
1519 }
1520
1522 setSigilLoc(Loc);
1523 }
1524
1526 return NestedNameSpecifierLoc(getTypePtr()->getQualifier(),
1527 getLocalData()->QualifierData);
1528 }
1529
1531 assert(QualifierLoc.getNestedNameSpecifier() ==
1532 getTypePtr()->getQualifier() &&
1533 "Inconsistent nested-name-specifier pointer");
1534 getLocalData()->QualifierData = QualifierLoc.getOpaqueData();
1535 }
1536
1538 setSigilLoc(Loc);
1539 if (NestedNameSpecifier Qualifier = getTypePtr()->getQualifier()) {
1541 Builder.MakeTrivial(Context, Qualifier, Loc);
1542 setQualifierLoc(Builder.getWithLocInContext(Context));
1543 } else
1544 getLocalData()->QualifierData = nullptr;
1545 }
1546
1549 return SourceRange(QL.getBeginLoc(), getStarLoc());
1550 return SourceRange(getStarLoc());
1551 }
1552};
1553
1554/// Wraps an ObjCPointerType with source location information.
1556 public PointerLikeTypeLoc<ObjCObjectPointerTypeLoc,
1557 ObjCObjectPointerType> {
1558public:
1560 return getSigilLoc();
1561 }
1562
1564 setSigilLoc(Loc);
1565 }
1566};
1567
1568class ReferenceTypeLoc : public PointerLikeTypeLoc<ReferenceTypeLoc,
1569 ReferenceType> {
1570public:
1573 }
1574};
1575
1577 public InheritingConcreteTypeLoc<ReferenceTypeLoc,
1578 LValueReferenceTypeLoc,
1579 LValueReferenceType> {
1580public:
1582 return getSigilLoc();
1583 }
1584
1586 setSigilLoc(Loc);
1587 }
1588};
1589
1591 public InheritingConcreteTypeLoc<ReferenceTypeLoc,
1592 RValueReferenceTypeLoc,
1593 RValueReferenceType> {
1594public:
1596 return getSigilLoc();
1597 }
1598
1600 setSigilLoc(Loc);
1601 }
1602};
1603
1610
1611/// Wrapper for source info for functions.
1612class FunctionTypeLoc : public ConcreteTypeLoc<UnqualTypeLoc,
1613 FunctionTypeLoc,
1614 FunctionType,
1615 FunctionLocInfo> {
1616 bool hasExceptionSpec() const {
1617 if (auto *FPT = dyn_cast<FunctionProtoType>(getTypePtr())) {
1618 return FPT->hasExceptionSpec();
1619 }
1620 return false;
1621 }
1622
1623 SourceRange *getExceptionSpecRangePtr() const {
1624 assert(hasExceptionSpec() && "No exception spec range");
1625 // After the Info comes the ParmVarDecl array, and after that comes the
1626 // exception specification information.
1627 return (SourceRange *)(getParmArray() + getNumParams());
1628 }
1629
1630public:
1634
1638
1642
1646
1648 return this->getLocalData()->LParenLoc;
1649 }
1650
1652 this->getLocalData()->LParenLoc = Loc;
1653 }
1654
1656 return this->getLocalData()->RParenLoc;
1657 }
1658
1660 this->getLocalData()->RParenLoc = Loc;
1661 }
1662
1666
1668 if (hasExceptionSpec())
1669 return *getExceptionSpecRangePtr();
1670 return {};
1671 }
1672
1674 if (hasExceptionSpec())
1675 *getExceptionSpecRangePtr() = R;
1676 }
1677
1679 return {getParmArray(), getNumParams()};
1680 }
1681
1682 // ParmVarDecls* are stored after Info, one for each parameter.
1684 return (ParmVarDecl**) getExtraLocalData();
1685 }
1686
1687 unsigned getNumParams() const {
1689 return 0;
1690 return cast<FunctionProtoType>(getTypePtr())->getNumParams();
1691 }
1692
1693 ParmVarDecl *getParam(unsigned i) const { return getParmArray()[i]; }
1694 void setParam(unsigned i, ParmVarDecl *VD) { getParmArray()[i] = VD; }
1695
1697 return getInnerTypeLoc();
1698 }
1699
1703
1705 setLocalRangeBegin(Loc);
1706 setLParenLoc(Loc);
1707 setRParenLoc(Loc);
1708 setLocalRangeEnd(Loc);
1709 for (unsigned i = 0, e = getNumParams(); i != e; ++i)
1710 setParam(i, nullptr);
1711 if (hasExceptionSpec())
1713 }
1714
1715 /// Returns the size of the type source info data block that is
1716 /// specific to this type.
1717 unsigned getExtraLocalDataSize() const {
1718 unsigned ExceptSpecSize = hasExceptionSpec() ? sizeof(SourceRange) : 0;
1719 return (getNumParams() * sizeof(ParmVarDecl *)) + ExceptSpecSize;
1720 }
1721
1722 unsigned getExtraLocalDataAlignment() const { return alignof(ParmVarDecl *); }
1723
1725};
1726
1728 public InheritingConcreteTypeLoc<FunctionTypeLoc,
1729 FunctionProtoTypeLoc,
1730 FunctionProtoType> {
1731};
1732
1734 public InheritingConcreteTypeLoc<FunctionTypeLoc,
1735 FunctionNoProtoTypeLoc,
1736 FunctionNoProtoType> {
1737};
1738
1743
1744/// Wrapper for source info for arrays.
1745class ArrayTypeLoc : public ConcreteTypeLoc<UnqualTypeLoc,
1746 ArrayTypeLoc,
1747 ArrayType,
1748 ArrayLocInfo> {
1749public:
1751 return getLocalData()->LBracketLoc;
1752 }
1753
1755 getLocalData()->LBracketLoc = Loc;
1756 }
1757
1759 return getLocalData()->RBracketLoc;
1760 }
1761
1763 getLocalData()->RBracketLoc = Loc;
1764 }
1765
1769
1771 return getLocalData()->Size;
1772 }
1773
1774 void setSizeExpr(Expr *Size) {
1775 getLocalData()->Size = Size;
1776 }
1777
1779 return getInnerTypeLoc();
1780 }
1781
1785
1787 setLBracketLoc(Loc);
1788 setRBracketLoc(Loc);
1789 setSizeExpr(nullptr);
1790 }
1791
1793};
1794
1796 public InheritingConcreteTypeLoc<ArrayTypeLoc,
1797 ConstantArrayTypeLoc,
1798 ConstantArrayType> {
1799};
1800
1801/// Wrapper for source info for array parameter types.
1804 ConstantArrayTypeLoc, ArrayParameterTypeLoc, ArrayParameterType> {};
1805
1807 public InheritingConcreteTypeLoc<ArrayTypeLoc,
1808 IncompleteArrayTypeLoc,
1809 IncompleteArrayType> {
1810};
1811
1813 public InheritingConcreteTypeLoc<ArrayTypeLoc,
1814 DependentSizedArrayTypeLoc,
1815 DependentSizedArrayType> {
1816public:
1821};
1822
1824 public InheritingConcreteTypeLoc<ArrayTypeLoc,
1825 VariableArrayTypeLoc,
1826 VariableArrayType> {
1827};
1828
1829// Location information for a TemplateName. Rudimentary for now.
1833
1841
1843 public ConcreteTypeLoc<UnqualTypeLoc,
1844 TemplateSpecializationTypeLoc,
1845 TemplateSpecializationType,
1846 TemplateSpecializationLocInfo> {
1847public:
1848 void set(SourceLocation ElaboratedKeywordLoc,
1849 NestedNameSpecifierLoc QualifierLoc,
1850 SourceLocation TemplateKeywordLoc, SourceLocation NameLoc,
1851 SourceLocation LAngleLoc, SourceLocation RAngleLoc);
1852
1853 void set(SourceLocation ElaboratedKeywordLoc,
1854 NestedNameSpecifierLoc QualifierLoc,
1855 SourceLocation TemplateKeywordLoc, SourceLocation NameLoc,
1856 const TemplateArgumentListInfo &TAL);
1857
1861
1863 if (!getLocalData()->QualifierData)
1864 return NestedNameSpecifierLoc();
1865
1866 NestedNameSpecifier Qualifier =
1867 getTypePtr()->getTemplateName().getQualifier();
1868 assert(Qualifier && "missing qualification");
1869 return NestedNameSpecifierLoc(Qualifier, getLocalData()->QualifierData);
1870 }
1871
1875
1877
1879
1880 unsigned getNumArgs() const {
1881 return getTypePtr()->template_arguments().size();
1882 }
1883
1885 return {getArgInfos(), getNumArgs()};
1886 }
1887
1888 TemplateArgumentLoc getArgLoc(unsigned i) const {
1889 return TemplateArgumentLoc(getTypePtr()->template_arguments()[i],
1890 getArgInfos()[i]);
1891 }
1892
1894
1895 /// - Copy the location information from the given info.
1897 unsigned size = getFullDataSize();
1898 assert(size == Loc.getFullDataSize());
1899
1900 // We're potentially copying Expr references here. We don't
1901 // bother retaining them because TypeSourceInfos live forever, so
1902 // as long as the Expr was retained when originally written into
1903 // the TypeLoc, we're okay.
1904 memcpy(Data, Loc.Data, size);
1905 }
1906
1908
1909 void initializeLocal(ASTContext &Context, SourceLocation Loc);
1910
1911 static void initializeArgLocs(ASTContext &Context,
1913 TemplateArgumentLocInfo *ArgInfos,
1914 SourceLocation Loc);
1915
1916 unsigned getExtraLocalDataSize() const {
1917 return getNumArgs() * sizeof(TemplateArgumentLocInfo);
1918 }
1919
1921 return alignof(TemplateArgumentLocInfo);
1922 }
1923
1924private:
1925 TemplateArgumentLocInfo *getArgInfos() const {
1926 return static_cast<TemplateArgumentLocInfo*>(getExtraLocalData());
1927 }
1928};
1929
1935
1937 : public ConcreteTypeLoc<UnqualTypeLoc,
1938 DependentAddressSpaceTypeLoc,
1939 DependentAddressSpaceType,
1940 DependentAddressSpaceLocInfo> {
1941public:
1942 /// The location of the attribute name, i.e.
1943 /// int * __attribute__((address_space(11)))
1944 /// ^~~~~~~~~~~~~
1946 return getLocalData()->AttrLoc;
1947 }
1949 getLocalData()->AttrLoc = loc;
1950 }
1951
1952 /// The attribute's expression operand, if it has one.
1953 /// int * __attribute__((address_space(11)))
1954 /// ^~
1956 return getLocalData()->ExprOperand;
1957 }
1960 }
1961
1962 /// The location of the parentheses around the operand, if there is
1963 /// an operand.
1964 /// int * __attribute__((address_space(11)))
1965 /// ^ ^
1972
1974 SourceRange range(getAttrNameLoc());
1975 range.setEnd(getAttrOperandParensRange().getEnd());
1976 return range;
1977 }
1978
1979 /// Returns the type before the address space attribute application
1980 /// area.
1981 /// int * __attribute__((address_space(11))) *
1982 /// ^ ^
1984 return this->getTypePtr()->getPointeeType();
1985 }
1986
1988 return this->getInnerTypeLoc();
1989 }
1990
1992 setAttrNameLoc(loc);
1995 setAttrExprOperand(getTypePtr()->getAddrSpaceExpr());
1996 }
1997};
1998
1999//===----------------------------------------------------------------------===//
2000//
2001// All of these need proper implementations.
2002//
2003//===----------------------------------------------------------------------===//
2004
2005// FIXME: size expression and attribute locations (or keyword if we
2006// ever fully support altivec syntax).
2010
2011class VectorTypeLoc : public ConcreteTypeLoc<UnqualTypeLoc, VectorTypeLoc,
2012 VectorType, VectorTypeLocInfo> {
2013public:
2014 SourceLocation getNameLoc() const { return this->getLocalData()->NameLoc; }
2015
2016 void setNameLoc(SourceLocation Loc) { this->getLocalData()->NameLoc = Loc; }
2017
2021
2023 setNameLoc(Loc);
2024 }
2025
2027
2028 QualType getInnerType() const { return this->getTypePtr()->getElementType(); }
2029};
2030
2031// FIXME: size expression and attribute locations (or keyword if we
2032// ever fully support altivec syntax).
2034 : public ConcreteTypeLoc<UnqualTypeLoc, DependentVectorTypeLoc,
2035 DependentVectorType, VectorTypeLocInfo> {
2036public:
2037 SourceLocation getNameLoc() const { return this->getLocalData()->NameLoc; }
2038
2039 void setNameLoc(SourceLocation Loc) { this->getLocalData()->NameLoc = Loc; }
2040
2044
2046 setNameLoc(Loc);
2047 }
2048
2050
2051 QualType getInnerType() const { return this->getTypePtr()->getElementType(); }
2052};
2053
2054// FIXME: size expression and attribute locations.
2056 : public InheritingConcreteTypeLoc<VectorTypeLoc, ExtVectorTypeLoc,
2057 ExtVectorType> {};
2058
2059// FIXME: attribute locations.
2060// For some reason, this isn't a subtype of VectorType.
2062 : public ConcreteTypeLoc<UnqualTypeLoc, DependentSizedExtVectorTypeLoc,
2063 DependentSizedExtVectorType, VectorTypeLocInfo> {
2064public:
2065 SourceLocation getNameLoc() const { return this->getLocalData()->NameLoc; }
2066
2067 void setNameLoc(SourceLocation Loc) { this->getLocalData()->NameLoc = Loc; }
2068
2072
2074 setNameLoc(Loc);
2075 }
2076
2078
2079 QualType getInnerType() const { return this->getTypePtr()->getElementType(); }
2080};
2081
2088
2089class MatrixTypeLoc : public ConcreteTypeLoc<UnqualTypeLoc, MatrixTypeLoc,
2090 MatrixType, MatrixTypeLocInfo> {
2091public:
2092 /// The location of the attribute name, i.e.
2093 /// float __attribute__((matrix_type(4, 2)))
2094 /// ^~~~~~~~~~~~~~~~~
2097
2098 /// The attribute's row operand, if it has one.
2099 /// float __attribute__((matrix_type(4, 2)))
2100 /// ^
2103
2104 /// The attribute's column operand, if it has one.
2105 /// float __attribute__((matrix_type(4, 2)))
2106 /// ^
2109
2110 /// The location of the parentheses around the operand, if there is
2111 /// an operand.
2112 /// float __attribute__((matrix_type(4, 2)))
2113 /// ^ ^
2120
2122 SourceRange range(getAttrNameLoc());
2123 range.setEnd(getAttrOperandParensRange().getEnd());
2124 return range;
2125 }
2126
2128 setAttrNameLoc(loc);
2130 setAttrRowOperand(nullptr);
2131 setAttrColumnOperand(nullptr);
2132 }
2133};
2134
2136 : public InheritingConcreteTypeLoc<MatrixTypeLoc, ConstantMatrixTypeLoc,
2137 ConstantMatrixType> {};
2138
2140 : public InheritingConcreteTypeLoc<MatrixTypeLoc,
2141 DependentSizedMatrixTypeLoc,
2142 DependentSizedMatrixType> {};
2143
2144// FIXME: location of the '_Complex' keyword.
2145class ComplexTypeLoc : public InheritingConcreteTypeLoc<TypeSpecTypeLoc,
2146 ComplexTypeLoc,
2147 ComplexType> {
2148};
2149
2155
2157};
2158
2162
2163template <class Derived, class TypeClass, class LocalData = TypeofLocInfo>
2165 : public ConcreteTypeLoc<UnqualTypeLoc, Derived, TypeClass, LocalData> {
2166public:
2168 return this->getLocalData()->TypeofLoc;
2169 }
2170
2172 this->getLocalData()->TypeofLoc = Loc;
2173 }
2174
2176 return this->getLocalData()->LParenLoc;
2177 }
2178
2180 this->getLocalData()->LParenLoc = Loc;
2181 }
2182
2184 return this->getLocalData()->RParenLoc;
2185 }
2186
2188 this->getLocalData()->RParenLoc = Loc;
2189 }
2190
2194
2196 setLParenLoc(range.getBegin());
2197 setRParenLoc(range.getEnd());
2198 }
2199
2203
2205 setTypeofLoc(Loc);
2206 setLParenLoc(Loc);
2207 setRParenLoc(Loc);
2208 }
2209};
2210
2211class TypeOfExprTypeLoc : public TypeofLikeTypeLoc<TypeOfExprTypeLoc,
2212 TypeOfExprType,
2213 TypeOfExprTypeLocInfo> {
2214public:
2216 return getTypePtr()->getUnderlyingExpr();
2217 }
2218
2219 // Reimplemented to account for GNU/C++ extension
2220 // typeof unary-expression
2221 // where there are no parentheses.
2223};
2224
2226 : public TypeofLikeTypeLoc<TypeOfTypeLoc, TypeOfType, TypeOfTypeLocInfo> {
2227public:
2229 return this->getTypePtr()->getUnmodifiedType();
2230 }
2231
2233 return this->getLocalData()->UnmodifiedTInfo;
2234 }
2235
2237 this->getLocalData()->UnmodifiedTInfo = TI;
2238 }
2239
2240 void initializeLocal(ASTContext &Context, SourceLocation Loc);
2241};
2242
2243// decltype(expression) abc;
2244// ~~~~~~~~ DecltypeLoc
2245// ~ RParenLoc
2246// FIXME: add LParenLoc, it is tricky to support due to the limitation of
2247// annotated-decltype token.
2253 : public ConcreteTypeLoc<UnqualTypeLoc, DecltypeTypeLoc, DecltypeType,
2254 DecltypeTypeLocInfo> {
2255public:
2256 Expr *getUnderlyingExpr() const { return getTypePtr()->getUnderlyingExpr(); }
2257
2260
2263
2267
2269 setDecltypeLoc(Loc);
2270 setRParenLoc(Loc);
2271 }
2272};
2273
2277
2279 : public ConcreteTypeLoc<UnqualTypeLoc, PackIndexingTypeLoc,
2280 PackIndexingType, PackIndexingTypeLocInfo> {
2281
2282public:
2283 Expr *getIndexExpr() const { return getTypePtr()->getIndexExpr(); }
2284 QualType getPattern() const { return getTypePtr()->getPattern(); }
2285
2288
2290 setEllipsisLoc(Loc);
2291 }
2292
2294
2295 QualType getInnerType() const { return this->getTypePtr()->getPattern(); }
2296
2300};
2301
2303 // FIXME: While there's only one unary transform right now, future ones may
2304 // need different representations
2307};
2308
2309class UnaryTransformTypeLoc : public ConcreteTypeLoc<UnqualTypeLoc,
2310 UnaryTransformTypeLoc,
2311 UnaryTransformType,
2312 UnaryTransformTypeLocInfo> {
2313public:
2316
2319
2322
2326
2328 getLocalData()->UnderlyingTInfo = TInfo;
2329 }
2330
2334
2338
2340 setLParenLoc(Range.getBegin());
2341 setRParenLoc(Range.getEnd());
2342 }
2343
2344 void initializeLocal(ASTContext &Context, SourceLocation Loc);
2345};
2346
2348 : public InheritingConcreteTypeLoc<TypeSpecTypeLoc, DeducedTypeLoc,
2349 DeducedType> {};
2350
2352 // For decltype(auto).
2354
2356};
2357
2359 : public ConcreteTypeLoc<DeducedTypeLoc,
2360 AutoTypeLoc,
2361 AutoType,
2362 AutoTypeLocInfo> {
2363public:
2365 return getTypePtr()->getKeyword();
2366 }
2367
2368 bool isDecltypeAuto() const { return getTypePtr()->isDecltypeAuto(); }
2371
2372 bool isConstrained() const {
2373 return getTypePtr()->isConstrained();
2374 }
2375
2377
2379
2380 // FIXME: Several of the following functions can be removed. Instead the
2381 // caller can directly work with the ConceptReference.
2383 if (const auto *CR = getConceptReference())
2384 return CR->getNestedNameSpecifierLoc();
2385 return NestedNameSpecifierLoc();
2386 }
2387
2389 if (const auto *CR = getConceptReference())
2390 return CR->getTemplateKWLoc();
2391 return SourceLocation();
2392 }
2393
2395 if (const auto *CR = getConceptReference())
2396 return CR->getConceptNameLoc();
2397 return SourceLocation();
2398 }
2399
2401 if (const auto *CR = getConceptReference())
2402 return CR->getFoundDecl();
2403 return nullptr;
2404 }
2405
2407 if (const auto *CR = getConceptReference())
2408 return CR->getNamedConcept();
2409 return nullptr;
2410 }
2411
2415
2417 return (getConceptReference() &&
2418 getConceptReference()->getTemplateArgsAsWritten() &&
2420 ->getTemplateArgsAsWritten()
2421 ->getLAngleLoc()
2422 .isValid());
2423 }
2424
2426 if (const auto *CR = getConceptReference())
2427 if (const auto *TAAW = CR->getTemplateArgsAsWritten())
2428 return TAAW->getLAngleLoc();
2429 return SourceLocation();
2430 }
2431
2433 if (const auto *CR = getConceptReference())
2434 if (const auto *TAAW = CR->getTemplateArgsAsWritten())
2435 return TAAW->getRAngleLoc();
2436 return SourceLocation();
2437 }
2438
2439 unsigned getNumArgs() const {
2440 return getTypePtr()->getTypeConstraintArguments().size();
2441 }
2442
2443 TemplateArgumentLoc getArgLoc(unsigned i) const {
2444 const auto *CR = getConceptReference();
2445 assert(CR && "No ConceptReference");
2446 return CR->getTemplateArgsAsWritten()->getTemplateArgs()[i];
2447 }
2448
2458
2459 void copy(AutoTypeLoc Loc) {
2460 unsigned size = getFullDataSize();
2461 assert(size == Loc.getFullDataSize());
2462 memcpy(Data, Loc.Data, size);
2463 }
2464
2465 void initializeLocal(ASTContext &Context, SourceLocation Loc);
2466};
2467
2470 /// Data associated with the nested-name-specifier location.
2472};
2473
2475 : public ConcreteTypeLoc<DeducedTypeLoc,
2476 DeducedTemplateSpecializationTypeLoc,
2477 DeducedTemplateSpecializationType,
2478 DeducedTemplateSpecializationLocInfo> {
2479public:
2483
2487
2489
2491
2493 void *Data = getLocalData()->QualifierData;
2494 if (!Data)
2495 return NestedNameSpecifierLoc();
2496 NestedNameSpecifier Qualifier =
2497 getTypePtr()->getTemplateName().getQualifier();
2498 assert(Qualifier && "missing qualification");
2499 return NestedNameSpecifierLoc(Qualifier, Data);
2500 }
2501
2503 if (!QualifierLoc) {
2504 // Even if we have a nested-name-specifier in the dependent
2505 // template specialization type, we won't record the nested-name-specifier
2506 // location information when this type-source location information is
2507 // part of a nested-name-specifier.
2508 getLocalData()->QualifierData = nullptr;
2509 return;
2510 }
2511
2512 assert(QualifierLoc.getNestedNameSpecifier() ==
2513 getTypePtr()->getTemplateName().getQualifier() &&
2514 "Inconsistent nested-name-specifier pointer");
2515 getLocalData()->QualifierData = QualifierLoc.getOpaqueData();
2516 }
2517
2520 if (BeginLoc.isInvalid())
2521 BeginLoc = getQualifierLoc().getBeginLoc();
2522 if (BeginLoc.isInvalid())
2523 BeginLoc = getNameLoc();
2524 return {BeginLoc, getNameLoc()};
2525 }
2526
2527 void initializeLocal(ASTContext &Context, SourceLocation Loc);
2528};
2529
2532
2533 /// Data associated with the nested-name-specifier location.
2535};
2536
2537// This is exactly the structure of an ElaboratedTypeLoc whose inner
2538// type is some sort of TypeDeclTypeLoc.
2542
2543class DependentNameTypeLoc : public ConcreteTypeLoc<UnqualTypeLoc,
2544 DependentNameTypeLoc,
2545 DependentNameType,
2546 DependentNameLocInfo> {
2547public:
2551
2555
2557 return NestedNameSpecifierLoc(getTypePtr()->getQualifier(),
2558 getLocalData()->QualifierData);
2559 }
2560
2562 assert(QualifierLoc.getNestedNameSpecifier()
2563 == getTypePtr()->getQualifier() &&
2564 "Inconsistent nested-name-specifier pointer");
2565 getLocalData()->QualifierData = QualifierLoc.getOpaqueData();
2566 }
2567
2569 return this->getLocalData()->NameLoc;
2570 }
2571
2573 this->getLocalData()->NameLoc = Loc;
2574 }
2575
2577 if (getElaboratedKeywordLoc().isValid())
2579 else
2581 }
2582
2584 unsigned size = getFullDataSize();
2585 assert(size == Loc.getFullDataSize());
2586 memcpy(Data, Loc.Data, size);
2587 }
2588
2589 void initializeLocal(ASTContext &Context, SourceLocation Loc);
2590};
2591
2595
2597 : public ConcreteTypeLoc<UnqualTypeLoc, PackExpansionTypeLoc,
2598 PackExpansionType, PackExpansionTypeLocInfo> {
2599public:
2601 return this->getLocalData()->EllipsisLoc;
2602 }
2603
2605 this->getLocalData()->EllipsisLoc = Loc;
2606 }
2607
2611
2613 setEllipsisLoc(Loc);
2614 }
2615
2617 return getInnerTypeLoc();
2618 }
2619
2621 return this->getTypePtr()->getPattern();
2622 }
2623};
2624
2628
2629class AtomicTypeLoc : public ConcreteTypeLoc<UnqualTypeLoc, AtomicTypeLoc,
2630 AtomicType, AtomicTypeLocInfo> {
2631public:
2633 return this->getInnerTypeLoc();
2634 }
2635
2639
2641 return this->getLocalData()->KWLoc;
2642 }
2643
2645 this->getLocalData()->KWLoc = Loc;
2646 }
2647
2649 return this->getLocalData()->LParenLoc;
2650 }
2651
2653 this->getLocalData()->LParenLoc = Loc;
2654 }
2655
2657 return this->getLocalData()->RParenLoc;
2658 }
2659
2661 this->getLocalData()->RParenLoc = Loc;
2662 }
2663
2667
2669 setLParenLoc(Range.getBegin());
2670 setRParenLoc(Range.getEnd());
2671 }
2672
2674 setKWLoc(Loc);
2675 setLParenLoc(Loc);
2676 setRParenLoc(Loc);
2677 }
2678
2680 return this->getTypePtr()->getValueType();
2681 }
2682};
2683
2687
2688class PipeTypeLoc : public ConcreteTypeLoc<UnqualTypeLoc, PipeTypeLoc, PipeType,
2689 PipeTypeLocInfo> {
2690public:
2691 TypeLoc getValueLoc() const { return this->getInnerTypeLoc(); }
2692
2694
2695 SourceLocation getKWLoc() const { return this->getLocalData()->KWLoc; }
2696 void setKWLoc(SourceLocation Loc) { this->getLocalData()->KWLoc = Loc; }
2697
2699 setKWLoc(Loc);
2700 }
2701
2702 QualType getInnerType() const { return this->getTypePtr()->getElementType(); }
2703};
2704
2705template <typename T>
2707 TypeLoc Cur = *this;
2708 while (!T::isKind(Cur)) {
2709 if (auto PTL = Cur.getAs<ParenTypeLoc>())
2710 Cur = PTL.getInnerLoc();
2711 else if (auto ATL = Cur.getAs<AttributedTypeLoc>())
2712 Cur = ATL.getModifiedLoc();
2713 else if (auto ATL = Cur.getAs<BTFTagAttributedTypeLoc>())
2714 Cur = ATL.getWrappedLoc();
2715 else if (auto ATL = Cur.getAs<HLSLAttributedResourceTypeLoc>())
2716 Cur = ATL.getWrappedLoc();
2717 else if (auto ATL = Cur.getAs<AdjustedTypeLoc>())
2718 Cur = ATL.getOriginalLoc();
2719 else if (auto MQL = Cur.getAs<MacroQualifiedTypeLoc>())
2720 Cur = MQL.getInnerLoc();
2721 else
2722 break;
2723 }
2724 return Cur.getAs<T>();
2725}
2726class BitIntTypeLoc final
2727 : public InheritingConcreteTypeLoc<TypeSpecTypeLoc, BitIntTypeLoc,
2728 BitIntType> {};
2730 : public InheritingConcreteTypeLoc<TypeSpecTypeLoc, DependentBitIntTypeLoc,
2731 DependentBitIntType> {};
2732
2734 ObjCProtocolDecl *Protocol = nullptr;
2736
2737public:
2739 : Protocol(protocol), Loc(loc) {}
2740 ObjCProtocolDecl *getProtocol() const { return Protocol; }
2741 SourceLocation getLocation() const { return Loc; }
2742
2743 /// The source range is just the protocol name.
2744 SourceRange getSourceRange() const LLVM_READONLY {
2745 return SourceRange(Loc, Loc);
2746 }
2747};
2748
2749struct PredefinedSugarTypeLocInfo {}; // Nothing.
2750
2752 : public ConcreteTypeLoc<UnqualTypeLoc, PredefinedSugarTypeLoc,
2753 PredefinedSugarType, PredefinedSugarTypeLocInfo> {
2754public:
2756 SourceRange getLocalSourceRange() const { return {}; }
2757};
2758
2759} // namespace clang
2760
2761#endif // LLVM_CLANG_AST_TYPELOC_H
This file provides AST data structures related to concepts.
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified.
Defines the clang::SourceLocation class and associated facilities.
Defines various enumerations that describe declaration and type specifiers.
C Language Family Type Representation.
__DEVICE__ void * memcpy(void *__a, const void *__b, size_t __c)
__DEVICE__ void * memset(void *__a, int __b, size_t __c)
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
Definition ASTContext.h:220
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
Definition ASTContext.h:220
QualType getInnerType() const
Definition TypeLoc.h:1427
unsigned getLocalDataSize() const
Definition TypeLoc.h:1435
TypeLoc getOriginalLoc() const
Definition TypeLoc.h:1419
void initializeLocal(ASTContext &Context, SourceLocation Loc)
Definition TypeLoc.h:1423
SourceRange getLocalSourceRange() const
Definition TypeLoc.h:1433
QualType getOriginalType() const
Definition TypeBase.h:3504
Wrapper for source info for array parameter types.
Definition TypeLoc.h:1804
Wrapper for source info for arrays.
Definition TypeLoc.h:1748
SourceLocation getLBracketLoc() const
Definition TypeLoc.h:1750
Expr * getSizeExpr() const
Definition TypeLoc.h:1770
void setLBracketLoc(SourceLocation Loc)
Definition TypeLoc.h:1754
TypeLoc getElementLoc() const
Definition TypeLoc.h:1778
void setRBracketLoc(SourceLocation Loc)
Definition TypeLoc.h:1762
void initializeLocal(ASTContext &Context, SourceLocation Loc)
Definition TypeLoc.h:1786
SourceLocation getRBracketLoc() const
Definition TypeLoc.h:1758
SourceRange getBracketsRange() const
Definition TypeLoc.h:1766
SourceRange getLocalSourceRange() const
Definition TypeLoc.h:1782
QualType getInnerType() const
Definition TypeLoc.h:1792
void setSizeExpr(Expr *Size)
Definition TypeLoc.h:1774
QualType getElementType() const
Definition TypeBase.h:3734
SourceLocation getRParenLoc() const
Definition TypeLoc.h:2656
QualType getInnerType() const
Definition TypeLoc.h:2679
SourceRange getLocalSourceRange() const
Definition TypeLoc.h:2636
void setRParenLoc(SourceLocation Loc)
Definition TypeLoc.h:2660
SourceRange getParensRange() const
Definition TypeLoc.h:2664
TypeLoc getValueLoc() const
Definition TypeLoc.h:2632
void setLParenLoc(SourceLocation Loc)
Definition TypeLoc.h:2652
void setKWLoc(SourceLocation Loc)
Definition TypeLoc.h:2644
void initializeLocal(ASTContext &Context, SourceLocation Loc)
Definition TypeLoc.h:2673
SourceLocation getKWLoc() const
Definition TypeLoc.h:2640
SourceLocation getLParenLoc() const
Definition TypeLoc.h:2648
void setParensRange(SourceRange Range)
Definition TypeLoc.h:2668
QualType getValueType() const
Gets the type contained by this atomic type, i.e.
Definition TypeBase.h:8077
Attr - This represents one attribute.
Definition Attr.h:45
Type source information for an attributed type.
Definition TypeLoc.h:1008
const Attr * getAttr() const
The type attribute.
Definition TypeLoc.h:1031
QualType getInnerType() const
Definition TypeLoc.h:1048
TypeLoc getModifiedLoc() const
The modified type, which is generally canonically different from the attribute type.
Definition TypeLoc.h:1022
TypeLoc getEquivalentTypeLoc() const
Definition TypeLoc.h:1026
void initializeLocal(ASTContext &Context, SourceLocation loc)
Definition TypeLoc.h:1044
SourceRange getLocalSourceRange() const
Definition TypeLoc.cpp:580
void setAttr(const Attr *A)
Definition TypeLoc.h:1034
attr::Kind getAttrKind() const
Definition TypeLoc.h:1010
bool isQualifier() const
Definition TypeLoc.h:1014
bool hasExplicitTemplateArgs() const
Definition TypeLoc.h:2416
SourceLocation getTemplateKWLoc() const
Definition TypeLoc.h:2388
AutoTypeKeyword getAutoKeyword() const
Definition TypeLoc.h:2364
const NestedNameSpecifierLoc getNestedNameSpecifierLoc() const
Definition TypeLoc.h:2382
SourceLocation getRAngleLoc() const
Definition TypeLoc.h:2432
SourceLocation getRParenLoc() const
Definition TypeLoc.h:2369
void initializeLocal(ASTContext &Context, SourceLocation Loc)
Definition TypeLoc.cpp:788
SourceRange getLocalSourceRange() const
Definition TypeLoc.h:2449
void copy(AutoTypeLoc Loc)
Definition TypeLoc.h:2459
SourceLocation getLAngleLoc() const
Definition TypeLoc.h:2425
void setConceptReference(ConceptReference *CR)
Definition TypeLoc.h:2376
SourceLocation getConceptNameLoc() const
Definition TypeLoc.h:2394
NamedDecl * getFoundDecl() const
Definition TypeLoc.h:2400
TemplateArgumentLoc getArgLoc(unsigned i) const
Definition TypeLoc.h:2443
bool isDecltypeAuto() const
Definition TypeLoc.h:2368
bool isConstrained() const
Definition TypeLoc.h:2372
unsigned getNumArgs() const
Definition TypeLoc.h:2439
TemplateDecl * getNamedConcept() const
Definition TypeLoc.h:2406
ConceptReference * getConceptReference() const
Definition TypeLoc.h:2378
DeclarationNameInfo getConceptNameInfo() const
Definition TypeLoc.h:2412
void setRParenLoc(SourceLocation Loc)
Definition TypeLoc.h:2370
Type source information for an btf_tag attributed type.
Definition TypeLoc.h:1058
QualType getInnerType() const
Definition TypeLoc.h:1073
TypeLoc getWrappedLoc() const
Definition TypeLoc.h:1060
void initializeLocal(ASTContext &Context, SourceLocation loc)
Definition TypeLoc.h:1071
const BTFTypeTagAttr * getAttr() const
The btf_type_tag attribute.
Definition TypeLoc.h:1063
SourceRange getLocalSourceRange() const
Definition TypeLoc.cpp:597
Wrapper for source info for block pointers.
Definition TypeLoc.h:1497
SourceLocation getCaretLoc() const
Definition TypeLoc.h:1499
void setCaretLoc(SourceLocation Loc)
Definition TypeLoc.h:1503
QualType getInnerType() const
Definition TypeLoc.h:1312
unsigned getLocalDataSize() const
Definition TypeLoc.h:1317
TypeLoc getInnerLoc() const
Definition TypeLoc.h:1311
void initializeLocal(ASTContext &Context, SourceLocation Loc)
Definition TypeLoc.h:1313
QualType desugar() const
Definition TypeBase.h:3398
Wrapper for source info for builtin types.
Definition TypeLoc.h:577
SourceLocation getBuiltinLoc() const
Definition TypeLoc.h:579
TypeSpecifierType getWrittenTypeSpec() const
Definition TypeLoc.cpp:321
void initializeLocal(ASTContext &Context, SourceLocation Loc)
Definition TypeLoc.h:680
TypeSpecifierWidth getWrittenWidthSpec() const
Definition TypeLoc.h:641
SourceRange getLocalSourceRange() const
Definition TypeLoc.h:621
void setWrittenTypeSpec(TypeSpecifierType written)
Definition TypeLoc.h:663
const WrittenBuiltinSpecs & getWrittenBuiltinSpecs() const
Definition TypeLoc.h:602
bool needsExtraLocalData() const
Definition TypeLoc.h:606
bool hasWrittenWidthSpec() const
Definition TypeLoc.h:648
void setModeAttr(bool written)
Definition TypeLoc.h:675
void setBuiltinLoc(SourceLocation Loc)
Definition TypeLoc.h:583
void setWrittenWidthSpec(TypeSpecifierWidth written)
Definition TypeLoc.h:652
SourceLocation getNameLoc() const
Definition TypeLoc.h:597
unsigned getExtraLocalDataAlignment() const
Definition TypeLoc.h:617
WrittenBuiltinSpecs & getWrittenBuiltinSpecs()
Definition TypeLoc.h:599
void setWrittenSignSpec(TypeSpecifierSign written)
Definition TypeLoc.h:636
bool hasWrittenSignSpec() const
Definition TypeLoc.h:632
bool hasModeAttr() const
Definition TypeLoc.h:668
unsigned getExtraLocalDataSize() const
Definition TypeLoc.h:613
bool hasWrittenTypeSpec() const
Definition TypeLoc.h:659
TypeSpecifierSign getWrittenSignSpec() const
Definition TypeLoc.h:625
void expandBuiltinRange(SourceRange Range)
Definition TypeLoc.h:587
Kind getKind() const
Definition TypeBase.h:3212
Represents a C++ struct/union/class.
Definition DeclCXX.h:258
Declaration of a C++20 concept.
A reference to a concept and its template args, as it appears in the code.
Definition ASTConcept.h:130
const DeclarationNameInfo & getConceptNameInfo() const
Definition ASTConcept.h:174
A metaprogramming base class for TypeLoc classes which correspond to a particular Type subclass.
Definition TypeLoc.h:384
const TypeClass * getTypePtr() const
Definition TypeLoc.h:433
friend class TypeLoc
Definition TypeLoc.h:385
TypeLoc getInnerTypeLoc() const
Definition TypeLoc.h:470
unsigned getExtraLocalDataAlignment() const
Definition TypeLoc.h:442
HasNoInnerType getInnerType() const
Definition TypeLoc.h:468
void * getExtraLocalData() const
Gets a pointer past the Info structure; useful for classes with local data that can't be captured in ...
Definition TypeLoc.h:453
LocalData * getLocalData() const
Definition TypeLoc.h:446
unsigned getLocalDataAlignment() const
Definition TypeLoc.h:401
void * getNonLocalData() const
Definition TypeLoc.h:460
TypeLoc getNextTypeLoc() const
Definition TypeLoc.h:429
unsigned getExtraLocalDataSize() const
Definition TypeLoc.h:438
void copyLocal(Derived other)
Definition TypeLoc.h:415
unsigned getLocalDataSize() const
Definition TypeLoc.h:406
Expr * getCountExpr() const
Definition TypeLoc.h:1325
SourceRange getLocalSourceRange() const
Definition TypeLoc.cpp:593
bool isCountInBytes() const
Definition TypeBase.h:3463
Expr * getCountExpr() const
Definition TypeBase.h:3462
Wrapper for source info for pointers decayed from arrays and functions.
Definition TypeLoc.h:1445
SourceLocation getDecltypeLoc() const
Definition TypeLoc.h:2258
void initializeLocal(ASTContext &Context, SourceLocation Loc)
Definition TypeLoc.h:2268
Expr * getUnderlyingExpr() const
Definition TypeLoc.h:2256
SourceLocation getRParenLoc() const
Definition TypeLoc.h:2261
void setRParenLoc(SourceLocation Loc)
Definition TypeLoc.h:2262
void setDecltypeLoc(SourceLocation Loc)
Definition TypeLoc.h:2259
SourceRange getLocalSourceRange() const
Definition TypeLoc.h:2264
void setQualifierLoc(NestedNameSpecifierLoc QualifierLoc)
Definition TypeLoc.h:2502
void setElaboratedKeywordLoc(SourceLocation Loc)
Definition TypeLoc.h:2484
void initializeLocal(ASTContext &Context, SourceLocation Loc)
Definition TypeLoc.cpp:798
SourceLocation getElaboratedKeywordLoc() const
Definition TypeLoc.h:2480
SourceLocation getTemplateNameLoc() const
Definition TypeLoc.h:2488
void setTemplateNameLoc(SourceLocation Loc)
Definition TypeLoc.h:2490
NestedNameSpecifierLoc getQualifierLoc() const
Definition TypeLoc.h:2492
void setAttrNameLoc(SourceLocation loc)
Definition TypeLoc.h:1948
SourceRange getLocalSourceRange() const
Definition TypeLoc.h:1973
void setAttrOperandParensRange(SourceRange range)
Definition TypeLoc.h:1969
QualType getInnerType() const
Returns the type before the address space attribute application area.
Definition TypeLoc.h:1983
Expr * getAttrExprOperand() const
The attribute's expression operand, if it has one.
Definition TypeLoc.h:1955
void initializeLocal(ASTContext &Context, SourceLocation loc)
Definition TypeLoc.h:1991
SourceRange getAttrOperandParensRange() const
The location of the parentheses around the operand, if there is an operand.
Definition TypeLoc.h:1966
SourceLocation getAttrNameLoc() const
The location of the attribute name, i.e.
Definition TypeLoc.h:1945
QualType getPointeeType() const
Definition TypeBase.h:4073
void copy(DependentNameTypeLoc Loc)
Definition TypeLoc.h:2583
NestedNameSpecifierLoc getQualifierLoc() const
Definition TypeLoc.h:2556
SourceLocation getNameLoc() const
Definition TypeLoc.h:2568
void initializeLocal(ASTContext &Context, SourceLocation Loc)
Definition TypeLoc.cpp:636
SourceRange getLocalSourceRange() const
Definition TypeLoc.h:2576
SourceLocation getElaboratedKeywordLoc() const
Definition TypeLoc.h:2548
void setNameLoc(SourceLocation Loc)
Definition TypeLoc.h:2572
void setElaboratedKeywordLoc(SourceLocation Loc)
Definition TypeLoc.h:2552
void setQualifierLoc(NestedNameSpecifierLoc QualifierLoc)
Definition TypeLoc.h:2561
void initializeLocal(ASTContext &Context, SourceLocation Loc)
Definition TypeLoc.h:1817
SourceLocation getNameLoc() const
Definition TypeLoc.h:2065
SourceRange getLocalSourceRange() const
Definition TypeLoc.h:2069
void setNameLoc(SourceLocation Loc)
Definition TypeLoc.h:2067
void initializeLocal(ASTContext &Context, SourceLocation Loc)
Definition TypeLoc.h:2073
SourceLocation getNameLoc() const
Definition TypeLoc.h:2037
SourceRange getLocalSourceRange() const
Definition TypeLoc.h:2041
void initializeLocal(ASTContext &Context, SourceLocation Loc)
Definition TypeLoc.h:2045
TypeLoc getElementLoc() const
Definition TypeLoc.h:2049
void setNameLoc(SourceLocation Loc)
Definition TypeLoc.h:2039
QualType getInnerType() const
Definition TypeLoc.h:2051
QualType getElementType() const
Definition TypeBase.h:4239
SourceRange getLocalSourceRange() const
Definition TypeLoc.h:763
void set(SourceLocation ElaboratedKeywordLoc, NestedNameSpecifierLoc QualifierLoc, SourceLocation NameLoc)
Definition TypeLoc.h:744
SourceLocation getElaboratedKeywordLoc() const
Definition TypeLoc.h:752
void initializeLocal(ASTContext &Context, SourceLocation Loc)
Definition TypeLoc.h:768
SourceLocation getNameLoc() const
Definition TypeLoc.h:761
NestedNameSpecifierLoc getQualifierLoc() const
Definition TypeLoc.h:756
Represents an enum.
Definition Decl.h:4007
Wrapper for source info for enum types.
Definition TypeLoc.h:863
EnumDecl * getDecl() const
Definition TypeLoc.h:865
This represents one expression.
Definition Expr.h:112
Wrapper for source info for functions.
Definition TypeLoc.h:1615
ParmVarDecl ** getParmArray() const
Definition TypeLoc.h:1683
QualType getInnerType() const
Definition TypeLoc.h:1724
unsigned getNumParams() const
Definition TypeLoc.h:1687
ParmVarDecl * getParam(unsigned i) const
Definition TypeLoc.h:1693
SourceLocation getLocalRangeEnd() const
Definition TypeLoc.h:1639
void setLocalRangeBegin(SourceLocation L)
Definition TypeLoc.h:1635
void setLParenLoc(SourceLocation Loc)
Definition TypeLoc.h:1651
SourceRange getExceptionSpecRange() const
Definition TypeLoc.h:1667
void setParam(unsigned i, ParmVarDecl *VD)
Definition TypeLoc.h:1694
ArrayRef< ParmVarDecl * > getParams() const
Definition TypeLoc.h:1678
SourceRange getParensRange() const
Definition TypeLoc.h:1663
void setRParenLoc(SourceLocation Loc)
Definition TypeLoc.h:1659
unsigned getExtraLocalDataAlignment() const
Definition TypeLoc.h:1722
void setLocalRangeEnd(SourceLocation L)
Definition TypeLoc.h:1643
unsigned getExtraLocalDataSize() const
Returns the size of the type source info data block that is specific to this type.
Definition TypeLoc.h:1717
void setExceptionSpecRange(SourceRange R)
Definition TypeLoc.h:1673
TypeLoc getReturnLoc() const
Definition TypeLoc.h:1696
SourceLocation getLocalRangeBegin() const
Definition TypeLoc.h:1631
SourceRange getLocalSourceRange() const
Definition TypeLoc.h:1700
SourceLocation getLParenLoc() const
Definition TypeLoc.h:1647
SourceLocation getRParenLoc() const
Definition TypeLoc.h:1655
void initializeLocal(ASTContext &Context, SourceLocation Loc)
Definition TypeLoc.h:1704
QualType getReturnType() const
Definition TypeBase.h:4790
Type source information for HLSL attributed resource type.
Definition TypeLoc.h:1085
void initializeLocal(ASTContext &Context, SourceLocation loc)
Definition TypeLoc.h:1098
TypeSourceInfo * getContainedTypeSourceInfo() const
Definition TypeLoc.h:1089
void setContainedTypeSourceInfo(TypeSourceInfo *TSI) const
Definition TypeLoc.h:1092
SourceRange getLocalSourceRange() const
Definition TypeLoc.h:1097
void setSourceRange(const SourceRange &R)
Definition TypeLoc.h:1096
SourceRange getLocalSourceRange() const
Definition TypeLoc.h:1118
void setSpirvTypeLoc(SourceLocation loc) const
Definition TypeLoc.h:1116
SourceLocation getSpirvTypeLoc() const
Definition TypeLoc.h:1115
void initializeLocal(ASTContext &Context, SourceLocation loc)
Definition TypeLoc.h:1121
One of these records is kept for each identifier that is lexed.
A metaprogramming class designed for concrete subtypes of abstract types where all subtypes share equ...
Definition TypeLoc.h:510
const TypeClass * getTypePtr() const
Definition TypeLoc.h:526
Wrapper for source info for injected class names of class templates.
Definition TypeLoc.h:872
CXXRecordDecl * getDecl() const
Definition TypeLoc.h:874
void setAmpLoc(SourceLocation Loc)
Definition TypeLoc.h:1585
SourceLocation getAmpLoc() const
Definition TypeLoc.h:1581
const IdentifierInfo * getMacroIdentifier() const
Definition TypeLoc.h:1346
SourceLocation getExpansionLoc() const
Definition TypeLoc.h:1350
TypeLoc getInnerLoc() const
Definition TypeLoc.h:1344
void initializeLocal(ASTContext &Context, SourceLocation Loc)
Definition TypeLoc.h:1340
void setExpansionLoc(SourceLocation Loc)
Definition TypeLoc.h:1354
SourceRange getLocalSourceRange() const
Definition TypeLoc.h:1360
QualType getInnerType() const
Definition TypeLoc.h:1358
QualType getUnderlyingType() const
Definition TypeBase.h:6149
const IdentifierInfo * getMacroIdentifier() const
Definition TypeBase.h:6148
Expr * getAttrColumnOperand() const
The attribute's column operand, if it has one.
Definition TypeLoc.h:2107
SourceRange getAttrOperandParensRange() const
The location of the parentheses around the operand, if there is an operand.
Definition TypeLoc.h:2114
void setAttrRowOperand(Expr *e)
Definition TypeLoc.h:2102
SourceRange getLocalSourceRange() const
Definition TypeLoc.h:2121
void setAttrColumnOperand(Expr *e)
Definition TypeLoc.h:2108
void setAttrOperandParensRange(SourceRange range)
Definition TypeLoc.h:2117
void setAttrNameLoc(SourceLocation loc)
Definition TypeLoc.h:2096
SourceLocation getAttrNameLoc() const
The location of the attribute name, i.e.
Definition TypeLoc.h:2095
void initializeLocal(ASTContext &Context, SourceLocation loc)
Definition TypeLoc.h:2127
Expr * getAttrRowOperand() const
The attribute's row operand, if it has one.
Definition TypeLoc.h:2101
Wrapper for source info for member pointers.
Definition TypeLoc.h:1515
void initializeLocal(ASTContext &Context, SourceLocation Loc)
Definition TypeLoc.h:1537
void setStarLoc(SourceLocation Loc)
Definition TypeLoc.h:1521
NestedNameSpecifierLoc getQualifierLoc() const
Definition TypeLoc.h:1525
SourceRange getLocalSourceRange() const
Definition TypeLoc.h:1547
SourceLocation getStarLoc() const
Definition TypeLoc.h:1517
void setQualifierLoc(NestedNameSpecifierLoc QualifierLoc)
Definition TypeLoc.h:1530
This represents a decl that may have a name.
Definition Decl.h:274
Class that aids in the construction of nested-name-specifiers along with source-location information ...
void MakeTrivial(ASTContext &Context, NestedNameSpecifier Qualifier, SourceRange R)
Make a new nested-name-specifier from incomplete source-location information.
A C++ nested-name-specifier augmented with source location information.
NestedNameSpecifier getNestedNameSpecifier() const
Retrieve the nested-name-specifier to which this instance refers.
SourceLocation getBeginLoc() const
Retrieve the location of the beginning of this nested-name-specifier.
void * getOpaqueData() const
Retrieve the opaque pointer that refers to source-location data.
Represents a C++ nested name specifier, such as "\::std::vector<int>::".
Represents an ObjC class declaration.
Definition DeclObjC.h:1154
Wrapper for source info for ObjC interfaces.
Definition TypeLoc.h:1274
void setNameLoc(SourceLocation Loc)
Definition TypeLoc.h:1284
SourceRange getLocalSourceRange() const
Definition TypeLoc.h:1288
void setNameEndLoc(SourceLocation Loc)
Definition TypeLoc.h:1296
ObjCInterfaceDecl * getIFaceDecl() const
Definition TypeLoc.h:1276
SourceLocation getNameEndLoc() const
Definition TypeLoc.h:1292
SourceLocation getNameLoc() const
Definition TypeLoc.h:1280
void initializeLocal(ASTContext &Context, SourceLocation Loc)
Definition TypeLoc.h:1300
ObjCInterfaceDecl * getDecl() const
Get the declaration of this interface.
Definition Type.cpp:951
Wraps an ObjCPointerType with source location information.
Definition TypeLoc.h:1557
SourceLocation getStarLoc() const
Definition TypeLoc.h:1559
void setStarLoc(SourceLocation Loc)
Definition TypeLoc.h:1563
unsigned getExtraLocalDataAlignment() const
Definition TypeLoc.h:1254
void setTypeArgsRAngleLoc(SourceLocation Loc)
Definition TypeLoc.h:1167
ObjCProtocolDecl * getProtocol(unsigned i) const
Definition TypeLoc.h:1215
unsigned getExtraLocalDataSize() const
Definition TypeLoc.h:1249
bool hasBaseTypeAsWritten() const
Definition TypeLoc.h:1225
void initializeLocal(ASTContext &Context, SourceLocation Loc)
Definition TypeLoc.cpp:564
SourceLocation getTypeArgsLAngleLoc() const
Definition TypeLoc.h:1155
unsigned getNumTypeArgs() const
Definition TypeLoc.h:1171
ArrayRef< SourceLocation > getProtocolLocs() const
Definition TypeLoc.h:1221
unsigned getNumProtocols() const
Definition TypeLoc.h:1201
void setTypeArgsLAngleLoc(SourceLocation Loc)
Definition TypeLoc.h:1159
SourceRange getLocalSourceRange() const
Definition TypeLoc.h:1237
TypeSourceInfo * getTypeArgTInfo(unsigned i) const
Definition TypeLoc.h:1175
void setTypeArgTInfo(unsigned i, TypeSourceInfo *TInfo)
Definition TypeLoc.h:1180
void setProtocolLAngleLoc(SourceLocation Loc)
Definition TypeLoc.h:1189
void setProtocolRAngleLoc(SourceLocation Loc)
Definition TypeLoc.h:1197
SourceLocation getProtocolRAngleLoc() const
Definition TypeLoc.h:1193
SourceLocation getProtocolLoc(unsigned i) const
Definition TypeLoc.h:1205
void setHasBaseTypeAsWritten(bool HasBaseType)
Definition TypeLoc.h:1229
void setProtocolLoc(unsigned i, SourceLocation Loc)
Definition TypeLoc.h:1210
TypeLoc getBaseLoc() const
Definition TypeLoc.h:1233
QualType getInnerType() const
Definition TypeLoc.h:1260
SourceLocation getProtocolLAngleLoc() const
Definition TypeLoc.h:1185
SourceLocation getTypeArgsRAngleLoc() const
Definition TypeLoc.h:1163
Represents an Objective-C protocol declaration.
Definition DeclObjC.h:2084
SourceLocation getLocation() const
Definition TypeLoc.h:2741
ObjCProtocolLoc(ObjCProtocolDecl *protocol, SourceLocation loc)
Definition TypeLoc.h:2738
ObjCProtocolDecl * getProtocol() const
Definition TypeLoc.h:2740
SourceRange getSourceRange() const LLVM_READONLY
The source range is just the protocol name.
Definition TypeLoc.h:2744
Represents the declaration of an Objective-C type parameter.
Definition DeclObjC.h:578
ProtocolLAngleLoc, ProtocolRAngleLoc, and the source locations for protocol qualifiers are stored aft...
Definition TypeLoc.h:895
unsigned getExtraLocalDataAlignment() const
Definition TypeLoc.h:964
ObjCTypeParamDecl * getDecl() const
Definition TypeLoc.h:902
SourceRange getLocalSourceRange() const
Definition TypeLoc.h:968
unsigned getNumProtocols() const
Definition TypeLoc.h:932
SourceLocation getNameLoc() const
Definition TypeLoc.h:904
ObjCProtocolDecl * getProtocol(unsigned i) const
Definition TypeLoc.h:946
SourceLocation getProtocolLoc(unsigned i) const
Definition TypeLoc.h:936
ArrayRef< SourceLocation > getProtocolLocs() const
Definition TypeLoc.h:951
void setProtocolLoc(unsigned i, SourceLocation Loc)
Definition TypeLoc.h:941
void setProtocolLAngleLoc(SourceLocation Loc)
Definition TypeLoc.h:918
unsigned getExtraLocalDataSize() const
Definition TypeLoc.h:957
void initializeLocal(ASTContext &Context, SourceLocation Loc)
Definition TypeLoc.cpp:553
SourceLocation getProtocolLAngleLoc() const
Definition TypeLoc.h:912
void setProtocolRAngleLoc(SourceLocation Loc)
Definition TypeLoc.h:928
void setNameLoc(SourceLocation Loc)
Definition TypeLoc.h:908
SourceLocation getProtocolRAngleLoc() const
Definition TypeLoc.h:922
SourceRange getLocalSourceRange() const
Definition TypeLoc.h:2608
void setEllipsisLoc(SourceLocation Loc)
Definition TypeLoc.h:2604
SourceLocation getEllipsisLoc() const
Definition TypeLoc.h:2600
TypeLoc getPatternLoc() const
Definition TypeLoc.h:2616
QualType getInnerType() const
Definition TypeLoc.h:2620
void initializeLocal(ASTContext &Context, SourceLocation Loc)
Definition TypeLoc.h:2612
SourceLocation getEllipsisLoc() const
Definition TypeLoc.h:2286
Expr * getIndexExpr() const
Definition TypeLoc.h:2283
TypeLoc getPatternLoc() const
Definition TypeLoc.h:2293
QualType getPattern() const
Definition TypeLoc.h:2284
QualType getInnerType() const
Definition TypeLoc.h:2295
SourceRange getLocalSourceRange() const
Definition TypeLoc.h:2297
void setEllipsisLoc(SourceLocation Loc)
Definition TypeLoc.h:2287
void initializeLocal(ASTContext &Context, SourceLocation Loc)
Definition TypeLoc.h:2289
void setRParenLoc(SourceLocation Loc)
Definition TypeLoc.h:1386
void initializeLocal(ASTContext &Context, SourceLocation Loc)
Definition TypeLoc.h:1394
SourceLocation getRParenLoc() const
Definition TypeLoc.h:1378
QualType getInnerType() const
Definition TypeLoc.h:1403
SourceLocation getLParenLoc() const
Definition TypeLoc.h:1374
SourceRange getLocalSourceRange() const
Definition TypeLoc.h:1390
TypeLoc getInnerLoc() const
Definition TypeLoc.h:1399
void setLParenLoc(SourceLocation Loc)
Definition TypeLoc.h:1382
QualType getInnerType() const
Definition TypeBase.h:3311
Represents a parameter to a function.
Definition Decl.h:1790
TypeLoc getValueLoc() const
Definition TypeLoc.h:2691
void initializeLocal(ASTContext &Context, SourceLocation Loc)
Definition TypeLoc.h:2698
QualType getInnerType() const
Definition TypeLoc.h:2702
void setKWLoc(SourceLocation Loc)
Definition TypeLoc.h:2696
SourceRange getLocalSourceRange() const
Definition TypeLoc.h:2693
SourceLocation getKWLoc() const
Definition TypeLoc.h:2695
QualType getElementType() const
Definition TypeBase.h:8107
A base class for.
Definition TypeLoc.h:1455
void initializeLocal(ASTContext &Context, SourceLocation Loc)
Definition TypeLoc.h:1473
SourceRange getLocalSourceRange() const
Definition TypeLoc.h:1469
void setSigilLoc(SourceLocation Loc)
Definition TypeLoc.h:1461
QualType getInnerType() const
Definition TypeLoc.h:1477
TypeLoc getPointeeLoc() const
Definition TypeLoc.h:1465
SourceLocation getSigilLoc() const
Definition TypeLoc.h:1457
Wrapper for source info for pointers.
Definition TypeLoc.h:1484
SourceLocation getStarLoc() const
Definition TypeLoc.h:1486
void setStarLoc(SourceLocation Loc)
Definition TypeLoc.h:1490
void initializeLocal(ASTContext &Context, SourceLocation loc)
Definition TypeLoc.h:2755
SourceRange getLocalSourceRange() const
Definition TypeLoc.h:2756
A (possibly-)qualified type.
Definition TypeBase.h:937
bool hasLocalQualifiers() const
Determine whether this particular QualType instance has any qualifiers, without looking through any t...
Definition TypeBase.h:1064
const Type * getTypePtr() const
Retrieves a pointer to the underlying (unqualified) type.
Definition TypeBase.h:8278
static QualType getFromOpaquePtr(const void *Ptr)
Definition TypeBase.h:986
Wrapper of type source information for a type with non-trivial direct qualifiers.
Definition TypeLoc.h:300
TypeLoc getNextTypeLoc() const
Definition TypeLoc.h:322
void initializeLocal(ASTContext &Context, SourceLocation Loc)
Initializes the local data of this type source info block to provide no information.
Definition TypeLoc.h:314
unsigned getLocalDataSize() const
Returns the size of the type source info data block that is specific to this type.
Definition TypeLoc.h:328
friend class TypeLoc
Definition TypeLoc.h:342
unsigned getLocalDataAlignment() const
Returns the alignment of the type source info data block that is specific to this type.
Definition TypeLoc.h:336
void copyLocal(TypeLoc other)
Definition TypeLoc.h:318
SourceRange getLocalSourceRange() const
Definition TypeLoc.h:302
UnqualTypeLoc getUnqualifiedLoc() const
Definition TypeLoc.h:304
void setAmpAmpLoc(SourceLocation Loc)
Definition TypeLoc.h:1599
SourceLocation getAmpAmpLoc() const
Definition TypeLoc.h:1595
Represents a struct/union/class.
Definition Decl.h:4312
Wrapper for source info for record types.
Definition TypeLoc.h:855
RecordDecl * getDecl() const
Definition TypeLoc.h:857
QualType getInnerType() const
Definition TypeLoc.h:1571
QualType getPointeeTypeAsWritten() const
Definition TypeBase.h:3589
Encodes a location in the source.
bool isValid() const
Return true if this is a valid SourceLocation object.
A trivial tuple used to represent a source range.
void setBegin(SourceLocation b)
SourceLocation getEnd() const
SourceLocation getBegin() const
void setEnd(SourceLocation e)
Wrapper for substituted template type parameters.
Definition TypeLoc.h:998
Abstract type representing delayed type pack expansions.
Definition TypeLoc.h:986
Wrapper for substituted template type parameters.
Definition TypeLoc.h:992
Wrapper for substituted template type parameters.
Definition TypeLoc.h:980
Represents the declaration of a struct/union/class/enum.
Definition Decl.h:3717
TagDecl * getDecl() const
Definition TypeLoc.h:796
SourceRange getLocalSourceRange() const
Definition TypeLoc.h:826
SourceLocation getNameLoc() const
Definition TypeLoc.h:822
SourceLocation getElaboratedKeywordLoc() const
Definition TypeLoc.h:801
NestedNameSpecifierLoc getQualifierLoc() const
Definition TypeLoc.h:809
void initializeLocal(ASTContext &Context, SourceLocation Loc)
Definition TypeLoc.h:836
void setQualifierLoc(NestedNameSpecifierLoc QualifierLoc)
Definition TypeLoc.h:816
void setNameLoc(SourceLocation Loc)
Definition TypeLoc.h:824
void setElaboratedKeywordLoc(SourceLocation Loc)
Definition TypeLoc.h:805
bool isDefinition() const
True if the tag was defined in this type specifier.
Definition TypeLoc.cpp:305
A convenient class for passing around template argument information.
Location wrapper for a TemplateArgument.
The base class of all kinds of template declarations (e.g., class, function, etc.).
static void initializeArgLocs(ASTContext &Context, ArrayRef< TemplateArgument > Args, TemplateArgumentLocInfo *ArgInfos, SourceLocation Loc)
Definition TypeLoc.cpp:714
SourceLocation getLAngleLoc() const
Definition TypeLoc.h:1878
TemplateArgumentLoc getArgLoc(unsigned i) const
Definition TypeLoc.h:1888
SourceRange getLocalSourceRange() const
Definition TypeLoc.h:1907
SourceLocation getRAngleLoc() const
Definition TypeLoc.h:1893
MutableArrayRef< TemplateArgumentLocInfo > getArgLocInfos()
Definition TypeLoc.h:1884
void set(SourceLocation ElaboratedKeywordLoc, NestedNameSpecifierLoc QualifierLoc, SourceLocation TemplateKeywordLoc, SourceLocation NameLoc, SourceLocation LAngleLoc, SourceLocation RAngleLoc)
Definition TypeLoc.cpp:644
SourceLocation getTemplateNameLoc() const
Definition TypeLoc.h:1876
void copy(TemplateSpecializationTypeLoc Loc)
Definition TypeLoc.h:1896
unsigned getExtraLocalDataAlignment() const
Definition TypeLoc.h:1920
SourceLocation getTemplateKeywordLoc() const
Definition TypeLoc.h:1872
NestedNameSpecifierLoc getQualifierLoc() const
Definition TypeLoc.h:1862
void initializeLocal(ASTContext &Context, SourceLocation Loc)
Definition TypeLoc.cpp:688
SourceLocation getElaboratedKeywordLoc() const
Definition TypeLoc.h:1858
unsigned getExtraLocalDataSize() const
Definition TypeLoc.h:1916
Declaration of a template type parameter.
Wrapper for template type parameters.
Definition TypeLoc.h:881
TemplateTypeParmDecl * getDecl() const
Definition TypeLoc.h:883
Base wrapper for a particular "section" of type source info.
Definition TypeLoc.h:59
SourceLocation findNullabilityLoc() const
Find the location of the nullability specifier (__nonnull, __nullable, or __null_unspecifier),...
Definition TypeLoc.cpp:441
TypeLoc()=default
UnqualTypeLoc getUnqualifiedLoc() const
Skips past any qualifiers, if this is qualified.
Definition TypeLoc.h:349
static unsigned getLocalAlignmentForType(QualType Ty)
Returns the alignment of type source info data block for the given type.
Definition TypeLoc.cpp:75
TypeLoc findExplicitQualifierLoc() const
Find a type with the location of an explicit type qualifier.
Definition TypeLoc.cpp:452
QualType getType() const
Get the type for which this source info wrapper provides information.
Definition TypeLoc.h:133
TypeLoc getNextTypeLoc() const
Get the next TypeLoc pointed by this TypeLoc, e.g for "int*" the TypeLoc is a PointerLoc and next Typ...
Definition TypeLoc.h:171
void dump() const
T getAs() const
Convert to the specified TypeLoc type, returning a null TypeLoc if this TypeLoc is not of the desired...
Definition TypeLoc.h:89
NestedNameSpecifierLoc getPrefix() const
If this type represents a qualified-id, this returns it's nested name specifier.
Definition TypeLoc.cpp:473
friend bool operator==(const TypeLoc &LHS, const TypeLoc &RHS)
Definition TypeLoc.h:234
TypeLoc IgnoreParens() const
Definition TypeLoc.h:1408
T castAs() const
Convert to the specified TypeLoc type, asserting that this TypeLoc is of the desired type.
Definition TypeLoc.h:78
TypeLoc(QualType ty, void *opaqueData)
Definition TypeLoc.h:68
void * Data
Definition TypeLoc.h:64
SourceLocation getNonElaboratedBeginLoc() const
This returns the position of the type after any elaboration, such as the 'struct' keyword.
Definition TypeLoc.cpp:496
void initializeFullCopy(TypeLoc Other)
Initializes this by copying its information from another TypeLoc of the same type.
Definition TypeLoc.h:217
SourceRange getSourceRange() const LLVM_READONLY
Get the full source range.
Definition TypeLoc.h:154
SourceRange getLocalSourceRange() const
Get the local source range.
Definition TypeLoc.h:160
void initializeFullCopy(TypeLoc Other, unsigned Size)
Initializes this by copying its information from another TypeLoc of the same type.
Definition TypeLoc.h:225
unsigned getFullDataSize() const
Returns the size of the type source info data block.
Definition TypeLoc.h:165
AutoTypeLoc getContainedAutoTypeLoc() const
Get the typeloc of an AutoType whose type will be deduced for a variable with an initializer of this ...
Definition TypeLoc.cpp:879
TypeLoc(const Type *ty, void *opaqueData)
Definition TypeLoc.h:70
void * getOpaqueData() const
Get the pointer where source information is stored.
Definition TypeLoc.h:143
TypeLocClass
The kinds of TypeLocs.
Definition TypeLoc.h:108
const void * Ty
Definition TypeLoc.h:63
SourceLocation getTemplateKeywordLoc() const
Get the SourceLocation of the template keyword (if any).
Definition TypeLoc.cpp:886
void copy(TypeLoc other)
Copies the other type loc into this one.
Definition TypeLoc.cpp:169
TypeLocClass getTypeLocClass() const
Definition TypeLoc.h:116
static unsigned getFullDataSizeForType(QualType Ty)
Returns the size of type source info data block for the given type.
Definition TypeLoc.cpp:95
void initialize(ASTContext &Context, SourceLocation Loc) const
Initializes this to state that every location in this type is the given location.
Definition TypeLoc.h:211
bool isNull() const
Definition TypeLoc.h:121
SourceLocation getEndLoc() const
Get the end source location.
Definition TypeLoc.cpp:227
T getAsAdjusted() const
Convert to the specified TypeLoc type, returning a null TypeLoc if this TypeLoc is not of the desired...
Definition TypeLoc.h:2706
friend bool operator!=(const TypeLoc &LHS, const TypeLoc &RHS)
Definition TypeLoc.h:238
SourceLocation getBeginLoc() const
Get the begin source location.
Definition TypeLoc.cpp:193
const Type * getTypePtr() const
Definition TypeLoc.h:137
SourceRange getLocalSourceRange() const
Definition TypeLoc.cpp:312
Expr * getUnderlyingExpr() const
Definition TypeLoc.h:2215
Expr * getUnderlyingExpr() const
Definition TypeBase.h:6176
void initializeLocal(ASTContext &Context, SourceLocation Loc)
Definition TypeLoc.cpp:601
void setUnmodifiedTInfo(TypeSourceInfo *TI) const
Definition TypeLoc.h:2236
TypeSourceInfo * getUnmodifiedTInfo() const
Definition TypeLoc.h:2232
QualType getUnmodifiedType() const
Definition TypeLoc.h:2228
A container of type source information.
Definition TypeBase.h:8249
TypeLoc getTypeLoc() const
Return the TypeLoc wrapper for the type source info.
Definition TypeLoc.h:267
A reasonable base class for TypeLocs that correspond to types that are written as a type-specifier.
Definition TypeLoc.h:540
void initializeLocal(ASTContext &Context, SourceLocation Loc)
Definition TypeLoc.h:559
friend class TypeLoc
Definition TypeLoc.h:564
SourceLocation getNameLoc() const
Definition TypeLoc.h:547
void setNameLoc(SourceLocation Loc)
Definition TypeLoc.h:551
SourceRange getLocalSourceRange() const
Definition TypeLoc.h:555
The base class of the type hierarchy.
Definition TypeBase.h:1833
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.
Definition Type.cpp:752
TypeClass getTypeClass() const
Definition TypeBase.h:2385
Wrapper for source info for typedefs.
Definition TypeLoc.h:777
void setParensRange(SourceRange range)
Definition TypeLoc.h:2195
SourceRange getLocalSourceRange() const
Definition TypeLoc.h:2200
SourceLocation getLParenLoc() const
Definition TypeLoc.h:2175
SourceLocation getRParenLoc() const
Definition TypeLoc.h:2183
SourceRange getParensRange() const
Definition TypeLoc.h:2191
void setLParenLoc(SourceLocation Loc)
Definition TypeLoc.h:2179
SourceLocation getTypeofLoc() const
Definition TypeLoc.h:2167
void setTypeofLoc(SourceLocation Loc)
Definition TypeLoc.h:2171
void setRParenLoc(SourceLocation Loc)
Definition TypeLoc.h:2187
void initializeLocal(ASTContext &Context, SourceLocation Loc)
Definition TypeLoc.h:2204
void setRParenLoc(SourceLocation Loc)
Definition TypeLoc.h:2321
void setParensRange(SourceRange Range)
Definition TypeLoc.h:2339
void initializeLocal(ASTContext &Context, SourceLocation Loc)
Definition TypeLoc.cpp:609
SourceRange getLocalSourceRange() const
Definition TypeLoc.h:2331
void setKWLoc(SourceLocation Loc)
Definition TypeLoc.h:2315
SourceLocation getKWLoc() const
Definition TypeLoc.h:2314
SourceLocation getRParenLoc() const
Definition TypeLoc.h:2320
TypeSourceInfo * getUnderlyingTInfo() const
Definition TypeLoc.h:2323
SourceRange getParensRange() const
Definition TypeLoc.h:2335
void setUnderlyingTInfo(TypeSourceInfo *TInfo)
Definition TypeLoc.h:2327
void setLParenLoc(SourceLocation Loc)
Definition TypeLoc.h:2318
SourceLocation getLParenLoc() const
Definition TypeLoc.h:2317
Wrapper of type source information for a type with no direct qualifiers.
Definition TypeLoc.h:274
TypeLocClass getTypeLocClass() const
Definition TypeLoc.h:283
UnqualTypeLoc(const Type *Ty, void *Data)
Definition TypeLoc.h:277
friend class TypeLoc
Definition TypeLoc.h:288
const Type * getTypePtr() const
Definition TypeLoc.h:279
Wrapper for source info for unresolved typename using decls.
Definition TypeLoc.h:782
Represents a dependent using declaration which was marked with typename.
Definition DeclCXX.h:4037
Wrapper for source info for types used via transparent aliases.
Definition TypeLoc.h:785
TypeLoc getElementLoc() const
Definition TypeLoc.h:2026
void setNameLoc(SourceLocation Loc)
Definition TypeLoc.h:2016
void initializeLocal(ASTContext &Context, SourceLocation Loc)
Definition TypeLoc.h:2022
SourceRange getLocalSourceRange() const
Definition TypeLoc.h:2018
QualType getInnerType() const
Definition TypeLoc.h:2028
SourceLocation getNameLoc() const
Definition TypeLoc.h:2014
QualType getElementType() const
Definition TypeBase.h:4189
#define bool
Definition gpuintrin.h:32
The JSON file list parser is used to communicate input to InstallAPI.
TypeSpecifierType
Specifies the kind of type.
Definition Specifiers.h:55
@ TST_unspecified
Definition Specifiers.h:56
bool isa(CodeGen::Address addr)
Definition Address.h:330
AutoTypeKeyword
Which keyword(s) were used to create an AutoType.
Definition TypeBase.h:1792
const FunctionProtoType * T
@ Keyword
The name has been typo-corrected to a keyword.
Definition Sema.h:560
TypeSpecifierWidth
Specifies the width of a type, e.g., short, long, or long long.
Definition Specifiers.h:47
TypeSpecifierSign
Specifies the signedness of a type, e.g., signed or unsigned.
Definition Specifiers.h:50
U cast(CodeGen::Address addr)
Definition Address.h:327
@ None
The alignment was not explicit in code.
Definition ASTContext.h:178
ElaboratedTypeKeyword
The elaboration keyword that precedes a qualified type name or introduces an elaborated-type-specifie...
Definition TypeBase.h:5853
@ None
No keyword precedes the qualified type name.
Definition TypeBase.h:5874
@ Other
Other implicit parameter.
Definition Decl.h:1746
__UINTPTR_TYPE__ uintptr_t
An unsigned integer type with the property that any valid pointer to void can be converted to this ty...
SourceLocation LBracketLoc
Definition TypeLoc.h:1740
SourceLocation RBracketLoc
Definition TypeLoc.h:1740
SourceLocation KWLoc
Definition TypeLoc.h:2626
SourceLocation RParenLoc
Definition TypeLoc.h:2626
SourceLocation LParenLoc
Definition TypeLoc.h:2626
const Attr * TypeAttr
Definition TypeLoc.h:1001
ConceptReference * CR
Definition TypeLoc.h:2355
SourceLocation RParenLoc
Definition TypeLoc.h:2353
SourceRange BuiltinRange
Definition TypeLoc.h:570
DeclarationNameInfo - A collector data type for bundling together a DeclarationName and the correspon...
SourceLocation RParenLoc
Definition TypeLoc.h:2250
SourceLocation DecltypeLoc
Definition TypeLoc.h:2249
void * QualifierData
Data associated with the nested-name-specifier location.
Definition TypeLoc.h:2471
SourceLocation ElaboratedKWLoc
Definition TypeLoc.h:2531
void * QualifierData
Data associated with the nested-name-specifier location.
Definition TypeLoc.h:2534
ElaboratedNameLocInfo(SourceLocation ElaboratedKeywordLoc, NestedNameSpecifierLoc QualifierLoc, SourceLocation NameLoc)
Definition TypeLoc.h:697
SourceLocation ElaboratedKeywordLoc
Definition TypeLoc.h:694
SourceRange getLocalSourceRange(NestedNameSpecifier Qualifier) const
Definition TypeLoc.h:714
ElaboratedNameLocInfo(ASTContext &Context, ElaboratedTypeKeyword Keyword, NestedNameSpecifier Qualifier, SourceLocation Loc)
Definition TypeLoc.h:702
NestedNameSpecifierLoc getQualifierLoc(NestedNameSpecifier Qualifier) const
Definition TypeLoc.h:709
SourceLocation LParenLoc
Definition TypeLoc.h:1606
SourceLocation RParenLoc
Definition TypeLoc.h:1607
SourceLocation LocalRangeEnd
Definition TypeLoc.h:1608
SourceLocation LocalRangeBegin
Definition TypeLoc.h:1605
SourceLocation ExpansionLoc
Definition TypeLoc.h:1333
SourceLocation AttrLoc
Definition TypeLoc.h:2083
SourceRange OperandParens
Definition TypeLoc.h:2084
SourceLocation NameEndLoc
Definition TypeLoc.h:1267
SourceLocation TypeArgsLAngleLoc
Definition TypeLoc.h:1127
SourceLocation ProtocolLAngleLoc
Definition TypeLoc.h:1129
SourceLocation TypeArgsRAngleLoc
Definition TypeLoc.h:1128
SourceLocation ProtocolRAngleLoc
Definition TypeLoc.h:1130
SourceLocation LParenLoc
Definition TypeLoc.h:1366
SourceLocation RParenLoc
Definition TypeLoc.h:1367
SourceLocation KWLoc
Definition TypeLoc.h:2685
SourceLocation StarLoc
Definition TypeLoc.h:1449
SourceLocation NameLoc
Definition TypeLoc.h:788
SourceLocation ElaboratedKWLoc
Definition TypeLoc.h:789
Location information for a TemplateArgument.
SourceLocation NameLoc
Definition TypeLoc.h:1831
TypeSourceInfo * UnmodifiedTInfo
Definition TypeLoc.h:2160
SourceLocation NameLoc
Definition TypeLoc.h:532
SourceLocation RParenLoc
Definition TypeLoc.h:2153
SourceLocation LParenLoc
Definition TypeLoc.h:2152
SourceLocation TypeofLoc
Definition TypeLoc.h:2151
TypeSourceInfo * UnderlyingTInfo
Definition TypeLoc.h:2306
SourceLocation NameLoc
Definition TypeLoc.h:2008
Structure that packs information about the type specifiers that were written in a particular type spe...
Definition Specifiers.h:109