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
307
307
}
308
308
309
309
SwiftMangledName 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;
311
319
}
312
320
313
321
SwiftMangledName 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 |
1
3
| Param | getName: | Param | getCanonicalType: | Param | getInterfaceType: | Param | hasSuperclass: | no | getNumberOfProtocols: | 0 |
2
4
| ParamWithProtocols | getName: | ParamWithProtocols | getCanonicalType: | ParamWithProtocols | getInterfaceType: | ParamWithProtocols | hasSuperclass: | no | getNumberOfProtocols: | 2 |
3
5
| 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 |
1
3
| ParamWithProtocols | 0 | file://:0:0:0:0 | Equatable |
2
4
| ParamWithProtocols | 1 | primary_archetypes.swift:3:1:3:13 | P |
3
5
| ParamWithSuperclassAndProtocols | 0 | file://:0:0:0:0 | Equatable |
Original file line number Diff line number Diff line change 1
1
class S { }
2
2
3
3
protocol P { }
4
+ protocol P2 { }
4
5
5
6
func foo< Param,
6
7
ParamWithSuperclass: S ,
7
8
ParamWithProtocols: P & Equatable ,
8
9
ParamWithSuperclassAndProtocols: S & Equatable & P > (
9
10
_: 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