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

            Bug ID: 101775
           Summary: G++ drops namespace prefix of argument in the
                    referenced function symbol
           Product: gcc
           Version: 11.2.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: mytbk920423 at gmail dot com
  Target Milestone: ---

When g++ builds following code, the function foo() referenced by this program
is compiled to symbol ``foo(VecReg&)``, which should be ``foo(MyISA::VecReg&)``
with the namespace prefix. This results in a linking error.

```
// test.cc

#include <cstdint>
#include <cstdlib>

namespace MyISA {

typedef struct {
        uint8_t data[64];
} VecReg;

}

void foo(MyISA::VecReg &v);

using MyISA::VecReg;

class A
{
        VecReg v;
public:
        void test();
};

typedef MyISA::VecReg VecReg;

void A::test()
{
        foo(v);
}

int main()
{
        A a;
        a.test();
}
```

```
// foo.cc

#include <cstdint>

namespace MyISA {

typedef struct {
        uint8_t data[64];
} VecReg;

}

void foo(MyISA::VecReg &v)
{
        v.data[0] = 42;
}

```

$ g++ -c test.cc ; g++ -c foo.cc ; g++ -o main test.o foo.o
/usr/bin/ld: test.o: in function `A::test()':
test.cc:(.text+0x14): undefined reference to `foo(VecReg&)'

$ nm -C test.o foo.o 

test.o:
                 U _GLOBAL_OFFSET_TABLE_
000000000000001b T main
                 U __stack_chk_fail
                 U foo(VecReg&)
0000000000000000 T A::test()

foo.o:
0000000000000000 T foo(MyISA::VecReg&)

Reply via email to