blob: f257d5528192a68fe98c9d751eab8fd59fe74a80 [file] [log] [blame]
// RUN: %target-swift-frontend -emit-sil -O -emit-sil %s | FileCheck %s
// We used to crash on this when trying to devirtualize t.boo(a, 1),
// because it is an "apply" with unbound generic arguments and
// devirtualizer is not able to devirtualize unbound generic
// invocations yet.
//
// rdar://19912272
protocol P {
typealias Node
}
class C<T:P> {
typealias Node = T.Node
func foo(n:Node) {
}
func boo<S>(n:Node, s:S) {
}
}
func test1<T>(t:C<T>, a: T.Node) {
t.boo(a, s:1)
}
class Base<T> {
func foo() {
}
class func boo() {
}
}
class Derived<T> : Base<T> {
override func foo() {
}
override class func boo() {
}
}
// Check that the instance method Derived<T>.foo can be devirtualized, because Derived.foo is an internal function,
// Derived has no subclasses and it is a WMO compilation.
// CHECK: sil hidden [noinline] @_TF22devirt_unbound_generic5test2urFGCS_7Derivedx_T_
// CHECK-NOT: class_method
// CHECK: function_ref @_TFC22devirt_unbound_generic7Derived3foofT_T_
// CHECK-NOT: class_method
// CHECK: return
@inline(never)
func test2<T>(d: Derived<T>) {
d.foo()
}
public func doTest2<T>(t:T) {
test2(Derived<T>())
}
// Check that the class method Derived<T>.boo can be devirtualized, because Derived.boo is an internal function,
// Derived has no subclasses and it is a WMO compilation.
// CHECK: sil hidden [noinline] @_TF22devirt_unbound_generic5test3urFGCS_7Derivedx_T_
// CHECK-NOT: class_method
// CHECK: function_ref @_TZFC22devirt_unbound_generic7Derived3boofT_T_
// CHECK-NOT: class_method
// CHECK: return
@inline(never)
func test3<T>(d: Derived<T>) {
d.dynamicType.boo()
}
public func doTest3<T>(t:T) {
test3(Derived<T>())
}