| // RUN: %target-swift-frontend -emit-silgen %s | %FileCheck %s |
| |
| protocol UID { |
| func uid() -> Int |
| var clsid: Int { get set } |
| var iid: Int { get } |
| } |
| |
| extension UID { |
| var nextCLSID: Int { |
| get { return clsid + 1 } |
| set { clsid = newValue - 1 } |
| } |
| } |
| |
| protocol ObjectUID : class, UID {} |
| |
| extension ObjectUID { |
| var secondNextCLSID: Int { |
| get { return clsid + 2 } |
| set { } |
| } |
| } |
| |
| |
| class Base {} |
| |
| // CHECK-LABEL: sil hidden @_TF25protocol_class_refinement12getObjectUID |
| func getObjectUID<T: ObjectUID>(x: T) -> (Int, Int, Int, Int) { |
| var x = x |
| // CHECK: [[XBOX:%.*]] = alloc_box $T |
| // CHECK: [[PB:%.*]] = project_box [[XBOX]] |
| // -- call x.uid() |
| // CHECK: [[X:%.*]] = load [[PB]] |
| // CHECK: strong_retain [[X]] |
| // CHECK: [[X_TMP:%.*]] = alloc_stack |
| // CHECK: store [[X]] to [[X_TMP]] |
| // CHECK: [[GET_UID:%.*]] = witness_method $T, #UID.uid!1 |
| // CHECK: [[UID:%.*]] = apply [[GET_UID]]<T>([[X_TMP]]) |
| // CHECK: [[X2:%.*]] = load [[X_TMP]] |
| // CHECK: strong_release [[X2]] |
| // -- call set x.clsid |
| // CHECK: [[SET_CLSID:%.*]] = witness_method $T, #UID.clsid!setter.1 |
| // CHECK: apply [[SET_CLSID]]<T>([[UID]], [[PB]]) |
| x.clsid = x.uid() |
| |
| // -- call x.uid() |
| // CHECK: [[X:%.*]] = load [[PB]] |
| // CHECK: strong_retain [[X]] |
| // CHECK: [[X_TMP:%.*]] = alloc_stack |
| // CHECK: store [[X]] to [[X_TMP]] |
| // CHECK: [[GET_UID:%.*]] = witness_method $T, #UID.uid!1 |
| // CHECK: [[UID:%.*]] = apply [[GET_UID]]<T>([[X_TMP]]) |
| // CHECK: [[X2:%.*]] = load [[X_TMP]] |
| // CHECK: strong_release [[X2]] |
| // -- call nextCLSID from protocol ext |
| // CHECK: [[SET_NEXTCLSID:%.*]] = function_ref @_TFE25protocol_class_refinementPS_3UIDs9nextCLSIDSi |
| // CHECK: apply [[SET_NEXTCLSID]]<T>([[UID]], [[PB]]) |
| x.nextCLSID = x.uid() |
| |
| // -- call x.uid() |
| // CHECK: [[X1:%.*]] = load [[PB]] |
| // CHECK: strong_retain [[X1]] |
| // CHECK: [[X:%.*]] = load [[PB]] |
| // CHECK: strong_retain [[X]] |
| // CHECK: [[X_TMP:%.*]] = alloc_stack |
| // CHECK: store [[X]] to [[X_TMP]] |
| // CHECK: [[GET_UID:%.*]] = witness_method $T, #UID.uid!1 |
| // CHECK: [[UID:%.*]] = apply [[GET_UID]]<T>([[X_TMP]]) |
| // CHECK: [[X2:%.*]] = load [[X_TMP]] |
| // CHECK: strong_release [[X2]] |
| // -- call secondNextCLSID from class-constrained protocol ext |
| // CHECK: [[SET_SECONDNEXT:%.*]] = function_ref @_TFE25protocol_class_refinementPS_9ObjectUIDs15secondNextCLSIDSi |
| // CHECK: apply [[SET_SECONDNEXT]]<T>([[UID]], [[X1]]) |
| // CHECK: strong_release [[X1]] |
| x.secondNextCLSID = x.uid() |
| return (x.iid, x.clsid, x.nextCLSID, x.secondNextCLSID) |
| } |
| |
| // CHECK-LABEL: sil hidden @_TF25protocol_class_refinement16getBaseObjectUID |
| func getBaseObjectUID<T: UID where T: Base>(x: T) -> (Int, Int, Int) { |
| var x = x |
| // CHECK: [[XBOX:%.*]] = alloc_box $T |
| // CHECK: [[PB:%.*]] = project_box [[XBOX]] |
| // -- call x.uid() |
| // CHECK: [[X:%.*]] = load [[PB]] |
| // CHECK: strong_retain [[X]] |
| // CHECK: [[X_TMP:%.*]] = alloc_stack |
| // CHECK: store [[X]] to [[X_TMP]] |
| // CHECK: [[GET_UID:%.*]] = witness_method $T, #UID.uid!1 |
| // CHECK: [[UID:%.*]] = apply [[GET_UID]]<T>([[X_TMP]]) |
| // CHECK: [[X2:%.*]] = load [[X_TMP]] |
| // CHECK: strong_release [[X2]] |
| // -- call set x.clsid |
| // CHECK: [[SET_CLSID:%.*]] = witness_method $T, #UID.clsid!setter.1 |
| // CHECK: apply [[SET_CLSID]]<T>([[UID]], [[PB]]) |
| x.clsid = x.uid() |
| |
| // -- call x.uid() |
| // CHECK: [[X:%.*]] = load [[PB]] |
| // CHECK: strong_retain [[X]] |
| // CHECK: [[X_TMP:%.*]] = alloc_stack |
| // CHECK: store [[X]] to [[X_TMP]] |
| // CHECK: [[GET_UID:%.*]] = witness_method $T, #UID.uid!1 |
| // CHECK: [[UID:%.*]] = apply [[GET_UID]]<T>([[X_TMP]]) |
| // CHECK: [[X2:%.*]] = load [[X_TMP]] |
| // CHECK: strong_release [[X2]] |
| // -- call nextCLSID from protocol ext |
| // CHECK: [[SET_NEXTCLSID:%.*]] = function_ref @_TFE25protocol_class_refinementPS_3UIDs9nextCLSIDSi |
| // CHECK: apply [[SET_NEXTCLSID]]<T>([[UID]], [[PB]]) |
| x.nextCLSID = x.uid() |
| return (x.iid, x.clsid, x.nextCLSID) |
| } |