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
|
// RUN: %target-run-stdlib-swift(-O -enable-experimental-feature MoveOnly)
// REQUIRES: executable_test
import Swift
import StdlibUnittest
public class Klass {}
var tests = TestSuite("move_function_uniqueness")
defer {
runAllTests()
}
public enum Enum {
case foo
}
public class K2 {
var array: [Enum] = Array(repeating: .foo, count: 10_000)
subscript(index: Int) -> Enum {
@inline(never)
get {
array[index]
}
@inline(never)
set {
array[index] = newValue
}
@inline(never)
_modify {
yield &array[index]
}
}
}
public class Class {
var k2 = K2()
var array: [Enum] = Array(repeating: .foo, count: 10_000)
}
extension Class {
@inline(never)
func readClassSwitchLetTest(_ userHandle: Int) {
expectTrue(_isUnique(&self.k2))
let x: K2
do {
x = self.k2
}
switch (consume x)[userHandle] {
case .foo:
expectTrue(_isUnique(&self.k2))
}
}
}
tests.test("readClassSwitchLetTest") {
let c = Class()
for f in 0..<10_000 {
c.readClassSwitchLetTest(f)
}
}
extension Class {
@inline(never)
func readArraySwitchLetTest(_ userHandle: Int) {
expectTrue(self.array._buffer.isUniquelyReferenced())
let x: [Enum]
do {
x = self.array
}
switch (x)[userHandle] {
case .foo:
expectTrue(self.array._buffer.isUniquelyReferenced())
}
}
}
tests.test("readArraySwitchLetTest") {
let c = Class()
for f in 0..<10_000 {
c.readArraySwitchLetTest(f)
}
}
tests.test("simpleVarTest") {
var x = Klass()
expectTrue(_isUnique_native(&x))
var y = x
let _ = consume y
expectTrue(_isUnique_native(&x))
y = Klass()
expectTrue(_isUnique_native(&x))
}
tests.test("simpleInoutVarTest") {
func inOutTest(_ x: inout Klass) {
var y = x
let _ = consume y
expectTrue(_isUnique_native(&x))
y = Klass()
expectTrue(_isUnique_native(&x))
}
var outerX = Klass()
inOutTest(&outerX)
}
|