blob: bf729dc5de6f05fb00acc5d6868f86a3760c92cf [file] [log] [blame]
// RUN: %target-run-simple-swift | %FileCheck %s
// REQUIRES: executable_test
protocol ProtocolHasInOut {
associatedtype Input
typealias Mutator = (inout Input) -> ()
var f: Mutator { get }
}
// Emit type metadata for this struct's fields
struct HasInOut<T> {
var f: (inout T) -> ()
}
struct HasInOutProtocol : ProtocolHasInOut {
typealias Input = Int
let f: (inout Input) -> ()
}
func foo<T>(_ t: T.Type) -> Any {
return { (x: T) -> Int in return 6060 }
}
var i = 0
// Dynamic casting
var f = foo((Int, Int).self)
var g = f as! ((Int, Int)) -> Int
print(g((1010, 2020)))
// CHECK: 6060
// Struct with InOut
let hio = HasInOut(f: { (x: inout Int) in x = 3030 })
i = 0
hio.f(&i)
print(i)
// CHECK: 3030
// Struct that conforms to Protocol with InOut
let hiop = HasInOutProtocol(f: { (x: inout Int) in x = 4040 })
i = 0
hiop.f(&i)
print(i)
// CHECK: 4040
func fooInOut<T>(_ t: T.Type) -> Any {
return { (x: inout T) -> () in x = unsafeBitCast((8080, 9090), to: T.self) }
}
var fio = fooInOut((Int, Int).self)
var gio = fio as! (inout (Int, Int)) -> ()
var xy = (0, 0)
gio(&xy)
print(xy)
// CHECK: (8080, 9090)