mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
Textual SIL was sometimes ambiguous when SILDeclRefs were used, because the textual representation of SILDeclRefs was the same for functions that have the same name, but different signatures.
75 lines
2.4 KiB
Plaintext
75 lines
2.4 KiB
Plaintext
// RUN: %target-sil-opt -assume-parsing-unqualified-ownership-sil -enable-sil-verify-all %s -specdevirt -code-sinking | %FileCheck %s
|
|
|
|
sil_stage canonical
|
|
|
|
import Builtin
|
|
import Swift
|
|
|
|
// Make sure we convert a class_method into a diamond control flow
|
|
// where one of the sides is a direct call to FOO::ping.
|
|
class Foo {
|
|
func ping()
|
|
}
|
|
|
|
sil @_TFC8testcase3Foo4pingfS0_FT_T_ : $@convention(method) (@guaranteed Foo) -> ()
|
|
sil @_TFC8testcase3FoocfMS0_FT_S0_ : $@convention(method) (@owned Foo) -> @owned Foo
|
|
|
|
sil @_TF8testcase7my_mainFCS_3FooT_ : $@convention(thin) (@owned Foo) -> () {
|
|
bb0(%0 : $Foo):
|
|
|
|
//CHECK: checked_cast_br [exact] %0 : $Foo to $Foo
|
|
|
|
//CHECK: function_ref @_TFC8testcase3Foo4pingfS0_FT_T_
|
|
//CHECK: apply
|
|
|
|
//CHECK: class_method
|
|
//CHECK-NEXT: apply
|
|
%1 = class_method %0 : $Foo, #Foo.ping!1 : (Foo) -> () -> (), $@convention(method) (@guaranteed Foo) -> () // user: %2
|
|
%2 = apply %1(%0) : $@convention(method) (@guaranteed Foo) -> ()
|
|
%3 = tuple () // user: %4
|
|
return %3 : $() // id: %4
|
|
}
|
|
|
|
sil_vtable Foo {
|
|
#Foo.ping!1: _TFC8testcase3Foo4pingfS0_FT_T_ // testcase.Foo.ping (testcase.Foo)() -> ()
|
|
#Foo.init!initializer.1: _TFC8testcase3FoocfMS0_FT_S0_ // testcase.Foo.init (testcase.Foo.Type)() -> testcase.Foo
|
|
}
|
|
|
|
class C {
|
|
class func foo()
|
|
class func bar()
|
|
}
|
|
|
|
// CHECK-LABEL: sil @_TZFC4spec1C3foofMS0_FT_T_
|
|
sil @_TZFC4spec1C3foofMS0_FT_T_ : $@convention(method) (@thick C.Type) -> () {
|
|
bb0(%0 : $@thick C.Type):
|
|
%2 = tuple ()
|
|
return %2 : $()
|
|
}
|
|
|
|
// CHECK-LABEL: sil @_TZFC4spec1C3barfMS0_FT_T_
|
|
sil @_TZFC4spec1C3barfMS0_FT_T_ : $@convention(method) (@thick C.Type) -> () {
|
|
// CHECK: bb0
|
|
bb0(%0 : $@thick C.Type):
|
|
// CHECK-NOT: class_method
|
|
// CHECK: checked_cast_br [exact] %0 : $@thick C.Type to $@thick C.Type, bb2, bb3
|
|
// CHECK: bb1
|
|
// CHECK: return
|
|
// CHECK: bb2
|
|
// CHECK: [[REF:%.*]] = function_ref @_TZFC4spec1C3foofMS0_FT_T_
|
|
// CHECK: apply [[REF]]
|
|
// CHECK: br bb1
|
|
// CHECK: bb3
|
|
// CHECK: [[METHOD:%.*]] = class_method %0 : $@thick C.Type, #C.foo!1 : (C.Type) -> () -> (), $@convention(method) (@thick C.Type) -> ()
|
|
// CHECK: apply [[METHOD]]
|
|
%2 = class_method %0 : $@thick C.Type, #C.foo!1 : (C.Type) -> () -> (), $@convention(method) (@thick C.Type) -> ()
|
|
%3 = apply %2(%0) : $@convention(method) (@thick C.Type) -> ()
|
|
%4 = tuple ()
|
|
return %4 : $()
|
|
}
|
|
|
|
sil_vtable C {
|
|
#C.foo!1: _TZFC4spec1C3foofMS0_FT_T_
|
|
#C.bar!1: _TZFC4spec1C3barfMS0_FT_T_
|
|
}
|