mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
Instead of always requiring a call to be made to pass argument
to `@autoclosure` parameter, it should be allowed to pass argument
by value to `@autoclosure` parameter which can return a function
type.
```swift
func foo<T>(_ fn: @autoclosure () -> T) {}
func bar(_ fn: @autoclosure @escaping () -> Int) { foo(fn) }
```
72 lines
1.8 KiB
Swift
72 lines
1.8 KiB
Swift
// RUN: %target-swift-frontend -swift-version 4 -emit-sil -verify %s | %FileCheck %s
|
|
|
|
do {
|
|
func a(_ x: @autoclosure () -> Int) {}
|
|
func b(_ x: Int, _ f: @autoclosure () -> Int = #line) {}
|
|
|
|
func c(_ y: @autoclosure () -> Int, _ z: Int) {
|
|
// CHECK: function_ref @$s16attr_autoclosure1aL_yySiyXKF
|
|
a(y)
|
|
|
|
// CHECK: function_ref @$s16attr_autoclosure1cL_yySiyXK_SitFSiyXEfu_
|
|
b(z + 42) // ok
|
|
b(z, y) // ok to pass `@autoclosure` function type as an argument
|
|
b(z, y()) // ok
|
|
}
|
|
}
|
|
|
|
func foo(_ f: @autoclosure () -> Int) {}
|
|
func foo(_ f: () -> Int) {}
|
|
|
|
do {
|
|
func bar(_ a: @autoclosure () -> Int,
|
|
_ b: () -> Int,
|
|
_ c: Int) {
|
|
// CHECK: function_ref @$s16attr_autoclosure3fooyySiyXEF
|
|
foo(a)
|
|
// CHECK: function_ref @$s16attr_autoclosure3fooyySiyXEF
|
|
foo(b)
|
|
|
|
// CHECK: function_ref @$s16attr_autoclosure3fooyySiyXKF
|
|
foo(a())
|
|
// CHECK: function_ref @$s16attr_autoclosure3fooyySiyXKF
|
|
foo(b())
|
|
|
|
// CHECK: function_ref @$s16attr_autoclosure3fooyySiyXKF
|
|
foo(c)
|
|
}
|
|
}
|
|
|
|
func passAutoClosureToSubscriptAndMember(_ fn: @autoclosure () -> Int) {
|
|
struct S {
|
|
func bar(_: Int, _ fun: @autoclosure () -> Int) {}
|
|
|
|
subscript(_ fn: @autoclosure () -> Int) -> Int { return fn() }
|
|
|
|
static func foo(_: @autoclosure () -> Int) {}
|
|
}
|
|
|
|
let s = S()
|
|
let _ = s.bar(42, fn) // Ok
|
|
let _ = s[fn] // Ok
|
|
let _ = S.foo(fn) // Ok
|
|
}
|
|
|
|
func passAutoClosureToEnumCase(_ fn: @escaping @autoclosure () -> Int) {
|
|
enum E {
|
|
case baz(@autoclosure () -> Int)
|
|
}
|
|
|
|
let _: E = .baz(42) // Ok
|
|
// FIXME: This line type-checks correctly but causes a crash
|
|
// somewhere SILGen if `fn` doesn't have `@escaping`.
|
|
let _: E = .baz(fn) // Ok
|
|
}
|
|
|
|
do {
|
|
func bar(_ fn: @autoclosure () -> (() -> Int)) {}
|
|
func foo(_ fn: @autoclosure @escaping () -> (() -> Int)) {
|
|
bar(fn) // Ok
|
|
}
|
|
}
|