aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/java/ChangeLog9
-rw-r--r--gcc/java/class.c6
-rw-r--r--gcc/java/jcf-write.c5
3 files changed, 19 insertions, 1 deletions
diff --git a/gcc/java/ChangeLog b/gcc/java/ChangeLog
index ea4f35b..a7e5718 100644
--- a/gcc/java/ChangeLog
+++ b/gcc/java/ChangeLog
@@ -1,5 +1,14 @@
2001-08-30 Per Bothner <per@bothner.com>
+ * jcf-write.c (generate_classfile): Don't write ConstantValue
+ attribute if field is not final, for compatibility with jdk.
+
+ * jcf-write.c (generate_classfile): Convert ConstantValue values
+ to correct type. Work-around for front-end bug.
+ * class.c (set_constant_value): Error if constant has wrong type.
+
+2001-08-30 Per Bothner <per@bothner.com>
+
* jcf-dump.c (print_constant): Fix fencepost error so "Float" and
"Double" are printed at verbosity 1.
diff --git a/gcc/java/class.c b/gcc/java/class.c
index e0caeae..eb4be8e 100644
--- a/gcc/java/class.c
+++ b/gcc/java/class.c
@@ -777,6 +777,12 @@ set_constant_value (field, constant)
else
{
DECL_INITIAL (field) = constant;
+ if (TREE_TYPE (constant) != TREE_TYPE (field)
+ && ! (TREE_TYPE (constant) == int_type_node
+ && INTEGRAL_TYPE_P (TREE_TYPE (field))
+ && TYPE_PRECISION (TREE_TYPE (field)) <= 32))
+ error ("ConstantValue attribute of field '%s' has wrong type",
+ IDENTIFIER_POINTER (DECL_NAME (field)));
if (FIELD_FINAL (field))
DECL_FIELD_FINAL_IUD (field) = 1;
}
diff --git a/gcc/java/jcf-write.c b/gcc/java/jcf-write.c
index 31493fd..d090b56 100644
--- a/gcc/java/jcf-write.c
+++ b/gcc/java/jcf-write.c
@@ -2884,7 +2884,8 @@ generate_classfile (clas, state)
build_java_signature (TREE_TYPE (part)));
PUT2(i);
have_value = DECL_INITIAL (part) != NULL_TREE
- && FIELD_STATIC (part) && CONSTANT_VALUE_P (DECL_INITIAL (part));
+ && FIELD_STATIC (part) && CONSTANT_VALUE_P (DECL_INITIAL (part))
+ && FIELD_FINAL (part);
if (have_value)
attr_count++;
@@ -2896,6 +2897,8 @@ generate_classfile (clas, state)
{
tree init = DECL_INITIAL (part);
static tree ConstantValue_node = NULL_TREE;
+ // This conversion is a work-around for front-end bug.
+ init = convert (TREE_TYPE (part), init);
ptr = append_chunk (NULL, 8, state);
if (ConstantValue_node == NULL_TREE)
ConstantValue_node = get_identifier ("ConstantValue");