[PATCH] D50711: [AST] Pack the unsigned of PackExpansionType into Type
Bruno Ricci via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Tue Aug 14 08:41:07 PDT 2018
riccibruno created this revision.
riccibruno added reviewers: rsmith, rjmccall, erichkeane.
riccibruno added a project: clang.
Herald added a subscriber: cfe-commits.
The bit-fields of Type have enough space for
the `unsigned NumExpansions` of PackExpansionType
Repository:
rC Clang
https://reviews.llvm.org/D50711
Files:
include/clang/AST/Type.h
Index: include/clang/AST/Type.h
===================================================================
--- include/clang/AST/Type.h
+++ include/clang/AST/Type.h
@@ -1638,6 +1638,21 @@
unsigned NumArgs;
};
+ class PackExpansionTypeBitfields {
+ friend class PackExpansionType;
+
+ unsigned : NumTypeBits;
+
+ /// The number of expansions that this pack expansion will
+ /// generate when substituted (+1).
+ ///
+ /// This field will only have a non-zero value when some of the parameter
+ /// packs that occur within the pattern have been substituted but others
+ /// have not. Intentionally not a bitfield since we have plenty
+ /// of space left.
+ unsigned NumExpansions;
+ };
+
union {
TypeBitfields TypeBits;
ArrayTypeBitfields ArrayTypeBits;
@@ -1650,6 +1665,7 @@
TypeWithKeywordBitfields TypeWithKeywordBits;
VectorTypeBitfields VectorTypeBits;
TemplateSpecializationTypeBitfields TemplateSpecializationTypeBits;
+ PackExpansionTypeBitfields PackExpansionTypeBits;
static_assert(sizeof(TypeBitfields) <= 8,
"TypeBitfields is larger than 8 bytes!");
@@ -1674,6 +1690,8 @@
static_assert(sizeof(TemplateSpecializationTypeBitfields) <= 8,
"TemplateSpecializationTypeBitfields is larger"
" than 8 bytes!");
+ static_assert(sizeof(PackExpansionTypeBitfields) <= 8,
+ "PackExpansionTypeBitfields is larger than 8 bytes");
};
private:
@@ -5189,22 +5207,16 @@
/// The pattern of the pack expansion.
QualType Pattern;
- /// The number of expansions that this pack expansion will
- /// generate when substituted (+1), or indicates that
- ///
- /// This field will only have a non-zero value when some of the parameter
- /// packs that occur within the pattern have been substituted but others have
- /// not.
- unsigned NumExpansions;
-
PackExpansionType(QualType Pattern, QualType Canon,
Optional<unsigned> NumExpansions)
: Type(PackExpansion, Canon, /*Dependent=*/Pattern->isDependentType(),
/*InstantiationDependent=*/true,
/*VariablyModified=*/Pattern->isVariablyModifiedType(),
/*ContainsUnexpandedParameterPack=*/false),
- Pattern(Pattern),
- NumExpansions(NumExpansions ? *NumExpansions + 1 : 0) {}
+ Pattern(Pattern) {
+ PackExpansionTypeBits.NumExpansions =
+ NumExpansions ? *NumExpansions + 1 : 0;
+ }
public:
/// Retrieve the pattern of this pack expansion, which is the
@@ -5215,9 +5227,8 @@
/// Retrieve the number of expansions that this pack expansion will
/// generate, if known.
Optional<unsigned> getNumExpansions() const {
- if (NumExpansions)
- return NumExpansions - 1;
-
+ if (PackExpansionTypeBits.NumExpansions)
+ return PackExpansionTypeBits.NumExpansions - 1;
return None;
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D50711.160599.patch
Type: text/x-patch
Size: 2924 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20180814/da99858b/attachment.bin>
More information about the cfe-commits
mailing list