User account creation filtered due to spam.

Bug 21844

Summary: [4.1 Regression] miscompilation of LinkedHashMap
Product: gcc Reporter: Tom Tromey <tromey>
Component: javaAssignee: Tom Tromey <tromey>
Status: RESOLVED FIXED    
Severity: normal CC: gcc-bugs, java-prs
Priority: P2 Keywords: patch, wrong-code
Version: 4.1.0   
Target Milestone: 4.0.3   
URL: http://gcc.gnu.org/ml/java-patches/2005-q2/msg00676.html
Host: Target:
Build: i686-pc-linux-gnu Known to work: 4.0.0
Known to fail: 4.1.0 Last reconfirmed: 2005-06-03 22:03:22
Bug Depends on:    
Bug Blocks: 18131    
Attachments: base class
main class

Description Tom Tromey 2005-05-31 18:07:10 UTC
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++;
Comment 1 Tom Tromey 2005-06-03 20:02:27 UTC
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.
Comment 2 Tom Tromey 2005-06-03 20:03:14 UTC
Created attachment 9023 [details]
base class
Comment 3 Tom Tromey 2005-06-03 20:03:52 UTC
Created attachment 9024 [details]
main class
Comment 4 Andrew Pinski 2005-06-03 20:11:36 UTC
Hmm, inner functions going back again :(.
Comment 5 Andrew Pinski 2005-06-03 20:14:33 UTC
Confirmed.
Comment 6 Tom Tromey 2005-06-03 21:17:58 UTC
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.
Comment 7 Tom Tromey 2005-06-03 22:03:22 UTC
I'm testing a patch.
Comment 8 CVS Commits 2005-06-13 19:20:36 UTC
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

Comment 9 CVS Commits 2005-06-13 19:22:04 UTC
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

Comment 10 Tom Tromey 2005-06-13 19:23:41 UTC
I've checked in the fix.
Comment 11 CVS Commits 2005-10-05 19:35:51 UTC
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

Comment 12 Andrew Pinski 2005-10-05 19:40:46 UTC
Also fixed in 4.0.3.