@@ -1468,12 +1468,10 @@ class AccessorConformanceInfo : public ConformanceInfo {
14681468
14691469 void defineAssociatedTypeWitnessTableAccessFunction (
14701470 AssociatedConformance requirement,
1471- CanType associatedType,
14721471 ProtocolConformanceRef conformance);
14731472
14741473 llvm::Constant *getAssociatedConformanceWitness (
14751474 AssociatedConformance requirement,
1476- CanType associatedType,
14771475 ProtocolConformanceRef conformance);
14781476
14791477 const FulfillmentMap &getFulfillmentMap () {
@@ -1765,10 +1763,6 @@ class AccessorConformanceInfo : public ConformanceInfo {
17651763 return ;
17661764 }
17671765
1768- auto associate =
1769- ConformanceInContext.getAssociatedType (
1770- requirement.getAssociation ())->getCanonicalType ();
1771-
17721766 ProtocolConformanceRef associatedConformance =
17731767 ConformanceInContext.getAssociatedConformance (
17741768 requirement.getAssociation (),
@@ -1802,8 +1796,7 @@ class AccessorConformanceInfo : public ConformanceInfo {
18021796 }
18031797
18041798 llvm::Constant *witnessEntry =
1805- getAssociatedConformanceWitness (requirement, associate,
1806- associatedConformance);
1799+ getAssociatedConformanceWitness (requirement, associatedConformance);
18071800
18081801 if (isRelative) {
18091802 Table.addRelativeAddress (witnessEntry);
@@ -1869,19 +1862,17 @@ static void buildAssociatedTypeValueName(CanType depAssociatedType,
18691862
18701863llvm::Constant *WitnessTableBuilderBase::getAssociatedConformanceWitness (
18711864 AssociatedConformance requirement,
1872- CanType associatedType,
18731865 ProtocolConformanceRef conformance) {
1874- defineAssociatedTypeWitnessTableAccessFunction (requirement, associatedType,
1875- conformance);
1866+ defineAssociatedTypeWitnessTableAccessFunction (requirement, conformance);
18761867 assert (isa<NormalProtocolConformance>(Conformance) && " has associated type" );
18771868 auto conf = cast<NormalProtocolConformance>(&Conformance);
18781869 return IGM.getMangledAssociatedConformance (conf, requirement);
18791870}
18801871
18811872void WitnessTableBuilderBase::defineAssociatedTypeWitnessTableAccessFunction (
18821873 AssociatedConformance requirement,
1883- CanType associatedType,
18841874 ProtocolConformanceRef associatedConformance) {
1875+ auto associatedType = associatedConformance.getType ()->getCanonicalType ();
18851876 bool hasArchetype = associatedType->hasArchetype ();
18861877 bool isOpaqueArchetype = isa<OpaqueTypeArchetypeType>(associatedType);
18871878
@@ -1926,8 +1917,6 @@ void WitnessTableBuilderBase::defineAssociatedTypeWitnessTableAccessFunction(
19261917 const ConformanceInfo *conformanceI = nullptr ;
19271918
19281919 if (associatedConformance.isConcrete ()) {
1929- assert (associatedType->isEqual (associatedConformance.getConcrete ()->getType ()));
1930-
19311920 conformanceI = &IGM.getConformanceInfo (associatedProtocol,
19321921 associatedConformance.getConcrete ());
19331922
@@ -2023,10 +2012,6 @@ void ResilientWitnessTableBuilder::collectResilientWitnesses(
20232012 if (entry.getKind () == SILWitnessTable::AssociatedConformance) {
20242013 const auto &witness = entry.getAssociatedConformanceWitness ();
20252014
2026- auto associate =
2027- ConformanceInContext.getAssociatedType (
2028- witness.Requirement )->getCanonicalType ();
2029-
20302015 ProtocolConformanceRef associatedConformance =
20312016 ConformanceInContext.getAssociatedConformance (witness.Requirement ,
20322017 witness.Witness .getProtocol ());
@@ -2036,8 +2021,7 @@ void ResilientWitnessTableBuilder::collectResilientWitnesses(
20362021 witness.Witness .getProtocol ());
20372022
20382023 llvm::Constant *witnessEntry =
2039- getAssociatedConformanceWitness (requirement, associate,
2040- associatedConformance);
2024+ getAssociatedConformanceWitness (requirement, associatedConformance);
20412025 resilientWitnesses.push_back (witnessEntry);
20422026 continue ;
20432027 }
@@ -2052,8 +2036,7 @@ void ResilientWitnessTableBuilder::collectResilientWitnesses(
20522036 ProtocolConformanceRef inheritedConformance =
20532037 ConformanceInContext.getAssociatedConformance (selfType, baseProto);
20542038 llvm::Constant *witnessEntry =
2055- getAssociatedConformanceWitness (requirement, ConcreteType,
2056- inheritedConformance);
2039+ getAssociatedConformanceWitness (requirement, inheritedConformance);
20572040 resilientWitnesses.push_back (witnessEntry);
20582041 continue ;
20592042 }
@@ -3448,12 +3431,12 @@ MetadataResponse MetadataPath::followComponent(IRGenFunction &IGF,
34483431 auto association = entry.getAssociatedConformancePath ();
34493432 auto associatedRequirement = entry.getAssociatedConformanceRequirement ();
34503433
3451- CanType associatedType = sourceConformance.getAssociatedType (association)
3452- ->getCanonicalType ();
3453- sourceKey.Type = associatedType;
34543434
34553435 auto associatedConformance =
34563436 sourceConformance.getAssociatedConformance (association, associatedRequirement);
3437+ auto associatedType = associatedConformance.getType ()->getCanonicalType ();
3438+
3439+ sourceKey.Type = associatedType;
34573440 sourceKey.Kind =
34583441 LocalTypeDataKind::forProtocolWitnessTable (associatedConformance);
34593442
@@ -3526,8 +3509,9 @@ MetadataResponse MetadataPath::followComponent(IRGenFunction &IGF,
35263509 // type directly.
35273510 auto depMemType = cast<DependentMemberType>(association);
35283511 CanType baseSubstType =
3529- sourceConformance.getAssociatedType (depMemType.getBase ())
3530- ->getCanonicalType ();
3512+ depMemType.getBase ().subst (
3513+ SubstitutionMap::getProtocolSubstitutions (sourceConformance))
3514+ ->getCanonicalType ();
35313515 if (auto archetypeType = dyn_cast<ArchetypeType>(baseSubstType)) {
35323516 AssociatedType baseAssocType (depMemType->getAssocType ());
35333517
0 commit comments