re GNATS gcj/107 (Bad array or type conversion bug when compiling bytecode)
authorAnthony Green <green@cygnus.com>
Wed, 8 Mar 2000 03:10:19 +0000 (03:10 +0000)
committerAlexandre Petit-Bianco <apbianco@gcc.gnu.org>
Wed, 8 Mar 2000 03:10:19 +0000 (19:10 -0800)
1999-11-28 Anthony Green <green@cygnus.com>

* decl.c (find_local_variable): Reuse single slot decls when
appropriate.

(This fixes the Java PR #107:
 http://sourceware.cygnus.com/ml/java-prs/1999-q4/msg00171.html)

From-SVN: r32398

gcc/java/ChangeLog
gcc/java/decl.c

index 034faed97692cdb826918d2a42014c1003034262..305fae8da692bd74db858c73682911180d6c0321 100644 (file)
@@ -672,6 +672,11 @@ Tue Nov 30 12:28:34 1999  Alexandre Petit-Bianco  <apbianco@cygnus.com>
         check.
         * expr.c (expand_java_arraystore): Likewise. 
 
+1999-11-28 Anthony Green <green@cygnus.com>
+
+       * decl.c (find_local_variable): Reuse single slot decls when
+         appropriate.
+
 Wed Nov 24 17:33:26 1999  Alexandre Petit-Bianco  <apbianco@cygnus.com>
 
         * jcf-parse.c (saw_java_source): Global variable removed.
index 13d2dd733738fbb79f06ec7cdecee0d770f893f3..3aea82031f53d8d5ccf45a72f5da08b640e06880 100644 (file)
@@ -136,9 +136,7 @@ push_jvm_slot (index, decl)
 
 /* Find a VAR_DECL (or PARM_DECL) at local index INDEX that has type TYPE,
    that is valid at PC (or -1 if any pc).
-   If there is no existing matching decl, allocate one.
-   If we find a decl with matching modes but different types,
-   we re-use the rtl, but create a new decl. */
+   If there is no existing matching decl, allocate one.  */
 
 tree
 find_local_variable (index, type, pc)
@@ -148,6 +146,7 @@ find_local_variable (index, type, pc)
 {
   tree decl = TREE_VEC_ELT (decl_map, index);
   tree best = NULL_TREE;
+
   while (decl != NULL_TREE)
     {
       int in_range;
@@ -156,6 +155,10 @@ find_local_variable (index, type, pc)
            && pc < DECL_LOCAL_END_PC (decl));
 
       if ((TREE_TYPE (decl) == type
+          || (TREE_CODE (TREE_TYPE (decl)) == TREE_CODE (type)
+              && TYPE_PRECISION (TREE_TYPE (decl)) <= 32
+              && TYPE_PRECISION (type) <= 32
+              && TREE_CODE (type) != POINTER_TYPE)
           || (TREE_CODE (TREE_TYPE (decl)) == POINTER_TYPE
               && type == ptr_type_node))
           && in_range)