<div dir="ltr">I&#39;m wading through little by little, but I clearly still have a lot to learn... sorry if I&#39;m bothering you with questions!<div><br></div><div>Comparing the SIL for the `<b>completionBlock</b>` getter, which is imported as ()-&gt;()...<div><br></div><div><div>     %15 = class_method [volatile] %14 : $NSOperation, #NSOperation.completionBlock!getter.1.foreign : NSOperation -&gt; () -&gt; <b><i>(() -&gt; ())?</i></b> , $@convention(objc_method) (NSOperation) -&gt; @autoreleased <b><i>Optional&lt;@convention(block) () -&gt; ()&gt;</i></b></div></div><div><br></div><div>    Here I see that &quot;@convention(block)&quot; is retained in the type information, and appears in the expanded form Optional&lt;@convention(block) ()-&gt;()&gt;, even though the getter completionBlock getter is of type &quot;NSOperation -&gt; () -&gt; (() -&gt; ())?&quot;, and ()-&gt;() is what we see in generated interfaces.</div><div><br></div><div>...vs. the `<b>executionBlocks</b>` getter, which is imported as [()-&gt;()]...<br></div><div><br></div><div><div>     %11 = class_method [volatile] %10 : $NSBlockOperation, #NSBlockOperation.executionBlocks!getter.1.foreign : NSBlockOperation -&gt; () -&gt; <b><i>[() -&gt; ()]</i></b> , $@convention(objc_method) (NSBlockOperation) -&gt; @autoreleased Optional&lt;NSArray&gt;</div><div>     %12 = apply %11(%10) : $@convention(objc_method) (NSBlockOperation) -&gt; @autoreleased Optional&lt;NSArray&gt;</div></div><div><div>     %13 = function_ref @_TF10Foundation22_convertNSArrayToArrayurFGSqCSo7NSArray_GSax_ : $@convention(thin) &lt;τ_0_0&gt; (@owned Optional&lt;NSArray&gt;) -&gt; @owned Array&lt;τ_0_0&gt;</div><div>     %14 = apply <b><i>%13&lt;() -&gt; ()&gt;</i></b>(%12) : $@convention(thin) &lt;τ_0_0&gt; (@owned Optional&lt;NSArray&gt;) -&gt; @owned Array&lt;τ_0_0&gt;</div></div></div><div><div>     release_value %14 : <b><i>$Array&lt;() -&gt; ()&gt;</i></b></div></div><div class="gmail_extra"><br></div><div class="gmail_extra">I don&#39;t see @convention(block) anywhere here. And when I check the type of static_cast&lt;FunctionTypeMetadata*&gt;(T)-&gt;getConvention(), from inside findBridgeWitness, the convention is Swift.</div><div class="gmail_extra"><br></div><div class="gmail_extra">So not only is there no conformance for blocks (which seems like an easy thing to add, like you said, similarly to _BridgeableMetatype), but I think the @convention(block) is being <b>completely lost</b> by adjustTypeForConcreteImport. Is this true or am I missing something?</div><div class="gmail_extra"><br></div><div class="gmail_extra">How is @convention(block) retained after importing in order to produce the right type from completionBlock.getter, namely Optional&lt;@convention(block) ()-&gt;()&gt;, but it appears only as Optional&lt;()-&gt;()&gt; in the generated interface? Why does this mechanism not produce a call to _convertNSArrayToArray&lt;@convention(block) ()-&gt;()&gt;,  but only _convertNSArrayToArray&lt;()-&gt;()&gt; ?</div>







<div class="gmail_extra"><br></div><div class="gmail_extra"><div><div><div dir="ltr"><div>Jacob<br></div></div></div></div>
<br><div class="gmail_quote">On Fri, Mar 4, 2016 at 9:46 AM, Joe Groff <span dir="ltr">&lt;<a href="mailto:jgroff@apple.com" target="_blank">jgroff@apple.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><span><br>
&gt; On Mar 3, 2016, at 10:12 PM, Jacob Bandes-Storch &lt;<a href="mailto:jtbandes@gmail.com" target="_blank">jtbandes@gmail.com</a>&gt; wrote:<br>
&gt;<br>
&gt; I see, thanks for the clarification. How is it, then, that properties whose type is void(^)(void) already work fine?<br>
<br>
</span>For properties, we can statically bridge them by emitting thunk getters and setters at compile time. We have to do this dynamically for bridged containers since they can freely be in ObjC or Swift representation at runtime.<br>
<span><font color="#888888"><br>
-Joe</font></span></blockquote></div><br></div></div>