https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80288

            Bug ID: 80288
           Summary: Using directive injects names into a wrong namespace
           Product: gcc
           Version: 7.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: bugger_gcc at interia dot pl
  Target Milestone: ---

Consider the following code:

namespace N1 {
    int i;
    namespace N2 {
        int i;
    }
    void f();
}

void N1::f()
{
    using namespace N2;
    i = 0;
}

GCC complains:
<source>: In function 'void N1::f()':
<source>:12:5: error: reference to 'i' is ambiguous

Apparently the using directive puts N2::i into N1, causing the conflict with
N1::i. However, N2::i should be put into the global namespace and hidden by
N1::i, thus there should be no ambiguity.

According to 7.3.4/2:
"[...] the names appear as if they were declared in the nearest enclosing
namespace which contains both the using-directive and the nominated namespace.
[Note: In this context, “contains” means “contains directly or indirectly”.
—end note]"

The nearest enclosing namespace of the using directive in this case is the
global namespace, not N1, because N1::f() is defined in the global namespace
and IIUC the fact that it's a member of N1 only affects name lookup within its
body, not the containment of the using directive.

This is how Clang interprets this too: https://godbolt.org/g/LMqveL

Reply via email to