blob: 52cf7038237b6526257abc1123f2e3fbac3054c7 [file] [log] [blame]
// RUN: %empty-directory(%t)
// RUN: %target-build-swift -O -module-name=test %s -o %t/a.out
// RUN: %target-run %t/a.out | %FileCheck %s
// REQUIRES: executable_test,swift_stdlib_no_asserts,optimized_stdlib
final class Storage {
var v : Int
init(_ v : Int) {
self.v = v
}
}
struct IntBox {
var s : Storage
init(_ x : Int) {
s = Storage(x)
}
var value: Int { return s.v }
mutating func increment(_ delta: Int = 1) {
if (!isKnownUniquelyReferenced(&s)) {
// We should never see this message
print("## copy on write")
s = Storage(s.v)
}
s.v += delta
}
}
enum E: CustomStringConvertible {
case value(IntBox)
case none
@inline(never)
mutating func simpleIncrement() {
switch self {
case .value(var i):
i.increment()
self = .value(i)
case .none:
break
}
}
@inline(never)
mutating func incrementWithControlFlow(_ n: Int, _ c: Bool) {
switch self {
case .value(var i):
i.increment()
for _ in [0..<n] {
print(" loop iter")
}
if c {
i.increment(10)
self = .value(i)
} else {
i.increment(20)
self = .value(i)
}
case .none:
break
}
}
var description: String {
switch self {
case .value(let i):
return i.s.v.description
case .none:
return "none"
}
}
}
struct ContainingStruct {
var e: E = .value(IntBox(27))
@inline(never)
mutating func doSomething() {
switch self.e {
case .value(var i):
i.increment()
self.e = .value(i)
case .none:
break
}
}
}
// CHECK: simpleIncrement start
print("simpleIncrement start")
var e1 = E.value(IntBox(27))
e1.simpleIncrement()
// CHECK-NEXT: simpleIncrement end: 28
print("simpleIncrement end: \(e1)")
// CHECK-NEXT: incrementWithControlFlow start
print("incrementWithControlFlow start")
var e2 = E.value(IntBox(27))
// CHECK-NEXT: loop iter
e2.incrementWithControlFlow(1, true)
// CHECK-NEXT: incrementWithControlFlow end: 38
print("incrementWithControlFlow end: \(e2)")
// CHECK-NEXT: ContainingStruct start
print("ContainingStruct start")
var s = ContainingStruct()
s.doSomething()
// CHECK-NEXT: ContainingStruct end: 28
print("ContainingStruct end: \(s.e)")