I originally found this problem when trying to compile a Java package written by the Universität Stuttgart's institute IKR. I was using Debian's gcj package, version 4.3.2-2, but can likewise reproduce this using SVN trunk, as well as Debian's 4.2.4-4 package.
I completely reduced the test case to the following: public class Bug_Class { } public interface Bug_Interface { } public class Bug { public <X extends Bug_Class & Bug_Interface> Bug(X x) { set(x); } public void set(Bug_Interface x) { } } Directly compiling this will fail as follows: $ ~/GCC/trunk.build.64.install/bin/gcj -c Bug.java Bug.java: In class 'Bug': Bug.java: In constructor '(Bug_Class)': In file included from <built-in>:3: Bug.java:3: error: verification failed at PC=9: incompatible type on stack gcj is able to emit a class file, but that one is considered non-verifying by the BCEL verifier: [...] Pass 3b, method number 0 ['public void <init>(Bug_Class arg1) [Signature(<E:LBug_Class;:LBug_Interface;>(TE;)V)]']: VERIFIED_REJECTED Constraint violated in method 'public void <init>(Bug_Class arg1) [Signature(<E:LBug_Class;:LBug_Interface;>(TE;)V)]': Instruction INVOKEVIRTUAL constraint violated: Expecting a 'Bug_Interface' but found a 'Bug_Class' on the stack (which is not assignment compatible). InstructionHandle: 6: invokevirtual[182](3) 13 [...] What Sun's javac does differently (as per class-file disassembly inspection) is emitting a checkcast against class Bug_Interface before calling invokevirtual. -- Summary: gcj emitting incorrect code Product: gcc Version: 4.3.2 Status: UNCONFIRMED Severity: normal Priority: P3 Component: java AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: tschwinge at gcc dot gnu dot org http://gcc.gnu.org/bugzilla/show_bug.cgi?id=38827