This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
curried template inaccurate names
- To: bug-gcc at gnu dot org
- Subject: curried template inaccurate names
- From: Larry Evans <jcampbell3 at prodigy dot net>
- Date: Fri, 14 Jul 2000 14:24:29 -0500
uname -a
Linux localhost.localdomain 2.2.13-4mdk #1 Tue Sep 7 18:23:11 CEST 1999
i586 unknown
g++ -v
Reading specs from
/home/evansl/prog_dev/gcc_all/gcc-2.96/snap-20000626/lib/gcc-lib/i586-pc-linux/2.96/specs
gcc version 2.96 20000626 (experimental)
-------------------
g++ -c bug.cpp 2>&1 | c++filt
/tmp/ccsHxIB3.s: Assembler messages:
/tmp/ccsHxIB3.s:63: Fatal error: Symbol B<template <class> class
C>::C<int>::C(void) already defined.
-------------------
cat bug.cpp
template
< typename S
, template<typename S>class T
>
struct
P
{ P(void)
: m_s(0)
{}
T<S>*
m_s
;
};
template
< typename S
>
struct
A
{ S m_s;
A(void){}
};
template
< template<typename S>class T
>
struct
B
{
template
< typename U
>
struct
C
: public P<U,T>
{
};
};
typedef B<A> B1;
typedef B<B1::C> B2;
typedef B<B2::C> B3;
int
main(void)
{
; B2::C<int> c2
; B3::C<int> c3
; return 0
;}
-------------------
The name in the error message:
B<template <class> class C>::C<int>::C(void)
suggests the compiler is not generating accurate names from the
template instantiations. The above name should be either:
B2::C<int>::C(void)
= B<B1::C>::C<int>::C(void)
= B<B<B<A>::C>::C>::C<int>::C(void)
B3::C<int>::C(void)
= B<B2::C>::C<int>::C(void)
= B<B<B<B<A>::C>::C>::C>::C<int>::C(void)