Bug 21045 - Anonymous inner class constructor's exceptions can't be caught or thrown
Summary: Anonymous inner class constructor's exceptions can't be caught or thrown
Status: RESOLVED FIXED
Alias: None
Product: gcc
Classification: Unclassified
Component: java (show other bugs)
Version: 4.1.0
: P2 normal
Target Milestone: 4.1.0
Assignee: Not yet assigned to anyone
URL:
Keywords: rejects-valid
Depends on:
Blocks: 18131
  Show dependency treegraph
 
Reported: 2005-04-15 12:12 UTC by Brion Vibber
Modified: 2005-07-07 14:46 UTC (History)
2 users (show)

See Also:
Host: i686-pc-linux-gnu
Target: i686-pc-linux-gnu
Build: i686-pc-linux-gnu
Known to work:
Known to fail:
Last reconfirmed: 2005-06-17 22:59:08


Attachments
Test case which wraps in a try-catch; fails to compile with GCJ (123 bytes, text/plain)
2005-04-15 12:15 UTC, Brion Vibber
Details
Test case using the base class; works (121 bytes, text/plain)
2005-04-15 12:16 UTC, Brion Vibber
Details
Failing test case using a throws declaration instead of try-catch (103 bytes, text/plain)
2005-04-15 12:17 UTC, Brion Vibber
Details
Working test case with throws declaration (101 bytes, text/plain)
2005-04-15 12:20 UTC, Brion Vibber
Details

Note You need to log in before you can comment on or make changes to this bug.
Description Brion Vibber 2005-04-15 12:13:02 UTC
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).
Comment 1 Brion Vibber 2005-04-15 12:15:31 UTC
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.
Comment 2 Brion Vibber 2005-04-15 12:16:41 UTC
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.
Comment 3 Brion Vibber 2005-04-15 12:17:58 UTC
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.
Comment 4 Brion Vibber 2005-04-15 12:20:01 UTC
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.
Comment 5 Bryce McKinlay 2005-06-17 22:59:08 UTC
Confirmed
Comment 6 Bryce McKinlay 2005-06-18 01:51:22 UTC
I'm testing a patch.
Comment 7 GCC Commits 2005-07-07 14:35:06 UTC
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

Comment 8 Bryce McKinlay 2005-07-07 14:46:24 UTC
Fixed on HEAD.