Skip to content

Commit 71b06cf

Browse files
authored
Merge pull request #40834 from slavapestov/subst-builtin-conformance-5.6
AST: Implement ProtocolConformance::subst() for BuiltinProtocolConformances [5.6]
2 parents 3beab2b + 25b1588 commit 71b06cf

File tree

2 files changed

+35
-1
lines changed

2 files changed

+35
-1
lines changed

lib/AST/ProtocolConformance.cpp

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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.
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
// RUN: %target-swift-frontend -typecheck %s
2+
3+
protocol P {
4+
associatedtype A: Sendable
5+
}
6+
7+
struct S<T>: P {
8+
typealias A = ()
9+
}

0 commit comments

Comments
 (0)