From: Richard Kenner Date: Mon, 2 Oct 1995 01:23:04 +0000 (-0400) Subject: (expand_expr, case COMPONENT_REF): If getting component of union of X-Git-Tag: misc/cutover-egcs-0~3549 X-Git-Url: https://gcc.gnu.org/git/?a=commitdiff_plain;h=b74f5ff2bd0793d863acf42138a5547ee59dde51;p=gcc.git (expand_expr, case COMPONENT_REF): If getting component of union of variable size, propagate TARGET. From-SVN: r10415 --- diff --git a/gcc/expr.c b/gcc/expr.c index a1fda985b78f..d2de924b6aee 100644 --- a/gcc/expr.c +++ b/gcc/expr.c @@ -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. */