diff options
author | Steven G. Kargl <kargl@gcc.gnu.org> | 2016-09-26 18:44:36 +0000 |
---|---|---|
committer | Steven G. Kargl <kargl@gcc.gnu.org> | 2016-09-26 18:44:36 +0000 |
commit | a184e37f0c1e72404b92c1bef9aa812b75b16fd8 (patch) | |
tree | ddb32dcdd7307b2df869dadab1a06b1ab3b299be /gcc/fortran/trans-common.c | |
parent | 8be59d19f27684eed54b611dcf68f590553d8386 (diff) | |
download | gcc-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/trans-common.c')
-rw-r--r-- | gcc/fortran/trans-common.c | 14 |
1 files changed, 11 insertions, 3 deletions
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); |