<div dir="ltr">Take a C++ function like the following:<div><br></div><div><font face="courier new, monospace">inline void f() {</font></div><div><font face="courier new, monospace">  ^{</font></div>
<p style="margin:0px"><font face="courier new, monospace">    static int i = 0;</font></p>
<p style="margin:0px"><font face="courier new, monospace">    printf("%d\n", ++i);</font></p>
<p style="margin:0px"><font face="courier new, monospace">  }();</font></p><div><font face="courier new, monospace">}</font></div><div><br></div><div>Looks pretty simple, right?  Unfortunately, trunk clang doesn't handle this correctly.  The primary issue here is we haven't defined the correct way to mangle the name of "i", and clang's current scheme is unusable because it depends on the details of IRGen.  (There's also the matter that we don't compute the linkage correctly, but that's a simple IRGen bug.)</div>
<div><br></div><div>I'm attaching a patch which expands the scheme we use for mangling lambda expressions in this sort of context to also work for block literals.  The patch is still a bit of a mess: there's a bunch of copy-paste code I still need to clean up, I haven't included tests, and it would probably be nice to include the parameter types of the block in the mangling.  That said, it essentially implements everything necessary.</div>
<div><br></div><div>Note that this doesn't touch the mangling scheme for the actual function definitions for blocks; they don't need to be externally visible, so we don't need to change the current mangling. </div>
<div><br></div><div>I'd like some feedback to make sure my patch is actually implementing something sane.  Any suggestions for a better name than LambdaBlockMangleContext are also welcome.</div><div><br></div><div>-Eli</div>
</div>