aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/fortran')
-rw-r--r--gcc/fortran/ChangeLog7
-rw-r--r--gcc/fortran/array.c2
-rw-r--r--gcc/fortran/decl.c21
3 files changed, 18 insertions, 12 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 22f8047..80d37a3 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,10 @@
+2020-01-09 Tobias Burnus <tobias@codesourcery.com>
+
+ PR fortran/84135
+ * array.c (gfc_set_array_spec): Fix shifting of codimensions
+ when adding a dimension.
+ * decl.c (merge_array_spec): Ditto. Fix using correct codimensions.
+
2020-01-07 Jakub Jelinek <jakub@redhat.com>
PR fortran/93162
diff --git a/gcc/fortran/array.c b/gcc/fortran/array.c
index e5b4ad7..157acb8 100644
--- a/gcc/fortran/array.c
+++ b/gcc/fortran/array.c
@@ -887,7 +887,7 @@ gfc_set_array_spec (gfc_symbol *sym, gfc_array_spec *as, locus *error_loc)
if (sym->as->rank + sym->as->corank > GFC_MAX_DIMENSIONS)
goto too_many;
- for (i = 0; i < sym->as->corank; i++)
+ for (i = sym->as->corank - 1; i >= 0; i--)
{
sym->as->lower[as->rank + i] = sym->as->lower[i];
sym->as->upper[as->rank + i] = sym->as->upper[i];
diff --git a/gcc/fortran/decl.c b/gcc/fortran/decl.c
index 67c6766..499d242 100644
--- a/gcc/fortran/decl.c
+++ b/gcc/fortran/decl.c
@@ -928,8 +928,6 @@ done:
static bool
merge_array_spec (gfc_array_spec *from, gfc_array_spec *to, bool copy)
{
- int i, j;
-
if ((from->type == AS_ASSUMED_RANK && to->corank)
|| (to->type == AS_ASSUMED_RANK && from->corank))
{
@@ -944,18 +942,18 @@ merge_array_spec (gfc_array_spec *from, gfc_array_spec *to, bool copy)
to->cray_pointee = from->cray_pointee;
to->cp_was_assumed = from->cp_was_assumed;
- for (i = 0; i < to->corank; i++)
+ for (int i = to->corank - 1; i >= 0; i--)
{
/* Do not exceed the limits on lower[] and upper[]. gfortran
cleans up elsewhere. */
- j = from->rank + i;
+ int j = from->rank + i;
if (j >= GFC_MAX_DIMENSIONS)
break;
to->lower[j] = to->lower[i];
to->upper[j] = to->upper[i];
}
- for (i = 0; i < from->rank; i++)
+ for (int i = 0; i < from->rank; i++)
{
if (copy)
{
@@ -974,23 +972,24 @@ merge_array_spec (gfc_array_spec *from, gfc_array_spec *to, bool copy)
to->corank = from->corank;
to->cotype = from->cotype;
- for (i = 0; i < from->corank; i++)
+ for (int i = 0; i < from->corank; i++)
{
/* Do not exceed the limits on lower[] and upper[]. gfortran
cleans up elsewhere. */
- j = to->rank + i;
+ int k = from->rank + i;
+ int j = to->rank + i;
if (j >= GFC_MAX_DIMENSIONS)
break;
if (copy)
{
- to->lower[j] = gfc_copy_expr (from->lower[i]);
- to->upper[j] = gfc_copy_expr (from->upper[i]);
+ to->lower[j] = gfc_copy_expr (from->lower[k]);
+ to->upper[j] = gfc_copy_expr (from->upper[k]);
}
else
{
- to->lower[j] = from->lower[i];
- to->upper[j] = from->upper[i];
+ to->lower[j] = from->lower[k];
+ to->upper[j] = from->upper[k];
}
}
}