[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

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: