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

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
This commit is contained in:
Alexandre Petit-Bianco 2001-06-05 08:48:58 -07:00 committed by Alexandre Petit-Bianco
parent 7f471801f0
commit 0c90837b16
2 changed files with 23 additions and 3 deletions

View 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> 2001-06-02 Joseph S. Myers <jsm28@cam.ac.uk>
* gcj.texi: Move contents to just after title page. * gcj.texi: Move contents to just after title page.

View File

@ -3263,16 +3263,31 @@ force_evaluation_order (node)
if (TREE_SIDE_EFFECTS (TREE_OPERAND (node, 1))) if (TREE_SIDE_EFFECTS (TREE_OPERAND (node, 1)))
TREE_OPERAND (node, 0) = save_expr (TREE_OPERAND (node, 0)); 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; tree arg, cmp;
if (!TREE_OPERAND (node, 1)) if (!TREE_OPERAND (node, 1))
return node; 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. */ /* This reverses the evaluation order. This is a desired effect. */
for (cmp = NULL_TREE, arg = TREE_OPERAND (node, 1); for (cmp = NULL_TREE; arg; arg = TREE_CHAIN (arg))
arg; arg = TREE_CHAIN (arg))
{ {
tree saved = save_expr (force_evaluation_order (TREE_VALUE (arg))); tree saved = save_expr (force_evaluation_order (TREE_VALUE (arg)));
cmp = (cmp == NULL_TREE ? saved : cmp = (cmp == NULL_TREE ? saved :