aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTobias Burnus <tobias@codesourcery.com>2021-02-12 16:43:54 +0100
committerTobias Burnus <tobias@codesourcery.com>2021-02-12 16:43:54 +0100
commite3020c62ff30567d0eb59c832a040148068b0c79 (patch)
treeb2797145ad771734b8767cce849bb091359be188
parent88718208897140e63f10ad81b8a69f01b610bb40 (diff)
Fortran: Fix rank of assumed-rank array [PR99043]
gcc/fortran/ChangeLog: PR fortran/99043 * trans-expr.c (gfc_conv_procedure_call): Don't reset rank of assumed-rank array. gcc/testsuite/ChangeLog: PR fortran/99043 * gfortran.dg/assumed_rank_20.f90: New test. (cherry picked from commit f699e0b16578cdc1be8b90691ef8b0964af32d2f)
-rw-r--r--gcc/fortran/ChangeLog.omp9
-rw-r--r--gcc/fortran/trans-expr.c5
-rw-r--r--gcc/testsuite/ChangeLog.omp8
-rw-r--r--gcc/testsuite/gfortran.dg/assumed_rank_20.f9036
4 files changed, 56 insertions, 2 deletions
diff --git a/gcc/fortran/ChangeLog.omp b/gcc/fortran/ChangeLog.omp
index 9dd1f8dd2ef..a0260619031 100644
--- a/gcc/fortran/ChangeLog.omp
+++ b/gcc/fortran/ChangeLog.omp
@@ -1,5 +1,14 @@
2021-02-12 Tobias Burnus <tobias@codesourcery.com>
+ Backport from mainline
+ 2021-02-12 Tobias Burnus <tobias@codesourcery.com>
+
+ PR fortran/99043
+ * trans-expr.c (gfc_conv_procedure_call): Don't reset
+ rank of assumed-rank array.
+
+2021-02-12 Tobias Burnus <tobias@codesourcery.com>
+
PR fortran/99045
Backport from mainline
2020-12-27 Paul Thomas <pault@gcc.gnu.org>
diff --git a/gcc/fortran/trans-expr.c b/gcc/fortran/trans-expr.c
index 25ffd4891a5..a3bd8ddd599 100644
--- a/gcc/fortran/trans-expr.c
+++ b/gcc/fortran/trans-expr.c
@@ -6235,9 +6235,10 @@ gfc_conv_procedure_call (gfc_se * se, gfc_symbol * sym,
/* Unallocated allocatable arrays and unassociated pointer arrays
need their dtype setting if they are argument associated with
- assumed rank dummies. */
+ assumed rank dummies, unless already assumed rank. */
if (!sym->attr.is_bind_c && e && fsym && fsym->as
- && fsym->as->type == AS_ASSUMED_RANK)
+ && fsym->as->type == AS_ASSUMED_RANK
+ && e->rank != -1)
{
if (gfc_expr_attr (e).pointer
|| gfc_expr_attr (e).allocatable)
diff --git a/gcc/testsuite/ChangeLog.omp b/gcc/testsuite/ChangeLog.omp
index 3012c77ce8f..8f5512990b8 100644
--- a/gcc/testsuite/ChangeLog.omp
+++ b/gcc/testsuite/ChangeLog.omp
@@ -1,5 +1,13 @@
2021-02-12 Tobias Burnus <tobias@codesourcery.com>
+ Backport from mainline
+ 2021-02-12 Tobias Burnus <tobias@codesourcery.com>
+
+ PR fortran/99043
+ * gfortran.dg/assumed_rank_20.f90: New test.
+
+2021-02-12 Tobias Burnus <tobias@codesourcery.com>
+
PR fortran/99045
Backport from mainline
2020-12-27 Paul Thomas <pault@gcc.gnu.org>
diff --git a/gcc/testsuite/gfortran.dg/assumed_rank_20.f90 b/gcc/testsuite/gfortran.dg/assumed_rank_20.f90
new file mode 100644
index 00000000000..10ad1fc8e89
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/assumed_rank_20.f90
@@ -0,0 +1,36 @@
+! { dg-do run }
+!
+! PR fortran/99043
+!
+module assumed_rank_module
+ implicit none
+ private
+
+ public :: rank_of_pointer_level1
+contains
+ subroutine rank_of_pointer_level1(ap,aa)
+ real, dimension(..), intent(in), pointer :: ap
+ real, dimension(..), intent(in), allocatable :: aa
+ if (rank(ap) /= 3) stop 1
+ if (rank(aa) /= 3) stop 2
+ call rank_of_pointer_level2(ap, aa)
+ end subroutine rank_of_pointer_level1
+
+ subroutine rank_of_pointer_level2(ap,aa)
+ real, dimension(..), intent(in), pointer :: ap
+ real, dimension(..), intent(in), allocatable :: aa
+
+ if (rank(ap) /= 3) stop 3
+ if (rank(aa) /= 3) stop 4
+ end subroutine rank_of_pointer_level2
+end module assumed_rank_module
+
+program assumed_rank
+ use :: assumed_rank_module, only : rank_of_pointer_level1
+ implicit none
+ real, dimension(:,:,:), pointer :: ap
+ real, dimension(:,:,:), allocatable :: aa
+
+ ap => null()
+ call rank_of_pointer_level1(ap, aa)
+end program assumed_rank