[cfe-dev] "using namespace" seemingly not effective

Florian Weimer fweimer at redhat.com
Sun May 12 10:40:26 PDT 2013


On 05/12/2013 09:47 AM, Florian Weimer wrote:
> clang++ (default flags, trunk version) does not grok the following code:
>
> namespace outer {
>    void f(int &);
>    void g();
>    namespace inner {
>      void f(long &);
>    }
> }
>
> void
> outer::g()
> {
>    using namespace outer::inner;
>    int i;
>    f(i);
>    long l;
>    f(l);
> }
>
> t.cpp:16:3: error: no matching function for call to 'f'
>    f(l);
>    ^
> t.cpp:2:8: note: candidate function not viable: no known conversion from
> 'long' to 'int &' for 1st argument
>    void f(int &);
>         ^
>
> I find this rather odd, considering that there is an explicit "using
> namespace" directive.  I'm not sufficiently familiar with the C++ name
> lookup rules, but I could have understood if f(int &) became invisible.
> But the other way round is very surprising.

I looked up the rules, and the using directive should put the f(long &) 
declaration in the outer namespace, like this:

namespace outer {
   void f(int &);
   void f(long &);
   void g();
}

void
outer::g()
{
    int i;
    f(i);
    long l;
    f(l);
}

(This follows from "During unqualified name lookup […], the names appear 
as if they were declared in the nearest enclosing namespace which 
contains both the using-directive and the nominated namespace." in 
[namespace.udir] in C++98.)

It seems that clang considers treats the global namespace as the nearest 
enclosing namespace in this case, ignoring the namespace that is implied 
by the function's declarator-id.

I filed a bug: http://llvm.org/bugs/show_bug.cgi?id=15973

-- 
Florian Weimer / Red Hat Product Security Team



More information about the cfe-dev mailing list