@@ -3988,8 +3988,16 @@ ConstraintResult GenericSignatureBuilder::expandConformanceRequirement(
3988
3988
ProtocolDecl *proto,
3989
3989
const RequirementSource *source,
3990
3990
bool onlySameTypeConstraints) {
3991
- auto protocolSubMap = SubstitutionMap::getProtocolSubstitutions (
3992
- proto, selfType.getDependentType (*this ), ProtocolConformanceRef (proto));
3991
+ auto selfTy = selfType.getDependentType (*this );
3992
+
3993
+ auto subst = [&](Requirement req) -> Optional<Requirement> {
3994
+ return req.subst (
3995
+ [&](SubstitutableType *t) -> Type {
3996
+ assert (isa<GenericTypeParamType>(t));
3997
+ return selfTy;
3998
+ },
3999
+ MakeAbstractConformanceForGenericType ());
4000
+ };
3993
4001
3994
4002
// Use the requirement signature to avoid rewalking the entire protocol. This
3995
4003
// cannot compute the requirement signature directly, because that may be
@@ -4003,7 +4011,7 @@ ConstraintResult GenericSignatureBuilder::expandConformanceRequirement(
4003
4011
if (onlySameTypeConstraints && req.getKind () != RequirementKind::SameType)
4004
4012
continue ;
4005
4013
4006
- auto substReq = req. subst (protocolSubMap );
4014
+ auto substReq = subst (req );
4007
4015
auto reqResult = substReq
4008
4016
? addRequirement (*substReq, innerSource, nullptr )
4009
4017
: ConstraintResult::Conflicting;
@@ -4032,8 +4040,9 @@ ConstraintResult GenericSignatureBuilder::expandConformanceRequirement(
4032
4040
4033
4041
auto innerSource = FloatingRequirementSource::viaProtocolRequirement (
4034
4042
source, proto, reqRepr->getSeparatorLoc (), /* inferred=*/ false );
4035
- addRequirement (req, reqRepr, innerSource,
4036
- &protocolSubMap, nullptr );
4043
+
4044
+ if (auto substReq = subst (req))
4045
+ addRequirement (*substReq, reqRepr, innerSource, nullptr );
4037
4046
return false ;
4038
4047
});
4039
4048
@@ -4146,7 +4155,7 @@ ConstraintResult GenericSignatureBuilder::expandConformanceRequirement(
4146
4155
source, proto, SourceLoc (), /* inferred=*/ true );
4147
4156
4148
4157
auto rawReq = Requirement (RequirementKind::SameType, firstType, secondType);
4149
- if (auto req = rawReq. subst (protocolSubMap ))
4158
+ if (auto req = subst (rawReq ))
4150
4159
addRequirement (*req, inferredSameTypeSource, proto->getParentModule ());
4151
4160
};
4152
4161
@@ -4174,8 +4183,10 @@ ConstraintResult GenericSignatureBuilder::expandConformanceRequirement(
4174
4183
4175
4184
auto innerSource = FloatingRequirementSource::viaProtocolRequirement (
4176
4185
source, proto, reqRepr->getSeparatorLoc (), /* inferred=*/ false );
4177
- addRequirement (req, reqRepr, innerSource, &protocolSubMap,
4178
- /* inferForModule=*/ nullptr );
4186
+ if (auto substReq = subst (req)) {
4187
+ addRequirement (*substReq, reqRepr, innerSource,
4188
+ /* inferForModule=*/ nullptr );
4189
+ }
4179
4190
return false ;
4180
4191
});
4181
4192
@@ -5160,28 +5171,19 @@ ConstraintResult
5160
5171
GenericSignatureBuilder::addRequirement (const Requirement &req,
5161
5172
FloatingRequirementSource source,
5162
5173
ModuleDecl *inferForModule) {
5163
- return addRequirement (req, nullptr , source, nullptr , inferForModule);
5174
+ return addRequirement (req, nullptr , source, inferForModule);
5164
5175
}
5165
5176
5166
5177
ConstraintResult
5167
5178
GenericSignatureBuilder::addRequirement (const Requirement &req,
5168
5179
const RequirementRepr *reqRepr,
5169
5180
FloatingRequirementSource source,
5170
- const SubstitutionMap *subMap,
5171
5181
ModuleDecl *inferForModule) {
5172
- // Local substitution for types in the requirement.
5173
- auto subst = [&](Type t) {
5174
- if (subMap)
5175
- return t.subst (*subMap);
5176
-
5177
- return t;
5178
- };
5179
-
5180
- auto firstType = subst (req.getFirstType ());
5182
+ auto firstType = req.getFirstType ();
5181
5183
switch (req.getKind ()) {
5182
5184
case RequirementKind::Superclass:
5183
5185
case RequirementKind::Conformance: {
5184
- auto secondType = subst ( req.getSecondType () );
5186
+ auto secondType = req.getSecondType ();
5185
5187
5186
5188
if (inferForModule) {
5187
5189
inferRequirements (*inferForModule, firstType,
@@ -5209,7 +5211,7 @@ GenericSignatureBuilder::addRequirement(const Requirement &req,
5209
5211
}
5210
5212
5211
5213
case RequirementKind::SameType: {
5212
- auto secondType = subst ( req.getSecondType () );
5214
+ auto secondType = req.getSecondType ();
5213
5215
5214
5216
if (inferForModule) {
5215
5217
inferRequirements (*inferForModule, firstType,
@@ -8697,8 +8699,8 @@ InferredGenericSignatureRequest::evaluate(
8697
8699
}
8698
8700
}
8699
8701
8700
- builder.addRequirement (req, reqRepr, source, nullptr ,
8701
- lookupDC->getParentModule ());
8702
+ builder.addRequirement (req, reqRepr, source,
8703
+ lookupDC->getParentModule ());
8702
8704
return false ;
8703
8705
};
8704
8706
0 commit comments