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) {
109 if (T->isConstantMatrixBoolType())
115 CGM.getContext().getLangOpts().getDefaultMatrixMemoryLayout() ==
117 unsigned VecLen = IsRowMajor ? NumCols : NumRows;
118 unsigned ArrayLen = IsRowMajor ? NumRows : NumCols;
119 llvm::Type *VecTy = llvm::FixedVectorType::get(IRElemTy, VecLen);
120 return llvm::ArrayType::get(VecTy, ArrayLen);
128 if (T->isExtVectorBoolType()) {
131 if (Context.getLangOpts().HLSL) {
133 return llvm::FixedVectorType::get(IRElemTy, FixedVT->getNumElements());
137 uint64_t BytePadded = std::max<uint64_t>(FixedVT->getNumElements(), 8);
138 return llvm::IntegerType::get(FixedVT->getContext(), BytePadded);
154 if (T->isBitIntType()) {
156 return llvm::ArrayType::get(CGM.Int8Ty,
157 Context.getTypeSizeInChars(T).getQuantity());
159 (
unsigned)Context.getTypeSize(T));
162 if (R->isIntegerTy(1))
164 (
unsigned)Context.getTypeSize(T));
171 llvm::Type *LLVMTy) {
175 CharUnits ASTSize = Context.getTypeSizeInChars(ASTTy);
178 return ASTSize != LLVMSize;
182 llvm::Type *LLVMTy) {
186 if (T->isBitIntType())
187 return llvm::Type::getIntNTy(
188 getLLVMContext(), Context.getTypeSizeInChars(T).getQuantity() * 8);
190 if (LLVMTy->isIntegerTy(1))
192 (
unsigned)Context.getTypeSize(T));
194 if (T->isConstantMatrixBoolType()) {
198 const Type *Ty = Context.getCanonicalType(T).getTypePtr();
204 if (T->isExtVectorBoolType())
213 llvm::DenseMap<const Type*, llvm::StructType *>::const_iterator I =
214 RecordDeclTypes.find(Ty);
215 return I != RecordDeclTypes.end() && !I->second->isOpaque();
228 const TagType *TT = Ty->
getAs<TagType>();
229 if (!TT)
return true;
232 return !TT->isIncompleteType();
246 for (
unsigned i = 0, e = FPT->getNumParams(); i != e; i++)
256 CanQualType T = CGM.getContext().getCanonicalTagType(TD);
260 if (
const EnumDecl *ED = dyn_cast<EnumDecl>(TD)) {
262 if (TypeCache.count(T->getTypePtr())) {
266 if (!
ConvertType(ED->getIntegerType())->isIntegerTy(32))
272 DI->completeType(ED);
283 if (RecordDeclTypes.count(T.getTypePtr()))
289 DI->completeType(RD);
294 T = Context.getCanonicalType(T);
296 const Type *Ty = T.getTypePtr();
297 if (RecordsWithOpaqueMemberPointers.count(Ty)) {
299 RecordsWithOpaqueMemberPointers.clear();
304 const llvm::fltSemantics &
format,
305 bool UseNativeHalf =
false) {
306 if (&
format == &llvm::APFloat::IEEEhalf()) {
308 return llvm::Type::getHalfTy(VMContext);
310 return llvm::Type::getInt16Ty(VMContext);
312 if (&
format == &llvm::APFloat::BFloat())
313 return llvm::Type::getBFloatTy(VMContext);
314 if (&
format == &llvm::APFloat::IEEEsingle())
315 return llvm::Type::getFloatTy(VMContext);
316 if (&
format == &llvm::APFloat::IEEEdouble())
317 return llvm::Type::getDoubleTy(VMContext);
318 if (&
format == &llvm::APFloat::IEEEquad())
319 return llvm::Type::getFP128Ty(VMContext);
320 if (&
format == &llvm::APFloat::PPCDoubleDouble())
321 return llvm::Type::getPPC_FP128Ty(VMContext);
322 if (&
format == &llvm::APFloat::x87DoubleExtended())
323 return llvm::Type::getX86_FP80Ty(VMContext);
324 llvm_unreachable(
"Unknown float format!");
327llvm::Type *CodeGenTypes::ConvertFunctionTypeInternal(QualType QFT) {
340 if (
const FunctionProtoType *FPT = dyn_cast<FunctionProtoType>(FT))
341 for (
unsigned i = 0, e = FPT->getNumParams(); i != e; i++)
342 if (
const auto *RD = FPT->getParamType(i)->getAsRecordDecl())
345 SkippedLayout =
true;
353 const CGFunctionInfo *FI;
354 if (
const FunctionProtoType *FPT = dyn_cast<FunctionProtoType>(FT)) {
363 llvm::Type *ResultType =
nullptr;
366 if (FunctionsBeingProcessed.count(FI)) {
369 SkippedLayout =
true;
381 T = Context.getCanonicalType(T);
383 const Type *Ty = T.getTypePtr();
387 if (Context.getLangOpts().CUDAIsDevice) {
388 if (T->isCUDADeviceBuiltinSurfaceType()) {
389 if (
auto *Ty = CGM.getTargetCodeGenInfo()
390 .getCUDADeviceBuiltinSurfaceDeviceType())
392 }
else if (T->isCUDADeviceBuiltinTextureType()) {
393 if (
auto *Ty = CGM.getTargetCodeGenInfo()
394 .getCUDADeviceBuiltinTextureDeviceType())
400 if (
const auto *RT = dyn_cast<RecordType>(Ty))
403 llvm::Type *CachedType =
nullptr;
404 auto TCI = TypeCache.find(Ty);
405 if (TCI != TypeCache.end())
406 CachedType = TCI->second;
409#ifndef EXPENSIVE_CHECKS
415 llvm::Type *ResultType =
nullptr;
418#define TYPE(Class, Base)
419#define ABSTRACT_TYPE(Class, Base)
420#define NON_CANONICAL_TYPE(Class, Base) case Type::Class:
421#define DEPENDENT_TYPE(Class, Base) case Type::Class:
422#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base) case Type::Class:
423#include "clang/AST/TypeNodes.inc"
424 llvm_unreachable(
"Non-canonical or dependent types aren't possible.");
426 case Type::Builtin: {
428 case BuiltinType::Void:
429 case BuiltinType::ObjCId:
430 case BuiltinType::ObjCClass:
431 case BuiltinType::ObjCSel:
437 case BuiltinType::Bool:
442 case BuiltinType::Char_S:
443 case BuiltinType::Char_U:
444 case BuiltinType::SChar:
445 case BuiltinType::UChar:
446 case BuiltinType::Short:
447 case BuiltinType::UShort:
448 case BuiltinType::Int:
449 case BuiltinType::UInt:
450 case BuiltinType::Long:
451 case BuiltinType::ULong:
452 case BuiltinType::LongLong:
453 case BuiltinType::ULongLong:
454 case BuiltinType::WChar_S:
455 case BuiltinType::WChar_U:
456 case BuiltinType::Char8:
457 case BuiltinType::Char16:
458 case BuiltinType::Char32:
459 case BuiltinType::ShortAccum:
460 case BuiltinType::Accum:
461 case BuiltinType::LongAccum:
462 case BuiltinType::UShortAccum:
463 case BuiltinType::UAccum:
464 case BuiltinType::ULongAccum:
465 case BuiltinType::ShortFract:
466 case BuiltinType::Fract:
467 case BuiltinType::LongFract:
468 case BuiltinType::UShortFract:
469 case BuiltinType::UFract:
470 case BuiltinType::ULongFract:
471 case BuiltinType::SatShortAccum:
472 case BuiltinType::SatAccum:
473 case BuiltinType::SatLongAccum:
474 case BuiltinType::SatUShortAccum:
475 case BuiltinType::SatUAccum:
476 case BuiltinType::SatULongAccum:
477 case BuiltinType::SatShortFract:
478 case BuiltinType::SatFract:
479 case BuiltinType::SatLongFract:
480 case BuiltinType::SatUShortFract:
481 case BuiltinType::SatUFract:
482 case BuiltinType::SatULongFract:
484 static_cast<unsigned>(Context.getTypeSize(T)));
487 case BuiltinType::Float16:
493 case BuiltinType::Half:
497 Context.getLangOpts().NativeHalfType ||
498 !Context.getTargetInfo().useFP16ConversionIntrinsics());
500 case BuiltinType::LongDouble:
501 LongDoubleReferenced =
true;
503 case BuiltinType::BFloat16:
504 case BuiltinType::Float:
505 case BuiltinType::Double:
506 case BuiltinType::Float128:
507 case BuiltinType::Ibm128:
509 Context.getFloatTypeSemantics(T),
513 case BuiltinType::NullPtr:
518 case BuiltinType::UInt128:
519 case BuiltinType::Int128:
523#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
524 case BuiltinType::Id:
525#include "clang/Basic/OpenCLImageTypes.def"
526#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
527 case BuiltinType::Id:
528#include "clang/Basic/OpenCLExtensionTypes.def"
529 case BuiltinType::OCLSampler:
530 case BuiltinType::OCLEvent:
531 case BuiltinType::OCLClkEvent:
532 case BuiltinType::OCLQueue:
533 case BuiltinType::OCLReserveID:
534 ResultType = CGM.getOpenCLRuntime().convertOpenCLSpecificType(Ty);
536#define SVE_VECTOR_TYPE(Name, MangledName, Id, SingletonId) \
537 case BuiltinType::Id:
538#define SVE_PREDICATE_TYPE(Name, MangledName, Id, SingletonId) \
539 case BuiltinType::Id:
540#include "clang/Basic/AArch64ACLETypes.def"
550 auto *VTy = llvm::VectorType::get(EltTy, Info.
EC);
553 llvm_unreachable(
"Expected 1, 2, 3 or 4 vectors!");
557 return llvm::StructType::get(VTy, VTy);
559 return llvm::StructType::get(VTy, VTy, VTy);
561 return llvm::StructType::get(VTy, VTy, VTy, VTy);
564 case BuiltinType::SveCount:
565 return llvm::TargetExtType::get(
getLLVMContext(),
"aarch64.svcount");
566 case BuiltinType::MFloat8:
567 return llvm::VectorType::get(llvm::Type::getInt8Ty(
getLLVMContext()), 1,
569#define PPC_VECTOR_TYPE(Name, Id, Size) \
570 case BuiltinType::Id: \
572 llvm::FixedVectorType::get(ConvertType(Context.BoolTy), Size); \
574#include "clang/Basic/PPCTypes.def"
575#define RVV_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
576#include "clang/Basic/RISCVVTypes.def"
581 unsigned I8EltCount =
582 Info.
EC.getKnownMinValue() *
584 return llvm::TargetExtType::get(
586 llvm::ScalableVectorType::get(
591 Info.
EC.getKnownMinValue());
593#define WASM_REF_TYPE(Name, MangledName, Id, SingletonId, AS) \
594 case BuiltinType::Id: { \
595 if (BuiltinType::Id == BuiltinType::WasmExternRef) \
596 ResultType = CGM.getTargetCodeGenInfo().getWasmExternrefReferenceType(); \
598 llvm_unreachable("Unexpected wasm reference builtin type!"); \
600#include "clang/Basic/WebAssemblyReferenceTypes.def"
601#define AMDGPU_OPAQUE_PTR_TYPE(Name, Id, SingletonId, Width, Align, AS) \
602 case BuiltinType::Id: \
603 return llvm::PointerType::get(getLLVMContext(), AS);
604#define AMDGPU_NAMED_BARRIER_TYPE(Name, Id, SingletonId, Width, Align, Scope) \
605 case BuiltinType::Id: \
606 return llvm::TargetExtType::get(getLLVMContext(), "amdgcn.named.barrier", \
608#include "clang/Basic/AMDGPUTypes.def"
609#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
610#include "clang/Basic/HLSLIntangibleTypes.def"
611 ResultType = CGM.getHLSLRuntime().convertHLSLSpecificType(Ty);
613 case BuiltinType::Dependent:
614#define BUILTIN_TYPE(Id, SingletonId)
615#define PLACEHOLDER_TYPE(Id, SingletonId) \
616 case BuiltinType::Id:
617#include "clang/AST/BuiltinTypes.def"
618 llvm_unreachable(
"Unexpected placeholder builtin type!");
623 case Type::DeducedTemplateSpecialization:
624 llvm_unreachable(
"Unexpected undeduced type!");
625 case Type::Complex: {
627 ResultType = llvm::StructType::get(EltTy, EltTy);
630 case Type::LValueReference:
631 case Type::RValueReference: {
638 case Type::Pointer: {
646 case Type::VariableArray: {
649 "FIXME: We only handle trivial array types so far!");
655 case Type::IncompleteArray: {
658 "FIXME: We only handle trivial array types so far!");
662 if (!ResultType->isSized()) {
663 SkippedLayout =
true;
666 ResultType = llvm::ArrayType::get(ResultType, 0);
669 case Type::ArrayParameter:
670 case Type::ConstantArray: {
676 if (!EltTy->isSized()) {
677 SkippedLayout =
true;
681 ResultType = llvm::ArrayType::get(EltTy, A->
getZExtSize());
684 case Type::ExtVector:
688 llvm::Type *IRElemTy = VT->isPackedVectorBoolType(Context)
690 : VT->getElementType()->isMFloat8Type()
693 ResultType = llvm::FixedVectorType::get(IRElemTy, VT->getNumElements());
696 case Type::ConstantMatrix: {
703 case Type::FunctionNoProto:
704 case Type::FunctionProto:
705 ResultType = ConvertFunctionTypeInternal(T);
707 case Type::ObjCObject:
711 case Type::ObjCInterface: {
722 case Type::ObjCObjectPointer:
728 if (ED->isCompleteDefinition() || ED->isFixed())
737 case Type::BlockPointer: {
750 case Type::MemberPointer: {
752 if (!
getCXXABI().isMemberPointerConvertible(MPTy)) {
753 CanQualType T = CGM.getContext().getCanonicalTagType(
754 MPTy->getMostRecentCXXRecordDecl());
756 RecordsWithOpaqueMemberPointers.try_emplace(T.getTypePtr());
757 if (Insertion.second)
758 Insertion.first->second = llvm::StructType::create(
getLLVMContext());
759 ResultType = Insertion.first->second;
771 uint64_t valueSize = Context.getTypeSize(valueType);
772 uint64_t atomicSize = Context.getTypeSize(Ty);
773 if (valueSize != atomicSize) {
774 assert(valueSize < atomicSize);
775 llvm::Type *elts[] = {
777 llvm::ArrayType::get(CGM.Int8Ty, (atomicSize - valueSize) / 8)
785 ResultType = CGM.getOpenCLRuntime().getPipeType(
cast<PipeType>(Ty));
790 ResultType = llvm::Type::getIntNTy(
getLLVMContext(), EIT->getNumBits());
793 case Type::HLSLAttributedResource:
794 case Type::HLSLInlineSpirv:
795 ResultType = CGM.getHLSLRuntime().convertHLSLSpecificType(Ty);
797 case Type::OverflowBehavior:
803 assert(ResultType &&
"Didn't convert a type?");
804 assert((!CachedType || CachedType == ResultType) &&
805 "Cached type doesn't match computed type");
807 TypeCache[Ty] = ResultType;
816 return Context.getTypeSize(
type) != Context.getTypeSize(
type->getValueType());
823 const Type *Key = Context.getCanonicalTagType(RD).getTypePtr();
825 llvm::StructType *&Entry = RecordDeclTypes[Key];
832 llvm::StructType *Ty = Entry;
841 if (
const CXXRecordDecl *CRD = dyn_cast<CXXRecordDecl>(RD)) {
842 for (
const auto &I : CRD->bases()) {
843 if (I.isVirtual())
continue;
850 CGRecordLayouts[Key] = std::move(Layout);
864 const Type *Key = Context.getCanonicalTagType(RD).getTypePtr();
866 auto I = CGRecordLayouts.find(Key);
867 if (I != CGRecordLayouts.end())
873 I = CGRecordLayouts.find(Key);
875 assert(I != CGRecordLayouts.end() &&
876 "Unable to find record layout information for type");
881 assert((T->isAnyPointerType() || T->isBlockPointerType() ||
882 T->isNullPtrType()) &&
889 return Context.getTargetNullPointerValue(T) == 0;
891 if (
const auto *AT = Context.getAsArrayType(T)) {
894 if (
const auto *CAT = dyn_cast<ConstantArrayType>(AT))
895 if (Context.getConstantArrayElementCount(CAT) == 0)
897 T = Context.getBaseElementType(T);
902 if (
const auto *RD = T->getAsRecordDecl())
910 if (T->getAs<HLSLInlineSpirvType>())
926 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 QualType getUnderlyingType(const SubRegion *R)
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>'.
bool isNullPtrType() const
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)
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.