Skip to content

Commit 15bd01b

Browse files
committed
Mangler: Mangle PackElementType
1 parent 29bbd66 commit 15bd01b

File tree

8 files changed

+49
-5
lines changed

8 files changed

+49
-5
lines changed

Diff for: docs/ABI/Mangling.rst

+2
Original file line numberDiff line numberDiff line change
@@ -675,6 +675,8 @@ Types
675675
type ::= assoc-type-list 'QZ' // shortcut for 'QYz'
676676
type ::= opaque-type-decl-name bound-generic-args 'Qo' INDEX // opaque type
677677
678+
type ::= pack-type 'Qe' INDEX // pack element type
679+
678680
type ::= pattern-type count-type 'Qp' // pack expansion type
679681
type ::= pack-element-list 'QP' // pack type
680682
type ::= pack-element-list 'QS' DIRECTNESS // SIL pack type

Diff for: include/swift/Demangling/DemangleNodes.def

+1
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,7 @@ NODE(SILPackDirect)
242242
NODE(SILPackIndirect)
243243
NODE(PackExpansion)
244244
NODE(PackElement)
245+
NODE(PackElementLevel)
245246
NODE(Type)
246247
CONTEXT_NODE(TypeSymbolicReference)
247248
CONTEXT_NODE(TypeAlias)

Diff for: lib/AST/ASTMangler.cpp

+3-2
Original file line numberDiff line numberDiff line change
@@ -1289,8 +1289,9 @@ void ASTMangler::appendType(Type type, GenericSignature sig,
12891289
case TypeKind::PackElement: {
12901290
auto elementType = cast<PackElementType>(tybase);
12911291
appendType(elementType->getPackType(), sig, forDecl);
1292-
1293-
// FIXME: append expansion depth
1292+
// If this ever changes, just mangle level 0 as a plain type parameter.
1293+
assert(elementType->getLevel() > 0);
1294+
appendOperator("Qe", Index(elementType->getLevel() - 1));
12941295

12951296
return;
12961297
}

Diff for: lib/Demangling/Demangler.cpp

+11
Original file line numberDiff line numberDiff line change
@@ -2511,6 +2511,17 @@ NodePointer Demangler::demangleArchetype() {
25112511
createWithChildren(Node::Kind::PackExpansion, PatternTy, CountTy));
25122512
return PackExpansionTy;
25132513
}
2514+
case 'e': {
2515+
NodePointer PackTy = popTypeAndGetChild();
2516+
int level = demangleIndex();
2517+
if (level < 0)
2518+
return NULL;
2519+
2520+
NodePointer PackElementTy = createType(
2521+
createWithChildren(Node::Kind::PackElement, PackTy,
2522+
createNode(Node::Kind::PackElementLevel, level)));
2523+
return PackElementTy;
2524+
}
25142525
case 'P':
25152526
return popPack();
25162527
case 'S':

Diff for: lib/Demangling/NodePrinter.cpp

+5
Original file line numberDiff line numberDiff line change
@@ -341,6 +341,7 @@ class NodePrinter {
341341

342342
case Node::Kind::ConstrainedExistential:
343343
case Node::Kind::PackElement:
344+
case Node::Kind::PackElementLevel:
344345
case Node::Kind::PackExpansion:
345346
case Node::Kind::ProtocolListWithClass:
346347
case Node::Kind::AccessorAttachedMacroExpansion:
@@ -1630,10 +1631,14 @@ NodePointer NodePrinter::print(NodePointer Node, unsigned depth,
16301631
return nullptr;
16311632
}
16321633
case Node::Kind::PackElement: {
1634+
Printer << "/* level: " << Node->getChild(1)->getIndex() << " */ ";
16331635
Printer << "each ";
16341636
print(Node->getChild(0), depth + 1);
16351637
return nullptr;
16361638
}
1639+
case Node::Kind::PackElementLevel:
1640+
printer_unreachable("should be handled in Node::Kind::PackElement");
1641+
16371642
case Node::Kind::ReturnType:
16381643
if (Node->getNumChildren() == 0)
16391644
Printer << " -> " << Node->getText();

Diff for: lib/Demangling/OldRemangler.cpp

+4
Original file line numberDiff line numberDiff line change
@@ -1934,6 +1934,10 @@ ManglingError Remangler::manglePackElement(Node *node, unsigned depth) {
19341934
return MANGLING_ERROR(ManglingError::UnsupportedNodeKind, node);
19351935
}
19361936

1937+
ManglingError Remangler::manglePackElementLevel(Node *node, unsigned depth) {
1938+
return MANGLING_ERROR(ManglingError::UnsupportedNodeKind, node);
1939+
}
1940+
19371941
ManglingError Remangler::mangleDependentGenericType(Node *node,
19381942
unsigned depth) {
19391943
Buffer << 'u';

Diff for: lib/Demangling/Remangler.cpp

+8-3
Original file line numberDiff line numberDiff line change
@@ -2307,9 +2307,14 @@ ManglingError Remangler::manglePackExpansion(Node *node, unsigned depth) {
23072307
}
23082308

23092309
ManglingError Remangler::manglePackElement(Node *node, unsigned depth) {
2310-
// FIXME
2311-
RETURN_IF_ERROR(mangleChildNodes(node, depth + 1));
2312-
// Buffer << "Qp";
2310+
RETURN_IF_ERROR(mangleChildNode(node, 0, depth + 1));
2311+
Buffer << "Qe";
2312+
RETURN_IF_ERROR(mangleChildNode(node, 1, depth + 1));
2313+
return ManglingError::Success;
2314+
}
2315+
2316+
ManglingError Remangler::manglePackElementLevel(Node *node, unsigned depth) {
2317+
mangleIndex(node->getIndex());
23132318
return ManglingError::Success;
23142319
}
23152320

Diff for: test/SILGen/nested_pack_expansion.swift

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
// RUN: %target-swift-emit-silgen %s -disable-availability-checking | %FileCheck %s
2+
3+
typealias A<each T, U, V> = (repeat (each T, U, V))
4+
5+
struct G<each T> {
6+
typealias B<each U, V> = (repeat A<repeat each T, each U, V>)
7+
8+
struct H<each U> {
9+
typealias C<each V> = (repeat B<repeat each U, each V>)
10+
}
11+
}
12+
13+
// CHECK-LABEL: sil hidden [ossa] @$s21nested_pack_expansion2fb1tyx_q_Qe_q0_txQp_tq_Qp_t_tRvzRv_r1_lF : $@convention(thin) <each T, each U, V> (@pack_guaranteed Pack{repeat (repeat (each T, /* level: 1 */ each U, V))}) -> () {
14+
// CHECK: bb0(%0 : $*Pack{repeat (repeat (each T, /* level: 1 */ each U, V))}):
15+
func fb<each T, each U, V>(t: G<repeat each T>.B<repeat each U, V>) {}

0 commit comments

Comments
 (0)