28#include "llvm/IR/DataLayout.h"
29#include "llvm/IR/DerivedTypes.h"
30#include "llvm/IR/Module.h"
36 : CGM(cgm), Context(cgm.
getContext()), TheModule(cgm.getModule()),
38 SkippedLayout =
false;
39 LongDoubleReferenced =
false;
43 for (llvm::FoldingSet<CGFunctionInfo>::iterator
44 I = FunctionInfos.begin(), E = FunctionInfos.end(); I != E; )
51 return CGM.getCodeGenOpts();
58 llvm::raw_svector_ostream OS(
TypeName);
80 if (TDD->getDeclContext())
81 TDD->printQualifiedName(OS, Policy);
90 Ty->setName(OS.str());
105 if (T->isConstantMatrixType()) {
106 const Type *Ty = Context.getCanonicalType(T).getTypePtr();
109 if (Context.getLangOpts().HLSL) {
110 if (T->isConstantMatrixBoolType())
116 unsigned VecLen = IsRowMajor ? NumCols : NumRows;
117 unsigned ArrayLen = IsRowMajor ? NumRows : NumCols;
118 llvm::Type *VecTy = llvm::FixedVectorType::get(IRElemTy, VecLen);
119 return llvm::ArrayType::get(VecTy, ArrayLen);
127 if (T->isExtVectorBoolType()) {
130 if (Context.getLangOpts().HLSL) {
132 return llvm::FixedVectorType::get(IRElemTy, FixedVT->getNumElements());
136 uint64_t BytePadded = std::max<uint64_t>(FixedVT->getNumElements(), 8);
137 return llvm::IntegerType::get(FixedVT->getContext(), BytePadded);
153 if (T->isBitIntType()) {
155 return llvm::ArrayType::get(CGM.Int8Ty,
156 Context.getTypeSizeInChars(T).getQuantity());
158 (
unsigned)Context.getTypeSize(T));
161 if (R->isIntegerTy(1))
163 (
unsigned)Context.getTypeSize(T));
170 llvm::Type *LLVMTy) {
174 CharUnits ASTSize = Context.getTypeSizeInChars(ASTTy);
177 return ASTSize != LLVMSize;
181 llvm::Type *LLVMTy) {
185 if (T->isBitIntType())
186 return llvm::Type::getIntNTy(
187 getLLVMContext(), Context.getTypeSizeInChars(T).getQuantity() * 8);
189 if (LLVMTy->isIntegerTy(1))
191 (
unsigned)Context.getTypeSize(T));
193 if (T->isConstantMatrixBoolType()) {
197 const Type *Ty = Context.getCanonicalType(T).getTypePtr();
203 if (T->isExtVectorBoolType())
212 llvm::DenseMap<const Type*, llvm::StructType *>::const_iterator I =
213 RecordDeclTypes.find(Ty);
214 return I != RecordDeclTypes.end() && !I->second->isOpaque();
227 const TagType *TT = Ty->
getAs<TagType>();
228 if (!TT)
return true;
231 return !TT->isIncompleteType();
245 for (
unsigned i = 0, e = FPT->getNumParams(); i != e; i++)
255 CanQualType T = CGM.getContext().getCanonicalTagType(TD);
259 if (
const EnumDecl *ED = dyn_cast<EnumDecl>(TD)) {
261 if (TypeCache.count(T->getTypePtr())) {
265 if (!
ConvertType(ED->getIntegerType())->isIntegerTy(32))
271 DI->completeType(ED);
282 if (RecordDeclTypes.count(T.getTypePtr()))
288 DI->completeType(RD);
293 T = Context.getCanonicalType(T);
295 const Type *Ty = T.getTypePtr();
296 if (RecordsWithOpaqueMemberPointers.count(Ty)) {
298 RecordsWithOpaqueMemberPointers.clear();
303 const llvm::fltSemantics &
format,
304 bool UseNativeHalf =
false) {
305 if (&
format == &llvm::APFloat::IEEEhalf()) {
307 return llvm::Type::getHalfTy(VMContext);
309 return llvm::Type::getInt16Ty(VMContext);
311 if (&
format == &llvm::APFloat::BFloat())
312 return llvm::Type::getBFloatTy(VMContext);
313 if (&
format == &llvm::APFloat::IEEEsingle())
314 return llvm::Type::getFloatTy(VMContext);
315 if (&
format == &llvm::APFloat::IEEEdouble())
316 return llvm::Type::getDoubleTy(VMContext);
317 if (&
format == &llvm::APFloat::IEEEquad())
318 return llvm::Type::getFP128Ty(VMContext);
319 if (&
format == &llvm::APFloat::PPCDoubleDouble())
320 return llvm::Type::getPPC_FP128Ty(VMContext);
321 if (&
format == &llvm::APFloat::x87DoubleExtended())
322 return llvm::Type::getX86_FP80Ty(VMContext);
323 llvm_unreachable(
"Unknown float format!");
326llvm::Type *CodeGenTypes::ConvertFunctionTypeInternal(QualType QFT) {
339 if (
const FunctionProtoType *FPT = dyn_cast<FunctionProtoType>(FT))
340 for (
unsigned i = 0, e = FPT->getNumParams(); i != e; i++)
341 if (
const auto *RD = FPT->getParamType(i)->getAsRecordDecl())
344 SkippedLayout =
true;
352 const CGFunctionInfo *FI;
353 if (
const FunctionProtoType *FPT = dyn_cast<FunctionProtoType>(FT)) {
362 llvm::Type *ResultType =
nullptr;
365 if (FunctionsBeingProcessed.count(FI)) {
368 SkippedLayout =
true;
380 T = Context.getCanonicalType(T);
382 const Type *Ty = T.getTypePtr();
386 if (Context.getLangOpts().CUDAIsDevice) {
387 if (T->isCUDADeviceBuiltinSurfaceType()) {
388 if (
auto *Ty = CGM.getTargetCodeGenInfo()
389 .getCUDADeviceBuiltinSurfaceDeviceType())
391 }
else if (T->isCUDADeviceBuiltinTextureType()) {
392 if (
auto *Ty = CGM.getTargetCodeGenInfo()
393 .getCUDADeviceBuiltinTextureDeviceType())
399 if (
const auto *RT = dyn_cast<RecordType>(Ty))
402 llvm::Type *CachedType =
nullptr;
403 auto TCI = TypeCache.find(Ty);
404 if (TCI != TypeCache.end())
405 CachedType = TCI->second;
408#ifndef EXPENSIVE_CHECKS
414 llvm::Type *ResultType =
nullptr;
417#define TYPE(Class, Base)
418#define ABSTRACT_TYPE(Class, Base)
419#define NON_CANONICAL_TYPE(Class, Base) case Type::Class:
420#define DEPENDENT_TYPE(Class, Base) case Type::Class:
421#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base) case Type::Class:
422#include "clang/AST/TypeNodes.inc"
423 llvm_unreachable(
"Non-canonical or dependent types aren't possible.");
425 case Type::Builtin: {
427 case BuiltinType::Void:
428 case BuiltinType::ObjCId:
429 case BuiltinType::ObjCClass:
430 case BuiltinType::ObjCSel:
436 case BuiltinType::Bool:
441 case BuiltinType::Char_S:
442 case BuiltinType::Char_U:
443 case BuiltinType::SChar:
444 case BuiltinType::UChar:
445 case BuiltinType::Short:
446 case BuiltinType::UShort:
447 case BuiltinType::Int:
448 case BuiltinType::UInt:
449 case BuiltinType::Long:
450 case BuiltinType::ULong:
451 case BuiltinType::LongLong:
452 case BuiltinType::ULongLong:
453 case BuiltinType::WChar_S:
454 case BuiltinType::WChar_U:
455 case BuiltinType::Char8:
456 case BuiltinType::Char16:
457 case BuiltinType::Char32:
458 case BuiltinType::ShortAccum:
459 case BuiltinType::Accum:
460 case BuiltinType::LongAccum:
461 case BuiltinType::UShortAccum:
462 case BuiltinType::UAccum:
463 case BuiltinType::ULongAccum:
464 case BuiltinType::ShortFract:
465 case BuiltinType::Fract:
466 case BuiltinType::LongFract:
467 case BuiltinType::UShortFract:
468 case BuiltinType::UFract:
469 case BuiltinType::ULongFract:
470 case BuiltinType::SatShortAccum:
471 case BuiltinType::SatAccum:
472 case BuiltinType::SatLongAccum:
473 case BuiltinType::SatUShortAccum:
474 case BuiltinType::SatUAccum:
475 case BuiltinType::SatULongAccum:
476 case BuiltinType::SatShortFract:
477 case BuiltinType::SatFract:
478 case BuiltinType::SatLongFract:
479 case BuiltinType::SatUShortFract:
480 case BuiltinType::SatUFract:
481 case BuiltinType::SatULongFract:
483 static_cast<unsigned>(Context.getTypeSize(T)));
486 case BuiltinType::Float16:
492 case BuiltinType::Half:
496 Context.getLangOpts().NativeHalfType ||
497 !Context.getTargetInfo().useFP16ConversionIntrinsics());
499 case BuiltinType::LongDouble:
500 LongDoubleReferenced =
true;
502 case BuiltinType::BFloat16:
503 case BuiltinType::Float:
504 case BuiltinType::Double:
505 case BuiltinType::Float128:
506 case BuiltinType::Ibm128:
508 Context.getFloatTypeSemantics(T),
512 case BuiltinType::NullPtr:
517 case BuiltinType::UInt128:
518 case BuiltinType::Int128:
522#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
523 case BuiltinType::Id:
524#include "clang/Basic/OpenCLImageTypes.def"
525#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
526 case BuiltinType::Id:
527#include "clang/Basic/OpenCLExtensionTypes.def"
528 case BuiltinType::OCLSampler:
529 case BuiltinType::OCLEvent:
530 case BuiltinType::OCLClkEvent:
531 case BuiltinType::OCLQueue:
532 case BuiltinType::OCLReserveID:
533 ResultType = CGM.getOpenCLRuntime().convertOpenCLSpecificType(Ty);
535#define SVE_VECTOR_TYPE(Name, MangledName, Id, SingletonId) \
536 case BuiltinType::Id:
537#define SVE_PREDICATE_TYPE(Name, MangledName, Id, SingletonId) \
538 case BuiltinType::Id:
539#include "clang/Basic/AArch64ACLETypes.def"
549 auto *VTy = llvm::VectorType::get(EltTy, Info.
EC);
552 llvm_unreachable(
"Expected 1, 2, 3 or 4 vectors!");
556 return llvm::StructType::get(VTy, VTy);
558 return llvm::StructType::get(VTy, VTy, VTy);
560 return llvm::StructType::get(VTy, VTy, VTy, VTy);
563 case BuiltinType::SveCount:
564 return llvm::TargetExtType::get(
getLLVMContext(),
"aarch64.svcount");
565 case BuiltinType::MFloat8:
566 return llvm::VectorType::get(llvm::Type::getInt8Ty(
getLLVMContext()), 1,
568#define PPC_VECTOR_TYPE(Name, Id, Size) \
569 case BuiltinType::Id: \
571 llvm::FixedVectorType::get(ConvertType(Context.BoolTy), Size); \
573#include "clang/Basic/PPCTypes.def"
574#define RVV_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
575#include "clang/Basic/RISCVVTypes.def"
580 unsigned I8EltCount =
581 Info.
EC.getKnownMinValue() *
583 return llvm::TargetExtType::get(
585 llvm::ScalableVectorType::get(
590 Info.
EC.getKnownMinValue());
592#define WASM_REF_TYPE(Name, MangledName, Id, SingletonId, AS) \
593 case BuiltinType::Id: { \
594 if (BuiltinType::Id == BuiltinType::WasmExternRef) \
595 ResultType = CGM.getTargetCodeGenInfo().getWasmExternrefReferenceType(); \
597 llvm_unreachable("Unexpected wasm reference builtin type!"); \
599#include "clang/Basic/WebAssemblyReferenceTypes.def"
600#define AMDGPU_OPAQUE_PTR_TYPE(Name, Id, SingletonId, Width, Align, AS) \
601 case BuiltinType::Id: { \
602 if (BuiltinType::Id == BuiltinType::AMDGPUTexture) { \
603 return llvm::FixedVectorType::get( \
604 llvm::Type::getInt32Ty(getLLVMContext()), 8); \
606 return llvm::PointerType::get(getLLVMContext(), AS); \
608#define AMDGPU_NAMED_BARRIER_TYPE(Name, Id, SingletonId, Width, Align, Scope) \
609 case BuiltinType::Id: \
610 return llvm::TargetExtType::get(getLLVMContext(), "amdgcn.named.barrier", \
612#define AMDGPU_FEATURE_PREDICATE_TYPE(Name, Id, SingletonId, Width, Align) \
613 case BuiltinType::Id: \
614 return ConvertType(getContext().getLogicalOperationType());
615#include "clang/Basic/AMDGPUTypes.def"
616#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
617#include "clang/Basic/HLSLIntangibleTypes.def"
618 ResultType = CGM.getHLSLRuntime().convertHLSLSpecificType(Ty);
620 case BuiltinType::Dependent:
621#define BUILTIN_TYPE(Id, SingletonId)
622#define PLACEHOLDER_TYPE(Id, SingletonId) \
623 case BuiltinType::Id:
624#include "clang/AST/BuiltinTypes.def"
625 llvm_unreachable(
"Unexpected placeholder builtin type!");
630 case Type::DeducedTemplateSpecialization:
631 llvm_unreachable(
"Unexpected undeduced type!");
632 case Type::Complex: {
634 ResultType = llvm::StructType::get(EltTy, EltTy);
637 case Type::LValueReference:
638 case Type::RValueReference: {
645 case Type::Pointer: {
653 case Type::VariableArray: {
656 "FIXME: We only handle trivial array types so far!");
662 case Type::IncompleteArray: {
665 "FIXME: We only handle trivial array types so far!");
669 if (!ResultType->isSized()) {
670 SkippedLayout =
true;
673 ResultType = llvm::ArrayType::get(ResultType, 0);
676 case Type::ArrayParameter:
677 case Type::ConstantArray: {
683 if (!EltTy->isSized()) {
684 SkippedLayout =
true;
688 ResultType = llvm::ArrayType::get(EltTy, A->
getZExtSize());
691 case Type::ExtVector:
695 llvm::Type *IRElemTy = VT->isPackedVectorBoolType(Context)
697 : VT->getElementType()->isMFloat8Type()
700 ResultType = llvm::FixedVectorType::get(IRElemTy, VT->getNumElements());
703 case Type::ConstantMatrix: {
710 case Type::FunctionNoProto:
711 case Type::FunctionProto:
712 ResultType = ConvertFunctionTypeInternal(T);
714 case Type::ObjCObject:
718 case Type::ObjCInterface: {
729 case Type::ObjCObjectPointer:
735 if (ED->isCompleteDefinition() || ED->isFixed())
744 case Type::BlockPointer: {
757 case Type::MemberPointer: {
759 if (!
getCXXABI().isMemberPointerConvertible(MPTy)) {
760 CanQualType T = CGM.getContext().getCanonicalTagType(
761 MPTy->getMostRecentCXXRecordDecl());
763 RecordsWithOpaqueMemberPointers.try_emplace(T.getTypePtr());
764 if (Insertion.second)
765 Insertion.first->second = llvm::StructType::create(
getLLVMContext());
766 ResultType = Insertion.first->second;
778 uint64_t valueSize = Context.getTypeSize(valueType);
779 uint64_t atomicSize = Context.getTypeSize(Ty);
780 if (valueSize != atomicSize) {
781 assert(valueSize < atomicSize);
782 llvm::Type *elts[] = {
784 llvm::ArrayType::get(CGM.Int8Ty, (atomicSize - valueSize) / 8)
792 ResultType = CGM.getOpenCLRuntime().getPipeType(
cast<PipeType>(Ty));
797 ResultType = llvm::Type::getIntNTy(
getLLVMContext(), EIT->getNumBits());
800 case Type::HLSLAttributedResource:
801 case Type::HLSLInlineSpirv:
802 ResultType = CGM.getHLSLRuntime().convertHLSLSpecificType(Ty);
804 case Type::OverflowBehavior:
810 assert(ResultType &&
"Didn't convert a type?");
811 assert((!CachedType || CachedType == ResultType) &&
812 "Cached type doesn't match computed type");
814 TypeCache[Ty] = ResultType;
823 return Context.getTypeSize(
type) != Context.getTypeSize(
type->getValueType());
830 const Type *Key = Context.getCanonicalTagType(RD).getTypePtr();
832 llvm::StructType *&Entry = RecordDeclTypes[Key];
839 llvm::StructType *Ty = Entry;
848 if (
const CXXRecordDecl *CRD = dyn_cast<CXXRecordDecl>(RD)) {
849 for (
const auto &I : CRD->bases()) {
850 if (I.isVirtual())
continue;
857 CGRecordLayouts[Key] = std::move(Layout);
871 const Type *Key = Context.getCanonicalTagType(RD).getTypePtr();
873 auto I = CGRecordLayouts.find(Key);
874 if (I != CGRecordLayouts.end())
880 I = CGRecordLayouts.find(Key);
882 assert(I != CGRecordLayouts.end() &&
883 "Unable to find record layout information for type");
888 assert((T->isAnyPointerType() || T->isBlockPointerType() ||
889 T->isNullPtrType()) &&
896 return Context.getTargetNullPointerValue(T) == 0;
898 if (
const auto *AT = Context.getAsArrayType(T)) {
901 if (
const auto *CAT = dyn_cast<ConstantArrayType>(AT))
902 if (Context.getConstantArrayElementCount(CAT) == 0)
904 T = Context.getBaseElementType(T);
909 if (
const auto *RD = T->getAsRecordDecl())
917 if (T->getAs<HLSLInlineSpirvType>())
933 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....
Defines AST-level helper utilities for matrix types.
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)
bool isMatrixRowMajor(const LangOptions &LangOpts, QualType T)
Returns true if matrices of T should be laid out in row-major order.
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.