* 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
+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
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
{
/* 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)
/* 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)
{
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)),
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)))
{
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);
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. */
tree dst, dtype;
tree src, stype;
tree len;
+ tree tmp;
nelem = gfc_constant_array_constructor_p (expr2->value.constructor);
if (nelem == 0)
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);
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