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
|
// RUN: %empty-directory(%t)
// RUN: %target-build-swift %s -o %t/a.out
// RUN: %target-codesign %t/a.out
// RUN: %target-run %t/a.out | %FileCheck %s
// REQUIRES: executable_test
protocol MyPrintable {
func print()
}
extension Int : MyPrintable {
func print() {
Swift.print(self, terminator: "")
}
}
extension String : MyPrintable {
func print() {
Swift.print(self, terminator: "")
}
}
extension Array : MyPrintable {
func print() {
Swift.print(self, terminator: "")
}
}
class Foo<T : MyPrintable> {
init<U : MyPrintable>(_ t: T, _ u: U) {
print("init ", terminator: "")
t.print()
print(" ", terminator: "")
u.print()
print("")
}
func bar<U : MyPrintable>(_ u: U) {
print("bar ", terminator: "")
u.print()
print("")
}
}
// CHECK: init 1 two
// CHECK: bar [1]
var foo = Foo<Int>(1, "two")
foo.bar([1])
struct OuterStruct<T : MyPrintable> {
let t: T
struct InnerStruct<U : MyPrintable> {
let u: U
func printBoth(t: T) {
t.print()
print(" ", terminator: "")
u.print()
}
static func printBoth(t: T, u: U) {
t.print()
print(" ", terminator: "")
u.print()
}
func printAllThree<V : MyPrintable>(t: T, v: V) {
printBoth(t: t)
print(" ", terminator: "")
v.print()
}
}
class InnerClass<U : MyPrintable> {
let u: U
init(u: U) {
self.u = u
}
func printBoth(t: T) {
t.print()
print(" ", terminator: "")
u.print()
}
static func printBoth(t: T, u: U) {
t.print()
print(" ", terminator: "")
u.print()
}
func printAllThree<V : MyPrintable>(t: T, v: V) {
printBoth(t: t)
print(" ", terminator: "")
v.print()
}
}
}
class SubClass<X : MyPrintable, Y : MyPrintable> : OuterStruct<Y>.InnerClass<X> {
override func printBoth(t: Y) {
print("override ", terminator: "")
super.printBoth(t: t)
}
// FIXME: Does not work!
/* override func printAllThree<Z : MyPrintable>(t: Y, v: Z) {
print("super ", terminator: "")
super.printAllThree(t: t, v: v)
} */
}
// CHECK: 1 two
// CHECK: 1 two
// CHECK: 1 two [3]
OuterStruct<Int>.InnerStruct<String>(u: "two").printBoth(t: 1)
OuterStruct<Int>.InnerStruct<String>.printBoth(t: 1, u: "two")
OuterStruct<Int>.InnerStruct<String>(u: "two").printAllThree(t: 1, v: [3])
// CHECK: override 1 two [3]
SubClass<String, Int>(u: "two").printAllThree(t: 1, v: [3])
|