Bug 19810

Summary: Finally handling inconsistent when compiling to class/executable
Product: gcc Reporter: Jonathan Hogg <jdh41>
Component: javaAssignee: Not yet assigned to anyone <unassigned>
Status: RESOLVED FIXED    
Severity: normal CC: gcc-bugs, java-prs
Priority: P2    
Version: 4.0.0   
Target Milestone: 4.3.0   
Host: i486-linux Target: i486-linux
Build: i486-linux Known to work:
Known to fail: Last reconfirmed: 2005-05-22 14:07:15
Bug Depends on: 28067    
Bug Blocks:    

Description Jonathan Hogg 2005-02-07 19:15:51 UTC
From this code fragment:

class Confuse {

        public static void main (String[] bob) 
        {
                boolean jim;

                jim=wtf(true);
                System.out.print("Calling wtf(true):");
                System.out.println(jim);

                jim=wtf(false);
                System.out.print("Calling wtf(false):");
                System.out.println(jim);
        }

        static boolean wtf(boolean jam) {
                while (jam)
                {
                        try {
                                return true;
                        }
                        finally {
                                break;
                        }
                }
                return false;
        }
}

Session:
jdh41@chloe:~/src$ gcj -v
Using built-in specs.
Reading specs from
/home/jdh41/gcc/lib/gcc/i686-pc-linux-gnu/4.0.0/../../../libgcj.spec
rename spec lib to liborig
Configured with: ../configure --enable-languages=java --disable-checking
--disable-static --enable-java-awt=gtk --with-system-zlib --prefix=/home/jdh41/gcc
Thread model: posix
gcc version 4.0.0 20050129 (experimental)
jdh41@chloe:~/src$ gcj -C Confuse.java
jdh41@chloe:~/src$ java -v Confuse
Calling wtf(true):true
Calling wtf(false):false
jdh41@chloe:~/src$ ~/j2sdk1.4.2_06/bin/java Confuse
Calling wtf(true):true
Calling wtf(false):false
jdh41@chloe:~/src$ gcj -o confuse_me Confuse.java --main=Confuse
jdh41@chloe:~/src$ ./confuse_me 
Calling wtf(true):false
Calling wtf(false):false
jdh41@chloe:~/src$ ~/j2sdk1.4.2_06/bin/javac Confuse.java 
jdh41@chloe:~/src$ ~/j2sdk1.4.2_06/bin/java Confuse
Calling wtf(true):false
Calling wtf(false):false

As you can see the compile to class files seems to be wrong, and further the
compiler and not the VM.
Comment 1 Tom Tromey 2005-02-07 19:21:05 UTC
This also affects 3.3.

The code for the wtf() method forgets to call the finally handler:

  0: iload_0
  1: ifeq 7
  4: iconst_1
  5: ireturn
  6: pop
  7: iconst_0
  8: ireturn
Comment 2 Tom Tromey 2005-02-19 00:19:41 UTC
I investigated this some more.

The code generator for "return" looks at the finally
stack to decide whether to call any finally handlers.

But, the code generator for "try" has a special case
when the finally clause cannot complete normally.
This confuses the "return" handler.

One fix would be to turn off this optimization.
Comment 3 Tom Tromey 2007-01-09 20:47:05 UTC
All gcj front end bugs have been fixed by the gcj-eclipse branch merge.
I'm mass-closing the affected PRs.
If you believe one of these was closed in error, please reopen it
with a note explaining why.
Thanks.