Commit 2cde2255 by Richard Kenner

(expand_expr, case PLACEHOLDER_EXPR): Find innermost matching and

don't check contains_placeholder_p.

From-SVN: r14605
parent cc3c7c13
...@@ -5023,36 +5023,28 @@ expand_expr (exp, target, tmode, modifier) ...@@ -5023,36 +5023,28 @@ expand_expr (exp, target, tmode, modifier)
tree old_list = placeholder_list; tree old_list = placeholder_list;
tree elt; tree elt;
/* See if the object is the type that we want and does not contain /* See if the object is the type that we want. */
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))) 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); object = TREE_PURPOSE (placeholder_list);
else /* Find the innermost reference that is of the type we want. */
/* Find the outermost reference that is of the type we want and for (elt = TREE_PURPOSE (placeholder_list);
that does not itself contain this PLACEHOLDER_EXPR. */ elt != 0
for (elt = TREE_PURPOSE (placeholder_list); && (TREE_CODE_CLASS (TREE_CODE (elt)) == 'r'
elt != 0 || TREE_CODE_CLASS (TREE_CODE (elt)) == '1'
&& (TREE_CODE_CLASS (TREE_CODE (elt)) == 'r' || TREE_CODE_CLASS (TREE_CODE (elt)) == '2'
|| TREE_CODE_CLASS (TREE_CODE (elt)) == '1' || TREE_CODE_CLASS (TREE_CODE (elt)) == 'e');
|| TREE_CODE_CLASS (TREE_CODE (elt)) == '2' elt = ((TREE_CODE (elt) == COMPOUND_EXPR
|| TREE_CODE_CLASS (TREE_CODE (elt)) == 'e'); || TREE_CODE (elt) == COND_EXPR)
elt = ((TREE_CODE (elt) == COMPOUND_EXPR ? TREE_OPERAND (elt, 1) : TREE_OPERAND (elt, 0)))
|| TREE_CODE (elt) == COND_EXPR) if (TREE_CODE_CLASS (TREE_CODE (elt)) == 'r'
? TREE_OPERAND (elt, 1) : TREE_OPERAND (elt, 0))) && (TYPE_MAIN_VARIANT (TREE_TYPE (TREE_OPERAND (elt, 0)))
if (TREE_CODE_CLASS (TREE_CODE (elt)) == 'r' == need_type))
&& (TYPE_MAIN_VARIANT (TREE_TYPE (TREE_OPERAND (elt, 0))) {
== need_type) object = TREE_OPERAND (elt, 0);
&& ! contains_this_placeholder_p (TREE_OPERAND (elt, 0), break;
exp)) }
{
object = TREE_OPERAND (elt, 0);
break;
}
if (object != 0) if (object != 0)
{ {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment