re PR fortran/30872 (Bogus "size of variable is too large")
authorPaul Thomas <pault@gcc.gnu.org>
Sat, 7 Apr 2007 20:23:40 +0000 (20:23 +0000)
committerPaul Thomas <pault@gcc.gnu.org>
Sat, 7 Apr 2007 20:23:40 +0000 (20:23 +0000)
2007-04-07  Paul Thomas  <pault@gcc.gnu.org>

PR fortran/30872
* expr.c (find_array_element): Correct arithmetic for rank > 1.

2007-04-07  Paul Thomas  <pault@gcc.gnu.org>

PR fortran/30872
* gfortran.dg/parameter_array_element_1.f90: New test.

From-SVN: r123644

gcc/fortran/ChangeLog
gcc/fortran/expr.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/parameter_array_element_1.f90 [new file with mode: 0644]

index a9a8a07f4915ae02022a04680232444de675ea1d..6fba5b30aed20b009cb6b38f08b8a1a190ce5068 100644 (file)
@@ -1,3 +1,8 @@
+2007-04-07  Paul Thomas  <pault@gcc.gnu.org>
+
+       PR fortran/30872
+       * expr.c (find_array_element): Correct arithmetic for rank > 1.
+
 2007-04-07  Paul Thomas  <pault@gcc.gnu.org>
 
        PR fortran/31222
index bf5b74dab061a1278c6aa049bb144e35388d1ddf..d3f57172d45427a5bdd1ccc358a9036ddf9ac4b4 100644 (file)
@@ -899,6 +899,8 @@ find_array_element (gfc_constructor *cons, gfc_array_ref *ar,
   int i;
   mpz_t delta;
   mpz_t offset;
+  mpz_t span;
+  mpz_t tmp;
   gfc_expr *e;
   try t;
 
@@ -907,6 +909,8 @@ find_array_element (gfc_constructor *cons, gfc_array_ref *ar,
 
   mpz_init_set_ui (offset, 0);
   mpz_init (delta);
+  mpz_init (tmp);
+  mpz_init_set_ui (span, 1);
   for (i = 0; i < ar->dimen; i++)
     {
       e = gfc_copy_expr (ar->start[i]);
@@ -930,7 +934,13 @@ find_array_element (gfc_constructor *cons, gfc_array_ref *ar,
        }
 
       mpz_sub (delta, e->value.integer, ar->as->lower[i]->value.integer);
+      mpz_mul (delta, delta, span);
       mpz_add (offset, offset, delta);
+
+      mpz_set_ui (tmp, 1);
+      mpz_add (tmp, tmp, ar->as->upper[i]->value.integer);
+      mpz_sub (tmp, tmp, ar->as->lower[i]->value.integer);
+      mpz_mul (span, span, tmp);
     }
 
   if (cons)
@@ -949,6 +959,8 @@ find_array_element (gfc_constructor *cons, gfc_array_ref *ar,
 depart:
   mpz_clear (delta);
   mpz_clear (offset);
+  mpz_clear (span);
+  mpz_clear (tmp);
   if (e)
     gfc_free_expr (e);
   *rval = cons;
index df1d06aab2364a12e92aeb1d6daf7ad4349eaf23..fb1bbbe7692705d558c153c7003c324942eb0437 100644 (file)
@@ -1,3 +1,8 @@
+2007-04-07  Paul Thomas  <pault@gcc.gnu.org>
+
+       PR fortran/30872
+       * gfortran.dg/parameter_array_element_1.f90: New test.
+
 2007-04-07  Paul Thomas  <pault@gcc.gnu.org>
 
        PR fortran/31222
diff --git a/gcc/testsuite/gfortran.dg/parameter_array_element_1.f90 b/gcc/testsuite/gfortran.dg/parameter_array_element_1.f90
new file mode 100644 (file)
index 0000000..8dfe544
--- /dev/null
@@ -0,0 +1,19 @@
+! { dg-do compile}
+! { dg-options "-fdump-tree-original" }
+! Tests the fix for PR 30872, in which the array element references bo(1,1) etc.
+! would be wrong for rank > 1.
+!
+! Contributed by Joost VandeVondele <jv244@cam.ac.uk>
+!
+ INTEGER, PARAMETER, DIMENSION(2,3) :: bo= &
+                    RESHAPE((/-1,1,-2,2,-3,3/),(/2,3/))
+ REAL(kind=8), DIMENSION(  &
+          bo(1,1):bo(2,1), &
+          bo(1,2):bo(2,2), &
+          bo(1,3):bo(2,3)) :: out_val
+ out_val=0.0
+END
+! Scan for the 105 in the declaration real8 out_val[105];
+! { dg-final { scan-tree-dump-times "105" 1 "original" } }
+! { dg-final { cleanup-tree-dump "original" } }
+