diff options
Diffstat (limited to 'gcc/java/class.c')
-rw-r--r-- | gcc/java/class.c | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/gcc/java/class.c b/gcc/java/class.c index d0953cc..dfaf6f1 100644 --- a/gcc/java/class.c +++ b/gcc/java/class.c @@ -922,8 +922,18 @@ build_static_field_ref (tree fdecl) tree fclass = DECL_CONTEXT (fdecl); int is_compiled = is_compiled_class (fclass); - /* Allow static final fields to fold to a constant. */ - if (is_compiled || FIELD_FINAL (fdecl)) + /* Allow static final fields to fold to a constant. When using + -fno-assume-compiled, gcj will sometimes try to fold a field from + an uncompiled class. This is required when the field in question + meets the appropriate criteria for a compile-time constant. + However, currently sometimes gcj is too eager and will end up + returning the field itself, leading to an incorrect external + reference being generated. */ + if (is_compiled + || (FIELD_FINAL (fdecl) && DECL_INITIAL (fdecl) != NULL_TREE + && (JSTRING_TYPE_P (TREE_TYPE (fdecl)) + || JNUMERIC_TYPE_P (TREE_TYPE (fdecl))) + && TREE_CONSTANT (DECL_INITIAL (fdecl)))) { if (!DECL_RTL_SET_P (fdecl)) { |