[Bug c++/12982] New: C++ ABI violation : wrong mangled name, leads to assembler errors.
carlo at gcc dot gnu dot org
gcc-bugzilla@gcc.gnu.org
Mon Nov 10 00:49:00 GMT 2003
A template function like:
template<typename T>
void f(typename T::t param)
mangles the paramtype using the template param
name (1T), instead of the real type! That is
obviously wrong.
A test case that proves that this can lead to
problems is the following code snippet:
#include <iostream>
class X {
public:
typedef char const* t;
};
class Y {
public:
typedef double t;
};
template<typename T, typename S>
typename void f(typename T::t param)
{
std::cout << "Calling f<T, S>(" << param << ")\n";
}
template<typename S, typename T>
typename void f(typename T::t param)
{
std::cout << "Calling f<S, T>(" << param << ")\n";
}
int main()
{
f<X, Y>(3.4);
f<X, Y>("Hello");
}
Compiling this leads to twice the same
mangled name:
/usr/src/GNU/builds-gcc/PR12947/PR12947-native/gcc/g++
-B/usr/src/GNU/builds-gcc/PR12947/PR12947-native/gcc -isystem
/usr/src/GNU/builds-gcc/PR12947/PR12947-native/i686-pc-linux-gnu/libstdc++-v3/include
-isystem
/usr/src/GNU/builds-gcc/PR12947/PR12947-native/i686-pc-linux-gnu/libstdc++-v3/include/i686-pc-linux-gnu
-L/usr/src/GNU/builds-gcc/PR12947/PR12947-native/i686-pc-linux-gnu/libstdc++-v3/src/.libs
-Wl,--rpath,/usr/src/GNU/builds-gcc/PR12947/PR12947-native/i686-pc-linux-gnu/libstdc++-v3/src/.libs:/usr/src/GNU/builds-gcc/PR12947/PR12947-native/gcc
-v test.cc
Reading specs from /usr/src/GNU/builds-gcc/PR12947/PR12947-native/gcc/specs
Configured with: ../../../gcc/PR12947/gcc-PR12947/configure
--prefix=/usr/src/GNU/install --enable-shared --with-gnu-as --with-gnu-ld
--enable-languages=c++ --enable-debug --enable-threads
Thread model: posix
gcc version 3.4 20031107 (experimental)
/usr/src/GNU/builds-gcc/PR12947/PR12947-native/gcc/cc1plus -quiet -v -iprefix
/usr/src/GNU/builds-gcc/PR12947/PR12947-native/gcc/../lib/gcc/i686-pc-linux-gnu/3.4/
-isystem /usr/src/GNU/builds-gcc/PR12947/PR12947-native/gcc/include
-D_GNU_SOURCE -isystem
/usr/src/GNU/builds-gcc/PR12947/PR12947-native/i686-pc-linux-gnu/libstdc++-v3/include
-isystem
/usr/src/GNU/builds-gcc/PR12947/PR12947-native/i686-pc-linux-gnu/libstdc++-v3/include/i686-pc-linux-gnu
test.cc -quiet -dumpbase test.cc -mtune=pentiumpro -auxbase test -version -o
/tmp/ccL37X72.s
ignoring nonexistent directory
"/usr/src/GNU/builds-gcc/PR12947/PR12947-native/gcc/../lib/gcc/i686-pc-linux-gnu/3.4/../../../../include/c++/3.4"
ignoring nonexistent directory
"/usr/src/GNU/builds-gcc/PR12947/PR12947-native/gcc/../lib/gcc/i686-pc-linux-gnu/3.4/../../../../include/c++/3.4/i686-pc-linux-gnu"
ignoring nonexistent directory
"/usr/src/GNU/builds-gcc/PR12947/PR12947-native/gcc/../lib/gcc/i686-pc-linux-gnu/3.4/../../../../include/c++/3.4/backward"
ignoring nonexistent directory
"/usr/src/GNU/builds-gcc/PR12947/PR12947-native/gcc/../lib/gcc/i686-pc-linux-gnu/3.4/include"
ignoring nonexistent directory
"/usr/src/GNU/builds-gcc/PR12947/PR12947-native/gcc/../lib/gcc/i686-pc-linux-gnu/3.4/../../../../i686-pc-linux-gnu/include"
ignoring nonexistent directory
"/usr/src/GNU/install/lib/gcc/i686-pc-linux-gnu/3.4/../../../../i686-pc-linux-gnu/include"
#include "..." search starts here:
#include <...> search starts here:
/usr/src/GNU/builds-gcc/PR12947/PR12947-native/gcc/include
/usr/src/GNU/builds-gcc/PR12947/PR12947-native/i686-pc-linux-gnu/libstdc++-v3/include
/usr/src/GNU/builds-gcc/PR12947/PR12947-native/i686-pc-linux-gnu/libstdc++-v3/include/i686-pc-linux-gnu
/usr/src/GNU/install/lib/gcc/i686-pc-linux-gnu/3.4/../../../../include/c++/3.4
/usr/src/GNU/install/lib/gcc/i686-pc-linux-gnu/3.4/../../../../include/c++/3.4/i686-pc-linux-gnu
/usr/src/GNU/install/lib/gcc/i686-pc-linux-gnu/3.4/../../../../include/c++/3.4/backward
/usr/local/include
/usr/src/GNU/install/include
/usr/src/GNU/install/lib/gcc/i686-pc-linux-gnu/3.4/include
/usr/include
End of search list.
GNU C++ version 3.4 20031107 (experimental) (i686-pc-linux-gnu)
compiled by GNU C version 3.2.3 20030422 (Red Hat Linux 3.2.3-4).
GGC heuristics: --param ggc-min-expand=30 --param ggc-min-heapsize=4096
as -V -Qy -o /tmp/ccf8LcUD.o /tmp/ccL37X72.s
GNU assembler version 2.13.90.0.18 (i386-redhat-linux) using BFD version
2.13.90.0.18 20030206
/tmp/ccL37X72.s: Assembler messages:
/tmp/ccL37X72.s:104: Error: symbol `_Z1fI1X1YEvN1T1tE' is already defined
This is a regression compared to 2.95.3:
# g++-2.95.3 test.cc
# a.out
Calling f<S, T>(3.4)
Calling f<T, S>(Hello)
All 3.x versions have this bug.
--
Summary: C++ ABI violation : wrong mangled name, leads to
assembler errors.
Product: gcc
Version: 3.4
Status: UNCONFIRMED
Keywords: wrong-code
Severity: critical
Priority: P2
Component: c++
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: carlo at gcc dot gnu dot org
CC: gcc-bugs at gcc dot gnu dot org
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=12982
More information about the Gcc-bugs
mailing list