;
31using namespaceCodeGen;
34: CGM(cgm), Context(cgm.getContext()), TheModule(cgm.getModule()),
36SkippedLayout =
false;
37LongDoubleReferenced =
false;
41 for(llvm::FoldingSet<CGFunctionInfo>::iterator
42I = FunctionInfos.begin(),
E= FunctionInfos.end(); I !=
E; )
56llvm::raw_svector_ostream OS(
TypeName);
78 if(TDD->getDeclContext())
79TDD->printQualifiedName(OS, Policy);
88Ty->setName(OS.str());
114 auto*FixedVT = cast<llvm::FixedVectorType>(R);
116uint64_t BytePadded = std::max<uint64_t>(FixedVT->getNumElements(), 8);
117 returnllvm::IntegerType::get(FixedVT->getContext(), BytePadded);
135 returnllvm::ArrayType::get(CGM.
Int8Ty,
141 if(R->isIntegerTy(1))
150llvm::Type *LLVMTy) {
157 returnASTSize != LLVMSize;
161llvm::Type *LLVMTy) {
166 returnllvm::Type::getIntNTy(
169 if(LLVMTy->isIntegerTy(1))
182llvm::DenseMap<const Type*, llvm::StructType *>::const_iterator I =
183RecordDeclTypes.find(Ty);
184 returnI != RecordDeclTypes.end() && !I->second->isOpaque();
198 if(!TT)
return true;
215 for(
unsignedi = 0, e = FPT->getNumParams(); i != e; i++)
228 if(
const EnumDecl*ED = dyn_cast<EnumDecl>(TD)) {
230 if(TypeCache.count(ED->getTypeForDecl())) {
234 if(!
ConvertType(ED->getIntegerType())->isIntegerTy(32))
240DI->completeType(ED);
257DI->completeType(RD);
264 const Type*Ty =
T.getTypePtr();
265 if(RecordsWithOpaqueMemberPointers.count(Ty)) {
267RecordsWithOpaqueMemberPointers.clear();
272 constllvm::fltSemantics &format,
273 boolUseNativeHalf =
false) {
274 if(&format == &llvm::APFloat::IEEEhalf()) {
276 returnllvm::Type::getHalfTy(VMContext);
278 returnllvm::Type::getInt16Ty(VMContext);
280 if(&format == &llvm::APFloat::BFloat())
281 returnllvm::Type::getBFloatTy(VMContext);
282 if(&format == &llvm::APFloat::IEEEsingle())
283 returnllvm::Type::getFloatTy(VMContext);
284 if(&format == &llvm::APFloat::IEEEdouble())
285 returnllvm::Type::getDoubleTy(VMContext);
286 if(&format == &llvm::APFloat::IEEEquad())
287 returnllvm::Type::getFP128Ty(VMContext);
288 if(&format == &llvm::APFloat::PPCDoubleDouble())
289 returnllvm::Type::getPPC_FP128Ty(VMContext);
290 if(&format == &llvm::APFloat::x87DoubleExtended())
291 returnllvm::Type::getX86_FP80Ty(VMContext);
292llvm_unreachable(
"Unknown float format!");
295llvm::Type *CodeGenTypes::ConvertFunctionTypeInternal(
QualTypeQFT) {
309 for(
unsignedi = 0, e = FPT->getNumParams(); i != e; i++)
313SkippedLayout =
true;
331llvm::Type *ResultType =
nullptr;
334 if(FunctionsBeingProcessed.count(FI)) {
337SkippedLayout =
true;
351 const Type*Ty =
T.getTypePtr();
368 if(
const RecordType*RT = dyn_cast<RecordType>(Ty))
371llvm::Type *CachedType =
nullptr;
372 autoTCI = TypeCache.find(Ty);
373 if(TCI != TypeCache.end())
374CachedType = TCI->second;
377#ifndef EXPENSIVE_CHECKS 383llvm::Type *ResultType =
nullptr;
386#define TYPE(Class, Base) 387#define ABSTRACT_TYPE(Class, Base) 388#define NON_CANONICAL_TYPE(Class, Base) case Type::Class: 389#define DEPENDENT_TYPE(Class, Base) case Type::Class: 390#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base) case Type::Class: 391#include "clang/AST/TypeNodes.inc" 392llvm_unreachable(
"Non-canonical or dependent types aren't possible.");
394 caseType::Builtin: {
395 switch(cast<BuiltinType>(Ty)->
getKind()) {
396 caseBuiltinType::Void:
397 caseBuiltinType::ObjCId:
398 caseBuiltinType::ObjCClass:
399 caseBuiltinType::ObjCSel:
405 caseBuiltinType::Bool:
410 caseBuiltinType::Char_S:
411 caseBuiltinType::Char_U:
412 caseBuiltinType::SChar:
413 caseBuiltinType::UChar:
414 caseBuiltinType::Short:
415 caseBuiltinType::UShort:
416 caseBuiltinType::Int:
417 caseBuiltinType::UInt:
418 caseBuiltinType::Long:
419 caseBuiltinType::ULong:
420 caseBuiltinType::LongLong:
421 caseBuiltinType::ULongLong:
422 caseBuiltinType::WChar_S:
423 caseBuiltinType::WChar_U:
424 caseBuiltinType::Char8:
425 caseBuiltinType::Char16:
426 caseBuiltinType::Char32:
427 caseBuiltinType::ShortAccum:
428 caseBuiltinType::Accum:
429 caseBuiltinType::LongAccum:
430 caseBuiltinType::UShortAccum:
431 caseBuiltinType::UAccum:
432 caseBuiltinType::ULongAccum:
433 caseBuiltinType::ShortFract:
434 caseBuiltinType::Fract:
435 caseBuiltinType::LongFract:
436 caseBuiltinType::UShortFract:
437 caseBuiltinType::UFract:
438 caseBuiltinType::ULongFract:
439 caseBuiltinType::SatShortAccum:
440 caseBuiltinType::SatAccum:
441 caseBuiltinType::SatLongAccum:
442 caseBuiltinType::SatUShortAccum:
443 caseBuiltinType::SatUAccum:
444 caseBuiltinType::SatULongAccum:
445 caseBuiltinType::SatShortFract:
446 caseBuiltinType::SatFract:
447 caseBuiltinType::SatLongFract:
448 caseBuiltinType::SatUShortFract:
449 caseBuiltinType::SatUFract:
450 caseBuiltinType::SatULongFract:
455 caseBuiltinType::Float16:
461 caseBuiltinType::Half:
468 caseBuiltinType::LongDouble:
469LongDoubleReferenced =
true;
471 caseBuiltinType::BFloat16:
472 caseBuiltinType::Float:
473 caseBuiltinType::Double:
474 caseBuiltinType::Float128:
475 caseBuiltinType::Ibm128:
481 caseBuiltinType::NullPtr:
486 caseBuiltinType::UInt128:
487 caseBuiltinType::Int128:
491#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \ 492 case BuiltinType::Id: 493#include "clang/Basic/OpenCLImageTypes.def" 494#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \ 495 case BuiltinType::Id: 496#include "clang/Basic/OpenCLExtensionTypes.def" 497 caseBuiltinType::OCLSampler:
498 caseBuiltinType::OCLEvent:
499 caseBuiltinType::OCLClkEvent:
500 caseBuiltinType::OCLQueue:
501 caseBuiltinType::OCLReserveID:
504#define SVE_VECTOR_TYPE(Name, MangledName, Id, SingletonId) \ 505 case BuiltinType::Id: 506#define SVE_PREDICATE_TYPE(Name, MangledName, Id, SingletonId) \ 507 case BuiltinType::Id: 508#define SVE_TYPE(Name, Id, SingletonId) 509#include "clang/Basic/AArch64SVEACLETypes.def" 519 auto*VTy = llvm::VectorType::get(EltTy, Info.
EC);
522llvm_unreachable(
"Expected 1, 2, 3 or 4 vectors!");
526 returnllvm::StructType::get(VTy, VTy);
528 returnllvm::StructType::get(VTy, VTy, VTy);
530 returnllvm::StructType::get(VTy, VTy, VTy, VTy);
533 caseBuiltinType::SveCount:
534 returnllvm::TargetExtType::get(
getLLVMContext(),
"aarch64.svcount");
535 caseBuiltinType::MFloat8:
536 returnllvm::VectorType::get(llvm::Type::getInt8Ty(
getLLVMContext()), 1,
538#define PPC_VECTOR_TYPE(Name, Id, Size) \ 539 case BuiltinType::Id: \ 541 llvm::FixedVectorType::get(ConvertType(Context.BoolTy), Size); \ 543#include "clang/Basic/PPCTypes.def" 544#define RVV_TYPE(Name, Id, SingletonId) case BuiltinType::Id: 545#include "clang/Basic/RISCVVTypes.def" 550 unsignedI8EltCount =
551Info.
EC.getKnownMinValue() *
553 returnllvm::TargetExtType::get(
555llvm::ScalableVectorType::get(
560Info.
EC.getKnownMinValue());
562#define WASM_REF_TYPE(Name, MangledName, Id, SingletonId, AS) \ 563 case BuiltinType::Id: { \ 564 if (BuiltinType::Id == BuiltinType::WasmExternRef) \ 565 ResultType = CGM.getTargetCodeGenInfo().getWasmExternrefReferenceType(); \ 567 llvm_unreachable("Unexpected wasm reference builtin type!"); \
569#include "clang/Basic/WebAssemblyReferenceTypes.def" 570#define AMDGPU_OPAQUE_PTR_TYPE(Name, Id, SingletonId, Width, Align, AS) \ 571 case BuiltinType::Id: \ 572 return llvm::PointerType::get(getLLVMContext(), AS); 573#define AMDGPU_NAMED_BARRIER_TYPE(Name, Id, SingletonId, Width, Align, Scope) \ 574 case BuiltinType::Id: \ 575 return llvm::TargetExtType::get(getLLVMContext(), "amdgcn.named.barrier", \
577#include "clang/Basic/AMDGPUTypes.def" 578#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) case BuiltinType::Id: 579#include "clang/Basic/HLSLIntangibleTypes.def" 582 caseBuiltinType::Dependent:
583#define BUILTIN_TYPE(Id, SingletonId) 584#define PLACEHOLDER_TYPE(Id, SingletonId) \ 585 case BuiltinType::Id: 586#include "clang/AST/BuiltinTypes.def" 587llvm_unreachable(
"Unexpected placeholder builtin type!");
592 caseType::DeducedTemplateSpecialization:
593llvm_unreachable(
"Unexpected undeduced type!");
594 caseType::Complex: {
595llvm::Type *EltTy =
ConvertType(cast<ComplexType>(Ty)->getElementType());
596ResultType = llvm::StructType::get(EltTy, EltTy);
599 caseType::LValueReference:
600 caseType::RValueReference: {
607 caseType::Pointer: {
615 caseType::VariableArray: {
618 "FIXME: We only handle trivial array types so far!");
624 caseType::IncompleteArray: {
627 "FIXME: We only handle trivial array types so far!");
631 if(!ResultType->isSized()) {
632SkippedLayout =
true;
635ResultType = llvm::ArrayType::get(ResultType, 0);
638 caseType::ArrayParameter:
639 caseType::ConstantArray: {
645 if(!EltTy->isSized()) {
646SkippedLayout =
true;
650ResultType = llvm::ArrayType::get(EltTy, A->
getZExtSize());
653 caseType::ExtVector:
655 const auto*VT = cast<VectorType>(Ty);
657llvm::Type *IRElemTy = VT->isExtVectorBoolType()
659: VT->getElementType()->isMFloat8Type()
662ResultType = llvm::FixedVectorType::get(IRElemTy, VT->getNumElements());
665 caseType::ConstantMatrix: {
672 caseType::FunctionNoProto:
673 caseType::FunctionProto:
674ResultType = ConvertFunctionTypeInternal(
T);
676 caseType::ObjCObject:
677ResultType =
ConvertType(cast<ObjCObjectType>(Ty)->getBaseType());
680 caseType::ObjCInterface: {
684llvm::Type *&
T= InterfaceTypes[cast<ObjCInterfaceType>(Ty)];
691 caseType::ObjCObjectPointer:
696 const EnumDecl*ED = cast<EnumType>(Ty)->getDecl();
706 caseType::BlockPointer: {
719 caseType::MemberPointer: {
720 auto*MPTy = cast<MemberPointerType>(Ty);
721 if(!
getCXXABI().isMemberPointerConvertible(MPTy)) {
722 auto*
C= MPTy->getClass();
723 autoInsertion = RecordsWithOpaqueMemberPointers.insert({
C,
nullptr});
724 if(Insertion.second)
725Insertion.first->second = llvm::StructType::create(
getLLVMContext());
726ResultType = Insertion.first->second;
734 QualTypevalueType = cast<AtomicType>(Ty)->getValueType();
738uint64_t valueSize = Context.
getTypeSize(valueType);
740 if(valueSize != atomicSize) {
741assert(valueSize < atomicSize);
742llvm::Type *elts[] = {
744llvm::ArrayType::get(CGM.
Int8Ty, (atomicSize - valueSize) / 8)
756 const auto&EIT = cast<BitIntType>(Ty);
757ResultType = llvm::Type::getIntNTy(
getLLVMContext(), EIT->getNumBits());
760 caseType::HLSLAttributedResource:
765assert(ResultType &&
"Didn't convert a type?");
766assert((!CachedType || CachedType == ResultType) &&
767 "Cached type doesn't match computed type");
769TypeCache[Ty] = ResultType;
787llvm::StructType *&Entry = RecordDeclTypes[Key];
794llvm::StructType *Ty = Entry;
803 if(
const CXXRecordDecl*CRD = dyn_cast<CXXRecordDecl>(RD)) {
804 for(
const auto&I : CRD->bases()) {
805 if(I.isVirtual())
continue;
812CGRecordLayouts[Key] = std::move(Layout);
828 autoI = CGRecordLayouts.find(Key);
829 if(I != CGRecordLayouts.end())
835I = CGRecordLayouts.find(Key);
837assert(I != CGRecordLayouts.end() &&
838 "Unable to find record layout information for type");
852 if(isa<IncompleteArrayType>(AT))
854 if(
const auto*CAT = dyn_cast<ConstantArrayType>(AT))
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....
llvm::MachO::Target Target
static CharUnits getTypeAllocSize(CodeGenModule &CGM, llvm::Type *type)
BuiltinVectorTypeInfo getBuiltinVectorTypeInfo(const BuiltinType *VecTy) const
Returns the element type, element count and number of vectors (in case of tuple) for a builtin vector...
const llvm::fltSemantics & getFloatTypeSemantics(QualType T) const
Return the APFloat 'semantics' for the specified scalar floating point type.
QualType getTagDeclType(const TagDecl *Decl) const
Return the unique reference to the type for the specified TagDecl (struct/union/class/enum) decl.
QualType getRecordType(const RecordDecl *Decl) const
uint64_t getTargetNullPointerValue(QualType QT) const
Get target-dependent integer value for null pointer which is used for constant folding.
CanQualType getCanonicalType(QualType T) const
Return the canonical (structural) type corresponding to the specified potentially non-canonical type ...
const LangOptions & getLangOpts() const
QualType getBaseElementType(const ArrayType *VAT) const
Return the innermost element type of an array type.
const clang::PrintingPolicy & getPrintingPolicy() const
const ArrayType * getAsArrayType(QualType T) const
Type Query functions.
uint64_t getTypeSize(QualType T) const
Return the size of the specified (complete) type T, in bits.
CharUnits getTypeSizeInChars(QualType T) const
Return the size of the specified (complete) type T, in characters.
const TargetInfo & getTargetInfo() const
uint64_t getConstantArrayElementCount(const ConstantArrayType *CA) const
Return number of constant array elements.
unsigned getTargetAddressSpace(LangAS AS) const
QualType getElementType() const
unsigned getIndexTypeCVRQualifiers() const
Represents a C++ struct/union/class.
Represents a canonical, potentially-qualified type.
const T * getTypePtr() const
Retrieve the underlying type pointer, which refers to a canonical type.
CharUnits - This is an opaque type for sizes expressed in character units.
QuantityType getQuantity() const
getQuantity - Get the raw integer representation of this quantity.
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...
CGFunctionInfo - Class to encapsulate the information about a function definition.
llvm::Type * convertHLSLSpecificType(const Type *T)
virtual llvm::Type * getPipeType(const PipeType *T, StringRef Name, llvm::Type *&PipeTy)
virtual llvm::Type * convertOpenCLSpecificType(const Type *T)
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.
CGHLSLRuntime & getHLSLRuntime()
Return a reference to the configured HLSL runtime.
CGDebugInfo * getModuleDebugInfo()
bool isPaddedAtomicType(QualType type)
CGOpenCLRuntime & getOpenCLRuntime()
Return a reference to the configured OpenCL runtime.
CGCXXABI & getCXXABI() const
const TargetCodeGenInfo & getTargetCodeGenInfo()
const CodeGenOptions & getCodeGenOpts() 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....
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...
virtual llvm::Type * getCUDADeviceBuiltinSurfaceDeviceType() const
Return the device-side type for the CUDA device builtin surface type.
virtual llvm::Type * getCUDADeviceBuiltinTextureDeviceType() const
Return the device-side type for the CUDA device builtin texture type.
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.
ASTContext & getASTContext() const LLVM_READONLY
DeclContext * getDeclContext()
bool isFixed() const
Returns true if this is an Objective-C, C++11, or Microsoft-style enumeration with a fixed underlying...
QualType getIntegerType() const
Return the integer type this enum decl corresponds to.
Represents a K&R-style 'int foo()' function, which has no information available about its arguments.
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.
A helper class that allows the use of isa/cast/dyncast to detect TagType objects of structs/unions/cl...
RecordDecl * getDecl() const
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...
virtual bool useFP16ConversionIntrinsics() const
Check whether llvm intrinsics such as llvm.convert.to.fp16 should be used to convert to and from __fp...
The base class of the type hierarchy.
bool isBlockPointerType() const
bool isMFloat8Type() const
bool isConstantMatrixType() const
bool isCUDADeviceBuiltinSurfaceType() const
Check if the type is the CUDA device builtin surface type.
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.
bool isExtVectorBoolType() const
bool isBitIntType() const
bool isCUDADeviceBuiltinTextureType() const
Check if the type is the CUDA device builtin texture type.
bool isIncompleteType(NamedDecl **Def=nullptr) const
Types are partitioned into 3 broad categories (C99 6.2.5p1): object types, function types,...
bool isFunctionType() const
bool isAnyPointerType() 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.
const internal::VariadicAllOfMatcher< Type > type
Matches Types in the clang AST.
The JSON file list parser is used to communicate input to InstallAPI.
const FunctionProtoType * T
llvm::IntegerType * Int8Ty
i8, i16, i32, and i64
Describes how types, statements, expressions, and declarations should be printed.
unsigned SuppressInlineNamespace
Suppress printing parts of scope specifiers that correspond to inline namespaces.
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4