Commit f2112868 by Steven G. Kargl

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
parent 61c9bbb7
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".
2007-10-21 Paul Thomas <pault@gcc.gnu.org> 2007-10-21 Paul Thomas <pault@gcc.gnu.org>
PR fortran/33749 PR fortran/33749
......
...@@ -383,7 +383,6 @@ top_val_list (gfc_data *data) ...@@ -383,7 +383,6 @@ top_val_list (gfc_data *data)
{ {
gfc_data_value *new, *tail; gfc_data_value *new, *tail;
gfc_expr *expr; gfc_expr *expr;
const char *msg;
match m; match m;
tail = NULL; tail = NULL;
...@@ -397,6 +396,7 @@ top_val_list (gfc_data *data) ...@@ -397,6 +396,7 @@ top_val_list (gfc_data *data)
return MATCH_ERROR; return MATCH_ERROR;
new = gfc_get_data_value (); new = gfc_get_data_value ();
mpz_init (new->repeat);
if (tail == NULL) if (tail == NULL)
data->value = new; data->value = new;
...@@ -408,19 +408,13 @@ top_val_list (gfc_data *data) ...@@ -408,19 +408,13 @@ top_val_list (gfc_data *data)
if (expr->ts.type != BT_INTEGER || gfc_match_char ('*') != MATCH_YES) if (expr->ts.type != BT_INTEGER || gfc_match_char ('*') != MATCH_YES)
{ {
tail->expr = expr; tail->expr = expr;
tail->repeat = 1; mpz_set_ui (tail->repeat, 1);
} }
else else
{ {
signed int tmp; if (expr->ts.type == BT_INTEGER)
msg = gfc_extract_int (expr, &tmp); mpz_set (tail->repeat, expr->value.integer);
gfc_free_expr (expr); gfc_free_expr (expr);
if (msg != NULL)
{
gfc_error (msg);
return MATCH_ERROR;
}
tail->repeat = tmp;
m = match_data_constant (&tail->expr); m = match_data_constant (&tail->expr);
if (m == MATCH_NO) if (m == MATCH_NO)
......
...@@ -1776,7 +1776,7 @@ gfc_data_variable; ...@@ -1776,7 +1776,7 @@ gfc_data_variable;
typedef struct gfc_data_value typedef struct gfc_data_value
{ {
unsigned int repeat; mpz_t repeat;
gfc_expr *expr; gfc_expr *expr;
struct gfc_data_value *next; struct gfc_data_value *next;
} }
......
...@@ -8002,7 +8002,7 @@ resolve_symbol (gfc_symbol *sym) ...@@ -8002,7 +8002,7 @@ resolve_symbol (gfc_symbol *sym)
static struct static struct
{ {
gfc_data_value *vnode; gfc_data_value *vnode;
unsigned int left; mpz_t left;
} }
values; values;
...@@ -8012,13 +8012,14 @@ values; ...@@ -8012,13 +8012,14 @@ values;
static try static try
next_data_value (void) next_data_value (void)
{ {
while (values.left == 0)
while (mpz_cmp_ui (values.left, 0) == 0)
{ {
if (values.vnode->next == NULL) if (values.vnode->next == NULL)
return FAILURE; return FAILURE;
values.vnode = values.vnode->next; values.vnode = values.vnode->next;
values.left = values.vnode->repeat; mpz_set (values.left, values.vnode->repeat);
} }
return SUCCESS; return SUCCESS;
...@@ -8121,23 +8122,23 @@ check_data_variable (gfc_data_variable *var, locus *where) ...@@ -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, /* If we have more than one element left in the repeat count,
and we have more than one element left in the target variable, and we have more than one element left in the target variable,
then create a range assignment. */ 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. */ seem tricky. */
if (mark == AR_FULL && ref && ref->next == NULL 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; 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_init_set (range, values.left);
mpz_sub_ui (size, size, values.left); mpz_sub (size, size, values.left);
values.left = 0; mpz_set_ui (values.left, 0);
} }
else else
{ {
mpz_init_set (range, size); mpz_init_set (range, size);
values.left -= mpz_get_ui (size); mpz_sub (values.left, values.left, size);
mpz_set_ui (size, 0); mpz_set_ui (size, 0);
} }
...@@ -8151,7 +8152,7 @@ check_data_variable (gfc_data_variable *var, locus *where) ...@@ -8151,7 +8152,7 @@ check_data_variable (gfc_data_variable *var, locus *where)
/* Assign initial value to symbol. */ /* Assign initial value to symbol. */
else else
{ {
values.left -= 1; mpz_sub_ui (values.left, values.left, 1);
mpz_sub_ui (size, size, 1); mpz_sub_ui (size, size, 1);
t = gfc_assign_data_value (var->expr, values.vnode->expr, offset); t = gfc_assign_data_value (var->expr, values.vnode->expr, offset);
...@@ -8324,13 +8325,17 @@ resolve_data_variables (gfc_data_variable *d) ...@@ -8324,13 +8325,17 @@ resolve_data_variables (gfc_data_variable *d)
variables list, expanding iterators and such. */ variables list, expanding iterators and such. */
static void static void
resolve_data (gfc_data * d) resolve_data (gfc_data *d)
{ {
if (resolve_data_variables (d->var) == FAILURE) if (resolve_data_variables (d->var) == FAILURE)
return; return;
values.vnode = d->value; 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) if (traverse_data_var (d->var, &d->where) == FAILURE)
return; return;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment