re PR fortran/31244 (data initialization with more than 2**32 elements)
authorSteven G. Kargl <kargl@gcc.gnu.org>
Mon, 22 Oct 2007 22:10:42 +0000 (22:10 +0000)
committerSteven G. Kargl <kargl@gcc.gnu.org>
Mon, 22 Oct 2007 22:10:42 +0000 (22:10 +0000)
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

gcc/fortran/ChangeLog
gcc/fortran/decl.c
gcc/fortran/gfortran.h
gcc/fortran/resolve.c

index 8d7abb2..a536929 100644 (file)
@@ -1,3 +1,16 @@
+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>
 
        PR fortran/33749
index d2c94a1..44bd695 100644 (file)
@@ -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)
index 203e1e7..347cced 100644 (file)
@@ -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;
 }
index 9c4aa8a..3c7893c 100644 (file)
@@ -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;