| // REQUIRES: plus_one_runtime |
| |
| // Test module for the specialize_cg_update_crash.sil test. |
| |
| sil_stage canonical |
| |
| import Builtin |
| |
| func genlibfunc<X>(x: X) -> X |
| |
| func genlibfunc2<X>(x: X) -> X |
| |
| func genlibfunc3<X>(x: X) -> X |
| |
| class MyClass { |
| init() |
| func mymethod<X>(x: X) -> X |
| deinit |
| } |
| |
| sil @_TFC7TestMod7MyClassD : $@convention(method) (@owned MyClass) -> () |
| sil @_TFC7TestMod7MyClasscfMS0_FT_S0_ : $@convention(method) (@owned MyClass) -> @owned MyClass |
| |
| sil @_TF7TestMod11genlibfunc3urFq_q_ : $@convention(thin) <X> (@in X) -> @out X { |
| bb0(%0 : $*X, %1 : $*X): |
| %4 = tuple () |
| return %4 : $() |
| } |
| |
| sil @_TF7TestMod11genlibfunc2urFq_q_ : $@convention(thin) <X> (@in X) -> @out X { |
| bb0(%0 : $*X, %1 : $*X): |
| %3 = function_ref @_TF7TestMod11genlibfunc3urFq_q_ : $@convention(thin) <τ_0_0> (@in τ_0_0) -> @out τ_0_0 |
| %9 = tuple () |
| return %9 : $() |
| } |
| |
| sil @_TFC7TestMod7MyClass8mymethodurfS0_Fq_q_ : $@convention(method) <X> (@in X, @guaranteed MyClass) -> @out X { |
| bb0(%0 : $*X, %1 : $*X, %2 : $MyClass): |
| %5 = function_ref @_TF7TestMod11genlibfunc3urFq_q_ : $@convention(thin) <τ_0_0> (@in τ_0_0) -> @out τ_0_0 |
| %11 = tuple () |
| return %11 : $() |
| } |
| |
| // This is the critical function. |
| sil @_TF7TestMod10genlibfuncurFq_q_ : $@convention(thin) <X> (@in X) -> @out X { |
| bb0(%0 : $*X, %1 : $*X): |
| |
| // First reference the method, which lets the method be deserialized, but not processed. |
| %x0 = function_ref @_TFC7TestMod7MyClass8mymethodurfS0_Fq_q_ : $@convention(method) <X> (@in X, @guaranteed MyClass) -> @out X |
| |
| // Then reference the metatype which reads the vtable and processes the method. |
| // The bug was that during reading the vtable (and processing the vtable functions), |
| // the callback (to update the CG) was lost. |
| %x4 = metatype $@thick MyClass.Type |
| |
| %17 = tuple () |
| return %17 : $() |
| } |
| |
| sil_vtable MyClass { |
| #MyClass.init!initializer.1: @_TFC7TestMod7MyClasscfMS0_FT_S0_ // TestMod.MyClass.init (TestMod.MyClass.Type)() -> TestMod.MyClass |
| #MyClass.mymethod!1: @_TFC7TestMod7MyClass8mymethodurfS0_Fq_q_ // TestMod.MyClass.mymethod <A> (TestMod.MyClass)(A) -> A |
| #MyClass.deinit!deallocator: @_TFC7TestMod7MyClassD // TestMod.MyClass.__deallocating_deinit |
| } |
| |