aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran
diff options
context:
space:
mode:
authorSteven G. Kargl <kargl@gcc.gnu.org>2016-09-26 18:44:36 +0000
committerSteven G. Kargl <kargl@gcc.gnu.org>2016-09-26 18:44:36 +0000
commita184e37f0c1e72404b92c1bef9aa812b75b16fd8 (patch)
treeddb32dcdd7307b2df869dadab1a06b1ab3b299be /gcc/fortran
parent8be59d19f27684eed54b611dcf68f590553d8386 (diff)
downloadgcc-a184e37f0c1e72404b92c1bef9aa812b75b16fd8.zip
gcc-a184e37f0c1e72404b92c1bef9aa812b75b16fd8.tar.gz
gcc-a184e37f0c1e72404b92c1bef9aa812b75b16fd8.tar.bz2
re PR fortran/77420 (gfortran and equivalence produces internal compiler error)
2016-09-26 Steven G. Kargl <kargl@gcc.gnu.org> PR fortran/77420 * trans-common.c: Handle array elements in equivalence when the lower and upper bounds of array spec are NULL. 2016-09-26 Steven G. Kargl <kargl@gcc.gnu.org> PR fortran/77420 * gfortran.dg/pr77420_1.f90: New test. * gfortran.dg/pr77420_2.f90: Ditto. * gfortran.dg/pr77420_3.f90: New test. Requires ... * gfortran.dg/pr77420_4.f90: this file. From-SVN: r240506
Diffstat (limited to 'gcc/fortran')
-rw-r--r--gcc/fortran/ChangeLog6
-rw-r--r--gcc/fortran/trans-common.c14
2 files changed, 17 insertions, 3 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index d721bdf..c6bc662 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,9 @@
+2016-09-26 Steven G. Kargl <kargl@gcc.gnu.org>
+
+ PR fortran/77420
+ * trans-common.c: Handle array elements in equivalence when
+ the lower and upper bounds of array spec are NULL.
+
2016-09-26 Paul Thomas <pault@gcc.gnu.org>
PR fortran/48298
diff --git a/gcc/fortran/trans-common.c b/gcc/fortran/trans-common.c
index 20ec69e..ee12fa2 100644
--- a/gcc/fortran/trans-common.c
+++ b/gcc/fortran/trans-common.c
@@ -805,13 +805,21 @@ element_number (gfc_array_ref *ar)
if (ar->dimen_type[i] != DIMEN_ELEMENT)
gfc_internal_error ("element_number(): Bad dimension type");
- mpz_sub (n, *get_mpz (ar->start[i]), *get_mpz (as->lower[i]));
+ if (as && as->lower[i])
+ mpz_sub (n, *get_mpz (ar->start[i]), *get_mpz (as->lower[i]));
+ else
+ mpz_sub_ui (n, *get_mpz (ar->start[i]), 1);
mpz_mul (n, n, multiplier);
mpz_add (offset, offset, n);
- mpz_sub (extent, *get_mpz (as->upper[i]), *get_mpz (as->lower[i]));
- mpz_add_ui (extent, extent, 1);
+ if (as && as->upper[i] && as->lower[i])
+ {
+ mpz_sub (extent, *get_mpz (as->upper[i]), *get_mpz (as->lower[i]));
+ mpz_add_ui (extent, extent, 1);
+ }
+ else
+ mpz_set_ui (extent, 0);
if (mpz_sgn (extent) < 0)
mpz_set_ui (extent, 0);