Bug 27101

Summary: GCJ rejects valid code (for Sun's measure of "valid')
Product: gcc Reporter: Vadim Nasardinov <vnasardinov>
Component: javaAssignee: Not yet assigned to anyone <unassigned>
Status: RESOLVED FIXED    
Severity: normal CC: gcc-bugs, java-prs
Priority: P3 Keywords: rejects-valid
Version: 4.1.0   
Target Milestone: 4.3.0   
Host: Target:
Build: Known to work:
Known to fail: Last reconfirmed: 2006-04-10 16:30:38
Bug Depends on: 28067    
Bug Blocks:    

Description Vadim Nasardinov 2006-04-10 13:54:59 UTC
This is probably a duplicate of something that has been filed before,
but my cursory search failed to turn up any similar tickets.

GCJ rejects code that both Sun and Eclipse compilers accept.

Here's the test case:

| $ cat Reluctant.java
| public class Reluctant {
|     private Reluctant internalInstance = new Reluctant();
|
|     public Reluctant() throws Exception {
|         throw new Exception("I'm not coming out");
|     }
|
|     public static void main(String[] args) {
|         try {
|             Reluctant b = new Reluctant();
|             System.out.println("Surprise!");
|         } catch (Exception ex) {
|             System.out.println("I told you so");
|         }
|     }
| }

The test comes from
http://www.javapuzzlers.com/java-puzzlers.zip


Here's what I'm using

| $ gcj -v
| Using built-in specs.
| Reading specs from /usr/lib/gcc/x86_64-redhat-linux/4.1.0/libgcj.spec
| rename spec lib to liborig
| Target: x86_64-redhat-linux
| Configured with: ../configure --prefix=/usr --mandir=/usr/share/man \
|  --infodir=/usr/share/info --enable-shared --enable-threads=posix \
|  --enable-checking=release --with-system-zlib --enable-__cxa_atexit \
|  --disable-libunwind-exceptions --enable-libgcj-multifile \
|  --enable-languages=c,c++,objc,obj-c++,java,fortran,ada \
|  --enable-java-awt=gtk --disable-dssi \
|  --with-java-home=/usr/lib/jvm/java-1.4.2-gcj-1.4.2.0/jre \
|  --with-cpu=generic --host=x86_64-redhat-linux
|
| Thread model: posix
| gcc version 4.1.0 20060304 (Red Hat 4.1.0-3)

Here's the compilation error the above code triggers:

| $ gcj -C Reluctant.java
| Reluctant.java: In class 'Reluctant':
| Reluctant.java: In method 'finit$()':
| Reluctant.java:2: error: Exception $-1òøjava.lang.Exceptionòù can't be thrown in initializer.
|     private Reluctant internalInstance = new Reluctant();
|                                                 ^
| 1 error

Here's what the Eclipse compiler has to say:

| $ ecj -v
| Eclipse Java Compiler v_585_R31x, 3.1.2 release, Copyright IBM Corp 2000, 2006. All rights reserved.
| $ ecj Reluctant.java
| ----------
| 1. WARNING in Reluctant.java
|  (at line 2)
| 	private Reluctant internalInstance = new Reluctant();
| 	                  ^^^^^^^^^^^^^^^^
| The field Reluctant.internalInstance is never read locally
| ----------
| ----------
| 2. WARNING in Reluctant.java
|  (at line 10)
| 	Reluctant b = new Reluctant();
| 	          ^
| The local variable b is never read
| ----------
| 2 problems (2 warnings)

No errors.

Same with Sun's javac:

| $ javac -version 2>&1 | head -n1
| javac 1.5.0_06
| $ javac -Xlint Reluctant.java
| $ echo $?
| 0
Comment 1 Andrew Pinski 2006-04-10 16:30:38 UTC
Please next time if you going to put the testcase inline don't put stuff in front of the testcase so it can be easy to access.


Anyways confirmed.
Comment 2 Vadim Nasardinov 2006-04-10 18:12:06 UTC
Tom Fitzsimmons stopped complaining about my pipe-quoting technique
after I told him about "M-x delete-rectangle" a.k.a. "C-x r d".  Takes
about 5 seconds in Emacs to fix this up. One, if you type really fast :)

Thanks for looking at this.
Comment 3 Andrew Pinski 2006-04-10 18:24:53 UTC
(In reply to comment #2)
> Tom Fitzsimmons stopped complaining about my pipe-quoting technique
> after I told him about "M-x delete-rectangle" a.k.a. "C-x r d".  Takes
> about 5 seconds in Emacs to fix this up. One, if you type really fast :)
> Thanks for looking at this.

Who uses emacs, I am serious, I don't.
Comment 4 Tom Tromey 2006-04-12 17:38:03 UTC
I thought this looked like a dup, but I can't find the original.
In any case, ISTR looking at the logic here in gcj at one point,
and finding that it was all screwed up.

Pinski: you can do:  sed 's/^.//d' > File.java  and then cut
and paste...
Comment 5 Tom Tromey 2007-01-09 20:48:32 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.