jcf-write.c (generate_classfile): Don't write ConstantValue attribute if field is...
authorPer Bothner <per@bothner.com>
Thu, 30 Aug 2001 21:08:32 +0000 (14:08 -0700)
committerPer Bothner <bothner@gcc.gnu.org>
Thu, 30 Aug 2001 21:08:32 +0000 (14:08 -0700)
* 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.

From-SVN: r45298

gcc/java/ChangeLog
gcc/java/class.c
gcc/java/jcf-write.c

index ea4f35b884bc86d37014b16d4906c849bbc5307e..a7e57184ca8e5323d5105bfe16fe4a6684a33fb5 100644 (file)
@@ -1,3 +1,12 @@
+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
index e0caeae71d712aaa678592d4033644aa0aab0161..eb4be8e96d32c972e602073f46c7690fa057f320 100644 (file)
@@ -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;
     }
index 31493fd0aaedd8d6fb11dbd6226433bfb30fd0a1..d090b5678aefe386ff93fb2dafb9d47da2c0399a 100644 (file)
@@ -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");