Skip to content

Commit 7bde868

Browse files
committed
AST: Simplify RequirementEnvironment construction a bit more
1 parent 03de964 commit 7bde868

File tree

1 file changed

+19
-26
lines changed

1 file changed

+19
-26
lines changed

lib/AST/RequirementEnvironment.cpp

Lines changed: 19 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -116,33 +116,26 @@ RequirementEnvironment::RequirementEnvironment(
116116
InFlightSubstitution &IFS, Type type, ProtocolDecl *proto)
117117
-> ProtocolConformanceRef {
118118
// The protocol 'Self' conforms concretely to the conforming type.
119-
if (type->isEqual(ctx.TheSelfType)) {
120-
auto replacement = type.subst(IFS);
121-
ASSERT(covariantSelf || replacement->isEqual(substConcreteType));
122-
123-
if (conformance) {
124-
ProtocolConformance *specialized = conformance;
125-
126-
if (conformance->getGenericSignature()) {
127-
auto concreteSubs =
128-
substConcreteType->getContextSubstitutionMap(conformanceDC);
129-
specialized =
130-
ctx.getSpecializedConformance(substConcreteType,
131-
cast<NormalProtocolConformance>(conformance),
132-
concreteSubs);
133-
}
134-
135-
// findWitnessedObjCRequirements() does a weird thing by passing in a
136-
// DC that is not the conformance DC. Work around it here.
137-
if (!specialized->getType()->isEqual(replacement)) {
138-
ASSERT(specialized->getType()->isExactSuperclassOf(substConcreteType));
139-
ASSERT(covariantSelf ? replacement->is<GenericTypeParamType>()
140-
: replacement->isEqual(substConcreteType));
141-
specialized = ctx.getInheritedConformance(replacement, specialized);
142-
}
143-
144-
return ProtocolConformanceRef(specialized);
119+
if (type->isEqual(ctx.TheSelfType) && !covariantSelf && conformance) {
120+
ProtocolConformance *specialized = conformance;
121+
122+
if (conformance->getGenericSignature()) {
123+
auto concreteSubs =
124+
substConcreteType->getContextSubstitutionMap(conformanceDC);
125+
specialized =
126+
ctx.getSpecializedConformance(substConcreteType,
127+
cast<NormalProtocolConformance>(conformance),
128+
concreteSubs);
129+
}
130+
131+
// findWitnessedObjCRequirements() does a weird thing by passing in a
132+
// DC that is not the conformance DC. Work around it here.
133+
if (!specialized->getType()->isEqual(substConcreteType)) {
134+
ASSERT(specialized->getType()->isExactSuperclassOf(substConcreteType));
135+
specialized = ctx.getInheritedConformance(substConcreteType, specialized);
145136
}
137+
138+
return ProtocolConformanceRef(specialized);
146139
}
147140

148141
// All other generic parameters come from the requirement itself

0 commit comments

Comments
 (0)