diff options
author | Tobias Burnus <tobias@codesourcery.com> | 2021-02-12 16:43:54 +0100 |
---|---|---|
committer | Tobias Burnus <tobias@codesourcery.com> | 2021-02-12 16:43:54 +0100 |
commit | e3020c62ff30567d0eb59c832a040148068b0c79 (patch) | |
tree | b2797145ad771734b8767cce849bb091359be188 | |
parent | 88718208897140e63f10ad81b8a69f01b610bb40 (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.omp | 9 | ||||
-rw-r--r-- | gcc/fortran/trans-expr.c | 5 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog.omp | 8 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/assumed_rank_20.f90 | 36 |
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 |