Skip to content

Commit d3f0cbe

Browse files
committed
IRGen: Fix conformances of variadic generic types
Fixes rdar://107480494.
1 parent 4f2ab59 commit d3f0cbe

File tree

1 file changed

+13
-18
lines changed

1 file changed

+13
-18
lines changed

lib/IRGen/GenProto.cpp

Lines changed: 13 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1113,7 +1113,9 @@ emitConditionalConformancesBuffer(IRGenFunction &IGF,
11131113
for (auto idx : indices(tables)) {
11141114
auto slot =
11151115
IGF.Builder.CreateConstArrayGEP(buffer, idx, IGF.IGM.getPointerSize());
1116-
IGF.Builder.CreateStore(tables[idx], slot);
1116+
auto wtable =
1117+
IGF.Builder.CreateBitCast(tables[idx], IGF.IGM.WitnessTablePtrTy);
1118+
IGF.Builder.CreateStore(wtable, slot);
11171119
}
11181120

11191121
return buffer.getAddress();
@@ -1184,15 +1186,11 @@ getWitnessTableLazyAccessFunction(IRGenModule &IGM,
11841186
return accessor;
11851187
}
11861188

1187-
static const ProtocolConformance &
1188-
mapConformanceIntoContext(IRGenModule &IGM, const RootProtocolConformance &conf,
1189-
DeclContext *dc) {
1190-
auto normal = dyn_cast<NormalProtocolConformance>(&conf);
1191-
if (!normal) return conf;
1192-
return *conf.subst([&](SubstitutableType *t) -> Type {
1193-
return dc->mapTypeIntoContext(t);
1194-
},
1195-
LookUpConformanceInModule(IGM.getSwiftModule()));
1189+
static const ProtocolConformance *
1190+
mapConformanceIntoContext(const RootProtocolConformance *conf) {
1191+
if (auto *genericEnv = conf->getDeclContext()->getGenericEnvironmentOfContext())
1192+
return conf->subst(genericEnv->getForwardingSubstitutionMap());
1193+
return conf;
11961194
}
11971195

11981196
WitnessIndex ProtocolInfo::getAssociatedTypeIndex(
@@ -1292,22 +1290,19 @@ class AccessorConformanceInfo : public ConformanceInfo {
12921290
protected:
12931291
IRGenModule &IGM;
12941292
SILWitnessTable *SILWT;
1295-
CanType ConcreteType;
12961293
const RootProtocolConformance &Conformance;
12971294
const ProtocolConformance &ConformanceInContext;
1295+
CanType ConcreteType;
12981296

12991297
Optional<FulfillmentMap> Fulfillments;
13001298

13011299
WitnessTableBuilderBase(IRGenModule &IGM, SILWitnessTable *SILWT)
13021300
: IGM(IGM), SILWT(SILWT),
1303-
ConcreteType(SILWT->getConformance()->getDeclContext()
1304-
->mapTypeIntoContext(
1305-
SILWT->getConformance()->getType())
1306-
->getCanonicalType()),
13071301
Conformance(*SILWT->getConformance()),
1308-
ConformanceInContext(
1309-
mapConformanceIntoContext(IGM, Conformance,
1310-
Conformance.getDeclContext())) {}
1302+
ConformanceInContext(*mapConformanceIntoContext(SILWT->getConformance())),
1303+
ConcreteType(Conformance.getDeclContext()
1304+
->mapTypeIntoContext(Conformance.getType())
1305+
->getCanonicalType()) {}
13111306

13121307
void defineAssociatedTypeWitnessTableAccessFunction(
13131308
AssociatedConformance requirement,

0 commit comments

Comments
 (0)