On Fri, Mar 15, 2013 at 3:13 PM, Rafael Espíndola <span dir="ltr"><<a href="mailto:rafael.espindola@gmail.com" target="_blank">rafael.espindola@gmail.com</a>></span> wrote:<br><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div class="im">> The committee has already reaffirmed this once (albeit quite a long time<br>
> ago).<br>
><br>
> Having just discussed this at length with fellow CWG member James Dennett,<br>
> we think (hopefully James will correct me if I'm misstating something):<br>
><br>
>  * Relying on the names of internal-linkage symbols does not seem<br>
> particularly reasonable,<br>
>  * The status quo (Clang rejecting the code in question) also seems far from<br>
> ideal,<br>
>  * We are about an order of magnitude below having enough evidence to<br>
> justify a change to the standard,<br>
>  * It's not reasonable for Clang to be permanently non-conforming here.<br>
><br>
> Based on the above, I'd like to suggest a solution: we teach CodeGenModule<br>
> to keep track of the internal-linkage functions and variables which are<br>
> declared within C language linkage blocks, and when we reach the end of the<br>
> module, for each such name, if (1) we saw exactly one function or variable<br>
> with that name, and (2) that name is not yet defined in the module, we emit<br>
> an internal linkage alias mapping the "expected" name to the mangled name.<br>
><br>
> This should be a pretty minimal and non-invasive change, and allows us to<br>
> both conform and accept the code in question. Does that seem OK to everyone?<br>
<br>
</div>I think I am ok with it. One problem with going this way is that we<br>
don't have any semantic checking for the "sudo language linkage" going<br>
on, so it is not very clear what "declare within C language blocks"<br>
means. For example, should this 'f' be on the list to get an alias?<br></blockquote><div><br></div><div>I'm fine with requiring the definition to be lexically within an extern "C" block; I view this as being entirely a quality-of-implementation issue, though, so doing better than that would also work for me.</div>
<div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
static void f();<br>
extern "C" {<br>
  void f();<br>
}<br>
void f() {<br>
}<br>
void use() {<br>
  f();<br>
}<br>
<br>
Cheers,<br>
Rafael<br>
</blockquote></div><br>