]> gcc.gnu.org Git - gcc.git/commitdiff
re PR java/7912 (invalid verification error for arrays)
authorTom Tromey <tromey@redhat.com>
Mon, 18 Nov 2002 18:13:36 +0000 (18:13 +0000)
committerTom Tromey <tromey@gcc.gnu.org>
Mon, 18 Nov 2002 18:13:36 +0000 (18:13 +0000)
Fix for PR java/7912:
* expr.c (can_widen_reference_to): Allow cast of array to
Cloneable or Serializable.
* java-tree.h (java_lang_cloneable_identifier_node): Declare.
(java_io_serializable_identifier_node): Likewise.
* parse.y (java_lang_cloneable, java_io_serializable): Removed.
(valid_ref_assignconv_cast_p): Use new identifier nodes.
* lex.c (java_init_lex): Don't initialize java_lang_cloneable and
java_io_serializable.
* decl.c (java_init_decl_processing): Initialize
java_lang_cloneable_identifier_node and
java_io_serializable_identifier_node.
(java_lang_cloneable_identifier_node): New global.
(java_io_serializable_identifier_node): Likewise.

From-SVN: r59227

gcc/java/ChangeLog
gcc/java/decl.c
gcc/java/expr.c
gcc/java/java-tree.h
gcc/java/lex.c
gcc/java/parse.y

index d0dd06862759df700094891f6740cb435d24020b..e8c9d5140440cee4c556d842dc14c1d8e65ad185 100644 (file)
@@ -1,3 +1,20 @@
+2002-11-18  Tom Tromey  <tromey@redhat.com>
+
+       Fix for PR java/7912:
+       * expr.c (can_widen_reference_to): Allow cast of array to
+       Cloneable or Serializable.
+       * java-tree.h (java_lang_cloneable_identifier_node): Declare.
+       (java_io_serializable_identifier_node): Likewise.
+       * parse.y (java_lang_cloneable, java_io_serializable): Removed.
+       (valid_ref_assignconv_cast_p): Use new identifier nodes.
+       * lex.c (java_init_lex): Don't initialize java_lang_cloneable and
+       java_io_serializable.
+       * decl.c (java_init_decl_processing): Initialize
+       java_lang_cloneable_identifier_node and
+       java_io_serializable_identifier_node.
+       (java_lang_cloneable_identifier_node): New global.
+       (java_io_serializable_identifier_node): Likewise.
+
 2002-11-14  Jens-Michael Hoffmann  <jensmh@gmx.de>
 
        * buffer.c: Remove unnecessary casts.
index bcf30b3718eb1f4a2e765a744c0b3184cfa8b38b..9e8efefca9048ce3268470a4595c4f5244705867 100644 (file)
@@ -57,6 +57,12 @@ static tree check_local_named_variable PARAMS ((tree, tree, int, int *));
 static tree check_local_unnamed_variable PARAMS ((tree, tree, tree));
 static void dump_function PARAMS ((enum tree_dump_index, tree));
 
+/* Name of the Cloneable class.  */
+tree java_lang_cloneable_identifier_node;
+
+/* Name of the Serializable class.  */
+tree java_io_serializable_identifier_node;
+
 /* Set to nonzero value in order to emit class initilization code
    before static field references.  */
 extern int always_initialize_class_p;
@@ -601,6 +607,10 @@ java_init_decl_processing ()
   access0_identifier_node = get_identifier ("access$0");
   classdollar_identifier_node = get_identifier ("class$");
 
+  java_lang_cloneable_identifier_node = get_identifier ("java.lang.Cloneable");
+  java_io_serializable_identifier_node =
+    get_identifier ("java.io.Serializable");
+
   /* for lack of a better place to put this stub call */
   init_expr_processing();
 
index 0c434e96d5fac48722f39486c7faac046142e0d5..8db2670d0f99fee069f89b65aa1eaaacd2cd0657 100644 (file)
@@ -1,5 +1,5 @@
 /* Process expressions for the GNU compiler for the Java(TM) language.
-   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001
+   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002
    Free Software Foundation, Inc.
 
 This file is part of GNU CC.
@@ -391,7 +391,12 @@ can_widen_reference_to (source_type, target_type)
        {
          HOST_WIDE_INT source_length, target_length;
          if (TYPE_ARRAY_P (source_type) != TYPE_ARRAY_P (target_type))
-           return 0;
+           {
+             /* An array implements Cloneable and Serializable.  */
+             tree name = DECL_NAME (TYPE_NAME (target_type));
+             return (name == java_lang_cloneable_identifier_node
+                     || name == java_io_serializable_identifier_node);
+           }
          target_length = java_array_type_length (target_type);
          if (target_length >= 0)
            {
index 051e41b9a018e7705a2d146c35957ef314753906..046cb9dfa687361e41a23af686d27c75ba92428f 100644 (file)
@@ -258,6 +258,9 @@ typedef struct CPool constant_pool;
 #define COMPONENT_REF_SIGNATURE(CPOOL, IDX) \
   NAME_AND_TYPE_SIGNATURE (CPOOL, COMPONENT_REF_NAME_AND_TYPE(CPOOL, IDX))
 
+extern GTY(()) tree java_lang_cloneable_identifier_node;
+extern GTY(()) tree java_io_serializable_identifier_node;
+
 enum java_tree_index
 {
   JTI_PROMOTED_BYTE_TYPE_NODE,
index f1589dbe85303975ac41816d7e6bddf212480263..eecbcff81ce455809bd5671129abd78bc7eeb49a 100644 (file)
@@ -91,10 +91,6 @@ java_init_lex (finput, encoding)
 
   if (!java_lang_id)
     java_lang_id = get_identifier ("java.lang");
-  if (!java_lang_cloneable)
-    java_lang_cloneable = get_identifier ("java.lang.Cloneable");
-  if (!java_io_serializable)
-    java_io_serializable = get_identifier ("java.io.Serializable");
   if (!inst_id)
     inst_id = get_identifier ("inst$");
   if (!wpv_id)
index 61595b87786823b187eae91df27693ec0a396e2b..2a77235f3b13272a2d64737c21131b8df4084fd4 100644 (file)
@@ -391,12 +391,6 @@ static GTY(()) tree java_lang_id;
    instance/field access functions.  */
 static GTY(()) tree inst_id;
 
-/* The "java.lang.Cloneable" qualified name.  */
-static GTY(()) tree java_lang_cloneable;
-
-/* The "java.io.Serializable" qualified name.  */
-static GTY(()) tree java_io_serializable;
-
 /* Context and flag for static blocks */
 static GTY(()) tree current_static_block;
 
@@ -13071,9 +13065,10 @@ valid_ref_assignconv_cast_p (source, dest, cast)
        {
          /* Array */
          return (cast
-                 && (DECL_NAME (TYPE_NAME (source)) == java_lang_cloneable
+                 && (DECL_NAME (TYPE_NAME (source))
+                     == java_lang_cloneable_identifier_node
                      || (DECL_NAME (TYPE_NAME (source))
-                         == java_io_serializable)));
+                         == java_io_serializable_identifier_node)));
        }
     }
   if (TYPE_ARRAY_P (source))
@@ -13083,8 +13078,10 @@ valid_ref_assignconv_cast_p (source, dest, cast)
       /* Can't cast an array to an interface unless the interface is
         java.lang.Cloneable or java.io.Serializable.  */
       if (TYPE_INTERFACE_P (dest))
-       return (DECL_NAME (TYPE_NAME (dest)) == java_lang_cloneable
-               || DECL_NAME (TYPE_NAME (dest)) == java_io_serializable);
+       return (DECL_NAME (TYPE_NAME (dest))
+               == java_lang_cloneable_identifier_node
+               || (DECL_NAME (TYPE_NAME (dest))
+                   == java_io_serializable_identifier_node));
       else                     /* Arrays */
        {
          tree source_element_type = TYPE_ARRAY_ELEMENT (source);
This page took 0.091834 seconds and 5 git commands to generate.