|
| 1 | +// RUN: %target-sil-opt -outliner %s -enable-sil-verify-all | %FileCheck %s |
| 2 | + |
| 3 | +// REQUIRES: OS=macosx |
| 4 | + |
| 5 | +sil_stage canonical |
| 6 | + |
| 7 | +import Builtin |
| 8 | +import Swift |
| 9 | +import Foundation |
| 10 | + |
| 11 | + |
| 12 | +@objc class MyObject { |
| 13 | + @objc static func take(arg: Data?) -> Data? |
| 14 | +} |
| 15 | + |
| 16 | +sil @getData : $@convention(thin) () -> @owned Data |
| 17 | +sil @$s10Foundation4DataV19_bridgeToObjectiveCSo6NSDataCyF : $@convention(method) (@guaranteed Data) -> @owned NSData |
| 18 | +sil @$s10Foundation4DataV36_unconditionallyBridgeFromObjectiveCyACSo6NSDataCSgFZ : $@convention(method) (@guaranteed Optional<NSData>, @thin Data.Type) -> @owned Data |
| 19 | + |
| 20 | +// We used to have a use-after release failure. |
| 21 | + |
| 22 | +// CHECK-LABEL: sil [Osize] @test : $@convention(thin) (@owned MyObject) -> () { |
| 23 | +// CHECK: bb0([[ARG:%.*]] : $MyObject): |
| 24 | +// CHECK: [[META:%.*]] = metatype $@objc_metatype MyObject.Type |
| 25 | +// CHECK: [[FUN1:%.*]] = function_ref @getData : $@convention(thin) () -> @owned Data |
| 26 | +// CHECK: [[DATA:%.*]] = apply [[FUN1]]() : $@convention(thin) () -> @owned Data |
| 27 | +// CHECK: release_value [[ARG]] : $MyObject |
| 28 | +// CHECK: [[OUTLINED:%.*]] = function_ref @$s4main8MyObjectC4take3arg10Foundation4DataVSgAI_tFZToTembnb_ : $@convention(thin) (@owned Data, @objc_metatype MyObject.Type) -> @owned Optional<Data> |
| 29 | +// CHECK: [[RES:%.*]] = apply [[OUTLINED]]([[DATA]], [[META]]) : $@convention(thin) (@owned Data, @objc_metatype MyObject.Type) -> @owned Optional<Data> |
| 30 | +// CHECK: br bb1 |
| 31 | + |
| 32 | +// CHECK: bb1: |
| 33 | +// CHECK: release_value [[RES]] |
| 34 | +// CHECK: [[T:%.*]] = tuple () |
| 35 | +// CHECK: return [[T]] : $() |
| 36 | +// CHECK: } // end sil function 'test' |
| 37 | + |
| 38 | +sil [Osize] @test : $@convention(thin) (@owned MyObject) -> () { |
| 39 | +bb0(%0: $MyObject): |
| 40 | + %35 = metatype $@objc_metatype MyObject.Type |
| 41 | + %41 = function_ref @getData : $@convention(thin) () -> @owned Data |
| 42 | + %43 = apply %41() : $@convention(thin) () -> @owned Data |
| 43 | + %44 = function_ref @$s10Foundation4DataV19_bridgeToObjectiveCSo6NSDataCyF : $@convention(method) (@guaranteed Data) -> @owned NSData |
| 44 | + %45 = apply %44(%43) : $@convention(method) (@guaranteed Data) -> @owned NSData |
| 45 | + %46 = enum $Optional<NSData>, #Optional.some!enumelt, %45 : $NSData |
| 46 | + release_value %0 : $MyObject |
| 47 | + release_value %43 : $Data |
| 48 | + %50 = objc_method %35 : $@objc_metatype MyObject.Type, #MyObject.take!foreign : (MyObject.Type) -> (Data?) -> Data?, $@convention(objc_method) (Optional<NSData>, @objc_metatype MyObject.Type) -> @autoreleased Optional<NSData> |
| 49 | + %51 = apply %50(%46, %35) : $@convention(objc_method) (Optional<NSData>, @objc_metatype MyObject.Type) -> @autoreleased Optional<NSData> |
| 50 | + release_value %46 : $Optional<NSData> |
| 51 | + switch_enum %51 : $Optional<NSData>, case #Optional.some!enumelt: bb5, case #Optional.none!enumelt: bb6 |
| 52 | + |
| 53 | +bb5(%54 : $NSData): |
| 54 | + %55 = function_ref @$s10Foundation4DataV36_unconditionallyBridgeFromObjectiveCyACSo6NSDataCSgFZ : $@convention(method) (@guaranteed Optional<NSData>, @thin Data.Type) -> @owned Data |
| 55 | + %56 = enum $Optional<NSData>, #Optional.some!enumelt, %54 : $NSData |
| 56 | + %57 = metatype $@thin Data.Type |
| 57 | + %58 = apply %55(%56, %57) : $@convention(method) (@guaranteed Optional<NSData>, @thin Data.Type) -> @owned Data |
| 58 | + %59 = enum $Optional<Data>, #Optional.some!enumelt, %58 : $Data |
| 59 | + release_value %56 : $Optional<NSData> |
| 60 | + br bb7(%59 : $Optional<Data>) |
| 61 | + |
| 62 | +bb6: |
| 63 | + %62 = enum $Optional<Data>, #Optional.none!enumelt |
| 64 | + br bb7(%62 : $Optional<Data>) |
| 65 | + |
| 66 | +bb7(%64 : $Optional<Data>): |
| 67 | + release_value %64 : $Optional<Data> |
| 68 | + %102 = tuple () |
| 69 | + return %102 : $() |
| 70 | +} |
0 commit comments