27#include "llvm/IR/DataLayout.h"
28#include "llvm/IR/DerivedTypes.h"
29#include "llvm/IR/Module.h"
35 : CGM(cgm), Context(cgm.
getContext()), TheModule(cgm.getModule()),
37 SkippedLayout =
false;
38 LongDoubleReferenced =
false;
42 for (llvm::FoldingSet<CGFunctionInfo>::iterator
43 I = FunctionInfos.begin(), E = FunctionInfos.end(); I != E; )
50 return CGM.getCodeGenOpts();
57 llvm::raw_svector_ostream OS(
TypeName);
79 if (TDD->getDeclContext())
80 TDD->printQualifiedName(OS, Policy);
89 Ty->setName(OS.str());
104 if (
T->isConstantMatrixType()) {
105 const Type *Ty = Context.getCanonicalType(
T).getTypePtr();
108 if (Context.getLangOpts().HLSL &&
T->isConstantMatrixBoolType())
116 if (
T->isExtVectorBoolType()) {
119 if (Context.getLangOpts().HLSL) {
121 return llvm::FixedVectorType::get(IRElemTy, FixedVT->getNumElements());
125 uint64_t BytePadded = std::max<uint64_t>(FixedVT->getNumElements(), 8);
126 return llvm::IntegerType::get(FixedVT->getContext(), BytePadded);
142 if (
T->isBitIntType()) {
144 return llvm::ArrayType::get(CGM.Int8Ty,
145 Context.getTypeSizeInChars(
T).getQuantity());
147 (
unsigned)Context.getTypeSize(
T));
150 if (R->isIntegerTy(1))
152 (
unsigned)Context.getTypeSize(
T));
159 llvm::Type *LLVMTy) {
163 CharUnits ASTSize = Context.getTypeSizeInChars(ASTTy);
166 return ASTSize != LLVMSize;
170 llvm::Type *LLVMTy) {
174 if (
T->isBitIntType())
175 return llvm::Type::getIntNTy(
178 if (LLVMTy->isIntegerTy(1))
180 (
unsigned)Context.getTypeSize(
T));
182 if (
T->isConstantMatrixBoolType()) {
186 const Type *Ty = Context.getCanonicalType(
T).getTypePtr();
192 if (
T->isExtVectorBoolType())
201 llvm::DenseMap<const Type*, llvm::StructType *>::const_iterator I =
202 RecordDeclTypes.find(Ty);
203 return I != RecordDeclTypes.end() && !I->second->isOpaque();
216 const TagType *TT = Ty->
getAs<TagType>();
217 if (!TT)
return true;
220 return !TT->isIncompleteType();
234 for (
unsigned i = 0, e = FPT->getNumParams(); i != e; i++)
244 CanQualType T = CGM.getContext().getCanonicalTagType(TD);
248 if (
const EnumDecl *ED = dyn_cast<EnumDecl>(TD)) {
250 if (TypeCache.count(
T->getTypePtr())) {
254 if (!
ConvertType(ED->getIntegerType())->isIntegerTy(32))
260 DI->completeType(ED);
271 if (RecordDeclTypes.count(
T.getTypePtr()))
277 DI->completeType(RD);
282 T = Context.getCanonicalType(
T);
284 const Type *Ty =
T.getTypePtr();
285 if (RecordsWithOpaqueMemberPointers.count(Ty)) {
287 RecordsWithOpaqueMemberPointers.clear();
292 const llvm::fltSemantics &
format,
293 bool UseNativeHalf =
false) {
294 if (&
format == &llvm::APFloat::IEEEhalf()) {
296 return llvm::Type::getHalfTy(VMContext);
298 return llvm::Type::getInt16Ty(VMContext);
300 if (&
format == &llvm::APFloat::BFloat())
301 return llvm::Type::getBFloatTy(VMContext);
302 if (&
format == &llvm::APFloat::IEEEsingle())
303 return llvm::Type::getFloatTy(VMContext);
304 if (&
format == &llvm::APFloat::IEEEdouble())
305 return llvm::Type::getDoubleTy(VMContext);
306 if (&
format == &llvm::APFloat::IEEEquad())
307 return llvm::Type::getFP128Ty(VMContext);
308 if (&
format == &llvm::APFloat::PPCDoubleDouble())
309 return llvm::Type::getPPC_FP128Ty(VMContext);
310 if (&
format == &llvm::APFloat::x87DoubleExtended())
311 return llvm::Type::getX86_FP80Ty(VMContext);
312 llvm_unreachable(
"Unknown float format!");
315llvm::Type *CodeGenTypes::ConvertFunctionTypeInternal(QualType QFT) {
328 if (
const FunctionProtoType *FPT = dyn_cast<FunctionProtoType>(FT))
329 for (
unsigned i = 0, e = FPT->getNumParams(); i != e; i++)
330 if (
const auto *RD = FPT->getParamType(i)->getAsRecordDecl())
333 SkippedLayout =
true;
341 const CGFunctionInfo *FI;
342 if (
const FunctionProtoType *FPT = dyn_cast<FunctionProtoType>(FT)) {
351 llvm::Type *ResultType =
nullptr;
354 if (FunctionsBeingProcessed.count(FI)) {
357 SkippedLayout =
true;
369 T = Context.getCanonicalType(
T);
371 const Type *Ty =
T.getTypePtr();
375 if (Context.getLangOpts().CUDAIsDevice) {
376 if (
T->isCUDADeviceBuiltinSurfaceType()) {
377 if (
auto *Ty = CGM.getTargetCodeGenInfo()
378 .getCUDADeviceBuiltinSurfaceDeviceType())
380 }
else if (
T->isCUDADeviceBuiltinTextureType()) {
381 if (
auto *Ty = CGM.getTargetCodeGenInfo()
382 .getCUDADeviceBuiltinTextureDeviceType())
388 if (
const auto *RT = dyn_cast<RecordType>(Ty))
391 llvm::Type *CachedType =
nullptr;
392 auto TCI = TypeCache.find(Ty);
393 if (TCI != TypeCache.end())
394 CachedType = TCI->second;
397#ifndef EXPENSIVE_CHECKS
403 llvm::Type *ResultType =
nullptr;
406#define TYPE(Class, Base)
407#define ABSTRACT_TYPE(Class, Base)
408#define NON_CANONICAL_TYPE(Class, Base) case Type::Class:
409#define DEPENDENT_TYPE(Class, Base) case Type::Class:
410#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base) case Type::Class:
411#include "clang/AST/TypeNodes.inc"
412 llvm_unreachable(
"Non-canonical or dependent types aren't possible.");
414 case Type::Builtin: {
416 case BuiltinType::Void:
417 case BuiltinType::ObjCId:
418 case BuiltinType::ObjCClass:
419 case BuiltinType::ObjCSel:
425 case BuiltinType::Bool:
430 case BuiltinType::Char_S:
431 case BuiltinType::Char_U:
432 case BuiltinType::SChar:
433 case BuiltinType::UChar:
434 case BuiltinType::Short:
435 case BuiltinType::UShort:
436 case BuiltinType::Int:
437 case BuiltinType::UInt:
438 case BuiltinType::Long:
439 case BuiltinType::ULong:
440 case BuiltinType::LongLong:
441 case BuiltinType::ULongLong:
442 case BuiltinType::WChar_S:
443 case BuiltinType::WChar_U:
444 case BuiltinType::Char8:
445 case BuiltinType::Char16:
446 case BuiltinType::Char32:
447 case BuiltinType::ShortAccum:
448 case BuiltinType::Accum:
449 case BuiltinType::LongAccum:
450 case BuiltinType::UShortAccum:
451 case BuiltinType::UAccum:
452 case BuiltinType::ULongAccum:
453 case BuiltinType::ShortFract:
454 case BuiltinType::Fract:
455 case BuiltinType::LongFract:
456 case BuiltinType::UShortFract:
457 case BuiltinType::UFract:
458 case BuiltinType::ULongFract:
459 case BuiltinType::SatShortAccum:
460 case BuiltinType::SatAccum:
461 case BuiltinType::SatLongAccum:
462 case BuiltinType::SatUShortAccum:
463 case BuiltinType::SatUAccum:
464 case BuiltinType::SatULongAccum:
465 case BuiltinType::SatShortFract:
466 case BuiltinType::SatFract:
467 case BuiltinType::SatLongFract:
468 case BuiltinType::SatUShortFract:
469 case BuiltinType::SatUFract:
470 case BuiltinType::SatULongFract:
472 static_cast<unsigned>(Context.getTypeSize(
T)));
475 case BuiltinType::Float16:
481 case BuiltinType::Half:
485 Context.getLangOpts().NativeHalfType ||
486 !Context.getTargetInfo().useFP16ConversionIntrinsics());
488 case BuiltinType::LongDouble:
489 LongDoubleReferenced =
true;
491 case BuiltinType::BFloat16:
492 case BuiltinType::Float:
493 case BuiltinType::Double:
494 case BuiltinType::Float128:
495 case BuiltinType::Ibm128:
497 Context.getFloatTypeSemantics(
T),
501 case BuiltinType::NullPtr:
506 case BuiltinType::UInt128:
507 case BuiltinType::Int128:
511#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
512 case BuiltinType::Id:
513#include "clang/Basic/OpenCLImageTypes.def"
514#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
515 case BuiltinType::Id:
516#include "clang/Basic/OpenCLExtensionTypes.def"
517 case BuiltinType::OCLSampler:
518 case BuiltinType::OCLEvent:
519 case BuiltinType::OCLClkEvent:
520 case BuiltinType::OCLQueue:
521 case BuiltinType::OCLReserveID:
522 ResultType = CGM.getOpenCLRuntime().convertOpenCLSpecificType(Ty);
524#define SVE_VECTOR_TYPE(Name, MangledName, Id, SingletonId) \
525 case BuiltinType::Id:
526#define SVE_PREDICATE_TYPE(Name, MangledName, Id, SingletonId) \
527 case BuiltinType::Id:
528#include "clang/Basic/AArch64ACLETypes.def"
538 auto *VTy = llvm::VectorType::get(EltTy, Info.
EC);
541 llvm_unreachable(
"Expected 1, 2, 3 or 4 vectors!");
545 return llvm::StructType::get(VTy, VTy);
547 return llvm::StructType::get(VTy, VTy, VTy);
549 return llvm::StructType::get(VTy, VTy, VTy, VTy);
552 case BuiltinType::SveCount:
553 return llvm::TargetExtType::get(
getLLVMContext(),
"aarch64.svcount");
554 case BuiltinType::MFloat8:
555 return llvm::VectorType::get(llvm::Type::getInt8Ty(
getLLVMContext()), 1,
557#define PPC_VECTOR_TYPE(Name, Id, Size) \
558 case BuiltinType::Id: \
560 llvm::FixedVectorType::get(ConvertType(Context.BoolTy), Size); \
562#include "clang/Basic/PPCTypes.def"
563#define RVV_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
564#include "clang/Basic/RISCVVTypes.def"
569 unsigned I8EltCount =
570 Info.
EC.getKnownMinValue() *
572 return llvm::TargetExtType::get(
574 llvm::ScalableVectorType::get(
579 Info.
EC.getKnownMinValue());
581#define WASM_REF_TYPE(Name, MangledName, Id, SingletonId, AS) \
582 case BuiltinType::Id: { \
583 if (BuiltinType::Id == BuiltinType::WasmExternRef) \
584 ResultType = CGM.getTargetCodeGenInfo().getWasmExternrefReferenceType(); \
586 llvm_unreachable("Unexpected wasm reference builtin type!"); \
588#include "clang/Basic/WebAssemblyReferenceTypes.def"
589#define AMDGPU_OPAQUE_PTR_TYPE(Name, Id, SingletonId, Width, Align, AS) \
590 case BuiltinType::Id: \
591 return llvm::PointerType::get(getLLVMContext(), AS);
592#define AMDGPU_NAMED_BARRIER_TYPE(Name, Id, SingletonId, Width, Align, Scope) \
593 case BuiltinType::Id: \
594 return llvm::TargetExtType::get(getLLVMContext(), "amdgcn.named.barrier", \
596#include "clang/Basic/AMDGPUTypes.def"
597#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
598#include "clang/Basic/HLSLIntangibleTypes.def"
599 ResultType = CGM.getHLSLRuntime().convertHLSLSpecificType(Ty);
601 case BuiltinType::Dependent:
602#define BUILTIN_TYPE(Id, SingletonId)
603#define PLACEHOLDER_TYPE(Id, SingletonId) \
604 case BuiltinType::Id:
605#include "clang/AST/BuiltinTypes.def"
606 llvm_unreachable(
"Unexpected placeholder builtin type!");
611 case Type::DeducedTemplateSpecialization:
612 llvm_unreachable(
"Unexpected undeduced type!");
613 case Type::Complex: {
615 ResultType = llvm::StructType::get(EltTy, EltTy);
618 case Type::LValueReference:
619 case Type::RValueReference: {
626 case Type::Pointer: {
634 case Type::VariableArray: {
637 "FIXME: We only handle trivial array types so far!");
643 case Type::IncompleteArray: {
646 "FIXME: We only handle trivial array types so far!");
650 if (!ResultType->isSized()) {
651 SkippedLayout =
true;
654 ResultType = llvm::ArrayType::get(ResultType, 0);
657 case Type::ArrayParameter:
658 case Type::ConstantArray: {
664 if (!EltTy->isSized()) {
665 SkippedLayout =
true;
669 ResultType = llvm::ArrayType::get(EltTy, A->
getZExtSize());
672 case Type::ExtVector:
676 llvm::Type *IRElemTy = VT->isPackedVectorBoolType(Context)
678 : VT->getElementType()->isMFloat8Type()
681 ResultType = llvm::FixedVectorType::get(IRElemTy, VT->getNumElements());
684 case Type::ConstantMatrix: {
691 case Type::FunctionNoProto:
692 case Type::FunctionProto:
693 ResultType = ConvertFunctionTypeInternal(
T);
695 case Type::ObjCObject:
699 case Type::ObjCInterface: {
710 case Type::ObjCObjectPointer:
716 if (ED->isCompleteDefinition() || ED->isFixed())
725 case Type::BlockPointer: {
738 case Type::MemberPointer: {
740 if (!
getCXXABI().isMemberPointerConvertible(MPTy)) {
742 MPTy->getMostRecentCXXRecordDecl());
744 RecordsWithOpaqueMemberPointers.try_emplace(
T.getTypePtr());
745 if (Insertion.second)
746 Insertion.first->second = llvm::StructType::create(
getLLVMContext());
747 ResultType = Insertion.first->second;
759 uint64_t valueSize = Context.getTypeSize(valueType);
760 uint64_t atomicSize = Context.getTypeSize(Ty);
761 if (valueSize != atomicSize) {
762 assert(valueSize < atomicSize);
763 llvm::Type *elts[] = {
765 llvm::ArrayType::get(CGM.Int8Ty, (atomicSize - valueSize) / 8)
773 ResultType = CGM.getOpenCLRuntime().getPipeType(
cast<PipeType>(Ty));
778 ResultType = llvm::Type::getIntNTy(
getLLVMContext(), EIT->getNumBits());
781 case Type::HLSLAttributedResource:
782 case Type::HLSLInlineSpirv:
783 ResultType = CGM.getHLSLRuntime().convertHLSLSpecificType(Ty);
787 assert(ResultType &&
"Didn't convert a type?");
788 assert((!CachedType || CachedType == ResultType) &&
789 "Cached type doesn't match computed type");
791 TypeCache[Ty] = ResultType;
800 return Context.getTypeSize(
type) != Context.getTypeSize(
type->getValueType());
807 const Type *Key = Context.getCanonicalTagType(RD).getTypePtr();
809 llvm::StructType *&Entry = RecordDeclTypes[Key];
816 llvm::StructType *Ty = Entry;
825 if (
const CXXRecordDecl *CRD = dyn_cast<CXXRecordDecl>(RD)) {
826 for (
const auto &I : CRD->bases()) {
827 if (I.isVirtual())
continue;
834 CGRecordLayouts[Key] = std::move(Layout);
848 const Type *Key = Context.getCanonicalTagType(RD).getTypePtr();
850 auto I = CGRecordLayouts.find(Key);
851 if (I != CGRecordLayouts.end())
857 I = CGRecordLayouts.find(Key);
859 assert(I != CGRecordLayouts.end() &&
860 "Unable to find record layout information for type");
865 assert((
T->isAnyPointerType() ||
T->isBlockPointerType() ||
866 T->isNullPtrType()) &&
873 return Context.getTargetNullPointerValue(
T) == 0;
875 if (
const auto *AT = Context.getAsArrayType(
T)) {
878 if (
const auto *CAT = dyn_cast<ConstantArrayType>(AT))
879 if (Context.getConstantArrayElementCount(CAT) == 0)
881 T = Context.getBaseElementType(
T);
886 if (
const auto *RD =
T->getAsRecordDecl())
894 if (
T->getAs<HLSLInlineSpirvType>())
910 return T->isFunctionType() && !
T.hasAddressSpace()
Defines the clang::ASTContext interface.
static llvm::Type * getTypeForFormat(llvm::LLVMContext &VMContext, const llvm::fltSemantics &format, bool UseNativeHalf=false)
static Decl::Kind getKind(const Decl *D)
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
static CharUnits getTypeAllocSize(CodeGenModule &CGM, llvm::Type *type)
const clang::PrintingPolicy & getPrintingPolicy() const
unsigned getTargetAddressSpace(LangAS AS) const
QualType getElementType() const
unsigned getIndexTypeCVRQualifiers() const
Represents a C++ struct/union/class.
static CanQual< T > CreateUnsafe(QualType Other)
Builds a canonical type from a QualType.
CharUnits - This is an opaque type for sizes expressed in character units.
static CharUnits fromQuantity(QuantityType Quantity)
fromQuantity - Construct a CharUnits quantity from a raw integer type.
CodeGenOptions - Track various options which control how the code is optimized and passed to the back...
Implements C++ ABI-specific code generation functions.
virtual bool isMemberPointerConvertible(const MemberPointerType *MPT) const
Return whether or not a member pointers type is convertible to an IR type.
virtual llvm::Type * ConvertMemberPointerType(const MemberPointerType *MPT)
Find the LLVM type used to represent the given member pointer type.
virtual bool isZeroInitializable(const MemberPointerType *MPT)
Return true if the given member pointer can be zero-initialized (in the C++ sense) with an LLVM zeroi...
This class gathers all debug information during compilation and is responsible for emitting to llvm g...
CGRecordLayout - This class handles struct and union layout info while lowering AST types to LLVM typ...
bool isZeroInitializable() const
Check whether this struct can be C++ zero-initialized with a zeroinitializer.
This class organizes the cross-function state that is used while generating LLVM code.
bool isPaddedAtomicType(QualType type)
CGCXXABI & getCXXABI() const
CodeGenTypes(CodeGenModule &cgm)
llvm::Type * ConvertType(QualType T)
ConvertType - Convert type T into a llvm::Type.
CGCXXABI & getCXXABI() const
bool isPointerZeroInitializable(QualType T)
Check if the pointer type can be zero-initialized (in the C++ sense) with an LLVM zeroinitializer.
const CodeGenOptions & getCodeGenOpts() const
ASTContext & getContext() const
const CGFunctionInfo & arrangeFreeFunctionType(CanQual< FunctionProtoType > Ty)
Arrange the argument and result information for a value of the given freestanding function type.
llvm::FunctionType * GetFunctionType(const CGFunctionInfo &Info)
GetFunctionType - Get the LLVM function type for.
bool isFuncTypeConvertible(const FunctionType *FT)
isFuncTypeConvertible - Utility to check whether a function type can be converted to an LLVM type (i....
const TargetInfo & getTarget() const
std::unique_ptr< CGRecordLayout > ComputeRecordLayout(const RecordDecl *D, llvm::StructType *Ty)
Compute a new LLVM record layout object for the given record.
llvm::Type * convertTypeForLoadStore(QualType T, llvm::Type *LLVMTy=nullptr)
Given that T is a scalar type, return the IR type that should be used for load and store operations.
const CGRecordLayout & getCGRecordLayout(const RecordDecl *)
getCGRecordLayout - Return record layout info for the given record decl.
unsigned getTargetAddressSpace(QualType T) const
llvm::StructType * ConvertRecordDeclType(const RecordDecl *TD)
ConvertRecordDeclType - Lay out a tagged decl type like struct or union.
void RefreshTypeCacheForClass(const CXXRecordDecl *RD)
Remove stale types from the type cache when an inheritance model gets assigned to a class.
bool isRecordLayoutComplete(const Type *Ty) const
isRecordLayoutComplete - Return true if the specified type is already completely laid out.
llvm::Type * ConvertTypeForMem(QualType T)
ConvertTypeForMem - Convert type T into a llvm::Type.
CodeGenModule & getCGM() const
void UpdateCompletedType(const TagDecl *TD)
UpdateCompletedType - When we find the full definition for a TagDecl, replace the 'opaque' type we pr...
llvm::LLVMContext & getLLVMContext()
bool typeRequiresSplitIntoByteArray(QualType ASTTy, llvm::Type *LLVMTy=nullptr)
Check whether the given type needs to be laid out in memory using an opaque byte-array type because i...
const llvm::DataLayout & getDataLayout() const
bool isFuncParamTypeConvertible(QualType Ty)
isFuncParamTypeConvertible - Return true if the specified type in a function parameter or result posi...
bool isZeroInitializable(QualType T)
IsZeroInitializable - Return whether a type can be zero-initialized (in the C++ sense) with an LLVM z...
void addRecordTypeName(const RecordDecl *RD, llvm::StructType *Ty, StringRef suffix)
addRecordTypeName - Compute a name from the given record decl with an optional suffix and name the gi...
Represents the canonical version of C arrays with a specified constant size.
uint64_t getZExtSize() const
Return the size zero-extended as a uint64_t.
Represents a concrete matrix type with constant number of rows and columns.
unsigned getNumColumns() const
Returns the number of columns in the matrix.
unsigned getNumRows() const
Returns the number of rows in the matrix.
unsigned getNumElementsFlattened() const
Returns the number of elements required to embed the matrix into a vector.
ASTContext & getASTContext() const LLVM_READONLY
DeclContext * getDeclContext()
Represents a prototype with parameter type info, e.g.
FunctionType - C99 6.7.5.3 - Function Declarators.
QualType getReturnType() const
Represents a C array with an unspecified size.
QualType getElementType() const
Returns type of the elements being stored in the matrix.
A pointer to member type per C++ 8.3.3 - Pointers to members.
IdentifierInfo * getIdentifier() const
Get the identifier that names this declaration, if there is one.
void printQualifiedName(raw_ostream &OS) const
Returns a human-readable qualified name for this declaration, like A::B::i, for i being member of nam...
PointerType - C99 6.7.5.1 - Pointer Declarators.
QualType getPointeeType() const
A (possibly-)qualified type.
const Type * getTypePtr() const
Retrieves a pointer to the underlying (unqualified) type.
LangAS getAddressSpace() const
Return the address space of this type.
Represents a struct/union/class.
RecordDecl * getDefinition() const
Returns the RecordDecl that actually defines this struct/union/class.
Base for LValueReferenceType and RValueReferenceType.
QualType getPointeeType() const
Represents the declaration of a struct/union/class/enum.
StringRef getKindName() const
bool isCompleteDefinition() const
Return true if this decl has its body fully specified.
TypedefNameDecl * getTypedefNameForAnonDecl() const
void printName(raw_ostream &OS, const PrintingPolicy &Policy) const override
Pretty-print the unqualified name of this declaration.
bool isDependentType() const
Whether this declaration declares a type that is dependent, i.e., a type that somehow depends on temp...
bool isMFloat8Type() const
RecordDecl * getAsRecordDecl() const
Retrieves the RecordDecl this type refers to.
EnumDecl * castAsEnumDecl() const
TypeClass getTypeClass() const
const T * getAs() const
Member-template getAs<specific type>'.
Base class for declarations which introduce a typedef-name.
Represents a C array with a specified size that is not an integer-constant-expression.
@ Type
The l-value was considered opaque, so the alignment was determined from a type.
const internal::VariadicAllOfMatcher< Type > type
Matches Types in the clang AST.
The JSON file list parser is used to communicate input to InstallAPI.
CanQual< Type > CanQualType
Represents a canonical, potentially-qualified type.
bool isa(CodeGen::Address addr)
const FunctionProtoType * T
U cast(CodeGen::Address addr)
Describes how types, statements, expressions, and declarations should be printed.
unsigned SuppressInlineNamespace
Suppress printing parts of scope specifiers that correspond to inline namespaces.