[transferring] Add mangling support for transferring.

This includes runtime support for instantiating transferring param/result in
function types. This is especially important since that is how we instantiate
function types like: typealias Fn = (transferring X) -> ().

rdar://123118061
This commit is contained in:
Michael Gottesman
2024-02-16 13:54:56 -08:00
parent d35dcc8f9c
commit f4efcec55c
18 changed files with 302 additions and 31 deletions

View File

@@ -852,6 +852,12 @@ ManglingError Remangler::mangleIsolatedAnyFunctionType(Node *node,
return ManglingError::Success;
}
ManglingError Remangler::mangleTransferringResultFunctionType(Node *node,
unsigned depth) {
Buffer << "YT";
return ManglingError::Success;
}
ManglingError Remangler::mangleFieldOffset(Node *node, unsigned depth) {
Buffer << "Wv";
return mangleChildNodes(node, depth + 1); // directness, entity
@@ -1785,6 +1791,16 @@ Remangler::mangleImplParameterResultDifferentiability(Node *node,
return MANGLING_ERROR(ManglingError::InvalidImplDifferentiability, node);
}
ManglingError Remangler::mangleImplParameterTransferring(Node *node,
unsigned depth) {
StringRef text = node->getText();
if (text == "transferring") {
Buffer << 'T';
return ManglingError::Success;
}
return MANGLING_ERROR(ManglingError::InvalidImplParameterTransferring, node);
}
ManglingError Remangler::mangleDynamicSelf(Node *node, unsigned depth) {
Buffer << 'D';
return mangleSingleChildNode(node, depth + 1); // type
@@ -1887,6 +1903,11 @@ ManglingError Remangler::mangleIsolated(Node *node, unsigned depth) {
return mangleSingleChildNode(node, depth + 1); // type
}
ManglingError Remangler::mangleTransferring(Node *node, unsigned depth) {
Buffer << "Yu";
return mangleSingleChildNode(node, depth + 1); // type
}
ManglingError Remangler::mangleCompileTimeConst(Node *node, unsigned depth) {
Buffer << "Yt";
return mangleSingleChildNode(node, depth + 1); // type