Skip to content

Commit f009071

Browse files
Merge pull request #64649 from nate-chandler/rdar107283101
[TypeLowering] NFC: Fix lexicality check for packs.
2 parents 500686f + adb21a3 commit f009071

File tree

2 files changed

+27
-6
lines changed

2 files changed

+27
-6
lines changed

lib/SIL/IR/AbstractionPattern.cpp

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -544,6 +544,17 @@ static CanType getCanPackElementType(CanType type, unsigned index) {
544544
return cast<PackType>(type).getElementType(index);
545545
}
546546

547+
static CanType getCanSILPackElementType(CanType type, unsigned index) {
548+
return cast<SILPackType>(type).getElementType(index);
549+
}
550+
551+
static CanType getAnyCanPackElementType(CanType type, unsigned index) {
552+
if (isa<PackType>(type)) {
553+
return getCanPackElementType(type, index);
554+
}
555+
return getCanSILPackElementType(type, index);
556+
}
557+
547558
AbstractionPattern
548559
AbstractionPattern::getPackElementType(unsigned index) const {
549560
switch (getKind()) {
@@ -573,7 +584,7 @@ AbstractionPattern::getPackElementType(unsigned index) const {
573584
return AbstractionPattern::getOpaque();
574585
return AbstractionPattern(getGenericSubstitutions(),
575586
getGenericSignature(),
576-
getCanPackElementType(getType(), index));
587+
getAnyCanPackElementType(getType(), index));
577588
}
578589
llvm_unreachable("bad kind");
579590
}

lib/SIL/IR/TypeLowering.cpp

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2736,7 +2736,7 @@ bool TypeConverter::visitAggregateLeaves(
27362736
return {ty->getCanonicalType(), origTy, field, index};
27372737
};
27382738
auto isAggregate = [](Type ty) {
2739-
return ty->is<TupleType>() || ty->getEnumOrBoundGenericEnum() ||
2739+
return ty->is<SILPackType>() || ty->is<TupleType>() || ty->getEnumOrBoundGenericEnum() ||
27402740
ty->getStructOrBoundGenericStruct();
27412741
};
27422742
insertIntoWorklist(substType, origType, nullptr, llvm::None);
@@ -2747,7 +2747,17 @@ bool TypeConverter::visitAggregateLeaves(
27472747
Optional<unsigned> index;
27482748
std::tie(ty, origTy, field, index) = popFromWorklist();
27492749
if (isAggregate(ty) && !isLeafAggregate(ty, origTy, field, index)) {
2750-
if (auto tupleTy = ty->getAs<TupleType>()) {
2750+
if (auto packTy = ty->getAs<SILPackType>()) {
2751+
for (auto packIndex : indices(packTy->getElementTypes())) {
2752+
auto origElementTy = origTy.getPackElementType(packIndex);
2753+
auto substElementTy =
2754+
packTy->getElementType(packIndex)->getCanonicalType();
2755+
substElementTy =
2756+
computeLoweredRValueType(context, origElementTy, substElementTy);
2757+
insertIntoWorklist(substElementTy, origElementTy, nullptr,
2758+
packIndex);
2759+
}
2760+
} else if (auto tupleTy = ty->getAs<TupleType>()) {
27512761
for (unsigned tupleIndex = 0, num = tupleTy->getNumElements();
27522762
tupleIndex < num; ++tupleIndex) {
27532763
auto origElementTy = origTy.getTupleElementType(tupleIndex);
@@ -2826,9 +2836,9 @@ void TypeConverter::verifyLowering(const TypeLowering &lowering,
28262836
// The field's type is an aggregate. Treat it as a leaf if it
28272837
// has a lifetime annotation.
28282838

2829-
// If it's a field of a tuple or the top-level type, there's no value
2830-
// decl on which to look for an attribute. It's a leaf iff the type
2831-
// has a lifetime annotation.
2839+
// If it's a field of a tuple, pack or the top-level type, there's no
2840+
// value decl on which to look for an attribute. It's a leaf iff the
2841+
// type has a lifetime annotation.
28322842
if (index || !field)
28332843
return getLifetimeAnnotation(ty).isSome();
28342844

0 commit comments

Comments
 (0)