| // RUN: %target-swift-frontend -emit-sil -O %s | %FileCheck %s |
| |
| protocol Bar { |
| associatedtype Element |
| } |
| |
| class FooImplBase<OutputElement> { |
| func virtualMethod() -> FooImplBase<OutputElement> { |
| fatalError("implement") |
| } |
| } |
| |
| final class FooImplDerived<Input : Bar> : FooImplBase<Input.Element> { |
| |
| init(_ input: Input) {} |
| |
| override func virtualMethod() -> FooImplBase<Input.Element> { |
| return self |
| } |
| } |
| |
| struct BarImpl : Bar { |
| typealias Element = Int |
| } |
| |
| // Check that all calls can be devirtualized and later on inlined. |
| // CHECK-LABEL: sil {{.*}}zzz |
| // CHECK: bb0 |
| // CHECK-NOT: bb1 |
| // CHECK-NOT: function_ref |
| // CHECK-NOT: class_method |
| // CHECK-NOT: apply |
| // CHECK-NOT: bb1 |
| // CHECK: return |
| public func zzz() { |
| let xs = BarImpl() |
| var source: FooImplBase<Int> = FooImplDerived(xs) |
| source = source.virtualMethod() |
| source = source.virtualMethod() |
| source = source.virtualMethod() |
| } |
| |