@@ -294,7 +294,17 @@ std::string ASTMangler::mangleKeyPathGetterThunkHelper(
294
294
// Subscripts can be generic, and different key paths could capture the same
295
295
// subscript at different generic arguments.
296
296
for (auto sub : subs.getReplacementTypes ()) {
297
- appendType (sub->mapTypeOutOfContext ()->getCanonicalType (), signature);
297
+ sub = sub->mapTypeOutOfContext ();
298
+
299
+ // FIXME: This seems wrong. We used to just mangle opened archetypes as
300
+ // their interface type. Let's make that explicit now.
301
+ sub = sub.transformRec ([](Type t) -> Optional<Type> {
302
+ if (auto *openedExistential = t->getAs <OpenedArchetypeType>())
303
+ return openedExistential->getInterfaceType ();
304
+ return None;
305
+ });
306
+
307
+ appendType (sub->getCanonicalType (), signature);
298
308
}
299
309
}
300
310
appendOperator (" TK" );
@@ -318,7 +328,17 @@ std::string ASTMangler::mangleKeyPathSetterThunkHelper(
318
328
// Subscripts can be generic, and different key paths could capture the same
319
329
// subscript at different generic arguments.
320
330
for (auto sub : subs.getReplacementTypes ()) {
321
- appendType (sub->mapTypeOutOfContext ()->getCanonicalType (), signature);
331
+ sub = sub->mapTypeOutOfContext ();
332
+
333
+ // FIXME: This seems wrong. We used to just mangle opened archetypes as
334
+ // their interface type. Let's make that explicit now.
335
+ sub = sub.transformRec ([](Type t) -> Optional<Type> {
336
+ if (auto *openedExistential = t->getAs <OpenedArchetypeType>())
337
+ return openedExistential->getInterfaceType ();
338
+ return None;
339
+ });
340
+
341
+ appendType (sub->getCanonicalType (), signature);
322
342
}
323
343
}
324
344
appendOperator (" Tk" );
@@ -1392,15 +1412,9 @@ void ASTMangler::appendType(Type type, GenericSignature sig,
1392
1412
case TypeKind::PrimaryArchetype:
1393
1413
case TypeKind::PackArchetype:
1394
1414
case TypeKind::ElementArchetype:
1415
+ case TypeKind::OpenedArchetype:
1395
1416
llvm_unreachable (" Cannot mangle free-standing archetypes" );
1396
1417
1397
- case TypeKind::OpenedArchetype: {
1398
- // Opened archetypes have always been mangled via their interface type,
1399
- // although those manglings aren't used in any stable manner.
1400
- auto openedType = cast<OpenedArchetypeType>(tybase);
1401
- return appendType (openedType->getInterfaceType (), sig, forDecl);
1402
- }
1403
-
1404
1418
case TypeKind::OpaqueTypeArchetype: {
1405
1419
auto opaqueType = cast<OpaqueTypeArchetypeType>(tybase);
1406
1420
auto opaqueDecl = opaqueType->getDecl ();
0 commit comments