This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
c++/9450: incorrect mangled name for scope resolution template argument
- From: catherin at ca dot ibm dot com
- To: gcc-gnats at gcc dot gnu dot org
- Date: 27 Jan 2003 14:53:58 -0000
- Subject: c++/9450: incorrect mangled name for scope resolution template argument
- Reply-to: catherin at ca dot ibm dot com
>Number: 9450
>Category: c++
>Synopsis: incorrect mangled name for scope resolution template argument
>Confidential: no
>Severity: serious
>Priority: medium
>Responsible: unassigned
>State: open
>Class: sw-bug
>Submitter-Id: net
>Arrival-Date: Mon Jan 27 14:56:01 UTC 2003
>Closed-Date:
>Last-Modified:
>Originator: Catherine Morton
>Release: 3.2
>Organization:
>Environment:
gcc -v
Reading specs from /usr/lib/gcc-lib/powerpc-suse-linux/3.2/specs
Configured with: ../configure --enable-threads=posix --prefix=/usr --with-local-prefix=/usr/local --infodir=/usr/share/info --mandir=/usr/share/man --libdir=/usr/lib --enable-languages=c,c++,f77,objc,java,ada --enable-libgcj --with-gxx-include-dir=/usr/include/g++ --with-slibdir=/lib --with-system-zlib --enable-shared --enable-__cxa_atexit powerpc-suse-linux
Thread model: posix
gcc version 3.2
>Description:
testcase:
// ------- abc.cpp ------
struct A5 {int i;};
template <int A5::*p> void f5(int) {}
void g5() {f5<&A5::i>(0);}
// ----------------------
gcc name:
_Z2f5IXadsr2A5NS0_1iEEEvi
from ABI:
Template arguments that could be pointer-to-member constants are difficult because it is often
not possible to distinguish them from pointers to static member functions or data members without
doing the substitution. Therefore, the scope resolution (sr) mangling operator is used if the LHS
operand of :: involves a template parameter. Ignoring substitutions, &T::j as a template argument
would be encoded Xadsr1T1jE.
I don't think the gcc name is correct in this case:
_Z2f5IXadsr2A5NS0_1iEEEvi
^
The N here indicates that &A5::i is encoded as "adsr" followed by 2A5 followed by the nested
name A5::i encoded as (N2A51iE) NS0_i (where S0_ is a substitution for the previously encoded 2A5)
So, I think that A5 is encoded 2 times in this name.
The abi example indicates that this context should not be
encoded as a nested name, so I'm guessing the correct name
should be:
_Z2f5IXadsr2A51iEEvi
so <&A5::i> is 'IXadsr2A51iEE'
>How-To-Repeat:
g++ -c abc.cpp
nm abc.o
>Fix:
>Release-Note:
>Audit-Trail:
>Unformatted: