File: borrowing_switch_subjects.swift

package info (click to toggle)
swiftlang 6.0.3-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 2,519,992 kB
  • sloc: cpp: 9,107,863; ansic: 2,040,022; asm: 1,135,751; python: 296,500; objc: 82,456; f90: 60,502; lisp: 34,951; pascal: 19,946; sh: 18,133; perl: 7,482; ml: 4,937; javascript: 4,117; makefile: 3,840; awk: 3,535; xml: 914; fortran: 619; cs: 573; ruby: 573
file content (79 lines) | stat: -rw-r--r-- 2,845 bytes parent folder | download
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)
    }
}