21#include "llvm/Support/ErrorHandling.h"
22#include "llvm/Support/raw_ostream.h"
28 : T(T->getCanonicalTypeUnqualified().getTypePtr()) {}
40 "Type is insufficiently aligned");
51 Base.DynamicAllocType =
Type.getAsOpaquePtr();
74 Redecl = cast_or_null<ValueDecl>(Redecl->getPreviousDecl())) {
76 if (!
T->isIncompleteArrayType())
93 llvm::dyn_cast<MaterializeTemporaryExpr>(
Base)) {
96 const Expr *Temp = MTE->getSubExpr();
101 if (!Adjustments.empty())
105 return Base->getType();
128 ID.AddPointer(Ptr.getOpaqueValue());
131 ID.AddInteger(
Local.CallIndex);
132 ID.AddInteger(
Local.Version);
138 if (LHS.Ptr != RHS.Ptr)
142 return LHS.
Local.CallIndex == RHS.
Local.CallIndex &&
148 if (
const Decl *D = BaseOrMember.getPointer())
149 BaseOrMember.setPointer(D->getCanonicalDecl());
150 Value =
reinterpret_cast<uintptr_t>(BaseOrMember.getOpaqueValue());
154 ID.AddInteger(Value);
159 : Ty((const void *)ElemTy.getTypePtrOrNull()),
Path(
Path) {}
171 bool IsOnePastTheEnd : 1;
176 return Ptr.getOpaqueValue();
183APValue::LValueBase::operator
bool ()
const {
184 return static_cast<bool>(Ptr);
191 return llvm::hash_combine(
Base.getOpaqueValue(),
Base.getCallIndex(),
196unsigned llvm::DenseMapInfo<clang::APValue::LValueBase>::getHashValue(
201bool llvm::DenseMapInfo<clang::APValue::LValueBase>::isEqual(
223 if (Length == PathLength)
242 struct MemberPointerBase {
243 llvm::PointerIntPair<const ValueDecl*, 1, bool> MemberAndIsDerivedMember;
250 (DataSize -
sizeof(MemberPointerBase)) /
sizeof(
const CXXRecordDecl*);
261 if (Length == PathLength)
280APValue::Arr::Arr(
unsigned NumElts,
unsigned Size) :
281 Elts(new
APValue[NumElts + (NumElts != Size ? 1 : 0)]),
282 NumElts(NumElts), ArrSize(Size) {}
283APValue::Arr::~Arr() {
delete [] Elts; }
285APValue::StructData::StructData(
unsigned NumBases,
unsigned NumFields,
286 unsigned NumVirtualBases)
287 : Elts(new
APValue[NumBases + NumFields + NumVirtualBases]),
288 NumBases(NumBases), NumFields(NumFields),
289 NumVirtualBases(NumVirtualBases) {}
291APValue::StructData::~StructData() {
296APValue::UnionData::~UnionData () {
301 : Kind(
None), AllowConstexprUnknown(RHS.AllowConstexprUnknown) {
305 Kind = RHS.getKind();
309 setInt(RHS.getInt());
313 setFloat(RHS.getFloat());
316 APFixedPoint FXCopy = RHS.getFixedPoint();
317 MakeFixedPoint(std::move(FXCopy));
322 setVector(((
const Vec *)(
const char *)&RHS.Data)->Elts,
327 setMatrix(((
const Mat *)(
const char *)&RHS.Data)->Elts,
381 : Kind(RHS.Kind), AllowConstexprUnknown(RHS.AllowConstexprUnknown),
396 DestroyDataAndMakeUninit();
399 AllowConstexprUnknown = RHS.AllowConstexprUnknown;
405void APValue::DestroyDataAndMakeUninit() {
407 ((APSInt *)(
char *)&
Data)->~APSInt();
408 else if (Kind ==
Float)
409 ((APFloat *)(
char *)&
Data)->~APFloat();
411 ((APFixedPoint *)(
char *)&
Data)->~APFixedPoint();
413 ((Vec *)(
char *)&
Data)->~Vec();
415 ((Mat *)(
char *)&
Data)->~Mat();
417 ((ComplexAPSInt *)(
char *)&
Data)->~ComplexAPSInt();
419 ((ComplexAPFloat *)(
char *)&
Data)->~ComplexAPFloat();
420 else if (Kind == LValue)
421 ((LV *)(
char *)&
Data)->~LV();
422 else if (Kind == Array)
423 ((Arr *)(
char *)&
Data)->~Arr();
425 ((StructData *)(
char *)&
Data)->~StructData();
426 else if (Kind ==
Union)
427 ((UnionData *)(
char *)&
Data)->~UnionData();
428 else if (Kind == MemberPointer)
429 ((MemberPointerData *)(
char *)&
Data)->~MemberPointerData();
431 ((AddrLabelDiffData *)(
char *)&
Data)->~AddrLabelDiffData();
433 AllowConstexprUnknown =
false;
449 return getInt().needsCleanup();
457 "In _Complex float types, real and imaginary values always have the "
463 "In _Complex int types, real and imaginary values must have the "
467 return reinterpret_cast<const LV *
>(&Data)->hasPathPtr();
471 llvm_unreachable(
"Unknown APValue kind!");
475 std::swap(Kind, RHS.Kind);
476 std::swap(Data, RHS.Data);
478 bool tmp = AllowConstexprUnknown;
479 AllowConstexprUnknown = RHS.AllowConstexprUnknown;
480 RHS.AllowConstexprUnknown = tmp;
485 for (
unsigned I = 0, N =
V.getBitWidth(); I < N; I += 32)
486 ID.AddInteger((
uint32_t)
V.extractBitsAsZExtValue(std::min(32u, N - I), I));
537 llvm::FoldingSetNodeID FillerID;
541 ID.AddNodeID(FillerID);
552 ID.AddInteger(NumFillers);
559 llvm::FoldingSetNodeID ElemID;
561 if (ElemID != FillerID) {
562 ID.AddInteger(NumFillers);
563 ID.AddNodeID(ElemID);
637 llvm_unreachable(
"Unknown APValue kind!");
643 V.convert(llvm::APFloat::IEEEdouble(), llvm::APFloat::rmNearestTiesToEven,
645 return V.convertToDouble();
660 if (!
Inits.back().isInt() || !
Inits.back().getInt().isZero())
669 constexpr size_t MaxN = 36;
674 Inits.take_front(std::min(MaxN - Ellipsis.size() / 2,
Inits.size()));
677 for (
auto &Val :
Inits) {
680 int64_t Char64 = Val.getInt().getExtValue();
683 auto Ch =
static_cast<unsigned char>(Char64);
686 if (Escaped.empty()) {
689 Buf.emplace_back(Ch);
695 Buf.append(Ellipsis);
726 Ty = AT->getValueType();
730 Out <<
"<out of lifetime>";
733 Out <<
"<uninitialized>";
737 Out << (
getInt().getBoolValue() ?
"true" :
"false");
760 QualType ElemTy = MT->getElementType();
793 Out << (Policy.
Nullptr ?
"nullptr" :
"0");
794 }
else if (IsReference) {
795 Out <<
"*(" << InnerTy.
stream(Policy) <<
"*)"
798 Out <<
"(" << Ty.
stream(Policy) <<
")"
818 }
else if (!IsReference) {
825 TI.print(Out, Policy);
828 <<
Base.getDynamicAllocType().stream(Policy) <<
"#"
829 << DA.getIndex() <<
"}";
831 assert(
Base.get<
const Expr *>() !=
nullptr &&
832 "Expecting non-null Expr");
837 Out <<
" + " << (O / S);
854 TI.print(Out, Policy);
856 Out <<
"{*new " <<
Base.getDynamicAllocType().stream(Policy) <<
"#"
857 << DA.getIndex() <<
"}";
860 assert(E !=
nullptr &&
"Expecting non-null Expr");
866 for (
unsigned I = 0, N = Path.size(); I != N; ++I) {
870 const Decl *BaseOrMember = Path[I].getAsBaseOrMember().getPointer();
871 if (
const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(BaseOrMember)) {
879 Out << *CastToBase <<
"::";
885 Out << (Path[I].getAsArrayIndex() == 0 ?
".real" :
".imag");
889 Out <<
'[' << Path[I].getAsArrayIndex() <<
']';
915 for (; I != N; ++I) {
936 for (
unsigned I = 0; I != N; ++I, ++BI) {
944 for (
const auto *FI : RD->fields()) {
947 if (FI->isUnnamedBitField())
956 for (
unsigned I = 0; I != N; ++I, ++BI) {
970 Out <<
"." << *FD <<
" = ";
979 Out << '&' << *cast<CXXRecordDecl>(VD->getDeclContext()) <<
"::" << *VD;
990 llvm_unreachable(
"Unknown APValue kind!");
995 llvm::raw_string_ostream Out(
Result);
1021 assert(
isLValue() &&
"Invalid accessor");
1022 return ((
const LV *)(
const void *)&Data)->Base;
1026 assert(
isLValue() &&
"Invalid accessor");
1027 return ((
const LV *)(
const void *)&Data)->IsOnePastTheEnd;
1031 assert(
isLValue() &&
"Invalid accessor");
1032 return ((
LV *)(
void *)&Data)->Offset;
1036 assert(
isLValue() &&
"Invalid accessor");
1037 return ((
const LV *)(
const char *)&Data)->hasPath();
1042 const LV &LVal = *((
const LV *)(
const char *)&Data);
1043 return {LVal.
getPath(), LVal.PathLength};
1047 assert(
isLValue() &&
"Invalid accessor");
1048 return ((
const LV *)(
const char *)&Data)->Base.getCallIndex();
1052 assert(
isLValue() &&
"Invalid accessor");
1053 return ((
const LV *)(
const char *)&Data)->Base.getVersion();
1057 assert(
isLValue() &&
"Invalid usage");
1058 return ((
const LV *)(
const char *)&Data)->IsNullPtr;
1063 assert(
isLValue() &&
"Invalid accessor");
1064 LV &LVal = *((
LV *)(
char *)&Data);
1066 LVal.IsOnePastTheEnd =
false;
1069 LVal.IsNullPtr = IsNullPtr;
1073APValue::setLValueUninit(LValueBase B,
const CharUnits &O,
unsigned Size,
1074 bool IsOnePastTheEnd,
bool IsNullPtr) {
1075 assert(
isLValue() &&
"Invalid accessor");
1076 LV &LVal = *((LV *)(
char *)&
Data);
1078 LVal.IsOnePastTheEnd = IsOnePastTheEnd;
1080 LVal.IsNullPtr = IsNullPtr;
1081 LVal.resizePath(Size);
1082 return {LVal.getPath(), Size};
1089 setLValueUninit(B, O, Path.size(), IsOnePastTheEnd, IsNullPtr);
1091 memcpy(InternalPath.data(), Path.data(),
1097 assert(
isUnion() &&
"Invalid accessor");
1098 ((UnionData *)(
char *)&Data)->Field =
1099 Field ? Field->getCanonicalDecl() :
nullptr;
1100 *((UnionData *)(
char *)&Data)->Value =
Value;
1107 return MPD.MemberAndIsDerivedMember.getPointer();
1114 return MPD.MemberAndIsDerivedMember.getInt();
1121 return {MPD.
getPath(), MPD.PathLength};
1124void APValue::MakeLValue() {
1125 assert(
isAbsent() &&
"Bad state change");
1126 static_assert(
sizeof(LV) <= DataSize,
"LV too big");
1127 new ((
void *)(
char *)&
Data) LV();
1131void APValue::MakeArray(
unsigned InitElts,
unsigned Size) {
1132 assert(
isAbsent() &&
"Bad state change");
1133 new ((
void *)(
char *)&
Data) Arr(InitElts, Size);
1138APValue::setMemberPointerUninit(
const ValueDecl *
Member,
bool IsDerivedMember,
1140 assert(
isAbsent() &&
"Bad state change");
1143 MPD->MemberAndIsDerivedMember.setPointer(
1145 MPD->MemberAndIsDerivedMember.setInt(IsDerivedMember);
1146 MPD->resizePath(Size);
1147 return {MPD->getPath(), MPD->PathLength};
1150void APValue::MakeMemberPointer(
const ValueDecl *
Member,
bool IsDerivedMember,
1152 MutableArrayRef<const CXXRecordDecl *> InternalPath =
1153 setMemberPointerUninit(
Member, IsDerivedMember, Path.size());
1154 for (
unsigned I = 0; I != Path.size(); ++I)
1162 auto MergeLV = [&](LinkageInfo MergeLV) {
1166 auto Merge = [&](
const APValue &
V) {
1167 return MergeLV(getLVForValue(
V, computation));
1170 switch (
V.getKind()) {
1188 for (
unsigned I = 0, N =
V.getStructNumBases(); I != N; ++I)
1189 if (Merge(
V.getStructBase(I)))
1191 for (
unsigned I = 0, N =
V.getStructNumFields(); I != N; ++I)
1192 if (Merge(
V.getStructField(I)))
1194 for (
unsigned I = 0, N =
V.getStructNumVirtualBases(); I != N; ++I)
1195 if (Merge(
V.getStructVirtualBase(I)))
1201 if (
V.getUnionField())
1202 Merge(
V.getUnionValue());
1206 for (
unsigned I = 0, N =
V.getArrayInitializedElts(); I != N; ++I)
1207 if (Merge(
V.getArrayInitializedElt(I)))
1209 if (
V.hasArrayFiller())
1210 Merge(
V.getArrayFiller());
1215 if (!
V.getLValueBase()) {
1217 }
else if (
const auto *VD =
1218 V.getLValueBase().dyn_cast<
const ValueDecl *>()) {
1221 }
else if (
const auto TI =
V.getLValueBase().dyn_cast<TypeInfoLValue>()) {
1222 if (MergeLV(getLVForType(*TI.getType(), computation)))
1224 }
else if (
const Expr *E =
V.getLValueBase().dyn_cast<
const Expr *>()) {
1231 auto *MTE = dyn_cast<MaterializeTemporaryExpr>(E);
1234 if (MergeLV(
getLVForDecl(MTE->getExtendingDecl(), computation)))
1237 assert(
V.getLValueBase().is<DynamicAllocLValue>() &&
1238 "unexpected LValueBase kind");
1247 if (
const NamedDecl *D =
V.getMemberPointerDecl())
static double GetApproxValue(const llvm::APFloat &F)
static void profileIntValue(llvm::FoldingSetNodeID &ID, const llvm::APInt &V)
Profile the value of an APInt, excluding its bit-width.
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.
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
bool isLValueOnePastTheEnd() const
APValue & getStructVirtualBase(unsigned i)
unsigned getLValueVersion() const
bool isMemberPointerToDerivedMember() const
unsigned getArrayInitializedElts() const
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()
unsigned getVectorLength() const
void setUnion(const FieldDecl *Field, const APValue &Value)
unsigned getMatrixNumRows() const
void setLValue(LValueBase B, const CharUnits &O, NoLValuePath, bool IsNullPtr)
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()
CharUnits - This is an opaque type for sizes expressed in character units.
bool isZero() const
isZero - Test whether the quantity equals zero.
QuantityType getQuantity() const
getQuantity - Get the raw integer representation of this quantity.
static CharUnits One()
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()
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.
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...
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
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.
The JSON file list parser is used to communicate input to InstallAPI.
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)
@ None
The alignment was not explicit in code.
@ Struct
The "struct" keyword introduces the elaborated-type-specifier.
@ Union
The "union" keyword introduces the elaborated-type-specifier.
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...
__packed_splat4 __packed_splat2 __packed_splat8 __packed_splat4 __packed_splat2 __packed_splat4 __packed_splat2 __packed_splat8 __packed_splat4 uint32_t
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,...