Files
swift-mirror/test/stdlib/move_function.swift
Nate Chandler cda365ca8d [stdlib] Collection types are eagerMove.
Types that have "value semantics" should not have lexical lifetimes.
Value types are not expected to have custom deinits. Are not expected to
expose unsafe interior pointers. And cannot have weak references because
they are structs. Therefore, deinitialization barriers are irrelevant.

rdar://107076869
2023-03-30 11:04:47 -07:00

113 lines
2.3 KiB
Swift

// 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("simpleArrayVarTest") {
var x: [Enum] = Array(repeating: .foo, count: 10_000)
expectTrue(x._buffer.isUniquelyReferenced())
var y = x
expectTrue(x._buffer.isUniquelyReferenced())
let _ = y
expectTrue(x._buffer.isUniquelyReferenced())
y = []
expectTrue(x._buffer.isUniquelyReferenced())
}
tests.test("simpleArrayInoutVarTest") {
func inOutTest(_ x: inout [Enum]) {
var y = x
expectTrue(x._buffer.isUniquelyReferenced())
let _ = y
expectTrue(x._buffer.isUniquelyReferenced())
y = []
expectTrue(x._buffer.isUniquelyReferenced())
}
var outerX: [Enum] = Array(repeating: .foo, count: 10_000)
inOutTest(&outerX)
}