[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