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 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152
|
// RUN: %target-swift-frontend -emit-sil -verify %s
struct NC: ~Copyable {
borrowing func borrow() {}
mutating func mutate() {}
consuming func consume() {}
}
func borrow(_: borrowing NC) {}
func consume(_: consuming NC) {}
func mutate(_: inout NC) {}
func unwrapBorrow_Borrow(x: borrowing NC?) {
x!.borrow()
borrow(x!)
x!.borrow()
borrow(x!)
}
func unwrapConsume_Borrow(x: borrowing NC?) { // expected-error{{cannot be consumed}}
x!.consume() // expected-note{{consumed here}}
consume(x!) // expected-note{{consumed here}}
x!.consume() // expected-note{{consumed here}}
consume(x!) // expected-note{{consumed here}}
}
func unwrapBorrowMutateConsume_Consume(x: consuming NC?) {
x!.borrow()
x!.mutate()
borrow(x!)
mutate(&x!)
consume(x!)
}
func unwrapBorrowMutateConsume2_Consume(x: consuming NC?) {
x!.borrow()
x!.mutate()
borrow(x!)
mutate(&x!)
x!.consume()
}
func unwrapBorrowMutateConsumeBorrow_Consume(x: consuming NC?) { // expected-error {{used after consume}}
x!.borrow()
x!.mutate()
borrow(x!)
mutate(&x!)
consume(x!) // expected-note{{consumed here}}
x!.borrow() // expected-note{{used here}}
borrow(x!)
}
func unwrapBorrowMutateConsumeMutate_Consume(x: consuming NC?) { // expected-error {{used after consume}}
x!.borrow()
x!.mutate()
borrow(x!)
mutate(&x!)
consume(x!) // expected-note{{consumed here}}
x!.mutate() // expected-note{{used here}}
mutate(&x!)
}
func unwrapBorrowMutateConsumeInitBorrow_Consume(x: consuming NC?, y: consuming NC?) {
x!.borrow()
x!.mutate()
borrow(x!)
mutate(&x!)
consume(x!)
x = y
x!.borrow()
borrow(x!)
}
func unwrapBorrowMutateConsumeInitMutate_Consume(x: consuming NC?, y: consuming NC?) {
x!.borrow()
x!.mutate()
borrow(x!)
mutate(&x!)
consume(x!)
x = y
x!.mutate()
mutate(&x!)
}
func unwrapBorrowMutateConsumeInitBorrowMutateConsume_Consume(x: consuming NC?, y: consuming NC?) {
x!.borrow()
x!.mutate()
borrow(x!)
mutate(&x!)
consume(x!)
x = y
x!.mutate()
x!.borrow()
mutate(&x!)
borrow(x!)
consume(x!)
}
func unwrapBorrowMutate_Mutate(x: inout NC?) {
x!.borrow()
x!.mutate()
borrow(x!)
mutate(&x!)
}
func unwrapBorrowMutateConsume_Mutate(x: inout NC?) { // expected-error {{missing reinitialization}}
x!.borrow()
x!.mutate()
borrow(x!)
mutate(&x!)
x!.consume() // expected-note {{consumed here}}
}
func unwrapBorrowMutateConsumeInit_Mutate(x: inout NC?, y: consuming NC) {
x!.borrow()
x!.mutate()
borrow(x!)
mutate(&x!)
x!.consume() // expected-note{{consumed here}}
x! = y // expected-error{{cannot partially reinitialize}}
}
|