(expand_expr, case COMPONENT_REF): If getting component of union of
authorRichard Kenner <kenner@gcc.gnu.org>
Mon, 2 Oct 1995 01:23:04 +0000 (21:23 -0400)
committerRichard Kenner <kenner@gcc.gnu.org>
Mon, 2 Oct 1995 01:23:04 +0000 (21:23 -0400)
variable size, propagate TARGET.

From-SVN: r10415

gcc/expr.c

index a1fda985b78fa42190a1d1c199dfbb51b3fb9b64..d2de924b6aee26e44e9032529eb71583ec79d7b8 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.  */