[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