------- Comment #28 from perry at kundert dot ca  2006-05-11 16:12 -------
This test case *still* exhibits the failure using only g++ 3.3.6, and binutils
2.16.1:

[EMAIL PROTECTED]:binutils-bug$ apt-show-versions g++-3.3
g++-3.3/testing uptodate 1:3.3.6-13
[EMAIL PROTECTED]:binutils-bug$ apt-show-versions binutils
binutils/testing uptodate 2.16.1cvs20060413-1
[EMAIL PROTECTED]:binutils-bug$  cat GNUmakefile
all: main
clean:
        rm *.o
lib1.o: lib1.C
lib2.o: lib2.C
main: main.C lib1.o lib2.o
[EMAIL PROTECTED]:binutils-bug$ make clean all
rm *.o
g++    -c -o lib1.o lib1.C
g++    -c -o lib2.o lib2.C
g++     main.C lib1.o lib2.o   -o main
`.gnu.linkonce.t._ZN3Foo1fEi' referenced in section `.rodata' of lib2.o:
defined in discarded section `.gnu.linkonce.t._ZN3Foo1fEi' of lib2.o
collect2: ld returned 1 exit status
make: *** [main] Error 1
[EMAIL PROTECTED]:binutils-bug$    




(In reply to comment #27)
> Here's a relatively simple test case, in case anyone wants one, that 
> reproduces
> either this problem, or a very similar one.  It requires a mix of compilers,
> and of optimization selections, to reproduce, though.  One gcc 3 compiler and
> one gcc 4 one should do it.
> 
> 
> $ cat foo.h
> class Foo {
>  public:
>   virtual ~Foo() {}
>   virtual inline int f(int x) {
>     switch (x) {
>       case 0: return 0; break;
>       case 1: return 1; break;
>       case 2: return 2; break;    // cases 0 to 2 bulk out the switch 
> statement
> 
>       case 3: return 999; break;  // cases 3 and 4 can be coalesced
>       case 4: return 999; break;
>     }
>     return -1;
>   }
> };
> 
> extern int g(int);
> extern int h();
> 
> $ cat lib1.cc
> #include "foo.h"
> 
> int g(int i) {
>   Foo f;
>   return f.f(i);
> }
> 
> $ cat lib2.cc
> #include "foo.h"
> 
> int h() {
>   Foo f;
>   return f.f(0) + g(0);
> }
> 
> $ cat main.cc
> #include "foo.h"
> 
> int main() {
>   return g(0) + h();
> }
> 
> $ ./g++-3.4.5 -Wall -W -pedantic -O2 -c lib1.cc
> $ ./g++-3.4.5 -Wall -W -pedantic -O0 -c lib2.cc
> $ ./g++-4.1.0 -Wall -W -pedantic -o main lib1.o lib2.o main.cc
> /path/to/i686-unknown-linux-gnu/bin/ld: `.gnu.linkonce.t._ZN3Foo1fEi'
> referenced in section `.rodata' of lib2.o: defined in discarded section
> `.gnu.linkonce.t._ZN3Foo1fEi' of lib2.o
> ... and so on
> 
> In this case, the ld in gcc 4.1 is version 2.16.1.
> 


-- 

perry at kundert dot ca changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |perry at kundert dot ca


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=16625

Reply via email to