Skip to content

Commit 1ecb8c2

Browse files
committed
IRGen: bindOpenedElementArchetypesAtIndex() should use bindGenericRequirement()
Fixes rdar://problem/107852985.
1 parent e68471b commit 1ecb8c2

File tree

3 files changed

+48
-11
lines changed

3 files changed

+48
-11
lines changed

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+

0 commit comments

Comments
 (0)