I'm playing around with Thomas Sailer's user space soundcard modems for use
on amateur radio links.  One of the things he includes is a small library of 
complex math functions intended to be used inline.  The way this is coded is
to create a .h file with the gcc "magic" use of extern and inline, like so:

        typedef struct {
                float re, im;
        } complex;

        /*
        * Complex multiplication.
        */
        extern __inline__ complex cmul(complex x, complex y)
        {
                complex z;
        
                z.re = x.re * y.re - x.im * y.im;
                z.im = x.re * y.im + x.im * y.re;
        
                return z;
        }

A couple of C source files in the same directory include the header containing
this code, and are aggregated into a .a that an application in an adjacent
directory links against later in the build process.

On my Pentium laptop running Debian with a 2.95.4 compiler, this builds and
runs fine.  On my Itanium system running Debian with everyone's favorite 2.96
plus lots of patches, the above function fails to inline with the complaint

        complex.h: In function `cmul':
        complex.h:14: warning: inline functions not supported for this 
                return value type

when I add a -Winline.  I get the same complaint with gcc-3.0.  The effect of
this is that since the function isn't inlined it's left as an extern, and the
linker can't find it when it tries to link the application against this lib
later in the build.

So, my question.  Why does the ia64 gcc not handle this when the i386 gcc 
likes it just fine?  That's way beyond my toolchain knowledge right now...

Bdale


Reply via email to