mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
This allows, for example, an initializer to conditionally assign to self or call self.init, along different control flow paths. It also means that it is legal to call self.init() multiple times in a value type initializer, but this... is fine. The old 'self' is destroyed. Fixes <rdar://problem/33137910>.
224 lines
3.8 KiB
Swift
224 lines
3.8 KiB
Swift
// RUN: %target-run-simple-swift
|
|
// REQUIRES: executable_test
|
|
|
|
import StdlibUnittest
|
|
|
|
|
|
var StructTestSuite = TestSuite("Struct")
|
|
|
|
struct Interval {
|
|
var lo, hi : Int
|
|
|
|
init(_ lo: Int, _ hi: Int) {
|
|
self.lo = lo
|
|
self.hi = hi
|
|
}
|
|
}
|
|
|
|
func +(a: Interval, b: Interval) -> Interval {
|
|
return Interval(a.lo + b.lo, a.hi + b.hi)
|
|
}
|
|
|
|
func -(a: Interval, b: Interval) -> Interval {
|
|
return Interval(a.lo - b.hi, a.hi - b.lo)
|
|
}
|
|
|
|
prefix func -(a: Interval) -> Interval {
|
|
return Interval(-a.hi, -a.lo)
|
|
}
|
|
|
|
func print(_ a: Interval) {
|
|
print("[\(a.lo), \(a.hi)]")
|
|
}
|
|
|
|
StructTestSuite.test("Interval") {
|
|
do {
|
|
let i = -Interval(1, 2)
|
|
expectEqual(-2, i.lo)
|
|
expectEqual(-1, i.hi)
|
|
}
|
|
do {
|
|
let i = Interval(1, 2) + Interval(3, 4)
|
|
expectEqual(4, i.lo)
|
|
expectEqual(6, i.hi)
|
|
}
|
|
do {
|
|
let i = Interval(3, 4) - Interval(1, 2)
|
|
expectEqual(1, i.lo)
|
|
expectEqual(3, i.hi)
|
|
}
|
|
}
|
|
|
|
struct BigStruct {
|
|
var a,b,c,d,e,f,g,h : Int
|
|
}
|
|
|
|
func returnBigStruct() -> BigStruct {
|
|
return BigStruct(a: 1, b: 6, c: 1, d: 8, e: 0, f: 3, g: 4, h: 0)
|
|
}
|
|
|
|
StructTestSuite.test("Big") {
|
|
let bs = returnBigStruct()
|
|
|
|
expectEqual(1, bs.a)
|
|
expectEqual(6, bs.b)
|
|
expectEqual(1, bs.c)
|
|
expectEqual(8, bs.d)
|
|
expectEqual(0, bs.e)
|
|
expectEqual(3, bs.f)
|
|
expectEqual(4, bs.g)
|
|
expectEqual(0, bs.h)
|
|
}
|
|
|
|
struct GenStruct<T> {
|
|
var a, b: Int
|
|
|
|
init(_ a: Int, _ b: Int) {
|
|
self.a = a
|
|
self.b = b
|
|
}
|
|
}
|
|
|
|
StructTestSuite.test("Generic") {
|
|
let gs = GenStruct<String>(19, 84)
|
|
expectEqual(19, gs.a)
|
|
expectEqual(84, gs.b)
|
|
}
|
|
|
|
struct InitStruct {
|
|
var x: Int
|
|
var y: Int
|
|
var l = LifetimeTracked(0)
|
|
|
|
init() {
|
|
x = 10
|
|
y = 20
|
|
}
|
|
|
|
init(x: Int, y: Int) {
|
|
self.x = x
|
|
self.y = y
|
|
}
|
|
|
|
init(b: Bool) {
|
|
if b {
|
|
self = InitStruct(x: 5, y: 7)
|
|
} else {
|
|
self.init(x: 6, y: 8)
|
|
}
|
|
}
|
|
|
|
init(initThenAssign: ()) {
|
|
self.init(x: 5, y: 7)
|
|
self = InitStruct(x: 6, y: 8)
|
|
}
|
|
|
|
init(assignThenInit: ()) {
|
|
self = InitStruct(x: 5, y: 7)
|
|
self.init(x: 6, y: 8)
|
|
}
|
|
|
|
init(initThenInit: ()) {
|
|
self.init(x: 5, y: 7)
|
|
self.init(x: 6, y: 8)
|
|
}
|
|
}
|
|
|
|
StructTestSuite.test("InitStruct") {
|
|
do {
|
|
let s = InitStruct()
|
|
expectEqual(10, s.x)
|
|
expectEqual(20, s.y)
|
|
}
|
|
do {
|
|
let s = InitStruct(x: 69, y: 420)
|
|
expectEqual(69, s.x)
|
|
expectEqual(420, s.y)
|
|
}
|
|
do {
|
|
let s = InitStruct(initThenAssign: ())
|
|
expectEqual(6, s.x)
|
|
expectEqual(8, s.y)
|
|
}
|
|
do {
|
|
let s = InitStruct(assignThenInit: ())
|
|
expectEqual(6, s.x)
|
|
expectEqual(8, s.y)
|
|
}
|
|
do {
|
|
let s = InitStruct(initThenInit: ())
|
|
expectEqual(6, s.x)
|
|
expectEqual(8, s.y)
|
|
}
|
|
}
|
|
|
|
struct InitStructAddrOnly {
|
|
var x: Int
|
|
var y: Int
|
|
var a: Any = "hi"
|
|
var l = LifetimeTracked(0)
|
|
|
|
init() {
|
|
x = 10
|
|
y = 20
|
|
}
|
|
|
|
init(x: Int, y: Int) {
|
|
self.x = x
|
|
self.y = y
|
|
}
|
|
|
|
init(b: Bool) {
|
|
if b {
|
|
self = InitStructAddrOnly(x: 5, y: 7)
|
|
} else {
|
|
self.init(x: 6, y: 8)
|
|
}
|
|
}
|
|
|
|
init(initThenAssign: ()) {
|
|
self.init(x: 5, y: 7)
|
|
self = InitStructAddrOnly(x: 6, y: 8)
|
|
}
|
|
|
|
init(assignThenInit: ()) {
|
|
self = InitStructAddrOnly(x: 5, y: 7)
|
|
self.init(x: 6, y: 8)
|
|
}
|
|
|
|
init(initThenInit: ()) {
|
|
self.init(x: 5, y: 7)
|
|
self.init(x: 6, y: 8)
|
|
}
|
|
}
|
|
|
|
StructTestSuite.test("InitStructAddrOnly") {
|
|
do {
|
|
let s = InitStructAddrOnly()
|
|
expectEqual(10, s.x)
|
|
expectEqual(20, s.y)
|
|
}
|
|
do {
|
|
let s = InitStructAddrOnly(x: 69, y: 420)
|
|
expectEqual(69, s.x)
|
|
expectEqual(420, s.y)
|
|
}
|
|
do {
|
|
let s = InitStructAddrOnly(initThenAssign: ())
|
|
expectEqual(6, s.x)
|
|
expectEqual(8, s.y)
|
|
}
|
|
do {
|
|
let s = InitStructAddrOnly(assignThenInit: ())
|
|
expectEqual(6, s.x)
|
|
expectEqual(8, s.y)
|
|
}
|
|
do {
|
|
let s = InitStructAddrOnly(initThenInit: ())
|
|
expectEqual(6, s.x)
|
|
expectEqual(8, s.y)
|
|
}
|
|
}
|
|
|
|
runAllTests()
|