parse.y (resolve_field_access): Initialize class if field is found in another static field.

* parse.y (resolve_field_access): Initialize class if field is
	found in another static field.
	* expr.c (build_class_init): Don't optimize out initialization of
	implemented interface.

From-SVN: r64185
This commit is contained in:
Tom Tromey 2003-03-11 20:37:02 +00:00 committed by Tom Tromey
parent 218d1401af
commit 8b8e6c64af
3 changed files with 28 additions and 1 deletions

View File

@ -1,3 +1,10 @@
2003-03-11 Tom Tromey <tromey@redhat.com>
* parse.y (resolve_field_access): Initialize class if field is
found in another static field.
* expr.c (build_class_init): Don't optimize out initialization of
implemented interface.
2003-03-11 Andrew Haley <aph@redhat.com>
* jcf-io.c (caching_stat): Initialize origsep to remove compiler

View File

@ -1672,7 +1672,14 @@ tree
build_class_init (tree clas, tree expr)
{
tree init;
if (inherits_from_p (current_class, clas))
/* An optimization: if CLAS is a superclass of the class we're
compiling, we don't need to initialize it. However, if CLAS is
an interface, it won't necessarily be initialized, even if we
implement it. */
if ((! CLASS_INTERFACE (TYPE_NAME (clas))
&& inherits_from_p (current_class, clas))
|| current_class == clas)
return expr;
if (always_initialize_class_p)

View File

@ -9301,6 +9301,19 @@ resolve_field_access (tree qual_wfl, tree *field_decl, tree *field_type)
return error_mark_node;
if (is_static)
field_ref = maybe_build_class_init_for_field (decl, field_ref);
/* If we're looking at a static field, we may need to generate a
class initialization for it. This can happen when the access
looks like `field.ref', where `field' is a static field in an
interface we implement. */
if (!flag_emit_class_files
&& !flag_emit_xref
&& TREE_CODE (where_found) == VAR_DECL
&& FIELD_STATIC (where_found))
{
build_static_field_ref (where_found);
field_ref = build_class_init (DECL_CONTEXT (where_found), field_ref);
}
}
else
field_ref = decl;