GCJ silently compiles an illegal access to a package-private class in another package. Here's the testcase: ------------------ Snafu.java ------------------------------- public class Snafu { public static void main( String[] args) { foo.Bar.hello( ); } } ------------------------------------------------------------- ------------------ foo/Bar.java ----------------------------- package foo; class Bar { public static void hello( ) { System.out.println( "Hello!"); } } ------------------------------------------------------------- Here's what JDK 1.4.2.03 on Linux says for this: ------------------------------------------------------------- Snafu.java:3: foo.Bar is not public in foo; cannot be accessed from outside pack age foo.Bar.hello( ); ^ Snafu.java:3: hello() in foo.Bar is not defined in a public class or interface; cannot be accessed from outside package foo.Bar.hello( ); ^ 2 errors -------------------------------------------------------------
Patch awaiting review: http://gcc.gnu.org/ml/java-patches/2004-q2/msg00230.html
Subject: Bug 15073 CVSROOT: /cvs/gcc Module name: gcc Changes by: rmathew@gcc.gnu.org 2004-05-06 17:43:48 Modified files: gcc/java : ChangeLog parse.y Log message: Fixes PR java/9685, PR java/15073 * parse.y (accessibility_string): New method. (not_accessible_field_error): Use accessibility_string() instead of java_accstring_lookup(). (resolve_qualified_expression_name): Check with check_pkg_class_access() before allowing access using qualified names. Fix comment typo. Use check_pkg_class_access() instead of not_accessible_p() for unqualified types. (not_accessible_p): Use DECL_CONTEXT (member) instead of REFERENCE for package-private access checking. (patch_method_invocation): Use accessibility_string() instead of java_accstring_lookup(). Patches: http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/java/ChangeLog.diff?cvsroot=gcc&r1=1.1359&r2=1.1360 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/java/parse.y.diff?cvsroot=gcc&r1=1.475&r2=1.476
Fixed.