| // RUN: %empty-directory(%t) |
| // RUN: %target-build-swift %s -o %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]) |