aboutsummaryrefslogtreecommitdiff
path: root/gcc/expr.c
diff options
context:
space:
mode:
authorJason Merrill <jason@casey.cygnus.com>2000-03-13 22:54:03 +0000
committerJason Merrill <jason@gcc.gnu.org>2000-03-13 17:54:03 -0500
commitc3b247b44564c667972e0ed6f7673530378813e5 (patch)
treefdc1be5ec41c1b886780e4d8de0c601ad6838917 /gcc/expr.c
parent45b966db65e4ab054d31f01f65b7a98023dbcb54 (diff)
downloadgcc-c3b247b44564c667972e0ed6f7673530378813e5.zip
gcc-c3b247b44564c667972e0ed6f7673530378813e5.tar.gz
gcc-c3b247b44564c667972e0ed6f7673530378813e5.tar.bz2
function.c (put_var_into_stack): Use type_for_mode to calculate part_type.
* function.c (put_var_into_stack): Use type_for_mode to calculate part_type. Use MEM_SET_IN_STRUCT_P. * expr.c (store_field): Handle CONCAT. (store_constructor): Use fields_length. * tree.c (fields_length): New fn. * tree.h: Declare it. From-SVN: r32514
Diffstat (limited to 'gcc/expr.c')
-rw-r--r--gcc/expr.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/gcc/expr.c b/gcc/expr.c
index 671255e..5ba5ee6 100644
--- a/gcc/expr.c
+++ b/gcc/expr.c
@@ -4151,7 +4151,7 @@ store_constructor (exp, target, align, cleared, size)
clear the whole structure first. */
else if (size > 0
&& ((list_length (CONSTRUCTOR_ELTS (exp))
- != list_length (TYPE_FIELDS (type)))
+ != fields_length (type))
|| mostly_zeros_p (exp)))
{
if (! cleared)
@@ -4758,6 +4758,15 @@ store_field (target, bitsize, bitpos, mode, exp, value_mode,
return blk_object;
}
+ if (GET_CODE (target) == CONCAT)
+ {
+ /* We're storing into a struct containing a single __complex. */
+
+ if (bitpos != 0)
+ abort ();
+ return store_expr (exp, target, 0);
+ }
+
/* If the structure is in a register or if the component
is a bit field, we cannot use addressing to access it.
Use bit-field techniques or SUBREG to store in it. */