java/7298: Can't call method of outer class from inner constructor

jmr@fulcrummicro.com jmr@fulcrummicro.com
Fri Jul 12 19:26:00 GMT 2002


>Number:         7298
>Category:       java
>Synopsis:       Can't call method of outer class from inner constructor
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    unassigned
>State:          open
>Class:          rejects-legal
>Submitter-Id:   net
>Arrival-Date:   Fri Jul 12 18:46:00 PDT 2002
>Closed-Date:
>Last-Modified:
>Originator:     Jesse Rosenstock
>Release:        3.2 20020710 (experimental)
>Organization:
>Environment:
System: Linux churchill 2.4.3-12 #1 Fri Jun 8 15:05:56 EDT 2001 i686 unknown
Architecture: i686

	
host: i686-pc-linux-gnu
build: i686-pc-linux-gnu
target: i686-pc-linux-gnu
configured with: ./configure --prefix=/home/user/jmr/app/gcc
>Description:
	A method of an outer class cannot be called from the inner class
        constructor before the constructor for the inner class's superclass
        has been called.  The outer class has been constructed, so this
        should be allowed.
>How-To-Repeat:

	X.java:

        public class X {
            Object f() {
                return null;
            }
            class XX {
                XX() {
                    this(f());
                }

                XX(Object o) {
                }
            }
        }

        gcj -v X.java yields:

        Reading specs from /home/user/jmr/app/gcc/lib/gcc-lib/i686-pc-linux-gnu/3.2/specs
        Reading specs from /home/user/jmr/app/gcc/lib/gcc-lib/i686-pc-linux-gnu/3.2/../../../libgcj.spec
        rename spec lib to liborig
        Configured with: ./configure --prefix=/home/user/jmr/app/gcc
        Thread model: single
        gcc version 3.2 20020710 (experimental)
         /home/user/jmr/app/gcc/lib/gcc-lib/i686-pc-linux-gnu/3.2/jc1 X.java -fno-use-divide-subroutine -fuse-boehm-gc -fnon-call-exceptions -fkeep-inline-functions -quiet -dumpbase X.java -g1 -version -o /tmp/ccZQXE2X.s
        GNU Java version 3.2 20020710 (experimental) (i686-pc-linux-gnu)
                compiled by GNU C version 2.96 20000731 (Red Hat Linux 7.1 2.96-85).
        Class path starts here:
            /home/user/jmr/gcj_test/inner2/
            /home/user/jmr/app/gcc/share/java/libgcj-3.2.jar/ (system) (zip)
        X.java: In class `X$XX':
        X.java: In constructor `(X)':
        X.java:7: error: Can't reference `this' before the superclass constructor has been called.
                       this(f());
                            ^
        1 error

        This works with javac.
>Fix:
	This could be worked around by passing a reference to the outer
        class into the constructor.

        public class X {
            Object f() {
                return null;
            }
            class XX {
                XX(X x) {
                    this(x.f());
                }

                XX(Object o) {
                }
            }
        }
>Release-Note:
>Audit-Trail:
>Unformatted:



More information about the Gcc-bugs mailing list