(expand_expr, case COMPONENT_REF): If getting component of union of

variable size, propagate TARGET.

From-SVN: r10415
This commit is contained in:
Richard Kenner 1995-10-01 21:23:04 -04:00
parent f29369b9f2
commit b74f5ff2bd
1 changed files with 12 additions and 2 deletions

View File

@ -4762,8 +4762,18 @@ expand_expr (exp, target, tmode, modifier)
/* In some cases, we will be offsetting OP0's address by a constant.
So get it as a sum, if possible. If we will be using it
directly in an insn, we validate it. */
op0 = expand_expr (tem, NULL_RTX, VOIDmode, EXPAND_SUM);
directly in an insn, we validate it.
If TEM's type is a union of variable size, pass TARGET to the inner
computation, since it will need a temporary and TARGET is known
to have to do. This occurs in unchecked conversion in Ada. */
op0 = expand_expr (tem,
(TREE_CODE (TREE_TYPE (tem)) == UNION_TYPE
&& (TREE_CODE (TYPE_SIZE (TREE_TYPE (tem)))
!= INTEGER_CST)
? target : NULL_RTX),
VOIDmode, EXPAND_SUM);
/* If this is a constant, put it into a register if it is a
legitimate constant and memory if it isn't. */