// 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 { init(_ t: T, _ u: U) { print("init ", terminator: "") t.print() print(" ", terminator: "") u.print() print("") } func bar(_ u: U) { print("bar ", terminator: "") u.print() print("") } } // CHECK: init 1 two // CHECK: bar [1] var foo = Foo(1, "two") foo.bar([1]) struct OuterStruct { let t: T struct InnerStruct { 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(t: T, v: V) { printBoth(t: t) print(" ", terminator: "") v.print() } } class InnerClass { 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(t: T, v: V) { printBoth(t: t) print(" ", terminator: "") v.print() } } } class SubClass : OuterStruct.InnerClass { override func printBoth(t: Y) { print("override ", terminator: "") super.printBoth(t: t) } // FIXME: Does not work! /* override func printAllThree(t: Y, v: Z) { print("super ", terminator: "") super.printAllThree(t: t, v: v) } */ } // CHECK: 1 two // CHECK: 1 two // CHECK: 1 two [3] OuterStruct.InnerStruct(u: "two").printBoth(t: 1) OuterStruct.InnerStruct.printBoth(t: 1, u: "two") OuterStruct.InnerStruct(u: "two").printAllThree(t: 1, v: [3]) // CHECK: override 1 two [3] SubClass(u: "two").printAllThree(t: 1, v: [3])