aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran/resolve.c
diff options
context:
space:
mode:
authorSteven G. Kargl <kargl@gcc.gnu.org>2007-10-22 22:10:42 +0000
committerSteven G. Kargl <kargl@gcc.gnu.org>2007-10-22 22:10:42 +0000
commitf2112868c6886e239d7ab84b5630a8a3a5141882 (patch)
tree07dcd02cc9f258d2c47f0adb6d9278360de95d38 /gcc/fortran/resolve.c
parent61c9bbb782d2542c93e5675e113177e6253f4dd7 (diff)
downloadgcc-f2112868c6886e239d7ab84b5630a8a3a5141882.zip
gcc-f2112868c6886e239d7ab84b5630a8a3a5141882.tar.gz
gcc-f2112868c6886e239d7ab84b5630a8a3a5141882.tar.bz2
re PR fortran/31244 (data initialization with more than 2**32 elements)
2007-10-22 Steven G. Kargl <kargl@gcc.gnu.org> PR fortran/31244 * gfortran.h (gfc_data_value): Change repeat from unsigned int to mpz_t. * decl.c(top_val_list): Remove msg variable. Use mpz_t for repeat count. * resolve.c (values): Change left from unsigned int to mpz_t. (next_data_value): Change for mpz_t. (check_data_variable): Change ??? to FIXME in a comment. Use "mpz_t left". (resolve_data ): Use "mpz_t left". From-SVN: r129561
Diffstat (limited to 'gcc/fortran/resolve.c')
-rw-r--r--gcc/fortran/resolve.c31
1 files changed, 18 insertions, 13 deletions
diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c
index 9c4aa8a..3c7893c 100644
--- a/gcc/fortran/resolve.c
+++ b/gcc/fortran/resolve.c
@@ -8002,7 +8002,7 @@ resolve_symbol (gfc_symbol *sym)
static struct
{
gfc_data_value *vnode;
- unsigned int left;
+ mpz_t left;
}
values;
@@ -8012,13 +8012,14 @@ values;
static try
next_data_value (void)
{
- while (values.left == 0)
+
+ while (mpz_cmp_ui (values.left, 0) == 0)
{
if (values.vnode->next == NULL)
return FAILURE;
values.vnode = values.vnode->next;
- values.left = values.vnode->repeat;
+ mpz_set (values.left, values.vnode->repeat);
}
return SUCCESS;
@@ -8121,23 +8122,23 @@ check_data_variable (gfc_data_variable *var, locus *where)
/* If we have more than one element left in the repeat count,
and we have more than one element left in the target variable,
then create a range assignment. */
- /* ??? Only done for full arrays for now, since array sections
+ /* FIXME: Only done for full arrays for now, since array sections
seem tricky. */
if (mark == AR_FULL && ref && ref->next == NULL
- && values.left > 1 && mpz_cmp_ui (size, 1) > 0)
+ && mpz_cmp_ui (values.left, 1) > 0 && mpz_cmp_ui (size, 1) > 0)
{
mpz_t range;
- if (mpz_cmp_ui (size, values.left) >= 0)
+ if (mpz_cmp (size, values.left) >= 0)
{
- mpz_init_set_ui (range, values.left);
- mpz_sub_ui (size, size, values.left);
- values.left = 0;
+ mpz_init_set (range, values.left);
+ mpz_sub (size, size, values.left);
+ mpz_set_ui (values.left, 0);
}
else
{
mpz_init_set (range, size);
- values.left -= mpz_get_ui (size);
+ mpz_sub (values.left, values.left, size);
mpz_set_ui (size, 0);
}
@@ -8151,7 +8152,7 @@ check_data_variable (gfc_data_variable *var, locus *where)
/* Assign initial value to symbol. */
else
{
- values.left -= 1;
+ mpz_sub_ui (values.left, values.left, 1);
mpz_sub_ui (size, size, 1);
t = gfc_assign_data_value (var->expr, values.vnode->expr, offset);
@@ -8324,13 +8325,17 @@ resolve_data_variables (gfc_data_variable *d)
variables list, expanding iterators and such. */
static void
-resolve_data (gfc_data * d)
+resolve_data (gfc_data *d)
{
+
if (resolve_data_variables (d->var) == FAILURE)
return;
values.vnode = d->value;
- values.left = (d->value == NULL) ? 0 : d->value->repeat;
+ if (d->value == NULL)
+ mpz_set_ui (values.left, 0);
+ else
+ mpz_set (values.left, d->value->repeat);
if (traverse_data_var (d->var, &d->where) == FAILURE)
return;