Description
Previous ID | SR-2907 |
Radar | rdar://problem/28701872 |
Original Reporter | helge (JIRA User) |
Type | Bug |
Status | Resolved |
Resolution | Done |
Attachment: Download
Environment
Linux TrustySwift 4.2.0-27-generic #32~14.04.1-Ubuntu SMP Fri Jan 22 15:32:26 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
Welcome to Swift version 3.0.1 (swift-3.0.1-PREVIEW-2). Type :help for assistance.
Additional Detail from JIRA
Votes | 0 |
Component/s | Compiler |
Labels | Bug, 3.0Regression |
Assignee | @milseman |
Priority | Medium |
md5: e9fb703f13cd396fc9d9df95e592e039
Issue Description:
Swift 3.0.1 Preview 2 Regression
The compiler throws an error when arrays or varargs of closures are marked as @escaping
:
helge@TrustySwift:~/dev/Swift/tmp$ swift TestIt.swift
TestIt.swift:8:28: error: @escaping attribute may only be used in function parameter position
func add(callbacks cbs: @escaping Callback...) {
~^~~~~~~~~~~~~~~~
Example which works with Swift 3.0.0:
public typealias Middleware =
( IncomingMessage, ServerResponse, @escaping Next ) -> Void
public func connect(middleware: @escaping Middleware...) -> Connect {
let app = Connect()
for m in middleware { _ = app.use(m) }
return app
}
I can remove the @escaping
and it compiles just fine with 3.0.1p2, which I think is wrong. And as a matter of fact it breaks compilation with Swift 3.0.0:
/Users/helge/dev/Swift/Noze.io/Sources/connect/Module.swift:21:17: error: invalid conversion from non-escaping function of type '(IncomingMessage, ServerResponse, @escaping (Any...) -> ()) -> ()' to potentially escaping function type 'Middleware' (aka '(IncomingMessage, ServerResponse, @escaping (Any...) -> ()) -> ()')
_ = app.use(m)
^
as! Middleware
Summary: @escaping
needs to be allowed again on array parameters or vararg parameters.
P.S.: This is made worse by the fact that you can't even workaround it via:
#if swift(>=3.0.1)
but that may be another bug...