[multiple changes]
authorAlexandre Petit-Bianco <apbianco@cygnus.com>
Wed, 7 Jul 1999 13:11:03 +0000 (13:11 +0000)
committerAlexandre Petit-Bianco <apbianco@gcc.gnu.org>
Wed, 7 Jul 1999 13:11:03 +0000 (06:11 -0700)
Sat Jul  3 22:26:32 1999  Alexandre Petit-Bianco  <apbianco@cygnus.com>
* expr.c (force_evaluation_order): Save the COMPOUND_EXPR'ed
  CALL_EXPR, to avoid order of evaluation changes.
Fri Jul  2 17:44:08 1999  Alexandre Petit-Bianco  <apbianco@cygnus.com>
* parse.y (qualify_ambiguous_name): Do not use
  IDENTIFIER_LOCAL_VALUE when name is a STRING_CST.
Thu Jul  1 23:31:16 1999  Alexandre Petit-Bianco  <apbianco@cygnus.com>
* check-init.c (check_init): Handle MAX_EXPR.
* expr.c (force_evaluation_order): Force method call arguments to
  be evaluated in left-to-right order.
* parse.y (qualify_ambiguous_name): Loop again to qualify
  NEW_ARRAY_EXPR properly.
Wed Jun 30 17:27:58 1999  Alexandre Petit-Bianco  <apbianco@cygnus.com>
* parse.y (patch_invoke): Resolve unresolved invoked method
  returned type.
(qualify_ambiguous_name): STRING_CST to qualify expression for
  type name resolution.

From-SVN: r27998

gcc/java/ChangeLog
gcc/java/check-init.c
gcc/java/expr.c
gcc/java/parse.c
gcc/java/parse.y

index 7241c550861667c2ff113e10f3d86ee4252acb4f..df78c4269c01f7bf7cd1a0801a42ebac0ac81fe0 100644 (file)
@@ -1,3 +1,28 @@
+Sat Jul  3 22:26:32 1999  Alexandre Petit-Bianco  <apbianco@cygnus.com>
+
+       * expr.c (force_evaluation_order): Save the COMPOUND_EXPR'ed
+       CALL_EXPR, to avoid order of evaluation changes.
+
+Fri Jul  2 17:44:08 1999  Alexandre Petit-Bianco  <apbianco@cygnus.com>
+
+       * parse.y (qualify_ambiguous_name): Do not use
+       IDENTIFIER_LOCAL_VALUE when name is a STRING_CST.
+
+Thu Jul  1 23:31:16 1999  Alexandre Petit-Bianco  <apbianco@cygnus.com>
+
+       * check-init.c (check_init): Handle MAX_EXPR.
+       * expr.c (force_evaluation_order): Force method call arguments to
+       be evaluated in left-to-right order.
+       * parse.y (qualify_ambiguous_name): Loop again to qualify
+       NEW_ARRAY_EXPR properly.
+
+Wed Jun 30 17:27:58 1999  Alexandre Petit-Bianco  <apbianco@cygnus.com>
+
+       * parse.y (patch_invoke): Resolve unresolved invoked method
+       returned type.
+       (qualify_ambiguous_name): STRING_CST to qualify expression for
+       type name resolution.
+
 1999-06-24  Andrew Haley  <aph@cygnus.com>
 
        * class.c (finish_class): Whenever a deferred method is
index 67e2524cf9b43712961509685956b9dd8841489f..93695368d00c24b61bc32a2251b53d6c92dfadb0 100644 (file)
@@ -643,6 +643,7 @@ check_init (exp, before)
     case GE_EXPR:
     case LT_EXPR:
     case LE_EXPR:
+    case MAX_EXPR:
     case ARRAY_REF:
     binop:
       check_init (TREE_OPERAND (exp, 0), before);
index 9beb724ea377a1db3ca04ff6138febaf597df504..8998bdb3a58fc3eb75e4ca01aa6d79950ef97831 100644 (file)
@@ -2578,6 +2578,10 @@ process_jvm_instruction (PC, byte_ops, length)
 
    We fix this by using save_expr.  This forces the sub-operand to be
    copied into a fresh virtual register,
+
+   For method invocation, we modify the arguments so that a
+   left-to-right order evaluation is performed. Saved expressions
+   will, in CALL_EXPR order, be reused when the call will be expanded.
 */
 
 tree
@@ -2593,19 +2597,30 @@ force_evaluation_order (node)
     }
   else if (TREE_CODE (node) == CALL_EXPR || TREE_CODE (node) == NEW_CLASS_EXPR)
     {
-      tree last_side_effecting_arg = NULL_TREE;
-      tree arg = TREE_OPERAND (node, 1);
-      for (; arg != NULL_TREE; arg = TREE_CHAIN (arg))
+      tree arg, cmp;
+
+      if (!TREE_OPERAND (node, 1))
+       return node;
+
+      /* This reverses the evaluation order. This is a desired effect. */
+      for (cmp = NULL_TREE, arg = TREE_OPERAND (node, 1); 
+          arg; arg = TREE_CHAIN (arg))
        {
-         if (TREE_SIDE_EFFECTS (TREE_VALUE (arg)))
-           last_side_effecting_arg = arg;
+         tree saved = save_expr (TREE_VALUE (arg));
+         cmp = (cmp == NULL_TREE ? saved :
+                build (COMPOUND_EXPR, void_type_node, cmp, saved));
+         TREE_VALUE (arg) = saved;
        }
-      arg = TREE_OPERAND (node, 1);
-      for (; arg != NULL_TREE;  arg = TREE_CHAIN (arg))
+      
+      if (cmp && TREE_CODE (cmp) == COMPOUND_EXPR)
+       TREE_SIDE_EFFECTS (cmp) = 1;
+
+      if (cmp)
        {
-         if (arg == last_side_effecting_arg)
-           break;
-         TREE_VALUE (arg) = save_expr (TREE_VALUE (arg)); 
+         cmp = save_expr (build (COMPOUND_EXPR, TREE_TYPE (node), cmp, node));
+         CAN_COMPLETE_NORMALLY (cmp) = CAN_COMPLETE_NORMALLY (node);
+         TREE_SIDE_EFFECTS (cmp) = 1;
+         node = cmp;
        }
     }
   return node;
index 0ea1eb64b85f1518b54b81e5ffd99179e73f71f5..cdb62d71b75e9a7c1d001946ed039279a8a986c6 100644 (file)
@@ -2212,7 +2212,7 @@ static const short yycheck[] = {     3,
 #define YYPURE 1
 
 /* -*-C-*-  Note some compilers choke on comments on `#line' lines.  */
-#line 3 "/usr/cygnus/gnupro-98r1/share/bison.simple"
+#line 3 "/usr/share/misc/bison.simple"
 
 /* Skeleton output parser for bison,
    Copyright (C) 1984, 1989, 1990 Free Software Foundation, Inc.
@@ -2229,7 +2229,7 @@ static const short yycheck[] = {     3,
 
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
-   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
+   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 
 /* As a special exception, when this file is copied by Bison into a
    Bison output file, you may use that output file without restriction.
@@ -2363,8 +2363,10 @@ int yydebug;                     /*  nonzero means print parse trace     */
 
 /* Prevent warning if -Wstrict-prototypes.  */
 #ifdef __GNUC__
+#ifndef YYPARSE_PARAM
 int yyparse (void);
 #endif
+#endif
 \f
 #if __GNUC__ > 1               /* GNU C and GNU C++ define this.  */
 #define __yy_memcpy(TO,FROM,COUNT)     __builtin_memcpy(TO,FROM,COUNT)
@@ -2405,7 +2407,7 @@ __yy_memcpy (char *to, char *from, int count)
 #endif
 #endif
 \f
-#line 196 "/usr/cygnus/gnupro-98r1/share/bison.simple"
+#line 196 "/usr/share/misc/bison.simple"
 
 /* The user can define YYPARSE_PARAM as the name of an argument to be passed
    into yyparse.  The argument should have type void *.
@@ -4694,7 +4696,7 @@ case 495:
     break;}
 }
    /* the action file gets copied in in place of this dollarsign */
-#line 498 "/usr/cygnus/gnupro-98r1/share/bison.simple"
+#line 498 "/usr/share/misc/bison.simple"
 \f
   yyvsp -= yylen;
   yyssp -= yylen;
@@ -9813,6 +9815,11 @@ patch_invoke (patch, method, args)
     if (JPRIMITIVE_TYPE_P (TREE_TYPE (TREE_VALUE (ta))) &&
        TREE_TYPE (TREE_VALUE (ta)) != TREE_VALUE (t))
       TREE_VALUE (ta) = convert (TREE_VALUE (t), TREE_VALUE (ta));
+
+  /* Resolve unresolved returned type isses */
+  t = TREE_TYPE (TREE_TYPE (method));
+  if (TREE_CODE (t) == POINTER_TYPE && !CLASS_LOADED_P (TREE_TYPE (t)))
+    resolve_and_layout (TREE_TYPE (t), NULL);
   
   if (flag_emit_class_files || flag_emit_xref)
     func = method;
@@ -10223,7 +10230,7 @@ qualify_ambiguous_name (id)
        break;
       case NEW_ARRAY_EXPR:
        qual = TREE_CHAIN (qual);
-       new_array_found = 1;
+       again = new_array_found = 1;
        continue;
       case NEW_CLASS_EXPR:
       case CONVERT_EXPR:
@@ -10301,7 +10308,8 @@ qualify_ambiguous_name (id)
      declaration or parameter declaration, then it is an expression
      name. We don't carry this test out if we're in the context of the
      use of SUPER or THIS */
-  if (!this_found && !super_found && (decl = IDENTIFIER_LOCAL_VALUE (name)))
+  if (!this_found && !super_found && 
+      TREE_CODE (name) != STRING_CST && (decl = IDENTIFIER_LOCAL_VALUE (name)))
     {
       RESOLVE_EXPRESSION_NAME_P (qual_wfl) = 1;
       QUAL_RESOLUTION (qual) = decl;
@@ -10318,15 +10326,17 @@ qualify_ambiguous_name (id)
       QUAL_RESOLUTION (qual) = (new_array_found ? NULL_TREE : decl);
     }
 
-  /* We reclassify NAME as a type name if:
+  /* We reclassify NAME as yielding to a type name resolution if:
      - NAME is a class/interface declared within the compilation
        unit containing NAME,
      - NAME is imported via a single-type-import declaration,
      - NAME is declared in an another compilation unit of the package
        of the compilation unit containing NAME,
      - NAME is declared by exactly on type-import-on-demand declaration
-     of the compilation unit containing NAME. */
-  else if ((decl = resolve_and_layout (name, NULL_TREE)))
+     of the compilation unit containing NAME. 
+     - NAME is actually a STRING_CST. */
+  else if (TREE_CODE (name) == STRING_CST ||
+          (decl = resolve_and_layout (name, NULL_TREE)))
     {
       RESOLVE_TYPE_NAME_P (qual_wfl) = 1;
       QUAL_RESOLUTION (qual) = decl;
index 8abd4a7c0793870df65c4b91927f84c4edafd81e..4a4b32453750ffc0ec8965f9e3ca8529a4ea6e54 100644 (file)
@@ -7228,6 +7228,11 @@ patch_invoke (patch, method, args)
     if (JPRIMITIVE_TYPE_P (TREE_TYPE (TREE_VALUE (ta))) &&
        TREE_TYPE (TREE_VALUE (ta)) != TREE_VALUE (t))
       TREE_VALUE (ta) = convert (TREE_VALUE (t), TREE_VALUE (ta));
+
+  /* Resolve unresolved returned type isses */
+  t = TREE_TYPE (TREE_TYPE (method));
+  if (TREE_CODE (t) == POINTER_TYPE && !CLASS_LOADED_P (TREE_TYPE (t)))
+    resolve_and_layout (TREE_TYPE (t), NULL);
   
   if (flag_emit_class_files || flag_emit_xref)
     func = method;
@@ -7638,7 +7643,7 @@ qualify_ambiguous_name (id)
        break;
       case NEW_ARRAY_EXPR:
        qual = TREE_CHAIN (qual);
-       new_array_found = 1;
+       again = new_array_found = 1;
        continue;
       case NEW_CLASS_EXPR:
       case CONVERT_EXPR:
@@ -7716,7 +7721,8 @@ qualify_ambiguous_name (id)
      declaration or parameter declaration, then it is an expression
      name. We don't carry this test out if we're in the context of the
      use of SUPER or THIS */
-  if (!this_found && !super_found && (decl = IDENTIFIER_LOCAL_VALUE (name)))
+  if (!this_found && !super_found && 
+      TREE_CODE (name) != STRING_CST && (decl = IDENTIFIER_LOCAL_VALUE (name)))
     {
       RESOLVE_EXPRESSION_NAME_P (qual_wfl) = 1;
       QUAL_RESOLUTION (qual) = decl;
@@ -7733,15 +7739,17 @@ qualify_ambiguous_name (id)
       QUAL_RESOLUTION (qual) = (new_array_found ? NULL_TREE : decl);
     }
 
-  /* We reclassify NAME as a type name if:
+  /* We reclassify NAME as yielding to a type name resolution if:
      - NAME is a class/interface declared within the compilation
        unit containing NAME,
      - NAME is imported via a single-type-import declaration,
      - NAME is declared in an another compilation unit of the package
        of the compilation unit containing NAME,
      - NAME is declared by exactly on type-import-on-demand declaration
-     of the compilation unit containing NAME. */
-  else if ((decl = resolve_and_layout (name, NULL_TREE)))
+     of the compilation unit containing NAME. 
+     - NAME is actually a STRING_CST. */
+  else if (TREE_CODE (name) == STRING_CST ||
+          (decl = resolve_and_layout (name, NULL_TREE)))
     {
       RESOLVE_TYPE_NAME_P (qual_wfl) = 1;
       QUAL_RESOLUTION (qual) = decl;