diff options
author | fxcoudert <fxcoudert@138bc75d-0d04-0410-961f-82ee72b054a4> | 2007-05-23 08:25:05 +0000 |
---|---|---|
committer | fxcoudert <fxcoudert@138bc75d-0d04-0410-961f-82ee72b054a4> | 2007-05-23 08:25:05 +0000 |
commit | db86722401287c21f46211e28d05dd26b089ab16 (patch) | |
tree | c2f6105c7efa6a1cabed4d61f20857cf14412dac | |
parent | 8cc26894491ef0a2c551ad2d15586dc1bbaa70e9 (diff) | |
download | gcc-db86722401287c21f46211e28d05dd26b089ab16.tar.gz |
PR fortran/32046
* trans-expr.c (gfc_trans_zero_assign): Convert the result of
TYPE_SIZE_UNIT into a signed type.
(gfc_trans_array_copy): Likewise.
(gfc_trans_array_constructor_copy): Likewise.
* trans-array.c (gfc_trans_create_temp_array): Likewise.
(gfc_grow_array): Likewise.
(gfc_array_init_size): Likewise.
(gfc_duplicate_allocatable): Likewise.
* trans-stmt.c (allocate_temp_for_forall_nest_1): Likewise.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@124985 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/fortran/ChangeLog | 13 | ||||
-rw-r--r-- | gcc/fortran/trans-array.c | 12 | ||||
-rw-r--r-- | gcc/fortran/trans-expr.c | 14 | ||||
-rw-r--r-- | gcc/fortran/trans-stmt.c | 2 |
4 files changed, 32 insertions, 9 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 232fb914271..a53691c9505 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,16 @@ +2007-05-23 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org> + + PR fortran/32046 + * trans-expr.c (gfc_trans_zero_assign): Convert the result of + TYPE_SIZE_UNIT into a signed type. + (gfc_trans_array_copy): Likewise. + (gfc_trans_array_constructor_copy): Likewise. + * trans-array.c (gfc_trans_create_temp_array): Likewise. + (gfc_grow_array): Likewise. + (gfc_array_init_size): Likewise. + (gfc_duplicate_allocatable): Likewise. + * trans-stmt.c (allocate_temp_for_forall_nest_1): Likewise. + 2007-05-22 Jerry DeLisle <jvdelisle@gcc.gnu.org> PR fortran/18923 diff --git a/gcc/fortran/trans-array.c b/gcc/fortran/trans-array.c index 7a1c0214c2b..6c7ea6c5439 100644 --- a/gcc/fortran/trans-array.c +++ b/gcc/fortran/trans-array.c @@ -687,7 +687,8 @@ gfc_trans_create_temp_array (stmtblock_t * pre, stmtblock_t * post, nelem = size; size = fold_build2 (MULT_EXPR, gfc_array_index_type, size, - TYPE_SIZE_UNIT (gfc_get_element_type (type))); + fold_convert (gfc_array_index_type, + TYPE_SIZE_UNIT (gfc_get_element_type (type)))); } else { @@ -838,7 +839,8 @@ gfc_grow_array (stmtblock_t * pblock, tree desc, tree extra) /* Calculate the new array size. */ size = TYPE_SIZE_UNIT (gfc_get_element_type (TREE_TYPE (desc))); tmp = build2 (PLUS_EXPR, gfc_array_index_type, ubound, gfc_index_one_node); - arg1 = build2 (MULT_EXPR, gfc_array_index_type, tmp, size); + arg1 = build2 (MULT_EXPR, gfc_array_index_type, tmp, + fold_convert (gfc_array_index_type, size)); /* Pick the appropriate realloc function. */ if (gfc_index_integer_kind == 4) @@ -3427,7 +3429,8 @@ gfc_array_init_size (tree descriptor, int rank, tree * poffset, /* The stride is the number of elements in the array, so multiply by the size of an element to get the total size. */ tmp = TYPE_SIZE_UNIT (gfc_get_element_type (type)); - size = fold_build2 (MULT_EXPR, gfc_array_index_type, stride, tmp); + size = fold_build2 (MULT_EXPR, gfc_array_index_type, stride, + fold_convert (gfc_array_index_type, tmp)); if (poffset != NULL) { @@ -4960,7 +4963,8 @@ gfc_duplicate_allocatable(tree dest, tree src, tree type, int rank) nelems = get_full_array_size (&block, src, rank); size = fold_build2 (MULT_EXPR, gfc_array_index_type, nelems, - TYPE_SIZE_UNIT (gfc_get_element_type (type))); + fold_convert (gfc_array_index_type, + TYPE_SIZE_UNIT (gfc_get_element_type (type)))); /* Allocate memory to the destination. */ tmp = gfc_call_malloc (&block, TREE_TYPE (gfc_conv_descriptor_data_get (src)), diff --git a/gcc/fortran/trans-expr.c b/gcc/fortran/trans-expr.c index d5f584c2ab9..527a44b9f3c 100644 --- a/gcc/fortran/trans-expr.c +++ b/gcc/fortran/trans-expr.c @@ -3619,8 +3619,9 @@ gfc_trans_zero_assign (gfc_expr * expr) if (!len || TREE_CODE (len) != INTEGER_CST) return NULL_TREE; + tmp = TYPE_SIZE_UNIT (gfc_get_element_type (type)); len = fold_build2 (MULT_EXPR, gfc_array_index_type, len, - TYPE_SIZE_UNIT (gfc_get_element_type (type))); + fold_convert (gfc_array_index_type, tmp)); /* Convert arguments to the correct types. */ if (!POINTER_TYPE_P (TREE_TYPE (dest))) @@ -3673,6 +3674,7 @@ gfc_trans_array_copy (gfc_expr * expr1, gfc_expr * expr2) { tree dst, dlen, dtype; tree src, slen, stype; + tree tmp; dst = gfc_get_symbol_decl (expr1->symtree->n.sym); src = gfc_get_symbol_decl (expr2->symtree->n.sym); @@ -3691,14 +3693,16 @@ gfc_trans_array_copy (gfc_expr * expr1, gfc_expr * expr2) dlen = GFC_TYPE_ARRAY_SIZE (dtype); if (!dlen || TREE_CODE (dlen) != INTEGER_CST) return NULL_TREE; + tmp = TYPE_SIZE_UNIT (gfc_get_element_type (dtype)); dlen = fold_build2 (MULT_EXPR, gfc_array_index_type, dlen, - TYPE_SIZE_UNIT (gfc_get_element_type (dtype))); + fold_convert (gfc_array_index_type, tmp)); slen = GFC_TYPE_ARRAY_SIZE (stype); if (!slen || TREE_CODE (slen) != INTEGER_CST) return NULL_TREE; + tmp = TYPE_SIZE_UNIT (gfc_get_element_type (stype)); slen = fold_build2 (MULT_EXPR, gfc_array_index_type, slen, - TYPE_SIZE_UNIT (gfc_get_element_type (stype))); + fold_convert (gfc_array_index_type, tmp)); /* Sanity check that they are the same. This should always be the case, as we should already have checked for conformance. */ @@ -3720,6 +3724,7 @@ gfc_trans_array_constructor_copy (gfc_expr * expr1, gfc_expr * expr2) tree dst, dtype; tree src, stype; tree len; + tree tmp; nelem = gfc_constant_array_constructor_p (expr2->value.constructor); if (nelem == 0) @@ -3741,8 +3746,9 @@ gfc_trans_array_constructor_copy (gfc_expr * expr1, gfc_expr * expr2) if (compare_tree_int (len, nelem) != 0) return NULL_TREE; + tmp = TYPE_SIZE_UNIT (gfc_get_element_type (dtype)); len = fold_build2 (MULT_EXPR, gfc_array_index_type, len, - TYPE_SIZE_UNIT (gfc_get_element_type (dtype))); + fold_convert (gfc_array_index_type, tmp)); stype = gfc_typenode_for_spec (&expr2->ts); src = gfc_build_constant_array_constructor (expr2, stype); diff --git a/gcc/fortran/trans-stmt.c b/gcc/fortran/trans-stmt.c index 444d880964f..ec7548e21bc 100644 --- a/gcc/fortran/trans-stmt.c +++ b/gcc/fortran/trans-stmt.c @@ -2086,7 +2086,7 @@ allocate_temp_for_forall_nest_1 (tree type, tree size, stmtblock_t * block, tree unit; tree tmp; - unit = TYPE_SIZE_UNIT (type); + unit = fold_convert (gfc_array_index_type, TYPE_SIZE_UNIT (type)); if (!integer_onep (unit)) bytesize = fold_build2 (MULT_EXPR, gfc_array_index_type, size, unit); else |