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 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235
|
// RUN: %target-run-simple-swift | %FileCheck %s
// REQUIRES: executable_test
class Interval {
var lo, hi : Int
init(_ lo:Int, _ hi:Int) {
self.lo = lo
self.hi = hi
}
func show() {
print("[\(lo), \(hi)]")
}
class func like(_ lo: Int, _ hi: Int) -> Interval {
return Interval(lo, hi)
}
}
class OpenInterval : Interval {
override init(_ lo:Int, _ hi:Int) {
super.init(lo, hi)
}
override func show() {
print("(\(lo), \(hi))")
}
override class func like(_ lo:Int, _ hi:Int) -> Interval {
return OpenInterval(lo, 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 type(of: a).like(-a.hi, -a.lo)
}
// CHECK: [-2, -1]
(-Interval(1,2)).show()
// CHECK: [4, 6]
(Interval(1,2) + Interval(3,4)).show()
// CHECK: [1, 3]
(Interval(3,4) - Interval(1,2)).show()
// CHECK: (-1, 1)
(OpenInterval(-1,1)).show()
// CHECK: (-3, 2)
(-OpenInterval(-2,3)).show()
// CHECK: false
print(Interval(1,2) is OpenInterval)
// CHECK: true
var i12 : Interval = OpenInterval(1,2)
print(i12 is OpenInterval)
class RDar16563763_A {}
class RDar16563763_B : RDar16563763_A {}
print("self is Type = \(RDar16563763_A.self is RDar16563763_B.Type)")
// CHECK: self is Type = false
//
// rdar://problem/19321484
//
class Base {
func makePossibleString() -> String? {
return "Base"
}
}
/* inherits from Base with method that returns a String instead of an Optional
* String */
class CompilerCrasher : Base {
override func makePossibleString() -> String {
return "CompilerCrasher"
}
}
class SonOfCompilerCrasher: CompilerCrasher {}
class ReturnOfCompilerCrasher: CompilerCrasher {
override func makePossibleString() -> String {
return "ReturnOfCompilerCrasher"
}
}
func testCrash(_ c: Base) -> String? {
let s = c.makePossibleString()
return s
}
public func driver() {
var c = CompilerCrasher()
var d = SonOfCompilerCrasher()
var e = ReturnOfCompilerCrasher()
var r = testCrash(c)
print(r)
r = testCrash(d)
print(r)
r = testCrash(e)
print(r)
}
driver()
// CHECK: Optional("CompilerCrasher")
// CHECK-NEXT: Optional("CompilerCrasher")
// CHECK-NEXT: Optional("ReturnOfCompilerCrasher")
struct Account {
var owner: String
}
class Bank {
func transferMoney(_ from: Account?, to: Account!) -> Account! {
return nil
}
func deposit(_ to: Account) -> Account? {
return nil
}
}
class DodgyBank : Bank {
// Parameters: swap ? and !
// Result: less optional
override func transferMoney(_ from: Account!, to: Account?) -> Account {
if let fromAccount = from {
return fromAccount
} else {
return Account(owner: "Bank fees")
}
}
// Parameter: more optional
// Result: swap ? and !
override func deposit(_ to: Account?) -> Account! {
if let toAccount = to {
if (toAccount.owner == "Cyberdyne Systems") {
return nil
}
}
return to
}
}
// CHECK: Account(owner: "A")
// CHECK: Account(owner: "Bank fees")
// CHECK: nil
// CHECK: Optional(main.Account(owner: "A"))
let b = DodgyBank()
#if false
// FIXME: rdar://problem/21435542
print(b.transferMoney(Account(owner: "A"), to: Account(owner: "B")))
print(b.transferMoney(nil, to: nil))
print(b.deposit(Account(owner: "Cyberdyne Systems")))
print(b.deposit(Account(owner: "A")))
print(b.deposit(nil))
#endif
print((b as Bank).transferMoney(Account(owner: "A"), to: Account(owner: "B")))
print((b as Bank).transferMoney(nil, to: nil))
print((b as Bank).deposit(Account(owner: "Cyberdyne Systems")))
print((b as Bank).deposit(Account(owner: "A")))
// rdar://25412647
private class Parent<T> {
required init() {}
func doSomething() {
overriddenMethod()
}
func overriddenMethod() {
fatalError("You should override this method in child class")
}
}
private class Child: Parent<String> {
override func overriddenMethod() {
print("Heaven!")
}
}
Child().doSomething() // CHECK: Heaven!
// rdar://23376955
protocol Makeable {
init()
func doSomething()
}
extension Parent : Makeable {}
func makeOne<T : Makeable>(_: T.Type) -> T {
return T()
}
makeOne(Child.self).doSomething() // CHECK: Heaven!
// https://github.com/apple/swift/issues/46425
class BaseProperty {
var value: Int {
get { fatalError() }
set { fatalError() }
}
func increment() -> Self {
value += 1
return self
}
}
class DerivedProperty : BaseProperty {
override var value: Int {
get { return _value }
set { _value = newValue }
}
var _value: Int = 0
}
// CHECK: 1
print(DerivedProperty().increment().value)
|