forked from OSchip/llvm-project
[AST] Pack the unsigned of SubstTemplateTypeParmPackType into Type
The bit-fields of Type have enough space for the member unsigned NumArgs of SubstTemplateTypeParmPackType. Reviewed By: erichkeane Differential Revision: https://reviews.llvm.org/D50713 llvm-svn: 339861
This commit is contained in:
parent
e3b87c3df5
commit
08672ecef9
|
@ -1608,6 +1608,21 @@ protected:
|
|||
unsigned Keyword : 2;
|
||||
};
|
||||
|
||||
class SubstTemplateTypeParmPackTypeBitfields {
|
||||
friend class SubstTemplateTypeParmPackType;
|
||||
|
||||
unsigned : NumTypeBits;
|
||||
|
||||
/// The number of template arguments in \c Arguments, which is
|
||||
/// expected to be able to hold at least 1024 according to [implimits].
|
||||
/// However as this limit is somewhat easy to hit with template
|
||||
/// metaprogramming we'd prefer to keep it as large as possible.
|
||||
/// At the moment it has been left as a non-bitfield since this type
|
||||
/// safely fits in 64 bits as an unsigned, so there is no reason to
|
||||
/// introduce the performance impact of a bitfield.
|
||||
unsigned NumArgs;
|
||||
};
|
||||
|
||||
class TemplateSpecializationTypeBitfields {
|
||||
friend class TemplateSpecializationType;
|
||||
|
||||
|
@ -1672,6 +1687,7 @@ protected:
|
|||
ReferenceTypeBitfields ReferenceTypeBits;
|
||||
TypeWithKeywordBitfields TypeWithKeywordBits;
|
||||
VectorTypeBitfields VectorTypeBits;
|
||||
SubstTemplateTypeParmPackTypeBitfields SubstTemplateTypeParmPackTypeBits;
|
||||
TemplateSpecializationTypeBitfields TemplateSpecializationTypeBits;
|
||||
DependentTemplateSpecializationTypeBitfields
|
||||
DependentTemplateSpecializationTypeBits;
|
||||
|
@ -1697,6 +1713,9 @@ protected:
|
|||
"TypeWithKeywordBitfields is larger than 8 bytes!");
|
||||
static_assert(sizeof(VectorTypeBitfields) <= 8,
|
||||
"VectorTypeBitfields is larger than 8 bytes!");
|
||||
static_assert(sizeof(SubstTemplateTypeParmPackTypeBitfields) <= 8,
|
||||
"SubstTemplateTypeParmPackTypeBitfields is larger"
|
||||
" than 8 bytes!");
|
||||
static_assert(sizeof(TemplateSpecializationTypeBitfields) <= 8,
|
||||
"TemplateSpecializationTypeBitfields is larger"
|
||||
" than 8 bytes!");
|
||||
|
@ -4551,9 +4570,6 @@ class SubstTemplateTypeParmPackType : public Type, public llvm::FoldingSetNode {
|
|||
/// parameter pack is instantiated with.
|
||||
const TemplateArgument *Arguments;
|
||||
|
||||
/// The number of template arguments in \c Arguments.
|
||||
unsigned NumArguments;
|
||||
|
||||
SubstTemplateTypeParmPackType(const TemplateTypeParmType *Param,
|
||||
QualType Canon,
|
||||
const TemplateArgument &ArgPack);
|
||||
|
@ -4566,6 +4582,10 @@ public:
|
|||
return Replaced;
|
||||
}
|
||||
|
||||
unsigned getNumArgs() const {
|
||||
return SubstTemplateTypeParmPackTypeBits.NumArgs;
|
||||
}
|
||||
|
||||
bool isSugared() const { return false; }
|
||||
QualType desugar() const { return QualType(this, 0); }
|
||||
|
||||
|
|
|
@ -3285,11 +3285,12 @@ SubstTemplateTypeParmPackType(const TemplateTypeParmType *Param,
|
|||
QualType Canon,
|
||||
const TemplateArgument &ArgPack)
|
||||
: Type(SubstTemplateTypeParmPack, Canon, true, true, false, true),
|
||||
Replaced(Param),
|
||||
Arguments(ArgPack.pack_begin()), NumArguments(ArgPack.pack_size()) {}
|
||||
Replaced(Param), Arguments(ArgPack.pack_begin()) {
|
||||
SubstTemplateTypeParmPackTypeBits.NumArgs = ArgPack.pack_size();
|
||||
}
|
||||
|
||||
TemplateArgument SubstTemplateTypeParmPackType::getArgumentPack() const {
|
||||
return TemplateArgument(llvm::makeArrayRef(Arguments, NumArguments));
|
||||
return TemplateArgument(llvm::makeArrayRef(Arguments, getNumArgs()));
|
||||
}
|
||||
|
||||
void SubstTemplateTypeParmPackType::Profile(llvm::FoldingSetNodeID &ID) {
|
||||
|
|
Loading…
Reference in New Issue