(expand_expr...

(expand_expr, case PLACEHOLDER_EXPR): Pick outermost object in
placeholder_list of right type without a PLACEHOLDER_EXPR.

From-SVN: r14498
This commit is contained in:
Richard Kenner 1997-07-20 06:11:25 -04:00
parent 3910a7cb5e
commit dcb7c3cea6

View File

@ -5048,26 +5048,36 @@ expand_expr (exp, target, tmode, modifier)
tree old_list = placeholder_list;
tree elt;
/* See if the object is the type that we want. Then see if
the operand of any reference is the type we want. */
/* See if the object is the type that we want and does not contain
this PLACEHOLDER_EXPR itself. Then see if the operand of any
reference is the type we want. */
if ((TYPE_MAIN_VARIANT (TREE_TYPE (TREE_PURPOSE (placeholder_list)))
== need_type))
== need_type)
&& (! contains_this_placeholder_p
(TREE_PURPOSE (placeholder_list), exp)))
object = TREE_PURPOSE (placeholder_list);
/* Find the innermost reference that is of the type we want. */
for (elt = TREE_PURPOSE (placeholder_list);
elt != 0
&& (TREE_CODE_CLASS (TREE_CODE (elt)) == 'r'
|| TREE_CODE_CLASS (TREE_CODE (elt)) == '1'
|| TREE_CODE_CLASS (TREE_CODE (elt)) == '2'
|| TREE_CODE_CLASS (TREE_CODE (elt)) == 'e');
elt = ((TREE_CODE (elt) == COMPOUND_EXPR
|| TREE_CODE (elt) == COND_EXPR)
? TREE_OPERAND (elt, 1) : TREE_OPERAND (elt, 0)))
if (TREE_CODE_CLASS (TREE_CODE (elt)) == 'r'
&& (TYPE_MAIN_VARIANT (TREE_TYPE (TREE_OPERAND (elt, 0)))
== need_type))
object = TREE_OPERAND (elt, 0);
else
/* Find the outermost reference that is of the type we want and
that does not itself contain this PLACEHOLDER_EXPR. */
for (elt = TREE_PURPOSE (placeholder_list);
elt != 0
&& (TREE_CODE_CLASS (TREE_CODE (elt)) == 'r'
|| TREE_CODE_CLASS (TREE_CODE (elt)) == '1'
|| TREE_CODE_CLASS (TREE_CODE (elt)) == '2'
|| TREE_CODE_CLASS (TREE_CODE (elt)) == 'e');
elt = ((TREE_CODE (elt) == COMPOUND_EXPR
|| TREE_CODE (elt) == COND_EXPR)
? TREE_OPERAND (elt, 1) : TREE_OPERAND (elt, 0)))
if (TREE_CODE_CLASS (TREE_CODE (elt)) == 'r'
&& (TYPE_MAIN_VARIANT (TREE_TYPE (TREE_OPERAND (elt, 0)))
== need_type)
&& ! contains_this_placeholder_p (TREE_OPERAND (elt, 0),
exp))
{
object = TREE_OPERAND (elt, 0);
break;
}
if (object != 0)
{