1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
|
// RUN: %target-swift-emit-silgen %s | %FileCheck %s
struct Inner: ~Copyable {}
struct Outer: ~Copyable {
var storedInner: Inner
var readInner: Inner {
_read { fatalError() }
}
var getInner: Inner {
get { fatalError() }
}
}
func use(_: borrowing Outer) {}
func use(_: borrowing Inner) {}
func temporary() -> Outer { fatalError() }
// CHECK-LABEL: sil {{.*}}@{{.*}}11borrowParam
// CHECK: = mark_unresolved_non_copyable_value [no_consume_or_assign]
func borrowParam(x: borrowing Outer) {
// CHECK: [[MARK:%.*]] = mark_unresolved_non_copyable_value [strict] [no_consume_or_assign]
// CHECK: [[BORROW:%.*]] = begin_borrow [[MARK]]
switch x {
case let y:
// CHECK: apply {{.*}}([[BORROW]])
use(y)
}
// CHECK: end_borrow [[BORROW]]
// CHECK: [[BORROW_OUTER:%.*]] = begin_borrow {{.*}} : $Outer
// CHECK: [[BORROW_INNER:%.*]] = struct_extract [[BORROW_OUTER]]
// CHECK: [[BORROW_FIX:%.*]] = begin_borrow [fixed] [[BORROW_INNER]]
// CHECK: [[COPY_INNER:%.*]] = copy_value [[BORROW_FIX]]
// CHECK: [[MARK:%.*]] = mark_unresolved_non_copyable_value [strict] [no_consume_or_assign] [[COPY_INNER]]
// CHECK: [[BORROW:%.*]] = begin_borrow [[MARK]]
switch x.storedInner {
case let y:
// CHECK: apply {{.*}}([[BORROW]])
use(y)
}
// CHECK: end_borrow [[BORROW]]
// CHECK: end_borrow [[BORROW_OUTER]]
// CHECK: [[BORROW_OUTER:%.*]] = begin_borrow {{.*}} : $Outer
// CHECK: ([[BORROW_INNER:%.*]], [[TOKEN:%.*]]) = begin_apply {{.*}}([[BORROW_OUTER]]
// CHECK: [[COPY_INNER:%.*]] = copy_value [[BORROW_INNER]]
// CHECK: [[MARK:%.*]] = mark_unresolved_non_copyable_value [no_consume_or_assign] [[COPY_INNER]]
// CHECK: [[BORROW:%.*]] = begin_borrow [[MARK]]
// CHECK: [[BORROW_FIX:%.*]] = begin_borrow [fixed] [[BORROW]]
// CHECK: [[COPY2:%.*]] = copy_value [[BORROW_FIX]]
// CHECK: [[MARK2:%.*]] = mark_unresolved_non_copyable_value [strict] [no_consume_or_assign] [[COPY2]]
// CHECK: [[BORROW2:%.*]] = begin_borrow [[MARK2]]
switch x.readInner {
case let y:
// CHECK: apply {{.*}}([[BORROW2]])
use(y)
}
// CHECK: end_apply [[TOKEN]]
// CHECK: end_borrow [[BORROW_OUTER]]
// `temporary()` is an rvalue, so we
// CHECK: [[FN:%.*]] = function_ref @{{.*}}9temporary
// CHECK: [[TMP:%.*]] = apply [[FN]]()
// CHECK: [[BORROW_OUTER:%.*]] = begin_borrow [fixed] [[TMP]]
// CHECK: end_borrow [[BORROW_OUTER]]
// CHECK: store [[TMP]] to [init] [[Y:%.*]] :
// CHECK: [[MARK:%.*]] = mark_unresolved_non_copyable_value [no_consume_or_assign] [[Y]]
switch temporary() {
case let y:
// CHECK: [[LOAD_BORROW:%.*]] = load_borrow [[MARK]]
// CHECK: apply {{.*}}([[LOAD_BORROW]])
use(y)
}
}
|