Merge pull request #17576 from DougGregor/disable-generic-typealias-mangling-4.2
[4.2] Don't mangle generic type aliases at all
diff --git a/include/swift/Demangling/DemangleNodes.def b/include/swift/Demangling/DemangleNodes.def
index 83670b5..27cb3be 100644
--- a/include/swift/Demangling/DemangleNodes.def
+++ b/include/swift/Demangling/DemangleNodes.def
@@ -36,7 +36,6 @@
NODE(BoundGenericEnum)
NODE(BoundGenericStructure)
NODE(BoundGenericOtherNominalType)
-NODE(BoundGenericTypeAlias)
NODE(BuiltinTypeName)
NODE(CFunctionPointer)
CONTEXT_NODE(Class)
diff --git a/lib/AST/ASTMangler.cpp b/lib/AST/ASTMangler.cpp
index cc88090..0e6cc67 100644
--- a/lib/AST/ASTMangler.cpp
+++ b/lib/AST/ASTMangler.cpp
@@ -739,31 +739,18 @@
auto aliasTy = cast<NameAliasType>(tybase);
// It's not possible to mangle the context of the builtin module.
- // For the DWARF output we want to mangle the type alias + context,
- // unless the type alias references a builtin type.
TypeAliasDecl *decl = aliasTy->getDecl();
if (decl->getModuleContext() == decl->getASTContext().TheBuiltinModule) {
return appendType(aliasTy->getSinglyDesugaredType());
}
- if (type->isSpecialized()) {
- // Try to mangle the entire name as a substitution.
- if (tryMangleSubstitution(tybase))
- return;
+ // FIXME: We also cannot yet mangle references to typealiases that
+ // involve generics.
+ if (decl->getGenericSignature())
+ return appendSugaredType<NameAliasType>(type);
- appendAnyGenericType(decl);
- bool isFirstArgList = true;
- if (auto *nominalType = type->getAs<NominalType>()) {
- if (nominalType->getParent())
- type = nominalType->getParent();
- }
- appendBoundGenericArgs(type, isFirstArgList);
- appendRetroactiveConformances(type);
- appendOperator("G");
- addSubstitution(type.getPointer());
- return;
- }
-
+ // For the DWARF output we want to mangle the type alias + context,
+ // unless the type alias references a builtin type.
return appendAnyGenericType(decl);
}
diff --git a/lib/Demangling/Demangler.cpp b/lib/Demangling/Demangler.cpp
index 7d21b60..9d2fa8d 100644
--- a/lib/Demangling/Demangler.cpp
+++ b/lib/Demangling/Demangler.cpp
@@ -1335,9 +1335,6 @@
case Node::Kind::OtherNominalType:
kind = Node::Kind::BoundGenericOtherNominalType;
break;
- case Node::Kind::TypeAlias:
- kind = Node::Kind::BoundGenericTypeAlias;
- break;
default:
return nullptr;
}
diff --git a/lib/Demangling/NodePrinter.cpp b/lib/Demangling/NodePrinter.cpp
index 866318b..7703600 100644
--- a/lib/Demangling/NodePrinter.cpp
+++ b/lib/Demangling/NodePrinter.cpp
@@ -267,7 +267,6 @@
case Node::Kind::BoundGenericEnum:
case Node::Kind::BoundGenericStructure:
case Node::Kind::BoundGenericOtherNominalType:
- case Node::Kind::BoundGenericTypeAlias:
case Node::Kind::BuiltinTypeName:
case Node::Kind::Class:
case Node::Kind::DependentGenericType:
@@ -1541,7 +1540,6 @@
case Node::Kind::BoundGenericStructure:
case Node::Kind::BoundGenericEnum:
case Node::Kind::BoundGenericOtherNominalType:
- case Node::Kind::BoundGenericTypeAlias:
printBoundGeneric(Node);
return nullptr;
case Node::Kind::DynamicSelf:
diff --git a/lib/Demangling/OldRemangler.cpp b/lib/Demangling/OldRemangler.cpp
index 30cad13..4c8562a 100644
--- a/lib/Demangling/OldRemangler.cpp
+++ b/lib/Demangling/OldRemangler.cpp
@@ -1875,11 +1875,6 @@
mangleAnyNominalType(node, ctx);
}
-void Remangler::mangleBoundGenericTypeAlias(Node *node) {
- EntityContext ctx;
- mangleAnyNominalType(node, ctx);
-}
-
void Remangler::mangleTypeList(Node *node) {
mangleChildNodes(node); // all types
Out << '_';
diff --git a/lib/Demangling/Remangler.cpp b/lib/Demangling/Remangler.cpp
index ee3807f..8219f88 100644
--- a/lib/Demangling/Remangler.cpp
+++ b/lib/Demangling/Remangler.cpp
@@ -463,7 +463,6 @@
case Node::Kind::Enum: return mangleAnyGenericType(node, "O");
case Node::Kind::Class: return mangleAnyGenericType(node, "C");
case Node::Kind::OtherNominalType: return mangleAnyGenericType(node, "XY");
- case Node::Kind::TypeAlias: return mangleAnyGenericType(node, "a");
default:
unreachable("bad nominal type kind");
}
@@ -482,8 +481,7 @@
case Node::Kind::BoundGenericOtherNominalType:
case Node::Kind::BoundGenericStructure:
case Node::Kind::BoundGenericEnum:
- case Node::Kind::BoundGenericClass:
- case Node::Kind::BoundGenericTypeAlias: {
+ case Node::Kind::BoundGenericClass: {
NodePointer unboundType = node->getChild(0);
assert(unboundType->getKind() == Node::Kind::Type);
NodePointer nominalType = unboundType->getChild(0);
@@ -595,10 +593,6 @@
mangleAnyNominalType(node);
}
-void Remangler::mangleBoundGenericTypeAlias(Node *node) {
- mangleAnyNominalType(node);
-}
-
void Remangler::mangleBuiltinTypeName(Node *node) {
Buffer << 'B';
StringRef text = node->getText();
@@ -2037,7 +2031,6 @@
case Node::Kind::BoundGenericEnum:
case Node::Kind::BoundGenericClass:
case Node::Kind::BoundGenericOtherNominalType:
- case Node::Kind::BoundGenericTypeAlias:
return true;
case Node::Kind::Structure:
@@ -2073,8 +2066,7 @@
case Node::Kind::BoundGenericStructure:
case Node::Kind::BoundGenericEnum:
case Node::Kind::BoundGenericClass:
- case Node::Kind::BoundGenericOtherNominalType:
- case Node::Kind::BoundGenericTypeAlias: {
+ case Node::Kind::BoundGenericOtherNominalType: {
NodePointer unboundType = node->getChild(0);
assert(unboundType->getKind() == Node::Kind::Type);
NodePointer nominalType = unboundType->getChild(0);
diff --git a/test/ClangImporter/objc_ir.swift b/test/ClangImporter/objc_ir.swift
index ca3a76e..812b8eb 100644
--- a/test/ClangImporter/objc_ir.swift
+++ b/test/ClangImporter/objc_ir.swift
@@ -363,7 +363,5 @@
// CHECK: ![[SWIFT_NAME_ALIAS_TYPE]] = !DIDerivedType(tag: DW_TAG_typedef, name: "$SSo14SwiftNameAliasaD", scope: !{{[0-9]+}}, file: !{{[0-9]+}}, baseType: !{{[0-9]+}})
// CHECK: ![[SWIFT_GENERIC_NAME_ALIAS_VAR]] = !DILocalVariable(name: "generic_obj", arg: 1, scope: !{{[0-9]+}}, file: !{{[0-9]+}}, line: {{[0-9]+}}, type: ![[SWIFT_GENERIC_NAME_ALIAS_TYPE:[0-9]+]])
-// CHECK: ![[SWIFT_GENERIC_NAME_ALIAS_TYPE]] = !DIDerivedType(tag: DW_TAG_typedef, name: "$SSo21SwiftGenericNameAliasaySo8NSNumberCGD", scope: !{{[0-9]+}}, file: !{{[0-9]+}}, baseType: !{{[0-9]+}})
// CHECK: ![[SWIFT_CONSTR_GENERIC_NAME_ALIAS_VAR]] = !DILocalVariable(name: "constr_generic_obj", arg: 1, scope: !{{[0-9]+}}, file: !{{[0-9]+}}, line: {{[0-9]+}}, type: ![[SWIFT_CONSTR_GENERIC_NAME_ALIAS_TYPE:[0-9]+]])
-// CHECK: ![[SWIFT_CONSTR_GENERIC_NAME_ALIAS_TYPE]] = !DIDerivedType(tag: DW_TAG_typedef, name: "$SSo27SwiftConstrGenericNameAliasaySo8NSNumberCGD", scope: !{{[0-9]+}}, file: !{{[0-9]+}}, baseType: !{{[0-9]+}})
diff --git a/test/DebugInfo/DumpDeclFromMangledName.swift b/test/DebugInfo/DumpDeclFromMangledName.swift
index 4b8bcef..a81abe3 100644
--- a/test/DebugInfo/DumpDeclFromMangledName.swift
+++ b/test/DebugInfo/DumpDeclFromMangledName.swift
@@ -39,3 +39,56 @@
}
patatino()
+
+class Foo<T> {
+ var x : T
+ init(_ x : T) {
+ self.x = x
+ }
+}
+
+typealias Patatino<T> = Foo<T>
+
+public struct Outer<T> {
+ public struct Inner { }
+ public struct GenericInner<U> { }
+
+ public typealias Foo<U> = Outer<U>.Inner
+
+ public func blah() {
+ let foo: Foo<Int> = Outer<Int>.Inner()
+ }
+}
+
+extension Outer.GenericInner {
+ public typealias Bar = Int
+
+ public func useBar() {
+ let bar: Bar = 7
+ }
+}
+
+protocol P {
+ associatedtype A
+}
+
+protocol Q {
+ associatedtype B: P
+ typealias ProtocolTypeAliasThing = B.A
+}
+
+struct ConformsToP: P {
+ typealias A = Int
+}
+
+struct ConformsToQ: Q {
+ typealias B = ConformsToP
+}
+
+struct Blah {
+ typealias SomeQ = ConformsToQ
+
+ func foo() {
+ let bar: SomeQ.ProtocolTypeAliasThing? = nil
+ }
+}
diff --git a/test/Demangle/Inputs/manglings.txt b/test/Demangle/Inputs/manglings.txt
index a007915..830e783 100644
--- a/test/Demangle/Inputs/manglings.txt
+++ b/test/Demangle/Inputs/manglings.txt
@@ -310,5 +310,4 @@
_$S3BBBBi0602365061_ ---> _$S3BBBBi0602365061_
_$S3BBBBv0602365061_ ---> _$S3BBBBv0602365061_
_T0lxxxmmmTk ---> _T0lxxxmmmTk
-$S4blah8PatatinoaySiGD -> blah.Patatino<Swift.Int>