blob: b04103a9f7a8e4c4d6ca0393787e603a578df334 [file] [log] [blame]
// RUN: %target-swift-emit-silgen %s -verify
func SR12723_thin(_: (@convention(thin) () -> Void) -> Void) {}
func SR12723_block(_: (@convention(block) () -> Void) -> Void) {}
func SR12723_c(_: (@convention(c) () -> Void) -> Void) {}
func SR12723_function(_: () -> Void) {}
func context() {
SR12723_c(SR12723_function)
SR12723_block(SR12723_function)
SR12723_thin(SR12723_function)
}
struct SR12723_C {
let function: (@convention(c) () -> Void) -> Void
}
struct SR12723_Thin {
let function: (@convention(thin) () -> Void) -> Void
}
struct SR12723_Block {
let function: (@convention(block) () -> Void) -> Void
}
func proxy(_ f: (() -> Void) -> Void) {
let a = 1
f { print(a) }
}
func cContext() {
let c = SR12723_C { app in app() }
proxy(c.function)
// expected-error@-1 {{cannot convert value of type '(@convention(c) () -> Void) -> Void' to expected argument type '(() -> Void) -> Void'}}
let _ : (@convention(block) () -> Void) -> Void = c.function
// expected-error@-1 {{cannot convert value of type '(@convention(c) () -> Void) -> Void' to specified type '(@convention(block) () -> Void) -> Void'}}
let _ : (@convention(c) () -> Void) -> Void = c.function // OK
let _ : (@convention(thin) () -> Void) -> Void = c.function // OK
let _ : (() -> Void) -> Void = c.function
// expected-error@-1 {{cannot convert value of type '(@convention(c) () -> Void) -> Void' to specified type '(() -> Void) -> Void'}}
}
func thinContext() {
let thin = SR12723_Thin { app in app() }
proxy(thin.function)
// expected-error@-1 {{cannot convert value of type '(@convention(thin) () -> Void) -> Void' to expected argument type '(() -> Void) -> Void'}}
let _ : (@convention(block) () -> Void) -> Void = thin.function
// expected-error@-1 {{cannot convert value of type '(@convention(thin) () -> Void) -> Void' to specified type '(@convention(block) () -> Void) -> Void'}}
let _ : (@convention(c) () -> Void) -> Void = thin.function // OK
let _ : (@convention(thin) () -> Void) -> Void = thin.function // OK
let _ : (() -> Void) -> Void = thin.function
// expected-error@-1 {{cannot convert value of type '(@convention(thin) () -> Void) -> Void' to specified type '(() -> Void) -> Void'}}
}
func blockContext() {
let block = SR12723_Block { app in app() }
proxy(block.function)
let _ : (@convention(block) () -> Void) -> Void = block.function // OK
let _ : (@convention(c) () -> Void) -> Void = block.function // OK
let _ : (@convention(thin) () -> Void) -> Void = block.function // OK
let _ : (() -> Void) -> Void = block.function // OK
}