diff options
author | Steven G. Kargl <kargl@gcc.gnu.org> | 2007-10-22 22:10:42 +0000 |
---|---|---|
committer | Steven G. Kargl <kargl@gcc.gnu.org> | 2007-10-22 22:10:42 +0000 |
commit | f2112868c6886e239d7ab84b5630a8a3a5141882 (patch) | |
tree | 07dcd02cc9f258d2c47f0adb6d9278360de95d38 /gcc/fortran/resolve.c | |
parent | 61c9bbb782d2542c93e5675e113177e6253f4dd7 (diff) | |
download | gcc-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.c | 31 |
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; |