@@ -1165,8 +1165,33 @@ ProtocolConformance::subst(TypeSubstitutionFn subs,
1165
1165
const_cast <ProtocolConformance *>(this ),
1166
1166
subMap);
1167
1167
}
1168
+ case ProtocolConformanceKind::Builtin: {
1169
+ auto origType = getType ();
1170
+ if (!origType->hasTypeParameter () &&
1171
+ !origType->hasArchetype ())
1172
+ return const_cast <ProtocolConformance *>(this );
1173
+
1174
+ auto substType = origType.subst (subs, conformances, options);
1175
+
1176
+ // We do an exact pointer equality check because subst() can
1177
+ // change sugar.
1178
+ if (substType.getPointer () == origType.getPointer ())
1179
+ return const_cast <ProtocolConformance *>(this );
1180
+
1181
+ SmallVector<Requirement, 2 > requirements;
1182
+ for (auto req : getConditionalRequirements ()) {
1183
+ requirements.push_back (*req.subst (subs, conformances, options));
1184
+ }
1185
+
1186
+ auto kind = cast<BuiltinProtocolConformance>(this )
1187
+ ->getBuiltinConformanceKind ();
1188
+
1189
+ return substType->getASTContext ()
1190
+ .getBuiltinConformance (substType,
1191
+ getProtocol (), getGenericSignature (),
1192
+ requirements, kind);
1193
+ }
1168
1194
case ProtocolConformanceKind::Self:
1169
- case ProtocolConformanceKind::Builtin:
1170
1195
return const_cast <ProtocolConformance*>(this );
1171
1196
case ProtocolConformanceKind::Inherited: {
1172
1197
// Substitute the base.
0 commit comments