20#include "llvm/Support/ErrorHandling.h"
21#include "llvm/Support/raw_ostream.h"
25 llvm::function_ref<
bool(
const APValue &)> Visitor) {
44 for (
unsigned I = 0, N =
Value.getVectorLength(); I != N; ++I)
50 for (
unsigned I = 0, N =
Value.getMatrixNumElements(); I != N; ++I)
56 for (
unsigned I = 0, N =
Value.getArrayInitializedElts(); I != N; ++I)
59 return !
Value.hasArrayFiller() ||
63 for (
unsigned I = 0, N =
Value.getStructNumBases(); I != N; ++I)
66 for (
unsigned I = 0, N =
Value.getStructNumFields(); I != N; ++I)
69 for (
unsigned I = 0, N =
Value.getStructNumVirtualBases(); I != N; ++I)
75 return !
Value.getUnionField() ||
78 llvm_unreachable(
"unknown APValue kind");
88 : T(T->getCanonicalTypeUnqualified().getTypePtr()) {}
100 "Type is insufficiently aligned");
111 Base.DynamicAllocType =
Type.getAsOpaquePtr();
134 Redecl = cast_or_null<ValueDecl>(Redecl->getPreviousDecl())) {
136 if (!
T->isIncompleteArrayType())
153 llvm::dyn_cast<MaterializeTemporaryExpr>(
Base)) {
156 const Expr *Temp = MTE->getSubExpr();
161 if (!Adjustments.empty())
165 return Base->getType();
188 ID.AddPointer(Ptr.getOpaqueValue());
191 ID.AddInteger(
Local.CallIndex);
192 ID.AddInteger(
Local.Version);
198 if (LHS.Ptr != RHS.Ptr)
202 return LHS.
Local.CallIndex == RHS.
Local.CallIndex &&
208 if (
const Decl *D = BaseOrMember.getPointer())
209 BaseOrMember.setPointer(D->getCanonicalDecl());
210 Value =
reinterpret_cast<uintptr_t>(BaseOrMember.getOpaqueValue());
214 ID.AddInteger(Value);
219 : Ty((const void *)ElemTy.getTypePtrOrNull()),
Path(
Path) {}
231 bool IsOnePastTheEnd : 1;
236 return Ptr.getOpaqueValue();
243APValue::LValueBase::operator
bool ()
const {
244 return static_cast<bool>(Ptr);
251 return llvm::hash_combine(
Base.getOpaqueValue(),
Base.getCallIndex(),
256unsigned llvm::DenseMapInfo<clang::APValue::LValueBase>::getHashValue(
261bool llvm::DenseMapInfo<clang::APValue::LValueBase>::isEqual(
283 if (Length == PathLength)
302 struct MemberPointerBase {
303 llvm::PointerIntPair<const ValueDecl*, 1, bool> MemberAndIsDerivedMember;
310 (DataSize -
sizeof(MemberPointerBase)) /
sizeof(
const CXXRecordDecl*);
321 if (Length == PathLength)
340APValue::Arr::Arr(
unsigned NumElts,
unsigned Size) :
341 Elts(new
APValue[NumElts + (NumElts != Size ? 1 : 0)]),
342 NumElts(NumElts), ArrSize(Size) {}
343APValue::Arr::~Arr() {
delete [] Elts; }
345APValue::StructData::StructData(
unsigned NumBases,
unsigned NumFields,
346 unsigned NumVirtualBases)
347 : Elts(new
APValue[NumBases + NumFields + NumVirtualBases]),
348 NumBases(NumBases), NumFields(NumFields),
349 NumVirtualBases(NumVirtualBases) {}
351APValue::StructData::~StructData() {
356APValue::UnionData::~UnionData () {
361 : Kind(
None), AllowConstexprUnknown(RHS.AllowConstexprUnknown) {
365 Kind = RHS.getKind();
368 MakeInt(RHS.getInt());
371 MakeFloat(RHS.getFloat());
374 APFixedPoint FXCopy = RHS.getFixedPoint();
375 MakeFixedPoint(std::move(FXCopy));
380 setVector(((
const Vec *)(
const char *)&RHS.Data)->Elts,
385 setMatrix(((
const Mat *)(
const char *)&RHS.Data)->Elts,
443 : Kind(RHS.Kind), AllowConstexprUnknown(RHS.AllowConstexprUnknown),
458 DestroyDataAndMakeUninit();
461 AllowConstexprUnknown = RHS.AllowConstexprUnknown;
467void APValue::DestroyDataAndMakeUninit() {
469 ((APSInt *)(
char *)&
Data)->~APSInt();
470 else if (Kind ==
Float)
471 ((APFloat *)(
char *)&
Data)->~APFloat();
473 ((APFixedPoint *)(
char *)&
Data)->~APFixedPoint();
475 ((Vec *)(
char *)&
Data)->~Vec();
477 ((Mat *)(
char *)&
Data)->~Mat();
479 ((ComplexAPSInt *)(
char *)&
Data)->~ComplexAPSInt();
481 ((ComplexAPFloat *)(
char *)&
Data)->~ComplexAPFloat();
482 else if (Kind == LValue)
483 ((LV *)(
char *)&
Data)->~LV();
484 else if (Kind == Array)
485 ((Arr *)(
char *)&
Data)->~Arr();
487 ((StructData *)(
char *)&
Data)->~StructData();
488 else if (Kind ==
Union)
489 ((UnionData *)(
char *)&
Data)->~UnionData();
490 else if (Kind == MemberPointer)
491 ((MemberPointerData *)(
char *)&
Data)->~MemberPointerData();
493 ((AddrLabelDiffData *)(
char *)&
Data)->~AddrLabelDiffData();
495 ((ReflectionData *)(
char *)&
Data)->~ReflectionData();
497 AllowConstexprUnknown =
false;
514 return getInt().needsCleanup();
522 "In _Complex float types, real and imaginary values always have the "
528 "In _Complex int types, real and imaginary values must have the "
532 return reinterpret_cast<const LV *
>(&Data)->hasPathPtr();
536 llvm_unreachable(
"Unknown APValue kind!");
540 std::swap(Kind, RHS.Kind);
541 std::swap(Data, RHS.Data);
543 bool tmp = AllowConstexprUnknown;
544 AllowConstexprUnknown = RHS.AllowConstexprUnknown;
545 RHS.AllowConstexprUnknown = tmp;
550 for (
unsigned I = 0, N =
V.getBitWidth(); I < N; I += 32)
551 ID.AddInteger((
uint32_t)
V.extractBitsAsZExtValue(std::min(32u, N - I), I));
561 ID.AddPointer(TDT->getDecl()->getCanonicalDecl());
566 ID.AddBoolean(
false);
571 ID.AddInteger(
static_cast<int>(
V.getReflectionOperandKind()));
572 switch (
V.getReflectionOperandKind()) {
582 assert(
false &&
"unknown or unimplemented reflection entities");
633 llvm::FoldingSetNodeID FillerID;
637 ID.AddNodeID(FillerID);
648 ID.AddInteger(NumFillers);
655 llvm::FoldingSetNodeID ElemID;
657 if (ElemID != FillerID) {
658 ID.AddInteger(NumFillers);
659 ID.AddNodeID(ElemID);
736 llvm_unreachable(
"Unknown APValue kind!");
742 V.convert(llvm::APFloat::IEEEdouble(), llvm::APFloat::rmNearestTiesToEven,
744 return V.convertToDouble();
759 if (!
Inits.back().isInt() || !
Inits.back().getInt().isZero())
768 constexpr size_t MaxN = 36;
773 Inits.take_front(std::min(MaxN - Ellipsis.size() / 2,
Inits.size()));
776 for (
auto &Val :
Inits) {
779 int64_t Char64 = Val.getInt().getExtValue();
782 auto Ch =
static_cast<unsigned char>(Char64);
785 if (Escaped.empty()) {
788 Buf.emplace_back(Ch);
794 Buf.append(Ellipsis);
825 Ty = AT->getValueType();
829 Out <<
"<out of lifetime>";
832 Out <<
"<uninitialized>";
836 Out << (
getInt().getBoolValue() ?
"true" :
"false");
859 QualType ElemTy = MT->getElementType();
892 Out << (Policy.
Nullptr ?
"nullptr" :
"0");
893 }
else if (IsReference) {
894 Out <<
"*(" << InnerTy.
stream(Policy) <<
"*)"
897 Out <<
"(" << Ty.
stream(Policy) <<
")"
917 }
else if (!IsReference) {
924 TI.print(Out, Policy);
927 <<
Base.getDynamicAllocType().stream(Policy) <<
"#"
928 << DA.getIndex() <<
"}";
930 assert(
Base.get<
const Expr *>() !=
nullptr &&
931 "Expecting non-null Expr");
936 Out <<
" + " << (O / S);
953 TI.print(Out, Policy);
955 Out <<
"{*new " <<
Base.getDynamicAllocType().stream(Policy) <<
"#"
956 << DA.getIndex() <<
"}";
959 assert(E !=
nullptr &&
"Expecting non-null Expr");
965 for (
unsigned I = 0, N = Path.size(); I != N; ++I) {
969 const Decl *BaseOrMember = Path[I].getAsBaseOrMember().getPointer();
970 if (
const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(BaseOrMember)) {
978 Out << *CastToBase <<
"::";
984 Out << (Path[I].getAsArrayIndex() == 0 ?
".real" :
".imag");
988 Out <<
'[' << Path[I].getAsArrayIndex() <<
']';
1014 for (; I != N; ++I) {
1030 llvm::ListSeparator Comma;
1035 for (
unsigned I = 0; I != N; ++I, ++BI) {
1041 for (
const auto *FI : RD->fields()) {
1043 if (FI->isUnnamedBitField())
1051 for (
unsigned I = 0; I != N; ++I, ++BI) {
1063 Out <<
"." << *FD <<
" = ";
1072 Out << '&' << *cast<CXXRecordDecl>(VD->getDeclContext()) <<
"::" << *VD;
1085 Out <<
"std::meta::info{}";
1090 Out <<
"^^" << TInfo->getType().stream(Policy);
1096 llvm_unreachable(
"Unknown APValue kind!");
1101 llvm::raw_string_ostream Out(
Result);
1127 assert(
isLValue() &&
"Invalid accessor");
1128 return ((
const LV *)(
const void *)&Data)->Base;
1132 assert(
isLValue() &&
"Invalid accessor");
1133 return ((
const LV *)(
const void *)&Data)->IsOnePastTheEnd;
1137 assert(
isLValue() &&
"Invalid accessor");
1138 return ((
LV *)(
void *)&Data)->Offset;
1142 assert(
isLValue() &&
"Invalid accessor");
1143 return ((
const LV *)(
const char *)&Data)->hasPath();
1148 const LV &LVal = *((
const LV *)(
const char *)&Data);
1149 return {LVal.
getPath(), LVal.PathLength};
1153 assert(
isLValue() &&
"Invalid accessor");
1154 return ((
const LV *)(
const char *)&Data)->Base.getCallIndex();
1158 assert(
isLValue() &&
"Invalid accessor");
1159 return ((
const LV *)(
const char *)&Data)->Base.getVersion();
1163 assert(
isLValue() &&
"Invalid usage");
1164 return ((
const LV *)(
const char *)&Data)->IsNullPtr;
1169 assert(
isLValue() &&
"Invalid accessor");
1170 LV &LVal = *((
LV *)(
char *)&Data);
1172 LVal.IsOnePastTheEnd =
false;
1175 LVal.IsNullPtr = IsNullPtr;
1179APValue::setLValueUninit(LValueBase B,
CharUnits O,
unsigned Size,
1180 bool IsOnePastTheEnd,
bool IsNullPtr) {
1181 assert(
isLValue() &&
"Invalid accessor");
1182 LV &LVal = *((LV *)(
char *)&
Data);
1184 LVal.IsOnePastTheEnd = IsOnePastTheEnd;
1186 LVal.IsNullPtr = IsNullPtr;
1187 LVal.resizePath(Size);
1188 return {LVal.getPath(), Size};
1195 setLValueUninit(B, O, Path.size(), IsOnePastTheEnd, IsNullPtr);
1197 memcpy(InternalPath.data(), Path.data(),
1203 assert(
isUnion() &&
"Invalid accessor");
1204 ((UnionData *)(
char *)&Data)->Field =
1205 Field ? Field->getCanonicalDecl() :
nullptr;
1206 *((UnionData *)(
char *)&Data)->Value =
Value;
1213 return MPD.MemberAndIsDerivedMember.getPointer();
1220 return MPD.MemberAndIsDerivedMember.getInt();
1227 return {MPD.
getPath(), MPD.PathLength};
1230void APValue::MakeLValue() {
1231 assert(
isAbsent() &&
"Bad state change");
1232 static_assert(
sizeof(LV) <= DataSize,
"LV too big");
1233 new ((
void *)(
char *)&
Data) LV();
1237void APValue::MakeArray(
unsigned InitElts,
unsigned Size) {
1238 assert(
isAbsent() &&
"Bad state change");
1239 new ((
void *)(
char *)&
Data) Arr(InitElts, Size);
1244APValue::setMemberPointerUninit(
const ValueDecl *
Member,
bool IsDerivedMember,
1246 assert(
isAbsent() &&
"Bad state change");
1249 MPD->MemberAndIsDerivedMember.setPointer(
1251 MPD->MemberAndIsDerivedMember.setInt(IsDerivedMember);
1252 MPD->resizePath(Size);
1253 return {MPD->getPath(), MPD->PathLength};
1256void APValue::MakeMemberPointer(
const ValueDecl *
Member,
bool IsDerivedMember,
1258 MutableArrayRef<const CXXRecordDecl *> InternalPath =
1259 setMemberPointerUninit(
Member, IsDerivedMember, Path.size());
1260 for (
unsigned I = 0; I != Path.size(); ++I)
1268 auto MergeLV = [&](LinkageInfo MergeLV) { LV.
merge(MergeLV); };
1270 switch (
Value.getKind()) {
1278 if (!
Value.getLValueBase()) {
1280 }
else if (
const auto *VD =
1281 Value.getLValueBase().dyn_cast<
const ValueDecl *>()) {
1283 }
else if (
const auto TI =
1284 Value.getLValueBase().dyn_cast<TypeInfoLValue>()) {
1285 MergeLV(getLVForType(*TI.getType(), computation));
1286 }
else if (
const Expr *E =
1287 Value.getLValueBase().dyn_cast<
const Expr *>()) {
1294 auto *MTE = dyn_cast<MaterializeTemporaryExpr>(E);
1298 MergeLV(
getLVForDecl(MTE->getExtendingDecl(), computation));
1300 assert(
Value.getLValueBase().is<DynamicAllocLValue>() &&
1301 "unexpected LValueBase kind");
1309 if (
const NamedDecl *D =
Value.getMemberPointerDecl())
static double GetApproxValue(const llvm::APFloat &F)
static bool visitAPValue(const APValue &Value, llvm::function_ref< bool(const APValue &)> Visitor)
static void profileIntValue(llvm::FoldingSetNodeID &ID, const llvm::APInt &V)
Profile the value of an APInt, excluding its bit-width.
static void profileReflection(llvm::FoldingSetNodeID &ID, APValue V)
static void profileTypeReflection(llvm::FoldingSetNodeID &ID, QualType QT)
Unwrap reflected type for profiling.
static bool TryPrintAsStringLiteral(raw_ostream &Out, const PrintingPolicy &Policy, const ArrayType *ATy, ArrayRef< APValue > Inits)
Defines the clang::ASTContext interface.
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
Defines the clang::Expr interface and subclasses for C++ expressions.
static const Decl * getCanonicalDecl(const Decl *D)
C Language Family Type Representation.
__DEVICE__ void * memcpy(void *__a, const void *__b, size_t __c)
void Profile(llvm::FoldingSetNodeID &ID) const
unsigned getVersion() const
QualType getDynamicAllocType() const
QualType getTypeInfoType() const
void * DynamicAllocType
The QualType, if this is a DynamicAllocLValue.
static LValueBase getTypeInfo(TypeInfoLValue LV, QualType TypeInfo)
static LValueBase getDynamicAlloc(DynamicAllocLValue LV, QualType Type)
void * TypeInfoType
The type std::type_info, if this is a TypeInfoLValue.
void * getOpaqueValue() const
unsigned getCallIndex() const
A non-discriminated union of a base, field, or array index.
void Profile(llvm::FoldingSetNodeID &ID) const
ArrayRef< LValuePathEntry > Path
LValuePathSerializationHelper(ArrayRef< LValuePathEntry >, QualType)
APValue - This class implements a discriminated union of [uninitialized] [APSInt] [APFloat],...
bool hasArrayFiller() const
const LValueBase getLValueBase() const
APValue & getArrayInitializedElt(unsigned I)
ArrayRef< LValuePathEntry > getLValuePath() const
void swap(APValue &RHS)
Swaps the contents of this and the given APValue.
const void * getReflectionOpaqueOperand() const
APValue & getStructField(unsigned i)
unsigned getMatrixNumColumns() const
const FieldDecl * getUnionField() const
APSInt & getComplexIntImag()
unsigned getStructNumFields() const
llvm::PointerIntPair< const Decl *, 1, bool > BaseOrMemberType
A FieldDecl or CXXRecordDecl, along with a flag indicating whether we mean a virtual or non-virtual b...
ValueKind getKind() const
ReflectionKind getReflectionOperandKind() const
bool isLValueOnePastTheEnd() const
APValue & getStructVirtualBase(unsigned i)
unsigned getLValueVersion() const
bool isMemberPointerToDerivedMember() const
unsigned getArrayInitializedElts() const
void setLValue(LValueBase B, CharUnits O, NoLValuePath, bool IsNullPtr)
void setComplexInt(APSInt R, APSInt I)
void Profile(llvm::FoldingSetNodeID &ID) const
profile this value.
unsigned getStructNumBases() const
APFixedPoint & getFixedPoint()
bool needsCleanup() const
Returns whether the object performed allocations.
unsigned getStructNumVirtualBases() const
bool hasLValuePath() const
const ValueDecl * getMemberPointerDecl() const
APValue & getUnionValue()
void setMatrix(const APValue *E, unsigned NumRows, unsigned NumCols)
const AddrLabelExpr * getAddrLabelDiffRHS() const
CharUnits & getLValueOffset()
void printPretty(raw_ostream &OS, const ASTContext &Ctx, QualType Ty) const
void setAddrLabelDiff(const AddrLabelExpr *LHSExpr, const AddrLabelExpr *RHSExpr)
void setComplexFloat(APFloat R, APFloat I)
APValue & getVectorElt(unsigned I)
APValue & getArrayFiller()
void visit(llvm::function_ref< bool(const APValue &)> Visitor) const
Visit this value and every recursively nested value.
unsigned getVectorLength() const
void setUnion(const FieldDecl *Field, const APValue &Value)
unsigned getMatrixNumRows() const
ArrayRef< const CXXRecordDecl * > getMemberPointerPath() const
bool isMemberPointer() const
unsigned getArraySize() const
bool toIntegralConstant(APSInt &Result, QualType SrcTy, const ASTContext &Ctx) const
Try to convert this value to an integral constant.
std::string getAsString(const ASTContext &Ctx, QualType Ty) const
APValue & operator=(const APValue &RHS)
unsigned getLValueCallIndex() const
void setVector(const APValue *E, unsigned N)
APValue & getMatrixElt(unsigned Idx)
@ Indeterminate
This object has an indeterminate value (C++ [basic.indet]).
@ None
There is no such object (it's outside its lifetime).
bool isNullPointer() const
APSInt & getComplexIntReal()
APFloat & getComplexFloatImag()
APFloat & getComplexFloatReal()
APValue & getStructBase(unsigned i)
const AddrLabelExpr * getAddrLabelDiffLHS() const
APValue()
Creates an empty APValue of type None.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
uint64_t getTargetNullPointerValue(QualType QT) const
Get target-dependent integer value for null pointer which is used for constant folding.
const clang::PrintingPolicy & getPrintingPolicy() const
llvm::APSInt MakeIntValue(uint64_t Value, QualType Type) const
Make an APSInt of the appropriate width and signedness for the given Value and integer Type.
std::optional< CharUnits > getTypeSizeInCharsIfKnown(QualType Ty) const
LabelDecl * getLabel() const
Represents an array type, per C99 6.7.5.2 - Array Declarators.
QualType getElementType() const
QualType getType() const
Retrieves the type of the base class.
Represents a C++ struct/union/class.
base_class_iterator bases_end()
base_class_iterator bases_begin()
const CXXBaseSpecifier * base_class_const_iterator
Iterator that traverses the base classes of a class.
base_class_iterator vbases_begin()
base_class_iterator vbases_end()
This is an opaque type for sizes expressed in character units.
bool isZero() const
Test whether the quantity equals zero.
QuantityType getQuantity() const
Get the raw integer representation of this quantity.
static CharUnits One()
Construct a CharUnits quantity of one.
bool isMultipleOf(CharUnits N) const
Test whether this is a multiple of the other value.
static CharUnits Zero()
Construct a CharUnits quantity of zero.
Complex values, per C99 6.2.5p11.
Represents a concrete matrix type with constant number of rows and columns.
Decl - This represents one declaration (or definition), e.g.
Symbolic representation of a dynamic allocation.
This represents one expression.
const Expr * skipRValueSubobjectAdjustments(SmallVectorImpl< const Expr * > &CommaLHS, SmallVectorImpl< SubobjectAdjustment > &Adjustments) const
Walk outwards from an expression we want to bind a reference to and find the expression whose lifetim...
Represents a member of a struct/union/class.
LinkageInfo getLVForDecl(const NamedDecl *D, LVComputationKind computation)
getLVForDecl - Get the linkage and visibility for the given declaration.
static LinkageInfo external()
Linkage getLinkage() const
static LinkageInfo internal()
void merge(LinkageInfo other)
Merge both linkage and visibility.
Represents a prvalue temporary that is written into memory so that a reference can bind to it.
StringRef getName() const
Get the name of identifier for this declaration as a StringRef.
A (possibly-)qualified type.
void Profile(llvm::FoldingSetNodeID &ID) const
bool isNull() const
Return true if this QualType doesn't point to a type yet.
static QualType getFromOpaquePtr(const void *Ptr)
void print(raw_ostream &OS, const PrintingPolicy &Policy, const Twine &PlaceHolder=Twine(), unsigned Indentation=0) const
QualType getNonReferenceType() const
If Type is a reference type (e.g., const int&), returns the type that the reference refers to ("const...
QualType getCanonicalType() const
StreamedQualTypeHelper stream(const PrintingPolicy &Policy, const Twine &PlaceHolder=Twine(), unsigned Indentation=0) const
void printPretty(raw_ostream &OS, PrinterHelper *Helper, const PrintingPolicy &Policy, unsigned Indentation=0, StringRef NewlineSymbol="\n", const ASTContext *Context=nullptr) const
Symbolic representation of typeid(T) for some type T.
const Type * getType() const
void print(llvm::raw_ostream &Out, const PrintingPolicy &Policy) const
A container of type source information.
QualType getType() const
Return the type wrapped by this type source info.
The base class of the type hierarchy.
bool isBooleanType() const
const ArrayType * castAsArrayTypeUnsafe() const
A variant of castAs<> for array type which silently discards qualifiers from the outermost type.
const T * castAs() const
Member-template castAs<specific type>.
bool isReferenceType() const
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.
bool isAnyCharacterType() const
Determine whether this type is any of the built-in character types.
RecordDecl * castAsRecordDecl() const
bool isChar16Type() const
bool isAnyComplexType() const
bool isChar32Type() const
bool isWideCharType() const
const T * getAs() const
Member-template getAs<specific type>'.
bool isRecordType() const
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
Represents a GCC generic vector type.
Top level wrappers for InstallAPI frontend operations.
LLVM_READNONE bool isASCII(char c)
Returns true if a byte is an ASCII character.
LLVM_READONLY bool isPrintable(unsigned char c)
Return true if this character is an ASCII printable character; that is, a character that should take ...
LLVM_READONLY auto escapeCStyle(CharT Ch) -> StringRef
Return C-style escaped string for special characters, or an empty string if there is no such mapping.
@ Vector
'vector' clause, allowed on 'loop', Combined, and 'routine' directives.
bool operator==(const CallGraphNode::CallRecord &LHS, const CallGraphNode::CallRecord &RHS)
nullptr
This class represents a compute construct, representing a 'Kind' of ‘parallel’, 'serial',...
@ Internal
Internal linkage, which indicates that the entity can be referred to from within the translation unit...
@ SD_FullExpression
Full-expression storage duration (for temporaries).
@ Result
The result type of a method or function.
const FunctionProtoType * T
llvm::hash_code hash_value(const CustomizableOptional< T > &O)
U cast(CodeGen::Address addr)
@ Struct
The "struct" keyword introduces the elaborated-type-specifier.
@ Union
The "union" keyword introduces the elaborated-type-specifier.
bool isTypeAliasAsReflectionName(QualType QT)
[expr.reflect] p5, if a reflect-expression R matches the form ^^reflection-name it is interpreted as ...
hash_code hash_value(const clang::dependencies::ModuleID &ID)
__UINTPTR_TYPE__ uintptr_t
An unsigned integer type with the property that any valid pointer to void can be converted to this ty...
LValuePathEntry Path[InlinePathSpace]
void resizePath(unsigned Length)
LValuePathEntry * PathPtr
static const unsigned InlinePathSpace
const LValuePathEntry * getPath() const
LValuePathEntry * getPath()
PathElem Path[InlinePathSpace]
static const unsigned InlinePathSpace
const CXXRecordDecl * PathElem
void resizePath(unsigned Length)
const PathElem * getPath() const
Describes how types, statements, expressions, and declarations should be printed.
unsigned Nullptr
Whether we should use 'nullptr' rather than '0' as a null pointer constant.
unsigned EntireContentsOfLargeArray
Whether to print the entire array initializers, especially on non-type template parameters,...