mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
57 lines
1.3 KiB
Swift
57 lines
1.3 KiB
Swift
// RUN: %target-swift-frontend -O -Xllvm -sil-inline-generics=false -Xllvm -sil-disable-pass=GlobalOpt %s -emit-sil -sil-verify-all | %FileCheck %s
|
|
|
|
|
|
public protocol Foo {
|
|
func foo_method()
|
|
}
|
|
public protocol Bar {
|
|
func bar_method()
|
|
}
|
|
|
|
@inline(never)
|
|
func bar_marker() {}
|
|
|
|
public struct Inner: Bar {
|
|
public func bar_method() {
|
|
bar_marker()
|
|
}
|
|
}
|
|
|
|
public struct Outer<T> {
|
|
var x: T
|
|
}
|
|
|
|
@inline(never)
|
|
func foo_marker() {}
|
|
extension Outer: Foo where T: Bar {
|
|
public func foo_method() {
|
|
foo_marker()
|
|
x.bar_method()
|
|
}
|
|
}
|
|
|
|
func callFoo<T: Foo>(_ x: T) {
|
|
x.foo_method()
|
|
}
|
|
|
|
func genericLayer<T: Bar>(_ x: T) {
|
|
callFoo(Outer(x: x))
|
|
}
|
|
|
|
// See that we devirtualize/inline enough to get down to the @inline(never)
|
|
// function calls.
|
|
|
|
// CHECK-LABEL: sil @_T030devirt_conditional_conformance12throughLayeryyF : $@convention(thin) () -> ()
|
|
// CHECK: function_ref @_T030devirt_conditional_conformance10foo_markeryyF
|
|
// CHECK: function_ref @_T030devirt_conditional_conformance10bar_markeryyF
|
|
public func throughLayer() {
|
|
genericLayer(Inner())
|
|
}
|
|
|
|
// CHECK-LABEL: sil @_T030devirt_conditional_conformance6directyyF : $@convention(thin) () -> ()
|
|
// CHECK: function_ref @_T030devirt_conditional_conformance10foo_markeryyF
|
|
// CHECK: function_ref @_T030devirt_conditional_conformance10bar_markeryyF
|
|
public func direct() {
|
|
callFoo(Outer(x: Inner()))
|
|
}
|