Bug#195264: libstdc++5-3.3-dev: forward template declarations in <complex> let inlining fail
On Sun, 2003-06-29 at 12:51, Matthias Klose wrote:
> Please could you check, if the always_inline attribute (gcc-snapshot
> package) works for you?
I don't see why that'd help? (btw, it didn't work, tested with gcc
version 3.4 20030706 (experimental))
the problem is the following:
when compiling the following with -O2
template<typename T> T foo(T);
template<typename T> inline T foo(T t)
{
return t;
} // __attribute((always_inline))
long bar (long);
inline long bar (long l)
{
return l;
}
void doo (long &l)
{
l = foo (l);
l = bar (l);
}
Disassembly of section .text:
00000000 <doo(long&)>:
0: 55 push %ebp
1: 89 e5 mov %esp,%ebp
3: 53 push %ebx
4: 83 ec 10 sub $0x10,%esp
7: 8b 5d 08 mov 0x8(%ebp),%ebx
a: ff 33 pushl (%ebx)
c: e8 fc ff ff ff call d <doo(long&)+0xd>
d: R_386_PC32 long foo<long>(long)
11: 89 03 mov %eax,(%ebx)
13: 83 c4 10 add $0x10,%esp
16: 8b 5d fc mov 0xfffffffc(%ebp),%ebx
19: c9 leave
1a: c3 ret
Disassembly of section .gnu.linkonce.t._Z3fooIlET_S0_:
00000000 <long foo<long>(long)>:
0: 55 push %ebp
1: 89 e5 mov %esp,%ebp
3: 8b 45 08 mov 0x8(%ebp),%eax
6: c9 leave
7: c3 ret
i.e. bar get's inlined, but foo<long> does not... why?
btw, gcc-2.95 would optimize it into a NOP:
00000000 <doo(long &)>:
0: 55 push %ebp
1: 89 e5 mov %esp,%ebp
3: c9 leave
4: c3 ret
-- I'd say that's a regression...
>
> Herbert Valerio Riedel writes:
> > Package: libstdc++5-3.3-dev
> > Version: 1:3.3-2
> > Severity: minor
> >
> >
> > I just noticed, that std::conj() doesn't get inlined, as one'd expect it
> > to be;
> >
> > it seems that a forward declaration like
> >
> > template<typename _Tp> complex<_Tp> conj(const complex<_Tp>&);
> >
> > keeps
> >
> > template<typename _Tp>
> > inline complex<_Tp>
> > conj(const complex<_Tp>& __z)
> > { return complex<_Tp>(__z.real(), -__z.imag()); }
> >
> > from honoring the 'inline' keyword at all;
> > by either removing the forward declaration completely, or adding the
> > inline keyword to it like:
> >
> > template<typename _Tp> inline complex<_Tp> conj(const complex<_Tp>&);
> >
> > g++ happily inlines the function again...
> >
> > I don't know whether this is a bug at all (after all inline'ing is
> > optional... :-)...
> >
> > -- System Information:
> > Debian Release: testing/unstable
> > Architecture: i386
> > Kernel: Linux lfdux.ifs.tuwien.ac.at 2.4.20-1-k7 #1 Sat Mar 22 15:17:52 EST 2003 i686
> > Locale: LANG=C, LC_CTYPE=C
> >
> > Versions of packages libstdc++5-3.3-dev depends on:
> > ii g++-3.3 1:3.3-2 The GNU C++ compiler
> > ii gcc-3.3-base 1:3.3-2 The GNU Compiler Collection (base
> > ii libc6-dev 2.3.1-17 GNU C Library: Development Librari
> > ii libstdc++5 1:3.3-2 The GNU Standard C++ Library v3
> >
> > -- no debconf information
> >
> >
> >
> > --
> > To UNSUBSCRIBE, email to debian-gcc-request@lists.debian.org
> > with a subject of "unsubscribe". Trouble? Contact listmaster@lists.debian.org
--
Herbert Valerio Riedel / Phone: (EUROPE) +43-1-58801-18840
Email: hvr@hvrlab.org / Finger hvr@gnu.org for GnuPG Public Key
GnuPG Key Fingerprint: 7BB9 2D6C D485 CE64 4748 5F65 4981 E064 883F 4142
Reply to: