GCJ erroneously looks up inner classes (usually private) before classes in other packages. For example, I have three files a/A.java, b/B.java, and b/C.java: -- a/A.java: package a; public abstract class A { public abstract void a(); public void b() { new B().innerB(); } private class B { public void innerB() { System.out.println ("inner b!"); } } } -- b/B.java: package b; class B { public void b() { System.out.println ("b!"); } } -- b/C.java: package b; import a.A; class C extends A { public void a() { System.out.println ("aaa!"); } public static final void main (String[] argv) { C c = new C(); c.a(); c.b(); B b = new B(); b.b(); } } $ gcj -C a/A.java b/B.java b/C.java b/C.java:15: error: Nested class a.A$B is private; cannot be accessed from here. B b = new B(); ^ 1 error $ gcj --version gcj (GCC) 3.4.2 This is easy to work around (just say "b.B b = new b.B()"), but is still incorrect. Javac and jikes do not fail.
Confirmed.
GCJ actually has the resolution order correct here. The problem is that a.A.B is not visible from b.C, because its a private class. Instead of an error, however, GCJ needs to resolve to the visible class b.B instead. I'm testing a patch.
Subject: Bug 18119 CVSROOT: /cvs/gcc Module name: gcc Changes by: bryce@gcc.gnu.org 2005-07-07 14:44:03 Modified files: libjava : ChangeLog libjava/testsuite/libjava.jacks: jacks.xfail gcc/java : ChangeLog parse.y Log message: 2005-07-07 Bryce McKinlay <mckinlay@redhat.com> PR java/18119 * parse.y (inner_class_accessible): New function. Logic moved from check_inner_class_access. (check_inner_class_access): Use inner_class_accessible. (resolve_inner_class): Simplify arguments. Create circularity hash here. Keep looking for classes if we found one that was inaccessible. Return the inaccessible class only if there is no other match. (do_resolve_class): Update for new resolve_inner_class arguments. Don't create circularity_hash here. Patches: http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/libjava/ChangeLog.diff?cvsroot=gcc&r1=1.3694&r2=1.3695 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/libjava/testsuite/libjava.jacks/jacks.xfail.diff?cvsroot=gcc&r1=1.27&r2=1.28 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/java/ChangeLog.diff?cvsroot=gcc&r1=1.1642&r2=1.1643 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/java/parse.y.diff?cvsroot=gcc&r1=1.547&r2=1.548
Fixed on HEAD.