Skip to content

Commit 8efbb50

Browse files
authored
Merge pull request #22160 from eeckstein/fix-private-remangling-5.0
[5.0] Runtime: fix mangling of nested private generic classes
2 parents 2bb4e8b + eaf3d07 commit 8efbb50

File tree

2 files changed

+40
-0
lines changed

2 files changed

+40
-0
lines changed

lib/Demangling/OldRemangler.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1910,6 +1910,12 @@ void Remangler::mangleGenericArgs(Node *node, EntityContext &ctx) {
19101910
break;
19111911
}
19121912

1913+
case Node::Kind::AnonymousContext:
1914+
if (node->getNumChildren() > 1) {
1915+
mangleGenericArgs(node->getChild(1), ctx);
1916+
}
1917+
break;
1918+
19131919
case Node::Kind::Extension: {
19141920
mangleGenericArgs(node->getChild(1), ctx);
19151921
break;

test/stdlib/RuntimeObjC.swift

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -334,6 +334,33 @@ enum PlainEnum {}
334334
protocol ProtocolA {}
335335
protocol ProtocolB {}
336336

337+
class OuterClass {
338+
339+
private class PrivateGeneric<T, U> {
340+
class InnerGeneric<X> {
341+
class Inner { }
342+
}
343+
}
344+
345+
static func getPrivateGenericName() -> String {
346+
return NSStringFromClass(OuterClass.PrivateGeneric<Int, Bool>.self)
347+
}
348+
static func getInnerGenericName() -> String {
349+
return NSStringFromClass(OuterClass.PrivateGeneric<Int, Bool>.InnerGeneric<Float>.self)
350+
}
351+
static func getInnerName() -> String {
352+
return NSStringFromClass(OuterClass.PrivateGeneric<Int, Bool>.InnerGeneric<Float>.Inner.self)
353+
}
354+
}
355+
356+
// The private discriminator is not deterministic.
357+
// Replace it with a constant string.
358+
func removePrivateDiscriminator(_ symbol: String) -> String {
359+
let regexp = try! NSRegularExpression(pattern: "P[0-9]+\\$[0-9a-f]+")
360+
let range = NSRange(0..<symbol.count)
361+
return regexp.stringByReplacingMatches(in: symbol, range: range, withTemplate: "XXX")
362+
}
363+
337364
Runtime.test("Generic class ObjC runtime names") {
338365
expectEqual("_TtGC1a12GenericClassSi_",
339366
NSStringFromClass(GenericClass<Int>.self))
@@ -385,6 +412,13 @@ Runtime.test("Generic class ObjC runtime names") {
385412
expectEqual("_TtGC1a17MultiGenericClassGVS_13GenericStructSi_GOS_11GenericEnumGS2_Si___",
386413
NSStringFromClass(MultiGenericClass<GenericStruct<Int>,
387414
GenericEnum<GenericEnum<Int>>>.self))
415+
416+
expectEqual("_TtGCC1a10OuterClassXXXPrivateGeneric_SiSb_",
417+
removePrivateDiscriminator(OuterClass.getPrivateGenericName()))
418+
expectEqual("_TtGCCC1a10OuterClassXXXPrivateGeneric12InnerGeneric_SiSb_Sf_",
419+
removePrivateDiscriminator(OuterClass.getInnerGenericName()))
420+
expectEqual("_TtGCCCC1a10OuterClassXXXPrivateGeneric12InnerGeneric5Inner_SiSb_Sf__",
421+
removePrivateDiscriminator(OuterClass.getInnerName()))
388422
}
389423

390424
@objc protocol P {}

0 commit comments

Comments
 (0)