Issue #142 05 Sep 2019
Written by: Bas Broek
While I have the feeling I’ve had a busy two weeks, it seems like I haven’t been the only one…
Interested in sponsoring Swift Weekly Brief? Learn more here.
Starter tasks
- SR-11397 [Standard Library]
FixedWidthInteger.init?(_: radix:)
fails forSelf
with shortbitWidth
- SR-11418 [Compiler / Standard Library] Add Graph Algorithm benchmarks to test
unowned
,weak
, andunmanaged
- SR-11419 [Compiler]
missing_witnesses_general
Should only be emitted in IDE mode - SR-11420 [Compiler] Protocol Stubs Should Suggest Requirement Stubs for Renames As Well
- SR-11421 [Compiler] Checked Cast Diagnostics Should Be More Specific When Literals Are Involved
Podcasts
On the latest episode of Swift Unwrapped, Jesse and JP discussed Binary Dependencies in Swift Package Manager.
News and community
Swift 5.0.3 for Linux has been released.
Jordan Rose wrote a document
describing Swift’s C-to-Swift name translation, featuring enum
s and
swift_wrapper
structs.
Will Lisac shared that Swift Docker images for Raspberry Pi 4 are now available.
Slava Pestov shared a Twitter thread detailing an optimization for name lookup.
Bruno Rocha shared a post detailing the sorting algorithms Swift uses.
Commits and pull requests
David Smith merged a pull request that removes the Swift runtime and standard library’s dependency on Foundation.
Erik Eckstein merged a pull request that eliminates temporary copies during in-place updates of enum payloads.
Michael Gottessmann merged a pull request
demonstrating how much a bug and benchmark can help: the NIO ChannelPipeline
benchmark now runs in half the time! 😱🏎
Returned proposals
SE-0262: Demangle Function was returned for revision.
The core team supports having standardized functionality for turning a Swift symbol name into a human-readable string for logging, debugging, and crash reporting purposes. However, many important design points were raised in the review of SE-0262, and so we are returning the proposal for revision.
Rejected proposals
SE-0042: Flattening the function type of unapplied method references was rejected.
SE-0042 was formally accepted more than three years ago. However, since the proposal was accepted before having a working implementation was a requirement, and the change would be source breaking, and also require massive rewrites of the compiler; it is now clear that this proposal will never actually be implemented. It has been obvious for a long time.
Proposals in review
SE-0263: Add a String Initializer with Access to Uninitialized Storage is under review.
This proposal suggests a new initializer for
String
that provides access to a String’s uninitialized storage buffer.
String
today is well-suited to interoperability with raw memory buffers when a contiguous buffer is already available, such as when dealing withmalloc
ed C strings. However, there are quite a few situations where no such buffer is available, requiring a temporary one to be allocated and copied into. One example is bridgingNSString
toString
, which currently uses standard library internals to get good performance when usingCFStringGetBytes
. Another, also from the standard library, isInt
andFloat
, which currently create temporary stack buffers and do extra copying. We expect libraries like SwiftNIO will also find this useful for dealing with streaming data.
Swift Forums
Michael Ilseman pitched a proposal improving Offset Indexing and Slicing.
This pitch introduces
OffsetBound
, which can represent a position in a collection specified as an offset from either the start or end of the collection (i.e. the collection’s “bounds”). This covers an expressivity gap in collection APIs by providing easy and safe means to fetch an index or element from such an offset as well as convenient slicing.If you would like to try it out, you can just copy-paste from this gist, which includes the functionality as well as test cases and examples.
Dan Zheng proposed adding “does X
conform to Y
?”
to the request evaluator.
I wonder if there are plans to add a “does X conform to Y” request to the request evaluator system (or other ways to unify conformance lookup logic)?
I’m curious because there multiple ways to perform conformance lookup (and find associated type witnesses), some of which have caused bugs for the differentiable programming project, which needs
Differentiable
conformance lookup and associated type witness lookup during Sema, SILGen, and SIL transforms.In my experience, the static function
TypeChecker::conformsToProtocol
has been the most reliable way of obtaining a conformance (overModuleDecl::lookupConformance
andModuleDecl::conformsToProtocol
), but it is available only during Sema, not during SIL.
Owen Voorhees shared some thoughts on the future of the Diagnostics User Experience.
Lately, I’ve been thinking about how the diagnostics user experience for Swift could be improved in the long term. I thought it would be valuable to start a conversation around what kind of improvements people would like to see and what we can learn from other compilers, maybe resulting in some kind of rough roadmap if there’s enough interest.
Giuseppe Lanza pitched a proposal
allowing explicit @escaping
for optional closures in function parameters.
A closure is said to escape a function when the closure is passed as an argument to the function, but is called after the function returns . When you declare a function that takes a closure as one of its parameters, you can write @escaping before the parameter’s type to indicate that the closure is allowed to escape.
Quote from the Swift documentation
This statement is not always true when considering optional closures passed as function parameters.
This proposal aims to uniform the behaviour of optional closures with the well-known behaviour of non-optional closures when passed as function parameters.