]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR fortran/34476 (Parameters: Bogus out of bounds error in array constructor)
authorPaul Thomas <pault@gcc.gnu.org>
Tue, 8 Jan 2008 15:14:33 +0000 (15:14 +0000)
committerPaul Thomas <pault@gcc.gnu.org>
Tue, 8 Jan 2008 15:14:33 +0000 (15:14 +0000)
2008-01-08  Paul Thomas  <pault@gcc.gnu.org>

PR fortran/34476
* expr.c (find_array_element): Check that the array bounds are
constant before using them.  Use lower, as well as upper bound.
(check_restricted): Allow implied index variable.

2008-01-08  Paul Thomas  <pault@gcc.gnu.org>

PR fortran/34476
* gfortran.dg/parameter_array_init_3.f90: New test.

From-SVN: r131396

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

index dd2492dc97e4f26af4b11375e6e620ab68549084..40c98afa2c3418db514ee365cea36e1532d4233d 100644 (file)
@@ -1,3 +1,10 @@
+2008-01-08  Paul Thomas  <pault@gcc.gnu.org>
+
+       PR fortran/34476
+       * expr.c (find_array_element): Check that the array bounds are
+       constant before using them.  Use lower, as well as upper bound.
+       (check_restricted): Allow implied index variable.
+
 2008-01-08  Paul Thomas  <pault@gcc.gnu.org>
 
        PR fortran/34681
index 8ae84649c80e60ea4405effdcf4d776ae0803c2e..e8b65483e76c8dc953023a312c0a141f7338263b 100644 (file)
@@ -1024,14 +1024,17 @@ find_array_element (gfc_constructor *cons, gfc_array_ref *ar,
          cons = NULL;
          goto depart;
        }
-
-      /* Check the bounds.  */
-      if (ar->as->upper[i]
-         && (mpz_cmp (e->value.integer, ar->as->upper[i]->value.integer) > 0
-             || mpz_cmp (e->value.integer,
-                         ar->as->lower[i]->value.integer) < 0))
+        /* Check the bounds.  */
+      if ((ar->as->upper[i]
+            && ar->as->upper[i]->expr_type == EXPR_CONSTANT
+            && mpz_cmp (e->value.integer,
+                        ar->as->upper[i]->value.integer) > 0)
+               ||
+         (ar->as->lower[i]->expr_type == EXPR_CONSTANT
+            && mpz_cmp (e->value.integer,
+                        ar->as->lower[i]->value.integer) < 0))
        {
-         gfc_error ("index in dimension %d is out of bounds "
+         gfc_error ("Index in dimension %d is out of bounds "
                     "at %L", i + 1, &ar->c_where[i]);
          cons = NULL;
          t = FAILURE;
@@ -2496,6 +2499,7 @@ check_restricted (gfc_expr *e)
       if (sym->attr.in_common
          || sym->attr.use_assoc
          || sym->attr.dummy
+         || sym->attr.implied_index
          || sym->ns != gfc_current_ns
          || (sym->ns->proc_name != NULL
              && sym->ns->proc_name->attr.flavor == FL_MODULE)
index 5b95e2969f5a1b2d86e430633a82cd523df762fe..01389c9fa12ec53e9ab380f8048d0b5e34116ed3 100644 (file)
@@ -1,3 +1,8 @@
+2008-01-08  Paul Thomas  <pault@gcc.gnu.org>
+
+       PR fortran/34476
+       * gfortran.dg/parameter_array_init_3.f90: New test.
+
 2008-01-08  Paul Thomas  <pault@gcc.gnu.org>
 
        PR fortran/34681
diff --git a/gcc/testsuite/gfortran.dg/parameter_array_init_3.f90 b/gcc/testsuite/gfortran.dg/parameter_array_init_3.f90
new file mode 100644 (file)
index 0000000..e39da8e
--- /dev/null
@@ -0,0 +1,16 @@
+! { dg-do compile }
+! Test the fix for PR34476 in which an 'out of bounds' error would be
+! generated for the array initializations AND the implicit index 'i'
+! would be rejected.
+!
+! Reported by Tobias Burnus <burnus@gcc.gnu.org> following a thread
+! on comp.lang.fortran (see PR)
+!
+module abuse_mod
+   implicit none
+   integer i
+   character(8), parameter :: HEX1 = '40490FDB'
+   integer(1), parameter :: MSKa1(len(HEX1)) =  [(1,i=1,len(HEX1))]
+   integer(1), parameter :: ARR1(len(HEX1)) = [( MSKa1(i), i=1,len(HEX1) )]
+end module abuse_mod
+! { dg-final { cleanup-modules "abuse_mod" } }