OSDN Git Service

(expand_expr, case COMPONENT_REF): If getting component of union of
authorkenner <kenner@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 2 Oct 1995 01:23:04 +0000 (01:23 +0000)
committerkenner <kenner@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 2 Oct 1995 01:23:04 +0000 (01:23 +0000)
variable size, propagate TARGET.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@10415 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/expr.c

index a1fda98..d2de924 100644 (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.  */