From 7d74abfd664fda23a2f02873ac8534383eb244b1 Mon Sep 17 00:00:00 2001 From: kargl Date: Mon, 22 Oct 2007 22:10:42 +0000 Subject: [PATCH] 2007-10-22 Steven G. Kargl 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". git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@129561 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/fortran/ChangeLog | 13 +++++++++++++ gcc/fortran/decl.c | 14 ++++---------- gcc/fortran/gfortran.h | 2 +- gcc/fortran/resolve.c | 31 ++++++++++++++++++------------- 4 files changed, 36 insertions(+), 24 deletions(-) diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 8d7abb2a0b4..a5369290737 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,16 @@ +2007-10-22 Steven G. Kargl + + 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". + 2007-10-21 Paul Thomas PR fortran/33749 diff --git a/gcc/fortran/decl.c b/gcc/fortran/decl.c index d2c94a1d727..44bd695d46a 100644 --- a/gcc/fortran/decl.c +++ b/gcc/fortran/decl.c @@ -383,7 +383,6 @@ top_val_list (gfc_data *data) { gfc_data_value *new, *tail; gfc_expr *expr; - const char *msg; match m; tail = NULL; @@ -397,6 +396,7 @@ top_val_list (gfc_data *data) return MATCH_ERROR; new = gfc_get_data_value (); + mpz_init (new->repeat); if (tail == NULL) data->value = new; @@ -408,19 +408,13 @@ top_val_list (gfc_data *data) if (expr->ts.type != BT_INTEGER || gfc_match_char ('*') != MATCH_YES) { tail->expr = expr; - tail->repeat = 1; + mpz_set_ui (tail->repeat, 1); } else { - signed int tmp; - msg = gfc_extract_int (expr, &tmp); + if (expr->ts.type == BT_INTEGER) + mpz_set (tail->repeat, expr->value.integer); gfc_free_expr (expr); - if (msg != NULL) - { - gfc_error (msg); - return MATCH_ERROR; - } - tail->repeat = tmp; m = match_data_constant (&tail->expr); if (m == MATCH_NO) diff --git a/gcc/fortran/gfortran.h b/gcc/fortran/gfortran.h index 203e1e78f40..347cced8074 100644 --- a/gcc/fortran/gfortran.h +++ b/gcc/fortran/gfortran.h @@ -1776,7 +1776,7 @@ gfc_data_variable; typedef struct gfc_data_value { - unsigned int repeat; + mpz_t repeat; gfc_expr *expr; struct gfc_data_value *next; } diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c index 9c4aa8a7347..3c7893c0406 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; -- 2.11.4.GIT