[Bug java/38827] New: gcj emitting incorrect code

tschwinge at gcc dot gnu dot org gcc-bugzilla@gcc.gnu.org
Tue Jan 13 16:03:00 GMT 2009


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



More information about the Gcc-bugs mailing list