> On Dec 4, 2016, at 6:46 PM, Charles Srstka via swift-evolution 
> <swift-evolution@swift.org> wrote:
> 
> The following currently does not work:
> 
> protocol P: class {}
> class C: P {}
> 
> func foo<T>(t: T) where T: AnyObject {
>       print("foo")
> }
> 
> let p: P = C()
> 
> foo(t: p) // error: cannot invoke 'foo' with an argument list of type '(t: P)'
> 
> It seems to me that this ought to have been allowed, since P is declared as 
> being a reference type and thus should have been able to satisfy the 
> function’s requirements.
> 
> Is this worthy of writing a language proposal, or would this be considered a 
> bug that should be sent through the radar system instead?

It's a limitation of the current implementation. `AnyObject` is taken as 
meaning that a conforming type has a representation that consists of a single 
refcounted pointer. Protocol existentials do not have a single-refcounted 
representation since the witness table for the conformances must also be 
carried around, therefore the protocol type does not conform to AnyObject's 
representation requirement.

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

Reply via email to