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

            Bug ID: 79582
           Summary: Wrong mangled name for stdcall functions with
                    templated arguments when referenced directly from
                    vtbl.
           Product: gcc
           Version: 6.2.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: jacek at codeweavers dot com
  Target Milestone: ---

Created attachment 40764
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=40764&action=edit
test case

It was originally reported in mingw-w64 build of Firefox:
https://bugzilla.mozilla.org/show_bug.cgi?id=1336527

The attached test case shows the problem:

$ i686-w64-mingw32-g++ -c test.i -o test.o
$ i686-w64-mingw32-nm child.o |grep test_virtual
         U __ZN6Parent12test_virtualE16templated_structIiE@4

Note that stdcall suffix should be @8: the function has both implicit this
pointer and templated struct of pointer size. I experimented with this a bit
and it seems to be caused by a combination of stdcall and templated argument.
The suffix is always @4 even if I add more simple arguments.

The bug happens only if such function is needed by the vtbl itself. Other
references to the function work as expected.


I will also attach a test that shows the bug by failing to link:

$ i686-w64-mingw32-g++ -c parent.cpp -o parent.o && i686-w64-mingw32-g++ -c
child.cpp -o child.o && i686-w64-mingw32-g++ parent.o child.o -o test.exe
child.o:child.cpp:(.rdata$_ZTV5Child[__ZTV5Child]+0xc): undefined reference to
`Parent::test_virtual(templated_struct<int>)@4'
collect2: error: ld returned 1 exit status

Reply via email to