// RUN: %target-run-simple-swift | %FileCheck %s // REQUIRES: executable_test // UNSUPPORTED: use_os_stdlib // UNSUPPORTED: back_deployment_runtime class MyLabel { var text = "label" } class Controller { fileprivate let label = MyLabel() fileprivate var secondLabel: MyLabel? = MyLabel() public var thirdLabel: MyLabel? = MyLabel() subscript(string: String) -> String { get { "" } set { } } subscript(int int: Int, str str: String, otherInt: Int) -> Int { get { 0 } set { } } subscript() -> Int { 0 } subscript(array: [T]) -> T? { array.first } subscript(array: [T], array2: [U]) -> T? { array.first } subscript(array array: [T]) -> T? { array.first } subscript(array array: [T], array2 array2: [U]) -> T? { array.first } } struct S { var a: Int } struct Container { var v : V init(_ v: V) { self.v = v } func useKeyPath(_ keyPath: KeyPath) -> String { return (v[keyPath: keyPath] as! MyLabel).text } } extension Container where V: Controller { func test() -> String { return useKeyPath(\.label) } } // CHECK: label print(Container(Controller()).test()) public class GenericController { init(_ u: U) { self.u = u } var u : U fileprivate let label = MyLabel() } public func generic_class_constrained_keypath(_ c: V) where V : GenericController { let kp = \V.label print(kp) print(c[keyPath: kp].text) } // CHECK: GenericController.label // CHECK: label generic_class_constrained_keypath(GenericController(5)) // CHECK: {{\\Controller\.secondLabel!\.text|\\Controller\.\)>!\.}} print(\Controller.secondLabel!.text) // CHECK: {{\\Controller\.subscript\(_: String\)|\\Controller\.}} print(\Controller["abc"]) // CHECK: \S.a print(\S.a) // CHECK: {{\\Controller\.subscript\(int: Int, str: String, _: Int\)|\\Controller\.}} print(\Controller[int: 0, str: "", 0]) // CHECK: {{\\Controller\.thirdLabel|\\Controller\.\)>}} print(\Controller.thirdLabel) // CHECK: {{\\Controller\.subscript\(\)|\\Controller\.}} print(\Controller.[]) // CHECK: \Controller.self print(\Controller.self) // Subscripts with dependent generic types don't produce good output currently, // so we're just checking to make sure they don't crash. // CHECK: \Controller. print(\Controller[[42]]) // CHECK: Controller. print(\Controller[[42], [42]]) // CHECK: \Controller. print(\Controller[array: [42]]) // CHECK: \Controller. print(\Controller[array: [42], array2: [42]])