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
|
// RUN: %target-run-simple-swift(-Xfrontend -sil-verify-all -enable-experimental-feature ReferenceBindings)
// REQUIRES: executable_test
import StdlibUnittest
defer { runAllTests() }
var tests = TestSuite("reference bindings")
var global: String = "globalName"
tests.test("global access") {
expectEqual(global, "globalName")
do {
inout x = global
expectEqual(x, "globalName")
}
expectEqual(global, "globalName")
}
tests.test("multiple global access exclusivity error")
.crashOutputMatches("Simultaneous accesses to")
.code {
expectCrashLater()
@inline(never)
func test(_ x: inout String) {
inout x = global
}
test(&global)
}
tests.test("Class Instance Field Access") {
class Klass {
var name: String = "klassName"
}
let k = Klass()
expectEqual(k.name, "klassName")
do {
inout x = k.name
expectEqual(x, "klassName")
}
expectEqual(k.name, "klassName")
}
tests.test("Var Access") {
var varName = "varName"
do {
inout x = varName
expectEqual(x, "varName")
}
expectEqual(varName, "varName")
struct S {
var s1 = "field1"
var s2 = "field2"
}
var s = S()
expectEqual(s.s1, "field1")
expectEqual(s.s2, "field2")
do {
inout x = s.s1
expectEqual(x, "field1")
}
expectEqual(s.s1, "field1")
expectEqual(s.s2, "field2")
do {
inout x2 = s.s2
expectEqual(x2, "field2")
}
expectEqual(s.s1, "field1")
expectEqual(s.s2, "field2")
}
tests.test("InOut Access") {
var varName = "varName"
func inoutTest(_ inputX: inout String) {
expectEqual(inputX, "varName")
inout x = inputX
expectEqual(x, "varName")
}
inoutTest(&varName)
expectEqual(varName, "varName")
}
// We use to hit a verifier error here.
tests.test("Class Use") {
class Klass {
var value: String = "varName"
}
struct S {
var k = Klass()
var i = 5
mutating func x() {
print("\(i)")
}
}
var s = S()
do {
inout x = s.k
expectEqual(x.value, "varName")
}
}
|