Skip to content

Commit 74312a3

Browse files
committed
AST: Refuse to mangle opened existential archetypes
1 parent 90952fb commit 74312a3

File tree

1 file changed

+23
-9
lines changed

1 file changed

+23
-9
lines changed

lib/AST/ASTMangler.cpp

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -294,7 +294,17 @@ std::string ASTMangler::mangleKeyPathGetterThunkHelper(
294294
// Subscripts can be generic, and different key paths could capture the same
295295
// subscript at different generic arguments.
296296
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);
298308
}
299309
}
300310
appendOperator("TK");
@@ -318,7 +328,17 @@ std::string ASTMangler::mangleKeyPathSetterThunkHelper(
318328
// Subscripts can be generic, and different key paths could capture the same
319329
// subscript at different generic arguments.
320330
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);
322342
}
323343
}
324344
appendOperator("Tk");
@@ -1392,15 +1412,9 @@ void ASTMangler::appendType(Type type, GenericSignature sig,
13921412
case TypeKind::PrimaryArchetype:
13931413
case TypeKind::PackArchetype:
13941414
case TypeKind::ElementArchetype:
1415+
case TypeKind::OpenedArchetype:
13951416
llvm_unreachable("Cannot mangle free-standing archetypes");
13961417

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-
14041418
case TypeKind::OpaqueTypeArchetype: {
14051419
auto opaqueType = cast<OpaqueTypeArchetypeType>(tybase);
14061420
auto opaqueDecl = opaqueType->getDecl();

0 commit comments

Comments
 (0)