When a method creates an instance of an anonymous inner class, it must catch or declare any exceptions throwable by the inner class's constructor. GCJ gives an error about this even though the method *does* handle or declare it: (Will attach test cases...) $ gcj -c FailThrow.java FailThrow.java: In class 'FailThrow$1': FailThrow.java: In constructor '(FailThrow)': FailThrow.java:6: error: Exception ‘java.lang.Exception’ must be caught, or it must be declared in the ‘throws’ clause of ‘FailThrow$1’. InnerBase obj = new InnerBase() {}; ^ 1 error Creating an instance of the base class, with the same constructor, works fine. GCC built from CVS HEAD: gcj-4.0 (GCC) 4.1.0 20050415 (experimental) ./configure --prefix=/usr/local/gcj --program-suffix=-4.0 --enable-languages=c,c++,java Running on Ubuntu Linux (Hoary Hedgehog).
Created attachment 8644 [details] Test case which wraps in a try-catch; fails to compile with GCJ Compiles just fine with javac from Sun JDK 1.5.
Created attachment 8645 [details] Test case using the base class; works Using a base class instead of an anonymous inner class derivitive, the exception is handled as expected.
Created attachment 8646 [details] Failing test case using a throws declaration instead of try-catch Again, fails to compile with GCJ. Fine with javac from Sun JDK 1.5.
Created attachment 8647 [details] Working test case with throws declaration Again, using the base class instead of an anonymous inner class the constructor's exception is handled correctly.
Confirmed
I'm testing a patch.
Subject: Bug 21045 CVSROOT: /cvs/gcc Module name: gcc Changes by: bryce@gcc.gnu.org 2005-07-07 14:34:54 Modified files: libjava : ChangeLog libjava/testsuite/libjava.jacks: jacks.xfail gcc/java : ChangeLog parse.y Added files: libjava/testsuite/libjava.compile: PR21045.java Log message: 2005-07-07 Bryce McKinlay <mckinlay@redhat.com> PR java/21045 * parse.y (add_exception_to_throws): New function. (purge_unchecked_exceptions): Removed. (get_constructor_super): Renamed from verify_constructor_super. Now returns the super constructor after verification. (java_complete_expand_method): Don't use purge_unchecked_exceptions or save/restore the exception list. (check_thrown_exceptions): Add uncaught exceptions in anonymous class initializers and constructors to the throws clause of the method. 2005-07-07 Bryce McKinlay <mckinlay@redhat.com> * testsuite/libjava.compile/PR21045.java: New test. * testsuite/libjava.jacks/jacks.xfail: Remove 15.9.5.1-exception-1, 15.9.5.1-exception-3, 8.3.2-abrupt-6, 8.3.2-abrupt-7. Patches: http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/libjava/ChangeLog.diff?cvsroot=gcc&r1=1.3693&r2=1.3694 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/libjava/testsuite/libjava.compile/PR21045.java.diff?cvsroot=gcc&r1=NONE&r2=1.1 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/libjava/testsuite/libjava.jacks/jacks.xfail.diff?cvsroot=gcc&r1=1.26&r2=1.27 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/java/ChangeLog.diff?cvsroot=gcc&r1=1.1641&r2=1.1642 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/java/parse.y.diff?cvsroot=gcc&r1=1.546&r2=1.547
Fixed on HEAD.