mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
Leave the qualification off of enum cases and type names when 'print'-ing them, but keep them on 'debugPrint'. (At least, at the outermost level; since ad-hoc printing of structs and tuples uses debugPrint, we'll still get qualification at depth, which kind of sucks but needs more invasive state management in print to make possible.) Implements rdar://problem/21788604. Swift SVN r30166
173 lines
3.6 KiB
Swift
173 lines
3.6 KiB
Swift
// 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 a.dynamicType.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")))
|