@@ -1165,8 +1165,33 @@ ProtocolConformance::subst(TypeSubstitutionFn subs,
11651165 const_cast <ProtocolConformance *>(this ),
11661166 subMap);
11671167 }
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+ }
11681194 case ProtocolConformanceKind::Self:
1169- case ProtocolConformanceKind::Builtin:
11701195 return const_cast <ProtocolConformance*>(this );
11711196 case ProtocolConformanceKind::Inherited: {
11721197 // Substitute the base.
0 commit comments