Skip to content

Commit 38d20c7

Browse files
committed
[TypeLowering] Fixed lexicality verification.
It needs to look into pack types.
1 parent 7401d19 commit 38d20c7

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
@@ -554,6 +554,17 @@ static CanType getCanPackElementType(CanType type, unsigned index) {
554554
return cast<PackType>(type).getElementType(index);
555555
}
556556

557+
static CanType getCanSILPackElementType(CanType type, unsigned index) {
558+
return cast<SILPackType>(type).getElementType(index);
559+
}
560+
561+
static CanType getAnyCanPackElementType(CanType type, unsigned index) {
562+
if (isa<PackType>(type)) {
563+
return getCanPackElementType(type, index);
564+
}
565+
return getCanSILPackElementType(type, index);
566+
}
567+
557568
AbstractionPattern
558569
AbstractionPattern::getPackElementType(unsigned index) const {
559570
switch (getKind()) {
@@ -583,7 +594,7 @@ AbstractionPattern::getPackElementType(unsigned index) const {
583594
return AbstractionPattern::getOpaque();
584595
return AbstractionPattern(getGenericSubstitutions(),
585596
getGenericSignature(),
586-
getCanPackElementType(getType(), index));
597+
getAnyCanPackElementType(getType(), index));
587598
}
588599
llvm_unreachable("bad kind");
589600
}

lib/SIL/IR/TypeLowering.cpp

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2733,7 +2733,7 @@ bool TypeConverter::visitAggregateLeaves(
27332733
return {ty->getCanonicalType(), origTy, field, index};
27342734
};
27352735
auto isAggregate = [](Type ty) {
2736-
return ty->is<TupleType>() || ty->getEnumOrBoundGenericEnum() ||
2736+
return ty->is<SILPackType>() || ty->is<TupleType>() || ty->getEnumOrBoundGenericEnum() ||
27372737
ty->getStructOrBoundGenericStruct();
27382738
};
27392739
insertIntoWorklist(substType, origType, nullptr, llvm::None);
@@ -2744,7 +2744,17 @@ bool TypeConverter::visitAggregateLeaves(
27442744
Optional<unsigned> index;
27452745
std::tie(ty, origTy, field, index) = popFromWorklist();
27462746
if (isAggregate(ty) && !isLeafAggregate(ty, origTy, field, index)) {
2747-
if (auto tupleTy = ty->getAs<TupleType>()) {
2747+
if (auto packTy = ty->getAs<SILPackType>()) {
2748+
for (auto packIndex : indices(packTy->getElementTypes())) {
2749+
auto origElementTy = origTy.getPackElementType(packIndex);
2750+
auto substElementTy =
2751+
packTy->getElementType(packIndex)->getCanonicalType();
2752+
substElementTy =
2753+
computeLoweredRValueType(context, origElementTy, substElementTy);
2754+
insertIntoWorklist(substElementTy, origElementTy, nullptr,
2755+
packIndex);
2756+
}
2757+
} else if (auto tupleTy = ty->getAs<TupleType>()) {
27482758
for (unsigned tupleIndex = 0, num = tupleTy->getNumElements();
27492759
tupleIndex < num; ++tupleIndex) {
27502760
auto origElementTy = origTy.getTupleElementType(tupleIndex);
@@ -2822,9 +2832,9 @@ void TypeConverter::verifyLowering(const TypeLowering &lowering,
28222832
// The field's type is an aggregate. Treat it as a leaf if it
28232833
// has a lifetime annotation.
28242834

2825-
// If it's a field of a tuple or the top-level type, there's no value
2826-
// decl on which to look for an attribute. It's a leaf iff the type
2827-
// has a lifetime annotation.
2835+
// If it's a field of a tuple, pack or the top-level type, there's no
2836+
// value decl on which to look for an attribute. It's a leaf iff the
2837+
// type has a lifetime annotation.
28282838
if (index || !field)
28292839
return getLifetimeAnnotation(ty).isSome();
28302840

0 commit comments

Comments
 (0)