[gnu.g++.bug] Strange building of symbols for friends

chatty%FRLRI61.BITNET@CUNYVM.CUNY.EDU (03/23/89)

Our g++ 1.33 shows a strange behaviour with non-overloaded friend functions
which have previously been declared as external : depending on the context,
it builds a normal symbol (like _foo), or a long one (like _foo_VOID), which
leads to undefined symbols when linking.

Here is the shortest example we found :

::::::::::::::
foo.h
::::::::::::::
extern void foo ();

class A {
friend void foo ();
};


::::::::::::::
foo.cc
::::::::::::::
#include "foo.h"

void foo ()
{
}


::::::::::::::
bar.cc
::::::::::::::
#include "foo.h"

main ()
{
        foo ();
}

% g++ -c foo.cc bar.cc
% g++ -o bar foo.o bar.o
Undefined symbols:
 _foo

% nm foo.o bar.o

foo.o:
00000000 T _foo_VOID              <---------
00000000 t gcc_compiled.                   |
                                           |--- ??????
bar.o:                                     |
         U _foo               <-------------
00000000 T _main
00000000 t gcc_compiled.

That code is perhaps wrong, but I think it would deserve a warning, at least.

I forgot : g++ does the same on SUN3, SUN4, and HP9000s300.



        Stephane CHATTY                       chatty@lri.lri.fr
           L.R.I                              chatty@frlri61.bitnet
    Universite de Paris-Sud