| // RUN: %target-swift-frontend -enable-sil-ownership -emit-silgen %s | %FileCheck %s |
| |
| // rdar://problem/20714534 -- we need to canonicalize an associated type's |
| // protocols when emitting witness method table for a conformance. |
| |
| protocol _ST {} |
| |
| protocol ST : _ST {} |
| |
| protocol _CDT : ST {} |
| |
| struct _S<T : _CDT> : CT { |
| internal init(a: T, b: Int) {} |
| } |
| |
| extension _CDT { |
| subscript(b: Int) -> _S<Self> { |
| return _S(a: self, b: b) |
| } |
| } |
| |
| protocol CT : ST, _CDT { |
| associatedtype _SS : ST, _CDT |
| |
| subscript(_bounds: Int) -> _SS { get } |
| } |
| |
| // CHECK: sil_witness_table hidden <T where T : _CDT> _S<T>: CT module witnesses_canonical { |
| // associated_type_protocol (_SS: _CDT): _S<_S<T>>: specialize <T = _S<T>> (<T where T : _CDT> _S<T>: _CDT module witnesses_canonical) |
| |
| // rdar://problem/21599502 -- make sure we get requirements on |
| // associated types from protocols we inherit. |
| protocol P1 { } |
| protocol P2 { } |
| |
| protocol Q1 { |
| associatedtype Assoc : P1 |
| } |
| |
| protocol Q2 { |
| associatedtype Assoc : P2 |
| } |
| |
| protocol Q3 : Q1, Q2 { |
| associatedtype Assoc |
| } |
| |
| struct XP : P1, P2 { } |
| |
| struct XQ3 : Q3 { |
| typealias Assoc = XP |
| } |
| |
| // CHECK: sil_witness_table hidden XQ3: Q3 module witnesses_canonical { |
| // CHECK: associated_type Assoc: XP |
| // CHECK: associated_type_protocol (Assoc: P1): XP: P1 module witnesses_canonical |
| // CHECK: associated_type_protocol (Assoc: P2): XP: P2 module witnesses_canonical |
| // CHECK: } |