// RUN: %target-swift-frontend -sdk %S/Inputs -I %S/Inputs -enable-source-import %s -emit-silgen -enable-sil-ownership | %FileCheck %s // REQUIRES: objc_interop import gizmo // Although we don't ever expose initializers and methods of generic classes // to ObjC yet, a generic subclass of an ObjC class must still use ObjC // deallocation. // CHECK-NOT: sil hidden @_T0So7GenericCfd // CHECK-NOT: sil hidden @_T0So8NSObjectCfd class Generic: NSObject { var x: Int = 10 // CHECK-LABEL: sil hidden @_T018objc_generic_class7GenericCfD : $@convention(method) (@owned Generic) -> () { // CHECK: bb0({{%.*}} : @owned $Generic): // CHECK: } // end sil function '_T018objc_generic_class7GenericCfD' // CHECK-LABEL: sil hidden [thunk] @_T018objc_generic_class7GenericCfDTo : $@convention(objc_method) (Generic) -> () { // CHECK: bb0([[SELF:%.*]] : @unowned $Generic): // CHECK: [[SELF_COPY:%.*]] = copy_value [[SELF]] // CHECK: [[NATIVE:%.*]] = function_ref @_T018objc_generic_class7GenericCfD // CHECK: apply [[NATIVE]]([[SELF_COPY]]) // CHECK: } // end sil function '_T018objc_generic_class7GenericCfDTo' deinit { // Don't blow up when 'self' is referenced inside an @objc deinit method // of a generic class. self.x = 0 } } // CHECK-NOT: sil hidden @_T018objc_generic_class7GenericCfd // CHECK-NOT: sil hidden @_T0So8NSObjectCfd // CHECK-LABEL: sil hidden @_T018objc_generic_class11SubGeneric1CfD : $@convention(method) (@owned SubGeneric1) -> () { // CHECK: bb0([[SELF:%.*]] : @owned $SubGeneric1): // CHECK: [[SUPER_DEALLOC:%.*]] = objc_super_method [[SELF]] : $SubGeneric1, #Generic.deinit!deallocator.foreign : (Generic) -> () -> (), $@convention(objc_method) <τ_0_0> (Generic<τ_0_0>) -> () // CHECK: [[SUPER:%.*]] = upcast [[SELF:%.*]] : $SubGeneric1 to $Generic // CHECK: apply [[SUPER_DEALLOC]]([[SUPER]]) class SubGeneric1: Generic { }