> On Oct 3, 2017, at 11:05 PM, Jonas B <bobe...@gmail.com> wrote:
> 
> 
>> On 4 Oct 2017, at 14:33, Slava Pestov <spes...@apple.com 
>> <mailto:spes...@apple.com>> wrote:
>> 
>> @_versioned makes a symbol visible externally without making it visible from 
>> the language. There is no requirement that a @_versioned thing is 
>> @inlinable. It is used when you want to reference an internal function from 
>> an inlinable function. Eg,
>> 
>> internal func myImplDetail() { … }
>> 
>> @inlinable public func myPublicFunction() { myImplDetail() } // error!
>> 
>> —
>> 
>> @_versioned internal func myImplDetail() { … }
>> 
>> @inlinable public func myPublicFunction() { myImplDetail() } // OK
>> 
>> Slava
> 
> 
> From my language user point of view it would be more understandable if that 
> was written with a single keyword, eg:
> @nonABI internal func myImplDetail() { }
> @nonABI public func myPublicFunction() { myImplDetail() }  // OK

The two attributes are different though. myImplDetail() is _not_ inlined into 
client code here, but myPublicFunction() is. So they need different attributes 
to express this intent.

> 
> Anyway, for my use case mentioned earlier (shipping a release version of my 
> app bundle), that doesn’t really matter. I’d just like a compiler switch that 
> made the whole module not having an ABI, essentially making all all methods 
> and types @inlinable and @_versioned, using the terminology in your example.

Yes, that would be a nice feature to have but it is outside the scope of this 
proposal. First, we want to tackle shipping resilient modules — then we can 
discuss generalizing the notion of a “resilience domain” to encompass multiple 
modules. I realize the latter is more useful to third party developers though, 
and I apologize that in this particular case our priorities are at odds…

> 
> My other observation is that no matter how great the ergonomics, and no 
> matter the naming of these attributes, very few people outside the compiler 
> team is going to be able to successfully ship a versioned library without the 
> “Checking Binary Compatibility” tool mentioned in 
> https://github.com/apple/swift/blob/master/docs/LibraryEvolution.rst#checking-binary-compatibility
>  
> <https://github.com/apple/swift/blob/master/docs/LibraryEvolution.rst#checking-binary-compatibility>.

I agree — even for members of the compiler team this tool would be very useful, 
both as a way of encoding our assumptions for sanity-checking, and making sure 
we don’t make a silly mistake with a future update to the standard library.

Slava

> 
> /Jonas
> 

_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to