<p dir="ltr">On 18 Jun 2013 09:45, "Douglas Gregor" <<a href="mailto:dgregor@apple.com">dgregor@apple.com</a>> wrote:<br>
><br>
><br>
> On Jun 18, 2013, at 6:16 AM, Eli Friedman <<a href="mailto:eli.friedman@gmail.com">eli.friedman@gmail.com</a>> wrote:<br>
><br>
>> On Tue, Jun 18, 2013 at 5:47 AM, Rafael Espíndola <<a href="mailto:rafael.espindola@gmail.com">rafael.espindola@gmail.com</a>> wrote:<br>
>>><br>
>>> > I also badgered the committee back in February when this last came up,<br>
>>> > and no consensus for a language change appeared. I'm trying<br>
>>> > rebadgering :)<br>
>>><br>
>>> Until then I think we should conform to what other compilers do and is<br>
>>> less surprising to the users. This is not the same case as, for<br>
>>> example, dependent bases, where the standard was not implemented by<br>
>>> gcc and msvc at the time but was a better model than what those<br>
>>> compilers implemented. Examples like:<br>
>>><br>
>>> extern "C" {<br>
>>>   static void foo(int x);<br>
>>>   static void foo() {<br>
>>>   }<br>
>>>   void foo(int x) {<br>
>>>   }<br>
>>> }<br>
>>><br>
>>> show are not adding value by being pedantically correct.<br>
>>><br>
>>> I am not sure I understand your suggestion about<br>
>>> LocallyScopedExternCDecls. Consider a variant of the testcase above<br>
>>> with just the last two functions. The foo(int) will be the fist extern<br>
>>> C and overload resolution will decide we have an overload. We would<br>
>>> have to walk the lookup results again to find foo().<br>
>><br>
>><br>
>> Suppose overloading completely ignores whether a declaration is extern "C", and suppose you have a hashtable which returns the extern "C" decl for a given identifier.  After you conclude foo(int) overloads foo(), you look in the hashtable and say "oops, there was already a declaration with that name".  (I haven't really thought through whether this is a good idea.)<br>

><br>
><br>
> FWIW, this is almost certainly something we’ll have to do anyway, because we should detect conflicts when there are other extern “C” declarations that otherwise aren’t visible to name lookup, e.g.,<br>
><br>
> namespace N {<br>
>   extern "C" void foo(int);<br>
> }<br>
><br>
> namespace M {<br>
>   extern "C" void foo(float);<br>
> }</p>
<p dir="ltr">Right. Not only is this something we need to handle regardless of this particular bug, it's something we already do (we just get some of the namespace scope cases wrong at the moment).<br>
</p>