File tree Expand file tree Collapse file tree 4 files changed +23
-1
lines changed Expand file tree Collapse file tree 4 files changed +23
-1
lines changed Original file line number Diff line number Diff line change @@ -307,7 +307,15 @@ SwiftMangledName SwiftMangler::visitTypeAliasType(const swift::TypeAliasType* ty
307307}
308308
309309SwiftMangledName SwiftMangler::visitArchetypeType (const swift::ArchetypeType* type) {
310- return initMangled (type) << fetch (type->getInterfaceType ());
310+ auto ret = initMangled (type) << fetch (type->getInterfaceType ());
311+ for (const auto * protocol : type->getConformsTo ()) {
312+ // Including the protocols in the mangled name allows us to distinguish the "same" type in
313+ // different extensions, where it might have different constraints. Mangling the context (i.e.
314+ // which ExtensionDecl or ValueDecl it's mentioned in) might be more robust, but there doesn't
315+ // seem to be a clean way to get it.
316+ ret << ' :' << fetch (protocol);
317+ }
318+ return ret;
311319}
312320
313321SwiftMangledName SwiftMangler::visitOpaqueTypeArchetypeType (
Original file line number Diff line number Diff line change 1+ | Base | getName: | Base | getCanonicalType: | Base | getInterfaceType: | Base | hasSuperclass: | no | getNumberOfProtocols: | 1 |
2+ | Base | getName: | Base | getCanonicalType: | Base | getInterfaceType: | Base | hasSuperclass: | no | getNumberOfProtocols: | 1 |
13| Param | getName: | Param | getCanonicalType: | Param | getInterfaceType: | Param | hasSuperclass: | no | getNumberOfProtocols: | 0 |
24| ParamWithProtocols | getName: | ParamWithProtocols | getCanonicalType: | ParamWithProtocols | getInterfaceType: | ParamWithProtocols | hasSuperclass: | no | getNumberOfProtocols: | 2 |
35| ParamWithSuperclass | getName: | ParamWithSuperclass | getCanonicalType: | ParamWithSuperclass | getInterfaceType: | ParamWithSuperclass | hasSuperclass: | yes | getNumberOfProtocols: | 0 |
Original file line number Diff line number Diff line change 1+ | Base | 0 | primary_archetypes.swift:3:1:3:13 | P |
2+ | Base | 0 | primary_archetypes.swift:4:1:4:14 | P2 |
13| ParamWithProtocols | 0 | file://:0:0:0:0 | Equatable |
24| ParamWithProtocols | 1 | primary_archetypes.swift:3:1:3:13 | P |
35| ParamWithSuperclassAndProtocols | 0 | file://:0:0:0:0 | Equatable |
Original file line number Diff line number Diff line change 11class S { }
22
33protocol P { }
4+ protocol P2 { }
45
56func foo< Param,
67 ParamWithSuperclass: S ,
78 ParamWithProtocols: P & Equatable ,
89 ParamWithSuperclassAndProtocols: S & Equatable & P > (
910 _: Param , _: ParamWithSuperclass , _: ParamWithProtocols , _: ParamWithSuperclassAndProtocols ) { }
11+
12+ class Generic < Base> { }
13+ extension Generic where Base : P {
14+ func f( _: Base ) { }
15+ }
16+
17+ extension Generic where Base : P2 {
18+ func f( _: Base ) { }
19+ }
You can’t perform that action at this time.
0 commit comments