[patch] Fix pr16247

Richard Smith richard at metafoo.co.uk
Tue Jun 18 11:08:45 PDT 2013


On Tue, Jun 18, 2013 at 6:57 AM, Rafael EspĂ­ndola
<rafael.espindola at gmail.com> wrote:
>> 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.)
>
> The case I don't understand is
>
>
> extern "C" {
>   static void foo() { }
>   void foo(int x) {}
> }
>
> Overload in this proposal will decide that the second foo is an
> overload, we see that it is extern C, add it to the hash and now,
> where do we find the first foo? Note that it is *not* extern C
> according to the standard and our current implementation.

There are three separate lookups relevant here:

1) Normal redeclaration lookup
2) When declaring an extern "C" function that is not yet a
redeclaration, look for extern "C" functions in other scopes
3) When declaring an extern "C" function that is (still) not yet a
redeclaration, error if there is a declaration of that name in the
global namespace

We already do (2), but miss some cases because our map of extern "C"
declarations is incomplete (this causes various bugs regardless of
whether we allow internal linkage declarations to be extern "C").

I think you're asking how we do (3). The answer is that we currently
miss this check if the declarations are not in the same scope, and
with my suggestion, would miss it in all cases. Again, this is
something we should fix regardless.




More information about the cfe-commits mailing list