expr.c (force_evaluation_order): Match wrapped ctor calls, locate arguments accordingly.
authorAlexandre Petit-Bianco <apbianco@redhat.com>
Tue, 5 Jun 2001 15:48:58 +0000 (08:48 -0700)
committerAlexandre Petit-Bianco <apbianco@gcc.gnu.org>
Tue, 5 Jun 2001 15:48:58 +0000 (08:48 -0700)
2001-06-04  Alexandre Petit-Bianco  <apbianco@redhat.com>

* expr.c (force_evaluation_order): Match wrapped ctor calls, locate
arguments accordingly.

(http://gcc.gnu.org/ml/gcc-patches/2001-06/msg00214.html)

From-SVN: r42910

gcc/java/ChangeLog
gcc/java/expr.c

index 1ae6b509e1ec90a0dad3fcc02a44c2a57a00c1c2..39bd0117c131a3b19b815c074369868d07e9d955 100644 (file)
@@ -1,3 +1,8 @@
+2001-06-04  Alexandre Petit-Bianco  <apbianco@redhat.com>
+
+       * expr.c (force_evaluation_order): Match wrapped ctor calls, locate
+       arguments accordingly.
+
 2001-06-02  Joseph S. Myers  <jsm28@cam.ac.uk>
 
        * gcj.texi: Move contents to just after title page.
index 9ba0739d7d76f80db6054d42e34fcdbca9173b18..e9af7fcd455275694c46edd739153ca04ea7e4f6 100644 (file)
@@ -3263,16 +3263,31 @@ force_evaluation_order (node)
       if (TREE_SIDE_EFFECTS (TREE_OPERAND (node, 1)))
        TREE_OPERAND (node, 0) = save_expr (TREE_OPERAND (node, 0));
     }
-  else if (TREE_CODE (node) == CALL_EXPR || TREE_CODE (node) == NEW_CLASS_EXPR)
+  else if (TREE_CODE (node) == CALL_EXPR
+           || TREE_CODE (node) == NEW_CLASS_EXPR
+           || (TREE_CODE (node) == COMPOUND_EXPR
+               && TREE_CODE (TREE_OPERAND (node, 0)) == CALL_EXPR
+               && TREE_CODE (TREE_OPERAND (node, 1)) == SAVE_EXPR)) 
     {
       tree arg, cmp;
 
       if (!TREE_OPERAND (node, 1))
        return node;
 
+      arg = node;
+      
+      /* Position arg properly, account for wrapped around ctors. */
+      if (TREE_CODE (node) == COMPOUND_EXPR)
+        arg = TREE_OPERAND (node, 0);
+      
+      arg = TREE_OPERAND (arg, 1);
+      
+      /* Not having a list of argument here is an error. */ 
+      if (TREE_CODE (arg) != TREE_LIST)
+        abort ();
+
       /* This reverses the evaluation order. This is a desired effect. */
-      for (cmp = NULL_TREE, arg = TREE_OPERAND (node, 1); 
-          arg; arg = TREE_CHAIN (arg))
+      for (cmp = NULL_TREE; arg; arg = TREE_CHAIN (arg))
        {
          tree saved = save_expr (force_evaluation_order (TREE_VALUE (arg)));
          cmp = (cmp == NULL_TREE ? saved :