This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

java/5178: Method call on qualified static field doesn't initialize its class



>Number:         5178
>Category:       java
>Synopsis:       Method call on qualified static field doesn't initialize its class
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    unassigned
>State:          open
>Class:          sw-bug
>Submitter-Id:   net
>Arrival-Date:   Sat Dec 22 16:06:00 PST 2001
>Closed-Date:
>Last-Modified:
>Originator:     Bryce McKinlay
>Release:        gcc version 3.1 20011221 (experimental)
>Organization:
>Environment:

>Description:
The test case below, derived from PR375.java, crashes because no class initialization for "Bar" is generated. This occurs when the qualified field name is enclosed in brackets but not otherwise.

In the case which works, java_complete_lhs sees a CALL_EXPR and calls patch_method_invocation, which sees that the call is qualified and uses cut_identifier_in_qualified to "cut" the last element off the WFL identifier chain. resolve_qualified_expression_name sets found_decl to a DECL, which is wrapped with a class initialization in resolve_field_access.

In the broken case, java_complete_lhs sees a EXPR_WITH_FILE_LOCATION and calls resolve_expression_name. resolve_qualified_expression_name sees the CALL_EXPR on the end of the WFL chain (because no "cut" has occured - but should it be there in the first place?) and ends up in the code for "Field access using a primary" which seems wrong, setting found_decl to a CALL_EXPR which subsquently confuses resolve_field_access into not building a class initialization.

This may also be what causes the problem RTH saw on Alpha with the same test case:

http://gcc.gnu.org/ml/java-patches/2001-q4/msg00501.html

>How-To-Repeat:
class Bar 
{
  static Integer I = new Integer(1);
}

public class Qual
{
  public static void main(String[] args)
  {
    // System.out.println (Bar.I.toString());  // ok
    System.out.println ((Bar.I).toString());   // crash
  }
}
>Fix:

>Release-Note:
>Audit-Trail:
>Unformatted:


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]