| // RUN: %target-sil-opt -assume-parsing-unqualified-ownership-sil %s -sil-combine | %FileCheck %s |
| |
| // REQUIRES: PTRSIZE=64 |
| |
| sil_stage canonical |
| |
| import Builtin |
| import Swift |
| import SwiftShims |
| |
| class UIViewController { |
| } |
| |
| class ExternalFramework { |
| func objects<T>(_ type: T.Type) -> Results<T> where T : Object |
| } |
| |
| class Object { |
| } |
| |
| final class Results<T: Object> { |
| } |
| |
| public protocol ReadonlyExternalFramework { |
| func objects<T>(_ type: T.Type) -> Results<T> where T : Object |
| } |
| |
| extension ExternalFramework : ReadonlyExternalFramework { |
| } |
| |
| public enum ExternalFrameworkProvider { |
| static func readonly() -> ReadonlyExternalFramework |
| } |
| |
| public enum ModelDataService { |
| public static func getCurrent(from ExternalFramework: ReadonlyExternalFramework) -> Model? |
| public static func count(in ExternalFramework: ReadonlyExternalFramework) -> Int |
| } |
| |
| var events: [String] |
| |
| var currentModel: Model { get } |
| |
| public class Model : Object { |
| @sil_stored var id: Int { get set } |
| override init() |
| init(value: Any) |
| deinit |
| } |
| |
| sil @ExternalFrameworkInit : $@convention(method) (@thick ExternalFramework.Type) -> (@owned ExternalFramework, @error Error) |
| |
| sil @ResultsCountGetter : $@convention(method) <τ_0_0 where τ_0_0 : Object> (@guaranteed Results<τ_0_0>) -> Int |
| |
| sil @GetRawPointer : $@convention(thin) () -> Builtin.RawPointer |
| |
| sil @GetOptionalModel : $@convention(method) (@in ReadonlyExternalFramework, @thin ModelDataService.Type) -> @owned Optional<Model> |
| |
| // CHECK-LABEL: sil hidden @BuggyFunction : $@convention(thin) () -> @owned Model { |
| // CHECK: [[ALLOC:%.*]] = alloc_stack $ReadonlyExternalFramework, let, name "ExternalFramework" |
| // CHECK-NEXT: [[INITE:%.*]] = init_existential_addr [[ALLOC]] : $*ReadonlyExternalFramework, $ExternalFramework |
| // CHECK: [[TALLOC1:%.*]] = alloc_stack $ReadonlyExternalFramework |
| // CHECK-NEXT: copy_addr [[ALLOC]] to [initialization] [[TALLOC1]] : $*ReadonlyExternalFramework |
| // CHECK-NEXT: apply {{%.*}}([[TALLOC1]], {{%.*}}) : $@convention(method) (@in ReadonlyExternalFramework, @thin ModelDataService.Type) -> @owned Optional<Model> |
| // CHECK: [[TALLOC2:%.*]] = alloc_stack $ReadonlyExternalFramework |
| // CHECK-NEXT: copy_addr [[ALLOC]] to [initialization] [[TALLOC2]] : $*ReadonlyExternalFramework |
| // CHECK-NEXT: destroy_addr [[ALLOC]] |
| // CHECK: [[OEADDR:%.*]] = open_existential_addr immutable_access [[TALLOC2]] : $*ReadonlyExternalFramework |
| sil hidden @BuggyFunction : $@convention(thin) () -> @owned Model { |
| bb0: |
| %0 = alloc_stack $ReadonlyExternalFramework, let, name "ExternalFramework" // users: %1, %166, %72, %163, %71, %168, %10 |
| %1 = init_existential_addr %0 : $*ReadonlyExternalFramework, $ExternalFramework // user: %6 |
| // function_ref ExternalFramework.__allocating_init() |
| %2 = function_ref @ExternalFrameworkInit : $@convention(method) (@thick ExternalFramework.Type) -> (@owned ExternalFramework, @error Error) // user: %4 |
| %3 = metatype $@thick ExternalFramework.Type // user: %4 |
| try_apply %2(%3) : $@convention(method) (@thick ExternalFramework.Type) -> (@owned ExternalFramework, @error Error), normal bb1, error bb2 // id: %4 |
| |
| // %5 // user: %6 |
| bb1(%5 : $ExternalFramework): // Preds: bb0 |
| store %5 to %1 : $*ExternalFramework // id: %6 |
| // function_ref static ModelDataService.getCurrent(from:) |
| %7 = function_ref @GetOptionalModel : $@convention(method) (@in ReadonlyExternalFramework, @thin ModelDataService.Type) -> @owned Optional<Model> // user: %11 |
| %8 = metatype $@thin ModelDataService.Type // user: %11 |
| %9 = alloc_stack $ReadonlyExternalFramework // users: %12, %11, %10 |
| copy_addr %0 to [initialization] %9 : $*ReadonlyExternalFramework // id: %10 |
| %11 = apply %7(%9, %8) : $@convention(method) (@in ReadonlyExternalFramework, @thin ModelDataService.Type) -> @owned Optional<Model> // user: %13 |
| dealloc_stack %9 : $*ReadonlyExternalFramework // id: %12 |
| switch_enum %11 : $Optional<Model>, case #Optional.some!enumelt.1: bb4, case #Optional.none!enumelt: bb3 // id: %13 |
| |
| // %14 // user: %15 |
| bb2(%14 : $Error): // Preds: bb0 |
| %15 = builtin "unexpectedError"(%14 : $Error) : $() |
| unreachable // id: %16 |
| |
| bb3: // Preds: bb1 |
| // function_ref events.unsafeMutableAddressor |
| %17 = function_ref @GetRawPointer : $@convention(thin) () -> Builtin.RawPointer // user: %18 |
| %18 = apply %17() : $@convention(thin) () -> Builtin.RawPointer // user: %19 |
| %19 = pointer_to_address %18 : $Builtin.RawPointer to [strict] $*Array<String> // users: %158, %156, %152, %151 |
| %70 = alloc_stack $ReadonlyExternalFramework // users: %106, %99, %73, %107, %71 |
| copy_addr %0 to [initialization] %70 : $*ReadonlyExternalFramework // id: %71 |
| destroy_addr %0 : $*ReadonlyExternalFramework // id: %72 |
| debug_value_addr %70 : $*ReadonlyExternalFramework, let, name "ExternalFramework", argno 1 // id: %73 |
| %75 = integer_literal $Builtin.Word, 1 // user: %78 |
| %76 = integer_literal $Builtin.Int64, 1 // user: %77 |
| %77 = struct $Int (%76 : $Builtin.Int64) // user: %81 |
| %78 = alloc_ref [tail_elems $Any * %75 : $Builtin.Word] $_ContiguousArrayStorage<Any> // user: %81 |
| %79 = metatype $@thin Array<Any>.Type // user: %81 |
| %99 = open_existential_addr immutable_access %70 : $*ReadonlyExternalFramework to $*@opened("ED59E038-AA25-11E7-9DEA-685B3593C496") ReadonlyExternalFramework // users: %102, %102, %100 |
| %100 = witness_method $@opened("ED59E038-AA25-11E7-9DEA-685B3593C496") ReadonlyExternalFramework, #ReadonlyExternalFramework.objects!1 : <Self where Self : ReadonlyExternalFramework><T where T : Object> (Self) -> (T.Type) -> Results<T>, %99 : $*@opened("ED59E038-AA25-11E7-9DEA-685B3593C496") ReadonlyExternalFramework : $@convention(witness_method: ReadonlyExternalFramework) <τ_0_0 where τ_0_0 : ReadonlyExternalFramework><τ_1_0 where τ_1_0 : Object> (@thick τ_1_0.Type, @in_guaranteed τ_0_0) -> @owned Results<τ_1_0> // type-defs: %99; user: %102 |
| %101 = metatype $@thick Model.Type // user: %102 |
| %102 = apply %100<@opened("ED59E038-AA25-11E7-9DEA-685B3593C496") ReadonlyExternalFramework, Model>(%101, %99) : $@convention(witness_method: ReadonlyExternalFramework) <τ_0_0 where τ_0_0 : ReadonlyExternalFramework><τ_1_0 where τ_1_0 : Object> (@thick τ_1_0.Type, @in_guaranteed τ_0_0) -> @owned Results<τ_1_0> // type-defs: %99; users: %105, %104 |
| // function_ref Results.count.getter |
| %103 = function_ref @ResultsCountGetter : $@convention(method) <τ_0_0 where τ_0_0 : Object> (@guaranteed Results<τ_0_0>) -> Int // user: %104 |
| %104 = apply %103<Model>(%102) : $@convention(method) <τ_0_0 where τ_0_0 : Object> (@guaranteed Results<τ_0_0>) -> Int // user: %108 |
| strong_release %102 : $Results<Model> // id: %105 |
| destroy_addr %70 : $*ReadonlyExternalFramework // id: %106 |
| dealloc_stack %70 : $*ReadonlyExternalFramework // id: %107 |
| %159 = tuple () |
| %160 = alloc_ref [objc] $Model // users: %162, %161 |
| dealloc_stack %0 : $*ReadonlyExternalFramework // id: %163 |
| br bb5(%160 : $Model) // id: %164 |
| |
| // %165 // users: %169, %167 |
| bb4(%165 : $Model): // Preds: bb1 |
| destroy_addr %0 : $*ReadonlyExternalFramework // id: %166 |
| debug_value %165 : $Model, let, name "user" // id: %167 |
| dealloc_stack %0 : $*ReadonlyExternalFramework // id: %168 |
| br bb5(%165 : $Model) // id: %169 |
| |
| // %170 // user: %171 |
| bb5(%170 : $Model): // Preds: bb3 bb4 |
| return %170 : $Model // id: %171 |
| } // end sil function 'BuggyFunction' |
| |