This happens with 4.1 but not with 4.0.x. It occurs even without -O. I believe java.util.LinkedHashMap is being miscompiled. You can see this by trying the test case in PR 20273. For me, it crashes. In the debugger I observed that this line from LinkedHashMap$LinkedHashEntry.access() is incrementing the 'succ' field and not the modCount field: modCount++;
I have a reduced test case, consisting of 2 files. Compile like so: gcj --main=t -o T base.java t.java I get: opsy. ./T 306833 The result should be '8'. At the moment I suspect the recent accessor patch.
Created attachment 9023 [details] base class
Created attachment 9024 [details] main class
Hmm, inner functions going back again :(.
Confirmed.
The problem is that nested_field_access_p() returns 0 for the reference to modCount. It should return 1 as this is a nested access.
I'm testing a patch.
Subject: Bug 21844 CVSROOT: /cvs/gcc Module name: gcc Changes by: tromey@gcc.gnu.org 2005-06-13 19:20:26 Modified files: gcc/java : ChangeLog parse.y Log message: PR java/21844: * parse.y (nested_field_access_p): Handle case where outer field is inherited by enclosing class. Patches: http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/java/ChangeLog.diff?cvsroot=gcc&r1=1.1626&r2=1.1627 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/java/parse.y.diff?cvsroot=gcc&r1=1.538&r2=1.539
Subject: Bug 21844 CVSROOT: /cvs/gcc Module name: gcc Changes by: tromey@gcc.gnu.org 2005-06-13 19:21:56 Modified files: libjava : ChangeLog Added files: libjava/testsuite/libjava.lang: pr21844.java pr21844.out Log message: PR java/21844: * testsuite/libjava.lang/pr21844.java: New file. * testsuite/libjava.lang/pr21844.out: New file. Patches: http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/libjava/ChangeLog.diff?cvsroot=gcc&r1=1.3658&r2=1.3659 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/libjava/testsuite/libjava.lang/pr21844.java.diff?cvsroot=gcc&r1=NONE&r2=1.1 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/libjava/testsuite/libjava.lang/pr21844.out.diff?cvsroot=gcc&r1=NONE&r2=1.1
I've checked in the fix.
Subject: Bug 21844 CVSROOT: /cvs/gcc Module name: gcc Branch: gcc-4_0-branch Changes by: bryce@gcc.gnu.org 2005-10-05 19:35:46 Modified files: gcc/java : ChangeLog decl.c java-tree.h jcf-write.c parse.y libjava : ChangeLog libjava/testsuite/libjava.jacks: jacks.xfail Added files: libjava/testsuite/libjava.lang: PR19870.java PR19870.out PR19870_2.java PR19870_2.out Log message: gcc/java: 2005-10-05 Ranjit Mathew <rmathew@hotmail.com> PR java/20338 * decl.c (finish_method): Emit _Jv_InitClass for private static methods inside inner classes as well. 2005-10-05 Ranjit Mathew <rmathew@hotmail.com> PR java/19870 * parse.y (nested_field_access_p): Rename to nested_member_access_p and expand to handle method accesses across nested classes. (build_outer_method_access_method): Rename to build_nested_method_access_method. Minor adjustments to comments. (resolve_expression_name): Use the newly-renamed nested_member_access_p method. (resolve_qualified_expression_name): Likewise. (patch_method_invocation): Also consider static methods for access method generation. Minor adjustments to comments. (maybe_use_access_method): Use the more general nested_memeber_access_p to determine access across nested class boundaries. Allow THIS_ARG to be NULL (for static methods). 2005-10-05 Tom Tromey <tromey@redhat.com> PR java/21844: * parse.y (nested_field_access_p): Handle case where outer field is inherited by enclosing class. 2005-10-05 Ranjit Mathew <rmathew@hotmail.com> PR java/19870. * java-tree.h (OUTER_FIELD_ACCESS_IDENTIFIER_P): Rename to NESTED_FIELD_ACCESS_IDENTIFIER_P. (FIELD_INNER_ACCESS): Rename to FIELD_NESTED_ACCESS. (FIELD_INNER_ACCESS_P): Rename to FIELD_NESTED_ACCESS_P. * jcf-write.c (generate_classfile): Use NESTED_FIELD_ACCESS_IDENTIFIER_P instead of OUTER_FIELD_ACCESS_IDENTIFIER_P. * parse.y (build_outer_field_access): Rename to build_nested_field_access. Support static fields and outer-to-inner class accesses. (outer_field_access_p): Rename to nested_field_access_p. Support static fields and generalise to outer-to-inner class and sibling inner class accesses. (outer_field_expanded_access_p): Rename to nested_field_expanded_access_p and support static fields. (outer_field_access_fix): Rename to nested_field_access_fix and support static fields. (build_outer_field_access_expr): Rename to build_nested_field_access_expr and support static fields. (build_outer_field_access_methods): Rename to build_nested_field_access_methods and support static fields. For static fields, generate accessors without class instance parameters. (build_outer_field_access_method): Rename to build_nested_field_access_method and support static fields. (build_outer_method_access_method): Use NESTED_FIELD_ACCESS_IDENTIFIER_P instead of OUTER_FIELD_ACCESS_IDENTIFIER_P. (resolve_expression_name): Consider static field accesses across nested classes. (resolve_qualified_expression_name): Likewise. (java_complete_lhs): Use nested_field_access_fix instead of outer_field_access_fix. (patch_unary_op): Rename outer_field_flag to nested_field_flag. Use nested_field_expanded_access_p instead of outer_field_expanded_access_p. Use nested_field_access_fix instead of outer_field_access_fix. (check_thrown_exceptions): Use NESTED_FIELD_ACCESS_IDENTIFIER_P instead of OUTER_FIELD_ACCESS_IDENTIFIER_P. libjava: 2005-10-05 Ranjit Mathew <rmathew@hotmail.com> More testsuite adjustments for PR java/19870. * testsuite/libjava.lang/PR19870_2.java: New testcase. * testsuite/libjava.lang/PR19870_2.out: Expected output for the new testcase. * testsuite/libjava.jacks/jacks.xfail: Remove 8.5.2-non-static-member-usage-2 and add 15.12.3-explicit-constructor-9. 2005-10-05 Tom Tromey <tromey@redhat.com> PR java/21844: * testsuite/libjava.lang/pr21844.java: New file. * testsuite/libjava.lang/pr21844.out: New file. 2005-10-05 Ranjit Mathew <rmathew@hotmail.com> Testsuite adjustments for PR java/19870. * testsuite/libjava.lang/PR19870.java: New testcase. * testsuite/libjava.lang/PR19870.out: Expected output for the testcase. * testsuite/libjava.jacks/jacks.xfail: Add 8.5.2-accessible-static-member-usage-3 and 15.8.4-static-2 Patches: http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/java/ChangeLog.diff?cvsroot=gcc&only_with_tag=gcc-4_0-branch&r1=1.1556.2.34&r2=1.1556.2.35 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/java/decl.c.diff?cvsroot=gcc&only_with_tag=gcc-4_0-branch&r1=1.209.4.4&r2=1.209.4.5 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/java/java-tree.h.diff?cvsroot=gcc&only_with_tag=gcc-4_0-branch&r1=1.226.8.3&r2=1.226.8.4 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/java/jcf-write.c.diff?cvsroot=gcc&only_with_tag=gcc-4_0-branch&r1=1.162.4.1&r2=1.162.4.2 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/java/parse.y.diff?cvsroot=gcc&only_with_tag=gcc-4_0-branch&r1=1.528.6.4&r2=1.528.6.5 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/libjava/ChangeLog.diff?cvsroot=gcc&only_with_tag=gcc-4_0-branch&r1=1.3391.2.103&r2=1.3391.2.104 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/libjava/testsuite/libjava.jacks/jacks.xfail.diff?cvsroot=gcc&only_with_tag=gcc-4_0-branch&r1=1.19.8.2&r2=1.19.8.3 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/libjava/testsuite/libjava.lang/PR19870.java.diff?cvsroot=gcc&only_with_tag=gcc-4_0-branch&r1=NONE&r2=1.1.24.1 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/libjava/testsuite/libjava.lang/PR19870.out.diff?cvsroot=gcc&only_with_tag=gcc-4_0-branch&r1=NONE&r2=1.1.24.1 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/libjava/testsuite/libjava.lang/PR19870_2.java.diff?cvsroot=gcc&only_with_tag=gcc-4_0-branch&r1=NONE&r2=1.1.18.1 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/libjava/testsuite/libjava.lang/PR19870_2.out.diff?cvsroot=gcc&only_with_tag=gcc-4_0-branch&r1=NONE&r2=1.1.18.1
Also fixed in 4.0.3.