mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
We need to strip inout/lvalue before casting the second parameter's type to FunctionType. There were also some verification issues and the fact that we weren't allowing already-escaping closures to be passed to it (which is not useful, but shouldn't result in an error and really awful diagnostic). We can potentially look at diagnosing this with a warning at some point in the future. Fixes rdar://problem/32239354.
35 lines
1.2 KiB
Swift
35 lines
1.2 KiB
Swift
// RUN: %target-swift-frontend -module-name main -typecheck -swift-version 3 %s
|
|
// RUN: %target-swift-frontend -module-name main -typecheck -swift-version 4 %s
|
|
|
|
// These tests are split out to ensure that we run the AST verifier's
|
|
// special post-type-checked verifications, which don't currently
|
|
// happen if any errors occur anywhere during compilation.
|
|
|
|
func rdar32239354_1(_ fn: () -> Void) {
|
|
var other: (() -> Void) -> Void = { _ in }
|
|
|
|
withoutActuallyEscaping(fn, do: other)
|
|
// Reassign to avoid warning about changing this to a let, since we
|
|
// need this to be a var to trigger the original issue.
|
|
other = { _ in }
|
|
}
|
|
|
|
func rdar32239354_2(_ fn: () -> Void, other: inout (() -> Void) -> Void) {
|
|
withoutActuallyEscaping(fn, do: other)
|
|
}
|
|
|
|
func testVariations(
|
|
_ no_escape: () -> (),
|
|
_ escape: @escaping () -> (),
|
|
_ takesFn: (()->()) -> ()->()
|
|
) -> () -> () {
|
|
withoutActuallyEscaping(no_escape) { _ in }
|
|
withoutActuallyEscaping({}) { _ in }
|
|
withoutActuallyEscaping(escape) { _ in }
|
|
_ = withoutActuallyEscaping(no_escape, do: takesFn)
|
|
_ = withoutActuallyEscaping(escape, do: takesFn)
|
|
_ = withoutActuallyEscaping(no_escape) {
|
|
return takesFn($0)
|
|
}
|
|
}
|