Skip to content

Commit 22bfaef

Browse files
authored
Merge pull request #65342 from slavapestov/bind-element-archetype-fix-5.9
Fix issues with binding local element archetypes [5.9]
2 parents 61ca949 + 1ecb8c2 commit 22bfaef

File tree

5 files changed

+76
-15
lines changed

5 files changed

+76
-15
lines changed

lib/AST/ParameterPack.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -301,7 +301,12 @@ PackType *PackType::getSingletonPackExpansion(Type param) {
301301
}
302302

303303
CanPackType CanPackType::getSingletonPackExpansion(CanType param) {
304-
return CanPackType(PackType::getSingletonPackExpansion(param));
304+
// Note: You can't just wrap the result in CanPackType() here because
305+
// PackExpansionType has the additional requirement that the count type
306+
// must be a reduced shape.
307+
return cast<PackType>(
308+
PackType::getSingletonPackExpansion(param)
309+
->getCanonicalType());
305310
}
306311

307312
PackExpansionType *PackType::unwrapSingletonPackExpansion() const {

lib/IRGen/GenPack.cpp

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -954,6 +954,7 @@ void irgen::bindOpenedElementArchetypesAtIndex(IRGenFunction &IGF,
954954
return openablePackParams.contains(
955955
ty->getRootGenericParam()->getCanonicalType());
956956
};
957+
957958
enumerateGenericSignatureRequirements(
958959
environment->getGenericSignature().getCanonicalSignature(),
959960
[&](GenericRequirement requirement) {
@@ -996,7 +997,18 @@ void irgen::bindOpenedElementArchetypesAtIndex(IRGenFunction &IGF,
996997
llvm::SmallVector<llvm::Value *, 2> wtables;
997998
auto *metadata = emitTypeMetadataPackElementRef(
998999
IGF, packType, conformances, index, MetadataState::Complete, wtables);
999-
IGF.bindArchetype(archetype, metadata, MetadataState::Complete, wtables);
1000+
1001+
auto reqt = GenericRequirement::forMetadata(archetype);
1002+
bindGenericRequirement(IGF, reqt, metadata, MetadataState::Complete,
1003+
SubstitutionMap());
1004+
1005+
assert(conformances.size() == wtables.size());
1006+
for (unsigned i : indices(wtables)) {
1007+
auto reqt = GenericRequirement::forWitnessTable(
1008+
archetype, conformances[i].getRequirement());
1009+
bindGenericRequirement(IGF, reqt, wtables[i], MetadataState::Complete,
1010+
SubstitutionMap());
1011+
}
10001012
}
10011013
}
10021014

lib/IRGen/GenProto.cpp

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3753,18 +3753,24 @@ void irgen::bindGenericRequirement(IRGenFunction &IGF,
37533753
case GenericRequirement::Kind::WitnessTable:
37543754
case GenericRequirement::Kind::WitnessTablePack: {
37553755
auto proto = requirement.getProtocol();
3756-
auto conf = subs.lookupConformance(requirement.getTypeParameter(), proto);
3756+
setProtocolWitnessTableName(IGF.IGM, value, type, proto);
37573757

3758-
// FIXME: Remove this
3759-
if (conf.isPack() && isa<PackArchetypeType>(type)) {
3760-
assert(wasUnwrappedPack);
3761-
assert(conf.getPack()->getPatternConformances().size() == 1);
3762-
conf = conf.getPack()->getPatternConformances()[0];
3763-
}
3758+
if (subs) {
3759+
auto conf = subs.lookupConformance(requirement.getTypeParameter(), proto);
37643760

3765-
setProtocolWitnessTableName(IGF.IGM, value, type, proto);
3766-
auto kind = LocalTypeDataKind::forProtocolWitnessTable(conf);
3767-
IGF.setUnscopedLocalTypeData(type, kind, value);
3761+
// FIXME: Remove this
3762+
if (conf.isPack() && isa<PackArchetypeType>(type)) {
3763+
assert(wasUnwrappedPack);
3764+
assert(conf.getPack()->getPatternConformances().size() == 1);
3765+
conf = conf.getPack()->getPatternConformances()[0];
3766+
}
3767+
3768+
auto kind = LocalTypeDataKind::forProtocolWitnessTable(conf);
3769+
IGF.setUnscopedLocalTypeData(type, kind, value);
3770+
} else {
3771+
auto kind = LocalTypeDataKind::forAbstractProtocolWitnessTable(proto);
3772+
IGF.setUnscopedLocalTypeData(type, kind, value);
3773+
}
37683774
break;
37693775
}
37703776
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
// RUN: %target-swift-frontend -emit-ir %s
2+
3+
public protocol P {}
4+
5+
public protocol Q {
6+
associatedtype A: P
7+
}
8+
9+
public func f<T: P>(_: T) {}
10+
11+
public func foo1<each T: Q>(t: repeat each T, u: repeat each T.A) {
12+
repeat f(each u)
13+
}
14+
15+
public func foo2<each T: Q, each U>(t: repeat each T, u: repeat each U)
16+
where repeat (each U) == (each T).A, (repeat (each T, each U)): Any {
17+
repeat f(each u)
18+
}
19+

test/SILOptimizer/tuples_from_packs.swift

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,29 @@ public func makeEmptyTuple() {
2121
return makeTuple()
2222
}
2323

24-
// FIXME: This crashes in SILGen
25-
/*public func makeOne<T>(_ t: T) -> T {
24+
// FIXME: Useless pack_element_set/pack_element_get
25+
26+
// CHECK-LABEL: sil @$s17tuples_from_packs7makeOneyxxlF : $@convention(thin) <T> (@in_guaranteed T) -> @out T {
27+
// CHECK: bb0(%0 : $*T, %1 : $*T):
28+
// CHECK: [[PACK:%.*]] = alloc_pack $Pack{T}
29+
// CHECK-NEXT: [[IDX:%.*]] = scalar_pack_index 0 of $Pack{T}
30+
// CHECK-NEXT: pack_element_set %0 : $*T into [[IDX]] of [[PACK]] : $*Pack{T}
31+
// CHECK-NEXT: [[PACK2:%.*]] = alloc_pack $Pack{T}
32+
// CHECK-NEXT: [[BOX:%.*]] = alloc_stack $T
33+
// CHECK-NEXT: copy_addr %1 to [init] [[BOX]] : $*T
34+
// CHECK-NEXT: pack_element_set [[BOX]] : $*T into [[IDX]] of [[PACK2]] : $*Pack{T}
35+
// CHECK-NEXT: [[ELT:%.*]] = pack_element_get [[IDX]] of [[PACK]] : $*Pack{T} as $*T
36+
// CHECK-NEXT: [[ELT2:%.*]] = pack_element_get [[IDX]] of [[PACK2]] : $*Pack{T} as $*T
37+
// CHECK-NEXT: copy_addr [[ELT2]] to [init] [[ELT]] : $*T
38+
// CHECK-NEXT: destroy_addr [[BOX]] : $*T
39+
// CHECK-NEXT: dealloc_stack [[BOX]] : $*T
40+
// CHECK-NEXT: dealloc_pack [[PACK2]] : $*Pack{T}
41+
// CHECK-NEXT: dealloc_pack [[PACK]] : $*Pack{T}
42+
// CHECK-NEXT: [[RET:%.*]] = tuple ()
43+
// CHECK-NEXT: return [[RET]] : $()
44+
public func makeOne<T>(_ t: T) -> T {
2645
return makeTuple(t)
27-
}*/
46+
}
2847

2948
// FIXME: Useless pack_element_set/pack_element_get
3049

0 commit comments

Comments
 (0)