// RUN: %target-run-simple-swift(-enable-experimental-feature Embedded -parse-as-library -runtime-compatibility-version none -wmo -Xfrontend -disable-objc-interop) | %FileCheck %s // RUN: %target-run-simple-swift(-Osize -enable-experimental-feature Embedded -parse-as-library -runtime-compatibility-version none -wmo -Xfrontend -disable-objc-interop) | %FileCheck %s // REQUIRES: swift_in_compiler // REQUIRES: executable_test // REQUIRES: optimized_stdlib // REQUIRES: swift_feature_Embedded protocol Fooable { func foo() } class GenericFooableClass: Fooable { func foo() { print("GenericFooableClass.foo") } } class GenericFooableSubClass: GenericFooableClass { override func foo() { print("GenericFooableSubClass.foo") } } func makeItFoo(f: F) { f.foo() } class BaseClass { func test() {} } class SubClass1: BaseClass { override func test() {} } class SubClass2 : SubClass1 { override func test() { print("SubClass2") } } public class Outer { public class Inner { func foo() { print("Inner.foo") } } } public func makeInner() -> Outer.Inner { return Outer.Inner() } final class List where Element: ~Copyable { init(x: Element) where Element: Copyable { } } func testList() -> List { return List(x: 0) } open class OpenClass where Element: ~Copyable { public func foo(x: Element) where Element: Copyable { } } func testOpenClass() -> OpenClass { return OpenClass() } class Base { func foo(_: T) {} } class Derived: Base> {} func testBaseDerived() -> Derived { return Derived() } class Base2 { func foo(_: T) {} } class Derived2: Base2<(T, T)> {} func testBaseDerived2() -> Derived2 { return Derived2() } class Base3 { func foo(_: T) {} } class Derived3: Base3<(T, U)> {} func testBaseDerived3() -> Derived3 { return Derived3() } @main struct Main { static func main() { let f = GenericFooableClass() makeItFoo(f: f) let g: GenericFooableClass = GenericFooableSubClass() makeItFoo(f: g) let x = SubClass2() x.test() makeInner().foo() testList() testOpenClass() testBaseDerived() testBaseDerived2() testBaseDerived3() } } // CHECK: GenericFooableClass.foo // CHECK: GenericFooableSubClass.foo // CHECK: SubClass2 // CHECK: Inner.foo