summaryrefslogtreecommitdiff
path: root/gcc/java
diff options
context:
space:
mode:
authorapbianco <apbianco@138bc75d-0d04-0410-961f-82ee72b054a4>2001-06-05 15:48:58 +0000
committerapbianco <apbianco@138bc75d-0d04-0410-961f-82ee72b054a4>2001-06-05 15:48:58 +0000
commitf00460001a77b0109ed8aa9fd63d67c65e813268 (patch)
treec510c5ae08cb32951c451bef9b4102d7d25fbe67 /gcc/java
parent8b4bc488add88bda73efda1711b66ca4255402a0 (diff)
downloadgcc-f00460001a77b0109ed8aa9fd63d67c65e813268.tar.gz
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) git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@42910 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/java')
-rw-r--r--gcc/java/ChangeLog5
-rw-r--r--gcc/java/expr.c21
2 files changed, 23 insertions, 3 deletions
diff --git a/gcc/java/ChangeLog b/gcc/java/ChangeLog
index 1ae6b509e1e..39bd0117c13 100644
--- a/gcc/java/ChangeLog
+++ b/gcc/java/ChangeLog
@@ -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.
diff --git a/gcc/java/expr.c b/gcc/java/expr.c
index 9ba0739d7d7..e9af7fcd455 100644
--- a/gcc/java/expr.c
+++ b/gcc/java/expr.c
@@ -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 :